@getopenpay/openpay-js 0.5.15 → 0.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Resource-Ds5bbQ3b.js → Resource-CUhg8dEK.js} +4 -4
- package/dist/{SimpleSpanProcessor-0bSccE1S.js → SimpleSpanProcessor-BtNzab2_.js} +37 -37
- package/dist/{detect-resources-UwRkF4Xd.js → detect-resources-6fNItMfQ.js} +12 -12
- package/dist/{diag-api-CMlZXyyv.js → diag-api-BaoBTidT.js} +1 -1
- package/dist/{index-DFO-DCsT.js → index-2Dpi7rDE.js} +11 -11
- package/dist/{index-CWTkU3J-.js → index-BkFKN09r.js} +1 -1
- package/dist/{index-BZEpD-f0.js → index-BohOdvI5.js} +135 -135
- package/dist/{index-JNJd_YS1.js → index-Cb6WFqJj.js} +33 -33
- package/dist/{index-1jECpTsg.js → index-CfhP31jP.js} +9 -9
- package/dist/{index-BmKZeOoc.js → index-CmjNpx1j.js} +6 -6
- package/dist/{index-CDdbDQxQ.js → index-CsjF5pDg.js} +1 -1
- package/dist/index-Dcezwdcs.js +7000 -0
- package/dist/{index-BhZy-TW3.js → index-DhyFkarT.js} +10 -10
- package/dist/{index-DsxDp11a.js → index-t_WVTb5S.js} +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.umd.js +8 -8
- package/dist/{metrics-api-C9pRFfr-.js → metrics-api-CsLzDvjo.js} +28 -28
- package/dist/{suppress-tracing-B94rObkn.js → suppress-tracing-Cu47NVB2.js} +1 -1
- package/dist/{url-CdPstDG9.js → url-CgnFZYDI.js} +8 -8
- package/dist/{utils--M6ihaNw.js → utils-BJ1UAbM8.js} +1 -1
- package/dist/{utils-VJ-0MC7c.js → utils-Dius2V8g.js} +20 -20
- package/package.json +1 -1
- package/dist/index-j7i6AeZa.js +0 -7005
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { R as qe } from "./index-
|
|
1
|
+
import { R as qe } from "./index-Dcezwdcs.js";
|
|
2
2
|
function xt(j) {
|
|
3
3
|
return j === void 0 && (j = {}), typeof j.addEventListener == "function" && typeof j.removeEventListener == "function";
|
|
4
4
|
}
|
|
5
5
|
var Et = "OT_ZONE_CONTEXT", zt = (
|
|
6
6
|
/** @class */
|
|
7
|
-
function() {
|
|
7
|
+
(function() {
|
|
8
8
|
function j() {
|
|
9
9
|
this._enabled = !1, this._zoneCounter = 0;
|
|
10
10
|
}
|
|
@@ -72,7 +72,7 @@ var Et = "OT_ZONE_CONTEXT", zt = (
|
|
|
72
72
|
var ie = this._createZoneName(), fe = this._createZone(ie, S);
|
|
73
73
|
return fe.run(B, z, ee);
|
|
74
74
|
}, j;
|
|
75
|
-
}()
|
|
75
|
+
})()
|
|
76
76
|
), pt = {}, gt;
|
|
77
77
|
function Ft() {
|
|
78
78
|
if (gt) return pt;
|
|
@@ -632,7 +632,7 @@ function Ft() {
|
|
|
632
632
|
});
|
|
633
633
|
let e;
|
|
634
634
|
for (e in a)
|
|
635
|
-
t === "XMLHttpRequest" && e === "responseBlob" || function(c) {
|
|
635
|
+
t === "XMLHttpRequest" && e === "responseBlob" || (function(c) {
|
|
636
636
|
typeof a[c] == "function" ? Q[t].prototype[c] = function() {
|
|
637
637
|
return this[le][c].apply(this[le], arguments);
|
|
638
638
|
} : te(Q[t].prototype, c, {
|
|
@@ -643,7 +643,7 @@ function Ft() {
|
|
|
643
643
|
return this[le][c];
|
|
644
644
|
}
|
|
645
645
|
});
|
|
646
|
-
}(e);
|
|
646
|
+
})(e);
|
|
647
647
|
for (e in n)
|
|
648
648
|
e !== "prototype" && n.hasOwnProperty(e) && (Q[t][e] = n[e]);
|
|
649
649
|
}
|
|
@@ -1616,4 +1616,4 @@ Ft();
|
|
|
1616
1616
|
export {
|
|
1617
1617
|
zt as ZoneContextManager
|
|
1618
1618
|
};
|
|
1619
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBrfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFIgYXMgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lciBmdW5jdGlvbnMgdGhlbiBpdCB3aWxsIHJldHVybiB0cnVlLlxuICogR2VuZXJhbGx5IG9ubHkgY2FsbGVkIHdpdGggYSBgVGFyZ2V0V2l0aEV2ZW50c2AgYnV0IG1heSBiZSBjYWxsZWQgd2l0aCBhbiB1bmtub3duIC8gYW55LlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzTGlzdGVuZXJPYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gdm9pZCAwKSB7IG9iaiA9IHt9OyB9XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG9iai5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiem9uZS5qc1wiIC8+XG4vKiBLZXkgbmFtZSB0byBiZSB1c2VkIHRvIHNhdmUgYSBjb250ZXh0IHJlZmVyZW5jZSBpbiBab25lICovXG52YXIgWk9ORV9DT05URVhUX0tFWSA9ICdPVF9aT05FX0NPTlRFWFQnO1xuLyoqXG4gKiBab25lQ29udGV4dE1hbmFnZXJcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGVhc3kgZnVuY3Rpb25hbGl0eSBmb3IgdHJhY2luZyBhY3Rpb24gYmV0d2VlbiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbiB3ZWIuXG4gKiBJdCB3YXMgbm90IHBvc3NpYmxlIHdpdGggc3RhbmRhcmQgW1N0YWNrQ29udGV4dE1hbmFnZXJde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvbWFpbi9wYWNrYWdlcy9vcGVudGVsZW1ldHJ5LXNkay10cmFjZS13ZWIvc3JjL1N0YWNrQ29udGV4dE1hbmFnZXIudHN9LlxuICogSXQgaGVhdmlseSBkZXBlbmRzIG9uIFt6b25lLmpzXXtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS96b25lLmpzfS5cbiAqIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgY29udGV4dCBpbiB6b25lLiBFYWNoIENvbnRleHQgd2lsbCBoYXZlIGFsd2F5cyBuZXcgWm9uZTtcbiAqIEl0IGFsc28gc3VwcG9ydHMgYmluZGluZyBhIGNlcnRhaW4gU3BhbiB0byBhIHRhcmdldCB0aGF0IGhhcyBcImFkZEV2ZW50TGlzdGVuZXJcIiBhbmQgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIuXG4gKiBXaGVuIHRoaXMgaGFwcGVucyBhIG5ldyB6b25lIGlzIGJlaW5nIGNyZWF0ZWQgYW5kIHRoZSBwcm92aWRlZCBTcGFuIGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgem9uZS5cbiAqL1xudmFyIFpvbmVDb250ZXh0TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBab25lQ29udGV4dE1hbmFnZXIoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBjb250ZXh0IG1hbmFnZXIgaXMgZW5hYmxlZCBvciBub3RcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhlbHBzIHRvIGNyZWF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgem9uZXMgLSBwYXJ0IG9mIHpvbmUgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY29udGV4dCBmcm9tIGNlcnRhaW4gem9uZSBuYW1lXG4gICAgICogQHBhcmFtIGFjdGl2ZVpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9hY3RpdmVDb250ZXh0RnJvbVpvbmUgPSBmdW5jdGlvbiAoYWN0aXZlWm9uZSkge1xuICAgICAgICByZXR1cm4gKGFjdGl2ZVpvbmUgJiYgYWN0aXZlWm9uZS5nZXQoWk9ORV9DT05URVhUX0tFWSkpIHx8IFJPT1RfQ09OVEVYVDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRhcmdldCBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB0YXJnZXQgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBjb250ZXh0XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9iaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtYW5hZ2VyID0gdGhpcztcbiAgICAgICAgdmFyIGNvbnRleHRXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLndpdGgoY29udGV4dCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFyZ2V0LmFwcGx5KF90aGlzLCBhcmdzKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0V3JhcHBlciwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRhcmdldC5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dFdyYXBwZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGJpbmQgdG8gdGFyZ2V0XG4gICAgICogQHBhcmFtIG9iaiB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBsaXN0ZW5lcnMgd2lsbCBiZSBwYXRjaGVkXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fYmluZExpc3RlbmVyID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iaikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gb2JqO1xuICAgICAgICBpZiAodGFyZ2V0Ll9fb3RfbGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hBZGRFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hSZW1vdmVFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSB6b25lIG5hbWVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIrKztcbiAgICAgICAgdmFyIHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl96b25lQ291bnRlciArIFwiLVwiICsgcmFuZG9tO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB6b25lXG4gICAgICogQHBhcmFtIHpvbmVOYW1lIHpvbmUgbmFtZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgYmluZCB3aXRoIFpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lID0gZnVuY3Rpb24gKHpvbmVOYW1lLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5mb3JrKHtcbiAgICAgICAgICAgIG5hbWU6IHpvbmVOYW1lLFxuICAgICAgICAgICAgcHJvcGVydGllczogKF9hID0ge30sXG4gICAgICAgICAgICAgICAgX2FbWk9ORV9DT05URVhUX0tFWV0gPSBjb250ZXh0LFxuICAgICAgICAgICAgICAgIF9hKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgem9uZVxuICAgICAqL1xuICAgIFpvbmVDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuX2dldEFjdGl2ZVpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBab25lLmN1cnJlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQYXRjaGVzIGFkZEV2ZW50TGlzdGVuZXIgbWV0aG9kXG4gICAgICogQHBhcmFtIHRhcmdldCBhbnkgdGFyZ2V0IHRoYXQgaGFzIFwiYWRkRXZlbnRMaXN0ZW5lclwiIG1ldGhvZFxuICAgICAqIEBwYXJhbSBvcmlnaW5hbCByZWZlcmVuY2UgdG8gdGhlIHBhdGNoZWQgbWV0aG9kXG4gICAgICogQHBhcmFtIFtjb250ZXh0XSBjb250ZXh0IHRvIGJlIGJpbmQgdG8gdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fcGF0Y2hBZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHRNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIsIG9wdHMpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19vdF9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVycyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF07XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGF0Y2hlZExpc3RlbmVyID0gY29udGV4dE1hbmFnZXIuYmluZChjb250ZXh0LCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAvLyBzdG9yZSBhIHdlYWsgcmVmZXJlbmNlIG9mIHRoZSB1c2VyIGxpc3RlbmVyIHRvIG91cnNcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQobGlzdGVuZXIsIHBhdGNoZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyLCBvcHRzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcmVtb3ZlRXZlbnRMaXN0ZW5lciBtZXRob2RcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGFueSB0YXJnZXQgdGhhdCBoYXMgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIgbWV0aG9kXG4gICAgICogQHBhcmFtIG9yaWdpbmFsIHJlZmVyZW5jZSB0byB0aGUgcGF0Y2hlZCBtZXRob2RcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9wYXRjaFJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcmlnaW5hbCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5fX290X2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzW2V2ZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBldmVudHMgPSB0YXJnZXQuX19vdF9saXN0ZW5lcnNbZXZlbnRdO1xuICAgICAgICAgICAgdmFyIHBhdGNoZWRMaXN0ZW5lciA9IGV2ZW50cy5nZXQobGlzdGVuZXIpO1xuICAgICAgICAgICAgZXZlbnRzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjb250ZXh0XG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJPT1RfQ09OVEVYVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWN0aXZlWm9uZSA9IHRoaXMuX2dldEFjdGl2ZVpvbmUoKTtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZUNvbnRleHRGcm9tWm9uZShhY3RpdmVab25lKTtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUk9PVF9DT05URVhUO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQmluZHMgYSB0aGUgY2VydGFpbiBjb250ZXh0IG9yIHRoZSBhY3RpdmUgb25lIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIHRoZW4gcmV0dXJucyB0aGUgdGFyZ2V0XG4gICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IChzcGFuKSB0byBiZSBiaW5kIHRvIHRhcmdldFxuICAgICAqIEBwYXJhbSB0YXJnZXQgYSBmdW5jdGlvbiBvciBldmVudCBlbWl0dGVyLiBXaGVuIHRhcmdldCBvciBvbmUgb2YgaXRzIGNhbGxiYWNrcyBpcyBjYWxsZWQsXG4gICAgICogIHRoZSBwcm92aWRlZCBjb250ZXh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYWN0aXZlIGNvbnRleHQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIGlmIG5vIHNwZWNpZmljIGNvbnRleHQgdG8gcHJvcGFnYXRlIGlzIGdpdmVuLCB3ZSB1c2UgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluZEZ1bmN0aW9uKGNvbnRleHQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNMaXN0ZW5lck9iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9iaW5kTGlzdGVuZXIoY29udGV4dCwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0aGUgY29udGV4dCBtYW5hZ2VyIChjbGVhcnMgYWxsIHRoZSBjb250ZXh0cylcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBjb250ZXh0IG1hbmFnZXIgYW5kIGNyZWF0ZXMgYSBkZWZhdWx0KHJvb3QpIGNvbnRleHRcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIFtmbl0gd2l0aCB0aGUgcHJvdmlkZWQgW2NvbnRleHRdLlxuICAgICAqICAgICBJZiBbY29udGV4dF0gaXMgdW5kZWZpbmVkIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGFjdGl2ZSBjb250ZXh0LlxuICAgICAqICAgICBUaGUgY29udGV4dCB3aWxsIGJlIHNldCBhcyBhY3RpdmVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGNhbGxlZCB3aXRoIHByb3ZpZGVkIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHRoaXNBcmcgb3B0aW9uYWwgcmVjZWl2ZXIgdG8gYmUgdXNlZCBmb3IgY2FsbGluZyBmblxuICAgICAqIEBwYXJhbSBhcmdzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gZm5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLndpdGggPSBmdW5jdGlvbiAoY29udGV4dCwgZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAzOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAzXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHpvbmVOYW1lID0gdGhpcy5fY3JlYXRlWm9uZU5hbWUoKTtcbiAgICAgICAgdmFyIG5ld1pvbmUgPSB0aGlzLl9jcmVhdGVab25lKHpvbmVOYW1lLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ld1pvbmUucnVuKGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBab25lQ29udGV4dE1hbmFnZXI7XG59KCkpO1xuXG52YXIgem9uZSA9IHt9O1xuXG52YXIgaGFzUmVxdWlyZWRab25lO1xuXG5mdW5jdGlvbiByZXF1aXJlWm9uZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFpvbmUpIHJldHVybiB6b25lO1xuXHRoYXNSZXF1aXJlZFpvbmUgPSAxO1xuXHQvKipcblx0ICogQGxpY2Vuc2UgQW5ndWxhciB2PHVua25vd24+XG5cdCAqIChjKSAyMDEwLTIwMjUgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvL1xuXHQgKiBMaWNlbnNlOiBNSVRcblx0ICovXG5cdGNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5cdC8vIF9fWm9uZV9zeW1ib2xfcHJlZml4IGdsb2JhbCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB6b25lXG5cdC8vIHN5bWJvbCBwcmVmaXggd2l0aCBhIGN1c3RvbSBvbmUgaWYgbmVlZGVkLlxuXHRmdW5jdGlvbiBfX3N5bWJvbF9fKG5hbWUpIHtcblx0ICAgIGNvbnN0IHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJztcblx0ICAgIHJldHVybiBzeW1ib2xQcmVmaXggKyBuYW1lO1xuXHR9XG5cdGZ1bmN0aW9uIGluaXRab25lKCkge1xuXHQgICAgY29uc3QgcGVyZm9ybWFuY2UgPSBnbG9iYWxbJ3BlcmZvcm1hbmNlJ107XG5cdCAgICBmdW5jdGlvbiBtYXJrKG5hbWUpIHtcblx0ICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWFyayddICYmIHBlcmZvcm1hbmNlWydtYXJrJ10obmFtZSk7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBwZXJmb3JtYW5jZU1lYXN1cmUobmFtZSwgbGFiZWwpIHtcblx0ICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWVhc3VyZSddICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10obmFtZSwgbGFiZWwpO1xuXHQgICAgfVxuXHQgICAgbWFyaygnWm9uZScpO1xuXHQgICAgY2xhc3MgWm9uZUltcGwge1xuXHQgICAgICAgIHN0YXRpYyBfX3N5bWJvbF9fID0gX19zeW1ib2xfXztcblx0ICAgICAgICBzdGF0aWMgYXNzZXJ0Wm9uZVBhdGNoZWQoKSB7XG5cdCAgICAgICAgICAgIGlmIChnbG9iYWxbJ1Byb21pc2UnXSAhPT0gcGF0Y2hlc1snWm9uZUF3YXJlUHJvbWlzZSddKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmUuanMgaGFzIGRldGVjdGVkIHRoYXQgWm9uZUF3YXJlUHJvbWlzZSBgKHdpbmRvd3xnbG9iYWwpLlByb21pc2VgICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiBvdmVyd3JpdHRlbi5cXG4nICtcblx0ICAgICAgICAgICAgICAgICAgICAnTW9zdCBsaWtlbHkgY2F1c2UgaXMgdGhhdCBhIFByb21pc2UgcG9seWZpbGwgaGFzIGJlZW4gbG9hZGVkICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RhdGljIGdldCByb290KCkge1xuXHQgICAgICAgICAgICBsZXQgem9uZSA9IFpvbmVJbXBsLmN1cnJlbnQ7XG5cdCAgICAgICAgICAgIHdoaWxlICh6b25lLnBhcmVudCkge1xuXHQgICAgICAgICAgICAgICAgem9uZSA9IHpvbmUucGFyZW50O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB6b25lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgZ2V0IGN1cnJlbnQoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfY3VycmVudFpvbmVGcmFtZS56b25lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgZ2V0IGN1cnJlbnRUYXNrKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRUYXNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgX19sb2FkX3BhdGNoKG5hbWUsIGZuLCBpZ25vcmVEdXBsaWNhdGUgPSBmYWxzZSkge1xuXHQgICAgICAgICAgICBpZiAocGF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gYGNoZWNrRHVwbGljYXRlYCBvcHRpb24gaXMgZGVmaW5lZCBmcm9tIGdsb2JhbCB2YXJpYWJsZVxuXHQgICAgICAgICAgICAgICAgLy8gc28gaXQgd29ya3MgZm9yIGFsbCBtb2R1bGVzLlxuXHQgICAgICAgICAgICAgICAgLy8gYGlnbm9yZUR1cGxpY2F0ZWAgY2FuIHdvcmsgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlXG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGVja0R1cGxpY2F0ZSA9IGdsb2JhbFtfX3N5bWJvbF9fKCdmb3JjZUR1cGxpY2F0ZVpvbmVDaGVjaycpXSA9PT0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICghaWdub3JlRHVwbGljYXRlICYmIGNoZWNrRHVwbGljYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgbG9hZGVkIHBhdGNoOiAnICsgbmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoIWdsb2JhbFsnX19ab25lX2Rpc2FibGVfJyArIG5hbWVdKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwZXJmTmFtZSA9ICdab25lOicgKyBuYW1lO1xuXHQgICAgICAgICAgICAgICAgbWFyayhwZXJmTmFtZSk7XG5cdCAgICAgICAgICAgICAgICBwYXRjaGVzW25hbWVdID0gZm4oZ2xvYmFsLCBab25lSW1wbCwgX2FwaSk7XG5cdCAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZU1lYXN1cmUocGVyZk5hbWUsIHBlcmZOYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXQgcGFyZW50KCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXQgbmFtZSgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF9wYXJlbnQ7XG5cdCAgICAgICAgX25hbWU7XG5cdCAgICAgICAgX3Byb3BlcnRpZXM7XG5cdCAgICAgICAgX3pvbmVEZWxlZ2F0ZTtcblx0ICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHpvbmVTcGVjKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcblx0ICAgICAgICAgICAgdGhpcy5fbmFtZSA9IHpvbmVTcGVjID8gem9uZVNwZWMubmFtZSB8fCAndW5uYW1lZCcgOiAnPHJvb3Q+Jztcblx0ICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9ICh6b25lU3BlYyAmJiB6b25lU3BlYy5wcm9wZXJ0aWVzKSB8fCB7fTtcblx0ICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlID0gbmV3IF9ab25lRGVsZWdhdGUodGhpcywgdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC5fem9uZURlbGVnYXRlLCB6b25lU3BlYyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGdldChrZXkpIHtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZSA9IHRoaXMuZ2V0Wm9uZVdpdGgoa2V5KTtcblx0ICAgICAgICAgICAgaWYgKHpvbmUpXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5fcHJvcGVydGllc1trZXldO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXRab25lV2l0aChrZXkpIHtcblx0ICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzO1xuXHQgICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuX3Byb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuX3BhcmVudDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZm9yayh6b25lU3BlYykge1xuXHQgICAgICAgICAgICBpZiAoIXpvbmVTcGVjKVxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lU3BlYyByZXF1aXJlZCEnKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5mb3JrKHRoaXMsIHpvbmVTcGVjKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd3JhcChjYWxsYmFjaywgc291cmNlKSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGZ1bmN0aW9uIGdvdDogJyArIGNhbGxiYWNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBfY2FsbGJhY2sgPSB0aGlzLl96b25lRGVsZWdhdGUuaW50ZXJjZXB0KHRoaXMsIGNhbGxiYWNrLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICBjb25zdCB6b25lID0gdGhpcztcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bkd1YXJkZWQoX2NhbGxiYWNrLCB0aGlzLCBhcmd1bWVudHMsIHNvdXJjZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJ1bihjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkge1xuXHQgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBfY3VycmVudFpvbmVGcmFtZSwgem9uZTogdGhpcyB9O1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZpbmFsbHkge1xuXHQgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcnVuR3VhcmRlZChjYWxsYmFjaywgYXBwbHlUaGlzID0gbnVsbCwgYXBwbHlBcmdzLCBzb3VyY2UpIHtcblx0ICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogX2N1cnJlbnRab25lRnJhbWUsIHpvbmU6IHRoaXMgfTtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnJvcikpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZpbmFsbHkge1xuXHQgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcnVuVGFzayh0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuXHQgICAgICAgICAgICBpZiAodGFzay56b25lICE9IHRoaXMpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcblx0ICAgICAgICAgICAgICAgICAgICAodGFzay56b25lIHx8IE5PX1pPTkUpLm5hbWUgK1xuXHQgICAgICAgICAgICAgICAgICAgICc7IEV4ZWN1dGlvbjogJyArXG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lICtcblx0ICAgICAgICAgICAgICAgICAgICAnKScpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IHpvbmVUYXNrID0gdGFzaztcblx0ICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvNzc4LCBzb21ldGltZXMgZXZlbnRUYXNrXG5cdCAgICAgICAgICAgIC8vIHdpbGwgcnVuIGluIG5vdFNjaGVkdWxlZChjYW5jZWxlZCkgc3RhdGUsIHdlIHNob3VsZCBub3QgdHJ5IHRvXG5cdCAgICAgICAgICAgIC8vIHJ1biBzdWNoIGtpbmQgb2YgdGFzayBidXQganVzdCByZXR1cm5cblx0ICAgICAgICAgICAgY29uc3QgeyB0eXBlLCBkYXRhOiB7IGlzUGVyaW9kaWMgPSBmYWxzZSwgaXNSZWZyZXNoYWJsZSA9IGZhbHNlIH0gPSB7fSB9ID0gdGFzaztcblx0ICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT09IG5vdFNjaGVkdWxlZCAmJiAodHlwZSA9PT0gZXZlbnRUYXNrIHx8IHR5cGUgPT09IG1hY3JvVGFzaykpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCByZUVudHJ5R3VhcmQgPSB0YXNrLnN0YXRlICE9IHJ1bm5pbmc7XG5cdCAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHJ1bm5pbmcsIHNjaGVkdWxlZCk7XG5cdCAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVGFzayA9IF9jdXJyZW50VGFzaztcblx0ICAgICAgICAgICAgX2N1cnJlbnRUYXNrID0gem9uZVRhc2s7XG5cdCAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBtYWNyb1Rhc2sgJiYgdGFzay5kYXRhICYmICFpc1BlcmlvZGljICYmICFpc1JlZnJlc2hhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWxGbiA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsIHpvbmVUYXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycm9yKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZmluYWxseSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzaydzIHN0YXRlIGlzIG5vdFNjaGVkdWxlZCBvciB1bmtub3duLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG5cdCAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgbm90IHJlc2V0IHRoZSBzdGF0ZSB0byBzY2hlZHVsZWRcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGFzay5zdGF0ZTtcblx0ICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbm90U2NoZWR1bGVkICYmIHN0YXRlICE9PSB1bmtub3duKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gZXZlbnRUYXNrIHx8IGlzUGVyaW9kaWMgfHwgKGlzUmVmcmVzaGFibGUgJiYgc3RhdGUgPT09IHNjaGVkdWxpbmcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgcnVubmluZywgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6b25lRGVsZWdhdGVzID0gem9uZVRhc2suX3pvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh6b25lVGFzaywgLTEpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYgem9uZVRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHJ1bm5pbmcsIG5vdFNjaGVkdWxlZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JlZnJlc2hhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lVGFzay5fem9uZURlbGVnYXRlcyA9IHpvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IF9jdXJyZW50Wm9uZUZyYW1lLnBhcmVudDtcblx0ICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHByZXZpb3VzVGFzaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzY2hlZHVsZVRhc2sodGFzaykge1xuXHQgICAgICAgICAgICBpZiAodGFzay56b25lICYmIHRhc2suem9uZSAhPT0gdGhpcykge1xuXHQgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRhc2sgd2FzIHJlc2NoZWR1bGVkLCB0aGUgbmV3Wm9uZVxuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSB0aGUgY2hpbGRyZW4gb2YgdGhlIG9yaWdpbmFsIHpvbmVcblx0ICAgICAgICAgICAgICAgIGxldCBuZXdab25lID0gdGhpcztcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChuZXdab25lKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1pvbmUgPT09IHRhc2suem9uZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gJHt0aGlzLm5hbWV9IHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICR7dGFzay56b25lLm5hbWV9YCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIG5ld1pvbmUgPSBuZXdab25lLnBhcmVudDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGluZywgbm90U2NoZWR1bGVkKTtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IFtdO1xuXHQgICAgICAgICAgICB0YXNrLl96b25lRGVsZWdhdGVzID0gem9uZURlbGVnYXRlcztcblx0ICAgICAgICAgICAgdGFzay5fem9uZSA9IHRoaXM7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICB0YXNrID0gdGhpcy5fem9uZURlbGVnYXRlLnNjaGVkdWxlVGFzayh0aGlzLCB0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBzaG91bGQgc2V0IHRhc2sncyBzdGF0ZSB0byB1bmtub3duIHdoZW4gc2NoZWR1bGVUYXNrIHRocm93IGVycm9yXG5cdCAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlcnIgbWF5IGZyb20gcmVzY2hlZHVsZSwgc28gdGhlIGZyb21TdGF0ZSBtYXliZSBub3RTY2hlZHVsZWRcblx0ICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyh1bmtub3duLCBzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpO1xuXHQgICAgICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc2hvdWxkIHdlIGNoZWNrIHRoZSByZXN1bHQgZnJvbSBoYW5kbGVFcnJvcj9cblx0ICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0YXNrLl96b25lRGVsZWdhdGVzID09PSB6b25lRGVsZWdhdGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIGJlY2F1c2UgaW50ZXJuYWxseSB0aGUgZGVsZWdhdGUgY2FuIHJlc2NoZWR1bGUgdGhlIHRhc2suXG5cdCAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT0gc2NoZWR1bGluZykge1xuXHQgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjaGVkdWxlTWFjcm9UYXNrKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBab25lVGFzayhtYWNyb1Rhc2ssIHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKGV2ZW50VGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYW5jZWxUYXNrKHRhc2spIHtcblx0ICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKVxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHRhc2sgY2FuIG9ubHkgYmUgY2FuY2VsbGVkIGluIHRoZSB6b25lIG9mIGNyZWF0aW9uISAoQ3JlYXRpb246ICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICh0YXNrLnpvbmUgfHwgTk9fWk9ORSkubmFtZSArXG5cdCAgICAgICAgICAgICAgICAgICAgJzsgRXhlY3V0aW9uOiAnICtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgK1xuXHQgICAgICAgICAgICAgICAgICAgICcpJyk7XG5cdCAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlICE9PSBzY2hlZHVsZWQgJiYgdGFzay5zdGF0ZSAhPT0gcnVubmluZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuY2FuY2VsVGFzayh0aGlzLCB0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMgd2hlbiBjYW5jZWxUYXNrLCB0cmFuc2l0IHRoZSBzdGF0ZSB0byB1bmtub3duXG5cdCAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAtMSk7XG5cdCAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIGNhbmNlbGluZyk7XG5cdCAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAtMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF91cGRhdGVUYXNrQ291bnQodGFzaywgY291bnQpIHtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IHRhc2suX3pvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgdGFzay5fem9uZURlbGVnYXRlcyA9IG51bGw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB6b25lRGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB6b25lRGVsZWdhdGVzW2ldLl91cGRhdGVUYXNrQ291bnQodGFzay50eXBlLCBjb3VudCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjb25zdCBERUxFR0FURV9aUyA9IHtcblx0ICAgICAgICBuYW1lOiAnJyxcblx0ICAgICAgICBvbkhhc1Rhc2s6IChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCBoYXNUYXNrU3RhdGUpID0+IGRlbGVnYXRlLmhhc1Rhc2sodGFyZ2V0LCBoYXNUYXNrU3RhdGUpLFxuXHQgICAgICAgIG9uU2NoZWR1bGVUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRhcmdldCwgdGFzayksXG5cdCAgICAgICAgb25JbnZva2VUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpID0+IGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyksXG5cdCAgICAgICAgb25DYW5jZWxUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuY2FuY2VsVGFzayh0YXJnZXQsIHRhc2spLFxuXHQgICAgfTtcblx0ICAgIGNsYXNzIF9ab25lRGVsZWdhdGUge1xuXHQgICAgICAgIGdldCB6b25lKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgX3pvbmU7XG5cdCAgICAgICAgX3Rhc2tDb3VudHMgPSB7XG5cdCAgICAgICAgICAgICdtaWNyb1Rhc2snOiAwLFxuXHQgICAgICAgICAgICAnbWFjcm9UYXNrJzogMCxcblx0ICAgICAgICAgICAgJ2V2ZW50VGFzayc6IDAsXG5cdCAgICAgICAgfTtcblx0ICAgICAgICBfcGFyZW50RGVsZWdhdGU7XG5cdCAgICAgICAgX2ZvcmtEbGd0O1xuXHQgICAgICAgIF9mb3JrWlM7XG5cdCAgICAgICAgX2ZvcmtDdXJyWm9uZTtcblx0ICAgICAgICBfaW50ZXJjZXB0RGxndDtcblx0ICAgICAgICBfaW50ZXJjZXB0WlM7XG5cdCAgICAgICAgX2ludGVyY2VwdEN1cnJab25lO1xuXHQgICAgICAgIF9pbnZva2VEbGd0O1xuXHQgICAgICAgIF9pbnZva2VaUztcblx0ICAgICAgICBfaW52b2tlQ3VyclpvbmU7XG5cdCAgICAgICAgX2hhbmRsZUVycm9yRGxndDtcblx0ICAgICAgICBfaGFuZGxlRXJyb3JaUztcblx0ICAgICAgICBfaGFuZGxlRXJyb3JDdXJyWm9uZTtcblx0ICAgICAgICBfc2NoZWR1bGVUYXNrRGxndDtcblx0ICAgICAgICBfc2NoZWR1bGVUYXNrWlM7XG5cdCAgICAgICAgX3NjaGVkdWxlVGFza0N1cnJab25lO1xuXHQgICAgICAgIF9pbnZva2VUYXNrRGxndDtcblx0ICAgICAgICBfaW52b2tlVGFza1pTO1xuXHQgICAgICAgIF9pbnZva2VUYXNrQ3VyclpvbmU7XG5cdCAgICAgICAgX2NhbmNlbFRhc2tEbGd0O1xuXHQgICAgICAgIF9jYW5jZWxUYXNrWlM7XG5cdCAgICAgICAgX2NhbmNlbFRhc2tDdXJyWm9uZTtcblx0ICAgICAgICBfaGFzVGFza0RsZ3Q7XG5cdCAgICAgICAgX2hhc1Rhc2tEbGd0T3duZXI7XG5cdCAgICAgICAgX2hhc1Rhc2taUztcblx0ICAgICAgICBfaGFzVGFza0N1cnJab25lO1xuXHQgICAgICAgIGNvbnN0cnVjdG9yKHpvbmUsIHBhcmVudERlbGVnYXRlLCB6b25lU3BlYykge1xuXHQgICAgICAgICAgICB0aGlzLl96b25lID0gem9uZTtcblx0ICAgICAgICAgICAgdGhpcy5fcGFyZW50RGVsZWdhdGUgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgdGhpcy5fZm9ya1pTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjICYmIHpvbmVTcGVjLm9uRm9yayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtaUyk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZvcmtEbGd0ID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uRm9yayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtEbGd0KTtcblx0ICAgICAgICAgICAgdGhpcy5fZm9ya0N1cnJab25lID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkZvcmsgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtDdXJyWm9uZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdFpTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdFpTKTtcblx0ICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0RGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnRlcmNlcHQgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHREbGd0KTtcblx0ICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHRDdXJyWm9uZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VEbGd0ID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZSA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZURsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VDdXJyWm9uZSA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZUN1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JaUyA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25IYW5kbGVFcnJvciA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2hhbmRsZUVycm9yWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckRsZ3QgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSGFuZGxlRXJyb3IgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckRsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckN1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uU2NoZWR1bGVUYXNrID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5fc2NoZWR1bGVUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrRGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2VUYXNrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkNhbmNlbFRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9jYW5jZWxUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25DYW5jZWxUYXNrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gbnVsbDtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBudWxsO1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndE93bmVyID0gbnVsbDtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gbnVsbDtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZVNwZWNIYXNUYXNrID0gem9uZVNwZWMgJiYgem9uZVNwZWMub25IYXNUYXNrO1xuXHQgICAgICAgICAgICBjb25zdCBwYXJlbnRIYXNUYXNrID0gcGFyZW50RGVsZWdhdGUgJiYgcGFyZW50RGVsZWdhdGUuX2hhc1Rhc2taUztcblx0ICAgICAgICAgICAgaWYgKHpvbmVTcGVjSGFzVGFzayB8fCBwYXJlbnRIYXNUYXNrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHJlcG9ydCBoYXNUYXNrLCB0aGFuIHRoaXMgWlMgbmVlZHMgdG8gZG8gcmVmIGNvdW50aW5nIG9uIHRhc2tzLiBJbiBzdWNoXG5cdCAgICAgICAgICAgICAgICAvLyBhIGNhc2UgYWxsIHRhc2sgcmVsYXRlZCBpbnRlcmNlcHRvcnMgbXVzdCBnbyB0aHJvdWdoIHRoaXMgWkQuIFdlIGNhbid0IHNob3J0IGNpcmN1aXQgaXQuXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMgPSB6b25lU3BlY0hhc1Rhc2sgPyB6b25lU3BlYyA6IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSB0aGlzO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcblx0ICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25TY2hlZHVsZVRhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9IHRoaXMuX3pvbmU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoIXpvbmVTcGVjLm9uSW52b2tlVGFzaykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25DYW5jZWxUYXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID0gREVMRUdBVEVfWlM7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPSB0aGlzLl96b25lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvcmsodGFyZ2V0Wm9uZSwgem9uZVNwZWMpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmtaU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKVxuXHQgICAgICAgICAgICAgICAgOiBuZXcgWm9uZUltcGwodGFyZ2V0Wm9uZSwgem9uZVNwZWMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpbnRlcmNlcHQodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJjZXB0WlNcblx0ICAgICAgICAgICAgICAgID8gdGhpcy5faW50ZXJjZXB0WlMub25JbnRlcmNlcHQodGhpcy5faW50ZXJjZXB0RGxndCwgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUsIHRhcmdldFpvbmUsIGNhbGxiYWNrLCBzb3VyY2UpXG5cdCAgICAgICAgICAgICAgICA6IGNhbGxiYWNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpbnZva2UodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVpTXG5cdCAgICAgICAgICAgICAgICA/IHRoaXMuX2ludm9rZVpTLm9uSW52b2tlKHRoaXMuX2ludm9rZURsZ3QsIHRoaXMuX2ludm9rZUN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSlcblx0ICAgICAgICAgICAgICAgIDogY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBoYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnJvcikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRXJyb3JaU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LCB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLCB0YXJnZXRab25lLCBlcnJvcilcblx0ICAgICAgICAgICAgICAgIDogdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc2NoZWR1bGVUYXNrKHRhcmdldFpvbmUsIHRhc2spIHtcblx0ICAgICAgICAgICAgbGV0IHJldHVyblRhc2sgPSB0YXNrO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc2NoZWR1bGVUYXNrWlMpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNUYXNrWlMpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrLl96b25lRGVsZWdhdGVzLnB1c2godGhpcy5faGFzVGFza0RsZ3RPd25lcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFyZXR1cm5UYXNrKVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVyblRhc2sgPSB0YXNrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRhc2suc2NoZWR1bGVGbikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2sudHlwZSA9PSBtaWNyb1Rhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGludm9rZVRhc2sodGFyZ2V0Wm9uZSwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9pbnZva2VUYXNrWlMub25JbnZva2VUYXNrKHRoaXMuX2ludm9rZVRhc2tEbGd0LCB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKVxuXHQgICAgICAgICAgICAgICAgOiB0YXNrLmNhbGxiYWNrLmFwcGx5KGFwcGx5VGhpcywgYXBwbHlBcmdzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2FuY2VsVGFzayh0YXJnZXRab25lLCB0YXNrKSB7XG5cdCAgICAgICAgICAgIGxldCB2YWx1ZTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2NhbmNlbFRhc2taUykge1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9jYW5jZWxUYXNrWlMub25DYW5jZWxUYXNrKHRoaXMuX2NhbmNlbFRhc2tEbGd0LCB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbEZuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1Rhc2sgaXMgbm90IGNhbmNlbGFibGUnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGFzay5jYW5jZWxGbih0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGhhc1Rhc2sodGFyZ2V0Wm9uZSwgaXNFbXB0eSkge1xuXHQgICAgICAgICAgICAvLyBoYXNUYXNrIHNob3VsZCBub3QgdGhyb3cgZXJyb3Igc28gb3RoZXIgWm9uZURlbGVnYXRlXG5cdCAgICAgICAgICAgIC8vIGNhbiBzdGlsbCB0cmlnZ2VyIGhhc1Rhc2sgY2FsbGJhY2tcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUy5vbkhhc1Rhc2sodGhpcy5faGFzVGFza0RsZ3QsIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgaXNFbXB0eSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF91cGRhdGVUYXNrQ291bnQodHlwZSwgY291bnQpIHtcblx0ICAgICAgICAgICAgY29uc3QgY291bnRzID0gdGhpcy5fdGFza0NvdW50cztcblx0ICAgICAgICAgICAgY29uc3QgcHJldiA9IGNvdW50c1t0eXBlXTtcblx0ICAgICAgICAgICAgY29uc3QgbmV4dCA9IChjb3VudHNbdHlwZV0gPSBwcmV2ICsgY291bnQpO1xuXHQgICAgICAgICAgICBpZiAobmV4dCA8IDApIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTW9yZSB0YXNrcyBleGVjdXRlZCB0aGVuIHdlcmUgc2NoZWR1bGVkLicpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwcmV2ID09IDAgfHwgbmV4dCA9PSAwKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgIG1pY3JvVGFzazogY291bnRzWydtaWNyb1Rhc2snXSA+IDAsXG5cdCAgICAgICAgICAgICAgICAgICAgbWFjcm9UYXNrOiBjb3VudHNbJ21hY3JvVGFzayddID4gMCxcblx0ICAgICAgICAgICAgICAgICAgICBldmVudFRhc2s6IGNvdW50c1snZXZlbnRUYXNrJ10gPiAwLFxuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogdHlwZSxcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB0aGlzLmhhc1Rhc2sodGhpcy5fem9uZSwgaXNFbXB0eSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjbGFzcyBab25lVGFzayB7XG5cdCAgICAgICAgdHlwZTtcblx0ICAgICAgICBzb3VyY2U7XG5cdCAgICAgICAgaW52b2tlO1xuXHQgICAgICAgIGNhbGxiYWNrO1xuXHQgICAgICAgIGRhdGE7XG5cdCAgICAgICAgc2NoZWR1bGVGbjtcblx0ICAgICAgICBjYW5jZWxGbjtcblx0ICAgICAgICBfem9uZSA9IG51bGw7XG5cdCAgICAgICAgcnVuQ291bnQgPSAwO1xuXHQgICAgICAgIF96b25lRGVsZWdhdGVzID0gbnVsbDtcblx0ICAgICAgICBfc3RhdGUgPSAnbm90U2NoZWR1bGVkJztcblx0ICAgICAgICBjb25zdHJ1Y3Rvcih0eXBlLCBzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZUZuLCBjYW5jZWxGbikge1xuXHQgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucztcblx0ICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZuID0gc2NoZWR1bGVGbjtcblx0ICAgICAgICAgICAgdGhpcy5jYW5jZWxGbiA9IGNhbmNlbEZuO1xuXHQgICAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIGlzIG5vdCBkZWZpbmVkJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXHQgICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblx0ICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiBvcHRpb25zIHNob3VsZCBoYXZlIGludGVyZmFjZVxuXHQgICAgICAgICAgICBpZiAodHlwZSA9PT0gZXZlbnRUYXNrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy51c2VHKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IFpvbmVUYXNrLmludm9rZVRhc2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gWm9uZVRhc2suaW52b2tlVGFzay5jYWxsKGdsb2JhbCwgc2VsZiwgdGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RhdGljIGludm9rZVRhc2sodGFzaywgdGFyZ2V0LCBhcmdzKSB7XG5cdCAgICAgICAgICAgIGlmICghdGFzaykge1xuXHQgICAgICAgICAgICAgICAgdGFzayA9IHRoaXM7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcysrO1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgdGFzay5ydW5Db3VudCsrO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIHRhcmdldCwgYXJncyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZmluYWxseSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PSAxKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcy0tO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGdldCB6b25lKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZ2V0IHN0YXRlKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhbmNlbFNjaGVkdWxlUmVxdWVzdCgpIHtcblx0ICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF90cmFuc2l0aW9uVG8odG9TdGF0ZSwgZnJvbVN0YXRlMSwgZnJvbVN0YXRlMikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTEgfHwgdGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTIpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdG9TdGF0ZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0b1N0YXRlID09IG5vdFNjaGVkdWxlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZXMgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMudHlwZX0gJyR7dGhpcy5zb3VyY2V9JzogY2FuIG5vdCB0cmFuc2l0aW9uIHRvICcke3RvU3RhdGV9JywgZXhwZWN0aW5nIHN0YXRlICcke2Zyb21TdGF0ZTF9JyR7ZnJvbVN0YXRlMiA/IFwiIG9yICdcIiArIGZyb21TdGF0ZTIgKyBcIidcIiA6ICcnfSwgd2FzICcke3RoaXMuX3N0YXRlfScuYCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdG9TdHJpbmcoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdHlwZW9mIHRoaXMuZGF0YS5oYW5kbGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuaGFuZGxlSWQudG9TdHJpbmcoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gYWRkIHRvSlNPTiBtZXRob2QgdG8gcHJldmVudCBjeWNsaWMgZXJyb3Igd2hlblxuXHQgICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spXG5cdCAgICAgICAgdG9KU09OKCkge1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuXHQgICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG5cdCAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuXHQgICAgICAgICAgICAgICAgem9uZTogdGhpcy56b25lLm5hbWUsXG5cdCAgICAgICAgICAgICAgICBydW5Db3VudDogdGhpcy5ydW5Db3VudCxcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vICBNSUNST1RBU0sgUVVFVUVcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICBjb25zdCBzeW1ib2xTZXRUaW1lb3V0ID0gX19zeW1ib2xfXygnc2V0VGltZW91dCcpO1xuXHQgICAgY29uc3Qgc3ltYm9sUHJvbWlzZSA9IF9fc3ltYm9sX18oJ1Byb21pc2UnKTtcblx0ICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG5cdCAgICBsZXQgX21pY3JvVGFza1F1ZXVlID0gW107XG5cdCAgICBsZXQgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlO1xuXHQgICAgbGV0IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZTtcblx0ICAgIGZ1bmN0aW9uIG5hdGl2ZVNjaGVkdWxlTWljcm9UYXNrKGZ1bmMpIHtcblx0ICAgICAgICBpZiAoIW5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICBpZiAoZ2xvYmFsW3N5bWJvbFByb21pc2VdKSB7XG5cdCAgICAgICAgICAgICAgICBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UgPSBnbG9iYWxbc3ltYm9sUHJvbWlzZV0ucmVzb2x2ZSgwKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlKSB7XG5cdCAgICAgICAgICAgIGxldCBuYXRpdmVUaGVuID0gbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlW3N5bWJvbFRoZW5dO1xuXHQgICAgICAgICAgICBpZiAoIW5hdGl2ZVRoZW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBQcm9taXNlIGlzIG5vdCBwYXRjaGFibGUsIHdlIG5lZWQgdG8gdXNlIGB0aGVuYCBkaXJlY3RseVxuXHQgICAgICAgICAgICAgICAgLy8gaXNzdWUgMTA3OFxuXHQgICAgICAgICAgICAgICAgbmF0aXZlVGhlbiA9IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZVsndGhlbiddO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG5hdGl2ZVRoZW4uY2FsbChuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UsIGZ1bmMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZ2xvYmFsW3N5bWJvbFNldFRpbWVvdXRdKGZ1bmMsIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIHNjaGVkdWxlTWljcm9UYXNrKHRhc2spIHtcblx0ICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkXG5cdCAgICAgICAgLy8gd2UgbXVzdCBib290c3RyYXAgdGhlIGluaXRpYWwgdGFzayBjcmVhdGlvbiBieSBtYW51YWxseSBzY2hlZHVsaW5nIHRoZSBkcmFpblxuXHQgICAgICAgIGlmIChfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID09PSAwICYmIF9taWNyb1Rhc2tRdWV1ZS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuXG5cdCAgICAgICAgICAgIG5hdGl2ZVNjaGVkdWxlTWljcm9UYXNrKGRyYWluTWljcm9UYXNrUXVldWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0YXNrICYmIF9taWNyb1Rhc2tRdWV1ZS5wdXNoKHRhc2spO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpIHtcblx0ICAgICAgICBpZiAoIV9pc0RyYWluaW5nTWljcm90YXNrUXVldWUpIHtcblx0ICAgICAgICAgICAgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IHRydWU7XG5cdCAgICAgICAgICAgIHdoaWxlIChfbWljcm9UYXNrUXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IF9taWNyb1Rhc2tRdWV1ZTtcblx0ICAgICAgICAgICAgICAgIF9taWNyb1Rhc2tRdWV1ZSA9IFtdO1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBxdWV1ZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUucnVuVGFzayh0YXNrLCBudWxsLCBudWxsKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIF9hcGkub25VbmhhbmRsZWRFcnJvcihlcnJvcik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIF9hcGkubWljcm90YXNrRHJhaW5Eb25lKCk7XG5cdCAgICAgICAgICAgIF9pc0RyYWluaW5nTWljcm90YXNrUXVldWUgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vICBCT09UU1RSQVBcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICBjb25zdCBOT19aT05FID0geyBuYW1lOiAnTk8gWk9ORScgfTtcblx0ICAgIGNvbnN0IG5vdFNjaGVkdWxlZCA9ICdub3RTY2hlZHVsZWQnLCBzY2hlZHVsaW5nID0gJ3NjaGVkdWxpbmcnLCBzY2hlZHVsZWQgPSAnc2NoZWR1bGVkJywgcnVubmluZyA9ICdydW5uaW5nJywgY2FuY2VsaW5nID0gJ2NhbmNlbGluZycsIHVua25vd24gPSAndW5rbm93bic7XG5cdCAgICBjb25zdCBtaWNyb1Rhc2sgPSAnbWljcm9UYXNrJywgbWFjcm9UYXNrID0gJ21hY3JvVGFzaycsIGV2ZW50VGFzayA9ICdldmVudFRhc2snO1xuXHQgICAgY29uc3QgcGF0Y2hlcyA9IHt9O1xuXHQgICAgY29uc3QgX2FwaSA9IHtcblx0ICAgICAgICBzeW1ib2w6IF9fc3ltYm9sX18sXG5cdCAgICAgICAgY3VycmVudFpvbmVGcmFtZTogKCkgPT4gX2N1cnJlbnRab25lRnJhbWUsXG5cdCAgICAgICAgb25VbmhhbmRsZWRFcnJvcjogbm9vcCxcblx0ICAgICAgICBtaWNyb3Rhc2tEcmFpbkRvbmU6IG5vb3AsXG5cdCAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2s6IHNjaGVkdWxlTWljcm9UYXNrLFxuXHQgICAgICAgIHNob3dVbmNhdWdodEVycm9yOiAoKSA9PiAhWm9uZUltcGxbX19zeW1ib2xfXygnaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvcicpXSxcblx0ICAgICAgICBwYXRjaEV2ZW50VGFyZ2V0OiAoKSA9PiBbXSxcblx0ICAgICAgICBwYXRjaE9uUHJvcGVydGllczogbm9vcCxcblx0ICAgICAgICBwYXRjaE1ldGhvZDogKCkgPT4gbm9vcCxcblx0ICAgICAgICBiaW5kQXJndW1lbnRzOiAoKSA9PiBbXSxcblx0ICAgICAgICBwYXRjaFRoZW46ICgpID0+IG5vb3AsXG5cdCAgICAgICAgcGF0Y2hNYWNyb1Rhc2s6ICgpID0+IG5vb3AsXG5cdCAgICAgICAgcGF0Y2hFdmVudFByb3RvdHlwZTogKCkgPT4gbm9vcCxcblx0ICAgICAgICBpc0lFT3JFZGdlOiAoKSA9PiBmYWxzZSxcblx0ICAgICAgICBnZXRHbG9iYWxPYmplY3RzOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHk6ICgpID0+IG5vb3AsXG5cdCAgICAgICAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgT2JqZWN0Q3JlYXRlOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgQXJyYXlTbGljZTogKCkgPT4gW10sXG5cdCAgICAgICAgcGF0Y2hDbGFzczogKCkgPT4gbm9vcCxcblx0ICAgICAgICB3cmFwV2l0aEN1cnJlbnRab25lOiAoKSA9PiBub29wLFxuXHQgICAgICAgIGZpbHRlclByb3BlcnRpZXM6ICgpID0+IFtdLFxuXHQgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZDogKCkgPT4gbm9vcCxcblx0ICAgICAgICBfcmVkZWZpbmVQcm9wZXJ0eTogKCkgPT4gbm9vcCxcblx0ICAgICAgICBwYXRjaENhbGxiYWNrczogKCkgPT4gbm9vcCxcblx0ICAgICAgICBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzazogbmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2ssXG5cdCAgICB9O1xuXHQgICAgbGV0IF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IG51bGwsIHpvbmU6IG5ldyBab25lSW1wbChudWxsLCBudWxsKSB9O1xuXHQgICAgbGV0IF9jdXJyZW50VGFzayA9IG51bGw7XG5cdCAgICBsZXQgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9IDA7XG5cdCAgICBmdW5jdGlvbiBub29wKCkgeyB9XG5cdCAgICBwZXJmb3JtYW5jZU1lYXN1cmUoJ1pvbmUnLCAnWm9uZScpO1xuXHQgICAgcmV0dXJuIFpvbmVJbXBsO1xuXHR9XG5cblx0ZnVuY3Rpb24gbG9hZFpvbmUoKSB7XG5cdCAgICAvLyBpZiBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cyAobWF5YmUgem9uZS5qcyB3YXMgYWxyZWFkeSBsb2FkZWQgb3Jcblx0ICAgIC8vIHNvbWUgb3RoZXIgbGliIGFsc28gcmVnaXN0ZXJlZCBhIGdsb2JhbCBvYmplY3QgbmFtZWQgWm9uZSksIHdlIG1heSBuZWVkXG5cdCAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLlxuXHQgICAgLy8gRm9yIGV4YW1wbGUsXG5cdCAgICAvLyB3ZSBoYXZlIHR3byB3ZWIgcGFnZXMsIHBhZ2UxIGluY2x1ZGVzIHpvbmUuanMsIHBhZ2UyIGRvZXNuJ3QuXG5cdCAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLFxuXHQgICAgLy8gYnV0IHdoZW4gdXNlciBsb2FkIHBhZ2UyIGFnYWluLCBlcnJvciBvY2N1cnMgYmVjYXVzZSBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cy5cblx0ICAgIC8vIHNvIHdlIGFkZCBhIGZsYWcgdG8gbGV0IHVzZXIgY2hvb3NlIHdoZXRoZXIgdG8gdGhyb3cgdGhpcyBlcnJvciBvciBub3QuXG5cdCAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLlxuXHQgICAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblx0ICAgIGNvbnN0IGNoZWNrRHVwbGljYXRlID0gZ2xvYmFsW19fc3ltYm9sX18oJ2ZvcmNlRHVwbGljYXRlWm9uZUNoZWNrJyldID09PSB0cnVlO1xuXHQgICAgaWYgKGdsb2JhbFsnWm9uZSddICYmIChjaGVja0R1cGxpY2F0ZSB8fCB0eXBlb2YgZ2xvYmFsWydab25lJ10uX19zeW1ib2xfXyAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmUgYWxyZWFkeSBsb2FkZWQuJyk7XG5cdCAgICB9XG5cdCAgICAvLyBJbml0aWFsaXplIGdsb2JhbCBgWm9uZWAgY29uc3RhbnQuXG5cdCAgICBnbG9iYWxbJ1pvbmUnXSA/Pz0gaW5pdFpvbmUoKTtcblx0ICAgIHJldHVybiBnbG9iYWxbJ1pvbmUnXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdXBwcmVzcyBjbG9zdXJlIGNvbXBpbGVyIGVycm9ycyBhYm91dCB1bmtub3duICdab25lJyB2YXJpYWJsZVxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFycyxnbG9iYWxUaGlzLG1pc3NpbmdSZXF1aXJlfVxuXHQgKi9cblx0Ly8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIvPlxuXHQvLyBpc3N1ZSAjOTg5LCB0byByZWR1Y2UgYnVuZGxlIHNpemUsIHVzZSBzaG9ydCBuYW1lXG5cdC8qKiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICovXG5cdGNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdC8qKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgKi9cblx0Y29uc3QgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdC8qKiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgKi9cblx0Y29uc3QgT2JqZWN0R2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cdC8qKiBPYmplY3QuY3JlYXRlICovXG5cdGNvbnN0IE9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cdC8qKiBBcnJheS5wcm90b3R5cGUuc2xpY2UgKi9cblx0Y29uc3QgQXJyYXlTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblx0LyoqIGFkZEV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IEFERF9FVkVOVF9MSVNURU5FUl9TVFIgPSAnYWRkRXZlbnRMaXN0ZW5lcic7XG5cdC8qKiByZW1vdmVFdmVudExpc3RlbmVyIHN0cmluZyBjb25zdCAqL1xuXHRjb25zdCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuXHQvKiogem9uZVN5bWJvbCBhZGRFdmVudExpc3RlbmVyICovXG5cdGNvbnN0IFpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiA9IF9fc3ltYm9sX18oQUREX0VWRU5UX0xJU1RFTkVSX1NUUik7XG5cdC8qKiB6b25lU3ltYm9sIHJlbW92ZUV2ZW50TGlzdGVuZXIgKi9cblx0Y29uc3QgWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gX19zeW1ib2xfXyhSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSKTtcblx0LyoqIHRydWUgc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IFRSVUVfU1RSID0gJ3RydWUnO1xuXHQvKiogZmFsc2Ugc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IEZBTFNFX1NUUiA9ICdmYWxzZSc7XG5cdC8qKiBab25lIHN5bWJvbCBwcmVmaXggc3RyaW5nIGNvbnN0LiAqL1xuXHRjb25zdCBaT05FX1NZTUJPTF9QUkVGSVggPSBfX3N5bWJvbF9fKCcnKTtcblx0ZnVuY3Rpb24gd3JhcFdpdGhDdXJyZW50Wm9uZShjYWxsYmFjaywgc291cmNlKSB7XG5cdCAgICByZXR1cm4gWm9uZS5jdXJyZW50LndyYXAoY2FsbGJhY2ssIHNvdXJjZSk7XG5cdH1cblx0ZnVuY3Rpb24gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuXHQgICAgcmV0dXJuIFpvbmUuY3VycmVudC5zY2hlZHVsZU1hY3JvVGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKTtcblx0fVxuXHRjb25zdCB6b25lU3ltYm9sID0gX19zeW1ib2xfXztcblx0Y29uc3QgaXNXaW5kb3dFeGlzdHMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcblx0Y29uc3QgaW50ZXJuYWxXaW5kb3cgPSBpc1dpbmRvd0V4aXN0cyA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcblx0Y29uc3QgX2dsb2JhbCA9IChpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvdykgfHwgZ2xvYmFsVGhpcztcblx0Y29uc3QgUkVNT1ZFX0FUVFJJQlVURSA9ICdyZW1vdmVBdHRyaWJ1dGUnO1xuXHRmdW5jdGlvbiBiaW5kQXJndW1lbnRzKGFyZ3MsIHNvdXJjZSkge1xuXHQgICAgZm9yIChsZXQgaSA9IGFyZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgYXJnc1tpXSA9IHdyYXBXaXRoQ3VycmVudFpvbmUoYXJnc1tpXSwgc291cmNlICsgJ18nICsgaSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGFyZ3M7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hQcm90b3R5cGUocHJvdG90eXBlLCBmbk5hbWVzKSB7XG5cdCAgICBjb25zdCBzb3VyY2UgPSBwcm90b3R5cGUuY29uc3RydWN0b3JbJ25hbWUnXTtcblx0ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm5OYW1lcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGNvbnN0IG5hbWUgPSBmbk5hbWVzW2ldO1xuXHQgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gcHJvdG90eXBlW25hbWVdO1xuXHQgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICBjb25zdCBwcm90b3R5cGVEZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbmFtZSk7XG5cdCAgICAgICAgICAgIGlmICghaXNQcm9wZXJ0eVdyaXRhYmxlKHByb3RvdHlwZURlc2MpKSB7XG5cdCAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBwcm90b3R5cGVbbmFtZV0gPSAoKGRlbGVnYXRlKSA9PiB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwYXRjaGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5hcHBseSh0aGlzLCBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgc291cmNlICsgJy4nICsgbmFtZSkpO1xuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBkZWxlZ2F0ZSk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hlZDtcblx0ICAgICAgICAgICAgfSkoZGVsZWdhdGUpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBpc1Byb3BlcnR5V3JpdGFibGUocHJvcGVydHlEZXNjKSB7XG5cdCAgICBpZiAoIXByb3BlcnR5RGVzYykge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHByb3BlcnR5RGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gISh0eXBlb2YgcHJvcGVydHlEZXNjLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvcGVydHlEZXNjLnNldCA9PT0gJ3VuZGVmaW5lZCcpO1xuXHR9XG5cdGNvbnN0IGlzV2ViV29ya2VyID0gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG5cdC8vIE1ha2Ugc3VyZSB0byBhY2Nlc3MgYHByb2Nlc3NgIHRocm91Z2ggYF9nbG9iYWxgIHNvIHRoYXQgV2ViUGFjayBkb2VzIG5vdCBhY2NpZGVudGFsbHkgYnJvd3NlcmlmeVxuXHQvLyB0aGlzIGNvZGUuXG5cdGNvbnN0IGlzTm9kZSA9ICEoJ253JyBpbiBfZ2xvYmFsKSAmJlxuXHQgICAgdHlwZW9mIF9nbG9iYWwucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcblx0ICAgIF9nbG9iYWwucHJvY2Vzcy50b1N0cmluZygpID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG5cdGNvbnN0IGlzQnJvd3NlciA9ICFpc05vZGUgJiYgIWlzV2ViV29ya2VyICYmICEhKGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93WydIVE1MRWxlbWVudCddKTtcblx0Ly8gd2UgYXJlIGluIGVsZWN0cm9uIG9mIG53LCBzbyB3ZSBhcmUgYm90aCBicm93c2VyIGFuZCBub2RlanNcblx0Ly8gTWFrZSBzdXJlIHRvIGFjY2VzcyBgcHJvY2Vzc2AgdGhyb3VnaCBgX2dsb2JhbGAgc28gdGhhdCBXZWJQYWNrIGRvZXMgbm90IGFjY2lkZW50YWxseSBicm93c2VyaWZ5XG5cdC8vIHRoaXMgY29kZS5cblx0Y29uc3QgaXNNaXggPSB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuXHQgICAgX2dsb2JhbC5wcm9jZXNzLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJyAmJlxuXHQgICAgIWlzV2ViV29ya2VyICYmXG5cdCAgICAhIShpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvd1snSFRNTEVsZW1lbnQnXSk7XG5cdGNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzJDEgPSB7fTtcblx0Y29uc3QgZW5hYmxlQmVmb3JldW5sb2FkU3ltYm9sID0gem9uZVN5bWJvbCgnZW5hYmxlX2JlZm9yZXVubG9hZCcpO1xuXHRjb25zdCB3cmFwRm4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzkxMSwgaW4gSUUsIHNvbWV0aW1lc1xuXHQgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuXHQgICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50O1xuXHQgICAgaWYgKCFldmVudCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGxldCBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdO1xuXHQgICAgaWYgKCFldmVudE5hbWVTeW1ib2wpIHtcblx0ICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnQudHlwZSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsO1xuXHQgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcblx0ICAgIGxldCByZXN1bHQ7XG5cdCAgICBpZiAoaXNCcm93c2VyICYmIHRhcmdldCA9PT0gaW50ZXJuYWxXaW5kb3cgJiYgZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xuXHQgICAgICAgIC8vIHdpbmRvdy5vbmVycm9yIGhhdmUgZGlmZmVyZW50IHNpZ25hdHVyZVxuXHQgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HbG9iYWxFdmVudEhhbmRsZXJzL29uZXJyb3Ijd2luZG93Lm9uZXJyb3Jcblx0ICAgICAgICAvLyBhbmQgb25lcnJvciBjYWxsYmFjayB3aWxsIHByZXZlbnQgZGVmYXVsdCB3aGVuIGNhbGxiYWNrIHJldHVybiB0cnVlXG5cdCAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50O1xuXHQgICAgICAgIHJlc3VsdCA9XG5cdCAgICAgICAgICAgIGxpc3RlbmVyICYmXG5cdCAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGVycm9yRXZlbnQubWVzc2FnZSwgZXJyb3JFdmVudC5maWxlbmFtZSwgZXJyb3JFdmVudC5saW5lbm8sIGVycm9yRXZlbnQuY29sbm8sIGVycm9yRXZlbnQuZXJyb3IpO1xuXHQgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcblx0ICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICByZXN1bHQgPSBsaXN0ZW5lciAmJiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIGlmIChcblx0ICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80NzU3OVxuXHQgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNTI1L2hpc3RvcnkuaHRtbCNiZWZvcmV1bmxvYWRldmVudFxuXHQgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3BlY2lmaWMgY2FzZSB3ZSBzaG91bGQgY2hlY2sgZm9yLiBUaGUgc3BlYyBkZWZpbmVzIHRoYXQgdGhlXG5cdCAgICAgICAgLy8gYHJldHVyblZhbHVlYCBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgbWVzc2FnZSB0byBzaG93IHRoZSB1c2VyLiBXaGVuIHRoZSBldmVudFxuXHQgICAgICAgIC8vIGlzIGNyZWF0ZWQsIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG5cdCAgICAgICAgZXZlbnQudHlwZSA9PT0gJ2JlZm9yZXVubG9hZCcgJiZcblx0ICAgICAgICAgICAgLy8gVG8gcHJldmVudCBhbnkgYnJlYWtpbmcgY2hhbmdlcyByZXN1bHRpbmcgZnJvbSB0aGlzIGNoYW5nZSwgZ2l2ZW4gdGhhdFxuXHQgICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGZhaWx1cmVzIGluIEczLCB3ZSBoYXZlIGhpZGRlblxuXHQgICAgICAgICAgICAvLyB0aGF0IGJlaGF2aW9yIGJlaGluZCBhIGdsb2JhbCBjb25maWd1cmF0aW9uIGZsYWcuIENvbnN1bWVycyBjYW4gZW5hYmxlIHRoaXNcblx0ICAgICAgICAgICAgLy8gZmxhZyBleHBsaWNpdGx5IGlmIHRoZXkgd2FudCB0aGUgYGJlZm9yZXVubG9hZGAgZXZlbnQgdG8gYmUgaGFuZGxlZCBhcyBkZWZpbmVkXG5cdCAgICAgICAgICAgIC8vIGluIHRoZSBzcGVjaWZpY2F0aW9uLlxuXHQgICAgICAgICAgICBfZ2xvYmFsW2VuYWJsZUJlZm9yZXVubG9hZFN5bWJvbF0gJiZcblx0ICAgICAgICAgICAgLy8gVGhlIElETCBldmVudCBkZWZpbml0aW9uIGlzIGBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJldHVyblZhbHVlYCwgc28gd2UgY2hlY2sgd2hldGhlclxuXHQgICAgICAgICAgICAvLyBgdHlwZW9mIHJlc3VsdGAgaXMgYSBzdHJpbmcuXG5cdCAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gcmVzdWx0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkICYmICFyZXN1bHQpIHtcblx0ICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXHRmdW5jdGlvbiBwYXRjaFByb3BlcnR5KG9iaiwgcHJvcCwgcHJvdG90eXBlKSB7XG5cdCAgICBsZXQgZGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuXHQgICAgaWYgKCFkZXNjICYmIHByb3RvdHlwZSkge1xuXHQgICAgICAgIC8vIHdoZW4gcGF0Y2ggd2luZG93IG9iamVjdCwgdXNlIHByb3RvdHlwZSB0byBjaGVjayBwcm9wIGV4aXN0IG9yIG5vdFxuXHQgICAgICAgIGNvbnN0IHByb3RvdHlwZURlc2MgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBwcm9wKTtcblx0ICAgICAgICBpZiAocHJvdG90eXBlRGVzYykge1xuXHQgICAgICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLyBpZiB0aGUgZGVzY3JpcHRvciBub3QgZXhpc3RzIG9yIGlzIG5vdCBjb25maWd1cmFibGVcblx0ICAgIC8vIGp1c3QgcmV0dXJuXG5cdCAgICBpZiAoIWRlc2MgfHwgIWRlc2MuY29uZmlndXJhYmxlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgb25Qcm9wUGF0Y2hlZFN5bWJvbCA9IHpvbmVTeW1ib2woJ29uJyArIHByb3AgKyAncGF0Y2hlZCcpO1xuXHQgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShvblByb3BQYXRjaGVkU3ltYm9sKSAmJiBvYmpbb25Qcm9wUGF0Y2hlZFN5bWJvbF0pIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICAvLyBBIHByb3BlcnR5IGRlc2NyaXB0b3IgY2Fubm90IGhhdmUgZ2V0dGVyL3NldHRlciBhbmQgYmUgd3JpdGFibGVcblx0ICAgIC8vIGRlbGV0aW5nIHRoZSB3cml0YWJsZSBhbmQgdmFsdWUgcHJvcGVydGllcyBhdm9pZHMgdGhpcyBlcnJvcjpcblx0ICAgIC8vXG5cdCAgICAvLyBUeXBlRXJyb3I6IHByb3BlcnR5IGRlc2NyaXB0b3JzIG11c3Qgbm90IHNwZWNpZnkgYSB2YWx1ZSBvciBiZSB3cml0YWJsZSB3aGVuIGFcblx0ICAgIC8vIGdldHRlciBvciBzZXR0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkXG5cdCAgICBkZWxldGUgZGVzYy53cml0YWJsZTtcblx0ICAgIGRlbGV0ZSBkZXNjLnZhbHVlO1xuXHQgICAgY29uc3Qgb3JpZ2luYWxEZXNjR2V0ID0gZGVzYy5nZXQ7XG5cdCAgICBjb25zdCBvcmlnaW5hbERlc2NTZXQgPSBkZXNjLnNldDtcblx0ICAgIC8vIHNsaWNlKDIpIGN1eiAnb25jbGljaycgLT4gJ2NsaWNrJywgZXRjXG5cdCAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wLnNsaWNlKDIpO1xuXHQgICAgbGV0IGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTtcblx0ICAgIGlmICghZXZlbnROYW1lU3ltYm9sKSB7XG5cdCAgICAgICAgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnROYW1lKTtcblx0ICAgIH1cblx0ICAgIGRlc2Muc2V0ID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG5cdCAgICAgICAgLy8gSW4gc29tZSB2ZXJzaW9ucyBvZiBXaW5kb3dzLCB0aGUgYHRoaXNgIGNvbnRleHQgbWF5IGJlIHVuZGVmaW5lZFxuXHQgICAgICAgIC8vIGluIG9uLXByb3BlcnR5IGNhbGxiYWNrcy5cblx0ICAgICAgICAvLyBUbyBoYW5kbGUgdGhpcyBlZGdlIGNhc2UsIHdlIGNoZWNrIGlmIGB0aGlzYCBpcyBmYWxzeSBhbmRcblx0ICAgICAgICAvLyBmYWxsYmFjayB0byBgX2dsb2JhbGAgaWYgbmVlZGVkLlxuXHQgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzO1xuXHQgICAgICAgIGlmICghdGFyZ2V0ICYmIG9iaiA9PT0gX2dsb2JhbCkge1xuXHQgICAgICAgICAgICB0YXJnZXQgPSBfZ2xvYmFsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRhcmdldCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcblx0ICAgICAgICBpZiAodHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85Nzhcblx0ICAgICAgICAvLyBJZiBhbiBpbmxpbmUgaGFuZGxlciAobGlrZSBgb25sb2FkYCkgd2FzIGRlZmluZWQgYmVmb3JlIHpvbmUuanMgd2FzIGxvYWRlZCxcblx0ICAgICAgICAvLyBjYWxsIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yJ3Mgc2V0dGVyIHRvIGNsZWFuIGl0IHVwLlxuXHQgICAgICAgIG9yaWdpbmFsRGVzY1NldD8uY2FsbCh0YXJnZXQsIG51bGwpO1xuXHQgICAgICAgIHRhcmdldFtldmVudE5hbWVTeW1ib2xdID0gbmV3VmFsdWU7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHdyYXBGbiwgZmFsc2UpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBUaGUgZ2V0dGVyIHdvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIHVuYXNzaWduZWQgcHJvcGVydGllcyBidXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW5cblx0ICAgIC8vIHVuYXNzaWduZWQgcHJvcGVydHkgaXMgbnVsbFxuXHQgICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gaW4gc29tZSBvZiB3aW5kb3dzJ3Mgb25wcm9wZXJ0eSBjYWxsYmFjaywgdGhpcyBpcyB1bmRlZmluZWRcblx0ICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0XG5cdCAgICAgICAgbGV0IHRhcmdldCA9IHRoaXM7XG5cdCAgICAgICAgaWYgKCF0YXJnZXQgJiYgb2JqID09PSBfZ2xvYmFsKSB7XG5cdCAgICAgICAgICAgIHRhcmdldCA9IF9nbG9iYWw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGFyZ2V0KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRhcmdldFtldmVudE5hbWVTeW1ib2xdO1xuXHQgICAgICAgIGlmIChsaXN0ZW5lcikge1xuXHQgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKG9yaWdpbmFsRGVzY0dldCkge1xuXHQgICAgICAgICAgICAvLyByZXN1bHQgd2lsbCBiZSBudWxsIHdoZW4gdXNlIGlubGluZSBldmVudCBhdHRyaWJ1dGUsXG5cdCAgICAgICAgICAgIC8vIHN1Y2ggYXMgPGJ1dHRvbiBvbmNsaWNrPVwiZnVuYygpO1wiPk9LPC9idXR0b24+XG5cdCAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIG9uY2xpY2sgZnVuY3Rpb24gaXMgaW50ZXJuYWwgcmF3IHVuY29tcGlsZWQgaGFuZGxlclxuXHQgICAgICAgICAgICAvLyB0aGUgb25jbGljayB3aWxsIGJlIGV2YWx1YXRlZCB3aGVuIGZpcnN0IHRpbWUgZXZlbnQgd2FzIHRyaWdnZXJlZCBvclxuXHQgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgYWNjZXNzZWQsIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzUyNVxuXHQgICAgICAgICAgICAvLyBzbyB3ZSBzaG91bGQgdXNlIG9yaWdpbmFsIG5hdGl2ZSBnZXQgdG8gcmV0cmlldmUgdGhlIGhhbmRsZXJcblx0ICAgICAgICAgICAgbGV0IHZhbHVlID0gb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgZGVzYy5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9O1xuXHQgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjKTtcblx0ICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hPblByb3BlcnRpZXMob2JqLCBwcm9wZXJ0aWVzLCBwcm90b3R5cGUpIHtcblx0ICAgIGlmIChwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHBhdGNoUHJvcGVydHkob2JqLCAnb24nICsgcHJvcGVydGllc1tpXSwgcHJvdG90eXBlKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICBjb25zdCBvblByb3BlcnRpZXMgPSBbXTtcblx0ICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG5cdCAgICAgICAgICAgIGlmIChwcm9wLnNsaWNlKDAsIDIpID09ICdvbicpIHtcblx0ICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgICAgICAgIHBhdGNoUHJvcGVydHkob2JqLCBvblByb3BlcnRpZXNbal0sIHByb3RvdHlwZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cdGNvbnN0IG9yaWdpbmFsSW5zdGFuY2VLZXkgPSB6b25lU3ltYm9sKCdvcmlnaW5hbEluc3RhbmNlJyk7XG5cdC8vIHdyYXAgc29tZSBuYXRpdmUgQVBJIG9uIGB3aW5kb3dgXG5cdGZ1bmN0aW9uIHBhdGNoQ2xhc3MoY2xhc3NOYW1lKSB7XG5cdCAgICBjb25zdCBPcmlnaW5hbENsYXNzID0gX2dsb2JhbFtjbGFzc05hbWVdO1xuXHQgICAgaWYgKCFPcmlnaW5hbENsYXNzKVxuXHQgICAgICAgIHJldHVybjtcblx0ICAgIC8vIGtlZXAgb3JpZ2luYWwgY2xhc3MgaW4gZ2xvYmFsXG5cdCAgICBfZ2xvYmFsW3pvbmVTeW1ib2woY2xhc3NOYW1lKV0gPSBPcmlnaW5hbENsYXNzO1xuXHQgICAgX2dsb2JhbFtjbGFzc05hbWVdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGNvbnN0IGEgPSBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgY2xhc3NOYW1lKTtcblx0ICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMDpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcygpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMTpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDI6XG5cdCAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAzOlxuXHQgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0sIGFbMl0pO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNDpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmcgbGlzdCB0b28gbG9uZy4nKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gYXR0YWNoIG9yaWdpbmFsIGRlbGVnYXRlIHRvIHBhdGNoZWQgZnVuY3Rpb25cblx0ICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpO1xuXHQgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgT3JpZ2luYWxDbGFzcyhmdW5jdGlvbiAoKSB7IH0pO1xuXHQgICAgbGV0IHByb3A7XG5cdCAgICBmb3IgKHByb3AgaW4gaW5zdGFuY2UpIHtcblx0ICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQ3MjFcblx0ICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnWE1MSHR0cFJlcXVlc3QnICYmIHByb3AgPT09ICdyZXNwb25zZUJsb2InKVxuXHQgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAoZnVuY3Rpb24gKHByb3ApIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXS5hcHBseSh0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGUsIHByb3AsIHtcblx0ICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChmbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdID0gd3JhcFdpdGhDdXJyZW50Wm9uZShmbiwgY2xhc3NOYW1lICsgJy4nICsgcHJvcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGNhbGxiYWNrIGluIHdyYXBwZWQgZnVuY3Rpb24gc28gd2UgY2FuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgaXQgaW4gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nIHRvIHJldHVyblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBvbmUuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSwgZm4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSA9IGZuO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF07XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSkocHJvcCk7XG5cdCAgICB9XG5cdCAgICBmb3IgKHByb3AgaW4gT3JpZ2luYWxDbGFzcykge1xuXHQgICAgICAgIGlmIChwcm9wICE9PSAncHJvdG90eXBlJyAmJiBPcmlnaW5hbENsYXNzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG5cdCAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXVtwcm9wXSA9IE9yaWdpbmFsQ2xhc3NbcHJvcF07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cdGZ1bmN0aW9uIHBhdGNoTWV0aG9kKHRhcmdldCwgbmFtZSwgcGF0Y2hGbikge1xuXHQgICAgbGV0IHByb3RvID0gdGFyZ2V0O1xuXHQgICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuXHQgICAgICAgIHByb3RvID0gT2JqZWN0R2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHQgICAgfVxuXHQgICAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHtcblx0ICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG5cdCAgICAgICAgcHJvdG8gPSB0YXJnZXQ7XG5cdCAgICB9XG5cdCAgICBjb25zdCBkZWxlZ2F0ZU5hbWUgPSB6b25lU3ltYm9sKG5hbWUpO1xuXHQgICAgbGV0IGRlbGVnYXRlID0gbnVsbDtcblx0ICAgIGlmIChwcm90byAmJiAoIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eShkZWxlZ2F0ZU5hbWUpKSkge1xuXHQgICAgICAgIGRlbGVnYXRlID0gcHJvdG9bZGVsZWdhdGVOYW1lXSA9IHByb3RvW25hbWVdO1xuXHQgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcHJvdG9bbmFtZV0gaXMgd3JpdGFibGVcblx0ICAgICAgICAvLyBzb21lIHByb3BlcnR5IGlzIHJlYWRvbmx5IGluIHNhZmFyaSwgc3VjaCBhcyBIdG1sQ2FudmFzRWxlbWVudC5wcm90b3R5cGUudG9CbG9iXG5cdCAgICAgICAgY29uc3QgZGVzYyA9IHByb3RvICYmIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbmFtZSk7XG5cdCAgICAgICAgaWYgKGlzUHJvcGVydHlXcml0YWJsZShkZXNjKSkge1xuXHQgICAgICAgICAgICBjb25zdCBwYXRjaERlbGVnYXRlID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTtcblx0ICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hEZWxlZ2F0ZSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bbmFtZV0sIGRlbGVnYXRlKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZGVsZWdhdGU7XG5cdH1cblx0Ly8gVE9ETzogQEppYUxpUGFzc2lvbiwgc3VwcG9ydCBjYW5jZWwgdGFzayBsYXRlciBpZiBuZWNlc3Nhcnlcblx0ZnVuY3Rpb24gcGF0Y2hNYWNyb1Rhc2sob2JqLCBmdW5jTmFtZSwgbWV0YUNyZWF0b3IpIHtcblx0ICAgIGxldCBzZXROYXRpdmUgPSBudWxsO1xuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcblx0ICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuXHQgICAgICAgIGRhdGEuYXJnc1tkYXRhLmNiSWR4XSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHNldE5hdGl2ZS5hcHBseShkYXRhLnRhcmdldCwgZGF0YS5hcmdzKTtcblx0ICAgICAgICByZXR1cm4gdGFzaztcblx0ICAgIH1cblx0ICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKG9iaiwgZnVuY05hbWUsIChkZWxlZ2F0ZSkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcblx0ICAgICAgICBjb25zdCBtZXRhID0gbWV0YUNyZWF0b3Ioc2VsZiwgYXJncyk7XG5cdCAgICAgICAgaWYgKG1ldGEuY2JJZHggPj0gMCAmJiB0eXBlb2YgYXJnc1ttZXRhLmNiSWR4XSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUobWV0YS5uYW1lLCBhcmdzW21ldGEuY2JJZHhdLCBtZXRhLCBzY2hlZHVsZVRhc2spO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9XG5cdGZ1bmN0aW9uIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBvcmlnaW5hbCkge1xuXHQgICAgcGF0Y2hlZFt6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyldID0gb3JpZ2luYWw7XG5cdH1cblx0bGV0IGlzRGV0ZWN0ZWRJRU9yRWRnZSA9IGZhbHNlO1xuXHRsZXQgaWVPckVkZ2UgPSBmYWxzZTtcblx0ZnVuY3Rpb24gaXNJRU9yRWRnZSgpIHtcblx0ICAgIGlmIChpc0RldGVjdGVkSUVPckVkZ2UpIHtcblx0ICAgICAgICByZXR1cm4gaWVPckVkZ2U7XG5cdCAgICB9XG5cdCAgICBpc0RldGVjdGVkSUVPckVkZ2UgPSB0cnVlO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICBjb25zdCB1YSA9IGludGVybmFsV2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cdCAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0VkZ2UvJykgIT09IC0xKSB7XG5cdCAgICAgICAgICAgIGllT3JFZGdlID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjYXRjaCAoZXJyb3IpIHsgfVxuXHQgICAgcmV0dXJuIGllT3JFZGdlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG5cdH1cblx0ZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdC8vIGFuIGlkZW50aWZpZXIgdG8gdGVsbCBab25lVGFzayBkbyBub3QgY3JlYXRlIGEgbmV3IGludm9rZSBjbG9zdXJlXG5cdGNvbnN0IE9QVElNSVpFRF9aT05FX0VWRU5UX1RBU0tfREFUQSA9IHtcblx0ICAgIHVzZUc6IHRydWUsXG5cdH07XG5cdGNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzID0ge307XG5cdGNvbnN0IGdsb2JhbFNvdXJjZXMgPSB7fTtcblx0Y29uc3QgRVZFTlRfTkFNRV9TWU1CT0xfUkVHWCA9IG5ldyBSZWdFeHAoJ14nICsgWk9ORV9TWU1CT0xfUFJFRklYICsgJyhcXFxcdyspKHRydWV8ZmFsc2UpJCcpO1xuXHRjb25zdCBJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MID0gem9uZVN5bWJvbCgncHJvcGFnYXRpb25TdG9wcGVkJyk7XG5cdGZ1bmN0aW9uIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSwgZXZlbnROYW1lVG9TdHJpbmcpIHtcblx0ICAgIGNvbnN0IGZhbHNlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBGQUxTRV9TVFI7XG5cdCAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBUUlVFX1NUUjtcblx0ICAgIGNvbnN0IHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lO1xuXHQgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hFdmVudFRhcmdldChfZ2xvYmFsLCBhcGksIGFwaXMsIHBhdGNoT3B0aW9ucykge1xuXHQgICAgY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuYWRkKSB8fCBBRERfRVZFTlRfTElTVEVORVJfU1RSO1xuXHQgICAgY29uc3QgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm0pIHx8IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI7XG5cdCAgICBjb25zdCBMSVNURU5FUlNfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5saXN0ZW5lcnMpIHx8ICdldmVudExpc3RlbmVycyc7XG5cdCAgICBjb25zdCBSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUiA9IChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJtQWxsKSB8fCAncmVtb3ZlQWxsTGlzdGVuZXJzJztcblx0ICAgIGNvbnN0IHpvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyID0gem9uZVN5bWJvbChBRERfRVZFTlRfTElTVEVORVIpO1xuXHQgICAgY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIEFERF9FVkVOVF9MSVNURU5FUiArICc6Jztcblx0ICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVIgPSAncHJlcGVuZExpc3RlbmVyJztcblx0ICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFID0gJy4nICsgUFJFUEVORF9FVkVOVF9MSVNURU5FUiArICc6Jztcblx0ICAgIGNvbnN0IGludm9rZVRhc2sgPSBmdW5jdGlvbiAodGFzaywgdGFyZ2V0LCBldmVudCkge1xuXHQgICAgICAgIC8vIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIGNoZWNrIGlzUmVtb3ZlZCB3aGljaCBpcyBzZXRcblx0ICAgICAgICAvLyBieSByZW1vdmVFdmVudExpc3RlbmVyXG5cdCAgICAgICAgaWYgKHRhc2suaXNSZW1vdmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3QgZGVsZWdhdGUgPSB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgIGlmICh0eXBlb2YgZGVsZWdhdGUgPT09ICdvYmplY3QnICYmIGRlbGVnYXRlLmhhbmRsZUV2ZW50KSB7XG5cdCAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmluZCB2ZXJzaW9uIG9mIGhhbmRsZUV2ZW50IHdoZW4gaW52b2tlXG5cdCAgICAgICAgICAgIHRhc2suY2FsbGJhY2sgPSAoZXZlbnQpID0+IGRlbGVnYXRlLmhhbmRsZUV2ZW50KGV2ZW50KTtcblx0ICAgICAgICAgICAgdGFzay5vcmlnaW5hbERlbGVnYXRlID0gZGVsZWdhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIGludm9rZSBzdGF0aWMgdGFzay5pbnZva2Vcblx0ICAgICAgICAvLyBuZWVkIHRvIHRyeS9jYXRjaCBlcnJvciBoZXJlLCBvdGhlcndpc2UsIHRoZSBlcnJvciBpbiBvbmUgZXZlbnQgbGlzdGVuZXJcblx0ICAgICAgICAvLyB3aWxsIGJyZWFrIHRoZSBleGVjdXRpb25zIG9mIHRoZSBvdGhlciBldmVudCBsaXN0ZW5lcnMuIEFsc28gZXJyb3Igd2lsbFxuXHQgICAgICAgIC8vIG5vdCByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gYG9uY2VgIG9wdGlvbnMgaXMgdHJ1ZS5cblx0ICAgICAgICBsZXQgZXJyb3I7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgdGFzay5pbnZva2UodGFzaywgdGFyZ2V0LCBbZXZlbnRdKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBlcnJvciA9IGVycjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRhc2sub3B0aW9ucztcblx0ICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5vbmNlKSB7XG5cdCAgICAgICAgICAgIC8vIGlmIG9wdGlvbnMub25jZSBpcyB0cnVlLCBhZnRlciBpbnZva2Ugb25jZSByZW1vdmUgbGlzdGVuZXIgaGVyZVxuXHQgICAgICAgICAgICAvLyBvbmx5IGJyb3dzZXIgbmVlZCB0byBkbyB0aGlzLCBub2RlanMgZXZlbnRFbWl0dGVyIHdpbGwgY2FsIHJlbW92ZUxpc3RlbmVyXG5cdCAgICAgICAgICAgIC8vIGluc2lkZSBFdmVudEVtaXR0ZXIub25jZVxuXHQgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7XG5cdCAgICAgICAgICAgIHRhcmdldFtSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGFyZ2V0LCBldmVudC50eXBlLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBlcnJvcjtcblx0ICAgIH07XG5cdCAgICBmdW5jdGlvbiBnbG9iYWxDYWxsYmFjayhjb250ZXh0LCBldmVudCwgaXNDYXB0dXJlKSB7XG5cdCAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTExLCBpbiBJRSwgc29tZXRpbWVzXG5cdCAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuXHQgICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgX2dsb2JhbC5ldmVudDtcblx0ICAgICAgICBpZiAoIWV2ZW50KSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gZXZlbnQudGFyZ2V0IGlzIG5lZWRlZCBmb3IgU2Ftc3VuZyBUViBhbmQgU291cmNlQnVmZmVyXG5cdCAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTBcblx0ICAgICAgICBjb25zdCB0YXJnZXQgPSBjb250ZXh0IHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IHRhc2tzID0gdGFyZ2V0W3pvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50LnR5cGVdW2lzQ2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXV07XG5cdCAgICAgICAgaWYgKHRhc2tzKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXHQgICAgICAgICAgICAvLyBpbnZva2UgYWxsIHRhc2tzIHdoaWNoIGF0dGFjaGVkIHRvIGN1cnJlbnQgdGFyZ2V0IHdpdGggZ2l2ZW4gZXZlbnQudHlwZSBhbmQgY2FwdHVyZSA9IGZhbHNlXG5cdCAgICAgICAgICAgIC8vIGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCBpZiB0YXNrLmxlbmd0aCA9PT0gMSwganVzdCBpbnZva2Vcblx0ICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gaW52b2tlVGFzayh0YXNrc1swXSwgdGFyZ2V0LCBldmVudCk7XG5cdCAgICAgICAgICAgICAgICBlcnIgJiYgZXJyb3JzLnB1c2goZXJyKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzgzNlxuXHQgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdGFza3MgYXJyYXkgYmVmb3JlIGludm9rZSwgdG8gYXZvaWRcblx0ICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayB3aWxsIHJlbW92ZSBpdHNlbGYgb3Igb3RoZXIgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlUYXNrcyA9IHRhc2tzLnNsaWNlKCk7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvcHlUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudFtJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MXSA9PT0gdHJ1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gaW52b2tlVGFzayhjb3B5VGFza3NbaV0sIHRhcmdldCwgZXZlbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVyciAmJiBlcnJvcnMucHVzaChlcnIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGVycm9yLCB3ZSBkb24ndCBuZWVkIHRvIHNjaGVkdWxlIG1pY3JvVGFza1xuXHQgICAgICAgICAgICAvLyB0byB0aHJvdyB0aGUgZXJyb3IuXG5cdCAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yc1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICBhcGkubmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2soKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gZmFsc2Vcblx0ICAgIGNvbnN0IGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgcmV0dXJuIGdsb2JhbENhbGxiYWNrKHRoaXMsIGV2ZW50LCBmYWxzZSk7XG5cdCAgICB9O1xuXHQgICAgLy8gZ2xvYmFsIHNoYXJlZCB6b25lQXdhcmVDYWxsYmFjayB0byBoYW5kbGUgYWxsIGV2ZW50IGNhbGxiYWNrIHdpdGggY2FwdHVyZSA9IHRydWVcblx0ICAgIGNvbnN0IGdsb2JhbFpvbmVBd2FyZUNhcHR1cmVDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgIHJldHVybiBnbG9iYWxDYWxsYmFjayh0aGlzLCBldmVudCwgdHJ1ZSk7XG5cdCAgICB9O1xuXHQgICAgZnVuY3Rpb24gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMob2JqLCBwYXRjaE9wdGlvbnMpIHtcblx0ICAgICAgICBpZiAoIW9iaikge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGxldCB1c2VHbG9iYWxDYWxsYmFjayA9IHRydWU7XG5cdCAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudXNlRyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHVzZUdsb2JhbENhbGxiYWNrID0gcGF0Y2hPcHRpb25zLnVzZUc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHZhbGlkYXRlSGFuZGxlciA9IHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudmg7XG5cdCAgICAgICAgbGV0IGNoZWNrRHVwbGljYXRlID0gdHJ1ZTtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5jaGtEdXAgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZSA9IHBhdGNoT3B0aW9ucy5jaGtEdXA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGxldCByZXR1cm5UYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ydCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRhcmdldCA9IHBhdGNoT3B0aW9ucy5ydDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgbGV0IHByb3RvID0gb2JqO1xuXHQgICAgICAgIHdoaWxlIChwcm90byAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkoQUREX0VWRU5UX0xJU1RFTkVSKSkge1xuXHQgICAgICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFwcm90byAmJiBvYmpbQUREX0VWRU5UX0xJU1RFTkVSXSkge1xuXHQgICAgICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG5cdCAgICAgICAgICAgIHByb3RvID0gb2JqO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXByb3RvKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHByb3RvW3pvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyXSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IGV2ZW50TmFtZVRvU3RyaW5nID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ldmVudE5hbWVUb1N0cmluZztcblx0ICAgICAgICAvLyBXZSB1c2UgYSBzaGFyZWQgZ2xvYmFsIGB0YXNrRGF0YWAgdG8gcGFzcyBkYXRhIGZvciBgc2NoZWR1bGVFdmVudFRhc2tgLFxuXHQgICAgICAgIC8vIGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc29sZWx5IGZvciBwYXNzaW5nIGRhdGEuXG5cdCAgICAgICAgLy8gV0FSTklORzogVGhpcyBvYmplY3QgaGFzIGEgc3RhdGljIGxpZmV0aW1lLCBtZWFuaW5nIGl0IGlzIG5vdCBjcmVhdGVkXG5cdCAgICAgICAgLy8gZWFjaCB0aW1lIGBhZGRFdmVudExpc3RlbmVyYCBpcyBjYWxsZWQuIEl0IGlzIGluc3RhbnRpYXRlZCBvbmx5IG9uY2Vcblx0ICAgICAgICAvLyBhbmQgY2FwdHVyZWQgYnkgcmVmZXJlbmNlIGluc2lkZSB0aGUgYGFkZEV2ZW50TGlzdGVuZXJgIGFuZFxuXHQgICAgICAgIC8vIGByZW1vdmVFdmVudExpc3RlbmVyYCBmdW5jdGlvbnMuIERvIG5vdCBhZGQgYW55IG5ldyBwcm9wZXJ0aWVzIHRvIHRoaXNcblx0ICAgICAgICAvLyBvYmplY3QsIGFzIGRvaW5nIHNvIHdvdWxkIG5lY2Vzc2l0YXRlIG1haW50YWluaW5nIHRoZSBpbmZvcm1hdGlvblxuXHQgICAgICAgIC8vIGJldHdlZW4gYGFkZEV2ZW50TGlzdGVuZXJgIGNhbGxzLlxuXHQgICAgICAgIGNvbnN0IHRhc2tEYXRhID0ge307XG5cdCAgICAgICAgY29uc3QgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lciA9IChwcm90b1t6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lcl0gPSBwcm90b1tBRERfRVZFTlRfTElTVEVORVJdKTtcblx0ICAgICAgICBjb25zdCBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyID0gKHByb3RvW3pvbmVTeW1ib2woUkVNT1ZFX0VWRU5UX0xJU1RFTkVSKV0gPVxuXHQgICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdKTtcblx0ICAgICAgICBjb25zdCBuYXRpdmVMaXN0ZW5lcnMgPSAocHJvdG9bem9uZVN5bWJvbChMSVNURU5FUlNfRVZFTlRfTElTVEVORVIpXSA9XG5cdCAgICAgICAgICAgIHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0pO1xuXHQgICAgICAgIGNvbnN0IG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyA9IChwcm90b1t6b25lU3ltYm9sKFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSKV0gPVxuXHQgICAgICAgICAgICBwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0pO1xuXHQgICAgICAgIGxldCBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcjtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5wcmVwZW5kKSB7XG5cdCAgICAgICAgICAgIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbChwYXRjaE9wdGlvbnMucHJlcGVuZCldID1cblx0ICAgICAgICAgICAgICAgIHByb3RvW3BhdGNoT3B0aW9ucy5wcmVwZW5kXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVGhpcyB1dGlsIGZ1bmN0aW9uIHdpbGwgYnVpbGQgYW4gb3B0aW9uIG9iamVjdCB3aXRoIHBhc3NpdmUgb3B0aW9uXG5cdCAgICAgICAgICogdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBpbnB1dCBmcm9tIHRoZSB1c2VyLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZ1bmN0aW9uIGJ1aWxkRXZlbnRMaXN0ZW5lck9wdGlvbnMob3B0aW9ucywgcGFzc2l2ZSkge1xuXHQgICAgICAgICAgICBpZiAoIXBhc3NpdmUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyBjYXB0dXJlOiBvcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLnBhc3NpdmUgIT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5vcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHRhc2sgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlLFxuXHQgICAgICAgICAgICAvLyBqdXN0IHJldHVybiwgYmVjYXVzZSB3ZSB1c2UgdGhlIHNoYXJlZCBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBoZXJlLlxuXHQgICAgICAgICAgICBpZiAodGFza0RhdGEuaXNFeGlzdGluZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVBZGRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2tEYXRhLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFza0RhdGEub3B0aW9ucyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbiB0aGUgY29udGV4dCBvZiBldmVudHMgYW5kIGxpc3RlbmVycywgdGhpcyBmdW5jdGlvbiB3aWxsIGJlXG5cdCAgICAgICAgICogY2FsbGVkIGF0IHRoZSBlbmQgYnkgYGNhbmNlbFRhc2tgLCB3aGljaCwgaW4gdHVybiwgY2FsbHMgYHRhc2suY2FuY2VsRm5gLlxuXHQgICAgICAgICAqIENhbmNlbGxpbmcgYSB0YXNrIGlzIHByaW1hcmlseSB1c2VkIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbVxuXHQgICAgICAgICAqIHRoZSB0YXNrIHRhcmdldC5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25zdCBjdXN0b21DYW5jZWxHbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuXHQgICAgICAgICAgICAvLyBpZiB0YXNrIGlzIG5vdCBtYXJrZWQgYXMgaXNSZW1vdmVkLCB0aGlzIGNhbGwgaXMgZGlyZWN0bHlcblx0ICAgICAgICAgICAgLy8gZnJvbSBab25lLnByb3RvdHlwZS5jYW5jZWxUYXNrLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB0YXNrXG5cdCAgICAgICAgICAgIC8vIGZyb20gdGFza3NMaXN0IG9mIHRhcmdldCBmaXJzdFxuXHQgICAgICAgICAgICBpZiAoIXRhc2suaXNSZW1vdmVkKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbdGFzay5ldmVudE5hbWVdO1xuXHQgICAgICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1t0YXNrLmNhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhc2sudGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrID09PSB0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpc1JlbW92ZWQgdG8gZGF0YSBmb3IgZmFzdGVyIGludm9rZVRhc2sgY2hlY2tcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaXNSZW1vdmVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmFsbFJlbW92ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sudGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gaWYgYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG5cdCAgICAgICAgICAgIC8vIHdlIHdpbGwgcmVhbGx5IHJlbW92ZSB0aGUgZ2xvYmFsIGV2ZW50IGNhbGxiYWNrLFxuXHQgICAgICAgICAgICAvLyBpZiBub3QsIHJldHVyblxuXHQgICAgICAgICAgICBpZiAoIXRhc2suYWxsUmVtb3ZlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgY3VzdG9tU2NoZWR1bGVQcmVwZW5kID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrRGF0YS5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbE5vbkdsb2JhbCA9IGZ1bmN0aW9uICh0YXNrKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlID0gdXNlR2xvYmFsQ2FsbGJhY2sgPyBjdXN0b21TY2hlZHVsZUdsb2JhbCA6IGN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbCA9IHVzZUdsb2JhbENhbGxiYWNrID8gY3VzdG9tQ2FuY2VsR2xvYmFsIDogY3VzdG9tQ2FuY2VsTm9uR2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IGNvbXBhcmVUYXNrQ2FsbGJhY2tWc0RlbGVnYXRlID0gZnVuY3Rpb24gKHRhc2ssIGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHR5cGVPZkRlbGVnYXRlID0gdHlwZW9mIGRlbGVnYXRlO1xuXHQgICAgICAgICAgICByZXR1cm4gKCh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXNrLmNhbGxiYWNrID09PSBkZWxlZ2F0ZSkgfHxcblx0ICAgICAgICAgICAgICAgICh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgdGFzay5vcmlnaW5hbERlbGVnYXRlID09PSBkZWxlZ2F0ZSkpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgY29tcGFyZSA9IHBhdGNoT3B0aW9ucz8uZGlmZiB8fCBjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZTtcblx0ICAgICAgICBjb25zdCB1bnBhdGNoZWRFdmVudHMgPSBab25lW3pvbmVTeW1ib2woJ1VOUEFUQ0hFRF9FVkVOVFMnKV07XG5cdCAgICAgICAgY29uc3QgcGFzc2l2ZUV2ZW50cyA9IF9nbG9iYWxbem9uZVN5bWJvbCgnUEFTU0lWRV9FVkVOVFMnKV07XG5cdCAgICAgICAgZnVuY3Rpb24gY29weUV2ZW50TGlzdGVuZXJPcHRpb25zKG9wdGlvbnMpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlc3RydWN0dXJlIHRoZSB0YXJnZXQgYG9wdGlvbnNgIG9iamVjdCBzaW5jZSBpdCBtYXlcblx0ICAgICAgICAgICAgICAgIC8vIGJlIGZyb3plbiBvciBzZWFsZWQgKHBvc3NpYmx5IHByb3ZpZGVkIGltcGxpY2l0bHkgYnkgYSB0aGlyZC1wYXJ0eVxuXHQgICAgICAgICAgICAgICAgLy8gbGlicmFyeSksIG9yIGl0cyBwcm9wZXJ0aWVzIG1heSBiZSByZWFkb25seS5cblx0ICAgICAgICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcblx0ICAgICAgICAgICAgICAgIC8vIFRoZSBgc2lnbmFsYCBvcHRpb24gd2FzIHJlY2VudGx5IGludHJvZHVjZWQsIHdoaWNoIGNhdXNlZCByZWdyZXNzaW9ucyBpblxuXHQgICAgICAgICAgICAgICAgLy8gdGhpcmQtcGFydHkgc2NlbmFyaW9zIHdoZXJlIGBBYm9ydENvbnRyb2xsZXJgIHdhcyBkaXJlY3RseSBwcm92aWRlZCB0b1xuXHQgICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgIGFzIG9wdGlvbnMuIEZvciBpbnN0YW5jZSwgaW4gY2FzZXMgbGlrZVxuXHQgICAgICAgICAgICAgICAgLy8gYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjYWxsYmFjaywgYWJvcnRDb250cm9sbGVySW5zdGFuY2UpYCxcblx0ICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIHZhbGlkIGJlY2F1c2UgYEFib3J0Q29udHJvbGxlcmAgaW5jbHVkZXMgYSBgc2lnbmFsYCBnZXR0ZXIsIHNwcmVhZGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gYHsuLi5vcHRpb25zfWAgd291bGRuJ3QgY29weSB0aGUgYHNpZ25hbGAuIEFkZGl0aW9uYWxseSwgdXNpbmcgYE9iamVjdC5jcmVhdGVgXG5cdCAgICAgICAgICAgICAgICAvLyBpc24ndCBmZWFzaWJsZSBzaW5jZSBgQWJvcnRDb250cm9sbGVyYCBpcyBhIGJ1aWx0LWluIG9iamVjdCB0eXBlLCBhbmQgYXR0ZW1wdGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBkaXJlY3RseSB3aXRoIGl0IGFzIHRoZSBwcm90b3R5cGUgbWlnaHQgcmVzdWx0IGluXG5cdCAgICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuXHQgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3T3B0aW9ucy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXdPcHRpb25zO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBtYWtlQWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAobmF0aXZlTGlzdGVuZXIsIGFkZFNvdXJjZSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4sIHJldHVyblRhcmdldCA9IGZhbHNlLCBwcmVwZW5kID0gZmFsc2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcblx0ICAgICAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gYXJndW1lbnRzWzFdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGlzTm9kZSAmJiBldmVudE5hbWUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwYXRjaCB1bmNhdWdodEV4Y2VwdGlvbiBvZiBub2RlanMgdG8gcHJldmVudCBlbmRsZXNzIGxvb3Bcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIFRvIGltcHJvdmUgYGFkZEV2ZW50TGlzdGVuZXJgIHBlcmZvcm1hbmNlLCB3ZSB3aWxsIGNyZWF0ZSB0aGUgY2FsbGJhY2tcblx0ICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGFzayBsYXRlciB3aGVuIHRoZSB0YXNrIGlzIGludm9rZWQuXG5cdCAgICAgICAgICAgICAgICBsZXQgaXNFdmVudExpc3RlbmVyT2JqZWN0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlbGVnYXRlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGVja3Mgd2hldGhlciB0aGUgcHJvdmlkZWQgbGlzdGVuZXIgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhIGBoYW5kbGVFdmVudGAgbWV0aG9kIChzaW5jZSB3ZSBjYW4gY2FsbCBgYWRkRXZlbnRMaXN0ZW5lcmAgd2l0aCBhXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gYGV2ZW50ID0+IC4uLmAgb3Igd2l0aCBhbiBvYmplY3QgYHsgaGFuZGxlRXZlbnQ6IGV2ZW50ID0+IC4uLiB9YCkuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZS5oYW5kbGVFdmVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaXNFdmVudExpc3RlbmVyT2JqZWN0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUhhbmRsZXIgJiYgIXZhbGlkYXRlSGFuZGxlcihuYXRpdmVMaXN0ZW5lciwgZGVsZWdhdGUsIHRhcmdldCwgYXJndW1lbnRzKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NpdmUgPSAhIXBhc3NpdmVFdmVudHMgJiYgcGFzc2l2ZUV2ZW50cy5pbmRleE9mKGV2ZW50TmFtZSkgIT09IC0xO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyhidWlsZEV2ZW50TGlzdGVuZXJPcHRpb25zKGFyZ3VtZW50c1syXSwgcGFzc2l2ZSkpO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaWduYWwgaXMgYW4gYWJvcnRlZCBvbmUsIGp1c3QgcmV0dXJuIHdpdGhvdXQgYXR0YWNoaW5nIHRoZSBldmVudCBsaXN0ZW5lci5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodW5wYXRjaGVkRXZlbnRzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdW5wYXRjaGVkIGxpc3Rcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVucGF0Y2hlZEV2ZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSB1bnBhdGNoZWRFdmVudHNbaV0pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzaXZlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmNhbGwodGFyZ2V0LCBldmVudE5hbWUsIGRlbGVnYXRlLCBvcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZSA9ICFvcHRpb25zID8gZmFsc2UgOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gdHJ1ZSA6IG9wdGlvbnMuY2FwdHVyZTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IG9uY2UgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyA/IG9wdGlvbnMub25jZSA6IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgem9uZSA9IFpvbmUuY3VycmVudDtcblx0ICAgICAgICAgICAgICAgIGxldCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIGlmICghc3ltYm9sRXZlbnROYW1lcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSwgZXZlbnROYW1lVG9TdHJpbmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tjYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdO1xuXHQgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIGxldCBpc0V4aXN0aW5nID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSB0YXNrIHJlZ2lzdGVyZWRcblx0ICAgICAgICAgICAgICAgICAgICBpc0V4aXN0aW5nID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tEdXBsaWNhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2tzW2ldLCBkZWxlZ2F0ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIGNhbGxiYWNrLCBzYW1lIGNhcHR1cmUsIHNhbWUgZXZlbnQgbmFtZSwganVzdCByZXR1cm5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBbXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGxldCBzb3VyY2U7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3JbJ25hbWUnXTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFNvdXJjZSA9IGdsb2JhbFNvdXJjZXNbY29uc3RydWN0b3JOYW1lXTtcblx0ICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTb3VyY2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0YXJnZXRTb3VyY2VbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghc291cmNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc291cmNlID1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JOYW1lICtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZSArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjb2RlIGJlbG93LCBgb3B0aW9uc2Agc2hvdWxkIG5vIGxvbmdlciBiZSByZWFzc2lnbmVkOyBpbnN0ZWFkLCBpdFxuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgbXV0YXRlZC4gVGhpcyBpcyBiZWNhdXNlIHdlIHBhc3MgdGhhdCBvYmplY3QgdG8gdGhlIG5hdGl2ZVxuXHQgICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICAgICAgLy8gSXQncyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBzYW1lIG9iamVjdCByZWZlcmVuY2UgZm9yIG9wdGlvbnMuXG5cdCAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYW5kIGF2b2lkcyBwb3RlbnRpYWwgaXNzdWVzLlxuXHQgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucyA9IG9wdGlvbnM7XG5cdCAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBvbmNlYCBvcHRpb24sIHdlIGRvbid0IHBhc3Ncblx0ICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYG9uY2VgIG9wdGlvbiBkaXJlY3RseSB0byB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2Uga2VlcCB0aGUgYG9uY2VgIHNldHRpbmcgYW5kIGhhbmRsZSBpdCBvdXJzZWx2ZXMuXG5cdCAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5vbmNlID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0YXNrRGF0YS50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXNrRGF0YS5jYXB0dXJlID0gY2FwdHVyZTtcblx0ICAgICAgICAgICAgICAgIHRhc2tEYXRhLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgIHRhc2tEYXRhLmlzRXhpc3RpbmcgPSBpc0V4aXN0aW5nO1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHVzZUdsb2JhbENhbGxiYWNrID8gT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIDogdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgLy8ga2VlcCB0YXNrRGF0YSBpbnRvIGRhdGEgdG8gYWxsb3cgb25TY2hlZHVsZUV2ZW50VGFzayB0byBhY2Nlc3MgdGhlIHRhc2sgaW5mb3JtYXRpb25cblx0ICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IHRhc2tEYXRhO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBzaWduYWxgIG9wdGlvbiwgd2UgZG9uJ3QgcGFzc1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgc2lnbmFsYCBvcHRpb24gZGlyZWN0bHkgdG8gdGhlIG5hdGl2ZSBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGtlZXAgdGhlIGBzaWduYWxgIHNldHRpbmcgYW5kIGhhbmRsZSBpdCBvdXJzZWx2ZXMuXG5cdCAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5zaWduYWwgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBUaGUgYHNjaGVkdWxlRXZlbnRUYXNrYCBmdW5jdGlvbiB3aWxsIHVsdGltYXRlbHkgY2FsbCBgY3VzdG9tU2NoZWR1bGVHbG9iYWxgLFxuXHQgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW4gdHVybiBjYWxscyB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYC4gVGhpcyBpcyB3aHkgYHRhc2tEYXRhLm9wdGlvbnNgXG5cdCAgICAgICAgICAgICAgICAvLyBpcyB1cGRhdGVkIGJlZm9yZSBzY2hlZHVsaW5nIHRoZSB0YXNrLCBhcyBgY3VzdG9tU2NoZWR1bGVHbG9iYWxgIHVzZXNcblx0ICAgICAgICAgICAgICAgIC8vIGB0YXNrRGF0YS5vcHRpb25zYCB0byBwYXNzIGl0IHRvIHRoZSBuYXRpdmUgYGFkZEV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHpvbmUuc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBkZWxlZ2F0ZSwgZGF0YSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4pO1xuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRhc2sgaXMgc2NoZWR1bGVkLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBzaWduYWwgYmFjayB0byB0YXNrLm9wdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLnNpZ25hbCA9IHNpZ25hbDtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXcmFwcGluZyBgdGFza2AgaW4gYSB3ZWFrIHJlZmVyZW5jZSB3b3VsZCBub3QgcHJldmVudCBtZW1vcnkgbGVha3MuIFdlYWsgcmVmZXJlbmNlcyBhcmVcblx0ICAgICAgICAgICAgICAgICAgICAvLyBwcmltYXJpbHkgdXNlZCBmb3IgcHJldmVudGluZyBzdHJvbmcgcmVmZXJlbmNlcyBjeWNsZXMuIGBvbkFib3J0YCBpcyBhbHdheXMgcmVhY2hhYmxlXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gYXMgaXQncyBhbiBldmVudCBsaXN0ZW5lciwgc28gaXRzIGNsb3N1cmUgcmV0YWlucyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIGB0YXNrYC5cblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG5cdCAgICAgICAgICAgICAgICAgICAgbmF0aXZlTGlzdGVuZXIuY2FsbChzaWduYWwsICdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgYGFib3J0YCBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBsaXN0ZW5lciBpcyBnb2luZyB0byBiZSByZW1vdmVkLFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFzIGl0IGNyZWF0ZXMgYSBjbG9zdXJlIHRoYXQgY2FwdHVyZXMgYHRhc2tgLiBUaGlzIGNsb3N1cmUgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGVcblx0ICAgICAgICAgICAgICAgICAgICAvLyBgdGFza2Agb2JqZWN0IGV2ZW4gYWZ0ZXIgaXQgZ29lcyBvdXQgb2Ygc2NvcGUsIHByZXZlbnRpbmcgYHRhc2tgIGZyb20gYmVpbmcgZ2FyYmFnZVxuXHQgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3RlZC5cblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIgPSAoKSA9PiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciB0YXNrRGF0YS50YXJnZXQgdG8gYXZvaWQgbWVtb3J5IGxlYWtcblx0ICAgICAgICAgICAgICAgIC8vIGlzc3VlLCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDQ0MlxuXHQgICAgICAgICAgICAgICAgdGFza0RhdGEudGFyZ2V0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgdXAgdGFza0RhdGEgYmVjYXVzZSBpdCBpcyBhIGdsb2JhbCBvYmplY3Rcblx0ICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIHNhdmUgdGhvc2UgaW5mb3JtYXRpb24gdG8gdGFzayBpbiBjYXNlXG5cdCAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBtYXkgY2FsbCB0YXNrLnpvbmUuY2FuY2VsVGFzaygpIGRpcmVjdGx5XG5cdCAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMub25jZSA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhc2sub3B0aW9ucyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHNhdmUgdGhlIG9wdGlvbnMgb24gdGhlIHRhc2sgKGlmIGl0J3MgYW4gb2JqZWN0KSBiZWNhdXNlXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgYmUgdXNpbmcgYHRhc2sub3B0aW9uc2AgbGF0ZXIgd2hlbiByZW1vdmluZyB0aGUgZXZlbnQgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGFzc2luZyBpdCBiYWNrIHRvIGByZW1vdmVFdmVudExpc3RlbmVyYC5cblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLm9wdGlvbnMgPSBvcHRpb25zO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGFzay50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXNrLmNhcHR1cmUgPSBjYXB0dXJlO1xuXHQgICAgICAgICAgICAgICAgdGFzay5ldmVudE5hbWUgPSBldmVudE5hbWU7XG5cdCAgICAgICAgICAgICAgICBpZiAoaXNFdmVudExpc3RlbmVyT2JqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBkZWxlZ2F0ZSBmb3IgY29tcGFyZSB0byBjaGVjayBkdXBsaWNhdGVcblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghcHJlcGVuZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3MucHVzaCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3MudW5zaGlmdCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVBZGRFdmVudExpc3RlbmVyLCBBRERfRVZFTlRfTElTVEVORVJfU09VUkNFLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQpO1xuXHQgICAgICAgIGlmIChuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcikge1xuXHQgICAgICAgICAgICBwcm90b1tQUkVQRU5EX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciwgUFJFUEVORF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UsIGN1c3RvbVNjaGVkdWxlUHJlcGVuZCwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQsIHRydWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG5cdCAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKSB7XG5cdCAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXJndW1lbnRzWzJdO1xuXHQgICAgICAgICAgICBjb25zdCBjYXB0dXJlID0gIW9wdGlvbnMgPyBmYWxzZSA6IHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyB0cnVlIDogb3B0aW9ucy5jYXB0dXJlO1xuXHQgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFyZ3VtZW50c1sxXTtcblx0ICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAodmFsaWRhdGVIYW5kbGVyICYmXG5cdCAgICAgICAgICAgICAgICAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIsIGRlbGVnYXRlLCB0YXJnZXQsIGFyZ3VtZW50cykpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgaWYgKHN5bWJvbEV2ZW50TmFtZXMpIHtcblx0ICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuXHQgICAgICAgICAgICAvLyBgZXhpc3RpbmdUYXNrc2AgbWF5IG5vdCBleGlzdCBpZiB0aGUgYGFkZEV2ZW50TGlzdGVuZXJgIHdhcyBjYWxsZWQgYmVmb3JlXG5cdCAgICAgICAgICAgIC8vIGl0IHdhcyBwYXRjaGVkIGJ5IHpvbmUuanMuIFBsZWFzZSByZWZlciB0byB0aGUgYXR0YWNoZWQgaXNzdWUgZm9yXG5cdCAgICAgICAgICAgIC8vIGNsYXJpZmljYXRpb24sIHBhcnRpY3VsYXJseSBhZnRlciB0aGUgYGlmYCBjb25kaXRpb24sIGJlZm9yZSBjYWxsaW5nXG5cdCAgICAgICAgICAgIC8vIHRoZSBuYXRpdmUgYHJlbW92ZUV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrID0gZXhpc3RpbmdUYXNrc1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2ssIGRlbGVnYXRlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlzUmVtb3ZlZCB0byBkYXRhIGZvciBmYXN0ZXIgaW52b2tlVGFzayBjaGVja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suaXNSZW1vdmVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBhbmQgcmVtb3ZlIHRoZSB0YXNrIGNhY2hlIGZyb20gdGFyZ2V0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suYWxsUmVtb3ZlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGFyZ2V0LCB3ZSBoYXZlIGFuIGV2ZW50IGxpc3RlbmVyIHdoaWNoIGlzIGFkZGVkIGJ5IG9uX3Byb3BlcnR5XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzIHRhcmdldC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7fSwgc28gd2UgbmVlZCB0byBjbGVhciB0aGlzIGludGVybmFsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSB0b28gaWYgYWxsIGRlbGVnYXRlcyB3aXRoIGNhcHR1cmU9ZmFsc2Ugd2VyZSByZW1vdmVkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovLyBnaXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzE2NDNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzU0NTgxXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmUgJiYgdHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvblByb3BlcnR5U3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgJ09OX1BST1BFUlRZJyArIGV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbb25Qcm9wZXJ0eVN5bWJvbF0gPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGFsbCBvdGhlciBjb25kaXRpb25zLCB3aGVuIGBhZGRFdmVudExpc3RlbmVyYCBpcyBjYWxsZWQgYWZ0ZXIgYmVpbmdcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0Y2hlZCBieSB6b25lLmpzLCB3ZSB3b3VsZCBhbHdheXMgZmluZCBhbiBldmVudCB0YXNrIG9uIHRoZSBgRXZlbnRUYXJnZXRgLlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBgY2FuY2VsRm5gIG9uIHRoZSBgZXhpc3RpbmdUYXNrYCwgbGVhZGluZyB0byBgY3VzdG9tQ2FuY2VsR2xvYmFsYCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdWx0aW1hdGVseSByZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGFuZCBjbGVhbnMgdXAgdGhlIGFib3J0IGxpc3RlbmVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIChpZiBhbiBgQWJvcnRTaWduYWxgIHdhcyBwcm92aWRlZCB3aGVuIHNjaGVkdWxpbmcgYSB0YXNrKS5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLnpvbmUuY2FuY2VsVGFzayhleGlzdGluZ1Rhc2spO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTMwXG5cdCAgICAgICAgICAgIC8vIFdlIG1heSBlbmNvdW50ZXIgYSBzaXR1YXRpb24gd2hlcmUgdGhlIGBhZGRFdmVudExpc3RlbmVyYCB3YXNcblx0ICAgICAgICAgICAgLy8gY2FsbGVkIG9uIHRoZSBldmVudCB0YXJnZXQgYmVmb3JlIHpvbmUuanMgaXMgbG9hZGVkLCByZXN1bHRpbmdcblx0ICAgICAgICAgICAgLy8gaW4gbm8gdGFzayBiZWluZyBzdG9yZWQgb24gdGhlIGV2ZW50IHRhcmdldCBkdWUgdG8gaXRzIGludm9jYXRpb25cblx0ICAgICAgICAgICAgLy8gb2YgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gSW4gdGhpcyBzY2VuYXJpbywgd2Ugc2ltcGx5IG5lZWQgdG9cblx0ICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBuYXRpdmUgYHJlbW92ZUV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICByZXR1cm4gbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcHJvdG9bTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcyB8fCBfZ2xvYmFsO1xuXHQgICAgICAgICAgICBsZXQgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdO1xuXHQgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gW107XG5cdCAgICAgICAgICAgIGNvbnN0IHRhc2tzID0gZmluZEV2ZW50VGFza3ModGFyZ2V0LCBldmVudE5hbWVUb1N0cmluZyA/IGV2ZW50TmFtZVRvU3RyaW5nKGV2ZW50TmFtZSkgOiBldmVudE5hbWUpO1xuXHQgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gdGFza3NbaV07XG5cdCAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goZGVsZWdhdGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcblx0ICAgICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgICAgICAgaWYgKCFldmVudE5hbWUpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0YXJnZXQpO1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IGtleXNbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYLmV4ZWMocHJvcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpbiBub2RlanMgRXZlbnRFbWl0dGVyLCByZW1vdmVMaXN0ZW5lciBldmVudCBpc1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1vbml0b3JpbmcgdGhlIHJlbW92ZUxpc3RlbmVyIGNhbGwsXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc28ganVzdCBrZWVwIHJlbW92ZUxpc3RlbmVyIGV2ZW50TGlzdGVuZXIgdW50aWxcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgZXZlbnRMaXN0ZW5lcnMgYXJlIHJlbW92ZWRcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0TmFtZSAmJiBldnROYW1lICE9PSAncmVtb3ZlTGlzdGVuZXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZ0TmFtZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyIGZpbmFsbHlcblx0ICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgJ3JlbW92ZUxpc3RlbmVyJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbRkFMU0VfU1RSXTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xDYXB0dXJlRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tUUlVFX1NUUl07XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlVGFza3MgPSB0YXJnZXRbc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZVRhc2tzID0gdGFza3Muc2xpY2UoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHJlbW92ZVRhc2tzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIHRhc2sub3B0aW9ucyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVUYXNrcyA9IGNhcHR1cmVUYXNrcy5zbGljZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW92ZVRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gcmVtb3ZlVGFza3NbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgLy8gZm9yIG5hdGl2ZSB0b1N0cmluZyBwYXRjaFxuXHQgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tBRERfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVBZGRFdmVudExpc3RlbmVyKTtcblx0ICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lcik7XG5cdCAgICAgICAgaWYgKG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycykge1xuXHQgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobmF0aXZlTGlzdGVuZXJzKSB7XG5cdCAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVMaXN0ZW5lcnMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIGxldCByZXN1bHRzID0gW107XG5cdCAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFwaXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICByZXN1bHRzW2ldID0gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMoYXBpc1tpXSwgcGF0Y2hPcHRpb25zKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiByZXN1bHRzO1xuXHR9XG5cdGZ1bmN0aW9uIGZpbmRFdmVudFRhc2tzKHRhcmdldCwgZXZlbnROYW1lKSB7XG5cdCAgICBpZiAoIWV2ZW50TmFtZSkge1xuXHQgICAgICAgIGNvbnN0IGZvdW5kVGFza3MgPSBbXTtcblx0ICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRhcmdldCkge1xuXHQgICAgICAgICAgICBjb25zdCBtYXRjaCA9IEVWRU5UX05BTUVfU1lNQk9MX1JFR1guZXhlYyhwcm9wKTtcblx0ICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcblx0ICAgICAgICAgICAgaWYgKGV2dE5hbWUgJiYgKCFldmVudE5hbWUgfHwgZXZ0TmFtZSA9PT0gZXZlbnROYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbcHJvcF07XG5cdCAgICAgICAgICAgICAgICBpZiAodGFza3MpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGFza3MucHVzaCh0YXNrc1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmb3VuZFRhc2tzO1xuXHQgICAgfVxuXHQgICAgbGV0IHN5bWJvbEV2ZW50TmFtZSA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG5cdCAgICBpZiAoIXN5bWJvbEV2ZW50TmFtZSkge1xuXHQgICAgICAgIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSk7XG5cdCAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGNhcHR1cmVGYWxzZVRhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZVtGQUxTRV9TVFJdXTtcblx0ICAgIGNvbnN0IGNhcHR1cmVUcnVlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW1RSVUVfU1RSXV07XG5cdCAgICBpZiAoIWNhcHR1cmVGYWxzZVRhc2tzKSB7XG5cdCAgICAgICAgcmV0dXJuIGNhcHR1cmVUcnVlVGFza3MgPyBjYXB0dXJlVHJ1ZVRhc2tzLnNsaWNlKCkgOiBbXTtcblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgICAgIHJldHVybiBjYXB0dXJlVHJ1ZVRhc2tzXG5cdCAgICAgICAgICAgID8gY2FwdHVyZUZhbHNlVGFza3MuY29uY2F0KGNhcHR1cmVUcnVlVGFza3MpXG5cdCAgICAgICAgICAgIDogY2FwdHVyZUZhbHNlVGFza3Muc2xpY2UoKTtcblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBwYXRjaEV2ZW50UHJvdG90eXBlKGdsb2JhbCwgYXBpKSB7XG5cdCAgICBjb25zdCBFdmVudCA9IGdsb2JhbFsnRXZlbnQnXTtcblx0ICAgIGlmIChFdmVudCAmJiBFdmVudC5wcm90b3R5cGUpIHtcblx0ICAgICAgICBhcGkucGF0Y2hNZXRob2QoRXZlbnQucHJvdG90eXBlLCAnc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJywgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICBzZWxmW0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXG5cdCAgICAgICAgICAgIC8vIGluIGNhc2UgaW4gc29tZSBoeWJyaWQgYXBwbGljYXRpb24sIHNvbWUgcGFydCBvZlxuXHQgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgem9uZSwgc29tZSBhcmUgbm90XG5cdCAgICAgICAgICAgIGRlbGVnYXRlICYmIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdGZ1bmN0aW9uIHBhdGNoUXVldWVNaWNyb3Rhc2soZ2xvYmFsLCBhcGkpIHtcblx0ICAgIGFwaS5wYXRjaE1ldGhvZChnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycsIChkZWxlZ2F0ZSkgPT4ge1xuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICBab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb1Rhc2soJ3F1ZXVlTWljcm90YXNrJywgYXJnc1swXSk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdGNvbnN0IHRhc2tTeW1ib2wgPSB6b25lU3ltYm9sKCd6b25lVGFzaycpO1xuXHRmdW5jdGlvbiBwYXRjaFRpbWVyKHdpbmRvdywgc2V0TmFtZSwgY2FuY2VsTmFtZSwgbmFtZVN1ZmZpeCkge1xuXHQgICAgbGV0IHNldE5hdGl2ZSA9IG51bGw7XG5cdCAgICBsZXQgY2xlYXJOYXRpdmUgPSBudWxsO1xuXHQgICAgc2V0TmFtZSArPSBuYW1lU3VmZml4O1xuXHQgICAgY2FuY2VsTmFtZSArPSBuYW1lU3VmZml4O1xuXHQgICAgY29uc3QgdGFza3NCeUhhbmRsZUlkID0ge307XG5cdCAgICBmdW5jdGlvbiBzY2hlZHVsZVRhc2sodGFzaykge1xuXHQgICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG5cdCAgICAgICAgZGF0YS5hcmdzWzBdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGhhbmRsZU9ySWQgPSBzZXROYXRpdmUuYXBwbHkod2luZG93LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgIC8vIFdobGlzdCBvbiBOb2RlLmpzIHdoZW4gZ2V0IGNhbiB0aGUgSUQgYnkgdXNpbmcgYFtTeW1ib2wudG9QcmltaXRpdmVdKClgIHdlIGRvXG5cdCAgICAgICAgLy8gdG8gdGhpcyBzbyB0aGF0IHdlIGRvIG5vdCBjYXVzZSBwb3RlbnRhbGx5IGxlYWtzIHdoZW4gdXNpbmcgYHNldFRpbWVvdXRgXG5cdCAgICAgICAgLy8gc2luY2UgdGhpcyBjYW4gYmUgcGVyaW9kaWMgd2hlbiB1c2luZyBgLnJlZnJlc2hgLlxuXHQgICAgICAgIGlmIChpc051bWJlcihoYW5kbGVPcklkKSkge1xuXHQgICAgICAgICAgICBkYXRhLmhhbmRsZUlkID0gaGFuZGxlT3JJZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGRhdGEuaGFuZGxlID0gaGFuZGxlT3JJZDtcblx0ICAgICAgICAgICAgLy8gT24gTm9kZS5qcyBhIHRpbWVvdXQgYW5kIGludGVydmFsIGNhbiBiZSByZXN0YXJ0ZWQgb3ZlciBhbmQgb3ZlciBhZ2FpbiBieSB1c2luZyB0aGUgYC5yZWZyZXNoYCBtZXRob2QuXG5cdCAgICAgICAgICAgIGRhdGEuaXNSZWZyZXNoYWJsZSA9IGlzRnVuY3Rpb24oaGFuZGxlT3JJZC5yZWZyZXNoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBjbGVhclRhc2sodGFzaykge1xuXHQgICAgICAgIGNvbnN0IHsgaGFuZGxlLCBoYW5kbGVJZCB9ID0gdGFzay5kYXRhO1xuXHQgICAgICAgIHJldHVybiBjbGVhck5hdGl2ZS5jYWxsKHdpbmRvdywgaGFuZGxlID8/IGhhbmRsZUlkKTtcblx0ICAgIH1cblx0ICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKHdpbmRvdywgc2V0TmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgIGlmIChpc0Z1bmN0aW9uKGFyZ3NbMF0pKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgICAgICBpc1JlZnJlc2hhYmxlOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcsXG5cdCAgICAgICAgICAgICAgICBkZWxheTogbmFtZVN1ZmZpeCA9PT0gJ1RpbWVvdXQnIHx8IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcgPyBhcmdzWzFdIHx8IDAgOiB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG5cdCAgICAgICAgICAgIGFyZ3NbMF0gPSBmdW5jdGlvbiB0aW1lcigpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBmaW5hbGx5IHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZS05MzQsIHRhc2sgd2lsbCBiZSBjYW5jZWxsZWRcblx0ICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGl0IGlzIGEgcGVyaW9kaWMgdGFzayBzdWNoIGFzXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2V0SW50ZXJ2YWxcblx0ICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80MDM4N1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgdGFza3NCeUhhbmRsZUlkIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBzY2hlZHVsZVRhc2tcblx0ICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBzb21lIHpvbmVTcGVjIG1heSBpbnRlcmNlcHQgYW5kIGRvZXNuJ3QgdHJpZ2dlclxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlRm4oc2NoZWR1bGVUYXNrKSBwcm92aWRlZCBoZXJlLlxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaGFuZGxlLCBoYW5kbGVJZCwgaXNQZXJpb2RpYywgaXNSZWZyZXNoYWJsZSB9ID0gb3B0aW9ucztcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUGVyaW9kaWMgJiYgIWlzUmVmcmVzaGFibGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBub24tbm9kZWpzIGVudiwgd2UgcmVtb3ZlIHRpbWVySWRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gbG9jYWwgY2FjaGVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbaGFuZGxlSWRdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSB0YXNrIHJlZmVyZW5jZSBmcm9tIHRpbWVyIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgY29uc3QgdGFzayA9IHNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lKHNldE5hbWUsIGFyZ3NbMF0sIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTtcblx0ICAgICAgICAgICAgaWYgKCF0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGFzaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBOb2RlLmpzIG11c3QgYWRkaXRpb25hbGx5IHN1cHBvcnQgdGhlIHJlZiBhbmQgdW5yZWYgZnVuY3Rpb25zLlxuXHQgICAgICAgICAgICBjb25zdCB7IGhhbmRsZUlkLCBoYW5kbGUsIGlzUmVmcmVzaGFibGUsIGlzUGVyaW9kaWMgfSA9IHRhc2suZGF0YTtcblx0ICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmb3Igbm9uIG5vZGVqcyBlbnYsIHdlIHNhdmUgaGFuZGxlSWQ6IHRhc2tcblx0ICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcgaW4gbG9jYWwgY2FjaGUgZm9yIGNsZWFyVGltZW91dFxuXHQgICAgICAgICAgICAgICAgdGFza3NCeUhhbmRsZUlkW2hhbmRsZUlkXSA9IHRhc2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmb3Igbm9kZWpzIGVudiwgd2Ugc2F2ZSB0YXNrXG5cdCAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaW4gdGltZXJJZCBPYmplY3QgZm9yIGNsZWFyVGltZW91dFxuXHQgICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gdGFzaztcblx0ICAgICAgICAgICAgICAgIGlmIChpc1JlZnJlc2hhYmxlICYmICFpc1BlcmlvZGljKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZWZyZXNoID0gaGFuZGxlLnJlZnJlc2g7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFuZGxlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgem9uZSwgc3RhdGUgfSA9IHRhc2s7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ25vdFNjaGVkdWxlZCcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3N0YXRlID0gJ3NjaGVkdWxlZCc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdydW5uaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5fc3RhdGUgPSAnc2NoZWR1bGluZyc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVmcmVzaC5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIGhhbmRsZSA/PyBoYW5kbGVJZCA/PyB0YXNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHdpbmRvdywgYXJncyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBjbGVhck5hdGl2ZSA9IHBhdGNoTWV0aG9kKHdpbmRvdywgY2FuY2VsTmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgIGNvbnN0IGlkID0gYXJnc1swXTtcblx0ICAgICAgICBsZXQgdGFzaztcblx0ICAgICAgICBpZiAoaXNOdW1iZXIoaWQpKSB7XG5cdCAgICAgICAgICAgIC8vIG5vbiBub2RlanMgZW52LlxuXHQgICAgICAgICAgICB0YXNrID0gdGFza3NCeUhhbmRsZUlkW2lkXTtcblx0ICAgICAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVJZFtpZF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAvLyBub2RlanMgZW52ID8/IG90aGVyIGVudmlyb25tZW50cy5cblx0ICAgICAgICAgICAgdGFzayA9IGlkPy5bdGFza1N5bWJvbF07XG5cdCAgICAgICAgICAgIGlmICh0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICBpZFt0YXNrU3ltYm9sXSA9IG51bGw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0YXNrID0gaWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRhc2s/LnR5cGUpIHtcblx0ICAgICAgICAgICAgaWYgKHRhc2suY2FuY2VsRm4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjYW5jZWwgYWxyZWFkeSBjYW5jZWxlZCBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgIHRhc2suem9uZS5jYW5jZWxUYXNrKHRhc2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LlxuXHQgICAgICAgICAgICBkZWxlZ2F0ZS5hcHBseSh3aW5kb3csIGFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDdXN0b21FbGVtZW50cyhfZ2xvYmFsLCBhcGkpIHtcblx0ICAgIGNvbnN0IHsgaXNCcm93c2VyLCBpc01peCB9ID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKTtcblx0ICAgIGlmICgoIWlzQnJvd3NlciAmJiAhaXNNaXgpIHx8ICFfZ2xvYmFsWydjdXN0b21FbGVtZW50cyddIHx8ICEoJ2N1c3RvbUVsZW1lbnRzJyBpbiBfZ2xvYmFsKSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2N1c3RvbS1lbGVtZW50cy5odG1sI2NvbmNlcHQtY3VzdG9tLWVsZW1lbnQtZGVmaW5pdGlvbi1saWZlY3ljbGUtY2FsbGJhY2tzXG5cdCAgICBjb25zdCBjYWxsYmFja3MgPSBbXG5cdCAgICAgICAgJ2Nvbm5lY3RlZENhbGxiYWNrJyxcblx0ICAgICAgICAnZGlzY29ubmVjdGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdhZG9wdGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2snLFxuXHQgICAgICAgICdmb3JtQXNzb2NpYXRlZENhbGxiYWNrJyxcblx0ICAgICAgICAnZm9ybURpc2FibGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdmb3JtUmVzZXRDYWxsYmFjaycsXG5cdCAgICAgICAgJ2Zvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjaycsXG5cdCAgICBdO1xuXHQgICAgYXBpLnBhdGNoQ2FsbGJhY2tzKGFwaSwgX2dsb2JhbC5jdXN0b21FbGVtZW50cywgJ2N1c3RvbUVsZW1lbnRzJywgJ2RlZmluZScsIGNhbGxiYWNrcyk7XG5cdH1cblxuXHRmdW5jdGlvbiBldmVudFRhcmdldFBhdGNoKF9nbG9iYWwsIGFwaSkge1xuXHQgICAgaWYgKFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSkge1xuXHQgICAgICAgIC8vIEV2ZW50VGFyZ2V0IGlzIGFscmVhZHkgcGF0Y2hlZC5cblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB7IGV2ZW50TmFtZXMsIHpvbmVTeW1ib2xFdmVudE5hbWVzLCBUUlVFX1NUUiwgRkFMU0VfU1RSLCBaT05FX1NZTUJPTF9QUkVGSVggfSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCk7XG5cdCAgICAvLyAgcHJlZGVmaW5lIGFsbCBfX3pvbmVfc3ltYm9sX18gKyBldmVudE5hbWUgKyB0cnVlL2ZhbHNlIHN0cmluZ1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTtcblx0ICAgICAgICBjb25zdCBmYWxzZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIEZBTFNFX1NUUjtcblx0ICAgICAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgZmFsc2VFdmVudE5hbWU7XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG5cdCAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHt9O1xuXHQgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bRkFMU0VfU1RSXSA9IHN5bWJvbDtcblx0ICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG5cdCAgICB9XG5cdCAgICBjb25zdCBFVkVOVF9UQVJHRVQgPSBfZ2xvYmFsWydFdmVudFRhcmdldCddO1xuXHQgICAgaWYgKCFFVkVOVF9UQVJHRVQgfHwgIUVWRU5UX1RBUkdFVC5wcm90b3R5cGUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBhcGkucGF0Y2hFdmVudFRhcmdldChfZ2xvYmFsLCBhcGksIFtFVkVOVF9UQVJHRVQgJiYgRVZFTlRfVEFSR0VULnByb3RvdHlwZV0pO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hFdmVudChnbG9iYWwsIGFwaSkge1xuXHQgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUoZ2xvYmFsLCBhcGkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfVxuXHQgKi9cblx0ZnVuY3Rpb24gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcykge1xuXHQgICAgaWYgKCFpZ25vcmVQcm9wZXJ0aWVzIHx8IGlnbm9yZVByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIG9uUHJvcGVydGllcztcblx0ICAgIH1cblx0ICAgIGNvbnN0IHRpcCA9IGlnbm9yZVByb3BlcnRpZXMuZmlsdGVyKChpcCkgPT4gaXAudGFyZ2V0ID09PSB0YXJnZXQpO1xuXHQgICAgaWYgKHRpcC5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICByZXR1cm4gb25Qcm9wZXJ0aWVzO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdGFyZ2V0SWdub3JlUHJvcGVydGllcyA9IHRpcFswXS5pZ25vcmVQcm9wZXJ0aWVzO1xuXHQgICAgcmV0dXJuIG9uUHJvcGVydGllcy5maWx0ZXIoKG9wKSA9PiB0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzLmluZGV4T2Yob3ApID09PSAtMSk7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXModGFyZ2V0LCBvblByb3BlcnRpZXMsIGlnbm9yZVByb3BlcnRpZXMsIHByb3RvdHlwZSkge1xuXHQgICAgLy8gY2hlY2sgd2hldGhlciB0YXJnZXQgaXMgYXZhaWxhYmxlLCBzb21ldGltZXMgdGFyZ2V0IHdpbGwgYmUgdW5kZWZpbmVkXG5cdCAgICAvLyBiZWNhdXNlIGRpZmZlcmVudCBicm93c2VyIG9yIHNvbWUgM3JkIHBhcnR5IHBsdWdpbi5cblx0ICAgIGlmICghdGFyZ2V0KSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcyk7XG5cdCAgICBwYXRjaE9uUHJvcGVydGllcyh0YXJnZXQsIGZpbHRlcmVkUHJvcGVydGllcywgcHJvdG90eXBlKTtcblx0fVxuXHQvKipcblx0ICogR2V0IGFsbCBldmVudCBuYW1lIHByb3BlcnRpZXMgd2hpY2ggdGhlIGV2ZW50IG5hbWUgc3RhcnRzV2l0aCBgb25gXG5cdCAqIGZyb20gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmLCBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgbm90IGNvbnNpZGVyZWQuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRPbkV2ZW50TmFtZXModGFyZ2V0KSB7XG5cdCAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuXHQgICAgICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aCgnb24nKSAmJiBuYW1lLmxlbmd0aCA+IDIpXG5cdCAgICAgICAgLm1hcCgobmFtZSkgPT4gbmFtZS5zdWJzdHJpbmcoMikpO1xuXHR9XG5cdGZ1bmN0aW9uIHByb3BlcnR5RGVzY3JpcHRvclBhdGNoKGFwaSwgX2dsb2JhbCkge1xuXHQgICAgaWYgKGlzTm9kZSAmJiAhaXNNaXgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50cycpXSkge1xuXHQgICAgICAgIC8vIGV2ZW50cyBhcmUgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgbGVnYWN5IHBhdGNoLlxuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGlnbm9yZVByb3BlcnRpZXMgPSBfZ2xvYmFsWydfX1pvbmVfaWdub3JlX29uX3Byb3BlcnRpZXMnXTtcblx0ICAgIC8vIGZvciBicm93c2VycyB0aGF0IHdlIGNhbiBwYXRjaCB0aGUgZGVzY3JpcHRvcjogIENocm9tZSAmIEZpcmVmb3hcblx0ICAgIGxldCBwYXRjaFRhcmdldHMgPSBbXTtcblx0ICAgIGlmIChpc0Jyb3dzZXIpIHtcblx0ICAgICAgICBjb25zdCBpbnRlcm5hbFdpbmRvdyA9IHdpbmRvdztcblx0ICAgICAgICBwYXRjaFRhcmdldHMgPSBwYXRjaFRhcmdldHMuY29uY2F0KFtcblx0ICAgICAgICAgICAgJ0RvY3VtZW50Jyxcblx0ICAgICAgICAgICAgJ1NWR0VsZW1lbnQnLFxuXHQgICAgICAgICAgICAnRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MQm9keUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTE1lZGlhRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MRnJhbWVTZXRFbGVtZW50Jyxcblx0ICAgICAgICAgICAgJ0hUTUxGcmFtZUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTElGcmFtZUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTE1hcnF1ZWVFbGVtZW50Jyxcblx0ICAgICAgICAgICAgJ1dvcmtlcicsXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgY29uc3QgaWdub3JlRXJyb3JQcm9wZXJ0aWVzID0gW107XG5cdCAgICAgICAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgbGlrZSBJRSBvciBFZGdlLCBldmVudCBoYW5kbGVyIHByb3BlcnRpZXMgKGUuZy4sIGBvbmNsaWNrYClcblx0ICAgICAgICAvLyBtYXkgbm90IGJlIGRlZmluZWQgZGlyZWN0bHkgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBidXQgb24gaXRzIHByb3RvdHlwZSAoYFdpbmRvd1Byb3RvdHlwZWApLlxuXHQgICAgICAgIC8vIFRvIGVuc3VyZSBjb21wbGV0ZSBjb3ZlcmFnZSwgd2UgdXNlIHRoZSBwcm90b3R5cGUgd2hlbiBjaGVja2luZ1xuXHQgICAgICAgIC8vIGZvciBhbmQgcGF0Y2hpbmcgdGhlc2UgcHJvcGVydGllcy5cblx0ICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhpbnRlcm5hbFdpbmRvdywgZ2V0T25FdmVudE5hbWVzKGludGVybmFsV2luZG93KSwgaWdub3JlUHJvcGVydGllcyA/IGlnbm9yZVByb3BlcnRpZXMuY29uY2F0KGlnbm9yZUVycm9yUHJvcGVydGllcykgOiBpZ25vcmVQcm9wZXJ0aWVzLCBPYmplY3RHZXRQcm90b3R5cGVPZihpbnRlcm5hbFdpbmRvdykpO1xuXHQgICAgfVxuXHQgICAgcGF0Y2hUYXJnZXRzID0gcGF0Y2hUYXJnZXRzLmNvbmNhdChbXG5cdCAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jyxcblx0ICAgICAgICAnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCcsXG5cdCAgICAgICAgJ0lEQkluZGV4Jyxcblx0ICAgICAgICAnSURCUmVxdWVzdCcsXG5cdCAgICAgICAgJ0lEQk9wZW5EQlJlcXVlc3QnLFxuXHQgICAgICAgICdJREJEYXRhYmFzZScsXG5cdCAgICAgICAgJ0lEQlRyYW5zYWN0aW9uJyxcblx0ICAgICAgICAnSURCQ3Vyc29yJyxcblx0ICAgICAgICAnV2ViU29ja2V0Jyxcblx0ICAgIF0pO1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRjaFRhcmdldHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICBjb25zdCB0YXJnZXQgPSBfZ2xvYmFsW3BhdGNoVGFyZ2V0c1tpXV07XG5cdCAgICAgICAgdGFyZ2V0Py5wcm90b3R5cGUgJiZcblx0ICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXModGFyZ2V0LnByb3RvdHlwZSwgZ2V0T25FdmVudE5hbWVzKHRhcmdldC5wcm90b3R5cGUpLCBpZ25vcmVQcm9wZXJ0aWVzKTtcblx0ICAgIH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIEBzdXBwcmVzcyB7bWlzc2luZ1JlcXVpcmV9XG5cdCAqL1xuXHRmdW5jdGlvbiBwYXRjaEJyb3dzZXIoWm9uZSkge1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ2xlZ2FjeScsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICBjb25zdCBsZWdhY3lQYXRjaCA9IGdsb2JhbFtab25lLl9fc3ltYm9sX18oJ2xlZ2FjeVBhdGNoJyldO1xuXHQgICAgICAgIGlmIChsZWdhY3lQYXRjaCkge1xuXHQgICAgICAgICAgICBsZWdhY3lQYXRjaCgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3RpbWVycycsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICBjb25zdCBzZXQgPSAnc2V0Jztcblx0ICAgICAgICBjb25zdCBjbGVhciA9ICdjbGVhcic7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdUaW1lb3V0Jyk7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdJbnRlcnZhbCcpO1xuXHQgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLCAoZ2xvYmFsKSA9PiB7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpO1xuXHQgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnbW96UmVxdWVzdCcsICdtb3pDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTtcblx0ICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ3dlYmtpdFJlcXVlc3QnLCAnd2Via2l0Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdibG9ja2luZycsIChnbG9iYWwsIFpvbmUpID0+IHtcblx0ICAgICAgICBjb25zdCBibG9ja2luZ01ldGhvZHMgPSBbJ2FsZXJ0JywgJ3Byb21wdCcsICdjb25maXJtJ107XG5cdCAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja2luZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgY29uc3QgbmFtZSA9IGJsb2NraW5nTWV0aG9kc1tpXTtcblx0ICAgICAgICAgICAgcGF0Y2hNZXRob2QoZ2xvYmFsLCBuYW1lLCAoZGVsZWdhdGUsIHN5bWJvbCwgbmFtZSkgPT4ge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5ydW4oZGVsZWdhdGUsIGdsb2JhbCwgYXJncywgbmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIHBhdGNoRXZlbnQoZ2xvYmFsLCBhcGkpO1xuXHQgICAgICAgIGV2ZW50VGFyZ2V0UGF0Y2goZ2xvYmFsLCBhcGkpO1xuXHQgICAgICAgIC8vIHBhdGNoIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQncyBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXJcblx0ICAgICAgICBjb25zdCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gZ2xvYmFsWydYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0J107XG5cdCAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgJiYgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGUpIHtcblx0ICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoZ2xvYmFsLCBhcGksIFtYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZV0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ011dGF0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaENsYXNzKCdNdXRhdGlvbk9ic2VydmVyJyk7XG5cdCAgICAgICAgcGF0Y2hDbGFzcygnV2ViS2l0TXV0YXRpb25PYnNlcnZlcicpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaENsYXNzKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnRmlsZVJlYWRlcicsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIHBhdGNoQ2xhc3MoJ0ZpbGVSZWFkZXInKTtcblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ29uX3Byb3BlcnR5JywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yUGF0Y2goYXBpLCBnbG9iYWwpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnY3VzdG9tRWxlbWVudHMnLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaEN1c3RvbUVsZW1lbnRzKGdsb2JhbCwgYXBpKTtcblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ1hIUicsIChnbG9iYWwsIFpvbmUpID0+IHtcblx0ICAgICAgICAvLyBUcmVhdCBYTUxIdHRwUmVxdWVzdCBhcyBhIG1hY3JvdGFzay5cblx0ICAgICAgICBwYXRjaFhIUihnbG9iYWwpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9UQVNLID0gem9uZVN5bWJvbCgneGhyVGFzaycpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9TWU5DID0gem9uZVN5bWJvbCgneGhyU3luYycpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9MSVNURU5FUiA9IHpvbmVTeW1ib2woJ3hockxpc3RlbmVyJyk7XG5cdCAgICAgICAgY29uc3QgWEhSX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hoclNjaGVkdWxlZCcpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9VUkwgPSB6b25lU3ltYm9sKCd4aHJVUkwnKTtcblx0ICAgICAgICBjb25zdCBYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hockVycm9yQmVmb3JlU2NoZWR1bGVkJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gcGF0Y2hYSFIod2luZG93KSB7XG5cdCAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0ID0gd2luZG93WydYTUxIdHRwUmVxdWVzdCddO1xuXHQgICAgICAgICAgICBpZiAoIVhNTEh0dHBSZXF1ZXN0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIHNlcnZpY2Ugd29ya2VyXG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRQZW5kaW5nVGFzayh0YXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbWEhSX1RBU0tdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGxldCBvcmlBZGRMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgIGxldCBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnXTtcblx0ICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZSA9IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQucHJvdG90eXBlO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaUFkZExpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IFJFQURZX1NUQVRFX0NIQU5HRSA9ICdyZWFkeXN0YXRlY2hhbmdlJztcblx0ICAgICAgICAgICAgY29uc3QgU0NIRURVTEVEID0gJ3NjaGVkdWxlZCc7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZGF0YS50YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBldmVudCBsaXN0ZW5lclxuXHQgICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbWEhSX0xJU1RFTkVSXTtcblx0ICAgICAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lciA9IHRhcmdldFtaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gdGFyZ2V0W1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvcmlSZW1vdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBsaXN0ZW5lcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBuZXdMaXN0ZW5lciA9ICh0YXJnZXRbWEhSX0xJU1RFTkVSXSA9ICgpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnJlYWR5U3RhdGUgPT09IHRhcmdldC5ET05FKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBvbiBzb21lIGJyb3dzZXJzIFhNTEh0dHBSZXF1ZXN0IHdpbGwgZmlyZSBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkeVN0YXRlPTQgbXVsdGlwbGUgdGltZXMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGFzayBzdGF0ZSBoZXJlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5hYm9ydGVkICYmIHRhcmdldFtYSFJfU0NIRURVTEVEXSAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHhociBoYXMgcmVnaXN0ZXJlZCBvbmxvYWQgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZSB0YXNrIHNob3VsZCBpbnZva2UgYWZ0ZXIgYWxsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmxvYWQgbGlzdGVuZXJzIGZpbmlzaC5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gaWYgdGhlIHJlcXVlc3QgZmFpbGVkIHdpdGhvdXQgcmVzcG9uc2UgKHN0YXR1cyA9IDApLCB0aGUgbG9hZCBldmVudCBoYW5kbGVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQsIGluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkIGFsc28gaW52b2tlIHRoZSBwbGFjZWhvbGRlciBjYWxsYmFja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2xvc2UgdGhlIFhNTEh0dHBSZXF1ZXN0OjpzZW5kIG1hY3JvVGFzay5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM4Nzk1XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnN0YXR1cyAhPT0gMCAmJiBsb2FkVGFza3MgJiYgbG9hZFRhc2tzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlJbnZva2UgPSB0YXNrLmludm9rZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBsb2FkIHRoZSB0YXNrcyBhZ2FpbiwgYmVjYXVzZSBpbiBvdGhlclxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGxpc3RlbmVyLCB0aGV5IG1heSByZW1vdmUgdGhlbXNlbHZlc1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9hZFRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFRhc2tzW2ldID09PSB0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaUludm9rZS5jYWxsKHRhc2spO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGFza3MucHVzaCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaW52b2tlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBvY2N1cnMgd2hlbiB4aHIuc2VuZCgpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRURdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIuY2FsbCh0YXJnZXQsIFJFQURZX1NUQVRFX0NIQU5HRSwgbmV3TGlzdGVuZXIpO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVkVGFzayA9IHRhcmdldFtYSFJfVEFTS107XG5cdCAgICAgICAgICAgICAgICBpZiAoIXN0b3JlZFRhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1RBU0tdID0gdGFzaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHNlbmROYXRpdmUuYXBwbHkodGFyZ2V0LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHBsYWNlaG9sZGVyQ2FsbGJhY2soKSB7IH1cblx0ICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJUYXNrKHRhc2spIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG5cdCAgICAgICAgICAgICAgICAvLyBOb3RlIC0gaWRlYWxseSwgd2Ugd291bGQgY2FsbCBkYXRhLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyIGhlcmUsIGJ1dCBpdCdzIHRvbyBsYXRlXG5cdCAgICAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZmlyaW5nLiBTbyBpbnN0ZWFkLCB3ZSBzdG9yZSBpbmZvIGZvciB0aGUgZXZlbnQgbGlzdGVuZXIuXG5cdCAgICAgICAgICAgICAgICBkYXRhLmFib3J0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGFib3J0TmF0aXZlLmFwcGx5KGRhdGEudGFyZ2V0LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IG9wZW5OYXRpdmUgPSBwYXRjaE1ldGhvZChYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgJ29wZW4nLCAoKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICAgICAgc2VsZltYSFJfU1lOQ10gPSBhcmdzWzJdID09IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb3Blbk5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGNvbnN0IFhNTEhUVFBSRVFVRVNUX1NPVVJDRSA9ICdYTUxIdHRwUmVxdWVzdC5zZW5kJztcblx0ICAgICAgICAgICAgY29uc3QgZmV0Y2hUYXNrQWJvcnRpbmcgPSB6b25lU3ltYm9sKCdmZXRjaFRhc2tBYm9ydGluZycpO1xuXHQgICAgICAgICAgICBjb25zdCBmZXRjaFRhc2tTY2hlZHVsaW5nID0gem9uZVN5bWJvbCgnZmV0Y2hUYXNrU2NoZWR1bGluZycpO1xuXHQgICAgICAgICAgICBjb25zdCBzZW5kTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdzZW5kJywgKCkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChab25lLmN1cnJlbnRbZmV0Y2hUYXNrU2NoZWR1bGluZ10gPT09IHRydWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhIGZldGNoIGlzIHNjaGVkdWxpbmcsIHNvIHdlIGFyZSB1c2luZyB4aHIgdG8gcG9seWZpbGwgZmV0Y2hcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVjYXVzZSB3ZSBhbHJlYWR5IHNjaGVkdWxlIG1hY3JvVGFzayBmb3IgZmV0Y2gsIHdlIHNob3VsZFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzY2hlZHVsZSBhIG1hY3JvVGFzayBmb3IgeGhyIGFnYWluXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoc2VsZltYSFJfU1lOQ10pIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgWEhSIGlzIHN5bmMgdGhlcmUgaXMgbm8gdGFzayB0byBzY2hlZHVsZSwganVzdCBleGVjdXRlIHRoZSBjb2RlLlxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBzZWxmLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHNlbGZbWEhSX1VSTF0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShYTUxIVFRQUkVRVUVTVF9TT1VSQ0UsIHBsYWNlaG9sZGVyQ2FsbGJhY2ssIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9PT0gdHJ1ZSAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5hYm9ydGVkICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyB4aHIgcmVxdWVzdCB0aHJvdyBlcnJvciB3aGVuIHNlbmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGludm9rZSB0YXNrIGluc3RlYWQgb2YgbGVhdmluZyBhIHNjaGVkdWxlZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIG1hY3JvVGFza1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGNvbnN0IGFib3J0TmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdhYm9ydCcsICgpID0+IGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gZmluZFBlbmRpbmdUYXNrKHNlbGYpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRhc2sgJiYgdHlwZW9mIHRhc2sudHlwZSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBYSFIgaGFzIGFscmVhZHkgY29tcGxldGVkLCBkbyBub3RoaW5nLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBYSFIgaGFzIGFscmVhZHkgYmVlbiBhYm9ydGVkLCBkbyBub3RoaW5nLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIEZpeCAjNTY5LCBjYWxsIGFib3J0IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBkb25lIHdpbGwgY2F1c2Vcblx0ICAgICAgICAgICAgICAgICAgICAvLyBtYWNyb1Rhc2sgdGFzayBjb3VudCBiZSBuZWdhdGl2ZSBudW1iZXJcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYW5jZWxGbiA9PSBudWxsIHx8ICh0YXNrLmRhdGEgJiYgdGFzay5kYXRhLmFib3J0ZWQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChab25lLmN1cnJlbnRbZmV0Y2hUYXNrQWJvcnRpbmddID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFib3J0IGlzIGNhbGxlZCBmcm9tIGZldGNoIHBvbHlmaWxsLCB3ZSBuZWVkIHRvIGNhbGwgbmF0aXZlIGFib3J0IG9mIFhIUi5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSB0cnlpbmcgdG8gYWJvcnQgYW4gWEhSIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gc2VudCwgc28gdGhlcmUgaXMgbm9cblx0ICAgICAgICAgICAgICAgIC8vIHRhc2tcblx0ICAgICAgICAgICAgICAgIC8vIHRvIGNhbmNlbC4gRG8gbm90aGluZy5cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnZ2VvbG9jYXRpb24nLCAoZ2xvYmFsKSA9PiB7XG5cdCAgICAgICAgLy8vIEdFT19MT0NBVElPTlxuXHQgICAgICAgIGlmIChnbG9iYWxbJ25hdmlnYXRvciddICYmIGdsb2JhbFsnbmF2aWdhdG9yJ10uZ2VvbG9jYXRpb24pIHtcblx0ICAgICAgICAgICAgcGF0Y2hQcm90b3R5cGUoZ2xvYmFsWyduYXZpZ2F0b3InXS5nZW9sb2NhdGlvbiwgWydnZXRDdXJyZW50UG9zaXRpb24nLCAnd2F0Y2hQb3NpdGlvbiddKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdQcm9taXNlUmVqZWN0aW9uRXZlbnQnLCAoZ2xvYmFsLCBab25lKSA9PiB7XG5cdCAgICAgICAgLy8gaGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuXHQgICAgICAgIGZ1bmN0aW9uIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcihldnROYW1lKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRUYXNrcyA9IGZpbmRFdmVudFRhc2tzKGdsb2JhbCwgZXZ0TmFtZSk7XG5cdCAgICAgICAgICAgICAgICBldmVudFRhc2tzLmZvckVhY2goKGV2ZW50VGFzaykgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgaGFzIGFkZGVkIHVuaGFuZGxlZHJlamVjdGlvbiBldmVudCBsaXN0ZW5lclxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGxpc3RlbmVyXG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID0gZ2xvYmFsWydQcm9taXNlUmVqZWN0aW9uRXZlbnQnXTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoUHJvbWlzZVJlamVjdGlvbkV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBQcm9taXNlUmVqZWN0aW9uRXZlbnQoZXZ0TmFtZSwge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogZS5wcm9taXNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBlLnJlamVjdGlvbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGFzay5pbnZva2UoZXZ0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J10pIHtcblx0ICAgICAgICAgICAgWm9uZVt6b25lU3ltYm9sKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpXSA9XG5cdCAgICAgICAgICAgICAgICBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicpO1xuXHQgICAgICAgICAgICBab25lW3pvbmVTeW1ib2woJ3JlamVjdGlvbkhhbmRsZWRIYW5kbGVyJyldID1cblx0ICAgICAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigncmVqZWN0aW9uaGFuZGxlZCcpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3F1ZXVlTWljcm90YXNrJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgcGF0Y2hRdWV1ZU1pY3JvdGFzayhnbG9iYWwsIGFwaSk7XG5cdCAgICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHBhdGNoUHJvbWlzZShab25lKSB7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnWm9uZUF3YXJlUHJvbWlzZScsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIGNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdCAgICAgICAgY29uc3QgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdCAgICAgICAgZnVuY3Rpb24gcmVhZGFibGVPYmplY3RUb1N0cmluZyhvYmopIHtcblx0ICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IubmFtZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoY2xhc3NOYW1lID8gY2xhc3NOYW1lIDogJycpICsgJzogJyArIEpTT04uc3RyaW5naWZ5KG9iaik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG9iaiA/IG9iai50b1N0cmluZygpIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IF9fc3ltYm9sX18gPSBhcGkuc3ltYm9sO1xuXHQgICAgICAgIGNvbnN0IF91bmNhdWdodFByb21pc2VFcnJvcnMgPSBbXTtcblx0ICAgICAgICBjb25zdCBpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiA9IGdsb2JhbFtfX3N5bWJvbF9fKCdESVNBQkxFX1dSQVBQSU5HX1VOQ0FVR0hUX1BST01JU0VfUkVKRUNUSU9OJyldICE9PSBmYWxzZTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG5cdCAgICAgICAgY29uc3QgY3JlYXRpb25UcmFjZSA9ICdfX2NyZWF0aW9uVHJhY2VfXyc7XG5cdCAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IgPSAoZSkgPT4ge1xuXHQgICAgICAgICAgICBpZiAoYXBpLnNob3dVbmNhdWdodEVycm9yKCkpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IGUgJiYgZS5yZWplY3Rpb247XG5cdCAgICAgICAgICAgICAgICBpZiAocmVqZWN0aW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIFByb21pc2UgcmVqZWN0aW9uOicsIHJlamVjdGlvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVqZWN0aW9uLm1lc3NhZ2UgOiByZWplY3Rpb24sICc7IFpvbmU6JywgZS56b25lLm5hbWUsICc7IFRhc2s6JywgZS50YXNrICYmIGUudGFzay5zb3VyY2UsICc7IFZhbHVlOicsIHJlamVjdGlvbiwgcmVqZWN0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyByZWplY3Rpb24uc3RhY2sgOiB1bmRlZmluZWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgYXBpLm1pY3JvdGFza0RyYWluRG9uZSA9ICgpID0+IHtcblx0ICAgICAgICAgICAgd2hpbGUgKF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB1bmNhdWdodFByb21pc2VFcnJvciA9IF91bmNhdWdodFByb21pc2VFcnJvcnMuc2hpZnQoKTtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZS5ydW5HdWFyZGVkKCgpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuY2F1Z2h0UHJvbWlzZUVycm9yLnRocm93T3JpZ2luYWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yLnJlamVjdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodFByb21pc2VFcnJvcjtcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuXHQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlcnJvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IFVOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTCA9IF9fc3ltYm9sX18oJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gaGFuZGxlVW5oYW5kbGVkUmVqZWN0aW9uKGUpIHtcblx0ICAgICAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IoZSk7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gWm9uZVtVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZm9yd2FyZFJlc29sdXRpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVqZWN0aW9uKHJlamVjdGlvbikge1xuXHQgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sU3RhdGUgPSBfX3N5bWJvbF9fKCdzdGF0ZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xGaW5hbGx5ID0gX19zeW1ib2xfXygnZmluYWxseScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VWYWx1ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VWYWx1ZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpO1xuXHQgICAgICAgIGNvbnN0IHNvdXJjZSA9ICdQcm9taXNlLnRoZW4nO1xuXHQgICAgICAgIGNvbnN0IFVOUkVTT0xWRUQgPSBudWxsO1xuXHQgICAgICAgIGNvbnN0IFJFU09MVkVEID0gdHJ1ZTtcblx0ICAgICAgICBjb25zdCBSRUpFQ1RFRCA9IGZhbHNlO1xuXHQgICAgICAgIGNvbnN0IFJFSkVDVEVEX05PX0NBVENIID0gMDtcblx0ICAgICAgICBmdW5jdGlvbiBtYWtlUmVzb2x2ZXIocHJvbWlzZSwgc3RhdGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICh2KSA9PiB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIERvIG5vdCByZXR1cm4gdmFsdWUgb3IgeW91IHdpbGwgYnJlYWsgdGhlIFByb21pc2Ugc3BlYy5cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgb25jZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgbGV0IHdhc0NhbGxlZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlcih3cmFwcGVkRnVuY3Rpb24pIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEZ1bmN0aW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgVFlQRV9FUlJPUiA9ICdQcm9taXNlIHJlc29sdmVkIHdpdGggaXRzZWxmJztcblx0ICAgICAgICBjb25zdCBDVVJSRU5UX1RBU0tfVFJBQ0VfU1lNQk9MID0gX19zeW1ib2xfXygnY3VycmVudFRhc2tUcmFjZScpO1xuXHQgICAgICAgIC8vIFByb21pc2UgUmVzb2x1dGlvblxuXHQgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2YWx1ZSkge1xuXHQgICAgICAgICAgICBjb25zdCBvbmNlV3JhcHBlciA9IG9uY2UoKTtcblx0ICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFRZUEVfRVJST1IpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgZ2V0IHZhbHVlLnRoZW4gb25jZSBiYXNlZCBvbiBwcm9taXNlIHNwZWMuXG5cdCAgICAgICAgICAgICAgICBsZXQgdGhlbiA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcblx0ICAgICAgICAgICAgICAgICAgICB9KSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBSRUpFQ1RFRCAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFN0YXRlKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFZhbHVlKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlW3N5bWJvbFN0YXRlXSAhPT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2YWx1ZVtzeW1ib2xTdGF0ZV0sIHZhbHVlW3N5bWJvbFZhbHVlXSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgZmFsc2UpKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBzdGF0ZTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sRmluYWxseV0gPT09IHN5bWJvbEZpbmFsbHkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIGlzIHJlc29sdmVkLCBzaG91bGQgaWdub3JlIHRoZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBwcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VTdGF0ZV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGFzayBpbmZvcm1hdGlvbiBpbiB2YWx1ZSB3aGVuIGVycm9yIG9jY3Vycywgc28gd2UgY2FuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2Vcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEICYmIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbG9uZ1N0YWNrVHJhY2Vab25lIGlzIGhlcmVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2UgPSBab25lLmN1cnJlbnRUYXNrICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBab25lLmN1cnJlbnRUYXNrLmRhdGEgJiZcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpvbmUuY3VycmVudFRhc2suZGF0YVtjcmVhdGlvblRyYWNlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGtlZXAgdGhlIGxvbmcgc3RhY2sgdHJhY2UgaW50byBlcnJvciB3aGVuIGluIGxvbmdTdGFja1RyYWNlWm9uZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkodmFsdWUsIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRyYWNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHByb21pc2UsIHF1ZXVlW2krK10sIHF1ZXVlW2krK10sIHF1ZXVlW2krK10sIHF1ZXVlW2krK10pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09IDAgJiYgc3RhdGUgPT0gUkVKRUNURUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBSRUpFQ1RFRF9OT19DQVRDSDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHRocm93cyBhIG5ldyBFcnJvciB0byBwcmludCBtb3JlIHJlYWRhYmxlIGVycm9yIGxvZ1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlmIHRoZSB2YWx1ZSBpcyBub3QgYW4gZXJyb3IsIHpvbmUuanMgYnVpbGRzIGFuIGBFcnJvcmBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9iamVjdCBoZXJlIHRvIGF0dGFjaCB0aGUgc3RhY2sgaW5mb3JtYXRpb24uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuY2F1Z2h0IChpbiBwcm9taXNlKTogJyArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAmJiB2YWx1ZS5zdGFjayA/ICdcXG4nICsgdmFsdWUuc3RhY2sgOiAnJykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gZXJyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZGlzYWJsZSB3cmFwcGluZyB1bmNhdWdodCBwcm9taXNlIHJlamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHdyYXBwaW5nIGl0LlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IudGhyb3dPcmlnaW5hbCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IucmVqZWN0aW9uID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnByb21pc2UgPSBwcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci56b25lID0gWm9uZS5jdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci50YXNrID0gWm9uZS5jdXJyZW50VGFzaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5wdXNoKHVuY2F1Z2h0UHJvbWlzZUVycm9yKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnNjaGVkdWxlTWljcm9UYXNrKCk7IC8vIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHJ1bm5pbmdcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gUmVzb2x2aW5nIGFuIGFscmVhZHkgcmVzb2x2ZWQgcHJvbWlzZSBpcyBhIG5vb3AuXG5cdCAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBSRUpFQ1RJT05fSEFORExFRF9IQU5ETEVSID0gX19zeW1ib2xfXygncmVqZWN0aW9uSGFuZGxlZEhhbmRsZXInKTtcblx0ICAgICAgICBmdW5jdGlvbiBjbGVhclJlamVjdGVkTm9DYXRjaChwcm9taXNlKSB7XG5cdCAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gUkVKRUNURURfTk9fQ0FUQ0gpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIG5vIGNhdGNoIHN0YXR1c1xuXHQgICAgICAgICAgICAgICAgLy8gYW5kIHF1ZXVlLmxlbmd0aCA+IDAsIG1lYW5zIHRoZXJlIGlzIGEgZXJyb3IgaGFuZGxlclxuXHQgICAgICAgICAgICAgICAgLy8gaGVyZSB0byBoYW5kbGUgdGhlIHJlamVjdGVkIHByb21pc2UsIHdlIHNob3VsZCB0cmlnZ2VyXG5cdCAgICAgICAgICAgICAgICAvLyB3aW5kb3dzLnJlamVjdGlvbmhhbmRsZWQgZXZlbnRIYW5kbGVyIG9yIG5vZGVqcyByZWplY3Rpb25IYW5kbGVkXG5cdCAgICAgICAgICAgICAgICAvLyBldmVudEhhbmRsZXJcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IFpvbmVbUkVKRUNUSU9OX0hBTkRMRURfSEFORExFUl07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIHsgcmVqZWN0aW9uOiBwcm9taXNlW3N5bWJvbFZhbHVlXSwgcHJvbWlzZTogcHJvbWlzZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7IH1cblx0ICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gUkVKRUNURUQ7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZSA9PT0gX3VuY2F1Z2h0UHJvbWlzZUVycm9yc1tpXS5wcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIF91bmNhdWdodFByb21pc2VFcnJvcnMuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZVJlc29sdmVPclJlamVjdChwcm9taXNlLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdCAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHByb21pc2UpO1xuXHQgICAgICAgICAgICBjb25zdCBwcm9taXNlU3RhdGUgPSBwcm9taXNlW3N5bWJvbFN0YXRlXTtcblx0ICAgICAgICAgICAgY29uc3QgZGVsZWdhdGUgPSBwcm9taXNlU3RhdGVcblx0ICAgICAgICAgICAgICAgID8gdHlwZW9mIG9uRnVsZmlsbGVkID09PSAnZnVuY3Rpb24nXG5cdCAgICAgICAgICAgICAgICAgICAgPyBvbkZ1bGZpbGxlZFxuXHQgICAgICAgICAgICAgICAgICAgIDogZm9yd2FyZFJlc29sdXRpb25cblx0ICAgICAgICAgICAgICAgIDogdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbidcblx0ICAgICAgICAgICAgICAgICAgICA/IG9uUmVqZWN0ZWRcblx0ICAgICAgICAgICAgICAgICAgICA6IGZvcndhcmRSZWplY3Rpb247XG5cdCAgICAgICAgICAgIHpvbmUuc2NoZWR1bGVNaWNyb1Rhc2soc291cmNlLCAoKSA9PiB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFByb21pc2VWYWx1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmluYWxseVByb21pc2UgPSAhIWNoYWluUHJvbWlzZSAmJiBzeW1ib2xGaW5hbGx5ID09PSBjaGFpblByb21pc2Vbc3ltYm9sRmluYWxseV07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluYWxseVByb21pc2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGZyb20gZmluYWxseSBjYWxsLCBrZWVwIHBhcmVudCBwcm9taXNlJ3Mgc3RhdGUgYW5kIHZhbHVlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdID0gcGFyZW50UHJvbWlzZVZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXSA9IHByb21pc2VTdGF0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBwYXNzIHZhbHVlIHRvIGZpbmFsbHkgY2FsbGJhY2tcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHpvbmUucnVuKGRlbGVnYXRlLCB1bmRlZmluZWQsIGlzRmluYWxseVByb21pc2UgJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZWplY3Rpb24gJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZXNvbHV0aW9uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgID8gW11cblx0ICAgICAgICAgICAgICAgICAgICAgICAgOiBbcGFyZW50UHJvbWlzZVZhbHVlXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCB0cnVlLCB2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMsIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoaXMgZXJyb3Jcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjaGFpblByb21pc2UsIGZhbHNlLCBlcnJvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sIGNoYWluUHJvbWlzZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkcgPSAnZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZSgpIHsgW25hdGl2ZSBjb2RlXSB9Jztcblx0ICAgICAgICBjb25zdCBub29wID0gZnVuY3Rpb24gKCkgeyB9O1xuXHQgICAgICAgIGNvbnN0IEFnZ3JlZ2F0ZUVycm9yID0gZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yO1xuXHQgICAgICAgIGNsYXNzIFpvbmVBd2FyZVByb21pc2Uge1xuXHQgICAgICAgICAgICBzdGF0aWMgdG9TdHJpbmcoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gWk9ORV9BV0FSRV9QUk9NSVNFX1RPX1NUUklORztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmVzb2x2ZSh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlUHJvbWlzZShuZXcgdGhpcyhudWxsKSwgUkVTT0xWRUQsIHZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmVqZWN0KGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVByb21pc2UobmV3IHRoaXMobnVsbCksIFJFSkVDVEVELCBlcnJvcik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RhdGljIHdpdGhSZXNvbHZlcnMoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlID0gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlamVjdCA9IHJlajtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgYW55KHZhbHVlcykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMgfHwgdHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblx0ICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHYgb2YgdmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goWm9uZUF3YXJlUHJvbWlzZS5yZXNvbHZlKHYpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9uZUF3YXJlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9taXNlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlc1tpXS50aGVuKCh2KSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmFjZSh2YWx1ZXMpIHtcblx0ICAgICAgICAgICAgICAgIGxldCByZXNvbHZlO1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlamVjdDtcblx0ICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IHRoaXMoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QgPSByZWo7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVzb2x2ZSh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZnVuY3Rpb24gb25SZWplY3QoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RoZW5hYmxlKHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVzb2x2ZSh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgYWxsKHZhbHVlcykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrKHZhbHVlcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RhdGljIGFsbFNldHRsZWQodmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBQID0gdGhpcyAmJiB0aGlzLnByb3RvdHlwZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UgPyB0aGlzIDogWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBQLmFsbFdpdGhDYWxsYmFjayh2YWx1ZXMsIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGVuQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWUgfSksXG5cdCAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjazogKGVycikgPT4gKHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVyciB9KSxcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHN0YXRpYyBhbGxXaXRoQ2FsbGJhY2sodmFsdWVzLCBjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlc29sdmU7XG5cdCAgICAgICAgICAgICAgICBsZXQgcmVqZWN0O1xuXHQgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgdGhpcygocmVzLCByZWopID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlID0gcmVzO1xuXHQgICAgICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgLy8gU3RhcnQgYXQgMiB0byBwcmV2ZW50IHByZW1hdHVyZWx5IHJlc29sdmluZyBpZiAudGhlbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkuXG5cdCAgICAgICAgICAgICAgICBsZXQgdW5yZXNvbHZlZENvdW50ID0gMjtcblx0ICAgICAgICAgICAgICAgIGxldCB2YWx1ZUluZGV4ID0gMDtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWVzID0gW107XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUodmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZXNvbHZlKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyVmFsdWVJbmRleCA9IHZhbHVlSW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudGhlbigodmFsdWUpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjay50aGVuQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZXNbY3VyVmFsdWVJbmRleF0gPSBjYWxsYmFjay5lcnJvckNhbGxiYWNrKGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBjYXRjaCAodGhlbkVycikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhlbkVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudCsrO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlSW5kZXgrKztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHVucmVzb2x2ZWRDb3VudCB6ZXJvLWJhc2VkIGFnYWluLlxuXHQgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50IC09IDI7XG5cdCAgICAgICAgICAgICAgICBpZiAodW5yZXNvbHZlZENvdW50ID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXM7XG5cdCAgICAgICAgICAgICAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgYW4gaW5zdGFuY2VvZiBQcm9taXNlLicpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBVTlJFU09MVkVEO1xuXHQgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xWYWx1ZV0gPSBbXTsgLy8gcXVldWU7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uY2VXcmFwcGVyID0gb25jZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBSRVNPTFZFRCkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgUkVKRUNURUQpKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAnUHJvbWlzZSc7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZ2V0IFtTeW1ib2wuc3BlY2llc10oKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlYWQgYFN5bWJvbC5zcGVjaWVzYCBzYWZlbHkgYmVjYXVzZSBgdGhpc2AgbWF5IGJlIGFueXRoaW5nLiBGb3IgaW5zdGFuY2UsIGB0aGlzYFxuXHQgICAgICAgICAgICAgICAgLy8gbWF5IGJlIGFuIG9iamVjdCB3aXRob3V0IGEgcHJvdG90eXBlIChjcmVhdGVkIHRocm91Z2ggYE9iamVjdC5jcmVhdGUobnVsbClgKTsgdGh1c1xuXHQgICAgICAgICAgICAgICAgLy8gYHRoaXMuY29uc3RydWN0b3JgIHdpbGwgYmUgdW5kZWZpbmVkLiBPbmUgb2YgdGhlIHVzZSBjYXNlcyBpcyBTeXN0ZW1KUyBjcmVhdGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLWxlc3Mgb2JqZWN0cyAobW9kdWxlcykgdmlhIGBPYmplY3QuY3JlYXRlKG51bGwpYC4gVGhlIFN5c3RlbUpTIGNyZWF0ZXMgYW4gZW1wdHlcblx0ICAgICAgICAgICAgICAgIC8vIG9iamVjdCBhbmQgY29waWVzIHByb21pc2UgcHJvcGVydGllcyBpbnRvIHRoYXQgb2JqZWN0ICh3aXRoaW4gdGhlIGBnZXRPckNyZWF0ZUxvYWRgXG5cdCAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbikuIFRoZSB6b25lLmpzIHRoZW4gY2hlY2tzIGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBoYXMgdGhlIGB0aGVuYCBtZXRob2QgYW5kXG5cdCAgICAgICAgICAgICAgICAvLyBpbnZva2VzIGl0IHdpdGggdGhlIGB2YWx1ZWAgY29udGV4dC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3I6IGBUeXBlRXJyb3I6XG5cdCAgICAgICAgICAgICAgICAvLyBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZCAocmVhZGluZyAnU3ltYm9sKFN5bWJvbC5zcGVjaWVzKScpYC5cblx0ICAgICAgICAgICAgICAgIGxldCBDID0gdGhpcy5jb25zdHJ1Y3Rvcj8uW1N5bWJvbC5zcGVjaWVzXTtcblx0ICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIEMgPSB0aGlzLmNvbnN0cnVjdG9yIHx8IFpvbmVBd2FyZVByb21pc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHpvbmUgPSBab25lLmN1cnJlbnQ7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpc1tzeW1ib2xTdGF0ZV0gPT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBjaGFpblByb21pc2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2F0Y2gob25SZWplY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBmaW5hbGx5KG9uRmluYWxseSkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgb24gdGhlIGNhbGwgdG8gYHRoZW5gIGFib3V0IHdoeSB0aGVlIGBTeW1ib2wuc3BlY2llc2AgaXMgc2FmZWx5IGFjY2Vzc2VkLlxuXHQgICAgICAgICAgICAgICAgbGV0IEMgPSB0aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFDIHx8IHR5cGVvZiBDICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgQyA9IFpvbmVBd2FyZVByb21pc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcblx0ICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9IHN5bWJvbEZpbmFsbHk7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXNbc3ltYm9sU3RhdGVdID09IFVOUkVTT0xWRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbFZhbHVlXS5wdXNoKHpvbmUsIGNoYWluUHJvbWlzZSwgb25GaW5hbGx5LCBvbkZpbmFsbHkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QodGhpcywgem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZpbmFsbHksIG9uRmluYWxseSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gY2hhaW5Qcm9taXNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBhZ2dyZXNzaXZlIG9wdGltaXplcnMgZHJvcHBpbmcgc2VlbWluZ2x5IHVudXNlZCBwcm9wZXJ0aWVzLlxuXHQgICAgICAgIC8vIEUuZy4gQ2xvc3VyZSBDb21waWxlciBpbiBhZHZhbmNlZCBtb2RlLlxuXHQgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3Jlc29sdmUnXSA9IFpvbmVBd2FyZVByb21pc2UucmVzb2x2ZTtcblx0ICAgICAgICBab25lQXdhcmVQcm9taXNlWydyZWplY3QnXSA9IFpvbmVBd2FyZVByb21pc2UucmVqZWN0O1xuXHQgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3JhY2UnXSA9IFpvbmVBd2FyZVByb21pc2UucmFjZTtcblx0ICAgICAgICBab25lQXdhcmVQcm9taXNlWydhbGwnXSA9IFpvbmVBd2FyZVByb21pc2UuYWxsO1xuXHQgICAgICAgIGNvbnN0IE5hdGl2ZVByb21pc2UgPSAoZ2xvYmFsW3N5bWJvbFByb21pc2VdID0gZ2xvYmFsWydQcm9taXNlJ10pO1xuXHQgICAgICAgIGdsb2JhbFsnUHJvbWlzZSddID0gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xUaGVuUGF0Y2hlZCA9IF9fc3ltYm9sX18oJ3RoZW5QYXRjaGVkJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gcGF0Y2hUaGVuKEN0b3IpIHtcblx0ICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBDdG9yLnByb3RvdHlwZTtcblx0ICAgICAgICAgICAgY29uc3QgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTtcblx0ICAgICAgICAgICAgaWYgKHByb3AgJiYgKHByb3Aud3JpdGFibGUgPT09IGZhbHNlIHx8ICFwcm9wLmNvbmZpZ3VyYWJsZSkpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGNoZWNrIEN0b3IucHJvdG90eXBlLnRoZW4gcHJvcGVydHlEZXNjcmlwdG9yIGlzIHdyaXRhYmxlIG9yIG5vdFxuXHQgICAgICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlXG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUaGVuID0gcHJvdG8udGhlbjtcblx0ICAgICAgICAgICAgLy8gS2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbWV0aG9kLlxuXHQgICAgICAgICAgICBwcm90b1tzeW1ib2xUaGVuXSA9IG9yaWdpbmFsVGhlbjtcblx0ICAgICAgICAgICAgQ3Rvci5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvblJlc29sdmUsIG9uUmVqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkID0gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGhlbi5jYWxsKHRoaXMsIHJlc29sdmUsIHJlamVjdCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIEN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXBpLnBhdGNoVGhlbiA9IHBhdGNoVGhlbjtcblx0ICAgICAgICBmdW5jdGlvbiB6b25laWZ5KGZuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlc3VsdFByb21pc2UgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblx0ICAgICAgICAgICAgICAgIGlmIChyZXN1bHRQcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGN0b3IgPSByZXN1bHRQcm9taXNlLmNvbnN0cnVjdG9yO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFjdG9yW3N5bWJvbFRoZW5QYXRjaGVkXSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhdGNoVGhlbihjdG9yKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoTmF0aXZlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICBwYXRjaFRoZW4oTmF0aXZlUHJvbWlzZSk7XG5cdCAgICAgICAgICAgIHBhdGNoTWV0aG9kKGdsb2JhbCwgJ2ZldGNoJywgKGRlbGVnYXRlKSA9PiB6b25laWZ5KGRlbGVnYXRlKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFRoaXMgaXMgbm90IHBhcnQgb2YgcHVibGljIEFQSSwgYnV0IGl0IGlzIHVzZWZ1bCBmb3IgdGVzdHMsIHNvIHdlIGV4cG9zZSBpdC5cblx0ICAgICAgICBQcm9taXNlW1pvbmUuX19zeW1ib2xfXygndW5jYXVnaHRQcm9taXNlRXJyb3JzJyldID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycztcblx0ICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hUb1N0cmluZyhab25lKSB7XG5cdCAgICAvLyBvdmVycmlkZSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgdG8gbWFrZSB6b25lLmpzIHBhdGNoZWQgZnVuY3Rpb25cblx0ICAgIC8vIGxvb2sgbGlrZSBuYXRpdmUgZnVuY3Rpb25cblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCd0b1N0cmluZycsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICAvLyBwYXRjaCBGdW5jLnByb3RvdHlwZS50b1N0cmluZyB0byBsZXQgdGhlbSBsb29rIGxpa2UgbmF0aXZlXG5cdCAgICAgICAgY29uc3Qgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuXHQgICAgICAgIGNvbnN0IE9SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ09yaWdpbmFsRGVsZWdhdGUnKTtcblx0ICAgICAgICBjb25zdCBQUk9NSVNFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ1Byb21pc2UnKTtcblx0ICAgICAgICBjb25zdCBFUlJPUl9TWU1CT0wgPSB6b25lU3ltYm9sKCdFcnJvcicpO1xuXHQgICAgICAgIGNvbnN0IG5ld0Z1bmN0aW9uVG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlbGVnYXRlID0gdGhpc1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsRGVsZWdhdGUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnaW5hbERlbGVnYXRlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZVByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVQcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVQcm9taXNlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gRXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVFcnJvciA9IGdsb2JhbFtFUlJPUl9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVFcnJvcikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwobmF0aXZlRXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBuZXdGdW5jdGlvblRvU3RyaW5nW09SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTF0gPSBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmc7XG5cdCAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbmV3RnVuY3Rpb25Ub1N0cmluZztcblx0ICAgICAgICAvLyBwYXRjaCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIHRvIGxldCB0aGVtIGxvb2sgbGlrZSBuYXRpdmVcblx0ICAgICAgICBjb25zdCBvcmlnaW5hbE9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0ICAgICAgICBjb25zdCBQUk9NSVNFX09CSkVDVF9UT19TVFJJTkcgPSAnW29iamVjdCBQcm9taXNlXSc7XG5cdCAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nICYmIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDYWxsYmFja3MoYXBpLCB0YXJnZXQsIHRhcmdldE5hbWUsIG1ldGhvZCwgY2FsbGJhY2tzKSB7XG5cdCAgICBjb25zdCBzeW1ib2wgPSBab25lLl9fc3ltYm9sX18obWV0aG9kKTtcblx0ICAgIGlmICh0YXJnZXRbc3ltYm9sXSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG5hdGl2ZURlbGVnYXRlID0gKHRhcmdldFtzeW1ib2xdID0gdGFyZ2V0W21ldGhvZF0pO1xuXHQgICAgdGFyZ2V0W21ldGhvZF0gPSBmdW5jdGlvbiAobmFtZSwgb3B0cywgb3B0aW9ucykge1xuXHQgICAgICAgIGlmIChvcHRzICYmIG9wdHMucHJvdG90eXBlKSB7XG5cdCAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYCR7dGFyZ2V0TmFtZX0uJHttZXRob2R9OjpgICsgY2FsbGJhY2s7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBvcHRzLnByb3RvdHlwZTtcblx0ICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSBgcGF0Y2hDYWxsYmFja3NgIGlzIHVzZWQgZm9yIHBhdGNoaW5nIHRoZSBgZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50YCBhbmRcblx0ICAgICAgICAgICAgICAgIC8vIGBjdXN0b21FbGVtZW50cy5kZWZpbmVgLiBXZSBleHBsaWNpdGx5IHdyYXAgdGhlIHBhdGNoaW5nIGNvZGUgaW50byB0cnktY2F0Y2ggc2luY2Vcblx0ICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBtYXkgYmUgYWxyZWFkeSBwYXRjaGVkIGJ5IG90aGVyIHdlYiBjb21wb25lbnRzIGZyYW1ld29ya3MgKGUuZy4gTFdDKSwgYW5kIHRoZXlcblx0ICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhvc2UgcHJvcGVydGllcyBub24td3JpdGFibGUuIFRoaXMgbWVhbnMgdGhhdCBwYXRjaGluZyBjYWxsYmFjayB3aWxsIHRocm93IGFuIGVycm9yXG5cdCAgICAgICAgICAgICAgICAvLyBgY2Fubm90IGFzc2lnbiB0byByZWFkLW9ubHkgcHJvcGVydHlgLiBTZWUgdGhpcyBjb2RlIGFzIGFuIGV4YW1wbGU6XG5cdCAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2FsZXNmb3JjZS9sd2MvYmxvYi9tYXN0ZXIvcGFja2FnZXMvQGx3Yy9lbmdpbmUtY29yZS9zcmMvZnJhbWV3b3JrL2Jhc2UtYnJpZGdlLWVsZW1lbnQudHMjTDE4MC1MMTg2XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHN0b3AgdGhlIGFwcGxpY2F0aW9uIHJlbmRlcmluZyBpZiB3ZSBjb3VsZG4ndCBwYXRjaCBzb21lXG5cdCAgICAgICAgICAgICAgICAvLyBjYWxsYmFjaywgZS5nLiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYC5cblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBjYWxsYmFjayk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShkZXNjcmlwdG9yLnZhbHVlLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpLl9yZWRlZmluZVByb3BlcnR5KG9wdHMucHJvdG90eXBlLCBjYWxsYmFjaywgZGVzY3JpcHRvcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlW2NhbGxiYWNrXSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKHByb3RvdHlwZVtjYWxsYmFja10sIHNvdXJjZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3R5cGVbY2FsbGJhY2tdID0gYXBpLndyYXBXaXRoQ3VycmVudFpvbmUocHJvdG90eXBlW2NhbGxiYWNrXSwgc291cmNlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgbGVhdmUgdGhlIGNhdGNoIGJsb2NrIGVtcHR5IHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGhhbmRsZSB0aGUgZXJyb3IgcmVsYXRlZFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRvIG5vbi13cml0YWJsZSBwcm9wZXJ0eS5cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBuYXRpdmVEZWxlZ2F0ZS5jYWxsKHRhcmdldCwgbmFtZSwgb3B0cywgb3B0aW9ucyk7XG5cdCAgICB9O1xuXHQgICAgYXBpLmF0dGFjaE9yaWdpblRvUGF0Y2hlZCh0YXJnZXRbbWV0aG9kXSwgbmF0aXZlRGVsZWdhdGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hVdGlsKFpvbmUpIHtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCd1dGlsJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgLy8gQ29sbGVjdCBuYXRpdmUgZXZlbnQgbmFtZXMgYnkgbG9va2luZyBhdCBwcm9wZXJ0aWVzXG5cdCAgICAgICAgLy8gb24gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGUuZy4gJ29uY2xpY2snLlxuXHQgICAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSBnZXRPbkV2ZW50TmFtZXMoZ2xvYmFsKTtcblx0ICAgICAgICBhcGkucGF0Y2hPblByb3BlcnRpZXMgPSBwYXRjaE9uUHJvcGVydGllcztcblx0ICAgICAgICBhcGkucGF0Y2hNZXRob2QgPSBwYXRjaE1ldGhvZDtcblx0ICAgICAgICBhcGkuYmluZEFyZ3VtZW50cyA9IGJpbmRBcmd1bWVudHM7XG5cdCAgICAgICAgYXBpLnBhdGNoTWFjcm9UYXNrID0gcGF0Y2hNYWNyb1Rhc2s7XG5cdCAgICAgICAgLy8gSW4gZWFybGllciB2ZXJzaW9uIG9mIHpvbmUuanMgKDwwLjkuMCksIHdlIHVzZSBlbnYgbmFtZSBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2Bcblx0ICAgICAgICAvLyB0byBkZWZpbmUgd2hpY2ggZXZlbnRzIHdpbGwgbm90IGJlIHBhdGNoZWQgYnkgYFpvbmUuanNgLiBJbiBuZXdlciB2ZXJzaW9uICg+PTAuOS4wKSwgd2Vcblx0ICAgICAgICAvLyBjaGFuZ2UgdGhlIGVudiBuYW1lIHRvIGBfX3pvbmVfc3ltYm9sX19VTlBBVENIRURfRVZFTlRTYCB0byBrZWVwIHRoZSBuYW1lIGNvbnNpc3RlbnQgd2l0aFxuXHQgICAgICAgIC8vIGFuZ3VsYXIgcmVwby4gVGhlICBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2AgaXMgZGVwcmVjYXRlZCwgYnV0IGl0IGlzIHN0aWxsIGJlXG5cdCAgICAgICAgLy8gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblx0ICAgICAgICBjb25zdCBTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnQkxBQ0tfTElTVEVEX0VWRU5UUycpO1xuXHQgICAgICAgIGNvbnN0IFNZTUJPTF9VTlBBVENIRURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdVTlBBVENIRURfRVZFTlRTJyk7XG5cdCAgICAgICAgaWYgKGdsb2JhbFtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU10pIHtcblx0ICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSA9IGdsb2JhbFtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChnbG9iYWxbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdKSB7XG5cdCAgICAgICAgICAgIFpvbmVbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdID0gWm9uZVtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU10gPVxuXHQgICAgICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUgPSBwYXRjaEV2ZW50UHJvdG90eXBlO1xuXHQgICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0ID0gcGF0Y2hFdmVudFRhcmdldDtcblx0ICAgICAgICBhcGkuaXNJRU9yRWRnZSA9IGlzSUVPckVkZ2U7XG5cdCAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5ID0gT2JqZWN0RGVmaW5lUHJvcGVydHk7XG5cdCAgICAgICAgYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblx0ICAgICAgICBhcGkuT2JqZWN0Q3JlYXRlID0gT2JqZWN0Q3JlYXRlO1xuXHQgICAgICAgIGFwaS5BcnJheVNsaWNlID0gQXJyYXlTbGljZTtcblx0ICAgICAgICBhcGkucGF0Y2hDbGFzcyA9IHBhdGNoQ2xhc3M7XG5cdCAgICAgICAgYXBpLndyYXBXaXRoQ3VycmVudFpvbmUgPSB3cmFwV2l0aEN1cnJlbnRab25lO1xuXHQgICAgICAgIGFwaS5maWx0ZXJQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllcztcblx0ICAgICAgICBhcGkuYXR0YWNoT3JpZ2luVG9QYXRjaGVkID0gYXR0YWNoT3JpZ2luVG9QYXRjaGVkO1xuXHQgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblx0ICAgICAgICBhcGkucGF0Y2hDYWxsYmFja3MgPSBwYXRjaENhbGxiYWNrcztcblx0ICAgICAgICBhcGkuZ2V0R2xvYmFsT2JqZWN0cyA9ICgpID0+ICh7XG5cdCAgICAgICAgICAgIGdsb2JhbFNvdXJjZXMsXG5cdCAgICAgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzLFxuXHQgICAgICAgICAgICBldmVudE5hbWVzLFxuXHQgICAgICAgICAgICBpc0Jyb3dzZXIsXG5cdCAgICAgICAgICAgIGlzTWl4LFxuXHQgICAgICAgICAgICBpc05vZGUsXG5cdCAgICAgICAgICAgIFRSVUVfU1RSLFxuXHQgICAgICAgICAgICBGQUxTRV9TVFIsXG5cdCAgICAgICAgICAgIFpPTkVfU1lNQk9MX1BSRUZJWCxcblx0ICAgICAgICAgICAgQUREX0VWRU5UX0xJU1RFTkVSX1NUUixcblx0ICAgICAgICAgICAgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUixcblx0ICAgICAgICB9KTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDb21tb24oWm9uZSkge1xuXHQgICAgcGF0Y2hQcm9taXNlKFpvbmUpO1xuXHQgICAgcGF0Y2hUb1N0cmluZyhab25lKTtcblx0ICAgIHBhdGNoVXRpbChab25lKTtcblx0fVxuXG5cdGNvbnN0IFpvbmUkMSA9IGxvYWRab25lKCk7XG5cdHBhdGNoQ29tbW9uKFpvbmUkMSk7XG5cdHBhdGNoQnJvd3Nlcihab25lJDEpO1xuXHRyZXR1cm4gem9uZTtcbn1cblxucmVxdWlyZVpvbmUoKTtcblxuZXhwb3J0IHsgWm9uZUNvbnRleHRNYW5hZ2VyIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxVQUFvQjtBQXNCbEMsU0FBU0MsR0FBaUJDLEdBQUs7QUFDM0IsU0FBSUEsTUFBUSxXQUFVQSxJQUFNLENBQUMsSUFDckIsT0FBT0EsRUFBSSxvQkFBcUIsY0FDcEMsT0FBT0EsRUFBSSx1QkFBd0I7QUFDM0M7QUFtQkEsSUFBSUMsS0FBbUIsbUJBVW5CQztBQUFBO0FBQUEsRUFBb0MsV0FBWTtBQUNoRCxhQUFTQSxJQUFxQjtBQUkxQixXQUFLLFdBQVcsSUFJaEIsS0FBSyxlQUFlO0FBQUEsSUFDeEI7QUFLQSxXQUFBQSxFQUFtQixVQUFVLHlCQUF5QixTQUFVQyxHQUFZO0FBQ3hFLGFBQVFBLEtBQWNBLEVBQVcsSUFB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WSIsICJab25lQ29udGV4dE1hbmFnZXIiLCAiYWN0aXZlWm9uZSIsICJjb250ZXh0IiwgInRhcmdldCIsICJtYW5hZ2VyIiwgImNvbnRleHRXcmFwcGVyIiwgIl90aGlzIiwgImFyZ3MiLCAiX2kiLCAicmFuZG9tIiwgInpvbmVOYW1lIiwgIl9hIiwgIm9yaWdpbmFsIiwgImNvbnRleHRNYW5hZ2VyIiwgImV2ZW50IiwgImxpc3RlbmVyIiwgIm9wdHMiLCAibGlzdGVuZXJzIiwgInBhdGNoZWRMaXN0ZW5lciIsICJldmVudHMiLCAiYWN0aXZlIiwgImZuIiwgInRoaXNBcmciLCAibmV3Wm9uZSIsICJ6b25lIiwgImhhc1JlcXVpcmVkWm9uZSIsICJyZXF1aXJlWm9uZSIsICJnbG9iYWwiLCAiX19zeW1ib2xfXyIsICJuYW1lIiwgImluaXRab25lIiwgInBlcmZvcm1hbmNlIiwgIm1hcmsiLCAicGVyZm9ybWFuY2VNZWFzdXJlIiwgImxhYmVsIiwgIlpvbmVJbXBsIiwgInBhdGNoZXMiLCAiX2N1cnJlbnRab25lRnJhbWUiLCAiX2N1cnJlbnRUYXNrIiwgImlnbm9yZUR1cGxpY2F0ZSIsICJjaGVja0R1cGxpY2F0ZSIsICJwZXJmTmFtZSIsICJfYXBpIiwgInBhcmVudCIsICJ6b25lU3BlYyIsICJfWm9uZURlbGVnYXRlIiwgImtleSIsICJjdXJyZW50IiwgImNhbGxiYWNrIiwgInNvdXJjZSIsICJfY2FsbGJhY2siLCAiYXBwbHlUaGlzIiwgImFwcGx5QXJncyIsICJlcnJvciIsICJ0YXNrIiwgIk5PX1pPTkUiLCAiem9uZVRhc2siLCAidHlwZSIsICJpc1BlcmlvZGljIiwgImlzUmVmcmVzaGFibGUiLCAibm90U2NoZWR1bGVkIiwgImV2ZW50VGFzayIsICJtYWNyb1Rhc2siLCAicmVFbnRyeUd1YXJkIiwgInJ1bm5pbmciLCAic2NoZWR1bGVkIiwgInByZXZpb3VzVGFzayIsICJzdGF0ZSIsICJ1bmtub3duIiwgInNjaGVkdWxpbmciLCAiem9uZURlbGVnYXRlcyIsICJlcnIiLCAiZGF0YSIsICJjdXN0b21TY2hlZHVsZSIsICJab25lVGFzayIsICJtaWNyb1Rhc2siLCAiY3VzdG9tQ2FuY2VsIiwgImNhbmNlbGluZyIsICJjb3VudCIsICJpIiwgIkRFTEVHQVRFX1pTIiwgImRlbGVnYXRlIiwgIl8iLCAiaGFzVGFza1N0YXRlIiwgInBhcmVudERlbGVnYXRlIiwgInpvbmVTcGVjSGFzVGFzayIsICJwYXJlbnRIYXNUYXNrIiwgInRhcmdldFpvbmUiLCAicmV0dXJuVGFzayIsICJzY2hlZHVsZU1pY3JvVGFzayIsICJ2YWx1ZSIsICJpc0VtcHR5IiwgImNvdW50cyIsICJwcmV2IiwgIm5leHQiLCAib3B0aW9ucyIsICJzY2hlZHVsZUZuIiwgImNhbmNlbEZuIiwgInNlbGYiLCAiX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyIsICJkcmFpbk1pY3JvVGFza1F1ZXVlIiwgInRvU3RhdGUiLCAiZnJvbVN0YXRlMSIsICJmcm9tU3RhdGUyIiwgInN5bWJvbFNldFRpbWVvdXQiLCAic3ltYm9sUHJvbWlzZSIsICJzeW1ib2xUaGVuIiwgIl9taWNyb1Rhc2tRdWV1ZSIsICJfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlIiwgIm5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSIsICJuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayIsICJmdW5jIiwgIm5hdGl2ZVRoZW4iLCAicXVldWUiLCAibm9vcCIsICJsb2FkWm9uZSIsICJPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0RGVmaW5lUHJvcGVydHkiLCAiT2JqZWN0R2V0UHJvdG90eXBlT2YiLCAiT2JqZWN0Q3JlYXRlIiwgIkFycmF5U2xpY2UiLCAiQUREX0VWRU5UX0xJU1RFTkVSX1NUUiIsICJSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSIiwgIlpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiIsICJaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVIiLCAiVFJVRV9TVFIiLCAiRkFMU0VfU1RSIiwgIlpPTkVfU1lNQk9MX1BSRUZJWCIsICJ3cmFwV2l0aEN1cnJlbnRab25lIiwgInNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lIiwgInpvbmVTeW1ib2wiLCAiaXNXaW5kb3dFeGlzdHMiLCAiaW50ZXJuYWxXaW5kb3ciLCAiX2dsb2JhbCIsICJSRU1PVkVfQVRUUklCVVRFIiwgImJpbmRBcmd1bWVudHMiLCAicGF0Y2hQcm90b3R5cGUiLCAicHJvdG90eXBlIiwgImZuTmFtZXMiLCAicHJvdG90eXBlRGVzYyIsICJpc1Byb3BlcnR5V3JpdGFibGUiLCAicGF0Y2hlZCIsICJhdHRhY2hPcmlnaW5Ub1BhdGNoZWQiLCAicHJvcGVydHlEZXNjIiwgImlzV2ViV29ya2VyIiwgImlzTm9kZSIsICJpc0Jyb3dzZXIiLCAiaXNNaXgiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMkMSIsICJlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2wiLCAid3JhcEZuIiwgImV2ZW50TmFtZVN5bWJvbCIsICJyZXN1bHQiLCAiZXJyb3JFdmVudCIsICJwYXRjaFByb3BlcnR5IiwgInByb3AiLCAiZGVzYyIsICJvblByb3BQYXRjaGVkU3ltYm9sIiwgIm9yaWdpbmFsRGVzY0dldCIsICJvcmlnaW5hbERlc2NTZXQiLCAiZXZlbnROYW1lIiwgIm5ld1ZhbHVlIiwgInBhdGNoT25Qcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiLCAib25Qcm9wZXJ0aWVzIiwgImoiLCAib3JpZ2luYWxJbnN0YW5jZUtleSIsICJwYXRjaENsYXNzIiwgImNsYXNzTmFtZSIsICJPcmlnaW5hbENsYXNzIiwgImEiLCAiaW5zdGFuY2UiLCAicGF0Y2hNZXRob2QiLCAicGF0Y2hGbiIsICJwcm90byIsICJkZWxlZ2F0ZU5hbWUiLCAicGF0Y2hEZWxlZ2F0ZSIsICJwYXRjaE1hY3JvVGFzayIsICJmdW5jTmFtZSIsICJtZXRhQ3JlYXRvciIsICJzZXROYXRpdmUiLCAic2NoZWR1bGVUYXNrIiwgIm1ldGEiLCAiaXNEZXRlY3RlZElFT3JFZGdlIiwgImllT3JFZGdlIiwgImlzSUVPckVkZ2UiLCAidWEiLCAiaXNGdW5jdGlvbiIsICJpc051bWJlciIsICJPUFRJTUlaRURfWk9ORV9FVkVOVF9UQVNLX0RBVEEiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMiLCAiZ2xvYmFsU291cmNlcyIsICJFVkVOVF9OQU1FX1NZTUJPTF9SRUdYIiwgIklNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0wiLCAicHJlcGFyZUV2ZW50TmFtZXMiLCAiZXZlbnROYW1lVG9TdHJpbmciLCAiZmFsc2VFdmVudE5hbWUiLCAidHJ1ZUV2ZW50TmFtZSIsICJzeW1ib2wiLCAic3ltYm9sQ2FwdHVyZSIsICJwYXRjaEV2ZW50VGFyZ2V0IiwgImFwaSIsICJhcGlzIiwgInBhdGNoT3B0aW9ucyIsICJBRERfRVZFTlRfTElTVEVORVIiLCAiUkVNT1ZFX0VWRU5UX0xJU1RFTkVSIiwgIkxJU1RFTkVSU19FVkVOVF9MSVNURU5FUiIsICJSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUiIsICJ6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lciIsICJBRERfRVZFTlRfTElTVEVORVJfU09VUkNFIiwgIlBSRVBFTkRfRVZFTlRfTElTVEVORVIiLCAiUFJFUEVORF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UiLCAiaW52b2tlVGFzayIsICJnbG9iYWxDYWxsYmFjayIsICJpc0NhcHR1cmUiLCAidGFza3MiLCAiZXJyb3JzIiwgImNvcHlUYXNrcyIsICJnbG9iYWxab25lQXdhcmVDYWxsYmFjayIsICJnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2siLCAicGF0Y2hFdmVudFRhcmdldE1ldGhvZHMiLCAidXNlR2xvYmFsQ2FsbGJhY2siLCAidmFsaWRhdGVIYW5kbGVyIiwgInJldHVyblRhcmdldCIsICJ0YXNrRGF0YSIsICJuYXRpdmVBZGRFdmVudExpc3RlbmVyIiwgIm5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIiLCAibmF0aXZlTGlzdGVuZXJzIiwgIm5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyIsICJuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciIsICJidWlsZEV2ZW50TGlzdGVuZXJPcHRpb25zIiwgInBhc3NpdmUiLCAiY3VzdG9tU2NoZWR1bGVHbG9iYWwiLCAiY3VzdG9tQ2FuY2VsR2xvYmFsIiwgInN5bWJvbEV2ZW50TmFtZXMiLCAic3ltYm9sRXZlbnROYW1lIiwgImV4aXN0aW5nVGFza3MiLCAiY3VzdG9tU2NoZWR1bGVOb25HbG9iYWwiLCAiY3VzdG9tU2NoZWR1bGVQcmVwZW5kIiwgImN1c3RvbUNhbmNlbE5vbkdsb2JhbCIsICJjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZSIsICJ0eXBlT2ZEZWxlZ2F0ZSIsICJjb21wYXJlIiwgInVucGF0Y2hlZEV2ZW50cyIsICJwYXNzaXZlRXZlbnRzIiwgImNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyIsICJuZXdPcHRpb25zIiwgIm1ha2VBZGRMaXN0ZW5lciIsICJuYXRpdmVMaXN0ZW5lciIsICJhZGRTb3VyY2UiLCAiY3VzdG9tU2NoZWR1bGVGbiIsICJjdXN0b21DYW5jZWxGbiIsICJwcmVwZW5kIiwgImlzRXZlbnRMaXN0ZW5lck9iamVjdCIsICJzaWduYWwiLCAiY2FwdHVyZSIsICJvbmNlIiwgImlzRXhpc3RpbmciLCAiY29uc3RydWN0b3JOYW1lIiwgInRhcmdldFNvdXJjZSIsICJvbkFib3J0IiwgImV4aXN0aW5nVGFzayIsICJvblByb3BlcnR5U3ltYm9sIiwgImZpbmRFdmVudFRhc2tzIiwgInN5bWJvbENhcHR1cmVFdmVudE5hbWUiLCAiY2FwdHVyZVRhc2tzIiwgInJlbW92ZVRhc2tzIiwgImtleXMiLCAibWF0Y2giLCAiZXZ0TmFtZSIsICJyZXN1bHRzIiwgImZvdW5kVGFza3MiLCAiY2FwdHVyZUZhbHNlVGFza3MiLCAiY2FwdHVyZVRydWVUYXNrcyIsICJwYXRjaEV2ZW50UHJvdG90eXBlIiwgIkV2ZW50IiwgInBhdGNoUXVldWVNaWNyb3Rhc2siLCAidGFza1N5bWJvbCIsICJwYXRjaFRpbWVyIiwgIndpbmRvdyIsICJzZXROYW1lIiwgImNhbmNlbE5hbWUiLCAibmFtZVN1ZmZpeCIsICJjbGVhck5hdGl2ZSIsICJ0YXNrc0J5SGFuZGxlSWQiLCAiaGFuZGxlT3JJZCIsICJjbGVhclRhc2siLCAiaGFuZGxlIiwgImhhbmRsZUlkIiwgIm9yaWdpbmFsUmVmcmVzaCIsICJpZCIsICJwYXRjaEN1c3RvbUVsZW1lbnRzIiwgImNhbGxiYWNrcyIsICJldmVudFRhcmdldFBhdGNoIiwgImV2ZW50TmFtZXMiLCAiRVZFTlRfVEFSR0VUIiwgInBhdGNoRXZlbnQiLCAiZmlsdGVyUHJvcGVydGllcyIsICJpZ25vcmVQcm9wZXJ0aWVzIiwgInRpcCIsICJpcCIsICJ0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzIiwgIm9wIiwgInBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzIiwgImZpbHRlcmVkUHJvcGVydGllcyIsICJnZXRPbkV2ZW50TmFtZXMiLCAicHJvcGVydHlEZXNjcmlwdG9yUGF0Y2giLCAicGF0Y2hUYXJnZXRzIiwgImlnbm9yZUVycm9yUHJvcGVydGllcyIsICJwYXRjaEJyb3dzZXIiLCAiWm9uZSIsICJsZWdhY3lQYXRjaCIsICJjbGVhciIsICJibG9ja2luZ01ldGhvZHMiLCAicyIsICJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IiwgInBhdGNoWEhSIiwgIlhIUl9UQVNLIiwgIlhIUl9TWU5DIiwgIlhIUl9MSVNURU5FUiIsICJYSFJfU0NIRURVTEVEIiwgIlhIUl9VUkwiLCAiWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQiLCAiWE1MSHR0cFJlcXVlc3QiLCAiWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUiLCAiZmluZFBlbmRpbmdUYXNrIiwgIm9yaUFkZExpc3RlbmVyIiwgIm9yaVJlbW92ZUxpc3RlbmVyIiwgIlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUiLCAiUkVBRFlfU1RBVEVfQ0hBTkdFIiwgIlNDSEVEVUxFRCIsICJuZXdMaXN0ZW5lciIsICJsb2FkVGFza3MiLCAib3JpSW52b2tlIiwgInNlbmROYXRpdmUiLCAicGxhY2Vob2xkZXJDYWxsYmFjayIsICJhYm9ydE5hdGl2ZSIsICJvcGVuTmF0aXZlIiwgIlhNTEhUVFBSRVFVRVNUX1NPVVJDRSIsICJmZXRjaFRhc2tBYm9ydGluZyIsICJmZXRjaFRhc2tTY2hlZHVsaW5nIiwgImZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIsICJlIiwgIlByb21pc2VSZWplY3Rpb25FdmVudCIsICJldnQiLCAicGF0Y2hQcm9taXNlIiwgInJlYWRhYmxlT2JqZWN0VG9TdHJpbmciLCAiX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyIsICJpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiIsICJjcmVhdGlvblRyYWNlIiwgInJlamVjdGlvbiIsICJ1bmNhdWdodFByb21pc2VFcnJvciIsICJoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24iLCAiVU5IQU5ETEVEX1BST01JU0VfUkVKRUNUSU9OX0hBTkRMRVJfU1lNQk9MIiwgImhhbmRsZXIiLCAiaXNUaGVuYWJsZSIsICJmb3J3YXJkUmVzb2x1dGlvbiIsICJmb3J3YXJkUmVqZWN0aW9uIiwgIlpvbmVBd2FyZVByb21pc2UiLCAic3ltYm9sU3RhdGUiLCAic3ltYm9sVmFsdWUiLCAic3ltYm9sRmluYWxseSIsICJzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWUiLCAic3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlIiwgIlVOUkVTT0xWRUQiLCAiUkVTT0xWRUQiLCAiUkVKRUNURUQiLCAiUkVKRUNURURfTk9fQ0FUQ0giLCAibWFrZVJlc29sdmVyIiwgInByb21pc2UiLCAidiIsICJyZXNvbHZlUHJvbWlzZSIsICJ3YXNDYWxsZWQiLCAid3JhcHBlZEZ1bmN0aW9uIiwgIlRZUEVfRVJST1IiLCAiQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCIsICJvbmNlV3JhcHBlciIsICJ0aGVuIiwgImNsZWFyUmVqZWN0ZWROb0NhdGNoIiwgInRyYWNlIiwgInNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0IiwgIlJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIiLCAiY2hhaW5Qcm9taXNlIiwgIm9uRnVsZmlsbGVkIiwgIm9uUmVqZWN0ZWQiLCAicHJvbWlzZVN0YXRlIiwgInBhcmVudFByb21pc2VWYWx1ZSIsICJpc0ZpbmFsbHlQcm9taXNlIiwgIlpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkciLCAiQWdncmVnYXRlRXJyb3IiLCAicmVzIiwgInJlaiIsICJ2YWx1ZXMiLCAicHJvbWlzZXMiLCAiZmluaXNoZWQiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAib25SZXNvbHZlIiwgIm9uUmVqZWN0IiwgInVucmVzb2x2ZWRDb3VudCIsICJ2YWx1ZUluZGV4IiwgInJlc29sdmVkVmFsdWVzIiwgImN1clZhbHVlSW5kZXgiLCAidGhlbkVyciIsICJleGVjdXRvciIsICJDIiwgIm9uRmluYWxseSIsICJOYXRpdmVQcm9taXNlIiwgInN5bWJvbFRoZW5QYXRjaGVkIiwgInBhdGNoVGhlbiIsICJDdG9yIiwgIm9yaWdpbmFsVGhlbiIsICJ6b25laWZ5IiwgInJlc3VsdFByb21pc2UiLCAiY3RvciIsICJwYXRjaFRvU3RyaW5nIiwgIm9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyIsICJPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wiLCAiUFJPTUlTRV9TWU1CT0wiLCAiRVJST1JfU1lNQk9MIiwgIm5ld0Z1bmN0aW9uVG9TdHJpbmciLCAib3JpZ2luYWxEZWxlZ2F0ZSIsICJuYXRpdmVQcm9taXNlIiwgIm5hdGl2ZUVycm9yIiwgIm9yaWdpbmFsT2JqZWN0VG9TdHJpbmciLCAiUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HIiwgInBhdGNoQ2FsbGJhY2tzIiwgInRhcmdldE5hbWUiLCAibWV0aG9kIiwgIm5hdGl2ZURlbGVnYXRlIiwgImRlc2NyaXB0b3IiLCAicGF0Y2hVdGlsIiwgIlNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTIiwgIlNZTUJPTF9VTlBBVENIRURfRVZFTlRTIiwgInBhdGNoQ29tbW9uIiwgIlpvbmUkMSJdCn0K
|
|
1619
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBrfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFIgYXMgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lciBmdW5jdGlvbnMgdGhlbiBpdCB3aWxsIHJldHVybiB0cnVlLlxuICogR2VuZXJhbGx5IG9ubHkgY2FsbGVkIHdpdGggYSBgVGFyZ2V0V2l0aEV2ZW50c2AgYnV0IG1heSBiZSBjYWxsZWQgd2l0aCBhbiB1bmtub3duIC8gYW55LlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzTGlzdGVuZXJPYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gdm9pZCAwKSB7IG9iaiA9IHt9OyB9XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG9iai5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiem9uZS5qc1wiIC8+XG4vKiBLZXkgbmFtZSB0byBiZSB1c2VkIHRvIHNhdmUgYSBjb250ZXh0IHJlZmVyZW5jZSBpbiBab25lICovXG52YXIgWk9ORV9DT05URVhUX0tFWSA9ICdPVF9aT05FX0NPTlRFWFQnO1xuLyoqXG4gKiBab25lQ29udGV4dE1hbmFnZXJcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGVhc3kgZnVuY3Rpb25hbGl0eSBmb3IgdHJhY2luZyBhY3Rpb24gYmV0d2VlbiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbiB3ZWIuXG4gKiBJdCB3YXMgbm90IHBvc3NpYmxlIHdpdGggc3RhbmRhcmQgW1N0YWNrQ29udGV4dE1hbmFnZXJde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvbWFpbi9wYWNrYWdlcy9vcGVudGVsZW1ldHJ5LXNkay10cmFjZS13ZWIvc3JjL1N0YWNrQ29udGV4dE1hbmFnZXIudHN9LlxuICogSXQgaGVhdmlseSBkZXBlbmRzIG9uIFt6b25lLmpzXXtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS96b25lLmpzfS5cbiAqIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgY29udGV4dCBpbiB6b25lLiBFYWNoIENvbnRleHQgd2lsbCBoYXZlIGFsd2F5cyBuZXcgWm9uZTtcbiAqIEl0IGFsc28gc3VwcG9ydHMgYmluZGluZyBhIGNlcnRhaW4gU3BhbiB0byBhIHRhcmdldCB0aGF0IGhhcyBcImFkZEV2ZW50TGlzdGVuZXJcIiBhbmQgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIuXG4gKiBXaGVuIHRoaXMgaGFwcGVucyBhIG5ldyB6b25lIGlzIGJlaW5nIGNyZWF0ZWQgYW5kIHRoZSBwcm92aWRlZCBTcGFuIGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgem9uZS5cbiAqL1xudmFyIFpvbmVDb250ZXh0TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBab25lQ29udGV4dE1hbmFnZXIoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBjb250ZXh0IG1hbmFnZXIgaXMgZW5hYmxlZCBvciBub3RcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhlbHBzIHRvIGNyZWF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgem9uZXMgLSBwYXJ0IG9mIHpvbmUgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY29udGV4dCBmcm9tIGNlcnRhaW4gem9uZSBuYW1lXG4gICAgICogQHBhcmFtIGFjdGl2ZVpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9hY3RpdmVDb250ZXh0RnJvbVpvbmUgPSBmdW5jdGlvbiAoYWN0aXZlWm9uZSkge1xuICAgICAgICByZXR1cm4gKGFjdGl2ZVpvbmUgJiYgYWN0aXZlWm9uZS5nZXQoWk9ORV9DT05URVhUX0tFWSkpIHx8IFJPT1RfQ09OVEVYVDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRhcmdldCBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB0YXJnZXQgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBjb250ZXh0XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9iaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtYW5hZ2VyID0gdGhpcztcbiAgICAgICAgdmFyIGNvbnRleHRXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLndpdGgoY29udGV4dCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFyZ2V0LmFwcGx5KF90aGlzLCBhcmdzKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0V3JhcHBlciwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRhcmdldC5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dFdyYXBwZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGJpbmQgdG8gdGFyZ2V0XG4gICAgICogQHBhcmFtIG9iaiB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBsaXN0ZW5lcnMgd2lsbCBiZSBwYXRjaGVkXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fYmluZExpc3RlbmVyID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iaikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gb2JqO1xuICAgICAgICBpZiAodGFyZ2V0Ll9fb3RfbGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hBZGRFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hSZW1vdmVFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSB6b25lIG5hbWVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIrKztcbiAgICAgICAgdmFyIHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl96b25lQ291bnRlciArIFwiLVwiICsgcmFuZG9tO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB6b25lXG4gICAgICogQHBhcmFtIHpvbmVOYW1lIHpvbmUgbmFtZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgYmluZCB3aXRoIFpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lID0gZnVuY3Rpb24gKHpvbmVOYW1lLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5mb3JrKHtcbiAgICAgICAgICAgIG5hbWU6IHpvbmVOYW1lLFxuICAgICAgICAgICAgcHJvcGVydGllczogKF9hID0ge30sXG4gICAgICAgICAgICAgICAgX2FbWk9ORV9DT05URVhUX0tFWV0gPSBjb250ZXh0LFxuICAgICAgICAgICAgICAgIF9hKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgem9uZVxuICAgICAqL1xuICAgIFpvbmVDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuX2dldEFjdGl2ZVpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBab25lLmN1cnJlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQYXRjaGVzIGFkZEV2ZW50TGlzdGVuZXIgbWV0aG9kXG4gICAgICogQHBhcmFtIHRhcmdldCBhbnkgdGFyZ2V0IHRoYXQgaGFzIFwiYWRkRXZlbnRMaXN0ZW5lclwiIG1ldGhvZFxuICAgICAqIEBwYXJhbSBvcmlnaW5hbCByZWZlcmVuY2UgdG8gdGhlIHBhdGNoZWQgbWV0aG9kXG4gICAgICogQHBhcmFtIFtjb250ZXh0XSBjb250ZXh0IHRvIGJlIGJpbmQgdG8gdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fcGF0Y2hBZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHRNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIsIG9wdHMpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19vdF9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVycyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF07XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGF0Y2hlZExpc3RlbmVyID0gY29udGV4dE1hbmFnZXIuYmluZChjb250ZXh0LCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAvLyBzdG9yZSBhIHdlYWsgcmVmZXJlbmNlIG9mIHRoZSB1c2VyIGxpc3RlbmVyIHRvIG91cnNcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQobGlzdGVuZXIsIHBhdGNoZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyLCBvcHRzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcmVtb3ZlRXZlbnRMaXN0ZW5lciBtZXRob2RcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGFueSB0YXJnZXQgdGhhdCBoYXMgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIgbWV0aG9kXG4gICAgICogQHBhcmFtIG9yaWdpbmFsIHJlZmVyZW5jZSB0byB0aGUgcGF0Y2hlZCBtZXRob2RcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9wYXRjaFJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcmlnaW5hbCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5fX290X2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzW2V2ZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBldmVudHMgPSB0YXJnZXQuX19vdF9saXN0ZW5lcnNbZXZlbnRdO1xuICAgICAgICAgICAgdmFyIHBhdGNoZWRMaXN0ZW5lciA9IGV2ZW50cy5nZXQobGlzdGVuZXIpO1xuICAgICAgICAgICAgZXZlbnRzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjb250ZXh0XG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJPT1RfQ09OVEVYVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWN0aXZlWm9uZSA9IHRoaXMuX2dldEFjdGl2ZVpvbmUoKTtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZUNvbnRleHRGcm9tWm9uZShhY3RpdmVab25lKTtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUk9PVF9DT05URVhUO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQmluZHMgYSB0aGUgY2VydGFpbiBjb250ZXh0IG9yIHRoZSBhY3RpdmUgb25lIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIHRoZW4gcmV0dXJucyB0aGUgdGFyZ2V0XG4gICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IChzcGFuKSB0byBiZSBiaW5kIHRvIHRhcmdldFxuICAgICAqIEBwYXJhbSB0YXJnZXQgYSBmdW5jdGlvbiBvciBldmVudCBlbWl0dGVyLiBXaGVuIHRhcmdldCBvciBvbmUgb2YgaXRzIGNhbGxiYWNrcyBpcyBjYWxsZWQsXG4gICAgICogIHRoZSBwcm92aWRlZCBjb250ZXh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYWN0aXZlIGNvbnRleHQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIGlmIG5vIHNwZWNpZmljIGNvbnRleHQgdG8gcHJvcGFnYXRlIGlzIGdpdmVuLCB3ZSB1c2UgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluZEZ1bmN0aW9uKGNvbnRleHQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNMaXN0ZW5lck9iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9iaW5kTGlzdGVuZXIoY29udGV4dCwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0aGUgY29udGV4dCBtYW5hZ2VyIChjbGVhcnMgYWxsIHRoZSBjb250ZXh0cylcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBjb250ZXh0IG1hbmFnZXIgYW5kIGNyZWF0ZXMgYSBkZWZhdWx0KHJvb3QpIGNvbnRleHRcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIFtmbl0gd2l0aCB0aGUgcHJvdmlkZWQgW2NvbnRleHRdLlxuICAgICAqICAgICBJZiBbY29udGV4dF0gaXMgdW5kZWZpbmVkIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGFjdGl2ZSBjb250ZXh0LlxuICAgICAqICAgICBUaGUgY29udGV4dCB3aWxsIGJlIHNldCBhcyBhY3RpdmVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGNhbGxlZCB3aXRoIHByb3ZpZGVkIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHRoaXNBcmcgb3B0aW9uYWwgcmVjZWl2ZXIgdG8gYmUgdXNlZCBmb3IgY2FsbGluZyBmblxuICAgICAqIEBwYXJhbSBhcmdzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gZm5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLndpdGggPSBmdW5jdGlvbiAoY29udGV4dCwgZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAzOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAzXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHpvbmVOYW1lID0gdGhpcy5fY3JlYXRlWm9uZU5hbWUoKTtcbiAgICAgICAgdmFyIG5ld1pvbmUgPSB0aGlzLl9jcmVhdGVab25lKHpvbmVOYW1lLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ld1pvbmUucnVuKGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBab25lQ29udGV4dE1hbmFnZXI7XG59KCkpO1xuXG52YXIgem9uZSA9IHt9O1xuXG52YXIgaGFzUmVxdWlyZWRab25lO1xuXG5mdW5jdGlvbiByZXF1aXJlWm9uZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFpvbmUpIHJldHVybiB6b25lO1xuXHRoYXNSZXF1aXJlZFpvbmUgPSAxO1xuXHQvKipcblx0ICogQGxpY2Vuc2UgQW5ndWxhciB2PHVua25vd24+XG5cdCAqIChjKSAyMDEwLTIwMjUgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvL1xuXHQgKiBMaWNlbnNlOiBNSVRcblx0ICovXG5cdGNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5cdC8vIF9fWm9uZV9zeW1ib2xfcHJlZml4IGdsb2JhbCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB6b25lXG5cdC8vIHN5bWJvbCBwcmVmaXggd2l0aCBhIGN1c3RvbSBvbmUgaWYgbmVlZGVkLlxuXHRmdW5jdGlvbiBfX3N5bWJvbF9fKG5hbWUpIHtcblx0ICAgIGNvbnN0IHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJztcblx0ICAgIHJldHVybiBzeW1ib2xQcmVmaXggKyBuYW1lO1xuXHR9XG5cdGZ1bmN0aW9uIGluaXRab25lKCkge1xuXHQgICAgY29uc3QgcGVyZm9ybWFuY2UgPSBnbG9iYWxbJ3BlcmZvcm1hbmNlJ107XG5cdCAgICBmdW5jdGlvbiBtYXJrKG5hbWUpIHtcblx0ICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWFyayddICYmIHBlcmZvcm1hbmNlWydtYXJrJ10obmFtZSk7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBwZXJmb3JtYW5jZU1lYXN1cmUobmFtZSwgbGFiZWwpIHtcblx0ICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWVhc3VyZSddICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10obmFtZSwgbGFiZWwpO1xuXHQgICAgfVxuXHQgICAgbWFyaygnWm9uZScpO1xuXHQgICAgY2xhc3MgWm9uZUltcGwge1xuXHQgICAgICAgIHN0YXRpYyBfX3N5bWJvbF9fID0gX19zeW1ib2xfXztcblx0ICAgICAgICBzdGF0aWMgYXNzZXJ0Wm9uZVBhdGNoZWQoKSB7XG5cdCAgICAgICAgICAgIGlmIChnbG9iYWxbJ1Byb21pc2UnXSAhPT0gcGF0Y2hlc1snWm9uZUF3YXJlUHJvbWlzZSddKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmUuanMgaGFzIGRldGVjdGVkIHRoYXQgWm9uZUF3YXJlUHJvbWlzZSBgKHdpbmRvd3xnbG9iYWwpLlByb21pc2VgICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiBvdmVyd3JpdHRlbi5cXG4nICtcblx0ICAgICAgICAgICAgICAgICAgICAnTW9zdCBsaWtlbHkgY2F1c2UgaXMgdGhhdCBhIFByb21pc2UgcG9seWZpbGwgaGFzIGJlZW4gbG9hZGVkICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RhdGljIGdldCByb290KCkge1xuXHQgICAgICAgICAgICBsZXQgem9uZSA9IFpvbmVJbXBsLmN1cnJlbnQ7XG5cdCAgICAgICAgICAgIHdoaWxlICh6b25lLnBhcmVudCkge1xuXHQgICAgICAgICAgICAgICAgem9uZSA9IHpvbmUucGFyZW50O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB6b25lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgZ2V0IGN1cnJlbnQoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfY3VycmVudFpvbmVGcmFtZS56b25lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgZ2V0IGN1cnJlbnRUYXNrKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRUYXNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgX19sb2FkX3BhdGNoKG5hbWUsIGZuLCBpZ25vcmVEdXBsaWNhdGUgPSBmYWxzZSkge1xuXHQgICAgICAgICAgICBpZiAocGF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gYGNoZWNrRHVwbGljYXRlYCBvcHRpb24gaXMgZGVmaW5lZCBmcm9tIGdsb2JhbCB2YXJpYWJsZVxuXHQgICAgICAgICAgICAgICAgLy8gc28gaXQgd29ya3MgZm9yIGFsbCBtb2R1bGVzLlxuXHQgICAgICAgICAgICAgICAgLy8gYGlnbm9yZUR1cGxpY2F0ZWAgY2FuIHdvcmsgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlXG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGVja0R1cGxpY2F0ZSA9IGdsb2JhbFtfX3N5bWJvbF9fKCdmb3JjZUR1cGxpY2F0ZVpvbmVDaGVjaycpXSA9PT0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICghaWdub3JlRHVwbGljYXRlICYmIGNoZWNrRHVwbGljYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgbG9hZGVkIHBhdGNoOiAnICsgbmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoIWdsb2JhbFsnX19ab25lX2Rpc2FibGVfJyArIG5hbWVdKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwZXJmTmFtZSA9ICdab25lOicgKyBuYW1lO1xuXHQgICAgICAgICAgICAgICAgbWFyayhwZXJmTmFtZSk7XG5cdCAgICAgICAgICAgICAgICBwYXRjaGVzW25hbWVdID0gZm4oZ2xvYmFsLCBab25lSW1wbCwgX2FwaSk7XG5cdCAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZU1lYXN1cmUocGVyZk5hbWUsIHBlcmZOYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXQgcGFyZW50KCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXQgbmFtZSgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF9wYXJlbnQ7XG5cdCAgICAgICAgX25hbWU7XG5cdCAgICAgICAgX3Byb3BlcnRpZXM7XG5cdCAgICAgICAgX3pvbmVEZWxlZ2F0ZTtcblx0ICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHpvbmVTcGVjKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcblx0ICAgICAgICAgICAgdGhpcy5fbmFtZSA9IHpvbmVTcGVjID8gem9uZVNwZWMubmFtZSB8fCAndW5uYW1lZCcgOiAnPHJvb3Q+Jztcblx0ICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9ICh6b25lU3BlYyAmJiB6b25lU3BlYy5wcm9wZXJ0aWVzKSB8fCB7fTtcblx0ICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlID0gbmV3IF9ab25lRGVsZWdhdGUodGhpcywgdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC5fem9uZURlbGVnYXRlLCB6b25lU3BlYyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGdldChrZXkpIHtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZSA9IHRoaXMuZ2V0Wm9uZVdpdGgoa2V5KTtcblx0ICAgICAgICAgICAgaWYgKHpvbmUpXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5fcHJvcGVydGllc1trZXldO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXRab25lV2l0aChrZXkpIHtcblx0ICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzO1xuXHQgICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuX3Byb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuX3BhcmVudDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZm9yayh6b25lU3BlYykge1xuXHQgICAgICAgICAgICBpZiAoIXpvbmVTcGVjKVxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lU3BlYyByZXF1aXJlZCEnKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5mb3JrKHRoaXMsIHpvbmVTcGVjKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd3JhcChjYWxsYmFjaywgc291cmNlKSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGZ1bmN0aW9uIGdvdDogJyArIGNhbGxiYWNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBfY2FsbGJhY2sgPSB0aGlzLl96b25lRGVsZWdhdGUuaW50ZXJjZXB0KHRoaXMsIGNhbGxiYWNrLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICBjb25zdCB6b25lID0gdGhpcztcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bkd1YXJkZWQoX2NhbGxiYWNrLCB0aGlzLCBhcmd1bWVudHMsIHNvdXJjZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJ1bihjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkge1xuXHQgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBfY3VycmVudFpvbmVGcmFtZSwgem9uZTogdGhpcyB9O1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZpbmFsbHkge1xuXHQgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcnVuR3VhcmRlZChjYWxsYmFjaywgYXBwbHlUaGlzID0gbnVsbCwgYXBwbHlBcmdzLCBzb3VyY2UpIHtcblx0ICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogX2N1cnJlbnRab25lRnJhbWUsIHpvbmU6IHRoaXMgfTtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnJvcikpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZpbmFsbHkge1xuXHQgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcnVuVGFzayh0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuXHQgICAgICAgICAgICBpZiAodGFzay56b25lICE9IHRoaXMpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcblx0ICAgICAgICAgICAgICAgICAgICAodGFzay56b25lIHx8IE5PX1pPTkUpLm5hbWUgK1xuXHQgICAgICAgICAgICAgICAgICAgICc7IEV4ZWN1dGlvbjogJyArXG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lICtcblx0ICAgICAgICAgICAgICAgICAgICAnKScpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IHpvbmVUYXNrID0gdGFzaztcblx0ICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvNzc4LCBzb21ldGltZXMgZXZlbnRUYXNrXG5cdCAgICAgICAgICAgIC8vIHdpbGwgcnVuIGluIG5vdFNjaGVkdWxlZChjYW5jZWxlZCkgc3RhdGUsIHdlIHNob3VsZCBub3QgdHJ5IHRvXG5cdCAgICAgICAgICAgIC8vIHJ1biBzdWNoIGtpbmQgb2YgdGFzayBidXQganVzdCByZXR1cm5cblx0ICAgICAgICAgICAgY29uc3QgeyB0eXBlLCBkYXRhOiB7IGlzUGVyaW9kaWMgPSBmYWxzZSwgaXNSZWZyZXNoYWJsZSA9IGZhbHNlIH0gPSB7fSB9ID0gdGFzaztcblx0ICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT09IG5vdFNjaGVkdWxlZCAmJiAodHlwZSA9PT0gZXZlbnRUYXNrIHx8IHR5cGUgPT09IG1hY3JvVGFzaykpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCByZUVudHJ5R3VhcmQgPSB0YXNrLnN0YXRlICE9IHJ1bm5pbmc7XG5cdCAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHJ1bm5pbmcsIHNjaGVkdWxlZCk7XG5cdCAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVGFzayA9IF9jdXJyZW50VGFzaztcblx0ICAgICAgICAgICAgX2N1cnJlbnRUYXNrID0gem9uZVRhc2s7XG5cdCAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBtYWNyb1Rhc2sgJiYgdGFzay5kYXRhICYmICFpc1BlcmlvZGljICYmICFpc1JlZnJlc2hhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWxGbiA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsIHpvbmVUYXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycm9yKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZmluYWxseSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzaydzIHN0YXRlIGlzIG5vdFNjaGVkdWxlZCBvciB1bmtub3duLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG5cdCAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgbm90IHJlc2V0IHRoZSBzdGF0ZSB0byBzY2hlZHVsZWRcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGFzay5zdGF0ZTtcblx0ICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbm90U2NoZWR1bGVkICYmIHN0YXRlICE9PSB1bmtub3duKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gZXZlbnRUYXNrIHx8IGlzUGVyaW9kaWMgfHwgKGlzUmVmcmVzaGFibGUgJiYgc3RhdGUgPT09IHNjaGVkdWxpbmcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgcnVubmluZywgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6b25lRGVsZWdhdGVzID0gem9uZVRhc2suX3pvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh6b25lVGFzaywgLTEpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYgem9uZVRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHJ1bm5pbmcsIG5vdFNjaGVkdWxlZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JlZnJlc2hhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lVGFzay5fem9uZURlbGVnYXRlcyA9IHpvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IF9jdXJyZW50Wm9uZUZyYW1lLnBhcmVudDtcblx0ICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHByZXZpb3VzVGFzaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzY2hlZHVsZVRhc2sodGFzaykge1xuXHQgICAgICAgICAgICBpZiAodGFzay56b25lICYmIHRhc2suem9uZSAhPT0gdGhpcykge1xuXHQgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRhc2sgd2FzIHJlc2NoZWR1bGVkLCB0aGUgbmV3Wm9uZVxuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSB0aGUgY2hpbGRyZW4gb2YgdGhlIG9yaWdpbmFsIHpvbmVcblx0ICAgICAgICAgICAgICAgIGxldCBuZXdab25lID0gdGhpcztcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChuZXdab25lKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1pvbmUgPT09IHRhc2suem9uZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gJHt0aGlzLm5hbWV9IHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICR7dGFzay56b25lLm5hbWV9YCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIG5ld1pvbmUgPSBuZXdab25lLnBhcmVudDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGluZywgbm90U2NoZWR1bGVkKTtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IFtdO1xuXHQgICAgICAgICAgICB0YXNrLl96b25lRGVsZWdhdGVzID0gem9uZURlbGVnYXRlcztcblx0ICAgICAgICAgICAgdGFzay5fem9uZSA9IHRoaXM7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICB0YXNrID0gdGhpcy5fem9uZURlbGVnYXRlLnNjaGVkdWxlVGFzayh0aGlzLCB0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBzaG91bGQgc2V0IHRhc2sncyBzdGF0ZSB0byB1bmtub3duIHdoZW4gc2NoZWR1bGVUYXNrIHRocm93IGVycm9yXG5cdCAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlcnIgbWF5IGZyb20gcmVzY2hlZHVsZSwgc28gdGhlIGZyb21TdGF0ZSBtYXliZSBub3RTY2hlZHVsZWRcblx0ICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyh1bmtub3duLCBzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpO1xuXHQgICAgICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc2hvdWxkIHdlIGNoZWNrIHRoZSByZXN1bHQgZnJvbSBoYW5kbGVFcnJvcj9cblx0ICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0YXNrLl96b25lRGVsZWdhdGVzID09PSB6b25lRGVsZWdhdGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIGJlY2F1c2UgaW50ZXJuYWxseSB0aGUgZGVsZWdhdGUgY2FuIHJlc2NoZWR1bGUgdGhlIHRhc2suXG5cdCAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT0gc2NoZWR1bGluZykge1xuXHQgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjaGVkdWxlTWFjcm9UYXNrKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBab25lVGFzayhtYWNyb1Rhc2ssIHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKGV2ZW50VGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYW5jZWxUYXNrKHRhc2spIHtcblx0ICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKVxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHRhc2sgY2FuIG9ubHkgYmUgY2FuY2VsbGVkIGluIHRoZSB6b25lIG9mIGNyZWF0aW9uISAoQ3JlYXRpb246ICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICh0YXNrLnpvbmUgfHwgTk9fWk9ORSkubmFtZSArXG5cdCAgICAgICAgICAgICAgICAgICAgJzsgRXhlY3V0aW9uOiAnICtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgK1xuXHQgICAgICAgICAgICAgICAgICAgICcpJyk7XG5cdCAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlICE9PSBzY2hlZHVsZWQgJiYgdGFzay5zdGF0ZSAhPT0gcnVubmluZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuY2FuY2VsVGFzayh0aGlzLCB0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMgd2hlbiBjYW5jZWxUYXNrLCB0cmFuc2l0IHRoZSBzdGF0ZSB0byB1bmtub3duXG5cdCAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAtMSk7XG5cdCAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIGNhbmNlbGluZyk7XG5cdCAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAtMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF91cGRhdGVUYXNrQ291bnQodGFzaywgY291bnQpIHtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IHRhc2suX3pvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgdGFzay5fem9uZURlbGVnYXRlcyA9IG51bGw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB6b25lRGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB6b25lRGVsZWdhdGVzW2ldLl91cGRhdGVUYXNrQ291bnQodGFzay50eXBlLCBjb3VudCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjb25zdCBERUxFR0FURV9aUyA9IHtcblx0ICAgICAgICBuYW1lOiAnJyxcblx0ICAgICAgICBvbkhhc1Rhc2s6IChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCBoYXNUYXNrU3RhdGUpID0+IGRlbGVnYXRlLmhhc1Rhc2sodGFyZ2V0LCBoYXNUYXNrU3RhdGUpLFxuXHQgICAgICAgIG9uU2NoZWR1bGVUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRhcmdldCwgdGFzayksXG5cdCAgICAgICAgb25JbnZva2VUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpID0+IGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyksXG5cdCAgICAgICAgb25DYW5jZWxUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuY2FuY2VsVGFzayh0YXJnZXQsIHRhc2spLFxuXHQgICAgfTtcblx0ICAgIGNsYXNzIF9ab25lRGVsZWdhdGUge1xuXHQgICAgICAgIGdldCB6b25lKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgX3pvbmU7XG5cdCAgICAgICAgX3Rhc2tDb3VudHMgPSB7XG5cdCAgICAgICAgICAgICdtaWNyb1Rhc2snOiAwLFxuXHQgICAgICAgICAgICAnbWFjcm9UYXNrJzogMCxcblx0ICAgICAgICAgICAgJ2V2ZW50VGFzayc6IDAsXG5cdCAgICAgICAgfTtcblx0ICAgICAgICBfcGFyZW50RGVsZWdhdGU7XG5cdCAgICAgICAgX2ZvcmtEbGd0O1xuXHQgICAgICAgIF9mb3JrWlM7XG5cdCAgICAgICAgX2ZvcmtDdXJyWm9uZTtcblx0ICAgICAgICBfaW50ZXJjZXB0RGxndDtcblx0ICAgICAgICBfaW50ZXJjZXB0WlM7XG5cdCAgICAgICAgX2ludGVyY2VwdEN1cnJab25lO1xuXHQgICAgICAgIF9pbnZva2VEbGd0O1xuXHQgICAgICAgIF9pbnZva2VaUztcblx0ICAgICAgICBfaW52b2tlQ3VyclpvbmU7XG5cdCAgICAgICAgX2hhbmRsZUVycm9yRGxndDtcblx0ICAgICAgICBfaGFuZGxlRXJyb3JaUztcblx0ICAgICAgICBfaGFuZGxlRXJyb3JDdXJyWm9uZTtcblx0ICAgICAgICBfc2NoZWR1bGVUYXNrRGxndDtcblx0ICAgICAgICBfc2NoZWR1bGVUYXNrWlM7XG5cdCAgICAgICAgX3NjaGVkdWxlVGFza0N1cnJab25lO1xuXHQgICAgICAgIF9pbnZva2VUYXNrRGxndDtcblx0ICAgICAgICBfaW52b2tlVGFza1pTO1xuXHQgICAgICAgIF9pbnZva2VUYXNrQ3VyclpvbmU7XG5cdCAgICAgICAgX2NhbmNlbFRhc2tEbGd0O1xuXHQgICAgICAgIF9jYW5jZWxUYXNrWlM7XG5cdCAgICAgICAgX2NhbmNlbFRhc2tDdXJyWm9uZTtcblx0ICAgICAgICBfaGFzVGFza0RsZ3Q7XG5cdCAgICAgICAgX2hhc1Rhc2tEbGd0T3duZXI7XG5cdCAgICAgICAgX2hhc1Rhc2taUztcblx0ICAgICAgICBfaGFzVGFza0N1cnJab25lO1xuXHQgICAgICAgIGNvbnN0cnVjdG9yKHpvbmUsIHBhcmVudERlbGVnYXRlLCB6b25lU3BlYykge1xuXHQgICAgICAgICAgICB0aGlzLl96b25lID0gem9uZTtcblx0ICAgICAgICAgICAgdGhpcy5fcGFyZW50RGVsZWdhdGUgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgdGhpcy5fZm9ya1pTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjICYmIHpvbmVTcGVjLm9uRm9yayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtaUyk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZvcmtEbGd0ID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uRm9yayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtEbGd0KTtcblx0ICAgICAgICAgICAgdGhpcy5fZm9ya0N1cnJab25lID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkZvcmsgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtDdXJyWm9uZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdFpTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdFpTKTtcblx0ICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0RGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnRlcmNlcHQgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHREbGd0KTtcblx0ICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHRDdXJyWm9uZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VEbGd0ID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZSA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZURsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VDdXJyWm9uZSA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZUN1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JaUyA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25IYW5kbGVFcnJvciA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2hhbmRsZUVycm9yWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckRsZ3QgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSGFuZGxlRXJyb3IgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckRsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckN1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uU2NoZWR1bGVUYXNrID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5fc2NoZWR1bGVUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrRGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2VUYXNrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkNhbmNlbFRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9jYW5jZWxUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25DYW5jZWxUYXNrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gbnVsbDtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBudWxsO1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndE93bmVyID0gbnVsbDtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gbnVsbDtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZVNwZWNIYXNUYXNrID0gem9uZVNwZWMgJiYgem9uZVNwZWMub25IYXNUYXNrO1xuXHQgICAgICAgICAgICBjb25zdCBwYXJlbnRIYXNUYXNrID0gcGFyZW50RGVsZWdhdGUgJiYgcGFyZW50RGVsZWdhdGUuX2hhc1Rhc2taUztcblx0ICAgICAgICAgICAgaWYgKHpvbmVTcGVjSGFzVGFzayB8fCBwYXJlbnRIYXNUYXNrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHJlcG9ydCBoYXNUYXNrLCB0aGFuIHRoaXMgWlMgbmVlZHMgdG8gZG8gcmVmIGNvdW50aW5nIG9uIHRhc2tzLiBJbiBzdWNoXG5cdCAgICAgICAgICAgICAgICAvLyBhIGNhc2UgYWxsIHRhc2sgcmVsYXRlZCBpbnRlcmNlcHRvcnMgbXVzdCBnbyB0aHJvdWdoIHRoaXMgWkQuIFdlIGNhbid0IHNob3J0IGNpcmN1aXQgaXQuXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMgPSB6b25lU3BlY0hhc1Rhc2sgPyB6b25lU3BlYyA6IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSB0aGlzO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcblx0ICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25TY2hlZHVsZVRhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9IHRoaXMuX3pvbmU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoIXpvbmVTcGVjLm9uSW52b2tlVGFzaykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25DYW5jZWxUYXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID0gREVMRUdBVEVfWlM7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPSB0aGlzLl96b25lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvcmsodGFyZ2V0Wm9uZSwgem9uZVNwZWMpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmtaU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKVxuXHQgICAgICAgICAgICAgICAgOiBuZXcgWm9uZUltcGwodGFyZ2V0Wm9uZSwgem9uZVNwZWMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpbnRlcmNlcHQodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJjZXB0WlNcblx0ICAgICAgICAgICAgICAgID8gdGhpcy5faW50ZXJjZXB0WlMub25JbnRlcmNlcHQodGhpcy5faW50ZXJjZXB0RGxndCwgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUsIHRhcmdldFpvbmUsIGNhbGxiYWNrLCBzb3VyY2UpXG5cdCAgICAgICAgICAgICAgICA6IGNhbGxiYWNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpbnZva2UodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVpTXG5cdCAgICAgICAgICAgICAgICA/IHRoaXMuX2ludm9rZVpTLm9uSW52b2tlKHRoaXMuX2ludm9rZURsZ3QsIHRoaXMuX2ludm9rZUN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSlcblx0ICAgICAgICAgICAgICAgIDogY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBoYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnJvcikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRXJyb3JaU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LCB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLCB0YXJnZXRab25lLCBlcnJvcilcblx0ICAgICAgICAgICAgICAgIDogdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc2NoZWR1bGVUYXNrKHRhcmdldFpvbmUsIHRhc2spIHtcblx0ICAgICAgICAgICAgbGV0IHJldHVyblRhc2sgPSB0YXNrO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc2NoZWR1bGVUYXNrWlMpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNUYXNrWlMpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrLl96b25lRGVsZWdhdGVzLnB1c2godGhpcy5faGFzVGFza0RsZ3RPd25lcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFyZXR1cm5UYXNrKVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVyblRhc2sgPSB0YXNrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRhc2suc2NoZWR1bGVGbikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2sudHlwZSA9PSBtaWNyb1Rhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGludm9rZVRhc2sodGFyZ2V0Wm9uZSwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9pbnZva2VUYXNrWlMub25JbnZva2VUYXNrKHRoaXMuX2ludm9rZVRhc2tEbGd0LCB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKVxuXHQgICAgICAgICAgICAgICAgOiB0YXNrLmNhbGxiYWNrLmFwcGx5KGFwcGx5VGhpcywgYXBwbHlBcmdzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2FuY2VsVGFzayh0YXJnZXRab25lLCB0YXNrKSB7XG5cdCAgICAgICAgICAgIGxldCB2YWx1ZTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2NhbmNlbFRhc2taUykge1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9jYW5jZWxUYXNrWlMub25DYW5jZWxUYXNrKHRoaXMuX2NhbmNlbFRhc2tEbGd0LCB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbEZuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1Rhc2sgaXMgbm90IGNhbmNlbGFibGUnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGFzay5jYW5jZWxGbih0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGhhc1Rhc2sodGFyZ2V0Wm9uZSwgaXNFbXB0eSkge1xuXHQgICAgICAgICAgICAvLyBoYXNUYXNrIHNob3VsZCBub3QgdGhyb3cgZXJyb3Igc28gb3RoZXIgWm9uZURlbGVnYXRlXG5cdCAgICAgICAgICAgIC8vIGNhbiBzdGlsbCB0cmlnZ2VyIGhhc1Rhc2sgY2FsbGJhY2tcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUy5vbkhhc1Rhc2sodGhpcy5faGFzVGFza0RsZ3QsIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgaXNFbXB0eSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF91cGRhdGVUYXNrQ291bnQodHlwZSwgY291bnQpIHtcblx0ICAgICAgICAgICAgY29uc3QgY291bnRzID0gdGhpcy5fdGFza0NvdW50cztcblx0ICAgICAgICAgICAgY29uc3QgcHJldiA9IGNvdW50c1t0eXBlXTtcblx0ICAgICAgICAgICAgY29uc3QgbmV4dCA9IChjb3VudHNbdHlwZV0gPSBwcmV2ICsgY291bnQpO1xuXHQgICAgICAgICAgICBpZiAobmV4dCA8IDApIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTW9yZSB0YXNrcyBleGVjdXRlZCB0aGVuIHdlcmUgc2NoZWR1bGVkLicpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwcmV2ID09IDAgfHwgbmV4dCA9PSAwKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgIG1pY3JvVGFzazogY291bnRzWydtaWNyb1Rhc2snXSA+IDAsXG5cdCAgICAgICAgICAgICAgICAgICAgbWFjcm9UYXNrOiBjb3VudHNbJ21hY3JvVGFzayddID4gMCxcblx0ICAgICAgICAgICAgICAgICAgICBldmVudFRhc2s6IGNvdW50c1snZXZlbnRUYXNrJ10gPiAwLFxuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogdHlwZSxcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB0aGlzLmhhc1Rhc2sodGhpcy5fem9uZSwgaXNFbXB0eSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjbGFzcyBab25lVGFzayB7XG5cdCAgICAgICAgdHlwZTtcblx0ICAgICAgICBzb3VyY2U7XG5cdCAgICAgICAgaW52b2tlO1xuXHQgICAgICAgIGNhbGxiYWNrO1xuXHQgICAgICAgIGRhdGE7XG5cdCAgICAgICAgc2NoZWR1bGVGbjtcblx0ICAgICAgICBjYW5jZWxGbjtcblx0ICAgICAgICBfem9uZSA9IG51bGw7XG5cdCAgICAgICAgcnVuQ291bnQgPSAwO1xuXHQgICAgICAgIF96b25lRGVsZWdhdGVzID0gbnVsbDtcblx0ICAgICAgICBfc3RhdGUgPSAnbm90U2NoZWR1bGVkJztcblx0ICAgICAgICBjb25zdHJ1Y3Rvcih0eXBlLCBzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZUZuLCBjYW5jZWxGbikge1xuXHQgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucztcblx0ICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZuID0gc2NoZWR1bGVGbjtcblx0ICAgICAgICAgICAgdGhpcy5jYW5jZWxGbiA9IGNhbmNlbEZuO1xuXHQgICAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIGlzIG5vdCBkZWZpbmVkJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXHQgICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblx0ICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiBvcHRpb25zIHNob3VsZCBoYXZlIGludGVyZmFjZVxuXHQgICAgICAgICAgICBpZiAodHlwZSA9PT0gZXZlbnRUYXNrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy51c2VHKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IFpvbmVUYXNrLmludm9rZVRhc2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gWm9uZVRhc2suaW52b2tlVGFzay5jYWxsKGdsb2JhbCwgc2VsZiwgdGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RhdGljIGludm9rZVRhc2sodGFzaywgdGFyZ2V0LCBhcmdzKSB7XG5cdCAgICAgICAgICAgIGlmICghdGFzaykge1xuXHQgICAgICAgICAgICAgICAgdGFzayA9IHRoaXM7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcysrO1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgdGFzay5ydW5Db3VudCsrO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIHRhcmdldCwgYXJncyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZmluYWxseSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PSAxKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcy0tO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGdldCB6b25lKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZ2V0IHN0YXRlKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhbmNlbFNjaGVkdWxlUmVxdWVzdCgpIHtcblx0ICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF90cmFuc2l0aW9uVG8odG9TdGF0ZSwgZnJvbVN0YXRlMSwgZnJvbVN0YXRlMikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTEgfHwgdGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTIpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdG9TdGF0ZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0b1N0YXRlID09IG5vdFNjaGVkdWxlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZXMgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMudHlwZX0gJyR7dGhpcy5zb3VyY2V9JzogY2FuIG5vdCB0cmFuc2l0aW9uIHRvICcke3RvU3RhdGV9JywgZXhwZWN0aW5nIHN0YXRlICcke2Zyb21TdGF0ZTF9JyR7ZnJvbVN0YXRlMiA/IFwiIG9yICdcIiArIGZyb21TdGF0ZTIgKyBcIidcIiA6ICcnfSwgd2FzICcke3RoaXMuX3N0YXRlfScuYCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdG9TdHJpbmcoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdHlwZW9mIHRoaXMuZGF0YS5oYW5kbGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuaGFuZGxlSWQudG9TdHJpbmcoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gYWRkIHRvSlNPTiBtZXRob2QgdG8gcHJldmVudCBjeWNsaWMgZXJyb3Igd2hlblxuXHQgICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spXG5cdCAgICAgICAgdG9KU09OKCkge1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuXHQgICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG5cdCAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuXHQgICAgICAgICAgICAgICAgem9uZTogdGhpcy56b25lLm5hbWUsXG5cdCAgICAgICAgICAgICAgICBydW5Db3VudDogdGhpcy5ydW5Db3VudCxcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vICBNSUNST1RBU0sgUVVFVUVcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICBjb25zdCBzeW1ib2xTZXRUaW1lb3V0ID0gX19zeW1ib2xfXygnc2V0VGltZW91dCcpO1xuXHQgICAgY29uc3Qgc3ltYm9sUHJvbWlzZSA9IF9fc3ltYm9sX18oJ1Byb21pc2UnKTtcblx0ICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG5cdCAgICBsZXQgX21pY3JvVGFza1F1ZXVlID0gW107XG5cdCAgICBsZXQgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlO1xuXHQgICAgbGV0IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZTtcblx0ICAgIGZ1bmN0aW9uIG5hdGl2ZVNjaGVkdWxlTWljcm9UYXNrKGZ1bmMpIHtcblx0ICAgICAgICBpZiAoIW5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICBpZiAoZ2xvYmFsW3N5bWJvbFByb21pc2VdKSB7XG5cdCAgICAgICAgICAgICAgICBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UgPSBnbG9iYWxbc3ltYm9sUHJvbWlzZV0ucmVzb2x2ZSgwKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlKSB7XG5cdCAgICAgICAgICAgIGxldCBuYXRpdmVUaGVuID0gbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlW3N5bWJvbFRoZW5dO1xuXHQgICAgICAgICAgICBpZiAoIW5hdGl2ZVRoZW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBQcm9taXNlIGlzIG5vdCBwYXRjaGFibGUsIHdlIG5lZWQgdG8gdXNlIGB0aGVuYCBkaXJlY3RseVxuXHQgICAgICAgICAgICAgICAgLy8gaXNzdWUgMTA3OFxuXHQgICAgICAgICAgICAgICAgbmF0aXZlVGhlbiA9IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZVsndGhlbiddO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG5hdGl2ZVRoZW4uY2FsbChuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UsIGZ1bmMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZ2xvYmFsW3N5bWJvbFNldFRpbWVvdXRdKGZ1bmMsIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIHNjaGVkdWxlTWljcm9UYXNrKHRhc2spIHtcblx0ICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkXG5cdCAgICAgICAgLy8gd2UgbXVzdCBib290c3RyYXAgdGhlIGluaXRpYWwgdGFzayBjcmVhdGlvbiBieSBtYW51YWxseSBzY2hlZHVsaW5nIHRoZSBkcmFpblxuXHQgICAgICAgIGlmIChfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID09PSAwICYmIF9taWNyb1Rhc2tRdWV1ZS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuXG5cdCAgICAgICAgICAgIG5hdGl2ZVNjaGVkdWxlTWljcm9UYXNrKGRyYWluTWljcm9UYXNrUXVldWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0YXNrICYmIF9taWNyb1Rhc2tRdWV1ZS5wdXNoKHRhc2spO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpIHtcblx0ICAgICAgICBpZiAoIV9pc0RyYWluaW5nTWljcm90YXNrUXVldWUpIHtcblx0ICAgICAgICAgICAgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IHRydWU7XG5cdCAgICAgICAgICAgIHdoaWxlIChfbWljcm9UYXNrUXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IF9taWNyb1Rhc2tRdWV1ZTtcblx0ICAgICAgICAgICAgICAgIF9taWNyb1Rhc2tRdWV1ZSA9IFtdO1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBxdWV1ZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUucnVuVGFzayh0YXNrLCBudWxsLCBudWxsKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIF9hcGkub25VbmhhbmRsZWRFcnJvcihlcnJvcik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIF9hcGkubWljcm90YXNrRHJhaW5Eb25lKCk7XG5cdCAgICAgICAgICAgIF9pc0RyYWluaW5nTWljcm90YXNrUXVldWUgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vICBCT09UU1RSQVBcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICBjb25zdCBOT19aT05FID0geyBuYW1lOiAnTk8gWk9ORScgfTtcblx0ICAgIGNvbnN0IG5vdFNjaGVkdWxlZCA9ICdub3RTY2hlZHVsZWQnLCBzY2hlZHVsaW5nID0gJ3NjaGVkdWxpbmcnLCBzY2hlZHVsZWQgPSAnc2NoZWR1bGVkJywgcnVubmluZyA9ICdydW5uaW5nJywgY2FuY2VsaW5nID0gJ2NhbmNlbGluZycsIHVua25vd24gPSAndW5rbm93bic7XG5cdCAgICBjb25zdCBtaWNyb1Rhc2sgPSAnbWljcm9UYXNrJywgbWFjcm9UYXNrID0gJ21hY3JvVGFzaycsIGV2ZW50VGFzayA9ICdldmVudFRhc2snO1xuXHQgICAgY29uc3QgcGF0Y2hlcyA9IHt9O1xuXHQgICAgY29uc3QgX2FwaSA9IHtcblx0ICAgICAgICBzeW1ib2w6IF9fc3ltYm9sX18sXG5cdCAgICAgICAgY3VycmVudFpvbmVGcmFtZTogKCkgPT4gX2N1cnJlbnRab25lRnJhbWUsXG5cdCAgICAgICAgb25VbmhhbmRsZWRFcnJvcjogbm9vcCxcblx0ICAgICAgICBtaWNyb3Rhc2tEcmFpbkRvbmU6IG5vb3AsXG5cdCAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2s6IHNjaGVkdWxlTWljcm9UYXNrLFxuXHQgICAgICAgIHNob3dVbmNhdWdodEVycm9yOiAoKSA9PiAhWm9uZUltcGxbX19zeW1ib2xfXygnaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvcicpXSxcblx0ICAgICAgICBwYXRjaEV2ZW50VGFyZ2V0OiAoKSA9PiBbXSxcblx0ICAgICAgICBwYXRjaE9uUHJvcGVydGllczogbm9vcCxcblx0ICAgICAgICBwYXRjaE1ldGhvZDogKCkgPT4gbm9vcCxcblx0ICAgICAgICBiaW5kQXJndW1lbnRzOiAoKSA9PiBbXSxcblx0ICAgICAgICBwYXRjaFRoZW46ICgpID0+IG5vb3AsXG5cdCAgICAgICAgcGF0Y2hNYWNyb1Rhc2s6ICgpID0+IG5vb3AsXG5cdCAgICAgICAgcGF0Y2hFdmVudFByb3RvdHlwZTogKCkgPT4gbm9vcCxcblx0ICAgICAgICBpc0lFT3JFZGdlOiAoKSA9PiBmYWxzZSxcblx0ICAgICAgICBnZXRHbG9iYWxPYmplY3RzOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHk6ICgpID0+IG5vb3AsXG5cdCAgICAgICAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgT2JqZWN0Q3JlYXRlOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgQXJyYXlTbGljZTogKCkgPT4gW10sXG5cdCAgICAgICAgcGF0Y2hDbGFzczogKCkgPT4gbm9vcCxcblx0ICAgICAgICB3cmFwV2l0aEN1cnJlbnRab25lOiAoKSA9PiBub29wLFxuXHQgICAgICAgIGZpbHRlclByb3BlcnRpZXM6ICgpID0+IFtdLFxuXHQgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZDogKCkgPT4gbm9vcCxcblx0ICAgICAgICBfcmVkZWZpbmVQcm9wZXJ0eTogKCkgPT4gbm9vcCxcblx0ICAgICAgICBwYXRjaENhbGxiYWNrczogKCkgPT4gbm9vcCxcblx0ICAgICAgICBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzazogbmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2ssXG5cdCAgICB9O1xuXHQgICAgbGV0IF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IG51bGwsIHpvbmU6IG5ldyBab25lSW1wbChudWxsLCBudWxsKSB9O1xuXHQgICAgbGV0IF9jdXJyZW50VGFzayA9IG51bGw7XG5cdCAgICBsZXQgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9IDA7XG5cdCAgICBmdW5jdGlvbiBub29wKCkgeyB9XG5cdCAgICBwZXJmb3JtYW5jZU1lYXN1cmUoJ1pvbmUnLCAnWm9uZScpO1xuXHQgICAgcmV0dXJuIFpvbmVJbXBsO1xuXHR9XG5cblx0ZnVuY3Rpb24gbG9hZFpvbmUoKSB7XG5cdCAgICAvLyBpZiBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cyAobWF5YmUgem9uZS5qcyB3YXMgYWxyZWFkeSBsb2FkZWQgb3Jcblx0ICAgIC8vIHNvbWUgb3RoZXIgbGliIGFsc28gcmVnaXN0ZXJlZCBhIGdsb2JhbCBvYmplY3QgbmFtZWQgWm9uZSksIHdlIG1heSBuZWVkXG5cdCAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLlxuXHQgICAgLy8gRm9yIGV4YW1wbGUsXG5cdCAgICAvLyB3ZSBoYXZlIHR3byB3ZWIgcGFnZXMsIHBhZ2UxIGluY2x1ZGVzIHpvbmUuanMsIHBhZ2UyIGRvZXNuJ3QuXG5cdCAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLFxuXHQgICAgLy8gYnV0IHdoZW4gdXNlciBsb2FkIHBhZ2UyIGFnYWluLCBlcnJvciBvY2N1cnMgYmVjYXVzZSBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cy5cblx0ICAgIC8vIHNvIHdlIGFkZCBhIGZsYWcgdG8gbGV0IHVzZXIgY2hvb3NlIHdoZXRoZXIgdG8gdGhyb3cgdGhpcyBlcnJvciBvciBub3QuXG5cdCAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLlxuXHQgICAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblx0ICAgIGNvbnN0IGNoZWNrRHVwbGljYXRlID0gZ2xvYmFsW19fc3ltYm9sX18oJ2ZvcmNlRHVwbGljYXRlWm9uZUNoZWNrJyldID09PSB0cnVlO1xuXHQgICAgaWYgKGdsb2JhbFsnWm9uZSddICYmIChjaGVja0R1cGxpY2F0ZSB8fCB0eXBlb2YgZ2xvYmFsWydab25lJ10uX19zeW1ib2xfXyAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmUgYWxyZWFkeSBsb2FkZWQuJyk7XG5cdCAgICB9XG5cdCAgICAvLyBJbml0aWFsaXplIGdsb2JhbCBgWm9uZWAgY29uc3RhbnQuXG5cdCAgICBnbG9iYWxbJ1pvbmUnXSA/Pz0gaW5pdFpvbmUoKTtcblx0ICAgIHJldHVybiBnbG9iYWxbJ1pvbmUnXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdXBwcmVzcyBjbG9zdXJlIGNvbXBpbGVyIGVycm9ycyBhYm91dCB1bmtub3duICdab25lJyB2YXJpYWJsZVxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFycyxnbG9iYWxUaGlzLG1pc3NpbmdSZXF1aXJlfVxuXHQgKi9cblx0Ly8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIvPlxuXHQvLyBpc3N1ZSAjOTg5LCB0byByZWR1Y2UgYnVuZGxlIHNpemUsIHVzZSBzaG9ydCBuYW1lXG5cdC8qKiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICovXG5cdGNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdC8qKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgKi9cblx0Y29uc3QgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdC8qKiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgKi9cblx0Y29uc3QgT2JqZWN0R2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cdC8qKiBPYmplY3QuY3JlYXRlICovXG5cdGNvbnN0IE9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cdC8qKiBBcnJheS5wcm90b3R5cGUuc2xpY2UgKi9cblx0Y29uc3QgQXJyYXlTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblx0LyoqIGFkZEV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IEFERF9FVkVOVF9MSVNURU5FUl9TVFIgPSAnYWRkRXZlbnRMaXN0ZW5lcic7XG5cdC8qKiByZW1vdmVFdmVudExpc3RlbmVyIHN0cmluZyBjb25zdCAqL1xuXHRjb25zdCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuXHQvKiogem9uZVN5bWJvbCBhZGRFdmVudExpc3RlbmVyICovXG5cdGNvbnN0IFpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiA9IF9fc3ltYm9sX18oQUREX0VWRU5UX0xJU1RFTkVSX1NUUik7XG5cdC8qKiB6b25lU3ltYm9sIHJlbW92ZUV2ZW50TGlzdGVuZXIgKi9cblx0Y29uc3QgWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gX19zeW1ib2xfXyhSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSKTtcblx0LyoqIHRydWUgc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IFRSVUVfU1RSID0gJ3RydWUnO1xuXHQvKiogZmFsc2Ugc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IEZBTFNFX1NUUiA9ICdmYWxzZSc7XG5cdC8qKiBab25lIHN5bWJvbCBwcmVmaXggc3RyaW5nIGNvbnN0LiAqL1xuXHRjb25zdCBaT05FX1NZTUJPTF9QUkVGSVggPSBfX3N5bWJvbF9fKCcnKTtcblx0ZnVuY3Rpb24gd3JhcFdpdGhDdXJyZW50Wm9uZShjYWxsYmFjaywgc291cmNlKSB7XG5cdCAgICByZXR1cm4gWm9uZS5jdXJyZW50LndyYXAoY2FsbGJhY2ssIHNvdXJjZSk7XG5cdH1cblx0ZnVuY3Rpb24gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuXHQgICAgcmV0dXJuIFpvbmUuY3VycmVudC5zY2hlZHVsZU1hY3JvVGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKTtcblx0fVxuXHRjb25zdCB6b25lU3ltYm9sID0gX19zeW1ib2xfXztcblx0Y29uc3QgaXNXaW5kb3dFeGlzdHMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcblx0Y29uc3QgaW50ZXJuYWxXaW5kb3cgPSBpc1dpbmRvd0V4aXN0cyA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcblx0Y29uc3QgX2dsb2JhbCA9IChpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvdykgfHwgZ2xvYmFsVGhpcztcblx0Y29uc3QgUkVNT1ZFX0FUVFJJQlVURSA9ICdyZW1vdmVBdHRyaWJ1dGUnO1xuXHRmdW5jdGlvbiBiaW5kQXJndW1lbnRzKGFyZ3MsIHNvdXJjZSkge1xuXHQgICAgZm9yIChsZXQgaSA9IGFyZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgYXJnc1tpXSA9IHdyYXBXaXRoQ3VycmVudFpvbmUoYXJnc1tpXSwgc291cmNlICsgJ18nICsgaSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGFyZ3M7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hQcm90b3R5cGUocHJvdG90eXBlLCBmbk5hbWVzKSB7XG5cdCAgICBjb25zdCBzb3VyY2UgPSBwcm90b3R5cGUuY29uc3RydWN0b3JbJ25hbWUnXTtcblx0ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm5OYW1lcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGNvbnN0IG5hbWUgPSBmbk5hbWVzW2ldO1xuXHQgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gcHJvdG90eXBlW25hbWVdO1xuXHQgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICBjb25zdCBwcm90b3R5cGVEZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbmFtZSk7XG5cdCAgICAgICAgICAgIGlmICghaXNQcm9wZXJ0eVdyaXRhYmxlKHByb3RvdHlwZURlc2MpKSB7XG5cdCAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBwcm90b3R5cGVbbmFtZV0gPSAoKGRlbGVnYXRlKSA9PiB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwYXRjaGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5hcHBseSh0aGlzLCBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgc291cmNlICsgJy4nICsgbmFtZSkpO1xuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBkZWxlZ2F0ZSk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hlZDtcblx0ICAgICAgICAgICAgfSkoZGVsZWdhdGUpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBpc1Byb3BlcnR5V3JpdGFibGUocHJvcGVydHlEZXNjKSB7XG5cdCAgICBpZiAoIXByb3BlcnR5RGVzYykge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHByb3BlcnR5RGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gISh0eXBlb2YgcHJvcGVydHlEZXNjLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvcGVydHlEZXNjLnNldCA9PT0gJ3VuZGVmaW5lZCcpO1xuXHR9XG5cdGNvbnN0IGlzV2ViV29ya2VyID0gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG5cdC8vIE1ha2Ugc3VyZSB0byBhY2Nlc3MgYHByb2Nlc3NgIHRocm91Z2ggYF9nbG9iYWxgIHNvIHRoYXQgV2ViUGFjayBkb2VzIG5vdCBhY2NpZGVudGFsbHkgYnJvd3NlcmlmeVxuXHQvLyB0aGlzIGNvZGUuXG5cdGNvbnN0IGlzTm9kZSA9ICEoJ253JyBpbiBfZ2xvYmFsKSAmJlxuXHQgICAgdHlwZW9mIF9nbG9iYWwucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcblx0ICAgIF9nbG9iYWwucHJvY2Vzcy50b1N0cmluZygpID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG5cdGNvbnN0IGlzQnJvd3NlciA9ICFpc05vZGUgJiYgIWlzV2ViV29ya2VyICYmICEhKGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93WydIVE1MRWxlbWVudCddKTtcblx0Ly8gd2UgYXJlIGluIGVsZWN0cm9uIG9mIG53LCBzbyB3ZSBhcmUgYm90aCBicm93c2VyIGFuZCBub2RlanNcblx0Ly8gTWFrZSBzdXJlIHRvIGFjY2VzcyBgcHJvY2Vzc2AgdGhyb3VnaCBgX2dsb2JhbGAgc28gdGhhdCBXZWJQYWNrIGRvZXMgbm90IGFjY2lkZW50YWxseSBicm93c2VyaWZ5XG5cdC8vIHRoaXMgY29kZS5cblx0Y29uc3QgaXNNaXggPSB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuXHQgICAgX2dsb2JhbC5wcm9jZXNzLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJyAmJlxuXHQgICAgIWlzV2ViV29ya2VyICYmXG5cdCAgICAhIShpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvd1snSFRNTEVsZW1lbnQnXSk7XG5cdGNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzJDEgPSB7fTtcblx0Y29uc3QgZW5hYmxlQmVmb3JldW5sb2FkU3ltYm9sID0gem9uZVN5bWJvbCgnZW5hYmxlX2JlZm9yZXVubG9hZCcpO1xuXHRjb25zdCB3cmFwRm4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzkxMSwgaW4gSUUsIHNvbWV0aW1lc1xuXHQgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuXHQgICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50O1xuXHQgICAgaWYgKCFldmVudCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGxldCBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdO1xuXHQgICAgaWYgKCFldmVudE5hbWVTeW1ib2wpIHtcblx0ICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnQudHlwZSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsO1xuXHQgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcblx0ICAgIGxldCByZXN1bHQ7XG5cdCAgICBpZiAoaXNCcm93c2VyICYmIHRhcmdldCA9PT0gaW50ZXJuYWxXaW5kb3cgJiYgZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xuXHQgICAgICAgIC8vIHdpbmRvdy5vbmVycm9yIGhhdmUgZGlmZmVyZW50IHNpZ25hdHVyZVxuXHQgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HbG9iYWxFdmVudEhhbmRsZXJzL29uZXJyb3Ijd2luZG93Lm9uZXJyb3Jcblx0ICAgICAgICAvLyBhbmQgb25lcnJvciBjYWxsYmFjayB3aWxsIHByZXZlbnQgZGVmYXVsdCB3aGVuIGNhbGxiYWNrIHJldHVybiB0cnVlXG5cdCAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50O1xuXHQgICAgICAgIHJlc3VsdCA9XG5cdCAgICAgICAgICAgIGxpc3RlbmVyICYmXG5cdCAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGVycm9yRXZlbnQubWVzc2FnZSwgZXJyb3JFdmVudC5maWxlbmFtZSwgZXJyb3JFdmVudC5saW5lbm8sIGVycm9yRXZlbnQuY29sbm8sIGVycm9yRXZlbnQuZXJyb3IpO1xuXHQgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcblx0ICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICByZXN1bHQgPSBsaXN0ZW5lciAmJiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIGlmIChcblx0ICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80NzU3OVxuXHQgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNTI1L2hpc3RvcnkuaHRtbCNiZWZvcmV1bmxvYWRldmVudFxuXHQgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3BlY2lmaWMgY2FzZSB3ZSBzaG91bGQgY2hlY2sgZm9yLiBUaGUgc3BlYyBkZWZpbmVzIHRoYXQgdGhlXG5cdCAgICAgICAgLy8gYHJldHVyblZhbHVlYCBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgbWVzc2FnZSB0byBzaG93IHRoZSB1c2VyLiBXaGVuIHRoZSBldmVudFxuXHQgICAgICAgIC8vIGlzIGNyZWF0ZWQsIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG5cdCAgICAgICAgZXZlbnQudHlwZSA9PT0gJ2JlZm9yZXVubG9hZCcgJiZcblx0ICAgICAgICAgICAgLy8gVG8gcHJldmVudCBhbnkgYnJlYWtpbmcgY2hhbmdlcyByZXN1bHRpbmcgZnJvbSB0aGlzIGNoYW5nZSwgZ2l2ZW4gdGhhdFxuXHQgICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGZhaWx1cmVzIGluIEczLCB3ZSBoYXZlIGhpZGRlblxuXHQgICAgICAgICAgICAvLyB0aGF0IGJlaGF2aW9yIGJlaGluZCBhIGdsb2JhbCBjb25maWd1cmF0aW9uIGZsYWcuIENvbnN1bWVycyBjYW4gZW5hYmxlIHRoaXNcblx0ICAgICAgICAgICAgLy8gZmxhZyBleHBsaWNpdGx5IGlmIHRoZXkgd2FudCB0aGUgYGJlZm9yZXVubG9hZGAgZXZlbnQgdG8gYmUgaGFuZGxlZCBhcyBkZWZpbmVkXG5cdCAgICAgICAgICAgIC8vIGluIHRoZSBzcGVjaWZpY2F0aW9uLlxuXHQgICAgICAgICAgICBfZ2xvYmFsW2VuYWJsZUJlZm9yZXVubG9hZFN5bWJvbF0gJiZcblx0ICAgICAgICAgICAgLy8gVGhlIElETCBldmVudCBkZWZpbml0aW9uIGlzIGBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJldHVyblZhbHVlYCwgc28gd2UgY2hlY2sgd2hldGhlclxuXHQgICAgICAgICAgICAvLyBgdHlwZW9mIHJlc3VsdGAgaXMgYSBzdHJpbmcuXG5cdCAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gcmVzdWx0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkICYmICFyZXN1bHQpIHtcblx0ICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXHRmdW5jdGlvbiBwYXRjaFByb3BlcnR5KG9iaiwgcHJvcCwgcHJvdG90eXBlKSB7XG5cdCAgICBsZXQgZGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuXHQgICAgaWYgKCFkZXNjICYmIHByb3RvdHlwZSkge1xuXHQgICAgICAgIC8vIHdoZW4gcGF0Y2ggd2luZG93IG9iamVjdCwgdXNlIHByb3RvdHlwZSB0byBjaGVjayBwcm9wIGV4aXN0IG9yIG5vdFxuXHQgICAgICAgIGNvbnN0IHByb3RvdHlwZURlc2MgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBwcm9wKTtcblx0ICAgICAgICBpZiAocHJvdG90eXBlRGVzYykge1xuXHQgICAgICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLyBpZiB0aGUgZGVzY3JpcHRvciBub3QgZXhpc3RzIG9yIGlzIG5vdCBjb25maWd1cmFibGVcblx0ICAgIC8vIGp1c3QgcmV0dXJuXG5cdCAgICBpZiAoIWRlc2MgfHwgIWRlc2MuY29uZmlndXJhYmxlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgb25Qcm9wUGF0Y2hlZFN5bWJvbCA9IHpvbmVTeW1ib2woJ29uJyArIHByb3AgKyAncGF0Y2hlZCcpO1xuXHQgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShvblByb3BQYXRjaGVkU3ltYm9sKSAmJiBvYmpbb25Qcm9wUGF0Y2hlZFN5bWJvbF0pIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICAvLyBBIHByb3BlcnR5IGRlc2NyaXB0b3IgY2Fubm90IGhhdmUgZ2V0dGVyL3NldHRlciBhbmQgYmUgd3JpdGFibGVcblx0ICAgIC8vIGRlbGV0aW5nIHRoZSB3cml0YWJsZSBhbmQgdmFsdWUgcHJvcGVydGllcyBhdm9pZHMgdGhpcyBlcnJvcjpcblx0ICAgIC8vXG5cdCAgICAvLyBUeXBlRXJyb3I6IHByb3BlcnR5IGRlc2NyaXB0b3JzIG11c3Qgbm90IHNwZWNpZnkgYSB2YWx1ZSBvciBiZSB3cml0YWJsZSB3aGVuIGFcblx0ICAgIC8vIGdldHRlciBvciBzZXR0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkXG5cdCAgICBkZWxldGUgZGVzYy53cml0YWJsZTtcblx0ICAgIGRlbGV0ZSBkZXNjLnZhbHVlO1xuXHQgICAgY29uc3Qgb3JpZ2luYWxEZXNjR2V0ID0gZGVzYy5nZXQ7XG5cdCAgICBjb25zdCBvcmlnaW5hbERlc2NTZXQgPSBkZXNjLnNldDtcblx0ICAgIC8vIHNsaWNlKDIpIGN1eiAnb25jbGljaycgLT4gJ2NsaWNrJywgZXRjXG5cdCAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wLnNsaWNlKDIpO1xuXHQgICAgbGV0IGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTtcblx0ICAgIGlmICghZXZlbnROYW1lU3ltYm9sKSB7XG5cdCAgICAgICAgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnROYW1lKTtcblx0ICAgIH1cblx0ICAgIGRlc2Muc2V0ID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG5cdCAgICAgICAgLy8gSW4gc29tZSB2ZXJzaW9ucyBvZiBXaW5kb3dzLCB0aGUgYHRoaXNgIGNvbnRleHQgbWF5IGJlIHVuZGVmaW5lZFxuXHQgICAgICAgIC8vIGluIG9uLXByb3BlcnR5IGNhbGxiYWNrcy5cblx0ICAgICAgICAvLyBUbyBoYW5kbGUgdGhpcyBlZGdlIGNhc2UsIHdlIGNoZWNrIGlmIGB0aGlzYCBpcyBmYWxzeSBhbmRcblx0ICAgICAgICAvLyBmYWxsYmFjayB0byBgX2dsb2JhbGAgaWYgbmVlZGVkLlxuXHQgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzO1xuXHQgICAgICAgIGlmICghdGFyZ2V0ICYmIG9iaiA9PT0gX2dsb2JhbCkge1xuXHQgICAgICAgICAgICB0YXJnZXQgPSBfZ2xvYmFsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRhcmdldCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcblx0ICAgICAgICBpZiAodHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85Nzhcblx0ICAgICAgICAvLyBJZiBhbiBpbmxpbmUgaGFuZGxlciAobGlrZSBgb25sb2FkYCkgd2FzIGRlZmluZWQgYmVmb3JlIHpvbmUuanMgd2FzIGxvYWRlZCxcblx0ICAgICAgICAvLyBjYWxsIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yJ3Mgc2V0dGVyIHRvIGNsZWFuIGl0IHVwLlxuXHQgICAgICAgIG9yaWdpbmFsRGVzY1NldD8uY2FsbCh0YXJnZXQsIG51bGwpO1xuXHQgICAgICAgIHRhcmdldFtldmVudE5hbWVTeW1ib2xdID0gbmV3VmFsdWU7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHdyYXBGbiwgZmFsc2UpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBUaGUgZ2V0dGVyIHdvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIHVuYXNzaWduZWQgcHJvcGVydGllcyBidXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW5cblx0ICAgIC8vIHVuYXNzaWduZWQgcHJvcGVydHkgaXMgbnVsbFxuXHQgICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gaW4gc29tZSBvZiB3aW5kb3dzJ3Mgb25wcm9wZXJ0eSBjYWxsYmFjaywgdGhpcyBpcyB1bmRlZmluZWRcblx0ICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0XG5cdCAgICAgICAgbGV0IHRhcmdldCA9IHRoaXM7XG5cdCAgICAgICAgaWYgKCF0YXJnZXQgJiYgb2JqID09PSBfZ2xvYmFsKSB7XG5cdCAgICAgICAgICAgIHRhcmdldCA9IF9nbG9iYWw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGFyZ2V0KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRhcmdldFtldmVudE5hbWVTeW1ib2xdO1xuXHQgICAgICAgIGlmIChsaXN0ZW5lcikge1xuXHQgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKG9yaWdpbmFsRGVzY0dldCkge1xuXHQgICAgICAgICAgICAvLyByZXN1bHQgd2lsbCBiZSBudWxsIHdoZW4gdXNlIGlubGluZSBldmVudCBhdHRyaWJ1dGUsXG5cdCAgICAgICAgICAgIC8vIHN1Y2ggYXMgPGJ1dHRvbiBvbmNsaWNrPVwiZnVuYygpO1wiPk9LPC9idXR0b24+XG5cdCAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIG9uY2xpY2sgZnVuY3Rpb24gaXMgaW50ZXJuYWwgcmF3IHVuY29tcGlsZWQgaGFuZGxlclxuXHQgICAgICAgICAgICAvLyB0aGUgb25jbGljayB3aWxsIGJlIGV2YWx1YXRlZCB3aGVuIGZpcnN0IHRpbWUgZXZlbnQgd2FzIHRyaWdnZXJlZCBvclxuXHQgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgYWNjZXNzZWQsIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzUyNVxuXHQgICAgICAgICAgICAvLyBzbyB3ZSBzaG91bGQgdXNlIG9yaWdpbmFsIG5hdGl2ZSBnZXQgdG8gcmV0cmlldmUgdGhlIGhhbmRsZXJcblx0ICAgICAgICAgICAgbGV0IHZhbHVlID0gb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgZGVzYy5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9O1xuXHQgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjKTtcblx0ICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hPblByb3BlcnRpZXMob2JqLCBwcm9wZXJ0aWVzLCBwcm90b3R5cGUpIHtcblx0ICAgIGlmIChwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHBhdGNoUHJvcGVydHkob2JqLCAnb24nICsgcHJvcGVydGllc1tpXSwgcHJvdG90eXBlKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICBjb25zdCBvblByb3BlcnRpZXMgPSBbXTtcblx0ICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG5cdCAgICAgICAgICAgIGlmIChwcm9wLnNsaWNlKDAsIDIpID09ICdvbicpIHtcblx0ICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgICAgICAgIHBhdGNoUHJvcGVydHkob2JqLCBvblByb3BlcnRpZXNbal0sIHByb3RvdHlwZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cdGNvbnN0IG9yaWdpbmFsSW5zdGFuY2VLZXkgPSB6b25lU3ltYm9sKCdvcmlnaW5hbEluc3RhbmNlJyk7XG5cdC8vIHdyYXAgc29tZSBuYXRpdmUgQVBJIG9uIGB3aW5kb3dgXG5cdGZ1bmN0aW9uIHBhdGNoQ2xhc3MoY2xhc3NOYW1lKSB7XG5cdCAgICBjb25zdCBPcmlnaW5hbENsYXNzID0gX2dsb2JhbFtjbGFzc05hbWVdO1xuXHQgICAgaWYgKCFPcmlnaW5hbENsYXNzKVxuXHQgICAgICAgIHJldHVybjtcblx0ICAgIC8vIGtlZXAgb3JpZ2luYWwgY2xhc3MgaW4gZ2xvYmFsXG5cdCAgICBfZ2xvYmFsW3pvbmVTeW1ib2woY2xhc3NOYW1lKV0gPSBPcmlnaW5hbENsYXNzO1xuXHQgICAgX2dsb2JhbFtjbGFzc05hbWVdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGNvbnN0IGEgPSBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgY2xhc3NOYW1lKTtcblx0ICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMDpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcygpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMTpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDI6XG5cdCAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAzOlxuXHQgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0sIGFbMl0pO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNDpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmcgbGlzdCB0b28gbG9uZy4nKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gYXR0YWNoIG9yaWdpbmFsIGRlbGVnYXRlIHRvIHBhdGNoZWQgZnVuY3Rpb25cblx0ICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpO1xuXHQgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgT3JpZ2luYWxDbGFzcyhmdW5jdGlvbiAoKSB7IH0pO1xuXHQgICAgbGV0IHByb3A7XG5cdCAgICBmb3IgKHByb3AgaW4gaW5zdGFuY2UpIHtcblx0ICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQ3MjFcblx0ICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnWE1MSHR0cFJlcXVlc3QnICYmIHByb3AgPT09ICdyZXNwb25zZUJsb2InKVxuXHQgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAoZnVuY3Rpb24gKHByb3ApIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXS5hcHBseSh0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGUsIHByb3AsIHtcblx0ICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChmbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdID0gd3JhcFdpdGhDdXJyZW50Wm9uZShmbiwgY2xhc3NOYW1lICsgJy4nICsgcHJvcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGNhbGxiYWNrIGluIHdyYXBwZWQgZnVuY3Rpb24gc28gd2UgY2FuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgaXQgaW4gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nIHRvIHJldHVyblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBvbmUuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSwgZm4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSA9IGZuO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF07XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSkocHJvcCk7XG5cdCAgICB9XG5cdCAgICBmb3IgKHByb3AgaW4gT3JpZ2luYWxDbGFzcykge1xuXHQgICAgICAgIGlmIChwcm9wICE9PSAncHJvdG90eXBlJyAmJiBPcmlnaW5hbENsYXNzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG5cdCAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXVtwcm9wXSA9IE9yaWdpbmFsQ2xhc3NbcHJvcF07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cdGZ1bmN0aW9uIHBhdGNoTWV0aG9kKHRhcmdldCwgbmFtZSwgcGF0Y2hGbikge1xuXHQgICAgbGV0IHByb3RvID0gdGFyZ2V0O1xuXHQgICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuXHQgICAgICAgIHByb3RvID0gT2JqZWN0R2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHQgICAgfVxuXHQgICAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHtcblx0ICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG5cdCAgICAgICAgcHJvdG8gPSB0YXJnZXQ7XG5cdCAgICB9XG5cdCAgICBjb25zdCBkZWxlZ2F0ZU5hbWUgPSB6b25lU3ltYm9sKG5hbWUpO1xuXHQgICAgbGV0IGRlbGVnYXRlID0gbnVsbDtcblx0ICAgIGlmIChwcm90byAmJiAoIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eShkZWxlZ2F0ZU5hbWUpKSkge1xuXHQgICAgICAgIGRlbGVnYXRlID0gcHJvdG9bZGVsZWdhdGVOYW1lXSA9IHByb3RvW25hbWVdO1xuXHQgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcHJvdG9bbmFtZV0gaXMgd3JpdGFibGVcblx0ICAgICAgICAvLyBzb21lIHByb3BlcnR5IGlzIHJlYWRvbmx5IGluIHNhZmFyaSwgc3VjaCBhcyBIdG1sQ2FudmFzRWxlbWVudC5wcm90b3R5cGUudG9CbG9iXG5cdCAgICAgICAgY29uc3QgZGVzYyA9IHByb3RvICYmIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbmFtZSk7XG5cdCAgICAgICAgaWYgKGlzUHJvcGVydHlXcml0YWJsZShkZXNjKSkge1xuXHQgICAgICAgICAgICBjb25zdCBwYXRjaERlbGVnYXRlID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTtcblx0ICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hEZWxlZ2F0ZSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bbmFtZV0sIGRlbGVnYXRlKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZGVsZWdhdGU7XG5cdH1cblx0Ly8gVE9ETzogQEppYUxpUGFzc2lvbiwgc3VwcG9ydCBjYW5jZWwgdGFzayBsYXRlciBpZiBuZWNlc3Nhcnlcblx0ZnVuY3Rpb24gcGF0Y2hNYWNyb1Rhc2sob2JqLCBmdW5jTmFtZSwgbWV0YUNyZWF0b3IpIHtcblx0ICAgIGxldCBzZXROYXRpdmUgPSBudWxsO1xuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcblx0ICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuXHQgICAgICAgIGRhdGEuYXJnc1tkYXRhLmNiSWR4XSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHNldE5hdGl2ZS5hcHBseShkYXRhLnRhcmdldCwgZGF0YS5hcmdzKTtcblx0ICAgICAgICByZXR1cm4gdGFzaztcblx0ICAgIH1cblx0ICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKG9iaiwgZnVuY05hbWUsIChkZWxlZ2F0ZSkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcblx0ICAgICAgICBjb25zdCBtZXRhID0gbWV0YUNyZWF0b3Ioc2VsZiwgYXJncyk7XG5cdCAgICAgICAgaWYgKG1ldGEuY2JJZHggPj0gMCAmJiB0eXBlb2YgYXJnc1ttZXRhLmNiSWR4XSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUobWV0YS5uYW1lLCBhcmdzW21ldGEuY2JJZHhdLCBtZXRhLCBzY2hlZHVsZVRhc2spO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9XG5cdGZ1bmN0aW9uIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBvcmlnaW5hbCkge1xuXHQgICAgcGF0Y2hlZFt6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyldID0gb3JpZ2luYWw7XG5cdH1cblx0bGV0IGlzRGV0ZWN0ZWRJRU9yRWRnZSA9IGZhbHNlO1xuXHRsZXQgaWVPckVkZ2UgPSBmYWxzZTtcblx0ZnVuY3Rpb24gaXNJRU9yRWRnZSgpIHtcblx0ICAgIGlmIChpc0RldGVjdGVkSUVPckVkZ2UpIHtcblx0ICAgICAgICByZXR1cm4gaWVPckVkZ2U7XG5cdCAgICB9XG5cdCAgICBpc0RldGVjdGVkSUVPckVkZ2UgPSB0cnVlO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICBjb25zdCB1YSA9IGludGVybmFsV2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cdCAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0VkZ2UvJykgIT09IC0xKSB7XG5cdCAgICAgICAgICAgIGllT3JFZGdlID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjYXRjaCAoZXJyb3IpIHsgfVxuXHQgICAgcmV0dXJuIGllT3JFZGdlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG5cdH1cblx0ZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdC8vIGFuIGlkZW50aWZpZXIgdG8gdGVsbCBab25lVGFzayBkbyBub3QgY3JlYXRlIGEgbmV3IGludm9rZSBjbG9zdXJlXG5cdGNvbnN0IE9QVElNSVpFRF9aT05FX0VWRU5UX1RBU0tfREFUQSA9IHtcblx0ICAgIHVzZUc6IHRydWUsXG5cdH07XG5cdGNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzID0ge307XG5cdGNvbnN0IGdsb2JhbFNvdXJjZXMgPSB7fTtcblx0Y29uc3QgRVZFTlRfTkFNRV9TWU1CT0xfUkVHWCA9IG5ldyBSZWdFeHAoJ14nICsgWk9ORV9TWU1CT0xfUFJFRklYICsgJyhcXFxcdyspKHRydWV8ZmFsc2UpJCcpO1xuXHRjb25zdCBJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MID0gem9uZVN5bWJvbCgncHJvcGFnYXRpb25TdG9wcGVkJyk7XG5cdGZ1bmN0aW9uIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSwgZXZlbnROYW1lVG9TdHJpbmcpIHtcblx0ICAgIGNvbnN0IGZhbHNlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBGQUxTRV9TVFI7XG5cdCAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBUUlVFX1NUUjtcblx0ICAgIGNvbnN0IHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lO1xuXHQgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hFdmVudFRhcmdldChfZ2xvYmFsLCBhcGksIGFwaXMsIHBhdGNoT3B0aW9ucykge1xuXHQgICAgY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuYWRkKSB8fCBBRERfRVZFTlRfTElTVEVORVJfU1RSO1xuXHQgICAgY29uc3QgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm0pIHx8IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI7XG5cdCAgICBjb25zdCBMSVNURU5FUlNfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5saXN0ZW5lcnMpIHx8ICdldmVudExpc3RlbmVycyc7XG5cdCAgICBjb25zdCBSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUiA9IChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJtQWxsKSB8fCAncmVtb3ZlQWxsTGlzdGVuZXJzJztcblx0ICAgIGNvbnN0IHpvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyID0gem9uZVN5bWJvbChBRERfRVZFTlRfTElTVEVORVIpO1xuXHQgICAgY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIEFERF9FVkVOVF9MSVNURU5FUiArICc6Jztcblx0ICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVIgPSAncHJlcGVuZExpc3RlbmVyJztcblx0ICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFID0gJy4nICsgUFJFUEVORF9FVkVOVF9MSVNURU5FUiArICc6Jztcblx0ICAgIGNvbnN0IGludm9rZVRhc2sgPSBmdW5jdGlvbiAodGFzaywgdGFyZ2V0LCBldmVudCkge1xuXHQgICAgICAgIC8vIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIGNoZWNrIGlzUmVtb3ZlZCB3aGljaCBpcyBzZXRcblx0ICAgICAgICAvLyBieSByZW1vdmVFdmVudExpc3RlbmVyXG5cdCAgICAgICAgaWYgKHRhc2suaXNSZW1vdmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3QgZGVsZWdhdGUgPSB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgIGlmICh0eXBlb2YgZGVsZWdhdGUgPT09ICdvYmplY3QnICYmIGRlbGVnYXRlLmhhbmRsZUV2ZW50KSB7XG5cdCAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmluZCB2ZXJzaW9uIG9mIGhhbmRsZUV2ZW50IHdoZW4gaW52b2tlXG5cdCAgICAgICAgICAgIHRhc2suY2FsbGJhY2sgPSAoZXZlbnQpID0+IGRlbGVnYXRlLmhhbmRsZUV2ZW50KGV2ZW50KTtcblx0ICAgICAgICAgICAgdGFzay5vcmlnaW5hbERlbGVnYXRlID0gZGVsZWdhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIGludm9rZSBzdGF0aWMgdGFzay5pbnZva2Vcblx0ICAgICAgICAvLyBuZWVkIHRvIHRyeS9jYXRjaCBlcnJvciBoZXJlLCBvdGhlcndpc2UsIHRoZSBlcnJvciBpbiBvbmUgZXZlbnQgbGlzdGVuZXJcblx0ICAgICAgICAvLyB3aWxsIGJyZWFrIHRoZSBleGVjdXRpb25zIG9mIHRoZSBvdGhlciBldmVudCBsaXN0ZW5lcnMuIEFsc28gZXJyb3Igd2lsbFxuXHQgICAgICAgIC8vIG5vdCByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gYG9uY2VgIG9wdGlvbnMgaXMgdHJ1ZS5cblx0ICAgICAgICBsZXQgZXJyb3I7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgdGFzay5pbnZva2UodGFzaywgdGFyZ2V0LCBbZXZlbnRdKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBlcnJvciA9IGVycjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRhc2sub3B0aW9ucztcblx0ICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5vbmNlKSB7XG5cdCAgICAgICAgICAgIC8vIGlmIG9wdGlvbnMub25jZSBpcyB0cnVlLCBhZnRlciBpbnZva2Ugb25jZSByZW1vdmUgbGlzdGVuZXIgaGVyZVxuXHQgICAgICAgICAgICAvLyBvbmx5IGJyb3dzZXIgbmVlZCB0byBkbyB0aGlzLCBub2RlanMgZXZlbnRFbWl0dGVyIHdpbGwgY2FsIHJlbW92ZUxpc3RlbmVyXG5cdCAgICAgICAgICAgIC8vIGluc2lkZSBFdmVudEVtaXR0ZXIub25jZVxuXHQgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7XG5cdCAgICAgICAgICAgIHRhcmdldFtSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGFyZ2V0LCBldmVudC50eXBlLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBlcnJvcjtcblx0ICAgIH07XG5cdCAgICBmdW5jdGlvbiBnbG9iYWxDYWxsYmFjayhjb250ZXh0LCBldmVudCwgaXNDYXB0dXJlKSB7XG5cdCAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTExLCBpbiBJRSwgc29tZXRpbWVzXG5cdCAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuXHQgICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgX2dsb2JhbC5ldmVudDtcblx0ICAgICAgICBpZiAoIWV2ZW50KSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gZXZlbnQudGFyZ2V0IGlzIG5lZWRlZCBmb3IgU2Ftc3VuZyBUViBhbmQgU291cmNlQnVmZmVyXG5cdCAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTBcblx0ICAgICAgICBjb25zdCB0YXJnZXQgPSBjb250ZXh0IHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IHRhc2tzID0gdGFyZ2V0W3pvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50LnR5cGVdW2lzQ2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXV07XG5cdCAgICAgICAgaWYgKHRhc2tzKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXHQgICAgICAgICAgICAvLyBpbnZva2UgYWxsIHRhc2tzIHdoaWNoIGF0dGFjaGVkIHRvIGN1cnJlbnQgdGFyZ2V0IHdpdGggZ2l2ZW4gZXZlbnQudHlwZSBhbmQgY2FwdHVyZSA9IGZhbHNlXG5cdCAgICAgICAgICAgIC8vIGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCBpZiB0YXNrLmxlbmd0aCA9PT0gMSwganVzdCBpbnZva2Vcblx0ICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gaW52b2tlVGFzayh0YXNrc1swXSwgdGFyZ2V0LCBldmVudCk7XG5cdCAgICAgICAgICAgICAgICBlcnIgJiYgZXJyb3JzLnB1c2goZXJyKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzgzNlxuXHQgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdGFza3MgYXJyYXkgYmVmb3JlIGludm9rZSwgdG8gYXZvaWRcblx0ICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayB3aWxsIHJlbW92ZSBpdHNlbGYgb3Igb3RoZXIgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlUYXNrcyA9IHRhc2tzLnNsaWNlKCk7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvcHlUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudFtJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MXSA9PT0gdHJ1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gaW52b2tlVGFzayhjb3B5VGFza3NbaV0sIHRhcmdldCwgZXZlbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVyciAmJiBlcnJvcnMucHVzaChlcnIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGVycm9yLCB3ZSBkb24ndCBuZWVkIHRvIHNjaGVkdWxlIG1pY3JvVGFza1xuXHQgICAgICAgICAgICAvLyB0byB0aHJvdyB0aGUgZXJyb3IuXG5cdCAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yc1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICBhcGkubmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2soKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gZmFsc2Vcblx0ICAgIGNvbnN0IGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgcmV0dXJuIGdsb2JhbENhbGxiYWNrKHRoaXMsIGV2ZW50LCBmYWxzZSk7XG5cdCAgICB9O1xuXHQgICAgLy8gZ2xvYmFsIHNoYXJlZCB6b25lQXdhcmVDYWxsYmFjayB0byBoYW5kbGUgYWxsIGV2ZW50IGNhbGxiYWNrIHdpdGggY2FwdHVyZSA9IHRydWVcblx0ICAgIGNvbnN0IGdsb2JhbFpvbmVBd2FyZUNhcHR1cmVDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgIHJldHVybiBnbG9iYWxDYWxsYmFjayh0aGlzLCBldmVudCwgdHJ1ZSk7XG5cdCAgICB9O1xuXHQgICAgZnVuY3Rpb24gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMob2JqLCBwYXRjaE9wdGlvbnMpIHtcblx0ICAgICAgICBpZiAoIW9iaikge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGxldCB1c2VHbG9iYWxDYWxsYmFjayA9IHRydWU7XG5cdCAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudXNlRyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHVzZUdsb2JhbENhbGxiYWNrID0gcGF0Y2hPcHRpb25zLnVzZUc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHZhbGlkYXRlSGFuZGxlciA9IHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudmg7XG5cdCAgICAgICAgbGV0IGNoZWNrRHVwbGljYXRlID0gdHJ1ZTtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5jaGtEdXAgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZSA9IHBhdGNoT3B0aW9ucy5jaGtEdXA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGxldCByZXR1cm5UYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ydCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRhcmdldCA9IHBhdGNoT3B0aW9ucy5ydDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgbGV0IHByb3RvID0gb2JqO1xuXHQgICAgICAgIHdoaWxlIChwcm90byAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkoQUREX0VWRU5UX0xJU1RFTkVSKSkge1xuXHQgICAgICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFwcm90byAmJiBvYmpbQUREX0VWRU5UX0xJU1RFTkVSXSkge1xuXHQgICAgICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG5cdCAgICAgICAgICAgIHByb3RvID0gb2JqO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXByb3RvKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHByb3RvW3pvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyXSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IGV2ZW50TmFtZVRvU3RyaW5nID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ldmVudE5hbWVUb1N0cmluZztcblx0ICAgICAgICAvLyBXZSB1c2UgYSBzaGFyZWQgZ2xvYmFsIGB0YXNrRGF0YWAgdG8gcGFzcyBkYXRhIGZvciBgc2NoZWR1bGVFdmVudFRhc2tgLFxuXHQgICAgICAgIC8vIGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc29sZWx5IGZvciBwYXNzaW5nIGRhdGEuXG5cdCAgICAgICAgLy8gV0FSTklORzogVGhpcyBvYmplY3QgaGFzIGEgc3RhdGljIGxpZmV0aW1lLCBtZWFuaW5nIGl0IGlzIG5vdCBjcmVhdGVkXG5cdCAgICAgICAgLy8gZWFjaCB0aW1lIGBhZGRFdmVudExpc3RlbmVyYCBpcyBjYWxsZWQuIEl0IGlzIGluc3RhbnRpYXRlZCBvbmx5IG9uY2Vcblx0ICAgICAgICAvLyBhbmQgY2FwdHVyZWQgYnkgcmVmZXJlbmNlIGluc2lkZSB0aGUgYGFkZEV2ZW50TGlzdGVuZXJgIGFuZFxuXHQgICAgICAgIC8vIGByZW1vdmVFdmVudExpc3RlbmVyYCBmdW5jdGlvbnMuIERvIG5vdCBhZGQgYW55IG5ldyBwcm9wZXJ0aWVzIHRvIHRoaXNcblx0ICAgICAgICAvLyBvYmplY3QsIGFzIGRvaW5nIHNvIHdvdWxkIG5lY2Vzc2l0YXRlIG1haW50YWluaW5nIHRoZSBpbmZvcm1hdGlvblxuXHQgICAgICAgIC8vIGJldHdlZW4gYGFkZEV2ZW50TGlzdGVuZXJgIGNhbGxzLlxuXHQgICAgICAgIGNvbnN0IHRhc2tEYXRhID0ge307XG5cdCAgICAgICAgY29uc3QgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lciA9IChwcm90b1t6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lcl0gPSBwcm90b1tBRERfRVZFTlRfTElTVEVORVJdKTtcblx0ICAgICAgICBjb25zdCBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyID0gKHByb3RvW3pvbmVTeW1ib2woUkVNT1ZFX0VWRU5UX0xJU1RFTkVSKV0gPVxuXHQgICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdKTtcblx0ICAgICAgICBjb25zdCBuYXRpdmVMaXN0ZW5lcnMgPSAocHJvdG9bem9uZVN5bWJvbChMSVNURU5FUlNfRVZFTlRfTElTVEVORVIpXSA9XG5cdCAgICAgICAgICAgIHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0pO1xuXHQgICAgICAgIGNvbnN0IG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyA9IChwcm90b1t6b25lU3ltYm9sKFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSKV0gPVxuXHQgICAgICAgICAgICBwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0pO1xuXHQgICAgICAgIGxldCBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcjtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5wcmVwZW5kKSB7XG5cdCAgICAgICAgICAgIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbChwYXRjaE9wdGlvbnMucHJlcGVuZCldID1cblx0ICAgICAgICAgICAgICAgIHByb3RvW3BhdGNoT3B0aW9ucy5wcmVwZW5kXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVGhpcyB1dGlsIGZ1bmN0aW9uIHdpbGwgYnVpbGQgYW4gb3B0aW9uIG9iamVjdCB3aXRoIHBhc3NpdmUgb3B0aW9uXG5cdCAgICAgICAgICogdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBpbnB1dCBmcm9tIHRoZSB1c2VyLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZ1bmN0aW9uIGJ1aWxkRXZlbnRMaXN0ZW5lck9wdGlvbnMob3B0aW9ucywgcGFzc2l2ZSkge1xuXHQgICAgICAgICAgICBpZiAoIXBhc3NpdmUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyBjYXB0dXJlOiBvcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLnBhc3NpdmUgIT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5vcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHRhc2sgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlLFxuXHQgICAgICAgICAgICAvLyBqdXN0IHJldHVybiwgYmVjYXVzZSB3ZSB1c2UgdGhlIHNoYXJlZCBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBoZXJlLlxuXHQgICAgICAgICAgICBpZiAodGFza0RhdGEuaXNFeGlzdGluZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVBZGRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2tEYXRhLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFza0RhdGEub3B0aW9ucyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbiB0aGUgY29udGV4dCBvZiBldmVudHMgYW5kIGxpc3RlbmVycywgdGhpcyBmdW5jdGlvbiB3aWxsIGJlXG5cdCAgICAgICAgICogY2FsbGVkIGF0IHRoZSBlbmQgYnkgYGNhbmNlbFRhc2tgLCB3aGljaCwgaW4gdHVybiwgY2FsbHMgYHRhc2suY2FuY2VsRm5gLlxuXHQgICAgICAgICAqIENhbmNlbGxpbmcgYSB0YXNrIGlzIHByaW1hcmlseSB1c2VkIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbVxuXHQgICAgICAgICAqIHRoZSB0YXNrIHRhcmdldC5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25zdCBjdXN0b21DYW5jZWxHbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuXHQgICAgICAgICAgICAvLyBpZiB0YXNrIGlzIG5vdCBtYXJrZWQgYXMgaXNSZW1vdmVkLCB0aGlzIGNhbGwgaXMgZGlyZWN0bHlcblx0ICAgICAgICAgICAgLy8gZnJvbSBab25lLnByb3RvdHlwZS5jYW5jZWxUYXNrLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB0YXNrXG5cdCAgICAgICAgICAgIC8vIGZyb20gdGFza3NMaXN0IG9mIHRhcmdldCBmaXJzdFxuXHQgICAgICAgICAgICBpZiAoIXRhc2suaXNSZW1vdmVkKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbdGFzay5ldmVudE5hbWVdO1xuXHQgICAgICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1t0YXNrLmNhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhc2sudGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrID09PSB0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpc1JlbW92ZWQgdG8gZGF0YSBmb3IgZmFzdGVyIGludm9rZVRhc2sgY2hlY2tcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaXNSZW1vdmVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmFsbFJlbW92ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sudGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gaWYgYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG5cdCAgICAgICAgICAgIC8vIHdlIHdpbGwgcmVhbGx5IHJlbW92ZSB0aGUgZ2xvYmFsIGV2ZW50IGNhbGxiYWNrLFxuXHQgICAgICAgICAgICAvLyBpZiBub3QsIHJldHVyblxuXHQgICAgICAgICAgICBpZiAoIXRhc2suYWxsUmVtb3ZlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgY3VzdG9tU2NoZWR1bGVQcmVwZW5kID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrRGF0YS5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbE5vbkdsb2JhbCA9IGZ1bmN0aW9uICh0YXNrKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlID0gdXNlR2xvYmFsQ2FsbGJhY2sgPyBjdXN0b21TY2hlZHVsZUdsb2JhbCA6IGN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbCA9IHVzZUdsb2JhbENhbGxiYWNrID8gY3VzdG9tQ2FuY2VsR2xvYmFsIDogY3VzdG9tQ2FuY2VsTm9uR2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IGNvbXBhcmVUYXNrQ2FsbGJhY2tWc0RlbGVnYXRlID0gZnVuY3Rpb24gKHRhc2ssIGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHR5cGVPZkRlbGVnYXRlID0gdHlwZW9mIGRlbGVnYXRlO1xuXHQgICAgICAgICAgICByZXR1cm4gKCh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXNrLmNhbGxiYWNrID09PSBkZWxlZ2F0ZSkgfHxcblx0ICAgICAgICAgICAgICAgICh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgdGFzay5vcmlnaW5hbERlbGVnYXRlID09PSBkZWxlZ2F0ZSkpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgY29tcGFyZSA9IHBhdGNoT3B0aW9ucz8uZGlmZiB8fCBjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZTtcblx0ICAgICAgICBjb25zdCB1bnBhdGNoZWRFdmVudHMgPSBab25lW3pvbmVTeW1ib2woJ1VOUEFUQ0hFRF9FVkVOVFMnKV07XG5cdCAgICAgICAgY29uc3QgcGFzc2l2ZUV2ZW50cyA9IF9nbG9iYWxbem9uZVN5bWJvbCgnUEFTU0lWRV9FVkVOVFMnKV07XG5cdCAgICAgICAgZnVuY3Rpb24gY29weUV2ZW50TGlzdGVuZXJPcHRpb25zKG9wdGlvbnMpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlc3RydWN0dXJlIHRoZSB0YXJnZXQgYG9wdGlvbnNgIG9iamVjdCBzaW5jZSBpdCBtYXlcblx0ICAgICAgICAgICAgICAgIC8vIGJlIGZyb3plbiBvciBzZWFsZWQgKHBvc3NpYmx5IHByb3ZpZGVkIGltcGxpY2l0bHkgYnkgYSB0aGlyZC1wYXJ0eVxuXHQgICAgICAgICAgICAgICAgLy8gbGlicmFyeSksIG9yIGl0cyBwcm9wZXJ0aWVzIG1heSBiZSByZWFkb25seS5cblx0ICAgICAgICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcblx0ICAgICAgICAgICAgICAgIC8vIFRoZSBgc2lnbmFsYCBvcHRpb24gd2FzIHJlY2VudGx5IGludHJvZHVjZWQsIHdoaWNoIGNhdXNlZCByZWdyZXNzaW9ucyBpblxuXHQgICAgICAgICAgICAgICAgLy8gdGhpcmQtcGFydHkgc2NlbmFyaW9zIHdoZXJlIGBBYm9ydENvbnRyb2xsZXJgIHdhcyBkaXJlY3RseSBwcm92aWRlZCB0b1xuXHQgICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgIGFzIG9wdGlvbnMuIEZvciBpbnN0YW5jZSwgaW4gY2FzZXMgbGlrZVxuXHQgICAgICAgICAgICAgICAgLy8gYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjYWxsYmFjaywgYWJvcnRDb250cm9sbGVySW5zdGFuY2UpYCxcblx0ICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIHZhbGlkIGJlY2F1c2UgYEFib3J0Q29udHJvbGxlcmAgaW5jbHVkZXMgYSBgc2lnbmFsYCBnZXR0ZXIsIHNwcmVhZGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gYHsuLi5vcHRpb25zfWAgd291bGRuJ3QgY29weSB0aGUgYHNpZ25hbGAuIEFkZGl0aW9uYWxseSwgdXNpbmcgYE9iamVjdC5jcmVhdGVgXG5cdCAgICAgICAgICAgICAgICAvLyBpc24ndCBmZWFzaWJsZSBzaW5jZSBgQWJvcnRDb250cm9sbGVyYCBpcyBhIGJ1aWx0LWluIG9iamVjdCB0eXBlLCBhbmQgYXR0ZW1wdGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBkaXJlY3RseSB3aXRoIGl0IGFzIHRoZSBwcm90b3R5cGUgbWlnaHQgcmVzdWx0IGluXG5cdCAgICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuXHQgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3T3B0aW9ucy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXdPcHRpb25zO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBtYWtlQWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAobmF0aXZlTGlzdGVuZXIsIGFkZFNvdXJjZSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4sIHJldHVyblRhcmdldCA9IGZhbHNlLCBwcmVwZW5kID0gZmFsc2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcblx0ICAgICAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gYXJndW1lbnRzWzFdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGlzTm9kZSAmJiBldmVudE5hbWUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwYXRjaCB1bmNhdWdodEV4Y2VwdGlvbiBvZiBub2RlanMgdG8gcHJldmVudCBlbmRsZXNzIGxvb3Bcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIFRvIGltcHJvdmUgYGFkZEV2ZW50TGlzdGVuZXJgIHBlcmZvcm1hbmNlLCB3ZSB3aWxsIGNyZWF0ZSB0aGUgY2FsbGJhY2tcblx0ICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGFzayBsYXRlciB3aGVuIHRoZSB0YXNrIGlzIGludm9rZWQuXG5cdCAgICAgICAgICAgICAgICBsZXQgaXNFdmVudExpc3RlbmVyT2JqZWN0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlbGVnYXRlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGVja3Mgd2hldGhlciB0aGUgcHJvdmlkZWQgbGlzdGVuZXIgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhIGBoYW5kbGVFdmVudGAgbWV0aG9kIChzaW5jZSB3ZSBjYW4gY2FsbCBgYWRkRXZlbnRMaXN0ZW5lcmAgd2l0aCBhXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gYGV2ZW50ID0+IC4uLmAgb3Igd2l0aCBhbiBvYmplY3QgYHsgaGFuZGxlRXZlbnQ6IGV2ZW50ID0+IC4uLiB9YCkuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZS5oYW5kbGVFdmVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaXNFdmVudExpc3RlbmVyT2JqZWN0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUhhbmRsZXIgJiYgIXZhbGlkYXRlSGFuZGxlcihuYXRpdmVMaXN0ZW5lciwgZGVsZWdhdGUsIHRhcmdldCwgYXJndW1lbnRzKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NpdmUgPSAhIXBhc3NpdmVFdmVudHMgJiYgcGFzc2l2ZUV2ZW50cy5pbmRleE9mKGV2ZW50TmFtZSkgIT09IC0xO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyhidWlsZEV2ZW50TGlzdGVuZXJPcHRpb25zKGFyZ3VtZW50c1syXSwgcGFzc2l2ZSkpO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaWduYWwgaXMgYW4gYWJvcnRlZCBvbmUsIGp1c3QgcmV0dXJuIHdpdGhvdXQgYXR0YWNoaW5nIHRoZSBldmVudCBsaXN0ZW5lci5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodW5wYXRjaGVkRXZlbnRzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdW5wYXRjaGVkIGxpc3Rcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVucGF0Y2hlZEV2ZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSB1bnBhdGNoZWRFdmVudHNbaV0pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzaXZlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmNhbGwodGFyZ2V0LCBldmVudE5hbWUsIGRlbGVnYXRlLCBvcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZSA9ICFvcHRpb25zID8gZmFsc2UgOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gdHJ1ZSA6IG9wdGlvbnMuY2FwdHVyZTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IG9uY2UgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyA/IG9wdGlvbnMub25jZSA6IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgem9uZSA9IFpvbmUuY3VycmVudDtcblx0ICAgICAgICAgICAgICAgIGxldCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIGlmICghc3ltYm9sRXZlbnROYW1lcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSwgZXZlbnROYW1lVG9TdHJpbmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tjYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdO1xuXHQgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIGxldCBpc0V4aXN0aW5nID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSB0YXNrIHJlZ2lzdGVyZWRcblx0ICAgICAgICAgICAgICAgICAgICBpc0V4aXN0aW5nID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tEdXBsaWNhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2tzW2ldLCBkZWxlZ2F0ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIGNhbGxiYWNrLCBzYW1lIGNhcHR1cmUsIHNhbWUgZXZlbnQgbmFtZSwganVzdCByZXR1cm5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBbXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGxldCBzb3VyY2U7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3JbJ25hbWUnXTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFNvdXJjZSA9IGdsb2JhbFNvdXJjZXNbY29uc3RydWN0b3JOYW1lXTtcblx0ICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTb3VyY2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0YXJnZXRTb3VyY2VbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghc291cmNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc291cmNlID1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JOYW1lICtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZSArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjb2RlIGJlbG93LCBgb3B0aW9uc2Agc2hvdWxkIG5vIGxvbmdlciBiZSByZWFzc2lnbmVkOyBpbnN0ZWFkLCBpdFxuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgbXV0YXRlZC4gVGhpcyBpcyBiZWNhdXNlIHdlIHBhc3MgdGhhdCBvYmplY3QgdG8gdGhlIG5hdGl2ZVxuXHQgICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICAgICAgLy8gSXQncyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBzYW1lIG9iamVjdCByZWZlcmVuY2UgZm9yIG9wdGlvbnMuXG5cdCAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYW5kIGF2b2lkcyBwb3RlbnRpYWwgaXNzdWVzLlxuXHQgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucyA9IG9wdGlvbnM7XG5cdCAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBvbmNlYCBvcHRpb24sIHdlIGRvbid0IHBhc3Ncblx0ICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYG9uY2VgIG9wdGlvbiBkaXJlY3RseSB0byB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2Uga2VlcCB0aGUgYG9uY2VgIHNldHRpbmcgYW5kIGhhbmRsZSBpdCBvdXJzZWx2ZXMuXG5cdCAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5vbmNlID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0YXNrRGF0YS50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXNrRGF0YS5jYXB0dXJlID0gY2FwdHVyZTtcblx0ICAgICAgICAgICAgICAgIHRhc2tEYXRhLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgIHRhc2tEYXRhLmlzRXhpc3RpbmcgPSBpc0V4aXN0aW5nO1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHVzZUdsb2JhbENhbGxiYWNrID8gT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIDogdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgLy8ga2VlcCB0YXNrRGF0YSBpbnRvIGRhdGEgdG8gYWxsb3cgb25TY2hlZHVsZUV2ZW50VGFzayB0byBhY2Nlc3MgdGhlIHRhc2sgaW5mb3JtYXRpb25cblx0ICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IHRhc2tEYXRhO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBzaWduYWxgIG9wdGlvbiwgd2UgZG9uJ3QgcGFzc1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgc2lnbmFsYCBvcHRpb24gZGlyZWN0bHkgdG8gdGhlIG5hdGl2ZSBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGtlZXAgdGhlIGBzaWduYWxgIHNldHRpbmcgYW5kIGhhbmRsZSBpdCBvdXJzZWx2ZXMuXG5cdCAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5zaWduYWwgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBUaGUgYHNjaGVkdWxlRXZlbnRUYXNrYCBmdW5jdGlvbiB3aWxsIHVsdGltYXRlbHkgY2FsbCBgY3VzdG9tU2NoZWR1bGVHbG9iYWxgLFxuXHQgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW4gdHVybiBjYWxscyB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYC4gVGhpcyBpcyB3aHkgYHRhc2tEYXRhLm9wdGlvbnNgXG5cdCAgICAgICAgICAgICAgICAvLyBpcyB1cGRhdGVkIGJlZm9yZSBzY2hlZHVsaW5nIHRoZSB0YXNrLCBhcyBgY3VzdG9tU2NoZWR1bGVHbG9iYWxgIHVzZXNcblx0ICAgICAgICAgICAgICAgIC8vIGB0YXNrRGF0YS5vcHRpb25zYCB0byBwYXNzIGl0IHRvIHRoZSBuYXRpdmUgYGFkZEV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHpvbmUuc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBkZWxlZ2F0ZSwgZGF0YSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4pO1xuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRhc2sgaXMgc2NoZWR1bGVkLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBzaWduYWwgYmFjayB0byB0YXNrLm9wdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLnNpZ25hbCA9IHNpZ25hbDtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXcmFwcGluZyBgdGFza2AgaW4gYSB3ZWFrIHJlZmVyZW5jZSB3b3VsZCBub3QgcHJldmVudCBtZW1vcnkgbGVha3MuIFdlYWsgcmVmZXJlbmNlcyBhcmVcblx0ICAgICAgICAgICAgICAgICAgICAvLyBwcmltYXJpbHkgdXNlZCBmb3IgcHJldmVudGluZyBzdHJvbmcgcmVmZXJlbmNlcyBjeWNsZXMuIGBvbkFib3J0YCBpcyBhbHdheXMgcmVhY2hhYmxlXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gYXMgaXQncyBhbiBldmVudCBsaXN0ZW5lciwgc28gaXRzIGNsb3N1cmUgcmV0YWlucyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIGB0YXNrYC5cblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG5cdCAgICAgICAgICAgICAgICAgICAgbmF0aXZlTGlzdGVuZXIuY2FsbChzaWduYWwsICdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgYGFib3J0YCBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBsaXN0ZW5lciBpcyBnb2luZyB0byBiZSByZW1vdmVkLFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFzIGl0IGNyZWF0ZXMgYSBjbG9zdXJlIHRoYXQgY2FwdHVyZXMgYHRhc2tgLiBUaGlzIGNsb3N1cmUgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGVcblx0ICAgICAgICAgICAgICAgICAgICAvLyBgdGFza2Agb2JqZWN0IGV2ZW4gYWZ0ZXIgaXQgZ29lcyBvdXQgb2Ygc2NvcGUsIHByZXZlbnRpbmcgYHRhc2tgIGZyb20gYmVpbmcgZ2FyYmFnZVxuXHQgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3RlZC5cblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIgPSAoKSA9PiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciB0YXNrRGF0YS50YXJnZXQgdG8gYXZvaWQgbWVtb3J5IGxlYWtcblx0ICAgICAgICAgICAgICAgIC8vIGlzc3VlLCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDQ0MlxuXHQgICAgICAgICAgICAgICAgdGFza0RhdGEudGFyZ2V0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgdXAgdGFza0RhdGEgYmVjYXVzZSBpdCBpcyBhIGdsb2JhbCBvYmplY3Rcblx0ICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIHNhdmUgdGhvc2UgaW5mb3JtYXRpb24gdG8gdGFzayBpbiBjYXNlXG5cdCAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBtYXkgY2FsbCB0YXNrLnpvbmUuY2FuY2VsVGFzaygpIGRpcmVjdGx5XG5cdCAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMub25jZSA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhc2sub3B0aW9ucyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHNhdmUgdGhlIG9wdGlvbnMgb24gdGhlIHRhc2sgKGlmIGl0J3MgYW4gb2JqZWN0KSBiZWNhdXNlXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgYmUgdXNpbmcgYHRhc2sub3B0aW9uc2AgbGF0ZXIgd2hlbiByZW1vdmluZyB0aGUgZXZlbnQgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGFzc2luZyBpdCBiYWNrIHRvIGByZW1vdmVFdmVudExpc3RlbmVyYC5cblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLm9wdGlvbnMgPSBvcHRpb25zO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGFzay50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXNrLmNhcHR1cmUgPSBjYXB0dXJlO1xuXHQgICAgICAgICAgICAgICAgdGFzay5ldmVudE5hbWUgPSBldmVudE5hbWU7XG5cdCAgICAgICAgICAgICAgICBpZiAoaXNFdmVudExpc3RlbmVyT2JqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBkZWxlZ2F0ZSBmb3IgY29tcGFyZSB0byBjaGVjayBkdXBsaWNhdGVcblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghcHJlcGVuZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3MucHVzaCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3MudW5zaGlmdCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVBZGRFdmVudExpc3RlbmVyLCBBRERfRVZFTlRfTElTVEVORVJfU09VUkNFLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQpO1xuXHQgICAgICAgIGlmIChuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcikge1xuXHQgICAgICAgICAgICBwcm90b1tQUkVQRU5EX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciwgUFJFUEVORF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UsIGN1c3RvbVNjaGVkdWxlUHJlcGVuZCwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQsIHRydWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG5cdCAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKSB7XG5cdCAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXJndW1lbnRzWzJdO1xuXHQgICAgICAgICAgICBjb25zdCBjYXB0dXJlID0gIW9wdGlvbnMgPyBmYWxzZSA6IHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyB0cnVlIDogb3B0aW9ucy5jYXB0dXJlO1xuXHQgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFyZ3VtZW50c1sxXTtcblx0ICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAodmFsaWRhdGVIYW5kbGVyICYmXG5cdCAgICAgICAgICAgICAgICAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIsIGRlbGVnYXRlLCB0YXJnZXQsIGFyZ3VtZW50cykpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgaWYgKHN5bWJvbEV2ZW50TmFtZXMpIHtcblx0ICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuXHQgICAgICAgICAgICAvLyBgZXhpc3RpbmdUYXNrc2AgbWF5IG5vdCBleGlzdCBpZiB0aGUgYGFkZEV2ZW50TGlzdGVuZXJgIHdhcyBjYWxsZWQgYmVmb3JlXG5cdCAgICAgICAgICAgIC8vIGl0IHdhcyBwYXRjaGVkIGJ5IHpvbmUuanMuIFBsZWFzZSByZWZlciB0byB0aGUgYXR0YWNoZWQgaXNzdWUgZm9yXG5cdCAgICAgICAgICAgIC8vIGNsYXJpZmljYXRpb24sIHBhcnRpY3VsYXJseSBhZnRlciB0aGUgYGlmYCBjb25kaXRpb24sIGJlZm9yZSBjYWxsaW5nXG5cdCAgICAgICAgICAgIC8vIHRoZSBuYXRpdmUgYHJlbW92ZUV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrID0gZXhpc3RpbmdUYXNrc1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2ssIGRlbGVnYXRlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlzUmVtb3ZlZCB0byBkYXRhIGZvciBmYXN0ZXIgaW52b2tlVGFzayBjaGVja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suaXNSZW1vdmVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBhbmQgcmVtb3ZlIHRoZSB0YXNrIGNhY2hlIGZyb20gdGFyZ2V0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suYWxsUmVtb3ZlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGFyZ2V0LCB3ZSBoYXZlIGFuIGV2ZW50IGxpc3RlbmVyIHdoaWNoIGlzIGFkZGVkIGJ5IG9uX3Byb3BlcnR5XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzIHRhcmdldC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7fSwgc28gd2UgbmVlZCB0byBjbGVhciB0aGlzIGludGVybmFsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSB0b28gaWYgYWxsIGRlbGVnYXRlcyB3aXRoIGNhcHR1cmU9ZmFsc2Ugd2VyZSByZW1vdmVkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovLyBnaXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzE2NDNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzU0NTgxXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmUgJiYgdHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvblByb3BlcnR5U3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgJ09OX1BST1BFUlRZJyArIGV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbb25Qcm9wZXJ0eVN5bWJvbF0gPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGFsbCBvdGhlciBjb25kaXRpb25zLCB3aGVuIGBhZGRFdmVudExpc3RlbmVyYCBpcyBjYWxsZWQgYWZ0ZXIgYmVpbmdcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0Y2hlZCBieSB6b25lLmpzLCB3ZSB3b3VsZCBhbHdheXMgZmluZCBhbiBldmVudCB0YXNrIG9uIHRoZSBgRXZlbnRUYXJnZXRgLlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBgY2FuY2VsRm5gIG9uIHRoZSBgZXhpc3RpbmdUYXNrYCwgbGVhZGluZyB0byBgY3VzdG9tQ2FuY2VsR2xvYmFsYCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdWx0aW1hdGVseSByZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGFuZCBjbGVhbnMgdXAgdGhlIGFib3J0IGxpc3RlbmVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIChpZiBhbiBgQWJvcnRTaWduYWxgIHdhcyBwcm92aWRlZCB3aGVuIHNjaGVkdWxpbmcgYSB0YXNrKS5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLnpvbmUuY2FuY2VsVGFzayhleGlzdGluZ1Rhc2spO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTMwXG5cdCAgICAgICAgICAgIC8vIFdlIG1heSBlbmNvdW50ZXIgYSBzaXR1YXRpb24gd2hlcmUgdGhlIGBhZGRFdmVudExpc3RlbmVyYCB3YXNcblx0ICAgICAgICAgICAgLy8gY2FsbGVkIG9uIHRoZSBldmVudCB0YXJnZXQgYmVmb3JlIHpvbmUuanMgaXMgbG9hZGVkLCByZXN1bHRpbmdcblx0ICAgICAgICAgICAgLy8gaW4gbm8gdGFzayBiZWluZyBzdG9yZWQgb24gdGhlIGV2ZW50IHRhcmdldCBkdWUgdG8gaXRzIGludm9jYXRpb25cblx0ICAgICAgICAgICAgLy8gb2YgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gSW4gdGhpcyBzY2VuYXJpbywgd2Ugc2ltcGx5IG5lZWQgdG9cblx0ICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBuYXRpdmUgYHJlbW92ZUV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICByZXR1cm4gbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcHJvdG9bTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcyB8fCBfZ2xvYmFsO1xuXHQgICAgICAgICAgICBsZXQgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdO1xuXHQgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gW107XG5cdCAgICAgICAgICAgIGNvbnN0IHRhc2tzID0gZmluZEV2ZW50VGFza3ModGFyZ2V0LCBldmVudE5hbWVUb1N0cmluZyA/IGV2ZW50TmFtZVRvU3RyaW5nKGV2ZW50TmFtZSkgOiBldmVudE5hbWUpO1xuXHQgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gdGFza3NbaV07XG5cdCAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goZGVsZWdhdGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcblx0ICAgICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgICAgICAgaWYgKCFldmVudE5hbWUpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0YXJnZXQpO1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IGtleXNbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYLmV4ZWMocHJvcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpbiBub2RlanMgRXZlbnRFbWl0dGVyLCByZW1vdmVMaXN0ZW5lciBldmVudCBpc1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1vbml0b3JpbmcgdGhlIHJlbW92ZUxpc3RlbmVyIGNhbGwsXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc28ganVzdCBrZWVwIHJlbW92ZUxpc3RlbmVyIGV2ZW50TGlzdGVuZXIgdW50aWxcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgZXZlbnRMaXN0ZW5lcnMgYXJlIHJlbW92ZWRcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0TmFtZSAmJiBldnROYW1lICE9PSAncmVtb3ZlTGlzdGVuZXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZ0TmFtZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyIGZpbmFsbHlcblx0ICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgJ3JlbW92ZUxpc3RlbmVyJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbRkFMU0VfU1RSXTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xDYXB0dXJlRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tUUlVFX1NUUl07XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlVGFza3MgPSB0YXJnZXRbc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZVRhc2tzID0gdGFza3Muc2xpY2UoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHJlbW92ZVRhc2tzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIHRhc2sub3B0aW9ucyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVUYXNrcyA9IGNhcHR1cmVUYXNrcy5zbGljZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW92ZVRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gcmVtb3ZlVGFza3NbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgLy8gZm9yIG5hdGl2ZSB0b1N0cmluZyBwYXRjaFxuXHQgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tBRERfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVBZGRFdmVudExpc3RlbmVyKTtcblx0ICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lcik7XG5cdCAgICAgICAgaWYgKG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycykge1xuXHQgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobmF0aXZlTGlzdGVuZXJzKSB7XG5cdCAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVMaXN0ZW5lcnMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIGxldCByZXN1bHRzID0gW107XG5cdCAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFwaXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICByZXN1bHRzW2ldID0gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMoYXBpc1tpXSwgcGF0Y2hPcHRpb25zKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiByZXN1bHRzO1xuXHR9XG5cdGZ1bmN0aW9uIGZpbmRFdmVudFRhc2tzKHRhcmdldCwgZXZlbnROYW1lKSB7XG5cdCAgICBpZiAoIWV2ZW50TmFtZSkge1xuXHQgICAgICAgIGNvbnN0IGZvdW5kVGFza3MgPSBbXTtcblx0ICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRhcmdldCkge1xuXHQgICAgICAgICAgICBjb25zdCBtYXRjaCA9IEVWRU5UX05BTUVfU1lNQk9MX1JFR1guZXhlYyhwcm9wKTtcblx0ICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcblx0ICAgICAgICAgICAgaWYgKGV2dE5hbWUgJiYgKCFldmVudE5hbWUgfHwgZXZ0TmFtZSA9PT0gZXZlbnROYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbcHJvcF07XG5cdCAgICAgICAgICAgICAgICBpZiAodGFza3MpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGFza3MucHVzaCh0YXNrc1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmb3VuZFRhc2tzO1xuXHQgICAgfVxuXHQgICAgbGV0IHN5bWJvbEV2ZW50TmFtZSA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG5cdCAgICBpZiAoIXN5bWJvbEV2ZW50TmFtZSkge1xuXHQgICAgICAgIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSk7XG5cdCAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGNhcHR1cmVGYWxzZVRhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZVtGQUxTRV9TVFJdXTtcblx0ICAgIGNvbnN0IGNhcHR1cmVUcnVlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW1RSVUVfU1RSXV07XG5cdCAgICBpZiAoIWNhcHR1cmVGYWxzZVRhc2tzKSB7XG5cdCAgICAgICAgcmV0dXJuIGNhcHR1cmVUcnVlVGFza3MgPyBjYXB0dXJlVHJ1ZVRhc2tzLnNsaWNlKCkgOiBbXTtcblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgICAgIHJldHVybiBjYXB0dXJlVHJ1ZVRhc2tzXG5cdCAgICAgICAgICAgID8gY2FwdHVyZUZhbHNlVGFza3MuY29uY2F0KGNhcHR1cmVUcnVlVGFza3MpXG5cdCAgICAgICAgICAgIDogY2FwdHVyZUZhbHNlVGFza3Muc2xpY2UoKTtcblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBwYXRjaEV2ZW50UHJvdG90eXBlKGdsb2JhbCwgYXBpKSB7XG5cdCAgICBjb25zdCBFdmVudCA9IGdsb2JhbFsnRXZlbnQnXTtcblx0ICAgIGlmIChFdmVudCAmJiBFdmVudC5wcm90b3R5cGUpIHtcblx0ICAgICAgICBhcGkucGF0Y2hNZXRob2QoRXZlbnQucHJvdG90eXBlLCAnc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJywgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICBzZWxmW0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXG5cdCAgICAgICAgICAgIC8vIGluIGNhc2UgaW4gc29tZSBoeWJyaWQgYXBwbGljYXRpb24sIHNvbWUgcGFydCBvZlxuXHQgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgem9uZSwgc29tZSBhcmUgbm90XG5cdCAgICAgICAgICAgIGRlbGVnYXRlICYmIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdGZ1bmN0aW9uIHBhdGNoUXVldWVNaWNyb3Rhc2soZ2xvYmFsLCBhcGkpIHtcblx0ICAgIGFwaS5wYXRjaE1ldGhvZChnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycsIChkZWxlZ2F0ZSkgPT4ge1xuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICBab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb1Rhc2soJ3F1ZXVlTWljcm90YXNrJywgYXJnc1swXSk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdGNvbnN0IHRhc2tTeW1ib2wgPSB6b25lU3ltYm9sKCd6b25lVGFzaycpO1xuXHRmdW5jdGlvbiBwYXRjaFRpbWVyKHdpbmRvdywgc2V0TmFtZSwgY2FuY2VsTmFtZSwgbmFtZVN1ZmZpeCkge1xuXHQgICAgbGV0IHNldE5hdGl2ZSA9IG51bGw7XG5cdCAgICBsZXQgY2xlYXJOYXRpdmUgPSBudWxsO1xuXHQgICAgc2V0TmFtZSArPSBuYW1lU3VmZml4O1xuXHQgICAgY2FuY2VsTmFtZSArPSBuYW1lU3VmZml4O1xuXHQgICAgY29uc3QgdGFza3NCeUhhbmRsZUlkID0ge307XG5cdCAgICBmdW5jdGlvbiBzY2hlZHVsZVRhc2sodGFzaykge1xuXHQgICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG5cdCAgICAgICAgZGF0YS5hcmdzWzBdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGhhbmRsZU9ySWQgPSBzZXROYXRpdmUuYXBwbHkod2luZG93LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgIC8vIFdobGlzdCBvbiBOb2RlLmpzIHdoZW4gZ2V0IGNhbiB0aGUgSUQgYnkgdXNpbmcgYFtTeW1ib2wudG9QcmltaXRpdmVdKClgIHdlIGRvXG5cdCAgICAgICAgLy8gdG8gdGhpcyBzbyB0aGF0IHdlIGRvIG5vdCBjYXVzZSBwb3RlbnRhbGx5IGxlYWtzIHdoZW4gdXNpbmcgYHNldFRpbWVvdXRgXG5cdCAgICAgICAgLy8gc2luY2UgdGhpcyBjYW4gYmUgcGVyaW9kaWMgd2hlbiB1c2luZyBgLnJlZnJlc2hgLlxuXHQgICAgICAgIGlmIChpc051bWJlcihoYW5kbGVPcklkKSkge1xuXHQgICAgICAgICAgICBkYXRhLmhhbmRsZUlkID0gaGFuZGxlT3JJZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGRhdGEuaGFuZGxlID0gaGFuZGxlT3JJZDtcblx0ICAgICAgICAgICAgLy8gT24gTm9kZS5qcyBhIHRpbWVvdXQgYW5kIGludGVydmFsIGNhbiBiZSByZXN0YXJ0ZWQgb3ZlciBhbmQgb3ZlciBhZ2FpbiBieSB1c2luZyB0aGUgYC5yZWZyZXNoYCBtZXRob2QuXG5cdCAgICAgICAgICAgIGRhdGEuaXNSZWZyZXNoYWJsZSA9IGlzRnVuY3Rpb24oaGFuZGxlT3JJZC5yZWZyZXNoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBjbGVhclRhc2sodGFzaykge1xuXHQgICAgICAgIGNvbnN0IHsgaGFuZGxlLCBoYW5kbGVJZCB9ID0gdGFzay5kYXRhO1xuXHQgICAgICAgIHJldHVybiBjbGVhck5hdGl2ZS5jYWxsKHdpbmRvdywgaGFuZGxlID8/IGhhbmRsZUlkKTtcblx0ICAgIH1cblx0ICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKHdpbmRvdywgc2V0TmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgIGlmIChpc0Z1bmN0aW9uKGFyZ3NbMF0pKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgICAgICBpc1JlZnJlc2hhYmxlOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcsXG5cdCAgICAgICAgICAgICAgICBkZWxheTogbmFtZVN1ZmZpeCA9PT0gJ1RpbWVvdXQnIHx8IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcgPyBhcmdzWzFdIHx8IDAgOiB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG5cdCAgICAgICAgICAgIGFyZ3NbMF0gPSBmdW5jdGlvbiB0aW1lcigpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBmaW5hbGx5IHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZS05MzQsIHRhc2sgd2lsbCBiZSBjYW5jZWxsZWRcblx0ICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGl0IGlzIGEgcGVyaW9kaWMgdGFzayBzdWNoIGFzXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2V0SW50ZXJ2YWxcblx0ICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80MDM4N1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgdGFza3NCeUhhbmRsZUlkIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBzY2hlZHVsZVRhc2tcblx0ICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBzb21lIHpvbmVTcGVjIG1heSBpbnRlcmNlcHQgYW5kIGRvZXNuJ3QgdHJpZ2dlclxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlRm4oc2NoZWR1bGVUYXNrKSBwcm92aWRlZCBoZXJlLlxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaGFuZGxlLCBoYW5kbGVJZCwgaXNQZXJpb2RpYywgaXNSZWZyZXNoYWJsZSB9ID0gb3B0aW9ucztcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUGVyaW9kaWMgJiYgIWlzUmVmcmVzaGFibGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBub24tbm9kZWpzIGVudiwgd2UgcmVtb3ZlIHRpbWVySWRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gbG9jYWwgY2FjaGVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbaGFuZGxlSWRdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSB0YXNrIHJlZmVyZW5jZSBmcm9tIHRpbWVyIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgY29uc3QgdGFzayA9IHNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lKHNldE5hbWUsIGFyZ3NbMF0sIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTtcblx0ICAgICAgICAgICAgaWYgKCF0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGFzaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBOb2RlLmpzIG11c3QgYWRkaXRpb25hbGx5IHN1cHBvcnQgdGhlIHJlZiBhbmQgdW5yZWYgZnVuY3Rpb25zLlxuXHQgICAgICAgICAgICBjb25zdCB7IGhhbmRsZUlkLCBoYW5kbGUsIGlzUmVmcmVzaGFibGUsIGlzUGVyaW9kaWMgfSA9IHRhc2suZGF0YTtcblx0ICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmb3Igbm9uIG5vZGVqcyBlbnYsIHdlIHNhdmUgaGFuZGxlSWQ6IHRhc2tcblx0ICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcgaW4gbG9jYWwgY2FjaGUgZm9yIGNsZWFyVGltZW91dFxuXHQgICAgICAgICAgICAgICAgdGFza3NCeUhhbmRsZUlkW2hhbmRsZUlkXSA9IHRhc2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmb3Igbm9kZWpzIGVudiwgd2Ugc2F2ZSB0YXNrXG5cdCAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaW4gdGltZXJJZCBPYmplY3QgZm9yIGNsZWFyVGltZW91dFxuXHQgICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gdGFzaztcblx0ICAgICAgICAgICAgICAgIGlmIChpc1JlZnJlc2hhYmxlICYmICFpc1BlcmlvZGljKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZWZyZXNoID0gaGFuZGxlLnJlZnJlc2g7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFuZGxlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgem9uZSwgc3RhdGUgfSA9IHRhc2s7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ25vdFNjaGVkdWxlZCcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3N0YXRlID0gJ3NjaGVkdWxlZCc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdydW5uaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5fc3RhdGUgPSAnc2NoZWR1bGluZyc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVmcmVzaC5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIGhhbmRsZSA/PyBoYW5kbGVJZCA/PyB0YXNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHdpbmRvdywgYXJncyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBjbGVhck5hdGl2ZSA9IHBhdGNoTWV0aG9kKHdpbmRvdywgY2FuY2VsTmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgIGNvbnN0IGlkID0gYXJnc1swXTtcblx0ICAgICAgICBsZXQgdGFzaztcblx0ICAgICAgICBpZiAoaXNOdW1iZXIoaWQpKSB7XG5cdCAgICAgICAgICAgIC8vIG5vbiBub2RlanMgZW52LlxuXHQgICAgICAgICAgICB0YXNrID0gdGFza3NCeUhhbmRsZUlkW2lkXTtcblx0ICAgICAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVJZFtpZF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAvLyBub2RlanMgZW52ID8/IG90aGVyIGVudmlyb25tZW50cy5cblx0ICAgICAgICAgICAgdGFzayA9IGlkPy5bdGFza1N5bWJvbF07XG5cdCAgICAgICAgICAgIGlmICh0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICBpZFt0YXNrU3ltYm9sXSA9IG51bGw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0YXNrID0gaWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRhc2s/LnR5cGUpIHtcblx0ICAgICAgICAgICAgaWYgKHRhc2suY2FuY2VsRm4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjYW5jZWwgYWxyZWFkeSBjYW5jZWxlZCBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgIHRhc2suem9uZS5jYW5jZWxUYXNrKHRhc2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LlxuXHQgICAgICAgICAgICBkZWxlZ2F0ZS5hcHBseSh3aW5kb3csIGFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDdXN0b21FbGVtZW50cyhfZ2xvYmFsLCBhcGkpIHtcblx0ICAgIGNvbnN0IHsgaXNCcm93c2VyLCBpc01peCB9ID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKTtcblx0ICAgIGlmICgoIWlzQnJvd3NlciAmJiAhaXNNaXgpIHx8ICFfZ2xvYmFsWydjdXN0b21FbGVtZW50cyddIHx8ICEoJ2N1c3RvbUVsZW1lbnRzJyBpbiBfZ2xvYmFsKSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2N1c3RvbS1lbGVtZW50cy5odG1sI2NvbmNlcHQtY3VzdG9tLWVsZW1lbnQtZGVmaW5pdGlvbi1saWZlY3ljbGUtY2FsbGJhY2tzXG5cdCAgICBjb25zdCBjYWxsYmFja3MgPSBbXG5cdCAgICAgICAgJ2Nvbm5lY3RlZENhbGxiYWNrJyxcblx0ICAgICAgICAnZGlzY29ubmVjdGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdhZG9wdGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2snLFxuXHQgICAgICAgICdmb3JtQXNzb2NpYXRlZENhbGxiYWNrJyxcblx0ICAgICAgICAnZm9ybURpc2FibGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdmb3JtUmVzZXRDYWxsYmFjaycsXG5cdCAgICAgICAgJ2Zvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjaycsXG5cdCAgICBdO1xuXHQgICAgYXBpLnBhdGNoQ2FsbGJhY2tzKGFwaSwgX2dsb2JhbC5jdXN0b21FbGVtZW50cywgJ2N1c3RvbUVsZW1lbnRzJywgJ2RlZmluZScsIGNhbGxiYWNrcyk7XG5cdH1cblxuXHRmdW5jdGlvbiBldmVudFRhcmdldFBhdGNoKF9nbG9iYWwsIGFwaSkge1xuXHQgICAgaWYgKFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSkge1xuXHQgICAgICAgIC8vIEV2ZW50VGFyZ2V0IGlzIGFscmVhZHkgcGF0Y2hlZC5cblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB7IGV2ZW50TmFtZXMsIHpvbmVTeW1ib2xFdmVudE5hbWVzLCBUUlVFX1NUUiwgRkFMU0VfU1RSLCBaT05FX1NZTUJPTF9QUkVGSVggfSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCk7XG5cdCAgICAvLyAgcHJlZGVmaW5lIGFsbCBfX3pvbmVfc3ltYm9sX18gKyBldmVudE5hbWUgKyB0cnVlL2ZhbHNlIHN0cmluZ1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTtcblx0ICAgICAgICBjb25zdCBmYWxzZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIEZBTFNFX1NUUjtcblx0ICAgICAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgZmFsc2VFdmVudE5hbWU7XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG5cdCAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHt9O1xuXHQgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bRkFMU0VfU1RSXSA9IHN5bWJvbDtcblx0ICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG5cdCAgICB9XG5cdCAgICBjb25zdCBFVkVOVF9UQVJHRVQgPSBfZ2xvYmFsWydFdmVudFRhcmdldCddO1xuXHQgICAgaWYgKCFFVkVOVF9UQVJHRVQgfHwgIUVWRU5UX1RBUkdFVC5wcm90b3R5cGUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBhcGkucGF0Y2hFdmVudFRhcmdldChfZ2xvYmFsLCBhcGksIFtFVkVOVF9UQVJHRVQgJiYgRVZFTlRfVEFSR0VULnByb3RvdHlwZV0pO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hFdmVudChnbG9iYWwsIGFwaSkge1xuXHQgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUoZ2xvYmFsLCBhcGkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfVxuXHQgKi9cblx0ZnVuY3Rpb24gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcykge1xuXHQgICAgaWYgKCFpZ25vcmVQcm9wZXJ0aWVzIHx8IGlnbm9yZVByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIG9uUHJvcGVydGllcztcblx0ICAgIH1cblx0ICAgIGNvbnN0IHRpcCA9IGlnbm9yZVByb3BlcnRpZXMuZmlsdGVyKChpcCkgPT4gaXAudGFyZ2V0ID09PSB0YXJnZXQpO1xuXHQgICAgaWYgKHRpcC5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICByZXR1cm4gb25Qcm9wZXJ0aWVzO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdGFyZ2V0SWdub3JlUHJvcGVydGllcyA9IHRpcFswXS5pZ25vcmVQcm9wZXJ0aWVzO1xuXHQgICAgcmV0dXJuIG9uUHJvcGVydGllcy5maWx0ZXIoKG9wKSA9PiB0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzLmluZGV4T2Yob3ApID09PSAtMSk7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXModGFyZ2V0LCBvblByb3BlcnRpZXMsIGlnbm9yZVByb3BlcnRpZXMsIHByb3RvdHlwZSkge1xuXHQgICAgLy8gY2hlY2sgd2hldGhlciB0YXJnZXQgaXMgYXZhaWxhYmxlLCBzb21ldGltZXMgdGFyZ2V0IHdpbGwgYmUgdW5kZWZpbmVkXG5cdCAgICAvLyBiZWNhdXNlIGRpZmZlcmVudCBicm93c2VyIG9yIHNvbWUgM3JkIHBhcnR5IHBsdWdpbi5cblx0ICAgIGlmICghdGFyZ2V0KSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcyk7XG5cdCAgICBwYXRjaE9uUHJvcGVydGllcyh0YXJnZXQsIGZpbHRlcmVkUHJvcGVydGllcywgcHJvdG90eXBlKTtcblx0fVxuXHQvKipcblx0ICogR2V0IGFsbCBldmVudCBuYW1lIHByb3BlcnRpZXMgd2hpY2ggdGhlIGV2ZW50IG5hbWUgc3RhcnRzV2l0aCBgb25gXG5cdCAqIGZyb20gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmLCBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgbm90IGNvbnNpZGVyZWQuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRPbkV2ZW50TmFtZXModGFyZ2V0KSB7XG5cdCAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuXHQgICAgICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aCgnb24nKSAmJiBuYW1lLmxlbmd0aCA+IDIpXG5cdCAgICAgICAgLm1hcCgobmFtZSkgPT4gbmFtZS5zdWJzdHJpbmcoMikpO1xuXHR9XG5cdGZ1bmN0aW9uIHByb3BlcnR5RGVzY3JpcHRvclBhdGNoKGFwaSwgX2dsb2JhbCkge1xuXHQgICAgaWYgKGlzTm9kZSAmJiAhaXNNaXgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50cycpXSkge1xuXHQgICAgICAgIC8vIGV2ZW50cyBhcmUgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgbGVnYWN5IHBhdGNoLlxuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGlnbm9yZVByb3BlcnRpZXMgPSBfZ2xvYmFsWydfX1pvbmVfaWdub3JlX29uX3Byb3BlcnRpZXMnXTtcblx0ICAgIC8vIGZvciBicm93c2VycyB0aGF0IHdlIGNhbiBwYXRjaCB0aGUgZGVzY3JpcHRvcjogIENocm9tZSAmIEZpcmVmb3hcblx0ICAgIGxldCBwYXRjaFRhcmdldHMgPSBbXTtcblx0ICAgIGlmIChpc0Jyb3dzZXIpIHtcblx0ICAgICAgICBjb25zdCBpbnRlcm5hbFdpbmRvdyA9IHdpbmRvdztcblx0ICAgICAgICBwYXRjaFRhcmdldHMgPSBwYXRjaFRhcmdldHMuY29uY2F0KFtcblx0ICAgICAgICAgICAgJ0RvY3VtZW50Jyxcblx0ICAgICAgICAgICAgJ1NWR0VsZW1lbnQnLFxuXHQgICAgICAgICAgICAnRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MQm9keUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTE1lZGlhRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MRnJhbWVTZXRFbGVtZW50Jyxcblx0ICAgICAgICAgICAgJ0hUTUxGcmFtZUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTElGcmFtZUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTE1hcnF1ZWVFbGVtZW50Jyxcblx0ICAgICAgICAgICAgJ1dvcmtlcicsXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgY29uc3QgaWdub3JlRXJyb3JQcm9wZXJ0aWVzID0gW107XG5cdCAgICAgICAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgbGlrZSBJRSBvciBFZGdlLCBldmVudCBoYW5kbGVyIHByb3BlcnRpZXMgKGUuZy4sIGBvbmNsaWNrYClcblx0ICAgICAgICAvLyBtYXkgbm90IGJlIGRlZmluZWQgZGlyZWN0bHkgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBidXQgb24gaXRzIHByb3RvdHlwZSAoYFdpbmRvd1Byb3RvdHlwZWApLlxuXHQgICAgICAgIC8vIFRvIGVuc3VyZSBjb21wbGV0ZSBjb3ZlcmFnZSwgd2UgdXNlIHRoZSBwcm90b3R5cGUgd2hlbiBjaGVja2luZ1xuXHQgICAgICAgIC8vIGZvciBhbmQgcGF0Y2hpbmcgdGhlc2UgcHJvcGVydGllcy5cblx0ICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhpbnRlcm5hbFdpbmRvdywgZ2V0T25FdmVudE5hbWVzKGludGVybmFsV2luZG93KSwgaWdub3JlUHJvcGVydGllcyA/IGlnbm9yZVByb3BlcnRpZXMuY29uY2F0KGlnbm9yZUVycm9yUHJvcGVydGllcykgOiBpZ25vcmVQcm9wZXJ0aWVzLCBPYmplY3RHZXRQcm90b3R5cGVPZihpbnRlcm5hbFdpbmRvdykpO1xuXHQgICAgfVxuXHQgICAgcGF0Y2hUYXJnZXRzID0gcGF0Y2hUYXJnZXRzLmNvbmNhdChbXG5cdCAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jyxcblx0ICAgICAgICAnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCcsXG5cdCAgICAgICAgJ0lEQkluZGV4Jyxcblx0ICAgICAgICAnSURCUmVxdWVzdCcsXG5cdCAgICAgICAgJ0lEQk9wZW5EQlJlcXVlc3QnLFxuXHQgICAgICAgICdJREJEYXRhYmFzZScsXG5cdCAgICAgICAgJ0lEQlRyYW5zYWN0aW9uJyxcblx0ICAgICAgICAnSURCQ3Vyc29yJyxcblx0ICAgICAgICAnV2ViU29ja2V0Jyxcblx0ICAgIF0pO1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRjaFRhcmdldHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICBjb25zdCB0YXJnZXQgPSBfZ2xvYmFsW3BhdGNoVGFyZ2V0c1tpXV07XG5cdCAgICAgICAgdGFyZ2V0Py5wcm90b3R5cGUgJiZcblx0ICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXModGFyZ2V0LnByb3RvdHlwZSwgZ2V0T25FdmVudE5hbWVzKHRhcmdldC5wcm90b3R5cGUpLCBpZ25vcmVQcm9wZXJ0aWVzKTtcblx0ICAgIH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIEBzdXBwcmVzcyB7bWlzc2luZ1JlcXVpcmV9XG5cdCAqL1xuXHRmdW5jdGlvbiBwYXRjaEJyb3dzZXIoWm9uZSkge1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ2xlZ2FjeScsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICBjb25zdCBsZWdhY3lQYXRjaCA9IGdsb2JhbFtab25lLl9fc3ltYm9sX18oJ2xlZ2FjeVBhdGNoJyldO1xuXHQgICAgICAgIGlmIChsZWdhY3lQYXRjaCkge1xuXHQgICAgICAgICAgICBsZWdhY3lQYXRjaCgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3RpbWVycycsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICBjb25zdCBzZXQgPSAnc2V0Jztcblx0ICAgICAgICBjb25zdCBjbGVhciA9ICdjbGVhcic7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdUaW1lb3V0Jyk7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdJbnRlcnZhbCcpO1xuXHQgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLCAoZ2xvYmFsKSA9PiB7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpO1xuXHQgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnbW96UmVxdWVzdCcsICdtb3pDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTtcblx0ICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ3dlYmtpdFJlcXVlc3QnLCAnd2Via2l0Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdibG9ja2luZycsIChnbG9iYWwsIFpvbmUpID0+IHtcblx0ICAgICAgICBjb25zdCBibG9ja2luZ01ldGhvZHMgPSBbJ2FsZXJ0JywgJ3Byb21wdCcsICdjb25maXJtJ107XG5cdCAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja2luZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgY29uc3QgbmFtZSA9IGJsb2NraW5nTWV0aG9kc1tpXTtcblx0ICAgICAgICAgICAgcGF0Y2hNZXRob2QoZ2xvYmFsLCBuYW1lLCAoZGVsZWdhdGUsIHN5bWJvbCwgbmFtZSkgPT4ge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5ydW4oZGVsZWdhdGUsIGdsb2JhbCwgYXJncywgbmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIHBhdGNoRXZlbnQoZ2xvYmFsLCBhcGkpO1xuXHQgICAgICAgIGV2ZW50VGFyZ2V0UGF0Y2goZ2xvYmFsLCBhcGkpO1xuXHQgICAgICAgIC8vIHBhdGNoIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQncyBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXJcblx0ICAgICAgICBjb25zdCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gZ2xvYmFsWydYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0J107XG5cdCAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgJiYgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGUpIHtcblx0ICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoZ2xvYmFsLCBhcGksIFtYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZV0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ011dGF0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaENsYXNzKCdNdXRhdGlvbk9ic2VydmVyJyk7XG5cdCAgICAgICAgcGF0Y2hDbGFzcygnV2ViS2l0TXV0YXRpb25PYnNlcnZlcicpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaENsYXNzKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnRmlsZVJlYWRlcicsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIHBhdGNoQ2xhc3MoJ0ZpbGVSZWFkZXInKTtcblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ29uX3Byb3BlcnR5JywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yUGF0Y2goYXBpLCBnbG9iYWwpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnY3VzdG9tRWxlbWVudHMnLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaEN1c3RvbUVsZW1lbnRzKGdsb2JhbCwgYXBpKTtcblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ1hIUicsIChnbG9iYWwsIFpvbmUpID0+IHtcblx0ICAgICAgICAvLyBUcmVhdCBYTUxIdHRwUmVxdWVzdCBhcyBhIG1hY3JvdGFzay5cblx0ICAgICAgICBwYXRjaFhIUihnbG9iYWwpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9UQVNLID0gem9uZVN5bWJvbCgneGhyVGFzaycpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9TWU5DID0gem9uZVN5bWJvbCgneGhyU3luYycpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9MSVNURU5FUiA9IHpvbmVTeW1ib2woJ3hockxpc3RlbmVyJyk7XG5cdCAgICAgICAgY29uc3QgWEhSX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hoclNjaGVkdWxlZCcpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9VUkwgPSB6b25lU3ltYm9sKCd4aHJVUkwnKTtcblx0ICAgICAgICBjb25zdCBYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hockVycm9yQmVmb3JlU2NoZWR1bGVkJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gcGF0Y2hYSFIod2luZG93KSB7XG5cdCAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0ID0gd2luZG93WydYTUxIdHRwUmVxdWVzdCddO1xuXHQgICAgICAgICAgICBpZiAoIVhNTEh0dHBSZXF1ZXN0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIHNlcnZpY2Ugd29ya2VyXG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRQZW5kaW5nVGFzayh0YXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbWEhSX1RBU0tdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGxldCBvcmlBZGRMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgIGxldCBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnXTtcblx0ICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZSA9IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQucHJvdG90eXBlO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaUFkZExpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IFJFQURZX1NUQVRFX0NIQU5HRSA9ICdyZWFkeXN0YXRlY2hhbmdlJztcblx0ICAgICAgICAgICAgY29uc3QgU0NIRURVTEVEID0gJ3NjaGVkdWxlZCc7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZGF0YS50YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBldmVudCBsaXN0ZW5lclxuXHQgICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbWEhSX0xJU1RFTkVSXTtcblx0ICAgICAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lciA9IHRhcmdldFtaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gdGFyZ2V0W1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvcmlSZW1vdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBsaXN0ZW5lcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBuZXdMaXN0ZW5lciA9ICh0YXJnZXRbWEhSX0xJU1RFTkVSXSA9ICgpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnJlYWR5U3RhdGUgPT09IHRhcmdldC5ET05FKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBvbiBzb21lIGJyb3dzZXJzIFhNTEh0dHBSZXF1ZXN0IHdpbGwgZmlyZSBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkeVN0YXRlPTQgbXVsdGlwbGUgdGltZXMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGFzayBzdGF0ZSBoZXJlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5hYm9ydGVkICYmIHRhcmdldFtYSFJfU0NIRURVTEVEXSAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHhociBoYXMgcmVnaXN0ZXJlZCBvbmxvYWQgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZSB0YXNrIHNob3VsZCBpbnZva2UgYWZ0ZXIgYWxsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmxvYWQgbGlzdGVuZXJzIGZpbmlzaC5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gaWYgdGhlIHJlcXVlc3QgZmFpbGVkIHdpdGhvdXQgcmVzcG9uc2UgKHN0YXR1cyA9IDApLCB0aGUgbG9hZCBldmVudCBoYW5kbGVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQsIGluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkIGFsc28gaW52b2tlIHRoZSBwbGFjZWhvbGRlciBjYWxsYmFja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2xvc2UgdGhlIFhNTEh0dHBSZXF1ZXN0OjpzZW5kIG1hY3JvVGFzay5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM4Nzk1XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnN0YXR1cyAhPT0gMCAmJiBsb2FkVGFza3MgJiYgbG9hZFRhc2tzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlJbnZva2UgPSB0YXNrLmludm9rZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBsb2FkIHRoZSB0YXNrcyBhZ2FpbiwgYmVjYXVzZSBpbiBvdGhlclxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGxpc3RlbmVyLCB0aGV5IG1heSByZW1vdmUgdGhlbXNlbHZlc1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9hZFRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFRhc2tzW2ldID09PSB0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaUludm9rZS5jYWxsKHRhc2spO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGFza3MucHVzaCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaW52b2tlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBvY2N1cnMgd2hlbiB4aHIuc2VuZCgpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRURdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIuY2FsbCh0YXJnZXQsIFJFQURZX1NUQVRFX0NIQU5HRSwgbmV3TGlzdGVuZXIpO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVkVGFzayA9IHRhcmdldFtYSFJfVEFTS107XG5cdCAgICAgICAgICAgICAgICBpZiAoIXN0b3JlZFRhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1RBU0tdID0gdGFzaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHNlbmROYXRpdmUuYXBwbHkodGFyZ2V0LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHBsYWNlaG9sZGVyQ2FsbGJhY2soKSB7IH1cblx0ICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJUYXNrKHRhc2spIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG5cdCAgICAgICAgICAgICAgICAvLyBOb3RlIC0gaWRlYWxseSwgd2Ugd291bGQgY2FsbCBkYXRhLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyIGhlcmUsIGJ1dCBpdCdzIHRvbyBsYXRlXG5cdCAgICAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZmlyaW5nLiBTbyBpbnN0ZWFkLCB3ZSBzdG9yZSBpbmZvIGZvciB0aGUgZXZlbnQgbGlzdGVuZXIuXG5cdCAgICAgICAgICAgICAgICBkYXRhLmFib3J0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGFib3J0TmF0aXZlLmFwcGx5KGRhdGEudGFyZ2V0LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IG9wZW5OYXRpdmUgPSBwYXRjaE1ldGhvZChYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgJ29wZW4nLCAoKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICAgICAgc2VsZltYSFJfU1lOQ10gPSBhcmdzWzJdID09IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb3Blbk5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGNvbnN0IFhNTEhUVFBSRVFVRVNUX1NPVVJDRSA9ICdYTUxIdHRwUmVxdWVzdC5zZW5kJztcblx0ICAgICAgICAgICAgY29uc3QgZmV0Y2hUYXNrQWJvcnRpbmcgPSB6b25lU3ltYm9sKCdmZXRjaFRhc2tBYm9ydGluZycpO1xuXHQgICAgICAgICAgICBjb25zdCBmZXRjaFRhc2tTY2hlZHVsaW5nID0gem9uZVN5bWJvbCgnZmV0Y2hUYXNrU2NoZWR1bGluZycpO1xuXHQgICAgICAgICAgICBjb25zdCBzZW5kTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdzZW5kJywgKCkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChab25lLmN1cnJlbnRbZmV0Y2hUYXNrU2NoZWR1bGluZ10gPT09IHRydWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhIGZldGNoIGlzIHNjaGVkdWxpbmcsIHNvIHdlIGFyZSB1c2luZyB4aHIgdG8gcG9seWZpbGwgZmV0Y2hcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVjYXVzZSB3ZSBhbHJlYWR5IHNjaGVkdWxlIG1hY3JvVGFzayBmb3IgZmV0Y2gsIHdlIHNob3VsZFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzY2hlZHVsZSBhIG1hY3JvVGFzayBmb3IgeGhyIGFnYWluXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoc2VsZltYSFJfU1lOQ10pIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgWEhSIGlzIHN5bmMgdGhlcmUgaXMgbm8gdGFzayB0byBzY2hlZHVsZSwganVzdCBleGVjdXRlIHRoZSBjb2RlLlxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBzZWxmLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHNlbGZbWEhSX1VSTF0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShYTUxIVFRQUkVRVUVTVF9TT1VSQ0UsIHBsYWNlaG9sZGVyQ2FsbGJhY2ssIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9PT0gdHJ1ZSAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5hYm9ydGVkICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyB4aHIgcmVxdWVzdCB0aHJvdyBlcnJvciB3aGVuIHNlbmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGludm9rZSB0YXNrIGluc3RlYWQgb2YgbGVhdmluZyBhIHNjaGVkdWxlZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIG1hY3JvVGFza1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGNvbnN0IGFib3J0TmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdhYm9ydCcsICgpID0+IGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gZmluZFBlbmRpbmdUYXNrKHNlbGYpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRhc2sgJiYgdHlwZW9mIHRhc2sudHlwZSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBYSFIgaGFzIGFscmVhZHkgY29tcGxldGVkLCBkbyBub3RoaW5nLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBYSFIgaGFzIGFscmVhZHkgYmVlbiBhYm9ydGVkLCBkbyBub3RoaW5nLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIEZpeCAjNTY5LCBjYWxsIGFib3J0IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBkb25lIHdpbGwgY2F1c2Vcblx0ICAgICAgICAgICAgICAgICAgICAvLyBtYWNyb1Rhc2sgdGFzayBjb3VudCBiZSBuZWdhdGl2ZSBudW1iZXJcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYW5jZWxGbiA9PSBudWxsIHx8ICh0YXNrLmRhdGEgJiYgdGFzay5kYXRhLmFib3J0ZWQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChab25lLmN1cnJlbnRbZmV0Y2hUYXNrQWJvcnRpbmddID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFib3J0IGlzIGNhbGxlZCBmcm9tIGZldGNoIHBvbHlmaWxsLCB3ZSBuZWVkIHRvIGNhbGwgbmF0aXZlIGFib3J0IG9mIFhIUi5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSB0cnlpbmcgdG8gYWJvcnQgYW4gWEhSIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gc2VudCwgc28gdGhlcmUgaXMgbm9cblx0ICAgICAgICAgICAgICAgIC8vIHRhc2tcblx0ICAgICAgICAgICAgICAgIC8vIHRvIGNhbmNlbC4gRG8gbm90aGluZy5cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnZ2VvbG9jYXRpb24nLCAoZ2xvYmFsKSA9PiB7XG5cdCAgICAgICAgLy8vIEdFT19MT0NBVElPTlxuXHQgICAgICAgIGlmIChnbG9iYWxbJ25hdmlnYXRvciddICYmIGdsb2JhbFsnbmF2aWdhdG9yJ10uZ2VvbG9jYXRpb24pIHtcblx0ICAgICAgICAgICAgcGF0Y2hQcm90b3R5cGUoZ2xvYmFsWyduYXZpZ2F0b3InXS5nZW9sb2NhdGlvbiwgWydnZXRDdXJyZW50UG9zaXRpb24nLCAnd2F0Y2hQb3NpdGlvbiddKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdQcm9taXNlUmVqZWN0aW9uRXZlbnQnLCAoZ2xvYmFsLCBab25lKSA9PiB7XG5cdCAgICAgICAgLy8gaGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuXHQgICAgICAgIGZ1bmN0aW9uIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcihldnROYW1lKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRUYXNrcyA9IGZpbmRFdmVudFRhc2tzKGdsb2JhbCwgZXZ0TmFtZSk7XG5cdCAgICAgICAgICAgICAgICBldmVudFRhc2tzLmZvckVhY2goKGV2ZW50VGFzaykgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgaGFzIGFkZGVkIHVuaGFuZGxlZHJlamVjdGlvbiBldmVudCBsaXN0ZW5lclxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGxpc3RlbmVyXG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID0gZ2xvYmFsWydQcm9taXNlUmVqZWN0aW9uRXZlbnQnXTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoUHJvbWlzZVJlamVjdGlvbkV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBQcm9taXNlUmVqZWN0aW9uRXZlbnQoZXZ0TmFtZSwge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogZS5wcm9taXNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBlLnJlamVjdGlvbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGFzay5pbnZva2UoZXZ0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J10pIHtcblx0ICAgICAgICAgICAgWm9uZVt6b25lU3ltYm9sKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpXSA9XG5cdCAgICAgICAgICAgICAgICBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicpO1xuXHQgICAgICAgICAgICBab25lW3pvbmVTeW1ib2woJ3JlamVjdGlvbkhhbmRsZWRIYW5kbGVyJyldID1cblx0ICAgICAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigncmVqZWN0aW9uaGFuZGxlZCcpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3F1ZXVlTWljcm90YXNrJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgcGF0Y2hRdWV1ZU1pY3JvdGFzayhnbG9iYWwsIGFwaSk7XG5cdCAgICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHBhdGNoUHJvbWlzZShab25lKSB7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnWm9uZUF3YXJlUHJvbWlzZScsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIGNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdCAgICAgICAgY29uc3QgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdCAgICAgICAgZnVuY3Rpb24gcmVhZGFibGVPYmplY3RUb1N0cmluZyhvYmopIHtcblx0ICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IubmFtZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoY2xhc3NOYW1lID8gY2xhc3NOYW1lIDogJycpICsgJzogJyArIEpTT04uc3RyaW5naWZ5KG9iaik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG9iaiA/IG9iai50b1N0cmluZygpIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IF9fc3ltYm9sX18gPSBhcGkuc3ltYm9sO1xuXHQgICAgICAgIGNvbnN0IF91bmNhdWdodFByb21pc2VFcnJvcnMgPSBbXTtcblx0ICAgICAgICBjb25zdCBpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiA9IGdsb2JhbFtfX3N5bWJvbF9fKCdESVNBQkxFX1dSQVBQSU5HX1VOQ0FVR0hUX1BST01JU0VfUkVKRUNUSU9OJyldICE9PSBmYWxzZTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG5cdCAgICAgICAgY29uc3QgY3JlYXRpb25UcmFjZSA9ICdfX2NyZWF0aW9uVHJhY2VfXyc7XG5cdCAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IgPSAoZSkgPT4ge1xuXHQgICAgICAgICAgICBpZiAoYXBpLnNob3dVbmNhdWdodEVycm9yKCkpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IGUgJiYgZS5yZWplY3Rpb247XG5cdCAgICAgICAgICAgICAgICBpZiAocmVqZWN0aW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIFByb21pc2UgcmVqZWN0aW9uOicsIHJlamVjdGlvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVqZWN0aW9uLm1lc3NhZ2UgOiByZWplY3Rpb24sICc7IFpvbmU6JywgZS56b25lLm5hbWUsICc7IFRhc2s6JywgZS50YXNrICYmIGUudGFzay5zb3VyY2UsICc7IFZhbHVlOicsIHJlamVjdGlvbiwgcmVqZWN0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyByZWplY3Rpb24uc3RhY2sgOiB1bmRlZmluZWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgYXBpLm1pY3JvdGFza0RyYWluRG9uZSA9ICgpID0+IHtcblx0ICAgICAgICAgICAgd2hpbGUgKF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB1bmNhdWdodFByb21pc2VFcnJvciA9IF91bmNhdWdodFByb21pc2VFcnJvcnMuc2hpZnQoKTtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZS5ydW5HdWFyZGVkKCgpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuY2F1Z2h0UHJvbWlzZUVycm9yLnRocm93T3JpZ2luYWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yLnJlamVjdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodFByb21pc2VFcnJvcjtcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuXHQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlcnJvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IFVOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTCA9IF9fc3ltYm9sX18oJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gaGFuZGxlVW5oYW5kbGVkUmVqZWN0aW9uKGUpIHtcblx0ICAgICAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IoZSk7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gWm9uZVtVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZm9yd2FyZFJlc29sdXRpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVqZWN0aW9uKHJlamVjdGlvbikge1xuXHQgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sU3RhdGUgPSBfX3N5bWJvbF9fKCdzdGF0ZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xGaW5hbGx5ID0gX19zeW1ib2xfXygnZmluYWxseScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VWYWx1ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VWYWx1ZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpO1xuXHQgICAgICAgIGNvbnN0IHNvdXJjZSA9ICdQcm9taXNlLnRoZW4nO1xuXHQgICAgICAgIGNvbnN0IFVOUkVTT0xWRUQgPSBudWxsO1xuXHQgICAgICAgIGNvbnN0IFJFU09MVkVEID0gdHJ1ZTtcblx0ICAgICAgICBjb25zdCBSRUpFQ1RFRCA9IGZhbHNlO1xuXHQgICAgICAgIGNvbnN0IFJFSkVDVEVEX05PX0NBVENIID0gMDtcblx0ICAgICAgICBmdW5jdGlvbiBtYWtlUmVzb2x2ZXIocHJvbWlzZSwgc3RhdGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICh2KSA9PiB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIERvIG5vdCByZXR1cm4gdmFsdWUgb3IgeW91IHdpbGwgYnJlYWsgdGhlIFByb21pc2Ugc3BlYy5cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgb25jZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgbGV0IHdhc0NhbGxlZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlcih3cmFwcGVkRnVuY3Rpb24pIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEZ1bmN0aW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgVFlQRV9FUlJPUiA9ICdQcm9taXNlIHJlc29sdmVkIHdpdGggaXRzZWxmJztcblx0ICAgICAgICBjb25zdCBDVVJSRU5UX1RBU0tfVFJBQ0VfU1lNQk9MID0gX19zeW1ib2xfXygnY3VycmVudFRhc2tUcmFjZScpO1xuXHQgICAgICAgIC8vIFByb21pc2UgUmVzb2x1dGlvblxuXHQgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2YWx1ZSkge1xuXHQgICAgICAgICAgICBjb25zdCBvbmNlV3JhcHBlciA9IG9uY2UoKTtcblx0ICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFRZUEVfRVJST1IpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgZ2V0IHZhbHVlLnRoZW4gb25jZSBiYXNlZCBvbiBwcm9taXNlIHNwZWMuXG5cdCAgICAgICAgICAgICAgICBsZXQgdGhlbiA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcblx0ICAgICAgICAgICAgICAgICAgICB9KSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBSRUpFQ1RFRCAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFN0YXRlKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFZhbHVlKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlW3N5bWJvbFN0YXRlXSAhPT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2YWx1ZVtzeW1ib2xTdGF0ZV0sIHZhbHVlW3N5bWJvbFZhbHVlXSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgZmFsc2UpKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBzdGF0ZTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sRmluYWxseV0gPT09IHN5bWJvbEZpbmFsbHkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIGlzIHJlc29sdmVkLCBzaG91bGQgaWdub3JlIHRoZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBwcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VTdGF0ZV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGFzayBpbmZvcm1hdGlvbiBpbiB2YWx1ZSB3aGVuIGVycm9yIG9jY3Vycywgc28gd2UgY2FuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2Vcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEICYmIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbG9uZ1N0YWNrVHJhY2Vab25lIGlzIGhlcmVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2UgPSBab25lLmN1cnJlbnRUYXNrICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBab25lLmN1cnJlbnRUYXNrLmRhdGEgJiZcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpvbmUuY3VycmVudFRhc2suZGF0YVtjcmVhdGlvblRyYWNlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGtlZXAgdGhlIGxvbmcgc3RhY2sgdHJhY2UgaW50byBlcnJvciB3aGVuIGluIGxvbmdTdGFja1RyYWNlWm9uZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkodmFsdWUsIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRyYWNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHByb21pc2UsIHF1ZXVlW2krK10sIHF1ZXVlW2krK10sIHF1ZXVlW2krK10sIHF1ZXVlW2krK10pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09IDAgJiYgc3RhdGUgPT0gUkVKRUNURUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBSRUpFQ1RFRF9OT19DQVRDSDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHRocm93cyBhIG5ldyBFcnJvciB0byBwcmludCBtb3JlIHJlYWRhYmxlIGVycm9yIGxvZ1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlmIHRoZSB2YWx1ZSBpcyBub3QgYW4gZXJyb3IsIHpvbmUuanMgYnVpbGRzIGFuIGBFcnJvcmBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9iamVjdCBoZXJlIHRvIGF0dGFjaCB0aGUgc3RhY2sgaW5mb3JtYXRpb24uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuY2F1Z2h0IChpbiBwcm9taXNlKTogJyArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAmJiB2YWx1ZS5zdGFjayA/ICdcXG4nICsgdmFsdWUuc3RhY2sgOiAnJykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gZXJyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZGlzYWJsZSB3cmFwcGluZyB1bmNhdWdodCBwcm9taXNlIHJlamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHdyYXBwaW5nIGl0LlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IudGhyb3dPcmlnaW5hbCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IucmVqZWN0aW9uID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnByb21pc2UgPSBwcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci56b25lID0gWm9uZS5jdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci50YXNrID0gWm9uZS5jdXJyZW50VGFzaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5wdXNoKHVuY2F1Z2h0UHJvbWlzZUVycm9yKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnNjaGVkdWxlTWljcm9UYXNrKCk7IC8vIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHJ1bm5pbmdcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gUmVzb2x2aW5nIGFuIGFscmVhZHkgcmVzb2x2ZWQgcHJvbWlzZSBpcyBhIG5vb3AuXG5cdCAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBSRUpFQ1RJT05fSEFORExFRF9IQU5ETEVSID0gX19zeW1ib2xfXygncmVqZWN0aW9uSGFuZGxlZEhhbmRsZXInKTtcblx0ICAgICAgICBmdW5jdGlvbiBjbGVhclJlamVjdGVkTm9DYXRjaChwcm9taXNlKSB7XG5cdCAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gUkVKRUNURURfTk9fQ0FUQ0gpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIG5vIGNhdGNoIHN0YXR1c1xuXHQgICAgICAgICAgICAgICAgLy8gYW5kIHF1ZXVlLmxlbmd0aCA+IDAsIG1lYW5zIHRoZXJlIGlzIGEgZXJyb3IgaGFuZGxlclxuXHQgICAgICAgICAgICAgICAgLy8gaGVyZSB0byBoYW5kbGUgdGhlIHJlamVjdGVkIHByb21pc2UsIHdlIHNob3VsZCB0cmlnZ2VyXG5cdCAgICAgICAgICAgICAgICAvLyB3aW5kb3dzLnJlamVjdGlvbmhhbmRsZWQgZXZlbnRIYW5kbGVyIG9yIG5vZGVqcyByZWplY3Rpb25IYW5kbGVkXG5cdCAgICAgICAgICAgICAgICAvLyBldmVudEhhbmRsZXJcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IFpvbmVbUkVKRUNUSU9OX0hBTkRMRURfSEFORExFUl07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIHsgcmVqZWN0aW9uOiBwcm9taXNlW3N5bWJvbFZhbHVlXSwgcHJvbWlzZTogcHJvbWlzZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7IH1cblx0ICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gUkVKRUNURUQ7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZSA9PT0gX3VuY2F1Z2h0UHJvbWlzZUVycm9yc1tpXS5wcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIF91bmNhdWdodFByb21pc2VFcnJvcnMuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZVJlc29sdmVPclJlamVjdChwcm9taXNlLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdCAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHByb21pc2UpO1xuXHQgICAgICAgICAgICBjb25zdCBwcm9taXNlU3RhdGUgPSBwcm9taXNlW3N5bWJvbFN0YXRlXTtcblx0ICAgICAgICAgICAgY29uc3QgZGVsZWdhdGUgPSBwcm9taXNlU3RhdGVcblx0ICAgICAgICAgICAgICAgID8gdHlwZW9mIG9uRnVsZmlsbGVkID09PSAnZnVuY3Rpb24nXG5cdCAgICAgICAgICAgICAgICAgICAgPyBvbkZ1bGZpbGxlZFxuXHQgICAgICAgICAgICAgICAgICAgIDogZm9yd2FyZFJlc29sdXRpb25cblx0ICAgICAgICAgICAgICAgIDogdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbidcblx0ICAgICAgICAgICAgICAgICAgICA/IG9uUmVqZWN0ZWRcblx0ICAgICAgICAgICAgICAgICAgICA6IGZvcndhcmRSZWplY3Rpb247XG5cdCAgICAgICAgICAgIHpvbmUuc2NoZWR1bGVNaWNyb1Rhc2soc291cmNlLCAoKSA9PiB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFByb21pc2VWYWx1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmluYWxseVByb21pc2UgPSAhIWNoYWluUHJvbWlzZSAmJiBzeW1ib2xGaW5hbGx5ID09PSBjaGFpblByb21pc2Vbc3ltYm9sRmluYWxseV07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluYWxseVByb21pc2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGZyb20gZmluYWxseSBjYWxsLCBrZWVwIHBhcmVudCBwcm9taXNlJ3Mgc3RhdGUgYW5kIHZhbHVlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdID0gcGFyZW50UHJvbWlzZVZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXSA9IHByb21pc2VTdGF0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBwYXNzIHZhbHVlIHRvIGZpbmFsbHkgY2FsbGJhY2tcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHpvbmUucnVuKGRlbGVnYXRlLCB1bmRlZmluZWQsIGlzRmluYWxseVByb21pc2UgJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZWplY3Rpb24gJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZXNvbHV0aW9uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgID8gW11cblx0ICAgICAgICAgICAgICAgICAgICAgICAgOiBbcGFyZW50UHJvbWlzZVZhbHVlXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCB0cnVlLCB2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMsIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoaXMgZXJyb3Jcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjaGFpblByb21pc2UsIGZhbHNlLCBlcnJvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sIGNoYWluUHJvbWlzZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkcgPSAnZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZSgpIHsgW25hdGl2ZSBjb2RlXSB9Jztcblx0ICAgICAgICBjb25zdCBub29wID0gZnVuY3Rpb24gKCkgeyB9O1xuXHQgICAgICAgIGNvbnN0IEFnZ3JlZ2F0ZUVycm9yID0gZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yO1xuXHQgICAgICAgIGNsYXNzIFpvbmVBd2FyZVByb21pc2Uge1xuXHQgICAgICAgICAgICBzdGF0aWMgdG9TdHJpbmcoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gWk9ORV9BV0FSRV9QUk9NSVNFX1RPX1NUUklORztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmVzb2x2ZSh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlUHJvbWlzZShuZXcgdGhpcyhudWxsKSwgUkVTT0xWRUQsIHZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmVqZWN0KGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVByb21pc2UobmV3IHRoaXMobnVsbCksIFJFSkVDVEVELCBlcnJvcik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RhdGljIHdpdGhSZXNvbHZlcnMoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlID0gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlamVjdCA9IHJlajtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgYW55KHZhbHVlcykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMgfHwgdHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblx0ICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHYgb2YgdmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goWm9uZUF3YXJlUHJvbWlzZS5yZXNvbHZlKHYpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9uZUF3YXJlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9taXNlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlc1tpXS50aGVuKCh2KSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmFjZSh2YWx1ZXMpIHtcblx0ICAgICAgICAgICAgICAgIGxldCByZXNvbHZlO1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlamVjdDtcblx0ICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IHRoaXMoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QgPSByZWo7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVzb2x2ZSh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZnVuY3Rpb24gb25SZWplY3QoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RoZW5hYmxlKHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVzb2x2ZSh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgYWxsKHZhbHVlcykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrKHZhbHVlcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RhdGljIGFsbFNldHRsZWQodmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBQID0gdGhpcyAmJiB0aGlzLnByb3RvdHlwZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UgPyB0aGlzIDogWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBQLmFsbFdpdGhDYWxsYmFjayh2YWx1ZXMsIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGVuQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWUgfSksXG5cdCAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjazogKGVycikgPT4gKHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVyciB9KSxcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHN0YXRpYyBhbGxXaXRoQ2FsbGJhY2sodmFsdWVzLCBjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlc29sdmU7XG5cdCAgICAgICAgICAgICAgICBsZXQgcmVqZWN0O1xuXHQgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgdGhpcygocmVzLCByZWopID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlID0gcmVzO1xuXHQgICAgICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgLy8gU3RhcnQgYXQgMiB0byBwcmV2ZW50IHByZW1hdHVyZWx5IHJlc29sdmluZyBpZiAudGhlbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkuXG5cdCAgICAgICAgICAgICAgICBsZXQgdW5yZXNvbHZlZENvdW50ID0gMjtcblx0ICAgICAgICAgICAgICAgIGxldCB2YWx1ZUluZGV4ID0gMDtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWVzID0gW107XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUodmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZXNvbHZlKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyVmFsdWVJbmRleCA9IHZhbHVlSW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudGhlbigodmFsdWUpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjay50aGVuQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZXNbY3VyVmFsdWVJbmRleF0gPSBjYWxsYmFjay5lcnJvckNhbGxiYWNrKGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBjYXRjaCAodGhlbkVycikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhlbkVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudCsrO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlSW5kZXgrKztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHVucmVzb2x2ZWRDb3VudCB6ZXJvLWJhc2VkIGFnYWluLlxuXHQgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50IC09IDI7XG5cdCAgICAgICAgICAgICAgICBpZiAodW5yZXNvbHZlZENvdW50ID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXM7XG5cdCAgICAgICAgICAgICAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgYW4gaW5zdGFuY2VvZiBQcm9taXNlLicpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBVTlJFU09MVkVEO1xuXHQgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xWYWx1ZV0gPSBbXTsgLy8gcXVldWU7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uY2VXcmFwcGVyID0gb25jZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBSRVNPTFZFRCkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgUkVKRUNURUQpKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAnUHJvbWlzZSc7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZ2V0IFtTeW1ib2wuc3BlY2llc10oKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlYWQgYFN5bWJvbC5zcGVjaWVzYCBzYWZlbHkgYmVjYXVzZSBgdGhpc2AgbWF5IGJlIGFueXRoaW5nLiBGb3IgaW5zdGFuY2UsIGB0aGlzYFxuXHQgICAgICAgICAgICAgICAgLy8gbWF5IGJlIGFuIG9iamVjdCB3aXRob3V0IGEgcHJvdG90eXBlIChjcmVhdGVkIHRocm91Z2ggYE9iamVjdC5jcmVhdGUobnVsbClgKTsgdGh1c1xuXHQgICAgICAgICAgICAgICAgLy8gYHRoaXMuY29uc3RydWN0b3JgIHdpbGwgYmUgdW5kZWZpbmVkLiBPbmUgb2YgdGhlIHVzZSBjYXNlcyBpcyBTeXN0ZW1KUyBjcmVhdGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLWxlc3Mgb2JqZWN0cyAobW9kdWxlcykgdmlhIGBPYmplY3QuY3JlYXRlKG51bGwpYC4gVGhlIFN5c3RlbUpTIGNyZWF0ZXMgYW4gZW1wdHlcblx0ICAgICAgICAgICAgICAgIC8vIG9iamVjdCBhbmQgY29waWVzIHByb21pc2UgcHJvcGVydGllcyBpbnRvIHRoYXQgb2JqZWN0ICh3aXRoaW4gdGhlIGBnZXRPckNyZWF0ZUxvYWRgXG5cdCAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbikuIFRoZSB6b25lLmpzIHRoZW4gY2hlY2tzIGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBoYXMgdGhlIGB0aGVuYCBtZXRob2QgYW5kXG5cdCAgICAgICAgICAgICAgICAvLyBpbnZva2VzIGl0IHdpdGggdGhlIGB2YWx1ZWAgY29udGV4dC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3I6IGBUeXBlRXJyb3I6XG5cdCAgICAgICAgICAgICAgICAvLyBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZCAocmVhZGluZyAnU3ltYm9sKFN5bWJvbC5zcGVjaWVzKScpYC5cblx0ICAgICAgICAgICAgICAgIGxldCBDID0gdGhpcy5jb25zdHJ1Y3Rvcj8uW1N5bWJvbC5zcGVjaWVzXTtcblx0ICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIEMgPSB0aGlzLmNvbnN0cnVjdG9yIHx8IFpvbmVBd2FyZVByb21pc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHpvbmUgPSBab25lLmN1cnJlbnQ7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpc1tzeW1ib2xTdGF0ZV0gPT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBjaGFpblByb21pc2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2F0Y2gob25SZWplY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBmaW5hbGx5KG9uRmluYWxseSkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgb24gdGhlIGNhbGwgdG8gYHRoZW5gIGFib3V0IHdoeSB0aGVlIGBTeW1ib2wuc3BlY2llc2AgaXMgc2FmZWx5IGFjY2Vzc2VkLlxuXHQgICAgICAgICAgICAgICAgbGV0IEMgPSB0aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFDIHx8IHR5cGVvZiBDICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgQyA9IFpvbmVBd2FyZVByb21pc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcblx0ICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9IHN5bWJvbEZpbmFsbHk7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXNbc3ltYm9sU3RhdGVdID09IFVOUkVTT0xWRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbFZhbHVlXS5wdXNoKHpvbmUsIGNoYWluUHJvbWlzZSwgb25GaW5hbGx5LCBvbkZpbmFsbHkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QodGhpcywgem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZpbmFsbHksIG9uRmluYWxseSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gY2hhaW5Qcm9taXNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBhZ2dyZXNzaXZlIG9wdGltaXplcnMgZHJvcHBpbmcgc2VlbWluZ2x5IHVudXNlZCBwcm9wZXJ0aWVzLlxuXHQgICAgICAgIC8vIEUuZy4gQ2xvc3VyZSBDb21waWxlciBpbiBhZHZhbmNlZCBtb2RlLlxuXHQgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3Jlc29sdmUnXSA9IFpvbmVBd2FyZVByb21pc2UucmVzb2x2ZTtcblx0ICAgICAgICBab25lQXdhcmVQcm9taXNlWydyZWplY3QnXSA9IFpvbmVBd2FyZVByb21pc2UucmVqZWN0O1xuXHQgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3JhY2UnXSA9IFpvbmVBd2FyZVByb21pc2UucmFjZTtcblx0ICAgICAgICBab25lQXdhcmVQcm9taXNlWydhbGwnXSA9IFpvbmVBd2FyZVByb21pc2UuYWxsO1xuXHQgICAgICAgIGNvbnN0IE5hdGl2ZVByb21pc2UgPSAoZ2xvYmFsW3N5bWJvbFByb21pc2VdID0gZ2xvYmFsWydQcm9taXNlJ10pO1xuXHQgICAgICAgIGdsb2JhbFsnUHJvbWlzZSddID0gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xUaGVuUGF0Y2hlZCA9IF9fc3ltYm9sX18oJ3RoZW5QYXRjaGVkJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gcGF0Y2hUaGVuKEN0b3IpIHtcblx0ICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBDdG9yLnByb3RvdHlwZTtcblx0ICAgICAgICAgICAgY29uc3QgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTtcblx0ICAgICAgICAgICAgaWYgKHByb3AgJiYgKHByb3Aud3JpdGFibGUgPT09IGZhbHNlIHx8ICFwcm9wLmNvbmZpZ3VyYWJsZSkpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGNoZWNrIEN0b3IucHJvdG90eXBlLnRoZW4gcHJvcGVydHlEZXNjcmlwdG9yIGlzIHdyaXRhYmxlIG9yIG5vdFxuXHQgICAgICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlXG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUaGVuID0gcHJvdG8udGhlbjtcblx0ICAgICAgICAgICAgLy8gS2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbWV0aG9kLlxuXHQgICAgICAgICAgICBwcm90b1tzeW1ib2xUaGVuXSA9IG9yaWdpbmFsVGhlbjtcblx0ICAgICAgICAgICAgQ3Rvci5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvblJlc29sdmUsIG9uUmVqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkID0gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGhlbi5jYWxsKHRoaXMsIHJlc29sdmUsIHJlamVjdCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIEN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXBpLnBhdGNoVGhlbiA9IHBhdGNoVGhlbjtcblx0ICAgICAgICBmdW5jdGlvbiB6b25laWZ5KGZuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlc3VsdFByb21pc2UgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblx0ICAgICAgICAgICAgICAgIGlmIChyZXN1bHRQcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGN0b3IgPSByZXN1bHRQcm9taXNlLmNvbnN0cnVjdG9yO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFjdG9yW3N5bWJvbFRoZW5QYXRjaGVkXSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhdGNoVGhlbihjdG9yKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoTmF0aXZlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICBwYXRjaFRoZW4oTmF0aXZlUHJvbWlzZSk7XG5cdCAgICAgICAgICAgIHBhdGNoTWV0aG9kKGdsb2JhbCwgJ2ZldGNoJywgKGRlbGVnYXRlKSA9PiB6b25laWZ5KGRlbGVnYXRlKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFRoaXMgaXMgbm90IHBhcnQgb2YgcHVibGljIEFQSSwgYnV0IGl0IGlzIHVzZWZ1bCBmb3IgdGVzdHMsIHNvIHdlIGV4cG9zZSBpdC5cblx0ICAgICAgICBQcm9taXNlW1pvbmUuX19zeW1ib2xfXygndW5jYXVnaHRQcm9taXNlRXJyb3JzJyldID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycztcblx0ICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hUb1N0cmluZyhab25lKSB7XG5cdCAgICAvLyBvdmVycmlkZSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgdG8gbWFrZSB6b25lLmpzIHBhdGNoZWQgZnVuY3Rpb25cblx0ICAgIC8vIGxvb2sgbGlrZSBuYXRpdmUgZnVuY3Rpb25cblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCd0b1N0cmluZycsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICAvLyBwYXRjaCBGdW5jLnByb3RvdHlwZS50b1N0cmluZyB0byBsZXQgdGhlbSBsb29rIGxpa2UgbmF0aXZlXG5cdCAgICAgICAgY29uc3Qgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuXHQgICAgICAgIGNvbnN0IE9SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ09yaWdpbmFsRGVsZWdhdGUnKTtcblx0ICAgICAgICBjb25zdCBQUk9NSVNFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ1Byb21pc2UnKTtcblx0ICAgICAgICBjb25zdCBFUlJPUl9TWU1CT0wgPSB6b25lU3ltYm9sKCdFcnJvcicpO1xuXHQgICAgICAgIGNvbnN0IG5ld0Z1bmN0aW9uVG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlbGVnYXRlID0gdGhpc1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsRGVsZWdhdGUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnaW5hbERlbGVnYXRlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZVByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVQcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVQcm9taXNlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gRXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVFcnJvciA9IGdsb2JhbFtFUlJPUl9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVFcnJvcikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwobmF0aXZlRXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBuZXdGdW5jdGlvblRvU3RyaW5nW09SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTF0gPSBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmc7XG5cdCAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbmV3RnVuY3Rpb25Ub1N0cmluZztcblx0ICAgICAgICAvLyBwYXRjaCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIHRvIGxldCB0aGVtIGxvb2sgbGlrZSBuYXRpdmVcblx0ICAgICAgICBjb25zdCBvcmlnaW5hbE9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0ICAgICAgICBjb25zdCBQUk9NSVNFX09CSkVDVF9UT19TVFJJTkcgPSAnW29iamVjdCBQcm9taXNlXSc7XG5cdCAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nICYmIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDYWxsYmFja3MoYXBpLCB0YXJnZXQsIHRhcmdldE5hbWUsIG1ldGhvZCwgY2FsbGJhY2tzKSB7XG5cdCAgICBjb25zdCBzeW1ib2wgPSBab25lLl9fc3ltYm9sX18obWV0aG9kKTtcblx0ICAgIGlmICh0YXJnZXRbc3ltYm9sXSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG5hdGl2ZURlbGVnYXRlID0gKHRhcmdldFtzeW1ib2xdID0gdGFyZ2V0W21ldGhvZF0pO1xuXHQgICAgdGFyZ2V0W21ldGhvZF0gPSBmdW5jdGlvbiAobmFtZSwgb3B0cywgb3B0aW9ucykge1xuXHQgICAgICAgIGlmIChvcHRzICYmIG9wdHMucHJvdG90eXBlKSB7XG5cdCAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYCR7dGFyZ2V0TmFtZX0uJHttZXRob2R9OjpgICsgY2FsbGJhY2s7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBvcHRzLnByb3RvdHlwZTtcblx0ICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSBgcGF0Y2hDYWxsYmFja3NgIGlzIHVzZWQgZm9yIHBhdGNoaW5nIHRoZSBgZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50YCBhbmRcblx0ICAgICAgICAgICAgICAgIC8vIGBjdXN0b21FbGVtZW50cy5kZWZpbmVgLiBXZSBleHBsaWNpdGx5IHdyYXAgdGhlIHBhdGNoaW5nIGNvZGUgaW50byB0cnktY2F0Y2ggc2luY2Vcblx0ICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBtYXkgYmUgYWxyZWFkeSBwYXRjaGVkIGJ5IG90aGVyIHdlYiBjb21wb25lbnRzIGZyYW1ld29ya3MgKGUuZy4gTFdDKSwgYW5kIHRoZXlcblx0ICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhvc2UgcHJvcGVydGllcyBub24td3JpdGFibGUuIFRoaXMgbWVhbnMgdGhhdCBwYXRjaGluZyBjYWxsYmFjayB3aWxsIHRocm93IGFuIGVycm9yXG5cdCAgICAgICAgICAgICAgICAvLyBgY2Fubm90IGFzc2lnbiB0byByZWFkLW9ubHkgcHJvcGVydHlgLiBTZWUgdGhpcyBjb2RlIGFzIGFuIGV4YW1wbGU6XG5cdCAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2FsZXNmb3JjZS9sd2MvYmxvYi9tYXN0ZXIvcGFja2FnZXMvQGx3Yy9lbmdpbmUtY29yZS9zcmMvZnJhbWV3b3JrL2Jhc2UtYnJpZGdlLWVsZW1lbnQudHMjTDE4MC1MMTg2XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHN0b3AgdGhlIGFwcGxpY2F0aW9uIHJlbmRlcmluZyBpZiB3ZSBjb3VsZG4ndCBwYXRjaCBzb21lXG5cdCAgICAgICAgICAgICAgICAvLyBjYWxsYmFjaywgZS5nLiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYC5cblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBjYWxsYmFjayk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShkZXNjcmlwdG9yLnZhbHVlLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpLl9yZWRlZmluZVByb3BlcnR5KG9wdHMucHJvdG90eXBlLCBjYWxsYmFjaywgZGVzY3JpcHRvcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlW2NhbGxiYWNrXSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKHByb3RvdHlwZVtjYWxsYmFja10sIHNvdXJjZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3R5cGVbY2FsbGJhY2tdID0gYXBpLndyYXBXaXRoQ3VycmVudFpvbmUocHJvdG90eXBlW2NhbGxiYWNrXSwgc291cmNlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgbGVhdmUgdGhlIGNhdGNoIGJsb2NrIGVtcHR5IHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGhhbmRsZSB0aGUgZXJyb3IgcmVsYXRlZFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRvIG5vbi13cml0YWJsZSBwcm9wZXJ0eS5cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBuYXRpdmVEZWxlZ2F0ZS5jYWxsKHRhcmdldCwgbmFtZSwgb3B0cywgb3B0aW9ucyk7XG5cdCAgICB9O1xuXHQgICAgYXBpLmF0dGFjaE9yaWdpblRvUGF0Y2hlZCh0YXJnZXRbbWV0aG9kXSwgbmF0aXZlRGVsZWdhdGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hVdGlsKFpvbmUpIHtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCd1dGlsJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgLy8gQ29sbGVjdCBuYXRpdmUgZXZlbnQgbmFtZXMgYnkgbG9va2luZyBhdCBwcm9wZXJ0aWVzXG5cdCAgICAgICAgLy8gb24gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGUuZy4gJ29uY2xpY2snLlxuXHQgICAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSBnZXRPbkV2ZW50TmFtZXMoZ2xvYmFsKTtcblx0ICAgICAgICBhcGkucGF0Y2hPblByb3BlcnRpZXMgPSBwYXRjaE9uUHJvcGVydGllcztcblx0ICAgICAgICBhcGkucGF0Y2hNZXRob2QgPSBwYXRjaE1ldGhvZDtcblx0ICAgICAgICBhcGkuYmluZEFyZ3VtZW50cyA9IGJpbmRBcmd1bWVudHM7XG5cdCAgICAgICAgYXBpLnBhdGNoTWFjcm9UYXNrID0gcGF0Y2hNYWNyb1Rhc2s7XG5cdCAgICAgICAgLy8gSW4gZWFybGllciB2ZXJzaW9uIG9mIHpvbmUuanMgKDwwLjkuMCksIHdlIHVzZSBlbnYgbmFtZSBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2Bcblx0ICAgICAgICAvLyB0byBkZWZpbmUgd2hpY2ggZXZlbnRzIHdpbGwgbm90IGJlIHBhdGNoZWQgYnkgYFpvbmUuanNgLiBJbiBuZXdlciB2ZXJzaW9uICg+PTAuOS4wKSwgd2Vcblx0ICAgICAgICAvLyBjaGFuZ2UgdGhlIGVudiBuYW1lIHRvIGBfX3pvbmVfc3ltYm9sX19VTlBBVENIRURfRVZFTlRTYCB0byBrZWVwIHRoZSBuYW1lIGNvbnNpc3RlbnQgd2l0aFxuXHQgICAgICAgIC8vIGFuZ3VsYXIgcmVwby4gVGhlICBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2AgaXMgZGVwcmVjYXRlZCwgYnV0IGl0IGlzIHN0aWxsIGJlXG5cdCAgICAgICAgLy8gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblx0ICAgICAgICBjb25zdCBTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnQkxBQ0tfTElTVEVEX0VWRU5UUycpO1xuXHQgICAgICAgIGNvbnN0IFNZTUJPTF9VTlBBVENIRURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdVTlBBVENIRURfRVZFTlRTJyk7XG5cdCAgICAgICAgaWYgKGdsb2JhbFtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU10pIHtcblx0ICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSA9IGdsb2JhbFtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChnbG9iYWxbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdKSB7XG5cdCAgICAgICAgICAgIFpvbmVbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdID0gWm9uZVtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU10gPVxuXHQgICAgICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUgPSBwYXRjaEV2ZW50UHJvdG90eXBlO1xuXHQgICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0ID0gcGF0Y2hFdmVudFRhcmdldDtcblx0ICAgICAgICBhcGkuaXNJRU9yRWRnZSA9IGlzSUVPckVkZ2U7XG5cdCAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5ID0gT2JqZWN0RGVmaW5lUHJvcGVydHk7XG5cdCAgICAgICAgYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblx0ICAgICAgICBhcGkuT2JqZWN0Q3JlYXRlID0gT2JqZWN0Q3JlYXRlO1xuXHQgICAgICAgIGFwaS5BcnJheVNsaWNlID0gQXJyYXlTbGljZTtcblx0ICAgICAgICBhcGkucGF0Y2hDbGFzcyA9IHBhdGNoQ2xhc3M7XG5cdCAgICAgICAgYXBpLndyYXBXaXRoQ3VycmVudFpvbmUgPSB3cmFwV2l0aEN1cnJlbnRab25lO1xuXHQgICAgICAgIGFwaS5maWx0ZXJQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllcztcblx0ICAgICAgICBhcGkuYXR0YWNoT3JpZ2luVG9QYXRjaGVkID0gYXR0YWNoT3JpZ2luVG9QYXRjaGVkO1xuXHQgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblx0ICAgICAgICBhcGkucGF0Y2hDYWxsYmFja3MgPSBwYXRjaENhbGxiYWNrcztcblx0ICAgICAgICBhcGkuZ2V0R2xvYmFsT2JqZWN0cyA9ICgpID0+ICh7XG5cdCAgICAgICAgICAgIGdsb2JhbFNvdXJjZXMsXG5cdCAgICAgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzLFxuXHQgICAgICAgICAgICBldmVudE5hbWVzLFxuXHQgICAgICAgICAgICBpc0Jyb3dzZXIsXG5cdCAgICAgICAgICAgIGlzTWl4LFxuXHQgICAgICAgICAgICBpc05vZGUsXG5cdCAgICAgICAgICAgIFRSVUVfU1RSLFxuXHQgICAgICAgICAgICBGQUxTRV9TVFIsXG5cdCAgICAgICAgICAgIFpPTkVfU1lNQk9MX1BSRUZJWCxcblx0ICAgICAgICAgICAgQUREX0VWRU5UX0xJU1RFTkVSX1NUUixcblx0ICAgICAgICAgICAgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUixcblx0ICAgICAgICB9KTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDb21tb24oWm9uZSkge1xuXHQgICAgcGF0Y2hQcm9taXNlKFpvbmUpO1xuXHQgICAgcGF0Y2hUb1N0cmluZyhab25lKTtcblx0ICAgIHBhdGNoVXRpbChab25lKTtcblx0fVxuXG5cdGNvbnN0IFpvbmUkMSA9IGxvYWRab25lKCk7XG5cdHBhdGNoQ29tbW9uKFpvbmUkMSk7XG5cdHBhdGNoQnJvd3Nlcihab25lJDEpO1xuXHRyZXR1cm4gem9uZTtcbn1cblxucmVxdWlyZVpvbmUoKTtcblxuZXhwb3J0IHsgWm9uZUNvbnRleHRNYW5hZ2VyIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxVQUFvQjtBQXNCbEMsU0FBU0MsR0FBaUJDLEdBQUs7QUFDM0IsU0FBSUEsTUFBUSxXQUFVQSxJQUFNLENBQUMsSUFDckIsT0FBT0EsRUFBSSxvQkFBcUIsY0FDcEMsT0FBT0EsRUFBSSx1QkFBd0I7QUFDM0M7QUFtQkEsSUFBSUMsS0FBbUIsbUJBVW5CQztBQUFBO0FBQUEsR0FBb0MsV0FBWTtBQUNoRCxhQUFTQSxJQUFxQjtBQUkxQixXQUFLLFdBQVcsSUFJaEIsS0FBSyxlQUFlO0FBQUEsSUFDeEI7QUFLQSxXQUFBQSxFQUFtQixVQUFVLHlCQUF5QixTQUFVQyxHQUFZO0FBQ3hFLGFBQVFBLEtBQWNBLEVBQVcsSUFB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WSIsICJab25lQ29udGV4dE1hbmFnZXIiLCAiYWN0aXZlWm9uZSIsICJjb250ZXh0IiwgInRhcmdldCIsICJtYW5hZ2VyIiwgImNvbnRleHRXcmFwcGVyIiwgIl90aGlzIiwgImFyZ3MiLCAiX2kiLCAicmFuZG9tIiwgInpvbmVOYW1lIiwgIl9hIiwgIm9yaWdpbmFsIiwgImNvbnRleHRNYW5hZ2VyIiwgImV2ZW50IiwgImxpc3RlbmVyIiwgIm9wdHMiLCAibGlzdGVuZXJzIiwgInBhdGNoZWRMaXN0ZW5lciIsICJldmVudHMiLCAiYWN0aXZlIiwgImZuIiwgInRoaXNBcmciLCAibmV3Wm9uZSIsICJ6b25lIiwgImhhc1JlcXVpcmVkWm9uZSIsICJyZXF1aXJlWm9uZSIsICJnbG9iYWwiLCAiX19zeW1ib2xfXyIsICJuYW1lIiwgImluaXRab25lIiwgInBlcmZvcm1hbmNlIiwgIm1hcmsiLCAicGVyZm9ybWFuY2VNZWFzdXJlIiwgImxhYmVsIiwgIlpvbmVJbXBsIiwgInBhdGNoZXMiLCAiX2N1cnJlbnRab25lRnJhbWUiLCAiX2N1cnJlbnRUYXNrIiwgImlnbm9yZUR1cGxpY2F0ZSIsICJjaGVja0R1cGxpY2F0ZSIsICJwZXJmTmFtZSIsICJfYXBpIiwgInBhcmVudCIsICJ6b25lU3BlYyIsICJfWm9uZURlbGVnYXRlIiwgImtleSIsICJjdXJyZW50IiwgImNhbGxiYWNrIiwgInNvdXJjZSIsICJfY2FsbGJhY2siLCAiYXBwbHlUaGlzIiwgImFwcGx5QXJncyIsICJlcnJvciIsICJ0YXNrIiwgIk5PX1pPTkUiLCAiem9uZVRhc2siLCAidHlwZSIsICJpc1BlcmlvZGljIiwgImlzUmVmcmVzaGFibGUiLCAibm90U2NoZWR1bGVkIiwgImV2ZW50VGFzayIsICJtYWNyb1Rhc2siLCAicmVFbnRyeUd1YXJkIiwgInJ1bm5pbmciLCAic2NoZWR1bGVkIiwgInByZXZpb3VzVGFzayIsICJzdGF0ZSIsICJ1bmtub3duIiwgInNjaGVkdWxpbmciLCAiem9uZURlbGVnYXRlcyIsICJlcnIiLCAiZGF0YSIsICJjdXN0b21TY2hlZHVsZSIsICJab25lVGFzayIsICJtaWNyb1Rhc2siLCAiY3VzdG9tQ2FuY2VsIiwgImNhbmNlbGluZyIsICJjb3VudCIsICJpIiwgIkRFTEVHQVRFX1pTIiwgImRlbGVnYXRlIiwgIl8iLCAiaGFzVGFza1N0YXRlIiwgInBhcmVudERlbGVnYXRlIiwgInpvbmVTcGVjSGFzVGFzayIsICJwYXJlbnRIYXNUYXNrIiwgInRhcmdldFpvbmUiLCAicmV0dXJuVGFzayIsICJzY2hlZHVsZU1pY3JvVGFzayIsICJ2YWx1ZSIsICJpc0VtcHR5IiwgImNvdW50cyIsICJwcmV2IiwgIm5leHQiLCAib3B0aW9ucyIsICJzY2hlZHVsZUZuIiwgImNhbmNlbEZuIiwgInNlbGYiLCAiX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyIsICJkcmFpbk1pY3JvVGFza1F1ZXVlIiwgInRvU3RhdGUiLCAiZnJvbVN0YXRlMSIsICJmcm9tU3RhdGUyIiwgInN5bWJvbFNldFRpbWVvdXQiLCAic3ltYm9sUHJvbWlzZSIsICJzeW1ib2xUaGVuIiwgIl9taWNyb1Rhc2tRdWV1ZSIsICJfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlIiwgIm5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSIsICJuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayIsICJmdW5jIiwgIm5hdGl2ZVRoZW4iLCAicXVldWUiLCAibm9vcCIsICJsb2FkWm9uZSIsICJPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0RGVmaW5lUHJvcGVydHkiLCAiT2JqZWN0R2V0UHJvdG90eXBlT2YiLCAiT2JqZWN0Q3JlYXRlIiwgIkFycmF5U2xpY2UiLCAiQUREX0VWRU5UX0xJU1RFTkVSX1NUUiIsICJSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSIiwgIlpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiIsICJaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVIiLCAiVFJVRV9TVFIiLCAiRkFMU0VfU1RSIiwgIlpPTkVfU1lNQk9MX1BSRUZJWCIsICJ3cmFwV2l0aEN1cnJlbnRab25lIiwgInNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lIiwgInpvbmVTeW1ib2wiLCAiaXNXaW5kb3dFeGlzdHMiLCAiaW50ZXJuYWxXaW5kb3ciLCAiX2dsb2JhbCIsICJSRU1PVkVfQVRUUklCVVRFIiwgImJpbmRBcmd1bWVudHMiLCAicGF0Y2hQcm90b3R5cGUiLCAicHJvdG90eXBlIiwgImZuTmFtZXMiLCAicHJvdG90eXBlRGVzYyIsICJpc1Byb3BlcnR5V3JpdGFibGUiLCAicGF0Y2hlZCIsICJhdHRhY2hPcmlnaW5Ub1BhdGNoZWQiLCAicHJvcGVydHlEZXNjIiwgImlzV2ViV29ya2VyIiwgImlzTm9kZSIsICJpc0Jyb3dzZXIiLCAiaXNNaXgiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMkMSIsICJlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2wiLCAid3JhcEZuIiwgImV2ZW50TmFtZVN5bWJvbCIsICJyZXN1bHQiLCAiZXJyb3JFdmVudCIsICJwYXRjaFByb3BlcnR5IiwgInByb3AiLCAiZGVzYyIsICJvblByb3BQYXRjaGVkU3ltYm9sIiwgIm9yaWdpbmFsRGVzY0dldCIsICJvcmlnaW5hbERlc2NTZXQiLCAiZXZlbnROYW1lIiwgIm5ld1ZhbHVlIiwgInBhdGNoT25Qcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiLCAib25Qcm9wZXJ0aWVzIiwgImoiLCAib3JpZ2luYWxJbnN0YW5jZUtleSIsICJwYXRjaENsYXNzIiwgImNsYXNzTmFtZSIsICJPcmlnaW5hbENsYXNzIiwgImEiLCAiaW5zdGFuY2UiLCAicGF0Y2hNZXRob2QiLCAicGF0Y2hGbiIsICJwcm90byIsICJkZWxlZ2F0ZU5hbWUiLCAicGF0Y2hEZWxlZ2F0ZSIsICJwYXRjaE1hY3JvVGFzayIsICJmdW5jTmFtZSIsICJtZXRhQ3JlYXRvciIsICJzZXROYXRpdmUiLCAic2NoZWR1bGVUYXNrIiwgIm1ldGEiLCAiaXNEZXRlY3RlZElFT3JFZGdlIiwgImllT3JFZGdlIiwgImlzSUVPckVkZ2UiLCAidWEiLCAiaXNGdW5jdGlvbiIsICJpc051bWJlciIsICJPUFRJTUlaRURfWk9ORV9FVkVOVF9UQVNLX0RBVEEiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMiLCAiZ2xvYmFsU291cmNlcyIsICJFVkVOVF9OQU1FX1NZTUJPTF9SRUdYIiwgIklNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0wiLCAicHJlcGFyZUV2ZW50TmFtZXMiLCAiZXZlbnROYW1lVG9TdHJpbmciLCAiZmFsc2VFdmVudE5hbWUiLCAidHJ1ZUV2ZW50TmFtZSIsICJzeW1ib2wiLCAic3ltYm9sQ2FwdHVyZSIsICJwYXRjaEV2ZW50VGFyZ2V0IiwgImFwaSIsICJhcGlzIiwgInBhdGNoT3B0aW9ucyIsICJBRERfRVZFTlRfTElTVEVORVIiLCAiUkVNT1ZFX0VWRU5UX0xJU1RFTkVSIiwgIkxJU1RFTkVSU19FVkVOVF9MSVNURU5FUiIsICJSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUiIsICJ6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lciIsICJBRERfRVZFTlRfTElTVEVORVJfU09VUkNFIiwgIlBSRVBFTkRfRVZFTlRfTElTVEVORVIiLCAiUFJFUEVORF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UiLCAiaW52b2tlVGFzayIsICJnbG9iYWxDYWxsYmFjayIsICJpc0NhcHR1cmUiLCAidGFza3MiLCAiZXJyb3JzIiwgImNvcHlUYXNrcyIsICJnbG9iYWxab25lQXdhcmVDYWxsYmFjayIsICJnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2siLCAicGF0Y2hFdmVudFRhcmdldE1ldGhvZHMiLCAidXNlR2xvYmFsQ2FsbGJhY2siLCAidmFsaWRhdGVIYW5kbGVyIiwgInJldHVyblRhcmdldCIsICJ0YXNrRGF0YSIsICJuYXRpdmVBZGRFdmVudExpc3RlbmVyIiwgIm5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIiLCAibmF0aXZlTGlzdGVuZXJzIiwgIm5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyIsICJuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciIsICJidWlsZEV2ZW50TGlzdGVuZXJPcHRpb25zIiwgInBhc3NpdmUiLCAiY3VzdG9tU2NoZWR1bGVHbG9iYWwiLCAiY3VzdG9tQ2FuY2VsR2xvYmFsIiwgInN5bWJvbEV2ZW50TmFtZXMiLCAic3ltYm9sRXZlbnROYW1lIiwgImV4aXN0aW5nVGFza3MiLCAiY3VzdG9tU2NoZWR1bGVOb25HbG9iYWwiLCAiY3VzdG9tU2NoZWR1bGVQcmVwZW5kIiwgImN1c3RvbUNhbmNlbE5vbkdsb2JhbCIsICJjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZSIsICJ0eXBlT2ZEZWxlZ2F0ZSIsICJjb21wYXJlIiwgInVucGF0Y2hlZEV2ZW50cyIsICJwYXNzaXZlRXZlbnRzIiwgImNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyIsICJuZXdPcHRpb25zIiwgIm1ha2VBZGRMaXN0ZW5lciIsICJuYXRpdmVMaXN0ZW5lciIsICJhZGRTb3VyY2UiLCAiY3VzdG9tU2NoZWR1bGVGbiIsICJjdXN0b21DYW5jZWxGbiIsICJwcmVwZW5kIiwgImlzRXZlbnRMaXN0ZW5lck9iamVjdCIsICJzaWduYWwiLCAiY2FwdHVyZSIsICJvbmNlIiwgImlzRXhpc3RpbmciLCAiY29uc3RydWN0b3JOYW1lIiwgInRhcmdldFNvdXJjZSIsICJvbkFib3J0IiwgImV4aXN0aW5nVGFzayIsICJvblByb3BlcnR5U3ltYm9sIiwgImZpbmRFdmVudFRhc2tzIiwgInN5bWJvbENhcHR1cmVFdmVudE5hbWUiLCAiY2FwdHVyZVRhc2tzIiwgInJlbW92ZVRhc2tzIiwgImtleXMiLCAibWF0Y2giLCAiZXZ0TmFtZSIsICJyZXN1bHRzIiwgImZvdW5kVGFza3MiLCAiY2FwdHVyZUZhbHNlVGFza3MiLCAiY2FwdHVyZVRydWVUYXNrcyIsICJwYXRjaEV2ZW50UHJvdG90eXBlIiwgIkV2ZW50IiwgInBhdGNoUXVldWVNaWNyb3Rhc2siLCAidGFza1N5bWJvbCIsICJwYXRjaFRpbWVyIiwgIndpbmRvdyIsICJzZXROYW1lIiwgImNhbmNlbE5hbWUiLCAibmFtZVN1ZmZpeCIsICJjbGVhck5hdGl2ZSIsICJ0YXNrc0J5SGFuZGxlSWQiLCAiaGFuZGxlT3JJZCIsICJjbGVhclRhc2siLCAiaGFuZGxlIiwgImhhbmRsZUlkIiwgIm9yaWdpbmFsUmVmcmVzaCIsICJpZCIsICJwYXRjaEN1c3RvbUVsZW1lbnRzIiwgImNhbGxiYWNrcyIsICJldmVudFRhcmdldFBhdGNoIiwgImV2ZW50TmFtZXMiLCAiRVZFTlRfVEFSR0VUIiwgInBhdGNoRXZlbnQiLCAiZmlsdGVyUHJvcGVydGllcyIsICJpZ25vcmVQcm9wZXJ0aWVzIiwgInRpcCIsICJpcCIsICJ0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzIiwgIm9wIiwgInBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzIiwgImZpbHRlcmVkUHJvcGVydGllcyIsICJnZXRPbkV2ZW50TmFtZXMiLCAicHJvcGVydHlEZXNjcmlwdG9yUGF0Y2giLCAicGF0Y2hUYXJnZXRzIiwgImlnbm9yZUVycm9yUHJvcGVydGllcyIsICJwYXRjaEJyb3dzZXIiLCAiWm9uZSIsICJsZWdhY3lQYXRjaCIsICJjbGVhciIsICJibG9ja2luZ01ldGhvZHMiLCAicyIsICJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IiwgInBhdGNoWEhSIiwgIlhIUl9UQVNLIiwgIlhIUl9TWU5DIiwgIlhIUl9MSVNURU5FUiIsICJYSFJfU0NIRURVTEVEIiwgIlhIUl9VUkwiLCAiWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQiLCAiWE1MSHR0cFJlcXVlc3QiLCAiWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUiLCAiZmluZFBlbmRpbmdUYXNrIiwgIm9yaUFkZExpc3RlbmVyIiwgIm9yaVJlbW92ZUxpc3RlbmVyIiwgIlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUiLCAiUkVBRFlfU1RBVEVfQ0hBTkdFIiwgIlNDSEVEVUxFRCIsICJuZXdMaXN0ZW5lciIsICJsb2FkVGFza3MiLCAib3JpSW52b2tlIiwgInNlbmROYXRpdmUiLCAicGxhY2Vob2xkZXJDYWxsYmFjayIsICJhYm9ydE5hdGl2ZSIsICJvcGVuTmF0aXZlIiwgIlhNTEhUVFBSRVFVRVNUX1NPVVJDRSIsICJmZXRjaFRhc2tBYm9ydGluZyIsICJmZXRjaFRhc2tTY2hlZHVsaW5nIiwgImZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIsICJlIiwgIlByb21pc2VSZWplY3Rpb25FdmVudCIsICJldnQiLCAicGF0Y2hQcm9taXNlIiwgInJlYWRhYmxlT2JqZWN0VG9TdHJpbmciLCAiX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyIsICJpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiIsICJjcmVhdGlvblRyYWNlIiwgInJlamVjdGlvbiIsICJ1bmNhdWdodFByb21pc2VFcnJvciIsICJoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24iLCAiVU5IQU5ETEVEX1BST01JU0VfUkVKRUNUSU9OX0hBTkRMRVJfU1lNQk9MIiwgImhhbmRsZXIiLCAiaXNUaGVuYWJsZSIsICJmb3J3YXJkUmVzb2x1dGlvbiIsICJmb3J3YXJkUmVqZWN0aW9uIiwgIlpvbmVBd2FyZVByb21pc2UiLCAic3ltYm9sU3RhdGUiLCAic3ltYm9sVmFsdWUiLCAic3ltYm9sRmluYWxseSIsICJzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWUiLCAic3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlIiwgIlVOUkVTT0xWRUQiLCAiUkVTT0xWRUQiLCAiUkVKRUNURUQiLCAiUkVKRUNURURfTk9fQ0FUQ0giLCAibWFrZVJlc29sdmVyIiwgInByb21pc2UiLCAidiIsICJyZXNvbHZlUHJvbWlzZSIsICJ3YXNDYWxsZWQiLCAid3JhcHBlZEZ1bmN0aW9uIiwgIlRZUEVfRVJST1IiLCAiQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCIsICJvbmNlV3JhcHBlciIsICJ0aGVuIiwgImNsZWFyUmVqZWN0ZWROb0NhdGNoIiwgInRyYWNlIiwgInNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0IiwgIlJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIiLCAiY2hhaW5Qcm9taXNlIiwgIm9uRnVsZmlsbGVkIiwgIm9uUmVqZWN0ZWQiLCAicHJvbWlzZVN0YXRlIiwgInBhcmVudFByb21pc2VWYWx1ZSIsICJpc0ZpbmFsbHlQcm9taXNlIiwgIlpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkciLCAiQWdncmVnYXRlRXJyb3IiLCAicmVzIiwgInJlaiIsICJ2YWx1ZXMiLCAicHJvbWlzZXMiLCAiZmluaXNoZWQiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAib25SZXNvbHZlIiwgIm9uUmVqZWN0IiwgInVucmVzb2x2ZWRDb3VudCIsICJ2YWx1ZUluZGV4IiwgInJlc29sdmVkVmFsdWVzIiwgImN1clZhbHVlSW5kZXgiLCAidGhlbkVyciIsICJleGVjdXRvciIsICJDIiwgIm9uRmluYWxseSIsICJOYXRpdmVQcm9taXNlIiwgInN5bWJvbFRoZW5QYXRjaGVkIiwgInBhdGNoVGhlbiIsICJDdG9yIiwgIm9yaWdpbmFsVGhlbiIsICJ6b25laWZ5IiwgInJlc3VsdFByb21pc2UiLCAiY3RvciIsICJwYXRjaFRvU3RyaW5nIiwgIm9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyIsICJPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wiLCAiUFJPTUlTRV9TWU1CT0wiLCAiRVJST1JfU1lNQk9MIiwgIm5ld0Z1bmN0aW9uVG9TdHJpbmciLCAib3JpZ2luYWxEZWxlZ2F0ZSIsICJuYXRpdmVQcm9taXNlIiwgIm5hdGl2ZUVycm9yIiwgIm9yaWdpbmFsT2JqZWN0VG9TdHJpbmciLCAiUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HIiwgInBhdGNoQ2FsbGJhY2tzIiwgInRhcmdldE5hbWUiLCAibWV0aG9kIiwgIm5hdGl2ZURlbGVnYXRlIiwgImRlc2NyaXB0b3IiLCAicGF0Y2hVdGlsIiwgIlNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTIiwgIlNZTUJPTF9VTlBBVENIRURfRVZFTlRTIiwgInBhdGNoQ29tbW9uIiwgIlpvbmUkMSJdCn0K
|