@nlabs/lex 2.0.3 → 2.0.4
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/CHANGELOG.md +21 -0
- package/MIGRATION_V2.md +331 -0
- package/README.md +73 -102
- package/config.json +4 -8
- package/docs/assets/lex-logo.png +0 -0
- package/examples/lex.config.js +7 -10
- package/lex.config.js +12 -11
- package/lib/commands/ai/ai.js +22 -6
- package/lib/commands/serverless-dev/serverless-dev.d.ts +8 -0
- package/lib/commands/serverless-dev/serverless-dev.js +42 -6
- package/lib/commands/storybook/storybook.js +2 -25
- package/lib/lex.js +7 -10
- package/lib/utils/vite/config.js +12 -1
- package/package.json +17 -16
- package/scripts/validate-docs.js +141 -0
|
@@ -13,6 +13,37 @@ import { WebSocketServer } from 'ws';
|
|
|
13
13
|
import { LexConfig, getPackageDir } from '../../LexConfig.js';
|
|
14
14
|
import { createSpinner, removeFiles } from '../../utils/app.js';
|
|
15
15
|
import { log } from '../../utils/log.js';
|
|
16
|
+
export const getCorsHeaders = (cors, requestOrigin)=>{
|
|
17
|
+
const corsConfig = typeof cors === 'object' ? cors : {};
|
|
18
|
+
const allowCredentials = corsConfig.allowCredentials === true;
|
|
19
|
+
const configuredOrigins = corsConfig.origins || [
|
|
20
|
+
'*'
|
|
21
|
+
];
|
|
22
|
+
const allowsAnyOrigin = configuredOrigins.includes('*');
|
|
23
|
+
const originIsAllowed = Boolean(requestOrigin && (allowsAnyOrigin || configuredOrigins.includes(requestOrigin)));
|
|
24
|
+
const allowedOrigin = originIsAllowed && requestOrigin ? requestOrigin : allowCredentials ? configuredOrigins.find((origin)=>origin !== '*') || '' : '*';
|
|
25
|
+
const headers = {
|
|
26
|
+
'Access-Control-Allow-Headers': (corsConfig.headers || [
|
|
27
|
+
'*'
|
|
28
|
+
]).join(', '),
|
|
29
|
+
'Access-Control-Allow-Methods': (corsConfig.methods || [
|
|
30
|
+
'GET',
|
|
31
|
+
'POST',
|
|
32
|
+
'PUT',
|
|
33
|
+
'DELETE',
|
|
34
|
+
'PATCH',
|
|
35
|
+
'OPTIONS'
|
|
36
|
+
]).join(', '),
|
|
37
|
+
'Access-Control-Allow-Origin': allowedOrigin
|
|
38
|
+
};
|
|
39
|
+
if (allowCredentials) {
|
|
40
|
+
headers['Access-Control-Allow-Credentials'] = 'true';
|
|
41
|
+
}
|
|
42
|
+
if (requestOrigin) {
|
|
43
|
+
headers.Vary = 'Origin';
|
|
44
|
+
}
|
|
45
|
+
return headers;
|
|
46
|
+
};
|
|
16
47
|
const getCacheDir = ()=>{
|
|
17
48
|
const cacheDir = join(homedir(), '.lex-cache');
|
|
18
49
|
if (!existsSync(cacheDir)) {
|
|
@@ -282,10 +313,13 @@ const createExpressServer = async (config, outputDir, httpPort, host, connection
|
|
|
282
313
|
const app = express();
|
|
283
314
|
// Enable CORS
|
|
284
315
|
app.use((req, res, next)=>{
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
316
|
+
const cors = config.custom?.['serverless-offline']?.cors;
|
|
317
|
+
if (cors === false) {
|
|
318
|
+
next();
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
const headers = getCorsHeaders(cors, req.header('Origin'));
|
|
322
|
+
Object.entries(headers).forEach(([name, value])=>res.header(name, value));
|
|
289
323
|
if (req.method === 'OPTIONS') {
|
|
290
324
|
res.sendStatus(200);
|
|
291
325
|
} else {
|
|
@@ -883,8 +917,10 @@ export const serverlessDev = async (cmd, callback = ()=>({}))=>{
|
|
|
883
917
|
const finalConfig = {
|
|
884
918
|
...serverlessConfig,
|
|
885
919
|
custom: {
|
|
920
|
+
...serverlessConfig.custom,
|
|
886
921
|
'serverless-offline': {
|
|
887
|
-
|
|
922
|
+
...configOffline,
|
|
923
|
+
cors: configOffline.cors ?? true,
|
|
888
924
|
host: effectiveHost,
|
|
889
925
|
httpPort: effectiveHttpPort,
|
|
890
926
|
httpsPort: effectiveHttpsPort,
|
|
@@ -949,4 +985,4 @@ export const serverlessDev = async (cmd, callback = ()=>({}))=>{
|
|
|
949
985
|
}
|
|
950
986
|
};
|
|
951
987
|
|
|
952
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzLWRldi9zZXJ2ZXJsZXNzLWRldi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGJveGVuIGZyb20gJ2JveGVuJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7cmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jLCBta2RpclN5bmMsIHdyaXRlRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7aG9tZWRpcn0gZnJvbSAnb3MnO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlLCBqb2luLCBpc0Fic29sdXRlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7cGF0aFRvRmlsZVVSTH0gZnJvbSAndXJsJztcbmltcG9ydCB7V2ViU29ja2V0U2VydmVyfSBmcm9tICd3cyc7XG5cbmltcG9ydCB7TGV4Q29uZmlnLCBnZXRQYWNrYWdlRGlyfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyLCByZW1vdmVGaWxlc30gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlcmxlc3NEZXZPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnPzogc3RyaW5nO1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBodHRwc1BvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGVzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHVzZVB1YmxpY0lwPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB3c1BvcnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFNlcnZlcmxlc3NEZXZDYWxsYmFjayA9IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGJvZHlMaW1pdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuaW50ZXJmYWNlIFdlYlNvY2tldENsaWVudExpa2Uge1xuICBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZDtcbiAgcmVhZHlTdGF0ZT86IG51bWJlcjtcbiAgc2VuZChkYXRhOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5jb25zdCBnZXRDYWNoZURpciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjYWNoZURpciA9IGpvaW4oaG9tZWRpcigpLCAnLmxleC1jYWNoZScpO1xuICBpZighZXhpc3RzU3luYyhjYWNoZURpcikpIHtcbiAgICBta2RpclN5bmMoY2FjaGVEaXIsIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgfVxuICByZXR1cm4gY2FjaGVEaXI7XG59O1xuXG5jb25zdCBnZXRDYWNoZVBhdGggPSAoKTogc3RyaW5nID0+IGpvaW4oZ2V0Q2FjaGVEaXIoKSwgJ3B1YmxpYy1pcC5qc29uJyk7XG5cbmNvbnN0IHJlYWRQdWJsaWNJcENhY2hlID0gKCk6IFB1YmxpY0lwQ2FjaGUgfCBudWxsID0+IHtcbiAgY29uc3QgY2FjaGVQYXRoID0gZ2V0Q2FjaGVQYXRoKCk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlUGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgY2FjaGVEYXRhID0gcmVhZEZpbGVTeW5jKGNhY2hlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBjYWNoZTogUHVibGljSXBDYWNoZSA9IEpTT04ucGFyc2UoY2FjaGVEYXRhKTtcblxuICAgIC8vIENoZWNrIGlmIGNhY2hlIGlzIG9sZGVyIHRoYW4gMSB3ZWVrXG4gICAgY29uc3Qgb25lV2Vla01zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgaWYoRGF0ZS5ub3coKSAtIGNhY2hlLnRpbWVzdGFtcCA+IG9uZVdlZWtNcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCB3cml0ZVB1YmxpY0lwQ2FjaGUgPSAoaXA6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSB7XG4gICAgaXAsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH07XG4gIHdyaXRlRmlsZVN5bmMoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZSwgbnVsbCwgMikpO1xufTtcblxuY29uc3QgZmV0Y2hQdWJsaWNJcCA9IChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBpZighZm9yY2VSZWZyZXNoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVhZFB1YmxpY0lwQ2FjaGUoKTtcbiAgICBpZihjYWNoZWQpIHtcbiAgICAgIHJlc29sdmUoY2FjaGVkLmlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBVc2UgZmV0Y2ggaW5zdGVhZCBvZiBodHRwc1xuICBmZXRjaCgnaHR0cHM6Ly9hcGkuaXBpZnkub3JnJylcbiAgICAudGhlbigocmVzKSA9PiByZXMudGV4dCgpKVxuICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBpcCA9IGRhdGEudHJpbSgpO1xuICAgICAgaWYoaXApIHtcbiAgICAgICAgd3JpdGVQdWJsaWNJcENhY2hlKGlwKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoaXApO1xuICAgIH0pXG4gICAgLmNhdGNoKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG59KTtcblxuY29uc3QgcmVzb2x2ZVB1YmxpY0lwRm9yRGlzcGxheSA9IGFzeW5jIChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiB7XG4gIGNvbnN0IHRpbWVvdXRNcyA9IDE1MDA7XG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8dW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpLCB0aW1lb3V0TXMpO1xuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW2ZldGNoUHVibGljSXAoZm9yY2VSZWZyZXNoKSwgdGltZW91dFByb21pc2VdKTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG5jb25zdCBkaXNwbGF5U2VydmVyU3RhdHVzID0gKFxuICBodHRwUG9ydDogbnVtYmVyLFxuICBodHRwc1BvcnQ6IG51bWJlcixcbiAgd3NQb3J0OiBudW1iZXIsXG4gIGhvc3Q6IHN0cmluZyxcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIHB1YmxpY0lwPzogc3RyaW5nXG4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBodHRwVXJsID0gYGh0dHA6Ly8ke2hvc3R9OiR7aHR0cFBvcnR9YDtcbiAgY29uc3QgaHR0cHNVcmwgPSBgaHR0cHM6Ly8ke2hvc3R9OiR7aHR0cHNQb3J0fWA7XG4gIGNvbnN0IHdzVXJsID0gYHdzOi8vJHtob3N0fToke3dzUG9ydH1gO1xuICBjb25zdCB3c3NVcmwgPSBgd3NzOi8vJHtob3N0fToke3dzUG9ydH1gO1xuXG4gIGxldCB1cmxMaW5lcyA9IGAke2NoYWxrLmdyZWVuKCdIVFRQOicpfSAgICAgICR7Y2hhbGsudW5kZXJsaW5lKGh0dHBVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdIVFRQUzonKX0gICAgICR7Y2hhbGsudW5kZXJsaW5lKGh0dHBzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV2ViU29ja2V0OicpfSAke2NoYWxrLnVuZGVybGluZSh3c1VybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ1dTUzonKX0gICAgICAgJHtjaGFsay51bmRlcmxpbmUod3NzVXJsKX1cXG5gO1xuXG4gIGlmKHB1YmxpY0lwKSB7XG4gICAgdXJsTGluZXMgKz0gYFxcbiR7Y2hhbGsuZ3JlZW4oJ1B1YmxpYzonKX0gICAgJHtjaGFsay51bmRlcmxpbmUoYGh0dHA6Ly8ke3B1YmxpY0lwfToke2h0dHBQb3J0fWApfVxcbmA7XG4gIH1cblxuICBjb25zdCBzdGF0dXNCb3ggPSBib3hlbihcbiAgICBgJHtjaGFsay5jeWFuLmJvbGQoJ/CfmoAgU2VydmVybGVzcyBEZXZlbG9wbWVudCBTZXJ2ZXIgUnVubmluZycpfVxcblxcbiR7dXJsTGluZXN9XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdQcmVzcyBDdHJsK0MgdG8gc3RvcCB0aGUgc2VydmVyJyl9YCxcbiAgICB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMWExYTFhJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnY3lhbicsXG4gICAgICBib3JkZXJTdHlsZTogJ3JvdW5kJyxcbiAgICAgIG1hcmdpbjogMSxcbiAgICAgIHBhZGRpbmc6IDFcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coYFxcbiR7c3RhdHVzQm94fVxcbmApO1xufTtcblxuY29uc3QgbG9hZEhhbmRsZXIgPSBhc3luYyAoaGFuZGxlclBhdGg6IHN0cmluZywgb3V0cHV0RGlyOiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIFBhcnNpbmcgaGFuZGxlciBwYXRoOiAke2hhbmRsZXJQYXRofWApO1xuXG4gICAgLy8gUGFyc2UgQVdTIExhbWJkYSBoYW5kbGVyIGZvcm1hdDogXCJwYXRoL3RvL2ZpbGUuZXhwb3J0TmFtZVwiIG9yIFwiZmlsZS5leHBvcnROYW1lXCJcbiAgICAvLyBFeGFtcGxlczogXCJpbmRleC5oYW5kbGVyXCIsIFwiaGFuZGxlcnMvYXBpLmhhbmRsZXJcIiwgXCJzcmMvaW5kZXguZGVmYXVsdFwiXG4gICAgY29uc3QgaGFuZGxlclBhcnRzID0gaGFuZGxlclBhdGguc3BsaXQoJy4nKTtcbiAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIEhhbmRsZXIgcGFydHMgYWZ0ZXIgc3BsaXQ6JywgaGFuZGxlclBhcnRzKTtcblxuICAgIGxldCBmaWxlUGF0aDogc3RyaW5nO1xuICAgIGxldCBleHBvcnROYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIGlmKGhhbmRsZXJQYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBBV1MgTGFtYmRhIGZvcm1hdDogXCJmaWxlLmV4cG9ydE5hbWVcIlxuICAgICAgLy8gVGFrZSB0aGUgbGFzdCBwYXJ0IGFzIGV4cG9ydCBuYW1lLCByZXN0IGFzIGZpbGUgcGF0aFxuICAgICAgLy8gSGFuZGxlIGNhc2VzIGxpa2UgXCJpbmRleC5oYW5kbGVyXCIgLT4gZmlsZTogXCJpbmRleFwiLCBleHBvcnQ6IFwiaGFuZGxlclwiXG4gICAgICAvLyBPciBcImhhbmRsZXJzL2FwaS5oYW5kbGVyXCIgLT4gZmlsZTogXCJoYW5kbGVycy9hcGlcIiwgZXhwb3J0OiBcImhhbmRsZXJcIlxuICAgICAgZXhwb3J0TmFtZSA9IGhhbmRsZXJQYXJ0c1toYW5kbGVyUGFydHMubGVuZ3RoIC0gMV0gfHwgbnVsbDtcbiAgICAgIGZpbGVQYXRoID0gaGFuZGxlclBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIFBhcnNlZCBBV1MgTGFtYmRhIGZvcm1hdCAtIGZpbGVQYXRoOiBcIiR7ZmlsZVBhdGh9XCIsIGV4cG9ydE5hbWU6IFwiJHtleHBvcnROYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNpbXBsZSBmb3JtYXQ6IGp1c3QgdGhlIGZpbGUgcGF0aFxuICAgICAgZmlsZVBhdGggPSBoYW5kbGVyUGF0aDtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gU2ltcGxlIGZvcm1hdCAtIGZpbGVQYXRoOiBcIiR7ZmlsZVBhdGh9XCJgKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgZmlsZVBhdGggZG9lc24ndCBoYXZlIHRoZSBleHBvcnQgbmFtZSBpbiBpdFxuICAgIGlmKGZpbGVQYXRoLmluY2x1ZGVzKCcuaGFuZGxlcicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuZGVmYXVsdCcpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gV0FSTklORzogZmlsZVBhdGggc3RpbGwgY29udGFpbnMgZXhwb3J0IG5hbWUhIGZpbGVQYXRoOiBcIiR7ZmlsZVBhdGh9XCJgKTtcbiAgICAgIC8vIFRyeSB0byBmaXggaXQgLSByZW1vdmUgdGhlIGxhc3QgcGFydCBpZiBpdCBsb29rcyBsaWtlIGFuIGV4cG9ydCBuYW1lXG4gICAgICBjb25zdCBwYXRoUGFydHMgPSBmaWxlUGF0aC5zcGxpdCgnLicpO1xuICAgICAgaWYocGF0aFBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZihbJ2hhbmRsZXInLCAnZGVmYXVsdCcsICdpbmRleCddLmluY2x1ZGVzKGxhc3RQYXJ0KSAmJiAhZXhwb3J0TmFtZSkge1xuICAgICAgICAgIGV4cG9ydE5hbWUgPSBsYXN0UGFydDtcbiAgICAgICAgICBmaWxlUGF0aCA9IHBhdGhQYXJ0cy5zbGljZSgwLCAtMSkuam9pbignLicpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRml4ZWQgLSBmaWxlUGF0aDogXCIke2ZpbGVQYXRofVwiLCBleHBvcnROYW1lOiBcIiR7ZXhwb3J0TmFtZX1cImApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJvdGggcmVsYXRpdmUgcGF0aHMgYW5kIGFic29sdXRlIHBhdGhzXG4gICAgbGV0IGZ1bGxQYXRoOiBzdHJpbmc7XG4gICAgaWYoaXNBYnNvbHV0ZShmaWxlUGF0aCkpIHtcbiAgICAgIGZ1bGxQYXRoID0gZmlsZVBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGxQYXRoID0gcGF0aFJlc29sdmUob3V0cHV0RGlyLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gUmVzb2x2ZWQgZnVsbFBhdGggKGJlZm9yZSBleHRlbnNpb25zKTogJHtmdWxsUGF0aH1gKTtcblxuICAgIC8vIFRyeSBkaWZmZXJlbnQgZXh0ZW5zaW9ucyBpZiBmaWxlIGRvZXNuJ3QgZXhpc3RcbiAgICBpZighZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbJy5qcycsICcubWpzJywgJy5janMnXTtcbiAgICAgIGNvbnN0IHBhdGhXaXRob3V0RXh0ID0gZnVsbFBhdGgucmVwbGFjZSgvXFwuKGpzfG1qc3xjanMpJC8sICcnKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gVHJ5aW5nIGV4dGVuc2lvbnMuIEJhc2UgcGF0aDogJHtwYXRoV2l0aG91dEV4dH1gKTtcbiAgICAgIGZvcihjb25zdCBleHQgb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcGF0aFdpdGhvdXRFeHQgKyBleHQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gQ2hlY2tpbmc6ICR7Y2FuZGlkYXRlUGF0aH0gKGV4aXN0czogJHtleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpfSlgKTtcbiAgICAgICAgaWYoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgICAgIGZ1bGxQYXRoID0gY2FuZGlkYXRlUGF0aDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEZvdW5kIGZpbGUgd2l0aCBleHRlbnNpb246ICR7ZnVsbFBhdGh9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaWxlIGV4aXN0cyB3aXRob3V0IHRyeWluZyBleHRlbnNpb25zOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRmluYWwgZnVsbFBhdGg6ICR7ZnVsbFBhdGh9YCk7XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBFeHBvcnQgbmFtZTogJHtleHBvcnROYW1lIHx8ICdkZWZhdWx0L2hhbmRsZXInfWApO1xuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhmdWxsUGF0aCl9YCk7XG5cbiAgICBpZighZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIE91dHB1dCBkaXJlY3Rvcnk6ICR7b3V0cHV0RGlyfWApO1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgcGF0aCBmcm9tIGNvbmZpZzogJHtoYW5kbGVyUGF0aH1gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSGFuZGxlciBmaWxlIG5vdCBmb3VuZDogJHtmdWxsUGF0aH1gKTtcbiAgICB9XG5cbiAgICAvLyBEeW5hbWljIGltcG9ydCBvZiB0aGUgaGFuZGxlciB3aXRoIGJldHRlciBlcnJvciBoYW5kbGluZ1xuICAgIC8vIEFkZCAuanMgZXh0ZW5zaW9uIGlmIGltcG9ydGluZyBUeXBlU2NyaXB0IGNvbXBpbGVkIG91dHB1dFxuICAgIGNvbnN0IGltcG9ydFBhdGggPSBmdWxsUGF0aC5lbmRzV2l0aCgnLnRzJykgPyBmdWxsUGF0aC5yZXBsYWNlKC9cXC50cyQvLCAnLmpzJykgOiBmdWxsUGF0aDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDb252ZXJ0IHRvIGZpbGU6Ly8gVVJMIGZvciBFUyBtb2R1bGUgaW1wb3J0cyAocmVxdWlyZWQgZm9yIGFic29sdXRlIHBhdGhzKVxuICAgICAgLy8gVXNlIHBhdGhUb0ZpbGVVUkwgdG8gZW5zdXJlIHByb3BlciBmaWxlOi8vIFVSTCBmb3JtYXRcbiAgICAgIGNvbnN0IGltcG9ydFVybCA9IHBhdGhUb0ZpbGVVUkwoaW1wb3J0UGF0aCkuaHJlZjtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gSW1wb3J0aW5nIGhhbmRsZXIgZnJvbTogJHtpbXBvcnRVcmx9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEZpbGUgcGF0aDogJHtpbXBvcnRQYXRofWApO1xuXG4gICAgICAvLyBVc2UgaW1wb3J0KCkgd2l0aCB0aGUgZmlsZSBVUkxcbiAgICAgIC8vIE5vdGU6IElmIHRoZSBoYW5kbGVyIGZpbGUgaGFzIGltcG9ydCBlcnJvcnMgKGxpa2UgbWlzc2luZyBkZXBlbmRlbmNpZXMpLFxuICAgICAgLy8gdGhvc2Ugd2lsbCBzdXJmYWNlIGhlcmUsIGJ1dCB0aGF0J3MgYSBoYW5kbGVyIGNvZGUgaXNzdWUsIG5vdCBhIGxvYWRlciBpc3N1ZVxuICAgICAgY29uc3QgaGFuZGxlck1vZHVsZSA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIG1vZHVsZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5LiBFeHBvcnRzOiAke09iamVjdC5rZXlzKGhhbmRsZXJNb2R1bGUpLmpvaW4oJywgJyl9YCk7XG5cbiAgICAgIC8vIEdldCB0aGUgaGFuZGxlciBiYXNlZCBvbiBleHBvcnQgbmFtZSBvciB0cnkgZGVmYXVsdHNcbiAgICAgIGxldCBoYW5kbGVyOiBhbnk7XG4gICAgICBpZihleHBvcnROYW1lKSB7XG4gICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyTW9kdWxlW2V4cG9ydE5hbWVdXG4gICAgICAgICAgfHwgaGFuZGxlck1vZHVsZS5kZWZhdWx0Py5bZXhwb3J0TmFtZV1cbiAgICAgICAgICB8fCBoYW5kbGVyTW9kdWxlWydtb2R1bGUuZXhwb3J0cyddPy5bZXhwb3J0TmFtZV07XG4gICAgICAgIGlmKCFoYW5kbGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEV4cG9ydCBcIiR7ZXhwb3J0TmFtZX1cIiBub3QgZm91bmQgaW4gbW9kdWxlLiBBdmFpbGFibGUgZXhwb3J0czogJHtPYmplY3Qua2V5cyhoYW5kbGVyTW9kdWxlKS5qb2luKCcsICcpfWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUcnkgZGVmYXVsdCwgaGFuZGxlciwgb3IgdGhlIG1vZHVsZSBpdHNlbGZcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJNb2R1bGUuZGVmYXVsdCB8fCBoYW5kbGVyTW9kdWxlLmhhbmRsZXIgfHwgaGFuZGxlck1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfSwgaXNGdW5jdGlvbjogJHt0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJ31gKTtcblxuICAgICAgaWYodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgaXMgbm90IGEgZnVuY3Rpb24uIFR5cGU6ICR7dHlwZW9mIGhhbmRsZXJ9LCBWYWx1ZTpgLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH0gY2F0Y2goaW1wb3J0RXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEltcG9ydCBlcnJvciBmb3IgaGFuZGxlciAke2hhbmRsZXJQYXRofTpgLCBpbXBvcnRFcnJvci5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBJbXBvcnQgZXJyb3Igc3RhY2s6JywgaW1wb3J0RXJyb3Iuc3RhY2spO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9yIChjb21tb24gd2l0aCBFUyBtb2R1bGVzKVxuICAgICAgaWYoaW1wb3J0RXJyb3IubWVzc2FnZSAmJiBpbXBvcnRFcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDYW5ub3QgZmluZCBtb2R1bGUnKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gVGhpcyBhcHBlYXJzIHRvIGJlIGEgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9yLicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gVGhlIGhhbmRsZXIgZmlsZSBleGlzdHMsIGJ1dCBvbmUgb2YgaXRzIGltcG9ydHMgaXMgZmFpbGluZy4nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIENoZWNrIHRoYXQgYWxsIGRlcGVuZGVuY2llcyBpbiB0aGUgaGFuZGxlciBmaWxlIGFyZSBwcm9wZXJseSBpbnN0YWxsZWQuJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZpbGU6ICR7aW1wb3J0UGF0aH1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIE1ha2Ugc3VyZSB0aGUgaGFuZGxlciBhbmQgaXRzIGRlcGVuZGVuY2llcyBhcmUgY29tcGlsZWQgY29ycmVjdGx5LicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06YCwgZXJyb3IubWVzc2FnZSk7XG4gICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIEVycm9yIHN0YWNrOicsIGVycm9yLnN0YWNrKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3QgY2FwdHVyZUNvbnNvbGVMb2dzID0gKGhhbmRsZXI6IChldmVudDogYW55LCBjb250ZXh0OiBhbnkpID0+IFByb21pc2U8YW55PiwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgLy8gQ2FwdHVyZSBjb25zb2xlLmxvZywgY29uc29sZS5lcnJvciwgZXRjLlxuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVXYXJuID0gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUluZm8gPSBjb25zb2xlLmluZm87XG5cbiAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0xPR10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbRVJST1JdICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtXQVJOXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlV2FybiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtJTkZPXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlSW5mbyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBPdXRwdXQgY2FwdHVyZWQgbG9nc1xuICAgICAgaWYobG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyYXkobG9nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gRW5kIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbnNvbGUgbWV0aG9kc1xuICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4gPSBvcmlnaW5hbENvbnNvbGVXYXJuO1xuICAgICAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlSW5mbztcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVFeHByZXNzU2VydmVyID0gYXN5bmMgKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICBodHRwUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIGNvbm5lY3Rpb25SZWdpc3RyeTogTWFwPHN0cmluZywgV2ViU29ja2V0Q2xpZW50TGlrZT4sXG4gIHF1aWV0OiBib29sZWFuLFxuICBkZWJ1ZzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBFbmFibGUgQ09SU1xuICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsICdHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBQQVRDSCwgT1BUSU9OUycpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJywgJ3RydWUnKTtcblxuICAgIGlmKHJlcS5tZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgICAgcmVzLnNlbmRTdGF0dXMoMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGFyc2UgcmF3IHdlYnNvY2tldCBtYW5hZ2VtZW50IEFQSSBwYXlsb2Fkc1xuICBhcHAudXNlKGV4cHJlc3MucmF3KHtsaW1pdDogJzEwbWInLCB0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ30pKTtcblxuICAvLyBQcmVzZXJ2ZSBtdWx0aXBhcnQgdXBsb2FkcyBhcyByYXcgTGFtYmRhLXN0eWxlIGJvZGllcyBzbyB1cGxvYWQgaGFuZGxlcnMgY2FuIHBhcnNlIGJvdW5kYXJpZXMuXG4gIGFwcC51c2UoZXhwcmVzcy5yYXcoe1xuICAgIGxpbWl0OiBjb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ib2R5TGltaXQgfHwgJzI1bWInLFxuICAgIHR5cGU6IChyZXEpID0+IFN0cmluZyhyZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10gfHwgJycpLmluY2x1ZGVzKCdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfSkpO1xuXG4gIC8vIFBhcnNlIEpTT04gYm9kaWVzXG4gIGFwcC51c2UoZXhwcmVzcy5qc29uKHtsaW1pdDogY29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uYm9keUxpbWl0IHx8ICcyNW1iJ30pKTtcblxuICBhcHAucG9zdChbJy9AY29ubmVjdGlvbnMvOmNvbm5lY3Rpb25JZCcsICcvOnN0YWdlL0Bjb25uZWN0aW9ucy86Y29ubmVjdGlvbklkJ10sIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IFN0cmluZyhyZXEucGFyYW1zLmNvbm5lY3Rpb25JZCB8fCAnJyk7XG4gICAgY29uc3Qgd3MgPSBjb25uZWN0aW9uUmVnaXN0cnkuZ2V0KGNvbm5lY3Rpb25JZCk7XG5cbiAgICBpZighd3MpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDEwKS5qc29uKHttZXNzYWdlOiAnR29uZSd9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYm9keSA9ICcnO1xuXG4gICAgaWYoQnVmZmVyLmlzQnVmZmVyKHJlcS5ib2R5KSkge1xuICAgICAgYm9keSA9IHJlcS5ib2R5LnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgfSBlbHNlIGlmKHR5cGVvZiByZXEuYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJvZHkgPSByZXEuYm9keTtcbiAgICB9IGVsc2UgaWYocmVxLmJvZHkgIT09IHVuZGVmaW5lZCAmJiByZXEuYm9keSAhPT0gbnVsbCAmJiByZXEuYm9keSAhPT0gJycpIHtcbiAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXEuYm9keSk7XG4gICAgfVxuXG4gICAgaWYoYm9keSkge1xuICAgICAgd3Muc2VuZChib2R5KTtcbiAgICB9XG5cbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7b2s6IHRydWV9KTtcbiAgfSk7XG5cbiAgLy8gTG9hZCBHcmFwaFFMIGhhbmRsZXJcbiAgY29uc3QgbG9hZEdyYXBoUUxTY2hlbWEgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBmaW5kIGEgR3JhcGhRTCBoYW5kbGVyXG4gICAgICBsZXQgZ3JhcGhxbEhhbmRsZXIgPSBudWxsO1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCAmJiBldmVudC5odHRwLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBHcmFwaFFMIGVuZHBvaW50c1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9wdWJsaWMnIHx8IGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9ncmFwaHFsJykge1xuICAgICAgICAgICAgICAgICAgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihmdW5jdGlvbkNvbmZpZy5oYW5kbGVyLCBvdXRwdXREaXIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgbG9nKCdGb3VuZCBHcmFwaFFMIGhhbmRsZXInLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgcmV0dXJuIGdyYXBocWxIYW5kbGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBFcnJvciBsb2FkaW5nIEdyYXBoUUwgaGFuZGxlcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgdXAgR3JhcGhRTCBoYW5kbGVyIGZvciBHcmFwaFFMIHJlcXVlc3RzXG4gIHRyeSB7XG4gICAgY29uc3QgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkR3JhcGhRTFNjaGVtYSgpO1xuICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAvLyBGaW5kIHRoZSBHcmFwaFFMIHBhdGggZnJvbSB0aGUgc2VydmVybGVzcyBjb25maWdcbiAgICAgIGxldCBncmFwaHFsUGF0aCA9ICcvZ3JhcGhxbCc7IC8vIGRlZmF1bHQgZmFsbGJhY2tcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW19mdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudD8uaHR0cD8ucGF0aCkge1xuICAgICAgICAgICAgICAgIGdyYXBocWxQYXRoID0gZXZlbnQuaHR0cC5wYXRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxQYXRoICE9PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIEdyYXBoUUwgZW5kcG9pbnQgd2l0aCBlbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICBhcHAudXNlKGdyYXBocWxQYXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgLy8gR3JhcGhRTCBEZWJ1ZyBMb2dnaW5nXG4gICAgICAgIGlmKGRlYnVnICYmIHJlcS5ib2R5ICYmIHJlcS5ib2R5LnF1ZXJ5KSB7XG4gICAgICAgICAgbG9nKCfwn5SNIEdyYXBoUUwgRGVidWcgTW9kZTogQW5hbHl6aW5nIHJlcXVlc3QuLi4nLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBsb2coYPCfk50gR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhg8J+TiiBHcmFwaFFMIFZhcmlhYmxlczogJHtKU09OLnN0cmluZ2lmeShyZXEuYm9keS52YXJpYWJsZXMsIG51bGwsIDIpfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXEuYm9keS5vcGVyYXRpb25OYW1lKSB7XG4gICAgICAgICAgICBsb2coYPCfj7fvuI8gIEdyYXBoUUwgT3BlcmF0aW9uOiAke3JlcS5ib2R5Lm9wZXJhdGlvbk5hbWV9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5oYW5jZWQgY29uc29sZS5sb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGFyZ3MubWFwKChhcmcpID0+XG4gICAgICAgICAgICAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpIDogU3RyaW5nKGFyZykpXG4gICAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgICAgbG9ncy5wdXNoKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyhgW0dyYXBoUUxdICR7bG9nTWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2dyYXBocWwnLFxuICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiAnYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpncmFwaHFsJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6ICcvYXdzL2xhbWJkYS9ncmFwaHFsJyxcbiAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICByZXEsXG4gICAgICAgICAgcmVzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhncmFwaHFsSGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIEdyYXBoUUwgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKHtcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcGF0aDogZ3JhcGhxbFBhdGgsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9XG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdFxuICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICAgICAgbG9nKGBHcmFwaFFMIGhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2coYEdyYXBoUUwgZW5kcG9pbnQgYXZhaWxhYmxlIGF0IGh0dHA6Ly8ke2hvc3R9OiR7aHR0cFBvcnR9JHtncmFwaHFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHNldHRpbmcgdXAgR3JhcGhRTDogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tR3JhcGhRTCByb3V0ZXMgLSBoYW5kbGUgYWxsIHJlbWFpbmluZyByb3V0ZXNcbiAgYXBwLnVzZSgnLycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgfHwgJ0dFVCc7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHJlcS5wYXRoIHx8IHVybC5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG5cbiAgICAgIC8vIEFsd2F5cyBsb2cgcmVxdWVzdHMgKG5vdCBhZmZlY3RlZCBieSBxdWlldCBmbGFnIGZvciBkZWJ1Z2dpbmcpXG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdICR7bWV0aG9kfSAke3VybH0gKHBhdGhuYW1lOiAke3BhdGhuYW1lfSlgKTtcblxuICAgICAgLy8gRmluZCBtYXRjaGluZyBmdW5jdGlvblxuICAgICAgbGV0IG1hdGNoZWRGdW5jdGlvbiA9IG51bGw7XG4gICAgICBjb25zdCBmdW5jdGlvbnMgPSBjb25maWcuZnVuY3Rpb25zIHx8IHt9O1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZXMgPSBPYmplY3Qua2V5cyhmdW5jdGlvbnMpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEF2YWlsYWJsZSBmdW5jdGlvbnM6ICR7ZnVuY3Rpb25OYW1lcy5qb2luKCcsICcpfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIENvbmZpZyBmdW5jdGlvbnM6JywgSlNPTi5zdHJpbmdpZnkoZnVuY3Rpb25zLCBudWxsLCAyKSk7XG5cbiAgICAgICAgZm9yKGNvbnN0IFtmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhmdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudFBhdGggPSBldmVudC5odHRwLnBhdGggfHwgJy8nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50TWV0aG9kID0gKGV2ZW50Lmh0dHAubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RNZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gQ2hlY2tpbmcgZnVuY3Rpb24gJHtmdW5jdGlvbk5hbWV9OiBwYXRoPVwiJHtldmVudFBhdGh9XCIsIG1ldGhvZD1cIiR7ZXZlbnRNZXRob2R9XCIgYWdhaW5zdCBwYXRobmFtZT1cIiR7cGF0aG5hbWV9XCIsIG1ldGhvZD1cIiR7cmVxdWVzdE1ldGhvZH1cImApO1xuXG4gICAgICAgICAgICAgICAgLy8gSW1wcm92ZWQgcGF0aCBtYXRjaGluZyAtIGNvbXBhcmUgcGF0aG5hbWUgd2l0aG91dCBxdWVyeSBzdHJpbmdcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgcGF0aHMgKHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzIGZvciBjb21wYXJpc29uKVxuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFdmVudFBhdGggPSBldmVudFBhdGgucmVwbGFjZSgvXFwvJC8sICcnKSB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvXFwvJC8sICcnKSB8fCAnLyc7XG5cbiAgICAgICAgICAgICAgICBpZihub3JtYWxpemVkRXZlbnRQYXRoID09PSBub3JtYWxpemVkUGF0aG5hbWUgJiYgZXZlbnRNZXRob2QgPT09IHJlcXVlc3RNZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgIG1hdGNoZWRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10g4pyTIE1hdGNoZWQgZnVuY3Rpb246ICR7bWF0Y2hlZEZ1bmN0aW9ufWApO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIE5vIGZ1bmN0aW9ucyBmb3VuZCBpbiBjb25maWcnKTtcbiAgICAgIH1cblxuICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dKSB7XG4gICAgICAgIC8vIFJlc29sdmUgaGFuZGxlciBwYXRoIHJlbGF0aXZlIHRvIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBmdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXS5oYW5kbGVyO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIExvYWRpbmcgaGFuZGxlcjogJHtoYW5kbGVyUGF0aH0gZnJvbSBvdXRwdXREaXI6ICR7b3V0cHV0RGlyfWApO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoaGFuZGxlclBhdGgsIG91dHB1dERpcik7XG5cbiAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gSGFuZGxlciBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCB0eXBlOiAke3R5cGVvZiBoYW5kbGVyfWApO1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcblxuICAgICAgICAgIGNvbnN0IGlzUmF3Qm9keSA9IEJ1ZmZlci5pc0J1ZmZlcihyZXEuYm9keSk7XG4gICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICBib2R5OiBpc1Jhd0JvZHkgPyByZXEuYm9keS50b1N0cmluZygnYmFzZTY0JykgOiByZXEuYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgaXNCYXNlNjRFbmNvZGVkOiBpc1Jhd0JvZHksXG4gICAgICAgICAgICBwYXRoOiB1cmwsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHJlcS5xdWVyeVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHttYXRjaGVkRnVuY3Rpb259YCxcbiAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBDYWxsaW5nIGhhbmRsZXIgd2l0aCBldmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIHJldHVybmVkOicsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuXG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gSGFuZGxlciBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIGVycm9yIHN0YWNrOicsIGVycm9yLnN0YWNrKTtcbiAgICAgICAgICAgIGxvZyhgSGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBub3QgZm91bmQgZm9yIGZ1bmN0aW9uOiAke21hdGNoZWRGdW5jdGlvbn1gKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoOiAke2hhbmRsZXJQYXRofSwgT3V0cHV0IGRpcjogJHtvdXRwdXREaXJ9YCk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBGdW5jdGlvbiBub3QgZm91bmQgZm9yIHBhdGhuYW1lOiAke3BhdGhuYW1lfSwgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEF2YWlsYWJsZSBmdW5jdGlvbnM6ICR7Y29uZmlnLmZ1bmN0aW9ucyA/IE9iamVjdC5rZXlzKGZ1bmN0aW9ucykuam9pbignLCAnKSA6ICdub25lJ31gKTtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnRnVuY3Rpb24gbm90IGZvdW5kJ30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGxvZyhgUm91dGUgaGFuZGxpbmcgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhcHA7XG59O1xuXG5jb25zdCBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIgPSAoXG4gIGNvbmZpZzogU2VydmVybGVzc0NvbmZpZyxcbiAgb3V0cHV0RGlyOiBzdHJpbmcsXG4gIHdzUG9ydDogbnVtYmVyLFxuICBjb25uZWN0aW9uUmVnaXN0cnk6IE1hcDxzdHJpbmcsIFdlYlNvY2tldENsaWVudExpa2U+LFxuICBxdWlldDogYm9vbGVhbixcbiAgZGVidWc6IGJvb2xlYW5cbikgPT4ge1xuICBjb25zdCB3c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB3c1BvcnR9KTtcblxuICBjb25zdCBnZXRXZWJTb2NrZXRGdW5jdGlvbkJ5Um91dGUgPSAocm91dGVLZXk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IGNvbmZpZy5mdW5jdGlvbnMgfHwge307XG4gICAgbGV0IGRlZmF1bHRGdW5jdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGZ1bmN0aW9ucykpIHtcbiAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgaWYoZXZlbnQud2Vic29ja2V0KSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZSA9IGV2ZW50LndlYnNvY2tldC5yb3V0ZSB8fCAnJGNvbm5lY3QnO1xuXG4gICAgICAgICAgICBpZihyb3V0ZSA9PT0gcm91dGVLZXkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYocm91dGUgPT09ICckZGVmYXVsdCcgJiYgIWRlZmF1bHRGdW5jdGlvbikge1xuICAgICAgICAgICAgICBkZWZhdWx0RnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRGdW5jdGlvbjtcbiAgfTtcblxuICB3c3Mub24oJ2Nvbm5lY3Rpb24nLCBhc3luYyAod3M6IFdlYlNvY2tldENsaWVudExpa2UsIHJlcTogYW55KSA9PiB7XG4gICAgbG9nKGBXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZDogJHtyZXEudXJsfWAsICdpbmZvJywgZmFsc2UpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IHJhbmRvbVVVSUQoKS5yZXBsYWNlKC8tL2csICcnKS5zbGljZSgwLCAzMik7XG4gICAgY29ubmVjdGlvblJlZ2lzdHJ5LnNldChjb25uZWN0aW9uSWQsIHdzKTtcbiAgICBjb25zdCByZXF1ZXN0VXJsID0gbmV3IFVSTChyZXEudXJsIHx8ICcvJywgYHdzOi8vbG9jYWxob3N0OiR7d3NQb3J0fWApO1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyA9IE9iamVjdC5mcm9tRW50cmllcyhyZXF1ZXN0VXJsLnNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpO1xuICAgIGNvbnN0IG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQoQXJyYXkuZnJvbShyZXF1ZXN0VXJsLnNlYXJjaFBhcmFtcy5rZXlzKCkpKSlcbiAgICAgICAgLm1hcCgoa2V5KSA9PiBba2V5LCByZXF1ZXN0VXJsLnNlYXJjaFBhcmFtcy5nZXRBbGwoa2V5KV0pXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbm5lY3RGdW5jdGlvbiA9IGdldFdlYlNvY2tldEZ1bmN0aW9uQnlSb3V0ZSgnJGNvbm5lY3QnKTtcblxuICAgIGlmKGNvbm5lY3RGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zPy5bY29ubmVjdEZ1bmN0aW9uXSkge1xuICAgICAgY29uc3QgY29ubmVjdEhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihjb25maWcuZnVuY3Rpb25zW2Nvbm5lY3RGdW5jdGlvbl0uaGFuZGxlciwgb3V0cHV0RGlyKTtcblxuICAgICAgaWYoY29ubmVjdEhhbmRsZXIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZENvbm5lY3RIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGNvbm5lY3RIYW5kbGVyLCBxdWlldCk7XG4gICAgICAgIGF3YWl0IHdyYXBwZWRDb25uZWN0SGFuZGxlcih7XG4gICAgICAgICAgYm9keTogbnVsbCxcbiAgICAgICAgICBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzLFxuICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyxcbiAgICAgICAgICByZXF1ZXN0Q29udGV4dDoge1xuICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICBlbmRwb2ludDogYHdzOi8vbG9jYWxob3N0OiR7d3NQb3J0fWBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25uZWN0aW9uSWQsXG4gICAgICAgICAgICBldmVudFR5cGU6ICdDT05ORUNUJyxcbiAgICAgICAgICAgIHJvdXRlS2V5OiAnJGNvbm5lY3QnXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IGNvbm5lY3RGdW5jdGlvbixcbiAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgIGludm9rZWRGdW5jdGlvbkFybjogYGFybjphd3M6bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246JHtjb25uZWN0RnVuY3Rpb259YCxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Nvbm5lY3RGdW5jdGlvbn1gLFxuICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgIG1lbW9yeUxpbWl0SW5NQjogJzEyOCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd3Mub24oJ21lc3NhZ2UnLCBhc3luYyAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgV2ViU29ja2V0IGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9ucyA9IGNvbmZpZy5mdW5jdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGdW5jdGlvbiA9IGdldFdlYlNvY2tldEZ1bmN0aW9uQnlSb3V0ZShTdHJpbmcoZGF0YS5hY3Rpb24gfHwgJyRkZWZhdWx0JykpO1xuXG4gICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBmdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXSkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihmdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXS5oYW5kbGVyLCBvdXRwdXREaXIpO1xuXG4gICAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoaGFuZGxlciwgcXVpZXQpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICAgIGJvZHk6IG1lc3NhZ2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBhcGlHYXRld2F5OiB7XG4gICAgICAgICAgICAgICAgICBlbmRwb2ludDogYHdzOi8vbG9jYWxob3N0OiR7d3NQb3J0fWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgICAgICAgICAgICByb3V0ZUtleTogZGF0YS5hY3Rpb24gfHwgJyRkZWZhdWx0J1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IG1hdGNoZWRGdW5jdGlvbixcbiAgICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgICAgIGludm9rZWRGdW5jdGlvbkFybjogYGFybjphd3M6bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246JHttYXRjaGVkRnVuY3Rpb259YCxcbiAgICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHttYXRjaGVkRnVuY3Rpb259YCxcbiAgICAgICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgICAgIG1lbW9yeUxpbWl0SW5NQjogJzEyOCdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gSGFuZGxlIExhbWJkYSByZXNwb25zZSBmb3JtYXQgZm9yIFdlYlNvY2tldFxuICAgICAgICAgICAgaWYocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBhIGZyYW1lIHdoZW4gdGhlIGhhbmRsZXIgcmV0dXJuZWQgYSByZWFsIGJvZHkuXG4gICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB0eXBlb2YgcmVzdWx0LmJvZHkgPT09ICdzdHJpbmcnID8gcmVzdWx0LmJvZHkgOiAnJztcbiAgICAgICAgICAgICAgaWYoYm9keSkge1xuICAgICAgICAgICAgICAgIHdzLnNlbmQoYm9keSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZihyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IHJlc3BvbnNlLCBzdHJpbmdpZnkgaXQuXG4gICAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogJ1dlYlNvY2tldCBmdW5jdGlvbiBub3QgZm91bmQnfSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogZXJyb3IubWVzc2FnZX0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGNvbm5lY3Rpb25SZWdpc3RyeS5kZWxldGUoY29ubmVjdGlvbklkKTtcbiAgICAgIGNvbnN0IGRpc2Nvbm5lY3RGdW5jdGlvbiA9IGdldFdlYlNvY2tldEZ1bmN0aW9uQnlSb3V0ZSgnJGRpc2Nvbm5lY3QnKTtcblxuICAgICAgaWYoZGlzY29ubmVjdEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnM/LltkaXNjb25uZWN0RnVuY3Rpb25dKSB7XG4gICAgICAgIHZvaWQgbG9hZEhhbmRsZXIoY29uZmlnLmZ1bmN0aW9uc1tkaXNjb25uZWN0RnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcilcbiAgICAgICAgICAudGhlbigoZGlzY29ubmVjdEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgIGlmKCFkaXNjb25uZWN0SGFuZGxlcikge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkRGlzY29ubmVjdEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoZGlzY29ubmVjdEhhbmRsZXIsIHF1aWV0KTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRGlzY29ubmVjdEhhbmRsZXIoe1xuICAgICAgICAgICAgICBib2R5OiBudWxsLFxuICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dDoge1xuICAgICAgICAgICAgICAgIGFwaUdhdGV3YXk6IHtcbiAgICAgICAgICAgICAgICAgIGVuZHBvaW50OiBgd3M6Ly9sb2NhbGhvc3Q6JHt3c1BvcnR9YFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ0RJU0NPTk5FQ1QnLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiAnJGRpc2Nvbm5lY3QnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBkaXNjb25uZWN0RnVuY3Rpb24sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7ZGlzY29ubmVjdEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7ZGlzY29ubmVjdEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICBsb2coYFdlYlNvY2tldCBkaXNjb25uZWN0IGhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGxvZygnV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3c3M7XG59O1xuXG5jb25zdCBsb2FkRW52RmlsZSA9IChlbnZQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmKCFleGlzdHNTeW5jKGVudlBhdGgpKSB7XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudkNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGVudkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzXG4gICAgICBpZighdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBLRVk9dmFsdWUgZm9ybWF0XG4gICAgICBjb25zdCBlcXVhbEluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZignPScpO1xuICAgICAgaWYoZXF1YWxJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTtcblxuICAgICAgICAvLyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgY2xlYW5WYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuXG4gICAgICAgIGlmKGtleSkge1xuICAgICAgICAgIGVudlZhcnNba2V5XSA9IGNsZWFuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFdhcm5pbmc6IENvdWxkIG5vdCBsb2FkIC5lbnYgZmlsZSBhdCAke2VudlBhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gZW52VmFycztcbn07XG5cbmV4cG9ydCBjb25zdCBzZXJ2ZXJsZXNzRGV2ID0gYXN5bmMgKFxuICBjbWQ6IFNlcnZlcmxlc3NEZXZPcHRpb25zLFxuICBjYWxsYmFjazogU2VydmVybGVzc0RldkNhbGxiYWNrID0gKCkgPT4gKHt9KVxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb25maWcsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBob3N0OiBjbGlIb3N0LFxuICAgIGh0dHBQb3J0OiBjbGlIdHRwUG9ydCxcbiAgICBodHRwc1BvcnQ6IGNsaUh0dHBzUG9ydCxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHJlbW92ZSA9IGZhbHNlLFxuICAgIHRlc3QgPSBmYWxzZSxcbiAgICB1c2VQdWJsaWNJcCxcbiAgICB2YXJpYWJsZXMsXG4gICAgd3NQb3J0OiBjbGlXc1BvcnRcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzXG4gIGNvbnN0IGVudlBhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYubG9jYWwnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5kZXZlbG9wbWVudCcpXG4gIF07XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvLyBMb2FkIGZyb20gLmVudiBmaWxlcyBpbiBvcmRlciAobGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKVxuICBmb3IoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGZpbGVFbnZWYXJzID0gbG9hZEVudkZpbGUoZW52UGF0aCk7XG4gICAgaWYoT2JqZWN0LmtleXMoZmlsZUVudlZhcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZyhgTG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tOiAke2VudlBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGVudlZhcnMgPSB7Li4uZW52VmFycywgLi4uZmlsZUVudlZhcnN9O1xuICB9XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IE5PREVfRU5WIGFuZCBsb2FkZWQgLmVudiB2YXJpYWJsZXNcbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnLCAuLi5lbnZWYXJzfTtcblxuICAvLyBPdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgaWYgcHJvdmlkZWRcbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaVZhcnMgPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgICB2YXJpYWJsZXNPYmogPSB7Li4udmFyaWFibGVzT2JqLCAuLi5jbGlWYXJzfTtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgLy8gSWYgaW4gdGVzdCBtb2RlLCBleGl0IGVhcmx5IGFmdGVyIGxvYWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogRW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICAvLyBMb2FkIHNlcnZlcmxlc3MgY29uZmlndXJhdGlvblxuICBsZXQgc2VydmVybGVzc0NvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgLy8gVXNlIGdldFBhY2thZ2VEaXIgdG8gaGFuZGxlIG5wbSB3b3Jrc3BhY2VzIGNvcnJlY3RseVxuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG5cbiAgICAvLyBUcnkgbXVsdGlwbGUgY29uZmlnIGZpbGUgZm9ybWF0c1xuICAgIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBjb25maWcgPyBbY29uZmlnXSA6IFtcbiAgICAgIHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICdsZXguY29uZmlnLm1qcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcuanMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICdsZXguY29uZmlnLmNqcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcudHMnKVxuICAgIF07XG5cbiAgICBsZXQgY29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yKGNvbnN0IGNhbmRpZGF0ZVBhdGggb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgaWYoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgICBjb25maWdQYXRoID0gY2FuZGlkYXRlUGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnUGF0aCkge1xuICAgICAgbG9nKGBMb2FkaW5nIHNlcnZlcmxlc3MgY29uZmlnIGZyb206ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIGNvbnN0IGNvbmZpZ01vZHVsZSA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgIHNlcnZlcmxlc3NDb25maWcgPSBjb25maWdNb2R1bGUuZGVmYXVsdD8uc2VydmVybGVzcyB8fCBjb25maWdNb2R1bGUuc2VydmVybGVzcyB8fCB7fTtcbiAgICAgIGxvZygnU2VydmVybGVzcyBjb25maWcgbG9hZGVkIHN1Y2Nlc3NmdWxseScsICdpbmZvJywgcXVpZXQpO1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IE9iamVjdC5rZXlzKHNlcnZlcmxlc3NDb25maWcuZnVuY3Rpb25zIHx8IHt9KTtcbiAgICAgIGxvZyhgTG9hZGVkIGZ1bmN0aW9uczogJHtmdW5jdGlvbk5hbWVzLmxlbmd0aCA+IDAgPyBmdW5jdGlvbk5hbWVzLmpvaW4oJywgJykgOiAnbm9uZSd9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIC8vIERlYnVnOiBQcmludCBmdWxsIGNvbmZpZyBpZiBkZWJ1ZyBtb2RlXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYEZ1bGwgc2VydmVybGVzcyBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkoc2VydmVybGVzc0NvbmZpZywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgTm8gc2VydmVybGVzcyBjb25maWcgZm91bmQuIFRyaWVkOiAke2NvbmZpZ0Zvcm1hdHMuam9pbignLCAnKX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIGxvYWRpbmcgc2VydmVybGVzcyBjb25maWc6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgaWYoZGVidWcpIHtcbiAgICAgIGxvZyhgQ29uZmlnIGVycm9yIHN0YWNrOiAke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgZXhpdCwgY29udGludWUgd2l0aCBlbXB0eSBjb25maWdcbiAgfVxuXG4gIC8vIE1lcmdlIGNvbmZpZyB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb25zXG4gIC8vIERldGVybWluZSBlZmZlY3RpdmUgaG9zdC9wb3J0cyB3aXRoIGNvcnJlY3QgcHJlY2VkZW5jZTogQ0xJID4gY29uZmlnID4gZGVmYXVsdHNcbiAgY29uc3QgY29uZmlnT2ZmbGluZSA9IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIHx8IHt9O1xuICBjb25zdCBlZmZlY3RpdmVIb3N0ID0gKGNsaUhvc3QgPz8gY29uZmlnT2ZmbGluZS5ob3N0ID8/ICdsb2NhbGhvc3QnKSBhcyBzdHJpbmc7XG4gIGNvbnN0IHRvTnVtYmVyID0gKHY6IGFueSwgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgaWYodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwgfHwgdiA9PT0gJycpIHtcbiAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICB9XG5cbiAgICBjb25zdCBuID0gdHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IHBhcnNlSW50KFN0cmluZyh2KSk7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiBmYWxsYmFjaztcbiAgfTtcbiAgY29uc3QgZWZmZWN0aXZlSHR0cFBvcnQgPSB0b051bWJlcihjbGlIdHRwUG9ydCA/PyBjb25maWdPZmZsaW5lLmh0dHBQb3J0LCAzMTAwKTtcbiAgY29uc3QgZWZmZWN0aXZlSHR0cHNQb3J0ID0gdG9OdW1iZXIoY2xpSHR0cHNQb3J0ID8/IGNvbmZpZ09mZmxpbmUuaHR0cHNQb3J0LCAzMTAxKTtcbiAgY29uc3QgZWZmZWN0aXZlV3NQb3J0ID0gdG9OdW1iZXIoY2xpV3NQb3J0ID8/IGNvbmZpZ09mZmxpbmUud3NQb3J0LCAzMTAyKTtcblxuICBjb25zdCBmaW5hbENvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHtcbiAgICAuLi5zZXJ2ZXJsZXNzQ29uZmlnLFxuICAgIGN1c3RvbToge1xuICAgICAgJ3NlcnZlcmxlc3Mtb2ZmbGluZSc6IHtcbiAgICAgICAgY29yczogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LmNvcnMgIT09IGZhbHNlLFxuICAgICAgICBob3N0OiBlZmZlY3RpdmVIb3N0LFxuICAgICAgICBodHRwUG9ydDogZWZmZWN0aXZlSHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogZWZmZWN0aXZlSHR0cHNQb3J0LFxuICAgICAgICB3c1BvcnQ6IGVmZmVjdGl2ZVdzUG9ydFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcbiAgbG9nKGBVc2luZyBvdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gLCAnaW5mbycsIHF1aWV0KTtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1N0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBodHRwUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwUG9ydCE7XG4gICAgY29uc3Qgd3NQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLndzUG9ydCE7XG4gICAgY29uc3QgaG9zdCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5ob3N0ITtcbiAgICBjb25zdCBjb25uZWN0aW9uUmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgV2ViU29ja2V0Q2xpZW50TGlrZT4oKTtcblxuICAgIGxvZyhgQ3JlYXRpbmcgSFRUUCBzZXJ2ZXIgb24gJHtob3N0fToke2h0dHBQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgQ3JlYXRpbmcgV2ViU29ja2V0IHNlcnZlciBvbiBwb3J0ICR7d3NQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gQ3JlYXRlIEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3QgZXhwcmVzc0FwcCA9IGF3YWl0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIGh0dHBQb3J0LFxuICAgICAgaG9zdCxcbiAgICAgIGNvbm5lY3Rpb25SZWdpc3RyeSxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIFdlYlNvY2tldCBzZXJ2ZXJcbiAgICBjb25zdCB3c1NlcnZlciA9IGNyZWF0ZVdlYlNvY2tldFNlcnZlcihcbiAgICAgIGZpbmFsQ29uZmlnLFxuICAgICAgb3V0cHV0RGlyLFxuICAgICAgd3NQb3J0LFxuICAgICAgY29ubmVjdGlvblJlZ2lzdHJ5LFxuICAgICAgcXVpZXQsXG4gICAgICBkZWJ1Z1xuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgc2VydmVyIGVycm9yc1xuICAgIHdzU2VydmVyLm9uKCdlcnJvcicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcbiAgICAgIHZvaWQgcmVzb2x2ZVB1YmxpY0lwRm9yRGlzcGxheSh1c2VQdWJsaWNJcCkudGhlbigocHVibGljSXApID0+IHtcbiAgICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cHNQb3J0ISxcbiAgICAgICAgICB3c1BvcnQsXG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBxdWlldCxcbiAgICAgICAgICBwdWJsaWNJcFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgRXhwcmVzcyBzZXJ2ZXIgZXJyb3JzXG4gICAgc2VydmVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgbG9nKGBFeHByZXNzIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IEV4cHJlc3Mgc2VydmVyLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgZ3JhY2VmdWwgc2h1dGRvd25cbiAgICBjb25zdCBzaHV0ZG93biA9ICgpID0+IHtcbiAgICAgIGxvZygnXFxuU2h1dHRpbmcgZG93biBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICB3c1NlcnZlci5jbG9zZSgpO1xuICAgICAgY2FsbGJhY2soMCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc2h1dGRvd24pO1xuXG4gICAgLy8gS2VlcCB0aGUgcHJvY2VzcyBhbGl2ZVxuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG5cbiAgICBsb2coJ1NlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyIGlzIHJ1bm5pbmcuIFByZXNzIEN0cmwrQyB0byBzdG9wLicsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gRG9uJ3QgY2FsbCBjYWxsYmFjayBoZXJlLCBsZXQgdGhlIHByb2Nlc3Mgc3RheSBhbGl2ZVxuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLicpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuIl0sIm5hbWVzIjpbImJveGVuIiwiY2hhbGsiLCJyYW5kb21VVUlEIiwiZXhwcmVzcyIsInJlYWRGaWxlU3luYyIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiaG9tZWRpciIsInJlc29sdmUiLCJwYXRoUmVzb2x2ZSIsImpvaW4iLCJpc0Fic29sdXRlIiwicGF0aFRvRmlsZVVSTCIsIldlYlNvY2tldFNlcnZlciIsIkxleENvbmZpZyIsImdldFBhY2thZ2VEaXIiLCJjcmVhdGVTcGlubmVyIiwicmVtb3ZlRmlsZXMiLCJsb2ciLCJnZXRDYWNoZURpciIsImNhY2hlRGlyIiwicmVjdXJzaXZlIiwiZ2V0Q2FjaGVQYXRoIiwicmVhZFB1YmxpY0lwQ2FjaGUiLCJjYWNoZVBhdGgiLCJjYWNoZURhdGEiLCJjYWNoZSIsIkpTT04iLCJwYXJzZSIsIm9uZVdlZWtNcyIsIkRhdGUiLCJub3ciLCJ0aW1lc3RhbXAiLCJ3cml0ZVB1YmxpY0lwQ2FjaGUiLCJpcCIsInN0cmluZ2lmeSIsImZldGNoUHVibGljSXAiLCJmb3JjZVJlZnJlc2giLCJQcm9taXNlIiwiY2FjaGVkIiwiZmV0Y2giLCJ0aGVuIiwicmVzIiwidGV4dCIsImRhdGEiLCJ0cmltIiwiY2F0Y2giLCJ1bmRlZmluZWQiLCJyZXNvbHZlUHVibGljSXBGb3JEaXNwbGF5IiwidGltZW91dE1zIiwidGltZW91dFByb21pc2UiLCJzZXRUaW1lb3V0IiwicmFjZSIsImRpc3BsYXlTZXJ2ZXJTdGF0dXMiLCJodHRwUG9ydCIsImh0dHBzUG9ydCIsIndzUG9ydCIsImhvc3QiLCJxdWlldCIsInB1YmxpY0lwIiwiaHR0cFVybCIsImh0dHBzVXJsIiwid3NVcmwiLCJ3c3NVcmwiLCJ1cmxMaW5lcyIsImdyZWVuIiwidW5kZXJsaW5lIiwic3RhdHVzQm94IiwiY3lhbiIsImJvbGQiLCJ5ZWxsb3ciLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJDb2xvciIsImJvcmRlclN0eWxlIiwibWFyZ2luIiwicGFkZGluZyIsImNvbnNvbGUiLCJsb2FkSGFuZGxlciIsImhhbmRsZXJQYXRoIiwib3V0cHV0RGlyIiwiaGFuZGxlclBhcnRzIiwic3BsaXQiLCJmaWxlUGF0aCIsImV4cG9ydE5hbWUiLCJsZW5ndGgiLCJzbGljZSIsImluY2x1ZGVzIiwiZXJyb3IiLCJwYXRoUGFydHMiLCJsYXN0UGFydCIsImZ1bGxQYXRoIiwiZXh0ZW5zaW9ucyIsInBhdGhXaXRob3V0RXh0IiwicmVwbGFjZSIsImV4dCIsImNhbmRpZGF0ZVBhdGgiLCJFcnJvciIsImltcG9ydFBhdGgiLCJlbmRzV2l0aCIsImltcG9ydFVybCIsImhyZWYiLCJoYW5kbGVyTW9kdWxlIiwiT2JqZWN0Iiwia2V5cyIsImhhbmRsZXIiLCJkZWZhdWx0IiwiaW1wb3J0RXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJjYXB0dXJlQ29uc29sZUxvZ3MiLCJldmVudCIsImNvbnRleHQiLCJvcmlnaW5hbENvbnNvbGVMb2ciLCJvcmlnaW5hbENvbnNvbGVFcnJvciIsIm9yaWdpbmFsQ29uc29sZVdhcm4iLCJ3YXJuIiwib3JpZ2luYWxDb25zb2xlSW5mbyIsImluZm8iLCJsb2dzIiwiYXJncyIsInB1c2giLCJyZXN1bHQiLCJncmF5IiwiZm9yRWFjaCIsImNyZWF0ZUV4cHJlc3NTZXJ2ZXIiLCJjb25maWciLCJjb25uZWN0aW9uUmVnaXN0cnkiLCJkZWJ1ZyIsImFwcCIsInVzZSIsInJlcSIsIm5leHQiLCJoZWFkZXIiLCJtZXRob2QiLCJzZW5kU3RhdHVzIiwicmF3IiwibGltaXQiLCJ0eXBlIiwiY3VzdG9tIiwiYm9keUxpbWl0IiwiU3RyaW5nIiwiaGVhZGVycyIsImpzb24iLCJwb3N0IiwiY29ubmVjdGlvbklkIiwicGFyYW1zIiwid3MiLCJnZXQiLCJzdGF0dXMiLCJib2R5IiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsInNlbmQiLCJvayIsImxvYWRHcmFwaFFMU2NoZW1hIiwiZ3JhcGhxbEhhbmRsZXIiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbk5hbWUiLCJmdW5jdGlvbkNvbmZpZyIsImVudHJpZXMiLCJldmVudHMiLCJodHRwIiwicGF0aCIsImdyYXBocWxQYXRoIiwiX2Z1bmN0aW9uTmFtZSIsInF1ZXJ5IiwidmFyaWFibGVzIiwib3BlcmF0aW9uTmFtZSIsImxvZ01lc3NhZ2UiLCJtYXAiLCJhcmciLCJhd3NSZXF1ZXN0SWQiLCJmdW5jdGlvblZlcnNpb24iLCJnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMiLCJpbnZva2VkRnVuY3Rpb25Bcm4iLCJsb2dHcm91cE5hbWUiLCJsb2dTdHJlYW1OYW1lIiwid3JhcHBlZEhhbmRsZXIiLCJodHRwTWV0aG9kIiwicXVlcnlTdHJpbmdQYXJhbWV0ZXJzIiwic3RhdHVzQ29kZSIsImtleSIsInZhbHVlIiwic2V0SGVhZGVyIiwidXJsIiwicGF0aG5hbWUiLCJtYXRjaGVkRnVuY3Rpb24iLCJmdW5jdGlvbk5hbWVzIiwiZXZlbnRQYXRoIiwiZXZlbnRNZXRob2QiLCJ0b1VwcGVyQ2FzZSIsInJlcXVlc3RNZXRob2QiLCJub3JtYWxpemVkRXZlbnRQYXRoIiwibm9ybWFsaXplZFBhdGhuYW1lIiwiaXNSYXdCb2R5IiwiaXNCYXNlNjRFbmNvZGVkIiwibWVtb3J5TGltaXRJbk1CIiwiY3JlYXRlV2ViU29ja2V0U2VydmVyIiwid3NzIiwicG9ydCIsImdldFdlYlNvY2tldEZ1bmN0aW9uQnlSb3V0ZSIsInJvdXRlS2V5IiwiZGVmYXVsdEZ1bmN0aW9uIiwid2Vic29ja2V0Iiwicm91dGUiLCJvbiIsInNldCIsInJlcXVlc3RVcmwiLCJVUkwiLCJmcm9tRW50cmllcyIsInNlYXJjaFBhcmFtcyIsIm11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJnZXRBbGwiLCJjb25uZWN0RnVuY3Rpb24iLCJjb25uZWN0SGFuZGxlciIsIndyYXBwZWRDb25uZWN0SGFuZGxlciIsInJlcXVlc3RDb250ZXh0IiwiYXBpR2F0ZXdheSIsImVuZHBvaW50IiwiZXZlbnRUeXBlIiwiYWN0aW9uIiwiZGVsZXRlIiwiZGlzY29ubmVjdEZ1bmN0aW9uIiwiZGlzY29ubmVjdEhhbmRsZXIiLCJ3cmFwcGVkRGlzY29ubmVjdEhhbmRsZXIiLCJsb2FkRW52RmlsZSIsImVudlBhdGgiLCJlbnZWYXJzIiwiZW52Q29udGVudCIsImxpbmVzIiwibGluZSIsInRyaW1tZWRMaW5lIiwic3RhcnRzV2l0aCIsImVxdWFsSW5kZXgiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwiY2xlYW5WYWx1ZSIsInNlcnZlcmxlc3NEZXYiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJjbGlIb3N0IiwiY2xpSHR0cFBvcnQiLCJjbGlIdHRwc1BvcnQiLCJyZW1vdmUiLCJ0ZXN0IiwidXNlUHVibGljSXAiLCJjbGlXc1BvcnQiLCJzcGlubmVyIiwicGFyc2VDb25maWciLCJvdXRwdXRGdWxsUGF0aCIsImVudlBhdGhzIiwicHJvY2VzcyIsImN3ZCIsImZpbGVFbnZWYXJzIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJjbGlWYXJzIiwiX2Vycm9yIiwiZW52Iiwic3RhcnQiLCJzdWNjZWVkIiwic2VydmVybGVzc0NvbmZpZyIsInBhY2thZ2VEaXIiLCJjb25maWdGb3JtYXRzIiwiY29uZmlnUGF0aCIsImNvbmZpZ01vZHVsZSIsInNlcnZlcmxlc3MiLCJjb25maWdPZmZsaW5lIiwiZWZmZWN0aXZlSG9zdCIsInRvTnVtYmVyIiwidiIsImZhbGxiYWNrIiwibiIsInBhcnNlSW50IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJlZmZlY3RpdmVIdHRwUG9ydCIsImVmZmVjdGl2ZUh0dHBzUG9ydCIsImVmZmVjdGl2ZVdzUG9ydCIsImZpbmFsQ29uZmlnIiwiY29ycyIsIk1hcCIsImV4cHJlc3NBcHAiLCJ3c1NlcnZlciIsImZhaWwiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJzaHV0ZG93biIsImNsb3NlIiwic3RkaW4iLCJyZXN1bWUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELE9BQU9BLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBUUMsVUFBVSxRQUFPLFNBQVM7QUFDbEMsT0FBT0MsYUFBYSxVQUFVO0FBQzlCLFNBQVFDLFlBQVksRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLGFBQWEsUUFBTyxLQUFLO0FBQ3RFLFNBQVFDLE9BQU8sUUFBTyxLQUFLO0FBQzNCLFNBQVFDLFdBQVdDLFdBQVcsRUFBRUMsSUFBSSxFQUFFQyxVQUFVLFFBQU8sT0FBTztBQUM5RCxTQUFRQyxhQUFhLFFBQU8sTUFBTTtBQUNsQyxTQUFRQyxlQUFlLFFBQU8sS0FBSztBQUVuQyxTQUFRQyxTQUFTLEVBQUVDLGFBQWEsUUFBTyxxQkFBcUI7QUFDNUQsU0FBUUMsYUFBYSxFQUFFQyxXQUFXLFFBQU8scUJBQXFCO0FBQzlELFNBQVFDLEdBQUcsUUFBTyxxQkFBcUI7QUEwRHZDLE1BQU1DLGNBQWM7SUFDbEIsTUFBTUMsV0FBV1YsS0FBS0gsV0FBVztJQUNqQyxJQUFHLENBQUNILFdBQVdnQixXQUFXO1FBQ3hCZixVQUFVZSxVQUFVO1lBQUNDLFdBQVc7UUFBSTtJQUN0QztJQUNBLE9BQU9EO0FBQ1Q7QUFFQSxNQUFNRSxlQUFlLElBQWNaLEtBQUtTLGVBQWU7QUFFdkQsTUFBTUksb0JBQW9CO0lBQ3hCLE1BQU1DLFlBQVlGO0lBQ2xCLElBQUcsQ0FBQ2xCLFdBQVdvQixZQUFZO1FBQ3pCLE9BQU87SUFDVDtJQUVBLElBQUk7UUFDRixNQUFNQyxZQUFZdEIsYUFBYXFCLFdBQVc7UUFDMUMsTUFBTUUsUUFBdUJDLEtBQUtDLEtBQUssQ0FBQ0g7UUFFeEMsc0NBQXNDO1FBQ3RDLE1BQU1JLFlBQVksSUFB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
|
|
988
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzLWRldi9zZXJ2ZXJsZXNzLWRldi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IGJveGVuIGZyb20gJ2JveGVuJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7cmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jLCBta2RpclN5bmMsIHdyaXRlRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7aG9tZWRpcn0gZnJvbSAnb3MnO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlLCBqb2luLCBpc0Fic29sdXRlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7cGF0aFRvRmlsZVVSTH0gZnJvbSAndXJsJztcbmltcG9ydCB7V2ViU29ja2V0U2VydmVyfSBmcm9tICd3cyc7XG5cbmltcG9ydCB7TGV4Q29uZmlnLCBnZXRQYWNrYWdlRGlyfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyLCByZW1vdmVGaWxlc30gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlcmxlc3NEZXZPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnPzogc3RyaW5nO1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBodHRwc1BvcnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGVzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHVzZVB1YmxpY0lwPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmFyaWFibGVzPzogc3RyaW5nO1xuICByZWFkb25seSB3c1BvcnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFNlcnZlcmxlc3NEZXZDYWxsYmFjayA9IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvcnNDb25maWcge1xuICByZWFkb25seSBhbGxvd0NyZWRlbnRpYWxzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaGVhZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBtZXRob2RzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHJlYWRvbmx5IG9yaWdpbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NDb25maWcge1xuICByZWFkb25seSBjdXN0b20/OiB7XG4gICAgcmVhZG9ubHkgJ3NlcnZlcmxlc3Mtb2ZmbGluZSc/OiB7XG4gICAgICByZWFkb25seSBib2R5TGltaXQ/OiBzdHJpbmc7XG4gICAgICByZWFkb25seSBjb3JzPzogYm9vbGVhbiB8IFNlcnZlcmxlc3NDb3JzQ29uZmlnO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENvcnNIZWFkZXJzID0gKFxuICBjb3JzOiBib29sZWFuIHwgU2VydmVybGVzc0NvcnNDb25maWcgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RPcmlnaW46IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIGNvbnN0IGNvcnNDb25maWcgPSB0eXBlb2YgY29ycyA9PT0gJ29iamVjdCcgPyBjb3JzIDoge307XG4gIGNvbnN0IGFsbG93Q3JlZGVudGlhbHMgPSBjb3JzQ29uZmlnLmFsbG93Q3JlZGVudGlhbHMgPT09IHRydWU7XG4gIGNvbnN0IGNvbmZpZ3VyZWRPcmlnaW5zID0gY29yc0NvbmZpZy5vcmlnaW5zIHx8IFsnKiddO1xuICBjb25zdCBhbGxvd3NBbnlPcmlnaW4gPSBjb25maWd1cmVkT3JpZ2lucy5pbmNsdWRlcygnKicpO1xuICBjb25zdCBvcmlnaW5Jc0FsbG93ZWQgPSBCb29sZWFuKHJlcXVlc3RPcmlnaW4gJiYgKGFsbG93c0FueU9yaWdpbiB8fCBjb25maWd1cmVkT3JpZ2lucy5pbmNsdWRlcyhyZXF1ZXN0T3JpZ2luKSkpO1xuICBjb25zdCBhbGxvd2VkT3JpZ2luID0gb3JpZ2luSXNBbGxvd2VkICYmIHJlcXVlc3RPcmlnaW5cbiAgICA/IHJlcXVlc3RPcmlnaW5cbiAgICA6IGFsbG93Q3JlZGVudGlhbHNcbiAgICAgID8gY29uZmlndXJlZE9yaWdpbnMuZmluZCgob3JpZ2luKSA9PiBvcmlnaW4gIT09ICcqJykgfHwgJydcbiAgICAgIDogJyonO1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogKGNvcnNDb25maWcuaGVhZGVycyB8fCBbJyonXSkuam9pbignLCAnKSxcbiAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6IChjb3JzQ29uZmlnLm1ldGhvZHMgfHwgWydHRVQnLCAnUE9TVCcsICdQVVQnLCAnREVMRVRFJywgJ1BBVENIJywgJ09QVElPTlMnXSkuam9pbignLCAnKSxcbiAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogYWxsb3dlZE9yaWdpblxuICB9O1xuXG4gIGlmKGFsbG93Q3JlZGVudGlhbHMpIHtcbiAgICBoZWFkZXJzWydBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyddID0gJ3RydWUnO1xuICB9XG5cbiAgaWYocmVxdWVzdE9yaWdpbikge1xuICAgIGhlYWRlcnMuVmFyeSA9ICdPcmlnaW4nO1xuICB9XG5cbiAgcmV0dXJuIGhlYWRlcnM7XG59O1xuXG5pbnRlcmZhY2UgV2ViU29ja2V0Q2xpZW50TGlrZSB7XG4gIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkO1xuICByZWFkeVN0YXRlPzogbnVtYmVyO1xuICBzZW5kKGRhdGE6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmNvbnN0IGdldENhY2hlRGlyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbihob21lZGlyKCksICcubGV4LWNhY2hlJyk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9XG4gIHJldHVybiBjYWNoZURpcjtcbn07XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9ICgpOiBzdHJpbmcgPT4gam9pbihnZXRDYWNoZURpcigpLCAncHVibGljLWlwLmpzb24nKTtcblxuY29uc3QgcmVhZFB1YmxpY0lwQ2FjaGUgPSAoKTogUHVibGljSXBDYWNoZSB8IG51bGwgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZURhdGEgPSByZWFkRmlsZVN5bmMoY2FjaGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0gSlNPTi5wYXJzZShjYWNoZURhdGEpO1xuXG4gICAgLy8gQ2hlY2sgaWYgY2FjaGUgaXMgb2xkZXIgdGhhbiAxIHdlZWtcbiAgICBjb25zdCBvbmVXZWVrTXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBpZihEYXRlLm5vdygpIC0gY2FjaGUudGltZXN0YW1wID4gb25lV2Vla01zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FjaGU7XG4gIH0gY2F0Y2h7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IHdyaXRlUHVibGljSXBDYWNoZSA9IChpcDogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGdldENhY2hlUGF0aCgpO1xuICBjb25zdCBjYWNoZTogUHVibGljSXBDYWNoZSA9IHtcbiAgICBpcCxcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgfTtcbiAgd3JpdGVGaWxlU3luYyhjYWNoZVBhdGgsIEpTT04uc3RyaW5naWZ5KGNhY2hlLCBudWxsLCAyKSk7XG59O1xuXG5jb25zdCBmZXRjaFB1YmxpY0lwID0gKGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIGlmKCFmb3JjZVJlZnJlc2gpIHtcbiAgICBjb25zdCBjYWNoZWQgPSByZWFkUHVibGljSXBDYWNoZSgpO1xuICAgIGlmKGNhY2hlZCkge1xuICAgICAgcmVzb2x2ZShjYWNoZWQuaXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVzZSBmZXRjaCBpbnN0ZWFkIG9mIGh0dHBzXG4gIGZldGNoKCdodHRwczovL2FwaS5pcGlmeS5vcmcnKVxuICAgIC50aGVuKChyZXMpID0+IHJlcy50ZXh0KCkpXG4gICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIGNvbnN0IGlwID0gZGF0YS50cmltKCk7XG4gICAgICBpZihpcCkge1xuICAgICAgICB3cml0ZVB1YmxpY0lwQ2FjaGUoaXApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShpcCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKTtcbn0pO1xuXG5jb25zdCByZXNvbHZlUHVibGljSXBGb3JEaXNwbGF5ID0gYXN5bmMgKGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgY29uc3QgdGltZW91dE1zID0gMTUwMDtcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTx1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCksIHRpbWVvdXRNcyk7XG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbZmV0Y2hQdWJsaWNJcChmb3JjZVJlZnJlc2gpLCB0aW1lb3V0UHJvbWlzZV0pO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbmNvbnN0IGRpc3BsYXlTZXJ2ZXJTdGF0dXMgPSAoXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGh0dHBzUG9ydDogbnVtYmVyLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgcHVibGljSXA/OiBzdHJpbmdcbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh0dHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH1gO1xuICBjb25zdCBodHRwc1VybCA9IGBodHRwczovLyR7aG9zdH06JHtodHRwc1BvcnR9YDtcbiAgY29uc3Qgd3NVcmwgPSBgd3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG4gIGNvbnN0IHdzc1VybCA9IGB3c3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG5cbiAgbGV0IHVybExpbmVzID0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFA6Jyl9ICAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cFVybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFBTOicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cHNVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXZWJTb2NrZXQ6Jyl9ICR7Y2hhbGsudW5kZXJsaW5lKHdzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV1NTOicpfSAgICAgICAke2NoYWxrLnVuZGVybGluZSh3c3NVcmwpfVxcbmA7XG5cbiAgaWYocHVibGljSXApIHtcbiAgICB1cmxMaW5lcyArPSBgXFxuJHtjaGFsay5ncmVlbignUHVibGljOicpfSAgICAke2NoYWxrLnVuZGVybGluZShgaHR0cDovLyR7cHVibGljSXB9OiR7aHR0cFBvcnR9YCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+agCBTZXJ2ZXJsZXNzIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5jb25zdCBsb2FkSGFuZGxlciA9IGFzeW5jIChoYW5kbGVyUGF0aDogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gUGFyc2luZyBoYW5kbGVyIHBhdGg6ICR7aGFuZGxlclBhdGh9YCk7XG5cbiAgICAvLyBQYXJzZSBBV1MgTGFtYmRhIGhhbmRsZXIgZm9ybWF0OiBcInBhdGgvdG8vZmlsZS5leHBvcnROYW1lXCIgb3IgXCJmaWxlLmV4cG9ydE5hbWVcIlxuICAgIC8vIEV4YW1wbGVzOiBcImluZGV4LmhhbmRsZXJcIiwgXCJoYW5kbGVycy9hcGkuaGFuZGxlclwiLCBcInNyYy9pbmRleC5kZWZhdWx0XCJcbiAgICBjb25zdCBoYW5kbGVyUGFydHMgPSBoYW5kbGVyUGF0aC5zcGxpdCgnLicpO1xuICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gSGFuZGxlciBwYXJ0cyBhZnRlciBzcGxpdDonLCBoYW5kbGVyUGFydHMpO1xuXG4gICAgbGV0IGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgbGV0IGV4cG9ydE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYoaGFuZGxlclBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIEFXUyBMYW1iZGEgZm9ybWF0OiBcImZpbGUuZXhwb3J0TmFtZVwiXG4gICAgICAvLyBUYWtlIHRoZSBsYXN0IHBhcnQgYXMgZXhwb3J0IG5hbWUsIHJlc3QgYXMgZmlsZSBwYXRoXG4gICAgICAvLyBIYW5kbGUgY2FzZXMgbGlrZSBcImluZGV4LmhhbmRsZXJcIiAtPiBmaWxlOiBcImluZGV4XCIsIGV4cG9ydDogXCJoYW5kbGVyXCJcbiAgICAgIC8vIE9yIFwiaGFuZGxlcnMvYXBpLmhhbmRsZXJcIiAtPiBmaWxlOiBcImhhbmRsZXJzL2FwaVwiLCBleHBvcnQ6IFwiaGFuZGxlclwiXG4gICAgICBleHBvcnROYW1lID0gaGFuZGxlclBhcnRzW2hhbmRsZXJQYXJ0cy5sZW5ndGggLSAxXSB8fCBudWxsO1xuICAgICAgZmlsZVBhdGggPSBoYW5kbGVyUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gUGFyc2VkIEFXUyBMYW1iZGEgZm9ybWF0IC0gZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cIiwgZXhwb3J0TmFtZTogXCIke2V4cG9ydE5hbWV9XCJgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2ltcGxlIGZvcm1hdDoganVzdCB0aGUgZmlsZSBwYXRoXG4gICAgICBmaWxlUGF0aCA9IGhhbmRsZXJQYXRoO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBTaW1wbGUgZm9ybWF0IC0gZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cImApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBmaWxlUGF0aCBkb2Vzbid0IGhhdmUgdGhlIGV4cG9ydCBuYW1lIGluIGl0XG4gICAgaWYoZmlsZVBhdGguaW5jbHVkZXMoJy5oYW5kbGVyJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy5kZWZhdWx0JykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBXQVJOSU5HOiBmaWxlUGF0aCBzdGlsbCBjb250YWlucyBleHBvcnQgbmFtZSEgZmlsZVBhdGg6IFwiJHtmaWxlUGF0aH1cImApO1xuICAgICAgLy8gVHJ5IHRvIGZpeCBpdCAtIHJlbW92ZSB0aGUgbGFzdCBwYXJ0IGlmIGl0IGxvb2tzIGxpa2UgYW4gZXhwb3J0IG5hbWVcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IGZpbGVQYXRoLnNwbGl0KCcuJyk7XG4gICAgICBpZihwYXRoUGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmKFsnaGFuZGxlcicsICdkZWZhdWx0JywgJ2luZGV4J10uaW5jbHVkZXMobGFzdFBhcnQpICYmICFleHBvcnROYW1lKSB7XG4gICAgICAgICAgZXhwb3J0TmFtZSA9IGxhc3RQYXJ0O1xuICAgICAgICAgIGZpbGVQYXRoID0gcGF0aFBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaXhlZCAtIGZpbGVQYXRoOiBcIiR7ZmlsZVBhdGh9XCIsIGV4cG9ydE5hbWU6IFwiJHtleHBvcnROYW1lfVwiYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYm90aCByZWxhdGl2ZSBwYXRocyBhbmQgYWJzb2x1dGUgcGF0aHNcbiAgICBsZXQgZnVsbFBhdGg6IHN0cmluZztcbiAgICBpZihpc0Fic29sdXRlKGZpbGVQYXRoKSkge1xuICAgICAgZnVsbFBhdGggPSBmaWxlUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXREaXIsIGZpbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBSZXNvbHZlZCBmdWxsUGF0aCAoYmVmb3JlIGV4dGVuc2lvbnMpOiAke2Z1bGxQYXRofWApO1xuXG4gICAgLy8gVHJ5IGRpZmZlcmVudCBleHRlbnNpb25zIGlmIGZpbGUgZG9lc24ndCBleGlzdFxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmpzJywgJy5tanMnLCAnLmNqcyddO1xuICAgICAgY29uc3QgcGF0aFdpdGhvdXRFeHQgPSBmdWxsUGF0aC5yZXBsYWNlKC9cXC4oanN8bWpzfGNqcykkLywgJycpO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBUcnlpbmcgZXh0ZW5zaW9ucy4gQmFzZSBwYXRoOiAke3BhdGhXaXRob3V0RXh0fWApO1xuICAgICAgZm9yKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBwYXRoV2l0aG91dEV4dCArIGV4dDtcbiAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBDaGVja2luZzogJHtjYW5kaWRhdGVQYXRofSAoZXhpc3RzOiAke2V4aXN0c1N5bmMoY2FuZGlkYXRlUGF0aCl9KWApO1xuICAgICAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICAgICAgZnVsbFBhdGggPSBjYW5kaWRhdGVQYXRoO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRm91bmQgZmlsZSB3aXRoIGV4dGVuc2lvbjogJHtmdWxsUGF0aH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEZpbGUgZXhpc3RzIHdpdGhvdXQgdHJ5aW5nIGV4dGVuc2lvbnM6ICR7ZnVsbFBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaW5hbCBmdWxsUGF0aDogJHtmdWxsUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEV4cG9ydCBuYW1lOiAke2V4cG9ydE5hbWUgfHwgJ2RlZmF1bHQvaGFuZGxlcid9YCk7XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKGZ1bGxQYXRoKX1gKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgZmlsZSBub3QgZm91bmQ6ICR7ZnVsbFBhdGh9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gT3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoIGZyb20gY29uZmlnOiAke2hhbmRsZXJQYXRofWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIC8vIER5bmFtaWMgaW1wb3J0IG9mIHRoZSBoYW5kbGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgLy8gQWRkIC5qcyBleHRlbnNpb24gaWYgaW1wb3J0aW5nIFR5cGVTY3JpcHQgY29tcGlsZWQgb3V0cHV0XG4gICAgY29uc3QgaW1wb3J0UGF0aCA9IGZ1bGxQYXRoLmVuZHNXaXRoKCcudHMnKSA/IGZ1bGxQYXRoLnJlcGxhY2UoL1xcLnRzJC8sICcuanMnKSA6IGZ1bGxQYXRoO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnZlcnQgdG8gZmlsZTovLyBVUkwgZm9yIEVTIG1vZHVsZSBpbXBvcnRzIChyZXF1aXJlZCBmb3IgYWJzb2x1dGUgcGF0aHMpXG4gICAgICAvLyBVc2UgcGF0aFRvRmlsZVVSTCB0byBlbnN1cmUgcHJvcGVyIGZpbGU6Ly8gVVJMIGZvcm1hdFxuICAgICAgY29uc3QgaW1wb3J0VXJsID0gcGF0aFRvRmlsZVVSTChpbXBvcnRQYXRoKS5ocmVmO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBJbXBvcnRpbmcgaGFuZGxlciBmcm9tOiAke2ltcG9ydFVybH1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gRmlsZSBwYXRoOiAke2ltcG9ydFBhdGh9YCk7XG5cbiAgICAgIC8vIFVzZSBpbXBvcnQoKSB3aXRoIHRoZSBmaWxlIFVSTFxuICAgICAgLy8gTm90ZTogSWYgdGhlIGhhbmRsZXIgZmlsZSBoYXMgaW1wb3J0IGVycm9ycyAobGlrZSBtaXNzaW5nIGRlcGVuZGVuY2llcyksXG4gICAgICAvLyB0aG9zZSB3aWxsIHN1cmZhY2UgaGVyZSwgYnV0IHRoYXQncyBhIGhhbmRsZXIgY29kZSBpc3N1ZSwgbm90IGEgbG9hZGVyIGlzc3VlXG4gICAgICBjb25zdCBoYW5kbGVyTW9kdWxlID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgbW9kdWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkuIEV4cG9ydHM6ICR7T2JqZWN0LmtleXMoaGFuZGxlck1vZHVsZSkuam9pbignLCAnKX1gKTtcblxuICAgICAgLy8gR2V0IHRoZSBoYW5kbGVyIGJhc2VkIG9uIGV4cG9ydCBuYW1lIG9yIHRyeSBkZWZhdWx0c1xuICAgICAgbGV0IGhhbmRsZXI6IGFueTtcbiAgICAgIGlmKGV4cG9ydE5hbWUpIHtcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJNb2R1bGVbZXhwb3J0TmFtZV1cbiAgICAgICAgICB8fCBoYW5kbGVyTW9kdWxlLmRlZmF1bHQ/LltleHBvcnROYW1lXVxuICAgICAgICAgIHx8IGhhbmRsZXJNb2R1bGVbJ21vZHVsZS5leHBvcnRzJ10/LltleHBvcnROYW1lXTtcbiAgICAgICAgaWYoIWhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gRXhwb3J0IFwiJHtleHBvcnROYW1lfVwiIG5vdCBmb3VuZCBpbiBtb2R1bGUuIEF2YWlsYWJsZSBleHBvcnRzOiAke09iamVjdC5rZXlzKGhhbmRsZXJNb2R1bGUpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRyeSBkZWZhdWx0LCBoYW5kbGVyLCBvciB0aGUgbW9kdWxlIGl0c2VsZlxuICAgICAgICBoYW5kbGVyID0gaGFuZGxlck1vZHVsZS5kZWZhdWx0IHx8IGhhbmRsZXJNb2R1bGUuaGFuZGxlciB8fCBoYW5kbGVyTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgZm91bmQ6ICR7dHlwZW9mIGhhbmRsZXJ9LCBpc0Z1bmN0aW9uOiAke3R5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nfWApO1xuXG4gICAgICBpZih0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBpcyBub3QgYSBmdW5jdGlvbi4gVHlwZTogJHt0eXBlb2YgaGFuZGxlcn0sIFZhbHVlOmAsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhhbmRsZXI7XG4gICAgfSBjYXRjaChpbXBvcnRFcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSW1wb3J0IGVycm9yIGZvciBoYW5kbGVyICR7aGFuZGxlclBhdGh9OmAsIGltcG9ydEVycm9yLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIEltcG9ydCBlcnJvciBzdGFjazonLCBpbXBvcnRFcnJvci5zdGFjayk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBkZXBlbmRlbmN5IHJlc29sdXRpb24gZXJyb3IgKGNvbW1vbiB3aXRoIEVTIG1vZHVsZXMpXG4gICAgICBpZihpbXBvcnRFcnJvci5tZXNzYWdlICYmIGltcG9ydEVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0Nhbm5vdCBmaW5kIG1vZHVsZScpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBUaGlzIGFwcGVhcnMgdG8gYmUgYSBkZXBlbmRlbmN5IHJlc29sdXRpb24gZXJyb3IuJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBUaGUgaGFuZGxlciBmaWxlIGV4aXN0cywgYnV0IG9uZSBvZiBpdHMgaW1wb3J0cyBpcyBmYWlsaW5nLicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gQ2hlY2sgdGhhdCBhbGwgZGVwZW5kZW5jaWVzIGluIHRoZSBoYW5kbGVyIGZpbGUgYXJlIHByb3Blcmx5IGluc3RhbGxlZC4nKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgZmlsZTogJHtpbXBvcnRQYXRofWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gTWFrZSBzdXJlIHRoZSBoYW5kbGVyIGFuZCBpdHMgZGVwZW5kZW5jaWVzIGFyZSBjb21waWxlZCBjb3JyZWN0bHkuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEVycm9yIGxvYWRpbmcgaGFuZGxlciAke2hhbmRsZXJQYXRofTpgLCBlcnJvci5tZXNzYWdlKTtcbiAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gRXJyb3Igc3RhY2s6JywgZXJyb3Iuc3RhY2spO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCBjYXB0dXJlQ29uc29sZUxvZ3MgPSAoaGFuZGxlcjogKGV2ZW50OiBhbnksIGNvbnRleHQ6IGFueSkgPT4gUHJvbWlzZTxhbnk+LCBxdWlldDogYm9vbGVhbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybiBoYW5kbGVyO1xuICB9XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogYW55LCBjb250ZXh0OiBhbnkpID0+IHtcbiAgICAvLyBDYXB0dXJlIGNvbnNvbGUubG9nLCBjb25zb2xlLmVycm9yLCBldGMuXG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2c7XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZVdhcm4gPSBjb25zb2xlLndhcm47XG4gICAgY29uc3Qgb3JpZ2luYWxDb25zb2xlSW5mbyA9IGNvbnNvbGUuaW5mbztcblxuICAgIGNvbnN0IGxvZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbTE9HXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlTG9nKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLmVycm9yID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtFUlJPUl0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUVycm9yKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLndhcm4gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW1dBUk5dICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVXYXJuKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBjb25zb2xlLmluZm8gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0lORk9dICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVJbmZvKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgIC8vIE91dHB1dCBjYXB0dXJlZCBsb2dzXG4gICAgICBpZihsb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnLS0tIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgICBsb2dzLmZvckVhY2goKGxvZykgPT4gY29uc29sZS5sb2coY2hhbGsuZ3JheShsb2cpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBFbmQgSGFuZGxlciBDb25zb2xlIE91dHB1dCAtLS0nKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgY29uc29sZSBtZXRob2RzXG4gICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgIGNvbnNvbGUuZXJyb3IgPSBvcmlnaW5hbENvbnNvbGVFcnJvcjtcbiAgICAgIGNvbnNvbGUud2FybiA9IG9yaWdpbmFsQ29uc29sZVdhcm47XG4gICAgICBjb25zb2xlLmluZm8gPSBvcmlnaW5hbENvbnNvbGVJbmZvO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIgPSBhc3luYyAoXG4gIGNvbmZpZzogU2VydmVybGVzc0NvbmZpZyxcbiAgb3V0cHV0RGlyOiBzdHJpbmcsXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGhvc3Q6IHN0cmluZyxcbiAgY29ubmVjdGlvblJlZ2lzdHJ5OiBNYXA8c3RyaW5nLCBXZWJTb2NrZXRDbGllbnRMaWtlPixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIC8vIEVuYWJsZSBDT1JTXG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgY29ycyA9IGNvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LmNvcnM7XG5cbiAgICBpZihjb3JzID09PSBmYWxzZSkge1xuICAgICAgbmV4dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRDb3JzSGVhZGVycyhjb3JzLCByZXEuaGVhZGVyKCdPcmlnaW4nKSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykuZm9yRWFjaCgoW25hbWUsIHZhbHVlXSkgPT4gcmVzLmhlYWRlcihuYW1lLCB2YWx1ZSkpO1xuXG4gICAgaWYocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICByZXMuc2VuZFN0YXR1cygyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQYXJzZSByYXcgd2Vic29ja2V0IG1hbmFnZW1lbnQgQVBJIHBheWxvYWRzXG4gIGFwcC51c2UoZXhwcmVzcy5yYXcoe2xpbWl0OiAnMTBtYicsIHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nfSkpO1xuXG4gIC8vIFByZXNlcnZlIG11bHRpcGFydCB1cGxvYWRzIGFzIHJhdyBMYW1iZGEtc3R5bGUgYm9kaWVzIHNvIHVwbG9hZCBoYW5kbGVycyBjYW4gcGFyc2UgYm91bmRhcmllcy5cbiAgYXBwLnVzZShleHByZXNzLnJhdyh7XG4gICAgbGltaXQ6IGNvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LmJvZHlMaW1pdCB8fCAnMjVtYicsXG4gICAgdHlwZTogKHJlcSkgPT4gU3RyaW5nKHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSB8fCAnJykuaW5jbHVkZXMoJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9KSk7XG5cbiAgLy8gUGFyc2UgSlNPTiBib2RpZXNcbiAgYXBwLnVzZShleHByZXNzLmpzb24oe2xpbWl0OiBjb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ib2R5TGltaXQgfHwgJzI1bWInfSkpO1xuXG4gIGFwcC5wb3N0KFsnL0Bjb25uZWN0aW9ucy86Y29ubmVjdGlvbklkJywgJy86c3RhZ2UvQGNvbm5lY3Rpb25zLzpjb25uZWN0aW9uSWQnXSwgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gU3RyaW5nKHJlcS5wYXJhbXMuY29ubmVjdGlvbklkIHx8ICcnKTtcbiAgICBjb25zdCB3cyA9IGNvbm5lY3Rpb25SZWdpc3RyeS5nZXQoY29ubmVjdGlvbklkKTtcblxuICAgIGlmKCF3cykge1xuICAgICAgcmVzLnN0YXR1cyg0MTApLmpzb24oe21lc3NhZ2U6ICdHb25lJ30pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBib2R5ID0gJyc7XG5cbiAgICBpZihCdWZmZXIuaXNCdWZmZXIocmVxLmJvZHkpKSB7XG4gICAgICBib2R5ID0gcmVxLmJvZHkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9IGVsc2UgaWYodHlwZW9mIHJlcS5ib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgYm9keSA9IHJlcS5ib2R5O1xuICAgIH0gZWxzZSBpZihyZXEuYm9keSAhPT0gdW5kZWZpbmVkICYmIHJlcS5ib2R5ICE9PSBudWxsICYmIHJlcS5ib2R5ICE9PSAnJykge1xuICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KTtcbiAgICB9XG5cbiAgICBpZihib2R5KSB7XG4gICAgICB3cy5zZW5kKGJvZHkpO1xuICAgIH1cblxuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtvazogdHJ1ZX0pO1xuICB9KTtcblxuICAvLyBMb2FkIEdyYXBoUUwgaGFuZGxlclxuICBjb25zdCBsb2FkR3JhcGhRTFNjaGVtYSA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGZpbmQgYSBHcmFwaFFMIGhhbmRsZXJcbiAgICAgIGxldCBncmFwaHFsSGFuZGxlciA9IG51bGw7XG5cbiAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgZm9yKGNvbnN0IFtmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudC5odHRwICYmIGV2ZW50Lmh0dHAucGF0aCkge1xuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIEdyYXBoUUwgZW5kcG9pbnRzXG4gICAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cC5wYXRoID09PSAnL3B1YmxpYycgfHwgZXZlbnQuaHR0cC5wYXRoID09PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICAgICAgICBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGZ1bmN0aW9uQ29uZmlnLmhhbmRsZXIsIG91dHB1dERpcik7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihncmFwaHFsSGFuZGxlcikge1xuICAgICAgICBsb2coJ0ZvdW5kIEdyYXBoUUwgaGFuZGxlcicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICByZXR1cm4gZ3JhcGhxbEhhbmRsZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYEVycm9yIGxvYWRpbmcgR3JhcGhRTCBoYW5kbGVyOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldCB1cCBHcmFwaFFMIGhhbmRsZXIgZm9yIEdyYXBoUUwgcmVxdWVzdHNcbiAgdHJ5IHtcbiAgICBjb25zdCBncmFwaHFsSGFuZGxlciA9IGF3YWl0IGxvYWRHcmFwaFFMU2NoZW1hKCk7XG4gICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgIC8vIEZpbmQgdGhlIEdyYXBoUUwgcGF0aCBmcm9tIHRoZSBzZXJ2ZXJsZXNzIGNvbmZpZ1xuICAgICAgbGV0IGdyYXBocWxQYXRoID0gJy9ncmFwaHFsJzsgLy8gZGVmYXVsdCBmYWxsYmFja1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbX2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICBmb3IoY29uc3QgZXZlbnQgb2YgZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIGlmKGV2ZW50Py5odHRwPy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZ3JhcGhxbFBhdGggPSBldmVudC5odHRwLnBhdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZ3JhcGhxbFBhdGggIT09ICcvZ3JhcGhxbCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgR3JhcGhRTCBlbmRwb2ludCB3aXRoIGVuaGFuY2VkIGNvbnNvbGUubG9nIGNhcHR1cmVcbiAgICAgIGFwcC51c2UoZ3JhcGhxbFBhdGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAvLyBHcmFwaFFMIERlYnVnIExvZ2dpbmdcbiAgICAgICAgaWYoZGVidWcgJiYgcmVxLmJvZHkgJiYgcmVxLmJvZHkucXVlcnkpIHtcbiAgICAgICAgICBsb2coJ/CflI0gR3JhcGhRTCBEZWJ1ZyBNb2RlOiBBbmFseXppbmcgcmVxdWVzdC4uLicsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIGxvZyhg8J+TnSBHcmFwaFFMIFF1ZXJ5OiAke3JlcS5ib2R5LnF1ZXJ5fWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIGlmKHJlcS5ib2R5LnZhcmlhYmxlcykge1xuICAgICAgICAgICAgbG9nKGDwn5OKIEdyYXBoUUwgVmFyaWFibGVzOiAke0pTT04uc3RyaW5naWZ5KHJlcS5ib2R5LnZhcmlhYmxlcywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlcS5ib2R5Lm9wZXJhdGlvbk5hbWUpIHtcbiAgICAgICAgICAgIGxvZyhg8J+Pt++4jyAgR3JhcGhRTCBPcGVyYXRpb246ICR7cmVxLmJvZHkub3BlcmF0aW9uTmFtZX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dNZXNzYWdlID0gYXJncy5tYXAoKGFyZykgPT5cbiAgICAgICAgICAgICh0eXBlb2YgYXJnID09PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KGFyZywgbnVsbCwgMikgOiBTdHJpbmcoYXJnKSlcbiAgICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgICBsb2dzLnB1c2gobG9nTWVzc2FnZSk7XG4gICAgICAgICAgb3JpZ2luYWxDb25zb2xlTG9nKGBbR3JhcGhRTF0gJHtsb2dNZXNzYWdlfWApO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENyZWF0ZSBjb250ZXh0IGZvciB0aGUgaGFuZGxlclxuICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgZnVuY3Rpb25OYW1lOiAnZ3JhcGhxbCcsXG4gICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46ICdhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOmdyYXBocWwnLFxuICAgICAgICAgIGxvZ0dyb3VwTmFtZTogJy9hd3MvbGFtYmRhL2dyYXBocWwnLFxuICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICByZXNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGdyYXBocWxIYW5kbGVyLCBxdWlldCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBDYWxsIHRoZSBoYW5kbGVyIHdpdGggR3JhcGhRTCBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoe1xuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxLmJvZHkpLFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBwYXRoOiBncmFwaHFsUGF0aCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczoge31cbiAgICAgICAgICB9LCBjb250ZXh0KTtcblxuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcblxuICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcmVzdWx0XG4gICAgICAgICAgaWYocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5oZWFkZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXMuanNvbihyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIC8vIFJlc3RvcmUgY29uc29sZS5sb2dcbiAgICAgICAgICBjb25zb2xlLmxvZyA9IG9yaWdpbmFsQ29uc29sZUxvZztcbiAgICAgICAgICBsb2coYEdyYXBoUUwgaGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxvZyhgR3JhcGhRTCBlbmRwb2ludCBhdmFpbGFibGUgYXQgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH0ke2dyYXBocWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgRXJyb3Igc2V0dGluZyB1cCBHcmFwaFFMOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2sgZm9yIG5vbi1HcmFwaFFMIHJvdXRlcyAtIGhhbmRsZSBhbGwgcmVtYWluaW5nIHJvdXRlc1xuICBhcHAudXNlKCcvJywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IHJlcS51cmwgfHwgJy8nO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmVxLm1ldGhvZCB8fCAnR0VUJztcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gcmVxLnBhdGggfHwgdXJsLnNwbGl0KCc/JylbMF07IC8vIEV4dHJhY3QgcGF0aG5hbWUgd2l0aG91dCBxdWVyeSBzdHJpbmdcblxuICAgICAgLy8gQWx3YXlzIGxvZyByZXF1ZXN0cyAobm90IGFmZmVjdGVkIGJ5IHF1aWV0IGZsYWcgZm9yIGRlYnVnZ2luZylcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gJHttZXRob2R9ICR7dXJsfSAocGF0aG5hbWU6ICR7cGF0aG5hbWV9KWApO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoaW5nIGZ1bmN0aW9uXG4gICAgICBsZXQgbWF0Y2hlZEZ1bmN0aW9uID0gbnVsbDtcbiAgICAgIGNvbnN0IGZ1bmN0aW9ucyA9IGNvbmZpZy5mdW5jdGlvbnMgfHwge307XG5cbiAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IE9iamVjdC5rZXlzKGZ1bmN0aW9ucyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtmdW5jdGlvbk5hbWVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gQ29uZmlnIGZ1bmN0aW9uczonLCBKU09OLnN0cmluZ2lmeShmdW5jdGlvbnMsIG51bGwsIDIpKTtcblxuICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50Lmh0dHAucGF0aCB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRNZXRob2QgPSAoZXZlbnQuaHR0cC5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBDaGVja2luZyBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX06IHBhdGg9XCIke2V2ZW50UGF0aH1cIiwgbWV0aG9kPVwiJHtldmVudE1ldGhvZH1cIiBhZ2FpbnN0IHBhdGhuYW1lPVwiJHtwYXRobmFtZX1cIiwgbWV0aG9kPVwiJHtyZXF1ZXN0TWV0aG9kfVwiYCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJbXByb3ZlZCBwYXRoIG1hdGNoaW5nIC0gY29tcGFyZSBwYXRobmFtZSB3aXRob3V0IHF1ZXJ5IHN0cmluZ1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRocyAocmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZm9yIGNvbXBhcmlzb24pXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEV2ZW50UGF0aCA9IGV2ZW50UGF0aC5yZXBsYWNlKC9cXC8kLywgJycpIHx8ICcvJztcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgJycpIHx8ICcvJztcblxuICAgICAgICAgICAgICAgIGlmKG5vcm1hbGl6ZWRFdmVudFBhdGggPT09IG5vcm1hbGl6ZWRQYXRobmFtZSAmJiBldmVudE1ldGhvZCA9PT0gcmVxdWVzdE1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZ1bmN0aW9uID0gZnVuY3Rpb25OYW1lO1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSDinJMgTWF0Y2hlZCBmdW5jdGlvbjogJHttYXRjaGVkRnVuY3Rpb259YCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gTm8gZnVuY3Rpb25zIGZvdW5kIGluIGNvbmZpZycpO1xuICAgICAgfVxuXG4gICAgICBpZihtYXRjaGVkRnVuY3Rpb24gJiYgZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBoYW5kbGVyIHBhdGggcmVsYXRpdmUgdG8gb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBoYW5kbGVyUGF0aCA9IGZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXI7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gTG9hZGluZyBoYW5kbGVyOiAke2hhbmRsZXJQYXRofSBmcm9tIG91dHB1dERpcjogJHtvdXRwdXREaXJ9YCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihoYW5kbGVyUGF0aCwgb3V0cHV0RGlyKTtcblxuICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGxvYWRlZCBzdWNjZXNzZnVsbHksIHR5cGU6ICR7dHlwZW9mIGhhbmRsZXJ9YCk7XG4gICAgICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoaGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgICAgY29uc3QgaXNSYXdCb2R5ID0gQnVmZmVyLmlzQnVmZmVyKHJlcS5ib2R5KTtcbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGJvZHk6IGlzUmF3Qm9keSA/IHJlcS5ib2R5LnRvU3RyaW5nKCdiYXNlNjQnKSA6IHJlcS5ib2R5LFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBpc0Jhc2U2NEVuY29kZWQ6IGlzUmF3Qm9keSxcbiAgICAgICAgICAgIHBhdGg6IHVybCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogcmVxLnF1ZXJ5XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIENhbGxpbmcgaGFuZGxlciB3aXRoIGV2ZW50OicsIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIEhhbmRsZXIgcmV0dXJuZWQ6JywgSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgICAgaWYocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1NlcnZlcmxlc3NdIEhhbmRsZXIgZXJyb3Igc3RhY2s6JywgZXJyb3Iuc3RhY2spO1xuICAgICAgICAgICAgbG9nKGBIYW5kbGVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIG5vdCBmb3VuZCBmb3IgZnVuY3Rpb246ICR7bWF0Y2hlZEZ1bmN0aW9ufWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIHBhdGg6ICR7aGFuZGxlclBhdGh9LCBPdXRwdXQgZGlyOiAke291dHB1dERpcn1gKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEZ1bmN0aW9uIG5vdCBmb3VuZCBmb3IgcGF0aG5hbWU6ICR7cGF0aG5hbWV9LCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtjb25maWcuZnVuY3Rpb25zID8gT2JqZWN0LmtleXMoZnVuY3Rpb25zKS5qb2luKCcsICcpIDogJ25vbmUnfWApO1xuICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7ZXJyb3I6ICdGdW5jdGlvbiBub3QgZm91bmQnfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBSb3V0ZSBoYW5kbGluZyBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGFwcDtcbn07XG5cbmNvbnN0IGNyZWF0ZVdlYlNvY2tldFNlcnZlciA9IChcbiAgY29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnLFxuICBvdXRwdXREaXI6IHN0cmluZyxcbiAgd3NQb3J0OiBudW1iZXIsXG4gIGNvbm5lY3Rpb25SZWdpc3RyeTogTWFwPHN0cmluZywgV2ViU29ja2V0Q2xpZW50TGlrZT4sXG4gIHF1aWV0OiBib29sZWFuLFxuICBkZWJ1ZzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IHdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHdzUG9ydH0pO1xuXG4gIGNvbnN0IGdldFdlYlNvY2tldEZ1bmN0aW9uQnlSb3V0ZSA9IChyb3V0ZUtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgZnVuY3Rpb25zID0gY29uZmlnLmZ1bmN0aW9ucyB8fCB7fTtcbiAgICBsZXQgZGVmYXVsdEZ1bmN0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoZnVuY3Rpb25zKSkge1xuICAgICAgaWYoZnVuY3Rpb25Db25maWcuZXZlbnRzKSB7XG4gICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICBpZihldmVudC53ZWJzb2NrZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gZXZlbnQud2Vic29ja2V0LnJvdXRlIHx8ICckY29ubmVjdCc7XG5cbiAgICAgICAgICAgIGlmKHJvdXRlID09PSByb3V0ZUtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25OYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihyb3V0ZSA9PT0gJyRkZWZhdWx0JyAmJiAhZGVmYXVsdEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRGdW5jdGlvbiA9IGZ1bmN0aW9uTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdEZ1bmN0aW9uO1xuICB9O1xuXG4gIHdzcy5vbignY29ubmVjdGlvbicsIGFzeW5jICh3czogV2ViU29ja2V0Q2xpZW50TGlrZSwgcmVxOiBhbnkpID0+IHtcbiAgICBsb2coYFdlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiAke3JlcS51cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gcmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywgJycpLnNsaWNlKDAsIDMyKTtcbiAgICBjb25uZWN0aW9uUmVnaXN0cnkuc2V0KGNvbm5lY3Rpb25JZCwgd3MpO1xuICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBuZXcgVVJMKHJlcS51cmwgfHwgJy8nLCBgd3M6Ly9sb2NhbGhvc3Q6JHt3c1BvcnR9YCk7XG4gICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzID0gT2JqZWN0LmZyb21FbnRyaWVzKHJlcXVlc3RVcmwuc2VhcmNoUGFyYW1zLmVudHJpZXMoKSk7XG4gICAgY29uc3QgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIEFycmF5LmZyb20obmV3IFNldChBcnJheS5mcm9tKHJlcXVlc3RVcmwuc2VhcmNoUGFyYW1zLmtleXMoKSkpKVxuICAgICAgICAubWFwKChrZXkpID0+IFtrZXksIHJlcXVlc3RVcmwuc2VhcmNoUGFyYW1zLmdldEFsbChrZXkpXSlcbiAgICApO1xuXG4gICAgY29uc3QgY29ubmVjdEZ1bmN0aW9uID0gZ2V0V2ViU29ja2V0RnVuY3Rpb25CeVJvdXRlKCckY29ubmVjdCcpO1xuXG4gICAgaWYoY29ubmVjdEZ1bmN0aW9uICYmIGNvbmZpZy5mdW5jdGlvbnM/Lltjb25uZWN0RnVuY3Rpb25dKSB7XG4gICAgICBjb25zdCBjb25uZWN0SGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGNvbmZpZy5mdW5jdGlvbnNbY29ubmVjdEZ1bmN0aW9uXS5oYW5kbGVyLCBvdXRwdXREaXIpO1xuXG4gICAgICBpZihjb25uZWN0SGFuZGxlcikge1xuICAgICAgICBjb25zdCB3cmFwcGVkQ29ubmVjdEhhbmRsZXIgPSBjYXB0dXJlQ29uc29sZUxvZ3MoY29ubmVjdEhhbmRsZXIsIHF1aWV0KTtcbiAgICAgICAgYXdhaXQgd3JhcHBlZENvbm5lY3RIYW5kbGVyKHtcbiAgICAgICAgICBib2R5OiBudWxsLFxuICAgICAgICAgIG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLFxuICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBhcGlHYXRld2F5OiB7XG4gICAgICAgICAgICAgIGVuZHBvaW50OiBgd3M6Ly9sb2NhbGhvc3Q6JHt3c1BvcnR9YFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ0NPTk5FQ1QnLFxuICAgICAgICAgICAgcm91dGVLZXk6ICckY29ubmVjdCdcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogY29ubmVjdEZ1bmN0aW9uLFxuICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke2Nvbm5lY3RGdW5jdGlvbn1gLFxuICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7Y29ubmVjdEZ1bmN0aW9ufWAsXG4gICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cy5vbignbWVzc2FnZScsIGFzeW5jIChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgLy8gRmluZCBtYXRjaGluZyBXZWJTb2NrZXQgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgZnVuY3Rpb25zID0gY29uZmlnLmZ1bmN0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZ1bmN0aW9uID0gZ2V0V2ViU29ja2V0RnVuY3Rpb25CeVJvdXRlKFN0cmluZyhkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnKSk7XG5cbiAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uICYmIGZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dKSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcik7XG5cbiAgICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgICAgYm9keTogbWVzc2FnZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dDoge1xuICAgICAgICAgICAgICAgIGFwaUdhdGV3YXk6IHtcbiAgICAgICAgICAgICAgICAgIGVuZHBvaW50OiBgd3M6Ly9sb2NhbGhvc3Q6JHt3c1BvcnR9YFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgTGFtYmRhIHJlc3BvbnNlIGZvcm1hdCBmb3IgV2ViU29ja2V0XG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgLy8gT25seSBzZW5kIGEgZnJhbWUgd2hlbiB0aGUgaGFuZGxlciByZXR1cm5lZCBhIHJlYWwgYm9keS5cbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHR5cGVvZiByZXN1bHQuYm9keSA9PT0gJ3N0cmluZycgPyByZXN1bHQuYm9keSA6ICcnO1xuICAgICAgICAgICAgICBpZihib2R5KSB7XG4gICAgICAgICAgICAgICAgd3Muc2VuZChib2R5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgcmVzcG9uc2UsIHN0cmluZ2lmeSBpdC5cbiAgICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7ZXJyb3I6ICdIYW5kbGVyIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnV2ViU29ja2V0IGZ1bmN0aW9uIG5vdCBmb3VuZCd9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgbG9nKGBXZWJTb2NrZXQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiBlcnJvci5tZXNzYWdlfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgY29ubmVjdGlvblJlZ2lzdHJ5LmRlbGV0ZShjb25uZWN0aW9uSWQpO1xuICAgICAgY29uc3QgZGlzY29ubmVjdEZ1bmN0aW9uID0gZ2V0V2ViU29ja2V0RnVuY3Rpb25CeVJvdXRlKCckZGlzY29ubmVjdCcpO1xuXG4gICAgICBpZihkaXNjb25uZWN0RnVuY3Rpb24gJiYgY29uZmlnLmZ1bmN0aW9ucz8uW2Rpc2Nvbm5lY3RGdW5jdGlvbl0pIHtcbiAgICAgICAgdm9pZCBsb2FkSGFuZGxlcihjb25maWcuZnVuY3Rpb25zW2Rpc2Nvbm5lY3RGdW5jdGlvbl0uaGFuZGxlciwgb3V0cHV0RGlyKVxuICAgICAgICAgIC50aGVuKChkaXNjb25uZWN0SGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgaWYoIWRpc2Nvbm5lY3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWREaXNjb25uZWN0SGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhkaXNjb25uZWN0SGFuZGxlciwgcXVpZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWREaXNjb25uZWN0SGFuZGxlcih7XG4gICAgICAgICAgICAgIGJvZHk6IG51bGwsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnRElTQ09OTkVDVCcsXG4gICAgICAgICAgICAgICAgcm91dGVLZXk6ICckZGlzY29ubmVjdCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGRpc2Nvbm5lY3RGdW5jdGlvbixcbiAgICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgICAgIGludm9rZWRGdW5jdGlvbkFybjogYGFybjphd3M6bGFtYmRhOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6ZnVuY3Rpb246JHtkaXNjb25uZWN0RnVuY3Rpb259YCxcbiAgICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHtkaXNjb25uZWN0RnVuY3Rpb259YCxcbiAgICAgICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgICAgIG1lbW9yeUxpbWl0SW5NQjogJzEyOCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGxvZyhgV2ViU29ja2V0IGRpc2Nvbm5lY3QgaGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbG9nKCdXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZWQnLCAnaW5mbycsIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHdzcztcbn07XG5cbmNvbnN0IGxvYWRFbnZGaWxlID0gKGVudlBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgaWYoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHtcbiAgICByZXR1cm4gZW52VmFycztcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZW52Q29udGVudCA9IHJlYWRGaWxlU3luYyhlbnZQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gZW52Q29udGVudC5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcblxuICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHNcbiAgICAgIGlmKCF0cmltbWVkTGluZSB8fCB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIEtFWT12YWx1ZSBmb3JtYXRcbiAgICAgIGNvbnN0IGVxdWFsSW5kZXggPSB0cmltbWVkTGluZS5pbmRleE9mKCc9Jyk7XG4gICAgICBpZihlcXVhbEluZGV4ID4gMCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoMCwgZXF1YWxJbmRleCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWRMaW5lLnN1YnN0cmluZyhlcXVhbEluZGV4ICsgMSkudHJpbSgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBxdW90ZXMgaWYgcHJlc2VudFxuICAgICAgICBjb25zdCBjbGVhblZhbHVlID0gdmFsdWUucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCAnJyk7XG5cbiAgICAgICAgaWYoa2V5KSB7XG4gICAgICAgICAgZW52VmFyc1trZXldID0gY2xlYW5WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgV2FybmluZzogQ291bGQgbm90IGxvYWQgLmVudiBmaWxlIGF0ICR7ZW52UGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnd2FybicsIGZhbHNlKTtcbiAgfVxuXG4gIHJldHVybiBlbnZWYXJzO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlcnZlcmxlc3NEZXYgPSBhc3luYyAoXG4gIGNtZDogU2VydmVybGVzc0Rldk9wdGlvbnMsXG4gIGNhbGxiYWNrOiBTZXJ2ZXJsZXNzRGV2Q2FsbGJhY2sgPSAoKSA9PiAoe30pXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGNvbmZpZyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIGhvc3Q6IGNsaUhvc3QsXG4gICAgaHR0cFBvcnQ6IGNsaUh0dHBQb3J0LFxuICAgIGh0dHBzUG9ydDogY2xpSHR0cHNQb3J0LFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgcmVtb3ZlID0gZmFsc2UsXG4gICAgdGVzdCA9IGZhbHNlLFxuICAgIHVzZVB1YmxpY0lwLFxuICAgIHZhcmlhYmxlcyxcbiAgICB3c1BvcnQ6IGNsaVdzUG9ydFxuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gc3RhcnRpbmcgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAvLyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIC5lbnYgZmlsZXNcbiAgY29uc3QgZW52UGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5sb2NhbCcpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LmRldmVsb3BtZW50JylcbiAgXTtcblxuICBsZXQgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIC8vIExvYWQgZnJvbSAuZW52IGZpbGVzIGluIG9yZGVyIChsYXRlciBmaWxlcyBvdmVycmlkZSBlYXJsaWVyIG9uZXMpXG4gIGZvcihjb25zdCBlbnZQYXRoIG9mIGVudlBhdGhzKSB7XG4gICAgY29uc3QgZmlsZUVudlZhcnMgPSBsb2FkRW52RmlsZShlbnZQYXRoKTtcbiAgICBpZihPYmplY3Qua2V5cyhmaWxlRW52VmFycykubGVuZ3RoID4gMCkge1xuICAgICAgbG9nKGBMb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb206ICR7ZW52UGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gICAgZW52VmFycyA9IHsuLi5lbnZWYXJzLCAuLi5maWxlRW52VmFyc307XG4gIH1cblxuICAvLyBTdGFydCB3aXRoIGRlZmF1bHQgTk9ERV9FTlYgYW5kIGxvYWRlZCAuZW52IHZhcmlhYmxlc1xuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCcsIC4uLmVudlZhcnN9O1xuXG4gIC8vIE92ZXJyaWRlIHdpdGggY29tbWFuZCBsaW5lIHZhcmlhYmxlcyBpZiBwcm92aWRlZFxuICBpZih2YXJpYWJsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xpVmFycyA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICAgIHZhcmlhYmxlc09iaiA9IHsuLi52YXJpYWJsZXNPYmosIC4uLmNsaVZhcnN9O1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICAvLyBJZiBpbiB0ZXN0IG1vZGUsIGV4aXQgZWFybHkgYWZ0ZXIgbG9hZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgaWYodGVzdCkge1xuICAgIGxvZygnVGVzdCBtb2RlOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgbG9hZGVkLCBleGl0aW5nJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZihyZW1vdmUpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdDbGVhbmluZyBvdXRwdXQgZGlyZWN0b3J5Li4uJyk7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RnVsbFBhdGggfHwgJycpO1xuICAgIHNwaW5uZXIuc3VjY2VlZCgnU3VjY2Vzc2Z1bGx5IGNsZWFuZWQgb3V0cHV0IGRpcmVjdG9yeSEnKTtcbiAgfVxuXG4gIC8vIExvYWQgc2VydmVybGVzcyBjb25maWd1cmF0aW9uXG4gIGxldCBzZXJ2ZXJsZXNzQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge307XG5cbiAgdHJ5IHtcbiAgICAvLyBVc2UgZ2V0UGFja2FnZURpciB0byBoYW5kbGUgbnBtIHdvcmtzcGFjZXMgY29ycmVjdGx5XG4gICAgY29uc3QgcGFja2FnZURpciA9IGdldFBhY2thZ2VEaXIoKTtcblxuICAgIC8vIFRyeSBtdWx0aXBsZSBjb25maWcgZmlsZSBmb3JtYXRzXG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IGNvbmZpZyA/IFtjb25maWddIDogW1xuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcubWpzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy5qcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcuY2pzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy50cycpXG4gICAgXTtcblxuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBmb3IoY29uc3QgY2FuZGlkYXRlUGF0aCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgICBpZihleGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpKSB7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBjYW5kaWRhdGVQYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjb25maWdQYXRoKSB7XG4gICAgICBsb2coYExvYWRpbmcgc2VydmVybGVzcyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgc2VydmVybGVzc0NvbmZpZyA9IGNvbmZpZ01vZHVsZS5kZWZhdWx0Py5zZXJ2ZXJsZXNzIHx8IGNvbmZpZ01vZHVsZS5zZXJ2ZXJsZXNzIHx8IHt9O1xuICAgICAgbG9nKCdTZXJ2ZXJsZXNzIGNvbmZpZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gT2JqZWN0LmtleXMoc2VydmVybGVzc0NvbmZpZy5mdW5jdGlvbnMgfHwge30pO1xuICAgICAgbG9nKGBMb2FkZWQgZnVuY3Rpb25zOiAke2Z1bmN0aW9uTmFtZXMubGVuZ3RoID4gMCA/IGZ1bmN0aW9uTmFtZXMuam9pbignLCAnKSA6ICdub25lJ31gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgICAgLy8gRGVidWc6IFByaW50IGZ1bGwgY29uZmlnIGlmIGRlYnVnIG1vZGVcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgRnVsbCBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShzZXJ2ZXJsZXNzQ29uZmlnLCBudWxsLCAyKX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBObyBzZXJ2ZXJsZXNzIGNvbmZpZyBmb3VuZC4gVHJpZWQ6ICR7Y29uZmlnRm9ybWF0cy5qb2luKCcsICcpfWAsICd3YXJuJywgcXVpZXQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgRXJyb3IgbG9hZGluZyBzZXJ2ZXJsZXNzIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBpZihkZWJ1Zykge1xuICAgICAgbG9nKGBDb25maWcgZXJyb3Igc3RhY2s6ICR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgIH1cbiAgICAvLyBEb24ndCBleGl0LCBjb250aW51ZSB3aXRoIGVtcHR5IGNvbmZpZ1xuICB9XG5cbiAgLy8gTWVyZ2UgY29uZmlnIHdpdGggY29tbWFuZCBsaW5lIG9wdGlvbnNcbiAgLy8gRGV0ZXJtaW5lIGVmZmVjdGl2ZSBob3N0L3BvcnRzIHdpdGggY29ycmVjdCBwcmVjZWRlbmNlOiBDTEkgPiBjb25maWcgPiBkZWZhdWx0c1xuICBjb25zdCBjb25maWdPZmZsaW5lID0gc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10gfHwge307XG4gIGNvbnN0IGVmZmVjdGl2ZUhvc3QgPSAoY2xpSG9zdCA/PyBjb25maWdPZmZsaW5lLmhvc3QgPz8gJ2xvY2FsaG9zdCcpIGFzIHN0cmluZztcbiAgY29uc3QgdG9OdW1iZXIgPSAodjogYW55LCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICBpZih2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbCB8fCB2ID09PSAnJykge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cblxuICAgIGNvbnN0IG4gPSB0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogcGFyc2VJbnQoU3RyaW5nKHYpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IGZhbGxiYWNrO1xuICB9O1xuICBjb25zdCBlZmZlY3RpdmVIdHRwUG9ydCA9IHRvTnVtYmVyKGNsaUh0dHBQb3J0ID8/IGNvbmZpZ09mZmxpbmUuaHR0cFBvcnQsIDMxMDApO1xuICBjb25zdCBlZmZlY3RpdmVIdHRwc1BvcnQgPSB0b051bWJlcihjbGlIdHRwc1BvcnQgPz8gY29uZmlnT2ZmbGluZS5odHRwc1BvcnQsIDMxMDEpO1xuICBjb25zdCBlZmZlY3RpdmVXc1BvcnQgPSB0b051bWJlcihjbGlXc1BvcnQgPz8gY29uZmlnT2ZmbGluZS53c1BvcnQsIDMxMDIpO1xuXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge1xuICAgIC4uLnNlcnZlcmxlc3NDb25maWcsXG4gICAgY3VzdG9tOiB7XG4gICAgICAuLi5zZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbSxcbiAgICAgICdzZXJ2ZXJsZXNzLW9mZmxpbmUnOiB7XG4gICAgICAgIC4uLmNvbmZpZ09mZmxpbmUsXG4gICAgICAgIGNvcnM6IGNvbmZpZ09mZmxpbmUuY29ycyA/PyB0cnVlLFxuICAgICAgICBob3N0OiBlZmZlY3RpdmVIb3N0LFxuICAgICAgICBodHRwUG9ydDogZWZmZWN0aXZlSHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogZWZmZWN0aXZlSHR0cHNQb3J0LFxuICAgICAgICB3c1BvcnQ6IGVmZmVjdGl2ZVdzUG9ydFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcbiAgbG9nKGBVc2luZyBvdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gLCAnaW5mbycsIHF1aWV0KTtcblxuICB0cnkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1N0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBodHRwUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwUG9ydCE7XG4gICAgY29uc3Qgd3NQb3J0ID0gZmluYWxDb25maWcuY3VzdG9tIVsnc2VydmVybGVzcy1vZmZsaW5lJ10hLndzUG9ydCE7XG4gICAgY29uc3QgaG9zdCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5ob3N0ITtcbiAgICBjb25zdCBjb25uZWN0aW9uUmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgV2ViU29ja2V0Q2xpZW50TGlrZT4oKTtcblxuICAgIGxvZyhgQ3JlYXRpbmcgSFRUUCBzZXJ2ZXIgb24gJHtob3N0fToke2h0dHBQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgQ3JlYXRpbmcgV2ViU29ja2V0IHNlcnZlciBvbiBwb3J0ICR7d3NQb3J0fWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gQ3JlYXRlIEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3QgZXhwcmVzc0FwcCA9IGF3YWl0IGNyZWF0ZUV4cHJlc3NTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIGh0dHBQb3J0LFxuICAgICAgaG9zdCxcbiAgICAgIGNvbm5lY3Rpb25SZWdpc3RyeSxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIFdlYlNvY2tldCBzZXJ2ZXJcbiAgICBjb25zdCB3c1NlcnZlciA9IGNyZWF0ZVdlYlNvY2tldFNlcnZlcihcbiAgICAgIGZpbmFsQ29uZmlnLFxuICAgICAgb3V0cHV0RGlyLFxuICAgICAgd3NQb3J0LFxuICAgICAgY29ubmVjdGlvblJlZ2lzdHJ5LFxuICAgICAgcXVpZXQsXG4gICAgICBkZWJ1Z1xuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgc2VydmVyIGVycm9yc1xuICAgIHdzU2VydmVyLm9uKCdlcnJvcicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcbiAgICAgIHZvaWQgcmVzb2x2ZVB1YmxpY0lwRm9yRGlzcGxheSh1c2VQdWJsaWNJcCkudGhlbigocHVibGljSXApID0+IHtcbiAgICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cHNQb3J0ISxcbiAgICAgICAgICB3c1BvcnQsXG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBxdWlldCxcbiAgICAgICAgICBwdWJsaWNJcFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgRXhwcmVzcyBzZXJ2ZXIgZXJyb3JzXG4gICAgc2VydmVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgbG9nKGBFeHByZXNzIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IEV4cHJlc3Mgc2VydmVyLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgZ3JhY2VmdWwgc2h1dGRvd25cbiAgICBjb25zdCBzaHV0ZG93biA9ICgpID0+IHtcbiAgICAgIGxvZygnXFxuU2h1dHRpbmcgZG93biBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICB3c1NlcnZlci5jbG9zZSgpO1xuICAgICAgY2FsbGJhY2soMCk7XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgc2h1dGRvd24pO1xuXG4gICAgLy8gS2VlcCB0aGUgcHJvY2VzcyBhbGl2ZVxuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG5cbiAgICBsb2coJ1NlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyIGlzIHJ1bm5pbmcuIFByZXNzIEN0cmwrQyB0byBzdG9wLicsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgLy8gRG9uJ3QgY2FsbCBjYWxsYmFjayBoZXJlLCBsZXQgdGhlIHByb2Nlc3Mgc3RheSBhbGl2ZVxuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLicpO1xuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuIl0sIm5hbWVzIjpbImJveGVuIiwiY2hhbGsiLCJyYW5kb21VVUlEIiwiZXhwcmVzcyIsInJlYWRGaWxlU3luYyIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiaG9tZWRpciIsInJlc29sdmUiLCJwYXRoUmVzb2x2ZSIsImpvaW4iLCJpc0Fic29sdXRlIiwicGF0aFRvRmlsZVVSTCIsIldlYlNvY2tldFNlcnZlciIsIkxleENvbmZpZyIsImdldFBhY2thZ2VEaXIiLCJjcmVhdGVTcGlubmVyIiwicmVtb3ZlRmlsZXMiLCJsb2ciLCJnZXRDb3JzSGVhZGVycyIsImNvcnMiLCJyZXF1ZXN0T3JpZ2luIiwiY29yc0NvbmZpZyIsImFsbG93Q3JlZGVudGlhbHMiLCJjb25maWd1cmVkT3JpZ2lucyIsIm9yaWdpbnMiLCJhbGxvd3NBbnlPcmlnaW4iLCJpbmNsdWRlcyIsIm9yaWdpbklzQWxsb3dlZCIsIkJvb2xlYW4iLCJhbGxvd2VkT3JpZ2luIiwiZmluZCIsIm9yaWdpbiIsImhlYWRlcnMiLCJtZXRob2RzIiwiVmFyeSIsImdldENhY2hlRGlyIiwiY2FjaGVEaXIiLCJyZWN1cnNpdmUiLCJnZXRDYWNoZVBhdGgiLCJyZWFkUHVibGljSXBDYWNoZSIsImNhY2hlUGF0aCIsImNhY2hlRGF0YSIsImNhY2hlIiwiSlNPTiIsInBhcnNlIiwib25lV2Vla01zIiwiRGF0ZSIsIm5vdyIsInRpbWVzdGFtcCIsIndyaXRlUHVibGljSXBDYWNoZSIsImlwIiwic3RyaW5naWZ5IiwiZmV0Y2hQdWJsaWNJcCIsImZvcmNlUmVmcmVzaCIsIlByb21pc2UiLCJjYWNoZWQiLCJmZXRjaCIsInRoZW4iLCJyZXMiLCJ0ZXh0IiwiZGF0YSIsInRyaW0iLCJjYXRjaCIsInVuZGVmaW5lZCIsInJlc29sdmVQdWJsaWNJcEZvckRpc3BsYXkiLCJ0aW1lb3V0TXMiLCJ0aW1lb3V0UHJvbWlzZSIsInNldFRpbWVvdXQiLCJyYWNlIiwiZGlzcGxheVNlcnZlclN0YXR1cyIsImh0dHBQb3J0IiwiaHR0cHNQb3J0Iiwid3NQb3J0IiwiaG9zdCIsInF1aWV0IiwicHVibGljSXAiLCJodHRwVXJsIiwiaHR0cHNVcmwiLCJ3c1VybCIsIndzc1VybCIsInVybExpbmVzIiwiZ3JlZW4iLCJ1bmRlcmxpbmUiLCJzdGF0dXNCb3giLCJjeWFuIiwiYm9sZCIsInllbGxvdyIsImJhY2tncm91bmRDb2xvciIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3R5bGUiLCJtYXJnaW4iLCJwYWRkaW5nIiwiY29uc29sZSIsImxvYWRIYW5kbGVyIiwiaGFuZGxlclBhdGgiLCJvdXRwdXREaXIiLCJoYW5kbGVyUGFydHMiLCJzcGxpdCIsImZpbGVQYXRoIiwiZXhwb3J0TmFtZSIsImxlbmd0aCIsInNsaWNlIiwiZXJyb3IiLCJwYXRoUGFydHMiLCJsYXN0UGFydCIsImZ1bGxQYXRoIiwiZXh0ZW5zaW9ucyIsInBhdGhXaXRob3V0RXh0IiwicmVwbGFjZSIsImV4dCIsImNhbmRpZGF0ZVBhdGgiLCJFcnJvciIsImltcG9ydFBhdGgiLCJlbmRzV2l0aCIsImltcG9ydFVybCIsImhyZWYiLCJoYW5kbGVyTW9kdWxlIiwiT2JqZWN0Iiwia2V5cyIsImhhbmRsZXIiLCJkZWZhdWx0IiwiaW1wb3J0RXJyb3IiLCJtZXNzYWdlIiwic3RhY2siLCJjYXB0dXJlQ29uc29sZUxvZ3MiLCJldmVudCIsImNvbnRleHQiLCJvcmlnaW5hbENvbnNvbGVMb2ciLCJvcmlnaW5hbENvbnNvbGVFcnJvciIsIm9yaWdpbmFsQ29uc29sZVdhcm4iLCJ3YXJuIiwib3JpZ2luYWxDb25zb2xlSW5mbyIsImluZm8iLCJsb2dzIiwiYXJncyIsInB1c2giLCJyZXN1bHQiLCJncmF5IiwiZm9yRWFjaCIsImNyZWF0ZUV4cHJlc3NTZXJ2ZXIiLCJjb25maWciLCJjb25uZWN0aW9uUmVnaXN0cnkiLCJkZWJ1ZyIsImFwcCIsInVzZSIsInJlcSIsIm5leHQiLCJjdXN0b20iLCJoZWFkZXIiLCJlbnRyaWVzIiwibmFtZSIsInZhbHVlIiwibWV0aG9kIiwic2VuZFN0YXR1cyIsInJhdyIsImxpbWl0IiwidHlwZSIsImJvZHlMaW1pdCIsIlN0cmluZyIsImpzb24iLCJwb3N0IiwiY29ubmVjdGlvbklkIiwicGFyYW1zIiwid3MiLCJnZXQiLCJzdGF0dXMiLCJib2R5IiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsInNlbmQiLCJvayIsImxvYWRHcmFwaFFMU2NoZW1hIiwiZ3JhcGhxbEhhbmRsZXIiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbk5hbWUiLCJmdW5jdGlvbkNvbmZpZyIsImV2ZW50cyIsImh0dHAiLCJwYXRoIiwiZ3JhcGhxbFBhdGgiLCJfZnVuY3Rpb25OYW1lIiwicXVlcnkiLCJ2YXJpYWJsZXMiLCJvcGVyYXRpb25OYW1lIiwibG9nTWVzc2FnZSIsIm1hcCIsImFyZyIsImF3c1JlcXVlc3RJZCIsImZ1bmN0aW9uVmVyc2lvbiIsImdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcyIsImludm9rZWRGdW5jdGlvbkFybiIsImxvZ0dyb3VwTmFtZSIsImxvZ1N0cmVhbU5hbWUiLCJ3cmFwcGVkSGFuZGxlciIsImh0dHBNZXRob2QiLCJxdWVyeVN0cmluZ1BhcmFtZXRlcnMiLCJzdGF0dXNDb2RlIiwia2V5Iiwic2V0SGVhZGVyIiwidXJsIiwicGF0aG5hbWUiLCJtYXRjaGVkRnVuY3Rpb24iLCJmdW5jdGlvbk5hbWVzIiwiZXZlbnRQYXRoIiwiZXZlbnRNZXRob2QiLCJ0b1VwcGVyQ2FzZSIsInJlcXVlc3RNZXRob2QiLCJub3JtYWxpemVkRXZlbnRQYXRoIiwibm9ybWFsaXplZFBhdGhuYW1lIiwiaXNSYXdCb2R5IiwiaXNCYXNlNjRFbmNvZGVkIiwibWVtb3J5TGltaXRJbk1CIiwiY3JlYXRlV2ViU29ja2V0U2VydmVyIiwid3NzIiwicG9ydCIsImdldFdlYlNvY2tldEZ1bmN0aW9uQnlSb3V0ZSIsInJvdXRlS2V5IiwiZGVmYXVsdEZ1bmN0aW9uIiwid2Vic29ja2V0Iiwicm91dGUiLCJvbiIsInNldCIsInJlcXVlc3RVcmwiLCJVUkwiLCJmcm9tRW50cmllcyIsInNlYXJjaFBhcmFtcyIsIm11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJnZXRBbGwiLCJjb25uZWN0RnVuY3Rpb24iLCJjb25uZWN0SGFuZGxlciIsIndyYXBwZWRDb25uZWN0SGFuZGxlciIsInJlcXVlc3RDb250ZXh0IiwiYXBpR2F0ZXdheSIsImVuZHBvaW50IiwiZXZlbnRUeXBlIiwiYWN0aW9uIiwiZGVsZXRlIiwiZGlzY29ubmVjdEZ1bmN0aW9uIiwiZGlzY29ubmVjdEhhbmRsZXIiLCJ3cmFwcGVkRGlzY29ubmVjdEhhbmRsZXIiLCJsb2FkRW52RmlsZSIsImVudlBhdGgiLCJlbnZWYXJzIiwiZW52Q29udGVudCIsImxpbmVzIiwibGluZSIsInRyaW1tZWRMaW5lIiwic3RhcnRzV2l0aCIsImVxdWFsSW5kZXgiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwiY2xlYW5WYWx1ZSIsInNlcnZlcmxlc3NEZXYiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJjbGlIb3N0IiwiY2xpSHR0cFBvcnQiLCJjbGlIdHRwc1BvcnQiLCJyZW1vdmUiLCJ0ZXN0IiwidXNlUHVibGljSXAiLCJjbGlXc1BvcnQiLCJzcGlubmVyIiwicGFyc2VDb25maWciLCJvdXRwdXRGdWxsUGF0aCIsImVudlBhdGhzIiwicHJvY2VzcyIsImN3ZCIsImZpbGVFbnZWYXJzIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJjbGlWYXJzIiwiX2Vycm9yIiwiZW52Iiwic3RhcnQiLCJzdWNjZWVkIiwic2VydmVybGVzc0NvbmZpZyIsInBhY2thZ2VEaXIiLCJjb25maWdGb3JtYXRzIiwiY29uZmlnUGF0aCIsImNvbmZpZ01vZHVsZSIsInNlcnZlcmxlc3MiLCJjb25maWdPZmZsaW5lIiwiZWZmZWN0aXZlSG9zdCIsInRvTnVtYmVyIiwidiIsImZhbGxiYWNrIiwibiIsInBhcnNlSW50IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJlZmZlY3RpdmVIdHRwUG9ydCIsImVmZmVjdGl2ZUh0dHBzUG9ydCIsImVmZmVjdGl2ZVdzUG9ydCIsImZpbmFsQ29uZmlnIiwiTWFwIiwiZXhwcmVzc0FwcCIsIndzU2VydmVyIiwiZmFpbCIsInNlcnZlciIsImxpc3RlbiIsInNodXRkb3duIiwiY2xvc2UiLCJzdGRpbiIsInJlc3VtZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0Qs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
|