@milkio/stargate 1.1.3 → 1.2.0
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.d.ts +5 -0
- package/index.js +36 -2
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -47,6 +47,7 @@ export type Ping = [
|
|
|
47
47
|
export declare function createStargate<Generated extends {
|
|
48
48
|
routeSchema: any;
|
|
49
49
|
rejectCode: any;
|
|
50
|
+
events: any;
|
|
50
51
|
}>(stargateOptions: MilkioStargateOptions): Promise<{
|
|
51
52
|
options: MilkioStargateOptions;
|
|
52
53
|
execute<Path extends keyof Generated["routeSchema"]>(path: Path, options: Mixin<ExecuteOptions<Generated["routeSchema"][Path]["types"]["result"]>, {
|
|
@@ -57,6 +58,10 @@ export declare function createStargate<Generated extends {
|
|
|
57
58
|
__cookbook: {
|
|
58
59
|
subscribe: (baseUrl: string) => Promise<any>;
|
|
59
60
|
};
|
|
61
|
+
__astraEmitEvent: (key: any, options?: {
|
|
62
|
+
params?: any;
|
|
63
|
+
headers?: Record<string, string>;
|
|
64
|
+
}) => Promise<any[]>;
|
|
60
65
|
ping(options?: {
|
|
61
66
|
timeout?: number;
|
|
62
67
|
}): Promise<Ping>;
|
package/index.js
CHANGED
|
@@ -412,6 +412,40 @@ async function createStargate(stargateOptions) {
|
|
|
412
412
|
}
|
|
413
413
|
}
|
|
414
414
|
},
|
|
415
|
+
__astraEmitEvent: async (key, options) => {
|
|
416
|
+
const opts = options ?? {};
|
|
417
|
+
if (opts.headers === undefined)
|
|
418
|
+
opts.headers = {};
|
|
419
|
+
if (opts.headers["Content-Type"] === undefined)
|
|
420
|
+
opts.headers["Content-Type"] = "application/json";
|
|
421
|
+
let url;
|
|
422
|
+
if (!resolvedBaseUrl)
|
|
423
|
+
resolvedBaseUrl = await baseUrlPromise;
|
|
424
|
+
let base64Name;
|
|
425
|
+
if (typeof btoa !== "undefined") {
|
|
426
|
+
base64Name = btoa(key);
|
|
427
|
+
} else if (typeof Buffer !== "undefined") {
|
|
428
|
+
base64Name = Buffer.from(key).toString("base64");
|
|
429
|
+
} else {
|
|
430
|
+
throw new Error("No base64 encoder available");
|
|
431
|
+
}
|
|
432
|
+
url = `${resolvedBaseUrl}/$event/${encodeURIComponent(base64Name)}`;
|
|
433
|
+
try {
|
|
434
|
+
const body = JSON.stringify(opts.params) ?? "";
|
|
435
|
+
const response = await $fetch(url, { method: "POST", body, headers: opts.headers });
|
|
436
|
+
const text = await response.text();
|
|
437
|
+
const parsed = reviveJSONParse(JSON.parse(text));
|
|
438
|
+
if (parsed.success !== true) {
|
|
439
|
+
const err = {};
|
|
440
|
+
err[parsed.code] = parsed.reject ?? null;
|
|
441
|
+
return [err, null, { executeId: parsed.executeId }];
|
|
442
|
+
}
|
|
443
|
+
return [null, parsed.data, { executeId: parsed.executeId }];
|
|
444
|
+
} catch (error) {
|
|
445
|
+
const errorPined = { REQUEST_FAIL: error };
|
|
446
|
+
return [errorPined, null, { executeId: "unknown" }];
|
|
447
|
+
}
|
|
448
|
+
},
|
|
415
449
|
async ping(options) {
|
|
416
450
|
return await new Promise(async (resolve) => {
|
|
417
451
|
const url = `${await baseUrlPromise}/generate_204`;
|
|
@@ -707,5 +741,5 @@ export {
|
|
|
707
741
|
createDefaultCacheStorage
|
|
708
742
|
};
|
|
709
743
|
|
|
710
|
-
//# debugId=
|
|
711
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XG4gICAgY2FjaGVTdG9yYWdlPzogQ2FjaGVTdG9yYWdlO1xuICAgIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+O1xuICAgIHNldDogKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zPFQgZXh0ZW5kcyBhbnk+ID0ge1xuICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBjYWNoZVN0cmF0ZWd5PzogQ2FjaGVTdHJhdGVneTtcbiAgICBjYWNoZVRocm90dGxlTXM/OiBudW1iZXI7XG4gICAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJldHJ5U3RyYXRlZ3k/OiBSZXRyeVN0cmF0ZWd5O1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogYW55O1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgIF1cbiAgICB8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBzZXJ2ZXJUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gICAgY29uc3QgJGZldGNoID0gc3RhcmdhdGVPcHRpb25zLmZldGNoID8/IGZldGNoO1xuICAgIGNvbnN0ICRhYm9ydCA9IHN0YXJnYXRlT3B0aW9ucy5hYm9ydCA/PyBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICB0eXBlIFN0YXJnYXRlRXZlbnRzID0ge1xuICAgICAgICAnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT4gfTtcbiAgICAgICAgJ21pbGtpbzpmZXRjaEJlZm9yZSc6IHsgcGF0aDogc3RyaW5nOyBvcHRpb25zOiBNaXhpbjxFeGVjdXRlT3B0aW9uczxhbnk+LCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PjsgYm9keTogc3RyaW5nIH07XG4gICAgICAgICdtaWxraW86ZXhlY3V0ZUVycm9yJzoge1xuICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47XG4gICAgICAgICAgICBlcnJvcjogUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT47XG4gICAgICAgICAgICBoYW5kbGVFcnJvcjogPEsgZXh0ZW5kcyBrZXlvZiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPj4oZXJyb3I6IGFueSwga2V5OiBLLCBoYW5kbGVyOiAoZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ11bS10+KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlRXJyb3I6IGFueSA9IGFzeW5jIChlcnJvcjogYW55LCBrZXk6IHN0cmluZywgaGFuZGxlcjogKGVycm9yOiBhbnkpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBhd2FpdCBoYW5kbGVyKGVycm9yW2tleV0pO1xuICAgICAgICAgICAgaWYgKGhhbmRsZWQpIGRlbGV0ZSBlcnJvcltrZXldO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IF9faW5pdEV2ZW50TWFuYWdlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IGluZGV4ZWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PChldmVudDogYW55KSA9PiB2b2lkPj4oKTtcblxuICAgICAgICBjb25zdCBldmVudE1hbmFnZXIgPSB7XG4gICAgICAgICAgICBvbjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhlZC5oYXMoa2V5IGFzIHN0cmluZykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZWQuc2V0KGtleSBhcyBzdHJpbmcsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpITtcbiAgICAgICAgICAgICAgICBzZXQuYWRkKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW1pdDogYXN5bmMgPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBWYWx1ZSBleHRlbmRzIFN0YXJnYXRlRXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZXZlbnRNYW5hZ2VyO1xuICAgIH07XG5cbiAgICBjb25zdCBldmVudE1hbmFnZXIgPSBfX2luaXRFdmVudE1hbmFnZXIoKTtcblxuICAgIGNvbnN0IGJvb3RzdHJhcCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGJhc2VVcmwgPSBzdGFyZ2F0ZU9wdGlvbnMuYmFzZVVybDtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSAnZnVuY3Rpb24nKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG5cbiAgICAgICAgcmV0dXJuIGJhc2VVcmw7XG4gICAgfTtcblxuICAgIGNvbnN0IGJhc2VVcmxQcm9taXNlOiBQcm9taXNlPHN0cmluZz4gPSBib290c3RyYXAoKTtcbiAgICAvLyBDYWNoZSByZXNvbHZlZCBiYXNlVXJsIHRvIGF2b2lkIGF3YWl0IG92ZXJoZWFkIG9uIHJlcGVhdGVkIGNhbGxzXG4gICAgbGV0IHJlc29sdmVkQmFzZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLy8gQ2FjaGUgVVJMIGZvciBsYXN0IHBhdGggdG8gYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb24gcGVyIHJlcXVlc3RcbiAgICBsZXQgY2FjaGVkVXJsUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNhY2hlZFVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBzdGFyZ2F0ZSA9IHtcbiAgICAgICAgLi4uZXZlbnRNYW5hZ2VyLFxuICAgICAgICBvcHRpb25zOiBzdGFyZ2F0ZU9wdGlvbnMsXG4gICAgICAgIGFzeW5jIGV4ZWN1dGU8UGF0aCBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXT4oXG4gICAgICAgICAgICBwYXRoOiBQYXRoLFxuICAgICAgICAgICAgb3B0aW9uczogTWl4aW48XG4gICAgICAgICAgICAgICAgRXhlY3V0ZU9wdGlvbnM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT4sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM/OiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3BhcmFtcyddO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID4sXG4gICAgICAgICk6IFByb21pc2U8XG4gICAgICAgICAgICBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ/CfpZsnXSBleHRlbmRzIGJvb2xlYW5cbiAgICAgICAgICAgID8gLy8gYWN0aW9uXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddLCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT5dLCB1bmRlZmluZWQ+LCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICAgICAgPiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycyA9IHt9O1xuXG4gICAgICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5iYXNlVXJsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSAnZnVuY3Rpb24nKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlVXJsLmVuZHNXaXRoKCcvJykpIGJhc2VVcmwgPSBiYXNlVXJsLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICB1cmwgPSBiYXNlVXJsICsgKHBhdGggYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJhc2VVcmwpIHJlc29sdmVkQmFzZVVybCA9IGF3YWl0IGJhc2VVcmxQcm9taXNlO1xuICAgICAgICAgICAgICAgIC8vIENhY2hlIFVSTCBmb3IgcmVwZWF0ZWQgcGF0aCB0byBhdm9pZCBzdHJpbmcgY29uY2F0ZW5hdGlvblxuICAgICAgICAgICAgICAgIGlmIChwYXRoID09PSBjYWNoZWRVcmxQYXRoICYmIGNhY2hlZFVybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBjYWNoZWRVcmw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gcmVzb2x2ZWRCYXNlVXJsICsgKHBhdGggYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVXJsUGF0aCA9IHBhdGggYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjYWNoZWRVcmwgPSB1cmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIShwYXRoIGFzIHN0cmluZykuZW5kc1dpdGgoJ34nKSkge1xuICAgICAgICAgICAgICAgIC8vIGFjdGlvblxuICAgICAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0IGhlYWRlcnMgb25seSBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IG9wdGlvbnMuaGVhZGVycztcbiAgICAgICAgICAgICAgICBpZiAoaC5BY2NlcHQgPT09IHVuZGVmaW5lZCkgaC5BY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICAgICAgaWYgKGhbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIGhbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVTdHJhdGVneSA9IG9wdGlvbnMuY2FjaGVTdHJhdGVneSA/PyAnb2ZmJztcbiAgICAgICAgICAgICAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gdHJ1ZSB8fCBvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCA9IDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPSBvcHRpb25zLnJldHJ5U3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiBubyBjYWNoZSwgbm8gcmV0cnlcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSA9PT0gJ29mZicgJiYgcmV0cnlDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpmZXRjaEJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyW3BhcnNlZC5jb2RlXSA9IHBhcnNlZC5yZWplY3QgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2VyciwgbnVsbCwgeyBleGVjdXRlSWQ6IHBhcnNlZC5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIHBhcnNlZC5kYXRhLCB7IGV4ZWN1dGVJZDogcGFyc2VkLmV4ZWN1dGVJZCB9XTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkOiAnJyB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3JQaW5lZCwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlVGhyb3R0bGVNcyA9IG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID8/IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBnZW5lcmF0ZUNhY2hlS2V5KHBhdGggYXMgc3RyaW5nLCBvcHRpb25zLnBhcmFtcyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgY2FjaGVTdG9yYWdlID0gc3RhcmdhdGVPcHRpb25zLmNhY2hlU3RvcmFnZTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgIWNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBjYWNoZVN0b3JhZ2UgPSBhd2FpdCBjcmVhdGVEZWZhdWx0Q2FjaGVTdG9yYWdlKHsgZW5jcnlwdGlvbjogc3RhcmdhdGVPcHRpb25zLmNhY2hlRW5jcnlwdGlvbiB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlICYmIG9wdGlvbnMub25DYWNoZUhpdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLm9uQ2FjaGVIaXQoY2FjaGVkLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG9uQ2FjaGVIaXQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSA9PT0gJ3Rocm90dGxlJyAmJiBjYWNoZVN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGVTdG9yYWdlLmdldChjYWNoZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC50aW1lc3RhbXAgPCBjYWNoZVRocm90dGxlTXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgY2FjaGVkLmRhdGEsIHsgZXhlY3V0ZUlkOiAnY2FjaGVkJyB9XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZXF1ZXN0ID0gYXN5bmMgKGlzUmV0cnk6IGJvb2xlYW4pOiBQcm9taXNlPHsgcmVzdWx0OiB7IHZhbHVlOiBSZWNvcmQ8YW55LCBhbnk+IH0gfCBudWxsOyBlcnJvcjogYW55OyBpc05ldHdvcmtFcnJvcjogYm9vbGVhbiB9PiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHksIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiB7IHZhbHVlOiBwYXJzZWQgfSwgZXJyb3I6IG51bGwsIGlzTmV0d29ya0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc05ldHdvcmtFcnJvciA9ICFlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG51bGwsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGxldCB7IHJlc3VsdCwgZXJyb3IsIGlzTmV0d29ya0Vycm9yIH0gPSBhd2FpdCBleGVjdXRlUmVxdWVzdChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCByZXRyeUluZGV4ID0gMDsgcmV0cnlJbmRleCA8IHJldHJ5Q291bnQgJiYgZXJyb3IgJiYgaXNOZXR3b3JrRXJyb3I7IHJldHJ5SW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJldHJ5UmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXRyeVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgaXNOZXR3b3JrRXJyb3IgPSByZXRyeVJlc3VsdC5pc05ldHdvcmtFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSAmJiBpc05ldHdvcmtFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGVTdG9yYWdlLmdldChjYWNoZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBjYWNoZWQuZGF0YSwgeyBleGVjdXRlSWQ6ICdjYWNoZWQnIH1dIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yOiBlcnJvclBpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yUGluZWQsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCEudmFsdWUuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBlcnJbcmVzdWx0IS52YWx1ZS5jb2RlXSA9IHJlc3VsdCEudmFsdWUucmVqZWN0ID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2VyciwgbnVsbCwgeyBleGVjdXRlSWQ6IHJlc3VsdCEudmFsdWUuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FjaGVTdG9yYWdlLnNldChjYWNoZUtleSwgcmVzdWx0IS52YWx1ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdCEudmFsdWUuZGF0YSwgeyBleGVjdXRlSWQ6IHJlc3VsdCEudmFsdWUuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZVN0cmF0ZWd5ID0gJ29mZic7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vbkNhY2hlSGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9ICd0ZXh0L2V2ZW50LXN0cmVhbSc7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PGFueT4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxhbnk+KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiAocmVhc29uOiBhbnkpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFja3NJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGxldCBzdHJlYW1SZXN1bHQ6IGFueTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1SZXN1bHRGZXRjaGVkID0gd2l0aFJlc29sdmVyczx1bmRlZmluZWQ+KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0sIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb25tZXNzYWdlID0gKGV2ZW50OiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEuc2xpY2UoMSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbeyBSRVFVRVNUX0ZBSUw6IGVycm9yIH0sIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsrc3RhY2tzSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMhLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMhLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWw6IGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3RleHQvZXZlbnQtc3RyZWFtJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbnRlbnQtdHlwZSB0byBiZSAkeyd0ZXh0L2V2ZW50LXN0cmVhbSd9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHsgUkVRVUVTVF9GQUlMOiBlcnIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdm9pZCBjcmVhdGUoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXggLSAyKSkgc3RhY2tzLmRlbGV0ZShpbmRleCAtIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBzdHJlYW1SZXN1bHQ/LmV4ZWN1dGVJZCA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ05FVFdPUktfRVJST1InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ05ldHdvcmsgRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUNsaWVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW19pbmRleCwgc3RhY2tdIG9mIHN0YWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suZG9uZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICAgICAgICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzdHJlYW1SZXN1bHRGZXRjaGVkLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgaXRlcmF0b3IsIHsgZXhlY3V0ZUlkOiBzdHJlYW1SZXN1bHQuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgX19jb29rYm9vazoge1xuICAgICAgICAgICAgc3Vic2NyaWJlOiBhc3luYyAoYmFzZVVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgQWNjZXB0OiAndGV4dC9ldmVudC1zdHJlYW0nLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFja3M6IE1hcDxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2tzSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaChgJHtiYXNlVXJsfS8kc3Vic2NyaWJlYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWw6IGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3RleHQvZXZlbnQtc3RyZWFtJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbnRlbnQtdHlwZSB0byBiZSAkeyd0ZXh0L2V2ZW50LXN0cmVhbSd9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdm9pZCBjcmVhdGUoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXggLSAyKSkgc3RhY2tzLmRlbGV0ZShpbmRleCAtIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICAgICAgICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBwaW5nKG9wdGlvbnM/OiB7IHRpbWVvdXQ/OiBudW1iZXIgfSk6IFByb21pc2U8UGluZz4ge1xuICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxQaW5nPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke2F3YWl0IGJhc2VVcmxQcm9taXNlfS9nZW5lcmF0ZV8yMDRgO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0c1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3I6IHsgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9IH0sIG51bGxdKTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdIRUFEJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfRkFJTDogeyByZXNwb25zZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6ICdTdGF0dXMgY29kZSBub3QgMjA0JyB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbbnVsbCwgeyBjb25uZWN0OiB0cnVlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBzZXJ2ZXJUaW1lc3RhbXA6IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykhLnN1YnN0cmluZygxNykpIH1dKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvciB9LCBudWxsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgJHR5cGVzOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZDtcbiAgICAgICAgICAgIGVycm9yOiBHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXTtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXV06IEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncGFyYW1zJ107XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0czoge1xuICAgICAgICAgICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXV06IEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsn8J+lmyddIGV4dGVuZHMgYm9vbGVhblxuICAgICAgICAgICAgICAgID8gLy8gYWN0aW9uXG4gICAgICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXVxuICAgICAgICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICAgICAgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+XSwgdW5kZWZpbmVkPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBzdGFyZ2F0ZTtcbn1cblxuY29uc3QgaXNvRGF0ZVBhdHRlcm4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDN9KT8pKFp8WystXVxcZHsyfTo/XFxkezJ9KT8kLztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XG4gICAgaWYgKGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4ganNvbjtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGpzb247XG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBqc29uLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXZpdmVKU09OUGFyc2UoanNvbltpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0ganNvbltpXSkganNvbltpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uIGFzIG9iamVjdCk7XG4gICAgICAgIGNvbnN0IG9iaiA9IGpzb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXZpdmVKU09OUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdmFsdWUpIG9ialtrZXldID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc3RyID0ganNvbiBhcyB1bmtub3duIGFzIHN0cmluZztcbiAgICAgICAgLy8gUXVpY2sgcmVqZWN0OiBJU08gZGF0ZSBzdHJpbmdzIG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0IGFuZCBjb250YWluICdUJ1xuICAgICAgICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICBpZiAobGVuID49IDIwICYmIGxlbiA8PSAzMiAmJiBzdHIuY2hhckNvZGVBdCgwKSA+PSAweDMwICYmIHN0ci5jaGFyQ29kZUF0KDApIDw9IDB4MzkgJiYgc3RyLmluZGV4T2YoJ1QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc3RyLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvblBvcyA9IG1hdGNoWzJdLmNoYXJDb2RlQXQoMykgPT09IDU4ID8gbWF0Y2hbMV0ubGVuZ3RoICsgMyA6IC0xO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb25Qb3MgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0ci5zdWJzdHJpbmcoMCwgY29sb25Qb3MpICsgc3RyLnN1YnN0cmluZyhjb2xvblBvcyArIDEpKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0cikgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbMV0gKyAnWicpIGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlU3RyZWFtT3B0aW9ucyB7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlTY2hlbWFFeHRlbmQge1xuICAgIGFwaVZhbGlkYXRvcjoge1xuICAgICAgICBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICAgICAgICB2YWxpZGF0ZTogUmVjb3JkPGFueSwgYW55PjtcbiAgICB9O1xuICAgIGFwaU1ldGhvZHNTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gICAgYXBpTWV0aG9kc1R5cGVTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gICAgYXBpVGVzdHNTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG59XG5cbmV4cG9ydCB0eXBlIEZhaWxDb2RlRXh0ZW5kID0gUmVjb3JkPGFueSwgKC4uLmFyZ3M6IEFycmF5PGFueT4pID0+IGFueT47XG5cbmV4cG9ydCB0eXBlIEJvb3RzdHJhcE1pZGRsZXdhcmUgPSAoZGF0YTogeyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgQmVmb3JlRXhlY3V0ZU1pZGRsZXdhcmUgPSAoZGF0YTogeyBwYXRoOiBzdHJpbmc7IHBhcmFtczogYW55OyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgQWZ0ZXJFeGVjdXRlTWlkZGxld2FyZSA9IChkYXRhOiB7IHBhdGg6IHN0cmluZzsgcmVzdWx0OiB7IHZhbHVlOiBhbnkgfTsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBNaWRkbGV3YXJlT3B0aW9ucyB7XG4gICAgYm9vdHN0cmFwPzogQm9vdHN0cmFwTWlkZGxld2FyZTtcbiAgICBiZWZvcmVFeGVjdXRlPzogQmVmb3JlRXhlY3V0ZU1pZGRsZXdhcmU7XG4gICAgYWZ0ZXJFeGVjdXRlPzogQWZ0ZXJFeGVjdXRlTWlkZGxld2FyZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRTdG9yYWdlIHtcbiAgICBnZXRJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gICAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUmVzdWx0U3VjY2VzczxSZXN1bHQ+IHtcbiAgICBleGVjdXRlSWQ6IHN0cmluZztcbiAgICBzdWNjZXNzOiB0cnVlO1xuICAgIGRhdGE6IFJlc3VsdDtcbn1cblxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yR2VuZXJpYzxUPiA9IFQgZXh0ZW5kcyBBc3luY0dlbmVyYXRvcjxpbmZlciBJPiA/IEkgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgRmxhdHRlbktleXM8VCwgUHJlZml4IGV4dGVuZHMgc3RyaW5nID0gJyc+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0ID8gRmxhdHRlbktleXM8VFtLXSwgYCR7UHJlZml4fSR7RXhjbHVkZTxLLCBzeW1ib2w+fS5gPiA6IGAkaW5wdXQuJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59YDtcbn1ba2V5b2YgVF07XG5cbi8vICoqKiBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgaXMgYmFzZWQgb24gYEBtaWNyb3NvZnQvZmV0Y2gtZXZlbnQtc291cmNlYCByZXdyaXRlLCB0aGFua3MgdG8gdGhlIHdvcmsgb2YgTWljcm9zb2Z0ICoqKiAvL1xuLy8gKioqIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZS9mZXRjaC1ldmVudC1zb3VyY2UvYmxvYi9tYWluL3NyYy9wYXJzZS50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqIC8vXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugc2VudCBpbiBhbiBldmVudCBzdHJlYW1cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TZXJ2ZXItc2VudF9ldmVudHMvVXNpbmdfc2VydmVyLXNlbnRfZXZlbnRzI0V2ZW50X3N0cmVhbV9mb3JtYXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudFNvdXJjZU1lc3NhZ2Uge1xuICAgIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFJlYWRhYmxlU3RyZWFtIGludG8gYSBjYWxsYmFjayBwYXR0ZXJuLlxuICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgUmVhZGFibGVTdHJlYW0uXG4gKiBAcGFyYW0gb25DaHVuayBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgYnl0ZSBjaHVuayBpbiB0aGUgc3RyZWFtLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sIG9uQ2h1bms6IChhcnI6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgbGV0IHJlc3VsdDogUmVhZGFibGVTdHJlYW1SZWFkUmVzdWx0PFVpbnQ4QXJyYXk+O1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aGlsZSAoIShyZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpKS5kb25lKSB7XG4gICAgICAgIG9uQ2h1bmsocmVzdWx0LnZhbHVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUGFyc2VzIGFyYml0YXJ5IGJ5dGUgY2h1bmtzIGludG8gRXZlbnRTb3VyY2UgbGluZSBidWZmZXJzLlxuICogRWFjaCBsaW5lIHNob3VsZCBiZSBvZiB0aGUgZm9ybWF0IFwiZmllbGQ6IHZhbHVlXCIgYW5kIGVuZHMgd2l0aCBcXHIsIFxcbiwgb3IgXFxyXFxuLlxuICogQHBhcmFtIG9uTGluZSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgRXZlbnRTb3VyY2UgbGluZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIGluY29taW5nIGJ5dGUgY2h1bmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lcyhvbkxpbmU6IChsaW5lOiBVaW50OEFycmF5LCBmaWVsZExlbmd0aDogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcG9zaXRpb246IG51bWJlcjsgLy8gY3VycmVudCByZWFkIHBvc2l0aW9uXG4gICAgbGV0IGZpZWxkTGVuZ3RoOiBudW1iZXI7IC8vIGxlbmd0aCBvZiB0aGUgYGZpZWxkYCBwb3J0aW9uIG9mIHRoZSBsaW5lXG4gICAgbGV0IGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcblxuICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rOlxuICAgIHJldHVybiBmdW5jdGlvbiBvbkNodW5rKGFycjogVWludDhBcnJheSkge1xuICAgICAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IGFycjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSdyZSBzdGlsbCBwYXJzaW5nIHRoZSBvbGQgbGluZS4gQXBwZW5kIHRoZSBuZXcgYnl0ZXMgaW50byBidWZmZXI6XG4gICAgICAgICAgICBidWZmZXIgPSBjb25jYXQoYnVmZmVyLCBhcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmTGVuZ3RoID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgbGV0IGxpbmVTdGFydCA9IDA7IC8vIGluZGV4IHdoZXJlIHRoZSBjdXJyZW50IGxpbmUgc3RhcnRzXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IGJ1Zkxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGRpc2NhcmRUcmFpbGluZ05ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW3Bvc2l0aW9uXSA9PT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0ID0gKytwb3NpdGlvbjsgLy8gc2tpcCB0byBuZXh0IGNoYXJcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yd2FyZCB0aWxsIHRoZSBlbmQgb2YgbGluZTpcbiAgICAgICAgICAgIGxldCBsaW5lRW5kID0gLTE7IC8vIGluZGV4IG9mIHRoZSBcXHIgb3IgXFxuIGNoYXJcbiAgICAgICAgICAgIGZvciAoOyBwb3NpdGlvbiA8IGJ1Zkxlbmd0aCAmJiBsaW5lRW5kID09PSAtMTsgKytwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYnVmZmVyW3Bvc2l0aW9uXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU4OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkTGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNvbG9uIGluIGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZExlbmd0aCA9IHBvc2l0aW9uIC0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVFbmQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxpbmVFbmQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYnV0IHRoZSBsaW5lIGhhc24ndCBlbmRlZC5cbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgbmV4dCBhcnIgYW5kIHRoZW4gY29udGludWUgcGFyc2luZzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd2UndmUgcmVhY2hlZCB0aGUgbGluZSBlbmQsIHNlbmQgaXQgb3V0OlxuICAgICAgICAgICAgb25MaW5lKGJ1ZmZlci5zdWJhcnJheShsaW5lU3RhcnQsIGxpbmVFbmQpLCBmaWVsZExlbmd0aCk7XG4gICAgICAgICAgICBsaW5lU3RhcnQgPSBwb3NpdGlvbjsgLy8gd2UncmUgbm93IG9uIHRoZSBuZXh0IGxpbmVcbiAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZVN0YXJ0ID09PSBidWZMZW5ndGgpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHVuZGVmaW5lZDsgLy8gd2UndmUgZmluaXNoZWQgcmVhZGluZyBpdFxuICAgICAgICB9IGVsc2UgaWYgKGxpbmVTdGFydCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHZpZXcgaW50byBidWZmZXIgYmVnaW5uaW5nIGF0IGxpbmVTdGFydCBzbyB3ZSBkb24ndFxuICAgICAgICAgICAgLy8gbmVlZCB0byBjb3B5IG92ZXIgdGhlIHByZXZpb3VzIGxpbmVzIHdoZW4gd2UgZ2V0IHRoZSBuZXcgYXJyOlxuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCk7XG4gICAgICAgICAgICBwb3NpdGlvbiAtPSBsaW5lU3RhcnQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBsaW5lIGJ1ZmZlcnMgaW50byBFdmVudFNvdXJjZU1lc3NhZ2VzLlxuICogQHBhcmFtIG9uSWQgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYGlkYCBmaWVsZC5cbiAqIEBwYXJhbSBvblJldHJ5IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGByZXRyeWAgZmllbGQuXG4gKiBAcGFyYW0gb25NZXNzYWdlIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lc3NhZ2VzKG9uTWVzc2FnZT86IChtc2c6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgIGxldCBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlcjpcbiAgICByZXR1cm4gZnVuY3Rpb24gb25MaW5lKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBlbXB0eSBsaW5lIGRlbm90ZXMgZW5kIG9mIG1lc3NhZ2UuIFRyaWdnZXIgdGhlIGNhbGxiYWNrIGFuZCBzdGFydCBhIG5ldyBtZXNzYWdlOlxuICAgICAgICAgICAgb25NZXNzYWdlPy4obWVzc2FnZSk7XG4gICAgICAgICAgICBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBjb21tZW50cyBhbmQgbGluZXMgd2l0aCBubyB2YWx1ZXNcbiAgICAgICAgICAgIC8vIGxpbmUgaXMgb2YgZm9ybWF0IFwiPGZpZWxkPjo8dmFsdWU+XCIgb3IgXCI8ZmllbGQ+OiA8dmFsdWU+XCJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlcnZlci1zZW50LWV2ZW50cy5odG1sI2V2ZW50LXN0cmVhbS1pbnRlcnByZXRhdGlvblxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KDAsIGZpZWxkTGVuZ3RoKSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZU9mZnNldCA9IGZpZWxkTGVuZ3RoICsgKGxpbmVbZmllbGRMZW5ndGggKyAxXSA9PT0gMzIgPyAyIDogMSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlY29kZXIuZGVjb2RlKGxpbmUuc3ViYXJyYXkodmFsdWVPZmZzZXQpKTtcblxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG1lc3NhZ2UgYWxyZWFkeSBoYXMgZGF0YSwgYXBwZW5kIHRoZSBuZXcgdmFsdWUgdG8gdGhlIG9sZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBqdXN0IHNldCB0byB0aGUgbmV3IHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEgPSBtZXNzYWdlLmRhdGEgPyBgJHttZXNzYWdlLmRhdGF9XFxuJHt2YWx1ZX1gIDogdmFsdWU7IC8vIG90aGVyd2lzZSxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjb25jYXQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSkge1xuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGEubGVuZ3RoICsgYi5sZW5ndGgpO1xuICAgIHJlcy5zZXQoYSk7XG4gICAgcmVzLnNldChiLCBhLmxlbmd0aCk7XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gbmV3TWVzc2FnZSgpOiBFdmVudFNvdXJjZU1lc3NhZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6ICcnLFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVzb2x2ZXJzPFQgPSBhbnk+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICBsZXQgcmVzb2x2ZTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD5bJ3Jlc29sdmUnXTtcbiAgICBsZXQgcmVqZWN0OiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVqZWN0J107XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZTogcmVzb2x2ZSEsIHJlamVjdDogcmVqZWN0ISB9O1xufVxuXG5jb25zdCBEQl9OQU1FID0gJ1N0YXJnYXRlJztcbmNvbnN0IFNUT1JFX05BTUUgPSAnY2FjaGVzJztcbmxldCBkYkluc3RhbmNlOiBJREJEYXRhYmFzZSB8IG51bGwgPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBvcGVuREIoKTogUHJvbWlzZTxJREJEYXRhYmFzZT4ge1xuICAgIGlmIChkYkluc3RhbmNlKSByZXR1cm4gZGJJbnN0YW5jZTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCAxKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGRiSW5zdGFuY2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICAgIHJlc29sdmUoZGJJbnN0YW5jZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q2FjaGVTdG9yYWdlKG9wdGlvbnM/OiB7IGVuY3J5cHRpb24/OiBib29sZWFuOyBlbmNyeXB0aW9uS2V5Pzogc3RyaW5nIH0pOiBQcm9taXNlPENhY2hlU3RvcmFnZT4ge1xuICAgIGF3YWl0IG9wZW5EQigpO1xuXG4gICAgbGV0IGVuY3J5cHRpb25LZXk6IENyeXB0b0tleSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDhBcnJheSgxNik7XG5cbiAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgICAgICBjb25zdCBrZXlTdHJpbmcgPSBvcHRpb25zLmVuY3J5cHRpb25LZXkgPz8gREJfTkFNRTtcbiAgICAgICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleVN0cmluZykuZm9yRWFjaCgoYnl0ZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPCAxNikgY291bnRlcltpXSA9IGJ5dGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3Qga2V5RGF0YSA9IGVuY29kZXIuZW5jb2RlKGtleVN0cmluZyk7XG4gICAgICAgIGNvbnN0IGltcG9ydGVkS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGtleURhdGEsIHsgbmFtZTogJ1BCS0RGMicgfSwgZmFsc2UsIFsnZGVyaXZlS2V5J10pO1xuXG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgICAgICAgICBzYWx0OiBlbmNvZGVyLmVuY29kZSgnbWlsa2lvLXN0YXJnYXRlLWNhY2hlJyksXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uczogMTAwMDAwLFxuICAgICAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbXBvcnRlZEtleSxcbiAgICAgICAgICAgIHsgbmFtZTogJ0FFUy1DVFInLCBsZW5ndGg6IDI1NiB9LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHREYXRhID0gYXN5bmMgKGRhdGE6IGFueSk6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICAgICAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHJldHVybiBkYXRhO1xuXG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBkYXRhQnl0ZXMgPSBlbmNvZGVyLmVuY29kZShqc29uU3RyaW5nKTtcblxuICAgICAgICBjb25zdCBlbmNyeXB0ZWRBcnJheUJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNUUicsXG4gICAgICAgICAgICAgICAgY291bnRlcjogY291bnRlcixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDY0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkhLFxuICAgICAgICAgICAgZGF0YUJ5dGVzLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmNyeXB0ZWRBcnJheUJ1ZmZlcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY3J5cHREYXRhID0gYXN5bmMgKGVuY3J5cHRlZERhdGE6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIGlmICghZW5jcnlwdGlvbktleSB8fCAhZW5jcnlwdGVkRGF0YSkgcmV0dXJuIGVuY3J5cHRlZERhdGE7XG5cbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlbmNyeXB0ZWREYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IChlbmNyeXB0ZWREYXRhLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcikgOiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZEJ5dGVzID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ1RSJyxcbiAgICAgICAgICAgICAgICBjb3VudGVyOiBjb3VudGVyLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogNjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSEsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcixcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSBkZWNvZGVyLmRlY29kZShkZWNyeXB0ZWRCeXRlcyk7XG4gICAgICAgIHJldHVybiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShqc29uU3RyaW5nKSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8eyBkYXRhOiBhbnk7IHRpbWVzdGFtcDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EQigpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldChrZXkpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24gJiYgKHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgcmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkRGF0YSA9IGF3YWl0IGRlY3J5cHREYXRhKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBkYXRhOiBkZWNyeXB0ZWREYXRhLCB0aW1lc3RhbXA6IHJlc3VsdC50aW1lc3RhbXAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCA/PyBudWxsKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EQigpO1xuICAgICAgICAgICAgbGV0IGRhdGFUb1N0b3JlOiBhbnkgPSBkYXRhO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgICAgICAgICAgICAgIGRhdGFUb1N0b3JlID0gYXdhaXQgZW5jcnlwdERhdGEoZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUucHV0KHsgZGF0YTogZGF0YVRvU3RvcmUsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9LCBrZXkpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2FjaGVLZXkocGF0aDogc3RyaW5nLCBwYXJhbXM6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3BhdGh9OiR7SlNPTi5zdHJpbmdpZnkocGFyYW1zID8/IHt9KX1gO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQWtEQSxlQUFzQixjQUF1RSxDQUFDLGlCQUF3QztBQUFBLEVBQ2xJLE1BQU0sU0FBUyxnQkFBZ0IsU0FBUztBQUFBLEVBQ3hDLE1BQU0sU0FBUyxnQkFBZ0Is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RyxDQUFDLEtBQWEsTUFBMEI7QUFBQSxNQUM3QyxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDeEIsSUFBSSxjQUFtQjtBQUFBLE1BRXZCLElBQUksU0FBUyxZQUFZO0FBQUEsUUFDckIsY0FBYyxNQUFNLFlBQVksSUFBSTtBQUFBLE1BQ3hDO0FBQUEsTUFFQSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLFFBQ3BDLE1BQU0sY0FBYyxHQUFHLFlBQVksWUFBWSxXQUFXO0FBQUEsUUFDMUQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxFQUFFLE1BQU0sYUFBYSxXQUFXLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRztBQUFBLFFBQzNFLFFBQVEsVUFBVSxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsUUFDNUMsUUFBUSxZQUFZLE1BQU0sUUFBUTtBQUFBLE9BQ3JDO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFHSixTQUFTLGdCQUFnQixDQUFDLE1BQWMsUUFBcUI7QUFBQSxFQUN6RCxPQUFPLEdBQUcsUUFBUSxLQUFLLFVBQVUsVUFBVSxDQUFDLENBQUM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkU4ODUzRDEwNDE0RDQ5Qjk2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
744
|
+
//# debugId=1DE05FA24E6D938464756E2164756E21
|
|
745
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XG4gICAgY2FjaGVTdG9yYWdlPzogQ2FjaGVTdG9yYWdlO1xuICAgIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+O1xuICAgIHNldDogKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zPFQgZXh0ZW5kcyBhbnk+ID0ge1xuICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBjYWNoZVN0cmF0ZWd5PzogQ2FjaGVTdHJhdGVneTtcbiAgICBjYWNoZVRocm90dGxlTXM/OiBudW1iZXI7XG4gICAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJldHJ5U3RyYXRlZ3k/OiBSZXRyeVN0cmF0ZWd5O1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogYW55O1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgIF1cbiAgICB8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBzZXJ2ZXJUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55OyBldmVudHM6IGFueSB9PihzdGFyZ2F0ZU9wdGlvbnM6IE1pbGtpb1N0YXJnYXRlT3B0aW9ucykge1xuICAgIGNvbnN0ICRmZXRjaCA9IHN0YXJnYXRlT3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgICBjb25zdCAkYWJvcnQgPSBzdGFyZ2F0ZU9wdGlvbnMuYWJvcnQgPz8gQWJvcnRDb250cm9sbGVyO1xuXG4gICAgdHlwZSBTdGFyZ2F0ZUV2ZW50cyA9IHtcbiAgICAgICAgJ21pbGtpbzpleGVjdXRlQmVmb3JlJzogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+IH07XG4gICAgICAgICdtaWxraW86ZmV0Y2hCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgICAgICAnbWlsa2lvOmV4ZWN1dGVFcnJvcic6IHtcbiAgICAgICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+O1xuICAgICAgICAgICAgZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+O1xuICAgICAgICAgICAgaGFuZGxlRXJyb3I6IDxLIGV4dGVuZHMga2V5b2YgUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4+KGVycm9yOiBhbnksIGtleTogSywgaGFuZGxlcjogKGVycm9yOiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddW0tdPikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pID0+IFByb21pc2U8dm9pZD47XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gYXdhaXQgaGFuZGxlcihlcnJvcltrZXldKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVkKSBkZWxldGUgZXJyb3Jba2V5XTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgICAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvZmY6IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XG5cbiAgICBjb25zdCBib290c3RyYXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBiYXNlVXJsID0gc3RhcmdhdGVPcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgaWYgKGJhc2VVcmwuZW5kc1dpdGgoJy8nKSkgYmFzZVVybCA9IGJhc2VVcmwuc2xpY2UoMCwgLTEpO1xuXG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xuICAgIH07XG5cbiAgICBjb25zdCBiYXNlVXJsUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+ID0gYm9vdHN0cmFwKCk7XG4gICAgLy8gQ2FjaGUgcmVzb2x2ZWQgYmFzZVVybCB0byBhdm9pZCBhd2FpdCBvdmVyaGVhZCBvbiByZXBlYXRlZCBjYWxsc1xuICAgIGxldCByZXNvbHZlZEJhc2VVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIENhY2hlIFVSTCBmb3IgbGFzdCBwYXRoIHRvIGF2b2lkIHN0cmluZyBjb25jYXRlbmF0aW9uIHBlciByZXF1ZXN0XG4gICAgbGV0IGNhY2hlZFVybFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjYWNoZWRVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcmdhdGUgPSB7XG4gICAgICAgIC4uLmV2ZW50TWFuYWdlcixcbiAgICAgICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxuICAgICAgICBhc3luYyBleGVjdXRlPFBhdGggZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ10+KFxuICAgICAgICAgICAgcGF0aDogUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPFxuICAgICAgICAgICAgICAgIEV4ZWN1dGVPcHRpb25zPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+LFxuICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXSwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+XSwgdW5kZWZpbmVkPiwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgID4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCYXNlVXJsKSByZXNvbHZlZEJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAvLyBDYWNoZSBVUkwgZm9yIHJlcGVhdGVkIHBhdGggdG8gYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb25cbiAgICAgICAgICAgICAgICBpZiAocGF0aCA9PT0gY2FjaGVkVXJsUGF0aCAmJiBjYWNoZWRVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gY2FjaGVkVXJsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlc29sdmVkQmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlZFVybFBhdGggPSBwYXRoIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVXJsID0gdXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKCd+JykpIHtcbiAgICAgICAgICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBoZWFkZXJzIG9ubHkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgaWYgKGguQWNjZXB0ID09PSB1bmRlZmluZWQpIGguQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICAgICAgICAgIGlmIChoWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBoWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlU3RyYXRlZ3kgPSBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPz8gJ29mZic7XG4gICAgICAgICAgICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09IHRydWUgfHwgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucy5yZXRyeVN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogbm8gY2FjaGUsIG5vIHJldHJ5XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgPT09ICdvZmYnICYmIHJldHJ5Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHksIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZSh0ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkLnN1Y2Nlc3MgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycltwYXJzZWQuY29kZV0gPSBwYXJzZWQucmVqZWN0ID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnIsIG51bGwsIHsgZXhlY3V0ZUlkOiBwYXJzZWQuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBwYXJzZWQuZGF0YSwgeyBleGVjdXRlSWQ6IHBhcnNlZC5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogJycgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvclBpbmVkID0geyBSRVFVRVNUX0ZBSUw6IGVycm9yIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yUGluZWQsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZVRocm90dGxlTXMgPSBvcHRpb25zLmNhY2hlVGhyb3R0bGVNcyA/PyAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gZ2VuZXJhdGVDYWNoZUtleShwYXRoIGFzIHN0cmluZywgb3B0aW9ucy5wYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGNhY2hlU3RvcmFnZSA9IHN0YXJnYXRlT3B0aW9ucy5jYWNoZVN0b3JhZ2U7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmICFjYWNoZVN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVTdG9yYWdlID0gYXdhaXQgY3JlYXRlRGVmYXVsdENhY2hlU3RvcmFnZSh7IGVuY3J5cHRpb246IHN0YXJnYXRlT3B0aW9ucy5jYWNoZUVuY3J5cHRpb24gfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSAmJiBvcHRpb25zLm9uQ2FjaGVIaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGVTdG9yYWdlLmdldChjYWNoZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5vbkNhY2hlSGl0KGNhY2hlZC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBvbkNhY2hlSGl0IGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgPT09ICd0aHJvdHRsZScgJiYgY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQudGltZXN0YW1wIDwgY2FjaGVUaHJvdHRsZU1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlUmVxdWVzdCA9IGFzeW5jIChpc1JldHJ5OiBib29sZWFuKTogUHJvbWlzZTx7IHJlc3VsdDogeyB2YWx1ZTogUmVjb3JkPGFueSwgYW55PiB9IHwgbnVsbDsgZXJyb3I6IGFueTsgaXNOZXR3b3JrRXJyb3I6IGJvb2xlYW4gfT4gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5LCBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogeyB2YWx1ZTogcGFyc2VkIH0sIGVycm9yOiBudWxsLCBpc05ldHdvcmtFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNOZXR3b3JrRXJyb3IgPSAhZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBudWxsLCBlcnJvciwgaXNOZXR3b3JrRXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgeyByZXN1bHQsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9ID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcmV0cnlJbmRleCA9IDA7IHJldHJ5SW5kZXggPCByZXRyeUNvdW50ICYmIGVycm9yICYmIGlzTmV0d29ya0Vycm9yOyByZXRyeUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5SW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXRyeVJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmV0cnlSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGlzTmV0d29ya0Vycm9yID0gcmV0cnlSZXN1bHQuaXNOZXR3b3JrRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UgJiYgaXNOZXR3b3JrRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgY2FjaGVkLmRhdGEsIHsgZXhlY3V0ZUlkOiAnY2FjaGVkJyB9XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvclBpbmVkID0geyBSRVFVRVNUX0ZBSUw6IGVycm9yIH07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvcjogZXJyb3JQaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQhLnZhbHVlLnN1Y2Nlc3MgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXJyW3Jlc3VsdCEudmFsdWUuY29kZV0gPSByZXN1bHQhLnZhbHVlLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVyciB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnIsIG51bGwsIHsgZXhlY3V0ZUlkOiByZXN1bHQhLnZhbHVlLmV4ZWN1dGVJZCB9XTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNhY2hlU3RvcmFnZS5zZXQoY2FjaGVLZXksIHJlc3VsdCEudmFsdWUuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHQhLnZhbHVlLmRhdGEsIHsgZXhlY3V0ZUlkOiByZXN1bHQhLnZhbHVlLmV4ZWN1dGVJZCB9XSBhcyBhbnk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmVhbVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVTdHJhdGVneSA9ICdvZmYnO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25DYWNoZUhpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlVGhyb3R0bGVNcyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSAndGV4dC9ldmVudC1zdHJlYW0nO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFja3M6IE1hcDxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2tzSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtUmVzdWx0OiBhbnk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtUmVzdWx0RmV0Y2hlZCA9IHdpdGhSZXNvbHZlcnM8dW5kZWZpbmVkPigpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9LCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhLnNsaWNlKDEpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9GQUlMOiBlcnJvciB9LCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zIS5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpmZXRjaEJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zIS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb250ZW50LXR5cGUgdG8gYmUgJHsndGV4dC9ldmVudC1zdHJlYW0nfSwgQWN0dWFsOiAke2NvbnRlbnRUeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRCeXRlcyhyZXNwb25zZS5ib2R5ISwgZ2V0TGluZXMoZ2V0TWVzc2FnZXMob25tZXNzYWdlKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7IFJFUVVFU1RfRkFJTDogZXJyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZvaWQgY3JlYXRlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytpdGVyYXRvckluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4IC0gMikpIHN0YWNrcy5kZWxldGUoaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFja3MuZ2V0KGluZGV4KSEucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogc3RyZWFtUmVzdWx0Py5leGVjdXRlSWQgPz8gJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdORVRXT1JLX0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdOZXR3b3JrIEVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21DbGllbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfaW5kZXgsIHN0YWNrXSBvZiBzdGFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmRvbmUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgICAgICAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RyZWFtUmVzdWx0RmV0Y2hlZC5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGl0ZXJhdG9yLCB7IGV4ZWN1dGVJZDogc3RyZWFtUmVzdWx0LmV4ZWN1dGVJZCB9XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIF9fY29va2Jvb2s6IHtcbiAgICAgICAgICAgIHN1YnNjcmliZTogYXN5bmMgKGJhc2VVcmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ3RleHQvZXZlbnQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBNYXA8XG4gICAgICAgICAgICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8YW55Pj47XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID4gPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3JJbmRleCA9IDA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsrc3RhY2tzSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2goYCR7YmFzZVVybH0vJHN1YnNjcmliZWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb250ZW50LXR5cGUgdG8gYmUgJHsndGV4dC9ldmVudC1zdHJlYW0nfSwgQWN0dWFsOiAke2NvbnRlbnRUeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRCeXRlcyhyZXNwb25zZS5ib2R5ISwgZ2V0TGluZXMoZ2V0TWVzc2FnZXMob25tZXNzYWdlKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IudGhyb3coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZvaWQgY3JlYXRlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytpdGVyYXRvckluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4IC0gMikpIHN0YWNrcy5kZWxldGUoaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFja3MuZ2V0KGluZGV4KSEucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgICAgICAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgX19hc3RyYUVtaXRFdmVudDogYXN5bmMgKGtleTogYW55LCBvcHRpb25zPzogeyBwYXJhbXM/OiBhbnk7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zID8/IHt9O1xuICAgICAgICAgICAgaWYgKG9wdHMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRzLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGlmIChvcHRzLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIG9wdHMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCYXNlVXJsKSByZXNvbHZlZEJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsUHJvbWlzZTtcbiAgICAgICAgICAgIC8vIOWFvOWuueS4jeWQjOi/kOihjOaXtu+8muS8mOWFiOS9v+eUqCBidG9h77yM5Zue6YCA5YiwIEJ1ZmZlclxuICAgICAgICAgICAgbGV0IGJhc2U2NE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnRvYSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBiYXNlNjROYW1lID0gYnRvYShrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBiYXNlNjROYW1lID0gQnVmZmVyLmZyb20oa2V5IGFzIHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJhc2U2NCBlbmNvZGVyIGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsID0gYCR7cmVzb2x2ZWRCYXNlVXJsfS8kZXZlbnQvJHtlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0TmFtZSl9YDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0cy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBlcnJbcGFyc2VkLmNvZGVdID0gcGFyc2VkLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2VyciwgbnVsbCwgeyBleGVjdXRlSWQ6IHBhcnNlZC5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcGFyc2VkLmRhdGEsIHsgZXhlY3V0ZUlkOiBwYXJzZWQuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yUGluZWQsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcGluZyhvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pOiBQcm9taXNlPFBpbmc+IHtcbiAgICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8UGluZz4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBgJHthd2FpdCBiYXNlVXJsUHJvbWlzZX0vZ2VuZXJhdGVfMjA0YDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0LCBtZXNzYWdlOiBgRXhlY3V0ZSB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tcy5gIH0gfSB9LCBudWxsXSk7XG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnSEVBRCcgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX0ZBSUw6IHsgcmVzcG9uc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBtZXNzYWdlOiAnU3RhdHVzIGNvZGUgbm90IDIwNCcgfSB9IH0sIG51bGxdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW251bGwsIHsgY29ubmVjdDogdHJ1ZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgc2VydmVyVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIS5zdWJzdHJpbmcoMTcpKSB9XSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3IgfSwgbnVsbF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgICR0eXBlczogdW5kZWZpbmVkIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWQ7XG4gICAgICAgICAgICBlcnJvcjogR2VuZXJhdGVkWydyZWplY3RDb2RlJ107XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11dOiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3BhcmFtcyddO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc3VsdHM6IHtcbiAgICAgICAgICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11dOiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ/CfpZsnXSBleHRlbmRzIGJvb2xlYW5cbiAgICAgICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgICAgIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J11cbiAgICAgICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgICAgIEFzeW5jR2VuZXJhdG9yPFtQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddPl0sIHVuZGVmaW5lZD47XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gc3RhcmdhdGU7XG59XG5cbmNvbnN0IGlzb0RhdGVQYXR0ZXJuID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7MSwzfSk/KShafFsrLV1cXGR7Mn06P1xcZHsyfSk/JC87XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZpdmVKU09OUGFyc2U8VD4oanNvbjogVCk6IFQge1xuICAgIGlmIChqc29uID09PSBudWxsIHx8IGpzb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGpzb247XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBqc29uO1xuICAgIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoanNvbiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBqc29uO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgICAgICAgY29uc3QgbGVuID0ganNvbi5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKGpzb25baV0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IGpzb25baV0pIGpzb25baV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbiBhcyBvYmplY3QpO1xuICAgICAgICBjb25zdCBvYmogPSBqc29uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHZhbHVlKSBvYmpba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IGpzb24gYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gICAgICAgIC8vIFF1aWNrIHJlamVjdDogSVNPIGRhdGUgc3RyaW5ncyBtdXN0IHN0YXJ0IHdpdGggYSBkaWdpdCBhbmQgY29udGFpbiAnVCdcbiAgICAgICAgY29uc3QgbGVuID0gc3RyLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+PSAyMCAmJiBsZW4gPD0gMzIgJiYgc3RyLmNoYXJDb2RlQXQoMCkgPj0gMHgzMCAmJiBzdHIuY2hhckNvZGVBdCgwKSA8PSAweDM5ICYmIHN0ci5pbmRleE9mKCdUJykgIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaChpc29EYXRlUGF0dGVybik7XG4gICAgICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb25Qb3MgPSBtYXRjaFsyXS5jaGFyQ29kZUF0KDMpID09PSA1OCA/IG1hdGNoWzFdLmxlbmd0aCArIDMgOiAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9uUG9zID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShzdHIuc3Vic3RyaW5nKDAsIGNvbG9uUG9zKSArIHN0ci5zdWJzdHJpbmcoY29sb25Qb3MgKyAxKSkgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShzdHIpIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1hdGNoWzFdICsgJ1onKSBhcyBhbnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVN0cmVhbU9wdGlvbnMge1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2NoZW1hRXh0ZW5kIHtcbiAgICBhcGlWYWxpZGF0b3I6IHtcbiAgICAgICAgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgICAgICAgdmFsaWRhdGU6IFJlY29yZDxhbnksIGFueT47XG4gICAgfTtcbiAgICBhcGlNZXRob2RzU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIGFwaU1ldGhvZHNUeXBlU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIGFwaVRlc3RzU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBGYWlsQ29kZUV4dGVuZCA9IFJlY29yZDxhbnksICguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiBhbnk+O1xuXG5leHBvcnQgdHlwZSBCb290c3RyYXBNaWRkbGV3YXJlID0gKGRhdGE6IHsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyBwYXJhbXM6IGFueTsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmUgPSAoZGF0YTogeyBwYXRoOiBzdHJpbmc7IHJlc3VsdDogeyB2YWx1ZTogYW55IH07IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZU9wdGlvbnMge1xuICAgIGJvb3RzdHJhcD86IEJvb3RzdHJhcE1pZGRsZXdhcmU7XG4gICAgYmVmb3JlRXhlY3V0ZT86IEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlO1xuICAgIGFmdGVyRXhlY3V0ZT86IEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U3RvcmFnZSB7XG4gICAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICAgIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICByZW1vdmVJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVJlc3VsdFN1Y2Nlc3M8UmVzdWx0PiB7XG4gICAgZXhlY3V0ZUlkOiBzdHJpbmc7XG4gICAgc3VjY2VzczogdHJ1ZTtcbiAgICBkYXRhOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRvckdlbmVyaWM8VD4gPSBUIGV4dGVuZHMgQXN5bmNHZW5lcmF0b3I8aW5mZXIgST4gPyBJIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIEZsYXR0ZW5LZXlzPFQsIFByZWZpeCBleHRlbmRzIHN0cmluZyA9ICcnPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdCA/IEZsYXR0ZW5LZXlzPFRbS10sIGAke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn0uYD4gOiBgJGlucHV0LiR7UHJlZml4fSR7RXhjbHVkZTxLLCBzeW1ib2w+fWA7XG59W2tleW9mIFRdO1xuXG4vLyAqKiogVGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGlzIGJhc2VkIG9uIGBAbWljcm9zb2Z0L2ZldGNoLWV2ZW50LXNvdXJjZWAgcmV3cml0ZSwgdGhhbmtzIHRvIHRoZSB3b3JrIG9mIE1pY3Jvc29mdCAqKiogLy9cbi8vICoqKiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvZmV0Y2gtZXZlbnQtc291cmNlL2Jsb2IvbWFpbi9zcmMvcGFyc2UudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiAvL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHNlbnQgaW4gYW4gZXZlbnQgc3RyZWFtXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTb3VyY2VNZXNzYWdlIHtcbiAgICBkYXRhOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBSZWFkYWJsZVN0cmVhbSBpbnRvIGEgY2FsbGJhY2sgcGF0dGVybi5cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIGlucHV0IFJlYWRhYmxlU3RyZWFtLlxuICogQHBhcmFtIG9uQ2h1bmsgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbmV3IGJ5dGUgY2h1bmsgaW4gdGhlIHN0cmVhbS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdoZW4gdGhlIHN0cmVhbSBjbG9zZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCeXRlcyhzdHJlYW06IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+LCBvbkNodW5rOiAoYXJyOiBVaW50OEFycmF5KSA9PiB2b2lkKSB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgIGxldCByZXN1bHQ6IFJlYWRhYmxlU3RyZWFtUmVhZFJlc3VsdDxVaW50OEFycmF5PjtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2hpbGUgKCEocmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKSkuZG9uZSkge1xuICAgICAgICBvbkNodW5rKHJlc3VsdC52YWx1ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBhcmJpdGFyeSBieXRlIGNodW5rcyBpbnRvIEV2ZW50U291cmNlIGxpbmUgYnVmZmVycy5cbiAqIEVhY2ggbGluZSBzaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBcImZpZWxkOiB2YWx1ZVwiIGFuZCBlbmRzIHdpdGggXFxyLCBcXG4sIG9yIFxcclxcbi5cbiAqIEBwYXJhbSBvbkxpbmUgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbmV3IEV2ZW50U291cmNlIGxpbmUuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGluZXMob25MaW5lOiAobGluZTogVWludDhBcnJheSwgZmllbGRMZW5ndGg6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGxldCBidWZmZXI6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHBvc2l0aW9uOiBudW1iZXI7IC8vIGN1cnJlbnQgcmVhZCBwb3NpdGlvblxuICAgIGxldCBmaWVsZExlbmd0aDogbnVtYmVyOyAvLyBsZW5ndGggb2YgdGhlIGBmaWVsZGAgcG9ydGlvbiBvZiB0aGUgbGluZVxuICAgIGxldCBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gZmFsc2U7XG5cbiAgICAvLyByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9jZXNzIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuazpcbiAgICByZXR1cm4gZnVuY3Rpb24gb25DaHVuayhhcnI6IFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBidWZmZXIgPSBhcnI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICBmaWVsZExlbmd0aCA9IC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2UncmUgc3RpbGwgcGFyc2luZyB0aGUgb2xkIGxpbmUuIEFwcGVuZCB0aGUgbmV3IGJ5dGVzIGludG8gYnVmZmVyOlxuICAgICAgICAgICAgYnVmZmVyID0gY29uY2F0KGJ1ZmZlciwgYXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1Zkxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSAwOyAvLyBpbmRleCB3aGVyZSB0aGUgY3VycmVudCBsaW5lIHN0YXJ0c1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBidWZMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChkaXNjYXJkVHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltwb3NpdGlvbl0gPT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVTdGFydCA9ICsrcG9zaXRpb247IC8vIHNraXAgdG8gbmV4dCBjaGFyXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzdGFydCBsb29raW5nIGZvcndhcmQgdGlsbCB0aGUgZW5kIG9mIGxpbmU6XG4gICAgICAgICAgICBsZXQgbGluZUVuZCA9IC0xOyAvLyBpbmRleCBvZiB0aGUgXFxyIG9yIFxcbiBjaGFyXG4gICAgICAgICAgICBmb3IgKDsgcG9zaXRpb24gPCBidWZMZW5ndGggJiYgbGluZUVuZCA9PT0gLTE7ICsrcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ1ZmZlcltwb3NpdGlvbl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZExlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjb2xvbiBpbiBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRMZW5ndGggPSBwb3NpdGlvbiAtIGxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVFbmQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsaW5lRW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGJ1dCB0aGUgbGluZSBoYXNuJ3QgZW5kZWQuXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgYXJyIGFuZCB0aGVuIGNvbnRpbnVlIHBhcnNpbmc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbmUgZW5kLCBzZW5kIGl0IG91dDpcbiAgICAgICAgICAgIG9uTGluZShidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0LCBsaW5lRW5kKSwgZmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgbGluZVN0YXJ0ID0gcG9zaXRpb247IC8vIHdlJ3JlIG5vdyBvbiB0aGUgbmV4dCBsaW5lXG4gICAgICAgICAgICBmaWVsZExlbmd0aCA9IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmVTdGFydCA9PT0gYnVmTGVuZ3RoKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB1bmRlZmluZWQ7IC8vIHdlJ3ZlIGZpbmlzaGVkIHJlYWRpbmcgaXRcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lU3RhcnQgIT09IDApIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyB2aWV3IGludG8gYnVmZmVyIGJlZ2lubmluZyBhdCBsaW5lU3RhcnQgc28gd2UgZG9uJ3RcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gY29weSBvdmVyIHRoZSBwcmV2aW91cyBsaW5lcyB3aGVuIHdlIGdldCB0aGUgbmV3IGFycjpcbiAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zdWJhcnJheShsaW5lU3RhcnQpO1xuICAgICAgICAgICAgcG9zaXRpb24gLT0gbGluZVN0YXJ0O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgbGluZSBidWZmZXJzIGludG8gRXZlbnRTb3VyY2VNZXNzYWdlcy5cbiAqIEBwYXJhbSBvbklkIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGBpZGAgZmllbGQuXG4gKiBAcGFyYW0gb25SZXRyeSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBgcmV0cnlgIGZpZWxkLlxuICogQHBhcmFtIG9uTWVzc2FnZSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBtZXNzYWdlLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgbGluZSBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXNzYWdlcyhvbk1lc3NhZ2U/OiAobXNnOiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICBsZXQgbWVzc2FnZSA9IG5ld01lc3NhZ2UoKTtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgICAvLyByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9jZXNzIGVhY2ggaW5jb21pbmcgbGluZSBidWZmZXI6XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uTGluZShsaW5lOiBVaW50OEFycmF5LCBmaWVsZExlbmd0aDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gZW1wdHkgbGluZSBkZW5vdGVzIGVuZCBvZiBtZXNzYWdlLiBUcmlnZ2VyIHRoZSBjYWxsYmFjayBhbmQgc3RhcnQgYSBuZXcgbWVzc2FnZTpcbiAgICAgICAgICAgIG9uTWVzc2FnZT8uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgbWVzc2FnZSA9IG5ld01lc3NhZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgY29tbWVudHMgYW5kIGxpbmVzIHdpdGggbm8gdmFsdWVzXG4gICAgICAgICAgICAvLyBsaW5lIGlzIG9mIGZvcm1hdCBcIjxmaWVsZD46PHZhbHVlPlwiIG9yIFwiPGZpZWxkPjogPHZhbHVlPlwiXG4gICAgICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZXJ2ZXItc2VudC1ldmVudHMuaHRtbCNldmVudC1zdHJlYW0taW50ZXJwcmV0YXRpb25cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSgwLCBmaWVsZExlbmd0aCkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVPZmZzZXQgPSBmaWVsZExlbmd0aCArIChsaW5lW2ZpZWxkTGVuZ3RoICsgMV0gPT09IDMyID8gMiA6IDEpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KHZhbHVlT2Zmc2V0KSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBtZXNzYWdlIGFscmVhZHkgaGFzIGRhdGEsIGFwcGVuZCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBvbGQuXG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwganVzdCBzZXQgdG8gdGhlIG5ldyB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhID0gbWVzc2FnZS5kYXRhID8gYCR7bWVzc2FnZS5kYXRhfVxcbiR7dmFsdWV9YCA6IHZhbHVlOyAvLyBvdGhlcndpc2UsXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29uY2F0KGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCArIGIubGVuZ3RoKTtcbiAgICByZXMuc2V0KGEpO1xuICAgIHJlcy5zZXQoYiwgYS5sZW5ndGgpO1xuICAgIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIG5ld01lc3NhZ2UoKTogRXZlbnRTb3VyY2VNZXNzYWdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiAnJyxcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlc29sdmVyczxUID0gYW55PigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgbGV0IHJlc29sdmU6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+WydyZXNvbHZlJ107XG4gICAgbGV0IHJlamVjdDogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD5bJ3JlamVjdCddO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcbiAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHByb21pc2UsIHJlc29sdmU6IHJlc29sdmUhLCByZWplY3Q6IHJlamVjdCEgfTtcbn1cblxuY29uc3QgREJfTkFNRSA9ICdTdGFyZ2F0ZSc7XG5jb25zdCBTVE9SRV9OQU1FID0gJ2NhY2hlcyc7XG5sZXQgZGJJbnN0YW5jZTogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkRCKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgICBpZiAoZGJJbnN0YW5jZSkgcmV0dXJuIGRiSW5zdGFuY2U7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oREJfTkFNRSwgMSk7XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBkYkluc3RhbmNlID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICByZXNvbHZlKGRiSW5zdGFuY2UpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcbiAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkge1xuICAgICAgICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENhY2hlU3RvcmFnZShvcHRpb25zPzogeyBlbmNyeXB0aW9uPzogYm9vbGVhbjsgZW5jcnlwdGlvbktleT86IHN0cmluZyB9KTogUHJvbWlzZTxDYWNoZVN0b3JhZ2U+IHtcbiAgICBhd2FpdCBvcGVuREIoKTtcblxuICAgIGxldCBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb3VudGVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24pIHtcbiAgICAgICAgY29uc3Qga2V5U3RyaW5nID0gb3B0aW9ucy5lbmNyeXB0aW9uS2V5ID8/IERCX05BTUU7XG4gICAgICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXlTdHJpbmcpLmZvckVhY2goKGJ5dGUsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpIDwgMTYpIGNvdW50ZXJbaV0gPSBieXRlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGtleURhdGEgPSBlbmNvZGVyLmVuY29kZShrZXlTdHJpbmcpO1xuICAgICAgICBjb25zdCBpbXBvcnRlZEtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLCBrZXlEYXRhLCB7IG5hbWU6ICdQQktERjInIH0sIGZhbHNlLCBbJ2Rlcml2ZUtleSddKTtcblxuICAgICAgICBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1BCS0RGMicsXG4gICAgICAgICAgICAgICAgc2FsdDogZW5jb2Rlci5lbmNvZGUoJ21pbGtpby1zdGFyZ2F0ZS1jYWNoZScpLFxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnM6IDEwMDAwMCxcbiAgICAgICAgICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1wb3J0ZWRLZXksXG4gICAgICAgICAgICB7IG5hbWU6ICdBRVMtQ1RSJywgbGVuZ3RoOiAyNTYgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0RGF0YSA9IGFzeW5jIChkYXRhOiBhbnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5KSByZXR1cm4gZGF0YTtcblxuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3QgZGF0YUJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoanNvblN0cmluZyk7XG5cbiAgICAgICAgY29uc3QgZW5jcnlwdGVkQXJyYXlCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DVFInLFxuICAgICAgICAgICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgICAgICAgIGRhdGFCeXRlcyxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkQXJyYXlCdWZmZXIpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNyeXB0RGF0YSA9IGFzeW5jIChlbmNyeXB0ZWREYXRhOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICBpZiAoIWVuY3J5cHRpb25LZXkgfHwgIWVuY3J5cHRlZERhdGEpIHJldHVybiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gZW5jcnlwdGVkRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyAoZW5jcnlwdGVkRGF0YS5idWZmZXIgYXMgQXJyYXlCdWZmZXIpIDogZW5jcnlwdGVkRGF0YTtcblxuICAgICAgICBjb25zdCBkZWNyeXB0ZWRCeXRlcyA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNUUicsXG4gICAgICAgICAgICAgICAgY291bnRlcjogY291bnRlcixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDY0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkhLFxuICAgICAgICAgICAgYXJyYXlCdWZmZXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUoZGVjcnlwdGVkQnl0ZXMpO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoanNvblN0cmluZykpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogYW55OyB0aW1lc3RhbXA6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuREIoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZG9ubHknKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uICYmIChyZXN1bHQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZERhdGEgPSBhd2FpdCBkZWNyeXB0RGF0YShyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGF0YTogZGVjcnlwdGVkRGF0YSwgdGltZXN0YW1wOiByZXN1bHQudGltZXN0YW1wIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQgPz8gbnVsbCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuREIoKTtcbiAgICAgICAgICAgIGxldCBkYXRhVG9TdG9yZTogYW55ID0gZGF0YTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24pIHtcbiAgICAgICAgICAgICAgICBkYXRhVG9TdG9yZSA9IGF3YWl0IGVuY3J5cHREYXRhKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLnB1dCh7IGRhdGE6IGRhdGFUb1N0b3JlLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSwga2V5KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNhY2hlS2V5KHBhdGg6IHN0cmluZywgcGFyYW1zOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwYXRofToke0pTT04uc3RyaW5naWZ5KHBhcmFtcyA/PyB7fSl9YDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFrREEsZUFBc0IsY0FBb0YsQ0FBQyxpQkFBd0M7QUFBQSxFQUMvSSxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQUN4QyxNQUFNLFNBQVMs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TSxZQUFZLE9BQU8sSUFBSTtBQUFBLFlBQ25ELFFBQVEsRUFBRSxNQUFNLGVBQWUsV0FBVyxPQUFPLFVBQVUsQ0FBQztBQUFBLFlBQzVEO0FBQUEsVUFDSjtBQUFBLFVBRUEsUUFBUSxVQUFVLElBQUk7QUFBQTtBQUFBLE9BRTdCO0FBQUE7QUFBQSxTQUVDLElBQUcsQ0FBQyxLQUFhLE1BQTBCO0FBQUEsTUFDN0MsTUFBTSxLQUFLLE1BQU0sT0FBTztBQUFBLE1BQ3hCLElBQUksY0FBbUI7QUFBQSxNQUV2QixJQUFJLFNBQVMsWUFBWTtBQUFBLFFBQ3JCLGNBQWMsTUFBTSxZQUFZLElBQUk7QUFBQSxNQUN4QztBQUFBLE1BRUEsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxRQUNwQyxNQUFNLGNBQWMsR0FBRyxZQUFZLFlBQVksV0FBVztBQUFBLFFBQzFELE1BQU0sUUFBUSxZQUFZLFlBQVksVUFBVTtBQUFBLFFBQ2hELE1BQU0sVUFBVSxNQUFNLElBQUksRUFBRSxNQUFNLGFBQWEsV0FBVyxLQUFLLElBQUksRUFBRSxHQUFHLEdBQUc7QUFBQSxRQUMzRSxRQUFRLFVBQVUsTUFBTSxPQUFPLFFBQVEsS0FBSztBQUFBLFFBQzVDLFFBQVEsWUFBWSxNQUFNLFFBQVE7QUFBQSxPQUNyQztBQUFBO0FBQUEsRUFFVDtBQUFBO0FBR0osU0FBUyxnQkFBZ0IsQ0FBQyxNQUFjLFFBQXFCO0FBQUEsRUFDekQsT0FBTyxHQUFHLFFBQVEsS0FBSyxVQUFVLFVBQVUsQ0FBQyxDQUFDO0FBQUE7IiwKICAiZGVidWdJZCI6ICIxREUwNUZBMjRFNkQ5Mzg0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|