cdk-nextjs 0.7.9 → 0.7.11

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.
Files changed (54) hide show
  1. package/.jsii +3 -3
  2. package/README.md +1 -1
  3. package/docs/harness-coverage.md +1 -1
  4. package/docs/nextjs-private-apis.md +128 -0
  5. package/lib/adapter/adapter.mjs +276 -24
  6. package/lib/adapter/build-outputs.d.ts +1 -1
  7. package/lib/adapter/build-outputs.js +29 -13
  8. package/lib/adapter/build-outputs.test.js +35 -7
  9. package/lib/adapter/cache-handler.d.ts +1 -1
  10. package/lib/adapter/cache-handler.js +1 -1
  11. package/lib/adapter/cache-kinds.d.ts +12 -1
  12. package/lib/adapter/cache-kinds.js +16 -4
  13. package/lib/adapter/init-cache.js +7 -7
  14. package/lib/adapter/local-file-cache-handler.d.ts +1 -1
  15. package/lib/adapter/local-file-cache-handler.js +1 -1
  16. package/lib/adapter/memory-cache-handler.d.ts +2 -2
  17. package/lib/adapter/memory-cache-handler.js +1 -1
  18. package/lib/adapter/s3-cache-handler.d.ts +2 -2
  19. package/lib/adapter/s3-cache-handler.js +1 -1
  20. package/lib/adapter/use-cache-common.d.ts +1 -1
  21. package/lib/adapter/use-cache-common.js +1 -1
  22. package/lib/adapter/use-cache-common.test.js +1 -1
  23. package/lib/adapter/use-cache-default-handler.d.ts +1 -1
  24. package/lib/adapter/use-cache-default-handler.js +1 -1
  25. package/lib/adapter/use-cache-handlers.test.js +1 -1
  26. package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
  27. package/lib/adapter/use-cache-remote-handler.js +1 -1
  28. package/lib/cdk-nextjs-version.d.ts +10 -0
  29. package/lib/cdk-nextjs-version.js +15 -0
  30. package/lib/nextjs-api.js +1 -1
  31. package/lib/nextjs-build/nextjs-build.js +7 -6
  32. package/lib/nextjs-build/nextjs-build.test.js +16 -3
  33. package/lib/nextjs-cache.js +1 -1
  34. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  35. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  36. package/lib/nextjs-distribution.js +5 -5
  37. package/lib/nextjs-post-deploy.js +1 -1
  38. package/lib/nextjs-static-assets.js +1 -1
  39. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  40. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  41. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  42. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  43. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  44. package/lib/runtime/core.test.js +17 -8
  45. package/lib/runtime/dispatch.js +4 -5
  46. package/lib/runtime/image.js +43 -32
  47. package/lib/runtime/image.test.js +27 -26
  48. package/lib/runtime/lambda.mjs +276 -36
  49. package/lib/runtime/manifest.d.ts +34 -8
  50. package/lib/runtime/manifest.js +7 -5
  51. package/lib/runtime/server.mjs +276 -36
  52. package/package.json +1 -1
  53. package/scripts/capture-adapter-fixture.mjs +13 -1
  54. package/scripts/zero-config-build.mjs +5 -1
@@ -7,8 +7,10 @@ const node_fs_1 = require("node:fs");
7
7
  const promises_1 = require("node:fs/promises");
8
8
  const node_module_1 = require("node:module");
9
9
  const node_path_1 = require("node:path");
10
+ const node_url_1 = require("node:url");
10
11
  const cache_utils_1 = require("./cache-utils");
11
12
  const function_groups_1 = require("./function-groups");
13
+ const cdk_nextjs_version_1 = require("../cdk-nextjs-version");
12
14
  const constants_1 = require("../constants");
13
15
  const manifest_1 = require("../runtime/manifest");
14
16
  const deployment_build_id_1 = require("../utils/deployment-build-id");
@@ -36,15 +38,11 @@ const RUNTIME_NEXT_MODULES = [
36
38
  "next/dist/server/lib/router-utils/instrumentation-globals.external.js",
37
39
  ];
38
40
  /**
39
- * next's image optimizer and the config helpers around it
40
- * (`src/runtime/image.ts`), whose closure is what brings `sharp` in. Only the
41
- * `default` group gets them: the edge sends every `/_next/image` request there.
41
+ * next's image optimizer (`src/runtime/image.ts`), whose closure is what brings
42
+ * `sharp` in. Only the `default` group gets it: the edge sends every
43
+ * `/_next/image` request there.
42
44
  */
