milkio 1.3.47 → 1.3.48
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/index.js +58 -13
- package/package.json +1 -1
- package/utils/sanitize-execute-id.d.ts +1 -0
package/index.js
CHANGED
|
@@ -76,11 +76,8 @@ function tryParseDate(str) {
|
|
|
76
76
|
if (datePart === undefined)
|
|
77
77
|
return null;
|
|
78
78
|
if (tzPart !== undefined) {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
return new Date(str.substring(0, colonPos) + str.substring(colonPos + 1));
|
|
82
|
-
}
|
|
83
|
-
return new Date(str);
|
|
79
|
+
const normalizedTz = tzPart.length === 5 && tzPart.charAt(3) !== ":" ? `${tzPart.slice(0, 3)}:${tzPart.slice(3)}` : tzPart;
|
|
80
|
+
return new Date(datePart + normalizedTz);
|
|
84
81
|
}
|
|
85
82
|
return new Date(datePart + "Z");
|
|
86
83
|
}
|
|
@@ -649,13 +646,13 @@ class Trie {
|
|
|
649
646
|
let currentNode = this.root;
|
|
650
647
|
for (const part2 of parts) {
|
|
651
648
|
if (!currentNode.children.has(part2)) {
|
|
652
|
-
this.cache.set(path, null);
|
|
653
649
|
return null;
|
|
654
650
|
}
|
|
655
651
|
currentNode = currentNode.children.get(part2);
|
|
656
652
|
}
|
|
657
653
|
const result = currentNode.value;
|
|
658
|
-
|
|
654
|
+
if (result !== null)
|
|
655
|
+
this.cache.set(path, result);
|
|
659
656
|
return result;
|
|
660
657
|
}
|
|
661
658
|
getByParts(parts) {
|
|
@@ -712,17 +709,26 @@ function buildCorsHeaders(cors, origin) {
|
|
|
712
709
|
return result;
|
|
713
710
|
}
|
|
714
711
|
|
|
712
|
+
// packages/milkio/utils/sanitize-execute-id.ts
|
|
713
|
+
function sanitizeExecuteId(executeId) {
|
|
714
|
+
const value = typeof executeId === "string" ? executeId : "";
|
|
715
|
+
return value.replace(/[^A-Za-z0-9_-]/g, "");
|
|
716
|
+
}
|
|
717
|
+
|
|
715
718
|
// packages/milkio/listener/index.ts
|
|
716
719
|
function __initListener(generated, runtime, executer) {
|
|
717
720
|
const port = runtime.port;
|
|
718
721
|
const trie = new Trie;
|
|
719
722
|
const cors = { corsAllowMethods: ["POST", "OPTIONS"], corsAllowHeaders: ["Content-Type", "Authorization"], corsMaxAge: 0, ...runtime.http?.cors };
|
|
720
723
|
const corsHeadersCache = new Map;
|
|
724
|
+
const MAX_CORS_HEADERS_CACHE_SIZE = 1024;
|
|
721
725
|
const getCorsHeaders = (origin) => {
|
|
722
726
|
const key = origin ?? "";
|
|
723
727
|
let cached = corsHeadersCache.get(key);
|
|
724
728
|
if (cached !== undefined)
|
|
725
729
|
return cached;
|
|
730
|
+
if (corsHeadersCache.size >= MAX_CORS_HEADERS_CACHE_SIZE)
|
|
731
|
+
corsHeadersCache.clear();
|
|
726
732
|
cached = buildCorsHeaders(cors, origin);
|
|
727
733
|
corsHeadersCache.set(key, cached);
|
|
728
734
|
return cached;
|
|
@@ -779,6 +785,40 @@ function __initListener(generated, runtime, executer) {
|
|
|
779
785
|
let cachedHandler = null;
|
|
780
786
|
let cachedSkipValidation = false;
|
|
781
787
|
const fetch = async (options) => {
|
|
788
|
+
const MAX_BODY_SIZE = 10 * 1024 * 1024;
|
|
789
|
+
const tooLarge = () => reject("REQUEST_TOO_LARGE", { maxBodySize: MAX_BODY_SIZE });
|
|
790
|
+
const readBodyText = async () => {
|
|
791
|
+
const preRead = options.request.__bodyText;
|
|
792
|
+
if (preRead !== undefined) {
|
|
793
|
+
if (typeof preRead === "string" && preRead.length > MAX_BODY_SIZE)
|
|
794
|
+
throw tooLarge();
|
|
795
|
+
return preRead;
|
|
796
|
+
}
|
|
797
|
+
const contentLength = Number(options.request.headers.get("content-length") ?? "0");
|
|
798
|
+
if (Number.isFinite(contentLength) && contentLength > MAX_BODY_SIZE)
|
|
799
|
+
throw tooLarge();
|
|
800
|
+
if (!options.request.body)
|
|
801
|
+
return "";
|
|
802
|
+
const reader = options.request.body.getReader();
|
|
803
|
+
const decoder = new TextDecoder;
|
|
804
|
+
let text = "";
|
|
805
|
+
try {
|
|
806
|
+
while (true) {
|
|
807
|
+
const { done, value } = await reader.read();
|
|
808
|
+
if (done)
|
|
809
|
+
break;
|
|
810
|
+
text += decoder.decode(value, { stream: true });
|
|
811
|
+
if (text.length > MAX_BODY_SIZE) {
|
|
812
|
+
await reader.cancel().catch(() => {});
|
|
813
|
+
throw tooLarge();
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
text += decoder.decode();
|
|
817
|
+
} finally {
|
|
818
|
+
reader.releaseLock();
|
|
819
|
+
}
|
|
820
|
+
return text;
|
|
821
|
+
};
|
|
782
822
|
const origin = options.request.__origin ?? options.request.headers.get("Origin");
|
|
783
823
|
if (options.request.method === "OPTIONS") {
|
|
784
824
|
return new Response(undefined, {
|
|
@@ -840,7 +880,7 @@ function __initListener(generated, runtime, executer) {
|
|
|
840
880
|
return new Response(body2, { status: 200, headers: { ...corsHeaders3, "Content-Type": "application/json" } });
|
|
841
881
|
}
|
|
842
882
|
let eventData = undefined;
|
|
843
|
-
const rawBody =
|
|
883
|
+
const rawBody = await readBodyText();
|
|
844
884
|
if (rawBody && rawBody !== "" && rawBody !== "{}") {
|
|
845
885
|
try {
|
|
846
886
|
eventData = reviveJSONParse(JSON.parse(rawBody));
|
|
@@ -957,7 +997,7 @@ function __initListener(generated, runtime, executer) {
|
|
|
957
997
|
cachedSkipValidation = skipValidation;
|
|
958
998
|
}
|
|
959
999
|
const executeId2 = __createId();
|
|
960
|
-
const body =
|
|
1000
|
+
const body = await readBodyText();
|
|
961
1001
|
let params;
|
|
962
1002
|
let paramsOk = true;
|
|
963
1003
|
if (!body || body === "" || body === "{}") {
|
|
@@ -1009,7 +1049,8 @@ function __initListener(generated, runtime, executer) {
|
|
|
1009
1049
|
}
|
|
1010
1050
|
}
|
|
1011
1051
|
const corsHeaders = getCorsHeaders(origin);
|
|
1012
|
-
const
|
|
1052
|
+
const rawExecuteId = runtime?.executeId ? await runtime.executeId(options.request.headers) : __createId();
|
|
1053
|
+
const executeId = sanitizeExecuteId(rawExecuteId) || __createId();
|
|
1013
1054
|
const anyEmitHandlers = !checkNoEmitHandlers();
|
|
1014
1055
|
const logger = createLogger(runtime, pathString, executeId);
|
|
1015
1056
|
if (anyEmitHandlers)
|
|
@@ -1027,7 +1068,7 @@ function __initListener(generated, runtime, executer) {
|
|
|
1027
1068
|
ip,
|
|
1028
1069
|
path: { string: pathString, array: pathArray },
|
|
1029
1070
|
params: {
|
|
1030
|
-
string: isRawPath ? "" :
|
|
1071
|
+
string: isRawPath ? "" : await readBodyText(),
|
|
1031
1072
|
parsed: undefined
|
|
1032
1073
|
},
|
|
1033
1074
|
request: options.request,
|
|
@@ -1211,7 +1252,11 @@ function __initListener(generated, runtime, executer) {
|
|
|
1211
1252
|
if (routeSchema.type !== "stream")
|
|
1212
1253
|
throw reject("UNACCEPTABLE", { expected: "stream", message: `Not acceptable, the Accept in the request header should be "application/json". If you are using the "@milkio/stargate" package, please remove \`type: "stream"\` to the execute options.` });
|
|
1213
1254
|
}
|
|
1255
|
+
let streamClosed = false;
|
|
1214
1256
|
const handleClose = async () => {
|
|
1257
|
+
if (streamClosed)
|
|
1258
|
+
return;
|
|
1259
|
+
streamClosed = true;
|
|
1215
1260
|
for (const handler of finales) {
|
|
1216
1261
|
try {
|
|
1217
1262
|
await handler();
|
|
@@ -1548,5 +1593,5 @@ export {
|
|
|
1548
1593
|
__initEventManager
|
|
1549
1594
|
};
|
|
1550
1595
|
|
|
1551
|
-
//# debugId=
|
|
1552
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbHMvcGFydC50cyIsICIuLi90eXBlLXNhZmV0eS9pbmRleC50cyIsICIuLi9jb25maWcvaW5kZXgudHMiLCAiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzIiwgIi4uL3V0aWxzL21lcmdlLWRlZXAudHMiLCAiLi4vdXRpbHMvcmV2aXZlLWpzb24tcGFyc2UudHMiLCAiLi4vZXhlY3V0ZS9pbmRleC50cyIsICIuLi9ldmVudC9pbmRleC50cyIsICIuLi9mbG93L2luZGV4LnRzIiwgIi4uL3V0aWxzL2NyZWF0ZS1pZC50cyIsICIuLi9leGVjdXRlL2V4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzIiwgIi4uL3dvcmxkL2luZGV4LnRzIiwgIi4uL3R5cGlhL2luZGV4LnRzIiwgIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHMiLCAiLi4vbG9nZ2VyL2luZGV4LnRzIiwgIi4uL3N0ZXAvaW5kZXgudHMiLCAiLi4vdXRpbHMvdHJpZS50cyIsICIuLi91dGlscy9idWlsZC1jb3JzLWhlYWRlcnMudHMiLCAiLi4vbGlzdGVuZXIvaW5kZXgudHMiLCAiLi4vZXhjZXB0aW9uL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCBmdW5jdGlvbiBwYXJ0PFQgZXh0ZW5kcyAoKSA9PiB1bmtub3duPihoYW5kbGVyOiBUKTogUmV0dXJuVHlwZTxUPiB7XG4gIHJldHVybiBoYW5kbGVyKCkgYXMgdW5rbm93biBhcyBSZXR1cm5UeXBlPFQ+O1xufVxuIiwKICAgICJleHBvcnQgdHlwZSBUeXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4gPSAodmFsdWU6IFZhbHVlKSA9PiBUeXBlU2FmZXR5VmFsdWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVZhbHVlIHtcbiAgdHlwZTogPFR5cGUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PigpID0+IFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVNhZmV0eVR5cGU8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+IHtcbiAgJG1pbGtpb1R5cGU6IFwidHlwZS1zYWZldHlcIjtcbiAgdmFsdWU6IFR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlU2FmZXR5PFZhbHVlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4odmFsdWU6IFZhbHVlKTogVHlwZVNhZmV0eVZhbHVlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAoKSA9PiAoeyAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiLCB2YWx1ZSB9KSxcbiAgfSBhcyBhbnk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBjb25maWc8Q29uZmlnVCBleHRlbmRzIENvbmZpZz4oY29uZmlnOiBDb25maWdUKTogQ29uZmlnVCB7XG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IChtb2RlOiBzdHJpbmcpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRW52aXJvbm1lbnRzPFQgZXh0ZW5kcyBDb25maWc+IHtcbiAgW2tleTogc3RyaW5nXTogKGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gUGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+PiB8IFByb21pc2U8UGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnZUb1N0cmluZyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG4gIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvQm9vbGVhbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IGJvb2xlYW4pIHtcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodW5kZWZpbmVkID09PSB2YWx1ZSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9KU09OKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgY29uc3QganNvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoaGVhZGVycyBhcyBhbnkpLmVudHJpZXMoKSkge1xuICAgIGpzb25ba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuIiwKICAgICJmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih0YXJnZXQ6IFQsIHNvdXJjZTogVSk6IFQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLnRhcmdldCB9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG5cbiAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0W2tleSBhcyBrZXlvZiBUXTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdCh0YXJnZXRWYWx1ZSkgJiYgaXNQbGFpbk9iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgbWVyZ2VkW2tleSBhcyBrZXlvZiBUICYga2V5b2YgVV0gPSBtZXJnZURlZXAodGFyZ2V0VmFsdWUsIHNvdXJjZVZhbHVlKSBhcyBhbnk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIChtZXJnZWQgYXMgYW55KVtrZXldID0gc291cmNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZCBhcyBUICYgVTtcbn1cbiIsCiAgICAiY29uc3QgaXNvRGF0ZVBhdHRlcm4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDN9KT8pKFp8WystXVxcZHsyfTo/XFxkezJ9KT8kLztcblxuZnVuY3Rpb24gdHJ5UGFyc2VEYXRlKHN0cjogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgaWYgKGxlbiA+PSAyMCAmJiBsZW4gPD0gMzIgJiYgc3RyLmNoYXJDb2RlQXQoMCkgPj0gMHgzMCAmJiBzdHIuY2hhckNvZGVBdCgwKSA8PSAweDM5ICYmIHN0ci5pbmRleE9mKCdUJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gaXNvRGF0ZVBhdHRlcm4uZXhlYyhzdHIpO1xuICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVQYXJ0ID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBjb25zdCB0elBhcnQgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIGlmIChkYXRlUGFydCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICh0elBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9uUG9zID0gdHpQYXJ0LmNoYXJDb2RlQXQoMykgPT09IDU4ID8gZGF0ZVBhcnQubGVuZ3RoICsgMyA6IC0xO1xuICAgICAgICAgICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShzdHIuc3Vic3RyaW5nKDAsIGNvbG9uUG9zKSArIHN0ci5zdWJzdHJpbmcoY29sb25Qb3MgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShzdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVQYXJ0ICsgJ1onKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XG4gICAgaWYgKGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4ganNvbjtcbiAgICBpZiAodHlwZW9mIGpzb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBqc29uLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0ganNvbltpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0cnlQYXJzZURhdGUodik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkICE9PSBudWxsKSBqc29uW2ldID0gZDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldml2ZUpTT05QYXJzZSh2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmogPSBqc29uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB2ID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHRyeVBhcnNlRGF0ZSh2KTtcbiAgICAgICAgICAgICAgICBpZiAoZCAhPT0gbnVsbCkgb2JqW2tleV0gPSBkO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldml2ZUpTT05QYXJzZSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBkID0gdHJ5UGFyc2VEYXRlKGpzb24pO1xuICAgICAgICBpZiAoZCAhPT0gbnVsbCkgcmV0dXJuIGQgYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgSVZhbGlkYXRpb24gfSBmcm9tIFwidHlwaWFcIjtcbmltcG9ydCB7IHJlamVjdCwgcmFpc2UgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgJGNvbnRleHQsICRtZXRhLCBMb2dnZXIsIFJlc3VsdHMsIEdlbmVyYXRlZEluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IGhlYWRlcnNUb0pTT04gfSBmcm9tIFwiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzXCI7XG5pbXBvcnQgeyBtZXJnZURlZXAgfSBmcm9tIFwiLi4vdXRpbHMvbWVyZ2UtZGVlcC50c1wiO1xuaW1wb3J0IHsgcmV2aXZlSlNPTlBhcnNlIH0gZnJvbSBcIi4uL3V0aWxzL3Jldml2ZS1qc29uLXBhcnNlLnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSkge1xuICAgIGNvbnN0IF9fZXhlY3V0ZSA9IGFzeW5jIChcbiAgICAgICAgcm91dGVTY2hlbWE6IGFueSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogTG9nZ2VyO1xuICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEhlYWRlcnM7XG4gICAgICAgICAgICBjb250ZXh0OiBhbnkgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBwYXJhbXNDb250ZW50VHlwZT86IHN0cmluZztcbiAgICAgICAgfSAmIChcbiAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSxcbiAgICApOiBQcm9taXNlPHsgZXhlY3V0ZUlkOiBzdHJpbmc7IGhlYWRlcnM6IEhlYWRlcnM7IHBhcmFtczogUmVjb3JkPGFueSwgdW5rbm93bj47IHJlc3VsdHM6IFJlc3VsdHM8YW55PjsgY29udGV4dDogJGNvbnRleHQ7IG1ldGE6IFJlYWRvbmx5PCRtZXRhPjsgdHlwZTogXCJhY3Rpb25cIiB8IFwic3RyZWFtXCI7IGVtcHR5UmVzdWx0OiBib29sZWFuOyBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gfT4gPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gb3B0aW9ucy5wYXRoLmVuZHNXaXRoKFwiflwiKSA/IFwic3RyZWFtXCIgOiBcImFjdGlvblwiO1xuICAgICAgICBjb25zdCBleGVjdXRlSWQ6IHN0cmluZyA9IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZDtcbiAgICAgICAgbGV0IGhlYWRlcnM6IEhlYWRlcnM7XG4gICAgICAgIGlmICghKG9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGxpZ2h0d2VpZ2h0IGhlYWRlcnMgcHJveHkgd2l0aCBnZXQoKSBtZXRob2RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKG9wdGlvbnMuaGVhZGVycyBhcyBhbnkpPy5nZXQgPT09IFwiZnVuY3Rpb25cIiAmJiAhKG9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyBhcyB1bmtub3duIGFzIEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0b0pTT04gZm9yIGxpZ2h0d2VpZ2h0IHByb3h5IC0gbm90IG5lZWRlZCBpbiBIVFRQIHJlcXVlc3QgcGF0aFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghKFwidG9KU09OXCIgaW4gaGVhZGVycykpIChoZWFkZXJzIGFzIGFueSkudG9KU09OID0gKCkgPT4gaGVhZGVyc1RvSlNPTihoZWFkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbGVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgICAgIGNvbnN0IG9uRmluYWxseSA9IChoYW5kbGVyOiBhbnkpID0+IGZpbmFsZXMudW5zaGlmdChoYW5kbGVyKTtcblxuICAgICAgICBsZXQgcGFyYW1zOiBSZWNvcmQ8YW55LCB1bmtub3duPjtcbiAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1zVHlwZSA9PT0gXCJyYXdcIikge1xuICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyYW1zIHx8IG9wdGlvbnMucGFyYW1zID09PSBcIlwiIHx8IG9wdGlvbnMucGFyYW1zID09PSBcInt9XCIpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LnN0YXJ0c1dpdGgoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2Uob3B0aW9ucy5wYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwianNvblwiLCBjb250ZW50VHlwZTogaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgPz8gbnVsbCwgcGFyYW1zOiBvcHRpb25zLnBhcmFtcy5zbGljZSgwLCA0MDk2KSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKT8uc3RhcnRzV2l0aChcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiBwYXJhbXNba2V5XSA9IHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwiZm9ybS11cmxlbmNvZGVkXCIsIGNvbnRlbnRUeXBlOiBoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBudWxsLCBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLnNsaWNlKDAsIDQwOTYpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJhbXMuc3RhcnRzV2l0aChcIntcIikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShvcHRpb25zLnBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJqc29uXCIsIGNvbnRlbnRUeXBlOiBoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBudWxsLCBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLnNsaWNlKDAsIDQwOTYpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJqc29uXCIsIGNvbnRlbnRUeXBlOiBoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBudWxsLCBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLnNsaWNlKDAsIDQwOTYpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyYW1zKSkgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiwgY29udGVudFR5cGU6IGhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpID8/IG51bGwsIHBhcmFtczogKHR5cGVvZiBvcHRpb25zLnBhcmFtcyA9PT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMucGFyYW1zIDogSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wYXJhbXMpKS5zbGljZSgwLCA0MDk2KSB9KTtcbiAgICAgICAgaWYgKFwiJG1pbGtpb0dlbmVyYXRlUGFyYW1zXCIgaW4gcGFyYW1zICYmIHBhcmFtcy4kbWlsa2lvR2VuZXJhdGVQYXJhbXMgPT09IFwiZW5hYmxlXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVudGltZS5kZXZlbG9wKSB0aHJvdyByZWplY3QoXCJOT1RfREVWRUxPUF9NT0RFXCIsIFwiVGhpcyBmZWF0dXJlIG11c3QgYmUgaW4gY29va2Jvb2sgdG8gdXNlLlwiKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMuJG1pbGtpb0dlbmVyYXRlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHBhcmFtc1JhbmQgPSByb3V0ZVNjaGVtYS5yYW5kb21QYXJhbXMoKTtcbiAgICAgICAgICAgIGlmIChwYXJhbXNSYW5kID09PSB1bmRlZmluZWQgfHwgcGFyYW1zUmFuZCA9PT0gbnVsbCkgcGFyYW1zUmFuZCA9IHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gbWVyZ2VEZWVwKHBhcmFtcywgcGFyYW1zUmFuZCk7XG4gICAgICAgICAgICBvcHRpb25zLmNyZWF0ZWRMb2dnZXIuZGVidWcoXCLinKggdGhlIGdlbmVyYXRlZCBwYXJhbXM6XCIsIEpTT04uc3RyaW5naWZ5KHBhcmFtcykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0Py5odHRwPy5ub3RGb3VuZCAmJiBvcHRpb25zLmNvbnRleHQ/Lmh0dHA/LnBhcmFtcz8uc3RyaW5nKSBvcHRpb25zLmNvbnRleHQuaHR0cC5wYXJhbXMucGFyc2VkID0gcGFyYW1zO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0KSBvcHRpb25zLmNvbnRleHQgPSB7fTtcbiAgICAgICAgY29uc3QgY3R4ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBjdHguZGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcbiAgICAgICAgY3R4LnBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgIGN0eC5yb3V0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBjdHgubG9nZ2VyID0gb3B0aW9ucy5jcmVhdGVkTG9nZ2VyO1xuICAgICAgICBjdHguZW1pdCA9IHJ1bnRpbWUuZW1pdDtcbiAgICAgICAgY3R4LmVtaXRBbnlBcHByb3ZlZCA9IHJ1bnRpbWUuZW1pdEFueUFwcHJvdmVkO1xuICAgICAgICBjdHguZW1pdEFsbEFwcHJvdmVkID0gcnVudGltZS5lbWl0QWxsQXBwcm92ZWQ7XG4gICAgICAgIGN0eC5leGVjdXRlSWQgPSBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQ7XG4gICAgICAgIGN0eC5jb25maWcgPSBydW50aW1lLnJ1bnRpbWUuY29uZmlnO1xuICAgICAgICBjdHgudHlwaWEgPSBnZW5lcmF0ZWQudHlwaWFTY2hlbWE7XG4gICAgICAgIGN0eC5jYWxsID0gKG1vZHVsZTogYW55LCBwYXJhbXM6IGFueSkgPT4gX19jYWxsKGN0eCwgbW9kdWxlLCBwYXJhbXMpO1xuICAgICAgICBjdHgub25GaW5hbGx5ID0gb25GaW5hbGx5O1xuICAgICAgICBjdHguXyA9IHJ1bnRpbWU7XG4gICAgICAgIGN0eC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIGN0eC5yYWlzZSA9IHJhaXNlO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8YW55PiA9IHsgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgY29uc3QgbWV0YSA9IChtb2R1bGU/Lm1ldGEgPyBtb2R1bGU/Lm1ldGEgOiB7fSkgYXMgdW5rbm93biBhcyBSZWFkb25seTwkbWV0YT47XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY29udGV4dC5odHRwPy5yZXF1ZXN0Py5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dNZXRob2RzID0gbWV0YT8ubWV0aG9kcyA/PyBbXCJQT1NUXCJdO1xuICAgICAgICAgICAgaWYgKCFhbGxvd01ldGhvZHMuaW5jbHVkZXMob3B0aW9ucy5jb250ZXh0Lmh0dHAucmVxdWVzdC5tZXRob2QpKSB0aHJvdyByZWplY3QoXCJNRVRIT0RfTk9UX0FMTE9XRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRhPy50eXBlU2FmZXR5ID09PSB1bmRlZmluZWQgfHwgbWV0YS50eXBlU2FmZXR5ID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KG1ldGEudHlwZVNhZmV0eSkgJiYgbWV0YS50eXBlU2FmZXR5LmluY2x1ZGVzKFwicGFyYW1zXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zKHBhcmFtcykgYXMgSVZhbGlkYXRpb248YW55PjtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9JTkNPUlJFQ1RcIiwgeyAuLi4odmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXSwgbWVzc2FnZTogYFRoZSB2YWx1ZSAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5wYXRofScgaXMgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0udmFsdWV9Jywgd2hpY2ggZG9lcyBub3QgbWVldCAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5leHBlY3RlZH0nIHJlcXVpcmVtZW50cy5gIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIikgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIiwgeyBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCwgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsIHBhdGg6IG9wdGlvbnMucGF0aCwgbWV0YSwgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0cy52YWx1ZSA9IGF3YWl0IG1vZHVsZS5oYW5kbGVyKG9wdGlvbnMuY29udGV4dCwgcGFyYW1zKTtcblxuICAgICAgICBsZXQgZW1wdHlSZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJlc3VsdHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRzLnZhbHVlID09PSBudWxsIHx8IHJlc3VsdHMudmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGVtcHR5UmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3VsdHMudmFsdWUgPSB7fTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMudmFsdWUpIHx8IHR5cGVvZiByZXN1bHRzLnZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aHJvdyByZWplY3QoXCJSRVFVRVNUX0ZBSUxcIiwgXCJUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiAnb2JqZWN0Jywgd2hpY2ggaXMgY3VycmVudGx5IGFuICcke3R5cGVvZiB0eXBlb2YgcmVzdWx0cy52YWx1ZX0nLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIikgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIHJlc3VsdHMsIHJlamVjdCwgcmFpc2UgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBleGVjdXRlSWQsIGhlYWRlcnMsIHBhcmFtcywgcmVzdWx0cywgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LCBtZXRhLCB0eXBlLCBlbXB0eVJlc3VsdCwgZmluYWxlcyB9O1xuICAgIH07XG5cbiAgICBjb25zdCBfX2NhbGwgPSBhc3luYyAoY29udGV4dDogJGNvbnRleHQsIG1vZHVsZTogeyBtZXRhOiBhbnksIGhhbmRsZXI6IGFueSB9LCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICBjb25zdCB7IGhhbmRsZXIgfSA9IGF3YWl0IG1vZHVsZTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIoY29udGV4dCwgcGFyYW1zKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgX19jYWxsLFxuICAgICAgICBfX2V4ZWN1dGUsXG4gICAgfTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgJGNvbnRleHQsIENvbnRleHRIdHRwLCBSZXN1bHRzLCBMb2dnZXIsICRtZXRhIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJGV2ZW50cyB7XG4gICAgXCIqXCI6IHsga2V5OiBrZXlvZiAkZXZlbnRzLCB2YWx1ZTogYW55IH07XG4gICAgXCJtaWxraW86aHR0cFJlcXVlc3RcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj4gfTtcbiAgICBcIm1pbGtpbzpodHRwUmVzcG9uc2VcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj47IGNvbnRleHQ6ICRjb250ZXh0OyBzdWNjZXNzOiBib29sZWFuIH07XG4gICAgXCJtaWxraW86aHR0cE5vdEZvdW5kXCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IGh0dHA6IENvbnRleHRIdHRwPFJlY29yZDxzdHJpbmcsIGFueT4+IH07XG4gICAgXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQgfTtcbiAgICBcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgbWV0YTogJG1ldGE7IGNvbnRleHQ6ICRjb250ZXh0OyByZXN1bHRzOiBSZXN1bHRzPGFueT4gfTtcbn1cblxuY29uc3QgUkVTT0xWRURfUFJPTUlTRSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXZlbnRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgIGNvbnN0IGluZGV4ZWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PChldmVudDogYW55KSA9PiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB8IHZvaWQgfCBib29sZWFuPj4oKTtcbiAgICBsZXQgX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICBvbjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4gfCB2b2lkIHwgYm9vbGVhbj4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIF92ZXJzaW9uKys7XG4gICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhlZC5oYXMoJyonKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlZC5zZXQoJyonLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJykhO1xuICAgICAgICAgICAgICAgIHdpbGRjYXJkU2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkU2V0ID0gaW5kZXhlZC5nZXQoJyonKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIF92ZXJzaW9uKys7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICAgICAgaWYgKCF3aWxkY2FyZFNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVtaXQ6IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBWYWx1ZSBleHRlbmRzICRldmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRIYW5kbGVycyA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICBpZiAoIXdpbGRjYXJkSGFuZGxlcnMgJiYgIWgpIHJldHVybiBSRVNPTFZFRF9QUk9NSVNFO1xuXG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycyAmJiBoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygd2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih7IGtleSwgdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCEpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgX2hhc0VtaXRIYW5kbGVyczogKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlZC5oYXMoa2V5KSB8fCBpbmRleGVkLmhhcygnKicpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgX3ZlcnNpb24oKSB7IHJldHVybiBfdmVyc2lvbjsgfSxcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkSGFuZGxlcnMgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgbGV0IGFjY2VwdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXdhaXQgaGFuZGxlcih7IGtleSwgdmFsdWUgfSkpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHZhbHVlKSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2NlcHRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkSGFuZGxlcnMgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgbGV0IGFwcHJvdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHdpbGRjYXJkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHZhbHVlKSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXBwcm92ZWQ7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBldmVudE1hbmFnZXI7XG59XG4iLAogICAgImV4cG9ydCB0eXBlIE1pbGtpb0Zsb3c8VCwgVFJldHVybiA9IGFueSwgVE5leHQgPSBhbnk+ID0ge1xuICBlbWl0OiAoZmxvdzogVCkgPT4gdm9pZDtcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gTWlsa2lvRmxvdzxUPjtcbiAgbmV4dCguLi5bdmFsdWVdOiBbXSB8IFtUTmV4dF0pOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcbiAgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xuICB0aHJvdyhlcnJvcjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvdzxUPigpOiBNaWxraW9GbG93PFQ+IHtcbiAgbGV0IHN0YXR1czogXCJwZW5kaW5nXCIgfCBcInJlc29sdmVkXCIgfCBcInJlamVjdGVkXCIgPSBcInBlbmRpbmdcIjtcbiAgY29uc3QgZmxvd3M6IEFycmF5PHtcbiAgICBibGFuazogYm9vbGVhbjtcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIH0+ID0gW107XG5cbiAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgZW1pdDogKGZsb3c6IFQpID0+IHtcbiAgICAgIGlmIChmbG93cy5hdCgtMSk/LmJsYW5rID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBmbG93cy5hdCgtMSkhO1xuICAgICAgICBpdGVtLmJsYW5rID0gZmFsc2U7XG4gICAgICAgIGl0ZW0ucmVzb2x2ZShmbG93KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGZsb3cpO1xuICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogZmFsc2UgfSBhcyBhbnkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLi4uKHtcbiAgICAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICBpZiAoc3RhdHVzICE9PSBcInBlbmRpbmdcIikgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbG93ID0gZmxvd3MuYXQoMCkhO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbG93LnByb21pc2U7XG4gICAgICAgIGZsb3dzLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICBzdGF0dXMgPSBcInJlc29sdmVkXCI7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcbiAgICAgICAgICBmbG93LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICBzdGF0dXMgPSBcInJlamVjdGVkXCI7XG4gICAgICAgIGlmIChmbG93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcbiAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogdHJ1ZSB9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xuICAgICAgICAgIGZsb3cucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgIH0sXG4gICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGl0ZXJhdG9yIGFzIE1pbGtpb0Zsb3c8VD47XG59XG4iLAogICAgImNvbnN0IEVOQ09ESU5HID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuY29uc3QgRU5DT0RJTkdfTEVOID0gRU5DT0RJTkcubGVuZ3RoO1xuXG5sZXQgX19mYXN0SWRQb29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmxldCBfX2Zhc3RJZFBvb2xJbmRleCA9IDI1NjtcbmxldCBfX2Zhc3RJZENvdW50ZXIgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gX19jcmVhdGVJZCgpOiBzdHJpbmcge1xuICAgIGlmIChfX2Zhc3RJZFBvb2xJbmRleCArIDE2ID4gMjU2KSB7XG4gICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoX19mYXN0SWRQb29sKTtcbiAgICAgICAgX19mYXN0SWRQb29sSW5kZXggPSAwO1xuICAgIH1cbiAgICAvLyDliY0gOCDlrZfnrKY6IOaXtumXtOaIsyBiYXNlMzbvvIhEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSDmm7/ku6MgQmlnSW5077yMfjEwMHgg5pu05b+r77yJXG4gICAgY29uc3QgdHMgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgLy8g5a2X56ym5Liy5ou85o6l5pu/5LujIEFycmF5LmZyb20gKyBqb2lu77yM6YG/5YWN5pWw57uE5YiG6YWNXG4gICAgbGV0IGlkID0gdHM7XG4gICAgLy8g5Lit6Ze0IDYg5a2X56ymOiDnuq/pmo/mnLpcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICBpZCArPSBFTkNPRElORy5jaGFyQXQoX19mYXN0SWRQb29sW19fZmFzdElkUG9vbEluZGV4KytdISAlIEVOQ09ESU5HX0xFTik7XG4gICAgfVxuICAgIC8vIOWQjiAxMCDlrZfnrKY6IOiuoeaVsOWZqCArIOmaj+acuua3t+WQiFxuICAgIGNvbnN0IGNvdW50ZXIgPSBfX2Zhc3RJZENvdW50ZXIrKztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgY29uc3QgbWl4ID0gKGNvdW50ZXIgKyBfX2Zhc3RJZFBvb2xbX19mYXN0SWRQb29sSW5kZXgrKyAlIDI1Nl0hKSAmIDB4RkZGRjtcbiAgICAgICAgaWQgKz0gRU5DT0RJTkcuY2hhckF0KG1peCAlIEVOQ09ESU5HX0xFTik7XG4gICAgfVxuICAgIHJldHVybiBpZDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuLi91dGlscy9jcmVhdGUtaWQudHNcIjtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZUlkR2VuZXJhdG9yID0gKGhlYWRlcnM/OiBIZWFkZXJzKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yKCkge1xuICByZXR1cm4gX19jcmVhdGVJZDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgdHlwZSAkdHlwZXMsIF9faW5pdExpc3RlbmVyLCBfX2luaXRFeGVjdXRlciwgX19pbml0RXZlbnRNYW5hZ2VyLCB0eXBlIEV4ZWN1dGVJZCwgdHlwZSBMb2dnZXIsIHR5cGUgTWl4aW4sIHR5cGUgR2VuZXJhdGVkSW5pdCwgdHlwZSBQaW5nLCB0eXBlIExvZ2dlclN1Ym1pdHRpbmdIYW5kbGVyLCB0eXBlIExvZ2dlckluc2VydGluZ0hhbmRsZXIsIHR5cGUgQ29yc0NvbmZpZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHsgZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvciB9IGZyb20gXCIuLi9leGVjdXRlL2V4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlsa2lvSW5pdCB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIGRldmVsb3A6IGJvb2xlYW47XG4gICAgZmV0Y2hFbnY/OiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhY2Nlc3NLZXk/OiBzdHJpbmc7XG4gICAgaHR0cD86IHtcbiAgICAgICAgY29ycz86IENvcnNDb25maWc7XG4gICAgfTtcbiAgICBpZ25vcmVQYXRoTGV2ZWw/OiBudW1iZXI7XG4gICAgcmVhbElwPzogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZztcbiAgICBleGVjdXRlSWQ/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICAgIG9uTG9nZ2VyU3VibWl0dGluZz86IExvZ2dlclN1Ym1pdHRpbmdIYW5kbGVyO1xuICAgIG9uTG9nZ2VySW5zZXJ0aW5nPzogTG9nZ2VySW5zZXJ0aW5nSGFuZGxlcjtcbiAgICBib290c3RyYXBzPzogQXJyYXk8KHdvcmxkOiBhbnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPjtcbn1cblxuZXhwb3J0IHR5cGUgTWlsa2lvUnVudGltZUluaXQ8VCBleHRlbmRzIE1pbGtpb0luaXQ+ID0gTWl4aW48XG4gICAgVCxcbiAgICB7XG4gICAgICAgIGV4ZWN1dGVJZDogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgICAgICAgcnVudGltZToge1xuICAgICAgICAgICAgcmVxdWVzdDogTWFwPEV4ZWN1dGVJZCwgeyBsb2dnZXI6IExvZ2dlciB9PjtcbiAgICAgICAgICAgIGNvbmZpZzogQXdhaXRlZDxSZXR1cm5UeXBlPCR0eXBlc1tcImdlbmVyYXRlZFwiXVtcImNvbmZpZ1NjaGVtYVwiXT4+O1xuICAgICAgICAgICAgYXBwOiBhbnk7XG4gICAgICAgIH07XG4gICAgICAgIG9uOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib25cIl07XG4gICAgICAgIG9mZjogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcIm9mZlwiXTtcbiAgICAgICAgZW1pdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcImVtaXRcIl07XG4gICAgICAgIGVtaXRBbnlBcHByb3ZlZDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcImVtaXRBbnlBcHByb3ZlZFwiXTtcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdEFsbEFwcHJvdmVkXCJdO1xuICAgICAgICBfaGFzRW1pdEhhbmRsZXJzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiX2hhc0VtaXRIYW5kbGVyc1wiXTtcbiAgICAgICAgX2VtaXRIYW5kbGVyc1ZlcnNpb246IG51bWJlcjtcbiAgICB9XG4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ybGQ8TWlsa2lvT3B0aW9ucyBleHRlbmRzIE1pbGtpb0luaXQ+KGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgY29uZmlnU2NoZW1hOiB7IGdldDogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+PiB9LCBvcHRpb25zOiBNaWxraW9PcHRpb25zKTogUHJvbWlzZTxNaWxraW9Xb3JsZDxHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zPj4ge1xuICAgIGNvbnN0IGV4ZWN1dGVJZCA9IG9wdGlvbnMuZXhlY3V0ZUlkID8/IGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IoKTtcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCBjb25maWdTY2hlbWEuZ2V0KCk7XG5cbiAgICBjb25zdCBydW50aW1lID0ge1xuICAgICAgICByZXF1ZXN0OiBuZXcgTWFwKCksXG4gICAgICAgIGNvbmZpZyxcbiAgICB9IGFzIE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb09wdGlvbnM+W1wicnVudGltZVwiXTtcblxuICAgIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xuXG4gICAgaWYgKG9wdGlvbnMuYWNjZXNzS2V5KSBvcHRpb25zLmlnbm9yZVBhdGhMZXZlbCA9IG9wdGlvbnMuaWdub3JlUGF0aExldmVsID8gb3B0aW9ucy5pZ25vcmVQYXRoTGV2ZWwgKyAxIDogMTtcblxuICAgIGNvbnN0IF86IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb09wdGlvbnM+ID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBleGVjdXRlSWQsXG4gICAgICAgIHJ1bnRpbWUsXG4gICAgICAgIG9uOiBldmVudE1hbmFnZXIub24sXG4gICAgICAgIG9mZjogZXZlbnRNYW5hZ2VyLm9mZixcbiAgICAgICAgZW1pdDogZXZlbnRNYW5hZ2VyLmVtaXQsXG4gICAgICAgIGVtaXRBbnlBcHByb3ZlZDogZXZlbnRNYW5hZ2VyLmVtaXRBbnlBcHByb3ZlZCxcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBldmVudE1hbmFnZXIuZW1pdEFsbEFwcHJvdmVkLFxuICAgICAgICBfaGFzRW1pdEhhbmRsZXJzOiBldmVudE1hbmFnZXIuX2hhc0VtaXRIYW5kbGVycyxcbiAgICAgICAgX2VtaXRIYW5kbGVyc1ZlcnNpb246IGV2ZW50TWFuYWdlci5fdmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgZXhlY3V0ZXIgPSBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQsIF8pO1xuICAgIGNvbnN0IGxpc3RlbmVyID0gX19pbml0TGlzdGVuZXIoZ2VuZXJhdGVkLCBfLCBleGVjdXRlcik7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBhcHBcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgICAgXyxcbiAgICAgICAgLy8gZXZlbnQgbWFuYWdlclxuICAgICAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxuICAgICAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgICAgIGVtaXQ6IGV2ZW50TWFuYWdlci5lbWl0LFxuICAgICAgICBlbWl0QW55QXBwcm92ZWQ6IGV2ZW50TWFuYWdlci5lbWl0QW55QXBwcm92ZWQsXG4gICAgICAgIGVtaXRBbGxBcHByb3ZlZDogZXZlbnRNYW5hZ2VyLmVtaXRBbGxBcHByb3ZlZCxcbiAgICAgICAgLy8gbGlzdGVuZXJcbiAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgIC8vIGZ1bmN0aW9uXG4gICAgICAgIGNvbmZpZyxcbiAgICB9O1xuXG4gICAgcnVudGltZS5hcHAgPSB3b3JsZDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuYm9vdHN0cmFwcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBib290c3RyYXAgb2Ygb3B0aW9ucy5ib290c3RyYXBzKSB7XG4gICAgICAgICAgICBhd2FpdCBib290c3RyYXAod29ybGQgYXMgTWlsa2lvV29ybGQ8R2VuZXJhdGVkSW5pdCwgTWlsa2lvT3B0aW9ucz4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZ2VuZXJhdGVkLmhhbmRsZXJTY2hlbWEubG9hZEhhbmRsZXJzKHdvcmxkKSk7XG5cbiAgICBjb25zdCByb3V0ZUtleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWQucm91dGVTY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gICAgY29uc3QgcmF3UGF0aHM6IEFycmF5PHN0cmluZz4gPSBnZW5lcmF0ZWQucmF3U2NoZW1hPy5yYXdQYXRocyA/IEFycmF5LmZyb20oZ2VuZXJhdGVkLnJhd1NjaGVtYS5yYXdQYXRocyBhcyBTZXQ8c3RyaW5nPikgOiBbXTtcbiAgICBjb25zdCBhbGxSb3V0ZXMgPSBbLi4ucm91dGVLZXlzLCAuLi5yYXdQYXRoc107XG4gICAgY29uc29sZS5sb2coYFxcbuKWsyBSb3V0ZXM6XFxuICAgICR7YWxsUm91dGVzLmpvaW4oXCJcXG4gICAgXCIpfVxcbiAgQSB0b3RhbCBvZiAke2FsbFJvdXRlcy5sZW5ndGh9IHJvdXRlcy5gKTtcbiAgICBjb25zb2xlLmxvZyhgXFxu4pazIFNlcnZlcjogaHR0cDovL2xvY2FsaG9zdDoke29wdGlvbnMucG9ydH1gKTtcblxuICAgIHJldHVybiB3b3JsZCBhcyBNaWxraW9Xb3JsZDxHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Xb3JsZDxHZW5lcmF0ZWQgZXh0ZW5kcyBHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdCA9IE1pbGtpb0luaXQ+IHtcbiAgICBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPjtcbiAgICAvLyBldmVudCBtYW5hZ2VyXG4gICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6IEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4gKCgpID0+IHZvaWQpO1xuICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgSGFuZGxlciBleHRlbmRzIChldmVudDogR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB2b2lkO1xuICAgIGVtaXQ6IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIFZhbHVlIGV4dGVuZHMgR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpID0+IFByb21pc2U8dm9pZD47XG4gICAgZW1pdEFueUFwcHJvdmVkOiA8S2V5IGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wiZXZlbnRzXCJdLCBWYWx1ZSBleHRlbmRzIEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGVtaXRBbGxBcHByb3ZlZDogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBwaW5nOiAob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KSA9PiBQcm9taXNlPFBpbmc+O1xuICAgIC8vIGxpc3RlbmVyXG4gICAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcbiAgICBjb25maWc6IFJlYWRvbmx5PEF3YWl0ZWQ8UmV0dXJuVHlwZTwkdHlwZXNbXCJjb25maWdTY2hlbWFcIl1bXCJnZXRcIl0+Pj47XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiB0eXBpYTxUeXBpYUluaXRUIGV4dGVuZHMgVHlwaWFJbml0Pihpbml0OiBUeXBpYUluaXRUKTogVHlwaWE8VHlwaWFJbml0VD4ge1xuICByZXR1cm4gaW5pdCBhcyB1bmtub3duIGFzIFR5cGlhPFR5cGlhSW5pdFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUeXBpYUluaXQgPSAoKSA9PiBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IHwgUHJvbWlzZTxSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+PjtcblxuZXhwb3J0IHR5cGUgVHlwaWE8VHlwaWFJbml0VCBleHRlbmRzIFR5cGlhSW5pdD4gPSBUeXBpYUluaXRUO1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuaW50ZXJmYWNlIENvb2tib29rRXZlbnQge1xuICB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIjtcbiAgbG9nOiBMb2c7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kQ29va2Jvb2tFdmVudChydW50aW1lOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0PiwgZXZlbnQ6IENvb2tib29rRXZlbnQpIHtcbiAgLy8gdHJ5IHtcbiAgLy8gICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7cnVudGltZS5jb29rYm9vay5jb29rYm9va1BvcnR9LyRhY3Rpb25gLCB7XG4gIC8vICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAvLyAgICAgaGVhZGVyczoge1xuICAvLyAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgLy8gICAgIH0sXG4gIC8vICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldmVudCksXG4gIC8vICAgfSk7XG4gIC8vICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAvLyAgICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gIC8vICAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xuICAvLyAgIH1cbiAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgZXJyb3IpO1xuICAvLyAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBcIklzIENvb2tib29rIGNsb3NlZD8gVGhlcmUgaXMgYW4gYWJub3JtYWxpdHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCBDb29rYm9vay5cIik7XG4gIC8vIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IHNlbmRDb29rYm9va0V2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHNcIjtcblxuZXhwb3J0IHR5cGUgTG9nID0gW1wiKGRlYnVnKVwiIHwgXCIoaW5mbylcIiB8IFwiKHdhcm4pXCIgfCBcIihlcnJvcilcIiB8IFwiKHJlcXVlc3QpXCIgfCBcIihyZXNwb25zZSlcIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgXzoge1xuICAgICAgICBsb2dzOiBBcnJheTxMb2c+O1xuICAgICAgICB0YWdzOiBNYXA8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIH07XG4gICAgc2V0VGFnOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHNldExvZzogKC4uLmxvZzogTG9nKSA9PiB2b2lkO1xuICAgIGRlYnVnOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIGluZm86IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gICAgd2FybjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICBlcnJvcjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICByZXF1ZXN0OiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIHJlc3BvbnNlOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xufVxuXG5leHBvcnQgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyID0gKGxvZzogTG9nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlciA9IChjb250ZXh0OiAkY29udGV4dCwgbG9nczogQXJyYXk8TG9nPiwgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5mdW5jdGlvbiBmYXN0VGltZXN0YW1wKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGAoJHtkLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKX0tJHtTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKX0gJHtTdHJpbmcoZC5nZXRIb3VycygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0U2Vjb25kcygpKS5wYWRTdGFydCgyLCBcIjBcIil9KWA7XG59XG5cbi8vIFByZS1jcmVhdGVkIGRlZmF1bHQgaW5zZXJ0aW5nIGhhbmRsZXIgLSBzaGFyZWQgYWNyb3NzIGFsbCBsb2dnZXJzXG5jb25zdCBkZWZhdWx0SW5zZXJ0aW5nID0gKGxvZzogTG9nKTogYm9vbGVhbiA9PiB7XG4gICAgbG9nWzBdID0gYFxcbiR7bG9nWzBdfWAgYXMgYW55O1xuICAgIGNvbnNvbGUubG9nKC4uLmxvZyk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyPE1pbGtpb1J1bnRpbWUgZXh0ZW5kcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4gPSBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4ocnVudGltZTogTWlsa2lvUnVudGltZSwgcGF0aDogc3RyaW5nLCBleGVjdXRlSWQ6IHN0cmluZyk6IExvZ2dlciB7XG4gICAgY29uc3QgbG9nZ2VyID0ge30gYXMgTG9nZ2VyO1xuXG4gICAgY29uc3QgbG9nczogQXJyYXk8TG9nPiA9IFtdO1xuICAgIGNvbnN0IHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZyB8fCBkZWZhdWx0SW5zZXJ0aW5nO1xuICAgIGNvbnN0IGhhc1N1Ym1pdHRpbmcgPSAhIXJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nO1xuICAgIGNvbnN0IGlzRGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcblxuICAgIGxvZ2dlci5fID0ge1xuICAgICAgICBsb2dzLFxuICAgICAgICB0YWdzLFxuICAgICAgICBzdWJtaXQ6IChjb250ZXh0OiAkY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZykgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nKGNvbnRleHQsIGxvZ3MsIHRhZ3MpO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBfX3RhZ1B1c2ggPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICAgIHRhZ3Muc2V0KGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgY29uc3QgX19sb2dQdXNoID0gKGxvZzogTG9nKTogTG9nID0+IHtcbiAgICAgICAgaWYgKCFpbnNlcnRpbmcobG9nKSkgcmV0dXJuIGxvZztcbiAgICAgICAgaWYgKGhhc1N1Ym1pdHRpbmcpIGxvZ3MucHVzaChbLi4ubG9nXSk7XG4gICAgICAgIGlmIChpc0RldmVsb3ApIHZvaWQgc2VuZENvb2tib29rRXZlbnQocnVudGltZSwgeyB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIiwgbG9nIH0pO1xuICAgICAgICByZXR1cm4gbG9nO1xuICAgIH07XG5cbiAgICBsb2dnZXIuc2V0VGFnID0gX190YWdQdXNoO1xuICAgIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xuXG4gICAgY29uc3QgZ2V0Tm93ID0gZmFzdFRpbWVzdGFtcDtcblxuICAgIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGRlYnVnKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgICBsb2dnZXIuaW5mbyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGluZm8pXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci53YXJuID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIod2FybilcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoZXJyb3IpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci5yZXF1ZXN0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVxdWVzdClcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLnJlc3BvbnNlID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVzcG9uc2UpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuXG4gICAgcmV0dXJuIGxvZ2dlcjtcbn1cbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XG4gIHN0ZXA6IFN0ZXBGdW5jdGlvbjxTdGFnZVQ+O1xuICBydW46ICgpID0+IFByb21pc2U8UmVtb3ZlXzxTdGFnZVQ+Pjtcbn1cblxudHlwZSBSZW1vdmVfPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xufTtcblxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFN0YWdlVCBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+ID0gPEhhbmRsZXJUIGV4dGVuZHMgKHN0YWdlOiBSZWFkb25seTxTdGFnZVQ+KSA9PiBSZWNvcmQ8YW55LCBhbnk+IHwgUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+Pj4oaGFuZGxlcjogSGFuZGxlclQpID0+IFN0ZXBzPEF3YWl0ZWQ8U3RhZ2VUPiAmIFRvRW1wdHlPYmplY3Q8QXdhaXRlZDxSZXR1cm5UeXBlPEhhbmRsZXJUPj4+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0ZXAoKTogU3RlcHM8e30+IHtcbiAgY29uc3Qgc3RlcENvbnRyb2xsZXIgPSB7XG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxuICAgIF9zdGVwczogW10gYXMgQXJyYXk8KHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pj4sXG4gICAgc3RlcChoYW5kbGVyOiAoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcbiAgICAgIHJldHVybiBzdGVwQ29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgIGxldCBzdGFnZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBDb250cm9sbGVyLl9zdGVwcykge1xuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoc3RhZ2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwiX1wiKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN0ZXBDb250cm9sbGVyIGFzIGFueSBhcyBTdGVwczx7fT47XG59XG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcbiAgICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xuICAgIHByaXZhdGUgY2FjaGU6IE1hcDxzdHJpbmcsIFQgfCBudWxsPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBuZXcgVHJpZU5vZGUoKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBhZGQocGF0aDogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5jYWNoZS5nZXQocGF0aCk7XG4gICAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGN1cnJlbnROb2RlLnZhbHVlO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEJ5UGFydHMocGFydHM6IHN0cmluZ1tdKTogVCB8IG51bGwge1xuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZS5jaGlsZHJlbi5oYXMocGFydCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBoYXMocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChwYXRoKSAhPT0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIFRyaWVOb2RlPFQ+IHtcbiAgICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xuICAgIHZhbHVlOiBUIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29yc0NvbmZpZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb3JzSGVhZGVycyhjb3JzOiBDb3JzQ29uZmlnIHwgdW5kZWZpbmVkLCBvcmlnaW4/OiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd01ldGhvZHMpIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIl0gPSBjb3JzLmNvcnNBbGxvd01ldGhvZHMuam9pbihcIiwgXCIpO1xuICAgIGlmIChjb3JzPy5jb3JzQWxsb3dIZWFkZXJzKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCJdID0gY29ycy5jb3JzQWxsb3dIZWFkZXJzLmpvaW4oXCIsIFwiKTtcbiAgICBpZiAoY29ycz8uY29yc01heEFnZSAhPT0gdW5kZWZpbmVkKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlXCJdID0gU3RyaW5nKGNvcnMuY29yc01heEFnZSk7XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd09yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGlzV2lsZGNhcmQgPSBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhcIipcIik7XG4gICAgICAgIGlmIChjb3JzLmNvcnNBbGxvd0NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGNyZWRlbnRpYWxzOiB0cnVlLCB0aGUgc3BlYyBmb3JiaWRzIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKi5cbiAgICAgICAgICAgIC8vIEVjaG8gdGhlIHJlcXVlc3Qgb3JpZ2luIGluc3RlYWQgKHdpbGRjYXJkIG1lYW5zIFwiYWxsb3cgYW55IG9yaWdpblwiKS5cbiAgICAgICAgICAgIGlmIChvcmlnaW4gJiYgKGlzV2lsZGNhcmQgfHwgY29ycy5jb3JzQWxsb3dPcmlnaW4uaW5jbHVkZXMob3JpZ2luKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIl0gPSBvcmlnaW47XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiVmFyeVwiXSA9IFwiT3JpZ2luXCI7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIl0gPSBcInRydWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1dpbGRjYXJkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gXCIqXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhvcmlnaW4pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gb3JpZ2luO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtcIlZhcnlcIl0gPSBcIk9yaWdpblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb3JzPy5jb3JzRXhwb3NlSGVhZGVycyAmJiBjb3JzLmNvcnNFeHBvc2VIZWFkZXJzLmxlbmd0aCA+IDApIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzXCJdID0gY29ycy5jb3JzRXhwb3NlSGVhZGVycy5qb2luKFwiLCBcIik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0iLAogICAgImltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXhjZXB0aW9uSGFuZGxlciwgcmVqZWN0LCByYWlzZSB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHR5cGUgeyBNaXhpbiwgR2VuZXJhdGVkSW5pdCwgJHR5cGVzLCBDb250ZXh0SHR0cCwgTWlsa2lvUmVzcG9uc2VSZWplY3QsIFJlc3VsdHMsIE1pbGtpb1Jlc3BvbnNlU3VjY2VzcywgQ29yc0NvbmZpZywgTG9nZ2VyLCBMb2cgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgX19pbml0RXhlY3V0ZXIgfSBmcm9tIFwiLi4vZXhlY3V0ZS9pbmRleC50c1wiO1xuaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuLi91dGlscy9jcmVhdGUtaWQudHNcIjtcbmltcG9ydCB7IFRyaWUgfSBmcm9tIFwiLi4vdXRpbHMvdHJpZS50c1wiO1xuaW1wb3J0IHsgYnVpbGRDb3JzSGVhZGVycyB9IGZyb20gXCIuLi91dGlscy9idWlsZC1jb3JzLWhlYWRlcnMudHNcIjtcbmltcG9ydCB7IHJldml2ZUpTT05QYXJzZSB9IGZyb20gXCIuLi91dGlscy9yZXZpdmUtanNvbi1wYXJzZS50c1wiO1xuXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb0h0dHBSZXNwb25zZSA9IE1peGluPFxuICAgIFJlc3BvbnNlSW5pdCxcbiAgICB7XG4gICAgICAgIGJvZHk6IHN0cmluZyB8IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgVWludDhBcnJheSB8IEFycmF5QnVmZmVyIHwgQmxvYiB8IG51bGw7XG4gICAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIH1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSwgZXhlY3V0ZXI6IFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV4ZWN1dGVyPikge1xuICAgIGNvbnN0IHBvcnQgPSBydW50aW1lLnBvcnQ7XG4gICAgY29uc3QgdHJpZSA9IG5ldyBUcmllPGFueT4oKTtcbiAgICAvLyBQcmUtY29tcHV0ZSBkZWZhdWx0IENPUlMgY29uZmlnIGFuZCBjYWNoZSBoZWFkZXJzIHBlciBvcmlnaW5cbiAgICBjb25zdCBjb3JzOiBDb3JzQ29uZmlnID0geyBjb3JzQWxsb3dNZXRob2RzOiBbXCJQT1NUXCIsIFwiT1BUSU9OU1wiXSwgY29yc0FsbG93SGVhZGVyczogW1wiQ29udGVudC1UeXBlXCIsIFwiQXV0aG9yaXphdGlvblwiXSwgY29yc01heEFnZTogMCwgLi4ucnVudGltZS5odHRwPy5jb3JzIH07XG4gICAgY29uc3QgY29yc0hlYWRlcnNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIGNvbnN0IGdldENvcnNIZWFkZXJzID0gKG9yaWdpbjogc3RyaW5nIHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBvcmlnaW4gPz8gXCJcIjtcbiAgICAgICAgbGV0IGNhY2hlZCA9IGNvcnNIZWFkZXJzQ2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgY2FjaGVkID0gYnVpbGRDb3JzSGVhZGVycyhjb3JzLCBvcmlnaW4pO1xuICAgICAgICBjb3JzSGVhZGVyc0NhY2hlLnNldChrZXksIGNhY2hlZCk7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfTtcbiAgICAvLyBQcmUtY29tcHV0ZSBkZWZhdWx0IHJlc3BvbnNlIGhlYWRlcnMgKHdpdGhvdXQgb3JpZ2luLXNwZWNpZmljIENPUlMpXG4gICAgY29uc3QgZGVmYXVsdFJlc3BvbnNlSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIixcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgfTtcbiAgICAvLyBQcmUtY29tcHV0ZSBtZXJnZWQgaGVhZGVycyBmb3IgbnVsbCBvcmlnaW4gKG1vc3QgY29tbW9uIGNhc2UpXG4gICAgY29uc3QgZGVmYXVsdE1lcmdlZEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IC4uLmdldENvcnNIZWFkZXJzKG51bGwpLCAuLi5kZWZhdWx0UmVzcG9uc2VIZWFkZXJzIH07XG5cbiAgICAvLyBQcmUtYWxsb2NhdGUgcmVzcG9uc2UgdGVtcGxhdGUgcGFydHMgZm9yIEZhc3QgUGF0aFxuICAgIGNvbnN0IGVtcHR5UmVzdWx0UHJlZml4ID0gJ3tcImRhdGFcIjp7fSxcImV4ZWN1dGVJZFwiOlwiJztcbiAgICBjb25zdCByZXN1bHRQcmVmaXggPSAne1wiZGF0YVwiOic7XG4gICAgY29uc3QgaWRTdWZmaXggPSAnXCIsXCJzdWNjZXNzXCI6dHJ1ZX0nO1xuICAgIC8vIFNoYXJlZCByZXNwb25zZSBvYmplY3QgZm9yIEZhc3QgUGF0aCAoaGFuZGxlciByZXR1cm5zIHJlc3VsdCBkaXJlY3RseSwgbmV2ZXIgbW9kaWZpZXMgcmVzcG9uc2UpXG4gICAgY29uc3QgZmFzdFBhdGhSZXNwb25zZSA9IHsgYm9keTogXCJcIiwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGRlZmF1bHRNZXJnZWRIZWFkZXJzIH07XG5cbiAgICAvLyBEeW5hbWljIGNoZWNrIGZvciBldmVudCBoYW5kbGVycyB3aXRoIHZlcnNpb24tYmFzZWQgY2FjaGluZ1xuICAgIGxldCBjYWNoZWROb0VtaXRIYW5kbGVycyA9IHRydWU7XG4gICAgbGV0IGxhc3RFbWl0SGFuZGxlcnNWZXJzaW9uID0gLTE7XG4gICAgY29uc3QgY2hlY2tOb0VtaXRIYW5kbGVycyA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgdiA9IHJ1bnRpbWUuX2VtaXRIYW5kbGVyc1ZlcnNpb247XG4gICAgICAgIGlmICh2ICE9PSBsYXN0RW1pdEhhbmRsZXJzVmVyc2lvbikge1xuICAgICAgICAgICAgbGFzdEVtaXRIYW5kbGVyc1ZlcnNpb24gPSB2O1xuICAgICAgICAgICAgY2FjaGVkTm9FbWl0SGFuZGxlcnMgPVxuICAgICAgICAgICAgICAgICFydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiKSAmJlxuICAgICAgICAgICAgICAgICFydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwUmVxdWVzdFwiKSAmJlxuICAgICAgICAgICAgICAgICFydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwUmVzcG9uc2VcIikgJiZcbiAgICAgICAgICAgICAgICAhcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86aHR0cE5vdEZvdW5kXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWROb0VtaXRIYW5kbGVycztcbiAgICB9O1xuICAgIGNvbnN0IGhhc09uTG9nZ2VyU3VibWl0dGluZyA9ICEhcnVudGltZS5vbkxvZ2dlclN1Ym1pdHRpbmc7XG5cbiAgICAvLyBTaGFyZWQgbm8tb3AgbG9nZ2VyIGZvciBmYXN0IHBhdGggKHVzZWQgd2hlbiBubyBldmVudCBoYW5kbGVycylcbiAgICBjb25zdCBub29wTG9nZ2VyOiBMb2dnZXIgPSB7XG4gICAgICAgIF86IHsgbG9nczogW10gYXMgYW55LCB0YWdzOiBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKSwgc3VibWl0OiAoKSA9PiB7IH0gfSxcbiAgICAgICAgc2V0VGFnOiAoKSA9PiB7IH0sXG4gICAgICAgIHNldExvZzogKC4uLl9sb2c6IExvZykgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIGRlYnVnOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgaW5mbzogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIHdhcm46IChfZGVzY3JpcHRpb246IHN0cmluZywgLi4uX3BhcmFtczogQXJyYXk8dW5rbm93bj4pID0+ICh7fSBhcyBMb2cpLFxuICAgICAgICBlcnJvcjogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIHJlcXVlc3Q6IChfZGVzY3JpcHRpb246IHN0cmluZywgLi4uX3BhcmFtczogQXJyYXk8dW5rbm93bj4pID0+ICh7fSBhcyBMb2cpLFxuICAgICAgICByZXNwb25zZTogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgfTtcblxuICAgIC8vIFByZS1jcmVhdGUgYmFzZSBjb250ZXh0IHByb3RvdHlwZSBmb3IgRmFzdCBQYXRoIChzaGFyZWQgaW1tdXRhYmxlIHByb3BlcnRpZXMpXG4gICAgLy8gYGNhbGxgIGlzIGRlZmluZWQgb24gcHJvdG90eXBlIHRvIGF2b2lkIGNyZWF0aW5nIGEgY2xvc3VyZSBwZXIgcmVxdWVzdFxuICAgIGNvbnN0IGJhc2VDb250ZXh0UHJvdG86IGFueSA9IHtcbiAgICAgICAgcmVqZWN0LFxuICAgICAgICBkZXZlbG9wOiBydW50aW1lLmRldmVsb3AsXG4gICAgICAgIGxvZ2dlcjogbm9vcExvZ2dlcixcbiAgICAgICAgZW1pdDogcnVudGltZS5lbWl0LFxuICAgICAgICBlbWl0QW55QXBwcm92ZWQ6IHJ1bnRpbWUuZW1pdEFueUFwcHJvdmVkLFxuICAgICAgICBlbWl0QWxsQXBwcm92ZWQ6IHJ1bnRpbWUuZW1pdEFsbEFwcHJvdmVkLFxuICAgICAgICBjb25maWc6IHJ1bnRpbWUucnVudGltZS5jb25maWcsXG4gICAgICAgIHR5cGlhOiBnZW5lcmF0ZWQudHlwaWFTY2hlbWEsXG4gICAgICAgIG9uRmluYWxseTogKCkgPT4geyB9LFxuICAgICAgICBfOiBydW50aW1lLFxuICAgICAgICBjYWxsKG1vZHVsZTogYW55LCBwOiBhbnkpIHsgcmV0dXJuIGV4ZWN1dGVyLl9fY2FsbCh0aGlzLCBtb2R1bGUsIHApOyB9LFxuICAgIH07XG5cbiAgICAvLyBIb3QgcGF0aCBjYWNoZTogcHJlLXJlc29sdmUgdGhlIG1vc3QgY29tbW9uIHJvdXRlXG4gICAgbGV0IGNhY2hlZFJvdXRlU2NoZW1hOiBhbnkgPSBudWxsO1xuICAgIGxldCBjYWNoZWRQYXRoU3RyaW5nOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAvLyBDYWNoZSB2YWxpZGF0ZVBhcmFtcyBhbmQgaGFuZGxlciByZWZlcmVuY2VzIHRvIGF2b2lkIHByb3BlcnR5IGxvb2t1cHNcbiAgICBsZXQgY2FjaGVkVmFsaWRhdGVQYXJhbXM6IGFueSA9IG51bGw7XG4gICAgbGV0IGNhY2hlZEhhbmRsZXI6IGFueSA9IG51bGw7XG4gICAgbGV0IGNhY2hlZFNraXBWYWxpZGF0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdCBmZXRjaCA9IGFzeW5jIChvcHRpb25zOiB7XG4gICAgICAgIHJlcXVlc3Q6IE1pbGtpb0h0dHBSZXF1ZXN0O1xuICAgICAgICBlbnZNb2RlPzogc3RyaW5nO1xuICAgICAgICBlbnY/OiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgICAgICByb3V0ZVNjaGVtYT86IGFueTtcbiAgICAgICAgcmF3UmVzcG9uc2U/OiBib29sZWFuO1xuICAgIH0pOiBQcm9taXNlPFJlc3BvbnNlPiA9PiB7XG4gICAgICAgIC8vIFVzZSBwcmUtcGFzc2VkIG9yaWdpbiBmcm9tIGFkYXB0ZXIgdG8gYXZvaWQgaGVhZGVycy5nZXQoKSBjYWxsXG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX29yaWdpbiA/PyBvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5nZXQoXCJPcmlnaW5cIik7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVxdWVzdC5tZXRob2QgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGdldENvcnNIZWFkZXJzKG9yaWdpbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBwcmUtcGFyc2VkIHBhdGhuYW1lIGFuZCBwYXRoQXJyYXkgaWYgYXZhaWxhYmxlIChmcm9tIGFkYXB0ZXIpLCBvdGhlcndpc2UgcGFyc2VcbiAgICAgICAgY29uc3QgcGF0aG5hbWUgPSAob3B0aW9ucy5yZXF1ZXN0IGFzIGFueSkuX19wYXRobmFtZSA/PyBuZXcgVVJMKG9wdGlvbnMucmVxdWVzdC51cmwpLnBhdGhuYW1lO1xuICAgICAgICBpZiAocGF0aG5hbWUuZW5kc1dpdGgoXCIvZ2VuZXJhdGVfMjA0XCIpKSB7XG4gICAgICAgICAgICBjb25zdCBjb3JzSGVhZGVycyA9IGdldENvcnNIZWFkZXJzKG9yaWdpbik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IDIwNCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIFNlcnZlcjogXCJtaWxraW9cIixcbiAgICAgICAgICAgICAgICAgICAgLi4uY29yc0hlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IGB0ZXh0L3BsYWluOyB0aW1lPSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZVBhdGhBcnJheSA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX3BhdGhBcnJheTtcbiAgICAgICAgbGV0IHBhdGhTdHJpbmc6IHN0cmluZztcbiAgICAgICAgbGV0IHBhdGhBcnJheTogc3RyaW5nW107XG4gICAgICAgIGlmICghcnVudGltZS5hY2Nlc3NLZXkgJiYgKCFydW50aW1lLmlnbm9yZVBhdGhMZXZlbCB8fCBydW50aW1lLmlnbm9yZVBhdGhMZXZlbCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSBwYXRobmFtZTtcbiAgICAgICAgICAgIHBhdGhBcnJheSA9IHByZVBhdGhBcnJheSA/PyBwYXRobmFtZS5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aEFycmF5ID0gcHJlUGF0aEFycmF5ID8/IHBhdGhuYW1lLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICBpZiAocnVudGltZS5hY2Nlc3NLZXkgJiYgcGF0aEFycmF5LmF0KDApICE9PSBydW50aW1lLmFjY2Vzc0tleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogXCJcIiwgc3RhdHVzOiA0MDMsIGhlYWRlcnM6IGNvcnNIZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogNDAzLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBjb3JzSGVhZGVycyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydW50aW1lLmlnbm9yZVBhdGhMZXZlbCAhPT0gdW5kZWZpbmVkICYmIHJ1bnRpbWUuaWdub3JlUGF0aExldmVsICE9PSAwKSBwYXRoQXJyYXkgPSBwYXRoQXJyYXkuc2xpY2UocnVudGltZS5pZ25vcmVQYXRoTGV2ZWwpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IGAvJHtwYXRoQXJyYXkuam9pbihcIi9cIil9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZS1yZWFkIGJvZHkgdGV4dCBpZiBhdmFpbGFibGUgKGZyb20gYWRhcHRlciksIG90aGVyd2lzZSB1c2UgYXN5bmMgcmVxdWVzdC50ZXh0KClcbiAgICAgICAgY29uc3QgYm9keVRleHQgPSAob3B0aW9ucy5yZXF1ZXN0IGFzIGFueSkuX19ib2R5VGV4dDtcbiAgICAgICAgY29uc3QgaXAgPSBydW50aW1lLnJlYWxJcCA/IHJ1bnRpbWUucmVhbElwKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IFwiOjoxXCI7XG5cbiAgICAgICAgLy8g5rWL6K+V546v5aKD5LiL55qEICRldmVudCDnq6/ngrnvvJrpgJrov4cgYmFzZTY0IOe8lueggeeahOS6i+S7tuWQjeinpuWPkeS6i+S7tlxuICAgICAgICBpZiAob3B0aW9ucy5lbnZNb2RlID09PSBcInRlc3RcIiAmJiBwYXRoU3RyaW5nLnN0YXJ0c1dpdGgoXCIvJGV2ZW50L1wiKSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0TmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoU3RyaW5nLnNsaWNlKDgpKTtcbiAgICAgICAgICAgIGxldCBldmVudE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8g5YW85a655LiN5ZCM6L+Q6KGM5pe277ya5LyY5YWI5L2/55SoIGF0b2LvvIzlm57pgIDliLAgQnVmZmVyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdG9iICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IGF0b2IoYmFzZTY0TmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IEJ1ZmZlci5mcm9tKGJhc2U2NE5hbWUsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYmFzZTY0IGRlY29kZXIgYXZhaWxhYmxlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHJlamVjdDogeyBleHBlY3RlZDogXCJ2YWxpZCBiYXNlNjQgZXZlbnQgbmFtZVwiIH0gfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHksIHN0YXR1czogMjAwLCBoZWFkZXJzOiB7IC4uLmNvcnNIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IH0gYXMgYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVyczogeyAuLi5jb3JzSGVhZGVycywgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGV2ZW50RGF0YTogYW55ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmF3Qm9keSA9IGJvZHlUZXh0ICE9PSB1bmRlZmluZWQgPyBib2R5VGV4dCA6IGF3YWl0IG9wdGlvbnMucmVxdWVzdC50ZXh0KCk7XG4gICAgICAgICAgICBpZiAocmF3Qm9keSAmJiByYXdCb2R5ICE9PSBcIlwiICYmIHJhd0JvZHkgIT09IFwie31cIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YSA9IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHJhd0JvZHkpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHJlamVjdDogeyBleHBlY3RlZDogXCJqc29uXCIgfSB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHksIHN0YXR1czogMjAwLCBoZWFkZXJzOiB7IC4uLmNvcnNIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IH0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHsgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IHsgLi4uY29yc0hlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBleGVjdXRlSWQgPSBfX2NyZWF0ZUlkKCk7XG4gICAgICAgICAgICBjb25zdCBjb3JzSGVhZGVycyA9IGdldENvcnNIZWFkZXJzKG9yaWdpbik7XG4gICAgICAgICAgICBjb25zdCBqc29uSGVhZGVycyA9IHsgLi4uY29yc0hlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLCBcIkNhY2hlLUNvbnRyb2xcIjogXCJuby1zdG9yZVwiIH07XG5cbiAgICAgICAgICAgIC8vIOiHquWKqOazqOWFpSBjb250ZXh0IOKAlCBldmVudCDmlbDmja7kuK3nuqblrprkv5fmiJDnmoQgY29udGV4dCDlj4LmlbDml6Dms5XnlLHlpJbpg6jkvKDlj4LvvIznlLHmnI3liqHnq6/ooaXlhajjgIJcbiAgICAgICAgICAgIC8vIOS4jiBhY3Rpb24g5omn6KGM5L+d5oyB5LiA6Ie077ya5p6E5bu65a6M5pW055qEIGNvbnRleHTvvIhsb2dnZXIvY29uZmlnL3R5cGlhL2NhbGwg562J77yJ77yM5bm26Kem5Y+RXG4gICAgICAgICAgICAvLyBtaWxraW86ZXhlY3V0ZUJlZm9yZSAvIG1pbGtpbzpodHRwUmVzcG9uc2Ug5LqL5Lu277yM5L2/IGJvb3RzdHJhcCDlj6/ku6Xms6jlhaUgZGIvcmVkaXMg562J6IO95Yqb44CCXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIHR5cGVvZiBldmVudERhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZXZlbnREYXRhKSAmJiAhKFwiY29udGV4dFwiIGluIGV2ZW50RGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0OiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnJhaXNlID0gcmFpc2U7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kZXZlbG9wID0gcnVudGltZS5kZXZlbG9wO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZXhlY3V0ZUlkID0gZXhlY3V0ZUlkO1xuICAgICAgICAgICAgICAgIGNvbnRleHQucGF0aCA9IHBhdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0ID0gcnVudGltZS5lbWl0O1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdEFueUFwcHJvdmVkID0gcnVudGltZS5lbWl0QW55QXBwcm92ZWQ7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0QWxsQXBwcm92ZWQgPSBydW50aW1lLmVtaXRBbGxBcHByb3ZlZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0Ll8gPSBydW50aW1lO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY29uZmlnID0gcnVudGltZS5ydW50aW1lLmNvbmZpZztcbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGlhID0gZ2VuZXJhdGVkLnR5cGlhU2NoZW1hO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY2FsbCA9IChtb2R1bGU6IGFueSwgcGFyYW1zOiBhbnkpID0+IGV4ZWN1dGVyLl9fY2FsbChjb250ZXh0LCBtb2R1bGUsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5vbkZpbmFsbHkgPSAoKSA9PiB7fTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIocnVudGltZSwgcGF0aFN0cmluZywgZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlciA9IGxvZ2dlcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0Lmh0dHAgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgc3RyaW5nOiByYXdCb2R5ID8/IFwiXCIsIHBhcnNlZDogZXZlbnREYXRhIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IG9wdGlvbnMucmVxdWVzdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5jb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVtaXRIdHRwUmVzcG9uc2UgPSAoc3VjY2VzczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86aHR0cFJlc3BvbnNlXCIpID8/IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IHBhdGhTdHJpbmcsIGh0dHA6IGNvbnRleHQuaHR0cCwgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQsIHN1Y2Nlc3MsIHJlamVjdCwgcmFpc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5YWI6Kem5Y+RIGV4ZWN1dGVCZWZvcmXvvIhib290c3RyYXAg5rOo5YWlIGRiL3JlZGlz77yJ77yM5LqL5Lu25aSE55CG5a6M5oiQ5ZCO5YaN6Kem5Y+RXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBSZXNwb25zZe+8iOmHiuaUvui/nuaOpe+8ie+8jOS4jiBhY3Rpb24g55qE55Sf5ZG95ZGo5pyf5L+d5oyB5LiA6Ie044CCXG4gICAgICAgICAgICAgICAgICAgIGlmIChydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIpID8/IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IHBhdGhTdHJpbmcsIG1ldGE6IHt9LCBjb250ZXh0LCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChldmVudE5hbWUsIGV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZW1pdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyclJlc3VsdCA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVtaXRFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyckJvZHkgPSBKU09OLnN0cmluZ2lmeShlcnJSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEh0dHBSZXNwb25zZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IGVyckJvZHksIHN0YXR1czogMjAwLCBoZWFkZXJzOiBqc29uSGVhZGVycyB9IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShlcnJCb2R5LCB7IHN0YXR1czogMjAwLCBoZWFkZXJzOiBqc29uSGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SHR0cFJlc3BvbnNlKHRydWUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KGV2ZW50TmFtZSwgZXZlbnREYXRhKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlbWl0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyUmVzdWx0ID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIG5vb3BMb2dnZXIsIGVtaXRFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyckJvZHkgPSBKU09OLnN0cmluZ2lmeShlcnJSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogZXJyQm9keSwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGpzb25IZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGVyckJvZHksIHsgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGpzb25IZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYm9keSA9IGB7XCJkYXRhXCI6JHtKU09OLnN0cmluZ2lmeShldmVudERhdGEgPz8ge30sIChrZXksIHZhbHVlKSA9PiBrZXkgPT09IFwiY29udGV4dFwiID8gdW5kZWZpbmVkIDogdmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHksIHN0YXR1czogMjAwLCBoZWFkZXJzOiBqc29uSGVhZGVycyB9IGFzIGFueTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVyczoganNvbkhlYWRlcnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PSBGQVNUIFBBVEggZm9yIGNvbW1vbiBhY3Rpb24gcmVxdWVzdHMgPT09PT1cbiAgICAgICAgLy8gU2tpcCBsb2dnZXIsIHJlcXVlc3QgbWFwLCBhbmQgbW9zdCBvYmplY3QgY3JlYXRpb24gd2hlbjpcbiAgICAgICAgLy8gLSByYXdSZXNwb25zZSBtb2RlIChhZGFwdGVyKVxuICAgICAgICAvLyAtIE5vIG9yaWdpbiBoZWFkZXIgKG5vIENPUlMgbmVlZGVkKVxuICAgICAgICAvLyAtIE5vIGV2ZW50IGhhbmRsZXJzIHJlZ2lzdGVyZWQgKGR5bmFtaWMgY2hlY2spXG4gICAgICAgIC8vIC0gTm90IGEgc3RyZWFtIHJlcXVlc3RcbiAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UgJiYgIW9yaWdpbiAmJiBjaGVja05vRW1pdEhhbmRsZXJzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IF9faXNBY3Rpb24gPSAob3B0aW9ucy5yZXF1ZXN0IGFzIGFueSkuX19pc0FjdGlvbjtcbiAgICAgICAgICAgIGlmIChfX2lzQWN0aW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgcm91dGUgc2NoZW1hIHdpdGggaG90IGNhY2hlXG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoU3RyaW5nID09PSBjYWNoZWRQYXRoU3RyaW5nICYmIGNhY2hlZFJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGNhY2hlZFJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSB0cmllLmdldChwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFJvdXRlU2NoZW1hID0gcm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUGF0aFN0cmluZyA9IHBhdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gZ2VuZXJhdGVkLnJvdXRlU2NoZW1hPy5bcGF0aFN0cmluZ107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNDA0IC0gZmFsbCB0aHJvdWdoIHRvIHNsb3cgcGF0aCBmb3IgcHJvcGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChwYXRoU3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFJvdXRlU2NoZW1hID0gcm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFBhdGhTdHJpbmcgPSBwYXRoU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSAmJiByb3V0ZVNjaGVtYS50eXBlID09PSBcImFjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjYWNoZWQgZnVuY3Rpb24gcmVmZXJlbmNlcyB3aGVuIGhpdHRpbmcgdGhlIHNhbWUgcm91dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRlUGFyYW1zID0gY2FjaGVkVmFsaWRhdGVQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBoYW5kbGVyID0gY2FjaGVkSGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNraXBWYWxpZGF0aW9uID0gY2FjaGVkU2tpcFZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSAhPT0gY2FjaGVkUm91dGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1zID0gcm91dGVTY2hlbWEudmFsaWRhdGVQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gcm91dGVTY2hlbWEubW9kdWxlLmhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gcm91dGVTY2hlbWEubW9kdWxlPy5tZXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFZhbGlkYXRpb24gPSBtZXRhPy50eXBlU2FmZXR5ID09PSBmYWxzZSB8fCAoQXJyYXkuaXNBcnJheShtZXRhPy50eXBlU2FmZXR5KSAmJiAhbWV0YS50eXBlU2FmZXR5LmluY2x1ZGVzKFwicGFyYW1zXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFZhbGlkYXRlUGFyYW1zID0gdmFsaWRhdGVQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFNraXBWYWxpZGF0aW9uID0gc2tpcFZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlSWQgPSBfX2NyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5VGV4dCAhPT0gdW5kZWZpbmVkID8gYm9keVRleHQgOiBhd2FpdCBvcHRpb25zLnJlcXVlc3QudGV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXNPayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYm9keSB8fCBib2R5ID09PSBcIlwiIHx8IGJvZHkgPT09IFwie31cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0ge307XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNPayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc09rICYmIHBhcmFtcyAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgJG1pbGtpb0dlbmVyYXRlUGFyYW1zIGluIHRlc3QgbW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW52TW9kZSA9PT0gXCJ0ZXN0XCIgfHwgIShcIiRtaWxraW9HZW5lcmF0ZVBhcmFtc1wiIGluIHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBwYXJhbXMgd2hlbiB0eXBlU2FmZXR5IGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRpb24uc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvbiBmYWlsZWQgLSBmYWxsIHRocm91Z2ggdG8gc2xvdyBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNPayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc09rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIG1pbmltYWwgY29udGV4dCB1c2luZyBwcm90b3R5cGUgZm9yIHNoYXJlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQ6IGFueSA9IE9iamVjdC5jcmVhdGUoYmFzZUNvbnRleHRQcm90byk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucGF0aCA9IHBhdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucm91dGVUeXBlID0gXCJhY3Rpb25cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5leGVjdXRlSWQgPSBleGVjdXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcGF0aG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHsgc3RyaW5nOiBwYXRoU3RyaW5nLCBhcnJheTogcGF0aEFycmF5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgc3RyaW5nOiBib2R5LCBwYXJzZWQ6IHBhcmFtcyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGZhc3RQYXRoUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBvcHRpb25zLnJlcXVlc3QuaGVhZGVycztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihjb250ZXh0LCBwYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IGVtcHR5UmVzdWx0UHJlZml4ICsgZXhlY3V0ZUlkICsgaWRTdWZmaXgsIHN0YXR1czogMjAwLCBoZWFkZXJzOiBkZWZhdWx0TWVyZ2VkSGVhZGVycyB9IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogcmVzdWx0UHJlZml4ICsgSlNPTi5zdHJpbmdpZnkocmVzdWx0KSArICcsXCJleGVjdXRlSWRcIjpcIicgKyBleGVjdXRlSWQgKyBpZFN1ZmZpeCwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGRlZmF1bHRNZXJnZWRIZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCByZXN1bHQgdHlwZSAtIGZhbGwgdGhyb3VnaCB0byBzbG93IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGVyIHRocmV3IC0gZmFsbCB0aHJvdWdoIHRvIHNsb3cgcGF0aCBmb3IgcHJvcGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PSBTTE9XIFBBVEggPT09PT1cbiAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICBjb25zdCBleGVjdXRlSWQgPSBydW50aW1lPy5leGVjdXRlSWQgPyBhd2FpdCBydW50aW1lLmV4ZWN1dGVJZChvcHRpb25zLnJlcXVlc3QuaGVhZGVycykgOiBfX2NyZWF0ZUlkKCk7XG4gICAgICAgIGNvbnN0IGFueUVtaXRIYW5kbGVycyA9ICFjaGVja05vRW1pdEhhbmRsZXJzKCk7XG5cbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIHBhdGhTdHJpbmcsIGV4ZWN1dGVJZCk7XG4gICAgICAgIGlmIChhbnlFbWl0SGFuZGxlcnMpIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LnNldChleGVjdXRlSWQsIHsgbG9nZ2VyIH0pO1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSBiYXNlIGhlYWRlcnMgZm9yIHRoaXMgcmVxdWVzdCAoQ09SUyArIGRlZmF1bHRzKVxuICAgICAgICBjb25zdCBiYXNlSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IG9yaWdpbiA/IHsgLi4uY29yc0hlYWRlcnMsIC4uLmRlZmF1bHRSZXNwb25zZUhlYWRlcnMgfSA6IGRlZmF1bHRNZXJnZWRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcblxuICAgICAgICBjb25zdCByZXNwb25zZTogTWlsa2lvSHR0cFJlc3BvbnNlID0ge1xuICAgICAgICAgICAgYm9keTogXCJcIixcbiAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgaGVhZGVyczogeyAuLi5iYXNlSGVhZGVycyB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByYXcgcm91dGUg4oCUIHJhdyByb3V0ZXMgYnlwYXNzIGFjdGlvbi9zdHJlYW0gbG9naWNcbiAgICAgICAgLy8gYW5kIGxldCB0aGUgaGFuZGxlciBvd24gdGhlIGZ1bGwgUmVxdWVzdC9SZXNwb25zZSBsaWZlY3ljbGUuXG4gICAgICAgIGNvbnN0IGlzUmF3UGF0aCA9IGdlbmVyYXRlZC5yYXdTY2hlbWE/LnJhd1BhdGhzPy5oYXMocGF0aFN0cmluZykgPz8gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaHR0cDogQ29udGV4dEh0dHAgPSB7XG4gICAgICAgICAgICB1cmw6IHBhdGhuYW1lIGFzIGFueSxcbiAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIC8vIEZvciByYXcgcm91dGVzLCBkb24ndCBjb25zdW1lIHRoZSByZXF1ZXN0IGJvZHkg4oCUIHRoZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgLy8gbmVlZHMgaXQgaW50YWN0LiBUaGUgYm9keSB3aWxsIGJlIHBhc3NlZCB2aWEgdGhlIFJlcXVlc3Qgb2JqZWN0LlxuICAgICAgICAgICAgICAgIHN0cmluZzogaXNSYXdQYXRoID8gXCJcIiA6IChib2R5VGV4dCAhPT0gdW5kZWZpbmVkID8gYm9keVRleHQgOiBhd2FpdCBvcHRpb25zLnJlcXVlc3QudGV4dCgpKSxcbiAgICAgICAgICAgICAgICBwYXJzZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QsXG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIGNvcnMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29udGV4dDogYW55ID0geyByZWplY3QsIHJhaXNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBlbWl0IGhhcyBoYW5kbGVycyBiZWZvcmUgYXdhaXRpbmdcbiAgICAgICAgICAgIGNvbnN0IGhhc0h0dHBSZXF1ZXN0SGFuZGxlcnMgPSBydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwUmVxdWVzdFwiKSA/PyB0cnVlO1xuICAgICAgICAgICAgaWYgKGhhc0h0dHBSZXF1ZXN0SGFuZGxlcnMpIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVxdWVzdFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0LCByYWlzZSB9KTtcblxuICAgICAgICAgICAgLy8g6Z2eIHRlc3Qg546v5aKD5LiL5oum5oiqICRleHBvcnRzIOWGhemDqOi3r+W+hFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW52TW9kZSAhPT0gXCJ0ZXN0XCIgJiYgKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIiRcIikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA9PT09PSBSQVcgUEFUSCA9PT09PVxuICAgICAgICAgICAgLy8gUmF3IHJvdXRlcyByZWNlaXZlIGEgbmF0aXZlIFJlcXVlc3QgYW5kIHJldHVybiBhIG5hdGl2ZSBSZXNwb25zZS5cbiAgICAgICAgICAgIC8vIFRoZXkgYnlwYXNzIHR5cGlhIHZhbGlkYXRpb24sIEpTT04gc2VyaWFsaXphdGlvbiwgYW5kIHN0YXJnYXRlLlxuICAgICAgICAgICAgLy8gVXNlIGNhc2U6IFNTRSBwYXNzdGhyb3VnaCAoZS5nLiBPcGVuQUkgcHJveHkpLCB3ZWJob29rcywgYmluYXJ5LlxuICAgICAgICAgICAgaWYgKGlzUmF3UGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd1JvdXRlID0gZ2VuZXJhdGVkLnJhd1NjaGVtYS5yb3V0ZXNbcGF0aFN0cmluZ107XG4gICAgICAgICAgICAgICAgaWYgKCFyYXdSb3V0ZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTGF6eS1sb2FkIG1vZHVsZSBvbiBmaXJzdCBhY2Nlc3MsIHRoZW4gY2FjaGVcbiAgICAgICAgICAgICAgICBsZXQgbW9kdWxlOiBhbnkgPSByYXdSb3V0ZS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBhd2FpdCBtb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmF3Um91dGUubW9kdWxlID0gbW9kdWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gbW9kdWxlPy5tZXRhID8/IHt9O1xuXG4gICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IGZ1bGwgY29udGV4dCAocmF3IGRvZXNuJ3QgZ28gdGhyb3VnaCBfX2V4ZWN1dGUsXG4gICAgICAgICAgICAgICAgLy8gc28gd2Ugc2V0IGFsbCBmaWVsZHMgbWFudWFsbHkgaGVyZSlcbiAgICAgICAgICAgICAgICBjb250ZXh0Lmh0dHAgPSBodHRwO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuaGVhZGVycyA9IGh0dHAucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnBhdGggPSBwYXRoU3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnRleHQucm91dGVUeXBlID0gXCJyYXdcIjtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlciA9IGxvZ2dlcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVtaXQgPSBydW50aW1lLmVtaXQ7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0QW55QXBwcm92ZWQgPSBydW50aW1lLmVtaXRBbnlBcHByb3ZlZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVtaXRBbGxBcHByb3ZlZCA9IHJ1bnRpbWUuZW1pdEFsbEFwcHJvdmVkO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZXhlY3V0ZUlkID0gZXhlY3V0ZUlkO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY29uZmlnID0gcnVudGltZS5ydW50aW1lLmNvbmZpZztcbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGlhID0gZ2VuZXJhdGVkLnR5cGlhU2NoZW1hO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY2FsbCA9IChtb2Q6IGFueSwgcGFyYW1zOiBhbnkpID0+IGV4ZWN1dGVyLl9fY2FsbChjb250ZXh0LCBtb2QsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5vbkZpbmFsbHkgPSAoaGFuZGxlcjogYW55KSA9PiBmaW5hbGVzLnVuc2hpZnQoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgY29udGV4dC5fID0gcnVudGltZTtcblxuICAgICAgICAgICAgICAgIC8vIElmIGFkYXB0ZXIgcHJlLXJlYWQgdGhlIGJvZHkgKGJvZHlUZXh0IHNldCksIHJlY29uc3RydWN0IGFcbiAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IHdpdGggdGhlIGJvZHkgcmUtaW5qZWN0ZWQgc28gdGhlIGhhbmRsZXIgY2FuIHJlYWQgaXQuXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBib2R5IGlzIHN0aWxsIGludGFjdCAod2Ugc2tpcHBlZFxuICAgICAgICAgICAgICAgIC8vIHJlYWRpbmcgaXQgYWJvdmUgZm9yIHJhdyBwYXRocykuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlclJlcXVlc3Q6IFJlcXVlc3QgPSBib2R5VGV4dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IFJlcXVlc3Qob3B0aW9ucy5yZXF1ZXN0LnVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBvcHRpb25zLnJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBib2R5VGV4dCB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBvcHRpb25zLnJlcXVlc3Quc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnMucmVxdWVzdDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8YW55PiA9IHsgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIikgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBwYXRoU3RyaW5nLCBtZXRhLCBjb250ZXh0LCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJhd1Jlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IG1vZHVsZS5oYW5kbGVyKGNvbnRleHQsIGhhbmRsZXJSZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnZhbHVlID0gcmF3UmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAocnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86ZXhlY3V0ZUFmdGVyXCIpID8/IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBwYXRoU3RyaW5nLCBtZXRhLCBjb250ZXh0LCByZXN1bHRzLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFwcGx5IENPUlMgaGVhZGVycyB0byB0aGUgcmF3IHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxIZWFkZXJzID0gbmV3IEhlYWRlcnMocmF3UmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoY29yc0hlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmluYWxIZWFkZXJzLmhhcyhrKSkgZmluYWxIZWFkZXJzLnNldChrLCB2KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoYXNIdHRwUmVzcG9uc2VIYW5kbGVycyA9IHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBSZXNwb25zZVwiKSA/PyB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChoYXNIdHRwUmVzcG9uc2VIYW5kbGVycykgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQsIHN1Y2Nlc3M6IHRydWUsIHJlamVjdCwgcmFpc2UgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBSdW4gb25GaW5hbGx5IGhhbmRsZXJzIChhZnRlciBodHRwUmVzcG9uc2UsIG1hdGNoaW5nIGFjdGlvbiBwYXRoIG9yZGVyaW5nKVxuICAgICAgICAgICAgICAgIGlmIChmaW5hbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IGhhbmRsZXIoKTsgfSBjYXRjaCAoZXJyb3IpIHsgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzT25Mb2dnZXJTdWJtaXR0aW5nKSBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIGlmIChhbnlFbWl0SGFuZGxlcnMpIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShleGVjdXRlSWQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyYXdSZXNwb25zZS5ib2R5LCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmF3UmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByYXdSZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBmaW5hbEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuZ2V0KFwiQWNjZXB0XCIpPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcbiAgICAgICAgICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICBsZXQgcm91dGVTY2hlbWEgPSBvcHRpb25zLnJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgIGlmICghcm91dGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSG90IHBhdGg6IGNoZWNrIHNpbmdsZS1lbnRyeSBjYWNoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFN0cmluZyA9PT0gY2FjaGVkUGF0aFN0cmluZyAmJiBjYWNoZWRSb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBjYWNoZWRSb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpLmluY2x1ZGVzKFwiJFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSB0cmllLmdldChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCwgcmFpc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSB0cmllLmdldChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCwgcmFpc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGhvdCBwYXRoIGNhY2hlXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRSb3V0ZVNjaGVtYSA9IHJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUGF0aFN0cmluZyA9IHBhdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSAhPT0gXCJhY3Rpb25cIikgdGhyb3cgcmVqZWN0KFwiVU5BQ0NFUFRBQkxFXCIsIHsgZXhwZWN0ZWQ6IFwic3RyZWFtXCIsIG1lc3NhZ2U6IGBOb3QgYWNjZXB0YWJsZSwgdGhlIEFjY2VwdCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIgc2hvdWxkIGJlIFwidGV4dC9ldmVudC1zdHJlYW1cIi4gSWYgeW91IGFyZSB1c2luZyB0aGUgXCJAbWlsa2lvL3N0YXJnYXRlXCIgcGFja2FnZSwgcGxlYXNlIGFkZCBcXGB0eXBlOiBcInN0cmVhbVwiXFxgIHRvIHRoZSBleGVjdXRlIG9wdGlvbnMuYCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb250ZXh0Lmh0dHAgPSBodHRwO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuaGVhZGVycyA9IGh0dHAucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIGNvbnRleHQucm91dGVUeXBlID0gXCJhY3Rpb25cIjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID0gYXdhaXQgZXhlY3V0ZXIuX19leGVjdXRlKHJvdXRlU2NoZW1hLCB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBodHRwLnBhcmFtcy5zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc0NvbnRlbnRUeXBlOiBcImpzb25cIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5ib2R5ID09PSBcIlwiICYmIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0ZWQuZW1wdHlSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBge1wiZGF0YVwiOnt9LFwiZXhlY3V0ZUlkXCI6XCIke2V4ZWN1dGVJZH1cIixcInN1Y2Nlc3NcIjp0cnVlfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjoke0pTT04uc3RyaW5naWZ5KGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpfSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzSHR0cFJlc3BvbnNlSGFuZGxlcnMgPSBydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwUmVzcG9uc2VcIikgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzSHR0cFJlc3BvbnNlSGFuZGxlcnMpIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0OiBleGVjdXRlZC5jb250ZXh0LCBzdWNjZXNzOiB0cnVlLCByZWplY3QsIHJhaXNlIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChoYXNPbkxvZ2dlclN1Ym1pdHRpbmcpIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgaWYgKGFueUVtaXRIYW5kbGVycykgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogcmVzcG9uc2UuYm9keSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keSBhcyBCb2R5SW5pdCB8IG51bGwsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtXG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIiRcIikgfHwgIShodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuZW5kc1dpdGgoXCJ+XCIpIHx8IHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW2h0dHAucGF0aC5zdHJpbmddO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWUuYWRkKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgIT09IFwic3RyZWFtXCIpIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcInN0cmVhbVwiLCBtZXNzYWdlOiBgTm90IGFjY2VwdGFibGUsIHRoZSBBY2NlcHQgaW4gdGhlIHJlcXVlc3QgaGVhZGVyIHNob3VsZCBiZSBcImFwcGxpY2F0aW9uL2pzb25cIi4gSWYgeW91IGFyZSB1c2luZyB0aGUgXCJAbWlsa2lvL3N0YXJnYXRlXCIgcGFja2FnZSwgcGxlYXNlIHJlbW92ZSBcXGB0eXBlOiBcInN0cmVhbVwiXFxgIHRvIHRoZSBleGVjdXRlIG9wdGlvbnMuYCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVDbG9zZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09uTG9nZ2VyU3VibWl0dGluZykgYXdhaXQgbG9nZ2VyLl8uc3VibWl0KGNvbnRleHQgYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFueUVtaXRIYW5kbGVycykgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnRleHQuaHR0cCA9IGh0dHA7XG4gICAgICAgICAgICAgICAgY29udGV4dC5oZWFkZXJzID0gaHR0cC5yZXF1ZXN0LmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgY29udGV4dC5yb3V0ZVR5cGUgPSBcInN0cmVhbVwiO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLnJlcXVlc3QuaGVhZGVycyBhcyBIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcbiAgICAgICAgICAgICAgICAvLyBTdHJlYW0gcGF0aDogY3JlYXRlIG5ldyBoZWFkZXJzIG9iamVjdCB0byBhdm9pZCBwb2xsdXRpbmcgc2hhcmVkIGRlZmF1bHRNZXJnZWRIZWFkZXJzXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHsgLi4ucmVzcG9uc2UuaGVhZGVycywgLi4uYnVpbGRDb3JzSGVhZGVycyhodHRwLmNvcnMsIG9yaWdpbikgfTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbDogUmVhZGFibGVTdHJlYW1EaXJlY3RDb250cm9sbGVyIHwgUmVhZGFibGVTdHJlYW1EZWZhdWx0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQnVuICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkaXJlY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcHVsbChjb250cm9sbGVyOiBSZWFkYWJsZVN0cmVhbURpcmVjdENvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY29udHJvbGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgdmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOiR7cmVzdWx0fVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXhjZXB0aW9uLmNvZGVdID0gZXhjZXB0aW9uLnJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YToke0pTT04uc3RyaW5naWZ5KFtyZXN1bHQsIG51bGxdKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBub2RlLmpzIG9yIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcHVsbChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoW251bGwsIHZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7cmVzdWx0fVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbZXhjZXB0aW9uLmNvZGVdID0gZXhjZXB0aW9uLnJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW3Jlc3VsdCwgbnVsbF0pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBzdHJlYW07XG4gICAgICAgICAgICAgICAgLy8gU3RyZWFtIHBhdGg6IGNyZWF0ZSBuZXcgaGVhZGVycyB0byBhdm9pZCBwb2xsdXRpbmcgc2hhcmVkIG9iamVjdFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7IC4uLnJlc3BvbnNlLmhlYWRlcnMsIFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9ldmVudC1zdHJlYW1cIiwgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tY2FjaGVcIiB9O1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQ6IGV4ZWN1dGVkLmNvbnRleHQsIHN1Y2Nlc3M6IHRydWUsIHJlamVjdCwgcmFpc2UgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8TWlsa2lvUmVzcG9uc2VSZWplY3Q+ID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvciksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMudmFsdWUgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2UuYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdHMudmFsdWUpO1xuICAgICAgICAgICAgLy8gRXJyb3IgcGF0aDogY3JlYXRlIG5ldyBoZWFkZXJzIHRvIGF2b2lkIHBvbGx1dGluZyBzaGFyZWQgb2JqZWN0XG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0geyAuLi5yZXNwb25zZS5oZWFkZXJzLCAuLi5jb3JzSGVhZGVycyB9O1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQsIHN1Y2Nlc3M6IGZhbHNlLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgLy8gUnVuIG9uRmluYWxseSBoYW5kbGVycyBldmVuIG9uIGVycm9yIChpbXBvcnRhbnQgZm9yIHJhdyByb3V0ZXMgd2hlcmVcbiAgICAgICAgICAgIC8vIHRoZSBoYW5kbGVyIG1heSBoYXZlIHJlZ2lzdGVyZWQgY2xlYW51cCB2aWEgY29udGV4dC5vbkZpbmFsbHkgYmVmb3JlIHRocm93aW5nKVxuICAgICAgICAgICAgaWYgKGZpbmFsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IGhhbmRsZXIoKTsgfSBjYXRjaCAoZSkgeyBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlKTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNPbkxvZ2dlclN1Ym1pdHRpbmcpIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICBpZiAoYW55RW1pdEhhbmRsZXJzKSBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogcmVzcG9uc2UuYm9keSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHkgYXMgQm9keUluaXQgfCBudWxsLCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc3RyZWFtQ2xvc2VyczogTWFwPHN0cmluZywgeyBnZW5lcmF0b3I6IEFzeW5jR2VuZXJhdG9yOyBoYW5kbGVDbG9zZTogYW55IH0+ID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IGhhbmRsZU1lc3NhZ2UgPSBhc3luYyAoXG4gICAgICAgIHBvcnQ6IHsgcG9zdE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB9LFxuICAgICAgICBvcHRpb25zOlxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgICAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHN0cmluZyxcbiAgICApID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gXCJQSU5HXCIpIHtcbiAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKFwiUE9OR1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXJ0c1dpdGgoXCJDTE9TRV9TVFJFQU06XCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gb3B0aW9ucy5zdWJzdHJpbmcoXCJDTE9TRV9TVFJFQU06XCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1DbG9zZXIgPSBzdHJlYW1DbG9zZXJzLmdldChleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChzdHJlYW1DbG9zZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VyLmdlbmVyYXRvci5yZXR1cm4odW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2xvc2VyLmhhbmRsZUNsb3NlKFwic3RyZWFtXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm91dGVTY2hlbWEgPSB0cmllLmdldChvcHRpb25zLnBhdGgpO1xuICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gZ2VuZXJhdGVkLnJvdXRlU2NoZW1hPy5bb3B0aW9ucy5wYXRoXTtcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogb3B0aW9ucy5wYXRoIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgIHRyaWUuYWRkKG9wdGlvbnMucGF0aCwgcm91dGVTY2hlbWEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG9wdGlvbnMucGFyYW1zID8/IHt9O1xuICAgICAgICBjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIocnVudGltZSwgb3B0aW9ucy5wYXRoLCBvcHRpb25zLmV4ZWN1dGVJZCk7XG4gICAgICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcblxuICAgICAgICBjb25zdCBodHRwID0gbmV3IFByb3h5KFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT09IFwibm90Rm91bmRcIikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiVU5BQ0NFUFRBQkxFXCIsIHsgZXhwZWN0ZWQ6IFwiY29udGV4dC5odHRwXCIsIG1lc3NhZ2U6IFwiVGhpcyByZXF1ZXN0IHdhcyBpbnZva2VkIHRocm91Z2ggdGhlIGV4ZWN1dGUgbWV0aG9kLiBTaW5jZSBubyBhY3R1YWwgcmVxdWVzdCB3YXMgZ2VuZXJhdGVkLCB0aGUgSFRUUCBtZXRob2RzIHVuZGVyIHRoZSBjb250ZXh0IGNhbm5vdCBiZSBhY2Nlc3NlZC5cIiB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoYW5kbGVDbG9zZSA9IGFzeW5jICh0eXBlOiBcImFjdGlvblwiIHwgXCJzdHJlYW1cIikgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwic3RyZWFtXCIpIHN0cmVhbUNsb3NlcnMuZGVsZXRlKG9wdGlvbnMuZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKG9wdGlvbnMuZXhlY3V0ZUlkKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0geyBodHRwOiBodHRwLCBoZWFkZXJzLCByb3V0ZVR5cGU6IHJvdXRlU2NoZW1hLnR5cGUsIHJlamVjdCwgcmFpc2UgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgPT09IFwiYWN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJyYXdcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcblxuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKFwiYWN0aW9uXCIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGVkLmVtcHR5UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEudHlwZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID0gYXdhaXQgZXhlY3V0ZXIuX19leGVjdXRlKHJvdXRlU2NoZW1hLCB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IG9wdGlvbnMucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3NlcnMuc2V0KG9wdGlvbnMuZXhlY3V0ZUlkLCB7IGdlbmVyYXRvcjogZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSwgaGFuZGxlQ2xvc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogW251bGwsIHZhbHVlXSwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlcHRpb24gPSBleGNlcHRpb25IYW5kbGVyKG9wdGlvbnMuZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbcmVzdWx0LCBudWxsXSwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoXCJzdHJlYW1cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBleGNlcHRpb25IYW5kbGVyKG9wdGlvbnMuZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogZmFsc2UsIGRhdGE6IHVuZGVmaW5lZCwgZXJyb3I6IHJlc3VsdCwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwb3J0LFxuICAgICAgICBmZXRjaCxcbiAgICAgICAgaGFuZGxlTWVzc2FnZSxcbiAgICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE1pbGtpb1Jlc3BvbnNlUmVqZWN0LCBMb2dnZXIgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSAkcmVqZWN0Q29kZSB7XG4gICAgUkVRVUVTVF9GQUlMOiBhbnk7XG4gICAgTk9UX0RFVkVMT1BfTU9ERTogc3RyaW5nO1xuICAgIFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0OiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9O1xuICAgIE5PVF9GT1VORDogeyBwYXRoOiBzdHJpbmcgfTtcbiAgICBQQVJBTVNfVFlQRV9JTkNPUlJFQ1Q6IHsgcGF0aDogc3RyaW5nOyBleHBlY3RlZDogc3RyaW5nOyB2YWx1ZTogYW55OyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgUkVTVUxUU19UWVBFX0lOQ09SUkVDVDogeyBwYXRoOiBzdHJpbmc7IGV4cGVjdGVkOiBzdHJpbmc7IHZhbHVlOiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9IHwgbnVsbDtcbiAgICBVTkFDQ0VQVEFCTEU6IHsgZXhwZWN0ZWQ6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH07XG4gICAgUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIHwgbnVsbDsgcGFyYW1zOiBzdHJpbmcgfTtcbiAgICBSRVNVTFRTX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XG4gICAgSU5URVJOQUxfU0VSVkVSX0VSUk9SOiB1bmRlZmluZWQ7XG4gICAgTUVUSE9EX05PVF9BTExPV0VEOiB1bmRlZmluZWQ7XG4gICAgTkVUV09SS19FUlJPUjogdW5kZWZpbmVkO1xufVxuXG4vLyByZWplY3Q6IOaLkue7neeggeW9ouW8j++8jOesrOS4gOS4quWPguaVsOW/hemhu+aYr+Wtl+espuS4su+8iOaLkue7neegge+8ie+8jOesrOS6jOS4quWPguaVsOaYr+WFt+S9k+eahOmUmeivr+aVsOaNrlxuLy8g5rOo5oSP77ya5qGG5p625YaF6YOo55qEIHJlamVjdCDkvb/nlKjlrr3mnb7nsbvlnovvvIznlKjmiLfkvqcgY29udGV4dC5yZWplY3Qg55qE5Lil5qC857G75Z6L55SxIGRlY2xhcmVzLnRzIOS4reeahCBNaWxraW9SZWplY3RGdW5jdGlvbiDmj5DkvptcbmV4cG9ydCBmdW5jdGlvbiByZWplY3QoY29kZTogc3RyaW5nLCBkYXRhPzogYW55KTogTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+IHtcbiAgICBjb25zdCBlcnJvciA9IHsgJG1pbGtpb1JlamVjdDogdHJ1ZSwgY29kZSwgZGF0YSB9IGFzIE1pbGtpb1JlamVjdEVycm9yPGFueSwgYW55PjtcbiAgICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yKTtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5cbi8vIHJhaXNlOiDlr7nosaHlvaLlvI/vvIzkvKDlhaXkuIDkuKogeyDmi5Lnu53noIE6IOmUmeivr+aVsOaNriB9IOWvueixoe+8jOWwhumUmeivr+WQkeS4iuaKm+WHuu+8iOexu+S8vCBnb2xhbmcg55qE5pi+5byP6ZSZ6K+v5aSE55CG77yJXG4vLyDms6jmhI/vvJrmoYbmnrblhoXpg6jnmoQgcmFpc2Ug5L2/55So5a695p2+57G75Z6L77yM55So5oi35L6nIGNvbnRleHQucmFpc2Ug55qE5Lil5qC857G75Z6L55SxIGRlY2xhcmVzLnRzIOS4reeahCBNaWxraW9SYWlzZUZ1bmN0aW9uIOaPkOS+m1xuZXhwb3J0IGZ1bmN0aW9uIHJhaXNlKG9iajogUmVjb3JkPHN0cmluZywgYW55Pik6IE1pbGtpb1JlamVjdEVycm9yPGFueSwgYW55PiB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgY29kZSA9IGtleXNbMF07XG4gICAgaWYgKGNvZGUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwicmFpc2UoKSByZXF1aXJlcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBvbmUga2V5IGFzIHRoZSByZWplY3Rpb24gY29kZVwiKTtcbiAgICBjb25zdCByZWplY3REYXRhID0gb2JqW2NvZGVdO1xuICAgIGNvbnN0IGVycm9yID0geyAkbWlsa2lvUmVqZWN0OiB0cnVlLCBjb2RlLCBkYXRhOiByZWplY3REYXRhIH0gYXMgTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+O1xuICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09IFwiZnVuY3Rpb25cIikgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyb3IpO1xuICAgIHJldHVybiBlcnJvcjtcbn1cblxuZXhwb3J0IHR5cGUgTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSBleHRlbmRzIGtleW9mICRyZWplY3RDb2RlID0ga2V5b2YgJHJlamVjdENvZGUsIFJlamVjdERhdGEgZXh0ZW5kcyAkcmVqZWN0Q29kZVtDb2RlXSA9ICRyZWplY3RDb2RlW0NvZGVdPiA9IHsgY29kZTogQ29kZTsgZGF0YTogUmVqZWN0RGF0YTsgc3RhY2s6IHN0cmluZzsgJG1pbGtpb1JlamVjdDogdHJ1ZSB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQ6IHN0cmluZywgbG9nZ2VyOiBMb2dnZXIsIGVycm9yOiBNaWxraW9SZWplY3RFcnJvcjxhbnksIGFueT4gfCBhbnkpOiBNaWxraW9SZXNwb25zZVJlamVjdCB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJ2aXRlU2VydmVyXCIgaW4gZ2xvYmFsVGhpcykge1xuICAgICAgICB0cnkgeyAoZ2xvYmFsVGhpcyBhcyBhbnkpLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlcnJvcik7IH0gY2F0Y2gge31cbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGVycm9yPy5jb2RlID8/IGVycm9yPy5uYW1lID8/IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVubmFtZWQgRXhjZXB0aW9uXCI7XG5cbiAgICBpZiAoZXJyb3I/LiRtaWxraW9SZWplY3QgPT09IHRydWUpIHtcbiAgICAgICAgLy8g6aKE5pyf5YaF55qE5Lia5Yqh5ouS57ud77yI562+5ZCN5peg5pWI44CB5Y+C5pWw6ZSZ6K+v44CBTk9UX0ZPVU5EIOetie+8ieeUqCB3YXJuL2luZm8g6K6w5b2V77yMXG4gICAgICAgIC8vIOS4jeS6p+eUnyBlcnJvciDml6Xlv5fvvIzpgb/lhY3lpJbpg6jml6DmlYjor7fmsYLvvIjniKzomavmiavmj4/nrYnvvInmsaHmn5PplJnor6/lkYrorabjgIJcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiTk9UX0ZPVU5EXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKG5hbWUsIGVycm9yPy5kYXRhPy5wYXRoID8/IFwiVW5rbm93biBwYXRoXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSAoZXJyb3I/LnN0YWNrID8/IFwiXCIpLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDIpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICBsb2dnZXIud2FybihuYW1lLCBgXFxuJHtKU09OLnN0cmluZ2lmeShlcnJvcj8uZGF0YSl9YCwgYFxcbiR7c3RhY2t9XFxuYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBlcnJvcj8uc3RhY2sgPz8gXCJcIjtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihuYW1lLCBgXFxuJHtKU09OLnN0cmluZ2lmeShlcnJvcj8uZGF0YSl9YCwgYFxcbiR7c3RhY2t9XFxuYCk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihuYW1lLCBgXFxuJHtlcnJvcj8udG9TdHJpbmcoKX1gLCBgXFxuJHtlcnJvcj8uc3RhY2t9XFxuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBNaWxraW9SZXNwb25zZVJlamVjdDtcblxuICAgIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSkgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogZXJyb3IuY29kZSwgcmVqZWN0OiBlcnJvci5kYXRhLCBleGVjdXRlSWQgfTtcbiAgICBlbHNlIHJlc3VsdCA9IHsgc3VjY2VzczogZmFsc2UsIGNvZGU6IFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCIsIHJlamVjdDogdW5kZWZpbmVkLCBleGVjdXRlSWQgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQU8sU0FBUyxJQUE2QixDQUFDLFNBQTJCO0FBQUEsRUFDdkUsT0FBTyxRQUFRO0FBQUE7O0FDVVYsU0FBUyxVQUEwQyxDQUFDLE9BQStCO0FB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QU0sd0VBQXdFO0FBQUEsRUFDaEgsTUFBTSxhQUFhLElBQUk7QUFBQSxFQUN2QixNQUFNLFFBQVEsRUFBRSxlQUFlLE1BQU0sTUFBTSxNQUFNLFdBQVc7QUFBQSxFQUM1RCxJQUFJLE9BQU8sTUFBTSxzQkFBc0I7QUFBQSxJQUFZLE1BQU0sa0JBQWtCLEtBQUs7QUFBQSxFQUNoRixPQUFPO0FBQUE7QUFLSixTQUFTLGdCQUFnQixDQUFDLFdBQW1CLFFBQWdCLE9BQWdFO0FBQUEsRUFDaEksSUFBSSxpQkFBaUIsU0FBUyxnQkFBZ0IsWUFBWTtBQUFBLElBQ3RELElBQUk7QUFBQSxNQUFHLFdBQW1CLFdBQVcsaUJBQWlCLEtBQUs7QUFBQSxNQUFLLE1BQU07QUFBQSxFQUMxRTtBQUFBLEVBQ0EsTUFBTSxPQUFPLE9BQU8sUUFBUSxPQUFPLFFBQVEsT0FBTyxhQUFhLFFBQVE7QUFBQSxFQUV2RSxJQUFJLE9BQU8sa0JBQWtCLE1BQU07QUFBQSxJQUcvQixJQUFJLE1BQU0sU0FBUyxhQUFhO0FBQUEsTUFDNUIsT0FBTyxLQUFLLE1BQU0sT0FBTyxNQUFNLFFBQVEsY0FBYztBQUFBLElBQ3pELEVBQU87QUFBQSxNQUNILE1BQU0sU0FBUyxPQUFPLFNBQVMsSUFBSSxNQUFNO0FBQUEsQ0FBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUs7QUFBQSxDQUFJO0FBQUEsTUFDakUsT0FBTyxLQUFLLE1BQU07QUFBQSxFQUFLLEtBQUssVUFBVSxPQUFPLElBQUksS0FBSztBQUFBLEVBQUs7QUFBQSxDQUFTO0FBQUE7QUFBQSxFQUU1RSxFQUFPO0FBQUEsSUFDSCxJQUFJO0FBQUEsTUFDQSxNQUFNLFFBQVEsT0FBTyxTQUFTO0FBQUEsTUFDOUIsT0FBTyxNQUFNLE1BQU07QUFBQSxFQUFLLEtBQUssVUFBVSxPQUFPLElBQUksS0FBSztBQUFBLEVBQUs7QUFBQSxDQUFTO0FBQUEsTUFDdkUsT0FBTyxHQUFHO0FBQUEsTUFDUixPQUFPLE1BQU0sTUFBTTtBQUFBLEVBQUssT0FBTyxTQUFTLEtBQUs7QUFBQSxFQUFLLE9BQU87QUFBQSxDQUFTO0FBQUE7QUFBQTtBQUFBLEVBSTFFLElBQUk7QUFBQSxFQUVKLElBQUksT0FBTyxrQkFBa0I7QUFBQSxJQUFNLFNBQVMsRUFBRSxTQUFTLE9BQU8sTUFBTSxNQUFNLE1BQU0sUUFBUSxNQUFNLE1BQU0sVUFBVTtBQUFBLEVBQ3pHO0FBQUEsYUFBUyxFQUFFLFNBQVMsT0FBTyxNQUFNLHlCQUF5QixRQUFRLFdBQVcsVUFBVTtBQUFBLEVBRTVGLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjRBRTcxRkZCMzMxMUQ4OUM2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
1596
|
+
//# debugId=4EB301E4F8EA8D8C64756E2164756E21
|
|
1597
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbHMvcGFydC50cyIsICIuLi90eXBlLXNhZmV0eS9pbmRleC50cyIsICIuLi9jb25maWcvaW5kZXgudHMiLCAiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzIiwgIi4uL3V0aWxzL21lcmdlLWRlZXAudHMiLCAiLi4vdXRpbHMvcmV2aXZlLWpzb24tcGFyc2UudHMiLCAiLi4vZXhlY3V0ZS9pbmRleC50cyIsICIuLi9ldmVudC9pbmRleC50cyIsICIuLi9mbG93L2luZGV4LnRzIiwgIi4uL3V0aWxzL2NyZWF0ZS1pZC50cyIsICIuLi9leGVjdXRlL2V4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzIiwgIi4uL3dvcmxkL2luZGV4LnRzIiwgIi4uL3R5cGlhL2luZGV4LnRzIiwgIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHMiLCAiLi4vbG9nZ2VyL2luZGV4LnRzIiwgIi4uL3N0ZXAvaW5kZXgudHMiLCAiLi4vdXRpbHMvdHJpZS50cyIsICIuLi91dGlscy9idWlsZC1jb3JzLWhlYWRlcnMudHMiLCAiLi4vdXRpbHMvc2FuaXRpemUtZXhlY3V0ZS1pZC50cyIsICIuLi9saXN0ZW5lci9pbmRleC50cyIsICIuLi9leGNlcHRpb24vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGZ1bmN0aW9uIHBhcnQ8VCBleHRlbmRzICgpID0+IHVua25vd24+KGhhbmRsZXI6IFQpOiBSZXR1cm5UeXBlPFQ+IHtcbiAgcmV0dXJuIGhhbmRsZXIoKSBhcyB1bmtub3duIGFzIFJldHVyblR5cGU8VD47XG59XG4iLAogICAgImV4cG9ydCB0eXBlIFR5cGVTYWZldHk8VmFsdWUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiA9ICh2YWx1ZTogVmFsdWUpID0+IFR5cGVTYWZldHlWYWx1ZTtcblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2FmZXR5VmFsdWUge1xuICB0eXBlOiA8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KCkgPT4gVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2FmZXR5VHlwZTxUeXBlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4ge1xuICAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiO1xuICB2YWx1ZTogVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVTYWZldHk8VmFsdWUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+Pih2YWx1ZTogVmFsdWUpOiBUeXBlU2FmZXR5VmFsdWUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICgpID0+ICh7ICRtaWxraW9UeXBlOiBcInR5cGUtc2FmZXR5XCIsIHZhbHVlIH0pLFxuICB9IGFzIGFueTtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZzxDb25maWdUIGV4dGVuZHMgQ29uZmlnPihjb25maWc6IENvbmZpZ1QpOiBDb25maWdUIHtcbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZXhwb3J0IHR5cGUgQ29uZmlnID0gKG1vZGU6IHN0cmluZykgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdFbnZpcm9ubWVudHM8VCBleHRlbmRzIENvbmZpZz4ge1xuICBba2V5OiBzdHJpbmddOiAoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiBQYXJ0aWFsPEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4+IHwgUHJvbWlzZTxQYXJ0aWFsPEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvU3RyaW5nKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG4gIHJldHVybiBgJHt2YWx1ZX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW52VG9OdW1iZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBudW1iZXIpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0VmFsdWU7XG5cbiAgcmV0dXJuIE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW52VG9Cb29sZWFuKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogYm9vbGVhbikge1xuICBpZiAodmFsdWUgPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodmFsdWUgPT09IFwiZmFsc2VcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh1bmRlZmluZWQgPT09IHZhbHVlKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG4gIHJldHVybiBCb29sZWFuKHZhbHVlKTtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcnNUb0pTT04oaGVhZGVyczogSGVhZGVycykge1xuICBjb25zdCBqc29uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIChoZWFkZXJzIGFzIGFueSkuZW50cmllcygpKSB7XG4gICAganNvbltrZXldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGpzb247XG59XG4iLAogICAgImZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IGFueSk6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGVlcDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBVKTogVCB7XG4gIGNvbnN0IG1lcmdlZCA9IHsgLi4udGFyZ2V0IH07XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgY29uc3QgdGFyZ2V0VmFsdWUgPSB0YXJnZXRba2V5IGFzIGtleW9mIFRdO1xuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHRhcmdldFZhbHVlKSAmJiBpc1BsYWluT2JqZWN0KHNvdXJjZVZhbHVlKSkge1xuICAgICAgICBtZXJnZWRba2V5IGFzIGtleW9mIFQgJiBrZXlvZiBVXSA9IG1lcmdlRGVlcCh0YXJnZXRWYWx1ZSwgc291cmNlVmFsdWUpIGFzIGFueTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgKG1lcmdlZCBhcyBhbnkpW2tleV0gPSBzb3VyY2VWYWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkIGFzIFQgJiBVO1xufVxuIiwKICAgICJjb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG5mdW5jdGlvbiB0cnlQYXJzZURhdGUoc3RyOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgY29uc3QgbGVuID0gc3RyLmxlbmd0aDtcbiAgICBpZiAobGVuID49IDIwICYmIGxlbiA8PSAzMiAmJiBzdHIuY2hhckNvZGVBdCgwKSA+PSAweDMwICYmIHN0ci5jaGFyQ29kZUF0KDApIDw9IDB4MzkgJiYgc3RyLmluZGV4T2YoJ1QnKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBpc29EYXRlUGF0dGVybi5leGVjKHN0cik7XG4gICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVBhcnQgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIGNvbnN0IHR6UGFydCA9IG1hdGNoWzJdO1xuICAgICAgICAgICAgaWYgKGRhdGVQYXJ0ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKHR6UGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFR6ID0gdHpQYXJ0Lmxlbmd0aCA9PT0gNSAmJiB0elBhcnQuY2hhckF0KDMpICE9PSBcIjpcIiA/IGAke3R6UGFydC5zbGljZSgwLCAzKX06JHt0elBhcnQuc2xpY2UoMyl9YCA6IHR6UGFydDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZVBhcnQgKyBub3JtYWxpemVkVHopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVQYXJ0ICsgJ1onKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XG4gICAgaWYgKGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4ganNvbjtcbiAgICBpZiAodHlwZW9mIGpzb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBqc29uLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0ganNvbltpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0cnlQYXJzZURhdGUodik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkICE9PSBudWxsKSBqc29uW2ldID0gZDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldml2ZUpTT05QYXJzZSh2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmogPSBqc29uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCB2ID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IHRyeVBhcnNlRGF0ZSh2KTtcbiAgICAgICAgICAgICAgICBpZiAoZCAhPT0gbnVsbCkgb2JqW2tleV0gPSBkO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldml2ZUpTT05QYXJzZSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBkID0gdHJ5UGFyc2VEYXRlKGpzb24pO1xuICAgICAgICBpZiAoZCAhPT0gbnVsbCkgcmV0dXJuIGQgYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgSVZhbGlkYXRpb24gfSBmcm9tIFwidHlwaWFcIjtcbmltcG9ydCB7IHJlamVjdCwgcmFpc2UgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgJGNvbnRleHQsICRtZXRhLCBMb2dnZXIsIFJlc3VsdHMsIEdlbmVyYXRlZEluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IGhlYWRlcnNUb0pTT04gfSBmcm9tIFwiLi4vdXRpbHMvaGVhZGVycy10by1qc29uLnRzXCI7XG5pbXBvcnQgeyBtZXJnZURlZXAgfSBmcm9tIFwiLi4vdXRpbHMvbWVyZ2UtZGVlcC50c1wiO1xuaW1wb3J0IHsgcmV2aXZlSlNPTlBhcnNlIH0gZnJvbSBcIi4uL3V0aWxzL3Jldml2ZS1qc29uLXBhcnNlLnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSkge1xuICAgIGNvbnN0IF9fZXhlY3V0ZSA9IGFzeW5jIChcbiAgICAgICAgcm91dGVTY2hlbWE6IGFueSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogTG9nZ2VyO1xuICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEhlYWRlcnM7XG4gICAgICAgICAgICBjb250ZXh0OiBhbnkgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBwYXJhbXNDb250ZW50VHlwZT86IHN0cmluZztcbiAgICAgICAgfSAmIChcbiAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSxcbiAgICApOiBQcm9taXNlPHsgZXhlY3V0ZUlkOiBzdHJpbmc7IGhlYWRlcnM6IEhlYWRlcnM7IHBhcmFtczogUmVjb3JkPGFueSwgdW5rbm93bj47IHJlc3VsdHM6IFJlc3VsdHM8YW55PjsgY29udGV4dDogJGNvbnRleHQ7IG1ldGE6IFJlYWRvbmx5PCRtZXRhPjsgdHlwZTogXCJhY3Rpb25cIiB8IFwic3RyZWFtXCI7IGVtcHR5UmVzdWx0OiBib29sZWFuOyBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gfT4gPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gb3B0aW9ucy5wYXRoLmVuZHNXaXRoKFwiflwiKSA/IFwic3RyZWFtXCIgOiBcImFjdGlvblwiO1xuICAgICAgICBjb25zdCBleGVjdXRlSWQ6IHN0cmluZyA9IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZDtcbiAgICAgICAgbGV0IGhlYWRlcnM6IEhlYWRlcnM7XG4gICAgICAgIGlmICghKG9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGxpZ2h0d2VpZ2h0IGhlYWRlcnMgcHJveHkgd2l0aCBnZXQoKSBtZXRob2RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKG9wdGlvbnMuaGVhZGVycyBhcyBhbnkpPy5nZXQgPT09IFwiZnVuY3Rpb25cIiAmJiAhKG9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyBhcyB1bmtub3duIGFzIEhlYWRlcnM7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0b0pTT04gZm9yIGxpZ2h0d2VpZ2h0IHByb3h5IC0gbm90IG5lZWRlZCBpbiBIVFRQIHJlcXVlc3QgcGF0aFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghKFwidG9KU09OXCIgaW4gaGVhZGVycykpIChoZWFkZXJzIGFzIGFueSkudG9KU09OID0gKCkgPT4gaGVhZGVyc1RvSlNPTihoZWFkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbGVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgICAgIGNvbnN0IG9uRmluYWxseSA9IChoYW5kbGVyOiBhbnkpID0+IGZpbmFsZXMudW5zaGlmdChoYW5kbGVyKTtcblxuICAgICAgICBsZXQgcGFyYW1zOiBSZWNvcmQ8YW55LCB1bmtub3duPjtcbiAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1zVHlwZSA9PT0gXCJyYXdcIikge1xuICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyYW1zIHx8IG9wdGlvbnMucGFyYW1zID09PSBcIlwiIHx8IG9wdGlvbnMucGFyYW1zID09PSBcInt9XCIpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LnN0YXJ0c1dpdGgoXCJhcHBsaWNhdGlvbi9qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2Uob3B0aW9ucy5wYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwianNvblwiLCBjb250ZW50VHlwZTogaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgPz8gbnVsbCwgcGFyYW1zOiBvcHRpb25zLnBhcmFtcy5zbGljZSgwLCA0MDk2KSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09IFwidW5kZWZpbmVkXCIpIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKT8uc3RhcnRzV2l0aChcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiBwYXJhbXNba2V5XSA9IHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHsgZXhwZWN0ZWQ6IFwiZm9ybS11cmxlbmNvZGVkXCIsIGNvbnRlbnRUeXBlOiBoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBudWxsLCBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLnNsaWNlKDAsIDQwOTYpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wYXJhbXMuc3RhcnRzV2l0aChcIntcIikpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShvcHRpb25zLnBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJqc29uXCIsIGNvbnRlbnRUeXBlOiBoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBudWxsLCBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLnNsaWNlKDAsIDQwOTYpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlBBUkFNU19UWVBFX05PVF9TVVBQT1JURURcIiwgeyBleHBlY3RlZDogXCJqc29uXCIsIGNvbnRlbnRUeXBlOiBoZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKSA/PyBudWxsLCBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLnNsaWNlKDAsIDQwOTYpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyYW1zKSkgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiwgY29udGVudFR5cGU6IGhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpID8/IG51bGwsIHBhcmFtczogKHR5cGVvZiBvcHRpb25zLnBhcmFtcyA9PT0gXCJzdHJpbmdcIiA/IG9wdGlvbnMucGFyYW1zIDogSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wYXJhbXMpKS5zbGljZSgwLCA0MDk2KSB9KTtcbiAgICAgICAgaWYgKFwiJG1pbGtpb0dlbmVyYXRlUGFyYW1zXCIgaW4gcGFyYW1zICYmIHBhcmFtcy4kbWlsa2lvR2VuZXJhdGVQYXJhbXMgPT09IFwiZW5hYmxlXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVudGltZS5kZXZlbG9wKSB0aHJvdyByZWplY3QoXCJOT1RfREVWRUxPUF9NT0RFXCIsIFwiVGhpcyBmZWF0dXJlIG11c3QgYmUgaW4gY29va2Jvb2sgdG8gdXNlLlwiKTtcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMuJG1pbGtpb0dlbmVyYXRlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHBhcmFtc1JhbmQgPSByb3V0ZVNjaGVtYS5yYW5kb21QYXJhbXMoKTtcbiAgICAgICAgICAgIGlmIChwYXJhbXNSYW5kID09PSB1bmRlZmluZWQgfHwgcGFyYW1zUmFuZCA9PT0gbnVsbCkgcGFyYW1zUmFuZCA9IHt9O1xuICAgICAgICAgICAgcGFyYW1zID0gbWVyZ2VEZWVwKHBhcmFtcywgcGFyYW1zUmFuZCk7XG4gICAgICAgICAgICBvcHRpb25zLmNyZWF0ZWRMb2dnZXIuZGVidWcoXCLinKggdGhlIGdlbmVyYXRlZCBwYXJhbXM6XCIsIEpTT04uc3RyaW5naWZ5KHBhcmFtcykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0Py5odHRwPy5ub3RGb3VuZCAmJiBvcHRpb25zLmNvbnRleHQ/Lmh0dHA/LnBhcmFtcz8uc3RyaW5nKSBvcHRpb25zLmNvbnRleHQuaHR0cC5wYXJhbXMucGFyc2VkID0gcGFyYW1zO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5jb250ZXh0KSBvcHRpb25zLmNvbnRleHQgPSB7fTtcbiAgICAgICAgY29uc3QgY3R4ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBjdHguZGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcbiAgICAgICAgY3R4LnBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgIGN0eC5yb3V0ZVR5cGUgPSB0eXBlO1xuICAgICAgICBjdHgubG9nZ2VyID0gb3B0aW9ucy5jcmVhdGVkTG9nZ2VyO1xuICAgICAgICBjdHguZW1pdCA9IHJ1bnRpbWUuZW1pdDtcbiAgICAgICAgY3R4LmVtaXRBbnlBcHByb3ZlZCA9IHJ1bnRpbWUuZW1pdEFueUFwcHJvdmVkO1xuICAgICAgICBjdHguZW1pdEFsbEFwcHJvdmVkID0gcnVudGltZS5lbWl0QWxsQXBwcm92ZWQ7XG4gICAgICAgIGN0eC5leGVjdXRlSWQgPSBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQ7XG4gICAgICAgIGN0eC5jb25maWcgPSBydW50aW1lLnJ1bnRpbWUuY29uZmlnO1xuICAgICAgICBjdHgudHlwaWEgPSBnZW5lcmF0ZWQudHlwaWFTY2hlbWE7XG4gICAgICAgIGN0eC5jYWxsID0gKG1vZHVsZTogYW55LCBwYXJhbXM6IGFueSkgPT4gX19jYWxsKGN0eCwgbW9kdWxlLCBwYXJhbXMpO1xuICAgICAgICBjdHgub25GaW5hbGx5ID0gb25GaW5hbGx5O1xuICAgICAgICBjdHguXyA9IHJ1bnRpbWU7XG4gICAgICAgIGN0eC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIGN0eC5yYWlzZSA9IHJhaXNlO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8YW55PiA9IHsgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgY29uc3QgbWV0YSA9IChtb2R1bGU/Lm1ldGEgPyBtb2R1bGU/Lm1ldGEgOiB7fSkgYXMgdW5rbm93biBhcyBSZWFkb25seTwkbWV0YT47XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY29udGV4dC5odHRwPy5yZXF1ZXN0Py5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYWxsb3dNZXRob2RzID0gbWV0YT8ubWV0aG9kcyA/PyBbXCJQT1NUXCJdO1xuICAgICAgICAgICAgaWYgKCFhbGxvd01ldGhvZHMuaW5jbHVkZXMob3B0aW9ucy5jb250ZXh0Lmh0dHAucmVxdWVzdC5tZXRob2QpKSB0aHJvdyByZWplY3QoXCJNRVRIT0RfTk9UX0FMTE9XRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRhPy50eXBlU2FmZXR5ID09PSB1bmRlZmluZWQgfHwgbWV0YS50eXBlU2FmZXR5ID09PSB0cnVlIHx8IChBcnJheS5pc0FycmF5KG1ldGEudHlwZVNhZmV0eSkgJiYgbWV0YS50eXBlU2FmZXR5LmluY2x1ZGVzKFwicGFyYW1zXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zKHBhcmFtcykgYXMgSVZhbGlkYXRpb248YW55PjtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB0aHJvdyByZWplY3QoXCJQQVJBTVNfVFlQRV9JTkNPUlJFQ1RcIiwgeyAuLi4odmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXSwgbWVzc2FnZTogYFRoZSB2YWx1ZSAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5wYXRofScgaXMgJyR7KHZhbGlkYXRpb24gYXMgYW55KS5lcnJvcnNbMF0udmFsdWV9Jywgd2hpY2ggZG9lcyBub3QgbWVldCAnJHsodmFsaWRhdGlvbiBhcyBhbnkpLmVycm9yc1swXS5leHBlY3RlZH0nIHJlcXVpcmVtZW50cy5gIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIikgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIiwgeyBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCwgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsIHBhdGg6IG9wdGlvbnMucGF0aCwgbWV0YSwgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0cy52YWx1ZSA9IGF3YWl0IG1vZHVsZS5oYW5kbGVyKG9wdGlvbnMuY29udGV4dCwgcGFyYW1zKTtcblxuICAgICAgICBsZXQgZW1wdHlSZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJlc3VsdHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRzLnZhbHVlID09PSBudWxsIHx8IHJlc3VsdHMudmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGVtcHR5UmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3VsdHMudmFsdWUgPSB7fTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMudmFsdWUpIHx8IHR5cGVvZiByZXN1bHRzLnZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0aHJvdyByZWplY3QoXCJSRVFVRVNUX0ZBSUxcIiwgXCJUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiAnb2JqZWN0Jywgd2hpY2ggaXMgY3VycmVudGx5IGFuICcke3R5cGVvZiB0eXBlb2YgcmVzdWx0cy52YWx1ZX0nLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIikgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsIHJlc3VsdHMsIHJlamVjdCwgcmFpc2UgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBleGVjdXRlSWQsIGhlYWRlcnMsIHBhcmFtcywgcmVzdWx0cywgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LCBtZXRhLCB0eXBlLCBlbXB0eVJlc3VsdCwgZmluYWxlcyB9O1xuICAgIH07XG5cbiAgICBjb25zdCBfX2NhbGwgPSBhc3luYyAoY29udGV4dDogJGNvbnRleHQsIG1vZHVsZTogeyBtZXRhOiBhbnksIGhhbmRsZXI6IGFueSB9LCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICBjb25zdCB7IGhhbmRsZXIgfSA9IGF3YWl0IG1vZHVsZTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIoY29udGV4dCwgcGFyYW1zKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgX19jYWxsLFxuICAgICAgICBfX2V4ZWN1dGUsXG4gICAgfTtcbn0iLAogICAgImltcG9ydCB0eXBlIHsgJGNvbnRleHQsIENvbnRleHRIdHRwLCBSZXN1bHRzLCBMb2dnZXIsICRtZXRhIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJGV2ZW50cyB7XG4gICAgXCIqXCI6IHsga2V5OiBrZXlvZiAkZXZlbnRzLCB2YWx1ZTogYW55IH07XG4gICAgXCJtaWxraW86aHR0cFJlcXVlc3RcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj4gfTtcbiAgICBcIm1pbGtpbzpodHRwUmVzcG9uc2VcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj47IGNvbnRleHQ6ICRjb250ZXh0OyBzdWNjZXNzOiBib29sZWFuIH07XG4gICAgXCJtaWxraW86aHR0cE5vdEZvdW5kXCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IGh0dHA6IENvbnRleHRIdHRwPFJlY29yZDxzdHJpbmcsIGFueT4+IH07XG4gICAgXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBtZXRhOiAkbWV0YTsgY29udGV4dDogJGNvbnRleHQgfTtcbiAgICBcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgbWV0YTogJG1ldGE7IGNvbnRleHQ6ICRjb250ZXh0OyByZXN1bHRzOiBSZXN1bHRzPGFueT4gfTtcbn1cblxuY29uc3QgUkVTT0xWRURfUFJPTUlTRSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXZlbnRNYW5hZ2VyKCkge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgIGNvbnN0IGluZGV4ZWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PChldmVudDogYW55KSA9PiBQcm9taXNlPHZvaWQgfCBib29sZWFuPiB8IHZvaWQgfCBib29sZWFuPj4oKTtcbiAgICBsZXQgX3ZlcnNpb24gPSAwO1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICBvbjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4gfCB2b2lkIHwgYm9vbGVhbj4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIF92ZXJzaW9uKys7XG4gICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhlZC5oYXMoJyonKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlZC5zZXQoJyonLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJykhO1xuICAgICAgICAgICAgICAgIHdpbGRjYXJkU2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkU2V0ID0gaW5kZXhlZC5nZXQoJyonKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mICRldmVudHMsIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6ICRldmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIF92ZXJzaW9uKys7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aWxkY2FyZFNldCA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICAgICAgaWYgKCF3aWxkY2FyZFNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB3aWxkY2FyZFNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVtaXQ6IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBWYWx1ZSBleHRlbmRzICRldmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmRIYW5kbGVycyA9IGluZGV4ZWQuZ2V0KCcqJyk7XG4gICAgICAgICAgICBpZiAoIXdpbGRjYXJkSGFuZGxlcnMgJiYgIWgpIHJldHVybiBSRVNPTFZFRF9QUk9NSVNFO1xuXG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycyAmJiBoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2Ygd2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih7IGtleSwgdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCEpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgX2hhc0VtaXRIYW5kbGVyczogKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlZC5oYXMoa2V5KSB8fCBpbmRleGVkLmhhcygnKicpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgX3ZlcnNpb24oKSB7IHJldHVybiBfdmVyc2lvbjsgfSxcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkSGFuZGxlcnMgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgbGV0IGFjY2VwdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAod2lsZGNhcmRIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXdhaXQgaGFuZGxlcih7IGtleSwgdmFsdWUgfSkpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHZhbHVlKSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2NlcHRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBhc3luYyA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgVmFsdWUgZXh0ZW5kcyAkZXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGRjYXJkSGFuZGxlcnMgPSBpbmRleGVkLmdldCgnKicpO1xuICAgICAgICAgICAgbGV0IGFwcHJvdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh3aWxkY2FyZEhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHdpbGRjYXJkSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHsga2V5LCB2YWx1ZSB9KSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBoYW5kbGVyKHZhbHVlKSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXBwcm92ZWQ7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBldmVudE1hbmFnZXI7XG59XG4iLAogICAgImV4cG9ydCB0eXBlIE1pbGtpb0Zsb3c8VCwgVFJldHVybiA9IGFueSwgVE5leHQgPSBhbnk+ID0ge1xuICBlbWl0OiAoZmxvdzogVCkgPT4gdm9pZDtcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gTWlsa2lvRmxvdzxUPjtcbiAgbmV4dCguLi5bdmFsdWVdOiBbXSB8IFtUTmV4dF0pOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcbiAgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xuICB0aHJvdyhlcnJvcjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvdzxUPigpOiBNaWxraW9GbG93PFQ+IHtcbiAgbGV0IHN0YXR1czogXCJwZW5kaW5nXCIgfCBcInJlc29sdmVkXCIgfCBcInJlamVjdGVkXCIgPSBcInBlbmRpbmdcIjtcbiAgY29uc3QgZmxvd3M6IEFycmF5PHtcbiAgICBibGFuazogYm9vbGVhbjtcbiAgICBwcm9taXNlOiBQcm9taXNlPFQ+O1xuICAgIHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIH0+ID0gW107XG5cbiAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgZW1pdDogKGZsb3c6IFQpID0+IHtcbiAgICAgIGlmIChmbG93cy5hdCgtMSk/LmJsYW5rID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBmbG93cy5hdCgtMSkhO1xuICAgICAgICBpdGVtLmJsYW5rID0gZmFsc2U7XG4gICAgICAgIGl0ZW0ucmVzb2x2ZShmbG93KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzPFQ+KCk7XG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGZsb3cpO1xuICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogZmFsc2UgfSBhcyBhbnkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLi4uKHtcbiAgICAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICBpZiAoc3RhdHVzICE9PSBcInBlbmRpbmdcIikgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbG93ID0gZmxvd3MuYXQoMCkhO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbG93LnByb21pc2U7XG4gICAgICAgIGZsb3dzLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiB7IGRvbmU6IHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICBzdGF0dXMgPSBcInJlc29sdmVkXCI7XG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcbiAgICAgICAgICBmbG93LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICBzdGF0dXMgPSBcInJlamVjdGVkXCI7XG4gICAgICAgIGlmIChmbG93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcbiAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogdHJ1ZSB9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xuICAgICAgICAgIGZsb3cucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgIH0sXG4gICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGl0ZXJhdG9yIGFzIE1pbGtpb0Zsb3c8VD47XG59XG4iLAogICAgImNvbnN0IEVOQ09ESU5HID0gXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuY29uc3QgRU5DT0RJTkdfTEVOID0gRU5DT0RJTkcubGVuZ3RoO1xuXG5sZXQgX19mYXN0SWRQb29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTtcbmxldCBfX2Zhc3RJZFBvb2xJbmRleCA9IDI1NjtcbmxldCBfX2Zhc3RJZENvdW50ZXIgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gX19jcmVhdGVJZCgpOiBzdHJpbmcge1xuICAgIGlmIChfX2Zhc3RJZFBvb2xJbmRleCArIDE2ID4gMjU2KSB7XG4gICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoX19mYXN0SWRQb29sKTtcbiAgICAgICAgX19mYXN0SWRQb29sSW5kZXggPSAwO1xuICAgIH1cbiAgICAvLyDliY0gOCDlrZfnrKY6IOaXtumXtOaIsyBiYXNlMzbvvIhEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSDmm7/ku6MgQmlnSW5077yMfjEwMHgg5pu05b+r77yJXG4gICAgY29uc3QgdHMgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg4LCBcIjBcIik7XG4gICAgLy8g5a2X56ym5Liy5ou85o6l5pu/5LujIEFycmF5LmZyb20gKyBqb2lu77yM6YG/5YWN5pWw57uE5YiG6YWNXG4gICAgbGV0IGlkID0gdHM7XG4gICAgLy8g5Lit6Ze0IDYg5a2X56ymOiDnuq/pmo/mnLpcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICBpZCArPSBFTkNPRElORy5jaGFyQXQoX19mYXN0SWRQb29sW19fZmFzdElkUG9vbEluZGV4KytdISAlIEVOQ09ESU5HX0xFTik7XG4gICAgfVxuICAgIC8vIOWQjiAxMCDlrZfnrKY6IOiuoeaVsOWZqCArIOmaj+acuua3t+WQiFxuICAgIGNvbnN0IGNvdW50ZXIgPSBfX2Zhc3RJZENvdW50ZXIrKztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgY29uc3QgbWl4ID0gKGNvdW50ZXIgKyBfX2Zhc3RJZFBvb2xbX19mYXN0SWRQb29sSW5kZXgrKyAlIDI1Nl0hKSAmIDB4RkZGRjtcbiAgICAgICAgaWQgKz0gRU5DT0RJTkcuY2hhckF0KG1peCAlIEVOQ09ESU5HX0xFTik7XG4gICAgfVxuICAgIHJldHVybiBpZDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuLi91dGlscy9jcmVhdGUtaWQudHNcIjtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZUlkR2VuZXJhdG9yID0gKGhlYWRlcnM/OiBIZWFkZXJzKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yKCkge1xuICByZXR1cm4gX19jcmVhdGVJZDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgdHlwZSAkdHlwZXMsIF9faW5pdExpc3RlbmVyLCBfX2luaXRFeGVjdXRlciwgX19pbml0RXZlbnRNYW5hZ2VyLCB0eXBlIEV4ZWN1dGVJZCwgdHlwZSBMb2dnZXIsIHR5cGUgTWl4aW4sIHR5cGUgR2VuZXJhdGVkSW5pdCwgdHlwZSBQaW5nLCB0eXBlIExvZ2dlclN1Ym1pdHRpbmdIYW5kbGVyLCB0eXBlIExvZ2dlckluc2VydGluZ0hhbmRsZXIsIHR5cGUgQ29yc0NvbmZpZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHsgZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvciB9IGZyb20gXCIuLi9leGVjdXRlL2V4ZWN1dGUtaWQtZ2VuZXJhdG9yLnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlsa2lvSW5pdCB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIGRldmVsb3A6IGJvb2xlYW47XG4gICAgZmV0Y2hFbnY/OiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhY2Nlc3NLZXk/OiBzdHJpbmc7XG4gICAgaHR0cD86IHtcbiAgICAgICAgY29ycz86IENvcnNDb25maWc7XG4gICAgfTtcbiAgICBpZ25vcmVQYXRoTGV2ZWw/OiBudW1iZXI7XG4gICAgcmVhbElwPzogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZztcbiAgICBleGVjdXRlSWQ/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICAgIG9uTG9nZ2VyU3VibWl0dGluZz86IExvZ2dlclN1Ym1pdHRpbmdIYW5kbGVyO1xuICAgIG9uTG9nZ2VySW5zZXJ0aW5nPzogTG9nZ2VySW5zZXJ0aW5nSGFuZGxlcjtcbiAgICBib290c3RyYXBzPzogQXJyYXk8KHdvcmxkOiBhbnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkPjtcbn1cblxuZXhwb3J0IHR5cGUgTWlsa2lvUnVudGltZUluaXQ8VCBleHRlbmRzIE1pbGtpb0luaXQ+ID0gTWl4aW48XG4gICAgVCxcbiAgICB7XG4gICAgICAgIGV4ZWN1dGVJZDogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgICAgICAgcnVudGltZToge1xuICAgICAgICAgICAgcmVxdWVzdDogTWFwPEV4ZWN1dGVJZCwgeyBsb2dnZXI6IExvZ2dlciB9PjtcbiAgICAgICAgICAgIGNvbmZpZzogQXdhaXRlZDxSZXR1cm5UeXBlPCR0eXBlc1tcImdlbmVyYXRlZFwiXVtcImNvbmZpZ1NjaGVtYVwiXT4+O1xuICAgICAgICAgICAgYXBwOiBhbnk7XG4gICAgICAgIH07XG4gICAgICAgIG9uOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib25cIl07XG4gICAgICAgIG9mZjogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcIm9mZlwiXTtcbiAgICAgICAgZW1pdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcImVtaXRcIl07XG4gICAgICAgIGVtaXRBbnlBcHByb3ZlZDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRFdmVudE1hbmFnZXI+PltcImVtaXRBbnlBcHByb3ZlZFwiXTtcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdEFsbEFwcHJvdmVkXCJdO1xuICAgICAgICBfaGFzRW1pdEhhbmRsZXJzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiX2hhc0VtaXRIYW5kbGVyc1wiXTtcbiAgICAgICAgX2VtaXRIYW5kbGVyc1ZlcnNpb246IG51bWJlcjtcbiAgICB9XG4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ybGQ8TWlsa2lvT3B0aW9ucyBleHRlbmRzIE1pbGtpb0luaXQ+KGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgY29uZmlnU2NoZW1hOiB7IGdldDogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+PiB9LCBvcHRpb25zOiBNaWxraW9PcHRpb25zKTogUHJvbWlzZTxNaWxraW9Xb3JsZDxHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zPj4ge1xuICAgIGNvbnN0IGV4ZWN1dGVJZCA9IG9wdGlvbnMuZXhlY3V0ZUlkID8/IGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IoKTtcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCBjb25maWdTY2hlbWEuZ2V0KCk7XG5cbiAgICBjb25zdCBydW50aW1lID0ge1xuICAgICAgICByZXF1ZXN0OiBuZXcgTWFwKCksXG4gICAgICAgIGNvbmZpZyxcbiAgICB9IGFzIE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb09wdGlvbnM+W1wicnVudGltZVwiXTtcblxuICAgIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xuXG4gICAgaWYgKG9wdGlvbnMuYWNjZXNzS2V5KSBvcHRpb25zLmlnbm9yZVBhdGhMZXZlbCA9IG9wdGlvbnMuaWdub3JlUGF0aExldmVsID8gb3B0aW9ucy5pZ25vcmVQYXRoTGV2ZWwgKyAxIDogMTtcblxuICAgIGNvbnN0IF86IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb09wdGlvbnM+ID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBleGVjdXRlSWQsXG4gICAgICAgIHJ1bnRpbWUsXG4gICAgICAgIG9uOiBldmVudE1hbmFnZXIub24sXG4gICAgICAgIG9mZjogZXZlbnRNYW5hZ2VyLm9mZixcbiAgICAgICAgZW1pdDogZXZlbnRNYW5hZ2VyLmVtaXQsXG4gICAgICAgIGVtaXRBbnlBcHByb3ZlZDogZXZlbnRNYW5hZ2VyLmVtaXRBbnlBcHByb3ZlZCxcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBldmVudE1hbmFnZXIuZW1pdEFsbEFwcHJvdmVkLFxuICAgICAgICBfaGFzRW1pdEhhbmRsZXJzOiBldmVudE1hbmFnZXIuX2hhc0VtaXRIYW5kbGVycyxcbiAgICAgICAgX2VtaXRIYW5kbGVyc1ZlcnNpb246IGV2ZW50TWFuYWdlci5fdmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgZXhlY3V0ZXIgPSBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQsIF8pO1xuICAgIGNvbnN0IGxpc3RlbmVyID0gX19pbml0TGlzdGVuZXIoZ2VuZXJhdGVkLCBfLCBleGVjdXRlcik7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBhcHBcbiAgICBjb25zdCB3b3JsZCA9IHtcbiAgICAgICAgXyxcbiAgICAgICAgLy8gZXZlbnQgbWFuYWdlclxuICAgICAgICBvbjogZXZlbnRNYW5hZ2VyLm9uLFxuICAgICAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgICAgIGVtaXQ6IGV2ZW50TWFuYWdlci5lbWl0LFxuICAgICAgICBlbWl0QW55QXBwcm92ZWQ6IGV2ZW50TWFuYWdlci5lbWl0QW55QXBwcm92ZWQsXG4gICAgICAgIGVtaXRBbGxBcHByb3ZlZDogZXZlbnRNYW5hZ2VyLmVtaXRBbGxBcHByb3ZlZCxcbiAgICAgICAgLy8gbGlzdGVuZXJcbiAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgIC8vIGZ1bmN0aW9uXG4gICAgICAgIGNvbmZpZyxcbiAgICB9O1xuXG4gICAgcnVudGltZS5hcHAgPSB3b3JsZDtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuYm9vdHN0cmFwcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBib290c3RyYXAgb2Ygb3B0aW9ucy5ib290c3RyYXBzKSB7XG4gICAgICAgICAgICBhd2FpdCBib290c3RyYXAod29ybGQgYXMgTWlsa2lvV29ybGQ8R2VuZXJhdGVkSW5pdCwgTWlsa2lvT3B0aW9ucz4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZ2VuZXJhdGVkLmhhbmRsZXJTY2hlbWEubG9hZEhhbmRsZXJzKHdvcmxkKSk7XG5cbiAgICBjb25zdCByb3V0ZUtleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWQucm91dGVTY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gICAgY29uc3QgcmF3UGF0aHM6IEFycmF5PHN0cmluZz4gPSBnZW5lcmF0ZWQucmF3U2NoZW1hPy5yYXdQYXRocyA/IEFycmF5LmZyb20oZ2VuZXJhdGVkLnJhd1NjaGVtYS5yYXdQYXRocyBhcyBTZXQ8c3RyaW5nPikgOiBbXTtcbiAgICBjb25zdCBhbGxSb3V0ZXMgPSBbLi4ucm91dGVLZXlzLCAuLi5yYXdQYXRoc107XG4gICAgY29uc29sZS5sb2coYFxcbuKWsyBSb3V0ZXM6XFxuICAgICR7YWxsUm91dGVzLmpvaW4oXCJcXG4gICAgXCIpfVxcbiAgQSB0b3RhbCBvZiAke2FsbFJvdXRlcy5sZW5ndGh9IHJvdXRlcy5gKTtcbiAgICBjb25zb2xlLmxvZyhgXFxu4pazIFNlcnZlcjogaHR0cDovL2xvY2FsaG9zdDoke29wdGlvbnMucG9ydH1gKTtcblxuICAgIHJldHVybiB3b3JsZCBhcyBNaWxraW9Xb3JsZDxHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Xb3JsZDxHZW5lcmF0ZWQgZXh0ZW5kcyBHZW5lcmF0ZWRJbml0LCBNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdCA9IE1pbGtpb0luaXQ+IHtcbiAgICBfOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9PcHRpb25zPjtcbiAgICAvLyBldmVudCBtYW5hZ2VyXG4gICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIEhhbmRsZXIgZXh0ZW5kcyAoZXZlbnQ6IEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4gKCgpID0+IHZvaWQpO1xuICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgSGFuZGxlciBleHRlbmRzIChldmVudDogR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB2b2lkO1xuICAgIGVtaXQ6IDxLZXkgZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbXCJldmVudHNcIl0sIFZhbHVlIGV4dGVuZHMgR2VuZXJhdGVkW1wiZXZlbnRzXCJdW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpID0+IFByb21pc2U8dm9pZD47XG4gICAgZW1pdEFueUFwcHJvdmVkOiA8S2V5IGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wiZXZlbnRzXCJdLCBWYWx1ZSBleHRlbmRzIEdlbmVyYXRlZFtcImV2ZW50c1wiXVtLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGVtaXRBbGxBcHByb3ZlZDogPEtleSBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcImV2ZW50c1wiXSwgVmFsdWUgZXh0ZW5kcyBHZW5lcmF0ZWRbXCJldmVudHNcIl1bS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBwaW5nOiAob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KSA9PiBQcm9taXNlPFBpbmc+O1xuICAgIC8vIGxpc3RlbmVyXG4gICAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcbiAgICBjb25maWc6IFJlYWRvbmx5PEF3YWl0ZWQ8UmV0dXJuVHlwZTwkdHlwZXNbXCJjb25maWdTY2hlbWFcIl1bXCJnZXRcIl0+Pj47XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiB0eXBpYTxUeXBpYUluaXRUIGV4dGVuZHMgVHlwaWFJbml0Pihpbml0OiBUeXBpYUluaXRUKTogVHlwaWE8VHlwaWFJbml0VD4ge1xuICByZXR1cm4gaW5pdCBhcyB1bmtub3duIGFzIFR5cGlhPFR5cGlhSW5pdFQ+O1xufVxuXG5leHBvcnQgdHlwZSBUeXBpYUluaXQgPSAoKSA9PiBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+IHwgUHJvbWlzZTxSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+PjtcblxuZXhwb3J0IHR5cGUgVHlwaWE8VHlwaWFJbml0VCBleHRlbmRzIFR5cGlhSW5pdD4gPSBUeXBpYUluaXRUO1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuaW50ZXJmYWNlIENvb2tib29rRXZlbnQge1xuICB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIjtcbiAgbG9nOiBMb2c7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kQ29va2Jvb2tFdmVudChydW50aW1lOiBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0PiwgZXZlbnQ6IENvb2tib29rRXZlbnQpIHtcbiAgLy8gdHJ5IHtcbiAgLy8gICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OiR7cnVudGltZS5jb29rYm9vay5jb29rYm9va1BvcnR9LyRhY3Rpb25gLCB7XG4gIC8vICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAvLyAgICAgaGVhZGVyczoge1xuICAvLyAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgLy8gICAgIH0sXG4gIC8vICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldmVudCksXG4gIC8vICAgfSk7XG4gIC8vICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAvLyAgICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7XG4gIC8vICAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xuICAvLyAgIH1cbiAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgZXJyb3IpO1xuICAvLyAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBcIklzIENvb2tib29rIGNsb3NlZD8gVGhlcmUgaXMgYW4gYWJub3JtYWxpdHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCBDb29rYm9vay5cIik7XG4gIC8vIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IHNlbmRDb29rYm9va0V2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHNcIjtcblxuZXhwb3J0IHR5cGUgTG9nID0gW1wiKGRlYnVnKVwiIHwgXCIoaW5mbylcIiB8IFwiKHdhcm4pXCIgfCBcIihlcnJvcilcIiB8IFwiKHJlcXVlc3QpXCIgfCBcIihyZXNwb25zZSlcIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgXzoge1xuICAgICAgICBsb2dzOiBBcnJheTxMb2c+O1xuICAgICAgICB0YWdzOiBNYXA8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgc3VibWl0OiAoY29udGV4dDogJGNvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIH07XG4gICAgc2V0VGFnOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIHNldExvZzogKC4uLmxvZzogTG9nKSA9PiB2b2lkO1xuICAgIGRlYnVnOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIGluZm86IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gICAgd2FybjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICBlcnJvcjogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbiAgICByZXF1ZXN0OiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICAgIHJlc3BvbnNlOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xufVxuXG5leHBvcnQgdHlwZSBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyID0gKGxvZzogTG9nKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlciA9IChjb250ZXh0OiAkY29udGV4dCwgbG9nczogQXJyYXk8TG9nPiwgdGFnczogTWFwPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5mdW5jdGlvbiBmYXN0VGltZXN0YW1wKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGAoJHtkLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKX0tJHtTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKX0gJHtTdHJpbmcoZC5nZXRIb3VycygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7U3RyaW5nKGQuZ2V0U2Vjb25kcygpKS5wYWRTdGFydCgyLCBcIjBcIil9KWA7XG59XG5cbi8vIFByZS1jcmVhdGVkIGRlZmF1bHQgaW5zZXJ0aW5nIGhhbmRsZXIgLSBzaGFyZWQgYWNyb3NzIGFsbCBsb2dnZXJzXG5jb25zdCBkZWZhdWx0SW5zZXJ0aW5nID0gKGxvZzogTG9nKTogYm9vbGVhbiA9PiB7XG4gICAgbG9nWzBdID0gYFxcbiR7bG9nWzBdfWAgYXMgYW55O1xuICAgIGNvbnNvbGUubG9nKC4uLmxvZyk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9nZ2VyPE1pbGtpb1J1bnRpbWUgZXh0ZW5kcyBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4gPSBNaWxraW9SdW50aW1lSW5pdDxNaWxraW9Jbml0Pj4ocnVudGltZTogTWlsa2lvUnVudGltZSwgcGF0aDogc3RyaW5nLCBleGVjdXRlSWQ6IHN0cmluZyk6IExvZ2dlciB7XG4gICAgY29uc3QgbG9nZ2VyID0ge30gYXMgTG9nZ2VyO1xuXG4gICAgY29uc3QgbG9nczogQXJyYXk8TG9nPiA9IFtdO1xuICAgIGNvbnN0IHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZyB8fCBkZWZhdWx0SW5zZXJ0aW5nO1xuICAgIGNvbnN0IGhhc1N1Ym1pdHRpbmcgPSAhIXJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nO1xuICAgIGNvbnN0IGlzRGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcblxuICAgIGxvZ2dlci5fID0ge1xuICAgICAgICBsb2dzLFxuICAgICAgICB0YWdzLFxuICAgICAgICBzdWJtaXQ6IChjb250ZXh0OiAkY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFydW50aW1lLm9uTG9nZ2VyU3VibWl0dGluZykgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nKGNvbnRleHQsIGxvZ3MsIHRhZ3MpO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBfX3RhZ1B1c2ggPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICAgIHRhZ3Muc2V0KGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgY29uc3QgX19sb2dQdXNoID0gKGxvZzogTG9nKTogTG9nID0+IHtcbiAgICAgICAgaWYgKCFpbnNlcnRpbmcobG9nKSkgcmV0dXJuIGxvZztcbiAgICAgICAgaWYgKGhhc1N1Ym1pdHRpbmcpIGxvZ3MucHVzaChbLi4ubG9nXSk7XG4gICAgICAgIGlmIChpc0RldmVsb3ApIHZvaWQgc2VuZENvb2tib29rRXZlbnQocnVudGltZSwgeyB0eXBlOiBcIm1pbGtpb0Bsb2dnZXJcIiwgbG9nIH0pO1xuICAgICAgICByZXR1cm4gbG9nO1xuICAgIH07XG5cbiAgICBsb2dnZXIuc2V0VGFnID0gX190YWdQdXNoO1xuICAgIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xuXG4gICAgY29uc3QgZ2V0Tm93ID0gZmFzdFRpbWVzdGFtcDtcblxuICAgIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGRlYnVnKVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgICBsb2dnZXIuaW5mbyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiKGluZm8pXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci53YXJuID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIod2FybilcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIoZXJyb3IpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICAgIGxvZ2dlci5yZXF1ZXN0ID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVxdWVzdClcIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG4gICAgbG9nZ2VyLnJlc3BvbnNlID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCIocmVzcG9uc2UpXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuXG4gICAgcmV0dXJuIGxvZ2dlcjtcbn1cbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XG4gIHN0ZXA6IFN0ZXBGdW5jdGlvbjxTdGFnZVQ+O1xuICBydW46ICgpID0+IFByb21pc2U8UmVtb3ZlXzxTdGFnZVQ+Pjtcbn1cblxudHlwZSBSZW1vdmVfPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xufTtcblxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFN0YWdlVCBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+ID0gPEhhbmRsZXJUIGV4dGVuZHMgKHN0YWdlOiBSZWFkb25seTxTdGFnZVQ+KSA9PiBSZWNvcmQ8YW55LCBhbnk+IHwgUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+Pj4oaGFuZGxlcjogSGFuZGxlclQpID0+IFN0ZXBzPEF3YWl0ZWQ8U3RhZ2VUPiAmIFRvRW1wdHlPYmplY3Q8QXdhaXRlZDxSZXR1cm5UeXBlPEhhbmRsZXJUPj4+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0ZXAoKTogU3RlcHM8e30+IHtcbiAgY29uc3Qgc3RlcENvbnRyb2xsZXIgPSB7XG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxuICAgIF9zdGVwczogW10gYXMgQXJyYXk8KHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pj4sXG4gICAgc3RlcChoYW5kbGVyOiAoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcbiAgICAgIHJldHVybiBzdGVwQ29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgIGxldCBzdGFnZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBDb250cm9sbGVyLl9zdGVwcykge1xuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoc3RhZ2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwiX1wiKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN0ZXBDb250cm9sbGVyIGFzIGFueSBhcyBTdGVwczx7fT47XG59XG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcbiAgICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xuICAgIHByaXZhdGUgY2FjaGU6IE1hcDxzdHJpbmcsIFQgfCBudWxsPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBuZXcgVHJpZU5vZGUoKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBhZGQocGF0aDogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNhY2hlLnNldChwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5jYWNoZS5nZXQocGF0aCk7XG4gICAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcblxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gXCJcIik7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGN1cnJlbnROb2RlLnZhbHVlO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB0aGlzLmNhY2hlLnNldChwYXRoLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEJ5UGFydHMocGFydHM6IHN0cmluZ1tdKTogVCB8IG51bGwge1xuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50Tm9kZS5jaGlsZHJlbi5oYXMocGFydCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5jaGlsZHJlbi5nZXQocGFydCkhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBoYXMocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChwYXRoKSAhPT0gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIFRyaWVOb2RlPFQ+IHtcbiAgICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xuICAgIHZhbHVlOiBUIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29yc0NvbmZpZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb3JzSGVhZGVycyhjb3JzOiBDb3JzQ29uZmlnIHwgdW5kZWZpbmVkLCBvcmlnaW4/OiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd01ldGhvZHMpIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIl0gPSBjb3JzLmNvcnNBbGxvd01ldGhvZHMuam9pbihcIiwgXCIpO1xuICAgIGlmIChjb3JzPy5jb3JzQWxsb3dIZWFkZXJzKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCJdID0gY29ycy5jb3JzQWxsb3dIZWFkZXJzLmpvaW4oXCIsIFwiKTtcbiAgICBpZiAoY29ycz8uY29yc01heEFnZSAhPT0gdW5kZWZpbmVkKSByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlXCJdID0gU3RyaW5nKGNvcnMuY29yc01heEFnZSk7XG4gICAgaWYgKGNvcnM/LmNvcnNBbGxvd09yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGlzV2lsZGNhcmQgPSBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhcIipcIik7XG4gICAgICAgIGlmIChjb3JzLmNvcnNBbGxvd0NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGNyZWRlbnRpYWxzOiB0cnVlLCB0aGUgc3BlYyBmb3JiaWRzIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKi5cbiAgICAgICAgICAgIC8vIEVjaG8gdGhlIHJlcXVlc3Qgb3JpZ2luIGluc3RlYWQgKHdpbGRjYXJkIG1lYW5zIFwiYWxsb3cgYW55IG9yaWdpblwiKS5cbiAgICAgICAgICAgIGlmIChvcmlnaW4gJiYgKGlzV2lsZGNhcmQgfHwgY29ycy5jb3JzQWxsb3dPcmlnaW4uaW5jbHVkZXMob3JpZ2luKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIl0gPSBvcmlnaW47XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiVmFyeVwiXSA9IFwiT3JpZ2luXCI7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHNcIl0gPSBcInRydWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc1dpbGRjYXJkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gXCIqXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbiAmJiBjb3JzLmNvcnNBbGxvd09yaWdpbi5pbmNsdWRlcyhvcmlnaW4pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gb3JpZ2luO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtcIlZhcnlcIl0gPSBcIk9yaWdpblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb3JzPy5jb3JzRXhwb3NlSGVhZGVycyAmJiBjb3JzLmNvcnNFeHBvc2VIZWFkZXJzLmxlbmd0aCA+IDApIHJlc3VsdFtcIkFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzXCJdID0gY29ycy5jb3JzRXhwb3NlSGVhZGVycy5qb2luKFwiLCBcIik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn0iLAogICAgImV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUV4ZWN1dGVJZChleGVjdXRlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gdHlwZW9mIGV4ZWN1dGVJZCA9PT0gXCJzdHJpbmdcIiA/IGV4ZWN1dGVJZCA6IFwiXCI7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXkEtWmEtejAtOV8tXS9nLCBcIlwiKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBleGNlcHRpb25IYW5kbGVyLCByZWplY3QsIHJhaXNlIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1peGluLCBHZW5lcmF0ZWRJbml0LCAkdHlwZXMsIENvbnRleHRIdHRwLCBNaWxraW9SZXNwb25zZVJlamVjdCwgUmVzdWx0cywgTWlsa2lvUmVzcG9uc2VTdWNjZXNzLCBDb3JzQ29uZmlnLCBMb2dnZXIsIExvZyB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuaW1wb3J0IHR5cGUgeyBfX2luaXRFeGVjdXRlciB9IGZyb20gXCIuLi9leGVjdXRlL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBfX2NyZWF0ZUlkIH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xuaW1wb3J0IHsgVHJpZSB9IGZyb20gXCIuLi91dGlscy90cmllLnRzXCI7XG5pbXBvcnQgeyBidWlsZENvcnNIZWFkZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2J1aWxkLWNvcnMtaGVhZGVycy50c1wiO1xuaW1wb3J0IHsgcmV2aXZlSlNPTlBhcnNlIH0gZnJvbSBcIi4uL3V0aWxzL3Jldml2ZS1qc29uLXBhcnNlLnRzXCI7XG5pbXBvcnQgeyBzYW5pdGl6ZUV4ZWN1dGVJZCB9IGZyb20gXCIuLi91dGlscy9zYW5pdGl6ZS1leGVjdXRlLWlkLnRzXCI7XG5cbmV4cG9ydCB0eXBlIE1pbGtpb0h0dHBSZXF1ZXN0ID0gUmVxdWVzdDtcblxuZXhwb3J0IHR5cGUgTWlsa2lvSHR0cFJlc3BvbnNlID0gTWl4aW48XG4gICAgUmVzcG9uc2VJbml0LFxuICAgIHtcbiAgICAgICAgYm9keTogc3RyaW5nIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBCbG9iIHwgbnVsbDtcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgfVxuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdExpc3RlbmVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55LCBleGVjdXRlcjogUmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXhlY3V0ZXI+KSB7XG4gICAgY29uc3QgcG9ydCA9IHJ1bnRpbWUucG9ydDtcbiAgICBjb25zdCB0cmllID0gbmV3IFRyaWU8YW55PigpO1xuICAgIC8vIFByZS1jb21wdXRlIGRlZmF1bHQgQ09SUyBjb25maWcgYW5kIGNhY2hlIGhlYWRlcnMgcGVyIG9yaWdpblxuICAgIGNvbnN0IGNvcnM6IENvcnNDb25maWcgPSB7IGNvcnNBbGxvd01ldGhvZHM6IFtcIlBPU1RcIiwgXCJPUFRJT05TXCJdLCBjb3JzQWxsb3dIZWFkZXJzOiBbXCJDb250ZW50LVR5cGVcIiwgXCJBdXRob3JpemF0aW9uXCJdLCBjb3JzTWF4QWdlOiAwLCAuLi5ydW50aW1lLmh0dHA/LmNvcnMgfTtcbiAgICBjb25zdCBjb3JzSGVhZGVyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCk7XG4gICAgY29uc3QgTUFYX0NPUlNfSEVBREVSU19DQUNIRV9TSVpFID0gMTAyNDtcbiAgICBjb25zdCBnZXRDb3JzSGVhZGVycyA9IChvcmlnaW46IHN0cmluZyB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gb3JpZ2luID8/IFwiXCI7XG4gICAgICAgIGxldCBjYWNoZWQgPSBjb3JzSGVhZGVyc0NhY2hlLmdldChrZXkpO1xuICAgICAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIGlmIChjb3JzSGVhZGVyc0NhY2hlLnNpemUgPj0gTUFYX0NPUlNfSEVBREVSU19DQUNIRV9TSVpFKSBjb3JzSGVhZGVyc0NhY2hlLmNsZWFyKCk7XG4gICAgICAgIGNhY2hlZCA9IGJ1aWxkQ29yc0hlYWRlcnMoY29ycywgb3JpZ2luKTtcbiAgICAgICAgY29yc0hlYWRlcnNDYWNoZS5zZXQoa2V5LCBjYWNoZWQpO1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH07XG4gICAgLy8gUHJlLWNvbXB1dGUgZGVmYXVsdCByZXNwb25zZSBoZWFkZXJzICh3aXRob3V0IG9yaWdpbi1zcGVjaWZpYyBDT1JTKVxuICAgIGNvbnN0IGRlZmF1bHRSZXNwb25zZUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgIH07XG4gICAgLy8gUHJlLWNvbXB1dGUgbWVyZ2VkIGhlYWRlcnMgZm9yIG51bGwgb3JpZ2luIChtb3N0IGNvbW1vbiBjYXNlKVxuICAgIGNvbnN0IGRlZmF1bHRNZXJnZWRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAuLi5nZXRDb3JzSGVhZGVycyhudWxsKSwgLi4uZGVmYXVsdFJlc3BvbnNlSGVhZGVycyB9O1xuXG4gICAgLy8gUHJlLWFsbG9jYXRlIHJlc3BvbnNlIHRlbXBsYXRlIHBhcnRzIGZvciBGYXN0IFBhdGhcbiAgICBjb25zdCBlbXB0eVJlc3VsdFByZWZpeCA9ICd7XCJkYXRhXCI6e30sXCJleGVjdXRlSWRcIjpcIic7XG4gICAgY29uc3QgcmVzdWx0UHJlZml4ID0gJ3tcImRhdGFcIjonO1xuICAgIGNvbnN0IGlkU3VmZml4ID0gJ1wiLFwic3VjY2Vzc1wiOnRydWV9JztcbiAgICAvLyBTaGFyZWQgcmVzcG9uc2Ugb2JqZWN0IGZvciBGYXN0IFBhdGggKGhhbmRsZXIgcmV0dXJucyByZXN1bHQgZGlyZWN0bHksIG5ldmVyIG1vZGlmaWVzIHJlc3BvbnNlKVxuICAgIGNvbnN0IGZhc3RQYXRoUmVzcG9uc2UgPSB7IGJvZHk6IFwiXCIsIHN0YXR1czogMjAwLCBoZWFkZXJzOiBkZWZhdWx0TWVyZ2VkSGVhZGVycyB9O1xuXG4gICAgLy8gRHluYW1pYyBjaGVjayBmb3IgZXZlbnQgaGFuZGxlcnMgd2l0aCB2ZXJzaW9uLWJhc2VkIGNhY2hpbmdcbiAgICBsZXQgY2FjaGVkTm9FbWl0SGFuZGxlcnMgPSB0cnVlO1xuICAgIGxldCBsYXN0RW1pdEhhbmRsZXJzVmVyc2lvbiA9IC0xO1xuICAgIGNvbnN0IGNoZWNrTm9FbWl0SGFuZGxlcnMgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBydW50aW1lLl9lbWl0SGFuZGxlcnNWZXJzaW9uO1xuICAgICAgICBpZiAodiAhPT0gbGFzdEVtaXRIYW5kbGVyc1ZlcnNpb24pIHtcbiAgICAgICAgICAgIGxhc3RFbWl0SGFuZGxlcnNWZXJzaW9uID0gdjtcbiAgICAgICAgICAgIGNhY2hlZE5vRW1pdEhhbmRsZXJzID1cbiAgICAgICAgICAgICAgICAhcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiKSAmJlxuICAgICAgICAgICAgICAgICFydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIikgJiZcbiAgICAgICAgICAgICAgICAhcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86aHR0cFJlcXVlc3RcIikgJiZcbiAgICAgICAgICAgICAgICAhcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86aHR0cFJlc3BvbnNlXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVkTm9FbWl0SGFuZGxlcnM7XG4gICAgfTtcbiAgICBjb25zdCBoYXNPbkxvZ2dlclN1Ym1pdHRpbmcgPSAhIXJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nO1xuXG4gICAgLy8gU2hhcmVkIG5vLW9wIGxvZ2dlciBmb3IgZmFzdCBwYXRoICh1c2VkIHdoZW4gbm8gZXZlbnQgaGFuZGxlcnMpXG4gICAgY29uc3Qgbm9vcExvZ2dlcjogTG9nZ2VyID0ge1xuICAgICAgICBfOiB7IGxvZ3M6IFtdIGFzIGFueSwgdGFnczogbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCksIHN1Ym1pdDogKCkgPT4geyB9IH0sXG4gICAgICAgIHNldFRhZzogKCkgPT4geyB9LFxuICAgICAgICBzZXRMb2c6ICguLi5fbG9nOiBMb2cpID0+ICh7fSBhcyBMb2cpLFxuICAgICAgICBkZWJ1ZzogKF9kZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5fcGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gKHt9IGFzIExvZyksXG4gICAgICAgIGluZm86IChfZGVzY3JpcHRpb246IHN0cmluZywgLi4uX3BhcmFtczogQXJyYXk8dW5rbm93bj4pID0+ICh7fSBhcyBMb2cpLFxuICAgICAgICB3YXJuOiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgZXJyb3I6IChfZGVzY3JpcHRpb246IHN0cmluZywgLi4uX3BhcmFtczogQXJyYXk8dW5rbm93bj4pID0+ICh7fSBhcyBMb2cpLFxuICAgICAgICByZXF1ZXN0OiAoX2Rlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLl9wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiAoe30gYXMgTG9nKSxcbiAgICAgICAgcmVzcG9uc2U6IChfZGVzY3JpcHRpb246IHN0cmluZywgLi4uX3BhcmFtczogQXJyYXk8dW5rbm93bj4pID0+ICh7fSBhcyBMb2cpLFxuICAgIH07XG5cbiAgICAvLyBQcmUtY3JlYXRlIGJhc2UgY29udGV4dCBwcm90b3R5cGUgZm9yIEZhc3QgUGF0aCAoc2hhcmVkIGltbXV0YWJsZSBwcm9wZXJ0aWVzKVxuICAgIC8vIGBjYWxsYCBpcyBkZWZpbmVkIG9uIHByb3RvdHlwZSB0byBhdm9pZCBjcmVhdGluZyBhIGNsb3N1cmUgcGVyIHJlcXVlc3RcbiAgICBjb25zdCBiYXNlQ29udGV4dFByb3RvOiBhbnkgPSB7XG4gICAgICAgIHJlamVjdCxcbiAgICAgICAgZGV2ZWxvcDogcnVudGltZS5kZXZlbG9wLFxuICAgICAgICBsb2dnZXI6IG5vb3BMb2dnZXIsXG4gICAgICAgIGVtaXQ6IHJ1bnRpbWUuZW1pdCxcbiAgICAgICAgZW1pdEFueUFwcHJvdmVkOiBydW50aW1lLmVtaXRBbnlBcHByb3ZlZCxcbiAgICAgICAgZW1pdEFsbEFwcHJvdmVkOiBydW50aW1lLmVtaXRBbGxBcHByb3ZlZCxcbiAgICAgICAgY29uZmlnOiBydW50aW1lLnJ1bnRpbWUuY29uZmlnLFxuICAgICAgICB0eXBpYTogZ2VuZXJhdGVkLnR5cGlhU2NoZW1hLFxuICAgICAgICBvbkZpbmFsbHk6ICgpID0+IHsgfSxcbiAgICAgICAgXzogcnVudGltZSxcbiAgICAgICAgY2FsbChtb2R1bGU6IGFueSwgcDogYW55KSB7IHJldHVybiBleGVjdXRlci5fX2NhbGwodGhpcywgbW9kdWxlLCBwKTsgfSxcbiAgICB9O1xuXG4gICAgLy8gSG90IHBhdGggY2FjaGU6IHByZS1yZXNvbHZlIHRoZSBtb3N0IGNvbW1vbiByb3V0ZVxuICAgIGxldCBjYWNoZWRSb3V0ZVNjaGVtYTogYW55ID0gbnVsbDtcbiAgICBsZXQgY2FjaGVkUGF0aFN0cmluZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLy8gQ2FjaGUgdmFsaWRhdGVQYXJhbXMgYW5kIGhhbmRsZXIgcmVmZXJlbmNlcyB0byBhdm9pZCBwcm9wZXJ0eSBsb29rdXBzXG4gICAgbGV0IGNhY2hlZFZhbGlkYXRlUGFyYW1zOiBhbnkgPSBudWxsO1xuICAgIGxldCBjYWNoZWRIYW5kbGVyOiBhbnkgPSBudWxsO1xuICAgIGxldCBjYWNoZWRTa2lwVmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3QgZmV0Y2ggPSBhc3luYyAob3B0aW9uczoge1xuICAgICAgICByZXF1ZXN0OiBNaWxraW9IdHRwUmVxdWVzdDtcbiAgICAgICAgZW52TW9kZT86IHN0cmluZztcbiAgICAgICAgZW52PzogUmVjb3JkPGFueSwgYW55PjtcbiAgICAgICAgcm91dGVTY2hlbWE/OiBhbnk7XG4gICAgICAgIHJhd1Jlc3BvbnNlPzogYm9vbGVhbjtcbiAgICB9KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgICAgICBjb25zdCBNQVhfQk9EWV9TSVpFID0gMTAgKiAxMDI0ICogMTAyNDtcbiAgICAgICAgY29uc3QgdG9vTGFyZ2UgPSAoKSA9PiByZWplY3QoXCJSRVFVRVNUX1RPT19MQVJHRVwiLCB7IG1heEJvZHlTaXplOiBNQVhfQk9EWV9TSVpFIH0pO1xuICAgICAgICBjb25zdCByZWFkQm9keVRleHQgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZVJlYWQgPSAob3B0aW9ucy5yZXF1ZXN0IGFzIGFueSkuX19ib2R5VGV4dDtcbiAgICAgICAgICAgIGlmIChwcmVSZWFkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByZVJlYWQgPT09IFwic3RyaW5nXCIgJiYgcHJlUmVhZC5sZW5ndGggPiBNQVhfQk9EWV9TSVpFKSB0aHJvdyB0b29MYXJnZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmVSZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IE51bWJlcihvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5nZXQoXCJjb250ZW50LWxlbmd0aFwiKSA/PyBcIjBcIik7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGNvbnRlbnRMZW5ndGgpICYmIGNvbnRlbnRMZW5ndGggPiBNQVhfQk9EWV9TSVpFKSB0aHJvdyB0b29MYXJnZSgpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3QuYm9keSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBvcHRpb25zLnJlcXVlc3QuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gTUFYX0JPRFlfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRvb0xhcmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGV4dCArPSBkZWNvZGVyLmRlY29kZSgpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVzZSBwcmUtcGFzc2VkIG9yaWdpbiBmcm9tIGFkYXB0ZXIgdG8gYXZvaWQgaGVhZGVycy5nZXQoKSBjYWxsXG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX29yaWdpbiA/PyBvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5nZXQoXCJPcmlnaW5cIik7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmVxdWVzdC5tZXRob2QgPT09IFwiT1BUSU9OU1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGdldENvcnNIZWFkZXJzKG9yaWdpbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBwcmUtcGFyc2VkIHBhdGhuYW1lIGFuZCBwYXRoQXJyYXkgaWYgYXZhaWxhYmxlIChmcm9tIGFkYXB0ZXIpLCBvdGhlcndpc2UgcGFyc2VcbiAgICAgICAgY29uc3QgcGF0aG5hbWUgPSAob3B0aW9ucy5yZXF1ZXN0IGFzIGFueSkuX19wYXRobmFtZSA/PyBuZXcgVVJMKG9wdGlvbnMucmVxdWVzdC51cmwpLnBhdGhuYW1lO1xuICAgICAgICBpZiAocGF0aG5hbWUuZW5kc1dpdGgoXCIvZ2VuZXJhdGVfMjA0XCIpKSB7XG4gICAgICAgICAgICBjb25zdCBjb3JzSGVhZGVycyA9IGdldENvcnNIZWFkZXJzKG9yaWdpbik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IDIwNCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIFNlcnZlcjogXCJtaWxraW9cIixcbiAgICAgICAgICAgICAgICAgICAgLi4uY29yc0hlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IGB0ZXh0L3BsYWluOyB0aW1lPSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZVBhdGhBcnJheSA9IChvcHRpb25zLnJlcXVlc3QgYXMgYW55KS5fX3BhdGhBcnJheTtcbiAgICAgICAgbGV0IHBhdGhTdHJpbmc6IHN0cmluZztcbiAgICAgICAgbGV0IHBhdGhBcnJheTogc3RyaW5nW107XG4gICAgICAgIGlmICghcnVudGltZS5hY2Nlc3NLZXkgJiYgKCFydW50aW1lLmlnbm9yZVBhdGhMZXZlbCB8fCBydW50aW1lLmlnbm9yZVBhdGhMZXZlbCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHBhdGhTdHJpbmcgPSBwYXRobmFtZTtcbiAgICAgICAgICAgIHBhdGhBcnJheSA9IHByZVBhdGhBcnJheSA/PyBwYXRobmFtZS5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aEFycmF5ID0gcHJlUGF0aEFycmF5ID8/IHBhdGhuYW1lLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICBpZiAocnVudGltZS5hY2Nlc3NLZXkgJiYgcGF0aEFycmF5LmF0KDApICE9PSBydW50aW1lLmFjY2Vzc0tleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogXCJcIiwgc3RhdHVzOiA0MDMsIGhlYWRlcnM6IGNvcnNIZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogNDAzLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBjb3JzSGVhZGVycyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydW50aW1lLmlnbm9yZVBhdGhMZXZlbCAhPT0gdW5kZWZpbmVkICYmIHJ1bnRpbWUuaWdub3JlUGF0aExldmVsICE9PSAwKSBwYXRoQXJyYXkgPSBwYXRoQXJyYXkuc2xpY2UocnVudGltZS5pZ25vcmVQYXRoTGV2ZWwpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IGAvJHtwYXRoQXJyYXkuam9pbihcIi9cIil9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZS1yZWFkIGJvZHkgdGV4dCBpZiBhdmFpbGFibGUgKGZyb20gYWRhcHRlciksIG90aGVyd2lzZSB1c2UgYXN5bmMgcmVxdWVzdC50ZXh0KClcbiAgICAgICAgY29uc3QgYm9keVRleHQgPSAob3B0aW9ucy5yZXF1ZXN0IGFzIGFueSkuX19ib2R5VGV4dDtcbiAgICAgICAgY29uc3QgaXAgPSBydW50aW1lLnJlYWxJcCA/IHJ1bnRpbWUucmVhbElwKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IFwiOjoxXCI7XG5cbiAgICAgICAgLy8g5rWL6K+V546v5aKD5LiL55qEICRldmVudCDnq6/ngrnvvJrpgJrov4cgYmFzZTY0IOe8lueggeeahOS6i+S7tuWQjeinpuWPkeS6i+S7tlxuICAgICAgICBpZiAob3B0aW9ucy5lbnZNb2RlID09PSBcInRlc3RcIiAmJiBwYXRoU3RyaW5nLnN0YXJ0c1dpdGgoXCIvJGV2ZW50L1wiKSkge1xuICAgICAgICAgICAgY29uc3QgYmFzZTY0TmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoU3RyaW5nLnNsaWNlKDgpKTtcbiAgICAgICAgICAgIGxldCBldmVudE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8g5YW85a655LiN5ZCM6L+Q6KGM5pe277ya5LyY5YWI5L2/55SoIGF0b2LvvIzlm57pgIDliLAgQnVmZmVyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdG9iICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IGF0b2IoYmFzZTY0TmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IEJ1ZmZlci5mcm9tKGJhc2U2NE5hbWUsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYmFzZTY0IGRlY29kZXIgYXZhaWxhYmxlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEXCIsIHJlamVjdDogeyBleHBlY3RlZDogXCJ2YWxpZCBiYXNlNjQgZXZlbnQgbmFtZVwiIH0gfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHksIHN0YXR1czogMjAwLCBoZWFkZXJzOiB7IC4uLmNvcnNIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IH0gYXMgYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVyczogeyAuLi5jb3JzSGVhZGVycywgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGV2ZW50RGF0YTogYW55ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmF3Qm9keSA9IGF3YWl0IHJlYWRCb2R5VGV4dCgpO1xuICAgICAgICAgICAgaWYgKHJhd0JvZHkgJiYgcmF3Qm9keSAhPT0gXCJcIiAmJiByYXdCb2R5ICE9PSBcInt9XCIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBldmVudERhdGEgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShyYXdCb2R5KSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvcnNIZWFkZXJzID0gZ2V0Q29yc0hlYWRlcnMob3JpZ2luKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogZmFsc2UsIGNvZGU6IFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCByZWplY3Q6IHsgZXhwZWN0ZWQ6IFwianNvblwiIH0gfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5LCBzdGF0dXM6IDIwMCwgaGVhZGVyczogeyAuLi5jb3JzSGVhZGVycywgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSB9IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7IHN0YXR1czogMjAwLCBoZWFkZXJzOiB7IC4uLmNvcnNIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gX19jcmVhdGVJZCgpO1xuICAgICAgICAgICAgY29uc3QgY29yc0hlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhvcmlnaW4pO1xuICAgICAgICAgICAgY29uc3QganNvbkhlYWRlcnMgPSB7IC4uLmNvcnNIZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiwgXCJDYWNoZS1Db250cm9sXCI6IFwibm8tc3RvcmVcIiB9O1xuXG4gICAgICAgICAgICAvLyDoh6rliqjms6jlhaUgY29udGV4dCDigJQgZXZlbnQg5pWw5o2u5Lit57qm5a6a5L+X5oiQ55qEIGNvbnRleHQg5Y+C5pWw5peg5rOV55Sx5aSW6YOo5Lyg5Y+C77yM55Sx5pyN5Yqh56uv6KGl5YWo44CCXG4gICAgICAgICAgICAvLyDkuI4gYWN0aW9uIOaJp+ihjOS/neaMgeS4gOiHtO+8muaehOW7uuWujOaVtOeahCBjb250ZXh077yIbG9nZ2VyL2NvbmZpZy90eXBpYS9jYWxsIOetie+8ie+8jOW5tuinpuWPkVxuICAgICAgICAgICAgLy8gbWlsa2lvOmV4ZWN1dGVCZWZvcmUgLyBtaWxraW86aHR0cFJlc3BvbnNlIOS6i+S7tu+8jOS9vyBib290c3RyYXAg5Y+v5Lul5rOo5YWlIGRiL3JlZGlzIOetieiDveWKm+OAglxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiB0eXBlb2YgZXZlbnREYXRhID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGV2ZW50RGF0YSkgJiYgIShcImNvbnRleHRcIiBpbiBldmVudERhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgY29udGV4dC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgICAgICAgICAgY29udGV4dC5yYWlzZSA9IHJhaXNlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGV2ZWxvcCA9IHJ1bnRpbWUuZGV2ZWxvcDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmV4ZWN1dGVJZCA9IGV4ZWN1dGVJZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnBhdGggPSBwYXRoU3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdCA9IHJ1bnRpbWUuZW1pdDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVtaXRBbnlBcHByb3ZlZCA9IHJ1bnRpbWUuZW1pdEFueUFwcHJvdmVkO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdEFsbEFwcHJvdmVkID0gcnVudGltZS5lbWl0QWxsQXBwcm92ZWQ7XG4gICAgICAgICAgICAgICAgY29udGV4dC5fID0gcnVudGltZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbmZpZyA9IHJ1bnRpbWUucnVudGltZS5jb25maWc7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBpYSA9IGdlbmVyYXRlZC50eXBpYVNjaGVtYTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNhbGwgPSAobW9kdWxlOiBhbnksIHBhcmFtczogYW55KSA9PiBleGVjdXRlci5fX2NhbGwoY29udGV4dCwgbW9kdWxlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25GaW5hbGx5ID0gKCkgPT4ge307XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIHBhdGhTdHJpbmcsIGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIgPSBsb2dnZXI7XG4gICAgICAgICAgICAgICAgY29udGV4dC5odHRwID0ge1xuICAgICAgICAgICAgICAgICAgICBpcCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IHN0cmluZzogcmF3Qm9keSA/PyBcIlwiLCBwYXJzZWQ6IGV2ZW50RGF0YSB9LFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBldmVudERhdGEuY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbWl0SHR0cFJlc3BvbnNlID0gKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmh0dHBSZXNwb25zZVwiKSA/PyB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBwYXRoU3RyaW5nLCBodHRwOiBjb250ZXh0Lmh0dHAsIGhlYWRlcnM6IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0LCBzdWNjZXNzLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWFiOinpuWPkSBleGVjdXRlQmVmb3Jl77yIYm9vdHN0cmFwIOazqOWFpSBkYi9yZWRpc++8ie+8jOS6i+S7tuWkhOeQhuWujOaIkOWQjuWGjeinpuWPkVxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwUmVzcG9uc2XvvIjph4rmlL7ov57mjqXvvInvvIzkuI4gYWN0aW9uIOeahOeUn+WRveWRqOacn+S/neaMgeS4gOiHtOOAglxuICAgICAgICAgICAgICAgICAgICBpZiAocnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiKSA/PyB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBwYXRoU3RyaW5nLCBtZXRhOiB7fSwgY29udGV4dCwgcmVqZWN0LCByYWlzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoZXZlbnROYW1lLCBldmVudERhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVtaXRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJSZXN1bHQgPSBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZCwgbG9nZ2VyLCBlbWl0RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZXJyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIdHRwUmVzcG9uc2UoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5OiBlcnJCb2R5LCBzdGF0dXM6IDIwMCwgaGVhZGVyczoganNvbkhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoZXJyQm9keSwgeyBzdGF0dXM6IDIwMCwgaGVhZGVyczoganNvbkhlYWRlcnMgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEh0dHBSZXNwb25zZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChldmVudE5hbWUsIGV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZW1pdEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyclJlc3VsdCA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBub29wTG9nZ2VyLCBlbWl0RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZXJyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmF3UmVzcG9uc2UpIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IGVyckJvZHksIHN0YXR1czogMjAwLCBoZWFkZXJzOiBqc29uSGVhZGVycyB9IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShlcnJCb2R5LCB7IHN0YXR1czogMjAwLCBoZWFkZXJzOiBqc29uSGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBge1wiZGF0YVwiOiR7SlNPTi5zdHJpbmdpZnkoZXZlbnREYXRhID8/IHt9LCAoa2V5LCB2YWx1ZSkgPT4ga2V5ID09PSBcImNvbnRleHRcIiA/IHVuZGVmaW5lZCA6IHZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5LCBzdGF0dXM6IDIwMCwgaGVhZGVyczoganNvbkhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHsgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGpzb25IZWFkZXJzIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT0gRkFTVCBQQVRIIGZvciBjb21tb24gYWN0aW9uIHJlcXVlc3RzID09PT09XG4gICAgICAgIC8vIFNraXAgbG9nZ2VyLCByZXF1ZXN0IG1hcCwgYW5kIG1vc3Qgb2JqZWN0IGNyZWF0aW9uIHdoZW46XG4gICAgICAgIC8vIC0gcmF3UmVzcG9uc2UgbW9kZSAoYWRhcHRlcilcbiAgICAgICAgLy8gLSBObyBvcmlnaW4gaGVhZGVyIChubyBDT1JTIG5lZWRlZClcbiAgICAgICAgLy8gLSBObyBldmVudCBoYW5kbGVycyByZWdpc3RlcmVkIChkeW5hbWljIGNoZWNrKVxuICAgICAgICAvLyAtIE5vdCBhIHN0cmVhbSByZXF1ZXN0XG4gICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlICYmICFvcmlnaW4gJiYgY2hlY2tOb0VtaXRIYW5kbGVycygpKSB7XG4gICAgICAgICAgICBjb25zdCBfX2lzQWN0aW9uID0gKG9wdGlvbnMucmVxdWVzdCBhcyBhbnkpLl9faXNBY3Rpb247XG4gICAgICAgICAgICBpZiAoX19pc0FjdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHJvdXRlIHNjaGVtYSB3aXRoIGhvdCBjYWNoZVxuICAgICAgICAgICAgICAgIGxldCByb3V0ZVNjaGVtYSA9IG9wdGlvbnMucm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFN0cmluZyA9PT0gY2FjaGVkUGF0aFN0cmluZyAmJiBjYWNoZWRSb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBjYWNoZWRSb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQocGF0aFN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRSb3V0ZVNjaGVtYSA9IHJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFBhdGhTdHJpbmcgPSBwYXRoU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW3BhdGhTdHJpbmddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQwNCAtIGZhbGwgdGhyb3VnaCB0byBzbG93IHBhdGggZm9yIHByb3BlciBlcnJvciBoYW5kbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQocGF0aFN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRSb3V0ZVNjaGVtYSA9IHJvdXRlU2NoZW1hO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRQYXRoU3RyaW5nID0gcGF0aFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgJiYgcm91dGVTY2hlbWEudHlwZSA9PT0gXCJhY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY2FjaGVkIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2hlbiBoaXR0aW5nIHRoZSBzYW1lIHJvdXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0ZVBhcmFtcyA9IGNhY2hlZFZhbGlkYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFuZGxlciA9IGNhY2hlZEhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBza2lwVmFsaWRhdGlvbiA9IGNhY2hlZFNraXBWYWxpZGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgIT09IGNhY2hlZFJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhcmFtcyA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IHJvdXRlU2NoZW1hLm1vZHVsZS5oYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IHJvdXRlU2NoZW1hLm1vZHVsZT8ubWV0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uID0gbWV0YT8udHlwZVNhZmV0eSA9PT0gZmFsc2UgfHwgKEFycmF5LmlzQXJyYXkobWV0YT8udHlwZVNhZmV0eSkgJiYgIW1ldGEudHlwZVNhZmV0eS5pbmNsdWRlcyhcInBhcmFtc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRWYWxpZGF0ZVBhcmFtcyA9IHZhbGlkYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRTa2lwVmFsaWRhdGlvbiA9IHNraXBWYWxpZGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gX19jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVhZEJvZHlUZXh0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXM6IGFueTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtc09rID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFib2R5IHx8IGJvZHkgPT09IFwiXCIgfHwgYm9keSA9PT0gXCJ7fVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoYm9keSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSBcInVuZGVmaW5lZFwiKSBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc09rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zT2sgJiYgcGFyYW1zICE9PSBudWxsICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCAkbWlsa2lvR2VuZXJhdGVQYXJhbXMgaW4gdGVzdCBtb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbnZNb2RlID09PSBcInRlc3RcIiB8fCAhKFwiJG1pbGtpb0dlbmVyYXRlUGFyYW1zXCIgaW4gcGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHBhcmFtcyB3aGVuIHR5cGVTYWZldHkgaXMgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZCAtIGZhbGwgdGhyb3VnaCB0byBzbG93IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc09rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zT2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgbWluaW1hbCBjb250ZXh0IHVzaW5nIHByb3RvdHlwZSBmb3Igc2hhcmVkIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dDogYW55ID0gT2JqZWN0LmNyZWF0ZShiYXNlQ29udGV4dFByb3RvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wYXRoID0gcGF0aFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yb3V0ZVR5cGUgPSBcImFjdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmV4ZWN1dGVJZCA9IGV4ZWN1dGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5odHRwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBwYXRobmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcsIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBzdHJpbmc6IGJvZHksIHBhcnNlZDogcGFyYW1zIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBvcHRpb25zLnJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogZmFzdFBhdGhSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaGVhZGVycyA9IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGNvbnRleHQsIHBhcmFtcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19yYXdSZXNwb25zZTogdHJ1ZSwgYm9keTogZW1wdHlSZXN1bHRQcmVmaXggKyBleGVjdXRlSWQgKyBpZFN1ZmZpeCwgc3RhdHVzOiAyMDAsIGhlYWRlcnM6IGRlZmF1bHRNZXJnZWRIZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBfX3Jhd1Jlc3BvbnNlOiB0cnVlLCBib2R5OiByZXN1bHRQcmVmaXggKyBKU09OLnN0cmluZ2lmeShyZXN1bHQpICsgJyxcImV4ZWN1dGVJZFwiOlwiJyArIGV4ZWN1dGVJZCArIGlkU3VmZml4LCBzdGF0dXM6IDIwMCwgaGVhZGVyczogZGVmYXVsdE1lcmdlZEhlYWRlcnMgfSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIHJlc3VsdCB0eXBlIC0gZmFsbCB0aHJvdWdoIHRvIHNsb3cgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZXIgdGhyZXcgLSBmYWxsIHRocm91Z2ggdG8gc2xvdyBwYXRoIGZvciBwcm9wZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09IFNMT1cgUEFUSCA9PT09PVxuICAgICAgICBjb25zdCBjb3JzSGVhZGVycyA9IGdldENvcnNIZWFkZXJzKG9yaWdpbik7XG4gICAgICAgIGNvbnN0IHJhd0V4ZWN1dGVJZCA9IHJ1bnRpbWU/LmV4ZWN1dGVJZCA/IGF3YWl0IHJ1bnRpbWUuZXhlY3V0ZUlkKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IF9fY3JlYXRlSWQoKTtcbiAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gc2FuaXRpemVFeGVjdXRlSWQocmF3RXhlY3V0ZUlkKSB8fCBfX2NyZWF0ZUlkKCk7XG4gICAgICAgIGNvbnN0IGFueUVtaXRIYW5kbGVycyA9ICFjaGVja05vRW1pdEhhbmRsZXJzKCk7XG5cbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIHBhdGhTdHJpbmcsIGV4ZWN1dGVJZCk7XG4gICAgICAgIGlmIChhbnlFbWl0SGFuZGxlcnMpIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LnNldChleGVjdXRlSWQsIHsgbG9nZ2VyIH0pO1xuICAgICAgICAvLyBQcmUtY29tcHV0ZSBiYXNlIGhlYWRlcnMgZm9yIHRoaXMgcmVxdWVzdCAoQ09SUyArIGRlZmF1bHRzKVxuICAgICAgICBjb25zdCBiYXNlSGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IG9yaWdpbiA/IHsgLi4uY29yc0hlYWRlcnMsIC4uLmRlZmF1bHRSZXNwb25zZUhlYWRlcnMgfSA6IGRlZmF1bHRNZXJnZWRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcblxuICAgICAgICBjb25zdCByZXNwb25zZTogTWlsa2lvSHR0cFJlc3BvbnNlID0ge1xuICAgICAgICAgICAgYm9keTogXCJcIixcbiAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgaGVhZGVyczogeyAuLi5iYXNlSGVhZGVycyB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByYXcgcm91dGUg4oCUIHJhdyByb3V0ZXMgYnlwYXNzIGFjdGlvbi9zdHJlYW0gbG9naWNcbiAgICAgICAgLy8gYW5kIGxldCB0aGUgaGFuZGxlciBvd24gdGhlIGZ1bGwgUmVxdWVzdC9SZXNwb25zZSBsaWZlY3ljbGUuXG4gICAgICAgIGNvbnN0IGlzUmF3UGF0aCA9IGdlbmVyYXRlZC5yYXdTY2hlbWE/LnJhd1BhdGhzPy5oYXMocGF0aFN0cmluZykgPz8gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaHR0cDogQ29udGV4dEh0dHAgPSB7XG4gICAgICAgICAgICB1cmw6IHBhdGhuYW1lIGFzIGFueSxcbiAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIC8vIEZvciByYXcgcm91dGVzLCBkb24ndCBjb25zdW1lIHRoZSByZXF1ZXN0IGJvZHkg4oCUIHRoZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgLy8gbmVlZHMgaXQgaW50YWN0LiBUaGUgYm9keSB3aWxsIGJlIHBhc3NlZCB2aWEgdGhlIFJlcXVlc3Qgb2JqZWN0LlxuICAgICAgICAgICAgICAgIHN0cmluZzogaXNSYXdQYXRoID8gXCJcIiA6IChhd2FpdCByZWFkQm9keVRleHQoKSksXG4gICAgICAgICAgICAgICAgcGFyc2VkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICBjb3JzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IGFueSA9IHsgcmVqZWN0LCByYWlzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZW1pdCBoYXMgaGFuZGxlcnMgYmVmb3JlIGF3YWl0aW5nXG4gICAgICAgICAgICBjb25zdCBoYXNIdHRwUmVxdWVzdEhhbmRsZXJzID0gcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86aHR0cFJlcXVlc3RcIikgPz8gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChoYXNIdHRwUmVxdWVzdEhhbmRsZXJzKSBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlcXVlc3RcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIHJlamVjdCwgcmFpc2UgfSk7XG5cbiAgICAgICAgICAgIC8vIOmdniB0ZXN0IOeOr+Wig+S4i+aLpuaIqiAkZXhwb3J0cyDlhoXpg6jot6/lvoRcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudk1vZGUgIT09IFwidGVzdFwiICYmIChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuaW5jbHVkZXMoXCIkXCIpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0LCByYWlzZSB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gPT09PT0gUkFXIFBBVEggPT09PT1cbiAgICAgICAgICAgIC8vIFJhdyByb3V0ZXMgcmVjZWl2ZSBhIG5hdGl2ZSBSZXF1ZXN0IGFuZCByZXR1cm4gYSBuYXRpdmUgUmVzcG9uc2UuXG4gICAgICAgICAgICAvLyBUaGV5IGJ5cGFzcyB0eXBpYSB2YWxpZGF0aW9uLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzdGFyZ2F0ZS5cbiAgICAgICAgICAgIC8vIFVzZSBjYXNlOiBTU0UgcGFzc3Rocm91Z2ggKGUuZy4gT3BlbkFJIHByb3h5KSwgd2ViaG9va3MsIGJpbmFyeS5cbiAgICAgICAgICAgIGlmIChpc1Jhd1BhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByYXdSb3V0ZSA9IGdlbmVyYXRlZC5yYXdTY2hlbWEucm91dGVzW3BhdGhTdHJpbmddO1xuICAgICAgICAgICAgICAgIGlmICghcmF3Um91dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0LCByYWlzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVqZWN0KFwiTk9UX0ZPVU5EXCIsIHsgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIExhenktbG9hZCBtb2R1bGUgb24gZmlyc3QgYWNjZXNzLCB0aGVuIGNhY2hlXG4gICAgICAgICAgICAgICAgbGV0IG1vZHVsZTogYW55ID0gcmF3Um91dGUubW9kdWxlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gYXdhaXQgbW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJhd1JvdXRlLm1vZHVsZSA9IG1vZHVsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IG1vZHVsZT8ubWV0YSA/PyB7fTtcblxuICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCBmdWxsIGNvbnRleHQgKHJhdyBkb2Vzbid0IGdvIHRocm91Z2ggX19leGVjdXRlLFxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIHNldCBhbGwgZmllbGRzIG1hbnVhbGx5IGhlcmUpXG4gICAgICAgICAgICAgICAgY29udGV4dC5odHRwID0gaHR0cDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBodHRwLnJlcXVlc3QuaGVhZGVycztcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRldmVsb3AgPSBydW50aW1lLmRldmVsb3A7XG4gICAgICAgICAgICAgICAgY29udGV4dC5wYXRoID0gcGF0aFN0cmluZztcbiAgICAgICAgICAgICAgICBjb250ZXh0LnJvdXRlVHlwZSA9IFwicmF3XCI7XG4gICAgICAgICAgICAgICAgY29udGV4dC5sb2dnZXIgPSBsb2dnZXI7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0ID0gcnVudGltZS5lbWl0O1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdEFueUFwcHJvdmVkID0gcnVudGltZS5lbWl0QW55QXBwcm92ZWQ7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0QWxsQXBwcm92ZWQgPSBydW50aW1lLmVtaXRBbGxBcHByb3ZlZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmV4ZWN1dGVJZCA9IGV4ZWN1dGVJZDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbmZpZyA9IHJ1bnRpbWUucnVudGltZS5jb25maWc7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBpYSA9IGdlbmVyYXRlZC50eXBpYVNjaGVtYTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNhbGwgPSAobW9kOiBhbnksIHBhcmFtczogYW55KSA9PiBleGVjdXRlci5fX2NhbGwoY29udGV4dCwgbW9kLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQub25GaW5hbGx5ID0gKGhhbmRsZXI6IGFueSkgPT4gZmluYWxlcy51bnNoaWZ0KGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuXyA9IHJ1bnRpbWU7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhZGFwdGVyIHByZS1yZWFkIHRoZSBib2R5IChib2R5VGV4dCBzZXQpLCByZWNvbnN0cnVjdCBhXG4gICAgICAgICAgICAgICAgLy8gUmVxdWVzdCB3aXRoIHRoZSBib2R5IHJlLWluamVjdGVkIHNvIHRoZSBoYW5kbGVyIGNhbiByZWFkIGl0LlxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIG9yaWdpbmFsIHJlcXVlc3QgYm9keSBpcyBzdGlsbCBpbnRhY3QgKHdlIHNraXBwZWRcbiAgICAgICAgICAgICAgICAvLyByZWFkaW5nIGl0IGFib3ZlIGZvciByYXcgcGF0aHMpLlxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJSZXF1ZXN0OiBSZXF1ZXN0ID0gYm9keVRleHQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZXF1ZXN0KG9wdGlvbnMucmVxdWVzdC51cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogb3B0aW9ucy5yZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogYm9keVRleHQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogb3B0aW9ucy5yZXF1ZXN0LnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiBvcHRpb25zLnJlcXVlc3Q7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzOiBSZXN1bHRzPGFueT4gPSB7IHZhbHVlOiB1bmRlZmluZWQgfTtcblxuICAgICAgICAgICAgICAgIGlmIChydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIpID8/IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogcGF0aFN0cmluZywgbWV0YSwgY29udGV4dCwgcmVqZWN0LCByYWlzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByYXdSZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBtb2R1bGUuaGFuZGxlcihjb250ZXh0LCBoYW5kbGVyUmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy52YWx1ZSA9IHJhd1Jlc3BvbnNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUuX2hhc0VtaXRIYW5kbGVycz8uKFwibWlsa2lvOmV4ZWN1dGVBZnRlclwiKSA/PyB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogcGF0aFN0cmluZywgbWV0YSwgY29udGV4dCwgcmVzdWx0cywgcmVqZWN0LCByYWlzZSB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBcHBseSBDT1JTIGhlYWRlcnMgdG8gdGhlIHJhdyByZXNwb25zZVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsSGVhZGVycyA9IG5ldyBIZWFkZXJzKHJhd1Jlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGNvcnNIZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmFsSGVhZGVycy5oYXMoaykpIGZpbmFsSGVhZGVycy5zZXQoaywgdik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzSHR0cFJlc3BvbnNlSGFuZGxlcnMgPSBydW50aW1lLl9oYXNFbWl0SGFuZGxlcnM/LihcIm1pbGtpbzpodHRwUmVzcG9uc2VcIikgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzSHR0cFJlc3BvbnNlSGFuZGxlcnMpIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0LCBzdWNjZXNzOiB0cnVlLCByZWplY3QsIHJhaXNlIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUnVuIG9uRmluYWxseSBoYW5kbGVycyAoYWZ0ZXIgaHR0cFJlc3BvbnNlLCBtYXRjaGluZyBhY3Rpb24gcGF0aCBvcmRlcmluZylcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBhd2FpdCBoYW5kbGVyKCk7IH0gY2F0Y2ggKGVycm9yKSB7IGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhhc09uTG9nZ2VyU3VibWl0dGluZykgYXdhaXQgbG9nZ2VyLl8uc3VibWl0KGNvbnRleHQgYXMgYW55KTtcbiAgICAgICAgICAgICAgICBpZiAoYW55RW1pdEhhbmRsZXJzKSBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmF3UmVzcG9uc2UuYm9keSwge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHJhd1Jlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmF3UmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogZmluYWxIZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLmdldChcIkFjY2VwdFwiKT8uc3RhcnRzV2l0aChcInRleHQvZXZlbnQtc3RyZWFtXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gYWN0aW9uXG4gICAgICAgICAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhvdCBwYXRoOiBjaGVjayBzaW5nbGUtZW50cnkgY2FjaGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhTdHJpbmcgPT09IGNhY2hlZFBhdGhTdHJpbmcgJiYgY2FjaGVkUm91dGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gY2FjaGVkUm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKS5pbmNsdWRlcyhcIiRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIHJvdXRlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCByZWplY3QsIHJhaXNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hZGQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIHJvdXRlU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBob3QgcGF0aCBjYWNoZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUm91dGVTY2hlbWEgPSByb3V0ZVNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFBhdGhTdHJpbmcgPSBwYXRoU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgIT09IFwiYWN0aW9uXCIpIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcInN0cmVhbVwiLCBtZXNzYWdlOiBgTm90IGFjY2VwdGFibGUsIHRoZSBBY2NlcHQgaW4gdGhlIHJlcXVlc3QgaGVhZGVyIHNob3VsZCBiZSBcInRleHQvZXZlbnQtc3RyZWFtXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSBhZGQgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29udGV4dC5odHRwID0gaHR0cDtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmhlYWRlcnMgPSBodHRwLnJlcXVlc3QuaGVhZGVycztcbiAgICAgICAgICAgICAgICBjb250ZXh0LnJvdXRlVHlwZSA9IFwiYWN0aW9uXCI7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBleGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzIGFzIEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogaHR0cC5wYXJhbXMuc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNDb250ZW50VHlwZTogXCJqc29uXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keSA9PT0gXCJcIiAmJiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGVkLmVtcHR5UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjp7fSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtKU09OLnN0cmluZ2lmeShleGVjdXRlZC5yZXN1bHRzLnZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0h0dHBSZXNwb25zZUhhbmRsZXJzID0gcnVudGltZS5faGFzRW1pdEhhbmRsZXJzPy4oXCJtaWxraW86aHR0cFJlc3BvbnNlXCIpID8/IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0h0dHBSZXNwb25zZUhhbmRsZXJzKSBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCBoZWFkZXJzOiBodHRwLnJlcXVlc3QuaGVhZGVycywgY29udGV4dDogZXhlY3V0ZWQuY29udGV4dCwgc3VjY2VzczogdHJ1ZSwgcmVqZWN0LCByYWlzZSB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChmaW5hbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzT25Mb2dnZXJTdWJtaXR0aW5nKSBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIGlmIChhbnlFbWl0SGFuZGxlcnMpIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJhd1Jlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IHJlc3BvbnNlLmJvZHksIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHkgYXMgQm9keUluaXQgfCBudWxsLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmVhbVxuICAgICAgICAgICAgICAgIGxldCByb3V0ZVNjaGVtYSA9IG9wdGlvbnMucm91dGVTY2hlbWE7XG4gICAgICAgICAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgICAgICByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuaW5jbHVkZXMoXCIkXCIpIHx8ICEoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpLmVuZHNXaXRoKFwiflwiKSB8fCByb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgcmVqZWN0LCByYWlzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmllLmFkZChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgcm91dGVTY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcInN0cmVhbVwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJhcHBsaWNhdGlvbi9qc29uXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSByZW1vdmUgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbUNsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtQ2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBmaW5hbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPbkxvZ2dlclN1Ym1pdHRpbmcpIGF3YWl0IGxvZ2dlci5fLnN1Ym1pdChjb250ZXh0IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbnlFbWl0SGFuZGxlcnMpIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb250ZXh0Lmh0dHAgPSBodHRwO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuaGVhZGVycyA9IGh0dHAucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIGNvbnRleHQucm91dGVUeXBlID0gXCJzdHJlYW1cIjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkID0gYXdhaXQgZXhlY3V0ZXIuX19leGVjdXRlKHJvdXRlU2NoZW1hLCB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBodHRwLnBhcmFtcy5zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG4gICAgICAgICAgICAgICAgLy8gU3RyZWFtIHBhdGg6IGNyZWF0ZSBuZXcgaGVhZGVycyBvYmplY3QgdG8gYXZvaWQgcG9sbHV0aW5nIHNoYXJlZCBkZWZhdWx0TWVyZ2VkSGVhZGVyc1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7IC4uLnJlc3BvbnNlLmhlYWRlcnMsIC4uLmJ1aWxkQ29yc0hlYWRlcnMoaHR0cC5jb3JzLCBvcmlnaW4pIH07XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbTogUmVhZGFibGVTdHJlYW07XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2w6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlciB8IFJlYWRhYmxlU3RyZWFtRGVmYXVsdENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZGlyZWN0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcjogUmVhZGFibGVTdHJlYW1EaXJlY3RDb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YTpAJHtKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH0gc2F0aXNmaWVzIE1pbGtpb1Jlc3BvbnNlU3VjY2Vzczxhbnk+KX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoW251bGwsIHZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci53cml0ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZS5yZXR1cm4odW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtKU09OLnN0cmluZ2lmeShbcmVzdWx0LCBudWxsXSl9XFxuXFxuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZS5qcyBvciBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjb250cm9sbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YTpAJHtKU09OLnN0cmluZ2lmeSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH0gc2F0aXNmaWVzIE1pbGtpb1Jlc3BvbnNlU3VjY2Vzczxhbnk+KX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucmVxdWVzdC5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KFtudWxsLCB2YWx1ZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZS5yZXR1cm4odW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YToke0pTT04uc3RyaW5naWZ5KFtyZXN1bHQsIG51bGxdKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gc3RyZWFtO1xuICAgICAgICAgICAgICAgIC8vIFN0cmVhbSBwYXRoOiBjcmVhdGUgbmV3IGhlYWRlcnMgdG8gYXZvaWQgcG9sbHV0aW5nIHNoYXJlZCBvYmplY3RcbiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0geyAuLi5yZXNwb25zZS5oZWFkZXJzLCBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvZXZlbnQtc3RyZWFtXCIsIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLWNhY2hlXCIgfTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0OiBleGVjdXRlZC5jb250ZXh0LCBzdWNjZXNzOiB0cnVlLCByZWplY3QsIHJhaXNlIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzOiBSZXN1bHRzPE1pbGtpb1Jlc3BvbnNlUmVqZWN0PiA9IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZXN1bHRzLnZhbHVlICE9PSB1bmRlZmluZWQpIHJlc3BvbnNlLmJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXN1bHRzLnZhbHVlKTtcbiAgICAgICAgICAgIC8vIEVycm9yIHBhdGg6IGNyZWF0ZSBuZXcgaGVhZGVycyB0byBhdm9pZCBwb2xsdXRpbmcgc2hhcmVkIG9iamVjdFxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHsgLi4ucmVzcG9uc2UuaGVhZGVycywgLi4uY29yc0hlYWRlcnMgfTtcbiAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwUmVzcG9uc2VcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAsIGhlYWRlcnM6IGh0dHAucmVxdWVzdC5oZWFkZXJzLCBjb250ZXh0LCBzdWNjZXNzOiBmYWxzZSwgcmVqZWN0LCByYWlzZSB9KTtcbiAgICAgICAgICAgIC8vIFJ1biBvbkZpbmFsbHkgaGFuZGxlcnMgZXZlbiBvbiBlcnJvciAoaW1wb3J0YW50IGZvciByYXcgcm91dGVzIHdoZXJlXG4gICAgICAgICAgICAvLyB0aGUgaGFuZGxlciBtYXkgaGF2ZSByZWdpc3RlcmVkIGNsZWFudXAgdmlhIGNvbnRleHQub25GaW5hbGx5IGJlZm9yZSB0aHJvd2luZylcbiAgICAgICAgICAgIGlmIChmaW5hbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgICAgICAgICB0cnkgeyBhd2FpdCBoYW5kbGVyKCk7IH0gY2F0Y2ggKGUpIHsgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZSk7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzT25Mb2dnZXJTdWJtaXR0aW5nKSBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgaWYgKGFueUVtaXRIYW5kbGVycykgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYXdSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IF9fcmF3UmVzcG9uc2U6IHRydWUsIGJvZHk6IHJlc3BvbnNlLmJvZHksIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBoZWFkZXJzOiByZXNwb25zZS5oZWFkZXJzIH0gYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5IGFzIEJvZHlJbml0IHwgbnVsbCwgcmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHN0cmVhbUNsb3NlcnM6IE1hcDxzdHJpbmcsIHsgZ2VuZXJhdG9yOiBBc3luY0dlbmVyYXRvcjsgaGFuZGxlQ2xvc2U6IGFueSB9PiA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBoYW5kbGVNZXNzYWdlID0gYXN5bmMgKFxuICAgICAgICBwb3J0OiB7IHBvc3RNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQgfSxcbiAgICAgICAgb3B0aW9uczpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgICAgICAgICBwYXJhbXM/OiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgICAgICAgICAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IFwiUElOR1wiKSB7XG4gICAgICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShcIlBPTkdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zdGFydHNXaXRoKFwiQ0xPU0VfU1RSRUFNOlwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVJZCA9IG9wdGlvbnMuc3Vic3RyaW5nKFwiQ0xPU0VfU1RSRUFNOlwiLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtQ2xvc2VyID0gc3RyZWFtQ2xvc2Vycy5nZXQoZXhlY3V0ZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtQ2xvc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3Nlci5nZW5lcmF0b3IucmV0dXJuKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUNsb3Nlci5oYW5kbGVDbG9zZShcInN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gdHJpZS5nZXQob3B0aW9ucy5wYXRoKTtcbiAgICAgICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICAgICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW29wdGlvbnMucGF0aF07XG4gICAgICAgICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IG9wdGlvbnMucGF0aCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVTY2hlbWEubW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZTtcbiAgICAgICAgICAgIGVsc2Ugcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlKCk7XG4gICAgICAgICAgICB0cmllLmFkZChvcHRpb25zLnBhdGgsIHJvdXRlU2NoZW1hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zLnBhcmFtcyA/PyB7fTtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIG9wdGlvbnMucGF0aCwgb3B0aW9ucy5leGVjdXRlSWQpO1xuICAgICAgICBsZXQgZmluYWxlczogQXJyYXk8KCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4+ID0gW107XG5cbiAgICAgICAgY29uc3QgaHR0cCA9IG5ldyBQcm94eShcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdldDogKHRhcmdldCwgcHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcIm5vdEZvdW5kXCIpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcImNvbnRleHQuaHR0cFwiLCBtZXNzYWdlOiBcIlRoaXMgcmVxdWVzdCB3YXMgaW52b2tlZCB0aHJvdWdoIHRoZSBleGVjdXRlIG1ldGhvZC4gU2luY2Ugbm8gYWN0dWFsIHJlcXVlc3Qgd2FzIGdlbmVyYXRlZCwgdGhlIEhUVFAgbWV0aG9kcyB1bmRlciB0aGUgY29udGV4dCBjYW5ub3QgYmUgYWNjZXNzZWQuXCIgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlQ2xvc2UgPSBhc3luYyAodHlwZTogXCJhY3Rpb25cIiB8IFwic3RyZWFtXCIpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN0cmVhbVwiKSBzdHJlYW1DbG9zZXJzLmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbnNpZGUgb25GaW5hbGx5LlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgbG9nZ2VyLl8uc3VibWl0KGNvbnRleHQgYXMgYW55KTtcbiAgICAgICAgICAgIHJ1bnRpbWUucnVudGltZS5yZXF1ZXN0LmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHsgaHR0cDogaHR0cCwgaGVhZGVycywgcm91dGVUeXBlOiByb3V0ZVNjaGVtYS50eXBlLCByZWplY3QsIHJhaXNlIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlID09PSBcImFjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogb3B0aW9ucy5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1R5cGU6IFwicmF3XCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZShcImFjdGlvblwiKTtcblxuICAgICAgICAgICAgICAgIGlmIChleGVjdXRlZC5lbXB0eVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZExvZ2dlcjogbG9nZ2VyLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVHlwZTogXCJyYXdcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmaW5hbGVzID0gZXhlY3V0ZWQuZmluYWxlcztcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB1bmRlZmluZWQsIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1DbG9zZXJzLnNldChvcHRpb25zLmV4ZWN1dGVJZCwgeyBnZW5lcmF0b3I6IGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUsIGhhbmRsZUNsb3NlIH0pO1xuICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFtudWxsLCB2YWx1ZV0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2UoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB1bmRlZmluZWQsIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihvcHRpb25zLmV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtleGNlcHRpb24uY29kZV0gPSBleGNlcHRpb24ucmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogW3Jlc3VsdCwgbnVsbF0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKFwic3RyZWFtXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZXhjZXB0aW9uSGFuZGxlcihvcHRpb25zLmV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XG4gICAgICAgICAgICBhd2FpdCBsb2dnZXIuXy5zdWJtaXQoY29udGV4dCBhcyBhbnkpO1xuICAgICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IGZhbHNlLCBkYXRhOiB1bmRlZmluZWQsIGVycm9yOiByZXN1bHQsIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydCxcbiAgICAgICAgZmV0Y2gsXG4gICAgICAgIGhhbmRsZU1lc3NhZ2UsXG4gICAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBNaWxraW9SZXNwb25zZVJlamVjdCwgTG9nZ2VyIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJHJlamVjdENvZGUge1xuICAgIFJFUVVFU1RfRkFJTDogYW55O1xuICAgIE5PVF9ERVZFTE9QX01PREU6IHN0cmluZztcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dDogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfTtcbiAgICBOT1RfRk9VTkQ6IHsgcGF0aDogc3RyaW5nIH07XG4gICAgUEFSQU1TX1RZUEVfSU5DT1JSRUNUOiB7IHBhdGg6IHN0cmluZzsgZXhwZWN0ZWQ6IHN0cmluZzsgdmFsdWU6IGFueTsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xuICAgIFJFU1VMVFNfVFlQRV9JTkNPUlJFQ1Q6IHsgcGF0aDogc3RyaW5nOyBleHBlY3RlZDogc3RyaW5nOyB2YWx1ZTogYW55OyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgVU5BQ0NFUFRBQkxFOiB7IGV4cGVjdGVkOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xuICAgIFBBUkFNU19UWVBFX05PVF9TVVBQT1JURUQ6IHsgZXhwZWN0ZWQ6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB8IG51bGw7IHBhcmFtczogc3RyaW5nIH07XG4gICAgUkVTVUxUU19UWVBFX05PVF9TVVBQT1JURUQ6IHsgZXhwZWN0ZWQ6IHN0cmluZyB9O1xuICAgIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogdW5kZWZpbmVkO1xuICAgIE1FVEhPRF9OT1RfQUxMT1dFRDogdW5kZWZpbmVkO1xuICAgIE5FVFdPUktfRVJST1I6IHVuZGVmaW5lZDtcbn1cblxuLy8gcmVqZWN0OiDmi5Lnu53noIHlvaLlvI/vvIznrKzkuIDkuKrlj4LmlbDlv4XpobvmmK/lrZfnrKbkuLLvvIjmi5Lnu53noIHvvInvvIznrKzkuozkuKrlj4LmlbDmmK/lhbfkvZPnmoTplJnor6/mlbDmja5cbi8vIOazqOaEj++8muahhuaetuWGhemDqOeahCByZWplY3Qg5L2/55So5a695p2+57G75Z6L77yM55So5oi35L6nIGNvbnRleHQucmVqZWN0IOeahOS4peagvOexu+Wei+eUsSBkZWNsYXJlcy50cyDkuK3nmoQgTWlsa2lvUmVqZWN0RnVuY3Rpb24g5o+Q5L6bXG5leHBvcnQgZnVuY3Rpb24gcmVqZWN0KGNvZGU6IHN0cmluZywgZGF0YT86IGFueSk6IE1pbGtpb1JlamVjdEVycm9yPGFueSwgYW55PiB7XG4gICAgY29uc3QgZXJyb3IgPSB7ICRtaWxraW9SZWplY3Q6IHRydWUsIGNvZGUsIGRhdGEgfSBhcyBNaWxraW9SZWplY3RFcnJvcjxhbnksIGFueT47XG4gICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gXCJmdW5jdGlvblwiKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvcik7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuXG4vLyByYWlzZTog5a+56LGh5b2i5byP77yM5Lyg5YWl5LiA5LiqIHsg5ouS57ud56CBOiDplJnor6/mlbDmja4gfSDlr7nosaHvvIzlsIbplJnor6/lkJHkuIrmipvlh7rvvIjnsbvkvLwgZ29sYW5nIOeahOaYvuW8j+mUmeivr+WkhOeQhu+8iVxuLy8g5rOo5oSP77ya5qGG5p625YaF6YOo55qEIHJhaXNlIOS9v+eUqOWuveadvuexu+Wei++8jOeUqOaIt+S+pyBjb250ZXh0LnJhaXNlIOeahOS4peagvOexu+Wei+eUsSBkZWNsYXJlcy50cyDkuK3nmoQgTWlsa2lvUmFpc2VGdW5jdGlvbiDmj5DkvptcbmV4cG9ydCBmdW5jdGlvbiByYWlzZShvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBNaWxraW9SZWplY3RFcnJvcjxhbnksIGFueT4ge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGNvZGUgPSBrZXlzWzBdO1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcInJhaXNlKCkgcmVxdWlyZXMgYW4gb2JqZWN0IHdpdGggYXQgbGVhc3Qgb25lIGtleSBhcyB0aGUgcmVqZWN0aW9uIGNvZGVcIik7XG4gICAgY29uc3QgcmVqZWN0RGF0YSA9IG9ialtjb2RlXTtcbiAgICBjb25zdCBlcnJvciA9IHsgJG1pbGtpb1JlamVjdDogdHJ1ZSwgY29kZSwgZGF0YTogcmVqZWN0RGF0YSB9IGFzIE1pbGtpb1JlamVjdEVycm9yPGFueSwgYW55PjtcbiAgICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yKTtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5cbmV4cG9ydCB0eXBlIE1pbGtpb1JlamVjdEVycm9yPENvZGUgZXh0ZW5kcyBrZXlvZiAkcmVqZWN0Q29kZSA9IGtleW9mICRyZWplY3RDb2RlLCBSZWplY3REYXRhIGV4dGVuZHMgJHJlamVjdENvZGVbQ29kZV0gPSAkcmVqZWN0Q29kZVtDb2RlXT4gPSB7IGNvZGU6IENvZGU7IGRhdGE6IFJlamVjdERhdGE7IHN0YWNrOiBzdHJpbmc7ICRtaWxraW9SZWplY3Q6IHRydWUgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkOiBzdHJpbmcsIGxvZ2dlcjogTG9nZ2VyLCBlcnJvcjogTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+IHwgYW55KTogTWlsa2lvUmVzcG9uc2VSZWplY3Qge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIFwidml0ZVNlcnZlclwiIGluIGdsb2JhbFRoaXMpIHtcbiAgICAgICAgdHJ5IHsgKGdsb2JhbFRoaXMgYXMgYW55KS52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoZXJyb3IpOyB9IGNhdGNoIHt9XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBlcnJvcj8uY29kZSA/PyBlcnJvcj8ubmFtZSA/PyBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbm5hbWVkIEV4Y2VwdGlvblwiO1xuXG4gICAgaWYgKGVycm9yPy4kbWlsa2lvUmVqZWN0ID09PSB0cnVlKSB7XG4gICAgICAgIC8vIOmihOacn+WGheeahOS4muWKoeaLkue7ne+8iOetvuWQjeaXoOaViOOAgeWPguaVsOmUmeivr+OAgU5PVF9GT1VORCDnrYnvvInnlKggd2Fybi9pbmZvIOiusOW9le+8jFxuICAgICAgICAvLyDkuI3kuqfnlJ8gZXJyb3Ig5pel5b+X77yM6YG/5YWN5aSW6YOo5peg5pWI6K+35rGC77yI54is6Jmr5omr5o+P562J77yJ5rGh5p+T6ZSZ6K+v5ZGK6K2m44CCXG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBcIk5PVF9GT1VORFwiKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhuYW1lLCBlcnJvcj8uZGF0YT8ucGF0aCA/PyBcIlVua25vd24gcGF0aFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gKGVycm9yPy5zdGFjayA/PyBcIlwiKS5zcGxpdChcIlxcblwiKS5zbGljZSgyKS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4obmFtZSwgYFxcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3I/LmRhdGEpfWAsIGBcXG4ke3N0YWNrfVxcbmApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gZXJyb3I/LnN0YWNrID8/IFwiXCI7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IobmFtZSwgYFxcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3I/LmRhdGEpfWAsIGBcXG4ke3N0YWNrfVxcbmApO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IobmFtZSwgYFxcbiR7ZXJyb3I/LnRvU3RyaW5nKCl9YCwgYFxcbiR7ZXJyb3I/LnN0YWNrfVxcbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogTWlsa2lvUmVzcG9uc2VSZWplY3Q7XG5cbiAgICBpZiAoZXJyb3I/LiRtaWxraW9SZWplY3QgPT09IHRydWUpIHJlc3VsdCA9IHsgc3VjY2VzczogZmFsc2UsIGNvZGU6IGVycm9yLmNvZGUsIHJlamVjdDogZXJyb3IuZGF0YSwgZXhlY3V0ZUlkIH07XG4gICAgZWxzZSByZXN1bHQgPSB7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBcIklOVEVSTkFMX1NFUlZFUl9FUlJPUlwiLCByZWplY3Q6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFP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SUFDSCxJQUFJO0FBQUEsTUFDQSxNQUFNLFFBQVEsT0FBTyxTQUFTO0FBQUEsTUFDOUIsT0FBTyxNQUFNLE1BQU07QUFBQSxFQUFLLEtBQUssVUFBVSxPQUFPLElBQUksS0FBSztBQUFBLEVBQUs7QUFBQSxDQUFTO0FBQUEsTUFDdkUsT0FBTyxHQUFHO0FBQUEsTUFDUixPQUFPLE1BQU0sTUFBTTtBQUFBLEVBQUssT0FBTyxTQUFTLEtBQUs7QUFBQSxFQUFLLE9BQU87QUFBQSxDQUFTO0FBQUE7QUFBQTtBQUFBLEVBSTFFLElBQUk7QUFBQSxFQUVKLElBQUksT0FBTyxrQkFBa0I7QUFBQSxJQUFNLFNBQVMsRUFBRSxTQUFTLE9BQU8sTUFBTSxNQUFNLE1BQU0sUUFBUSxNQUFNLE1BQU0sVUFBVTtBQUFBLEVBQ3pHO0FBQUEsYUFBUyxFQUFFLFNBQVMsT0FBTyxNQUFNLHlCQUF5QixRQUFRLFdBQVcsVUFBVTtBQUFBLEVBRTVGLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjRFQjMwMUU0RjhFQThEOEM2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function sanitizeExecuteId(executeId: string | undefined): string;
|