@tscircuit/eval 0.0.394 → 0.0.395

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lib/index.js CHANGED
@@ -360,6 +360,22 @@ function resolveWithTsconfigPaths(opts) {
360
360
  }
361
361
  return null;
362
362
  }
363
+ function matchesTsconfigPathPattern(importPath, tsConfig) {
364
+ if (!tsConfig) return false;
365
+ const { paths } = tsConfig;
366
+ for (const [alias] of Object.entries(paths)) {
367
+ const hasWildcard = alias.includes("*");
368
+ if (hasWildcard) {
369
+ const [prefix, suffix] = alias.split("*");
370
+ if (importPath.startsWith(prefix) && importPath.endsWith(suffix || "")) {
371
+ return true;
372
+ }
373
+ } else {
374
+ if (importPath === alias) return true;
375
+ }
376
+ }
377
+ return false;
378
+ }
363
379
 
364
380
  // lib/utils/resolveRelativePath.ts
365
381
  function resolveRelativePath(importPath, cwd) {
@@ -899,6 +915,12 @@ async function importEvalPath(importName, ctx, depth = 0, opts = {}) {
899
915
  if (importName.startsWith("@tsci/")) {
900
916
  return importSnippet(importName, ctx, depth);
901
917
  }
918
+ const tsConfig = getTsConfig(ctx.fsMap);
919
+ if (matchesTsconfigPathPattern(importName, tsConfig)) {
920
+ throw new Error(
921
+ `Import "${importName}" matches a tsconfig path alias but could not be resolved to an existing file${opts.cwd ? ` from directory "${opts.cwd}"` : ""}`
922
+ );
923
+ }
902
924
  if (!importName.startsWith(".") && !importName.startsWith("/")) {
903
925
  return importNpmPackage(importName, ctx, depth);
904
926
  }
@@ -1434,4 +1456,4 @@ export {
1434
1456
  runTscircuitCode,
1435
1457
  runTscircuitModule
1436
1458
  };
1437
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvQ2lyY3VpdFJ1bm5lci50cyIsICIuLi8uLi9saWIvdXRpbHMvZGlybmFtZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdENvZGUudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRNb2R1bGUudHMiLCAiLi4vLi4vbGliL3dvcmtlci50cyIsICIuLi8uLi9saWIvZ2V0UG9zc2libGVFbnRyeXBvaW50Q29tcG9uZW50UGF0aHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgdHlwZSB7IFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgKiBhcyB0c2NpcmN1aXRDb3JlIGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6ZXhlY3V0aW9uLWNvbnRleHRcIilcblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGVudHJ5cG9pbnQ6IHN0cmluZ1xuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgY2lyY3VpdDogUm9vdENpcmN1aXRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gIHdlYldvcmtlckNvbmZpZ3VyYXRpb246IFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIG9wdHM6IHtcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgcGxhdGZvcm0/OiBQbGF0Zm9ybUNvbmZpZ1xuICAgIHByb2plY3RDb25maWc/OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPlxuICAgIGRlYnVnTmFtZXNwYWNlPzogc3RyaW5nXG4gIH0gPSB7fSxcbik6IEV4ZWN1dGlvbkNvbnRleHQge1xuICBnbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcblxuICBjb25zdCBiYXNlUGxhdGZvcm0gPSBvcHRzLnBsYXRmb3JtIHx8IGdldFBsYXRmb3JtQ29uZmlnKClcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRzLnByb2plY3RDb25maWdcbiAgICA/IHsgLi4uYmFzZVBsYXRmb3JtLCAuLi5vcHRzLnByb2plY3RDb25maWcgfVxuICAgIDogYmFzZVBsYXRmb3JtXG5cbiAgY29uc3QgY2lyY3VpdCA9IG5ldyBSb290Q2lyY3VpdCh7XG4gICAgcGxhdGZvcm0sXG4gIH0pXG5cbiAgaWYgKG9wdHMubmFtZSkge1xuICAgIGNpcmN1aXQubmFtZSA9IG9wdHMubmFtZVxuICB9XG5cbiAgaWYgKG9wdHMuZGVidWdOYW1lc3BhY2UpIHtcbiAgICBjaXJjdWl0LmVuYWJsZURlYnVnKG9wdHMuZGVidWdOYW1lc3BhY2UpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZzTWFwOiB7fSxcbiAgICBlbnRyeXBvaW50OiBcIlwiLFxuICAgIHByZVN1cHBsaWVkSW1wb3J0czoge1xuICAgICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogdHNjaXJjdWl0Q29yZSxcbiAgICAgIHRzY2lyY3VpdDogdHNjaXJjdWl0Q29yZSxcbiAgICAgIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCI6IHRzY2lyY3VpdE1hdGhVdGlscyxcbiAgICAgIHJlYWN0OiBSZWFjdCxcbiAgICAgIGRlYnVnOiBEZWJ1ZyxcblxuICAgICAgLy8gVGhpcyBpcyB1c3VhbGx5IHVzZWQgYXMgYSB0eXBlIGltcG9ydCwgd2UgY2FuIHJlbW92ZSB0aGUgc2hpbSB3aGVuIHdlXG4gICAgICAvLyBpZ25vcmUgdHlwZSBpbXBvcnRzIGluIGdldEltcG9ydHNGcm9tQ29kZVxuICAgICAgXCJAdHNjaXJjdWl0L3Byb3BzXCI6IHt9LFxuICAgIH0sXG4gICAgY2lyY3VpdCxcbiAgICAuLi53ZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICB9XG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgS2lDYWQgZm9vdHByaW50IHN0cmluZyBpbnRvIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICogRm9yIG5vdywgdGhpcyBpcyBhIHNpbXBsaWZpZWQgY29udmVyc2lvbiB0byBhIHN0YW5kYXJkIHBhY2thZ2UgbmFtZS5cbiAqIGUuZy4gXCJraWNhZDpSZXNpc3Rvcl9TTUQ6Ul8wNjAzXzE2MDhNZXRyaWNcIiAtPiBcIjA2MDNcIlxuICovXG5leHBvcnQgY29uc3QgZ2V0Rm9vdHByaW50ZXJTdHJpbmdGcm9tS2ljYWQgPSAoXG4gIGtpY2FkRm9vdHByaW50OiBzdHJpbmcsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAvLyBraWNhZDpSZXNpc3Rvcl9TTUQ6Ul8wNjAzXzE2MDhNZXRyaWMgLT4gMDYwM1xuICBsZXQgbWF0Y2ggPSBraWNhZEZvb3RwcmludC5tYXRjaCgvOltSQ11fKFxcZHs0fSlfLylcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICAvLyBraWNhZDpQYWNrYWdlX1NPOlNPSUMtOF8zLjl4NC45bW1fUDEuMjdtbSAtPiBTT0lDLThcbiAgLy8ga2ljYWQ6UGFja2FnZV9UT19TT1RfU01EOlNPVC0yMyAtPiBTT1QtMjNcbiAgbWF0Y2ggPSBraWNhZEZvb3RwcmludC5tYXRjaChcbiAgICAvOihTT0lDLVxcZCt8U09ULVxcZCt8U09ELVxcZCt8U1NPUC1cXGQrfFRTU09QLVxcZCt8UUZQLVxcZCt8UUZOLVxcZCspLyxcbiAgKVxuICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cbiIsICIvKipcbiAqIFRyYW5zZm9ybXMgYSBnZW5lcmljIFwiZm9vdHByaW50ZXIgc3RyaW5nXCIgaW50byBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZS5cbiAqIGUuZy4gXCJjYXAwNjAzXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgPSAoXG4gIGZvb3RwcmludGVyU3RyaW5nOiBzdHJpbmcsXG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoZm9vdHByaW50ZXJTdHJpbmcuaW5jbHVkZXMoXCJjYXBcIikpIHtcbiAgICByZXR1cm4gZm9vdHByaW50ZXJTdHJpbmcucmVwbGFjZSgvY2FwL2csIFwiXCIpXG4gIH1cbiAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nXG59XG4iLCAiaW1wb3J0IHsgZ2V0Rm9vdHByaW50ZXJTdHJpbmdGcm9tS2ljYWQgfSBmcm9tIFwiLi9nZXQtZm9vdHByaW50ZXItc3RyaW5nLWZyb20ta2ljYWRcIlxuaW1wb3J0IHsgZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyB9IGZyb20gXCIuL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZ1wiXG5cbi8qKlxuICogR2V0IGEgSkxDLWNvbXBhdGlibGUgcGFja2FnZSBuYW1lIGZyb20gYSBmb290cHJpbnQgc3RyaW5nLCB3aGljaCBjb3VsZCBiZVxuICogYSBLaUNhZCBmb290cHJpbnQgb3IgYSBnZW5lcmljIFwiZm9vdHByaW50ZXIgc3RyaW5nXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNwY2JQYWNrYWdlTmFtZSA9IChcbiAgZm9vdHByaW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWZvb3RwcmludCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChmb290cHJpbnQuc3RhcnRzV2l0aChcImtpY2FkOlwiKSkge1xuICAgIGNvbnN0IGZvb3RwcmludGVyU3RyaW5nID0gZ2V0Rm9vdHByaW50ZXJTdHJpbmdGcm9tS2ljYWQoZm9vdHByaW50KVxuICAgIGlmIChmb290cHJpbnRlclN0cmluZykge1xuICAgICAgcmV0dXJuIGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcoZm9vdHByaW50ZXJTdHJpbmcpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIHVuLW1hdGNoZWQgS2lDYWQgc3RyaW5nc1xuICAgIHJldHVybiBmb290cHJpbnRcbiAgfVxuXG4gIC8vIE5vdCBhIEtpQ2FkIHN0cmluZywgYXNzdW1lIGl0J3MgYSBmb290cHJpbnRlciBzdHJpbmdcbiAgcmV0dXJuIGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcoZm9vdHByaW50KVxufVxuIiwgImltcG9ydCB0eXBlIHsgUGFydHNFbmdpbmUsIFN1cHBsaWVyUGFydE51bWJlcnMgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRKbGNwY2JQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleFwiXG5cbmV4cG9ydCBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcblxuY29uc3QgZ2V0SmxjUGFydHNDYWNoZWQgPSBhc3luYyAobmFtZTogYW55LCBwYXJhbXM6IGFueSkgPT4ge1xuICBjb25zdCBwYXJhbVN0cmluZyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIC4uLnBhcmFtcyxcbiAgICBqc29uOiBcInRydWVcIixcbiAgfSkudG9TdHJpbmcoKVxuICBpZiAoY2FjaGUuaGFzKHBhcmFtU3RyaW5nKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQocGFyYW1TdHJpbmcpXG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICBgaHR0cHM6Ly9qbGNzZWFyY2gudHNjaXJjdWl0LmNvbS8ke25hbWV9L2xpc3Q/JHtwYXJhbVN0cmluZ31gLFxuICApXG4gIGNvbnN0IHJlc3BvbnNlSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICBjYWNoZS5zZXQocGFyYW1TdHJpbmcsIHJlc3BvbnNlSnNvbilcbiAgcmV0dXJuIHJlc3BvbnNlSnNvblxufVxuXG5jb25zdCB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZSA9IChwYXJ0czogYW55W10gfCB1bmRlZmluZWQpID0+IHtcbiAgaWYgKCFwYXJ0cykgcmV0dXJuIFtdXG4gIHJldHVybiBbLi4ucGFydHNdLnNvcnQoXG4gICAgKGEsIGIpID0+IE51bWJlcihiLmlzX2Jhc2ljID8/IGZhbHNlKSAtIE51bWJlcihhLmlzX2Jhc2ljID8/IGZhbHNlKSxcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgamxjUGFydHNFbmdpbmU6IFBhcnRzRW5naW5lID0ge1xuICBmaW5kUGFydDogYXN5bmMgKHtcbiAgICBzb3VyY2VDb21wb25lbnQsXG4gICAgZm9vdHByaW50ZXJTdHJpbmcsXG4gIH0pOiBQcm9taXNlPFN1cHBsaWVyUGFydE51bWJlcnM+ID0+IHtcbiAgICBjb25zdCBqbGNwY2JQYWNrYWdlID0gZ2V0SmxjcGNiUGFja2FnZU5hbWUoZm9vdHByaW50ZXJTdHJpbmcpXG5cbiAgICBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcmVzaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNpc3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicmVzaXN0b3JzXCIsIHtcbiAgICAgICAgcmVzaXN0YW5jZTogc291cmNlQ29tcG9uZW50LnJlc2lzdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHJlc2lzdG9ycylcbiAgICAgICAgICAubWFwKChyOiBhbnkpID0+IGBDJHtyLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jYXBhY2l0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBjYXBhY2l0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNhcGFjaXRvcnNcIiwge1xuICAgICAgICBjYXBhY2l0YW5jZTogc291cmNlQ29tcG9uZW50LmNhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShjYXBhY2l0b3JzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bpbl9oZWFkZXJcIlxuICAgICkge1xuICAgICAgbGV0IHBpdGNoOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgICAgIGlmIChmb290cHJpbnRlclN0cmluZz8uaW5jbHVkZXMoXCJfcFwiKSkge1xuICAgICAgICBwaXRjaCA9IE51bWJlcihmb290cHJpbnRlclN0cmluZy5zcGxpdChcIl9wXCIpWzFdKVxuICAgICAgfVxuICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcbiAgICAgICAgXCJoZWFkZXJzXCIsXG4gICAgICAgIHBpdGNoXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH0sXG4gICAgICApXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGhlYWRlcnMpXG4gICAgICAgICAgLm1hcCgoaDogYW55KSA9PiBgQyR7aC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcG90ZW50aW9tZXRlclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvdGVudGlvbWV0ZXJzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInBvdGVudGlvbWV0ZXJzXCIsIHtcbiAgICAgICAgcmVzaXN0YW5jZTogc291cmNlQ29tcG9uZW50Lm1heF9yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG90ZW50aW9tZXRlcnMpXG4gICAgICAgICAgLm1hcCgocDogYW55KSA9PiBgQyR7cC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZGlvZGVcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBkaW9kZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiZGlvZGVzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGRpb2RlcylcbiAgICAgICAgICAubWFwKChkOiBhbnkpID0+IGBDJHtkLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jaGlwXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2hpcHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY2hpcHNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2hpcHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfdHJhbnNpc3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHRyYW5zaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInRyYW5zaXN0b3JzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgdHJhbnNpc3Rvcl90eXBlOiBzb3VyY2VDb21wb25lbnQudHJhbnNpc3Rvcl90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UodHJhbnNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgodDogYW55KSA9PiBgQyR7dC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcG93ZXJfc291cmNlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcG93ZXJfc291cmNlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3dlcl9zb3VyY2VzXCIsIHtcbiAgICAgICAgdm9sdGFnZTogc291cmNlQ29tcG9uZW50LnZvbHRhZ2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShwb3dlcl9zb3VyY2VzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2luZHVjdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgaW5kdWN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImluZHVjdG9yc1wiLCB7XG4gICAgICAgIGluZHVjdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5pbmR1Y3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoaW5kdWN0b3JzKVxuICAgICAgICAgIC5tYXAoKGk6IGFueSkgPT4gYEMke2kubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NyeXN0YWxcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBjcnlzdGFscyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjcnlzdGFsc1wiLCB7XG4gICAgICAgIGZyZXF1ZW5jeTogc291cmNlQ29tcG9uZW50LmZyZXF1ZW5jeSxcbiAgICAgICAgbG9hZF9jYXBhY2l0YW5jZTogc291cmNlQ29tcG9uZW50LmxvYWRfY2FwYWNpdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShjcnlzdGFscylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9tb3NmZXRcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBtb3NmZXRzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcIm1vc2ZldHNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgICBtb3NmZXRfbW9kZTogc291cmNlQ29tcG9uZW50Lm1vc2ZldF9tb2RlLFxuICAgICAgICBjaGFubmVsX3R5cGU6IHNvdXJjZUNvbXBvbmVudC5jaGFubmVsX3R5cGUsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShtb3NmZXRzKVxuICAgICAgICAgIC5tYXAoKG06IGFueSkgPT4gYEMke20ubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc29uYXRvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlc29uYXRvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicmVzb25hdG9yc1wiLCB7XG4gICAgICAgIGZyZXF1ZW5jeTogc291cmNlQ29tcG9uZW50LmZyZXF1ZW5jeSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHJlc29uYXRvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfc3dpdGNoXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgc3dpdGNoZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwic3dpdGNoZXNcIiwge1xuICAgICAgICBzd2l0Y2hfdHlwZTogc291cmNlQ29tcG9uZW50LnR5cGUsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShzd2l0Y2hlcylcbiAgICAgICAgICAubWFwKChzOiBhbnkpID0+IGBDJHtzLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9sZWRcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBsZWRzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImxlZHNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobGVkcylcbiAgICAgICAgICAubWFwKChsOiBhbnkpID0+IGBDJHtsLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9mdXNlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZnVzZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiZnVzZXNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoZnVzZXMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge31cbiAgfSxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgamxjUGFydHNFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmVcIlxuaW1wb3J0IHsgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24gfSBmcm9tIFwia2ljYWQtY29tcG9uZW50LWNvbnZlcnRlclwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxuZXhwb3J0IGNvbnN0IGdldFBsYXRmb3JtQ29uZmlnID0gKCk6IFBsYXRmb3JtQ29uZmlnID0+ICh7XG4gIHBhcnRzRW5naW5lOiBqbGNQYXJ0c0VuZ2luZSxcbiAgZm9vdHByaW50TGlicmFyeU1hcDoge1xuICAgIGtpY2FkOiBhc3luYyAoZm9vdHByaW50TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gYCR7S0lDQURfRk9PVFBSSU5UX0NBQ0hFX1VSTH0vJHtmb290cHJpbnROYW1lfWBcbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uVXJsID0gYCR7YmFzZVVybH0uY2lyY3VpdC5qc29uYFxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goY2lyY3VpdEpzb25VcmwpXG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZXMuanNvbigpXG4gICAgICAvLyBGaWx0ZXIgcGNiX3NpbGtzY3JlZW5fdGV4dCB0byBvbmx5IGtlZXAgZW50cmllcyB3aXRoIHRleHQgPT09IFwiUkVGKipcIlxuICAgICAgLy8gQXBwbHkgZmlsdGVyaW5nIG9ubHkgdG8gZWxlbWVudHMgY29taW5nIGZyb20gdGhlIGtpY2FkX21vZF9zZXJ2ZXIgcmVzcG9uc2VcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gQXJyYXkuaXNBcnJheShyYXcpXG4gICAgICAgID8gcmF3LmZpbHRlcigoZWwpID0+XG4gICAgICAgICAgICBlbD8udHlwZSA9PT0gXCJwY2Jfc2lsa3NjcmVlbl90ZXh0XCIgPyBlbD8udGV4dCA9PT0gXCJSRUYqKlwiIDogdHJ1ZSxcbiAgICAgICAgICApXG4gICAgICAgIDogcmF3XG4gICAgICBjb25zdCB3cmxVcmwgPSBgJHtiYXNlVXJsfS53cmxgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb290cHJpbnRDaXJjdWl0SnNvbjogZmlsdGVyZWQsXG4gICAgICAgIGNhZE1vZGVsOiB7IHdybFVybCwgbW9kZWxVbml0VG9NbVNjYWxlOiAyLjU0IH0sXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgZm9vdHByaW50RmlsZVBhcnNlck1hcDoge1xuICAgIGtpY2FkX21vZDoge1xuICAgICAgbG9hZEZyb21Vcmw6IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBraWNhZENvbnRlbnQgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAgICAgY29uc3Qga2ljYWRKc29uID0gYXdhaXQgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24oa2ljYWRDb250ZW50KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBBcnJheS5pc0FycmF5KGtpY2FkSnNvbilcbiAgICAgICAgICAgID8ga2ljYWRKc29uXG4gICAgICAgICAgICA6IFtraWNhZEpzb25dLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKSB7XG4gIGxldCBub3JtRmlsZVBhdGggPSBmaWxlUGF0aFxuICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnRyaW0oKVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5zbGljZSgyKVxuICB9XG4gIGlmIChub3JtRmlsZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMSlcbiAgfVxuICByZXR1cm4gbm9ybUZpbGVQYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGc01hcChmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICBjb25zdCBub3JtYWxpemVkRnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtmc1BhdGgsIGZpbGVDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmc01hcCkpIHtcbiAgICBub3JtYWxpemVkRnNNYXBbbm9ybWFsaXplRmlsZVBhdGgoZnNQYXRoKV0gPSBmaWxlQ29udGVudFxuICB9XG4gIHJldHVybiBub3JtYWxpemVkRnNNYXBcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuLi8uLi93ZWJ3b3JrZXIvZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgbm9ybWFsaXplRnNNYXAgfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwid2Vid29ya2VyL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkIH0gZnJvbSBcIi4vc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCJcbmltcG9ydCB7IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciB9IGZyb20gXCJsaWIvdXRpbHMvZW5oYW5jZS1yb290LWNpcmN1aXQtZXJyb3JcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgZW5hYmxlRGVidWcobmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWJ1Z05hbWVzcGFjZSA9IG5hbWVzcGFjZVxuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIGFueVxuICAgICAgY2lyY3VpdC5lbmFibGVEZWJ1Zz8uKG5hbWVzcGFjZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9iaW5kRXZlbnRMaXN0ZW5lcnMoY2lyY3VpdDogUm9vdENpcmN1aXQpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICBjaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgbGlzdGVuZXIgYXMgYW55KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgYSBwYXRoLCBzaW1pbGFyIHRvIE5vZGUuanMgcGF0aC5kaXJuYW1lXG4gKiBXb3JrcyBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGF0aHNcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGV4dHJhY3QgdGhlIGRpcmVjdG9yeSBmcm9tXG4gKiBAcmV0dXJucyBUaGUgZGlyZWN0b3J5IHBhcnQgb2YgdGhlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gXCIuXCJcblxuICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2hlc1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICBjb25zdCBjbGVhblBhdGggPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHNsYXNoZXMsIHJldHVybiBcIi5cIlxuICBpZiAoY2xlYW5QYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3Qgc2xhc2hcbiAgcmV0dXJuIGNsZWFuUGF0aC5zdWJzdHJpbmcoMCwgY2xlYW5QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSkgfHwgXCIvXCJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcblxudHlwZSBSYXdUc0NvbmZpZyA9IHtcbiAgY29tcGlsZXJPcHRpb25zPzoge1xuICAgIGJhc2VVcmw/OiBzdHJpbmdcbiAgICBwYXRocz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnUGF0aHNJbmZvID0ge1xuICBiYXNlVXJsOiBzdHJpbmdcbiAgcGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNDb25maWcoXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbik6IFRzQ29uZmlnUGF0aHNJbmZvIHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGZzTWFwT3JBbGxGaWxlUGF0aHMpKSByZXR1cm4gbnVsbFxuICBjb25zdCB0c2NvbmZpZ0NvbnRlbnQgPSBmc01hcE9yQWxsRmlsZVBhdGhzW1widHNjb25maWcuanNvblwiXVxuICBpZiAoIXRzY29uZmlnQ29udGVudCkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRzY29uZmlnQ29udGVudCkgYXMgUmF3VHNDb25maWdcbiAgICByZXR1cm4gcGFyc2VkPy5jb21waWxlck9wdGlvbnM/LnBhdGhzXG4gICAgICA/IHtcbiAgICAgICAgICBiYXNlVXJsOiBwYXJzZWQuY29tcGlsZXJPcHRpb25zLmJhc2VVcmwgfHwgXCIuXCIsXG4gICAgICAgICAgcGF0aHM6IHBhcnNlZC5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgICAgIH1cbiAgICAgIDogbnVsbFxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZ1BhdGhzSW5mbyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGlmICghdHNDb25maWcpIHJldHVybiBudWxsXG4gIGNvbnN0IHsgYmFzZVVybCwgcGF0aHMgfSA9IHRzQ29uZmlnXG5cbiAgY29uc3QgdHJ5UmVzb2x2ZUNhbmRpZGF0ZSA9IChjYW5kaWRhdGU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDYW5kaWRhdGUgPSBub3JtYWxpemVGaWxlUGF0aChjYW5kaWRhdGUpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZENhbmRpZGF0ZSkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRDYW5kaWRhdGUpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZENhbmRpZGF0ZX0uJHtleHR9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQod2l0aEV4dCkhXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMocGF0aHMpKSB7XG4gICAgLy8gU3VwcG9ydCBwYXR0ZXJucyBsaWtlIFwiQHNyYy8qXCIgb3IgXCJ1dGlscy8qXCIgYW5kIGFsc28gZXhhY3QgbWF0Y2hlcyB3aXRob3V0IFwiKlwiXG4gICAgY29uc3QgaGFzV2lsZGNhcmQgPSBhbGlhcy5pbmNsdWRlcyhcIipcIilcbiAgICBpZiAoaGFzV2lsZGNhcmQpIHtcbiAgICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBhbGlhcy5zcGxpdChcIipcIilcbiAgICAgIGlmIChcbiAgICAgICAgIWltcG9ydFBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8XG4gICAgICAgICFpbXBvcnRQYXRoLmVuZHNXaXRoKHN1ZmZpeCB8fCBcIlwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBzdGFyTWF0Y2ggPSBpbXBvcnRQYXRoLnNsaWNlKFxuICAgICAgICBwcmVmaXgubGVuZ3RoLFxuICAgICAgICBpbXBvcnRQYXRoLmxlbmd0aCAtIChzdWZmaXggPyBzdWZmaXgubGVuZ3RoIDogMCksXG4gICAgICApXG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkID0gdGFyZ2V0LnJlcGxhY2UoXCIqXCIsIHN0YXJNYXRjaClcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICA/IGAke2Jhc2VVcmx9LyR7cmVwbGFjZWR9YFxuICAgICAgICAgICAgOiByZXBsYWNlZFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW1wb3J0UGF0aCAhPT0gYWxpYXMpIGNvbnRpbnVlXG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhdGFyZ2V0LnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdGFyZ2V0LnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICA/IGAke2Jhc2VVcmx9LyR7dGFyZ2V0fWBcbiAgICAgICAgICAgIDogdGFyZ2V0XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIi4vZGlybmFtZVwiXG5cbi8qKlxuICogUmVzb2x2ZSBhbiBpbXBvcnRQYXRoIHJlbGF0aXZlIHRvIGEgY3dkLCBzdXBwb3J0aW5nIC4uLywgLi8gYW5kIGFic29sdXRlIHBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvblxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyID0gZGlybmFtZShjd2QpXG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgzKSwgcGFyZW50RGlyKVxuICB9XG4gIC8vIEhhbmRsZSBjdXJyZW50IGRpcmVjdG9yeVxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDIpLCBjd2QpXG4gIH1cbiAgLy8gSGFuZGxlIGFic29sdXRlIHBhdGhcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICByZXR1cm4gaW1wb3J0UGF0aC5zbGljZSgxKVxuICB9XG4gIC8vIEhhbmRsZSByZWxhdGl2ZSBwYXRoXG4gIHJldHVybiBgJHtjd2R9LyR7aW1wb3J0UGF0aH1gXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCB7IGdldFRzQ29uZmlnLCByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMgfSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCB7IHJlc29sdmVSZWxhdGl2ZVBhdGggfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGhcIlxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4pID0+IHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvbiBwcm9wZXJseVxuICBjb25zdCByZXNvbHZlZFBhdGggPSBjd2RcbiAgICA/IHJlc29sdmVSZWxhdGl2ZVBhdGgodW5rbm93bkZpbGVQYXRoLCBjd2QpXG4gICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpIVxuICB9XG5cbiAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgY29uc3QgZXh0ZW5zaW9uID0gW1widHN4XCIsIFwidHNcIiwgXCJqc29uXCIsIFwianNcIiwgXCJqc3hcIiwgXCJvYmpcIiwgXCJnbHRmXCIsIFwiZ2xiXCJdXG4gIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbikge1xuICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KHBvc3NpYmxlRmlsZVBhdGgpIVxuICAgIH1cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgdXNpbmcgdHNjb25maWcgXCJwYXRoc1wiIG1hcHBpbmcgd2hlbiB0aGUgaW1wb3J0IGlzIG5vbi1yZWxhdGl2ZVxuICBjb25zdCB0c0NvbmZpZyA9XG4gICAgIUFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykgJiZcbiAgICB0eXBlb2YgZnNNYXBPckFsbEZpbGVQYXRocyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBnZXRUc0NvbmZpZyhmc01hcE9yQWxsRmlsZVBhdGhzKVxuICAgICAgOiBudWxsXG5cbiAgaWYgKCF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpICYmICF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IHZpYVRzY29uZmlnID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbixcbiAgICAgIHRzQ29uZmlnLFxuICAgIH0pXG4gICAgaWYgKHZpYVRzY29uZmlnKSByZXR1cm4gdmlhVHNjb25maWdcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0XG4gIGlmICghdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdW5rbm93bkZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgodW5rbm93bkZpbGVQYXRoKVxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChub3JtYWxpemVkVW5rbm93bkZpbGVQYXRoKSFcbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9uKSB7XG4gICAgICBjb25zdCBwb3NzaWJsZUZpbGVQYXRoID0gYCR7bm9ybWFsaXplZFVua25vd25GaWxlUGF0aH0uJHtleHR9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMocG9zc2libGVGaWxlUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQocG9zc2libGVGaWxlUGF0aCkhXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgsIGZzTWFwT3JBbGxGaWxlUGF0aHMpXG4gIGlmICghcmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaWxlIG5vdCBmb3VuZCBcIiR7dW5rbm93bkZpbGVQYXRofVwiLCBhdmFpbGFibGUgcGF0aHM6XFxuXFxuJHtPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKS5qb2luKFwiLCBcIil9YCxcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkRmlsZVBhdGhcbn1cbiIsICJleHBvcnQgY29uc3QgZ2V0SW1wb3J0c0Zyb21Db2RlID0gKGNvZGU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGltcG9ydHMucHVzaChtYXRjaFsxXSlcbiAgfVxuXG4gIC8vIE1hdGNoIHJlLWV4cG9ydHNcbiAgY29uc3QgcmVFeHBvcnRSZWdleCA9XG4gICAgL15cXHMqZXhwb3J0XFxzKyg/OlxcKnwoPzpcXHtbXFxzXFx3LF0rXFx9KSlcXHMrZnJvbVxccypbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKGNvZGUpKSAhPT0gbnVsbCkge1xuICAgIGltcG9ydHMucHVzaChyZUV4cG9ydE1hdGNoWzFdKVxuICB9XG5cbiAgcmV0dXJuIGltcG9ydHNcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkRmlsZVBhdGggPSByZXNvbHZlRmlsZVBhdGgobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QpXG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7XG4gIHJlc29sdmVGaWxlUGF0aCxcbiAgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyxcbn0gZnJvbSBcImxpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuaW1wb3J0IHsgZ2V0SW1wb3J0c0Zyb21Db2RlIH0gZnJvbSBcImxpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGVcIlxuaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGlzU3RhdGljQXNzZXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvc3RhdGljLWFzc2V0LWV4dGVuc2lvbnNcIlxuaW1wb3J0IHsgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgfSBmcm9tIFwiLi90cmFuc2Zvcm0td2l0aC1zdWNyYXNlXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbG9jYWwtZmlsZVwiKVxuXG5leHBvcnQgY29uc3QgaW1wb3J0TG9jYWxGaWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGRlYnVnKFwiaW1wb3J0TG9jYWxGaWxlIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgfSlcblxuICBjb25zdCB7IGZzTWFwLCBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGNvbnN0IGZzUGF0aCA9IHJlc29sdmVGaWxlUGF0aE9yVGhyb3coaW1wb3J0TmFtZSwgZnNNYXApXG4gIGRlYnVnKFwiZnNQYXRoOlwiLCBmc1BhdGgpXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgY29uc3QgcGxhdGZvcm1Db25maWcgPSBjdHguY2lyY3VpdC5wbGF0Zm9ybVxuICAgIC8vIFVzZSBwcm9qZWN0QmFzZVVybCBmb3Igc3RhdGljIGZpbGUgaW1wb3J0c1xuICAgIGNvbnN0IHN0YXRpY1VybCA9IGAke3BsYXRmb3JtQ29uZmlnPy5wcm9qZWN0QmFzZVVybCA/PyBcIlwifS8ke2ZzUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgPyBmc1BhdGguc2xpY2UoMikgOiBmc1BhdGh9YFxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgX19lc01vZHVsZTogdHJ1ZSxcbiAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICB9XG4gIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLnRzeFwiKSB8fCBmc1BhdGguZW5kc1dpdGgoXCIudHNcIikpIHtcbiAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgIGRlYnVnKFwiZXZhbENvbXBpbGVkSnMgY2FsbGVkIHdpdGg6XCIsIHtcbiAgICAgICAgY29kZTogdHJhbnNmb3JtZWRDb2RlLnNsaWNlKDAsIDEwMCksXG4gICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgIH0pXG4gICAgICBjb25zdCBpbXBvcnRSdW5SZXN1bHQgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgIClcbiAgICAgIGRlYnVnKFwiaW1wb3J0UnVuUmVzdWx0OlwiLCB7XG4gICAgICAgIGZzUGF0aCxcbiAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgfSlcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gaW1wb3J0UnVuUmVzdWx0LmV4cG9ydHNcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFdmFsIGNvbXBpbGVkIGpzIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi5qc1wiKSkge1xuICAgIC8vIEZvciAuanMgZmlsZXMsIGVzcGVjaWFsbHkgZnJvbSBub2RlX21vZHVsZXMsIHdlIG5lZWQgdG8gdHJhbnNmb3JtIHRoZW1cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aCksXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgKS5leHBvcnRzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICApXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMgPSBbXG4gIFwiLmdsYlwiLFxuICBcIi5raWNhZF9tb2RcIixcbiAgXCIuZ2x0ZlwiLFxuICBcIi5vYmpcIixcbiAgXCIuc3RsXCIsXG5dXG5cbmV4cG9ydCBjb25zdCBpc1N0YXRpY0Fzc2V0UGF0aCA9IChwYXRoOiBzdHJpbmcpID0+XG4gIFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT4gcGF0aC5lbmRzV2l0aChleHQpKVxuIiwgImltcG9ydCB7IHRyYW5zZm9ybSwgdHlwZSBUcmFuc2Zvcm0gYXMgU3VjcmFzZVRyYW5zZm9ybSB9IGZyb20gXCJzdWNyYXNlXCJcblxuY29uc3QgVFNfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzXCIsIFwiLnRzeFwiLCBcIi5tdHNcIiwgXCIuY3RzXCJdKVxuY29uc3QgSlNYX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c3hcIiwgXCIuanN4XCIsIFwiLnRzXCJdKVxuXG5jb25zdCBzdHJpcFF1ZXJ5QW5kSGFzaCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5SW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiP1wiKVxuICBjb25zdCBoYXNoSW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiI1wiKVxuXG4gIGxldCBlbmRJbmRleCA9IGZpbGVQYXRoLmxlbmd0aFxuXG4gIGlmIChxdWVyeUluZGV4ICE9PSAtMSAmJiBoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBNYXRoLm1pbihxdWVyeUluZGV4LCBoYXNoSW5kZXgpXG4gIH0gZWxzZSBpZiAocXVlcnlJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IHF1ZXJ5SW5kZXhcbiAgfSBlbHNlIGlmIChoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBoYXNoSW5kZXhcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5zbGljZSgwLCBlbmRJbmRleClcbn1cblxuY29uc3QgZ2V0RXh0ZW5zaW9uID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBzdHJpcFF1ZXJ5QW5kSGFzaChmaWxlUGF0aClcbiAgY29uc3QgbGFzdERvdEluZGV4ID0gbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIuXCIpXG5cbiAgaWYgKGxhc3REb3RJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSBNYXRoLm1heChcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi9cIiksXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCJcXFxcXCIpLFxuICApXG5cbiAgaWYgKGxhc3RTbGFzaEluZGV4ID4gbGFzdERvdEluZGV4KSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkUGF0aC5zbGljZShsYXN0RG90SW5kZXgpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGVQYXRoKVxuXG4gIGNvbnN0IHRyYW5zZm9ybXM6IFN1Y3Jhc2VUcmFuc2Zvcm1bXSA9IFtcImltcG9ydHNcIl1cblxuICBpZiAoVFNfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMudW5zaGlmdChcInR5cGVzY3JpcHRcIilcbiAgfVxuXG4gIGlmIChKU1hfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMucHVzaChcImpzeFwiKVxuICB9XG5cbiAgcmV0dXJuIHRyYW5zZm9ybXNcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVdpdGhTdWNyYXNlID0gKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1zID0gZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoKGZpbGVQYXRoKVxuICBjb25zdCB7IGNvZGU6IHRyYW5zZm9ybWVkQ29kZSB9ID0gdHJhbnNmb3JtKGNvZGUsIHtcbiAgICBmaWxlUGF0aCxcbiAgICBwcm9kdWN0aW9uOiB0cnVlLFxuICAgIHRyYW5zZm9ybXMsXG4gIH0pXG5cbiAgcmV0dXJuIHRyYW5zZm9ybWVkQ29kZVxufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRTbmlwcGV0KFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZnVsbFNuaXBwZXROYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnJlcGxhY2UoXCIuXCIsIFwiL1wiKVxuXG4gIGNvbnN0IHsgY2pzLCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChgJHtjdHguY2pzUmVnaXN0cnlVcmx9LyR7ZnVsbFNuaXBwZXROYW1lfWApXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4gKHsgY2pzOiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9KSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjanM6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICBjanMhLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICkuZXhwb3J0c1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGltcG9ydGluZyBzbmlwcGV0XCIsIGUpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIi4vZGlybmFtZVwiXG5cbmludGVyZmFjZSBQYWNrYWdlSnNvbiB7XG4gIG1haW4/OiBzdHJpbmdcbiAgbW9kdWxlPzogc3RyaW5nXG4gIGV4cG9ydHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PlxufVxuXG5pbnRlcmZhY2UgTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBtb2R1bGVQYXRoOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgZnNNYXAsXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzXCIsIFwiLmpzeFwiLCBcIi50c1wiLCBcIi50c3hcIiwgXCIuanNvblwiXSxcbiAgICBiYXNlUGF0aCxcbiAgICBtb2R1bGVQYXRoLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGg6IHN0cmluZywgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9wYWNrYWdlLmpzb25gXG4gIGlmICghY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIGFzIFBhY2thZ2VKc29uXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKFxuICBwYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjdHguZnNNYXBbcGF0aF0pIHJldHVybiBwYXRoXG5cbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHBhdGgucmVwbGFjZSgvXFwuanMkfFxcLmpzeCQvLCBcIlwiKSArIGV4dFxuICAgIGlmIChjdHguZnNNYXBbcGF0aFdpdGhFeHRdKSByZXR1cm4gcGF0aFdpdGhFeHRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0UGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIGV4cG9ydFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZnVsbEV4cG9ydFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZXhwb3J0UGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIil9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxFeHBvcnRQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHJldHVybiBudWxsXG5cbiAgLy8gSGFuZGxlIGRlZmF1bHQgZXhwb3J0IGNvbmRpdGlvblxuICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcIi5cIl1cbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgZGVmYXVsdEV4cG9ydCkge1xuICAgIGlmICh0eXBlb2YgZGVmYXVsdEV4cG9ydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGRlZmF1bHRFeHBvcnQsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggZXhwb3J0c1xuICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gcmVtYWluaW5nUGF0aFxuICAgID8gcGFja2FnZUpzb24uZXhwb3J0c1tgLi8ke3JlbWFpbmluZ1BhdGh9YF1cbiAgICA6IG51bGxcbiAgaWYgKHN1YnBhdGhFeHBvcnQgJiYgdHlwZW9mIHN1YnBhdGhFeHBvcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgc3VicGF0aEV4cG9ydCwgY3R4KVxuICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICAvLyBIYW5kbGUgY29uZGl0aW9uYWwgZXhwb3J0c1xuICBjb25zdCBpbXBvcnRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzW1wiaW1wb3J0XCJdXG4gIGlmIChcbiAgICByZW1haW5pbmdQYXRoID09PSBcIlwiICYmXG4gICAgaW1wb3J0RXhwb3J0ICYmXG4gICAgdHlwZW9mIGltcG9ydEV4cG9ydCA9PT0gXCJzdHJpbmdcIlxuICApIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgaW1wb3J0RXhwb3J0LCBjdHgpXG4gICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRW50cnlQb2ludChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZW50cnlQb2ludCA9IHBhY2thZ2VKc29uLm1vZHVsZSB8fCBwYWNrYWdlSnNvbi5tYWluIHx8IFwiaW5kZXguanNcIlxuICBjb25zdCBmdWxsUGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtlbnRyeVBvaW50fWBcbiAgcmV0dXJuIHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHJlbWFpbmluZ1BhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFyZW1haW5pbmdQYXRoKSB7XG4gICAgLy8gVHJ5IGluZGV4IGZpbGVzIGluIHRoZSBtb2R1bGUgcm9vdFxuICAgIGZvciAoY29uc3QgZXh0IG9mIGN0eC5leHRlbnNpb25zKSB7XG4gICAgICBjb25zdCBpbmRleFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9L2luZGV4JHtleHR9YFxuICAgICAgaWYgKGN0eC5mc01hcFtpbmRleFBhdGhdKSByZXR1cm4gaW5kZXhQYXRoXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBmdWxsUGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtyZW1haW5pbmdQYXRofWBcbiAgY29uc3QgZGlyZWN0TWF0Y2ggPSB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbFBhdGgsIGN0eClcbiAgaWYgKGRpcmVjdE1hdGNoKSByZXR1cm4gZGlyZWN0TWF0Y2hcblxuICAvLyBUcnkgaW5kZXggZmlsZXNcbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBpbmRleFBhdGggPSBgJHtmdWxsUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgaWYgKGN0eC5mc01hcFtpbmRleFBhdGhdKSByZXR1cm4gaW5kZXhQYXRoXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGVJblBhdGgoXG4gIHNlYXJjaFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgbW9kdWxlUGFydHMgPSBjdHgubW9kdWxlUGF0aC5zcGxpdChcIi9cIilcbiAgY29uc3Qgc2NvcGUgPSBtb2R1bGVQYXJ0c1swXS5zdGFydHNXaXRoKFwiQFwiKVxuICAgID8gbW9kdWxlUGFydHMuc2xpY2UoMCwgMikuam9pbihcIi9cIilcbiAgICA6IG1vZHVsZVBhcnRzWzBdXG4gIGNvbnN0IHJlbWFpbmluZ1BhdGggPSBtb2R1bGVQYXJ0cy5zbGljZShzY29wZS5pbmNsdWRlcyhcIi9cIikgPyAyIDogMSkuam9pbihcIi9cIilcbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRoID0gYCR7c2VhcmNoUGF0aCA9PSBcIi5cIiA/IFwiXCIgOiBgJHtzZWFyY2hQYXRofS9gfW5vZGVfbW9kdWxlcy8ke3Njb3BlfWBcblxuICAvLyBUcnkgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb24gPSBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoLCBjdHgpXG4gIGlmIChwYWNrYWdlSnNvbikge1xuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBleHBvcnRzIGZpZWxkXG4gICAgY29uc3QgZXhwb3J0c1Jlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChleHBvcnRzUmVzb2x1dGlvbikgcmV0dXJuIGV4cG9ydHNSZXNvbHV0aW9uXG5cbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggbWFpbi9tb2R1bGUgZmllbGRzXG4gICAgY29uc3QgZW50cnlQb2ludFJlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGVudHJ5UG9pbnRSZXNvbHV0aW9uKSByZXR1cm4gZW50cnlQb2ludFJlc29sdXRpb25cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgcmVtYWluaW5nIHBhdGhcbiAgY29uc3QgcmVtYWluaW5nUGF0aFJlc29sdXRpb24gPSByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgcmVtYWluaW5nUGF0aCxcbiAgICBjdHgsXG4gIClcbiAgaWYgKHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uKSByZXR1cm4gcmVtYWluaW5nUGF0aFJlc29sdXRpb25cblxuICAvLyBJZiBub3QgZm91bmQgYW5kIHdlIGhhdmUgYSBwYXJlbnQgZGlyZWN0b3J5LCB0cnkgdGhlcmVcbiAgY29uc3QgcGFyZW50UGF0aCA9IGRpcm5hbWUoc2VhcmNoUGF0aClcbiAgaWYgKHBhcmVudFBhdGggJiYgcGFyZW50UGF0aCAhPT0gc2VhcmNoUGF0aCkge1xuICAgIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChwYXJlbnRQYXRoLCBjdHgpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dChtb2R1bGVQYXRoLCBmc01hcCwgYmFzZVBhdGgpXG4gIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChjdHguYmFzZVBhdGgsIGN0eClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRMb2NhbEZpbGUgfSBmcm9tIFwiLi9pbXBvcnQtbG9jYWwtZmlsZVwiXG5cbmV4cG9ydCBjb25zdCBpbXBvcnROb2RlTW9kdWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LmZzTWFwLCBcIlwiKVxuXG4gIGlmICghcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgbm90IGZvdW5kYClcbiAgfVxuXG4gIC8vIFVzZSBpbXBvcnRMb2NhbEZpbGUgdG8gaGFuZGxlIHRoZSBub2RlIG1vZHVsZVxuICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCwgY3R4LCBkZXB0aClcblxuICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGUncyBleHBvcnRzXG4gIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIE1hcCB3aXRob3V0IG5vZGVfbW9kdWxlcyBwcmVmaXggZm9yIGRpcmVjdCBpbXBvcnRzXG4gIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWRQYXRoXSA9XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gSGFuZGxlIGluZGV4IGZpbGVzIHNwZWNpYWxseVxuICBpZiAoXG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c3hcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzXCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC5qc1wiKVxuICApIHtcbiAgICBjb25zdCBkaXJQYXRoID0gcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5yZXBsYWNlKC9cXC9pbmRleFxcLih0c3g/fGpzKSQvLCBcIlwiKVxuICAgIGNvbnN0IHVucHJlZml4ZWREaXJQYXRoID0gZGlyUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZERpclBhdGhdID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gICAgLy8gSGFuZGxlIHNjb3BlZCBwYWNrYWdlc1xuICAgIGlmICh1bnByZWZpeGVkRGlyUGF0aC5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgY29uc3Qgc2NvcGVQYXJ0cyA9IHVucHJlZml4ZWREaXJQYXRoLnNwbGl0KFwiL1wiKVxuICAgICAgaWYgKHNjb3BlUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVkTmFtZSA9IGAke3Njb3BlUGFydHNbMF19LyR7c2NvcGVQYXJ0c1sxXX1gXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tzY29wZWROYW1lXSA9XG4gICAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCIuL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgfSBmcm9tIFwiLi90cmFuc2Zvcm0td2l0aC1zdWNyYXNlXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDppbXBvcnQtbnBtLXBhY2thZ2VcIilcblxuZnVuY3Rpb24gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IHByZWZpeCA9IFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9cIlxuICBpZiAodXJsLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpLnJlcGxhY2UoL1xcL1xcK2VzbSQvLCBcIlwiKVxuICB9XG4gIHJldHVybiB1cmxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydE5wbVBhY2thZ2UoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgZGVidWcoYGltcG9ydGluZyBucG0gcGFja2FnZTogJHtpbXBvcnROYW1lfWApXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSByZXR1cm5cblxuICBjb25zdCBucG1DZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS8ke2ltcG9ydE5hbWV9Lytlc21gXG5cbiAgbGV0IGZpbmFsVXJsOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29uc3QgeyBjb250ZW50LCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChucG1DZG5VcmwpXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgZmluYWxVcmwgPSByZXMudXJsXG4gICAgICBpZiAoIXJlcy5vaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmV0Y2ggXCIke2ltcG9ydE5hbWV9XCIgZnJvbSBqc2RlbGl2cjogJHtyZXMuc3RhdHVzVGV4dH1gLFxuICAgICAgICApXG4gICAgICByZXR1cm4geyBjb250ZW50OiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9XG4gICAgfSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjb250ZW50OiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBucG0gaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH1cblxuICBjb25zdCBmaW5hbEltcG9ydE5hbWUgPSBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIoZmluYWxVcmwhKVxuICBjb25zdCBjd2QgPSBkaXJuYW1lKGZpbmFsSW1wb3J0TmFtZSlcblxuICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShjb250ZW50ISlcbiAgZm9yIChjb25zdCBzdWJJbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbc3ViSW1wb3J0TmFtZV0pIHtcbiAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKHN1YkltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoXG4gICAgY29udGVudCEsXG4gICAgZmluYWxJbXBvcnROYW1lIHx8IGltcG9ydE5hbWUsXG4gIClcbiAgdHJ5IHtcbiAgICBjb25zdCBleHBvcnRzID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICBjd2QsXG4gICAgKS5leHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmaW5hbEltcG9ydE5hbWVdID0gZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmaW5hbFVybCFdID0gZXhwb3J0c1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2UgfSBmcm9tIFwiLi9pbXBvcnQtbnBtLXBhY2thZ2VcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWV2YWwtcGF0aFwiKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RXZhbFBhdGgoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4gIG9wdHM6IHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKSB7XG4gIGRlYnVnKFwiaW1wb3J0RXZhbFBhdGggY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICAgIGRlcHRoLFxuICAgIG9wdHMsXG4gIH0pXG5cbiAgZGVidWcoYCR7XCIgIFwiLnJlcGVhdChkZXB0aCl9XHUyN0ExXHVGRTBGYCwgaW1wb3J0TmFtZSlcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKVxuICAgIHJldHVyblxuXG4gIGlmIChkZXB0aCA+IDUpIHtcbiAgICBjb25zb2xlLmxvZyhcIk1heCBkZXB0aCBmb3IgaW1wb3J0cyByZWFjaGVkXCIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL25wbS9cIikpIHtcbiAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKC9eXFwvbnBtXFwvLywgXCJcIikucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gICAgYXdhaXQgaW1wb3J0TnBtUGFja2FnZShwa2dOYW1lLCBjdHgsIGRlcHRoKVxuICAgIGNvbnN0IHBrZyA9IHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXVxuICAgIGlmIChwa2cpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHBrZ1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkLFxuICApXG4gIGlmIChyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lICh3aGljaCBtaWdodCBiZSBhIHRzY29uZmlnIHBhdGggYWxpYXMpIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICBpZiAoaW1wb3J0TmFtZSAhPT0gcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9XG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZExvY2FsSW1wb3J0UGF0aF1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBUcnkgdG8gcmVzb2x2ZSBmcm9tIG5vZGVfbW9kdWxlc1xuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QgfHwgXCJcIixcbiAgKVxuICBpZiAocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgcmV0dXJuIGltcG9ydFNuaXBwZXQoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmICghaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnROcG1QYWNrYWdlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVucmVzb2x2ZWQgaW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiICR7b3B0cy5jd2QgPyBgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9YCxcbiAgKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwiLi9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6c2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCIpXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gb3B0cy5mc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KVxuICAgICAgICBpZiAoY29uZmlnLm1haW5FbnRyeXBvaW50KSB7XG4gICAgICAgICAgb3B0cy5lbnRyeXBvaW50ID0gY29uZmlnLm1haW5FbnRyeXBvaW50XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIHRzY2lyY3VpdC5jb25maWcuanNvbjpcIiwgZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciBlbnRyeXBvaW50IG9yIG1haW5Db21wb25lbnRQYXRoIG11c3QgYmUgcHJvdmlkZWQgKG5vIGluZGV4IGZpbGUsIGNvdWxkIG5vdCBpbmZlciBlbnRyeXBvaW50KVwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmIG9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBvcHRzLmVudHJ5cG9pbnQgPSBcImVudHJ5cG9pbnQudHN4XCJcbiAgICBjb25zdCBtYWluQ29tcG9uZW50Q29kZSA9XG4gICAgICBvcHRzLmZzTWFwW3Jlc29sdmVGaWxlUGF0aE9yVGhyb3cob3B0cy5tYWluQ29tcG9uZW50UGF0aCwgb3B0cy5mc01hcCldXG4gICAgaWYgKCFtYWluQ29tcG9uZW50Q29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWFpbiBjb21wb25lbnQgcGF0aCBcIiR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIiBub3QgZm91bmQgaW4gZnNNYXAuIEF2YWlsYWJsZSBwYXRoczogJHtPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5qb2luKFwiLCBcIil9YCxcbiAgICAgIClcbiAgICB9XG4gICAgb3B0cy5mc01hcFtvcHRzLmVudHJ5cG9pbnRdID0gYFxuICAgICBpbXBvcnQgKiBhcyBVc2VyQ29tcG9uZW50cyBmcm9tIFwiLi8ke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCI7XG4gICAgICAgICAgXG4gICAgICAke1xuICAgICAgICBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gICAgICAgICAgPyBgXG4gICAgICAgIGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHNbXCIke29wdHMubWFpbkNvbXBvbmVudE5hbWV9XCJdXG4gICAgICAgIGBcbiAgICAgICAgICA6IGBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzLmRlZmF1bHQgfHwgXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgICAgLmZpbHRlcigoW25hbWVdKSA9PiAhbmFtZS5zdGFydHNXaXRoKFwidXNlXCIpKVxuICAgICAgICAgIC5tYXAoKFtfLCBjb21wb25lbnRdKSA9PiBjb21wb25lbnQpWzBdIHx8ICgoKSA9PiBudWxsKTtgXG4gICAgICB9XG5cbiAgICAgICAgICAgJHtcbiAgICAgICAgICAgICBkZWJ1Zy5lbmFibGVkXG4gICAgICAgICAgICAgICA/IGBcbiAgICAgY29uc29sZS5sb2coeyBVc2VyQ29tcG9uZW50cyB9KVxuICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudFRvUmVuZGVyIFwiICsgQ29tcG9uZW50VG9SZW5kZXIudG9TdHJpbmcoKSwgIHsgQ29tcG9uZW50VG9SZW5kZXIgfSlcbiAgICAgYFxuICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoICAgICAgIFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+IFxuICAgICAgKTtcbmBcbiAgfVxuXG4gIGlmICghb3B0cy5uYW1lICYmIG9wdHMubWFpbkNvbXBvbmVudE5hbWUpIHtcbiAgICBvcHRzLm5hbWUgPSBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgZW50cnlwb2ludD86IHN0cmluZyxcbikgPT4ge1xuICBpZiAoXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgIGVudHJ5cG9pbnQgJiZcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUm9vdENpcmN1aXQgaGFzIG5vIGNoaWxkcmVuXCIpICYmXG4gICAgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1wiZW50cnlwb2ludFwiOicpXG4gICkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRNZXNzYWdlID0gZW50cnlwb2ludC5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gZW50cnlwb2ludC5zbGljZSgyKVxuICAgICAgOiBlbnRyeXBvaW50XG4gICAgZXJyb3IubWVzc2FnZSA9IGAke2Vycm9yLm1lc3NhZ2V9LiBcImVudHJ5cG9pbnRcIjogXCIke2VudHJ5cG9pbnRNZXNzYWdlfVwiIGlzIHNldCBpbiB0aGUgcnVubmVyIGNvbmZpZ3VyYXRpb24sIGVudHJ5cG9pbnRzIG11c3QgY29udGFpbiBcImNpcmN1aXQuYWRkKC4uLilcIiwgeW91IG1pZ2h0IGJlIGxvb2tpbmcgdG8gdXNlIG1haW5Db21wb25lbnRQYXRoIGluc3RlYWQgaWYgeW91ciBmaWxlIGV4cG9ydHMgYSBjb21wb25lbnQuYFxuICB9XG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiaW1wb3J0IHsgQ2lyY3VpdFJ1bm5lciB9IGZyb20gXCIuL0NpcmN1aXRSdW5uZXJcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVHNjaXJjdWl0Q29kZShcbiAgZmlsZXN5c3RlbU9yQ29kZVN0cmluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyxcbiAgb3B0cz86IE9taXQ8UGFyYW1ldGVyczxDaXJjdWl0UnVubmVyW1wiZXhlY3V0ZVdpdGhGc01hcFwiXT5bMF0sIFwiZnNNYXBcIj4sXG4pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiICYmXG4gICAgIWZpbGVzeXN0ZW1PckNvZGVTdHJpbmcuaW5jbHVkZXMoXCJleHBvcnRcIilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBcImV4cG9ydFwiIGtleXdvcmQgd2Fzbid0IGZvdW5kIGluIHlvdXIgcHJvdmlkZWQgY29kZS4gWW91IG5lZWQgdG8gZXhwb3J0IGEgY29tcG9uZW50IGluIHlvdXIgY29kZSwgZS5nLlxcblxcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcXG4gIDxyZXNpc3RvciBuYW1lPVwiUjFcIiByZXNpc3RhbmNlPVwiMWtcIiAvPlxcbilgLFxuICAgIClcbiAgfVxuICBjb25zdCBmaWxlc3lzdGVtID1cbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyB7IFwidXNlci1jb2RlLnRzeFwiOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nIH1cbiAgICAgIDogZmlsZXN5c3RlbU9yQ29kZVN0cmluZ1xuXG4gIGNvbnN0IGNpcmN1aXRSdW5uZXIgPSBuZXcgQ2lyY3VpdFJ1bm5lcigpXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICBmc01hcDogZmlsZXN5c3RlbSxcbiAgICAuLi5vcHRzLFxuICB9KVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICByZXR1cm4gYXdhaXQgY2lyY3VpdFJ1bm5lci5nZXRDaXJjdWl0SnNvbigpXG59XG4iLCAiaW1wb3J0IHsgcnVuVHNjaXJjdWl0Q29kZSB9IGZyb20gXCIuL3J1blRzY2lyY3VpdENvZGVcIlxuXG5leHBvcnQgY29uc3QgcnVuVHNjaXJjdWl0TW9kdWxlID0gYXN5bmMgKFxuICBtb2R1bGU6IHN0cmluZyxcbiAgb3B0czogeyBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47IGV4cG9ydE5hbWU/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGlmICghbW9kdWxlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgbW9kdWxlID0gYEB0c2NpLyR7bW9kdWxlLnJlcGxhY2UoL1xcLy8sIFwiLlwiKX1gXG4gIH1cbiAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCBydW5Uc2NpcmN1aXRDb2RlKFxuICAgIHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIGV4cG9ydHMgdGhhdCBhcmUgbm90IHRoZSBkZWZhdWx0IGV4cG9ydCBieSBzY2FubmluZ1xuICAgICAgLy8gb3RoZXJFeHBvcnRzIGZvciBjb21wb25lbnRzXG4gICAgICBcInVzZXItY29kZS50c3hcIjogYFxuICAgIGltcG9ydCBNb2R1bGUsICogYXMgb3RoZXJFeHBvcnRzIGZyb20gXCIke21vZHVsZX1cIjtcblxuICAgIGxldCBleHBvcnROYW1lID0gXCIke29wdHMuZXhwb3J0TmFtZSA/PyBcIlwifVwiXG5cbiAgICBpZiAoKCFNb2R1bGUgfHwgdHlwZW9mIE1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSAmJiAhQm9vbGVhbihleHBvcnROYW1lKSkge1xuICAgICAgZXhwb3J0TmFtZSA9IE9iamVjdC5rZXlzKG90aGVyRXhwb3J0cykuZmlsdGVyKGtleSA9PiBrZXlbMF0gPT09IGtleVswXS50b1VwcGVyQ2FzZSgpICYmIHR5cGVvZiBvdGhlckV4cG9ydHNba2V5XSA9PT0gXCJmdW5jdGlvblwiKVswXVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBleHBvcnROYW1lID8gb3RoZXJFeHBvcnRzW2V4cG9ydE5hbWVdIDogTW9kdWxlXG5cbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcXGBObyBleHBvcnQgZm91bmQgZm9yIG1vZHVsZSBcIlxcJHttb2R1bGV9XCIgKHRyaWVkIFwiXFwke2V4cG9ydE5hbWUgPz8gXCJkZWZhdWx0XCJ9XCIpXFxgKVxuICAgIH1cblxuICAgIGV4cG9ydCBkZWZhdWx0IGRlZmF1bHRFeHBvcnQ7XG4gICAgYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1haW5Db21wb25lbnRQcm9wczogb3B0cy5wcm9wcyxcbiAgICB9LFxuICApXG4gIHJldHVybiBjaXJjdWl0SnNvblxufVxuIiwgImltcG9ydCAqIGFzIENvbWxpbmsgZnJvbSBcImNvbWxpbmtcIlxuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvaW5kZXhcIlxuaW1wb3J0IHR5cGUge1xuICBJbnRlcm5hbFdlYldvcmtlckFwaSxcbiAgV2ViV29ya2VyQ29uZmlndXJhdGlvbixcbiAgQ2lyY3VpdFdlYldvcmtlcixcbn0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXRFdmVudE5hbWUgfSBmcm9tIFwiLi9zaGFyZWQvdHlwZXNcIlxuXG5leHBvcnQgdHlwZSB7IENpcmN1aXRXZWJXb3JrZXIsIFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbiAgfVxuICB2YXIgVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUjogQ2lyY3VpdFdlYldvcmtlciB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2lyY3VpdFdlYldvcmtlciA9IGFzeW5jIChcbiAgY29uZmlndXJhdGlvbjogUGFydGlhbDxXZWJXb3JrZXJDb25maWd1cmF0aW9uPixcbik6IFByb21pc2U8Q2lyY3VpdFdlYldvcmtlcj4gPT4ge1xuICAvLyBLaWxsIGV4aXN0aW5nIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2UgaWYgcHJlc2VudFxuICBjb25zdCBleGlzdGluZ1dvcmtlciA9IGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUlxuICBpZiAoZXhpc3RpbmdXb3JrZXIgJiYgdHlwZW9mIGV4aXN0aW5nV29ya2VyLmtpbGwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gS2lsbGluZyBwcmV2aW91cyBnbG9iYWwgd29ya2VyIGluc3RhbmNlLi4uXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1dvcmtlci5raWxsKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltXb3JrZXJdIEVycm9yIGtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZTpcIixcbiAgICAgICAgICBlLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICAvLyBFbnN1cmUgdGhlIGtleSBpcyBjbGVhcmVkIGV2ZW4gaWYga2lsbCB0aHJvd3MgYW4gZXJyb3JcbiAgICAgIGlmIChnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPT09IGV4aXN0aW5nV29ya2VyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiW1dvcmtlcl0gQ3JlYXRpbmcgY2lyY3VpdCB3ZWIgd29ya2VyIHdpdGggY29uZmlnOlwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICApXG4gIH1cblxuICBsZXQgd29ya2VyQmxvYlVybCA9XG4gICAgY29uZmlndXJhdGlvbi53ZWJXb3JrZXJCbG9iVXJsID8/IGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyVXJsXG5cbiAgaWYgKCF3b3JrZXJCbG9iVXJsKSB7XG4gICAgY29uc3QgY2RuVXJsID0gYGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHRzY2lyY3VpdC9ldmFsQCR7Y29uZmlndXJhdGlvbi5ldmFsVmVyc2lvbiA/PyBcImxhdGVzdFwifS9kaXN0L3dlYndvcmtlci9lbnRyeXBvaW50LmpzYFxuXG4gICAgY29uc3Qgd29ya2VyQmxvYiA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goY2RuVXJsKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpXG4gICAgd29ya2VyQmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwod29ya2VyQmxvYilcbiAgfVxuXG4gIGNvbnN0IHJhd1dvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyQmxvYlVybCwgeyB0eXBlOiBcIm1vZHVsZVwiIH0pXG4gIGxldCB3b3JrZXJJbml0RXJyb3I6IGFueVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBFcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gICAgd29ya2VySW5pdEVycm9yID0gZXZlbnRcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIFVuaGFuZGxlZCByZWplY3Rpb24gaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gTWVzc2FnZSBlcnJvciBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH0pXG4gIGNvbnN0IGVhcmx5TWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW1dvcmtlcl0gTWVzc2FnZSBpbiB3b3JrZXJcIiwgZXZlbnQpXG4gIH1cbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGVhcmx5TWVzc2FnZUhhbmRsZXIpXG5cbiAgLy8gSGFuZGxlIGZldGNoIHJlcXVlc3RzIGZyb20gdGhlIHdvcmtlclxuICByYXdXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YVxuICAgIGlmIChkYXRhPy50eXBlICE9PSBcIndvcmtlcl9mZXRjaFwiKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdsb2JhbFRoaXMuZmV0Y2goZGF0YS5pbnB1dCwgZGF0YS5pbml0KVxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJ3b3JrZXJfZmV0Y2hfcmVzdWx0XCIsXG4gICAgICAgIHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQsXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICAgIGhlYWRlcnM6ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBuYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHdvcmtlckluaXRFcnJvcikge1xuICAgIHRocm93IHdvcmtlckluaXRFcnJvclxuICB9XG5cbiAgY29uc3QgY29tbGlua1dvcmtlciA9IENvbWxpbmsud3JhcDxJbnRlcm5hbFdlYldvcmtlckFwaT4ocmF3V29ya2VyKVxuXG4gIHJhd1dvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhlbHBlciB0byBzZXJpYWxpemUgUmVhY3QgZWxlbWVudHMgZm9yIGNyb3NzLXdvcmtlciBjb21tdW5pY2F0aW9uXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVJlYWN0RWxlbWVudChlbGVtZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBpcyBhIFJlYWN0IGVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9faXNTZXJpYWxpemVkUmVhY3RFbGVtZW50OiB0cnVlLFxuICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHByb3BzOiBzZXJpYWxpemVQcm9wcyhlbGVtZW50LnByb3BzKSxcbiAgICAgICAga2V5OiBlbGVtZW50LmtleSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgZnVuY3Rpb24gc2VyaWFsaXplUHJvcHMocHJvcHM6IGFueSk6IGFueSB7XG4gICAgaWYgKCFwcm9wcyB8fCB0eXBlb2YgcHJvcHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBwcm9wc1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IGFueSA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHZhbHVlLm1hcChzZXJpYWxpemVSZWFjdEVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VyaWFsaXplZC5jaGlsZHJlbiA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VyaWFsaXplZFtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWRcbiAgfVxuXG4gIC8vIENvbmRpdGlvbmFsbHkgb3ZlcnJpZGUgZ2xvYmFsIGZldGNoIGluc2lkZSB0aGUgd29ya2VyIHRvIHJvdXRlIHRocm91Z2ggdGhlIHBhcmVudFxuICAvLyBPbmx5IGVuYWJsZSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHZpYSBjb25maWd1cmF0aW9uXG4gIGlmIChjb25maWd1cmF0aW9uLmVuYWJsZUZldGNoUHJveHkpIHtcbiAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2UoeyB0eXBlOiBcIm92ZXJyaWRlX2dsb2JhbF9mZXRjaFwiIH0pXG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFNuaXBwZXRzQXBpQmFzZVVybChjb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybClcbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSkge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0UGxhdGZvcm1Db25maWcoY29uZmlndXJhdGlvbi5wbGF0Zm9ybSlcbiAgfVxuICBpZiAoY29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXRQcm9qZWN0Q29uZmlnKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZylcbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0ZWQgPSBmYWxzZVxuXG4gIC8vIENyZWF0ZSBhIHdyYXBwZXIgdGhhdCBoYW5kbGVzIGV2ZW50cyBkaXJlY3RseSB0aHJvdWdoIGNpcmN1aXQgaW5zdGFuY2VcbiAgY29uc3Qgd3JhcHBlcjogQ2lyY3VpdFdlYldvcmtlciA9IHtcbiAgICBjbGVhckV2ZW50TGlzdGVuZXJzOiBjb21saW5rV29ya2VyLmNsZWFyRXZlbnRMaXN0ZW5lcnMuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBlbmFibGVEZWJ1ZzogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZW5hYmxlRGVidWdcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmVuYWJsZURlYnVnLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHZlcnNpb246IGNvbWxpbmtXb3JrZXIudmVyc2lvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGV4ZWN1dGU6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVcIilcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGUuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgZXhlY3V0ZUNvbXBvbmVudDogYXN5bmMgKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGV4ZWN1dGVDb21wb25lbnRcIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgZnVuY3Rpb24sIHBhc3MgaXQgYXMtaXMgKHdpbGwgYmUgcHJveGllZCBieSBDb21saW5rKVxuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgUmVhY3QgZWxlbWVudCwgc2VyaWFsaXplIGl0IHRvIGEgcmVjb25zdHJ1Y3RhYmxlIGZvcm1hdFxuICAgICAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIGNvbXBvbmVudC50eXBlKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRFbGVtZW50ID0gc2VyaWFsaXplUmVhY3RFbGVtZW50KGNvbXBvbmVudClcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKFxuICAgICAgICAgIHNlcmlhbGl6ZWRFbGVtZW50LFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShjb21wb25lbnQpXG4gICAgfSxcbiAgICBleGVjdXRlV2l0aEZzTWFwOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlV2l0aEZzTWFwXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVXaXRoRnNNYXAuYmluZChjb21saW5rV29ya2VyKSguLi5hcmdzKVxuICAgIH0sXG4gICAgcmVuZGVyVW50aWxTZXR0bGVkOiBjb21saW5rV29ya2VyLnJlbmRlclVudGlsU2V0dGxlZC5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIGdldENpcmN1aXRKc29uOiBjb21saW5rV29ya2VyLmdldENpcmN1aXRKc29uLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgb246IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBwcm94aWVkQ2FsbGJhY2sgPSBDb21saW5rLnByb3h5KGNhbGxiYWNrKVxuICAgICAgY29tbGlua1dvcmtlci5vbihldmVudCBhcyBSb290Q2lyY3VpdEV2ZW50TmFtZSwgcHJveGllZENhbGxiYWNrKVxuICAgIH0sXG4gICAga2lsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29tbGlua1dvcmtlcltDb21saW5rLnJlbGVhc2VQcm94eV0oKVxuICAgICAgcmF3V29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID09PSB3cmFwcGVyKSB7XG4gICAgICAgIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG4gIH1cbiAgOyh3cmFwcGVyIGFzIGFueSkuX19yYXdXb3JrZXIgPSByYXdXb3JrZXJcbiAgZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID0gd3JhcHBlclxuICByZXR1cm4gd3JhcHBlclxufVxuIiwgImltcG9ydCB7IG5vcm1hbGl6ZUZpbGVQYXRoIH0gZnJvbSBcIi4vcnVubmVyL25vcm1hbGl6ZUZzTWFwXCJcblxuZXhwb3J0IGNvbnN0IGdldFBvc3NpYmxlRW50cnlwb2ludENvbXBvbmVudFBhdGhzID0gKFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZEZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgZm9yIChjb25zdCBbcGF0aCwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZnNNYXApKSB7XG4gICAgbm9ybWFsaXplZEZzTWFwW25vcm1hbGl6ZUZpbGVQYXRoKHBhdGgpXSA9IGNvbnRlbnRcbiAgfVxuXG4gIGNvbnN0IHBvc3NpYmxlID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBub3JtYWxpemVkRnNNYXApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShub3JtYWxpemVkRnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl0pXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5tYWluRW50cnlwb2ludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBwb3NzaWJsZS5hZGQobm9ybWFsaXplRmlsZVBhdGgoY29uZmlnLm1haW5FbnRyeXBvaW50KSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkRnNNYXBbXCJpbmRleC50c3hcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzeFwiKVxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHNcIl0pIHBvc3NpYmxlLmFkZChcImluZGV4LnRzXCIpXG5cbiAgY29uc3QgY2lyY3VpdEZpbGVzID0gT2JqZWN0LmtleXMobm9ybWFsaXplZEZzTWFwKS5maWx0ZXIoKGspID0+XG4gICAgay5lbmRzV2l0aChcIi5jaXJjdWl0LnRzeFwiKSxcbiAgKVxuICBmb3IgKGNvbnN0IGZpbGUgb2YgY2lyY3VpdEZpbGVzKSB7XG4gICAgcG9zc2libGUuYWRkKGZpbGUpXG4gIH1cblxuICBjb25zdCB0c3hGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIudHN4XCIpLFxuICApXG4gIGlmICh0c3hGaWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICBwb3NzaWJsZS5hZGQodHN4RmlsZXNbMF0pXG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShwb3NzaWJsZSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLG1CQUFtQjtBQUU1QixZQUFZLG1CQUFtQjtBQUMvQixZQUFZLFdBQVc7QUFDdkIsWUFBWSx3QkFBd0I7OztBQ0M3QixJQUFNLGdDQUFnQyxDQUMzQyxtQkFDdUI7QUFFdkIsTUFBSSxRQUFRLGVBQWUsTUFBTSxnQkFBZ0I7QUFDakQsTUFBSSxNQUFPLFFBQU8sTUFBTSxDQUFDO0FBSXpCLFVBQVEsZUFBZTtBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUNBLE1BQUksTUFBTyxRQUFPLE1BQU0sQ0FBQztBQUV6QixTQUFPO0FBQ1Q7OztBQ2hCTyxJQUFNLHFDQUFxQyxDQUNoRCxzQkFDVztBQUNYLE1BQUksa0JBQWtCLFNBQVMsS0FBSyxHQUFHO0FBQ3JDLFdBQU8sa0JBQWtC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QUFJLGtCQUFrQixPQUFPLGNBQWMsQ0FBQztBQUFBLE1BQ3ZEO0FBQUEsSUFDRixRQUFRO0FBQUEsSUFFUjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLGdCQUFnQixXQUFXLEVBQUcsVUFBUyxJQUFJLFdBQVc7QUFDMUQsTUFBSSxnQkFBZ0IsVUFBVSxFQUFHLFVBQVMsSUFBSSxVQUFVO0FBRXhELFFBQU0sZUFBZSxPQUFPLEtBQUssZUFBZSxFQUFFO0FBQUEsSUFBTyxDQUFDLE1BQ3hELEVBQUUsU0FBUyxjQUFjO0FBQUEsRUFDM0I7QUFDQSxhQUFXLFFBQVEsY0FBYztBQUMvQixhQUFTLElBQUksSUFBSTtBQUFBLEVBQ25CO0FBRUEsUUFBTSxXQUFXLE9BQU8sS0FBSyxlQUFlLEVBQUU7QUFBQSxJQUFPLENBQUMsTUFDcEQsRUFBRSxTQUFTLE1BQU07QUFBQSxFQUNuQjtBQUNBLE1BQUksU0FBUyxXQUFXLEdBQUc7QUFDekIsYUFBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0FBQUEsRUFDMUI7QUFFQSxTQUFPLE1BQU0sS0FBSyxRQUFRO0FBQzVCOyIsCiAgIm5hbWVzIjogWyJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJpbXBvcnROYW1lIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIl0KfQo=
1459
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vd2Vid29ya2VyL2V4ZWN1dGlvbi1jb250ZXh0LnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9nZXQtamxjLXBhY2thZ2UtZnJvbS1mb290cHJpbnRlci1zdHJpbmcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvaW5kZXgudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9qbGMtcGFydHMtZW5naW5lLnRzIiwgIi4uLy4uL2xpYi9nZXRQbGF0Zm9ybUNvbmZpZy50cyIsICIuLi8uLi9saWIvcnVubmVyL25vcm1hbGl6ZUZzTWFwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvQ2lyY3VpdFJ1bm5lci50cyIsICIuLi8uLi9saWIvdXRpbHMvZGlybmFtZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3RzY29uZmlnUGF0aHMudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGgudHMiLCAiLi4vLi4vbGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvZXZhbC1jb21waWxlZC1qcy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi93ZWJ3b3JrZXIvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGUudHMiLCAiLi4vLi4vd2Vid29ya2VyL2ltcG9ydC1ub2RlLW1vZHVsZS50cyIsICIuLi8uLi93ZWJ3b3JrZXIvaW1wb3J0LW5wbS1wYWNrYWdlLnRzIiwgIi4uLy4uL3dlYndvcmtlci9pbXBvcnQtZXZhbC1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdENvZGUudHMiLCAiLi4vLi4vbGliL3J1bm5lci9ydW5Uc2NpcmN1aXRNb2R1bGUudHMiLCAiLi4vLi4vbGliL3dvcmtlci50cyIsICIuLi8uLi9saWIvZ2V0UG9zc2libGVFbnRyeXBvaW50Q29tcG9uZW50UGF0aHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgdHlwZSB7IFdlYldvcmtlckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgKiBhcyB0c2NpcmN1aXRDb3JlIGZyb20gXCJAdHNjaXJjdWl0L2NvcmVcIlxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdE1hdGhVdGlscyBmcm9tIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJsaWIvZ2V0UGxhdGZvcm1Db25maWdcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6ZXhlY3V0aW9uLWNvbnRleHRcIilcblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB7XG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGVudHJ5cG9pbnQ6IHN0cmluZ1xuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgY2lyY3VpdDogUm9vdENpcmN1aXRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gIHdlYldvcmtlckNvbmZpZ3VyYXRpb246IFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIG9wdHM6IHtcbiAgICBuYW1lPzogc3RyaW5nXG4gICAgcGxhdGZvcm0/OiBQbGF0Zm9ybUNvbmZpZ1xuICAgIHByb2plY3RDb25maWc/OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPlxuICAgIGRlYnVnTmFtZXNwYWNlPzogc3RyaW5nXG4gIH0gPSB7fSxcbik6IEV4ZWN1dGlvbkNvbnRleHQge1xuICBnbG9iYWxUaGlzLlJlYWN0ID0gUmVhY3RcblxuICBjb25zdCBiYXNlUGxhdGZvcm0gPSBvcHRzLnBsYXRmb3JtIHx8IGdldFBsYXRmb3JtQ29uZmlnKClcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRzLnByb2plY3RDb25maWdcbiAgICA/IHsgLi4uYmFzZVBsYXRmb3JtLCAuLi5vcHRzLnByb2plY3RDb25maWcgfVxuICAgIDogYmFzZVBsYXRmb3JtXG5cbiAgY29uc3QgY2lyY3VpdCA9IG5ldyBSb290Q2lyY3VpdCh7XG4gICAgcGxhdGZvcm0sXG4gIH0pXG5cbiAgaWYgKG9wdHMubmFtZSkge1xuICAgIGNpcmN1aXQubmFtZSA9IG9wdHMubmFtZVxuICB9XG5cbiAgaWYgKG9wdHMuZGVidWdOYW1lc3BhY2UpIHtcbiAgICBjaXJjdWl0LmVuYWJsZURlYnVnKG9wdHMuZGVidWdOYW1lc3BhY2UpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZzTWFwOiB7fSxcbiAgICBlbnRyeXBvaW50OiBcIlwiLFxuICAgIHByZVN1cHBsaWVkSW1wb3J0czoge1xuICAgICAgXCJAdHNjaXJjdWl0L2NvcmVcIjogdHNjaXJjdWl0Q29yZSxcbiAgICAgIHRzY2lyY3VpdDogdHNjaXJjdWl0Q29yZSxcbiAgICAgIFwiQHRzY2lyY3VpdC9tYXRoLXV0aWxzXCI6IHRzY2lyY3VpdE1hdGhVdGlscyxcbiAgICAgIHJlYWN0OiBSZWFjdCxcbiAgICAgIGRlYnVnOiBEZWJ1ZyxcblxuICAgICAgLy8gVGhpcyBpcyB1c3VhbGx5IHVzZWQgYXMgYSB0eXBlIGltcG9ydCwgd2UgY2FuIHJlbW92ZSB0aGUgc2hpbSB3aGVuIHdlXG4gICAgICAvLyBpZ25vcmUgdHlwZSBpbXBvcnRzIGluIGdldEltcG9ydHNGcm9tQ29kZVxuICAgICAgXCJAdHNjaXJjdWl0L3Byb3BzXCI6IHt9LFxuICAgIH0sXG4gICAgY2lyY3VpdCxcbiAgICAuLi53ZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICB9XG59XG4iLCAiLyoqXG4gKiBUcmFuc2Zvcm1zIGEgS2lDYWQgZm9vdHByaW50IHN0cmluZyBpbnRvIGEgZ2VuZXJpYyBcImZvb3RwcmludGVyIHN0cmluZ1wiLlxuICogRm9yIG5vdywgdGhpcyBpcyBhIHNpbXBsaWZpZWQgY29udmVyc2lvbiB0byBhIHN0YW5kYXJkIHBhY2thZ2UgbmFtZS5cbiAqIGUuZy4gXCJraWNhZDpSZXNpc3Rvcl9TTUQ6Ul8wNjAzXzE2MDhNZXRyaWNcIiAtPiBcIjA2MDNcIlxuICovXG5leHBvcnQgY29uc3QgZ2V0Rm9vdHByaW50ZXJTdHJpbmdGcm9tS2ljYWQgPSAoXG4gIGtpY2FkRm9vdHByaW50OiBzdHJpbmcsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAvLyBraWNhZDpSZXNpc3Rvcl9TTUQ6Ul8wNjAzXzE2MDhNZXRyaWMgLT4gMDYwM1xuICBsZXQgbWF0Y2ggPSBraWNhZEZvb3RwcmludC5tYXRjaCgvOltSQ11fKFxcZHs0fSlfLylcbiAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV1cblxuICAvLyBraWNhZDpQYWNrYWdlX1NPOlNPSUMtOF8zLjl4NC45bW1fUDEuMjdtbSAtPiBTT0lDLThcbiAgLy8ga2ljYWQ6UGFja2FnZV9UT19TT1RfU01EOlNPVC0yMyAtPiBTT1QtMjNcbiAgbWF0Y2ggPSBraWNhZEZvb3RwcmludC5tYXRjaChcbiAgICAvOihTT0lDLVxcZCt8U09ULVxcZCt8U09ELVxcZCt8U1NPUC1cXGQrfFRTU09QLVxcZCt8UUZQLVxcZCt8UUZOLVxcZCspLyxcbiAgKVxuICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cbiIsICIvKipcbiAqIFRyYW5zZm9ybXMgYSBnZW5lcmljIFwiZm9vdHByaW50ZXIgc3RyaW5nXCIgaW50byBhIEpMQy1jb21wYXRpYmxlIHBhY2thZ2UgbmFtZS5cbiAqIGUuZy4gXCJjYXAwNjAzXCIgLT4gXCIwNjAzXCJcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcgPSAoXG4gIGZvb3RwcmludGVyU3RyaW5nOiBzdHJpbmcsXG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoZm9vdHByaW50ZXJTdHJpbmcuaW5jbHVkZXMoXCJjYXBcIikpIHtcbiAgICByZXR1cm4gZm9vdHByaW50ZXJTdHJpbmcucmVwbGFjZSgvY2FwL2csIFwiXCIpXG4gIH1cbiAgcmV0dXJuIGZvb3RwcmludGVyU3RyaW5nXG59XG4iLCAiaW1wb3J0IHsgZ2V0Rm9vdHByaW50ZXJTdHJpbmdGcm9tS2ljYWQgfSBmcm9tIFwiLi9nZXQtZm9vdHByaW50ZXItc3RyaW5nLWZyb20ta2ljYWRcIlxuaW1wb3J0IHsgZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyB9IGZyb20gXCIuL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZ1wiXG5cbi8qKlxuICogR2V0IGEgSkxDLWNvbXBhdGlibGUgcGFja2FnZSBuYW1lIGZyb20gYSBmb290cHJpbnQgc3RyaW5nLCB3aGljaCBjb3VsZCBiZVxuICogYSBLaUNhZCBmb290cHJpbnQgb3IgYSBnZW5lcmljIFwiZm9vdHByaW50ZXIgc3RyaW5nXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRKbGNwY2JQYWNrYWdlTmFtZSA9IChcbiAgZm9vdHByaW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWZvb3RwcmludCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChmb290cHJpbnQuc3RhcnRzV2l0aChcImtpY2FkOlwiKSkge1xuICAgIGNvbnN0IGZvb3RwcmludGVyU3RyaW5nID0gZ2V0Rm9vdHByaW50ZXJTdHJpbmdGcm9tS2ljYWQoZm9vdHByaW50KVxuICAgIGlmIChmb290cHJpbnRlclN0cmluZykge1xuICAgICAgcmV0dXJuIGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcoZm9vdHByaW50ZXJTdHJpbmcpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIHVuLW1hdGNoZWQgS2lDYWQgc3RyaW5nc1xuICAgIHJldHVybiBmb290cHJpbnRcbiAgfVxuXG4gIC8vIE5vdCBhIEtpQ2FkIHN0cmluZywgYXNzdW1lIGl0J3MgYSBmb290cHJpbnRlciBzdHJpbmdcbiAgcmV0dXJuIGdldEpsY1BhY2thZ2VGcm9tRm9vdHByaW50ZXJTdHJpbmcoZm9vdHByaW50KVxufVxuIiwgImltcG9ydCB0eXBlIHsgUGFydHNFbmdpbmUsIFN1cHBsaWVyUGFydE51bWJlcnMgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBnZXRKbGNwY2JQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleFwiXG5cbmV4cG9ydCBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcblxuY29uc3QgZ2V0SmxjUGFydHNDYWNoZWQgPSBhc3luYyAobmFtZTogYW55LCBwYXJhbXM6IGFueSkgPT4ge1xuICBjb25zdCBwYXJhbVN0cmluZyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIC4uLnBhcmFtcyxcbiAgICBqc29uOiBcInRydWVcIixcbiAgfSkudG9TdHJpbmcoKVxuICBpZiAoY2FjaGUuaGFzKHBhcmFtU3RyaW5nKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQocGFyYW1TdHJpbmcpXG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICBgaHR0cHM6Ly9qbGNzZWFyY2gudHNjaXJjdWl0LmNvbS8ke25hbWV9L2xpc3Q/JHtwYXJhbVN0cmluZ31gLFxuICApXG4gIGNvbnN0IHJlc3BvbnNlSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICBjYWNoZS5zZXQocGFyYW1TdHJpbmcsIHJlc3BvbnNlSnNvbilcbiAgcmV0dXJuIHJlc3BvbnNlSnNvblxufVxuXG5jb25zdCB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZSA9IChwYXJ0czogYW55W10gfCB1bmRlZmluZWQpID0+IHtcbiAgaWYgKCFwYXJ0cykgcmV0dXJuIFtdXG4gIHJldHVybiBbLi4ucGFydHNdLnNvcnQoXG4gICAgKGEsIGIpID0+IE51bWJlcihiLmlzX2Jhc2ljID8/IGZhbHNlKSAtIE51bWJlcihhLmlzX2Jhc2ljID8/IGZhbHNlKSxcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgamxjUGFydHNFbmdpbmU6IFBhcnRzRW5naW5lID0ge1xuICBmaW5kUGFydDogYXN5bmMgKHtcbiAgICBzb3VyY2VDb21wb25lbnQsXG4gICAgZm9vdHByaW50ZXJTdHJpbmcsXG4gIH0pOiBQcm9taXNlPFN1cHBsaWVyUGFydE51bWJlcnM+ID0+IHtcbiAgICBjb25zdCBqbGNwY2JQYWNrYWdlID0gZ2V0SmxjcGNiUGFja2FnZU5hbWUoZm9vdHByaW50ZXJTdHJpbmcpXG5cbiAgICBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcmVzaXN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyByZXNpc3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicmVzaXN0b3JzXCIsIHtcbiAgICAgICAgcmVzaXN0YW5jZTogc291cmNlQ29tcG9uZW50LnJlc2lzdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHJlc2lzdG9ycylcbiAgICAgICAgICAubWFwKChyOiBhbnkpID0+IGBDJHtyLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jYXBhY2l0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBjYXBhY2l0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNhcGFjaXRvcnNcIiwge1xuICAgICAgICBjYXBhY2l0YW5jZTogc291cmNlQ29tcG9uZW50LmNhcGFjaXRhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShjYXBhY2l0b3JzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Bpbl9oZWFkZXJcIlxuICAgICkge1xuICAgICAgbGV0IHBpdGNoOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgICAgIGlmIChmb290cHJpbnRlclN0cmluZz8uaW5jbHVkZXMoXCJfcFwiKSkge1xuICAgICAgICBwaXRjaCA9IE51bWJlcihmb290cHJpbnRlclN0cmluZy5zcGxpdChcIl9wXCIpWzFdKVxuICAgICAgfVxuICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcbiAgICAgICAgXCJoZWFkZXJzXCIsXG4gICAgICAgIHBpdGNoXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHBpdGNoOiBwaXRjaCxcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbnVtX3BpbnM6IHNvdXJjZUNvbXBvbmVudC5waW5fY291bnQsXG4gICAgICAgICAgICAgIGdlbmRlcjogc291cmNlQ29tcG9uZW50LmdlbmRlcixcbiAgICAgICAgICAgIH0sXG4gICAgICApXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGhlYWRlcnMpXG4gICAgICAgICAgLm1hcCgoaDogYW55KSA9PiBgQyR7aC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcG90ZW50aW9tZXRlclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHBvdGVudGlvbWV0ZXJzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInBvdGVudGlvbWV0ZXJzXCIsIHtcbiAgICAgICAgcmVzaXN0YW5jZTogc291cmNlQ29tcG9uZW50Lm1heF9yZXNpc3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocG90ZW50aW9tZXRlcnMpXG4gICAgICAgICAgLm1hcCgocDogYW55KSA9PiBgQyR7cC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfZGlvZGVcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBkaW9kZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiZGlvZGVzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGRpb2RlcylcbiAgICAgICAgICAubWFwKChkOiBhbnkpID0+IGBDJHtkLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9jaGlwXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgY2hpcHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY2hpcHNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoY2hpcHMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfdHJhbnNpc3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHRyYW5zaXN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInRyYW5zaXN0b3JzXCIsIHtcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgICAgdHJhbnNpc3Rvcl90eXBlOiBzb3VyY2VDb21wb25lbnQudHJhbnNpc3Rvcl90eXBlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UodHJhbnNpc3RvcnMpXG4gICAgICAgICAgLm1hcCgodDogYW55KSA9PiBgQyR7dC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcG93ZXJfc291cmNlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcG93ZXJfc291cmNlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJwb3dlcl9zb3VyY2VzXCIsIHtcbiAgICAgICAgdm9sdGFnZTogc291cmNlQ29tcG9uZW50LnZvbHRhZ2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShwb3dlcl9zb3VyY2VzKVxuICAgICAgICAgIC5tYXAoKHA6IGFueSkgPT4gYEMke3AubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2luZHVjdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgaW5kdWN0b3JzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImluZHVjdG9yc1wiLCB7XG4gICAgICAgIGluZHVjdGFuY2U6IHNvdXJjZUNvbXBvbmVudC5pbmR1Y3RhbmNlLFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoaW5kdWN0b3JzKVxuICAgICAgICAgIC5tYXAoKGk6IGFueSkgPT4gYEMke2kubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NyeXN0YWxcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBjcnlzdGFscyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjcnlzdGFsc1wiLCB7XG4gICAgICAgIGZyZXF1ZW5jeTogc291cmNlQ29tcG9uZW50LmZyZXF1ZW5jeSxcbiAgICAgICAgbG9hZF9jYXBhY2l0YW5jZTogc291cmNlQ29tcG9uZW50LmxvYWRfY2FwYWNpdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShjcnlzdGFscylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9tb3NmZXRcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBtb3NmZXRzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcIm1vc2ZldHNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgICBtb3NmZXRfbW9kZTogc291cmNlQ29tcG9uZW50Lm1vc2ZldF9tb2RlLFxuICAgICAgICBjaGFubmVsX3R5cGU6IHNvdXJjZUNvbXBvbmVudC5jaGFubmVsX3R5cGUsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShtb3NmZXRzKVxuICAgICAgICAgIC5tYXAoKG06IGFueSkgPT4gYEMke20ubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX3Jlc29uYXRvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlc29uYXRvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicmVzb25hdG9yc1wiLCB7XG4gICAgICAgIGZyZXF1ZW5jeTogc291cmNlQ29tcG9uZW50LmZyZXF1ZW5jeSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHJlc29uYXRvcnMpXG4gICAgICAgICAgLm1hcCgocjogYW55KSA9PiBgQyR7ci5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfc3dpdGNoXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgc3dpdGNoZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwic3dpdGNoZXNcIiwge1xuICAgICAgICBzd2l0Y2hfdHlwZTogc291cmNlQ29tcG9uZW50LnR5cGUsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShzd2l0Y2hlcylcbiAgICAgICAgICAubWFwKChzOiBhbnkpID0+IGBDJHtzLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9sZWRcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBsZWRzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImxlZHNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UobGVkcylcbiAgICAgICAgICAubWFwKChsOiBhbnkpID0+IGBDJHtsLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9mdXNlXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgZnVzZXMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiZnVzZXNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoZnVzZXMpXG4gICAgICAgICAgLm1hcCgobDogYW55KSA9PiBgQyR7bC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge31cbiAgfSxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgamxjUGFydHNFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmVcIlxuaW1wb3J0IHsgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24gfSBmcm9tIFwia2ljYWQtY29tcG9uZW50LWNvbnZlcnRlclwiXG5jb25zdCBLSUNBRF9GT09UUFJJTlRfQ0FDSEVfVVJMID0gXCJodHRwczovL2tpY2FkLW1vZC1jYWNoZS50c2NpcmN1aXQuY29tXCJcblxuZXhwb3J0IGNvbnN0IGdldFBsYXRmb3JtQ29uZmlnID0gKCk6IFBsYXRmb3JtQ29uZmlnID0+ICh7XG4gIHBhcnRzRW5naW5lOiBqbGNQYXJ0c0VuZ2luZSxcbiAgZm9vdHByaW50TGlicmFyeU1hcDoge1xuICAgIGtpY2FkOiBhc3luYyAoZm9vdHByaW50TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gYCR7S0lDQURfRk9PVFBSSU5UX0NBQ0hFX1VSTH0vJHtmb290cHJpbnROYW1lfWBcbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uVXJsID0gYCR7YmFzZVVybH0uY2lyY3VpdC5qc29uYFxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goY2lyY3VpdEpzb25VcmwpXG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZXMuanNvbigpXG4gICAgICAvLyBGaWx0ZXIgcGNiX3NpbGtzY3JlZW5fdGV4dCB0byBvbmx5IGtlZXAgZW50cmllcyB3aXRoIHRleHQgPT09IFwiUkVGKipcIlxuICAgICAgLy8gQXBwbHkgZmlsdGVyaW5nIG9ubHkgdG8gZWxlbWVudHMgY29taW5nIGZyb20gdGhlIGtpY2FkX21vZF9zZXJ2ZXIgcmVzcG9uc2VcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gQXJyYXkuaXNBcnJheShyYXcpXG4gICAgICAgID8gcmF3LmZpbHRlcigoZWwpID0+XG4gICAgICAgICAgICBlbD8udHlwZSA9PT0gXCJwY2Jfc2lsa3NjcmVlbl90ZXh0XCIgPyBlbD8udGV4dCA9PT0gXCJSRUYqKlwiIDogdHJ1ZSxcbiAgICAgICAgICApXG4gICAgICAgIDogcmF3XG4gICAgICBjb25zdCB3cmxVcmwgPSBgJHtiYXNlVXJsfS53cmxgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb290cHJpbnRDaXJjdWl0SnNvbjogZmlsdGVyZWQsXG4gICAgICAgIGNhZE1vZGVsOiB7IHdybFVybCwgbW9kZWxVbml0VG9NbVNjYWxlOiAyLjU0IH0sXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgZm9vdHByaW50RmlsZVBhcnNlck1hcDoge1xuICAgIGtpY2FkX21vZDoge1xuICAgICAgbG9hZEZyb21Vcmw6IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBraWNhZENvbnRlbnQgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAgICAgY29uc3Qga2ljYWRKc29uID0gYXdhaXQgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24oa2ljYWRDb250ZW50KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBBcnJheS5pc0FycmF5KGtpY2FkSnNvbilcbiAgICAgICAgICAgID8ga2ljYWRKc29uXG4gICAgICAgICAgICA6IFtraWNhZEpzb25dLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KVxuIiwgImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKSB7XG4gIGxldCBub3JtRmlsZVBhdGggPSBmaWxlUGF0aFxuICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnRyaW0oKVxuICBpZiAobm9ybUZpbGVQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5zbGljZSgyKVxuICB9XG4gIGlmIChub3JtRmlsZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGguc2xpY2UoMSlcbiAgfVxuICByZXR1cm4gbm9ybUZpbGVQYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGc01hcChmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICBjb25zdCBub3JtYWxpemVkRnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtmc1BhdGgsIGZpbGVDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmc01hcCkpIHtcbiAgICBub3JtYWxpemVkRnNNYXBbbm9ybWFsaXplRmlsZVBhdGgoZnNQYXRoKV0gPSBmaWxlQ29udGVudFxuICB9XG4gIHJldHVybiBub3JtYWxpemVkRnNNYXBcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgdHlwZSB7XG4gIENpcmN1aXRSdW5uZXJBcGksXG4gIENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxufSBmcm9tIFwibGliL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuLi8uLi93ZWJ3b3JrZXIvZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgbm9ybWFsaXplRnNNYXAgfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwid2Vid29ya2VyL2ltcG9ydC1ldmFsLXBhdGhcIlxuaW1wb3J0IHsgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkIH0gZnJvbSBcIi4vc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCJcbmltcG9ydCB7IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciB9IGZyb20gXCJsaWIvdXRpbHMvZW5oYW5jZS1yb290LWNpcmN1aXQtZXJyb3JcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6Q2lyY3VpdFJ1bm5lclwiKVxuXG5leHBvcnQgY2xhc3MgQ2lyY3VpdFJ1bm5lciBpbXBsZW1lbnRzIENpcmN1aXRSdW5uZXJBcGkge1xuICBfZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRXhlY3V0aW9uQ29udGV4dD4gfCBudWxsID0gbnVsbFxuICBfY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb246IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uID0ge1xuICAgIHNuaXBwZXRzQXBpQmFzZVVybDogXCJodHRwczovL3JlZ2lzdHJ5LWFwaS50c2NpcmN1aXQuY29tXCIsXG4gICAgY2pzUmVnaXN0cnlVcmw6IFwiaHR0cHM6Ly9janMudHNjaXJjdWl0LmNvbVwiLFxuICAgIHZlcmJvc2U6IGZhbHNlLFxuICB9XG4gIF9ldmVudExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKCguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZClbXT4gPSB7fVxuICBfZGVidWdOYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8Q2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24+ID0ge30pIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICB9XG5cbiAgYXN5bmMgdmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBcIjAuMC4wXCJcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVXaXRoRnNNYXAob2dPcHRzOiB7XG4gICAgZW50cnlwb2ludD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRzID0geyAuLi5vZ09wdHMgfVxuXG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIERlYnVnLmVuYWJsZShcInRzY2k6ZXZhbDoqXCIpXG4gICAgfVxuXG4gICAgZGVidWcoXCJleGVjdXRlV2l0aEZzTWFwIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgICBmc01hcEtleXM6IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLFxuICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgIH0pXG5cbiAgICBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQob3B0cylcblxuICAgIGRlYnVnKFwiZW50cnlwb2ludCBhZnRlciBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQ6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICB9KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0cy5uYW1lLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcCA9IG5vcm1hbGl6ZUZzTWFwKG9wdHMuZnNNYXApXG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW29wdHMuZW50cnlwb2ludCFdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudHJ5cG9pbnQgXCIke29wdHMuZW50cnlwb2ludH1cIiBub3QgZm91bmRgKVxuICAgIH1cbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IS5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gb3B0cy5lbnRyeXBvaW50XG4gICAgICA6IGAuLyR7b3B0cy5lbnRyeXBvaW50fWBcblxuICAgIGRlYnVnKFwiZmluYWwgZW50cnlwb2ludDpcIiwgZW50cnlwb2ludClcbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChlbnRyeXBvaW50ISwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUoY29kZTogc3RyaW5nLCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlIGNhbGxlZCB3aXRoIGNvZGUgbGVuZ3RoOlwiLFxuICAgICAgICBjb2RlLmxlbmd0aCxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtcImVudHJ5cG9pbnQudHN4XCJdID0gY29kZVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKFwiLi9lbnRyeXBvaW50LnRzeFwiLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUNvbXBvbmVudChjb21wb25lbnQ6IGFueSwgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltDaXJjdWl0UnVubmVyXSBleGVjdXRlQ29tcG9uZW50IGNhbGxlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldFBsYXRmb3JtQ29uZmlnKHBsYXRmb3JtOiBQbGF0Zm9ybUNvbmZpZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtID0gcGxhdGZvcm1cbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWcocHJvamVjdDogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz4pIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0gcHJvamVjdFxuICB9XG5cbiAgYXN5bmMgZW5hYmxlRGVidWcobmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWJ1Z05hbWVzcGFjZSA9IG5hbWVzcGFjZVxuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIGFueVxuICAgICAgY2lyY3VpdC5lbmFibGVEZWJ1Zz8uKG5hbWVzcGFjZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9iaW5kRXZlbnRMaXN0ZW5lcnMoY2lyY3VpdDogUm9vdENpcmN1aXQpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICBjaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgbGlzdGVuZXIgYXMgYW55KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgYSBwYXRoLCBzaW1pbGFyIHRvIE5vZGUuanMgcGF0aC5kaXJuYW1lXG4gKiBXb3JrcyBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGF0aHNcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGV4dHJhY3QgdGhlIGRpcmVjdG9yeSBmcm9tXG4gKiBAcmV0dXJucyBUaGUgZGlyZWN0b3J5IHBhcnQgb2YgdGhlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gXCIuXCJcblxuICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2hlc1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICBjb25zdCBjbGVhblBhdGggPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHNsYXNoZXMsIHJldHVybiBcIi5cIlxuICBpZiAoY2xlYW5QYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3Qgc2xhc2hcbiAgcmV0dXJuIGNsZWFuUGF0aC5zdWJzdHJpbmcoMCwgY2xlYW5QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSkgfHwgXCIvXCJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcblxudHlwZSBSYXdUc0NvbmZpZyA9IHtcbiAgY29tcGlsZXJPcHRpb25zPzoge1xuICAgIGJhc2VVcmw/OiBzdHJpbmdcbiAgICBwYXRocz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnUGF0aHNJbmZvID0ge1xuICBiYXNlVXJsOiBzdHJpbmdcbiAgcGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNDb25maWcoXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbik6IFRzQ29uZmlnUGF0aHNJbmZvIHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGZzTWFwT3JBbGxGaWxlUGF0aHMpKSByZXR1cm4gbnVsbFxuICBjb25zdCB0c2NvbmZpZ0NvbnRlbnQgPSBmc01hcE9yQWxsRmlsZVBhdGhzW1widHNjb25maWcuanNvblwiXVxuICBpZiAoIXRzY29uZmlnQ29udGVudCkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRzY29uZmlnQ29udGVudCkgYXMgUmF3VHNDb25maWdcbiAgICByZXR1cm4gcGFyc2VkPy5jb21waWxlck9wdGlvbnM/LnBhdGhzXG4gICAgICA/IHtcbiAgICAgICAgICBiYXNlVXJsOiBwYXJzZWQuY29tcGlsZXJPcHRpb25zLmJhc2VVcmwgfHwgXCIuXCIsXG4gICAgICAgICAgcGF0aHM6IHBhcnNlZC5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgICAgIH1cbiAgICAgIDogbnVsbFxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZ1BhdGhzSW5mbyB8IG51bGxcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBpbXBvcnRQYXRoLCBub3JtYWxpemVkRmlsZVBhdGhNYXAsIGV4dGVuc2lvbnMsIHRzQ29uZmlnIH0gPSBvcHRzXG4gIGlmICghdHNDb25maWcpIHJldHVybiBudWxsXG4gIGNvbnN0IHsgYmFzZVVybCwgcGF0aHMgfSA9IHRzQ29uZmlnXG5cbiAgY29uc3QgdHJ5UmVzb2x2ZUNhbmRpZGF0ZSA9IChjYW5kaWRhdGU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDYW5kaWRhdGUgPSBub3JtYWxpemVGaWxlUGF0aChjYW5kaWRhdGUpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZENhbmRpZGF0ZSkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRDYW5kaWRhdGUpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICBjb25zdCB3aXRoRXh0ID0gYCR7bm9ybWFsaXplZENhbmRpZGF0ZX0uJHtleHR9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMod2l0aEV4dCkpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQod2l0aEV4dCkhXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMocGF0aHMpKSB7XG4gICAgLy8gU3VwcG9ydCBwYXR0ZXJucyBsaWtlIFwiQHNyYy8qXCIgb3IgXCJ1dGlscy8qXCIgYW5kIGFsc28gZXhhY3QgbWF0Y2hlcyB3aXRob3V0IFwiKlwiXG4gICAgY29uc3QgaGFzV2lsZGNhcmQgPSBhbGlhcy5pbmNsdWRlcyhcIipcIilcbiAgICBpZiAoaGFzV2lsZGNhcmQpIHtcbiAgICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBhbGlhcy5zcGxpdChcIipcIilcbiAgICAgIGlmIChcbiAgICAgICAgIWltcG9ydFBhdGguc3RhcnRzV2l0aChwcmVmaXgpIHx8XG4gICAgICAgICFpbXBvcnRQYXRoLmVuZHNXaXRoKHN1ZmZpeCB8fCBcIlwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBzdGFyTWF0Y2ggPSBpbXBvcnRQYXRoLnNsaWNlKFxuICAgICAgICBwcmVmaXgubGVuZ3RoLFxuICAgICAgICBpbXBvcnRQYXRoLmxlbmd0aCAtIChzdWZmaXggPyBzdWZmaXgubGVuZ3RoIDogMCksXG4gICAgICApXG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VkID0gdGFyZ2V0LnJlcGxhY2UoXCIqXCIsIHN0YXJNYXRjaClcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICFyZXBsYWNlZC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICA/IGAke2Jhc2VVcmx9LyR7cmVwbGFjZWR9YFxuICAgICAgICAgICAgOiByZXBsYWNlZFxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRyeVJlc29sdmVDYW5kaWRhdGUoY2FuZGlkYXRlKVxuICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW1wb3J0UGF0aCAhPT0gYWxpYXMpIGNvbnRpbnVlXG4gICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgICAgYmFzZVVybCAmJiAhdGFyZ2V0LnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhdGFyZ2V0LnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICA/IGAke2Jhc2VVcmx9LyR7dGFyZ2V0fWBcbiAgICAgICAgICAgIDogdGFyZ2V0XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKFxuICBpbXBvcnRQYXRoOiBzdHJpbmcsXG4gIHRzQ29uZmlnOiBUc0NvbmZpZ1BhdGhzSW5mbyB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgaWYgKCF0c0NvbmZpZykgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHsgcGF0aHMgfSA9IHRzQ29uZmlnXG5cbiAgZm9yIChjb25zdCBbYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKHBhdGhzKSkge1xuICAgIGNvbnN0IGhhc1dpbGRjYXJkID0gYWxpYXMuaW5jbHVkZXMoXCIqXCIpXG4gICAgaWYgKGhhc1dpbGRjYXJkKSB7XG4gICAgICBjb25zdCBbcHJlZml4LCBzdWZmaXhdID0gYWxpYXMuc3BsaXQoXCIqXCIpXG4gICAgICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgJiYgaW1wb3J0UGF0aC5lbmRzV2l0aChzdWZmaXggfHwgXCJcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGltcG9ydFBhdGggPT09IGFsaWFzKSByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcG9ydFBhdGggcmVsYXRpdmUgdG8gYSBjd2QsIHN1cHBvcnRpbmcgLi4vLCAuLyBhbmQgYWJzb2x1dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZywgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uXG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICBjb25zdCBwYXJlbnREaXIgPSBkaXJuYW1lKGN3ZClcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDMpLCBwYXJlbnREaXIpXG4gIH1cbiAgLy8gSGFuZGxlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGlmIChpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSkge1xuICAgIHJldHVybiByZXNvbHZlUmVsYXRpdmVQYXRoKGltcG9ydFBhdGguc2xpY2UoMiksIGN3ZClcbiAgfVxuICAvLyBIYW5kbGUgYWJzb2x1dGUgcGF0aFxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIHJldHVybiBpbXBvcnRQYXRoLnNsaWNlKDEpXG4gIH1cbiAgLy8gSGFuZGxlIHJlbGF0aXZlIHBhdGhcbiAgcmV0dXJuIGAke2N3ZH0vJHtpbXBvcnRQYXRofWBcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwibGliL3V0aWxzL2Rpcm5hbWVcIlxuaW1wb3J0IHsgZ2V0VHNDb25maWcsIHJlc29sdmVXaXRoVHNjb25maWdQYXRocyB9IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IHsgcmVzb2x2ZVJlbGF0aXZlUGF0aCB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZVJlbGF0aXZlUGF0aFwiXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmlsZVBhdGggPSAoXG4gIHVua25vd25GaWxlUGF0aDogc3RyaW5nLFxuICBmc01hcE9yQWxsRmlsZVBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nW10sXG4gIGN3ZD86IHN0cmluZyxcbikgPT4ge1xuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IGN3ZFxuICAgID8gcmVzb2x2ZVJlbGF0aXZlUGF0aCh1bmtub3duRmlsZVBhdGgsIGN3ZClcbiAgICA6IHVua25vd25GaWxlUGF0aFxuXG4gIGNvbnN0IGZpbGVQYXRocyA9IG5ldyBTZXQoXG4gICAgQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKVxuICAgICAgPyBmc01hcE9yQWxsRmlsZVBhdGhzXG4gICAgICA6IE9iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLFxuICApXG5cbiAgaWYgKGZpbGVQYXRocy5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiByZXNvbHZlZFBhdGhcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAuc2V0KG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoKSwgZmlsZVBhdGgpXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkUmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgocmVzb2x2ZWRQYXRoKVxuXG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGgpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gIH1cblxuICAvLyBTZWFyY2ggZm9yIGZpbGUgd2l0aCBhIHNldCBvZiBkaWZmZXJlbnQgZXh0ZW5zaW9uc1xuICBjb25zdCBleHRlbnNpb24gPSBbXCJ0c3hcIiwgXCJ0c1wiLCBcImpzb25cIiwgXCJqc1wiLCBcImpzeFwiLCBcIm9ialwiLCBcImdsdGZcIiwgXCJnbGJcIl1cbiAgZm9yIChjb25zdCBleHQgb2YgZXh0ZW5zaW9uKSB7XG4gICAgY29uc3QgcG9zc2libGVGaWxlUGF0aCA9IGAke25vcm1hbGl6ZWRSZXNvbHZlZFBhdGh9LiR7ZXh0fWBcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQocG9zc2libGVGaWxlUGF0aCkhXG4gICAgfVxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyB1c2luZyB0c2NvbmZpZyBcInBhdGhzXCIgbWFwcGluZyB3aGVuIHRoZSBpbXBvcnQgaXMgbm9uLXJlbGF0aXZlXG4gIGNvbnN0IHRzQ29uZmlnID1cbiAgICAhQXJyYXkuaXNBcnJheShmc01hcE9yQWxsRmlsZVBhdGhzKSAmJlxuICAgIHR5cGVvZiBmc01hcE9yQWxsRmlsZVBhdGhzID09PSBcIm9iamVjdFwiXG4gICAgICA/IGdldFRzQ29uZmlnKGZzTWFwT3JBbGxGaWxlUGF0aHMpXG4gICAgICA6IG51bGxcblxuICBpZiAoIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3QgdmlhVHNjb25maWcgPSByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoe1xuICAgICAgaW1wb3J0UGF0aDogdW5rbm93bkZpbGVQYXRoLFxuICAgICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9uLFxuICAgICAgdHNDb25maWcsXG4gICAgfSlcbiAgICBpZiAodmlhVHNjb25maWcpIHJldHVybiB2aWFUc2NvbmZpZ1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhYnNvbHV0ZSBpbXBvcnRcbiAgaWYgKCF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpICYmICF1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb24pIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbikgPT4ge1xuICBjb25zdCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKHVua25vd25GaWxlUGF0aCwgZnNNYXBPckFsbEZpbGVQYXRocylcbiAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpbGUgbm90IGZvdW5kIFwiJHt1bmtub3duRmlsZVBhdGh9XCIsIGF2YWlsYWJsZSBwYXRoczpcXG5cXG4ke09iamVjdC5rZXlzKGZzTWFwT3JBbGxGaWxlUGF0aHMpLmpvaW4oXCIsIFwiKX1gLFxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWRGaWxlUGF0aFxufVxuIiwgImV4cG9ydCBjb25zdCBnZXRJbXBvcnRzRnJvbUNvZGUgPSAoY29kZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAvLyBNYXRjaCBiYXNpYyBpbXBvcnQgcGF0dGVybnMgaW5jbHVkaW5nIGNvbWJpbmVkIGRlZmF1bHQgYW5kIG5hbWVzcGFjZSBpbXBvcnRzXG4gIGNvbnN0IGltcG9ydFJlZ2V4ID1cbiAgICAvXlxccyppbXBvcnRcXHMrKD86KD86W1xcd1xcc10rLFxccyopPyg/OlxcKlxccythc1xccytbXFx3XFxzXSt8XFx7W1xcc1xcdyxdK1xcfXxcXHcrKVxccytmcm9tXFxzKik/WydcIl0oLis/KVsnXCJdL2dtXG4gIGNvbnN0IGltcG9ydHM6IHN0cmluZ1tdID0gW11cbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChtYXRjaCA9IGltcG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKVxuICB9XG5cbiAgLy8gTWF0Y2ggcmUtZXhwb3J0c1xuICBjb25zdCByZUV4cG9ydFJlZ2V4ID1cbiAgICAvXlxccypleHBvcnRcXHMrKD86XFwqfCg/Olxce1tcXHNcXHcsXStcXH0pKVxccytmcm9tXFxzKlsnXCJdKC4rPylbJ1wiXS9nbVxuICBsZXQgcmVFeHBvcnRNYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQXNzaWduSW5FeHByZXNzaW9uczogPGV4cGxhbmF0aW9uPlxuICB3aGlsZSAoKHJlRXhwb3J0TWF0Y2ggPSByZUV4cG9ydFJlZ2V4LmV4ZWMoY29kZSkpICE9PSBudWxsKSB7XG4gICAgaW1wb3J0cy5wdXNoKHJlRXhwb3J0TWF0Y2hbMV0pXG4gIH1cblxuICByZXR1cm4gaW1wb3J0c1xufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsQ29tcGlsZWRKcyhcbiAgY29tcGlsZWRDb2RlOiBzdHJpbmcsXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PixcbiAgY3dkPzogc3RyaW5nLFxuKSB7XG4gIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X3JlcXVpcmUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChuYW1lLCBwcmVTdXBwbGllZEltcG9ydHMsIGN3ZClcblxuICAgIGNvbnN0IGhhc1Jlc29sdmVkRmlsZVBhdGggPVxuICAgICAgcmVzb2x2ZWRGaWxlUGF0aCAmJiBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aF1cblxuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW25hbWVdICYmICFoYXNSZXNvbHZlZEZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCBcIiR7bmFtZX1cIiBub3QgZm91bmQgJHtjd2QgPyBgaW4gXCIke2N3ZH1cImAgOiBcIlwifWApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kID1cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSB8fCBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRGaWxlUGF0aCFdXG4gICAgcmV0dXJuIG5ldyBQcm94eShtb2QsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKCEocHJvcCBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgaWYgKHByb3AgPT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmRlZmF1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhcmdldC5fX2VzTW9kdWxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9wID09PSBcIl9fZXNNb2R1bGVcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ29tcG9uZW50IFwiJHtTdHJpbmcocHJvcCl9XCIgaXMgbm90IGV4cG9ydGVkIGJ5IFwiJHtuYW1lfVwiYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIHRhcmdldF1cbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGZ1bmN0aW9uQm9keSA9IGBcbiAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgdmFyIHJlcXVpcmUgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X3JlcXVpcmU7XG4gIHZhciBtb2R1bGUgPSB7IGV4cG9ydHMgfTtcbiAgdmFyIGNpcmN1aXQgPSBnbG9iYWxUaGlzLl9fdHNjaXJjdWl0X2NpcmN1aXQ7XG4gICR7Y29tcGlsZWRDb2RlfTtcbiAgcmV0dXJuIG1vZHVsZTtgLnRyaW0oKVxuICByZXR1cm4gRnVuY3Rpb24oZnVuY3Rpb25Cb2R5KS5jYWxsKGdsb2JhbFRoaXMpXG59XG4iLCAiaW1wb3J0IHtcbiAgcmVzb2x2ZUZpbGVQYXRoLFxuICByZXNvbHZlRmlsZVBhdGhPclRocm93LFxufSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1sb2NhbC1maWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnRMb2NhbEZpbGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgZGVidWcoXCJpbXBvcnRMb2NhbEZpbGUgY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICB9KVxuXG4gIGNvbnN0IHsgZnNNYXAsIHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG5cbiAgY29uc3QgZnNQYXRoID0gcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhpbXBvcnROYW1lLCBmc01hcClcbiAgZGVidWcoXCJmc1BhdGg6XCIsIGZzUGF0aClcbiAgaWYgKCFjdHguZnNNYXBbZnNQYXRoXSkge1xuICAgIGRlYnVnKFwiZnNQYXRoIG5vdCBmb3VuZCBpbiBmc01hcDpcIiwgZnNQYXRoKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZnNQYXRofVwiIG5vdCBmb3VuZGApXG4gIH1cbiAgY29uc3QgZmlsZUNvbnRlbnQgPSBmc01hcFtmc1BhdGhdXG4gIGRlYnVnKFwiZmlsZUNvbnRlbnQ6XCIsIGZpbGVDb250ZW50Py5zbGljZSgwLCAxMDApKVxuICBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgZGVmYXVsdDoganNvbkRhdGEsXG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RhdGljQXNzZXRQYXRoKGZzUGF0aCkpIHtcbiAgICBjb25zdCBwbGF0Zm9ybUNvbmZpZyA9IGN0eC5jaXJjdWl0LnBsYXRmb3JtXG4gICAgLy8gVXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgY29uc3Qgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7ZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aH1gXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgZGVmYXVsdDogc3RhdGljVXJsLFxuICAgIH1cbiAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIudHN4XCIpIHx8IGZzUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuICAgIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGZpbGVDb250ZW50KVxuXG4gICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChpbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKVxuICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICBjb2RlOiB0cmFuc2Zvcm1lZENvZGUuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgZGlybmFtZTogZGlybmFtZShmc1BhdGgpLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGltcG9ydFJ1blJlc3VsdCA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICB0cmFuc2Zvcm1lZENvZGUsXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgKVxuICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgZnNQYXRoLFxuICAgICAgICBpbXBvcnRSdW5SZXN1bHQsXG4gICAgICB9KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBpbXBvcnRSdW5SZXN1bHQuZXhwb3J0c1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEV2YWwgY29tcGlsZWQganMgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmpzXCIpKSB7XG4gICAgLy8gRm9yIC5qcyBmaWxlcywgZXNwZWNpYWxseSBmcm9tIG5vZGVfbW9kdWxlcywgd2UgbmVlZCB0byB0cmFuc2Zvcm0gdGhlbVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICB0cmFuc2Zvcm1XaXRoU3VjcmFzZShmaWxlQ29udGVudCwgZnNQYXRoKSxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICApLmV4cG9ydHNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5zdXBwb3J0ZWQgZmlsZSBleHRlbnNpb24gXCIke2ZzUGF0aC5zcGxpdChcIi5cIikucG9wKCl9XCIgZm9yIFwiJHtmc1BhdGh9XCJgLFxuICAgIClcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUyA9IFtcbiAgXCIuZ2xiXCIsXG4gIFwiLmtpY2FkX21vZFwiLFxuICBcIi5nbHRmXCIsXG4gIFwiLm9ialwiLFxuICBcIi5zdGxcIixcbl1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdGljQXNzZXRQYXRoID0gKHBhdGg6IHN0cmluZykgPT5cbiAgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBwYXRoLmVuZHNXaXRoKGV4dCkpXG4iLCAiaW1wb3J0IHsgdHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybSBhcyBTdWNyYXNlVHJhbnNmb3JtIH0gZnJvbSBcInN1Y3Jhc2VcIlxuXG5jb25zdCBUU19FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHNcIiwgXCIudHN4XCIsIFwiLm10c1wiLCBcIi5jdHNcIl0pXG5jb25zdCBKU1hfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzeFwiLCBcIi5qc3hcIiwgXCIudHNcIl0pXG5cbmNvbnN0IHN0cmlwUXVlcnlBbmRIYXNoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCI/XCIpXG4gIGNvbnN0IGhhc2hJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIjXCIpXG5cbiAgbGV0IGVuZEluZGV4ID0gZmlsZVBhdGgubGVuZ3RoXG5cbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xICYmIGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IE1hdGgubWluKHF1ZXJ5SW5kZXgsIGhhc2hJbmRleClcbiAgfSBlbHNlIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gcXVlcnlJbmRleFxuICB9IGVsc2UgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IGhhc2hJbmRleFxuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKDAsIGVuZEluZGV4KVxufVxuXG5jb25zdCBnZXRFeHRlbnNpb24gPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHN0cmlwUXVlcnlBbmRIYXNoKGZpbGVQYXRoKVxuICBjb25zdCBsYXN0RG90SW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi5cIilcblxuICBpZiAobGFzdERvdEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSxcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIiksXG4gIClcblxuICBpZiAobGFzdFNsYXNoSW5kZXggPiBsYXN0RG90SW5kZXgpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNsaWNlKGxhc3REb3RJbmRleCkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZVBhdGgpXG5cbiAgY29uc3QgdHJhbnNmb3JtczogU3VjcmFzZVRyYW5zZm9ybVtdID0gW1wiaW1wb3J0c1wiXVxuXG4gIGlmIChUU19FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy51bnNoaWZ0KFwidHlwZXNjcmlwdFwiKVxuICB9XG5cbiAgaWYgKEpTWF9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwianN4XCIpXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3Jtc1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgPSAoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybXMgPSBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlIH0gPSB0cmFuc2Zvcm0oY29kZSwge1xuICAgIGZpbGVQYXRoLFxuICAgIHByb2R1Y3Rpb246IHRydWUsXG4gICAgdHJhbnNmb3JtcyxcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRDb2RlXG59XG4iLCAiaW1wb3J0IHsgZXZhbENvbXBpbGVkSnMgfSBmcm9tIFwiLi9ldmFsLWNvbXBpbGVkLWpzXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNuaXBwZXQoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pIHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBmdWxsU25pcHBldE5hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoXCJAdHNjaS9cIiwgXCJcIikucmVwbGFjZShcIi5cIiwgXCIvXCIpXG5cbiAgY29uc3QgeyBjanMsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKGAke2N0eC5janNSZWdpc3RyeVVybH0vJHtmdWxsU25pcHBldE5hbWV9YClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiAoeyBjanM6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH0pKVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNqczogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgaW1wb3J0XCIsIGltcG9ydE5hbWUsIGVycm9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIGNqcyEsXG4gICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgKS5leHBvcnRzXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW1wb3J0aW5nIHNuaXBwZXRcIiwgZSlcbiAgfVxufVxuIiwgImltcG9ydCB7IGRpcm5hbWUgfSBmcm9tIFwiLi9kaXJuYW1lXCJcblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+XG59XG5cbmludGVyZmFjZSBOb2RlUmVzb2x1dGlvbkNvbnRleHQge1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBleHRlbnNpb25zOiBzdHJpbmdbXVxuICBiYXNlUGF0aDogc3RyaW5nXG4gIG1vZHVsZVBhdGg6IHN0cmluZ1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KFxuICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICBmc01hcCxcbiAgICBleHRlbnNpb25zOiBbXCIuanNcIiwgXCIuanN4XCIsIFwiLnRzXCIsIFwiLnRzeFwiLCBcIi5qc29uXCJdLFxuICAgIGJhc2VQYXRoLFxuICAgIG1vZHVsZVBhdGgsXG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKG5vZGVNb2R1bGVzUGF0aDogc3RyaW5nLCBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCkge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9L3BhY2thZ2UuanNvbmBcbiAgaWYgKCFjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgcmV0dXJuIG51bGxcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjdHguZnNNYXBbcGFja2FnZUpzb25QYXRoXSkgYXMgUGFja2FnZUpzb25cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoXG4gIHBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGN0eC5mc01hcFtwYXRoXSkgcmV0dXJuIHBhdGhcblxuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IHBhdGhXaXRoRXh0ID0gcGF0aC5yZXBsYWNlKC9cXC5qcyR8XFwuanN4JC8sIFwiXCIpICsgZXh0XG4gICAgaWYgKGN0eC5mc01hcFtwYXRoV2l0aEV4dF0pIHJldHVybiBwYXRoV2l0aEV4dFxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgZXhwb3J0UGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBmdWxsRXhwb3J0UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vJHtleHBvcnRQYXRoLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gXG4gIHJldHVybiB0cnlSZXNvbHZlV2l0aEV4dGVuc2lvbnMoZnVsbEV4cG9ydFBhdGgsIGN0eClcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFeHBvcnRzKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICByZW1haW5pbmdQYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghcGFja2FnZUpzb24uZXhwb3J0cykgcmV0dXJuIG51bGxcblxuICAvLyBIYW5kbGUgZGVmYXVsdCBleHBvcnQgY29uZGl0aW9uXG4gIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBwYWNrYWdlSnNvbi5leHBvcnRzW1wiLlwiXVxuICBpZiAocmVtYWluaW5nUGF0aCA9PT0gXCJcIiAmJiBkZWZhdWx0RXhwb3J0KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0RXhwb3J0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRQYXRoKG5vZGVNb2R1bGVzUGF0aCwgZGVmYXVsdEV4cG9ydCwgY3R4KVxuICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBleHBvcnRzXG4gIGNvbnN0IHN1YnBhdGhFeHBvcnQgPSByZW1haW5pbmdQYXRoXG4gICAgPyBwYWNrYWdlSnNvbi5leHBvcnRzW2AuLyR7cmVtYWluaW5nUGF0aH1gXVxuICAgIDogbnVsbFxuICBpZiAoc3VicGF0aEV4cG9ydCAmJiB0eXBlb2Ygc3VicGF0aEV4cG9ydCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBzdWJwYXRoRXhwb3J0LCBjdHgpXG4gICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb25kaXRpb25hbCBleHBvcnRzXG4gIGNvbnN0IGltcG9ydEV4cG9ydCA9IHBhY2thZ2VKc29uLmV4cG9ydHNbXCJpbXBvcnRcIl1cbiAgaWYgKFxuICAgIHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiZcbiAgICBpbXBvcnRFeHBvcnQgJiZcbiAgICB0eXBlb2YgaW1wb3J0RXhwb3J0ID09PSBcInN0cmluZ1wiXG4gICkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBpbXBvcnRFeHBvcnQsIGN0eClcbiAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09IFwiLlwiID8gXCJcIiA6IGAke3NlYXJjaFBhdGh9L2B9bm9kZV9tb2R1bGVzLyR7c2NvcGV9YFxuXG4gIC8vIFRyeSB0byBmaW5kIHBhY2thZ2UuanNvblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGgsIGN0eClcbiAgaWYgKHBhY2thZ2VKc29uKSB7XG4gICAgLy8gVHJ5IHJlc29sdmluZyB0aHJvdWdoIGV4cG9ydHMgZmllbGRcbiAgICBjb25zdCBleHBvcnRzUmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgcmVtYWluaW5nUGF0aCxcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGV4cG9ydHNSZXNvbHV0aW9uKSByZXR1cm4gZXhwb3J0c1Jlc29sdXRpb25cblxuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBtYWluL21vZHVsZSBmaWVsZHNcbiAgICBjb25zdCBlbnRyeVBvaW50UmVzb2x1dGlvbiA9IHJlc29sdmVQYWNrYWdlRW50cnlQb2ludChcbiAgICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgY3R4LFxuICAgIClcbiAgICBpZiAoZW50cnlQb2ludFJlc29sdXRpb24pIHJldHVybiBlbnRyeVBvaW50UmVzb2x1dGlvblxuICB9XG5cbiAgLy8gVHJ5IHJlc29sdmluZyByZW1haW5pbmcgcGF0aFxuICBjb25zdCByZW1haW5pbmdQYXRoUmVzb2x1dGlvbiA9IHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICAgIG5vZGVNb2R1bGVzUGF0aCxcbiAgICByZW1haW5pbmdQYXRoLFxuICAgIGN0eCxcbiAgKVxuICBpZiAocmVtYWluaW5nUGF0aFJlc29sdXRpb24pIHJldHVybiByZW1haW5pbmdQYXRoUmVzb2x1dGlvblxuXG4gIC8vIElmIG5vdCBmb3VuZCBhbmQgd2UgaGF2ZSBhIHBhcmVudCBkaXJlY3RvcnksIHRyeSB0aGVyZVxuICBjb25zdCBwYXJlbnRQYXRoID0gZGlybmFtZShzZWFyY2hQYXRoKVxuICBpZiAocGFyZW50UGF0aCAmJiBwYXJlbnRQYXRoICE9PSBzZWFyY2hQYXRoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKHBhcmVudFBhdGgsIGN0eClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZShcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjdHggPSBjcmVhdGVDb250ZXh0KG1vZHVsZVBhdGgsIGZzTWFwLCBiYXNlUGF0aClcbiAgcmV0dXJuIHJlc29sdmVOb2RlTW9kdWxlSW5QYXRoKGN0eC5iYXNlUGF0aCwgY3R4KVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcblxuZXhwb3J0IGNvbnN0IGltcG9ydE5vZGVNb2R1bGUgPSBhc3luYyAoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4pID0+IHtcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHguZnNNYXAsIFwiXCIpXG5cbiAgaWYgKCFyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBub3QgZm91bmRgKVxuICB9XG5cbiAgLy8gVXNlIGltcG9ydExvY2FsRmlsZSB0byBoYW5kbGUgdGhlIG5vZGUgbW9kdWxlXG4gIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZE5vZGVNb2R1bGVQYXRoLCBjdHgsIGRlcHRoKVxuXG4gIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZSdzIGV4cG9ydHNcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gTWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeCBmb3IgZGlyZWN0IGltcG9ydHNcbiAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID1cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBIYW5kbGUgaW5kZXggZmlsZXMgc3BlY2lhbGx5XG4gIGlmIChcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzeFwiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHNcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LmpzXCIpXG4gICkge1xuICAgIGNvbnN0IGRpclBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL1xcL2luZGV4XFwuKHRzeD98anMpJC8sIFwiXCIpXG4gICAgY29uc3QgdW5wcmVmaXhlZERpclBhdGggPSBkaXJQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkRGlyUGF0aF0gPVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgICAvLyBIYW5kbGUgc2NvcGVkIHBhY2thZ2VzXG4gICAgaWYgKHVucHJlZml4ZWREaXJQYXRoLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzY29wZVBhcnRzID0gdW5wcmVmaXhlZERpclBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBzY29wZWROYW1lID0gYCR7c2NvcGVQYXJ0c1swXX0vJHtzY29wZVBhcnRzWzFdfWBcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Njb3BlZE5hbWVdID1cbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCIuL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZShcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBkZWJ1ZyhgaW1wb3J0aW5nIG5wbSBwYWNrYWdlOiAke2ltcG9ydE5hbWV9YClcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIGNvbnN0IG5wbUNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7aW1wb3J0TmFtZX0vK2VzbWBcblxuICBsZXQgZmluYWxVcmw6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBjb25zdCB7IGNvbnRlbnQsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKG5wbUNkblVybClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICBmaW5hbFVybCA9IHJlcy51cmxcbiAgICAgIGlmICghcmVzLm9rKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmZXRjaCBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIGpzZGVsaXZyOiAke3Jlcy5zdGF0dXNUZXh0fWAsXG4gICAgICAgIClcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNvbnRlbnQ6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIG5wbSBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW1wb3J0TmFtZSA9IGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cihmaW5hbFVybCEpXG4gIGNvbnN0IGN3ZCA9IGRpcm5hbWUoZmluYWxJbXBvcnROYW1lKVxuXG4gIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGNvbnRlbnQhKVxuICBmb3IgKGNvbnN0IHN1YkltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tzdWJJbXBvcnROYW1lXSkge1xuICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoc3ViSW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgY3dkLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShcbiAgICBjb250ZW50ISxcbiAgICBmaW5hbEltcG9ydE5hbWUgfHwgaW1wb3J0TmFtZSxcbiAgKVxuICB0cnkge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIHRyYW5zZm9ybWVkQ29kZSxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgIGN3ZCxcbiAgICApLmV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsSW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsVXJsIV0gPSBleHBvcnRzXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXZhbCBucG0gcGFja2FnZSBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZS5tZXNzYWdlfWApXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRMb2NhbEZpbGUgfSBmcm9tIFwiLi9pbXBvcnQtbG9jYWwtZmlsZVwiXG5pbXBvcnQgeyBpbXBvcnRTbmlwcGV0IH0gZnJvbSBcIi4vaW1wb3J0LXNuaXBwZXRcIlxuaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoIH0gZnJvbSBcImxpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCB7IHJlc29sdmVOb2RlTW9kdWxlIH0gZnJvbSBcImxpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5vZGVNb2R1bGUgfSBmcm9tIFwiLi9pbXBvcnQtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHsgaW1wb3J0TnBtUGFja2FnZSB9IGZyb20gXCIuL2ltcG9ydC1ucG0tcGFja2FnZVwiXG5pbXBvcnQge1xuICBnZXRUc0NvbmZpZyxcbiAgbWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4sXG59IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWV2YWwtcGF0aFwiKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RXZhbFBhdGgoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4gIG9wdHM6IHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKSB7XG4gIGRlYnVnKFwiaW1wb3J0RXZhbFBhdGggY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICAgIGRlcHRoLFxuICAgIG9wdHMsXG4gIH0pXG5cbiAgZGVidWcoYCR7XCIgIFwiLnJlcGVhdChkZXB0aCl9XHUyN0ExXHVGRTBGYCwgaW1wb3J0TmFtZSlcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKVxuICAgIHJldHVyblxuXG4gIGlmIChkZXB0aCA+IDUpIHtcbiAgICBjb25zb2xlLmxvZyhcIk1heCBkZXB0aCBmb3IgaW1wb3J0cyByZWFjaGVkXCIpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL25wbS9cIikpIHtcbiAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKC9eXFwvbnBtXFwvLywgXCJcIikucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gICAgYXdhaXQgaW1wb3J0TnBtUGFja2FnZShwa2dOYW1lLCBjdHgsIGRlcHRoKVxuICAgIGNvbnN0IHBrZyA9IHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXVxuICAgIGlmIChwa2cpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHBrZ1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKFxuICAgIGltcG9ydE5hbWUsXG4gICAgY3R4LmZzTWFwLFxuICAgIG9wdHMuY3dkLFxuICApXG4gIGlmIChyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lICh3aGljaCBtaWdodCBiZSBhIHRzY29uZmlnIHBhdGggYWxpYXMpIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICBpZiAoaW1wb3J0TmFtZSAhPT0gcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9XG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZExvY2FsSW1wb3J0UGF0aF1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBUcnkgdG8gcmVzb2x2ZSBmcm9tIG5vZGVfbW9kdWxlc1xuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QgfHwgXCJcIixcbiAgKVxuICBpZiAocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIHJldHVybiBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgcmV0dXJuIGltcG9ydFNuaXBwZXQoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoaXMgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggcGF0dGVybiBidXQgZmFpbGVkIHRvIHJlc29sdmVcbiAgLy8gSWYgc28sIHRocm93IGFuIGVycm9yIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIG5wbVxuICBjb25zdCB0c0NvbmZpZyA9IGdldFRzQ29uZmlnKGN0eC5mc01hcClcbiAgaWYgKG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKGltcG9ydE5hbWUsIHRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggYWxpYXMgYnV0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBleGlzdGluZyBmaWxlJHtvcHRzLmN3ZCA/IGAgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9YCxcbiAgICApXG4gIH1cblxuICBpZiAoIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiYgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbnJlc29sdmVkIGltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiAke29wdHMuY3dkID8gYGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifWAsXG4gIClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGhPclRocm93IH0gZnJvbSBcIi4vcmVzb2x2ZUZpbGVQYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOnNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZFwiKVxuXG5leHBvcnQgY29uc3Qgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkID0gKG9wdHM6IHtcbiAgZW50cnlwb2ludD86IHN0cmluZ1xuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50TmFtZT86IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbn0pID0+IHtcbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgIW9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBpZiAoXCJpbmRleC50c3hcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c3hcIlxuICAgIH0gZWxzZSBpZiAoXCJpbmRleC50c1wiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzXCJcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgT2JqZWN0LmtleXMob3B0cy5mc01hcCkuZmlsdGVyKChrKSA9PiBrLmVuZHNXaXRoKFwiLnRzeFwiKSkubGVuZ3RoID09PSAxXG4gICAgKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gT2JqZWN0LmtleXMob3B0cy5mc01hcClbMF1cbiAgICB9IGVsc2UgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IG9wdHMuZnNNYXBbXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIl1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudClcbiAgICAgICAgaWYgKGNvbmZpZy5tYWluRW50cnlwb2ludCkge1xuICAgICAgICAgIG9wdHMuZW50cnlwb2ludCA9IGNvbmZpZy5tYWluRW50cnlwb2ludFxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSB0c2NpcmN1aXQuY29uZmlnLmpzb246XCIsIGUpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgZW50cnlwb2ludCBvciBtYWluQ29tcG9uZW50UGF0aCBtdXN0IGJlIHByb3ZpZGVkIChubyBpbmRleCBmaWxlLCBjb3VsZCBub3QgaW5mZXIgZW50cnlwb2ludClcIixcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiBvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgb3B0cy5lbnRyeXBvaW50ID0gXCJlbnRyeXBvaW50LnRzeFwiXG4gICAgY29uc3QgbWFpbkNvbXBvbmVudENvZGUgPVxuICAgICAgb3B0cy5mc01hcFtyZXNvbHZlRmlsZVBhdGhPclRocm93KG9wdHMubWFpbkNvbXBvbmVudFBhdGgsIG9wdHMuZnNNYXApXVxuICAgIGlmICghbWFpbkNvbXBvbmVudENvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1haW4gY29tcG9uZW50IHBhdGggXCIke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCIgbm90IGZvdW5kIGluIGZzTWFwLiBBdmFpbGFibGUgcGF0aHM6ICR7T2JqZWN0LmtleXMob3B0cy5mc01hcCkuam9pbihcIiwgXCIpfWAsXG4gICAgICApXG4gICAgfVxuICAgIG9wdHMuZnNNYXBbb3B0cy5lbnRyeXBvaW50XSA9IGBcbiAgICAgaW1wb3J0ICogYXMgVXNlckNvbXBvbmVudHMgZnJvbSBcIi4vJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiO1xuICAgICAgICAgIFxuICAgICAgJHtcbiAgICAgICAgb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICAgICAgICAgID8gYFxuICAgICAgICBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzW1wiJHtvcHRzLm1haW5Db21wb25lbnROYW1lfVwiXVxuICAgICAgICBgXG4gICAgICAgICAgOiBgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50cy5kZWZhdWx0IHx8IFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKFVzZXJDb21wb25lbnRzKVxuICAgICAgICAgIC5maWx0ZXIoKFtuYW1lXSkgPT4gIW5hbWUuc3RhcnRzV2l0aChcInVzZVwiKSlcbiAgICAgICAgICAubWFwKChbXywgY29tcG9uZW50XSkgPT4gY29tcG9uZW50KVswXSB8fCAoKCkgPT4gbnVsbCk7YFxuICAgICAgfVxuXG4gICAgICAgICAgICR7XG4gICAgICAgICAgICAgZGVidWcuZW5hYmxlZFxuICAgICAgICAgICAgICAgPyBgXG4gICAgIGNvbnNvbGUubG9nKHsgVXNlckNvbXBvbmVudHMgfSlcbiAgICAgY29uc29sZS5sb2coXCJDb21wb25lbnRUb1JlbmRlciBcIiArIENvbXBvbmVudFRvUmVuZGVyLnRvU3RyaW5nKCksICB7IENvbXBvbmVudFRvUmVuZGVyIH0pXG4gICAgIGBcbiAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICB9XG5cbiAgICAgIGNpcmN1aXQuYWRkKCAgICAgICBcbiAgICAgICAgICA8Q29tcG9uZW50VG9SZW5kZXIgJHtvcHRzLm1haW5Db21wb25lbnRQcm9wcyA/IGB7Li4uJHtKU09OLnN0cmluZ2lmeShvcHRzLm1haW5Db21wb25lbnRQcm9wcywgbnVsbCwgMil9fWAgOiBcIlwifSAvPiBcbiAgICAgICk7XG5gXG4gIH1cblxuICBpZiAoIW9wdHMubmFtZSAmJiBvcHRzLm1haW5Db21wb25lbnROYW1lKSB7XG4gICAgb3B0cy5uYW1lID0gb3B0cy5tYWluQ29tcG9uZW50TmFtZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciA9IChcbiAgZXJyb3I6IHVua25vd24sXG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmcsXG4pID0+IHtcbiAgaWYgKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICBlbnRyeXBvaW50ICYmXG4gICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJvb3RDaXJjdWl0IGhhcyBubyBjaGlsZHJlblwiKSAmJlxuICAgICFlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdcImVudHJ5cG9pbnRcIjonKVxuICApIHtcbiAgICBjb25zdCBlbnRyeXBvaW50TWVzc2FnZSA9IGVudHJ5cG9pbnQuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IGVudHJ5cG9pbnQuc2xpY2UoMilcbiAgICAgIDogZW50cnlwb2ludFxuICAgIGVycm9yLm1lc3NhZ2UgPSBgJHtlcnJvci5tZXNzYWdlfS4gXCJlbnRyeXBvaW50XCI6IFwiJHtlbnRyeXBvaW50TWVzc2FnZX1cIiBpcyBzZXQgaW4gdGhlIHJ1bm5lciBjb25maWd1cmF0aW9uLCBlbnRyeXBvaW50cyBtdXN0IGNvbnRhaW4gXCJjaXJjdWl0LmFkZCguLi4pXCIsIHlvdSBtaWdodCBiZSBsb29raW5nIHRvIHVzZSBtYWluQ29tcG9uZW50UGF0aCBpbnN0ZWFkIGlmIHlvdXIgZmlsZSBleHBvcnRzIGEgY29tcG9uZW50LmBcbiAgfVxuXG4gIHJldHVybiBlcnJvclxufVxuIiwgImltcG9ydCB7IENpcmN1aXRSdW5uZXIgfSBmcm9tIFwiLi9DaXJjdWl0UnVubmVyXCJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blRzY2lyY3VpdENvZGUoXG4gIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmcsXG4gIG9wdHM/OiBPbWl0PFBhcmFtZXRlcnM8Q2lyY3VpdFJ1bm5lcltcImV4ZWN1dGVXaXRoRnNNYXBcIl0+WzBdLCBcImZzTWFwXCI+LFxuKSB7XG4gIGlmIChcbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICFmaWxlc3lzdGVtT3JDb2RlU3RyaW5nLmluY2x1ZGVzKFwiZXhwb3J0XCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgXCJleHBvcnRcIiBrZXl3b3JkIHdhc24ndCBmb3VuZCBpbiB5b3VyIHByb3ZpZGVkIGNvZGUuIFlvdSBuZWVkIHRvIGV4cG9ydCBhIGNvbXBvbmVudCBpbiB5b3VyIGNvZGUsIGUuZy5cXG5cXG5leHBvcnQgZGVmYXVsdCAoKSA9PiAoXFxuICA8cmVzaXN0b3IgbmFtZT1cIlIxXCIgcmVzaXN0YW5jZT1cIjFrXCIgLz5cXG4pYCxcbiAgICApXG4gIH1cbiAgY29uc3QgZmlsZXN5c3RlbSA9XG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBcInVzZXItY29kZS50c3hcIjogZmlsZXN5c3RlbU9yQ29kZVN0cmluZyB9XG4gICAgICA6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmdcblxuICBjb25zdCBjaXJjdWl0UnVubmVyID0gbmV3IENpcmN1aXRSdW5uZXIoKVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIuZXhlY3V0ZVdpdGhGc01hcCh7XG4gICAgZnNNYXA6IGZpbGVzeXN0ZW0sXG4gICAgLi4ub3B0cyxcbiAgfSlcblxuICBhd2FpdCBjaXJjdWl0UnVubmVyLnJlbmRlclVudGlsU2V0dGxlZCgpXG5cbiAgcmV0dXJuIGF3YWl0IGNpcmN1aXRSdW5uZXIuZ2V0Q2lyY3VpdEpzb24oKVxufVxuIiwgImltcG9ydCB7IHJ1blRzY2lyY3VpdENvZGUgfSBmcm9tIFwiLi9ydW5Uc2NpcmN1aXRDb2RlXCJcblxuZXhwb3J0IGNvbnN0IHJ1blRzY2lyY3VpdE1vZHVsZSA9IGFzeW5jIChcbiAgbW9kdWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBleHBvcnROYW1lPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBpZiAoIW1vZHVsZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgIG1vZHVsZSA9IGBAdHNjaS8ke21vZHVsZS5yZXBsYWNlKC9cXC8vLCBcIi5cIil9YFxuICB9XG4gIGNvbnN0IGNpcmN1aXRKc29uID0gYXdhaXQgcnVuVHNjaXJjdWl0Q29kZShcbiAgICB7XG4gICAgICAvLyBUT0RPIGhhbmRsZSBleHBvcnRzIHRoYXQgYXJlIG5vdCB0aGUgZGVmYXVsdCBleHBvcnQgYnkgc2Nhbm5pbmdcbiAgICAgIC8vIG90aGVyRXhwb3J0cyBmb3IgY29tcG9uZW50c1xuICAgICAgXCJ1c2VyLWNvZGUudHN4XCI6IGBcbiAgICBpbXBvcnQgTW9kdWxlLCAqIGFzIG90aGVyRXhwb3J0cyBmcm9tIFwiJHttb2R1bGV9XCI7XG5cbiAgICBsZXQgZXhwb3J0TmFtZSA9IFwiJHtvcHRzLmV4cG9ydE5hbWUgPz8gXCJcIn1cIlxuXG4gICAgaWYgKCghTW9kdWxlIHx8IHR5cGVvZiBNb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgJiYgIUJvb2xlYW4oZXhwb3J0TmFtZSkpIHtcbiAgICAgIGV4cG9ydE5hbWUgPSBPYmplY3Qua2V5cyhvdGhlckV4cG9ydHMpLmZpbHRlcihrZXkgPT4ga2V5WzBdID09PSBrZXlbMF0udG9VcHBlckNhc2UoKSAmJiB0eXBlb2Ygb3RoZXJFeHBvcnRzW2tleV0gPT09IFwiZnVuY3Rpb25cIilbMF1cbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gZXhwb3J0TmFtZSA/IG90aGVyRXhwb3J0c1tleHBvcnROYW1lXSA6IE1vZHVsZVxuXG4gICAgaWYgKCFkZWZhdWx0RXhwb3J0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXFxgTm8gZXhwb3J0IGZvdW5kIGZvciBtb2R1bGUgXCJcXCR7bW9kdWxlfVwiICh0cmllZCBcIlxcJHtleHBvcnROYW1lID8/IFwiZGVmYXVsdFwifVwiKVxcYClcbiAgICB9XG5cbiAgICBleHBvcnQgZGVmYXVsdCBkZWZhdWx0RXhwb3J0O1xuICAgIGAsXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWluQ29tcG9uZW50UHJvcHM6IG9wdHMucHJvcHMsXG4gICAgfSxcbiAgKVxuICByZXR1cm4gY2lyY3VpdEpzb25cbn1cbiIsICJpbXBvcnQgKiBhcyBDb21saW5rIGZyb20gXCJjb21saW5rXCJcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL2luZGV4XCJcbmltcG9ydCB0eXBlIHtcbiAgSW50ZXJuYWxXZWJXb3JrZXJBcGksXG4gIFdlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIENpcmN1aXRXZWJXb3JrZXIsXG59IGZyb20gXCIuL3NoYXJlZC90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0RXZlbnROYW1lIH0gZnJvbSBcIi4vc2hhcmVkL3R5cGVzXCJcblxuZXhwb3J0IHR5cGUgeyBDaXJjdWl0V2ViV29ya2VyLCBXZWJXb3JrZXJDb25maWd1cmF0aW9uIH1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBUU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSOiBDaXJjdWl0V2ViV29ya2VyIHwgdW5kZWZpbmVkXG4gIH1cbiAgdmFyIFRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVI6IENpcmN1aXRXZWJXb3JrZXIgfCB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNpcmN1aXRXZWJXb3JrZXIgPSBhc3luYyAoXG4gIGNvbmZpZ3VyYXRpb246IFBhcnRpYWw8V2ViV29ya2VyQ29uZmlndXJhdGlvbj4sXG4pOiBQcm9taXNlPENpcmN1aXRXZWJXb3JrZXI+ID0+IHtcbiAgLy8gS2lsbCBleGlzdGluZyBnbG9iYWwgd29ya2VyIGluc3RhbmNlIGlmIHByZXNlbnRcbiAgY29uc3QgZXhpc3RpbmdXb3JrZXIgPSBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVJcbiAgaWYgKGV4aXN0aW5nV29ya2VyICYmIHR5cGVvZiBleGlzdGluZ1dvcmtlci5raWxsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltXb3JrZXJdIEtpbGxpbmcgcHJldmlvdXMgZ2xvYmFsIHdvcmtlciBpbnN0YW5jZS4uLlwiKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhpc3RpbmdXb3JrZXIua2lsbCgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJbV29ya2VyXSBFcnJvciBraWxsaW5nIHByZXZpb3VzIGdsb2JhbCB3b3JrZXIgaW5zdGFuY2U6XCIsXG4gICAgICAgICAgZSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIHRoZSBrZXkgaXMgY2xlYXJlZCBldmVuIGlmIGtpbGwgdGhyb3dzIGFuIGVycm9yXG4gICAgICBpZiAoZ2xvYmFsVGhpcy5UU0NJUkNVSVRfR0xPQkFMX0NJUkNVSVRfV09SS0VSID09PSBleGlzdGluZ1dvcmtlcikge1xuICAgICAgICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBcIltXb3JrZXJdIENyZWF0aW5nIGNpcmN1aXQgd2ViIHdvcmtlciB3aXRoIGNvbmZpZzpcIixcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgKVxuICB9XG5cbiAgbGV0IHdvcmtlckJsb2JVcmwgPVxuICAgIGNvbmZpZ3VyYXRpb24ud2ViV29ya2VyQmxvYlVybCA/PyBjb25maWd1cmF0aW9uLndlYldvcmtlclVybFxuXG4gIGlmICghd29ya2VyQmxvYlVybCkge1xuICAgIGNvbnN0IGNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0B0c2NpcmN1aXQvZXZhbEAke2NvbmZpZ3VyYXRpb24uZXZhbFZlcnNpb24gPz8gXCJsYXRlc3RcIn0vZGlzdC93ZWJ3b3JrZXIvZW50cnlwb2ludC5qc2BcblxuICAgIGNvbnN0IHdvcmtlckJsb2IgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGNkblVybCkudGhlbigocmVzKSA9PiByZXMuYmxvYigpKVxuICAgIHdvcmtlckJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHdvcmtlckJsb2IpXG4gIH1cblxuICBjb25zdCByYXdXb3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlckJsb2JVcmwsIHsgdHlwZTogXCJtb2R1bGVcIiB9KVxuICBsZXQgd29ya2VySW5pdEVycm9yOiBhbnlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiW1dvcmtlcl0gRXJyb3IgaW4gd29ya2VyXCIsIGV2ZW50KVxuICAgIHdvcmtlckluaXRFcnJvciA9IGV2ZW50XG4gIH0pXG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwidW5oYW5kbGVkcmVqZWN0aW9uXCIsIChldmVudCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJbV29ya2VyXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGluIHdvcmtlclwiLCBldmVudClcbiAgfSlcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlZXJyb3JcIiwgKGV2ZW50KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltXb3JrZXJdIE1lc3NhZ2UgZXJyb3IgaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9KVxuICBjb25zdCBlYXJseU1lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmxvZyhcIltXb3JrZXJdIE1lc3NhZ2UgaW4gd29ya2VyXCIsIGV2ZW50KVxuICB9XG4gIHJhd1dvcmtlci5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlYXJseU1lc3NhZ2VIYW5kbGVyKVxuXG4gIC8vIEhhbmRsZSBmZXRjaCByZXF1ZXN0cyBmcm9tIHRoZSB3b3JrZXJcbiAgcmF3V29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGFcbiAgICBpZiAoZGF0YT8udHlwZSAhPT0gXCJ3b3JrZXJfZmV0Y2hcIikgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGRhdGEuaW5wdXQsIGRhdGEuaW5pdClcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KClcbiAgICAgIHJhd1dvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6IFwid29ya2VyX2ZldGNoX3Jlc3VsdFwiLFxuICAgICAgICByZXF1ZXN0SWQ6IGRhdGEucmVxdWVzdElkLFxuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICAgIH0pKCksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICByYXdXb3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICB0eXBlOiBcIndvcmtlcl9mZXRjaF9yZXN1bHRcIixcbiAgICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RJZCxcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgbmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgc3RhY2s6IGVyci5zdGFjayxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9KVxuXG4gIGlmICh3b3JrZXJJbml0RXJyb3IpIHtcbiAgICB0aHJvdyB3b3JrZXJJbml0RXJyb3JcbiAgfVxuXG4gIGNvbnN0IGNvbWxpbmtXb3JrZXIgPSBDb21saW5rLndyYXA8SW50ZXJuYWxXZWJXb3JrZXJBcGk+KHJhd1dvcmtlcilcblxuICByYXdXb3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZWFybHlNZXNzYWdlSGFuZGxlcilcblxuICAvLyBIZWxwZXIgdG8gc2VyaWFsaXplIFJlYWN0IGVsZW1lbnRzIGZvciBjcm9zcy13b3JrZXIgY29tbXVuaWNhdGlvblxuICBmdW5jdGlvbiBzZXJpYWxpemVSZWFjdEVsZW1lbnQoZWxlbWVudDogYW55KTogYW55IHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgdHlwZW9mIGVsZW1lbnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBlbGVtZW50XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBSZWFjdCBlbGVtZW50XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX2lzU2VyaWFsaXplZFJlYWN0RWxlbWVudDogdHJ1ZSxcbiAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICBwcm9wczogc2VyaWFsaXplUHJvcHMoZWxlbWVudC5wcm9wcyksXG4gICAgICAgIGtleTogZWxlbWVudC5rZXksXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcmlhbGl6ZVByb3BzKHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGlmICghcHJvcHMgfHwgdHlwZW9mIHByb3BzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gcHJvcHNcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkOiBhbnkgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzKSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJjaGlsZHJlblwiKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHNlcmlhbGl6ZWQuY2hpbGRyZW4gPSB2YWx1ZS5tYXAoc2VyaWFsaXplUmVhY3RFbGVtZW50KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcmlhbGl6ZWQuY2hpbGRyZW4gPSBzZXJpYWxpemVSZWFjdEVsZW1lbnQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcmlhbGl6ZWRba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVkXG4gIH1cblxuICAvLyBDb25kaXRpb25hbGx5IG92ZXJyaWRlIGdsb2JhbCBmZXRjaCBpbnNpZGUgdGhlIHdvcmtlciB0byByb3V0ZSB0aHJvdWdoIHRoZSBwYXJlbnRcbiAgLy8gT25seSBlbmFibGUgd2hlbiBleHBsaWNpdGx5IHJlcXVlc3RlZCB2aWEgY29uZmlndXJhdGlvblxuICBpZiAoY29uZmlndXJhdGlvbi5lbmFibGVGZXRjaFByb3h5KSB7XG4gICAgcmF3V29ya2VyLnBvc3RNZXNzYWdlKHsgdHlwZTogXCJvdmVycmlkZV9nbG9iYWxfZmV0Y2hcIiB9KVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uc25pcHBldHNBcGlCYXNlVXJsKSB7XG4gICAgYXdhaXQgY29tbGlua1dvcmtlci5zZXRTbmlwcGV0c0FwaUJhc2VVcmwoY29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwpXG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pIHtcbiAgICBhd2FpdCBjb21saW5rV29ya2VyLnNldFBsYXRmb3JtQ29uZmlnKGNvbmZpZ3VyYXRpb24ucGxhdGZvcm0pXG4gIH1cbiAgaWYgKGNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykge1xuICAgIGF3YWl0IGNvbWxpbmtXb3JrZXIuc2V0UHJvamVjdENvbmZpZyhjb25maWd1cmF0aW9uLnByb2plY3RDb25maWcpXG4gIH1cblxuICBsZXQgaXNUZXJtaW5hdGVkID0gZmFsc2VcblxuICAvLyBDcmVhdGUgYSB3cmFwcGVyIHRoYXQgaGFuZGxlcyBldmVudHMgZGlyZWN0bHkgdGhyb3VnaCBjaXJjdWl0IGluc3RhbmNlXG4gIGNvbnN0IHdyYXBwZXI6IENpcmN1aXRXZWJXb3JrZXIgPSB7XG4gICAgY2xlYXJFdmVudExpc3RlbmVyczogY29tbGlua1dvcmtlci5jbGVhckV2ZW50TGlzdGVuZXJzLmJpbmQoY29tbGlua1dvcmtlciksXG4gICAgZW5hYmxlRGVidWc6IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNpcmN1aXRXZWJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQsIGNhbid0IGVuYWJsZURlYnVnXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5lbmFibGVEZWJ1Zy5iaW5kKGNvbWxpbmtXb3JrZXIpKC4uLmFyZ3MpXG4gICAgfSxcbiAgICB2ZXJzaW9uOiBjb21saW5rV29ya2VyLnZlcnNpb24uYmluZChjb21saW5rV29ya2VyKSxcbiAgICBleGVjdXRlOiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlXCIpXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIGV4ZWN1dGVDb21wb25lbnQ6IGFzeW5jIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGlzVGVybWluYXRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDaXJjdWl0V2ViV29ya2VyIHdhcyB0ZXJtaW5hdGVkLCBjYW4ndCBleGVjdXRlQ29tcG9uZW50XCIsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCBwYXNzIGl0IGFzLWlzICh3aWxsIGJlIHByb3hpZWQgYnkgQ29tbGluaylcbiAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNvbWxpbmtXb3JrZXIuZXhlY3V0ZUNvbXBvbmVudC5iaW5kKGNvbWxpbmtXb3JrZXIpKGNvbXBvbmVudClcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBhIFJlYWN0IGVsZW1lbnQsIHNlcmlhbGl6ZSBpdCB0byBhIHJlY29uc3RydWN0YWJsZSBmb3JtYXRcbiAgICAgIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBjb21wb25lbnQudHlwZSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkRWxlbWVudCA9IHNlcmlhbGl6ZVJlYWN0RWxlbWVudChjb21wb25lbnQpXG4gICAgICAgIHJldHVybiBjb21saW5rV29ya2VyLmV4ZWN1dGVDb21wb25lbnQuYmluZChjb21saW5rV29ya2VyKShcbiAgICAgICAgICBzZXJpYWxpemVkRWxlbWVudCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlQ29tcG9uZW50LmJpbmQoY29tbGlua1dvcmtlcikoY29tcG9uZW50KVxuICAgIH0sXG4gICAgZXhlY3V0ZVdpdGhGc01hcDogYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChpc1Rlcm1pbmF0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2lyY3VpdFdlYldvcmtlciB3YXMgdGVybWluYXRlZCwgY2FuJ3QgZXhlY3V0ZVdpdGhGc01hcFwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gY29tbGlua1dvcmtlci5leGVjdXRlV2l0aEZzTWFwLmJpbmQoY29tbGlua1dvcmtlcikoLi4uYXJncylcbiAgICB9LFxuICAgIHJlbmRlclVudGlsU2V0dGxlZDogY29tbGlua1dvcmtlci5yZW5kZXJVbnRpbFNldHRsZWQuYmluZChjb21saW5rV29ya2VyKSxcbiAgICBnZXRDaXJjdWl0SnNvbjogY29tbGlua1dvcmtlci5nZXRDaXJjdWl0SnNvbi5iaW5kKGNvbWxpbmtXb3JrZXIpLFxuICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3QgcHJveGllZENhbGxiYWNrID0gQ29tbGluay5wcm94eShjYWxsYmFjaylcbiAgICAgIGNvbWxpbmtXb3JrZXIub24oZXZlbnQgYXMgUm9vdENpcmN1aXRFdmVudE5hbWUsIHByb3hpZWRDYWxsYmFjaylcbiAgICB9LFxuICAgIGtpbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbWxpbmtXb3JrZXJbQ29tbGluay5yZWxlYXNlUHJveHldKClcbiAgICAgIHJhd1dvcmtlci50ZXJtaW5hdGUoKVxuICAgICAgaXNUZXJtaW5hdGVkID0gdHJ1ZVxuICAgICAgaWYgKGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9PT0gd3JhcHBlcikge1xuICAgICAgICBnbG9iYWxUaGlzLlRTQ0lSQ1VJVF9HTE9CQUxfQ0lSQ1VJVF9XT1JLRVIgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9LFxuICB9XG4gIDsod3JhcHBlciBhcyBhbnkpLl9fcmF3V29ya2VyID0gcmF3V29ya2VyXG4gIGdsb2JhbFRoaXMuVFNDSVJDVUlUX0dMT0JBTF9DSVJDVUlUX1dPUktFUiA9IHdyYXBwZXJcbiAgcmV0dXJuIHdyYXBwZXJcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL3J1bm5lci9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCBjb25zdCBnZXRQb3NzaWJsZUVudHJ5cG9pbnRDb21wb25lbnRQYXRocyA9IChcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW3BhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZzTWFwKSkge1xuICAgIG5vcm1hbGl6ZWRGc01hcFtub3JtYWxpemVGaWxlUGF0aChwYXRoKV0gPSBjb250ZW50XG4gIH1cblxuICBjb25zdCBwb3NzaWJsZSA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgaWYgKFwidHNjaXJjdWl0LmNvbmZpZy5qc29uXCIgaW4gbm9ybWFsaXplZEZzTWFwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2Uobm9ybWFsaXplZEZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdKVxuICAgICAgaWYgKHR5cGVvZiBjb25maWcubWFpbkVudHJ5cG9pbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcG9zc2libGUuYWRkKG5vcm1hbGl6ZUZpbGVQYXRoKGNvbmZpZy5tYWluRW50cnlwb2ludCkpXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBpZ25vcmUgKi9cbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEZzTWFwW1wiaW5kZXgudHN4XCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c3hcIilcbiAgaWYgKG5vcm1hbGl6ZWRGc01hcFtcImluZGV4LnRzXCJdKSBwb3NzaWJsZS5hZGQoXCJpbmRleC50c1wiKVxuXG4gIGNvbnN0IGNpcmN1aXRGaWxlcyA9IE9iamVjdC5rZXlzKG5vcm1hbGl6ZWRGc01hcCkuZmlsdGVyKChrKSA9PlxuICAgIGsuZW5kc1dpdGgoXCIuY2lyY3VpdC50c3hcIiksXG4gIClcbiAgZm9yIChjb25zdCBmaWxlIG9mIGNpcmN1aXRGaWxlcykge1xuICAgIHBvc3NpYmxlLmFkZChmaWxlKVxuICB9XG5cbiAgY29uc3QgdHN4RmlsZXMgPSBPYmplY3Qua2V5cyhub3JtYWxpemVkRnNNYXApLmZpbHRlcigoaykgPT5cbiAgICBrLmVuZHNXaXRoKFwiLnRzeFwiKSxcbiAgKVxuICBpZiAodHN4RmlsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcG9zc2libGUuYWRkKHRzeEZpbGVzWzBdKVxuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20ocG9zc2libGUpXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxtQkFBbUI7QUFFNUIsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSxXQUFXO0FBQ3ZCLFlBQVksd0JBQXdCOzs7QUNDN0IsSUFBTSxnQ0FBZ0MsQ0FDM0MsbUJBQ3VCO0FBRXZCLE1BQUksUUFBUSxlQUFlLE1BQU0sZ0JBQWdCO0FB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QkFBaUIsS0FBSyxhQUFhLEVBQUUsR0FBRyxJQUFJO0FBQUEsSUFDbkU7QUFBQSxJQUNBLG9CQUFvQixjQUFjLG1CQUFtQixLQUFLLGFBQWE7QUFBQSxJQUN2RSxnQkFBZ0IsY0FBYyxlQUFlLEtBQUssYUFBYTtBQUFBLElBQy9ELElBQUksQ0FBQyxPQUFlLGFBQXVDO0FBQ3pELFlBQU0sa0JBQTBCLGNBQU0sUUFBUTtBQUM5QyxvQkFBYyxHQUFHLE9BQStCLGVBQWU7QUFBQSxJQUNqRTtBQUFBLElBQ0EsTUFBTSxZQUFZO0FBQ2hCLG9CQUFzQixvQkFBWSxFQUFFO0FBQ3BDLGdCQUFVLFVBQVU7QUFDcEIscUJBQWU7QUFDZixVQUFJLFdBQVcsb0NBQW9DLFNBQVM7QUFDMUQsbUJBQVcsa0NBQWtDO0FBQUEsTUFDL0M7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNDLEVBQUMsUUFBZ0IsY0FBYztBQUNoQyxhQUFXLGtDQUFrQztBQUM3QyxTQUFPO0FBQ1Q7OztBQ25QTyxJQUFNLHNDQUFzQyxDQUNqRCxVQUNhO0FBQ2IsUUFBTSxrQkFBMEMsQ0FBQztBQUNqRCxhQUFXLENBQUMsTUFBTSxPQUFPLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUNuRCxvQkFBZ0Isa0JBQWtCLElBQUksQ0FBQyxJQUFJO0FBQUEsRUFDN0M7QUFFQSxRQUFNLFdBQVcsb0JBQUksSUFBWTtBQUVqQyxNQUFJLDJCQUEyQixpQkFBaUI7QUFDOUMsUUFBSTtBQUNGLFlBQU0sU0FBUyxLQUFLLE1BQU0sZ0JBQWdCLHVCQUF1QixDQUFDO0FBQ2xFLFVBQUksT0FBTyxPQUFPLG1CQUFtQixVQUFVO0FBQzdDLGlCQUFTLElBQUksa0JBQWtCLE9BQU8sY0FBYyxDQUFDO0FBQUEsTUFDdkQ7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUVBLE1BQUksZ0JBQWdCLFdBQVcsRUFBRyxVQUFTLElBQUksV0FBVztBQUMxRCxNQUFJLGdCQUFnQixVQUFVLEVBQUcsVUFBUyxJQUFJLFVBQVU7QUFFeEQsUUFBTSxlQUFlLE9BQU8sS0FBSyxlQUFlLEVBQUU7QUFBQSxJQUFPLENBQUMsTUFDeEQsRUFBRSxTQUFTLGNBQWM7QUFBQSxFQUMzQjtBQUNBLGFBQVcsUUFBUSxjQUFjO0FBQy9CLGFBQVMsSUFBSSxJQUFJO0FBQUEsRUFDbkI7QUFFQSxRQUFNLFdBQVcsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQU8sQ0FBQyxNQUNwRCxFQUFFLFNBQVMsTUFBTTtBQUFBLEVBQ25CO0FBQ0EsTUFBSSxTQUFTLFdBQVcsR0FBRztBQUN6QixhQUFTLElBQUksU0FBUyxDQUFDLENBQUM7QUFBQSxFQUMxQjtBQUVBLFNBQU8sTUFBTSxLQUFLLFFBQVE7QUFDNUI7IiwKICAibmFtZXMiOiBbIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImltcG9ydE5hbWUiLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiZGVidWciXQp9Cg==