43
- const IMAGE_NEXT_MODULES = [
44
- "next/dist/server/config-shared.js",
45
- "next/dist/shared/lib/image-config.js",
46
- "next/dist/server/image-optimizer.js",
47
- ];
45
+ const IMAGE_NEXT_MODULES = ["next/dist/server/image-optimizer.js"];
48
46
  /**
49
47
  * The file tracer `next build` itself uses, reached through the app's own `next`
50
48
  * so that it is the version that matches the files being traced. Not a
@@ -165,7 +163,7 @@ function buildAdapterManifest(ctx, options = {}) {
165
163
  })
166
164
  : undefined;
167
165
  const manifest = {
168
- version: manifest_1.ADAPTER_MANIFEST_VERSION,
166
+ cdkNextjsVersion: cdk_nextjs_version_1.CDK_NEXTJS_VERSION,
169
167
  buildId: ctx.buildId,
170
168
  relativeProjectDir: toPosix((0, node_path_1.relative)(repoRoot, ctx.projectDir)),
171
169
  config: {
@@ -177,6 +175,10 @@ function buildAdapterManifest(ctx, options = {}) {
177
175
  generateEtags: ctx.config.generateEtags !== false,
178
176
  i18n: ctx.config.i18n ?? null,
179
177
  deploymentId: (ctx.config.deploymentId ?? "").replace(/[^A-Za-z0-9_-]/g, "-"),
178
+ images: ctx.config.images,
179
+ experimental: JSON.parse(JSON.stringify(ctx.config.experimental ?? {})),
180
+ cacheHandler: distRelativeCacheHandler(ctx),
181
+ cacheMaxMemorySize: ctx.config.cacheMaxMemorySize,
180
182
  },
181
183
  routing: ctx.routing,
182
184
  pathnames,
@@ -680,6 +682,21 @@ function buildMiddleware(repoRoot, middleware) {
680
682
  filePath: toPosix((0, node_path_1.relative)(repoRoot, middleware.filePath)),
681
683
  };
682
684
  }
685
+ /**
686
+ * `cacheHandler` relative to the dist dir, as `next build` writes it into
687
+ * `required-server-files.json` (`build/index.js`, via
688
+ * `resolveCacheHandlerPathToFilesystem`): `ctx.config` has the build machine's
689
+ * absolute path, and the runtime resolves this against its own dist dir.
690
+ */
691
+ function distRelativeCacheHandler(ctx) {
692
+ const { cacheHandler } = ctx.config;
693
+ if (!cacheHandler)
694
+ return null;
695
+ const path = cacheHandler.startsWith("file://")
696
+ ? (0, node_url_1.fileURLToPath)(cacheHandler)
697
+ : cacheHandler;
698
+ return toPosix((0, node_path_1.relative)(ctx.distDir, (0, node_path_1.resolve)(ctx.projectDir, path)));
699
+ }
683
700
  /**
684
701
  * Copy the staging plan into `stagingDir`.
685
702
  *
@@ -834,9 +851,8 @@ async function addRuntimeNextClosure(ctx, staging, imageStaging) {
834
851
  * static files, and the distribution's catch-all.
835
852
  *
836
853
  * Its absence is not a partial failure: `loadRuntime` probes for exactly this file
837
- * before it will serve anything, and `image.ts` reads the image config out of it,
838
- * so the whole root answers "the deployment package is incomplete". Cheap to make
839
- * unconditional, so make it unconditional.
854
+ * before it will serve anything, so the whole root answers "the deployment package
855
+ * is incomplete". Cheap to make unconditional, so make it unconditional.
840
856
  *
841
857
  * Not traced like {@link RUNTIME_NEXT_MODULES}, because it is data rather than a
842
858
  * module: nothing `require`s it, so no file tracer can find it.
@@ -876,4 +892,4 @@ function toPosix(path) {
876
892
  function sortedUnique(values) {
877
893
  return [...new Set(values)].sort();
878
894
  }
879
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtb3V0cHV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2J1aWxkLW91dHB1dHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2S0EsOENBNENDO0FBd0JELG9EQW1JQztBQXBYRCxzREFBc0Q7QUFDdEQscUNBQThEO0FBQzlELCtDQVEwQjtBQUMxQiw2Q0FBNEM7QUFDNUMseUNBQWtFO0FBRWxFLCtDQUFtRDtBQUNuRCx1REFPMkI7QUFDM0IsNENBQTBDO0FBQzFDLGtEQVc2QjtBQUM3QixzRUFBaUU7QUFtQmpFOzs7OztHQUtHO0FBQ0gsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUU5Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQUc7SUFDM0Isa0NBQWtDO0lBQ2xDLHVFQUF1RTtDQUN4RSxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsbUNBQW1DO0lBQ25DLHNDQUFzQztJQUN0QyxxQ0FBcUM7Q0FDdEMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxnQ0FBZ0MsQ0FBQztBQXVFMUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FDckMsR0FBeUIsRUFDekIsVUFBK0IsRUFBRTtJQUVqQyxNQUFNLFVBQVUsR0FBRyxJQUFBLGdCQUFJLEVBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSwyQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUEsZ0JBQUksRUFBQyxVQUFVLEVBQUUsNkJBQWtCLENBQUMsQ0FBQztJQUUxRCxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVoRSw4RUFBOEU7SUFDOUUsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxNQUFNLGNB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OUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLE1BQWM7SUFDbkQsSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlELE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxzQkFBVSx3QkFBd0IsTUFBTSxnQ0FBZ0M7WUFDekUsSUFBSSxHQUFHLCtDQUErQztZQUN0RCxvRUFBb0UsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLEdBQUcsS0FBSywyQkFBZ0IsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsMkJBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FDYixHQUFHLHNCQUFVLHdCQUF3QixNQUFNLGdDQUFnQztZQUN6RSxJQUFJLEdBQUcsV0FBVywyQkFBZ0Isc0NBQXNDO1lBQ3hFLGdCQUFnQixDQUNuQixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxJQUFZO0lBQzNCLE9BQU8sZUFBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsTUFBZ0I7SUFDcEMsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBleGlzdHNTeW5jLCBsc3RhdFN5bmMsIHJlYWxwYXRoU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQge1xuICBjb3B5RmlsZSxcbiAgY3AsXG4gIG1rZGlyLFxuICByZWFkbGluayxcbiAgcm0sXG4gIHN5bWxpbmssXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlLCByZXNvbHZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBOZXh0QWRhcHRlciB9IGZyb20gXCJuZXh0XCI7XG5pbXBvcnQgeyBNQVhfQlVJTERfSURfQllURVMgfSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVIsXG4gIEZ1bmN0aW9uR3JvdXBTcGVjLFxuICBhc3NlcnROb0kxOG5TcGxpdHRpbmcsXG4gIGFzc2lnblJvdXRlc1RvR3JvdXBzLFxuICBwYXJzZUZ1bmN0aW9uR3JvdXBzRW52LFxufSBmcm9tIFwiLi9mdW5jdGlvbi1ncm91cHNcIjtcbmltcG9ydCB7IExPR19QUkVGSVggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBBREFQVEVSX0RJUl9OQU1FLFxuICBBREFQVEVSX01BTklGRVNUX1ZFUlNJT04sXG4gIEFkYXB0ZXJFbnRyeXBvaW50LFxuICBBZGFwdGVyRW50cnlwb2ludFR5cGUsXG4gIEFkYXB0ZXJNYW5pZmVzdCxcbiAgQWRhcHRlck1pZGRsZXdhcmUsXG4gIEVSUk9SX1BBR0VfU1VGRklYRVMsXG4gIE1BTklGRVNUX0ZJTEVfTkFNRSxcbiAgUlVOVElNRV9ESVJfTkFNRSxcbiAgZ3JvdXBTdGFnaW5nRGlyTmFtZSxcbn0gZnJvbSBcIi4uL3J1bnRpbWUvbWFuaWZlc3RcIjtcbmltcG9ydCB7IGRlcGxveW1lbnRCdWlsZElkIH0gZnJvbSBcIi4uL3V0aWxzL2RlcGxveW1lbnQtYnVpbGQtaWRcIjtcblxuLyoqXG4gKiBUaGUgYG9uQnVpbGRDb21wbGV0ZWAgYXJndW1lbnQuIERlcml2ZWQgZnJvbSB0aGUgYG5leHRgIHR5cGluZ3MgcmF0aGVyIHRoYW5cbiAqIHJlc3RhdGVkIHNvIGEgYG5leHRgIGJ1bXAgc3VyZmFjZXMgYXMgYSBjb21waWxlIGVycm9yIGhlcmUuXG4gKi9cbmV4cG9ydCB0eXBlIEJ1aWxkQ29tcGxldGVDb250ZXh0ID0gUGFyYW1ldGVyczxcbiAgTm9uTnVsbGFibGU8TmV4dEFkYXB0ZXJbXCJvbkJ1aWxkQ29tcGxldGVcIl0+XG4+WzBdO1xuXG50eXBlIEFkYXB0ZXJPdXRwdXRzID0gQnVpbGRDb21wbGV0ZUNvbnRleHRbXCJvdXRwdXRzXCJdO1xuLyoqIEFueSBvdXRwdXQgdGhhdCB3ZSBpbnZva2UgYXQgcmVxdWVzdCB0aW1lLCBpLmUuIG5vdCBhIHByZXJlbmRlci9zdGF0aWMgZmlsZS4gKi9cbnR5cGUgSW52b2NhYmxlT3V0cHV0ID1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcInBhZ2VzXCJdW251bWJlcl1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcInBhZ2VzQXBpXCJdW251bWJlcl1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcImFwcFBhZ2VzXCJdW251bWJlcl1cbiAgfCBBZGFwdGVyT3V0cHV0c1tcImFwcFJvdXRlc1wiXVtudW1iZXJdXG4gIHwgTm9uTnVsbGFibGU8QWRhcHRlck91dHB1dHNbXCJtaWRkbGV3YXJlXCJdPjtcblxuLyoqXG4gKiBFbnYgZmlsZXMgYHdyaXRlU3RhbmRhbG9uZURpcmVjdG9yeWAgY29waWVzIGludG8gdGhlIHN0YW5kYWxvbmUgdHJlZSBhbmQgdGhhdFxuICogYG9uQnVpbGRDb21wbGV0ZWAgaGFzIG5vIGVxdWl2YWxlbnQgZm9yLiBEcm9wcGluZyBgb3V0cHV0OiBcInN0YW5kYWxvbmVcImBcbiAqIHNpbGVudGx5IGRyb3BzIHRoZXNlIHVubGVzcyB3ZSBzdGFnZSB0aGVtIG91cnNlbHZlcy5cbiAqIEBzZWUgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2FwaS1yZWZlcmVuY2UvY29uZmlnL25leHQtY29uZmlnLWpzL291dHB1dFxuICovXG5jb25zdCBFTlZfRklMRVMgPSBbXCIuZW52XCIsIFwiLmVudi5wcm9kdWN0aW9uXCJdO1xuXG4vKipcbiAqIGBuZXh0YCBzdWJtb2R1bGVzIHRoZSAqcnVudGltZSogcmVxdWlyZXMgdGhhdCBubyBhcHAgZXZlciByZWFjaGVzLCBzb1xuICogYG5leHQgYnVpbGRgJ3Mgb3duIHRyYWNlIG5ldmVyIGNvdmVycyB0aGVtLiBUaGV5IGFyZSByZXF1aXJlZCBmcm9tIHRoZSBhcHAnc1xuICogYG5leHRgIHJhdGhlciB0aGFuIGJ1bmRsZWQsIGRlbGliZXJhdGVseSDigJQgc2VlIGBzcmMvcnVudGltZS9uZXh0LW1vZHVsZXMudHNgXG4gKiDigJQgd2hpY2ggbWFrZXMgc3RhZ2luZyB0aGVpciBjbG9zdXJlIHRoaXMgbW9kdWxlJ3Mgam9iLlxuICpcbiAqIGBzZXJ2ZS1zdGF0aWNgIGlzIGluIGV2ZXJ5IGdyb3VwOiBgc2VydmVTdGF0aWNGaWxlYFxuICogKGBzcmMvcnVudGltZS9zdGF0aWMtZmlsZXMudHNgKSBzZXJ2ZXMgcHJlcmVuZGVyZWQgYW5kIHN0YXRpYyByZXN1bHRzIHdpdGggaXRcbiAqIHdoZXJldmVyIHRoZXkgbGFuZC4gYGluc3RydW1lbnRhdGlvbi1nbG9iYWxzYCBpcyByZXF1aXJlZCBieSBgbG9hZFJ1bnRpbWVgXG4gKiBvbiBldmVyeSBjb2xkIHN0YXJ0IChgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25gKSwgc28gaXQgaXMgc3RhZ2VkIGhlcmUgcmF0aGVyXG4gKiB0aGFuIHRydXN0ZWQgdG8gZWFjaCBncm91cCdzIGVudHJ5cG9pbnQgdHJhY2UuXG4gKi9cbmNvbnN0IFJVTlRJTUVfTkVYVF9NT0RVTEVTID0gW1xuICBcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIsXG4gIFwibmV4dC9kaXN0L3NlcnZlci9saWIvcm91dGVyLXV0aWxzL2luc3RydW1lbnRhdGlvbi1nbG9iYWxzLmV4dGVybmFsLmpzXCIsXG5dO1xuXG4vKipcbiAqIG5leHQncyBpbWFnZSBvcHRpbWl6ZXIgYW5kIHRoZSBjb25maWcgaGVscGVycyBhcm91bmQgaXRcbiAqIChgc3JjL3J1bnRpbWUvaW1hZ2UudHNgKSwgd2hvc2UgY2xvc3VyZSBpcyB3aGF0IGJyaW5ncyBgc2hhcnBgIGluLiBPbmx5IHRoZVxuICogYGRlZmF1bHRgIGdyb3VwIGdldHMgdGhlbTogdGhlIGVkZ2Ugc2VuZHMgZXZlcnkgYC9fbmV4dC9pbWFnZWAgcmVxdWVzdCB0aGVyZS5cbiAqL1xuY29uc3QgSU1BR0VfTkVYVF9NT0RVTEVTID0gW1xuICBcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiLFxuICBcIm5leHQvZGlzdC9zaGFyZWQvbGliL2ltYWdlLWNvbmZpZy5qc1wiLFxuICBcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIsXG5dO1xuXG4vKipcbiAqIFRoZSBmaWxlIHRyYWNlciBgbmV4dCBidWlsZGAgaXRzZWxmIHVzZXMsIHJlYWNoZWQgdGhyb3VnaCB0aGUgYXBwJ3Mgb3duIGBuZXh0YFxuICogc28gdGhhdCBpdCBpcyB0aGUgdmVyc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGZpbGVzIGJlaW5nIHRyYWNlZC4gTm90IGFcbiAqIGRlcGVuZGVuY3kgb2YgY2RrLW5leHRqczogYnVuZGxpbmcgYSBzZWNvbmQgY29weSBvZiBgQHZlcmNlbC9uZnRgIGludG8gdGhlXG4gKiBwdWJsaXNoZWQgYWRhcHRlciB3b3VsZCBhZGQgbWVnYWJ5dGVzIHRvIGV2ZXJ5IGluc3RhbGwgdG8gZG8gdGhlIHNhbWUgam9iLlxuICovXG5jb25zdCBORVhUX0ZJTEVfVFJBQ0VSID0gXCJuZXh0L2Rpc3QvY29tcGlsZWQvQHZlcmNlbC9uZnRcIjtcblxuLyoqIFRoZSBzdWJzZXQgb2YgYG5vZGVGaWxlVHJhY2VgIHRoaXMgbW9kdWxlIHVzZXMuICovXG50eXBlIE5vZGVGaWxlVHJhY2UgPSAoXG4gIGZpbGVzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogeyBiYXNlOiBzdHJpbmcgfSxcbikgPT4gUHJvbWlzZTx7IGZpbGVMaXN0OiBTZXQ8c3RyaW5nPiB9PjtcblxuLyoqXG4gKiBTdGFnaW5nIGtleSAocmVwby1yb290LXJlbGF0aXZlIFBPU0lYKSDihpIgYWJzb2x1dGUgc291cmNlIHBhdGggb24gdGhlIGJ1aWxkXG4gKiBtYWNoaW5lLiBUaGUgZGVkdXBlZCB1bmlvbiB0aGF0IHJlcGxhY2VzIHRoZSBzdGFuZGFsb25lIHRyZWUuXG4gKi9cbmV4cG9ydCB0eXBlIFN0YWdpbmdQbGFuID0gUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3V0cHV0c09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSBgbmV4dCBidWlsZGAgd2FzIGludm9rZWQgZnJvbS4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuY3dkKClgLFxuICAgKiB3aGljaCBpcyB0aGUgcmVhbCBhbnN3ZXIgaW5zaWRlIGBvbkJ1aWxkQ29tcGxldGVgOyBhIHBhcmFtZXRlciBvbmx5IHNvIHRoZVxuICAgKiB1bml0IHRlc3RzIGNhbiBkcml2ZSB0aGUgZml4dHVyZXMnIHN5bnRoZXRpYyBwcm9qZWN0IGRpcnMuXG4gICAqL1xuICByZWFkb25seSBidWlsZEN3ZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlc29sdmVkIGBmdW5jdGlvbkdyb3Vwc2AuIERlZmF1bHRzIHRvIHtAbGluayBGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUn0sXG4gICAqIHdoaWNoIGlzIGhvdyB0aGUgY29uc3RydWN0cyBnZXQgdGhlbSBoZXJlOiBgb25CdWlsZENvbXBsZXRlYCBydW5zIGluc2lkZVxuICAgKiBgbmV4dCBidWlsZGAgYW5kIGNhbm5vdCByZWFkIENESyBwcm9wcy5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgbWVhbnMgb25lIGRlcGxveW1lbnQgcm9vdCBob2xkaW5nIGV2ZXJ5IHJvdXRlLCB3aGljaCBpcyB0aGVcbiAgICogZGVmYXVsdCBhbmQgdGhlIG9ubHkgdGhpbmcgdGhlIENvbnRhaW5lcnMgdHlwZXMgZXZlciBkby5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uR3JvdXBzPzogRnVuY3Rpb25Hcm91cFNwZWNbXTtcbn1cblxuLyoqIE9uZSBkZXBsb3ltZW50IHJvb3Q6IHRoZSBzdGFnaW5nIHBsYW4gZm9yIGl0LCBhbmQgd2hlcmUgaXQgZ29lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VkR3JvdXAge1xuICAvKipcbiAgICogR3JvdXAgbmFtZSwgYGRlZmF1bHRgIGZvciB0aGUgaW1wbGljaXQgZ3JvdXAuIEFsd2F5cyBwcmVzZW50IOKAlCBhIGJ1aWxkIHdpdGhcbiAgICogbm8gYGZ1bmN0aW9uR3JvdXBzYCBwcm9kdWNlcyBleGFjdGx5IG9uZSB7QGxpbmsgU3RhZ2VkR3JvdXB9IG5hbWVkIGBkZWZhdWx0YCxcbiAgICogc28gY2FsbGVycyBuZXZlciBicmFuY2ggb24gXCJpcyB0aGlzIHNwbGl0XCIuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgaW5zaWRlIGBjZGstbmV4dGpzLWFkYXB0ZXJgLCBQT1NJWDogYGFwcGAgd2hlbiBub3Qgc3BsaXR0aW5nLFxuICAgKiBgZ3JvdXBzLzxuYW1lPmAgd2hlbiBzcGxpdHRpbmcuXG4gICAqL1xuICByZWFkb25seSBkaXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YWdpbmc6IFN0YWdpbmdQbGFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQWRhcHRlck1hbmlmZXN0UmVzdWx0IHtcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqIE9uZSBlbnRyeSBwZXIgZGVwbG95bWVudCByb290IHRvIHN0YWdlLiBMZW5ndGggMSB1bmxlc3Mgc3BsaXR0aW5nLiAqL1xuICByZWFkb25seSBncm91cHM6IFN0YWdlZEdyb3VwW107XG59XG5cbi8qKiBBIHN0YWdlZCBkZXBsb3ltZW50IHJvb3Qgb24gZGlzay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhZ2VkR3JvdXBSZXN1bHQge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IHJvb3QuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgZmlsZUNvdW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVCdWlsZE91dHB1dHNSZXN1bHQgZXh0ZW5kcyBCdWlsZEFkYXB0ZXJNYW5pZmVzdFJlc3VsdCB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIGA8ZGlzdERpcj4vY2RrLW5leHRqcy1hZGFwdGVyYC4gKi9cbiAgcmVhZG9ubHkgYWRhcHRlckRpcjogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgd3JpdHRlbiBtYW5pZmVzdC4gKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RQYXRoOiBzdHJpbmc7XG4gIC8qKiBPbmUgcGVyIGRlcGxveW1lbnQgcm9vdCwgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzdGFnZWQuICovXG4gIHJlYWRvbmx5IHN0YWdlZEdyb3VwczogU3RhZ2VkR3JvdXBSZXN1bHRbXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbWFuaWZlc3QgYW5kIHN0YWdpbmcgcGxhbiwgc3RhZ2UgdGhlIGZpbGVzLCBhbmQgd3JpdGUgdGhlIG1hbmlmZXN0LlxuICogQ2FsbGVkIGZyb20gYG9uQnVpbGRDb21wbGV0ZWAsIHdoaWNoIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgaG9sZHMgdGhlIGJ1aWxkXG4gKiBvdXRwdXRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWlsZE91dHB1dHMoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIG9wdGlvbnM6IEJ1aWxkT3V0cHV0c09wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8V3JpdGVCdWlsZE91dHB1dHNSZXN1bHQ+IHtcbiAgY29uc3QgYWRhcHRlckRpciA9IGpvaW4oY3R4LmRpc3REaXIsIEFEQVBURVJfRElSX05BTUUpO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGFkYXB0ZXJEaXIsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG5cbiAgY29uc3QgeyBtYW5pZmVzdCwgZ3JvdXBzIH0gPSBidWlsZEFkYXB0ZXJNYW5pZmVzdChjdHgsIG9wdGlvbnMpO1xuXG4gIC8vIFRyYWNlZCBvbmNlLCBoZXJlOiB0aGUgdHJhY2UgaXMgYXN5bmMsIHdoaWNoIGlzIHdoeSBpdCBjYW5ub3QgaGFwcGVuIGluc2lkZVxuICAvLyBgYnVpbGRBZGFwdGVyTWFuaWZlc3RgLiBgcnVudGltZUNsb3N1cmVgIGlzIG1lcmdlZCBpbnRvIGV2ZXJ5IGdyb3VwLCBhbmRcbiAgLy8gYGltYWdlQ2xvc3VyZWAgaW50byBgZGVmYXVsdGAgb25seSwgdGhlIG9uZSBncm91cCBgL19uZXh0L2ltYWdlYCByZWFjaGVzLlxuICBjb25zdCBydW50aW1lQ2xvc3VyZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGltYWdlQ2xvc3VyZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGF3YWl0IGFkZFJ1bnRpbWVOZXh0Q2xvc3VyZShjdHgsIHJ1bnRpbWVDbG9zdXJlLCBpbWFnZUNsb3N1cmUpO1xuICBhZGRSZXF1aXJlZFNlcnZlckZpbGVzKGN0eCwgcnVudGltZUNsb3N1cmUpO1xuXG4gIC8vIEEgcHJldmlvdXMgYnVpbGQncyB0cmVlIGlzIG5ldmVyIGFkZGl0aXZlIHdpdGggdGhpcyBvbmUnczogYSByZW1vdmVkIHJvdXRlXG4gIC8vIGxlYXZlcyBiZWhpbmQgYW4gZW50cnlwb2ludCB0aGUgbWFuaWZlc3Qgbm8gbG9uZ2VyIG1lbnRpb25zLCBhIHJlbmFtZWQgY2h1bmtcbiAgLy8gbGVhdmVzIGRlYWQgYnl0ZXMgaW5zaWRlIHRoZSAyNTAgTUIgYnVkZ2V0LCBhbmQgYSByZWdyb3VwZWQgYnVpbGQgbGVhdmVzIGFcbiAgLy8gd2hvbGUgZGVwbG95bWVudCByb290IG5vdGhpbmcgZGVwbG95cy5cbiAgYXdhaXQgcm0oYWRhcHRlckRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHN0YWdlZEdyb3VwczogU3RhZ2VkR3JvdXBSZXN1bHRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xuICAgIGNvbnN0IGdyb3VwU3RhZ2luZyA9IG1lcmdlZChcbiAgICAgIG1lcmdlZChncm91cC5zdGFnaW5nLCBydW50aW1lQ2xvc3VyZSksXG4gICAgICBncm91cC5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQID8gaW1hZ2VDbG9zdXJlIDogbmV3IE1hcCgpLFxuICAgICk7XG4gICAgY29uc3QgcGF0aCA9IGpvaW4oYWRhcHRlckRpciwgLi4uZ3JvdXAuZGlyTmFtZS5zcGxpdChcIi9cIikpO1xuICAgIGF3YWl0IG1rZGlyKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHN0YWdlRmlsZXMoZ3JvdXBTdGFnaW5nLCBwYXRoKTtcbiAgICBzdGFnZWRHcm91cHMucHVzaCh7IG5hbWU6IGdyb3VwLm5hbWUsIHBhdGgsIGZpbGVDb3VudDogZ3JvdXBTdGFnaW5nLnNpemUgfSk7XG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGUobWFuaWZlc3RQYXRoLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3QsXG4gICAgZ3JvdXBzLFxuICAgIGFkYXB0ZXJEaXIsXG4gICAgbWFuaWZlc3RQYXRoLFxuICAgIHN0YWdlZEdyb3VwcyxcbiAgfTtcbn1cblxuLyoqIExlZnQgd2lucywgYXMgZXZlcnl3aGVyZSBlbHNlIGluIHRoaXMgbW9kdWxlOiBmaXJzdCB3cml0ZXIgb2YgYSBrZXkga2VlcHMgaXQuICovXG5mdW5jdGlvbiBtZXJnZWQoXG4gIGJhc2U6IFN0YWdpbmdQbGFuLFxuICBhZGRpdGlvbnM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPixcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKGJhc2UpO1xuICBmb3IgKGNvbnN0IFtrZXksIHNvdXJjZV0gb2YgYWRkaXRpb25zKSB7XG4gICAgaWYgKCFyZXN1bHQuaGFzKGtleSkpIHtcbiAgICAgIHJlc3VsdC5zZXQoa2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRoZSBwdXJlIGhhbGYgb2Yge0BsaW5rIHdyaXRlQnVpbGRPdXRwdXRzfTogZXZlcnl0aGluZyBkZXJpdmVkIGZyb20gdGhlIGJ1aWxkXG4gKiBvdXRwdXRzLCB3aXRoIG5vIHdyaXRlcy4gU3BsaXQgb3V0IHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZCBhZ2FpbnN0IGNvbW1pdHRlZFxuICogYG9uQnVpbGRDb21wbGV0ZWAgZml4dHVyZXMuXG4gKlxuICogVGhyb3dzIG9uIGFueSBub24tTm9kZSBvdXRwdXQgYW5kIG9uIGFueSBzdGFnaW5nIGtleSB0d28gb3V0cHV0cyBtYXAgdG9cbiAqIGRpZmZlcmVudCBjb250ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBZGFwdGVyTWFuaWZlc3QoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIG9wdGlvbnM6IEJ1aWxkT3V0cHV0c09wdGlvbnMgPSB7fSxcbik6IEJ1aWxkQWRhcHRlck1hbmlmZXN0UmVzdWx0IHtcbiAgY29uc3QgeyBvdXRwdXRzLCByZXBvUm9vdCB9ID0gY3R4O1xuICBjb25zdCBiYXNlUGF0aCA9IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIjtcbiAgYXNzZXJ0QnVpbGRDd2QoY3R4LCBvcHRpb25zLmJ1aWxkQ3dkID8/IHByb2Nlc3MuY3dkKCkpO1xuICBjb25zdCBpbnZvY2FibGU6IEludm9jYWJsZU91dHB1dFtdID0gW1xuICAgIC4uLm91dHB1dHMucGFnZXMsXG4gICAgLi4ub3V0cHV0cy5wYWdlc0FwaSxcbiAgICAuLi5vdXRwdXRzLmFwcFBhZ2VzLFxuICAgIC4uLm91dHB1dHMuYXBwUm91dGVzLFxuICAgIC4uLihvdXRwdXRzLm1pZGRsZXdhcmUgPyBbb3V0cHV0cy5taWRkbGV3YXJlXSA6IFtdKSxcbiAgXTtcblxuICBhc3NlcnROb2RlUnVudGltZXMoaW52b2NhYmxlLCBvdXRwdXRzLm1pZGRsZXdhcmUpO1xuICB3YXJuT25Ecm9wcGVkUm91dGVDb25maWcoaW52b2NhYmxlKTtcblxuICBjb25zdCBzdGF0aWNGaWxlcyA9IGNvbGxlY3RTdGF0aWNGaWxlcyhjdHgpO1xuXG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyRW50cnlwb2ludD4gPSB7fTtcbiAgZm9yIChjb25zdCB7IG91dHB1dHM6IGdyb3VwLCB0eXBlIH0gb2YgW1xuICAgIHsgb3V0cHV0czogb3V0cHV0cy5wYWdlcywgdHlwZTogXCJwYWdlXCIgYXMgY29uc3QgfSxcbiAgICB7IG91dHB1dHM6IG91dHB1dHMucGFnZXNBcGksIHR5cGU6IFwicGFnZS1hcGlcIiBhcyBjb25zdCB9LFxuICAgIHsgb3V0cHV0czogb3V0cHV0cy5hcHBQYWdlcywgdHlwZTogXCJhcHAtcGFnZVwiIGFzIGNvbnN0IH0sXG4gICAgeyBvdXRwdXRzOiBvdXRwdXRzLmFwcFJvdXRlcywgdHlwZTogXCJhcHAtcm91dGVcIiBhcyBjb25zdCB9LFxuICBdKSB7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgZ3JvdXApIHtcbiAgICAgIGFkZEVudHJ5cG9pbnQoZW50cnlwb2ludHMsIHJlcG9Sb290LCBvdXRwdXQsIHR5cGUsIGJhc2VQYXRoKTtcbiAgICB9XG4gIH1cblxuICBhZGRQcmVyZW5kZXJQYXRobmFtZXMoXG4gICAgZW50cnlwb2ludHMsXG4gICAgb3V0cHV0cy5wcmVyZW5kZXJzLFxuICAgIGN0eC5yb3V0aW5nLmR5bmFtaWNSb3V0ZXMsXG4gICAgYmFzZVBhdGgsXG4gICAgYCR7YmFzZVBhdGh9L19uZXh0L2RhdGEvJHtjdHguYnVpbGRJZH0vYCxcbiAgKTtcblxuICBjb25zdCBwYXRobmFtZXMgPSBzb3J0ZWRVbmlxdWUoW1xuICAgIC4uLk9iamVjdC5rZXlzKGVudHJ5cG9pbnRzKSxcbiAgICAuLi5PYmplY3Qua2V5cyhzdGF0aWNGaWxlcyksXG4gIF0pO1xuXG4gIGNvbnN0IGZ1bmN0aW9uR3JvdXBzID1cbiAgICBvcHRpb25zLmZ1bmN0aW9uR3JvdXBzID8/XG4gICAgcGFyc2VGdW5jdGlvbkdyb3Vwc0Vudihwcm9jZXNzLmVudltGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUl0pO1xuICAvLyBpMThuIGlzIGNoZWNrZWQgZmlyc3Q6IGl0IHJlamVjdHMgdGhlIGNvbWJpbmF0aW9uIG91dHJpZ2h0LCBhbmQgcnVubmluZyBpdFxuICAvLyBhZnRlciB0aGUgYXNzaWdubWVudCBtZWFudCBhbiBpMThuIGFwcCBnb3QgdGhlIGFzc2lnbm1lbnQncyBcInBhdHRlcm4gbWF0Y2hlc1xuICAvLyBubyByb3V0ZVwiIGVycm9yIGluc3RlYWQg4oCUIHRydWUsIGJ1dCBhYm91dCB0aGUgd3JvbmcgdGhpbmcsIHNpbmNlIGEgbG9jYWxpemVkXG4gIC8vIHRlbXBsYXRlIG5ldmVyIG1hdGNoZXMgYW4gdW5sb2NhbGl6ZWQgcGF0dGVybi5cbiAgaWYgKGZ1bmN0aW9uR3JvdXBzKSB7XG4gICAgYXNzZXJ0Tm9JMThuU3BsaXR0aW5nKGN0eC5jb25maWcuaTE4biA/PyBudWxsKTtcbiAgfVxuICBjb25zdCBhc3NpZ25tZW50ID0gZnVuY3Rpb25Hcm91cHNcbiAgICA/IGFzc2lnblJvdXRlc1RvR3JvdXBzKFxuICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgLy8gS2V5ZWQgb24gdGhlIGZpbGUsIG5vdCB0aGUgb3V0cHV0IGBpZGA6IGEgUGFnZXMgUm91dGVyIHBhZ2UgYW5kIGl0c1xuICAgICAgICAvLyBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCByb3V0ZSBhcmUgc2VwYXJhdGUgb3V0cHV0cyB3aXRoXG4gICAgICAgIC8vIHNlcGFyYXRlIGlkcyBiYWNrZWQgYnkgb25lIGZpbGUsIGFuZCBvbmx5IHRoZSBwYWdlJ3MgdGVtcGxhdGUgbWF0Y2hlc1xuICAgICAgICAvLyBhIGdyb3VwIHBhdHRlcm4uXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGVudHJ5cG9pbnRzKS5tYXAoKFt0ZW1wbGF0ZSwgZW50cnlwb2ludF0pID0+ICh7XG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgZW50cnlwb2ludElkOiBlbnRyeXBvaW50LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGU6IGVudHJ5cG9pbnQudHlwZSxcbiAgICAgICAgfSkpLFxuICAgICAgICB7XG4gICAgICAgICAgYmFzZVBhdGg6IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIixcbiAgICAgICAgICBidWlsZElkOiBjdHguYnVpbGRJZCxcbiAgICAgICAgICB0cmFpbGluZ1NsYXNoOiBjdHguY29uZmlnLnRyYWlsaW5nU2xhc2ggPT09IHRydWUsXG4gICAgICAgICAgcm91dGluZzogY3R4LnJvdXRpbmcsXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCA9IHtcbiAgICB2ZXJzaW9uOiBBREFQVEVSX01BTklGRVNUX1ZFUlNJT04gYXMgMSxcbiAgICBidWlsZElkOiBjdHguYnVpbGRJZCxcbiAgICByZWxhdGl2ZVByb2plY3REaXI6IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIGN0eC5wcm9qZWN0RGlyKSksXG4gICAgY29uZmlnOiB7XG4gICAgICBiYXNlUGF0aDogY3R4LmNvbmZpZy5iYXNlUGF0aCB8fCBcIlwiLFxuICAgICAgdHJhaWxpbmdTbGFzaDogY3R4LmNvbmZpZy50cmFpbGluZ1NsYXNoID09PSB0cnVlLFxuICAgICAgYXNzZXRQcmVmaXg6IGN0eC5jb25maWcuYXNzZXRQcmVmaXggfHwgXCJcIixcbiAgICAgIGRpc3REaXI6IHRvUG9zaXgocmVsYXRpdmUoY3R4LnByb2plY3REaXIsIGN0eC5kaXN0RGlyKSksXG4gICAgICBjb21wcmVzczogY3R4LmNvbmZpZy5jb21wcmVzcyAhPT0gZmFsc2UsXG4gICAgICBnZW5lcmF0ZUV0YWdzOiBjdHguY29uZmlnLmdlbmVyYXRlRXRhZ3MgIT09IGZhbHNlLFxuICAgICAgaTE4bjogY3R4LmNvbmZpZy5pMThuID8/IG51bGwsXG4gICAgICBkZXBsb3ltZW50SWQ6IChjdHguY29uZmlnLmRlcGxveW1lbnRJZCA/PyBcIlwiKS5yZXBsYWNlKFxuICAgICAgICAvW15BLVphLXowLTlfLV0vZyxcbiAgICAgICAgXCItXCIsXG4gICAgICApLFxuICAgIH0sXG4gICAgcm91dGluZzogY3R4LnJvdXRpbmcsXG4gICAgcGF0aG5hbWVzLFxuICAgIGVudHJ5cG9pbnRzLFxuICAgIG1pZGRsZXdhcmU6IGJ1aWxkTWlkZGxld2FyZShyZXBvUm9vdCwgb3V0cHV0cy5taWRkbGV3YXJlKSxcbiAgICBzdGF0aWNGaWxlcyxcbiAgICAuLi4oYXNzaWdubWVudFxuICAgICAgPyB7XG4gICAgICAgICAgZ3JvdXBzOiBhc3NpZ25tZW50LnRlbXBsYXRlcyxcbiAgICAgICAgICBiZWhhdmlvcnM6IGFzc2lnbm1lbnQuYmVoYXZpb3JzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzOiBmdW5jdGlvbkdyb3VwcyEubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJvdXRlcyxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xuICBhc3NlcnRCdWlsZElkRml0cyhtYW5pZmVzdCk7XG5cbiAgY29uc3QgZ3JvdXBzOiBTdGFnZWRHcm91cFtdID0gYXNzaWdubWVudFxuICAgID8gT2JqZWN0LmVudHJpZXMoYXNzaWdubWVudC50ZW1wbGF0ZXMpLm1hcCgoW25hbWUsIHRlbXBsYXRlc10pID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRpck5hbWU6IGdyb3VwU3RhZ2luZ0Rpck5hbWUobmFtZSksXG4gICAgICAgIHN0YWdpbmc6IGNvbGxlY3RHcm91cFN0YWdpbmdQbGFuKFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBpbnZvY2FibGUsXG4gICAgICAgICAgZW50cnlwb2ludHMsXG4gICAgICAgICAgdGVtcGxhdGVzLFxuICAgICAgICApLFxuICAgICAgfSkpXG4gICAgOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBERUZBVUxUX0ZVTkNUSU9OX0dST1VQLFxuICAgICAgICAgIGRpck5hbWU6IGdyb3VwU3RhZ2luZ0Rpck5hbWUoKSxcbiAgICAgICAgICBzdGFnaW5nOiBzZXJ2ZWRTdGFnaW5nUGxhbihjdHgsIGludm9jYWJsZSksXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gIHJldHVybiB7IG1hbmlmZXN0LCBncm91cHMgfTtcbn1cblxuLyoqXG4gKiBGYWlscyB0aGUgYnVpbGQgd2hlbiB0aGUgYnVpbGQgSUQgZXZlcnkgY2FjaGUgb2JqZWN0IGlzIHN0b3JlZCB1bmRlciBpc1xuICogbG9uZ2VyIHRoYW4ge0BsaW5rIE1BWF9CVUlMRF9JRF9CWVRFU30sIHRoZSByb29tIGBjYWNoZU9iamVjdE5hbWVgIGxlYXZlcyBpdC5cbiAqIFBhc3QgdGhhdCwgYW4gZW50cnkgd2l0aCBhIGxvbmcgZW5vdWdoIG5hbWUgd291bGQgYmUgcmVqZWN0ZWQgYnkgUzMgYW5kXG4gKiBuZXZlciBjYWNoZWQsIHdpdGggbm90aGluZyB0byBzYXkgd2h5LlxuICovXG5mdW5jdGlvbiBhc3NlcnRCdWlsZElkRml0cyhtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0KTogdm9pZCB7XG4gIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoZGVwbG95bWVudEJ1aWxkSWQobWFuaWZlc3QpKTtcbiAgaWYgKGJ5dGVzID4gTUFYX0JVSUxEX0lEX0JZVEVTKSB7XG4gICAgY29uc3QgeyB3aGF0LCBmaXggfSA9IG1hbmlmZXN0LmNvbmZpZy5kZXBsb3ltZW50SWRcbiAgICAgID8ge1xuICAgICAgICAgIHdoYXQ6IFwiVGhlIGJ1aWxkIElEIGFuZCBkZXBsb3ltZW50SWQgdG9nZXRoZXIgYXJlXCIsXG4gICAgICAgICAgZml4OiBcIlVzZSBhIHNob3J0ZXIgZGVwbG95bWVudElkIG9yIGdlbmVyYXRlQnVpbGRJZC5cIixcbiAgICAgICAgfVxuICAgICAgOiB7IHdoYXQ6IFwiVGhlIGJ1aWxkIElEIGlzXCIsIGZpeDogXCJVc2UgYSBzaG9ydGVyIGdlbmVyYXRlQnVpbGRJZC5cIiB9O1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9ICR7d2hhdH0gJHtieXRlc30gYnl0ZXM7IGNkay1uZXh0anMgc3RvcmVzIGNhY2hlIGAgK1xuICAgICAgICBgZW50cmllcyB1bmRlciBpdCBhbmQgYWxsb3dzIGF0IG1vc3QgJHtNQVhfQlVJTERfSURfQllURVN9LiAke2ZpeH1gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBPbmUgZ3JvdXAncyBzbGljZSBvZiB0aGUgc3RhZ2luZyBwbGFuOiB0aGUgYXNzZXRzIG9mIHRoZSBvdXRwdXRzIGl0IG93bnMsIGFuZFxuICogbm90aGluZyBlbHNlLlxuICpcbiAqIE1pZGRsZXdhcmUgaXMgaW4gZXZlcnkgZ3JvdXAsIG5vdCBqdXN0IHRoZSBkZWZhdWx0IG9uZSDigJQgaXQgcnVucyBvbiBldmVyeVxuICogcmVxdWVzdCB3aGVyZXZlciB0aGF0IHJlcXVlc3QgbGFuZHMsIHNvIGl0IGlzIGR1cGxpY2F0ZWQgYnkgZGVzaWduLCBhcyBpcyB0aGVcbiAqIGBuZXh0YCBjbG9zdXJlIHRoZSBlbnRyeXBvaW50cyBzaGFyZS4gVGhlIHNhbWUgZ29lcyBmb3IgdGhlIHN0YXRpYyBmaWxlcyB0aGVcbiAqIHJ1bnRpbWUgc2VydmVzIGl0c2VsZiAoYDQwNC5odG1sYCwgYGZhdmljb24uaWNvLmJvZHlgKTogYW55IGdyb3VwIGNhbiBiZSBhc2tlZFxuICogZm9yIHRoZW0uIEFuZCBzbyBhcmUgdGhlIG5vdC1mb3VuZCBhbmQgZXJyb3IgcGFnZXM6IHRoZSBydW50aW1lIHJlbmRlcnMgYVxuICogNDA0IG9yIGEgNTAwIHdpdGggd2hpY2hldmVyIG9mIHRoZW0gdGhlIHNoYXJlZCBtYW5pZmVzdCBuYW1lc1xuICogKGBzdGF0dXNUYXJnZXRzYCBpbiBgcnVudGltZS9kaXNwYXRjaC50c2ApLCBpbiB3aGljaGV2ZXIgZ3JvdXAgdGhlXG4gKiByZXF1ZXN0IHJlYWNoZWQsIHNvIGEgZ3JvdXAgd2l0aG91dCB0aGVtIGFuc3dlcmVkIGEgVVJMIHVuZGVyIGl0cyBvd25cbiAqIHBhdHRlcm4gdGhhdCBtYXRjaGVzIG5vIHJvdXRlIHdpdGggXCJ0aGUgZGVwbG95bWVudCBwYWNrYWdlIGlzIGluY29tcGxldGVcIi5cbiAqXG4gKiBPd25lcnNoaXAgaXMgbWF0Y2hlZCBvbiB0aGUgZW50cnlwb2ludCdzIGBmaWxlUGF0aGAsIG5vdCBpdHMgYGlkYCBvclxuICogcGF0aG5hbWU6IHRoZSBtYW5pZmVzdCdzIGVudHJ5cG9pbnRzIGFyZSBrZXllZCBieSAqdGVtcGxhdGUqLCBhbiBvdXRwdXQgbWF5XG4gKiBiYWNrIHNldmVyYWwgdGVtcGxhdGVzLCBhbmQge0BsaW5rIGFkZFByZXJlbmRlclBhdGhuYW1lc30gc3ludGhlc2l6ZXNcbiAqIGVudHJ5cG9pbnRzIHRoYXQgY2FycnkgdGhlICpwcmVyZW5kZXIncyogaWQsIHdoaWNoIG5vIGludm9jYWJsZSBvdXRwdXQgaGFzICh0aGVcbiAqIHJvb3QtcGFyYW1zIGFwcDogZW50cnlwb2ludCBgL2VuYCB3aXRoIGBpZDogXCIvZW5cImAgYmFja2VkIGJ5IHRoZSBvdXRwdXRcbiAqIGAvW2xvY2FsZV1gKS4gVGhlIHN5bnRoZXNpemVkIGVudHJ5cG9pbnQncyBgZmlsZVBhdGhgIGlzIHRoZSBvd25pbmcgb3V0cHV0J3MuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RHcm91cFN0YWdpbmdQbGFuKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBpbnZvY2FibGU6IEludm9jYWJsZU91dHB1dFtdLFxuICBlbnRyeXBvaW50czogUmVjb3JkPHN0cmluZywgQWRhcHRlckVudHJ5cG9pbnQ+LFxuICB0ZW1wbGF0ZXM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGJhc2VQYXRoID0gY3R4LmNvbmZpZy5iYXNlUGF0aCB8fCBcIlwiO1xuICBjb25zdCBvd25lZEVudHJ5cG9pbnRzID0gW1xuICAgIC4uLnRlbXBsYXRlcyxcbiAgICAuLi5FUlJPUl9QQUdFX1NVRkZJWEVTLm1hcCgoc3VmZml4KSA9PiBgJHtiYXNlUGF0aH0ke3N1ZmZpeH1gKSxcbiAgXVxuICAgIC5tYXAoKHRlbXBsYXRlKSA9PiBlbnRyeXBvaW50c1t0ZW1wbGF0ZV0pXG4gICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBBZGFwdGVyRW50cnlwb2ludCA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkKTtcbiAgY29uc3Qgb3duZWRGaWxlcyA9IG5ldyBTZXQob3duZWRFbnRyeXBvaW50cy5tYXAoKGVudHJ5KSA9PiBlbnRyeS5maWxlUGF0aCkpO1xuICBjb25zdCBtaWRkbGV3YXJlID0gY3R4Lm91dHB1dHMubWlkZGxld2FyZTtcbiAgY29uc3Qgb3duZWQgPSBpbnZvY2FibGUuZmlsdGVyKFxuICAgIChvdXRwdXQpID0+XG4gICAgICBvd25lZEZpbGVzLmhhcyh0b1Bvc2l4KHJlbGF0aXZlKGN0eC5yZXBvUm9vdCwgb3V0cHV0LmZpbGVQYXRoKSkpIHx8XG4gICAgICBvdXRwdXQgPT09IG1pZGRsZXdhcmUsXG4gICk7XG4gIHJldHVybiBzZXJ2ZWRTdGFnaW5nUGxhbihjdHgsIG93bmVkKTtcbn1cblxuLyoqIHtAbGluayBjb2xsZWN0U3RhZ2luZ1BsYW59IGZvciBgb3V0cHV0c2AsIHBsdXMgdGhlIGZpbGVzIHRoZSBydW50aW1lIHNlcnZlcy4gKi9cbmZ1bmN0aW9uIHNlcnZlZFN0YWdpbmdQbGFuKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBvdXRwdXRzOiBJbnZvY2FibGVPdXRwdXRbXSxcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBzdGFnaW5nID0gY29sbGVjdFN0YWdpbmdQbGFuKGN0eCwgb3V0cHV0cyk7XG4gIHN0YWdlU2VydmVkU3RhdGljRmlsZXMoY3R4LCBzdGFnaW5nKTtcbiAgcmV0dXJuIHN0YWdpbmc7XG59XG5cbi8qKlxuICogSm9iIDE6IHJlamVjdCBub24tTm9kZSBvdXRwdXRzLCBldmVyeXdoZXJlLlxuICpcbiAqIGBleHBvcnQgY29uc3QgcnVudGltZSA9ICdlZGdlJ2Agb24gYSBwYWdlIG9yIHJvdXRlIGhhbmRsZXIgbGFuZHMgaW5cbiAqIGBhcHBQYWdlc2AvYGFwcFJvdXRlc2AvYHBhZ2VzYC9gcGFnZXNBcGlgIHdpdGggYHJ1bnRpbWU6ICdlZGdlJ2AsXG4gKiBgYXNzZXRzOiB7fWAsIGFuZCBhbiBgZWRnZVJ1bnRpbWVgIGRlc2NyaXB0b3IgbmVlZGluZyBgZ2xvYmFsVGhpcy5fRU5UUklFU2BcbiAqIGFuZCBhIHNhbmRib3guIEd1YXJkaW5nIG1pZGRsZXdhcmUgYWxvbmUgd291bGQgbGVhdmUgYSBzaWxlbnQgZmFpbHVyZSBtb2RlXG4gKiBmb3IgZWRnZSBwYWdlczogYW4gZW50cnlwb2ludCB3ZSBjYW4ndCBpbnZva2UgYW5kIG5vIGFzc2V0cyB0byBpbnZva2UgaXRcbiAqIHdpdGguXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vZGVSdW50aW1lcyhcbiAgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSxcbiAgbWlkZGxld2FyZTogQWRhcHRlck91dHB1dHNbXCJtaWRkbGV3YXJlXCJdLFxuKTogdm9pZCB7XG4gIGNvbnN0IG9mZmVuZGluZyA9IGludm9jYWJsZS5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LnJ1bnRpbWUgIT09IFwibm9kZWpzXCIpO1xuICBpZiAob2ZmZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIE1pZGRsZXdhcmUgaXMgcmVwb3J0ZWQgc2VwYXJhdGVseSBmcm9tIHJvdXRlcy4gSXRzIGBzb3VyY2VQYWdlYCBpcyBgL2AsIHNvXG4gIC8vIGZvbGRpbmcgaXQgaW4gd2l0aCB0aGUgcm91dGVzIHByb2R1Y2VzIHRoZSBhY3RpdmVseSBtaXNsZWFkaW5nIGFkdmljZSB0b1xuICAvLyByZW1vdmUgYGV4cG9ydCBjb25zdCBydW50aW1lID0gXCJlZGdlXCJgIGZyb20gdGhlIGhvbWUgcGFnZSAtIHdoaWNoIGlzIHdoZXJlXG4gIC8vIHRoZSBlZGdlIHJ1bnRpbWUgaXMgbm90LCBhbmQgbWF5IG5vdCBldmVuIGV4aXN0LlxuICBjb25zdCBvZmZlbmRpbmdNaWRkbGV3YXJlID0gbWlkZGxld2FyZSAmJiBvZmZlbmRpbmcuaW5jbHVkZXMobWlkZGxld2FyZSk7XG4gIC8vIGAucnNjYCB2YXJpYW50cyBzaGFyZSBhIGBzb3VyY2VQYWdlYCB3aXRoIHRoZWlyIEhUTUwgc2libGluZywgc28gZGVkdXBlLlxuICBjb25zdCByb3V0ZXMgPSBzb3J0ZWRVbmlxdWUoXG4gICAgb2ZmZW5kaW5nXG4gICAgICAuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dCAhPT0gbWlkZGxld2FyZSlcbiAgICAgIC5tYXAoKG91dHB1dCkgPT4gYCR7b3V0cHV0LnNvdXJjZVBhZ2V9IChydW50aW1lOiBcIiR7b3V0cHV0LnJ1bnRpbWV9XCIpYCksXG4gICk7XG5cbiAgY29uc3QgcmVhc29uczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgcmVhc29ucy5wdXNoKFxuICAgICAgYGNkay1uZXh0anMgY2Fubm90IGRlcGxveSByb3V0ZXMgYnVpbHQgZm9yIHRoZSBlZGdlIHJ1bnRpbWUuIGAgK1xuICAgICAgICBgUmVtb3ZlIFxcYGV4cG9ydCBjb25zdCBydW50aW1lID0gXCJlZGdlXCJcXGAgZnJvbTpcXG5gICtcbiAgICAgICAgcm91dGVzLm1hcCgocm91dGUpID0+IGAgIC0gJHtyb3V0ZX1gKS5qb2luKFwiXFxuXCIpLFxuICAgICk7XG4gIH1cbiAgaWYgKG9mZmVuZGluZ01pZGRsZXdhcmUpIHtcbiAgICByZWFzb25zLnB1c2goXG4gICAgICBgY2RrLW5leHRqcyBjYW5ub3QgZGVwbG95IG1pZGRsZXdhcmUgYnVpbHQgZm9yIHRoZSBlZGdlIHJ1bnRpbWUgYCArXG4gICAgICAgIGAoJHttaWRkbGV3YXJlLmZpbGVQYXRofSwgcnVudGltZTogXCIke21pZGRsZXdhcmUucnVudGltZX1cIikuIGAgK1xuICAgICAgICBgUmVuYW1lIGl0IHRvIFxcYHByb3h5LnRzXFxgIChOZXh0LmpzIDE2IHJ1bnMgcHJveHkgb24gdGhlIE5vZGUgYCArXG4gICAgICAgIGBydW50aW1lKSwgb3Iga2VlcCBcXGBtaWRkbGV3YXJlLnRzXFxgIGFuZCBhZGQgYCArXG4gICAgICAgIGBcXGBleHBvcnQgY29uc3QgY29uZmlnID0geyBydW50aW1lOiBcIm5vZGVqc1wiIH1cXGAgdG8gaXQg4oCUIGAgK1xuICAgICAgICBgXFxgbWlkZGxld2FyZS50c1xcYCBkZWZhdWx0cyB0byB0aGUgZWRnZSBydW50aW1lLCBidXQgZG9lcyBub3QgcmVxdWlyZSBpdC5gLFxuICAgICk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYCR7TE9HX1BSRUZJWH0gJHtyZWFzb25zLmpvaW4oXCJcXG5cIil9XFxuYCArXG4gICAgICBgVGhlIGVkZ2UgcnVudGltZSBpcyBkZXByZWNhdGVkIGluIE5leHQuanM6IGAgK1xuICAgICAgYGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL2VkZ2UtcnVudGltZS1kZXByZWNhdGVkYCxcbiAgKTtcbn1cblxuLyoqXG4gKiBXYXJuIG9uIHJvdXRlIGNvbmZpZyBjZGstbmV4dGpzIGRvZXMgbm90IGhvbm9yLiBBbiBhdXRob3Igd2hvIHNldCB0aGVzZSBhc2tlZFxuICogZm9yIHNvbWV0aGluZyBleHBsaWNpdGx5LCBzbyBzYXkgc28gcmF0aGVyIHRoYW4gaWdub3JpbmcgaXQgc2lsZW50bHk7IG5ldmVyXG4gKiB0aHJvdywgYmVjYXVzZSByb3V0ZS1sZXZlbCBgbWF4RHVyYXRpb25gIGlzIHZhbGlkIE5leHQuanMuXG4gKlxuICogYE5leHRqc0J1aWxkYCBydW5zIGBuZXh0IGJ1aWxkYCB3aXRoIGBzdGRpbzogXCJpbmhlcml0XCJgLCBzbyB0aGlzIHJlYWNoZXMgdGhlXG4gKiB1c2VyJ3MgdGVybWluYWwuIFNlZSB0aGUgcGxhbidzIFwiRGVjaXNpb25zXCIgZm9yIHdoeSBuZWl0aGVyIGlzIGhvbm9yZWQuXG4gKi9cbmZ1bmN0aW9uIHdhcm5PbkRyb3BwZWRSb3V0ZUNvbmZpZyhpbnZvY2FibGU6IEludm9jYWJsZU91dHB1dFtdKTogdm9pZCB7XG4gIGNvbnN0IGRyb3BwZWQ6IFJlY29yZDxcIm1heER1cmF0aW9uXCIgfCBcInByZWZlcnJlZFJlZ2lvblwiLCBzdHJpbmdbXT4gPSB7XG4gICAgbWF4RHVyYXRpb246IFtdLFxuICAgIHByZWZlcnJlZFJlZ2lvbjogW10sXG4gIH07XG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIGludm9jYWJsZSkge1xuICAgIGlmIChvdXRwdXQuY29uZmlnPy5tYXhEdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcm9wcGVkLm1heER1cmF0aW9uLnB1c2gob3V0cHV0LnNvdXJjZVBhZ2UpO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmNvbmZpZz8ucHJlZmVycmVkUmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRyb3BwZWQucHJlZmVycmVkUmVnaW9uLnB1c2gob3V0cHV0LnNvdXJjZVBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlbWVkeTogUmVjb3JkPFwibWF4RHVyYXRpb25cIiB8IFwicHJlZmVycmVkUmVnaW9uXCIsIHN0cmluZz4gPSB7XG4gICAgbWF4RHVyYXRpb246XG4gICAgICBcIlNldCB0aGUgZnVuY3Rpb24gdGltZW91dCB3aXRoIHRoZSBjb25zdHJ1Y3QncyBgb3ZlcnJpZGVzYCBwcm9wIGluc3RlYWQgKGUuZy4gYG92ZXJyaWRlczogeyBuZXh0anNGdW5jdGlvbnM6IHsgZnVuY3Rpb25Qcm9wczogeyB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwKSB9IH0gfWApOyBhIExhbWJkYSB0aW1lb3V0IGlzIHBlci1mdW5jdGlvbiB3aGlsZSBgbWF4RHVyYXRpb25gIGlzIHBlci1yb3V0ZS5cIixcbiAgICBwcmVmZXJyZWRSZWdpb246XG4gICAgICBcIkhvbm9yaW5nIGl0IHdvdWxkIHJlcXVpcmUgYSBtdWx0aS1yZWdpb24gZGVwbG95bWVudCwgd2hpY2ggdGhpcyBjb25zdHJ1Y3QgZG9lcyBub3QgbW9kZWwuXCIsXG4gIH07XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgW1wibWF4RHVyYXRpb25cIiwgXCJwcmVmZXJyZWRSZWdpb25cIl0gYXMgY29uc3QpIHtcbiAgICBjb25zdCByb3V0ZXMgPSBzb3J0ZWRVbmlxdWUoZHJvcHBlZFtrZXldKTtcbiAgICBpZiAocm91dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke0xPR19QUkVGSVh9IFxcYCR7a2V5fVxcYCBpcyBub3QgaG9ub3JlZCBieSBjZGstbmV4dGpzLiBgICtcbiAgICAgICAgYCR7cm91dGVzLmxlbmd0aH0gcm91dGUocykgc2V0IGl0LCBpbmNsdWRpbmc6ICR7cm91dGVzLnNsaWNlKDAsIDUpLmpvaW4oXCIsIFwiKX1gICtcbiAgICAgICAgYCR7cm91dGVzLmxlbmd0aCA+IDUgPyBgLCBhbmQgJHtyb3V0ZXMubGVuZ3RoIC0gNX0gbW9yZWAgOiBcIlwifS4gYCArXG4gICAgICAgIHJlbWVkeVtrZXldLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBKb2JzIDIsIDMgYW5kIDY6IHRoZSBkZWR1cGVkIHVuaW9uIG9mIGV2ZXJ5IHNoaXBwZWQgb3V0cHV0J3MgdHJhY2VkIGBhc3NldHNgLFxuICogcGx1cyBlYWNoIGVudHJ5cG9pbnQgZmlsZSBpdHNlbGYsIHBsdXMgdGhlIGVudiBmaWxlcywgd2l0aCBgYXNzZXRzSGFzaGVzYCB1c2VkXG4gKiBhcyBhIGNvbmZsaWN0IGNoZWNrLlxuICpcbiAqIERlZHVwIGlzIGJ5IGtleTogdGhlIHRyYWNlZCBgbmV4dGAgY2xvc3VyZSBpcyBtZXJnZWQgaW50byBldmVyeSBvdXRwdXQnc1xuICogYGFzc2V0c2AgKGBnZXRTaGFyZWROb2RlQXNzZXRzYCDihpIgYHNoYXJlZE5vZGVBc3NldHNgKSwgc28gTiBvdXRwdXRzXG4gKiBvdmVyd2hlbG1pbmdseSByZXBlYXQga2V5cy4gV2hhdCB0aGUgaGFzaGVzIGJ1eSBpcyBkZXRlY3RpbmcgdHdvIG91dHB1dHNcbiAqIG1hcHBpbmcgdGhlICoqc2FtZSBrZXkgdG8gZGlmZmVyZW50IGNvbnRlbnQqKiwgd2hpY2ggaXMgdW5wYWNrYWdlYWJsZSBpbnRvXG4gKiBvbmUgTGFtYmRhIOKAlCBmYWlsIHRoZSBidWlsZCBsb3VkbHkgcmF0aGVyIHRoYW4gbGV0dGluZyBsYXN0LXdyaXRlLXdpbnMgcGljay5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFN0YWdpbmdQbGFuKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBpbnZvY2FibGU6IEludm9jYWJsZU91dHB1dFtdLFxuKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgcmVwb1Jvb3QgfSA9IGN0eDtcbiAgY29uc3Qgc3RhZ2luZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGhhc2hlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgYWRkID0gKGtleTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZywgaGFzaD86IHN0cmluZykgPT4ge1xuICAgIGFzc2VydFN0YWdpbmdLZXkoa2V5LCBzb3VyY2UpO1xuICAgIGNvbnN0IGV4aXN0aW5nSGFzaCA9IGhhc2hlcy5nZXQoa2V5KTtcbiAgICBpZiAoXG4gICAgICBoYXNoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGV4aXN0aW5nSGFzaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBleGlzdGluZ0hhc2ggIT09IGhhc2hcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVHdvIGJ1aWxkIG91dHB1dHMgbWFwIFwiJHtrZXl9XCIgdG8gZGlmZmVyZW50IGNvbnRlbnQgYCArXG4gICAgICAgICAgYChoYXNoZXMgJHtleGlzdGluZ0hhc2h9IGFuZCAke2hhc2h9KS4gT25lIGRlcGxveW1lbnQgcGFja2FnZSBjYW5ub3QgYCArXG4gICAgICAgICAgYGhvbGQgYm90aC4gVGhpcyB1c3VhbGx5IG1lYW5zIHR3byBOZXh0LmpzIHByb2plY3RzIGluIHRoZSBzYW1lIHJlcG8gYCArXG4gICAgICAgICAgYHdyaXRlIHRoZSBzYW1lIHJlcG8tcm9vdC1yZWxhdGl2ZSBwYXRoLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNoZXMuc2V0KGtleSwgaGFzaCk7XG4gICAgfVxuICAgIGlmICghc3RhZ2luZy5oYXMoa2V5KSkge1xuICAgICAgc3RhZ2luZy5zZXQoa2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGNvbnN0IG91dHB1dCBvZiBpbnZvY2FibGUpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHNvdXJjZV0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0LmFzc2V0cykpIHtcbiAgICAgIGFkZChrZXksIHNvdXJjZSwgb3V0cHV0LmFzc2V0c0hhc2hlc1trZXldKTtcbiAgICB9XG4gICAgLy8gVGhlIGVudHJ5cG9pbnQncyBvd24gZmlsZSBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGZyb20gaXRzIGBhc3NldHNgIOKAlCB0aGVcbiAgICAvLyBORlQgdHJhY2UgY292ZXJzIHRoZSBjbG9zdXJlIGl0IHJlcXVpcmVzLCBub3QgaXRzZWxmLiBgYXNzZXRzSGFzaGVzYCBkb2VzXG4gICAgLy8gY2FycnkgaXQgKGtleWVkIHRoZSBzYW1lIHdheSksIHdoaWNoIGlzIGFsc28gd2hhdCBwaW5zIHRoZSBrZXkgZm9ybWF0LlxuICAgIGNvbnN0IGVudHJ5S2V5ID0gdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgb3V0cHV0LmZpbGVQYXRoKSk7XG4gICAgYWRkKGVudHJ5S2V5LCBvdXRwdXQuZmlsZVBhdGgsIG91dHB1dC5hc3NldHNIYXNoZXNbZW50cnlLZXldKTtcbiAgfVxuXG4gIC8vIEpvYiAyLCBzZWNvbmQgaGFsZjogYHdyaXRlU3RhbmRhbG9uZURpcmVjdG9yeWAgZmlsdGVycyBgbG9hZGVkRW52RmlsZXNgIHRvXG4gIC8vIGV4YWN0bHkgdGhlc2UgdHdvIGFuZCBjb3BpZXMgdGhlbTsgYGJ1aWxkLWNvbXBsZXRlLmpzYCBoYXMgbm8gZW52LWZpbGVcbiAgLy8gaGFuZGxpbmcgYXQgYWxsLCBzbyB0aGV5IGFyZSBub3QgaW4gYW55IGBhc3NldHNgIG1hcC5cbiAgZm9yIChjb25zdCBlbnZGaWxlIG9mIEVOVl9GSUxFUykge1xuICAgIGNvbnN0IHNvdXJjZSA9IGpvaW4oY3R4LnByb2plY3REaXIsIGVudkZpbGUpO1xuICAgIGlmIChleGlzdHNTeW5jKHNvdXJjZSkpIHtcbiAgICAgIGFkZCh0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBzb3VyY2UpKSwgc291cmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhZ2luZztcbn1cblxuLyoqXG4gKiBKb2IgMiwgdGhpcmQgcGFydDogdGhlIHN0YXRpYyBmaWxlcyB0aGUgKnJ1bnRpbWUqIGhhcyB0byBzZXJ2ZSwgYW5kIHRoZWlyXG4gKiBzb3VyY2VzLlxuICpcbiAqIGBvdXRwdXRzLnN0YXRpY0ZpbGVzYCBtaXhlcyB0d28gcG9wdWxhdGlvbnMgd2l0aCB0aGUgc2FtZSBgU1RBVElDX0ZJTEVgIHR5cGU6XG4gKlxuICogLSAqKmA8ZGlzdERpcj4vc3RhdGljLyoqYCBhbmQgYHB1YmxpYy8qKmAqKiDigJQgdXBsb2FkZWQgdG8gUzMgYnlcbiAqICAgYE5leHRqc1N0YXRpY0Fzc2V0c2AsIGFuZCBDbG91ZEZyb250IC8gQVBJIEdhdGV3YXkgYW5zd2VyIHRoZW0gYmVmb3JlIHRoZVxuICogICByZXF1ZXN0IGV2ZXIgcmVhY2hlcyB0aGUgY29tcHV0ZS4gTm90IHN0YWdlZDogYHB1YmxpYy9gIGFsb25lIGNhbiBiZVxuICogICBodW5kcmVkcyBvZiBtZWdhYnl0ZXMgYWdhaW5zdCBhIDI1MCBNQiB1bnppcHBlZCBMYW1iZGEgY2FwLCBhbmQgaXQgd291bGQgYmVcbiAqICAgYSBzZWNvbmQgY29weSBvZiBieXRlcyBhbHJlYWR5IGluIFMzLiBgcHVibGljL2AgaXMgbm90IGluXG4gKiAgIGBvdXRwdXRzLnN0YXRpY0ZpbGVzYCBhdCBhbGwg4oCUIE5leHQuanMgbGlzdHMgaXQgb25seSBmb3IgYG91dHB1dDogXCJleHBvcnRcImBcbiAqICAg4oCUIGFuZCBpdCBpcyBkZWxpYmVyYXRlbHkgbm90IGFkZGVkIGhlcmU6IHRoZSBjb250YWluZXIgcnVudGltZSBsaXN0cyBpdCBvZmZcbiAqICAgZGlzayBhdCBjb2xkIHN0YXJ0IGluc3RlYWQsIGFzIGBuZXh0IHN0YXJ0YCBkb2VzIChgcmVhZFB1YmxpY0ZpbGVzYCBpblxuICogICBgc3JjL3J1bnRpbWUvcHVibGljLWZpbGVzLnRzYCksIGJlY2F1c2Ugb25seSB0aGUgZGlzayBrbm93cyB3aGF0IGFuIGFwcCdzXG4gKiAgIGBwb3N0YnVpbGRgIHdyb3RlIGludG8gaXQgYWZ0ZXIgdGhpcyBob29rIHJhbi5cbiAqIC0gKipldmVyeXRoaW5nIGVsc2UqKiwgYWxsIG9mIGl0IHVuZGVyIGA8ZGlzdERpcj4vc2VydmVyL2Ag4oCUIGA0MDQuaHRtbGAsXG4gKiAgIGA1MDAuaHRtbGAsIGBmYXZpY29uLmljby5ib2R5YCwgYW5kIGZ1bGx5LXN0YXRpYyBQYWdlcyBSb3V0ZXIgSFRNTC4gTm90aGluZ1xuICogICBpbiBmcm9udCBvZiB0aGUgY29tcHV0ZSBzZXJ2ZXMgdGhlc2UsIHNvIHRoZXkgYXJlIHN0YWdlZC4gQm91bmRlZCBieSByb3V0ZVxuICogICBjb3VudCBhbmQgc21hbGwuXG4gKlxuICogVGhlIHBhdGhuYW1lIOKGkiBrZXkgbWFwIGlzIHJldHVybmVkIGZvciAqYWxsKiBvZiB0aGVtLCBiZWNhdXNlIGRpc3BhdGNoIGhhcyB0b1xuICogcmVzb2x2ZSBhIHBhdGhuYW1lIHRvIFwic3RhdGljIGZpbGUsIG5vdCBhIDQwNFwiIGVpdGhlciB3YXk7IHRoZSBydW50aW1lIDQwNHMgaWZcbiAqIHRoZSBmaWxlIHR1cm5zIG91dCBub3QgdG8gYmUgaW4gdGhlIHBhY2thZ2UsIHdoaWNoIGlzIG9ubHkgcmVhY2hhYmxlIHdoZW4gdGhlXG4gKiBkaXN0cmlidXRpb24gaXMgbWlzcm91dGVkLlxuICpcbiAqIFN0YWdpbmcgaXMge0BsaW5rIHN0YWdlU2VydmVkU3RhdGljRmlsZXN9LCBhcHBsaWVkIG9uY2UgcGVyIGRlcGxveW1lbnQgcm9vdC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFN0YXRpY0ZpbGVzKGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgeyByZXBvUm9vdCB9ID0gY3R4O1xuICBjb25zdCBiYXNlUGF0aCA9IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIjtcbiAgY29uc3Qgc3RhdGljRmlsZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBwYWdlc0RpciA9IGpvaW4oY3R4LmRpc3REaXIsIFwic2VydmVyXCIsIFwicGFnZXNcIikgKyBzZXA7XG5cbiAgZm9yIChjb25zdCBvdXRwdXQgb2YgY3R4Lm91dHB1dHMuc3RhdGljRmlsZXMpIHtcbiAgICBjb25zdCBrZXkgPSB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBvdXRwdXQuZmlsZVBhdGgpKTtcbiAgICBjb25zdCBwYXRobmFtZXMgPSByb3V0YWJsZVBhdGhuYW1lcyhcbiAgICAgIG91dHB1dC5wYXRobmFtZSxcbiAgICAgIGJhc2VQYXRoLFxuICAgICAgb3V0cHV0LmZpbGVQYXRoLnN0YXJ0c1dpdGgocGFnZXNEaXIpLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwYXRobmFtZSBvZiBwYXRobmFtZXMpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gc3RhdGljRmlsZXMuZ2V0KHBhdGhuYW1lKTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nICE9PSBrZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFR3byBzdGF0aWMgZmlsZXMgY2xhaW0gdGhlIHBhdGhuYW1lIGAgK1xuICAgICAgICAgICAgYFwiJHtwYXRobmFtZX1cIiAoXCIke2V4aXN0aW5nfVwiIGFuZCBcIiR7a2V5fVwiKS4gRGlzcGF0Y2ggY2Fubm90IGAgK1xuICAgICAgICAgICAgYGNob29zZSBiZXR3ZWVuIHRoZW0uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHN0YXRpY0ZpbGVzLnNldChwYXRobmFtZSwga2V5KTtcbiAgICB9XG4gIH1cblxuICAvLyBTb3J0ZWQgYmVjYXVzZSBvYmplY3Qga2V5cyBrZWVwIGluc2VydGlvbiBvcmRlciwgYW5kIGEgYnl0ZS1zdGFibGVcbiAgLy8gYG1hbmlmZXN0Lmpzb25gIGlzIHdoYXQga2VlcHMgaXQgZGlmZmFibGUgYW5kIHRoZSBDREsgYXNzZXQgaGFzaCBmcm9tXG4gIC8vIGNodXJuaW5nLlxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5zdGF0aWNGaWxlc10uc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogMSkpLFxuICApO1xufVxuXG4vKipcbiAqIFRoZSBwYXRobmFtZXMgYW4gb3V0cHV0IGFuc3dlcnMsIHdoaWNoIGZvciBvbmUgc2hhcGUgaXMgbm90IHRoZSBwYXRobmFtZVxuICogYG5leHQgYnVpbGRgIHJlcG9ydGVkLlxuICpcbiAqICoqQSBQYWdlcyBSb3V0ZXIgaG9tZSBwYWdlIGFycml2ZXMgYXMgYC9pbmRleGAuKiogVGhlIGFkYXB0ZXIgaG9vayBkZXJpdmVzIGV2ZXJ5XG4gKiBQYWdlcyBwYXRobmFtZSB3aXRoIGBub3JtYWxpemVQYWdlUGF0aChwYWdlKWAsIGFuZCBgbm9ybWFsaXplUGFnZVBhdGgoXCIvXCIpYCBpc1xuICogYFwiL2luZGV4XCJgIChgbmV4dC9kaXN0L3NoYXJlZC9saWIvcGFnZS1wYXRoL25vcm1hbGl6ZS1wYWdlLXBhdGguanNgKSDigJQgZm9yIHRoZVxuICogYFBBR0VTYCBvdXRwdXQgb2YgYW4gU1NHIG9yIFNTUiBob21lIHBhZ2UgYW5kIGZvciB0aGUgYFNUQVRJQ19GSUxFYCBvZiBhXG4gKiBmdWxseS1zdGF0aWMgb25lIGFsaWtlLiBgL2luZGV4YCBpcyBub3QgYSBVUkwgYW55b25lIHJlcXVlc3RzLCBhbmQgbm90aGluZyBlbHNlXG4gKiBpbiB0aGUgb3V0cHV0cyBjYXJyaWVzIGAvYCBmb3IgdGhhdCBwYWdlLCBzbyB3aXRob3V0IHRoaXMgdGhlIGhvbWUgcGFnZSBpcyBpblxuICogbmVpdGhlciBgbWFuaWZlc3QucGF0aG5hbWVzYCBub3IgYG1hbmlmZXN0LmVudHJ5cG9pbnRzYC9gc3RhdGljRmlsZXNgLCBhbmQgZXZlcnlcbiAqIHJlcXVlc3QgdG8gYC9gIDQwNHMgd2hpbGUgZXZlcnkgb3RoZXIgcGFnZSBvZiB0aGUgc2FtZSBhcHAgc2VydmVzLiBNZWFzdXJlZFxuICogYWdhaW5zdCBuZXh0LmpzJ3MgYHRlc3QvZTJlL25ldy1saW5rLWJlaGF2aW9yYCAoYC9gIHJldHVybmVkIHRoZSBidWlsdC1pbiA0MDQsXG4gKiB0aGUgc2l4IG90aGVyIHBhZ2VzIHdlcmUgZmluZSkgYW5kIGB0ZXN0L2UyZS9wcmVyZW5kZXItcHJldmlld2AgKHRoZSBvbmUgY2FzZVxuICogdGhhdCBmZXRjaGVzIGAvYCBnb3QgdGhlIDQwNCBwYWdlJ3MgSFRNTCwgdGhlIGVpZ2h0IHRoYXQgaGl0IEFQSSByb3V0ZXMgcGFzc2VkKS5cbiAqXG4gKiBQYWdlcyBSb3V0ZXIgb3V0cHV0cyBvbmx5LCB3aGljaCBpcyB3aGF0IGBmcm9tUGFnZXNSb3V0ZXJgIHNheXMuIEFwcCBSb3V0ZXJcbiAqIHJlcG9ydHMgaXRzIGhvbWUgcGFnZSBhcyBgL2AgYW5kIG9ubHkgdGhlIFJTQyBzaWJsaW5nIGFzIGAvaW5kZXgucnNjYCwgc28gYW5cbiAqIEFwcCBSb3V0ZXIgYC9pbmRleGAgaXMgYGFwcC9pbmRleC9wYWdlLnRzeGAg4oCUIGEgcmVhbCByb3V0ZSBhdCBgL2luZGV4YCwgYW5kXG4gKiBtYXBwaW5nIGl0IHRvIGAvYCBtYWRlIGFuIGFwcCB3aXRoIGJvdGggcGFnZXMgZmFpbCB0aGUgYnVpbGQgb24gYSBwYXRobmFtZVxuICogY29sbGlzaW9uLCBhbmQgYW4gYXBwIHdpdGggb25seSB0aGUgc2Vjb25kIHNlcnZlIGl0IGF0IGAvYC4gVGhlIHNhbWUgZ29lcyBmb3JcbiAqIGEgYHB1YmxpYy9pbmRleGAgZmlsZS5cbiAqXG4gKiBCb3RoIHBhdGhuYW1lcyBhcmUgcmVnaXN0ZXJlZC4gYC9gIGJlY2F1c2UgaXQgaXMgdGhlIHJlYWwgb25lOyBgL2luZGV4YCBiZWNhdXNlXG4gKiBuZXh0J3Mgb3duIG1pbmltYWwgbW9kZSDigJQgdGhlIG1vZGUgb3VyIHJ1bnRpbWUgcnVucyBpbiDigJQgYWNjZXB0cyBpdCwgcmV3cml0aW5nXG4gKiBgcmVxLnVybGAgYW5kIGB4LW1hdGNoZWQtcGF0aGAgZnJvbSBgL2luZGV4YCB0byBgL2AgYmVmb3JlIG1hdGNoaW5nXG4gKiAoYGJhc2Utc2VydmVyLnRzYCwgXCJpbiBtaW5pbWFsIG1vZGVcIiksIHNvIGRyb3BwaW5nIGl0IHdvdWxkIGJlIGEgZGl2ZXJnZW5jZSBpblxuICogdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAqXG4gKiBVbmFtYmlndW91cyB3aXRoaW4gdGhlIFBhZ2VzIFJvdXRlciBkZXNwaXRlIHRoZSBjb2xsaXNpb24gaXQgbG9va3MgbGlrZTpcbiAqIGBub3JtYWxpemVQYWdlUGF0aChcIi9pbmRleFwiKWAgaXMgYFwiL2luZGV4L2luZGV4XCJgLCBzbyBhIHJlcG9ydGVkIGAvaW5kZXhgIGNhblxuICogb25seSBoYXZlIGNvbWUgZnJvbSB0aGUgcGFnZSBgL2AuXG4gKiBUaGUgZGF0YSByb3V0ZSBvZiB0aGUgc2FtZSBwYWdlLCBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+L2luZGV4Lmpzb25gLCBhbmQgYW4gQXBwXG4gKiBSb3V0ZXIgYC9pbmRleC5yc2NgIGFyZSBib3RoIHJlYWwgVVJMcyBhbmQgYXJlIGxlZnQgYWxvbmUgYnkgdGhlIGV4YWN0IG1hdGNoLlxuICovXG5mdW5jdGlvbiByb3V0YWJsZVBhdGhuYW1lcyhcbiAgcGF0aG5hbWU6IHN0cmluZyxcbiAgYmFzZVBhdGg6IHN0cmluZyxcbiAgZnJvbVBhZ2VzUm91dGVyOiBib29sZWFuLFxuKTogc3RyaW5nW10ge1xuICBpZiAoIWZyb21QYWdlc1JvdXRlciB8fCBwYXRobmFtZSAhPT0gYCR7YmFzZVBhdGh9L2luZGV4YCkge1xuICAgIHJldHVybiBbcGF0aG5hbWVdO1xuICB9XG4gIC8vIGBiYXNlUGF0aCB8fCBcIi9cImAsIG5vdCBgJHtiYXNlUGF0aH0vYDogd2l0aCBgYmFzZVBhdGg6IFwiL3Byb2RcImAgdGhlIGhvbWUgcGFnZVxuICAvLyBpcyBgL3Byb2RgLCB3aGljaCBpcyBob3cgdGhlIEFwcCBSb3V0ZXIgZml4dHVyZXMgcmVwb3J0IHRoZWlycy5cbiAgcmV0dXJuIFtiYXNlUGF0aCB8fCBcIi9cIiwgcGF0aG5hbWVdO1xufVxuXG4vKipcbiAqIEFkZCB0aGUgc3RhdGljIGZpbGVzIHRoZSAqcnVudGltZSogc2VydmVzIHRvIGEgc3RhZ2luZyBwbGFuIOKAlCB0aGUgXCJldmVyeXRoaW5nXG4gKiBlbHNlXCIgcG9wdWxhdGlvbiBkZXNjcmliZWQgb24ge0BsaW5rIGNvbGxlY3RTdGF0aWNGaWxlc30sIGFsbCBvZiBpdCB1bmRlclxuICogYDxkaXN0RGlyPi9zZXJ2ZXIvYC5cbiAqXG4gKiBTZXBhcmF0ZSBmcm9tIGJ1aWxkaW5nIHRoZSBtYW5pZmVzdCdzIGBzdGF0aWNGaWxlc2AgbWFwIGJlY2F1c2UgdGhlIG1hcCBpcyB0aGVcbiAqIHNhbWUgZm9yIGV2ZXJ5IGdyb3VwIHdoaWxlIHRoZSBzdGFnaW5nIGlzIGFwcGxpZWQgb25jZSBwZXIgZGVwbG95bWVudCByb290OlxuICogYW55IGdyb3VwIGNhbiBiZSBhc2tlZCBmb3IgYC80MDRgLCBzbyBldmVyeSBncm91cCBzaGlwcyB0aGVzZS5cbiAqL1xuZnVuY3Rpb24gc3RhZ2VTZXJ2ZWRTdGF0aWNGaWxlcyhcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgc3RhZ2luZzogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IHZvaWQge1xuICBjb25zdCB7IHJlcG9Sb290LCBkaXN0RGlyIH0gPSBjdHg7XG4gIGNvbnN0IGNsaWVudFN0YXRpY0RpciA9IGpvaW4oZGlzdERpciwgXCJzdGF0aWNcIikgKyBzZXA7XG5cbiAgZm9yIChjb25zdCBvdXRwdXQgb2YgY3R4Lm91dHB1dHMuc3RhdGljRmlsZXMpIHtcbiAgICBjb25zdCBzZXJ2ZWRCeVMzID1cbiAgICAgIG91dHB1dC5maWxlUGF0aC5zdGFydHNXaXRoKGNsaWVudFN0YXRpY0RpcikgfHxcbiAgICAgICFvdXRwdXQuZmlsZVBhdGguc3RhcnRzV2l0aChkaXN0RGlyICsgc2VwKTtcbiAgICBpZiAoc2VydmVkQnlTMykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpO1xuICAgIGFzc2VydFN0YWdpbmdLZXkoa2V5LCBvdXRwdXQuZmlsZVBhdGgpO1xuICAgIHN0YWdpbmcuc2V0KGtleSwgb3V0cHV0LmZpbGVQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBpbnZhcmlhbnQgYmVoaW5kIGBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXJgOiBgbmV4dCBidWlsZGAgbXVzdCBydW4gZnJvbVxuICogdGhlIHByb2plY3QgZGlyZWN0b3J5LlxuICpcbiAqIE5leHQgaW5saW5lcyBgcmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcHJvamVjdERpcilgIGludG8gZXZlcnkgZW50cnlwb2ludFxuICogKGBkZWZpbmUtZW52LmpzYCkgYW5kIHRoZSBidWlsdCBjb2RlIHJlc29sdmVzIGl0IGFnYWluc3QgdGhlICpydW50aW1lKlxuICogYHByb2Nlc3MuY3dkKClgLiBLZWVwaW5nIGJ1aWxkIGN3ZCBhbmQgcHJvamVjdCBkaXIgZXF1YWwgbWFrZXMgdGhhdCBpbmxpbmVkXG4gKiB2YWx1ZSBgXCJcImAsIHNvIHRoZSBydW50aW1lIG9ubHkgaGFzIHRvIGBjaGRpcmAgdG8gdGhlIHN0YWdlZCBwcm9qZWN0IGRpci4gQVxuICogYnVpbGQgcnVuIGZyb20gZWxzZXdoZXJlIHdvdWxkIGlubGluZSBhIG5vbi1lbXB0eSByZWxhdGl2ZSBwYXRoIOKAlCBvZnRlbiBvbmVcbiAqIHBvaW50aW5nIG91dHNpZGUgdGhlIHN0YWdpbmcgdHJlZSDigJQgYW5kIGV2ZXJ5IGVudHJ5cG9pbnQgd291bGQgZmFpbCB0byBmaW5kXG4gKiBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gIGF0IHJ1bnRpbWUgd2l0aCBubyBoaW50IGFzIHRvIHdoeS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0QnVpbGRDd2QoY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCwgYnVpbGRDd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjd2QgPSByZXNvbHZlKGJ1aWxkQ3dkKTtcbiAgaWYgKGN3ZCA9PT0gcmVzb2x2ZShjdHgucHJvamVjdERpcikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGAke0xPR19QUkVGSVh9IFxcYG5leHQgYnVpbGRcXGAgbXVzdCBydW4gZnJvbSB0aGUgTmV4dC5qcyBwcm9qZWN0IGAgK1xuICAgICAgYGRpcmVjdG9yeS4gSXQgcmFuIGZyb20gXCIke2N3ZH1cIiB3aXRoIHRoZSBwcm9qZWN0IGF0IGAgK1xuICAgICAgYFwiJHtjdHgucHJvamVjdERpcn1cIi4gTmV4dC5qcyBiYWtlcyB0aGUgcmVsYXRpdmUgcGF0aCBiZXR3ZWVuIHRob3NlIHR3byBgICtcbiAgICAgIGBpbnRvIGV2ZXJ5IGJ1aWx0IGVudHJ5cG9pbnQsIGFuZCBjZGstbmV4dGpzIGNhbm5vdCByZXByb2R1Y2UgdGhhdCBsYXlvdXQgYCArXG4gICAgICBgaW4gdGhlIGRlcGxveW1lbnQgcGFja2FnZS4gQ2hhbmdlIGRpcmVjdG9yeSBmaXJzdCAoXFxgY2QgYCArXG4gICAgICBgJHtyZWxhdGl2ZShjd2QsIGN0eC5wcm9qZWN0RGlyKSB8fCBcIi5cIn0gJiYgbmV4dCBidWlsZFxcYCkgaW5zdGVhZCBvZiBgICtcbiAgICAgIGBwYXNzaW5nIHRoZSBkaXJlY3RvcnkgYXMgYW4gYXJndW1lbnQ7IGluIGEgbW9ub3JlcG8sIHJ1biB0aGUgYXBwJ3Mgb3duIGAgK1xuICAgICAgYGJ1aWxkIHNjcmlwdCBmcm9tIGl0cyBkaXJlY3RvcnkgKGUuZy4gXFxgcG5wbSAtLWZpbHRlciA8YXBwPiBidWlsZFxcYCwgYCArXG4gICAgICBgd2hpY2ggcnVucyBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkpLmAsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFkZEVudHJ5cG9pbnQoXG4gIGVudHJ5cG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyRW50cnlwb2ludD4sXG4gIHJlcG9Sb290OiBzdHJpbmcsXG4gIG91dHB1dDogeyBpZDogc3RyaW5nOyBwYXRobmFtZTogc3RyaW5nOyBmaWxlUGF0aDogc3RyaW5nIH0sXG4gIHR5cGU6IEFkYXB0ZXJFbnRyeXBvaW50VHlwZSxcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IHZvaWQge1xuICBjb25zdCBmaWxlUGF0aCA9IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpO1xuICBjb25zdCBwYXRobmFtZXMgPSByb3V0YWJsZVBhdGhuYW1lcyhcbiAgICBvdXRwdXQucGF0aG5hbWUsXG4gICAgYmFzZVBhdGgsXG4gICAgdHlwZSA9PT0gXCJwYWdlXCIsXG4gICk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgcGF0aG5hbWVzKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBlbnRyeXBvaW50c1twYXRobmFtZV07XG4gICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLmZpbGVQYXRoICE9PSBmaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBUd28gYnVpbGQgb3V0cHV0cyBjbGFpbSB0aGUgcGF0aG5hbWUgXCIke3BhdGhuYW1lfVwiIGAgK1xuICAgICAgICAgIGAoXCIke2V4aXN0aW5nLmZpbGVQYXRofVwiIGFuZCBcIiR7ZmlsZVBhdGh9XCIpLiBEaXNwYXRjaCBjYW5ub3QgY2hvb3NlIGAgK1xuICAgICAgICAgIGBiZXR3ZWVuIHRoZW0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGVudHJ5cG9pbnRzW3BhdGhuYW1lXSA9IHsgaWQ6IG91dHB1dC5pZCwgZmlsZVBhdGgsIHR5cGUgfTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZCB0aGUgKnByZXJlbmRlciogcGF0aG5hbWVzIHRoYXQgbm8gaW52b2NhYmxlIG91dHB1dCBjbGFpbXMgYW5kIHRoYXQgcm91dGluZ1xuICogY2Fubm90IG90aGVyd2lzZSByZWFjaC5cbiAqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgY2FuIG9ubHkgbWF0Y2ggYSBwYXRobmFtZSBwcmVzZW50IGluIGBtYW5pZmVzdC5wYXRobmFtZXNgLCBhbmRcbiAqIGZvciBhIGR5bmFtaWMgbWF0Y2ggaXQgcmV0dXJucyB0aGUgKip0ZW1wbGF0ZSoqIGl0IG1hdGNoZWQuIFJvdXRlcyBhbmQgc3RhdGljXG4gKiBmaWxlcyBjb3ZlciBtb3N0IG9mIHRoYXQ7IHR3byBzaGFwZXMgdGhleSBtaXNzOlxuICpcbiAqIDEuICoqVGVtcGxhdGVzLioqIEEgcmVxdWVzdCBmb3IgYC9fbmV4dC9kYXRhLzxidWlsZElkPi9mci9ibG9nL2hlbGxvLmpzb25gIG9ubHlcbiAqICAgIHJlc29sdmVzIGlmIGAvX25leHQvZGF0YS88YnVpbGRJZD4vZnIvYmxvZy9bc2x1Z10uanNvbmAgaXMgbGlzdGVkLCBhbmQgdGhhdFxuICogICAgcGF0aG5hbWUgZXhpc3RzIHNvbGVseSBhcyBhIGBwcmVyZW5kZXJzYCBlbnRyeS5cbiAqIDFiLiAqKkEgc3RhdGljIGBnZXRTdGF0aWNQcm9wc2AgcGFnZSdzIGRhdGEgcm91dGUuKiogYC9fbmV4dC9kYXRhLzxidWlsZElkPi9nc3AuanNvbmBcbiAqICAgIGhhcyBubyB0ZW1wbGF0ZSB0byBtYXRjaCBhbmQgbm8gcnVsZSBvZiBpdHMgb3duOiBgbmV4dCBidWlsZGAgb25seSBlbWl0cyBhXG4gKiAgICBgZHluYW1pY1JvdXRlc2AgcnVsZSBmb3IgYSBkYXRhIHJvdXRlIHdoZW4gdGhlIHBhZ2UgaXMgZHluYW1pYyAqb3IqIHRoZSBhcHAgaGFzXG4gKiAgICBtaWRkbGV3YXJlIChgYnVpbGQtY29tcGxldGUudHNgLCBgbmVlZHNNaWRkbGV3YXJlUmVzb2x2ZVJvdXRlc2AsIHdoaWNoIGlzIGFsc29cbiAqICAgIHdoYXQgYHJvdXRpbmcuc2hvdWxkTm9ybWFsaXplTmV4dERhdGFgIHJlcG9ydHMpLiBXaXRob3V0IG1pZGRsZXdhcmUgTmV4dC5qc1xuICogICAgZXhwZWN0cyB0aGUgcGxhdGZvcm0gdG8gc2VydmUgdGhlIGRhdGEgcm91dGUgYXMgYW4gb3V0cHV0LCBieSBwYXRobmFtZSDigJQgc28gYVxuICogICAgY29uY3JldGUgZGF0YS1yb3V0ZSBwcmVyZW5kZXIgaXMgcmVnaXN0ZXJlZCB3aGF0ZXZlciB0aGUgcnVsZXMgc2F5LiBNaXNzaW5nIGl0XG4gKiAgICB0dXJuZWQgZXZlcnkgY2xpZW50LXNpZGUgbmF2aWdhdGlvbiBpbnRvIHN1Y2ggYSBwYWdlIGludG8gYSBmdWxsIHBhZ2UgbG9hZCxcbiAqICAgIGJlY2F1c2UgdGhlIHJvdXRlcidzIGAuanNvbmAgZmV0Y2ggNDA0J2Q6IG1lYXN1cmVkIGFnYWluc3RcbiAqICAgIGB0ZXN0L2UyZS9uby1wYWdlLXByb3BzYC4gT25seSB3aGVuIG5vICp1bmdhdGVkKiBydWxlIG1hdGNoZXMsIGZvciB0aGUgcmVhc29uXG4gKiAgICBiZWxvdyDigJQgYSBkeW5hbWljIHBhZ2UncyBgL+KApi9ibG9nL2hlbGxvLmpzb25gIG11c3Qga2VlcCByZXNvbHZpbmcgdG8gaXRzXG4gKiAgICBgW3NsdWddLmpzb25gIHRlbXBsYXRlLCB3aGljaCBpcyB3aGVyZSBgbnh0UHNsdWdgIGNvbWVzIGZyb20uXG4gKiAyLiAqKkNvbmNyZXRlIHBhdGhuYW1lcyB3aG9zZSBkeW5hbWljIHJvdXRlIHJ1bGUgaXMgZ2F0ZWQuKiogQSByb3V0ZSB3aG9zZSBwYXJhbXNcbiAqICAgIGNhbiBuZXZlciBiZSBmaWxsZWQgYXQgcmVxdWVzdCB0aW1lIOKAlCByb290IHBhcmFtcyBhcmUgdGhlIGNhc2UgdGhhdCBwcm9kdWNlZFxuICogICAgdGhpcywgYGFwcC9bbG9jYWxlXS9wYWdlLnRzeGAgd2l0aCBgZ2VuZXJhdGVTdGF0aWNQYXJhbXMoKWAgYW5kIG5vXG4gKiAgICBgYXBwL2xheW91dC50c3hgIOKAlCBnZXRzIGl0cyBgZHluYW1pY1JvdXRlc2AgcnVsZSBlbWl0dGVkIHdpdGggYSBkcmFmdC1tb2RlXG4gKiAgICBgaGFzYCBvbiBgX19wcmVyZW5kZXJfYnlwYXNzYC4gTmV4dC5qcyBpcyBzYXlpbmc6IGludm9rZSB0aGUgZnVuY3Rpb24gb25seSBpblxuICogICAgZHJhZnQgbW9kZSwgYW5kIG90aGVyd2lzZSBzZXJ2ZSB0aGUgcHJlcmVuZGVyIHlvdSB3ZXJlIGhhbmRlZC4gVmVyY2VsJ3MgQ0ROXG4gKiAgICBkb2VzIHRoYXQgZnJvbSB0aGUgb3V0cHV0IGl0c2VsZjsgd2Ugcm91dGUgdGhlIHJlcXVlc3QgdG8gdGhlIG93bmluZ1xuICogICAgZW50cnlwb2ludCwgd2hpY2ggYW5zd2VycyBpdCBvdXQgb2YgdGhlIHNlZWRlZCBjYWNoZS4gV2l0aG91dCB0aGlzLCBgL2VuYCBpcyBhXG4gKiAgICA0MDQgd2hpbGUgYG5leHQgc3RhcnRgIHJlbmRlcnMgaXQg4oCUIGFuZCBzbyBpcyBldmVyeSBgLnJzY2AvYC5zZWdtZW50c2BcbiAqICAgIHZhcmlhbnQsIHdoaWNoIGlzIHdoeSBhIGNsaWVudC1zaWRlIG5hdmlnYXRpb24gaW50byBzdWNoIGFuIGFwcCBuZXZlclxuICogICAgY29tcGxldGVzLlxuICpcbiAqIEEgY29uY3JldGUgcGF0aG5hbWUgaXMgYWRkZWQgb25seSB3aGVuIGEgZ2F0ZWQgcnVsZSBtYXRjaGVzIGl0IGFuZCBubyB1bmdhdGVkXG4gKiBvbmUgZG9lcyDigJQgdGhlIHNldCB0aGF0IHdvdWxkIDQwNCB0b2RheSAqYW5kKiB0aGF0IHJvdXRpbmcgY2FuIHN0aWxsIHByb2R1Y2UuXG4gKiBBZGRpbmcgdGhlbSB1bmNvbmRpdGlvbmFsbHkgd2FzIG1lYXN1cmVkIHRvIGJlIGFjdGl2ZWx5IHdyb25nIHR3aWNlIG92ZXI6XG4gKiBgL2lzci8xYCByZXNvbHZlcyB0byBpdHNlbGYgcmF0aGVyIHRoYW4gdG8gYC9pc3IvW2lkXWAsIGxvc2luZyB0aGUgYG54dFBpZGBcbiAqIHF1ZXJ5IHBhcmFtIHRoZSByb3V0ZSBuZWVkcywgYW5kIHBhdGhuYW1lcyBubyBydWxlIG1hdGNoZXMgYXQgYWxsIChhIHN0YXRpY1xuICogcm91dGUncyBgLnNlZ21lbnRzL+KApmAgb3V0cHV0cywgd2hpY2ggYHJlc29sdmVSb3V0ZXNgIG5ldmVyIGFza3MgZm9yKSBhcmUgZGVhZFxuICogbWFuaWZlc3Qgd2VpZ2h0LiBNYXRjaGluZyBtaXJyb3JzIGByZXNvbHZlUm91dGVzYCwgd2hpY2ggaXMgY2FzZS1pbnNlbnNpdGl2ZSBieVxuICogZGVmYXVsdC5cbiAqXG4gKiBUaGUgb3duaW5nIGVudHJ5cG9pbnQgY29tZXMgZnJvbSBgcHJlcmVuZGVyLnJvdXRlYCwgd2hpY2ggaXMgdGhlIHVucHJlZml4ZWQgYW5kXG4gKiB1bmxvY2FsaXplZCBzb3VyY2Ugcm91dGUgKGAvYmxvZy9bc2x1Z11gKSwgaGVuY2UgdGhlIGJhc2VQYXRoLXRoZW4tYmFyZSBsYWRkZXIuXG4gKiBMb2NhbGUgdmFyaWFudHMgb2Ygb25lIHBhZ2Ugc2hhcmUgYSBgZmlsZVBhdGhgLCBzbyBhbnkgbG9jYWxlJ3MgZW50cnlwb2ludCBpc1xuICogdGhlIHJpZ2h0IHRhcmdldC4gQW4gUlNDIG9yIHNlZ21lbnQtcHJlZmV0Y2ggcGF0aG5hbWUgcHJlZmVycyB0aGUgcm91dGUncyBgLnJzY2BcbiAqIGVudHJ5cG9pbnQsIGJlY2F1c2UgdGhhdCBpcyB0aGUga2V5IGByZXNvbHZlUm91dGVzYCByZXNvbHZlcyBzdWNoIGEgcmVxdWVzdCB0by5cbiAqL1xuZnVuY3Rpb24gYWRkUHJlcmVuZGVyUGF0aG5hbWVzKFxuICBlbnRyeXBvaW50czogUmVjb3JkPHN0cmluZywgQWRhcHRlckVudHJ5cG9pbnQ+LFxuICBwcmVyZW5kZXJzOiBBZGFwdGVyT3V0cHV0c1tcInByZXJlbmRlcnNcIl0sXG4gIGR5bmFtaWNSb3V0ZXM6IHtcbiAgICBzb3VyY2VSZWdleDogc3RyaW5nO1xuICAgIGhhcz86IHVua25vd25bXTtcbiAgICBtaXNzaW5nPzogdW5rbm93bltdO1xuICB9W10sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4gIGRhdGFSb3V0ZVByZWZpeDogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IG1hdGNoZXJzID0gZHluYW1pY1JvdXRlcy5tYXAoKHJvdXRlKSA9PiAoe1xuICAgIHJlZ2V4OiBuZXcgUmVnRXhwKHJvdXRlLnNvdXJjZVJlZ2V4LCBcImlcIiksXG4gICAgZ2F0ZWQ6IEJvb2xlYW4ocm91dGUuaGFzPy5sZW5ndGggfHwgcm91dGUubWlzc2luZz8ubGVuZ3RoKSxcbiAgfSkpO1xuICBjb25zdCBtYXRjaGluZ1J1bGVzID0gKHBhdGhuYW1lOiBzdHJpbmcpID0+XG4gICAgbWF0Y2hlcnMuZmlsdGVyKCh7IHJlZ2V4IH0pID0+IHJlZ2V4LnRlc3QocGF0aG5hbWUpKTtcbiAgY29uc3Qgb25seUdhdGVkUnVsZXNNYXRjaCA9IChwYXRobmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoaW5nUnVsZXMocGF0aG5hbWUpO1xuICAgIHJldHVybiBtYXRjaGVkLmxlbmd0aCA+IDAgJiYgbWF0Y2hlZC5ldmVyeSgoeyBnYXRlZCB9KSA9PiBnYXRlZCk7XG4gIH07XG4gIC8qKlxuICAgKiBOb3RoaW5nIHJlYWNoZXMgdGhpcyBwYXRobmFtZSBhdCByZXF1ZXN0IHRpbWU6IGVpdGhlciBubyBydWxlIG1hdGNoZXMgaXQgb3JcbiAgICogZXZlcnkgcnVsZSB0aGF0IGRvZXMgaXMgZ2F0ZWQuIFRoZSBnYXRlZCBoYWxmIGlzIHtAbGluayBvbmx5R2F0ZWRSdWxlc01hdGNofTtcbiAgICogdGhlIFwibm8gcnVsZSBhdCBhbGxcIiBoYWxmIG9ubHkgZXZlciBob2xkcyBmb3IgYSBkYXRhIHJvdXRlLCBiZWNhdXNlIGEgcGFnZSdzXG4gICAqIG93biBwYXRobmFtZSBpcyBhbiBvdXRwdXQuXG4gICAqL1xuICBjb25zdCBub3RoaW5nVW5nYXRlZE1hdGNoZXMgPSAocGF0aG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBtYXRjaGluZ1J1bGVzKHBhdGhuYW1lKS5ldmVyeSgoeyBnYXRlZCB9KSA9PiBnYXRlZCk7XG5cbiAgY29uc3Qgb3JwaGFuczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcmVyZW5kZXIgb2YgcHJlcmVuZGVycykge1xuICAgIGNvbnN0IHsgcGF0aG5hbWUgfSA9IHByZXJlbmRlcjtcbiAgICBpZiAoZW50cnlwb2ludHNbcGF0aG5hbWVdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNUZW1wbGF0ZSA9IHBhdGhuYW1lLmluY2x1ZGVzKFwiW1wiKTtcbiAgICBjb25zdCBpc0RhdGFSb3V0ZSA9XG4gICAgICBwYXRobmFtZS5zdGFydHNXaXRoKGRhdGFSb3V0ZVByZWZpeCkgJiYgcGF0aG5hbWUuZW5kc1dpdGgoXCIuanNvblwiKTtcbiAgICBjb25zdCByZWFjaGFibGUgPSBpc0RhdGFSb3V0ZVxuICAgICAgPyBub3RoaW5nVW5nYXRlZE1hdGNoZXMocGF0aG5hbWUpXG4gICAgICA6IG9ubHlHYXRlZFJ1bGVzTWF0Y2gocGF0aG5hbWUpO1xuICAgIGlmICghaXNUZW1wbGF0ZSAmJiAhcmVhY2hhYmxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc3VmZml4ZXMgPSBwYXRobmFtZS5lbmRzV2l0aChcIi5yc2NcIikgPyBbXCIucnNjXCIsIFwiXCJdIDogW1wiXCJdO1xuICAgIGNvbnN0IG93bmVyID0gc3VmZml4ZXNcbiAgICAgIC5mbGF0TWFwKChzdWZmaXgpID0+IFtcbiAgICAgICAgYCR7YmFzZVBhdGh9JHtwcmVyZW5kZXIucm91dGV9JHtzdWZmaXh9YCxcbiAgICAgICAgYCR7cHJlcmVuZGVyLnJvdXRlfSR7c3VmZml4fWAsXG4gICAgICBdKVxuICAgICAgLm1hcCgoa2V5KSA9PiBlbnRyeXBvaW50c1trZXldKVxuICAgICAgLmZpbmQoQm9vbGVhbik7XG4gICAgaWYgKCFvd25lcikge1xuICAgICAgb3JwaGFucy5wdXNoKGAke3BhdGhuYW1lfSAocm91dGU6IFwiJHtwcmVyZW5kZXIucm91dGV9XCIpYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZW50cnlwb2ludHNbcGF0aG5hbWVdID0ge1xuICAgICAgaWQ6IHByZXJlbmRlci5pZCxcbiAgICAgIGZpbGVQYXRoOiBvd25lci5maWxlUGF0aCxcbiAgICAgIHR5cGU6IG93bmVyLnR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcnBoYW5zLmxlbmd0aCA+IDApIHtcbiAgICAvLyBXYXJuIHJhdGhlciB0aGFuIHRocm93OiBhbiB1bm1hcHBlZCBwYXRobmFtZSBkZWdyYWRlcyBvbmUgVVJMIHNoYXBlIHRvIGFcbiAgICAvLyA0MDQsIHdoaWNoIGlzIHdoYXQgd291bGQgaGFwcGVuIHdpdGhvdXQgdGhpcyBmdW5jdGlvbiBhdCBhbGwuIEEgdGhyb3dcbiAgICAvLyB3b3VsZCBicmVhayB0aGUgYnVpbGQgb3V0cmlnaHQgb24gYW4gb3V0cHV0IHNoYXBlIGEgZnV0dXJlIGBuZXh0YCBtaW5vclxuICAgIC8vIG1pZ2h0IGludHJvZHVjZS5cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSAke29ycGhhbnMubGVuZ3RofSBwcmVyZW5kZXIgcGF0aG5hbWUocykgaGF2ZSBubyBgICtcbiAgICAgICAgYG1hdGNoaW5nIHJvdXRlIGVudHJ5cG9pbnQgYW5kIHdpbGwgNDA0OiBgICtcbiAgICAgICAgYCR7b3JwaGFucy5zbGljZSgwLCA1KS5qb2luKFwiLCBcIil9YCArXG4gICAgICAgIGAke29ycGhhbnMubGVuZ3RoID4gNSA/IGAsIGFuZCAke29ycGhhbnMubGVuZ3RoIC0gNX0gbW9yZWAgOiBcIlwifS5gLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRNaWRkbGV3YXJlKFxuICByZXBvUm9vdDogc3RyaW5nLFxuICBtaWRkbGV3YXJlOiBBZGFwdGVyT3V0cHV0c1tcIm1pZGRsZXdhcmVcIl0sXG4pOiBBZGFwdGVyTWlkZGxld2FyZSB8IG51bGwge1xuICBpZiAoIW1pZGRsZXdhcmUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBgY29uZmlnLm1hdGNoZXJzYCBpcyBkZWxpYmVyYXRlbHkgbm90IGNvcGllZCBoZXJlOiBpdCBhcnJpdmVzIGluc2lkZVxuICAvLyBgY3R4LnJvdXRpbmcubWlkZGxld2FyZU1hdGNoZXJzYCwgd2hpY2ggYEBuZXh0L3JvdXRpbmdgIGNvbnN1bWVzIGRpcmVjdGx5LlxuICByZXR1cm4ge1xuICAgIGlkOiBtaWRkbGV3YXJlLmlkLFxuICAgIGZpbGVQYXRoOiB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBtaWRkbGV3YXJlLmZpbGVQYXRoKSksXG4gIH07XG59XG5cbi8qKlxuICogQ29weSB0aGUgc3RhZ2luZyBwbGFuIGludG8gYHN0YWdpbmdEaXJgLlxuICpcbiAqICoqU3ltbGlua3MgYXJlIHJlY3JlYXRlZCBhcyBzeW1saW5rcywgbm90IGRlcmVmZXJlbmNlZCoqLCB3aGljaCBpcyB3aGF0XG4gKiBOZXh0LmpzJ3Mgb3duIGBjb3B5VHJhY2VkRmlsZXNgIGRvZXMgKGBuZXh0L2Rpc3QvYnVpbGQvdXRpbHMuanNgOiBgcmVhZGxpbmtgXG4gKiB0aGVuIGBzeW1saW5rYCwgd2l0aCBhIFdpbmRvd3MganVuY3Rpb24gZmFsbGJhY2spLiBVbmRlciBwbnBtIGEgdHJhY2VkIGFzc2V0XG4gKiBrZXkgaXMgZnJlcXVlbnRseSBhICpkaXJlY3RvcnkqIHN5bWxpbmsgaW50byB0aGUgc3RvcmVcbiAqIChgbm9kZV9tb2R1bGVzLy5wbnBtL25leHRA4oCmL25vZGVfbW9kdWxlcy9yZWFjdGAg4oaSIGAuLi8uLi9yZWFjdEAxOS4yLjMv4oCmYCksIHNvXG4gKiBgY29weUZpbGVgIGZhaWxzIG91dHJpZ2h0IHdpdGggYEVOT1RTVVBgLiBEZXJlZmVyZW5jaW5nIGluc3RlYWQgd291bGQgdHJpcGxlXG4gKiB0aGUgdHJlZSDigJQgYGV4YW1wbGVzL2FwcC1wbGF5Z3JvdW5kYCBtZWFzdXJlcyAzMiBNQiBzdGFnZWQgdmVyc3VzIDk2IE1CIHdpdGhcbiAqIGBkdSAtc2hMYCwgYWdhaW5zdCBhIDI1MCBNQiB1bnppcHBlZCBMYW1iZGEgY2FwIOKAlCBiZWNhdXNlIHdob2xlIHBhY2thZ2VzIGFyZVxuICogcmVhY2hhYmxlIHRocm91Z2ggc2V2ZXJhbCBzdWNoIGxpbmtzLiBUaGUgbGluayB0YXJnZXRzIGFyZSB0aGVtc2VsdmVzIHN0YWdlZFxuICoga2V5cywgc28gcmVsYXRpdmUgbGlua3MgcmVzb2x2ZSBpbnNpZGUgdGhlIGRlcGxveW1lbnQgcm9vdC5cbiAqXG4gKiBSZWd1bGFyIGZpbGVzIGFyZSBzdGFnZWQgZmlyc3Qgc28gdGhhdCBhIHN5bWxpbmsgd2hvc2UgcGF0aCB3YXMgYWxyZWFkeVxuICogbWF0ZXJpYWxpemVkIGFzIGEgcmVhbCBkaXJlY3RvcnkgaXMgc2tpcHBlZCByYXRoZXIgdGhhbiBjbG9iYmVyaW5nIGl0LlxuICpcbiAqIE5vdGhpbmcgbWF5IGRlcmVmZXJlbmNlIHRoZW0gYWZ0ZXJ3YXJkczogdGhlIEZ1bmN0aW9ucyB6aXAga2VlcHMgdGhlbSBhc1xuICogbGlua3MgKGB6aXBEaXJlY3RvcnlgKSwgYW5kIHRoZSBDb250YWluZXJzIGBDT1BZYCBkb2VzIHRvby5cbiAqL1xuLyoqIEJvdW5kZWQgc28gYSBsYXJnZSBhcHAgZG9lc24ndCBleGhhdXN0IGZpbGUgZGVzY3JpcHRvcnMuICovXG5jb25zdCBTVEFHSU5HX0NPTkNVUlJFTkNZID0gMzI7XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlRmlsZXMoXG4gIHN0YWdpbmc6IFN0YWdpbmdQbGFuLFxuICBzdGFnaW5nRGlyOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGxhbm5lZCA9IFsuLi5zdGFnaW5nXTtcbiAgLy8gTGlua3MgbGFuZCBieSBwbGFuIGluZGV4LCBzbyB0aGUgcGFzcyBiZWxvdyBjcmVhdGVzIHRoZW0gaW4gdGhlIHBsYW4nc1xuICAvLyBvcmRlciB3aGF0ZXZlciBvcmRlciB0aGUgd29ya2VycyBmaW5pc2hlZCBpbi5cbiAgY29uc3QgbGlua3M6IEFycmF5PFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSB8IHVuZGVmaW5lZD4gPSBuZXcgQXJyYXkoXG4gICAgcGxhbm5lZC5sZW5ndGgsXG4gICk7XG4gIGxldCBuZXh0RW50cnkgPSAwO1xuICBjb25zdCB3b3JrZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKG5leHRFbnRyeSA8IHBsYW5uZWQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbmRleCA9IG5leHRFbnRyeSsrO1xuICAgICAgY29uc3QgW2tleSwgc291cmNlXSA9IHBsYW5uZWRbaW5kZXhdO1xuICAgICAgY29uc3QgbGlua1RhcmdldCA9IGF3YWl0IHJlYWRsaW5rKHNvdXJjZSkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICBpZiAobGlua1RhcmdldCAhPT0gbnVsbCkge1xuICAgICAgICBsaW5rc1tpbmRleF0gPSBba2V5LCBzb3VyY2UsIGxpbmtUYXJnZXRdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlc3QgPSBqb2luKHN0YWdpbmdEaXIsIGtleSk7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKGRlc3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7XG4gICAgfVxuICB9O1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBBcnJheS5mcm9tKFxuICAgICAgeyBsZW5ndGg6IE1hdGgubWluKFNUQUdJTkdfQ09OQ1VSUkVOQ1ksIHBsYW5uZWQubGVuZ3RoKSB9LFxuICAgICAgd29ya2VyLFxuICAgICksXG4gICk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgaWYgKGxpbmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IFtrZXksIHNvdXJjZSwgbGlua1RhcmdldF0gPSBsaW5rO1xuICAgIGNvbnN0IGRlc3QgPSBqb2luKHN0YWdpbmdEaXIsIGtleSk7XG4gICAgaWYgKGV4aXN0c1N5bmMoZGVzdCkpIHtcbiAgICAgIC8vIEFscmVhZHkgc3RhZ2VkIGFzIHJlYWwgY29udGVudCBieSB0aGUgcG9vbCBhYm92ZTsgdGhlIGxpbmsgd291bGQgYWRkXG4gICAgICAvLyBub3RoaW5nIGFuZCB3b3VsZCByZXBsYWNlIGEgZGlyZWN0b3J5IHdlIG5lZWQuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShkZXN0KSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGRpcm5hbWUoZGVzdCksIGxpbmtUYXJnZXQpO1xuICAgIGlmIChyZXNvbHZlZCA9PT0gc3RhZ2luZ0RpciB8fCByZXNvbHZlZC5zdGFydHNXaXRoKHN0YWdpbmdEaXIgKyBzZXApKSB7XG4gICAgICBhd2FpdCBzeW1saW5rKGxpbmtUYXJnZXQsIGRlc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQb2ludHMgb3V0c2lkZSB0aGUgZGVwbG95bWVudCByb290LCBzbyB0aGUgbGluayB3b3VsZCBkYW5nbGUgaW4gTGFtYmRhLlxuICAgICAgLy8gQWJzb2x1dGUgc3RvcmUgcGF0aHMgYXJlIHRoZSByZWFsaXN0aWMgY2FzZSBoZXJlLlxuICAgICAgYXdhaXQgY3Aoc291cmNlLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZGVyZWZlcmVuY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWRkcyB7QGxpbmsgUlVOVElNRV9ORVhUX01PRFVMRVN9LCBgQG5leHQvZW52YCwgYW5kIGV2ZXJ5dGhpbmcgdGhleSByZXF1aXJlIHRvXG4gKiBgc3RhZ2luZ2AsIGFuZCB7QGxpbmsgSU1BR0VfTkVYVF9NT0RVTEVTfSBhbmQgdGhlaXJzIHRvIGBpbWFnZVN0YWdpbmdgLlxuICpcbiAqIFdpdGhvdXQgdGhpcyB0aGUgZGVwbG95bWVudCBpcyBjb21wbGV0ZSBmb3IgZXZlcnkgcm91dGUgdGhlIGFwcCBoYXMgYW5kIGJyb2tlblxuICogZm9yIGAvX25leHQvaW1hZ2VgOiB0aGUgdHJhY2VkIGBhc3NldHNgIG9mIGEgYnVpbGQgb3V0cHV0IGNvdmVyIHdoYXQgdGhlICphcHAqXG4gKiByZWFjaGVzLCBhbmQgYW4gYXBwIG5ldmVyIHJlYWNoZXMgbmV4dCdzIGltYWdlIG9wdGltaXplciwgc29cbiAqIGBuZXh0L2Rpc3Qvc2VydmVyL2ltYWdlLW9wdGltaXplci5qc2AgYW5kIGl0cyBjbG9zdXJlIGFyZSBzaW1wbHkgYWJzZW50IGFuZFxuICogZXZlcnkgaW1hZ2UgcmVxdWVzdCA1MDBzIHdpdGggYSBgTU9EVUxFX05PVF9GT1VORGAgZnJvbSBgbmV4dE1vZHVsZWAuXG4gKlxuICogUmVzb2x1dGlvbiBpcyBhbmNob3JlZCBpbnNpZGUgYGN0eC5wcm9qZWN0RGlyYCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiBgdXNlTmV4dEZyb21gIGFuY2hvcnMgdGhlcmUgYXQgcnVudGltZTogaXQgaXMgdGhlIGRpcmVjdG9yeSB3aG9zZVxuICogYG5vZGVfbW9kdWxlc2Agd2FsayBmaW5kcyB0aGUgYXBwJ3MgYG5leHRgLiBBIHJlcG8gd2hlcmUgdGhhdCByZXNvbHV0aW9uIGZhaWxzXG4gKiBpcyBub3QgYSByZWFsIGBuZXh0IGJ1aWxkYCDigJQgbm90aGluZyBlbHNlIHdvdWxkIGhhdmUgcnVuIOKAlCBzbyBpdCB3YXJucyBhbmRcbiAqIGNvbnRpbnVlcyByYXRoZXIgdGhhbiBmYWlsaW5nIGEgYnVpbGQgZm9yIGEgcGFja2FnZSBpdCBjb3VsZCBub3QgaGF2ZSBuZWVkZWQuXG4gKiBBIG1pc3NpbmcgKnRyYWNlciogaXMgZGlmZmVyZW50OiBgbmV4dGAgaXMgcmlnaHQgdGhlcmUgYW5kIGltYWdlIG9wdGltaXphdGlvblxuICogd291bGQgc2lsZW50bHkgNTAwIGluIHByb2R1Y3Rpb24sIHNvIHRoYXQgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiBhZGRSdW50aW1lTmV4dENsb3N1cmUoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIHN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gIGltYWdlU3RhZ2luZzogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBUaGUgYW5jaG9yIGZpbGUgbmVlZG4ndCBleGlzdDsgYGNyZWF0ZVJlcXVpcmVgIG9ubHkgcmVhZHMgaXRzIGRpcmVjdG9yeS5cbiAgY29uc3QgbmV4dFJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKFxuICAgIGpvaW4oY3R4LnByb2plY3REaXIsIFwiY2RrLW5leHRqcy1uZXh0LXJlc29sdmVyLmNqc1wiKSxcbiAgKTtcblxuICBsZXQgZW50cmllczogc3RyaW5nW107XG4gIGxldCBpbWFnZUVudHJpZXM6IHN0cmluZ1tdO1xuICB0cnkge1xuICAgIGVudHJpZXMgPSBSVU5USU1FX05FWFRfTU9EVUxFUy5tYXAoKHNwZWNpZmllcikgPT5cbiAgICAgIG5leHRSZXF1aXJlLnJlc29sdmUoc3BlY2lmaWVyKSxcbiAgICApO1xuICAgIGltYWdlRW50cmllcyA9IElNQUdFX05FWFRfTU9EVUxFUy5tYXAoKHNwZWNpZmllcikgPT5cbiAgICAgIG5leHRSZXF1aXJlLnJlc29sdmUoc3BlY2lmaWVyKSxcbiAgICApO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAke0xPR19QUkVGSVh9IENvdWxkIG5vdCByZXNvbHZlIG5leHQncyBpbWFnZSBvcHRpbWl6ZXIgZnJvbSBgICtcbiAgICAgICAgYFwiJHtjdHgucHJvamVjdERpcn1cIiAoJHsoY2F1c2UgYXMgRXJyb3IpLm1lc3NhZ2V9KS4gUmVxdWVzdHMgdG8gYCArXG4gICAgICAgIGAvX25leHQvaW1hZ2Ugd2lsbCBmYWlsIGF0IHJ1bnRpbWUuYCxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBgbG9hZEVudkZpbGVzYCAocnVudGltZSBgbmV4dC1tb2R1bGVzLnRzYCkgbG9hZHMgdGhlIHN0YWdlZCBlbnYgZmlsZXMgd2l0aFxuICAvLyBgQG5leHQvZW52YCwgd2hpY2ggaXMgYG5leHRgJ3MgZGVwZW5kZW5jeSwgc28gcmVzb2x2ZWQgZnJvbSBgbmV4dGAncyBkaXIuXG4gIC8vIEFuIGFwcCBuZXZlciByZXF1aXJlcyBpdCwgc28gbm8gb3V0cHV0J3MgdHJhY2UgaGFzIGl0IGVpdGhlci5cbiAgY29uc3QgbmV4dFBhY2thZ2UgPSBuZXh0UmVxdWlyZS5yZXNvbHZlKFwibmV4dC9wYWNrYWdlLmpzb25cIik7XG4gIHRyeSB7XG4gICAgZW50cmllcy5wdXNoKGNyZWF0ZVJlcXVpcmUobmV4dFBhY2thZ2UpLnJlc29sdmUoXCJAbmV4dC9lbnZcIikpO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IENvdWxkIG5vdCByZXNvbHZlIFwiQG5leHQvZW52XCIgZnJvbSB0aGUgYXBwJ3MgXFxgbmV4dFxcYCwgYCArXG4gICAgICAgIGB3aGljaCB0aGUgY2RrLW5leHRqcyBydW50aW1lIHVzZXMgdG8gbG9hZCAuZW52IGZpbGVzLmAsXG4gICAgICB7IGNhdXNlIH0sXG4gICAgKTtcbiAgfVxuXG4gIGxldCBub2RlRmlsZVRyYWNlOiBOb2RlRmlsZVRyYWNlO1xuICB0cnkge1xuICAgICh7IG5vZGVGaWxlVHJhY2UgfSA9IG5leHRSZXF1aXJlKE5FWFRfRklMRV9UUkFDRVIpKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgbG9hZCBcIiR7TkVYVF9GSUxFX1RSQUNFUn1cIiwgd2hpY2ggY2RrLW5leHRqcyB1c2VzIGAgK1xuICAgICAgICBgdG8gc3RhZ2UgdGhlIFxcYG5leHRcXGAgZmlsZXMgaXRzIGltYWdlIG9wdGltaXplciByZXF1aXJlcy4gVGhpcyBOZXh0LmpzIGAgK1xuICAgICAgICBgdmVyc2lvbiBtYXkgaGF2ZSBtb3ZlZCBpdDsgcGxlYXNlIG9wZW4gYW4gaXNzdWUuYCxcbiAgICAgIHsgY2F1c2UgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYWRkID0gKGZpbGVMaXN0OiBTZXQ8c3RyaW5nPiwgdGFyZ2V0OiBNYXA8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gICAgZm9yIChjb25zdCB0cmFjZWQgb2YgZmlsZUxpc3QpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRvUG9zaXgodHJhY2VkKTtcbiAgICAgIGlmICh0YXJnZXQuaGFzKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzb3VyY2UgPSBqb2luKGN0eC5yZXBvUm9vdCwgdHJhY2VkKTtcbiAgICAgIGFzc2VydFN0YWdpbmdLZXkoa2V5LCBzb3VyY2UpO1xuICAgICAgdGFyZ2V0LnNldChrZXksIHNvdXJjZSk7XG4gICAgfVxuICB9O1xuICBhZGQoXG4gICAgKGF3YWl0IG5vZGVGaWxlVHJhY2UoaW1hZ2VFbnRyaWVzLCB7IGJhc2U6IGN0eC5yZXBvUm9vdCB9KSkuZmlsZUxpc3QsXG4gICAgaW1hZ2VTdGFnaW5nLFxuICApO1xuICBjb25zdCB7IGZpbGVMaXN0IH0gPSBhd2FpdCBub2RlRmlsZVRyYWNlKGVudHJpZXMsIHsgYmFzZTogY3R4LnJlcG9Sb290IH0pO1xuICAvLyBUaGUgdHJhY2Ugc3RhcnRzIGZyb20gYEBuZXh0L2VudmAncyByZWFsIHBhdGgsIHNvIHVuZGVyIHBucG0gaXQgbmV2ZXJcbiAgLy8gcGFzc2VzIHRocm91Z2ggdGhlIGAucG5wbS9uZXh0QOKApi9ub2RlX21vZHVsZXMvQG5leHQvZW52YCBsaW5rIHRoYXQgYG5leHRgXG4gIC8vIHJlc29sdmVzIGl0IGJ5LiBXaXRob3V0IHRoZSBsaW5rLCBldmVyeSByZXF1ZXN0IGZhaWxzIGF0IGNvbGQgc3RhcnQgd2l0aFxuICAvLyBcIkNhbm5vdCBmaW5kIG1vZHVsZSAnQG5leHQvZW52J1wiLlxuICBjb25zdCBuZXh0RW52TGluayA9IGpvaW4oZGlybmFtZShuZXh0UGFja2FnZSksIFwiLi5cIiwgXCJAbmV4dFwiLCBcImVudlwiKTtcbiAgaWYgKGxzdGF0U3luYyhuZXh0RW52TGluaywgeyB0aHJvd0lmTm9FbnRyeTogZmFsc2UgfSk/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAvLyBgcmVzb2x2ZWAgcmV0dXJucyByZWFsIHBhdGhzLCBzbyByZWxhdGl2ZSB0byB0aGUgcmVhbCByZXBvIHJvb3QuXG4gICAgZmlsZUxpc3QuYWRkKHJlbGF0aXZlKHJlYWxwYXRoU3luYyhjdHgucmVwb1Jvb3QpLCBuZXh0RW52TGluaykpO1xuICB9XG4gIGFkZChmaWxlTGlzdCwgc3RhZ2luZyk7XG59XG5cbi8qKlxuICogQWRkIGA8ZGlzdERpcj4vcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gIHRvIGEgcGxhbiBldmVyeSBncm91cCBpcyBtZXJnZWQgd2l0aC5cbiAqXG4gKiBJdCByZWFjaGVzIGEgZ3JvdXAgb3RoZXJ3aXNlIG9ubHkgYXMgYSB0cmFjZWQgYGFzc2V0YCBvZiBzb21lIGludm9jYWJsZSBvdXRwdXQsXG4gKiB3aGljaCBpcyBub3QgYSBndWFyYW50ZWU6IGEgZ3JvdXAgd2hvc2UgdGVtcGxhdGVzIGFyZSBhbGwgYXNzaWduZWQgZWxzZXdoZXJlXG4gKiBvd25zIG5vIG91dHB1dHMgYXQgYWxsLiBUaGF0IGlzIHJlYWNoYWJsZSDigJQgYSBQYWdlcy1Sb3V0ZXItb25seSBhcHAgd2hvc2UgZXZlcnlcbiAqIHBhZ2UgZmFsbHMgdW5kZXIgdGhlIGNvbmZpZ3VyZWQgYGZ1bmN0aW9uR3JvdXBzYCBsZWF2ZXMgdGhlICpkZWZhdWx0KiBncm91cFxuICogdGVtcGxhdGUtZW1wdHksIGFuZCB0aGUgZGVmYXVsdCBncm91cCBpcyBzdGlsbCB3aGF0IHNlcnZlcyBgL19uZXh0L2ltYWdlYCwgdGhlXG4gKiBzdGF0aWMgZmlsZXMsIGFuZCB0aGUgZGlzdHJpYnV0aW9uJ3MgY2F0Y2gtYWxsLlxuICpcbiAqIEl0cyBhYnNlbmNlIGlzIG5vdCBhIHBhcnRpYWwgZmFpbHVyZTogYGxvYWRSdW50aW1lYCBwcm9iZXMgZm9yIGV4YWN0bHkgdGhpcyBmaWxlXG4gKiBiZWZvcmUgaXQgd2lsbCBzZXJ2ZSBhbnl0aGluZywgYW5kIGBpbWFnZS50c2AgcmVhZHMgdGhlIGltYWdlIGNvbmZpZyBvdXQgb2YgaXQsXG4gKiBzbyB0aGUgd2hvbGUgcm9vdCBhbnN3ZXJzIFwidGhlIGRlcGxveW1lbnQgcGFja2FnZSBpcyBpbmNvbXBsZXRlXCIuIENoZWFwIHRvIG1ha2VcbiAqIHVuY29uZGl0aW9uYWwsIHNvIG1ha2UgaXQgdW5jb25kaXRpb25hbC5cbiAqXG4gKiBOb3QgdHJhY2VkIGxpa2Uge0BsaW5rIFJVTlRJTUVfTkVYVF9NT0RVTEVTfSwgYmVjYXVzZSBpdCBpcyBkYXRhIHJhdGhlciB0aGFuIGFcbiAqIG1vZHVsZTogbm90aGluZyBgcmVxdWlyZWBzIGl0LCBzbyBubyBmaWxlIHRyYWNlciBjYW4gZmluZCBpdC5cbiAqXG4gKiBBYnNlbmNlIGlzIGxlZnQgdG8gYGxvYWRSdW50aW1lYCwgd2hpY2ggbmFtZXMgdGhlIGZpbGUgYW5kIHRoZSBsYXlvdXQgY29udHJhY3RcbiAqIGl0IGJlbG9uZ3MgdG8uIGBuZXh0IGJ1aWxkYCBhbHdheXMgd3JpdGVzIGl0LCBzbyB0aGVyZSBpcyBubyBidWlsZC10aW1lIGVycm9yXG4gKiB3b3J0aCBpbnZlbnRpbmcgaGVyZSBmb3IgYSBmaWxlIHRoaXMgc3RlcCBkb2VzIG5vdCBvd24uXG4gKi9cbmZ1bmN0aW9uIGFkZFJlcXVpcmVkU2VydmVyRmlsZXMoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIHN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlID0gam9pbihjdHguZGlzdERpciwgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiKTtcbiAgY29uc3Qga2V5ID0gdG9Qb3NpeChyZWxhdGl2ZShjdHgucmVwb1Jvb3QsIHNvdXJjZSkpO1xuICBpZiAoc3RhZ2luZy5oYXMoa2V5KSB8fCAhZXhpc3RzU3luYyhzb3VyY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGFzc2VydFN0YWdpbmdLZXkoa2V5LCBzb3VyY2UpO1xuICBzdGFnaW5nLnNldChrZXksIHNvdXJjZSk7XG59XG5cbi8qKlxuICogRXZlcnkgc3RhZ2VkIHBhdGggbXVzdCBsYW5kIGluc2lkZSB0aGUgc3RhZ2luZyB0cmVlIGFuZCBtdXN0IG5vdCBzaGFkb3cgdGhlXG4gKiByZXNlcnZlZCBkaXJlY3RvcnkgY2RrLW5leHRqcyBjb3BpZXMgaXRzIG93biBydW50aW1lIGludG8gYXQgc3ludGguXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFN0YWdpbmdLZXkoa2V5OiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChrZXkgPT09IFwiXCIgfHwga2V5LnN0YXJ0c1dpdGgoXCIvXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiLi5cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBCdWlsZCBvdXRwdXQgYXNzZXQgXCIke3NvdXJjZX1cIiByZXNvbHZlcyB0byB0aGUgc3RhZ2luZyBrZXkgYCArXG4gICAgICAgIGBcIiR7a2V5fVwiLCB3aGljaCBpcyBvdXRzaWRlIHRoZSBkZXBsb3ltZW50IHJvb3QuIFNldCBgICtcbiAgICAgICAgYFxcYG91dHB1dEZpbGVUcmFjaW5nUm9vdFxcYCBzbyBhbGwgdHJhY2VkIGZpbGVzIGxpdmUgdW5kZXIgb25lIHJvb3QuYCxcbiAgICApO1xuICB9XG4gIGlmIChrZXkgPT09IFJVTlRJTUVfRElSX05BTUUgfHwga2V5LnN0YXJ0c1dpdGgoYCR7UlVOVElNRV9ESVJfTkFNRX0vYCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBCdWlsZCBvdXRwdXQgYXNzZXQgXCIke3NvdXJjZX1cIiByZXNvbHZlcyB0byB0aGUgc3RhZ2luZyBrZXkgYCArXG4gICAgICAgIGBcIiR7a2V5fVwiLCBidXQgXCIke1JVTlRJTUVfRElSX05BTUV9L1wiIGlzIHJlc2VydmVkIGZvciBjZGstbmV4dGpzJ3Mgb3duIGAgK1xuICAgICAgICBgcnVudGltZSBmaWxlcy5gLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9Qb3NpeChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc2VwID09PSBcIi9cIiA/IHBhdGggOiBwYXRoLnNwbGl0KHNlcCkuam9pbihcIi9cIik7XG59XG5cbmZ1bmN0aW9uIHNvcnRlZFVuaXF1ZSh2YWx1ZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQodmFsdWVzKV0uc29ydCgpO1xufVxuIl19
895
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtb3V0cHV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2J1aWxkLW91dHB1dHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwS0EsOENBNENDO0FBd0JELG9EQXVJQztBQXJYRCxzREFBc0Q7QUFDdEQscUNBQThEO0FBQzlELCtDQVEwQjtBQUMxQiw2Q0FBNEM7QUFDNUMseUNBQWtFO0FBQ2xFLHVDQUF5QztBQUV6QywrQ0FBbUQ7QUFDbkQsdURBTzJCO0FBQzNCLDhEQUEyRDtBQUMzRCw0Q0FBMEM7QUFDMUMsa0RBVTZCO0FBQzdCLHNFQUFpRTtBQW1CakU7Ozs7O0dBS0c7QUFDSCxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBRTlDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixrQ0FBa0M7SUFDbEMsdUVBQXVFO0NBQ3hFLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFFbkU7Ozs7O0dBS0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLGdDQUFnQyxDQUFDO0FBdUUxRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxHQUF5QixFQUN6QixVQUErQixFQUFFO0lBRWpDLE1BQU0sVUFBVSxHQUFHLElBQUEsZ0JBQUksRUFBQyxHQUFHLENBQUMsT0FBTyxFQUFFLDJCQUFnQixDQUFDLENBQUM7SUFDdkQsTUFBTSxZQUFZLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSw2QkFBa0IsQ0FBQyxDQUFDO0lBRTFELE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWhFLDhFQUE4RTtJQUM5RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLE1BQU0sY0FB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WUFDdEQsb0VBQW9FLENBQ3ZFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxHQUFHLEtBQUssMkJBQWdCLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLDJCQUFnQixHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxzQkFBVSx3QkFBd0IsTUFBTSxnQ0FBZ0M7WUFDekUsSUFBSSxHQUFHLFdBQVcsMkJBQWdCLHNDQUFzQztZQUN4RSxnQkFBZ0IsQ0FDbkIsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsSUFBWTtJQUMzQixPQUFPLGVBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQWdCO0lBQ3BDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbHN0YXRTeW5jLCByZWFscGF0aFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHtcbiAgY29weUZpbGUsXG4gIGNwLFxuICBta2RpcixcbiAgcmVhZGxpbmssXG4gIHJtLFxuICBzeW1saW5rLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHR5cGUgeyBOZXh0QWRhcHRlciB9IGZyb20gXCJuZXh0XCI7XG5pbXBvcnQgeyBNQVhfQlVJTERfSURfQllURVMgfSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVIsXG4gIEZ1bmN0aW9uR3JvdXBTcGVjLFxuICBhc3NlcnROb0kxOG5TcGxpdHRpbmcsXG4gIGFzc2lnblJvdXRlc1RvR3JvdXBzLFxuICBwYXJzZUZ1bmN0aW9uR3JvdXBzRW52LFxufSBmcm9tIFwiLi9mdW5jdGlvbi1ncm91cHNcIjtcbmltcG9ydCB7IENES19ORVhUSlNfVkVSU0lPTiB9IGZyb20gXCIuLi9jZGstbmV4dGpzLXZlcnNpb25cIjtcbmltcG9ydCB7IExPR19QUkVGSVggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBBREFQVEVSX0RJUl9OQU1FLFxuICBBZGFwdGVyRW50cnlwb2ludCxcbiAgQWRhcHRlckVudHJ5cG9pbnRUeXBlLFxuICBBZGFwdGVyTWFuaWZlc3QsXG4gIEFkYXB0ZXJNaWRkbGV3YXJlLFxuICBFUlJPUl9QQUdFX1NVRkZJWEVTLFxuICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gIFJVTlRJTUVfRElSX05BTUUsXG4gIGdyb3VwU3RhZ2luZ0Rpck5hbWUsXG59IGZyb20gXCIuLi9ydW50aW1lL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBkZXBsb3ltZW50QnVpbGRJZCB9IGZyb20gXCIuLi91dGlscy9kZXBsb3ltZW50LWJ1aWxkLWlkXCI7XG5cbi8qKlxuICogVGhlIGBvbkJ1aWxkQ29tcGxldGVgIGFyZ3VtZW50LiBEZXJpdmVkIGZyb20gdGhlIGBuZXh0YCB0eXBpbmdzIHJhdGhlciB0aGFuXG4gKiByZXN0YXRlZCBzbyBhIGBuZXh0YCBidW1wIHN1cmZhY2VzIGFzIGEgY29tcGlsZSBlcnJvciBoZXJlLlxuICovXG5leHBvcnQgdHlwZSBCdWlsZENvbXBsZXRlQ29udGV4dCA9IFBhcmFtZXRlcnM8XG4gIE5vbk51bGxhYmxlPE5leHRBZGFwdGVyW1wib25CdWlsZENvbXBsZXRlXCJdPlxuPlswXTtcblxudHlwZSBBZGFwdGVyT3V0cHV0cyA9IEJ1aWxkQ29tcGxldGVDb250ZXh0W1wib3V0cHV0c1wiXTtcbi8qKiBBbnkgb3V0cHV0IHRoYXQgd2UgaW52b2tlIGF0IHJlcXVlc3QgdGltZSwgaS5lLiBub3QgYSBwcmVyZW5kZXIvc3RhdGljIGZpbGUuICovXG50eXBlIEludm9jYWJsZU91dHB1dCA9XG4gIHwgQWRhcHRlck91dHB1dHNbXCJwYWdlc1wiXVtudW1iZXJdXG4gIHwgQWRhcHRlck91dHB1dHNbXCJwYWdlc0FwaVwiXVtudW1iZXJdXG4gIHwgQWRhcHRlck91dHB1dHNbXCJhcHBQYWdlc1wiXVtudW1iZXJdXG4gIHwgQWRhcHRlck91dHB1dHNbXCJhcHBSb3V0ZXNcIl1bbnVtYmVyXVxuICB8IE5vbk51bGxhYmxlPEFkYXB0ZXJPdXRwdXRzW1wibWlkZGxld2FyZVwiXT47XG5cbi8qKlxuICogRW52IGZpbGVzIGB3cml0ZVN0YW5kYWxvbmVEaXJlY3RvcnlgIGNvcGllcyBpbnRvIHRoZSBzdGFuZGFsb25lIHRyZWUgYW5kIHRoYXRcbiAqIGBvbkJ1aWxkQ29tcGxldGVgIGhhcyBubyBlcXVpdmFsZW50IGZvci4gRHJvcHBpbmcgYG91dHB1dDogXCJzdGFuZGFsb25lXCJgXG4gKiBzaWxlbnRseSBkcm9wcyB0aGVzZSB1bmxlc3Mgd2Ugc3RhZ2UgdGhlbSBvdXJzZWx2ZXMuXG4gKiBAc2VlIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9hcGktcmVmZXJlbmNlL2NvbmZpZy9uZXh0LWNvbmZpZy1qcy9vdXRwdXRcbiAqL1xuY29uc3QgRU5WX0ZJTEVTID0gW1wiLmVudlwiLCBcIi5lbnYucHJvZHVjdGlvblwiXTtcblxuLyoqXG4gKiBgbmV4dGAgc3VibW9kdWxlcyB0aGUgKnJ1bnRpbWUqIHJlcXVpcmVzIHRoYXQgbm8gYXBwIGV2ZXIgcmVhY2hlcywgc29cbiAqIGBuZXh0IGJ1aWxkYCdzIG93biB0cmFjZSBuZXZlciBjb3ZlcnMgdGhlbS4gVGhleSBhcmUgcmVxdWlyZWQgZnJvbSB0aGUgYXBwJ3NcbiAqIGBuZXh0YCByYXRoZXIgdGhhbiBidW5kbGVkLCBkZWxpYmVyYXRlbHkg4oCUIHNlZSBgc3JjL3J1bnRpbWUvbmV4dC1tb2R1bGVzLnRzYFxuICog4oCUIHdoaWNoIG1ha2VzIHN0YWdpbmcgdGhlaXIgY2xvc3VyZSB0aGlzIG1vZHVsZSdzIGpvYi5cbiAqXG4gKiBgc2VydmUtc3RhdGljYCBpcyBpbiBldmVyeSBncm91cDogYHNlcnZlU3RhdGljRmlsZWBcbiAqIChgc3JjL3J1bnRpbWUvc3RhdGljLWZpbGVzLnRzYCkgc2VydmVzIHByZXJlbmRlcmVkIGFuZCBzdGF0aWMgcmVzdWx0cyB3aXRoIGl0XG4gKiB3aGVyZXZlciB0aGV5IGxhbmQuIGBpbnN0cnVtZW50YXRpb24tZ2xvYmFsc2AgaXMgcmVxdWlyZWQgYnkgYGxvYWRSdW50aW1lYFxuICogb24gZXZlcnkgY29sZCBzdGFydCAoYHJlZ2lzdGVySW5zdHJ1bWVudGF0aW9uYCksIHNvIGl0IGlzIHN0YWdlZCBoZXJlIHJhdGhlclxuICogdGhhbiB0cnVzdGVkIHRvIGVhY2ggZ3JvdXAncyBlbnRyeXBvaW50IHRyYWNlLlxuICovXG5jb25zdCBSVU5USU1FX05FWFRfTU9EVUxFUyA9IFtcbiAgXCJuZXh0L2Rpc3Qvc2VydmVyL3NlcnZlLXN0YXRpYy5qc1wiLFxuICBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL3JvdXRlci11dGlscy9pbnN0cnVtZW50YXRpb24tZ2xvYmFscy5leHRlcm5hbC5qc1wiLFxuXTtcblxuLyoqXG4gKiBuZXh0J3MgaW1hZ2Ugb3B0aW1pemVyIChgc3JjL3J1bnRpbWUvaW1hZ2UudHNgKSwgd2hvc2UgY2xvc3VyZSBpcyB3aGF0IGJyaW5nc1xuICogYHNoYXJwYCBpbi4gT25seSB0aGUgYGRlZmF1bHRgIGdyb3VwIGdldHMgaXQ6IHRoZSBlZGdlIHNlbmRzIGV2ZXJ5XG4gKiBgL19uZXh0L2ltYWdlYCByZXF1ZXN0IHRoZXJlLlxuICovXG5jb25zdCBJTUFHRV9ORVhUX01PRFVMRVMgPSBbXCJuZXh0L2Rpc3Qvc2VydmVyL2ltYWdlLW9wdGltaXplci5qc1wiXTtcblxuLyoqXG4gKiBUaGUgZmlsZSB0cmFjZXIgYG5leHQgYnVpbGRgIGl0c2VsZiB1c2VzLCByZWFjaGVkIHRocm91Z2ggdGhlIGFwcCdzIG93biBgbmV4dGBcbiAqIHNvIHRoYXQgaXQgaXMgdGhlIHZlcnNpb24gdGhhdCBtYXRjaGVzIHRoZSBmaWxlcyBiZWluZyB0cmFjZWQuIE5vdCBhXG4gKiBkZXBlbmRlbmN5IG9mIGNkay1uZXh0anM6IGJ1bmRsaW5nIGEgc2Vjb25kIGNvcHkgb2YgYEB2ZXJjZWwvbmZ0YCBpbnRvIHRoZVxuICogcHVibGlzaGVkIGFkYXB0ZXIgd291bGQgYWRkIG1lZ2FieXRlcyB0byBldmVyeSBpbnN0YWxsIHRvIGRvIHRoZSBzYW1lIGpvYi5cbiAqL1xuY29uc3QgTkVYVF9GSUxFX1RSQUNFUiA9IFwibmV4dC9kaXN0L2NvbXBpbGVkL0B2ZXJjZWwvbmZ0XCI7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIGBub2RlRmlsZVRyYWNlYCB0aGlzIG1vZHVsZSB1c2VzLiAqL1xudHlwZSBOb2RlRmlsZVRyYWNlID0gKFxuICBmaWxlczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IHsgYmFzZTogc3RyaW5nIH0sXG4pID0+IFByb21pc2U8eyBmaWxlTGlzdDogU2V0PHN0cmluZz4gfT47XG5cbi8qKlxuICogU3RhZ2luZyBrZXkgKHJlcG8tcm9vdC1yZWxhdGl2ZSBQT1NJWCkg4oaSIGFic29sdXRlIHNvdXJjZSBwYXRoIG9uIHRoZSBidWlsZFxuICogbWFjaGluZS4gVGhlIGRlZHVwZWQgdW5pb24gdGhhdCByZXBsYWNlcyB0aGUgc3RhbmRhbG9uZSB0cmVlLlxuICovXG5leHBvcnQgdHlwZSBTdGFnaW5nUGxhbiA9IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZE91dHB1dHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgYG5leHQgYnVpbGRgIHdhcyBpbnZva2VkIGZyb20uIERlZmF1bHRzIHRvIGBwcm9jZXNzLmN3ZCgpYCxcbiAgICogd2hpY2ggaXMgdGhlIHJlYWwgYW5zd2VyIGluc2lkZSBgb25CdWlsZENvbXBsZXRlYDsgYSBwYXJhbWV0ZXIgb25seSBzbyB0aGVcbiAgICogdW5pdCB0ZXN0cyBjYW4gZHJpdmUgdGhlIGZpeHR1cmVzJyBzeW50aGV0aWMgcHJvamVjdCBkaXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDd2Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXNvbHZlZCBgZnVuY3Rpb25Hcm91cHNgLiBEZWZhdWx0cyB0byB7QGxpbmsgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJ9LFxuICAgKiB3aGljaCBpcyBob3cgdGhlIGNvbnN0cnVjdHMgZ2V0IHRoZW0gaGVyZTogYG9uQnVpbGRDb21wbGV0ZWAgcnVucyBpbnNpZGVcbiAgICogYG5leHQgYnVpbGRgIGFuZCBjYW5ub3QgcmVhZCBDREsgcHJvcHMuXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIG1lYW5zIG9uZSBkZXBsb3ltZW50IHJvb3QgaG9sZGluZyBldmVyeSByb3V0ZSwgd2hpY2ggaXMgdGhlXG4gICAqIGRlZmF1bHQgYW5kIHRoZSBvbmx5IHRoaW5nIHRoZSBDb250YWluZXJzIHR5cGVzIGV2ZXIgZG8uXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IEZ1bmN0aW9uR3JvdXBTcGVjW107XG59XG5cbi8qKiBPbmUgZGVwbG95bWVudCByb290OiB0aGUgc3RhZ2luZyBwbGFuIGZvciBpdCwgYW5kIHdoZXJlIGl0IGdvZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlZEdyb3VwIHtcbiAgLyoqXG4gICAqIEdyb3VwIG5hbWUsIGBkZWZhdWx0YCBmb3IgdGhlIGltcGxpY2l0IGdyb3VwLiBBbHdheXMgcHJlc2VudCDigJQgYSBidWlsZCB3aXRoXG4gICAqIG5vIGBmdW5jdGlvbkdyb3Vwc2AgcHJvZHVjZXMgZXhhY3RseSBvbmUge0BsaW5rIFN0YWdlZEdyb3VwfSBuYW1lZCBgZGVmYXVsdGAsXG4gICAqIHNvIGNhbGxlcnMgbmV2ZXIgYnJhbmNoIG9uIFwiaXMgdGhpcyBzcGxpdFwiLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogRGlyZWN0b3J5IGluc2lkZSBgY2RrLW5leHRqcy1hZGFwdGVyYCwgUE9TSVg6IGBhcHBgIHdoZW4gbm90IHNwbGl0dGluZyxcbiAgICogYGdyb3Vwcy88bmFtZT5gIHdoZW4gc3BsaXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlyTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFnaW5nOiBTdGFnaW5nUGxhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZEFkYXB0ZXJNYW5pZmVzdFJlc3VsdCB7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3Q7XG4gIC8qKiBPbmUgZW50cnkgcGVyIGRlcGxveW1lbnQgcm9vdCB0byBzdGFnZS4gTGVuZ3RoIDEgdW5sZXNzIHNwbGl0dGluZy4gKi9cbiAgcmVhZG9ubHkgZ3JvdXBzOiBTdGFnZWRHcm91cFtdO1xufVxuXG4vKiogQSBzdGFnZWQgZGVwbG95bWVudCByb290IG9uIGRpc2suICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWdlZEdyb3VwUmVzdWx0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCByb290LiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZpbGVDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlQnVpbGRPdXRwdXRzUmVzdWx0IGV4dGVuZHMgQnVpbGRBZGFwdGVyTWFuaWZlc3RSZXN1bHQge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byBgPGRpc3REaXI+L2Nkay1uZXh0anMtYWRhcHRlcmAuICovXG4gIHJlYWRvbmx5IGFkYXB0ZXJEaXI6IHN0cmluZztcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHdyaXR0ZW4gbWFuaWZlc3QuICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0UGF0aDogc3RyaW5nO1xuICAvKiogT25lIHBlciBkZXBsb3ltZW50IHJvb3QsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgc3RhZ2VkLiAqL1xuICByZWFkb25seSBzdGFnZWRHcm91cHM6IFN0YWdlZEdyb3VwUmVzdWx0W107XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIG1hbmlmZXN0IGFuZCBzdGFnaW5nIHBsYW4sIHN0YWdlIHRoZSBmaWxlcywgYW5kIHdyaXRlIHRoZSBtYW5pZmVzdC5cbiAqIENhbGxlZCBmcm9tIGBvbkJ1aWxkQ29tcGxldGVgLCB3aGljaCBpcyB0aGUgb25seSBwbGFjZSB0aGF0IGhvbGRzIHRoZSBidWlsZFxuICogb3V0cHV0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlQnVpbGRPdXRwdXRzKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBvcHRpb25zOiBCdWlsZE91dHB1dHNPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFdyaXRlQnVpbGRPdXRwdXRzUmVzdWx0PiB7XG4gIGNvbnN0IGFkYXB0ZXJEaXIgPSBqb2luKGN0eC5kaXN0RGlyLCBBREFQVEVSX0RJUl9OQU1FKTtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihhZGFwdGVyRGlyLCBNQU5JRkVTVF9GSUxFX05BTUUpO1xuXG4gIGNvbnN0IHsgbWFuaWZlc3QsIGdyb3VwcyB9ID0gYnVpbGRBZGFwdGVyTWFuaWZlc3QoY3R4LCBvcHRpb25zKTtcblxuICAvLyBUcmFjZWQgb25jZSwgaGVyZTogdGhlIHRyYWNlIGlzIGFzeW5jLCB3aGljaCBpcyB3aHkgaXQgY2Fubm90IGhhcHBlbiBpbnNpZGVcbiAgLy8gYGJ1aWxkQWRhcHRlck1hbmlmZXN0YC4gYHJ1bnRpbWVDbG9zdXJlYCBpcyBtZXJnZWQgaW50byBldmVyeSBncm91cCwgYW5kXG4gIC8vIGBpbWFnZUNsb3N1cmVgIGludG8gYGRlZmF1bHRgIG9ubHksIHRoZSBvbmUgZ3JvdXAgYC9fbmV4dC9pbWFnZWAgcmVhY2hlcy5cbiAgY29uc3QgcnVudGltZUNsb3N1cmUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBpbWFnZUNsb3N1cmUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBhd2FpdCBhZGRSdW50aW1lTmV4dENsb3N1cmUoY3R4LCBydW50aW1lQ2xvc3VyZSwgaW1hZ2VDbG9zdXJlKTtcbiAgYWRkUmVxdWlyZWRTZXJ2ZXJGaWxlcyhjdHgsIHJ1bnRpbWVDbG9zdXJlKTtcblxuICAvLyBBIHByZXZpb3VzIGJ1aWxkJ3MgdHJlZSBpcyBuZXZlciBhZGRpdGl2ZSB3aXRoIHRoaXMgb25lJ3M6IGEgcmVtb3ZlZCByb3V0ZVxuICAvLyBsZWF2ZXMgYmVoaW5kIGFuIGVudHJ5cG9pbnQgdGhlIG1hbmlmZXN0IG5vIGxvbmdlciBtZW50aW9ucywgYSByZW5hbWVkIGNodW5rXG4gIC8vIGxlYXZlcyBkZWFkIGJ5dGVzIGluc2lkZSB0aGUgMjUwIE1CIGJ1ZGdldCwgYW5kIGEgcmVncm91cGVkIGJ1aWxkIGxlYXZlcyBhXG4gIC8vIHdob2xlIGRlcGxveW1lbnQgcm9vdCBub3RoaW5nIGRlcGxveXMuXG4gIGF3YWl0IHJtKGFkYXB0ZXJEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzdGFnZWRHcm91cHM6IFN0YWdlZEdyb3VwUmVzdWx0W10gPSBbXTtcbiAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICBjb25zdCBncm91cFN0YWdpbmcgPSBtZXJnZWQoXG4gICAgICBtZXJnZWQoZ3JvdXAuc3RhZ2luZywgcnVudGltZUNsb3N1cmUpLFxuICAgICAgZ3JvdXAubmFtZSA9PT0gREVGQVVMVF9GVU5DVElPTl9HUk9VUCA/IGltYWdlQ2xvc3VyZSA6IG5ldyBNYXAoKSxcbiAgICApO1xuICAgIGNvbnN0IHBhdGggPSBqb2luKGFkYXB0ZXJEaXIsIC4uLmdyb3VwLmRpck5hbWUuc3BsaXQoXCIvXCIpKTtcbiAgICBhd2FpdCBta2RpcihwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBzdGFnZUZpbGVzKGdyb3VwU3RhZ2luZywgcGF0aCk7XG4gICAgc3RhZ2VkR3JvdXBzLnB1c2goeyBuYW1lOiBncm91cC5uYW1lLCBwYXRoLCBmaWxlQ291bnQ6IGdyb3VwU3RhZ2luZy5zaXplIH0pO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVGaWxlKG1hbmlmZXN0UGF0aCwgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpKTtcblxuICByZXR1cm4ge1xuICAgIG1hbmlmZXN0LFxuICAgIGdyb3VwcyxcbiAgICBhZGFwdGVyRGlyLFxuICAgIG1hbmlmZXN0UGF0aCxcbiAgICBzdGFnZWRHcm91cHMsXG4gIH07XG59XG5cbi8qKiBMZWZ0IHdpbnMsIGFzIGV2ZXJ5d2hlcmUgZWxzZSBpbiB0aGlzIG1vZHVsZTogZmlyc3Qgd3JpdGVyIG9mIGEga2V5IGtlZXBzIGl0LiAqL1xuZnVuY3Rpb24gbWVyZ2VkKFxuICBiYXNlOiBTdGFnaW5nUGxhbixcbiAgYWRkaXRpb25zOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcChiYXNlKTtcbiAgZm9yIChjb25zdCBba2V5LCBzb3VyY2VdIG9mIGFkZGl0aW9ucykge1xuICAgIGlmICghcmVzdWx0LmhhcyhrZXkpKSB7XG4gICAgICByZXN1bHQuc2V0KGtleSwgc291cmNlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUaGUgcHVyZSBoYWxmIG9mIHtAbGluayB3cml0ZUJ1aWxkT3V0cHV0c306IGV2ZXJ5dGhpbmcgZGVyaXZlZCBmcm9tIHRoZSBidWlsZFxuICogb3V0cHV0cywgd2l0aCBubyB3cml0ZXMuIFNwbGl0IG91dCBzbyBpdCBjYW4gYmUgdW5pdCB0ZXN0ZWQgYWdhaW5zdCBjb21taXR0ZWRcbiAqIGBvbkJ1aWxkQ29tcGxldGVgIGZpeHR1cmVzLlxuICpcbiAqIFRocm93cyBvbiBhbnkgbm9uLU5vZGUgb3V0cHV0IGFuZCBvbiBhbnkgc3RhZ2luZyBrZXkgdHdvIG91dHB1dHMgbWFwIHRvXG4gKiBkaWZmZXJlbnQgY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQWRhcHRlck1hbmlmZXN0KFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBvcHRpb25zOiBCdWlsZE91dHB1dHNPcHRpb25zID0ge30sXG4pOiBCdWlsZEFkYXB0ZXJNYW5pZmVzdFJlc3VsdCB7XG4gIGNvbnN0IHsgb3V0cHV0cywgcmVwb1Jvb3QgfSA9IGN0eDtcbiAgY29uc3QgYmFzZVBhdGggPSBjdHguY29uZmlnLmJhc2VQYXRoIHx8IFwiXCI7XG4gIGFzc2VydEJ1aWxkQ3dkKGN0eCwgb3B0aW9ucy5idWlsZEN3ZCA/PyBwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSA9IFtcbiAgICAuLi5vdXRwdXRzLnBhZ2VzLFxuICAgIC4uLm91dHB1dHMucGFnZXNBcGksXG4gICAgLi4ub3V0cHV0cy5hcHBQYWdlcyxcbiAgICAuLi5vdXRwdXRzLmFwcFJvdXRlcyxcbiAgICAuLi4ob3V0cHV0cy5taWRkbGV3YXJlID8gW291dHB1dHMubWlkZGxld2FyZV0gOiBbXSksXG4gIF07XG5cbiAgYXNzZXJ0Tm9kZVJ1bnRpbWVzKGludm9jYWJsZSwgb3V0cHV0cy5taWRkbGV3YXJlKTtcbiAgd2Fybk9uRHJvcHBlZFJvdXRlQ29uZmlnKGludm9jYWJsZSk7XG5cbiAgY29uc3Qgc3RhdGljRmlsZXMgPSBjb2xsZWN0U3RhdGljRmlsZXMoY3R4KTtcblxuICBjb25zdCBlbnRyeXBvaW50czogUmVjb3JkPHN0cmluZywgQWRhcHRlckVudHJ5cG9pbnQ+ID0ge307XG4gIGZvciAoY29uc3QgeyBvdXRwdXRzOiBncm91cCwgdHlwZSB9IG9mIFtcbiAgICB7IG91dHB1dHM6IG91dHB1dHMucGFnZXMsIHR5cGU6IFwicGFnZVwiIGFzIGNvbnN0IH0sXG4gICAgeyBvdXRwdXRzOiBvdXRwdXRzLnBhZ2VzQXBpLCB0eXBlOiBcInBhZ2UtYXBpXCIgYXMgY29uc3QgfSxcbiAgICB7IG91dHB1dHM6IG91dHB1dHMuYXBwUGFnZXMsIHR5cGU6IFwiYXBwLXBhZ2VcIiBhcyBjb25zdCB9LFxuICAgIHsgb3V0cHV0czogb3V0cHV0cy5hcHBSb3V0ZXMsIHR5cGU6IFwiYXBwLXJvdXRlXCIgYXMgY29uc3QgfSxcbiAgXSkge1xuICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIGdyb3VwKSB7XG4gICAgICBhZGRFbnRyeXBvaW50KGVudHJ5cG9pbnRzLCByZXBvUm9vdCwgb3V0cHV0LCB0eXBlLCBiYXNlUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgYWRkUHJlcmVuZGVyUGF0aG5hbWVzKFxuICAgIGVudHJ5cG9pbnRzLFxuICAgIG91dHB1dHMucHJlcmVuZGVycyxcbiAgICBjdHgucm91dGluZy5keW5hbWljUm91dGVzLFxuICAgIGJhc2VQYXRoLFxuICAgIGAke2Jhc2VQYXRofS9fbmV4dC9kYXRhLyR7Y3R4LmJ1aWxkSWR9L2AsXG4gICk7XG5cbiAgY29uc3QgcGF0aG5hbWVzID0gc29ydGVkVW5pcXVlKFtcbiAgICAuLi5PYmplY3Qua2V5cyhlbnRyeXBvaW50cyksXG4gICAgLi4uT2JqZWN0LmtleXMoc3RhdGljRmlsZXMpLFxuICBdKTtcblxuICBjb25zdCBmdW5jdGlvbkdyb3VwcyA9XG4gICAgb3B0aW9ucy5mdW5jdGlvbkdyb3VwcyA/P1xuICAgIHBhcnNlRnVuY3Rpb25Hcm91cHNFbnYocHJvY2Vzcy5lbnZbRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJdKTtcbiAgLy8gaTE4biBpcyBjaGVja2VkIGZpcnN0OiBpdCByZWplY3RzIHRoZSBjb21iaW5hdGlvbiBvdXRyaWdodCwgYW5kIHJ1bm5pbmcgaXRcbiAgLy8gYWZ0ZXIgdGhlIGFzc2lnbm1lbnQgbWVhbnQgYW4gaTE4biBhcHAgZ290IHRoZSBhc3NpZ25tZW50J3MgXCJwYXR0ZXJuIG1hdGNoZXNcbiAgLy8gbm8gcm91dGVcIiBlcnJvciBpbnN0ZWFkIOKAlCB0cnVlLCBidXQgYWJvdXQgdGhlIHdyb25nIHRoaW5nLCBzaW5jZSBhIGxvY2FsaXplZFxuICAvLyB0ZW1wbGF0ZSBuZXZlciBtYXRjaGVzIGFuIHVubG9jYWxpemVkIHBhdHRlcm4uXG4gIGlmIChmdW5jdGlvbkdyb3Vwcykge1xuICAgIGFzc2VydE5vSTE4blNwbGl0dGluZyhjdHguY29uZmlnLmkxOG4gPz8gbnVsbCk7XG4gIH1cbiAgY29uc3QgYXNzaWdubWVudCA9IGZ1bmN0aW9uR3JvdXBzXG4gICAgPyBhc3NpZ25Sb3V0ZXNUb0dyb3VwcyhcbiAgICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICAgIC8vIEtleWVkIG9uIHRoZSBmaWxlLCBub3QgdGhlIG91dHB1dCBgaWRgOiBhIFBhZ2VzIFJvdXRlciBwYWdlIGFuZCBpdHNcbiAgICAgICAgLy8gYC9fbmV4dC9kYXRhLzxidWlsZElkPi88cGFnZT4uanNvbmAgcm91dGUgYXJlIHNlcGFyYXRlIG91dHB1dHMgd2l0aFxuICAgICAgICAvLyBzZXBhcmF0ZSBpZHMgYmFja2VkIGJ5IG9uZSBmaWxlLCBhbmQgb25seSB0aGUgcGFnZSdzIHRlbXBsYXRlIG1hdGNoZXNcbiAgICAgICAgLy8gYSBncm91cCBwYXR0ZXJuLlxuICAgICAgICBPYmplY3QuZW50cmllcyhlbnRyeXBvaW50cykubWFwKChbdGVtcGxhdGUsIGVudHJ5cG9pbnRdKSA9PiAoe1xuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGVudHJ5cG9pbnRJZDogZW50cnlwb2ludC5maWxlUGF0aCxcbiAgICAgICAgICB0eXBlOiBlbnRyeXBvaW50LnR5cGUsXG4gICAgICAgIH0pKSxcbiAgICAgICAge1xuICAgICAgICAgIGJhc2VQYXRoOiBjdHguY29uZmlnLmJhc2VQYXRoIHx8IFwiXCIsXG4gICAgICAgICAgYnVpbGRJZDogY3R4LmJ1aWxkSWQsXG4gICAgICAgICAgdHJhaWxpbmdTbGFzaDogY3R4LmNvbmZpZy50cmFpbGluZ1NsYXNoID09PSB0cnVlLFxuICAgICAgICAgIHJvdXRpbmc6IGN0eC5yb3V0aW5nLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QgPSB7XG4gICAgY2RrTmV4dGpzVmVyc2lvbjogQ0RLX05FWFRKU19WRVJTSU9OLFxuICAgIGJ1aWxkSWQ6IGN0eC5idWlsZElkLFxuICAgIHJlbGF0aXZlUHJvamVjdERpcjogdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgY3R4LnByb2plY3REaXIpKSxcbiAgICBjb25maWc6IHtcbiAgICAgIGJhc2VQYXRoOiBjdHguY29uZmlnLmJhc2VQYXRoIHx8IFwiXCIsXG4gICAgICB0cmFpbGluZ1NsYXNoOiBjdHguY29uZmlnLnRyYWlsaW5nU2xhc2ggPT09IHRydWUsXG4gICAgICBhc3NldFByZWZpeDogY3R4LmNvbmZpZy5hc3NldFByZWZpeCB8fCBcIlwiLFxuICAgICAgZGlzdERpcjogdG9Qb3NpeChyZWxhdGl2ZShjdHgucHJvamVjdERpciwgY3R4LmRpc3REaXIpKSxcbiAgICAgIGNvbXByZXNzOiBjdHguY29uZmlnLmNvbXByZXNzICE9PSBmYWxzZSxcbiAgICAgIGdlbmVyYXRlRXRhZ3M6IGN0eC5jb25maWcuZ2VuZXJhdGVFdGFncyAhPT0gZmFsc2UsXG4gICAgICBpMThuOiBjdHguY29uZmlnLmkxOG4gPz8gbnVsbCxcbiAgICAgIGRlcGxveW1lbnRJZDogKGN0eC5jb25maWcuZGVwbG95bWVudElkID8/IFwiXCIpLnJlcGxhY2UoXG4gICAgICAgIC9bXkEtWmEtejAtOV8tXS9nLFxuICAgICAgICBcIi1cIixcbiAgICAgICksXG4gICAgICBpbWFnZXM6IGN0eC5jb25maWcuaW1hZ2VzLFxuICAgICAgZXhwZXJpbWVudGFsOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGN0eC5jb25maWcuZXhwZXJpbWVudGFsID8/IHt9KSksXG4gICAgICBjYWNoZUhhbmRsZXI6IGRpc3RSZWxhdGl2ZUNhY2hlSGFuZGxlcihjdHgpLFxuICAgICAgY2FjaGVNYXhNZW1vcnlTaXplOiBjdHguY29uZmlnLmNhY2hlTWF4TWVtb3J5U2l6ZSxcbiAgICB9LFxuICAgIHJvdXRpbmc6IGN0eC5yb3V0aW5nLFxuICAgIHBhdGhuYW1lcyxcbiAgICBlbnRyeXBvaW50cyxcbiAgICBtaWRkbGV3YXJlOiBidWlsZE1pZGRsZXdhcmUocmVwb1Jvb3QsIG91dHB1dHMubWlkZGxld2FyZSksXG4gICAgc3RhdGljRmlsZXMsXG4gICAgLi4uKGFzc2lnbm1lbnRcbiAgICAgID8ge1xuICAgICAgICAgIGdyb3VwczogYXNzaWdubWVudC50ZW1wbGF0ZXMsXG4gICAgICAgICAgYmVoYXZpb3JzOiBhc3NpZ25tZW50LmJlaGF2aW9ycyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwczogZnVuY3Rpb25Hcm91cHMhLm1hcCgoeyBuYW1lLCByb3V0ZXMgfSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByb3V0ZXMsXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbiAgYXNzZXJ0QnVpbGRJZEZpdHMobWFuaWZlc3QpO1xuXG4gIGNvbnN0IGdyb3VwczogU3RhZ2VkR3JvdXBbXSA9IGFzc2lnbm1lbnRcbiAgICA/IE9iamVjdC5lbnRyaWVzKGFzc2lnbm1lbnQudGVtcGxhdGVzKS5tYXAoKFtuYW1lLCB0ZW1wbGF0ZXNdKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkaXJOYW1lOiBncm91cFN0YWdpbmdEaXJOYW1lKG5hbWUpLFxuICAgICAgICBzdGFnaW5nOiBjb2xsZWN0R3JvdXBTdGFnaW5nUGxhbihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgaW52b2NhYmxlLFxuICAgICAgICAgIGVudHJ5cG9pbnRzLFxuICAgICAgICAgIHRlbXBsYXRlcyxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgIDogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgICAgICAgICBkaXJOYW1lOiBncm91cFN0YWdpbmdEaXJOYW1lKCksXG4gICAgICAgICAgc3RhZ2luZzogc2VydmVkU3RhZ2luZ1BsYW4oY3R4LCBpbnZvY2FibGUpLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICByZXR1cm4geyBtYW5pZmVzdCwgZ3JvdXBzIH07XG59XG5cbi8qKlxuICogRmFpbHMgdGhlIGJ1aWxkIHdoZW4gdGhlIGJ1aWxkIElEIGV2ZXJ5IGNhY2hlIG9iamVjdCBpcyBzdG9yZWQgdW5kZXIgaXNcbiAqIGxvbmdlciB0aGFuIHtAbGluayBNQVhfQlVJTERfSURfQllURVN9LCB0aGUgcm9vbSBgY2FjaGVPYmplY3ROYW1lYCBsZWF2ZXMgaXQuXG4gKiBQYXN0IHRoYXQsIGFuIGVudHJ5IHdpdGggYSBsb25nIGVub3VnaCBuYW1lIHdvdWxkIGJlIHJlamVjdGVkIGJ5IFMzIGFuZFxuICogbmV2ZXIgY2FjaGVkLCB3aXRoIG5vdGhpbmcgdG8gc2F5IHdoeS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0QnVpbGRJZEZpdHMobWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCk6IHZvaWQge1xuICBjb25zdCBieXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRlcGxveW1lbnRCdWlsZElkKG1hbmlmZXN0KSk7XG4gIGlmIChieXRlcyA+IE1BWF9CVUlMRF9JRF9CWVRFUykge1xuICAgIGNvbnN0IHsgd2hhdCwgZml4IH0gPSBtYW5pZmVzdC5jb25maWcuZGVwbG95bWVudElkXG4gICAgICA/IHtcbiAgICAgICAgICB3aGF0OiBcIlRoZSBidWlsZCBJRCBhbmQgZGVwbG95bWVudElkIHRvZ2V0aGVyIGFyZVwiLFxuICAgICAgICAgIGZpeDogXCJVc2UgYSBzaG9ydGVyIGRlcGxveW1lbnRJZCBvciBnZW5lcmF0ZUJ1aWxkSWQuXCIsXG4gICAgICAgIH1cbiAgICAgIDogeyB3aGF0OiBcIlRoZSBidWlsZCBJRCBpc1wiLCBmaXg6IFwiVXNlIGEgc2hvcnRlciBnZW5lcmF0ZUJ1aWxkSWQuXCIgfTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSAke3doYXR9ICR7Ynl0ZXN9IGJ5dGVzOyBjZGstbmV4dGpzIHN0b3JlcyBjYWNoZSBgICtcbiAgICAgICAgYGVudHJpZXMgdW5kZXIgaXQgYW5kIGFsbG93cyBhdCBtb3N0ICR7TUFYX0JVSUxEX0lEX0JZVEVTfS4gJHtmaXh9YCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogT25lIGdyb3VwJ3Mgc2xpY2Ugb2YgdGhlIHN0YWdpbmcgcGxhbjogdGhlIGFzc2V0cyBvZiB0aGUgb3V0cHV0cyBpdCBvd25zLCBhbmRcbiAqIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBNaWRkbGV3YXJlIGlzIGluIGV2ZXJ5IGdyb3VwLCBub3QganVzdCB0aGUgZGVmYXVsdCBvbmUg4oCUIGl0IHJ1bnMgb24gZXZlcnlcbiAqIHJlcXVlc3Qgd2hlcmV2ZXIgdGhhdCByZXF1ZXN0IGxhbmRzLCBzbyBpdCBpcyBkdXBsaWNhdGVkIGJ5IGRlc2lnbiwgYXMgaXMgdGhlXG4gKiBgbmV4dGAgY2xvc3VyZSB0aGUgZW50cnlwb2ludHMgc2hhcmUuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBzdGF0aWMgZmlsZXMgdGhlXG4gKiBydW50aW1lIHNlcnZlcyBpdHNlbGYgKGA0MDQuaHRtbGAsIGBmYXZpY29uLmljby5ib2R5YCk6IGFueSBncm91cCBjYW4gYmUgYXNrZWRcbiAqIGZvciB0aGVtLiBBbmQgc28gYXJlIHRoZSBub3QtZm91bmQgYW5kIGVycm9yIHBhZ2VzOiB0aGUgcnVudGltZSByZW5kZXJzIGFcbiAqIDQwNCBvciBhIDUwMCB3aXRoIHdoaWNoZXZlciBvZiB0aGVtIHRoZSBzaGFyZWQgbWFuaWZlc3QgbmFtZXNcbiAqIChgc3RhdHVzVGFyZ2V0c2AgaW4gYHJ1bnRpbWUvZGlzcGF0Y2gudHNgKSwgaW4gd2hpY2hldmVyIGdyb3VwIHRoZVxuICogcmVxdWVzdCByZWFjaGVkLCBzbyBhIGdyb3VwIHdpdGhvdXQgdGhlbSBhbnN3ZXJlZCBhIFVSTCB1bmRlciBpdHMgb3duXG4gKiBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBubyByb3V0ZSB3aXRoIFwidGhlIGRlcGxveW1lbnQgcGFja2FnZSBpcyBpbmNvbXBsZXRlXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIG1hdGNoZWQgb24gdGhlIGVudHJ5cG9pbnQncyBgZmlsZVBhdGhgLCBub3QgaXRzIGBpZGAgb3JcbiAqIHBhdGhuYW1lOiB0aGUgbWFuaWZlc3QncyBlbnRyeXBvaW50cyBhcmUga2V5ZWQgYnkgKnRlbXBsYXRlKiwgYW4gb3V0cHV0IG1heVxuICogYmFjayBzZXZlcmFsIHRlbXBsYXRlcywgYW5kIHtAbGluayBhZGRQcmVyZW5kZXJQYXRobmFtZXN9IHN5bnRoZXNpemVzXG4gKiBlbnRyeXBvaW50cyB0aGF0IGNhcnJ5IHRoZSAqcHJlcmVuZGVyJ3MqIGlkLCB3aGljaCBubyBpbnZvY2FibGUgb3V0cHV0IGhhcyAodGhlXG4gKiByb290LXBhcmFtcyBhcHA6IGVudHJ5cG9pbnQgYC9lbmAgd2l0aCBgaWQ6IFwiL2VuXCJgIGJhY2tlZCBieSB0aGUgb3V0cHV0XG4gKiBgL1tsb2NhbGVdYCkuIFRoZSBzeW50aGVzaXplZCBlbnRyeXBvaW50J3MgYGZpbGVQYXRoYCBpcyB0aGUgb3duaW5nIG91dHB1dCdzLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0R3JvdXBTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSxcbiAgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PixcbiAgdGVtcGxhdGVzOiBzdHJpbmdbXSxcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBiYXNlUGF0aCA9IGN0eC5jb25maWcuYmFzZVBhdGggfHwgXCJcIjtcbiAgY29uc3Qgb3duZWRFbnRyeXBvaW50cyA9IFtcbiAgICAuLi50ZW1wbGF0ZXMsXG4gICAgLi4uRVJST1JfUEFHRV9TVUZGSVhFUy5tYXAoKHN1ZmZpeCkgPT4gYCR7YmFzZVBhdGh9JHtzdWZmaXh9YCksXG4gIF1cbiAgICAubWFwKCh0ZW1wbGF0ZSkgPT4gZW50cnlwb2ludHNbdGVtcGxhdGVdKVxuICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgQWRhcHRlckVudHJ5cG9pbnQgPT4gZW50cnkgIT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IG93bmVkRmlsZXMgPSBuZXcgU2V0KG93bmVkRW50cnlwb2ludHMubWFwKChlbnRyeSkgPT4gZW50cnkuZmlsZVBhdGgpKTtcbiAgY29uc3QgbWlkZGxld2FyZSA9IGN0eC5vdXRwdXRzLm1pZGRsZXdhcmU7XG4gIGNvbnN0IG93bmVkID0gaW52b2NhYmxlLmZpbHRlcihcbiAgICAob3V0cHV0KSA9PlxuICAgICAgb3duZWRGaWxlcy5oYXModG9Qb3NpeChyZWxhdGl2ZShjdHgucmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpKSB8fFxuICAgICAgb3V0cHV0ID09PSBtaWRkbGV3YXJlLFxuICApO1xuICByZXR1cm4gc2VydmVkU3RhZ2luZ1BsYW4oY3R4LCBvd25lZCk7XG59XG5cbi8qKiB7QGxpbmsgY29sbGVjdFN0YWdpbmdQbGFufSBmb3IgYG91dHB1dHNgLCBwbHVzIHRoZSBmaWxlcyB0aGUgcnVudGltZSBzZXJ2ZXMuICovXG5mdW5jdGlvbiBzZXJ2ZWRTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgb3V0cHV0czogSW52b2NhYmxlT3V0cHV0W10sXG4pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3Qgc3RhZ2luZyA9IGNvbGxlY3RTdGFnaW5nUGxhbihjdHgsIG91dHB1dHMpO1xuICBzdGFnZVNlcnZlZFN0YXRpY0ZpbGVzKGN0eCwgc3RhZ2luZyk7XG4gIHJldHVybiBzdGFnaW5nO1xufVxuXG4vKipcbiAqIEpvYiAxOiByZWplY3Qgbm9uLU5vZGUgb3V0cHV0cywgZXZlcnl3aGVyZS5cbiAqXG4gKiBgZXhwb3J0IGNvbnN0IHJ1bnRpbWUgPSAnZWRnZSdgIG9uIGEgcGFnZSBvciByb3V0ZSBoYW5kbGVyIGxhbmRzIGluXG4gKiBgYXBwUGFnZXNgL2BhcHBSb3V0ZXNgL2BwYWdlc2AvYHBhZ2VzQXBpYCB3aXRoIGBydW50aW1lOiAnZWRnZSdgLFxuICogYGFzc2V0czoge31gLCBhbmQgYW4gYGVkZ2VSdW50aW1lYCBkZXNjcmlwdG9yIG5lZWRpbmcgYGdsb2JhbFRoaXMuX0VOVFJJRVNgXG4gKiBhbmQgYSBzYW5kYm94LiBHdWFyZGluZyBtaWRkbGV3YXJlIGFsb25lIHdvdWxkIGxlYXZlIGEgc2lsZW50IGZhaWx1cmUgbW9kZVxuICogZm9yIGVkZ2UgcGFnZXM6IGFuIGVudHJ5cG9pbnQgd2UgY2FuJ3QgaW52b2tlIGFuZCBubyBhc3NldHMgdG8gaW52b2tlIGl0XG4gKiB3aXRoLlxuICovXG5mdW5jdGlvbiBhc3NlcnROb2RlUnVudGltZXMoXG4gIGludm9jYWJsZTogSW52b2NhYmxlT3V0cHV0W10sXG4gIG1pZGRsZXdhcmU6IEFkYXB0ZXJPdXRwdXRzW1wibWlkZGxld2FyZVwiXSxcbik6IHZvaWQge1xuICBjb25zdCBvZmZlbmRpbmcgPSBpbnZvY2FibGUuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5ydW50aW1lICE9PSBcIm5vZGVqc1wiKTtcbiAgaWYgKG9mZmVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBNaWRkbGV3YXJlIGlzIHJlcG9ydGVkIHNlcGFyYXRlbHkgZnJvbSByb3V0ZXMuIEl0cyBgc291cmNlUGFnZWAgaXMgYC9gLCBzb1xuICAvLyBmb2xkaW5nIGl0IGluIHdpdGggdGhlIHJvdXRlcyBwcm9kdWNlcyB0aGUgYWN0aXZlbHkgbWlzbGVhZGluZyBhZHZpY2UgdG9cbiAgLy8gcmVtb3ZlIGBleHBvcnQgY29uc3QgcnVudGltZSA9IFwiZWRnZVwiYCBmcm9tIHRoZSBob21lIHBhZ2UgLSB3aGljaCBpcyB3aGVyZVxuICAvLyB0aGUgZWRnZSBydW50aW1lIGlzIG5vdCwgYW5kIG1heSBub3QgZXZlbiBleGlzdC5cbiAgY29uc3Qgb2ZmZW5kaW5nTWlkZGxld2FyZSA9IG1pZGRsZXdhcmUgJiYgb2ZmZW5kaW5nLmluY2x1ZGVzKG1pZGRsZXdhcmUpO1xuICAvLyBgLnJzY2AgdmFyaWFudHMgc2hhcmUgYSBgc291cmNlUGFnZWAgd2l0aCB0aGVpciBIVE1MIHNpYmxpbmcsIHNvIGRlZHVwZS5cbiAgY29uc3Qgcm91dGVzID0gc29ydGVkVW5pcXVlKFxuICAgIG9mZmVuZGluZ1xuICAgICAgLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQgIT09IG1pZGRsZXdhcmUpXG4gICAgICAubWFwKChvdXRwdXQpID0+IGAke291dHB1dC5zb3VyY2VQYWdlfSAocnVudGltZTogXCIke291dHB1dC5ydW50aW1lfVwiKWApLFxuICApO1xuXG4gIGNvbnN0IHJlYXNvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmIChyb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgIHJlYXNvbnMucHVzaChcbiAgICAgIGBjZGstbmV4dGpzIGNhbm5vdCBkZXBsb3kgcm91dGVzIGJ1aWx0IGZvciB0aGUgZWRnZSBydW50aW1lLiBgICtcbiAgICAgICAgYFJlbW92ZSBcXGBleHBvcnQgY29uc3QgcnVudGltZSA9IFwiZWRnZVwiXFxgIGZyb206XFxuYCArXG4gICAgICAgIHJvdXRlcy5tYXAoKHJvdXRlKSA9PiBgICAtICR7cm91dGV9YCkuam9pbihcIlxcblwiKSxcbiAgICApO1xuICB9XG4gIGlmIChvZmZlbmRpbmdNaWRkbGV3YXJlKSB7XG4gICAgcmVhc29ucy5wdXNoKFxuICAgICAgYGNkay1uZXh0anMgY2Fubm90IGRlcGxveSBtaWRkbGV3YXJlIGJ1aWx0IGZvciB0aGUgZWRnZSBydW50aW1lIGAgK1xuICAgICAgICBgKCR7bWlkZGxld2FyZS5maWxlUGF0aH0sIHJ1bnRpbWU6IFwiJHttaWRkbGV3YXJlLnJ1bnRpbWV9XCIpLiBgICtcbiAgICAgICAgYFJlbmFtZSBpdCB0byBcXGBwcm94eS50c1xcYCAoTmV4dC5qcyAxNiBydW5zIHByb3h5IG9uIHRoZSBOb2RlIGAgK1xuICAgICAgICBgcnVudGltZSksIG9yIGtlZXAgXFxgbWlkZGxld2FyZS50c1xcYCBhbmQgYWRkIGAgK1xuICAgICAgICBgXFxgZXhwb3J0IGNvbnN0IGNvbmZpZyA9IHsgcnVudGltZTogXCJub2RlanNcIiB9XFxgIHRvIGl0IOKAlCBgICtcbiAgICAgICAgYFxcYG1pZGRsZXdhcmUudHNcXGAgZGVmYXVsdHMgdG8gdGhlIGVkZ2UgcnVudGltZSwgYnV0IGRvZXMgbm90IHJlcXVpcmUgaXQuYCxcbiAgICApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGAke0xPR19QUkVGSVh9ICR7cmVhc29ucy5qb2luKFwiXFxuXCIpfVxcbmAgK1xuICAgICAgYFRoZSBlZGdlIHJ1bnRpbWUgaXMgZGVwcmVjYXRlZCBpbiBOZXh0LmpzOiBgICtcbiAgICAgIGBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9lZGdlLXJ1bnRpbWUtZGVwcmVjYXRlZGAsXG4gICk7XG59XG5cbi8qKlxuICogV2FybiBvbiByb3V0ZSBjb25maWcgY2RrLW5leHRqcyBkb2VzIG5vdCBob25vci4gQW4gYXV0aG9yIHdobyBzZXQgdGhlc2UgYXNrZWRcbiAqIGZvciBzb21ldGhpbmcgZXhwbGljaXRseSwgc28gc2F5IHNvIHJhdGhlciB0aGFuIGlnbm9yaW5nIGl0IHNpbGVudGx5OyBuZXZlclxuICogdGhyb3csIGJlY2F1c2Ugcm91dGUtbGV2ZWwgYG1heER1cmF0aW9uYCBpcyB2YWxpZCBOZXh0LmpzLlxuICpcbiAqIGBOZXh0anNCdWlsZGAgcnVucyBgbmV4dCBidWlsZGAgd2l0aCBgc3RkaW86IFwiaW5oZXJpdFwiYCwgc28gdGhpcyByZWFjaGVzIHRoZVxuICogdXNlcidzIHRlcm1pbmFsLiBTZWUgdGhlIHBsYW4ncyBcIkRlY2lzaW9uc1wiIGZvciB3aHkgbmVpdGhlciBpcyBob25vcmVkLlxuICovXG5mdW5jdGlvbiB3YXJuT25Ecm9wcGVkUm91dGVDb25maWcoaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSk6IHZvaWQge1xuICBjb25zdCBkcm9wcGVkOiBSZWNvcmQ8XCJtYXhEdXJhdGlvblwiIHwgXCJwcmVmZXJyZWRSZWdpb25cIiwgc3RyaW5nW10+ID0ge1xuICAgIG1heER1cmF0aW9uOiBbXSxcbiAgICBwcmVmZXJyZWRSZWdpb246IFtdLFxuICB9O1xuICBmb3IgKGNvbnN0IG91dHB1dCBvZiBpbnZvY2FibGUpIHtcbiAgICBpZiAob3V0cHV0LmNvbmZpZz8ubWF4RHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5tYXhEdXJhdGlvbi5wdXNoKG91dHB1dC5zb3VyY2VQYWdlKTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5jb25maWc/LnByZWZlcnJlZFJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkcm9wcGVkLnByZWZlcnJlZFJlZ2lvbi5wdXNoKG91dHB1dC5zb3VyY2VQYWdlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZW1lZHk6IFJlY29yZDxcIm1heER1cmF0aW9uXCIgfCBcInByZWZlcnJlZFJlZ2lvblwiLCBzdHJpbmc+ID0ge1xuICAgIG1heER1cmF0aW9uOlxuICAgICAgXCJTZXQgdGhlIGZ1bmN0aW9uIHRpbWVvdXQgd2l0aCB0aGUgY29uc3RydWN0J3MgYG92ZXJyaWRlc2AgcHJvcCBpbnN0ZWFkIChlLmcuIGBvdmVycmlkZXM6IHsgbmV4dGpzRnVuY3Rpb25zOiB7IGZ1bmN0aW9uUHJvcHM6IHsgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzMCkgfSB9IH1gKTsgYSBMYW1iZGEgdGltZW91dCBpcyBwZXItZnVuY3Rpb24gd2hpbGUgYG1heER1cmF0aW9uYCBpcyBwZXItcm91dGUuXCIsXG4gICAgcHJlZmVycmVkUmVnaW9uOlxuICAgICAgXCJIb25vcmluZyBpdCB3b3VsZCByZXF1aXJlIGEgbXVsdGktcmVnaW9uIGRlcGxveW1lbnQsIHdoaWNoIHRoaXMgY29uc3RydWN0IGRvZXMgbm90IG1vZGVsLlwiLFxuICB9O1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIFtcIm1heER1cmF0aW9uXCIsIFwicHJlZmVycmVkUmVnaW9uXCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3Qgcm91dGVzID0gc29ydGVkVW5pcXVlKGRyb3BwZWRba2V5XSk7XG4gICAgaWYgKHJvdXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSBcXGAke2tleX1cXGAgaXMgbm90IGhvbm9yZWQgYnkgY2RrLW5leHRqcy4gYCArXG4gICAgICAgIGAke3JvdXRlcy5sZW5ndGh9IHJvdXRlKHMpIHNldCBpdCwgaW5jbHVkaW5nOiAke3JvdXRlcy5zbGljZSgwLCA1KS5qb2luKFwiLCBcIil9YCArXG4gICAgICAgIGAke3JvdXRlcy5sZW5ndGggPiA1ID8gYCwgYW5kICR7cm91dGVzLmxlbmd0aCAtIDV9IG1vcmVgIDogXCJcIn0uIGAgK1xuICAgICAgICByZW1lZHlba2V5XSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSm9icyAyLCAzIGFuZCA2OiB0aGUgZGVkdXBlZCB1bmlvbiBvZiBldmVyeSBzaGlwcGVkIG91dHB1dCdzIHRyYWNlZCBgYXNzZXRzYCxcbiAqIHBsdXMgZWFjaCBlbnRyeXBvaW50IGZpbGUgaXRzZWxmLCBwbHVzIHRoZSBlbnYgZmlsZXMsIHdpdGggYGFzc2V0c0hhc2hlc2AgdXNlZFxuICogYXMgYSBjb25mbGljdCBjaGVjay5cbiAqXG4gKiBEZWR1cCBpcyBieSBrZXk6IHRoZSB0cmFjZWQgYG5leHRgIGNsb3N1cmUgaXMgbWVyZ2VkIGludG8gZXZlcnkgb3V0cHV0J3NcbiAqIGBhc3NldHNgIChgZ2V0U2hhcmVkTm9kZUFzc2V0c2Ag4oaSIGBzaGFyZWROb2RlQXNzZXRzYCksIHNvIE4gb3V0cHV0c1xuICogb3ZlcndoZWxtaW5nbHkgcmVwZWF0IGtleXMuIFdoYXQgdGhlIGhhc2hlcyBidXkgaXMgZGV0ZWN0aW5nIHR3byBvdXRwdXRzXG4gKiBtYXBwaW5nIHRoZSAqKnNhbWUga2V5IHRvIGRpZmZlcmVudCBjb250ZW50KiosIHdoaWNoIGlzIHVucGFja2FnZWFibGUgaW50b1xuICogb25lIExhbWJkYSDigJQgZmFpbCB0aGUgYnVpbGQgbG91ZGx5IHJhdGhlciB0aGFuIGxldHRpbmcgbGFzdC13cml0ZS13aW5zIHBpY2suXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTdGFnaW5nUGxhbihcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgaW52b2NhYmxlOiBJbnZvY2FibGVPdXRwdXRbXSxcbik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IHJlcG9Sb290IH0gPSBjdHg7XG4gIGNvbnN0IHN0YWdpbmcgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBoYXNoZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGNvbnN0IGFkZCA9IChrZXk6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIGhhc2g/OiBzdHJpbmcpID0+IHtcbiAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgICBjb25zdCBleGlzdGluZ0hhc2ggPSBoYXNoZXMuZ2V0KGtleSk7XG4gICAgaWYgKFxuICAgICAgaGFzaCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBleGlzdGluZ0hhc2ggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgZXhpc3RpbmdIYXNoICE9PSBoYXNoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFR3byBidWlsZCBvdXRwdXRzIG1hcCBcIiR7a2V5fVwiIHRvIGRpZmZlcmVudCBjb250ZW50IGAgK1xuICAgICAgICAgIGAoaGFzaGVzICR7ZXhpc3RpbmdIYXNofSBhbmQgJHtoYXNofSkuIE9uZSBkZXBsb3ltZW50IHBhY2thZ2UgY2Fubm90IGAgK1xuICAgICAgICAgIGBob2xkIGJvdGguIFRoaXMgdXN1YWxseSBtZWFucyB0d28gTmV4dC5qcyBwcm9qZWN0cyBpbiB0aGUgc2FtZSByZXBvIGAgK1xuICAgICAgICAgIGB3cml0ZSB0aGUgc2FtZSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzaGVzLnNldChrZXksIGhhc2gpO1xuICAgIH1cbiAgICBpZiAoIXN0YWdpbmcuaGFzKGtleSkpIHtcbiAgICAgIHN0YWdpbmcuc2V0KGtleSwgc291cmNlKTtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChjb25zdCBvdXRwdXQgb2YgaW52b2NhYmxlKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dC5hc3NldHMpKSB7XG4gICAgICBhZGQoa2V5LCBzb3VyY2UsIG91dHB1dC5hc3NldHNIYXNoZXNba2V5XSk7XG4gICAgfVxuICAgIC8vIFRoZSBlbnRyeXBvaW50J3Mgb3duIGZpbGUgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tIGl0cyBgYXNzZXRzYCDigJQgdGhlXG4gICAgLy8gTkZUIHRyYWNlIGNvdmVycyB0aGUgY2xvc3VyZSBpdCByZXF1aXJlcywgbm90IGl0c2VsZi4gYGFzc2V0c0hhc2hlc2AgZG9lc1xuICAgIC8vIGNhcnJ5IGl0IChrZXllZCB0aGUgc2FtZSB3YXkpLCB3aGljaCBpcyBhbHNvIHdoYXQgcGlucyB0aGUga2V5IGZvcm1hdC5cbiAgICBjb25zdCBlbnRyeUtleSA9IHRvUG9zaXgocmVsYXRpdmUocmVwb1Jvb3QsIG91dHB1dC5maWxlUGF0aCkpO1xuICAgIGFkZChlbnRyeUtleSwgb3V0cHV0LmZpbGVQYXRoLCBvdXRwdXQuYXNzZXRzSGFzaGVzW2VudHJ5S2V5XSk7XG4gIH1cblxuICAvLyBKb2IgMiwgc2Vjb25kIGhhbGY6IGB3cml0ZVN0YW5kYWxvbmVEaXJlY3RvcnlgIGZpbHRlcnMgYGxvYWRlZEVudkZpbGVzYCB0b1xuICAvLyBleGFjdGx5IHRoZXNlIHR3byBhbmQgY29waWVzIHRoZW07IGBidWlsZC1jb21wbGV0ZS5qc2AgaGFzIG5vIGVudi1maWxlXG4gIC8vIGhhbmRsaW5nIGF0IGFsbCwgc28gdGhleSBhcmUgbm90IGluIGFueSBgYXNzZXRzYCBtYXAuXG4gIGZvciAoY29uc3QgZW52RmlsZSBvZiBFTlZfRklMRVMpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBqb2luKGN0eC5wcm9qZWN0RGlyLCBlbnZGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhzb3VyY2UpKSB7XG4gICAgICBhZGQodG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgc291cmNlKSksIHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YWdpbmc7XG59XG5cbi8qKlxuICogSm9iIDIsIHRoaXJkIHBhcnQ6IHRoZSBzdGF0aWMgZmlsZXMgdGhlICpydW50aW1lKiBoYXMgdG8gc2VydmUsIGFuZCB0aGVpclxuICogc291cmNlcy5cbiAqXG4gKiBgb3V0cHV0cy5zdGF0aWNGaWxlc2AgbWl4ZXMgdHdvIHBvcHVsYXRpb25zIHdpdGggdGhlIHNhbWUgYFNUQVRJQ19GSUxFYCB0eXBlOlxuICpcbiAqIC0gKipgPGRpc3REaXI+L3N0YXRpYy8qKmAgYW5kIGBwdWJsaWMvKipgKiog4oCUIHVwbG9hZGVkIHRvIFMzIGJ5XG4gKiAgIGBOZXh0anNTdGF0aWNBc3NldHNgLCBhbmQgQ2xvdWRGcm9udCAvIEFQSSBHYXRld2F5IGFuc3dlciB0aGVtIGJlZm9yZSB0aGVcbiAqICAgcmVxdWVzdCBldmVyIHJlYWNoZXMgdGhlIGNvbXB1dGUuIE5vdCBzdGFnZWQ6IGBwdWJsaWMvYCBhbG9uZSBjYW4gYmVcbiAqICAgaHVuZHJlZHMgb2YgbWVnYWJ5dGVzIGFnYWluc3QgYSAyNTAgTUIgdW56aXBwZWQgTGFtYmRhIGNhcCwgYW5kIGl0IHdvdWxkIGJlXG4gKiAgIGEgc2Vjb25kIGNvcHkgb2YgYnl0ZXMgYWxyZWFkeSBpbiBTMy4gYHB1YmxpYy9gIGlzIG5vdCBpblxuICogICBgb3V0cHV0cy5zdGF0aWNGaWxlc2AgYXQgYWxsIOKAlCBOZXh0LmpzIGxpc3RzIGl0IG9ubHkgZm9yIGBvdXRwdXQ6IFwiZXhwb3J0XCJgXG4gKiAgIOKAlCBhbmQgaXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhZGRlZCBoZXJlOiB0aGUgY29udGFpbmVyIHJ1bnRpbWUgbGlzdHMgaXQgb2ZmXG4gKiAgIGRpc2sgYXQgY29sZCBzdGFydCBpbnN0ZWFkLCBhcyBgbmV4dCBzdGFydGAgZG9lcyAoYHJlYWRQdWJsaWNGaWxlc2AgaW5cbiAqICAgYHNyYy9ydW50aW1lL3B1YmxpYy1maWxlcy50c2ApLCBiZWNhdXNlIG9ubHkgdGhlIGRpc2sga25vd3Mgd2hhdCBhbiBhcHAnc1xuICogICBgcG9zdGJ1aWxkYCB3cm90ZSBpbnRvIGl0IGFmdGVyIHRoaXMgaG9vayByYW4uXG4gKiAtICoqZXZlcnl0aGluZyBlbHNlKiosIGFsbCBvZiBpdCB1bmRlciBgPGRpc3REaXI+L3NlcnZlci9gIOKAlCBgNDA0Lmh0bWxgLFxuICogICBgNTAwLmh0bWxgLCBgZmF2aWNvbi5pY28uYm9keWAsIGFuZCBmdWxseS1zdGF0aWMgUGFnZXMgUm91dGVyIEhUTUwuIE5vdGhpbmdcbiAqICAgaW4gZnJvbnQgb2YgdGhlIGNvbXB1dGUgc2VydmVzIHRoZXNlLCBzbyB0aGV5IGFyZSBzdGFnZWQuIEJvdW5kZWQgYnkgcm91dGVcbiAqICAgY291bnQgYW5kIHNtYWxsLlxuICpcbiAqIFRoZSBwYXRobmFtZSDihpIga2V5IG1hcCBpcyByZXR1cm5lZCBmb3IgKmFsbCogb2YgdGhlbSwgYmVjYXVzZSBkaXNwYXRjaCBoYXMgdG9cbiAqIHJlc29sdmUgYSBwYXRobmFtZSB0byBcInN0YXRpYyBmaWxlLCBub3QgYSA0MDRcIiBlaXRoZXIgd2F5OyB0aGUgcnVudGltZSA0MDRzIGlmXG4gKiB0aGUgZmlsZSB0dXJucyBvdXQgbm90IHRvIGJlIGluIHRoZSBwYWNrYWdlLCB3aGljaCBpcyBvbmx5IHJlYWNoYWJsZSB3aGVuIHRoZVxuICogZGlzdHJpYnV0aW9uIGlzIG1pc3JvdXRlZC5cbiAqXG4gKiBTdGFnaW5nIGlzIHtAbGluayBzdGFnZVNlcnZlZFN0YXRpY0ZpbGVzfSwgYXBwbGllZCBvbmNlIHBlciBkZXBsb3ltZW50IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RTdGF0aWNGaWxlcyhjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgcmVwb1Jvb3QgfSA9IGN0eDtcbiAgY29uc3QgYmFzZVBhdGggPSBjdHguY29uZmlnLmJhc2VQYXRoIHx8IFwiXCI7XG4gIGNvbnN0IHN0YXRpY0ZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgcGFnZXNEaXIgPSBqb2luKGN0eC5kaXN0RGlyLCBcInNlcnZlclwiLCBcInBhZ2VzXCIpICsgc2VwO1xuXG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIGN0eC5vdXRwdXRzLnN0YXRpY0ZpbGVzKSB7XG4gICAgY29uc3Qga2V5ID0gdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgb3V0cHV0LmZpbGVQYXRoKSk7XG4gICAgY29uc3QgcGF0aG5hbWVzID0gcm91dGFibGVQYXRobmFtZXMoXG4gICAgICBvdXRwdXQucGF0aG5hbWUsXG4gICAgICBiYXNlUGF0aCxcbiAgICAgIG91dHB1dC5maWxlUGF0aC5zdGFydHNXaXRoKHBhZ2VzRGlyKSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgcGF0aG5hbWVzKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHN0YXRpY0ZpbGVzLmdldChwYXRobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCAmJiBleGlzdGluZyAhPT0ga2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBUd28gc3RhdGljIGZpbGVzIGNsYWltIHRoZSBwYXRobmFtZSBgICtcbiAgICAgICAgICAgIGBcIiR7cGF0aG5hbWV9XCIgKFwiJHtleGlzdGluZ31cIiBhbmQgXCIke2tleX1cIikuIERpc3BhdGNoIGNhbm5vdCBgICtcbiAgICAgICAgICAgIGBjaG9vc2UgYmV0d2VlbiB0aGVtLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGF0aWNGaWxlcy5zZXQocGF0aG5hbWUsIGtleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU29ydGVkIGJlY2F1c2Ugb2JqZWN0IGtleXMga2VlcCBpbnNlcnRpb24gb3JkZXIsIGFuZCBhIGJ5dGUtc3RhYmxlXG4gIC8vIGBtYW5pZmVzdC5qc29uYCBpcyB3aGF0IGtlZXBzIGl0IGRpZmZhYmxlIGFuZCB0aGUgQ0RLIGFzc2V0IGhhc2ggZnJvbVxuICAvLyBjaHVybmluZy5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4uc3RhdGljRmlsZXNdLnNvcnQoKFthXSwgW2JdKSA9PiAoYSA8IGIgPyAtMSA6IDEpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgcGF0aG5hbWVzIGFuIG91dHB1dCBhbnN3ZXJzLCB3aGljaCBmb3Igb25lIHNoYXBlIGlzIG5vdCB0aGUgcGF0aG5hbWVcbiAqIGBuZXh0IGJ1aWxkYCByZXBvcnRlZC5cbiAqXG4gKiAqKkEgUGFnZXMgUm91dGVyIGhvbWUgcGFnZSBhcnJpdmVzIGFzIGAvaW5kZXhgLioqIFRoZSBhZGFwdGVyIGhvb2sgZGVyaXZlcyBldmVyeVxuICogUGFnZXMgcGF0aG5hbWUgd2l0aCBgbm9ybWFsaXplUGFnZVBhdGgocGFnZSlgLCBhbmQgYG5vcm1hbGl6ZVBhZ2VQYXRoKFwiL1wiKWAgaXNcbiAqIGBcIi9pbmRleFwiYCAoYG5leHQvZGlzdC9zaGFyZWQvbGliL3BhZ2UtcGF0aC9ub3JtYWxpemUtcGFnZS1wYXRoLmpzYCkg4oCUIGZvciB0aGVcbiAqIGBQQUdFU2Agb3V0cHV0IG9mIGFuIFNTRyBvciBTU1IgaG9tZSBwYWdlIGFuZCBmb3IgdGhlIGBTVEFUSUNfRklMRWAgb2YgYVxuICogZnVsbHktc3RhdGljIG9uZSBhbGlrZS4gYC9pbmRleGAgaXMgbm90IGEgVVJMIGFueW9uZSByZXF1ZXN0cywgYW5kIG5vdGhpbmcgZWxzZVxuICogaW4gdGhlIG91dHB1dHMgY2FycmllcyBgL2AgZm9yIHRoYXQgcGFnZSwgc28gd2l0aG91dCB0aGlzIHRoZSBob21lIHBhZ2UgaXMgaW5cbiAqIG5laXRoZXIgYG1hbmlmZXN0LnBhdGhuYW1lc2Agbm9yIGBtYW5pZmVzdC5lbnRyeXBvaW50c2AvYHN0YXRpY0ZpbGVzYCwgYW5kIGV2ZXJ5XG4gKiByZXF1ZXN0IHRvIGAvYCA0MDRzIHdoaWxlIGV2ZXJ5IG90aGVyIHBhZ2Ugb2YgdGhlIHNhbWUgYXBwIHNlcnZlcy4gTWVhc3VyZWRcbiAqIGFnYWluc3QgbmV4dC5qcydzIGB0ZXN0L2UyZS9uZXctbGluay1iZWhhdmlvcmAgKGAvYCByZXR1cm5lZCB0aGUgYnVpbHQtaW4gNDA0LFxuICogdGhlIHNpeCBvdGhlciBwYWdlcyB3ZXJlIGZpbmUpIGFuZCBgdGVzdC9lMmUvcHJlcmVuZGVyLXByZXZpZXdgICh0aGUgb25lIGNhc2VcbiAqIHRoYXQgZmV0Y2hlcyBgL2AgZ290IHRoZSA0MDQgcGFnZSdzIEhUTUwsIHRoZSBlaWdodCB0aGF0IGhpdCBBUEkgcm91dGVzIHBhc3NlZCkuXG4gKlxuICogUGFnZXMgUm91dGVyIG91dHB1dHMgb25seSwgd2hpY2ggaXMgd2hhdCBgZnJvbVBhZ2VzUm91dGVyYCBzYXlzLiBBcHAgUm91dGVyXG4gKiByZXBvcnRzIGl0cyBob21lIHBhZ2UgYXMgYC9gIGFuZCBvbmx5IHRoZSBSU0Mgc2libGluZyBhcyBgL2luZGV4LnJzY2AsIHNvIGFuXG4gKiBBcHAgUm91dGVyIGAvaW5kZXhgIGlzIGBhcHAvaW5kZXgvcGFnZS50c3hgIOKAlCBhIHJlYWwgcm91dGUgYXQgYC9pbmRleGAsIGFuZFxuICogbWFwcGluZyBpdCB0byBgL2AgbWFkZSBhbiBhcHAgd2l0aCBib3RoIHBhZ2VzIGZhaWwgdGhlIGJ1aWxkIG9uIGEgcGF0aG5hbWVcbiAqIGNvbGxpc2lvbiwgYW5kIGFuIGFwcCB3aXRoIG9ubHkgdGhlIHNlY29uZCBzZXJ2ZSBpdCBhdCBgL2AuIFRoZSBzYW1lIGdvZXMgZm9yXG4gKiBhIGBwdWJsaWMvaW5kZXhgIGZpbGUuXG4gKlxuICogQm90aCBwYXRobmFtZXMgYXJlIHJlZ2lzdGVyZWQuIGAvYCBiZWNhdXNlIGl0IGlzIHRoZSByZWFsIG9uZTsgYC9pbmRleGAgYmVjYXVzZVxuICogbmV4dCdzIG93biBtaW5pbWFsIG1vZGUg4oCUIHRoZSBtb2RlIG91ciBydW50aW1lIHJ1bnMgaW4g4oCUIGFjY2VwdHMgaXQsIHJld3JpdGluZ1xuICogYHJlcS51cmxgIGFuZCBgeC1tYXRjaGVkLXBhdGhgIGZyb20gYC9pbmRleGAgdG8gYC9gIGJlZm9yZSBtYXRjaGluZ1xuICogKGBiYXNlLXNlcnZlci50c2AsIFwiaW4gbWluaW1hbCBtb2RlXCIpLCBzbyBkcm9wcGluZyBpdCB3b3VsZCBiZSBhIGRpdmVyZ2VuY2UgaW5cbiAqIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gKlxuICogVW5hbWJpZ3VvdXMgd2l0aGluIHRoZSBQYWdlcyBSb3V0ZXIgZGVzcGl0ZSB0aGUgY29sbGlzaW9uIGl0IGxvb2tzIGxpa2U6XG4gKiBgbm9ybWFsaXplUGFnZVBhdGgoXCIvaW5kZXhcIilgIGlzIGBcIi9pbmRleC9pbmRleFwiYCwgc28gYSByZXBvcnRlZCBgL2luZGV4YCBjYW5cbiAqIG9ubHkgaGF2ZSBjb21lIGZyb20gdGhlIHBhZ2UgYC9gLlxuICogVGhlIGRhdGEgcm91dGUgb2YgdGhlIHNhbWUgcGFnZSwgYC9fbmV4dC9kYXRhLzxidWlsZElkPi9pbmRleC5qc29uYCwgYW5kIGFuIEFwcFxuICogUm91dGVyIGAvaW5kZXgucnNjYCBhcmUgYm90aCByZWFsIFVSTHMgYW5kIGFyZSBsZWZ0IGFsb25lIGJ5IHRoZSBleGFjdCBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gcm91dGFibGVQYXRobmFtZXMoXG4gIHBhdGhuYW1lOiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4gIGZyb21QYWdlc1JvdXRlcjogYm9vbGVhbixcbik6IHN0cmluZ1tdIHtcbiAgaWYgKCFmcm9tUGFnZXNSb3V0ZXIgfHwgcGF0aG5hbWUgIT09IGAke2Jhc2VQYXRofS9pbmRleGApIHtcbiAgICByZXR1cm4gW3BhdGhuYW1lXTtcbiAgfVxuICAvLyBgYmFzZVBhdGggfHwgXCIvXCJgLCBub3QgYCR7YmFzZVBhdGh9L2A6IHdpdGggYGJhc2VQYXRoOiBcIi9wcm9kXCJgIHRoZSBob21lIHBhZ2VcbiAgLy8gaXMgYC9wcm9kYCwgd2hpY2ggaXMgaG93IHRoZSBBcHAgUm91dGVyIGZpeHR1cmVzIHJlcG9ydCB0aGVpcnMuXG4gIHJldHVybiBbYmFzZVBhdGggfHwgXCIvXCIsIHBhdGhuYW1lXTtcbn1cblxuLyoqXG4gKiBBZGQgdGhlIHN0YXRpYyBmaWxlcyB0aGUgKnJ1bnRpbWUqIHNlcnZlcyB0byBhIHN0YWdpbmcgcGxhbiDigJQgdGhlIFwiZXZlcnl0aGluZ1xuICogZWxzZVwiIHBvcHVsYXRpb24gZGVzY3JpYmVkIG9uIHtAbGluayBjb2xsZWN0U3RhdGljRmlsZXN9LCBhbGwgb2YgaXQgdW5kZXJcbiAqIGA8ZGlzdERpcj4vc2VydmVyL2AuXG4gKlxuICogU2VwYXJhdGUgZnJvbSBidWlsZGluZyB0aGUgbWFuaWZlc3QncyBgc3RhdGljRmlsZXNgIG1hcCBiZWNhdXNlIHRoZSBtYXAgaXMgdGhlXG4gKiBzYW1lIGZvciBldmVyeSBncm91cCB3aGlsZSB0aGUgc3RhZ2luZyBpcyBhcHBsaWVkIG9uY2UgcGVyIGRlcGxveW1lbnQgcm9vdDpcbiAqIGFueSBncm91cCBjYW4gYmUgYXNrZWQgZm9yIGAvNDA0YCwgc28gZXZlcnkgZ3JvdXAgc2hpcHMgdGhlc2UuXG4gKi9cbmZ1bmN0aW9uIHN0YWdlU2VydmVkU3RhdGljRmlsZXMoXG4gIGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsXG4gIHN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiB2b2lkIHtcbiAgY29uc3QgeyByZXBvUm9vdCwgZGlzdERpciB9ID0gY3R4O1xuICBjb25zdCBjbGllbnRTdGF0aWNEaXIgPSBqb2luKGRpc3REaXIsIFwic3RhdGljXCIpICsgc2VwO1xuXG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIGN0eC5vdXRwdXRzLnN0YXRpY0ZpbGVzKSB7XG4gICAgY29uc3Qgc2VydmVkQnlTMyA9XG4gICAgICBvdXRwdXQuZmlsZVBhdGguc3RhcnRzV2l0aChjbGllbnRTdGF0aWNEaXIpIHx8XG4gICAgICAhb3V0cHV0LmZpbGVQYXRoLnN0YXJ0c1dpdGgoZGlzdERpciArIHNlcCk7XG4gICAgaWYgKHNlcnZlZEJ5UzMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBvdXRwdXQuZmlsZVBhdGgpKTtcbiAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgb3V0cHV0LmZpbGVQYXRoKTtcbiAgICBzdGFnaW5nLnNldChrZXksIG91dHB1dC5maWxlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgaW52YXJpYW50IGJlaGluZCBgbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyYDogYG5leHQgYnVpbGRgIG11c3QgcnVuIGZyb21cbiAqIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAqXG4gKiBOZXh0IGlubGluZXMgYHJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHByb2plY3REaXIpYCBpbnRvIGV2ZXJ5IGVudHJ5cG9pbnRcbiAqIChgZGVmaW5lLWVudi5qc2ApIGFuZCB0aGUgYnVpbHQgY29kZSByZXNvbHZlcyBpdCBhZ2FpbnN0IHRoZSAqcnVudGltZSpcbiAqIGBwcm9jZXNzLmN3ZCgpYC4gS2VlcGluZyBidWlsZCBjd2QgYW5kIHByb2plY3QgZGlyIGVxdWFsIG1ha2VzIHRoYXQgaW5saW5lZFxuICogdmFsdWUgYFwiXCJgLCBzbyB0aGUgcnVudGltZSBvbmx5IGhhcyB0byBgY2hkaXJgIHRvIHRoZSBzdGFnZWQgcHJvamVjdCBkaXIuIEFcbiAqIGJ1aWxkIHJ1biBmcm9tIGVsc2V3aGVyZSB3b3VsZCBpbmxpbmUgYSBub24tZW1wdHkgcmVsYXRpdmUgcGF0aCDigJQgb2Z0ZW4gb25lXG4gKiBwb2ludGluZyBvdXRzaWRlIHRoZSBzdGFnaW5nIHRyZWUg4oCUIGFuZCBldmVyeSBlbnRyeXBvaW50IHdvdWxkIGZhaWwgdG8gZmluZFxuICogYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBhdCBydW50aW1lIHdpdGggbm8gaGludCBhcyB0byB3aHkuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEJ1aWxkQ3dkKGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQsIGJ1aWxkQ3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgY3dkID0gcmVzb2x2ZShidWlsZEN3ZCk7XG4gIGlmIChjd2QgPT09IHJlc29sdmUoY3R4LnByb2plY3REaXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgJHtMT0dfUFJFRklYfSBcXGBuZXh0IGJ1aWxkXFxgIG11c3QgcnVuIGZyb20gdGhlIE5leHQuanMgcHJvamVjdCBgICtcbiAgICAgIGBkaXJlY3RvcnkuIEl0IHJhbiBmcm9tIFwiJHtjd2R9XCIgd2l0aCB0aGUgcHJvamVjdCBhdCBgICtcbiAgICAgIGBcIiR7Y3R4LnByb2plY3REaXJ9XCIuIE5leHQuanMgYmFrZXMgdGhlIHJlbGF0aXZlIHBhdGggYmV0d2VlbiB0aG9zZSB0d28gYCArXG4gICAgICBgaW50byBldmVyeSBidWlsdCBlbnRyeXBvaW50LCBhbmQgY2RrLW5leHRqcyBjYW5ub3QgcmVwcm9kdWNlIHRoYXQgbGF5b3V0IGAgK1xuICAgICAgYGluIHRoZSBkZXBsb3ltZW50IHBhY2thZ2UuIENoYW5nZSBkaXJlY3RvcnkgZmlyc3QgKFxcYGNkIGAgK1xuICAgICAgYCR7cmVsYXRpdmUoY3dkLCBjdHgucHJvamVjdERpcikgfHwgXCIuXCJ9ICYmIG5leHQgYnVpbGRcXGApIGluc3RlYWQgb2YgYCArXG4gICAgICBgcGFzc2luZyB0aGUgZGlyZWN0b3J5IGFzIGFuIGFyZ3VtZW50OyBpbiBhIG1vbm9yZXBvLCBydW4gdGhlIGFwcCdzIG93biBgICtcbiAgICAgIGBidWlsZCBzY3JpcHQgZnJvbSBpdHMgZGlyZWN0b3J5IChlLmcuIFxcYHBucG0gLS1maWx0ZXIgPGFwcD4gYnVpbGRcXGAsIGAgK1xuICAgICAgYHdoaWNoIHJ1bnMgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5KS5gLFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGRFbnRyeXBvaW50KFxuICBlbnRyeXBvaW50czogUmVjb3JkPHN0cmluZywgQWRhcHRlckVudHJ5cG9pbnQ+LFxuICByZXBvUm9vdDogc3RyaW5nLFxuICBvdXRwdXQ6IHsgaWQ6IHN0cmluZzsgcGF0aG5hbWU6IHN0cmluZzsgZmlsZVBhdGg6IHN0cmluZyB9LFxuICB0eXBlOiBBZGFwdGVyRW50cnlwb2ludFR5cGUsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgZmlsZVBhdGggPSB0b1Bvc2l4KHJlbGF0aXZlKHJlcG9Sb290LCBvdXRwdXQuZmlsZVBhdGgpKTtcbiAgY29uc3QgcGF0aG5hbWVzID0gcm91dGFibGVQYXRobmFtZXMoXG4gICAgb3V0cHV0LnBhdGhuYW1lLFxuICAgIGJhc2VQYXRoLFxuICAgIHR5cGUgPT09IFwicGFnZVwiLFxuICApO1xuICBmb3IgKGNvbnN0IHBhdGhuYW1lIG9mIHBhdGhuYW1lcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZW50cnlwb2ludHNbcGF0aG5hbWVdO1xuICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5maWxlUGF0aCAhPT0gZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVHdvIGJ1aWxkIG91dHB1dHMgY2xhaW0gdGhlIHBhdGhuYW1lIFwiJHtwYXRobmFtZX1cIiBgICtcbiAgICAgICAgICBgKFwiJHtleGlzdGluZy5maWxlUGF0aH1cIiBhbmQgXCIke2ZpbGVQYXRofVwiKS4gRGlzcGF0Y2ggY2Fubm90IGNob29zZSBgICtcbiAgICAgICAgICBgYmV0d2VlbiB0aGVtLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBlbnRyeXBvaW50c1twYXRobmFtZV0gPSB7IGlkOiBvdXRwdXQuaWQsIGZpbGVQYXRoLCB0eXBlIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgdGhlICpwcmVyZW5kZXIqIHBhdGhuYW1lcyB0aGF0IG5vIGludm9jYWJsZSBvdXRwdXQgY2xhaW1zIGFuZCB0aGF0IHJvdXRpbmdcbiAqIGNhbm5vdCBvdGhlcndpc2UgcmVhY2guXG4gKlxuICogYHJlc29sdmVSb3V0ZXNgIGNhbiBvbmx5IG1hdGNoIGEgcGF0aG5hbWUgcHJlc2VudCBpbiBgbWFuaWZlc3QucGF0aG5hbWVzYCwgYW5kXG4gKiBmb3IgYSBkeW5hbWljIG1hdGNoIGl0IHJldHVybnMgdGhlICoqdGVtcGxhdGUqKiBpdCBtYXRjaGVkLiBSb3V0ZXMgYW5kIHN0YXRpY1xuICogZmlsZXMgY292ZXIgbW9zdCBvZiB0aGF0OyB0d28gc2hhcGVzIHRoZXkgbWlzczpcbiAqXG4gKiAxLiAqKlRlbXBsYXRlcy4qKiBBIHJlcXVlc3QgZm9yIGAvX25leHQvZGF0YS88YnVpbGRJZD4vZnIvYmxvZy9oZWxsby5qc29uYCBvbmx5XG4gKiAgICByZXNvbHZlcyBpZiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+L2ZyL2Jsb2cvW3NsdWddLmpzb25gIGlzIGxpc3RlZCwgYW5kIHRoYXRcbiAqICAgIHBhdGhuYW1lIGV4aXN0cyBzb2xlbHkgYXMgYSBgcHJlcmVuZGVyc2AgZW50cnkuXG4gKiAxYi4gKipBIHN0YXRpYyBgZ2V0U3RhdGljUHJvcHNgIHBhZ2UncyBkYXRhIHJvdXRlLioqIGAvX25leHQvZGF0YS88YnVpbGRJZD4vZ3NwLmpzb25gXG4gKiAgICBoYXMgbm8gdGVtcGxhdGUgdG8gbWF0Y2ggYW5kIG5vIHJ1bGUgb2YgaXRzIG93bjogYG5leHQgYnVpbGRgIG9ubHkgZW1pdHMgYVxuICogICAgYGR5bmFtaWNSb3V0ZXNgIHJ1bGUgZm9yIGEgZGF0YSByb3V0ZSB3aGVuIHRoZSBwYWdlIGlzIGR5bmFtaWMgKm9yKiB0aGUgYXBwIGhhc1xuICogICAgbWlkZGxld2FyZSAoYGJ1aWxkLWNvbXBsZXRlLnRzYCwgYG5lZWRzTWlkZGxld2FyZVJlc29sdmVSb3V0ZXNgLCB3aGljaCBpcyBhbHNvXG4gKiAgICB3aGF0IGByb3V0aW5nLnNob3VsZE5vcm1hbGl6ZU5leHREYXRhYCByZXBvcnRzKS4gV2l0aG91dCBtaWRkbGV3YXJlIE5leHQuanNcbiAqICAgIGV4cGVjdHMgdGhlIHBsYXRmb3JtIHRvIHNlcnZlIHRoZSBkYXRhIHJvdXRlIGFzIGFuIG91dHB1dCwgYnkgcGF0aG5hbWUg4oCUIHNvIGFcbiAqICAgIGNvbmNyZXRlIGRhdGEtcm91dGUgcHJlcmVuZGVyIGlzIHJlZ2lzdGVyZWQgd2hhdGV2ZXIgdGhlIHJ1bGVzIHNheS4gTWlzc2luZyBpdFxuICogICAgdHVybmVkIGV2ZXJ5IGNsaWVudC1zaWRlIG5hdmlnYXRpb24gaW50byBzdWNoIGEgcGFnZSBpbnRvIGEgZnVsbCBwYWdlIGxvYWQsXG4gKiAgICBiZWNhdXNlIHRoZSByb3V0ZXIncyBgLmpzb25gIGZldGNoIDQwNCdkOiBtZWFzdXJlZCBhZ2FpbnN0XG4gKiAgICBgdGVzdC9lMmUvbm8tcGFnZS1wcm9wc2AuIE9ubHkgd2hlbiBubyAqdW5nYXRlZCogcnVsZSBtYXRjaGVzLCBmb3IgdGhlIHJlYXNvblxuICogICAgYmVsb3cg4oCUIGEgZHluYW1pYyBwYWdlJ3MgYC/igKYvYmxvZy9oZWxsby5qc29uYCBtdXN0IGtlZXAgcmVzb2x2aW5nIHRvIGl0c1xuICogICAgYFtzbHVnXS5qc29uYCB0ZW1wbGF0ZSwgd2hpY2ggaXMgd2hlcmUgYG54dFBzbHVnYCBjb21lcyBmcm9tLlxuICogMi4gKipDb25jcmV0ZSBwYXRobmFtZXMgd2hvc2UgZHluYW1pYyByb3V0ZSBydWxlIGlzIGdhdGVkLioqIEEgcm91dGUgd2hvc2UgcGFyYW1zXG4gKiAgICBjYW4gbmV2ZXIgYmUgZmlsbGVkIGF0IHJlcXVlc3QgdGltZSDigJQgcm9vdCBwYXJhbXMgYXJlIHRoZSBjYXNlIHRoYXQgcHJvZHVjZWRcbiAqICAgIHRoaXMsIGBhcHAvW2xvY2FsZV0vcGFnZS50c3hgIHdpdGggYGdlbmVyYXRlU3RhdGljUGFyYW1zKClgIGFuZCBub1xuICogICAgYGFwcC9sYXlvdXQudHN4YCDigJQgZ2V0cyBpdHMgYGR5bmFtaWNSb3V0ZXNgIHJ1bGUgZW1pdHRlZCB3aXRoIGEgZHJhZnQtbW9kZVxuICogICAgYGhhc2Agb24gYF9fcHJlcmVuZGVyX2J5cGFzc2AuIE5leHQuanMgaXMgc2F5aW5nOiBpbnZva2UgdGhlIGZ1bmN0aW9uIG9ubHkgaW5cbiAqICAgIGRyYWZ0IG1vZGUsIGFuZCBvdGhlcndpc2Ugc2VydmUgdGhlIHByZXJlbmRlciB5b3Ugd2VyZSBoYW5kZWQuIFZlcmNlbCdzIENETlxuICogICAgZG9lcyB0aGF0IGZyb20gdGhlIG91dHB1dCBpdHNlbGY7IHdlIHJvdXRlIHRoZSByZXF1ZXN0IHRvIHRoZSBvd25pbmdcbiAqICAgIGVudHJ5cG9pbnQsIHdoaWNoIGFuc3dlcnMgaXQgb3V0IG9mIHRoZSBzZWVkZWQgY2FjaGUuIFdpdGhvdXQgdGhpcywgYC9lbmAgaXMgYVxuICogICAgNDA0IHdoaWxlIGBuZXh0IHN0YXJ0YCByZW5kZXJzIGl0IOKAlCBhbmQgc28gaXMgZXZlcnkgYC5yc2NgL2Auc2VnbWVudHNgXG4gKiAgICB2YXJpYW50LCB3aGljaCBpcyB3aHkgYSBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uIGludG8gc3VjaCBhbiBhcHAgbmV2ZXJcbiAqICAgIGNvbXBsZXRlcy5cbiAqXG4gKiBBIGNvbmNyZXRlIHBhdGhuYW1lIGlzIGFkZGVkIG9ubHkgd2hlbiBhIGdhdGVkIHJ1bGUgbWF0Y2hlcyBpdCBhbmQgbm8gdW5nYXRlZFxuICogb25lIGRvZXMg4oCUIHRoZSBzZXQgdGhhdCB3b3VsZCA0MDQgdG9kYXkgKmFuZCogdGhhdCByb3V0aW5nIGNhbiBzdGlsbCBwcm9kdWNlLlxuICogQWRkaW5nIHRoZW0gdW5jb25kaXRpb25hbGx5IHdhcyBtZWFzdXJlZCB0byBiZSBhY3RpdmVseSB3cm9uZyB0d2ljZSBvdmVyOlxuICogYC9pc3IvMWAgcmVzb2x2ZXMgdG8gaXRzZWxmIHJhdGhlciB0aGFuIHRvIGAvaXNyL1tpZF1gLCBsb3NpbmcgdGhlIGBueHRQaWRgXG4gKiBxdWVyeSBwYXJhbSB0aGUgcm91dGUgbmVlZHMsIGFuZCBwYXRobmFtZXMgbm8gcnVsZSBtYXRjaGVzIGF0IGFsbCAoYSBzdGF0aWNcbiAqIHJvdXRlJ3MgYC5zZWdtZW50cy/igKZgIG91dHB1dHMsIHdoaWNoIGByZXNvbHZlUm91dGVzYCBuZXZlciBhc2tzIGZvcikgYXJlIGRlYWRcbiAqIG1hbmlmZXN0IHdlaWdodC4gTWF0Y2hpbmcgbWlycm9ycyBgcmVzb2x2ZVJvdXRlc2AsIHdoaWNoIGlzIGNhc2UtaW5zZW5zaXRpdmUgYnlcbiAqIGRlZmF1bHQuXG4gKlxuICogVGhlIG93bmluZyBlbnRyeXBvaW50IGNvbWVzIGZyb20gYHByZXJlbmRlci5yb3V0ZWAsIHdoaWNoIGlzIHRoZSB1bnByZWZpeGVkIGFuZFxuICogdW5sb2NhbGl6ZWQgc291cmNlIHJvdXRlIChgL2Jsb2cvW3NsdWddYCksIGhlbmNlIHRoZSBiYXNlUGF0aC10aGVuLWJhcmUgbGFkZGVyLlxuICogTG9jYWxlIHZhcmlhbnRzIG9mIG9uZSBwYWdlIHNoYXJlIGEgYGZpbGVQYXRoYCwgc28gYW55IGxvY2FsZSdzIGVudHJ5cG9pbnQgaXNcbiAqIHRoZSByaWdodCB0YXJnZXQuIEFuIFJTQyBvciBzZWdtZW50LXByZWZldGNoIHBhdGhuYW1lIHByZWZlcnMgdGhlIHJvdXRlJ3MgYC5yc2NgXG4gKiBlbnRyeXBvaW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlIGtleSBgcmVzb2x2ZVJvdXRlc2AgcmVzb2x2ZXMgc3VjaCBhIHJlcXVlc3QgdG8uXG4gKi9cbmZ1bmN0aW9uIGFkZFByZXJlbmRlclBhdGhuYW1lcyhcbiAgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PixcbiAgcHJlcmVuZGVyczogQWRhcHRlck91dHB1dHNbXCJwcmVyZW5kZXJzXCJdLFxuICBkeW5hbWljUm91dGVzOiB7XG4gICAgc291cmNlUmVnZXg6IHN0cmluZztcbiAgICBoYXM/OiB1bmtub3duW107XG4gICAgbWlzc2luZz86IHVua25vd25bXTtcbiAgfVtdLFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBkYXRhUm91dGVQcmVmaXg6IHN0cmluZyxcbik6IHZvaWQge1xuICBjb25zdCBtYXRjaGVycyA9IGR5bmFtaWNSb3V0ZXMubWFwKChyb3V0ZSkgPT4gKHtcbiAgICByZWdleDogbmV3IFJlZ0V4cChyb3V0ZS5zb3VyY2VSZWdleCwgXCJpXCIpLFxuICAgIGdhdGVkOiBCb29sZWFuKHJvdXRlLmhhcz8ubGVuZ3RoIHx8IHJvdXRlLm1pc3Npbmc/Lmxlbmd0aCksXG4gIH0pKTtcbiAgY29uc3QgbWF0Y2hpbmdSdWxlcyA9IChwYXRobmFtZTogc3RyaW5nKSA9PlxuICAgIG1hdGNoZXJzLmZpbHRlcigoeyByZWdleCB9KSA9PiByZWdleC50ZXN0KHBhdGhuYW1lKSk7XG4gIGNvbnN0IG9ubHlHYXRlZFJ1bGVzTWF0Y2ggPSAocGF0aG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBtYXRjaGluZ1J1bGVzKHBhdGhuYW1lKTtcbiAgICByZXR1cm4gbWF0Y2hlZC5sZW5ndGggPiAwICYmIG1hdGNoZWQuZXZlcnkoKHsgZ2F0ZWQgfSkgPT4gZ2F0ZWQpO1xuICB9O1xuICAvKipcbiAgICogTm90aGluZyByZWFjaGVzIHRoaXMgcGF0aG5hbWUgYXQgcmVxdWVzdCB0aW1lOiBlaXRoZXIgbm8gcnVsZSBtYXRjaGVzIGl0IG9yXG4gICAqIGV2ZXJ5IHJ1bGUgdGhhdCBkb2VzIGlzIGdhdGVkLiBUaGUgZ2F0ZWQgaGFsZiBpcyB7QGxpbmsgb25seUdhdGVkUnVsZXNNYXRjaH07XG4gICAqIHRoZSBcIm5vIHJ1bGUgYXQgYWxsXCIgaGFsZiBvbmx5IGV2ZXIgaG9sZHMgZm9yIGEgZGF0YSByb3V0ZSwgYmVjYXVzZSBhIHBhZ2Unc1xuICAgKiBvd24gcGF0aG5hbWUgaXMgYW4gb3V0cHV0LlxuICAgKi9cbiAgY29uc3Qgbm90aGluZ1VuZ2F0ZWRNYXRjaGVzID0gKHBhdGhuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgbWF0Y2hpbmdSdWxlcyhwYXRobmFtZSkuZXZlcnkoKHsgZ2F0ZWQgfSkgPT4gZ2F0ZWQpO1xuXG4gIGNvbnN0IG9ycGhhbnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcHJlcmVuZGVyIG9mIHByZXJlbmRlcnMpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBwcmVyZW5kZXI7XG4gICAgaWYgKGVudHJ5cG9pbnRzW3BhdGhuYW1lXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzVGVtcGxhdGUgPSBwYXRobmFtZS5pbmNsdWRlcyhcIltcIik7XG4gICAgY29uc3QgaXNEYXRhUm91dGUgPVxuICAgICAgcGF0aG5hbWUuc3RhcnRzV2l0aChkYXRhUm91dGVQcmVmaXgpICYmIHBhdGhuYW1lLmVuZHNXaXRoKFwiLmpzb25cIik7XG4gICAgY29uc3QgcmVhY2hhYmxlID0gaXNEYXRhUm91dGVcbiAgICAgID8gbm90aGluZ1VuZ2F0ZWRNYXRjaGVzKHBhdGhuYW1lKVxuICAgICAgOiBvbmx5R2F0ZWRSdWxlc01hdGNoKHBhdGhuYW1lKTtcbiAgICBpZiAoIWlzVGVtcGxhdGUgJiYgIXJlYWNoYWJsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHN1ZmZpeGVzID0gcGF0aG5hbWUuZW5kc1dpdGgoXCIucnNjXCIpID8gW1wiLnJzY1wiLCBcIlwiXSA6IFtcIlwiXTtcbiAgICBjb25zdCBvd25lciA9IHN1ZmZpeGVzXG4gICAgICAuZmxhdE1hcCgoc3VmZml4KSA9PiBbXG4gICAgICAgIGAke2Jhc2VQYXRofSR7cHJlcmVuZGVyLnJvdXRlfSR7c3VmZml4fWAsXG4gICAgICAgIGAke3ByZXJlbmRlci5yb3V0ZX0ke3N1ZmZpeH1gLFxuICAgICAgXSlcbiAgICAgIC5tYXAoKGtleSkgPT4gZW50cnlwb2ludHNba2V5XSlcbiAgICAgIC5maW5kKEJvb2xlYW4pO1xuICAgIGlmICghb3duZXIpIHtcbiAgICAgIG9ycGhhbnMucHVzaChgJHtwYXRobmFtZX0gKHJvdXRlOiBcIiR7cHJlcmVuZGVyLnJvdXRlfVwiKWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudHJ5cG9pbnRzW3BhdGhuYW1lXSA9IHtcbiAgICAgIGlkOiBwcmVyZW5kZXIuaWQsXG4gICAgICBmaWxlUGF0aDogb3duZXIuZmlsZVBhdGgsXG4gICAgICB0eXBlOiBvd25lci50eXBlLFxuICAgIH07XG4gIH1cblxuICBpZiAob3JwaGFucy5sZW5ndGggPiAwKSB7XG4gICAgLy8gV2FybiByYXRoZXIgdGhhbiB0aHJvdzogYW4gdW5tYXBwZWQgcGF0aG5hbWUgZGVncmFkZXMgb25lIFVSTCBzaGFwZSB0byBhXG4gICAgLy8gNDA0LCB3aGljaCBpcyB3aGF0IHdvdWxkIGhhcHBlbiB3aXRob3V0IHRoaXMgZnVuY3Rpb24gYXQgYWxsLiBBIHRocm93XG4gICAgLy8gd291bGQgYnJlYWsgdGhlIGJ1aWxkIG91dHJpZ2h0IG9uIGFuIG91dHB1dCBzaGFwZSBhIGZ1dHVyZSBgbmV4dGAgbWlub3JcbiAgICAvLyBtaWdodCBpbnRyb2R1Y2UuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gJHtvcnBoYW5zLmxlbmd0aH0gcHJlcmVuZGVyIHBhdGhuYW1lKHMpIGhhdmUgbm8gYCArXG4gICAgICAgIGBtYXRjaGluZyByb3V0ZSBlbnRyeXBvaW50IGFuZCB3aWxsIDQwNDogYCArXG4gICAgICAgIGAke29ycGhhbnMuc2xpY2UoMCwgNSkuam9pbihcIiwgXCIpfWAgK1xuICAgICAgICBgJHtvcnBoYW5zLmxlbmd0aCA+IDUgPyBgLCBhbmQgJHtvcnBoYW5zLmxlbmd0aCAtIDV9IG1vcmVgIDogXCJcIn0uYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWlkZGxld2FyZShcbiAgcmVwb1Jvb3Q6IHN0cmluZyxcbiAgbWlkZGxld2FyZTogQWRhcHRlck91dHB1dHNbXCJtaWRkbGV3YXJlXCJdLFxuKTogQWRhcHRlck1pZGRsZXdhcmUgfCBudWxsIHtcbiAgaWYgKCFtaWRkbGV3YXJlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gYGNvbmZpZy5tYXRjaGVyc2AgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjb3BpZWQgaGVyZTogaXQgYXJyaXZlcyBpbnNpZGVcbiAgLy8gYGN0eC5yb3V0aW5nLm1pZGRsZXdhcmVNYXRjaGVyc2AsIHdoaWNoIGBAbmV4dC9yb3V0aW5nYCBjb25zdW1lcyBkaXJlY3RseS5cbiAgcmV0dXJuIHtcbiAgICBpZDogbWlkZGxld2FyZS5pZCxcbiAgICBmaWxlUGF0aDogdG9Qb3NpeChyZWxhdGl2ZShyZXBvUm9vdCwgbWlkZGxld2FyZS5maWxlUGF0aCkpLFxuICB9O1xufVxuXG4vKipcbiAqIGBjYWNoZUhhbmRsZXJgIHJlbGF0aXZlIHRvIHRoZSBkaXN0IGRpciwgYXMgYG5leHQgYnVpbGRgIHdyaXRlcyBpdCBpbnRvXG4gKiBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gIChgYnVpbGQvaW5kZXguanNgLCB2aWFcbiAqIGByZXNvbHZlQ2FjaGVIYW5kbGVyUGF0aFRvRmlsZXN5c3RlbWApOiBgY3R4LmNvbmZpZ2AgaGFzIHRoZSBidWlsZCBtYWNoaW5lJ3NcbiAqIGFic29sdXRlIHBhdGgsIGFuZCB0aGUgcnVudGltZSByZXNvbHZlcyB0aGlzIGFnYWluc3QgaXRzIG93biBkaXN0IGRpci5cbiAqL1xuZnVuY3Rpb24gZGlzdFJlbGF0aXZlQ2FjaGVIYW5kbGVyKGN0eDogQnVpbGRDb21wbGV0ZUNvbnRleHQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBjYWNoZUhhbmRsZXIgfSA9IGN0eC5jb25maWc7XG4gIGlmICghY2FjaGVIYW5kbGVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcGF0aCA9IGNhY2hlSGFuZGxlci5zdGFydHNXaXRoKFwiZmlsZTovL1wiKVxuICAgID8gZmlsZVVSTFRvUGF0aChjYWNoZUhhbmRsZXIpXG4gICAgOiBjYWNoZUhhbmRsZXI7XG4gIHJldHVybiB0b1Bvc2l4KHJlbGF0aXZlKGN0eC5kaXN0RGlyLCByZXNvbHZlKGN0eC5wcm9qZWN0RGlyLCBwYXRoKSkpO1xufVxuXG4vKipcbiAqIENvcHkgdGhlIHN0YWdpbmcgcGxhbiBpbnRvIGBzdGFnaW5nRGlyYC5cbiAqXG4gKiAqKlN5bWxpbmtzIGFyZSByZWNyZWF0ZWQgYXMgc3ltbGlua3MsIG5vdCBkZXJlZmVyZW5jZWQqKiwgd2hpY2ggaXMgd2hhdFxuICogTmV4dC5qcydzIG93biBgY29weVRyYWNlZEZpbGVzYCBkb2VzIChgbmV4dC9kaXN0L2J1aWxkL3V0aWxzLmpzYDogYHJlYWRsaW5rYFxuICogdGhlbiBgc3ltbGlua2AsIHdpdGggYSBXaW5kb3dzIGp1bmN0aW9uIGZhbGxiYWNrKS4gVW5kZXIgcG5wbSBhIHRyYWNlZCBhc3NldFxuICoga2V5IGlzIGZyZXF1ZW50bHkgYSAqZGlyZWN0b3J5KiBzeW1saW5rIGludG8gdGhlIHN0b3JlXG4gKiAoYG5vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QOKApi9ub2RlX21vZHVsZXMvcmVhY3RgIOKGkiBgLi4vLi4vcmVhY3RAMTkuMi4zL+KApmApLCBzb1xuICogYGNvcHlGaWxlYCBmYWlscyBvdXRyaWdodCB3aXRoIGBFTk9UU1VQYC4gRGVyZWZlcmVuY2luZyBpbnN0ZWFkIHdvdWxkIHRyaXBsZVxuICogdGhlIHRyZWUg4oCUIGBleGFtcGxlcy9hcHAtcGxheWdyb3VuZGAgbWVhc3VyZXMgMzIgTUIgc3RhZ2VkIHZlcnN1cyA5NiBNQiB3aXRoXG4gKiBgZHUgLXNoTGAsIGFnYWluc3QgYSAyNTAgTUIgdW56aXBwZWQgTGFtYmRhIGNhcCDigJQgYmVjYXVzZSB3aG9sZSBwYWNrYWdlcyBhcmVcbiAqIHJlYWNoYWJsZSB0aHJvdWdoIHNldmVyYWwgc3VjaCBsaW5rcy4gVGhlIGxpbmsgdGFyZ2V0cyBhcmUgdGhlbXNlbHZlcyBzdGFnZWRcbiAqIGtleXMsIHNvIHJlbGF0aXZlIGxpbmtzIHJlc29sdmUgaW5zaWRlIHRoZSBkZXBsb3ltZW50IHJvb3QuXG4gKlxuICogUmVndWxhciBmaWxlcyBhcmUgc3RhZ2VkIGZpcnN0IHNvIHRoYXQgYSBzeW1saW5rIHdob3NlIHBhdGggd2FzIGFscmVhZHlcbiAqIG1hdGVyaWFsaXplZCBhcyBhIHJlYWwgZGlyZWN0b3J5IGlzIHNraXBwZWQgcmF0aGVyIHRoYW4gY2xvYmJlcmluZyBpdC5cbiAqXG4gKiBOb3RoaW5nIG1heSBkZXJlZmVyZW5jZSB0aGVtIGFmdGVyd2FyZHM6IHRoZSBGdW5jdGlvbnMgemlwIGtlZXBzIHRoZW0gYXNcbiAqIGxpbmtzIChgemlwRGlyZWN0b3J5YCksIGFuZCB0aGUgQ29udGFpbmVycyBgQ09QWWAgZG9lcyB0b28uXG4gKi9cbi8qKiBCb3VuZGVkIHNvIGEgbGFyZ2UgYXBwIGRvZXNuJ3QgZXhoYXVzdCBmaWxlIGRlc2NyaXB0b3JzLiAqL1xuY29uc3QgU1RBR0lOR19DT05DVVJSRU5DWSA9IDMyO1xuXG5hc3luYyBmdW5jdGlvbiBzdGFnZUZpbGVzKFxuICBzdGFnaW5nOiBTdGFnaW5nUGxhbixcbiAgc3RhZ2luZ0Rpcjogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBsYW5uZWQgPSBbLi4uc3RhZ2luZ107XG4gIC8vIExpbmtzIGxhbmQgYnkgcGxhbiBpbmRleCwgc28gdGhlIHBhc3MgYmVsb3cgY3JlYXRlcyB0aGVtIGluIHRoZSBwbGFuJ3NcbiAgLy8gb3JkZXIgd2hhdGV2ZXIgb3JkZXIgdGhlIHdvcmtlcnMgZmluaXNoZWQgaW4uXG4gIGNvbnN0IGxpbmtzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gfCB1bmRlZmluZWQ+ID0gbmV3IEFycmF5KFxuICAgIHBsYW5uZWQubGVuZ3RoLFxuICApO1xuICBsZXQgbmV4dEVudHJ5ID0gMDtcbiAgY29uc3Qgd29ya2VyID0gYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlIChuZXh0RW50cnkgPCBwbGFubmVkLmxlbmd0aCkge1xuICAgICAgY29uc3QgaW5kZXggPSBuZXh0RW50cnkrKztcbiAgICAgIGNvbnN0IFtrZXksIHNvdXJjZV0gPSBwbGFubmVkW2luZGV4XTtcbiAgICAgIGNvbnN0IGxpbmtUYXJnZXQgPSBhd2FpdCByZWFkbGluayhzb3VyY2UpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgaWYgKGxpbmtUYXJnZXQgIT09IG51bGwpIHtcbiAgICAgICAgbGlua3NbaW5kZXhdID0gW2tleSwgc291cmNlLCBsaW5rVGFyZ2V0XTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXN0ID0gam9pbihzdGFnaW5nRGlyLCBrZXkpO1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShkZXN0KSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBjb3B5RmlsZShzb3VyY2UsIGRlc3QpO1xuICAgIH1cbiAgfTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBNYXRoLm1pbihTVEFHSU5HX0NPTkNVUlJFTkNZLCBwbGFubmVkLmxlbmd0aCkgfSxcbiAgICAgIHdvcmtlcixcbiAgICApLFxuICApO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGlmIChsaW5rID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBba2V5LCBzb3VyY2UsIGxpbmtUYXJnZXRdID0gbGluaztcbiAgICBjb25zdCBkZXN0ID0gam9pbihzdGFnaW5nRGlyLCBrZXkpO1xuICAgIGlmIChleGlzdHNTeW5jKGRlc3QpKSB7XG4gICAgICAvLyBBbHJlYWR5IHN0YWdlZCBhcyByZWFsIGNvbnRlbnQgYnkgdGhlIHBvb2wgYWJvdmU7IHRoZSBsaW5rIHdvdWxkIGFkZFxuICAgICAgLy8gbm90aGluZyBhbmQgd291bGQgcmVwbGFjZSBhIGRpcmVjdG9yeSB3ZSBuZWVkLlxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGVzdCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShkaXJuYW1lKGRlc3QpLCBsaW5rVGFyZ2V0KTtcbiAgICBpZiAocmVzb2x2ZWQgPT09IHN0YWdpbmdEaXIgfHwgcmVzb2x2ZWQuc3RhcnRzV2l0aChzdGFnaW5nRGlyICsgc2VwKSkge1xuICAgICAgYXdhaXQgc3ltbGluayhsaW5rVGFyZ2V0LCBkZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUG9pbnRzIG91dHNpZGUgdGhlIGRlcGxveW1lbnQgcm9vdCwgc28gdGhlIGxpbmsgd291bGQgZGFuZ2xlIGluIExhbWJkYS5cbiAgICAgIC8vIEFic29sdXRlIHN0b3JlIHBhdGhzIGFyZSB0aGUgcmVhbGlzdGljIGNhc2UgaGVyZS5cbiAgICAgIGF3YWl0IGNwKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUsIGRlcmVmZXJlbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFkZHMge0BsaW5rIFJVTlRJTUVfTkVYVF9NT0RVTEVTfSwgYEBuZXh0L2VudmAsIGFuZCBldmVyeXRoaW5nIHRoZXkgcmVxdWlyZSB0b1xuICogYHN0YWdpbmdgLCBhbmQge0BsaW5rIElNQUdFX05FWFRfTU9EVUxFU30gYW5kIHRoZWlycyB0byBgaW1hZ2VTdGFnaW5nYC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgdGhlIGRlcGxveW1lbnQgaXMgY29tcGxldGUgZm9yIGV2ZXJ5IHJvdXRlIHRoZSBhcHAgaGFzIGFuZCBicm9rZW5cbiAqIGZvciBgL19uZXh0L2ltYWdlYDogdGhlIHRyYWNlZCBgYXNzZXRzYCBvZiBhIGJ1aWxkIG91dHB1dCBjb3ZlciB3aGF0IHRoZSAqYXBwKlxuICogcmVhY2hlcywgYW5kIGFuIGFwcCBuZXZlciByZWFjaGVzIG5leHQncyBpbWFnZSBvcHRpbWl6ZXIsIHNvXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNgIGFuZCBpdHMgY2xvc3VyZSBhcmUgc2ltcGx5IGFic2VudCBhbmRcbiAqIGV2ZXJ5IGltYWdlIHJlcXVlc3QgNTAwcyB3aXRoIGEgYE1PRFVMRV9OT1RfRk9VTkRgIGZyb20gYG5leHRNb2R1bGVgLlxuICpcbiAqIFJlc29sdXRpb24gaXMgYW5jaG9yZWQgaW5zaWRlIGBjdHgucHJvamVjdERpcmAgZm9yIHRoZSBzYW1lIHJlYXNvblxuICogYHVzZU5leHRGcm9tYCBhbmNob3JzIHRoZXJlIGF0IHJ1bnRpbWU6IGl0IGlzIHRoZSBkaXJlY3Rvcnkgd2hvc2VcbiAqIGBub2RlX21vZHVsZXNgIHdhbGsgZmluZHMgdGhlIGFwcCdzIGBuZXh0YC4gQSByZXBvIHdoZXJlIHRoYXQgcmVzb2x1dGlvbiBmYWlsc1xuICogaXMgbm90IGEgcmVhbCBgbmV4dCBidWlsZGAg4oCUIG5vdGhpbmcgZWxzZSB3b3VsZCBoYXZlIHJ1biDigJQgc28gaXQgd2FybnMgYW5kXG4gKiBjb250aW51ZXMgcmF0aGVyIHRoYW4gZmFpbGluZyBhIGJ1aWxkIGZvciBhIHBhY2thZ2UgaXQgY291bGQgbm90IGhhdmUgbmVlZGVkLlxuICogQSBtaXNzaW5nICp0cmFjZXIqIGlzIGRpZmZlcmVudDogYG5leHRgIGlzIHJpZ2h0IHRoZXJlIGFuZCBpbWFnZSBvcHRpbWl6YXRpb25cbiAqIHdvdWxkIHNpbGVudGx5IDUwMCBpbiBwcm9kdWN0aW9uLCBzbyB0aGF0IHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkUnVudGltZU5leHRDbG9zdXJlKFxuICBjdHg6IEJ1aWxkQ29tcGxldGVDb250ZXh0LFxuICBzdGFnaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBpbWFnZVN0YWdpbmc6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gVGhlIGFuY2hvciBmaWxlIG5lZWRuJ3QgZXhpc3Q7IGBjcmVhdGVSZXF1aXJlYCBvbmx5IHJlYWRzIGl0cyBkaXJlY3RvcnkuXG4gIGNvbnN0IG5leHRSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShcbiAgICBqb2luKGN0eC5wcm9qZWN0RGlyLCBcImNkay1uZXh0anMtbmV4dC1yZXNvbHZlci5janNcIiksXG4gICk7XG5cbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuICBsZXQgaW1hZ2VFbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gUlVOVElNRV9ORVhUX01PRFVMRVMubWFwKChzcGVjaWZpZXIpID0+XG4gICAgICBuZXh0UmVxdWlyZS5yZXNvbHZlKHNwZWNpZmllciksXG4gICAgKTtcbiAgICBpbWFnZUVudHJpZXMgPSBJTUFHRV9ORVhUX01PRFVMRVMubWFwKChzcGVjaWZpZXIpID0+XG4gICAgICBuZXh0UmVxdWlyZS5yZXNvbHZlKHNwZWNpZmllciksXG4gICAgKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBuZXh0J3MgaW1hZ2Ugb3B0aW1pemVyIGZyb20gYCArXG4gICAgICAgIGBcIiR7Y3R4LnByb2plY3REaXJ9XCIgKCR7KGNhdXNlIGFzIEVycm9yKS5tZXNzYWdlfSkuIFJlcXVlc3RzIHRvIGAgK1xuICAgICAgICBgL19uZXh0L2ltYWdlIHdpbGwgZmFpbCBhdCBydW50aW1lLmAsXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYGxvYWRFbnZGaWxlc2AgKHJ1bnRpbWUgYG5leHQtbW9kdWxlcy50c2ApIGxvYWRzIHRoZSBzdGFnZWQgZW52IGZpbGVzIHdpdGhcbiAgLy8gYEBuZXh0L2VudmAsIHdoaWNoIGlzIGBuZXh0YCdzIGRlcGVuZGVuY3ksIHNvIHJlc29sdmVkIGZyb20gYG5leHRgJ3MgZGlyLlxuICAvLyBBbiBhcHAgbmV2ZXIgcmVxdWlyZXMgaXQsIHNvIG5vIG91dHB1dCdzIHRyYWNlIGhhcyBpdCBlaXRoZXIuXG4gIGNvbnN0IG5leHRQYWNrYWdlID0gbmV4dFJlcXVpcmUucmVzb2x2ZShcIm5leHQvcGFja2FnZS5qc29uXCIpO1xuICB0cnkge1xuICAgIGVudHJpZXMucHVzaChjcmVhdGVSZXF1aXJlKG5leHRQYWNrYWdlKS5yZXNvbHZlKFwiQG5leHQvZW52XCIpKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBcIkBuZXh0L2VudlwiIGZyb20gdGhlIGFwcCdzIFxcYG5leHRcXGAsIGAgK1xuICAgICAgICBgd2hpY2ggdGhlIGNkay1uZXh0anMgcnVudGltZSB1c2VzIHRvIGxvYWQgLmVudiBmaWxlcy5gLFxuICAgICAgeyBjYXVzZSB9LFxuICAgICk7XG4gIH1cblxuICBsZXQgbm9kZUZpbGVUcmFjZTogTm9kZUZpbGVUcmFjZTtcbiAgdHJ5IHtcbiAgICAoeyBub2RlRmlsZVRyYWNlIH0gPSBuZXh0UmVxdWlyZShORVhUX0ZJTEVfVFJBQ0VSKSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gQ291bGQgbm90IGxvYWQgXCIke05FWFRfRklMRV9UUkFDRVJ9XCIsIHdoaWNoIGNkay1uZXh0anMgdXNlcyBgICtcbiAgICAgICAgYHRvIHN0YWdlIHRoZSBcXGBuZXh0XFxgIGZpbGVzIGl0cyBpbWFnZSBvcHRpbWl6ZXIgcmVxdWlyZXMuIFRoaXMgTmV4dC5qcyBgICtcbiAgICAgICAgYHZlcnNpb24gbWF5IGhhdmUgbW92ZWQgaXQ7IHBsZWFzZSBvcGVuIGFuIGlzc3VlLmAsXG4gICAgICB7IGNhdXNlIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFkZCA9IChmaWxlTGlzdDogU2V0PHN0cmluZz4sIHRhcmdldDogTWFwPHN0cmluZywgc3RyaW5nPikgPT4ge1xuICAgIGZvciAoY29uc3QgdHJhY2VkIG9mIGZpbGVMaXN0KSB7XG4gICAgICBjb25zdCBrZXkgPSB0b1Bvc2l4KHRyYWNlZCk7XG4gICAgICBpZiAodGFyZ2V0LmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc291cmNlID0gam9pbihjdHgucmVwb1Jvb3QsIHRyYWNlZCk7XG4gICAgICBhc3NlcnRTdGFnaW5nS2V5KGtleSwgc291cmNlKTtcbiAgICAgIHRhcmdldC5zZXQoa2V5LCBzb3VyY2UpO1xuICAgIH1cbiAgfTtcbiAgYWRkKFxuICAgIChhd2FpdCBub2RlRmlsZVRyYWNlKGltYWdlRW50cmllcywgeyBiYXNlOiBjdHgucmVwb1Jvb3QgfSkpLmZpbGVMaXN0LFxuICAgIGltYWdlU3RhZ2luZyxcbiAgKTtcbiAgY29uc3QgeyBmaWxlTGlzdCB9ID0gYXdhaXQgbm9kZUZpbGVUcmFjZShlbnRyaWVzLCB7IGJhc2U6IGN0eC5yZXBvUm9vdCB9KTtcbiAgLy8gVGhlIHRyYWNlIHN0YXJ0cyBmcm9tIGBAbmV4dC9lbnZgJ3MgcmVhbCBwYXRoLCBzbyB1bmRlciBwbnBtIGl0IG5ldmVyXG4gIC8vIHBhc3NlcyB0aHJvdWdoIHRoZSBgLnBucG0vbmV4dEDigKYvbm9kZV9tb2R1bGVzL0BuZXh0L2VudmAgbGluayB0aGF0IGBuZXh0YFxuICAvLyByZXNvbHZlcyBpdCBieS4gV2l0aG91dCB0aGUgbGluaywgZXZlcnkgcmVxdWVzdCBmYWlscyBhdCBjb2xkIHN0YXJ0IHdpdGhcbiAgLy8gXCJDYW5ub3QgZmluZCBtb2R1bGUgJ0BuZXh0L2VudidcIi5cbiAgY29uc3QgbmV4dEVudkxpbmsgPSBqb2luKGRpcm5hbWUobmV4dFBhY2thZ2UpLCBcIi4uXCIsIFwiQG5leHRcIiwgXCJlbnZcIik7XG4gIGlmIChsc3RhdFN5bmMobmV4dEVudkxpbmssIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgLy8gYHJlc29sdmVgIHJldHVybnMgcmVhbCBwYXRocywgc28gcmVsYXRpdmUgdG8gdGhlIHJlYWwgcmVwbyByb290LlxuICAgIGZpbGVMaXN0LmFkZChyZWxhdGl2ZShyZWFscGF0aFN5bmMoY3R4LnJlcG9Sb290KSwgbmV4dEVudkxpbmspKTtcbiAgfVxuICBhZGQoZmlsZUxpc3QsIHN0YWdpbmcpO1xufVxuXG4vKipcbiAqIEFkZCBgPGRpc3REaXI+L3JlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCB0byBhIHBsYW4gZXZlcnkgZ3JvdXAgaXMgbWVyZ2VkIHdpdGguXG4gKlxuICogSXQgcmVhY2hlcyBhIGdyb3VwIG90aGVyd2lzZSBvbmx5IGFzIGEgdHJhY2VkIGBhc3NldGAgb2Ygc29tZSBpbnZvY2FibGUgb3V0cHV0LFxuICogd2hpY2ggaXMgbm90IGEgZ3VhcmFudGVlOiBhIGdyb3VwIHdob3NlIHRlbXBsYXRlcyBhcmUgYWxsIGFzc2lnbmVkIGVsc2V3aGVyZVxuICogb3ducyBubyBvdXRwdXRzIGF0IGFsbC4gVGhhdCBpcyByZWFjaGFibGUg4oCUIGEgUGFnZXMtUm91dGVyLW9ubHkgYXBwIHdob3NlIGV2ZXJ5XG4gKiBwYWdlIGZhbGxzIHVuZGVyIHRoZSBjb25maWd1cmVkIGBmdW5jdGlvbkdyb3Vwc2AgbGVhdmVzIHRoZSAqZGVmYXVsdCogZ3JvdXBcbiAqIHRlbXBsYXRlLWVtcHR5LCBhbmQgdGhlIGRlZmF1bHQgZ3JvdXAgaXMgc3RpbGwgd2hhdCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAsIHRoZVxuICogc3RhdGljIGZpbGVzLCBhbmQgdGhlIGRpc3RyaWJ1dGlvbidzIGNhdGNoLWFsbC5cbiAqXG4gKiBJdHMgYWJzZW5jZSBpcyBub3QgYSBwYXJ0aWFsIGZhaWx1cmU6IGBsb2FkUnVudGltZWAgcHJvYmVzIGZvciBleGFjdGx5IHRoaXMgZmlsZVxuICogYmVmb3JlIGl0IHdpbGwgc2VydmUgYW55dGhpbmcsIHNvIHRoZSB3aG9sZSByb290IGFuc3dlcnMgXCJ0aGUgZGVwbG95bWVudCBwYWNrYWdlXG4gKiBpcyBpbmNvbXBsZXRlXCIuIENoZWFwIHRvIG1ha2UgdW5jb25kaXRpb25hbCwgc28gbWFrZSBpdCB1bmNvbmRpdGlvbmFsLlxuICpcbiAqIE5vdCB0cmFjZWQgbGlrZSB7QGxpbmsgUlVOVElNRV9ORVhUX01PRFVMRVN9LCBiZWNhdXNlIGl0IGlzIGRhdGEgcmF0aGVyIHRoYW4gYVxuICogbW9kdWxlOiBub3RoaW5nIGByZXF1aXJlYHMgaXQsIHNvIG5vIGZpbGUgdHJhY2VyIGNhbiBmaW5kIGl0LlxuICpcbiAqIEFic2VuY2UgaXMgbGVmdCB0byBgbG9hZFJ1bnRpbWVgLCB3aGljaCBuYW1lcyB0aGUgZmlsZSBhbmQgdGhlIGxheW91dCBjb250cmFjdFxuICogaXQgYmVsb25ncyB0by4gYG5leHQgYnVpbGRgIGFsd2F5cyB3cml0ZXMgaXQsIHNvIHRoZXJlIGlzIG5vIGJ1aWxkLXRpbWUgZXJyb3JcbiAqIHdvcnRoIGludmVudGluZyBoZXJlIGZvciBhIGZpbGUgdGhpcyBzdGVwIGRvZXMgbm90IG93bi5cbiAqL1xuZnVuY3Rpb24gYWRkUmVxdWlyZWRTZXJ2ZXJGaWxlcyhcbiAgY3R4OiBCdWlsZENvbXBsZXRlQ29udGV4dCxcbiAgc3RhZ2luZzogTWFwPHN0cmluZywgc3RyaW5nPixcbik6IHZvaWQge1xuICBjb25zdCBzb3VyY2UgPSBqb2luKGN0eC5kaXN0RGlyLCBcInJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uXCIpO1xuICBjb25zdCBrZXkgPSB0b1Bvc2l4KHJlbGF0aXZlKGN0eC5yZXBvUm9vdCwgc291cmNlKSk7XG4gIGlmIChzdGFnaW5nLmhhcyhrZXkpIHx8ICFleGlzdHNTeW5jKHNvdXJjZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXNzZXJ0U3RhZ2luZ0tleShrZXksIHNvdXJjZSk7XG4gIHN0YWdpbmcuc2V0KGtleSwgc291cmNlKTtcbn1cblxuLyoqXG4gKiBFdmVyeSBzdGFnZWQgcGF0aCBtdXN0IGxhbmQgaW5zaWRlIHRoZSBzdGFnaW5nIHRyZWUgYW5kIG11c3Qgbm90IHNoYWRvdyB0aGVcbiAqIHJlc2VydmVkIGRpcmVjdG9yeSBjZGstbmV4dGpzIGNvcGllcyBpdHMgb3duIHJ1bnRpbWUgaW50byBhdCBzeW50aC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0U3RhZ2luZ0tleShrZXk6IHN0cmluZywgc291cmNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGtleSA9PT0gXCJcIiB8fCBrZXkuc3RhcnRzV2l0aChcIi9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCIuLlwiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IEJ1aWxkIG91dHB1dCBhc3NldCBcIiR7c291cmNlfVwiIHJlc29sdmVzIHRvIHRoZSBzdGFnaW5nIGtleSBgICtcbiAgICAgICAgYFwiJHtrZXl9XCIsIHdoaWNoIGlzIG91dHNpZGUgdGhlIGRlcGxveW1lbnQgcm9vdC4gU2V0IGAgK1xuICAgICAgICBgXFxgb3V0cHV0RmlsZVRyYWNpbmdSb290XFxgIHNvIGFsbCB0cmFjZWQgZmlsZXMgbGl2ZSB1bmRlciBvbmUgcm9vdC5gLFxuICAgICk7XG4gIH1cbiAgaWYgKGtleSA9PT0gUlVOVElNRV9ESVJfTkFNRSB8fCBrZXkuc3RhcnRzV2l0aChgJHtSVU5USU1FX0RJUl9OQU1FfS9gKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IEJ1aWxkIG91dHB1dCBhc3NldCBcIiR7c291cmNlfVwiIHJlc29sdmVzIHRvIHRoZSBzdGFnaW5nIGtleSBgICtcbiAgICAgICAgYFwiJHtrZXl9XCIsIGJ1dCBcIiR7UlVOVElNRV9ESVJfTkFNRX0vXCIgaXMgcmVzZXJ2ZWQgZm9yIGNkay1uZXh0anMncyBvd24gYCArXG4gICAgICAgIGBydW50aW1lIGZpbGVzLmAsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1Bvc2l4KHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzZXAgPT09IFwiL1wiID8gcGF0aCA6IHBhdGguc3BsaXQoc2VwKS5qb2luKFwiL1wiKTtcbn1cblxuZnVuY3Rpb24gc29ydGVkVW5pcXVlKHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4ubmV3IFNldCh2YWx1ZXMpXS5zb3J0KCk7XG59XG4iXX0=