cdk-nextjs 0.7.10 → 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
@@ -28,6 +28,7 @@ const constructs_1 = require("constructs");
28
28
  // eslint-disable-next-line import/no-extraneous-dependencies
29
29
  const debug_1 = __importDefault(require("debug"));
30
30
  const function_groups_1 = require("../adapter/function-groups");
31
+ const cdk_nextjs_version_1 = require("../cdk-nextjs-version");
31
32
  const constants_1 = require("../constants");
32
33
  const manifest_1 = require("../runtime/manifest");
33
34
  const public_files_1 = require("../runtime/public-files");
@@ -65,7 +66,7 @@ function deploymentArchitecture(props) {
65
66
  * @link https://nextjs.org/docs/pages/api-reference/next-config-js/output
66
67
  */
67
68
  class NextjsBuild extends constructs_1.Construct {
68
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.10" };
69
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.11" };
69
70
  /**
70
71
  * Unique id for this deployment. Used to partition cache storage and as
71
72
  * metadata for static assets in S3 bucket.
@@ -364,10 +365,10 @@ class NextjsBuild extends constructs_1.Construct {
364
365
  `cdk-nextjs reads the build from \`.next\`.`);
365
366
  }
366
367
  const manifest = JSON.parse((0, node_fs_1.readFileSync)(manifestPath, "utf-8"));
367
- if (manifest.version !== manifest_1.ADAPTER_MANIFEST_VERSION) {
368
- throw new Error(`The cdk-nextjs adapter manifest at ${manifestPath} is version ` +
369
- `${manifest.version}, but this version of cdk-nextjs reads version ` +
370
- `${manifest_1.ADAPTER_MANIFEST_VERSION}. The adapter that wrote it and the ` +
368
+ if (manifest.cdkNextjsVersion !== cdk_nextjs_version_1.CDK_NEXTJS_VERSION) {
369
+ throw new Error(`The cdk-nextjs adapter manifest at ${manifestPath} was written by ` +
370
+ `cdk-nextjs ${manifest.cdkNextjsVersion ?? "(unknown)"}, but this is ` +
371
+ `cdk-nextjs ${cdk_nextjs_version_1.CDK_NEXTJS_VERSION}. The adapter that wrote it and the ` +
371
372
  `constructs reading it come from the same package, so this means two ` +
372
373
  `cdk-nextjs versions are installed, or the build output is stale.`);
373
374
  }
@@ -969,4 +970,4 @@ function patchClientChunk(chunk, patch, chunkPath) {
969
970
  }
970
971
  return `${open}\n${patch}\n${PATCH_FETCH_END_MARKER}\n${original}`;
971
972
  }
972
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBOEpBLHdEQUtDO0FBdzJCRCx3REFtQkM7QUFNRCw0Q0FVQztBQXFCRCxvREFVQztBQWNELHdDQUVDO0FBVUQsNEJBWUM7QUFZRCxvREFzQkM7QUFVRCw4REFzQkM7QUF1QkQsa0RBS0M7QUFRRCxnQ0FRQztBQWFELDRDQXdCQzs7QUF0d0NELDJEQUE0RDtBQUM1RCw2Q0FBc0Q7QUFDdEQscUNBaUJpQjtBQUNqQiw2Q0FBNEM7QUFDNUMscUNBQWlDO0FBQ2pDLHlDQUF5RDtBQUN6RCwyQ0FBb0Q7QUFDcEQsNkNBQTBDO0FBRTFDLDJDQUF1QztBQUN2Qyw2REFBNkQ7QUFDN0Qsa0RBQTZCO0FBQzdCLGdFQUtvQztBQUNwQyw0Q0FBc0Q7QUFFdEQsa0RBUTZCO0FBQzdCLDBEQUEwRDtBQUMxRCxrREFJNEI7QUFDNUIsc0VBQWlFO0FBQ2pFLGdFQUdtQztBQUVuQzs7Ozs7R0FLRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdEQ7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsMkJBQTJCLENBQUM7QUFDdkQsMkVBQTJFO0FBQzNFLE1BQU0sc0JBQXNCLEdBQUcsa0NBQWtDLENBQUM7QUFFbEUsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMseUJBQXlCLENBQUMsQ0FBQztBQThFbEQ7Ozs7R0FJRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLEtBQXVCO0lBQzVELE1BQU0sV0FBVyxHQUNmLEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxnQkFBZ0I7UUFDaEQsS0FBSyxDQUFDLFVBQVUsS0FBSyxzQkFBVSxDQUFDLGtCQUFrQixDQUFDO0lBQ3JELE9BQU8sQ0FBQyxXQUFXLElBQUksS0FB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aUUsQ0FDcEUsQ0FBQztRQUNKLENBQUM7UUFDRCxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLEtBQUssS0FBSyxzQkFBc0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jLCBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2gsIHJhbmRvbUJ5dGVzIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQge1xuICBjbG9zZVN5bmMsXG4gIERpcmVudCxcbiAgZXhpc3RzU3luYyxcbiAgbHN0YXRTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxuICBybVN5bmMsXG4gIG1rZGlyU3luYyxcbiAgY3BTeW5jLFxuICBvcGVuU3luYyxcbiAgcmVhZFN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgc3RhdFN5bmMsXG4gIHVubGlua1N5bmMsXG59IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpvaW4gYXMgam9pblBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aC9wb3NpeFwiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVIsXG4gIEZ1bmN0aW9uR3JvdXBTcGVjLFxuICB2YWxpZGF0ZUZ1bmN0aW9uR3JvdXBzLFxufSBmcm9tIFwiLi4vYWRhcHRlci9mdW5jdGlvbi1ncm91cHNcIjtcbmltcG9ydCB7IExPR19QUkVGSVgsIE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBOZXh0anNCYXNlUHJvcHMgfSBmcm9tIFwiLi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHtcbiAgQURBUFRFUl9ESVJfTkFNRSxcbiAgQURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OLFxuICBBZGFwdGVyTWFuaWZlc3QsXG4gIE1BTklGRVNUX0ZJTEVfTkFNRSxcbiAgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRSxcbiAgUlVOVElNRV9ESVJfTkFNRSxcbiAgZ3JvdXBTdGFnaW5nRGlyTmFtZSxcbn0gZnJvbSBcIi4uL3J1bnRpbWUvbWFuaWZlc3RcIjtcbmltcG9ydCB7IHJlYWRQdWJsaWNGaWxlcyB9IGZyb20gXCIuLi9ydW50aW1lL3B1YmxpYy1maWxlc1wiO1xuaW1wb3J0IHtcbiAgYXNzZXRQcmVmaXhQYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcmVsYXRpdmVBc3NldFByZWZpeCxcbn0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuaW1wb3J0IHsgZGVwbG95bWVudEJ1aWxkSWQgfSBmcm9tIFwiLi4vdXRpbHMvZGVwbG95bWVudC1idWlsZC1pZFwiO1xuaW1wb3J0IHtcbiAgZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlLFxuICB0b05vZGVBcmNoaXRlY3R1cmUsXG59IGZyb20gXCIuLi91dGlscy9nZXQtYXJjaGl0ZWN0dXJlXCI7XG5cbi8qKlxuICogTGFtYmRhJ3MgaGFyZCBsaW1pdCBvbiB0aGUgdW56aXBwZWQgc2l6ZSBvZiBhIGZ1bmN0aW9uJ3MgY29kZSwgd2hpY2hcbiAqIENsb3VkRm9ybWF0aW9uIG9ubHkgZW5mb3JjZXMgYXQgZGVwbG95IHRpbWUuIE1lYXN1cmVkIGF0IHN5bnRoIGluc3RlYWQsIHNvIHRoZVxuICogZXJyb3IgbmFtZXMgdGhlIGdyb3VwIGFuZCBhcnJpdmVzIGluIHNlY29uZHMgcmF0aGVyIHRoYW4gbWludXRlcy5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZ2V0dGluZ3N0YXJ0ZWQtbGltaXRzLmh0bWxcbiAqL1xuY29uc3QgTEFNQkRBX1VOWklQUEVEX0xJTUlUX0JZVEVTID0gMjUwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogT3BlbnMgdGhlIHBhdGNoIGBwYXRjaEZldGNoSW5DbGllbnRKc2AgcHJlcGVuZHMgdG8gYSBjbGllbnQgY2h1bmssIGZvbGxvd2VkIGJ5XG4gKiBhIGhhc2ggb2YgdGhlIHBhdGNoIGl0c2VsZiwgc28gYSBzZWNvbmQgc3ludGggb3ZlciB0aGUgc2FtZSBgLm5leHRgIGlzIGEgbm8tb3BcbiAqIHdoaWxlIG9uZSBieSBhIGNkay1uZXh0anMgd2l0aCBhIGRpZmZlcmVudCBgcGF0Y2gtZmV0Y2guanNgIHJlcGxhY2VzIGl0LlxuICovXG5jb25zdCBQQVRDSF9GRVRDSF9NQVJLRVIgPSBcIi8qIGNkay1uZXh0anM6cGF0Y2gtZmV0Y2hcIjtcbi8qKiBDbG9zZXMgdGhlIHByZXBlbmRlZCBwYXRjaDsgdGhlIGNodW5rJ3Mgb3duIGNvbnRlbnQgc3RhcnRzIGFmdGVyIGl0LiAqL1xuY29uc3QgUEFUQ0hfRkVUQ0hfRU5EX01BUktFUiA9IFwiLyogY2RrLW5leHRqczpwYXRjaC1mZXRjaDplbmQgKi9cIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6bmV4dGpzLWJ1aWxkXCIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kOiBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl07XG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIE5leHQuanMgYXBwbGljYXRpb24gaXMgbG9jYXRlZCBmb3IgbG9jYWwgYnVpbGRzLlxuICAgKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBwYWNrYWdlLmpzb24gYW5kIE5leHQuanMgYXBwbGljYXRpb24gZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBidWlsZERpcmVjdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnNraXBCdWlsZH1cbiAgICovXG4gIHJlYWRvbmx5IHNraXBCdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSb3V0ZSBncm91cHMgdG8gcGFja2FnZSBpbnRvIHNlcGFyYXRlIExhbWJkYSBmdW5jdGlvbnMuIE9ubHkgdGhlIHR3b1xuICAgKiBGdW5jdGlvbnMgYE5leHRqc1R5cGVgcyBwYXNzIHRoaXM7IHNlZSBgTmV4dGpzRnVuY3Rpb25Hcm91cGAuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Z1bmN0aW9uR3JvdXBSb3V0ZXNbXTtcbiAgLyoqXG4gICAqIExhbWJkYSBhcmNoaXRlY3R1cmUgdGhlIEZ1bmN0aW9ucyB0eXBlcyBkZXBsb3ksIHdoaWNoIGRlY2lkZXMgdGhlIGBzaGFycGBcbiAgICogYmluYXJpZXMgc3RhZ2VkIGludG8gdGhlIGRlcGxveW1lbnQgcm9vdHMuIElnbm9yZWQgYnkgdGhlIENvbnRhaW5lcnNcbiAgICogdHlwZXMsIHdob3NlIGltYWdlIGlzIGJ1aWx0IGZvciB0aGUgc3ludGggbWFjaGluZS5cbiAgICogQGRlZmF1bHQgLSB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgc3ludGhcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBhIGZ1bmN0aW9uIGdyb3VwIGBOZXh0anNCdWlsZGAgbmVlZHM6IHdoaWNoIHJvdXRlcyBpdCBvd25zLiBUaGVcbiAqIHBlci1ncm91cCBMYW1iZGEgYG92ZXJyaWRlc2AgYXJlIGBOZXh0anNGdW5jdGlvbnNgJyBidXNpbmVzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogT25lIHN0YWdlZCBkZXBsb3ltZW50IHJvb3QsIGFuZCB0aGUgZnVuY3Rpb24gZ3JvdXAgaXQgYmVsb25ncyB0by4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGVwbG95bWVudFJvb3Qge1xuICAvKipcbiAgICogR3JvdXAgbmFtZSwgYGRlZmF1bHRgIGZvciB0aGUgaW1wbGljaXQgZ3JvdXAgdGhhdCBvd25zIGV2ZXJ5IHVuYXNzaWduZWRcbiAgICogcm91dGUuIFRoZSBvbmx5IGVudHJ5IGlzIGBkZWZhdWx0YCB3aGVuIGBmdW5jdGlvbkdyb3Vwc2AgaXMgbm90IHVzZWQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IHJvb3Q6IHRoZSBMYW1iZGEgemlwIGFzc2V0J3Mgc291cmNlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSb3V0ZSB0ZW1wbGF0ZXMgdGhpcyByb290J3MgcGFja2FnZSBob2xkcywgYXMgdGhlIGFkYXB0ZXIgYXNzaWduZWQgdGhlbS5cbiAgICogRW1wdHkgaXMgbGVnYWw6IHRoZSBkZWZhdWx0IGdyb3VwIHN0aWxsIHNlcnZlcyBgL19uZXh0L2ltYWdlYCwgdGhlIHN0YXRpY1xuICAgKiBmaWxlcyB0aGUgcnVudGltZSByZWFkcyBvZmYgZGlzaywgYW5kIGFueXRoaW5nIHRoZSBjYXRjaC1hbGwgcm91dGVzIHRvIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPbmUgYmVoYXZpb3IgdGhhdCByb3V0ZXMgYSBmdW5jdGlvbiBncm91cCdzIFVSTHMgdG8gaXQsIGFzIHRoZSBhZGFwdGVyXG4gKiBjaGVja2VkIHRoZW0gYWdhaW5zdCB3aGF0IGVhY2ggZ3JvdXAgd2FzIHBhY2thZ2VkIHdpdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yIHtcbiAgLyoqIFRoZSBmdW5jdGlvbiBncm91cCB0aGUgYmVoYXZpb3Igcm91dGVzIHRvLiAqL1xuICByZWFkb25seSBncm91cDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGdyb3VwIHBhdHRlcm4gaXQgY2FtZSBmcm9tIChgL2Jsb2cvKipgKSwgb3IgdGhlIHBhcmVudCBvZiBhbiBvcHRpb25hbFxuICAgKiBjYXRjaC1hbGwgYSBzdWJ0cmVlIHBhdHRlcm4gbW92ZWQgaW50byB0aGUgZ3JvdXAgKGAvYmxvZ2AgZm9yXG4gICAqIGAvYmxvZy9bWy4uLnNsdWddXWApLCB3aGljaCB0aGF0IHN1YnRyZWUncyBiZWhhdmlvciBkb2VzIG5vdCBtYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIGJlZm9yZSBiYXNlUGF0aCBhbmQgd2l0aG91dCBhIGxlYWRpbmcgc2xhc2g6XG4gICAqIGBibG9nLypgLCBgcHJpY2luZ2AsIGBwcmljaW5nL2AgZm9yIGEgYHRyYWlsaW5nU2xhc2hgIGFwcCwgYW5kXG4gICAqIGBfbmV4dC9kYXRhLzxidWlsZElkPi9ibG9nLypgIGZvciBhIGdyb3VwIG93bmluZyBhIFBhZ2VzIFJvdXRlciBwYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgZXZlcnkgZGVwbG95bWVudCByb290IGlzIHN0YWdlZCBmb3I6IHRoZSBidWlsZCdzIGBhcmNoaXRlY3R1cmVgLCBlbHNlXG4gKiB0aGUgc3ludGggbWFjaGluZSdzLiBDb250YWluZXJzIGlnbm9yZSBpdDogRG9ja2VyIGJ1aWxkcyB0aGVpciBpbWFnZVxuICogbmF0aXZlbHksIHNvIGl0IGNhbiBvbmx5IG1hdGNoIHRoZSBzeW50aCBtYWNoaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95bWVudEFyY2hpdGVjdHVyZShwcm9wczogTmV4dGpzQnVpbGRQcm9wcyk6IEFyY2hpdGVjdHVyZSB7XG4gIGNvbnN0IGlzRnVuY3Rpb25zID1cbiAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgfHxcbiAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUztcbiAgcmV0dXJuIChpc0Z1bmN0aW9ucyAmJiBwcm9wcy5hcmNoaXRlY3R1cmUpIHx8IGdldExhbWJkYUFyY2hpdGVjdHVyZSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1YmxpY0RpckVudHJ5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBpc0RpcmVjdG9yeTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgTmV4dC5qcyBhc3NldHMuXG4gKiBAbGluayBodHRwczovL25leHRqcy5vcmcvZG9jcy9wYWdlcy9hcGktcmVmZXJlbmNlL25leHQtY29uZmlnLWpzL291dHB1dFxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQnVpbGQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVW5pcXVlIGlkIGZvciB0aGlzIGRlcGxveW1lbnQuIFVzZWQgdG8gcGFydGl0aW9uIGNhY2hlIHN0b3JhZ2UgYW5kIGFzXG4gICAqIG1ldGFkYXRhIGZvciBzdGF0aWMgYXNzZXRzIGluIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogTmV4dC5qcydzIGJ1aWxkIElELCBzdWZmaXhlZCB3aXRoIHRoZSBhcHAncyBgZGVwbG95bWVudElkYCB3aGVuIGl0IHNldHNcbiAgICogb25lLiBUaGUgYnVpbGQgSUQgYWxvbmUgaXMgbm90IHVuaXF1ZSBwZXIgZGVwbG95bWVudDogc2V0dGluZ1xuICAgKiBgZGVwbG95bWVudElkYCAob3IgYnVpbGRpbmcgd2l0aCBgTkVYVF9ERVBMT1lNRU5UX0lEYCkgdHVybnMgb24gc2tld1xuICAgKiBwcm90ZWN0aW9uLCBhbmQgbmV4dC5qcyB0aGVuICpwaW5zKiB0aGUgYnVpbGQgSUQgdG8gdGhlIGNvbnN0YW50XG4gICAqIGBidWlsZC1UZmN0c1dYcGZmMmZLU2Ag4oCUIHNlZSBgZ2V0QnVpbGRJZGAgaW4gYG5leHQvZGlzdC9idWlsZC9pbmRleC5qc2AsXG4gICAqIHdoaWNoIGRvZXMgdGhhdCBkZWxpYmVyYXRlbHkgc28gdGhhdCB0b29saW5nIGRvaW5nXG4gICAqIGAucmVwbGFjZShlc2NhcGVkQnVpbGRJZCwg4oCmKWAgc3RpbGwgaGFzIHNvbWV0aGluZyB0byByZXBsYWNlLiBUd29cbiAgICogc3VjY2Vzc2l2ZSBkZXBsb3ltZW50cyBvZiBzdWNoIGFuIGFwcCB3b3VsZCBzaGFyZSBvbmUgY2FjaGUgcHJlZml4IGFuZCBvbmVcbiAgICogcmV2YWxpZGF0aW9uLXRhYmxlIHBhcnRpdGlvbiwgYW5kIHRoZSBuZXcgb25lIHdvdWxkIHJlYWQgdGhlIHByZXZpb3VzXG4gICAqIG9uZSdzIHByZXJlbmRlcnMuIEFwcGVuZGluZyB0aGUgZGVwbG95bWVudCBJRCByZXN0b3JlcyB0aGUgXCJvbmVcbiAgICogZGVwbG95bWVudCwgb25lIHBhcnRpdGlvblwiIGludmFyaWFudCB0aGF0IElEIGV4aXN0cyB0byBjYXJyeS5cbiAgICpcbiAgICogTm90aGluZyByb3V0ZXMgb24gdGhpcyB2YWx1ZSDigJQgdGhlIGAvX25leHQvZGF0YS88YnVpbGRJZD4v4oCmYCBVUkwgc3BhY2UgaXNcbiAgICogcm91dGVkIG9uIE5leHQuanMncyBvd24gYnVpbGQgSUQsIHdoaWNoIGlzIHdoYXQgdGhlIGFwcCdzIGNsaWVudCBidW5kbGVzXG4gICAqIGNhcnJ5IOKAlCBzbyBpdCBpcyBmcmVlIHRvIGJlIGxvbmdlciB0aGFuIG5leHQuanMncyBvd24uXG4gICAqL1xuICBidWlsZElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBpbml0IGNhY2hlIGRpcmVjdG9yeVxuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwLy5uZXh0L2Nkay1uZXh0anMtaW5pdC1jYWNoZVwiXG4gICAqL1xuICBpbml0Q2FjaGVEaXI6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gcHVibGljLiBVc2UgYnkgQ2xvdWRGcm9udC9BTEIgdG8gY3JlYXRlIGJlaGF2aW9ycy9ydWxlc1xuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwL3B1YmxpY1wiXG4gICAqL1xuICBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogVGhlIEphdmFTY3JpcHQgZmlsZSBOb2RlLmpzIHJ1bnMgdG8gc2VydmUgcmVxdWVzdHMsIHJlbGF0aXZlIHRvIHRoZVxuICAgKiBkZXBsb3ltZW50IHJvb3QuIGNkay1uZXh0anMncyBvd24gY29udGFpbmVyIHNoZWxsLCBub3QgYG5leHQgYnVpbGRgIG91dHB1dCxcbiAgICogc28gaXQgaXMgdGhlIHNhbWUgcGF0aCBmb3IgZXZlcnkgYXBwLlxuICAgKiBAZXhhbXBsZSBcImNkay1uZXh0anMtcnVudGltZS9zZXJ2ZXIubWpzXCJcbiAgICovXG4gIHJlbGF0aXZlUGF0aFRvRW50cnlwb2ludDogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgLm5leHQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTmV4dC5qcyBidWlsZCBhcnRpZmFjdHNcbiAgICovXG4gIGRvdE5leHRQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgTmV4dC5qcyBhcHAncyBvd24gYGJhc2VQYXRoYCDigJQgdGhlIFVSTCBwcmVmaXggaXQgZ2VuZXJhdGVzIGl0cyBsaW5rcyBhbmRcbiAgICogYXNzZXQgaHJlZnMgdW5kZXIg4oCUIGFzIHRoZSBhZGFwdGVyIG1hbmlmZXN0IHJlY29yZGVkIGl0LiBOb3JtYWxpemVkIHRvIGEgYmFyZSBwYXRoIHNlZ21lbnQsIGVtcHR5IHdoZW4gdGhlIGFwcCBzZXRzIG5vbmUuIEV4cG9zZWQgc29cbiAgICogcm9vdCBjb25zdHJ1Y3RzIGNhbiByZWNvbmNpbGUgaXQgd2l0aCB0aGUgQ0RLIGBiYXNlUGF0aGAgcHJvcCwgd2hpY2ggaXMgYVxuICAgKiBkaXN0aW5jdCB0aGluZzsgc2VlIGByZXNvbHZlQmFzZVBhdGhgLlxuICAgKi9cbiAgbmV4dENvbmZpZ0Jhc2VQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgTmV4dC5qcyBhcHAncyBvd24gYGFzc2V0UHJlZml4YCwgYXMgYSBwYXRoIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBub1xuICAgKiB0cmFpbGluZyBvbmUsIGVtcHR5IHdoZW4gdGhlIGFwcCBzZXRzIG5vbmUgb3Igc2V0cyBhbiBhYnNvbHV0ZSBVUkwgKHdoaWNoXG4gICAqIG5hbWVzIGFuIG9yaWdpbiBjZGstbmV4dGpzIGRvZXMgbm90IHNlcnZlKS5cbiAgICpcbiAgICogRXhwb3NlZCBiZWNhdXNlIGl0IGlzIHRoZSBzaGFwZSBvZiBgYXNzZXRQcmVmaXhgIHRoZSByZWdpb25hbFxuICAgKiBgTmV4dGpzVHlwZWBzIGNhbm5vdCBzZXJ2ZSDigJQgc2VlIGB3YXJuVW5zZXJ2ZWRBc3NldFByZWZpeGAuIFdoYXQgdGhlXG4gICAqIGRpc3RyaWJ1dGlvbiBoYXMgdG8gYW5zd2VyIG9uIGlzIHtAbGluayBuZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRofSwgd2hpY2hcbiAgICogYWxzbyBjb3ZlcnMgdGhlIHBhdGggYW4gYWJzb2x1dGUgcHJlZml4IGNhcnJpZXMuXG4gICAqL1xuICBuZXh0Q29uZmlnQXNzZXRQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHBvcnRpb24gb2YgdGhlIGFwcCdzIGBhc3NldFByZWZpeGAsIHdoaWNoZXZlciBmb3JtIGl0IHRha2VzOiBcIi9jZG5cIlxuICAgKiBmb3IgYm90aCBgYXNzZXRQcmVmaXg6IFwiL2NkblwiYCBhbmQgYGFzc2V0UHJlZml4OlxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiYCwgZW1wdHkgd2hlbiB0aGVyZSBpcyBubyBwYXRoIHRvIGFuc3dlciBvbi5cbiAgICpcbiAgICogRXhwb3NlZCBiZWNhdXNlIGl0IGlzIGEgVVJMIHByZWZpeCB0aGUgZGlzdHJpYnV0aW9uIGhhcyB0byBhbnN3ZXIgb246IE5leHQuanNcbiAgICogZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmAgZm9yIGV2ZXJ5IGJ1bmRsZSBhbmQgY29tcGlsZXMgYSByZXdyaXRlXG4gICAqIHRoYXQgc2VydmVzIHRob3NlIFVSTHMnIHBhdGhzIGl0c2VsZiwgd2hpbGUgdGhlIG9iamVjdHMgbGl2ZSBpbiBTMyB1bmRlclxuICAgKiBgPGJhc2VQYXRoPi9fbmV4dC9zdGF0aWMvLi4uYC5cbiAgICovXG4gIG5leHRDb25maWdBc3NldFByZWZpeFBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEV2ZXJ5IHN0YWdlZCBkZXBsb3ltZW50IHJvb3QsIG9uZSBwZXIgZnVuY3Rpb24gZ3JvdXAsIGBkZWZhdWx0YCBmaXJzdDogdGhlXG4gICAqIHN0YWdlZCB1bmlvbiBvZiBlYWNoIGdyb3VwJ3Mgc2hpcHBlZCBvdXRwdXRzIGFuZCB0aGVpciB0cmFjZWQgYXNzZXRzLFxuICAgKiB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyJ3MgYG9uQnVpbGRDb21wbGV0ZWAuIEV4YWN0bHkgb25lIGVudHJ5IChuYW1lZFxuICAgKiBgZGVmYXVsdGAsIGF0IGAubmV4dC9jZGstbmV4dGpzLWFkYXB0ZXIvYXBwYCkgdW5sZXNzIGBmdW5jdGlvbkdyb3Vwc2BcbiAgICogc3BsaXRzIHRoZSBhcHAuIFRoZSBMYW1iZGEgemlwIGFzc2V0czsgQ29udGFpbmVycyBgQ09QWWAgdGhlIGBkZWZhdWx0YCBvbmUuXG4gICAqL1xuICBkZXBsb3ltZW50Um9vdHM6IE5leHRqc0RlcGxveW1lbnRSb290W107XG4gIC8qKlxuICAgKiBXaGF0IHJvdXRlcyBlYWNoIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwJ3MgVVJMcyB0byBpdCwgbW9zdCBzcGVjaWZpY1xuICAgKiBmaXJzdCDigJQgdGhlIG9yZGVyIENsb3VkRnJvbnQgaGFzIHRvIHNlZSB0aGVtIGluLCBzaW5jZSBpdCBzdG9wcyBhdCB0aGVcbiAgICogZmlyc3QgbWF0Y2guIEVtcHR5IHVubGVzcyBgZnVuY3Rpb25Hcm91cHNgIHNwbGl0cyB0aGUgYXBwLlxuICAgKi9cbiAgZnVuY3Rpb25Hcm91cEJlaGF2aW9yczogTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yW107XG4gIC8qKlxuICAgKiBGcm9tIHRoZSBkZXBsb3ltZW50IHJvb3QgdG8gdGhlIE5leHQuanMgcHJvamVjdCBkaXIsIFBPU0lYLCBgXCJcImAgd2hlblxuICAgKiB0aGUgYXBwIGlzIGF0IHRoZSByZXBvIHJvb3QuIFRoZSBydW50aW1lIGBjaGRpcmBzIGhlcmU7IENvbnRhaW5lcnMgcGFzcyBpdCB0b1xuICAgKiB0aGVpciBEb2NrZXJmaWxlIHNvIGAubmV4dC9zdGF0aWNgIGFuZCBgcHVibGljYCBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLlxuICAgKiBAc2VlIEFkYXB0ZXJNYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXJcbiAgICovXG4gIHJlbGF0aXZlUHJvamVjdERpcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFyY2hpdGVjdHVyZSBldmVyeSBkZXBsb3ltZW50IHJvb3QncyBuYXRpdmUgZGVwZW5kZW5jaWVzIChgc2hhcnBgKVxuICAgKiB3ZXJlIHN0YWdlZCBmb3IuIFRoZSBMYW1iZGFzIGRlcGxveWluZyB0aGVtIG11c3QgdXNlIHRoZSBzYW1lIG9uZS5cbiAgICovXG4gIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0J1aWxkUHJvcHM7XG4gIHByaXZhdGUgYnVpbGRDb21tYW5kOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0J1aWxkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmRvdE5leHRQYXRoID0gam9pbihwcm9wcy5idWlsZERpcmVjdG9yeSwgXCIubmV4dFwiKTtcblxuICAgIHRoaXMuYnVpbGRDb21tYW5kID0gcHJvcHMuYnVpbGRDb21tYW5kIHx8IFwibnBtIHJ1biBidWlsZFwiO1xuXG4gICAgLy8gU2V0IGluaXQgY2FjaGUgZGlyZWN0b3J5IHBhdGhcbiAgICB0aGlzLmluaXRDYWNoZURpciA9IGpvaW4oXG4gICAgICBwcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgIFwiLm5leHRcIixcbiAgICAgIFwiY2RrLW5leHRqcy1pbml0LWNhY2hlXCIsXG4gICAgKTtcblxuICAgIC8vIEJlZm9yZSB0aGUgYnVpbGQsIG5vdCBhZnRlciBpdDogdGhlIGJ1aWxkIGlzIG1pbnV0ZXMgbG9uZywgYW5kIHRoZSBlbnYgdmFyXG4gICAgLy8gaXQgcGFzc2VzIGdyb3VwcyB0aHJvdWdoIGlzIG9ubHkgc2V0IGZvciBhIG5vbi1lbXB0eSBhcnJheSDigJQgc28gYW4gaW52YWxpZFxuICAgIC8vIGBmdW5jdGlvbkdyb3Vwc2AgKGFuIGVtcHR5IGFycmF5LCBhIHJlc2VydmVkIG5hbWUsIGEgZ3JvdXAgb3duaW5nIG5vXG4gICAgLy8gcm91dGVzKSB3b3VsZCBvdGhlcndpc2UgYmUgcmVwb3J0ZWQgYXMgXCJ0aGUgYnVpbGQgc3RhZ2VkIHRoZSB3cm9uZ1xuICAgIC8vIGdyb3Vwc1wiLCBhZnRlciBwYXlpbmcgZm9yIHRoZSBidWlsZCwgaW5zdGVhZCBvZiBhcyB0aGUgcHJvcCBlcnJvciBpdCBpcy5cbiAgICBpZiAocHJvcHMuZnVuY3Rpb25Hcm91cHMpIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Hcm91cHMocHJvcHMuZnVuY3Rpb25Hcm91cHMgYXMgRnVuY3Rpb25Hcm91cFNwZWNbXSk7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBsb2NhbCBidWlsZCBwcm9jZXNzXG4gICAgaWYgKHByb3BzLnNraXBCdWlsZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5ydW5OZXh0QnVpbGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gU2tpcHBpbmc6ICR7dGhpcy5idWlsZENvbW1hbmR9YCk7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIGJlZm9yZSBhbnl0aGluZyBlbHNlIHJlYWRzIGAubmV4dGA6IGEgbWlzc2luZyBtYW5pZmVzdCBpcyB0aGUgb25lXG4gICAgLy8gZXJyb3IgdGhhdCBuYW1lcyB0aGUgY2F1c2UgKG5vIGJ1aWxkLCBvciBvbmUgd2l0aG91dCB0aGUgYWRhcHRlciksIHdoZXJlXG4gICAgLy8gZXZlcnkgbGF0ZXIgcmVhZCBmYWlscyB3aXRoIGEgYmFyZSBFTk9FTlQuXG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlYWRBZGFwdGVyTWFuaWZlc3QoKTtcblxuICAgIC8vIERlbGliZXJhdGVseSBvdXRzaWRlIHRoZSBgc2tpcEJ1aWxkYCBnYXRlLiBUaGUgcGF0Y2ggaXMgYSBwcm9wZXJ0eSBvZlxuICAgIC8vICpzZXJ2aW5nKiB0aHJvdWdoIENsb3VkRnJvbnQsIG5vdCBvZiB3aG8gcmFuIGBuZXh0IGJ1aWxkYDogd2l0aG91dCBpdFxuICAgIC8vIGV2ZXJ5IFBPU1Qgd2l0aCBhIGJvZHkgaXMgcmVqZWN0ZWQgYnkgdGhlIExhbWJkYSBGdW5jdGlvbiBVUkwgYmVmb3JlIGl0XG4gICAgLy8gcmVhY2hlcyB0aGUgYXBwIChzZWUgYHBhdGNoRmV0Y2hJbkNsaWVudEpzYCkuIFJ1bm5pbmcgaXQgb25seSBpbnNpZGVcbiAgICAvLyBgcnVuTmV4dEJ1aWxkYCBtZWFudCBgc2tpcEJ1aWxkOiB0cnVlYCBzaWxlbnRseSBzaGlwcGVkIGFuIGFwcCB3aG9zZVxuICAgIC8vIHNlcnZlciBhY3Rpb25zIGFuZCBQT1NUIHJvdXRlIGhhbmRsZXJzIGFsbCByZXR1cm5lZCA0MDMuXG4gICAgaWYgKHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUykge1xuICAgICAgdGhpcy5wYXRjaEZldGNoSW5DbGllbnRKcygpO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbGRJZCA9IGRlcGxveW1lbnRCdWlsZElkKG1hbmlmZXN0KTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldExvY2FsUHVibGljRGlyRW50cmllcygpO1xuICAgIC8vIE5leHQuanMncyByZXNvbHZlZCBjb25maWcsIHRoZSBzYW1lIG9uZSBpdCB3cml0ZXMgaW50b1xuICAgIC8vIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAuXG4gICAgdGhpcy5uZXh0Q29uZmlnQmFzZVBhdGggPSBub3JtYWxpemVCYXNlUGF0aChtYW5pZmVzdC5jb25maWcuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dENvbmZpZ0Fzc2V0UHJlZml4ID0gcmVsYXRpdmVBc3NldFByZWZpeChcbiAgICAgIG1hbmlmZXN0LmNvbmZpZy5hc3NldFByZWZpeCxcbiAgICApO1xuICAgIHRoaXMubmV4dENvbmZpZ0Fzc2V0UHJlZml4UGF0aCA9IGFzc2V0UHJlZml4UGF0aChcbiAgICAgIG1hbmlmZXN0LmNvbmZpZy5hc3NldFByZWZpeCxcbiAgICApO1xuXG4gICAgY29uc3QgaXNGdW5jdGlvbnMgPVxuICAgICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TIHx8XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUztcblxuICAgIHRoaXMucmVsYXRpdmVQcm9qZWN0RGlyID0gbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyO1xuICAgIHRoaXMucmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50ID0gam9pblBvc2l4KFJVTlRJTUVfRElSX05BTUUsIFwic2VydmVyLm1qc1wiKTtcbiAgICB0aGlzLmFyY2hpdGVjdHVyZSA9IGRlcGxveW1lbnRBcmNoaXRlY3R1cmUocHJvcHMpO1xuICAgIHRoaXMuZGVwbG95bWVudFJvb3RzID0gdGhpcy5yZXNvbHZlRGVwbG95bWVudFJvb3RzKG1hbmlmZXN0KTtcbiAgICB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMgPSBtYW5pZmVzdC5iZWhhdmlvcnMgPz8gW107XG5cbiAgICAvLyBPbmx5IHRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgY2FycmllcyBgcHVibGljL2A6IG5vdGhpbmcgaXMgaW4gZnJvbnRcbiAgICAvLyBvZiBpdCB0byBhbnN3ZXIgdGhvc2UgcGF0aHMgZnJvbSBTMy4gRXZlcnkgb3RoZXIgdHlwZSBsaXN0cyBpdCBoZXJlIGFuZFxuICAgIC8vIHJlYWRzIGEgZmlsZSB0aGUgZWRnZSBkaWRuJ3Qgcm91dGUgdG8gUzMgKGEgcmV3cml0ZSBvbnRvIGl0KSBmcm9tIHRoZXJlLlxuICAgIGNvbnN0IHB1YmxpY09uRGlzayA9IHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUztcbiAgICBpZiAocHVibGljT25EaXNrKSB7XG4gICAgICAvLyBJdHMgZ2VuZXJhdGVkIERvY2tlcmZpbGUgYENPUFlgcyBgcHVibGljYCwgd2hpY2ggZmFpbHMgdGhlIGltYWdlIGJ1aWxkXG4gICAgICAvLyB3aGVuIHRoZSBhcHAgaGFzIG5vbmUuIEFuIGVtcHR5IGRpcmVjdG9yeSBpcyB3aGF0IGBuZXh0IHN0YXJ0YCBzZWVzXG4gICAgICAvLyBmb3IgYW4gYXBwIHdpdGhvdXQgb25lIGFueXdheSwgYW5kIGdpdCBkb2Vzbid0IHRyYWNrIGl0LlxuICAgICAgbWtkaXJTeW5jKGpvaW4ocHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5kZXBsb3ltZW50Um9vdHMpIHtcbiAgICAgIHRoaXMuc3RhZ2VSdW50aW1lKHJvb3QucGF0aCwgaXNGdW5jdGlvbnMsIHB1YmxpY09uRGlzayk7XG4gICAgICAvLyBGdW5jdGlvbnMgcnVuIG9uIHRoZSBMYW1iZGEgbWFuYWdlZCBydW50aW1lIChBbWF6b24gTGludXggMjAyMywgZ2xpYmMpLFxuICAgICAgLy8gZm9yIHRoZSBhcmNoaXRlY3R1cmUgdGhlaXIgTGFtYmRhIGRlcGxveXMsIHdoYXRldmVyIHRoaXMgbWFjaGluZSBpcztcbiAgICAgIC8vIENvbnRhaW5lcnMgcnVuIG9uIG5vZGU6MjQtYWxwaW5lIChtdXNsKS5cbiAgICAgIHRoaXMuc3RhZ2VTaGFycEZvclRhcmdldChcbiAgICAgICAgcm9vdCxcbiAgICAgICAgam9pbihyb290LnBhdGgsIHRoaXMucmVsYXRpdmVQcm9qZWN0RGlyKSxcbiAgICAgICAgYCR7aXNGdW5jdGlvbnMgPyBcImxpbnV4XCIgOiBcImxpbnV4bXVzbFwifS0ke3RvTm9kZUFyY2hpdGVjdHVyZSh0aGlzLmFyY2hpdGVjdHVyZSl9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLndhcm5PbkZvcmVpZ25OYXRpdmVCaW5hcmllcyhcbiAgICAgICAgcm9vdCxcbiAgICAgICAgYGxpbnV4LSR7dG9Ob2RlQXJjaGl0ZWN0dXJlKHRoaXMuYXJjaGl0ZWN0dXJlKX1gLFxuICAgICAgKTtcblxuICAgICAgaWYgKGlzRnVuY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0VW5kZXJMYW1iZGFMaW1pdChyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluZSB1cCB0aGUgZ3JvdXBzIHRoZSBwcm9wcyBhc2tlZCBmb3Igd2l0aCB0aGUgcm9vdHMgdGhlIGJ1aWxkIGFjdHVhbGx5XG4gICAqIHN0YWdlZCwgYW5kIGZhaWwgbG91ZGx5IHdoZW4gdGhleSBkaXNhZ3JlZS5cbiAgICpcbiAgICogVGhleSBjYW4gZGlzYWdyZWUgaW4gYm90aCBkaXJlY3Rpb25zLCBhbmQgYm90aCBtZWFuIHRoZSBzYW1lIHRoaW5nIOKAlCB0aGVcbiAgICogYC5uZXh0YCBvbiBkaXNrIGNhbWUgZnJvbSBhIGJ1aWxkIHRoYXQgZGlkIG5vdCBzZWUgdGhpcyBgZnVuY3Rpb25Hcm91cHNgIOKAlFxuICAgKiBidXQgdGhlIGNhdXNlcyBkaWZmZXI6IGBza2lwQnVpbGQ6IHRydWVgIHdpdGggYSBidWlsZCBydW4gYnkgaGFuZCwgb3IgYVxuICAgKiBzdGFsZSBgLm5leHRgIGZyb20gYmVmb3JlIHRoZSBwcm9wIGNoYW5nZWQuIEVpdGhlciB3YXkgZXZlcnkgbGF0ZXIgc3ltcHRvbVxuICAgKiAoYSBMYW1iZGEgbWlzc2luZyBhbiBlbnRyeXBvaW50LCBhIENsb3VkRnJvbnQgYmVoYXZpb3IgcG9pbnRpbmcgYXQgYVxuICAgKiBmdW5jdGlvbiB0aGF0IGNhbm5vdCBzZXJ2ZSBpdCkgaXMgdGhpcywgc2V2ZXJhbCBzdGVwcyBkb3duc3RyZWFtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVwbG95bWVudFJvb3RzKFxuICAgIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4gICk6IE5leHRqc0RlcGxveW1lbnRSb290W10ge1xuICAgIGNvbnN0IHN0YWdlZCA9IG1hbmlmZXN0Lmdyb3VwcztcblxuICAgIC8vIE5hbWVzICphbmQqIHJvdXRlczogbW92aW5nIGAvcmVwb3J0cy8qKmAgaW50byBhbiBleGlzdGluZyBncm91cCBrZWVwcyB0aGVcbiAgICAvLyBuYW1lcyBhbmQgc3RpbGwgbGVhdmVzIHRoYXQgZ3JvdXAncyB6aXAgd2l0aG91dCB0aGUgcmVwb3J0cyBlbnRyeXBvaW50cy5cbiAgICAvLyBPcmRlciBpcyBub3Q6IGFzc2lnbm1lbnQgYW5kIENsb3VkRnJvbnQgYmVoYXZpb3JzIGJvdGggZ28gbW9zdCBzcGVjaWZpY1xuICAgIC8vIGZpcnN0LCBhbmQgbm8gdHdvIGRpc3RpbmN0IHBhdHRlcm5zIHRpZSBvbiBhIFVSTCAoYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLFxuICAgIC8vIHNvIHJlb3JkZXJpbmcgZ3JvdXBzIG9yIHJvdXRlcyBpcyB0aGUgc2FtZSBzcGxpdC5cbiAgICAvLyBBbHJlYWR5IHZhbGlkYXRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHNvIHRoaXMgaXMgYWJzZW50IG9yIG5vbi1lbXB0eS5cbiAgICBjb25zdCB3YW50ZWQgPSB0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzPy5sZW5ndGhcbiAgICAgID8gdG9GdW5jdGlvbkdyb3VwU3BlY3ModGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdvdCA9IG1hbmlmZXN0LmZ1bmN0aW9uR3JvdXBzO1xuXG4gICAgaWYgKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc29ydGVkR3JvdXBTcGVjcyh3YW50ZWQpKSAhPT1cbiAgICAgIEpTT04uc3RyaW5naWZ5KHNvcnRlZEdyb3VwU3BlY3MoZ290KSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cHNcXGAgYXNrcyBmb3IgYCArXG4gICAgICAgICAgYCR7d2FudGVkID8gSlNPTi5zdHJpbmdpZnkod2FudGVkKSA6IFwibm8gc3BsaXR0aW5nXCJ9IGJ1dCB0aGUgYnVpbGQgYCArXG4gICAgICAgICAgYGluICR7dGhpcy5kb3ROZXh0UGF0aH0gd2FzIHNwbGl0IGludG8gYCArXG4gICAgICAgICAgYCR7Z290ID8gSlNPTi5zdHJpbmdpZnkoZ290KSA6IFwiYSBzaW5nbGUgZGVwbG95bWVudCByb290XCJ9LiBgICtcbiAgICAgICAgICBgR3JvdXBzIGFyZSByZXNvbHZlZCBkdXJpbmcgXFxgbmV4dCBidWlsZFxcYCAoY2RrLW5leHRqcyBwYXNzZXMgdGhlbSBpbiBgICtcbiAgICAgICAgICBgdmlhICR7RlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJ9KSwgc28gdGhpcyBtZWFucyB0aGUgYnVpbGQgb3V0cHV0IGlzIGAgK1xuICAgICAgICAgIGBzdGFsZSwgb3IgXFxgc2tpcEJ1aWxkOiB0cnVlXFxgIGFuZCB0aGUgYnVpbGQgd2FzIHJ1biB3aXRob3V0IHRoYXQgYCArXG4gICAgICAgICAgYHZhcmlhYmxlIHNldC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lcyA9IHN0YWdlZCA/IE9iamVjdC5rZXlzKHN0YWdlZCkgOiBbREVGQVVMVF9GVU5DVElPTl9HUk9VUF07XG4gICAgY29uc3Qgcm9vdHMgPSBuYW1lcy5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgcGF0aDogam9pbihcbiAgICAgICAgdGhpcy5kb3ROZXh0UGF0aCxcbiAgICAgICAgQURBUFRFUl9ESVJfTkFNRSxcbiAgICAgICAgLi4uZ3JvdXBTdGFnaW5nRGlyTmFtZShzdGFnZWQgPyBuYW1lIDogdW5kZWZpbmVkKS5zcGxpdChcIi9cIiksXG4gICAgICApLFxuICAgICAgcm91dGVzOiBzdGFnZWQ/LltuYW1lXSA/PyBbXSxcbiAgICB9KSk7XG5cbiAgICAvLyBgZGVmYXVsdGAgZmlyc3QsIHNvIGFueSBcInRoZSByb290XCIgY2FsbGVyIGdldHMgdGhlIGdyb3VwIHRoYXQgb3duc1xuICAgIC8vIGV2ZXJ5dGhpbmcgdW5hc3NpZ25lZC5cbiAgICByb290cy5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQXG4gICAgICAgID8gLTFcbiAgICAgICAgOiBiLm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVBcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiByb290cykge1xuICAgICAgaWYgKCFleGlzdHNTeW5jKHJvb3QucGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFRoZSBkZXBsb3ltZW50IHJvb3QgZm9yIGZ1bmN0aW9uIGdyb3VwIGAgK1xuICAgICAgICAgICAgYFwiJHtyb290Lm5hbWV9XCIgaXMgbWlzc2luZyBmcm9tICR7cm9vdC5wYXRofSwgdGhvdWdoIHRoZSBhZGFwdGVyIGAgK1xuICAgICAgICAgICAgYG1hbmlmZXN0IGxpc3RzIGl0LiBUaGUgXFxgLm5leHRcXGAgZGlyZWN0b3J5IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIGAgK1xuICAgICAgICAgICAgYFxcYG5leHQgYnVpbGRcXGAgcmFuLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290cztcbiAgfVxuXG4gIC8qKlxuICAgKiBgbmV4dCBidWlsZGAgdHJhY2VzIG5hdGl2ZSBhZGRvbnMgZnJvbSB0aGUgbWFjaGluZSBpdCBydW5zIG9uLCBhbmQgb25seVxuICAgKiBgc2hhcnBgIGlzIHN3YXBwZWQgZm9yIHRoZSB0YXJnZXQuIEFueXRoaW5nIGVsc2UgYnVpbHQgZm9yIGFub3RoZXIgcGxhdGZvcm1cbiAgICogZmFpbHMgd2l0aCBNT0RVTEVfTk9UX0ZPVU5EIG9yIEVSUl9ETE9QRU5fRkFJTEVEIG9uIHRoZSBmaXJzdCByZXF1ZXN0IHRoYXRcbiAgICogbG9hZHMgaXQsIHNvIHNheSB3aGljaCBwYWNrYWdlIGF0IHN5bnRoLiBBIHdhcm5pbmcsIG5vdCBhbiBlcnJvcjogc29tZVxuICAgKiBhZGRvbnMgYXJlIG9wdGlvbmFsIChgd3NgJ3MgYGJ1ZmZlcnV0aWxgLCBgZnNldmVudHNgKSBhbmQgZmFsbCBiYWNrIHRvIEpTLlxuICAgKlxuICAgKiBPbmx5IHRoZSBPUyBhbmQgQ1BVIGFyZSBjaGVja2VkOiBnbGliYyBhbmQgbXVzbCBidWlsZHMgc2hhcmUgYSBoZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkZvcmVpZ25OYXRpdmVCaW5hcmllcyhcbiAgICByb290OiBOZXh0anNEZXBsb3ltZW50Um9vdCxcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZm9yZWlnbiA9IGZpbmRGb3JlaWduTmF0aXZlUGFja2FnZXMocm9vdC5wYXRoLCB0YXJnZXQpO1xuICAgIGlmICghZm9yZWlnbi5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgXCJjZGstbmV4dGpzOmZvcmVpZ25OYXRpdmVCaW5hcmllc1wiLFxuICAgICAgYCR7TE9HX1BSRUZJWH0gRGVwbG95bWVudCByb290IFwiJHtyb290Lm5hbWV9XCIgaGFzIG5hdGl2ZSBiaW5hcmllcyBgICtcbiAgICAgICAgYGJ1aWx0IGZvciBhIHBsYXRmb3JtIG90aGVyIHRoYW4gJHt0YXJnZXR9LCB3aGljaCBpdCBydW5zIG9uOiBgICtcbiAgICAgICAgYCR7Zm9yZWlnbi5qb2luKFwiLCBcIil9LiBcXGBuZXh0IGJ1aWxkXFxgIHRyYWNlZCB0aGVtIGZyb20gdGhpcyBtYWNoaW5lLCBgICtcbiAgICAgICAgYHNvIHRoZXkgZmFpbCBvbiB0aGUgZmlyc3QgcmVxdWVzdCB0aGF0IGxvYWRzIHRoZW0gdW5sZXNzIHRoZSBwYWNrYWdlIGAgK1xuICAgICAgICBgZmFsbHMgYmFjayB3aXRob3V0IHRoZW0uIEJ1aWxkIG9uICR7dGFyZ2V0fSwgb3IgcmVwbGFjZSBlYWNoIHdpdGggYCArXG4gICAgICAgIGB0aGUgJHt0YXJnZXR9IHZhcmlhbnQgYWZ0ZXIgXFxgbmV4dCBidWlsZFxcYCAoZS5nLiBcXGBucG0gcGFja1xcYCBpdCBpbiBgICtcbiAgICAgICAgYHlvdXIgXFxgYnVpbGRDb21tYW5kXFxgKS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jZGtsYWJzL2Nkay1uZXh0anMvYCArXG4gICAgICAgIGBibG9iL21haW4vZG9jcy9uYXRpdmUtZGVwZW5kZW5jaWVzLWd1aWRlLm1kYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExhbWJkYSBlbmZvcmNlcyAyNTAgTUIgdW56aXBwZWQgYXQgQ2xvdWRGb3JtYXRpb24gdGltZSwgd2hpY2ggaXMgbWludXRlc1xuICAgKiBpbnRvIGEgZGVwbG95IGFuZCByZXBvcnRzIG9ubHkgYSBzaXplLiBTcGxpdHRpbmcgZXhpc3RzIHRvIHN0YXkgdW5kZXIgdGhhdFxuICAgKiBjYXAsIHNvIHRoZSBlcnJvciB0aGF0IHRlbGxzIHlvdSB0byBzcGxpdCBmdXJ0aGVyIGhhcyB0byBuYW1lIHRoZSBncm91cCwgaXRzXG4gICAqIHNpemUsIGFuZCB3aGF0IHRvIGRvIOKAlCBhbmQgYXJyaXZlIGF0IHN5bnRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnRVbmRlckxhbWJkYUxpbWl0KHJvb3Q6IE5leHRqc0RlcGxveW1lbnRSb290KTogdm9pZCB7XG4gICAgY29uc3QgYnl0ZXMgPSBzdG9yZWRTaXplKHJvb3QucGF0aCk7XG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBEZXBsb3ltZW50IHJvb3QgXCIke3Jvb3QubmFtZX1cIiBpcyAkeyhieXRlcyAvIDFlNikudG9GaXhlZCgxKX0gTUIgdW56aXBwZWRgLFxuICAgICk7XG4gICAgaWYgKGJ5dGVzIDw9IExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYiA9ICh2YWx1ZTogbnVtYmVyKSA9PiBgJHsodmFsdWUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgwKX0gTUJgO1xuICAgIGNvbnN0IGlzU3BsaXQgPSB0aGlzLmRlcGxveW1lbnRSb290cy5sZW5ndGggPiAxO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IEZ1bmN0aW9uIGdyb3VwIFwiJHtyb290Lm5hbWV9XCIgaXMgJHttYihieXRlcyl9IHVuemlwcGVkLCBgICtcbiAgICAgICAgYG92ZXIgTGFtYmRhJ3MgJHttYihMQU1CREFfVU5aSVBQRURfTElNSVRfQllURVMpfSBsaW1pdC4gYCArXG4gICAgICAgIChpc1NwbGl0XG4gICAgICAgICAgPyBgU3BsaXQgaXRzIHJvdXRlcyBmdXJ0aGVyLCBvciBtb3ZlIHNvbWUgb2YgdGhlbSBpbnRvIGFub3RoZXIgZ3JvdXA6IGAgK1xuICAgICAgICAgICAgYHRoZSBjYXAgaXMgcGVyIGZ1bmN0aW9uLCBzbyB0aGUgc2hhcmVkIFxcYG5leHRcXGAgY2xvc3VyZSBldmVyeSBncm91cCBgICtcbiAgICAgICAgICAgIGBkdXBsaWNhdGVzIGNvc3RzIG5vdGhpbmcgYWdhaW5zdCBhbnkgc2luZ2xlIGJ1ZGdldC5gXG4gICAgICAgICAgOiBgVXNlIHRoZSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwcm9wIHRvIHBhY2thZ2Ugcm91dGVzIGludG8gc2VwYXJhdGUgYCArXG4gICAgICAgICAgICBgZnVuY3Rpb25zLiBOb3RlIHRoYXQgc3BsaXR0aW5nIG9ubHkgcmVtb3ZlcyByb3V0ZS1sb2NhbCBjb2RlIOKAlCBgICtcbiAgICAgICAgICAgIGBhbnl0aGluZyByZWFjaGFibGUgZnJvbSBhIHNoYXJlZCBsYXlvdXQgb3IgdGhlIFxcYG5leHRcXGAgcnVudGltZSBpcyBgICtcbiAgICAgICAgICAgIGBpbiBldmVyeSBncm91cC5gKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIG1hbmlmZXN0IHRoZSBhZGFwdGVyJ3MgYG9uQnVpbGRDb21wbGV0ZWAgd3JvdGUuXG4gICAqXG4gICAqIEl0cyBhYnNlbmNlIG1lYW5zIGBuZXh0IGJ1aWxkYCByYW4gd2l0aG91dCBjZGstbmV4dGpzJ3MgYWRhcHRlciByZWdpc3RlcmVkXG4gICAqIChvciB3aXRoIGEgc3RhbGUgYG5leHQuY29uZmlnYCksIHdoaWNoIGlzIHdvcnRoIHNheWluZyBwbGFpbmx5IGhlcmU6IGV2ZXJ5XG4gICAqIGxhdGVyIGZhaWx1cmUg4oCUIGEgTGFtYmRhIHRoYXQgY2Fubm90IGZpbmQgYG1hbmlmZXN0Lmpzb25gLCBhbiBlbXB0eSBhc3NldCDigJRcbiAgICogaXMgdGhlIHNhbWUgY2F1c2Ugc2V2ZXJhbCBzdGVwcyBkb3duc3RyZWFtLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkQWRhcHRlck1hbmlmZXN0KCk6IEFkYXB0ZXJNYW5pZmVzdCB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihcbiAgICAgIHRoaXMuZG90TmV4dFBhdGgsXG4gICAgICBBREFQVEVSX0RJUl9OQU1FLFxuICAgICAgTUFOSUZFU1RfRklMRV9OQU1FLFxuICAgICk7XG4gICAgaWYgKCFleGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBub3QgZm91bmQgYXQgJHttYW5pZmVzdFBhdGh9LiBgICtcbiAgICAgICAgICBgXCIke3RoaXMuYnVpbGRDb21tYW5kfVwiIG11c3QgcnVuIGEgTmV4dC5qcyBidWlsZCB3aXRoIGNkay1uZXh0anMncyBgICtcbiAgICAgICAgICBgYWRhcHRlciByZWdpc3RlcmVkLiBjZGstbmV4dGpzIHNldHMgXFxgTkVYVF9BREFQVEVSX1BBVEhcXGAgb24gdGhlIGAgK1xuICAgICAgICAgIGBidWlsZCBpdCBydW5zIGl0c2VsZiwgc28gdGhpcyB1c3VhbGx5IG1lYW5zIGVpdGhlciB0aGUgYnVpbGQgY29tbWFuZCBgICtcbiAgICAgICAgICBgZG9lcyBub3QgcmVhY2ggXFxgbmV4dCBidWlsZFxcYCAoYSB3cmFwcGVyIHRoYXQgZHJvcHMgdGhlIGVudmlyb25tZW50LCBgICtcbiAgICAgICAgICBgb3IgYSBjYWNoZWQgYnVpbGQgdGhhdCBkaWQgbm90IHJlLXJ1biksIG9yIFxcYHNraXBCdWlsZDogdHJ1ZVxcYCBhbmQgYCArXG4gICAgICAgICAgYHRoZSBidWlsZCBoYXBwZW5lZCBvdXRzaWRlIENESy4gRm9yIHRoZSBsYXR0ZXIsIHNldCBgICtcbiAgICAgICAgICBgXFxgYWRhcHRlclBhdGg6IHJlcXVpcmUucmVzb2x2ZShcImNkay1uZXh0anMvYWRhcHRlclwiKVxcYCBpbiBgICtcbiAgICAgICAgICBgbmV4dC5jb25maWcuIEEgY3VzdG9tIFxcYGRpc3REaXJcXGAgaXMgbm90IHN1cHBvcnRlZCBlaXRoZXI6IGAgK1xuICAgICAgICAgIGBjZGstbmV4dGpzIHJlYWRzIHRoZSBidWlsZCBmcm9tIFxcYC5uZXh0XFxgLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIFwidXRmLThcIiksXG4gICAgKTtcbiAgICBpZiAobWFuaWZlc3QudmVyc2lvbiAhPT0gQURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IGF0ICR7bWFuaWZlc3RQYXRofSBpcyB2ZXJzaW9uIGAgK1xuICAgICAgICAgIGAke21hbmlmZXN0LnZlcnNpb259LCBidXQgdGhpcyB2ZXJzaW9uIG9mIGNkay1uZXh0anMgcmVhZHMgdmVyc2lvbiBgICtcbiAgICAgICAgICBgJHtBREFQVEVSX01BTklGRVNUX1ZFUlNJT059LiBUaGUgYWRhcHRlciB0aGF0IHdyb3RlIGl0IGFuZCB0aGUgYCArXG4gICAgICAgICAgYGNvbnN0cnVjdHMgcmVhZGluZyBpdCBjb21lIGZyb20gdGhlIHNhbWUgcGFja2FnZSwgc28gdGhpcyBtZWFucyB0d28gYCArXG4gICAgICAgICAgYGNkay1uZXh0anMgdmVyc2lvbnMgYXJlIGluc3RhbGxlZCwgb3IgdGhlIGJ1aWxkIG91dHB1dCBpcyBzdGFsZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgY2RrLW5leHRqcydzIG93biBidW5kbGVkIHJlcXVlc3QtaGFuZGxpbmcgc2hlbGwgYW5kIHRoZSBtYW5pZmVzdCBpbnRvXG4gICAqIGA8ZGVwbG95bWVudFJvb3Q+L2Nkay1uZXh0anMtcnVudGltZS9gLCB3aGljaCBpcyB3aGVyZVxuICAgKiBgZGVwbG95bWVudFJvb3RPZmAvYGRlcGxveWVkTWFuaWZlc3RQYXRoYCBleHBlY3QgdG8gZmluZCB0aGVtLlxuICAgKlxuICAgKiBPbmx5IHRoZSBzaGVsbCB0aGUgZGVwbG95bWVudCB0eXBlIGFjdHVhbGx5IHJ1bnMgaXMgY29waWVkIOKAlCB0aGUgTGFtYmRhXG4gICAqIGhhbmRsZXIgZm9yIEZ1bmN0aW9ucywgdGhlIGBub2RlOmh0dHBgIHNlcnZlciBmb3IgQ29udGFpbmVycyDigJQgc28gbm90aGluZ1xuICAgKiBzaGlwcyB+MS41IE1CIG9mIGRlYWQgY29kZSBhbmQgdGhlIHRyZWUgc2F5cyB3aGljaCB0eXBlIHByb2R1Y2VkIGl0LiBCb3RoXG4gICAqIGFyZSBjb3BpZWQgZnJvbSB0aGlzIHBhY2thZ2UncyBgbGliL2AsIG5leHQgdG8gdGhlIGNvbXBpbGVkIGNvbnN0cnVjdC5cbiAgICpcbiAgICogRXZlcnkgZ3JvdXAgZ2V0cyB0aGUgc2FtZSBzaGVsbCAqYW5kIHRoZSBzYW1lIG1hbmlmZXN0KjogYSBmdW5jdGlvbiBvbmx5XG4gICAqIGtub3dzIHdoaWNoIHJvdXRlcyBpdCBvd25zIHNvIGl0IGNhbiBzYXkgc28gd2hlbiBtaXNyb3V0ZWQsIGFuZCB0aGF0IGNvbWVzXG4gICAqIGZyb20ge0BsaW5rIEZVTkNUSU9OX0dST1VQX0VOVl9WQVJ9LCBub3QgZnJvbSBhIHBlci1ncm91cCBtYW5pZmVzdC5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VSdW50aW1lKFxuICAgIGRlcGxveW1lbnRSb290OiBzdHJpbmcsXG4gICAgaXNGdW5jdGlvbnM6IGJvb2xlYW4sXG4gICAgcHVibGljT25EaXNrOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzaGVsbCA9IGlzRnVuY3Rpb25zID8gXCJsYW1iZGEubWpzXCIgOiBcInNlcnZlci5tanNcIjtcbiAgICBjb25zdCBzb3VyY2UgPSBqb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcInJ1bnRpbWVcIiwgc2hlbGwpO1xuXG4gICAgY29uc3QgcnVudGltZURpciA9IGpvaW4oZGVwbG95bWVudFJvb3QsIFJVTlRJTUVfRElSX05BTUUpO1xuICAgIC8vIFJlbW92ZWQgcmF0aGVyIHRoYW4gbWVyZ2VkOiBhIHN0YWxlIHNoZWxsIGZyb20gdGhlIG90aGVyIGRlcGxveW1lbnQgdHlwZVxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBzaXQgaW4gdGhlIGFzc2V0IGFuZCBjaGFuZ2UgaXRzIGhhc2ggZm9yIG5vIHJlYXNvbi5cbiAgICBybVN5bmMocnVudGltZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIG1rZGlyU3luYyhydW50aW1lRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjcFN5bmMoc291cmNlLCBqb2luKHJ1bnRpbWVEaXIsIHNoZWxsKSk7XG4gICAgY3BTeW5jKFxuICAgICAgam9pbih0aGlzLmRvdE5leHRQYXRoLCBBREFQVEVSX0RJUl9OQU1FLCBNQU5JRkVTVF9GSUxFX05BTUUpLFxuICAgICAgam9pbihydW50aW1lRGlyLCBNQU5JRkVTVF9GSUxFX05BTUUpLFxuICAgICk7XG4gICAgaWYgKCFwdWJsaWNPbkRpc2spIHtcbiAgICAgIC8vIFRoZSBMYW1iZGEgemlwcyBhbmQgdGhlIEdsb2JhbENvbnRhaW5lcnMgaW1hZ2UgZG9uJ3QgY2FycnkgYHB1YmxpYy9gXG4gICAgICAvLyAoaXRzIGJ5dGVzIGFyZSBpbiBTMyksIHNvIHRoZSBydW50aW1lIGNhbid0IGxpc3QgaXQgYXQgc3RhcnQgdGhlIHdheVxuICAgICAgLy8gdGhlIFJlZ2lvbmFsQ29udGFpbmVycyBpbWFnZSBkb2VzLlxuICAgICAgLy8gTGlzdGVkIGhlcmUsIGFmdGVyIHRoZSBidWlsZCBjb21tYW5kLCBzbyBgcG9zdGJ1aWxkYCBvdXRwdXQgaXMgaW4gaXQ6XG4gICAgICAvLyBhIHJld3JpdGUgb250byBhIGxpc3RlZCBmaWxlIGlzIHRoZW4gc2VydmVkIGZyb20gUzMgcmF0aGVyIHRoYW4gNDA0aW5nLlxuICAgICAgd3JpdGVQdWJsaWNGaWxlTGlzdChcbiAgICAgICAgcnVudGltZURpcixcbiAgICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlYnVnKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gU3RhZ2VkICR7c2hlbGx9IGFuZCAke01BTklGRVNUX0ZJTEVfTkFNRX0gaW4gJHtydW50aW1lRGlyfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgTkVYVF9BREFQVEVSX1BBVEhgIGZvciB0aGUgYnVpbGQsIHNvIGBhZGFwdGVyUGF0aGAgaW4gYG5leHQuY29uZmlnYCBpc1xuICAgKiBvcHRpb25hbC5cbiAgICpcbiAgICogTmV4dC5qcyByZWFkcyB0aGUgdmFyaWFibGUgYXMgdGhlICpkZWZhdWx0KiB2YWx1ZSBvZiBgYWRhcHRlclBhdGhgXG4gICAqIChgbmV4dC9kaXN0L3NlcnZlci9jb25maWctc2hhcmVkLmpzYCwgYGRlZmF1bHRDb25maWdgKSwgc28gYW4gYXBwIHRoYXQgZG9lc1xuICAgKiBzZXQgYGFkYXB0ZXJQYXRoYCBzdGlsbCB3aW5zIGFuZCBub3RoaW5nIGV4aXN0aW5nIGNoYW5nZXMuXG4gICAqXG4gICAqIFJlc29sdmVkIGZyb20gdGhlIE5leHQuanMgYXBwLCBub3QgZnJvbSBjZGstbmV4dGpzJ3Mgb3duIGBfX2Rpcm5hbWVgIGFuZCBub3RcbiAgICogbGVmdCBhcyBhIGJhcmUgc3BlY2lmaWVyLiBCb3RoIGFsdGVybmF0aXZlcyB3ZXJlIHRyaWVkIGFuZCBib3RoIGFyZSB3cm9uZzpcbiAgICpcbiAgICogLSBjZGstbmV4dGpzJ3Mgb3duIGxvY2F0aW9uIGxvc2VzIGJlY2F1c2UgdGhlIGFkYXB0ZXIgcmVzb2x2ZXMgaXRzIHNpYmxpbmdcbiAgICogICBjYWNoZSBoYW5kbGVyIHJlbGF0aXZlIHRvIHdoZXJldmVyICppdCogd2FzIGxvYWRlZCBmcm9tLiBBbiBhZGFwdGVyIGxvYWRlZFxuICAgKiAgIGZyb20gb3V0c2lkZSB0aGUgYXBwJ3MgdHJlZSBoYW5kcyBOZXh0LmpzIGEgYGNhY2hlSGFuZGxlcmAgb3V0c2lkZVxuICAgKiAgIGB0dXJib3BhY2sucm9vdGAsIHdoaWNoIFR1cmJvcGFjayByZWplY3RzIG91dHJpZ2h0IChcImxlYXZlcyB0aGUgZmlsZXN5c3RlbVxuICAgKiAgIHJvb3RcIikuXG4gICAqIC0gQSBiYXJlIHNwZWNpZmllciBsb3NlcyBiZWNhdXNlIE5leHQuanMgcmVzb2x2ZXMgYGFkYXB0ZXJQYXRoYCBmcm9tIGluc2lkZVxuICAgKiAgIGl0cyBvd24gY29uZmlnIGxvYWRlciwgaS5lLiBmcm9tIGBuZXh0YCdzIHJlYWxwYXRoLiBVbmRlciBwbnBtIHRoYXQgaXMgdGhlXG4gICAqICAgdmlydHVhbCBzdG9yZSAoYG5vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QOKApi9ub2RlX21vZHVsZXMvbmV4dC9gKSwgYW5kIHRoZVxuICAgKiAgIHdhbGsgdXAgZnJvbSB0aGVyZSBuZXZlciByZWFjaGVzIHRoZSBhcHAncyBvd24gYG5vZGVfbW9kdWxlc2AuXG4gICAqXG4gICAqIFVuc2V0IHdoZW4gYGNkay1uZXh0anNgIGlzIG5vdCByZXNvbHZhYmxlIGZyb20gdGhlIGFwcCwgd2hpY2ggaXMgbGVnaXRpbWF0ZTpcbiAgICogdGhlIE5leHQuanMgYXBwIGFuZCB0aGUgQ0RLIGFwcCBjYW4gYmUgc2VwYXJhdGUgcGFja2FnZXMsIGFuZCBvbmx5IHRoZSBDREsgb25lXG4gICAqIG5lY2Vzc2FyaWx5IGRlcGVuZHMgb24gY2RrLW5leHRqcy4ge0BsaW5rIHJlYWRBZGFwdGVyTWFuaWZlc3R9IHJlcG9ydHMgdGhlXG4gICAqIHJlc3VsdGluZyBmYWlsdXJlIGFuZCBuYW1lcyB0aGlzIGNhc2UuXG4gICAqXG4gICAqIE9uZSBzZXR1cCB0aGlzIGNhbm5vdCBzZXJ2ZSwgYW5kIHRoZSByZWFzb24gdGhpcyByZXBvJ3Mgb3duIGV4YW1wbGVzIHN0aWxsIHNldFxuICAgKiBgYWRhcHRlclBhdGhgOiBhIGBsaW5rOmAvYGZpbGU6YCBkZXBlbmRlbmN5IG9uIGEgY2RrLW5leHRqcyBjaGVja291dCAqb3V0c2lkZSpcbiAgICogdGhlIGFwcCdzIHByb2plY3Qgcm9vdC4gVGhlIHN5bWxpbmsgcmVzb2x2ZXMgb3V0IG9mIHRoZSBwcm9qZWN0LCBzbyB0aGVcbiAgICogYGNhY2hlSGFuZGxlcmAgZXNjYXBlIGFib3ZlIGFwcGxpZXMuIFNldCBgYWRhcHRlclBhdGhgIGluIGBuZXh0LmNvbmZpZ2AgdGhlcmVcbiAgICog4oCUIGl0IGlzIHJlc29sdmVkIGJ5IHRoZSBidWlsZCwgYWZ0ZXIgd2hhdGV2ZXIgcHV0IHRoZSBhZGFwdGVyIGluIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGFwdGVyUGF0aEVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgTkVYVF9BREFQVEVSX1BBVEg6IHJlcXVpcmUucmVzb2x2ZShcImNkay1uZXh0anMvYWRhcHRlclwiLCB7XG4gICAgICAgICAgcGF0aHM6IFt0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5XSxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgZGVidWcoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IENvdWxkIG5vdCByZXNvbHZlIFwiY2RrLW5leHRqcy9hZGFwdGVyXCIgZnJvbSBgICtcbiAgICAgICAgICBgJHt0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5fTsgbGVhdmluZyBORVhUX0FEQVBURVJfUEFUSCB1bnNldCwgc28gYCArXG4gICAgICAgICAgYG5leHQuY29uZmlnIG11c3Qgc2V0IFxcYGFkYXB0ZXJQYXRoXFxgLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGxvY2FsIGJ1aWxkIGNvbW1hbmQgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgcnVuTmV4dEJ1aWxkKCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gUnVubmluZzogXCIke3RoaXMuYnVpbGRDb21tYW5kfVwiIGluIGRpcmVjdG9yeTogJHt0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5fWAsXG4gICAgKTtcblxuICAgIC8vIENsZWFuIGV4aXN0aW5nIGNhY2hlIGRpcmVjdG9yeSB0byBhdm9pZCBzdGFsZSBkYXRhIGZyb20gcHJldmlvdXMgYnVpbGRzXG4gICAgaWYgKGV4aXN0c1N5bmModGhpcy5pbml0Q2FjaGVEaXIpKSB7XG4gICAgICBybVN5bmModGhpcy5pbml0Q2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGRlYnVnKGBDbGVhbmVkIGV4aXN0aW5nIGNhY2hlIGRpcmVjdG9yeTogJHt0aGlzLmluaXRDYWNoZURpcn1gKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmModGhpcy5idWlsZENvbW1hbmQsIHtcbiAgICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgICBjd2Q6IHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIENES19ORVhUSlNfSU5JVF9DQUNIRV9ESVI6IHRoaXMuaW5pdENhY2hlRGlyLFxuICAgICAgICAgIC4uLnRoaXMuYWRhcHRlclBhdGhFbnYoKSxcbiAgICAgICAgICAvLyBgb25CdWlsZENvbXBsZXRlYCBydW5zIGluc2lkZSB0aGlzIHByb2Nlc3MgYW5kIGNhbm5vdCByZWFkIENES1xuICAgICAgICAgIC8vIHByb3BzLCBzbyB0aGUgcmVzb2x2ZWQgZ3JvdXBzIHRyYXZlbCBhcyBKU09OLiBBYnNlbnQgd2hlbiBub3RcbiAgICAgICAgICAvLyBzcGxpdHRpbmcsIHdoaWNoIHRoZSBhZGFwdGVyIHJlYWRzIGFzIFwib25lIGRlcGxveW1lbnQgcm9vdFwiLlxuICAgICAgICAgIC4uLih0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzPy5sZW5ndGhcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIFtGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUl06IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgdG9GdW5jdGlvbkdyb3VwU3BlY3ModGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwcyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2NhbCBidWlsZCBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmQgYHBhdGNoLWZldGNoLmpzYCB0byB0aGUgY2xpZW50IGVudHJ5cG9pbnQgY2h1bmtzLCBmb3JcbiAgICogYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2Agb25seS5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IG1ha2VzIFBPU1Qgd29yayBhdCBhbGwgb24gdGhhdCB0eXBlLiBDbG91ZEZyb250IHJlYWNoZXMgdGhlXG4gICAqIHNlcnZlciB0aHJvdWdoIGEgTGFtYmRhIEZ1bmN0aW9uIFVSTCB3aXRoIGBBdXRoVHlwZTogQVdTX0lBTWAsIHNpZ25lZCBieSBhblxuICAgKiBvcmlnaW4gYWNjZXNzIGNvbnRyb2wsIGFuZCBBV1MgZG9jdW1lbnRzIHRoZSBjb25zZXF1ZW5jZTogXCJJZiB5b3UgdXNlIFBVVCBvclxuICAgKiBQT1NUIG1ldGhvZHMgd2l0aCB5b3VyIExhbWJkYSBmdW5jdGlvbiBVUkwsIHlvdXIgdXNlcnMgbXVzdCBjb21wdXRlIHRoZVxuICAgKiBTSEEyNTYgb2YgdGhlIGJvZHkgYW5kIGluY2x1ZGUgdGhlIHBheWxvYWQgaGFzaCB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBib2R5IGluXG4gICAqIHRoZSBgeC1hbXotY29udGVudC1zaGEyNTZgIGhlYWRlciB3aGVuIHNlbmRpbmcgdGhlIHJlcXVlc3QgdG8gQ2xvdWRGcm9udC5cbiAgICogTGFtYmRhIGRvZXNuJ3Qgc3VwcG9ydCB1bnNpZ25lZCBwYXlsb2Fkcy5cIlxuICAgKlxuICAgKiBDbG91ZEZyb250IHNpZ25zIEdFVHMgaXRzZWxmIChlbXB0eS1ib2R5IGhhc2gpIGJ1dCB3aWxsIG5vdCBoYXNoIGEgYm9keSwgYW5kXG4gICAqIGEgYnJvd3NlciBoYXMgbm8gd2F5IHRvIGFkZCB0aGF0IGhlYWRlciBvbiBpdHMgb3duLCBzbyBhbiB1bnBhdGNoZWQgYXBwXG4gICAqIGFuc3dlcnMgZXZlcnkgc2VydmVyIGFjdGlvbiwgZm9ybSBzdWJtaXNzaW9uIGFuZCBQT1NUIHJvdXRlIGhhbmRsZXIgd2l0aFxuICAgKiBgNDAzIEludmFsaWRTaWduYXR1cmVFeGNlcHRpb25gIGJlZm9yZSB0aGUgcmVxdWVzdCByZWFjaGVzIE5leHQuanMuIFRoZVxuICAgKiBwYXRjaCBpbnN0YWxscyBgZmV0Y2hgL2BYTUxIdHRwUmVxdWVzdGAgd3JhcHBlcnMgdGhhdCBjb21wdXRlIHRoZSBoYXNoLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtcmVzdHJpY3RpbmctYWNjZXNzLXRvLWxhbWJkYS5odG1sXG4gICAqL1xuICBwcml2YXRlIHBhdGNoRmV0Y2hJbkNsaWVudEpzKCkge1xuICAgIGNvbnN0IHN0YXRpY0NodW5rc1BhdGggPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhdGljXCIsIFwiY2h1bmtzXCIpO1xuICAgIGNvbnN0IGNodW5rRmlsZXMgPSByZWFkZGlyU3luYyhzdGF0aWNDaHVua3NQYXRoKS5maWx0ZXIoXG4gICAgICAoZmlsZTogc3RyaW5nKSA9PlxuICAgICAgICAvLyBtYWluLWFwcC0gZm9yIHdlYnBhY2ssIHR1cmJvcGFjay0gZm9yIHR1cmJvXG4gICAgICAgIGZpbGUuc3RhcnRzV2l0aChcIm1haW4tYXBwLVwiKSB8fFxuICAgICAgICAoZmlsZS5zdGFydHNXaXRoKFwidHVyYm9wYWNrLVwiKSAmJiBmaWxlLmVuZHNXaXRoKFwiLmpzXCIpKSxcbiAgICApO1xuXG4gICAgaWYgKGNodW5rRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjbGllbnQgc2lkZSBqcyBlbnRyeXBvaW50IGZpbGVzIGZvdW5kXCIpO1xuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHBhdGNoLWZldGNoLmpzIGNvbnRlbnRcbiAgICBjb25zdCBwYXRjaEZldGNoUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcInBhdGNoLWZldGNoLmpzXCIpO1xuICAgIGNvbnN0IHBhdGNoRmV0Y2hDb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhdGNoRmV0Y2hQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgLy8gUHJlcGVuZCBwYXRjaC1mZXRjaCBsb2dpYyB0byBlYWNoIGVudHJ5cG9pbnQsIG9uY2UuIE5vdyB0aGF0IHRoaXMgcnVuc1xuICAgIC8vIG91dHNpZGUgYHJ1bk5leHRCdWlsZGAsIHRoZSBzYW1lIGAubmV4dGAgY2FuIGJlIHN5bnRoZXNpemVkIG1vcmUgdGhhblxuICAgIC8vIG9uY2UgKGBza2lwQnVpbGQ6IHRydWVgLCBgY2RrIHN5bnRoYCB0aGVuIGBjZGsgZGVwbG95YCwgYSByZXRyaWVkXG4gICAgLy8gZGVwbG95KSwgYW5kIHByZXBlbmRpbmcgdHdpY2Ugd291bGQgcmUtd3JhcCB0aGUgd3JhcHBlcnMuXG4gICAgZm9yIChjb25zdCBjaHVua0ZpbGUgb2YgY2h1bmtGaWxlcykge1xuICAgICAgY29uc3QgY2h1bmtGaWxlUGF0aCA9IGpvaW4oc3RhdGljQ2h1bmtzUGF0aCwgY2h1bmtGaWxlKTtcbiAgICAgIGNvbnN0IHBhdGNoZWRDb250ZW50ID0gcGF0Y2hDbGllbnRDaHVuayhcbiAgICAgICAgcmVhZEZpbGVTeW5jKGNodW5rRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgIHBhdGNoRmV0Y2hDb250ZW50LFxuICAgICAgICBjaHVua0ZpbGVQYXRoLFxuICAgICAgKTtcbiAgICAgIGlmIChwYXRjaGVkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IEFscmVhZHkgcGF0Y2hlZCwgc2tpcHBpbmc6ICR7Y2h1bmtGaWxlUGF0aH1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB3cml0ZUZpbGVTeW5jKGNodW5rRmlsZVBhdGgsIHBhdGNoZWRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHB1YmxpYyBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGxvY2FsIGZpbGVzeXN0ZW1cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9jYWxQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luKHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhwdWJsaWNEaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZWFkZGlyU3luYyhwdWJsaWNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICBpc0RpcmVjdG9yeTogZW50cnkuaXNEaXJlY3RvcnkoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaXAgd2hhdGV2ZXIgcGxhdGZvcm0tc3BlY2lmaWMgU2hhcnAgYmluYXJpZXMgYG5leHQgYnVpbGRgJ3Mgb3V0cHV0IGZpbGVcbiAgICogdHJhY2luZyBzdGFnZWQsIHNpbmNlIHRoZXkncmUgdGhlIGhvc3QncyAoZS5nLiBtYWNPUy9nbGliYykgcmF0aGVyIHRoYW4gdGhlXG4gICAqIGRlcGxveW1lbnQgdGFyZ2V0J3MsIHRoZW4gaW5zdGFsbCB0aGUgdGFyZ2V0J3MuIFNraXBwaW5nIHRoaXMgaXMgc2lsZW50OlxuICAgKiBgaW1hZ2VPcHRpbWl6ZXJgIGNhdGNoZXMgdGhlIGxvYWQgZmFpbHVyZSBpbnRlcm5hbGx5IGFuZCByZXR1cm5zIHRoZVxuICAgKiB1bm9wdGltaXplZCBvcmlnaW5hbCB3aXRoIGFuIEhUVFAgMjAwLlxuICAgKlxuICAgKiBPbmx5IGEgcm9vdCB3aXRoIGBzaGFycGAgc3RhZ2VkIGdldHMgdGhlIGJpbmFyaWVzOiB0aGUgaW1hZ2Ugb3B0aW1pemVyXG4gICAqIGJyaW5ncyBpdCBpbnRvIGBkZWZhdWx0YCwgd2hpY2ggc2VydmVzIGV2ZXJ5IGAvX25leHQvaW1hZ2VgLCBhbmQgYW5vdGhlclxuICAgKiBncm91cCBoYXMgaXQgb25seSBpZiBpdHMgb3duIHJvdXRlcyB1c2UgaXQuIFNvIG9ubHkgYGRlZmF1bHRgIHdhcm5zIHdoZW5cbiAgICogaXQncyBtaXNzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVNoYXJwRm9yVGFyZ2V0KFxuICAgIHJvb3Q6IE5leHRqc0RlcGxveW1lbnRSb290LFxuICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgICBwbGF0Zm9ybTogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBzaGFycFNvdXJjZSA9IHRoaXMucmVtb3ZlRXhpc3RpbmdTaGFycEJpbmFyaWVzKHJvb3QucGF0aCwgcHJvamVjdERpcik7XG4gICAgaWYgKCFzaGFycFNvdXJjZSkge1xuICAgICAgaWYgKHJvb3QubmFtZSA9PT0gREVGQVVMVF9GVU5DVElPTl9HUk9VUCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXCJzaGFycFwiIG5vdCBmb3VuZCBpbiB0aGUgc3RhZ2VkIGJ1aWxkIG91dHB1dC4gQWRkIFwic2hhcnBcIiBhcyBhIGRlcGVuZGVuY3kgb2YgeW91ciBOZXh0LmpzIGFwcCB0byBlbmFibGUgaW1hZ2Ugb3B0aW1pemF0aW9uLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5zdGFsbFNoYXJwUGFja2FnZXMoXG4gICAgICBzaGFycEJpbmFyeURpcihyb290LnBhdGgpLFxuICAgICAgdGhpcy5nZXRTaGFycEJpbmFyeVBhY2thZ2VzKHNoYXJwU291cmNlLCBwbGF0Zm9ybSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBmaW5kIGFuZCByZW1vdmUgZXhpc3RpbmcgU2hhcnAgcGxhdGZvcm0gYmluYXJpZXMuXG4gICAqXG4gICAqIGByb290YCBpcyB3YWxrZWQgd2hvbGUgcmF0aGVyIHRoYW4ganVzdCBpdHMgYG5vZGVfbW9kdWxlc2A6IHRoZSBzdGFnZWQgdHJlZVxuICAgKiBpcyBrZXllZCBieSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aCwgc28gaW4gYSBtb25vcmVwbyB0aGUgYG5vZGVfbW9kdWxlc2BcbiAgICogaG9sZGluZyBgc2hhcnBgIGlzIHNldmVyYWwgZGlyZWN0b3JpZXMgZG93bi4ge0BsaW5rIGlzU2hhcnBCaW5hcnlQYWNrYWdlfSBpc1xuICAgKiB3aGF0IGtlZXBzIHRoYXQgZnJvbSByZWFjaGluZyB0aGUgYXBwJ3Mgb3duIG91dHB1dCDigJQgdGhlIHN0YWdlZCByb290IGhvbGRzXG4gICAqIHRoZSBjb21waWxlZCBgLm5leHRgIGFzIHdlbGwgYXMgdGhlIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQHBhcmFtIHByb2plY3REaXIgdGhlIGFwcCdzIGRpcmVjdG9yeSBpbnNpZGUgYHJvb3RgLCB3aGljaCBgbmV4dGAgaXNcbiAgICogcmVzb2x2ZWQgZnJvbS5cbiAgICogQHJldHVybnMgdGhlIHN0YWdlZCBgc2hhcnBgIEpTIHdyYXBwZXIgdG8gaW5zdGFsbCBuZXh0IHRvLCBmb3VuZCBpbiB0aGUgc2FtZVxuICAgKiB3YWxrOiBhIHJvb3QgY2FuIGJlIGh1bmRyZWRzIG9mIG1lZ2FieXRlcywgYW5kIGVhY2ggZ3JvdXAgaGFzIG9uZS5cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlRXhpc3RpbmdTaGFycEJpbmFyaWVzKFxuICAgIHJvb3Q6IHN0cmluZyxcbiAgICBwcm9qZWN0RGlyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2hhcnBDYW5kaWRhdGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gTGlua3MgYXJlIGxpc3RlZCwgbm90IGZvbGxvd2VkOiBldmVyeSBsaW5rIGluIGEgc3RhZ2VkIHJvb3QgcG9pbnRzXG4gICAgLy8gaW5zaWRlIGl0IChgc3RhZ2VGaWxlc2AgY29waWVzIHRoZSBvbmVzIHRoYXQgZG9uJ3QpLCBzbyBpdHMgdGFyZ2V0IGlzXG4gICAgLy8gd2Fsa2VkIGF0IGl0cyBvd24gcGF0aCBhbnl3YXksIGFuZCBmb2xsb3dpbmcgdGhlbSBpcyB3aGF0IGxldCBhXG4gICAgLy8gd29ya3NwYWNlIGN5Y2xlIGhhbmcgdGhlIHN5bnRoLlxuICAgIGNvbnN0IGFsbEVudHJpZXMgPSBsaXN0VHJlZShyb290KTtcblxuICAgIC8vIFN5bWxpbmtzIGFyZSB1bmxpbmtlZCwgbm90IGBybVN5bmNgZWQsIGFuZCB0aGV5IGdvIGZpcnN0LiBwbnBtIHBvaW50c1xuICAgIC8vIHNldmVyYWwgbGlua3MgYXQgb25lIHN0b3JlIGRpcmVjdG9yeSwgYW5kIGBybVN5bmMo4oCmLCB7IHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAvLyBmb3JjZTogdHJ1ZSB9KWAgKnNpbGVudGx5IG5vLW9wcyogb24gYSBzeW1saW5rIHdob3NlIHRhcmdldCBpcyBhbHJlYWR5XG4gICAgLy8gZ29uZSDigJQgYGZvcmNlYCBzd2FsbG93cyB0aGUgRU5PRU5UIGl0cyBgcm1kaXJgIGdldHMuIFJlbW92aW5nIGEgc3RvcmVcbiAgICAvLyBkaXJlY3RvcnkgYmVmb3JlIGl0cyBsaW5rcyB0aGVyZWZvcmUgbGVmdCBkYW5nbGluZ1xuICAgIC8vIGBAaW1nL3NoYXJwLWRhcndpbi1hcm02NGAgZW50cmllcyBpbiB0aGUgYXNzZXQsIHdoaWNoIGlzIGEgbGF0ZW50IEVOT0VOVFxuICAgIC8vIGluIHdoYXRldmVyIG5leHQgZm9sbG93cyB0aGVtIChgc2hhcnBgIGRvZXMsIHdoZW4gaXQgbG9va3MgZm9yIGJpbmFyaWVzKS5cbiAgICBjb25zdCBzeW1saW5rczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBkaXJlY3Rvcmllczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYWxsRW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZSA9PT0gXCJzaGFycFwiKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhqb2luKHBhdGgsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgICAgIHNoYXJwQ2FuZGlkYXRlcy5wdXNoKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1NoYXJwQmluYXJ5UGFja2FnZShlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICBzeW1saW5rcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBkaXJlY3Rvcmllcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFJlbW92aW5nICR7c3ltbGlua3MubGVuZ3RofSBTaGFycCBiaW5hcnkgc3ltbGlua3MgYW5kICR7ZGlyZWN0b3JpZXMubGVuZ3RofSBkaXJlY3Rvcmllc2AsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBzeW1saW5rcykge1xuICAgICAgdW5saW5rU3luYyhwYXRoKTtcbiAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IFVubGlua2VkOiAke3BhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgcm1TeW5jKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IFJlbW92ZWQ6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpY2tTdGFnZWRTaGFycFBhY2thZ2UoXG4gICAgICBzaGFycENhbmRpZGF0ZXMsXG4gICAgICByZXNvbHZlTmV4dFNoYXJwKHByb2plY3REaXIpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYEBpbWcvc2hhcnAtPHBsYXRmb3JtPmAgYW5kIGBAaW1nL3NoYXJwLWxpYnZpcHMtPHBsYXRmb3JtPmBcbiAgICogdmVyc2lvbnMgdG8gaW5zdGFsbCBmb3IgYSBnaXZlbiBwbGF0Zm9ybS5cbiAgICpcbiAgICogVGhlc2UgbXVzdCBtYXRjaCB0aGUgYHNoYXJwYCBKUyB3cmFwcGVyIHRoYXQgb3V0cHV0IGZpbGUgdHJhY2luZyBzdGFnZWQ6XG4gICAqIGBzaGFycGAncyBgbGliL2xpYnZpcHMuanNgIGNvbXBhcmVzIHRoZSBiaW5hcnknc1xuICAgKiByZXBvcnRlZCBsaWJ2aXBzIHZlcnNpb24gYWdhaW5zdCBpdHMgb3duIGBtaW5pbXVtTGlidmlwc1ZlcnNpb25gIGFuZFxuICAgKiB0aHJvd3MgYXQgbG9hZCB3aGVuIHRoZXkgZGlzYWdyZWUuIGBzaGFycGAgcGlucyBib3RoIGluIGl0c1xuICAgKiBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgLCBzbyB0aGF0IG1hbmlmZXN0IGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0U2hhcnBCaW5hcnlQYWNrYWdlcyhcbiAgICBzaGFycFNvdXJjZTogc3RyaW5nLFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdIHtcbiAgICAvLyBPbmx5IGZvciBhIGJpbmFyeSB0aGUgc3RhZ2VkIGBzaGFycGAgZG9lcyBub3QgcGluLlxuICAgIGNvbnN0IGZhbGxiYWNrID0gW1xuICAgICAgeyBuYW1lOiBgc2hhcnAtbGlidmlwcy0ke3BsYXRmb3JtfWAsIHZlcnNpb246IFwiMS4yLjRcIiB9LFxuICAgICAgeyBuYW1lOiBgc2hhcnAtJHtwbGF0Zm9ybX1gLCB2ZXJzaW9uOiBcIjAuMzQuNVwiIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhqb2luKHNoYXJwU291cmNlLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKSxcbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbmFsRGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID1cbiAgICAgIG1hbmlmZXN0Lm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9O1xuXG4gICAgcmV0dXJuIGZhbGxiYWNrLm1hcCgocGtnKSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gb3B0aW9uYWxEZXBlbmRlbmNpZXNbYEBpbWcvJHtwa2cubmFtZX1gXTtcbiAgICAgIGlmICghdmVyc2lvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gc2hhcnBAJHttYW5pZmVzdC52ZXJzaW9ufSBkb2VzIG5vdCBwaW4gXCJAaW1nLyR7cGtnLm5hbWV9XCI7IGZhbGxpbmcgYmFjayB0byAke3BrZy52ZXJzaW9ufS5gLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcGtnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbmFtZTogcGtnLm5hbWUsIHZlcnNpb24gfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCAod2l0aCBjYWNoaW5nKSBhbmQgZXh0cmFjdCBTaGFycCdzIHBsYXRmb3JtLXNwZWNpZmljIGJpbmFyeVxuICAgKiBwYWNrYWdlcyBpbnRvIGBpbWdQYXRoYC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNoYXJwUGFja2FnZXMoXG4gICAgaW1nUGF0aDogc3RyaW5nLFxuICAgIHBhY2thZ2VzOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FjaGVEaXIgPSBqb2luKHRtcGRpcigpLCBcImNkay1uZXh0anMtc2hhcnAtY2FjaGVcIik7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIHBhY2thZ2VzKSB7XG4gICAgICBjb25zdCB0YXJnZXREaXIgPSBqb2luKGltZ1BhdGgsIHBrZy5uYW1lKTtcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AaW1nLyR7cGtnLm5hbWV9Ly0vJHtwa2cubmFtZX0tJHtwa2cudmVyc2lvbn0udGd6YDtcblxuICAgICAgLy8gQ3JlYXRlIGEgY29uc2lzdGVudCBmaWxlbmFtZSBiYXNlZCBvbiBwYWNrYWdlIG5hbWUgYW5kIHZlcnNpb25cbiAgICAgIGNvbnN0IGNhY2hlRmlsZU5hbWUgPSBgJHtwa2cubmFtZX0tJHtwa2cudmVyc2lvbn0udGd6YDtcbiAgICAgIGNvbnN0IGNhY2hlZEZpbGUgPSBqb2luKGNhY2hlRGlyLCBjYWNoZUZpbGVOYW1lKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQgcGFja2FnZSBjYWNoZWQ7IHJlLWRvd25sb2FkIGlmXG4gICAgICAvLyBhIHByZXZpb3VzIHJ1biBsZWZ0IGJlaGluZCBhIHRydW5jYXRlZC9jb3JydXB0IGRvd25sb2FkXG4gICAgICBpZiAoZXhpc3RzU3luYyhjYWNoZWRGaWxlKSAmJiB0aGlzLmlzQ2FjaGVkRmlsZVZhbGlkKGNhY2hlZEZpbGUpKSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFVzaW5nIGNhY2hlZCAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufSBmcm9tICR7Y2FjaGVkRmlsZX1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gRG93bmxvYWRpbmcgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0uLi5gKTtcblxuICAgICAgICAvLyBEb3dubG9hZCB0byBhIHByb2Nlc3MtdW5pcXVlIHRlbXAgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnksXG4gICAgICAgIC8vIHRoZW4gYXRvbWljYWxseSByZW5hbWUgaXQgb250byB0aGUgc2hhcmVkIGNhY2hlIHBhdGguIENvbmN1cnJlbnRcbiAgICAgICAgLy8gc3ludGggcHJvY2Vzc2VzIChlLmcuIFR1cmJvcmVwbyBydW5uaW5nIG11bHRpcGxlIGBjZGtgIGNvbW1hbmRzKVxuICAgICAgICAvLyBzaGFyZSB0aGlzIGNhY2hlIGRpciwgc28gd3JpdGluZyBkaXJlY3RseSB0byBgY2FjaGVkRmlsZWAgcmlza3NcbiAgICAgICAgLy8gYW5vdGhlciBwcm9jZXNzIGV4dHJhY3RpbmcgYSBoYWxmLXdyaXR0ZW4gZmlsZS4gUmVuYW1pbmcgd2l0aGluXG4gICAgICAgIC8vIHRoZSBzYW1lIGZpbGVzeXN0ZW0gaXMgYXRvbWljLCBzbyByZWFkZXJzIG9ubHkgZXZlciBzZWUgYVxuICAgICAgICAvLyBjb21wbGV0ZSBmaWxlLCB3aGljaGV2ZXIgcHJvY2VzcyB3aW5zIHRoZSByYWNlLlxuICAgICAgICBjb25zdCB0ZW1wRmlsZSA9IGpvaW4oXG4gICAgICAgICAgY2FjaGVEaXIsXG4gICAgICAgICAgYCR7Y2FjaGVGaWxlTmFtZX0uJHtwcm9jZXNzLnBpZH0tJHtyYW5kb21CeXRlcyg2KS50b1N0cmluZyhcImhleFwiKX0udG1wYCxcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyAtLWZhaWwgbWFrZXMgY3VybCBleGl0IG5vbi16ZXJvIG9uIEhUVFAgZXJyb3JzIGFuZCAtLXJldHJ5XG4gICAgICAgICAgLy8gaGFuZGxlcyB0cmFuc2llbnQgY29ubmVjdGlvbiBkcm9wcyBzbyBhIHBhcnRpYWwgdHJhbnNmZXJcbiAgICAgICAgICAvLyBpc24ndCBjYWNoZWQgYXMgdmFsaWQuXG4gICAgICAgICAgZXhlY0ZpbGVTeW5jKFxuICAgICAgICAgICAgXCJjdXJsXCIsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiLUxcIixcbiAgICAgICAgICAgICAgXCItLWZhaWxcIixcbiAgICAgICAgICAgICAgXCItLXJldHJ5XCIsXG4gICAgICAgICAgICAgIFwiM1wiLFxuICAgICAgICAgICAgICBcIi0tcmV0cnktZGVsYXlcIixcbiAgICAgICAgICAgICAgXCIxXCIsXG4gICAgICAgICAgICAgIFwiLW9cIixcbiAgICAgICAgICAgICAgdGVtcEZpbGUsXG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IHN0ZGlvOiBcInBpcGVcIiB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNDYWNoZWRGaWxlVmFsaWQodGVtcEZpbGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBEb3dubG9hZGVkIGZpbGUgZm9yICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IGlzIGVtcHR5IG9yIG1pc3Npbmc6ICR7dGVtcEZpbGV9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVuYW1lU3luYyh0ZW1wRmlsZSwgY2FjaGVkRmlsZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcm1TeW5jKHRlbXBGaWxlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gQ2FjaGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IHRvICR7Y2FjaGVkRmlsZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGV4ZWNGaWxlU3luYyhcbiAgICAgICAgXCJ0YXJcIixcbiAgICAgICAgW1wiLXh6ZlwiLCBjYWNoZWRGaWxlLCBcIi1DXCIsIHRhcmdldERpciwgXCItLXN0cmlwLWNvbXBvbmVudHM9MVwiXSxcbiAgICAgICAgeyBzdGRpbzogXCJwaXBlXCIgfSxcbiAgICAgICk7XG5cbiAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IEluc3RhbGxlZCAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCBhIGNhY2hlZCBTaGFycCBiaW5hcnkgYXJjaGl2ZSBpcyBub24tZW1wdHkuIEd1YXJkcyBhZ2FpbnN0XG4gICAqIGEgdHJ1bmNhdGVkL2NvcnJ1cHQgZG93bmxvYWQgKGUuZy4gZnJvbSBhIGRyb3BwZWQgY29ubmVjdGlvbikgYmVpbmdcbiAgICogcmV1c2VkIGFjcm9zcyBzeW50aCBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NhY2hlZEZpbGVWYWxpZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA+IDA7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hhdCB0cmF2ZWxzIHRvIHRoZSBhZGFwdGVyIGluIHtAbGluayBGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUn0sIGFuZCB3aGF0IGl0XG4gKiByZWNvcmRzIGJhY2sgYXMgYEFkYXB0ZXJNYW5pZmVzdC5mdW5jdGlvbkdyb3Vwc2AuXG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb25Hcm91cFNwZWNzKFxuICBncm91cHM6IE5leHRqc0Z1bmN0aW9uR3JvdXBSb3V0ZXNbXSxcbik6IEZ1bmN0aW9uR3JvdXBTcGVjW10ge1xuICByZXR1cm4gZ3JvdXBzLm1hcCgoeyBuYW1lLCByb3V0ZXMgfSkgPT4gKHsgbmFtZSwgcm91dGVzIH0pKTtcbn1cblxuLyoqIGBncm91cHNgIGluIGEgY2Fub25pY2FsIG9yZGVyLCBmb3IgY29tcGFyaW5nIHR3byBvZiB0aGVtLiAqL1xuZnVuY3Rpb24gc29ydGVkR3JvdXBTcGVjcyhcbiAgZ3JvdXBzOiByZWFkb25seSBGdW5jdGlvbkdyb3VwU3BlY1tdIHwgdW5kZWZpbmVkLFxuKTogRnVuY3Rpb25Hcm91cFNwZWNbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBncm91cHNcbiAgICA/Lm1hcCgoeyBuYW1lLCByb3V0ZXMgfSkgPT4gKHsgbmFtZSwgcm91dGVzOiBbLi4ucm91dGVzXS5zb3J0KCkgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IChhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDEpKTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBzdGFnZWQgYHNoYXJwYCBKUyB3cmFwcGVyIG91dCBvZiBldmVyeSBjb3B5IGZvdW5kIGluIHRoZSB0cmVlLlxuICpcbiAqIFVubGlrZSBhIHN0YW5kYWxvbmUgYnVpbGQgdGhlcmUgaXMgbm8gc2luZ2xlIGBub2RlX21vZHVsZXNgIHRvIGxvb2sgaW46IHRoZVxuICogdHJlZSBtaXJyb3JzIHJlcG8tcm9vdC1yZWxhdGl2ZSBwYXRocywgc28gdGhlIHNlYXJjaCBpcyBieSBkaXJlY3RvcnkgbmFtZS5cbiAqXG4gKiBBbiBhcHAgY2FuIGhhdmUgdHdvIGBzaGFycGAgY29waWVzIGF0IGRpZmZlcmVudCB2ZXJzaW9ucyAoaXRzIG93biwgaG9pc3RlZCxcbiAqIGFuZCBuZXh0J3MsIG5lc3RlZCB1bmRlciBgbmV4dC9ub2RlX21vZHVsZXNgKSwgYW5kIGV2ZXJ5IGJpbmFyeSBnb2VzIGludG8gdGhlXG4gKiBvbmUgcm9vdCBgQGltZ2AsIHNvIHRoZSBjb3B5IHBpbm5pbmcgdGhlbSBoYXMgdG8gYmUgdGhlIG9uZSBgbmV4dGAncyBpbWFnZVxuICogb3B0aW1pemVyIGxvYWRzOiBgbmV4dFNoYXJwYCwgd2hlbiB7QGxpbmsgcmVzb2x2ZU5leHRTaGFycH0gZm91bmQgaXQuIE90aGVyd2lzZVxuICogc2hvcnRlc3QgcGF0aCB3aW5zIGFzIHRoZSBjbG9zZXN0IHRvIGEgaG9pc3RlZCBpbnN0YWxsLCBzb3J0ZWQgZm9yXG4gKiBkZXRlcm1pbmlzbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tTdGFnZWRTaGFycFBhY2thZ2UoXG4gIGNhbmRpZGF0ZXM6IHN0cmluZ1tdLFxuICBuZXh0U2hhcnA/OiBzdHJpbmcsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB1c2VkID1cbiAgICBuZXh0U2hhcnAgJiZcbiAgICBjYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT5cbiAgICAgIG5leHRTaGFycC5zdGFydHNXaXRoKHJlYWxwYXRoU3luYyhjYW5kaWRhdGUpICsgc2VwKSxcbiAgICApO1xuICBpZiAodXNlZCkge1xuICAgIHJldHVybiB1c2VkO1xuICB9XG4gIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBNdWx0aXBsZSBzdGFnZWQgXCJzaGFycFwiIGNvcGllczsgdXNpbmcgJHtjYW5kaWRhdGVzWzBdfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlc1swXTtcbn1cblxuLyoqXG4gKiBUaGUgcmVhbCBwYXRoIG9mIHRoZSBgc2hhcnBgIGVudHJ5IHBvaW50IHRoZSBzdGFnZWQgYG5leHRgIHJlc29sdmVzIGZyb21cbiAqIGBwcm9qZWN0RGlyYCwgYHVuZGVmaW5lZGAgd2hlbiBlaXRoZXIgZG9lcyBub3QgcmVzb2x2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOZXh0U2hhcnAocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgYW5jaG9yIGZpbGUgbmVlZG4ndCBleGlzdDsgYGNyZWF0ZVJlcXVpcmVgIG9ubHkgcmVhZHMgaXRzIGRpcmVjdG9yeS5cbiAgICBjb25zdCBuZXh0UGFja2FnZSA9IGNyZWF0ZVJlcXVpcmUoXG4gICAgICBqb2luKHByb2plY3REaXIsIFwiY2RrLW5leHRqcy1uZXh0LXJlc29sdmVyLmNqc1wiKSxcbiAgICApLnJlc29sdmUoXCJuZXh0L3BhY2thZ2UuanNvblwiKTtcbiAgICByZXR1cm4gY3JlYXRlUmVxdWlyZShuZXh0UGFja2FnZSkucmVzb2x2ZShcInNoYXJwXCIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZW50cnkgYG5hbWVgIGluIGBwYXJlbnRQYXRoYCBpcyBhbiBgQGltZy9zaGFycC0qYCBwbGF0Zm9ybSBiaW5hcnlcbiAqIHBhY2thZ2UsIG9yIHBucG0ncyBzdG9yZSBlbnRyeSBmb3Igb25lLlxuICpcbiAqIFRoZSBuYW1lIGFsb25lIGlzIG5vdCBlbm91Z2ggdG8gZGVsZXRlIGEgZGlyZWN0b3J5IGJ5LiBBIHJvdXRlIHNlZ21lbnQgY2FsbGVkXG4gKiBgc2hhcnAtZWRnZXNgIHN0YWdlcyBgLm5leHQvc2VydmVyL2FwcC9zaGFycC1lZGdlcy9gLCBhbmQgcmVtb3ZpbmcgaXQgbGVmdCB0aGVcbiAqIG1hbmlmZXN0IGxpc3RpbmcgYW4gZW50cnlwb2ludCB0aGF0IGlzIG5vIGxvbmdlciBvbiBkaXNrIOKAlCBldmVyeSByZXF1ZXN0IHRvXG4gKiB0aGF0IHJvdXRlIDUwMGluZyB3aXRoIFwiQ291bGQgbm90IGxvYWQgdGhlIGVudHJ5cG9pbnRcIi4gTm9yIGlzIFwiYSBgc2hhcnAtYFxuICogcGFja2FnZVwiOiBgc2hhcnAtaWNvYCBhbmQgYHNoYXJwLXBoYXNoYCBhcmUgdW5yZWxhdGVkIGRlcGVuZGVuY2llcywgYW5kXG4gKiByZW1vdmluZyB0aGVtIGZhaWxlZCB0aGUgYXBwIGF0IHJ1bnRpbWUgd2l0aCBNT0RVTEVfTk9UX0ZPVU5ELiBTbyBib3RoIHRoZVxuICogc2NvcGUgYW5kIHRoZSBwbGFjZSBoYXZlIHRvIG1hdGNoOlxuICpcbiAqIC0gYG5vZGVfbW9kdWxlcy9AaW1nL3NoYXJwLeKApmAsIHdoZXJlIGV2ZXJ5IHBsYXRmb3JtIGJpbmFyeSBhY3R1YWxseSBsaXZlc1xuICogLSBgbm9kZV9tb2R1bGVzLy5wbnBtL0BpbWcrc2hhcnAt4oCmQDAuMzUuNGAsIHBucG0ncyBzdG9yZSwgd2hvc2UgZW50cmllcyBhcmVcbiAqICAgYWxzbyB3aGF0IHRoZSBgQGltZ2AgbGlua3MgcG9pbnQgYXQgKGBzaGFycC1saWJ2aXBzLeKApmAgbWF0Y2hlcyB0aGUgc2FtZSB3YXkpXG4gKlxuICogVGhlIGBub2RlX21vZHVsZXNgIHNlZ21lbnQgaXMgcmVxdWlyZWQgYXMgd2VsbCwgc28gYW4gYXBwIGRpcmVjdG9yeSB0aGF0XG4gKiBoYXBwZW5zIHRvIGJlIGNhbGxlZCBgQGltZ2Agb3IgYC5wbnBtYCBpcyBzdGlsbCBsZWZ0IGFsb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTaGFycEJpbmFyeVBhY2thZ2UoXG4gIHBhcmVudFBhdGg6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyZW50UGF0aC5zcGxpdChzZXApO1xuICBjb25zdCBwYXJlbnQgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgY29uc3Qgc2NvcGVkID1cbiAgICAocGFyZW50ID09PSBcIkBpbWdcIiAmJiBuYW1lLnN0YXJ0c1dpdGgoXCJzaGFycC1cIikpIHx8XG4gICAgKHBhcmVudCA9PT0gXCIucG5wbVwiICYmIG5hbWUuc3RhcnRzV2l0aChcIkBpbWcrc2hhcnAtXCIpKTtcbiAgcmV0dXJuIHNjb3BlZCAmJiBzZWdtZW50cy5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKTtcbn1cblxuLyoqXG4gKiBXaGVyZSB0aGUgdGFyZ2V0J3MgYEBpbWcvc2hhcnAtKmAgYmluYXJpZXMgZ286IGA8cm9vdD4vbm9kZV9tb2R1bGVzL0BpbWdgLlxuICpcbiAqIE5vdCBuZXh0IHRvIHRoZSBzdGFnZWQgYHNoYXJwYCBwYWNrYWdlLiBVbmRlciBwbnBtIHRoYXQgaXNcbiAqIGBub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAeC9ub2RlX21vZHVsZXMvQGltZ2AsIHdoaWNoIG9ubHkgdGhlIHN0b3JlIGNvcHkgb2ZcbiAqIGBzaGFycGAgcmVzb2x2ZXMgZnJvbTogYSBkZXJlZmVyZW5jZWQgbGluayB0byBgc2hhcnBgIChhIGNvcHkgYXRcbiAqIGBhcHAvbm9kZV9tb2R1bGVzL3NoYXJwYCwgc2F5KSBsb29rcyBmb3IgYEBpbWdgIGZyb20gaXRzIG93biBwYXRoIGFuZCB3YWxrc1xuICogdXAsIG5ldmVyIGludG8gdGhlIHN0b3JlLiBCb3RoIHRoZSBGdW5jdGlvbnMgemlwIChgemlwRGlyZWN0b3J5YCkgYW5kIHRoZVxuICogQ29udGFpbmVycyBgQ09QWWAga2VlcCB0aGUgbGlua3MsIHNvIGl0IGlzIHRoZSBzdG9yZSBjb3B5IHRoYXQgbG9hZHMsIGFuZCBpdHNcbiAqIHdhbGsgdXAgcmVhY2hlcyB0aGUgcm9vdCBgbm9kZV9tb2R1bGVzYCB0b28sIHNvIGl0IHNlcnZlcyBlaXRoZXIgbGF5b3V0LiBJdFxuICogaXMgYWxzbyB3aGVyZSBtYWluIGluc3RhbGxlZCB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcnBCaW5hcnlEaXIocm9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4ocm9vdCwgXCJub2RlX21vZHVsZXNcIiwgXCJAaW1nXCIpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGVudHJ5IHVuZGVyIGByb290YCwgbGlua3MgbGlzdGVkIGJ1dCBub3QgZm9sbG93ZWQuXG4gKlxuICogQW4gZXhwbGljaXQgd2FsayByYXRoZXIgdGhhbiBgcmVhZGRpclN5bmMoeyByZWN1cnNpdmU6IHRydWUgfSlgLCB3aGljaCBvblxuICogTm9kZSAyNCBkZXNjZW5kcyBpbnRvIHN5bWxpbmtlZCBkaXJlY3RvcmllcyBpdHNlbGYgYW5kIHNvIG5ldmVyIHJldHVybnMgb24gYVxuICogY3ljbGUg4oCUIHR3byB3b3Jrc3BhY2UgcGFja2FnZXMgdGhhdCBsaW5rIGVhY2ggb3RoZXIsIHdoaWNoIGlzIGhvdyBwbnBtIHdpcmVzIGFcbiAqIG1vbm9yZXBvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRyZWUocm9vdDogc3RyaW5nKTogRGlyZW50W10ge1xuICBjb25zdCBlbnRyaWVzOiBEaXJlbnRbXSA9IFtdO1xuICBjb25zdCBwZW5kaW5nID0gW3Jvb3RdO1xuICBmb3IgKGxldCBkaXIgPSBwZW5kaW5nLnBvcCgpOyBkaXIgIT09IHVuZGVmaW5lZDsgZGlyID0gcGVuZGluZy5wb3AoKSkge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBwZW5kaW5nLnB1c2goam9pbihkaXIsIGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmNvbnN0IEVMRl9NQUNISU5FUzogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHsgNjI6IFwieDY0XCIsIDE4MzogXCJhcm02NFwiIH07XG5jb25zdCBNQUNIX09fTUFHSUNTID0gW1xuICAweGZlZWRmYWNlLCAweGZlZWRmYWNmLCAweGNlZmFlZGZlLCAweGNmZmFlZGZlLCAweGNhZmViYWJlLFxuXTtcblxuLyoqXG4gKiBUaGUgcGxhdGZvcm0gYSBuYXRpdmUgYWRkb24gd2FzIGNvbXBpbGVkIGZvciwgcmVhZCBmcm9tIGl0cyBoZWFkZXI6XG4gKiBgbGludXgtPGFyY2g+YCwgYGRhcndpbmAgb3IgYHdpbjMyYCwgb3IgYHVuZGVmaW5lZGAgZm9yIGEgZmlsZSB0aGF0IGlzIG5vbmVcbiAqIG9mIHRob3NlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlQmluYXJ5UGxhdGZvcm0oZmlsZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIwKTtcbiAgY29uc3QgZmQgPSBvcGVuU3luYyhmaWxlLCBcInJcIik7XG4gIHRyeSB7XG4gICAgcmVhZFN5bmMoZmQsIGhlYWRlciwgMCwgaGVhZGVyLmxlbmd0aCwgMCk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xvc2VTeW5jKGZkKTtcbiAgfVxuICBjb25zdCBtYWdpYyA9IGhlYWRlci5yZWFkVUludDMyQkUoMCk7XG4gIGlmIChtYWdpYyA9PT0gMHg3ZjQ1NGM0Nikge1xuICAgIC8vIGVfbWFjaGluZSwgaW4gdGhlIGJ5dGUgb3JkZXIgRUlfREFUQSBuYW1lcyAoMiBpcyBiaWctZW5kaWFuKS5cbiAgICBjb25zdCBtYWNoaW5lID1cbiAgICAgIGhlYWRlcls1XSA9PT0gMiA/IGhlYWRlci5yZWFkVUludDE2QkUoMTgpIDogaGVhZGVyLnJlYWRVSW50MTZMRSgxOCk7XG4gICAgcmV0dXJuIGBsaW51eC0ke0VMRl9NQUNISU5FU1ttYWNoaW5lXSA/PyBgbWFjaGluZS0ke21hY2hpbmV9YH1gO1xuICB9XG4gIGlmIChNQUNIX09fTUFHSUNTLmluY2x1ZGVzKG1hZ2ljKSkge1xuICAgIHJldHVybiBcImRhcndpblwiO1xuICB9XG4gIGlmIChoZWFkZXIudG9TdHJpbmcoXCJsYXRpbjFcIiwgMCwgMikgPT09IFwiTVpcIikge1xuICAgIHJldHVybiBcIndpbjMyXCI7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgcGFja2FnZXMgdW5kZXIgYHJvb3RgIHRoYXQgaGF2ZSBgLm5vZGVgIGFkZG9ucyBidXQgbm9uZSBidWlsdCBmb3JcbiAqIGB0YXJnZXRgLCBzbyB0aGV5J2QgZmFpbCB0byBsb2FkIHRoZXJlLiBSZXR1cm5lZCBhcyBgcm9vdGAtcmVsYXRpdmUgcGF0aHMuXG4gKlxuICogQSBwYWNrYWdlIHdpdGggYWRkb25zIGZvciBzZXZlcmFsIHBsYXRmb3JtcyBpcyBmaW5lIGFzIGxvbmcgYXMgb25lIG9mIHRoZW1cbiAqIGlzIGB0YXJnZXRgOiBwYWNrYWdlcyBsaWtlIGBidWZmZXJ1dGlsYCBidW5kbGUgYSBgZGFyd2luYCBhbmQgYVxuICogYGxpbnV4LXg2NGAgYWRkb24gYW5kIGxvYWQgd2hpY2hldmVyIG1hdGNoZXMgdGhlIG1hY2hpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRm9yZWlnbk5hdGl2ZVBhY2thZ2VzKFxuICByb290OiBzdHJpbmcsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IG1hdGNoZXM6IGJvb2xlYW47IGZvcmVpZ246IGJvb2xlYW4gfT4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0VHJlZShyb290KSkge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIubm9kZVwiKSkgY29udGludWU7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBuYXRpdmVCaW5hcnlQbGF0Zm9ybShqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKTtcbiAgICBpZiAoIXBsYXRmb3JtKSBjb250aW51ZTtcbiAgICBjb25zdCBwa2cgPSBwYWNrYWdlRGlyT2Yocm9vdCwgZW50cnkucGFyZW50UGF0aCk7XG4gICAgY29uc3Qgc2VlbiA9IHBhY2thZ2VzLmdldChwa2cpID8/IHsgbWF0Y2hlczogZmFsc2UsIGZvcmVpZ246IGZhbHNlIH07XG4gICAgaWYgKHBsYXRmb3JtID09PSB0YXJnZXQpIHtcbiAgICAgIHNlZW4ubWF0Y2hlcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlZW4uZm9yZWlnbiA9IHRydWU7XG4gICAgfVxuICAgIHBhY2thZ2VzLnNldChwa2csIHNlZW4pO1xuICB9XG4gIHJldHVybiBbLi4ucGFja2FnZXNdXG4gICAgLmZpbHRlcigoWywgc2Vlbl0pID0+IHNlZW4uZm9yZWlnbiAmJiAhc2Vlbi5tYXRjaGVzKVxuICAgIC5tYXAoKFtwa2ddKSA9PiByZWxhdGl2ZShyb290LCBwa2cpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKiBUaGUgbmVhcmVzdCBkaXJlY3RvcnkgZnJvbSBgZGlyYCB1cCB0byBgcm9vdGAgd2l0aCBhIGBwYWNrYWdlLmpzb25gLiAqL1xuZnVuY3Rpb24gcGFja2FnZURpck9mKHJvb3Q6IHN0cmluZywgZGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBmb3IgKFxuICAgIGxldCBjdXJyZW50ID0gZGlyO1xuICAgIGN1cnJlbnQuc3RhcnRzV2l0aChyb290KTtcbiAgICBjdXJyZW50ID0gZGlybmFtZShjdXJyZW50KVxuICApIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGN1cnJlbnQsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSByb290KSBicmVhaztcbiAgfVxuICByZXR1cm4gZGlyO1xufVxuXG4vKipcbiAqIFdyaXRlIHtAbGluayBQVUJMSUNfRklMRVNfRklMRV9OQU1FfSBpbnRvIGEgZGVwbG95bWVudCByb290J3MgcnVudGltZVxuICogZGlyZWN0b3J5OiBldmVyeSBmaWxlIHVuZGVyIGBwdWJsaWNEaXJgLCBsaXN0ZWQgdGhlIHdheSB0aGUgcnVudGltZSB3b3VsZFxuICogbGlzdCBpdCBvZmYgZGlzayAoYHJlYWRQdWJsaWNGaWxlc2A6IHN5bWxpbmtzIGZvbGxvd2VkLCBgL2Atc2VwYXJhdGVkLFxuICogc29ydGVkKS4gQW4gYXBwIHdpdGhvdXQgYHB1YmxpYy9gIGdldHMgYFtdYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUHVibGljRmlsZUxpc3QocnVudGltZURpcjogc3RyaW5nLCBwdWJsaWNEaXI6IHN0cmluZykge1xuICB3cml0ZUZpbGVTeW5jKFxuICAgIGpvaW4ocnVudGltZURpciwgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRSksXG4gICAgSlNPTi5zdHJpbmdpZnkocmVhZFB1YmxpY0ZpbGVzKHB1YmxpY0RpcikpLFxuICApO1xufVxuXG4vKipcbiAqIFRvdGFsIGJ5dGVzIG9mIGEgdHJlZSBhcyBpdHMgZGVwbG95bWVudCB6aXAgc3RvcmVzIGl0LiBgemlwRGlyZWN0b3J5YCBrZWVwc1xuICogbGlua3MgYXMgbGlua3MsIHNvIGVhY2ggY291bnRzIGFzIGl0cyB0YXJnZXQgcGF0aCwgbm90IGFzIHRoZSB0YXJnZXQsIHdoaWNoXG4gKiBpcyB3YWxrZWQgYXQgaXRzIG93biBwYXRoIGFueXdheSAoZXZlcnkgbGluayBpbiBhIHN0YWdlZCByb290IHBvaW50cyBpbnNpZGVcbiAqIGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlZFNpemUocm9vdDogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0VHJlZShyb290KSkge1xuICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYnl0ZXMgKz0gbHN0YXRTeW5jKGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpLnNpemU7XG4gICAgfVxuICB9XG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBgY2h1bmtgIHdpdGggYHBhdGNoYCBwcmVwZW5kZWQgYmV0d2VlbiBgUEFUQ0hfRkVUQ0hfTUFSS0VSYCBhbmRcbiAqIGBQQVRDSF9GRVRDSF9FTkRfTUFSS0VSYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBhbHJlYWR5IGNhcnJpZXMgdGhpcyBleGFjdFxuICogcGF0Y2guXG4gKlxuICogVGhlIG9wZW5pbmcgbWFya2VyIGNhcnJpZXMgYSBoYXNoIG9mIHRoZSBwYXRjaCwgc28gYSBjaHVuayBwYXRjaGVkIGJ5IGFcbiAqIGNkay1uZXh0anMgd2hvc2UgYHBhdGNoLWZldGNoLmpzYCBkaWZmZXJzIChhbiB1cGdyYWRlLCBvdmVyIGEgYC5uZXh0YCByZXVzZWRcbiAqIHdpdGggYHNraXBCdWlsZDogdHJ1ZWApIGlzIG5vdCBtaXN0YWtlbiBmb3IgY3VycmVudDogdGhlIG9sZCBwYXRjaCBpcyBjdXQgb2ZmXG4gKiBhdCBpdHMgZW5kIG1hcmtlciBhbmQgdGhpcyBvbmUgcHV0IGluIGl0cyBwbGFjZSwgcmF0aGVyIHRoYW4gdGhlIG9sZCBvbmVcbiAqIHNoaXBwaW5nIG9yIGJvdGggc3RhY2tpbmcgdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaENsaWVudENodW5rKFxuICBjaHVuazogc3RyaW5nLFxuICBwYXRjaDogc3RyaW5nLFxuICBjaHVua1BhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShwYXRjaCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDE2KTtcbiAgY29uc3Qgb3BlbiA9IGAke1BBVENIX0ZFVENIX01BUktFUn0gJHtoYXNofSAqL2A7XG4gIGlmIChjaHVuay5zdGFydHNXaXRoKGAke29wZW59XFxuYCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCBvcmlnaW5hbCA9IGNodW5rO1xuICBpZiAoY2h1bmsuc3RhcnRzV2l0aChQQVRDSF9GRVRDSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgZW5kID0gY2h1bmsuaW5kZXhPZihgXFxuJHtQQVRDSF9GRVRDSF9FTkRfTUFSS0VSfVxcbmApO1xuICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAvLyBPbmx5IGEgcHJlLXJlbGVhc2UgY2RrLW5leHRqcyB3cm90ZSB0aGUgbWFya2VyIHdpdGhvdXQgYW4gZW5kLCBhbmRcbiAgICAgIC8vIHdoZXJlIGl0cyBwYXRjaCBzdG9wcyBjYW5ub3QgYmUgdG9sZCBmcm9tIHRoZSBjaHVuaydzIG93biBjb2RlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSAke2NodW5rUGF0aH0gY2FycmllcyBhIGNkay1uZXh0anMgZmV0Y2ggcGF0Y2ggdGhpcyBgICtcbiAgICAgICAgICBgdmVyc2lvbiBjYW5ub3QgcmVwbGFjZS4gUmUtcnVuIFxcYG5leHQgYnVpbGRcXGAgdG8gcmVnZW5lcmF0ZSBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgb3JpZ2luYWwgPSBjaHVuay5zbGljZShlbmQgKyBQQVRDSF9GRVRDSF9FTkRfTUFSS0VSLmxlbmd0aCArIDIpO1xuICB9XG4gIHJldHVybiBgJHtvcGVufVxcbiR7cGF0Y2h9XFxuJHtQQVRDSF9GRVRDSF9FTkRfTUFSS0VSfVxcbiR7b3JpZ2luYWx9YDtcbn1cbiJdfQ==
973
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBOEpBLHdEQUtDO0FBdzJCRCx3REFtQkM7QUFNRCw0Q0FVQztBQXFCRCxvREFVQztBQWNELHdDQUVDO0FBVUQsNEJBWUM7QUFZRCxvREFzQkM7QUFVRCw4REFzQkM7QUF1QkQsa0RBS0M7QUFRRCxnQ0FRQztBQWFELDRDQXdCQzs7QUF0d0NELDJEQUE0RDtBQUM1RCw2Q0FBc0Q7QUFDdEQscUNBaUJpQjtBQUNqQiw2Q0FBNEM7QUFDNUMscUNBQWlDO0FBQ2pDLHlDQUF5RDtBQUN6RCwyQ0FBb0Q7QUFDcEQsNkNBQTBDO0FBRTFDLDJDQUF1QztBQUN2Qyw2REFBNkQ7QUFDN0Qsa0RBQTZCO0FBQzdCLGdFQUtvQztBQUNwQyw4REFBMkQ7QUFDM0QsNENBQXNEO0FBRXRELGtEQU82QjtBQUM3QiwwREFBMEQ7QUFDMUQsa0RBSTRCO0FBQzVCLHNFQUFpRTtBQUNqRSxnRUFHbUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXREOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLDJCQUEyQixDQUFDO0FBQ3ZELDJFQUEyRTtBQUMzRSxNQUFNLHNCQUFzQixHQUFHLGtDQUFrQyxDQUFDO0FBRWxFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLHlCQUF5QixDQUFDLENBQUM7QUE4RWxEOzs7O0dBSUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxLQUF1QjtJQUM1RCxNQUFNLFdBQVcsR0FDZixLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsZ0JBQWdCO1FBQ2hELEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNyRCxPQUFPLENBQUMs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LElBQUksU0FBUyx5Q0FBeUM7Z0JBQ2pFLGlFQUFpRSxDQUNwRSxDQUFDO1FBQ0osQ0FBQztRQUNELFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssS0FBSyxLQUFLLHNCQUFzQixLQUFLLFFBQVEsRUFBRSxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjRmlsZVN5bmMsIGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7XG4gIGNsb3NlU3luYyxcbiAgRGlyZW50LFxuICBleGlzdHNTeW5jLFxuICBsc3RhdFN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgbWtkaXJTeW5jLFxuICBjcFN5bmMsXG4gIG9wZW5TeW5jLFxuICByZWFkU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgcmVhbHBhdGhTeW5jLFxuICBzdGF0U3luYyxcbiAgdW5saW5rU3luYyxcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgam9pbiBhcyBqb2luUG9zaXggfSBmcm9tIFwibm9kZTpwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0ZVTkNUSU9OX0dST1VQLFxuICBGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUixcbiAgRnVuY3Rpb25Hcm91cFNwZWMsXG4gIHZhbGlkYXRlRnVuY3Rpb25Hcm91cHMsXG59IGZyb20gXCIuLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgQ0RLX05FWFRKU19WRVJTSU9OIH0gZnJvbSBcIi4uL2Nkay1uZXh0anMtdmVyc2lvblwiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE5leHRqc0Jhc2VQcm9wcyB9IGZyb20gXCIuLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLWJhc2UtY29uc3RydWN0XCI7XG5pbXBvcnQge1xuICBBREFQVEVSX0RJUl9OQU1FLFxuICBBZGFwdGVyTWFuaWZlc3QsXG4gIE1BTklGRVNUX0ZJTEVfTkFNRSxcbiAgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRSxcbiAgUlVOVElNRV9ESVJfTkFNRSxcbiAgZ3JvdXBTdGFnaW5nRGlyTmFtZSxcbn0gZnJvbSBcIi4uL3J1bnRpbWUvbWFuaWZlc3RcIjtcbmltcG9ydCB7IHJlYWRQdWJsaWNGaWxlcyB9IGZyb20gXCIuLi9ydW50aW1lL3B1YmxpYy1maWxlc1wiO1xuaW1wb3J0IHtcbiAgYXNzZXRQcmVmaXhQYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcmVsYXRpdmVBc3NldFByZWZpeCxcbn0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuaW1wb3J0IHsgZGVwbG95bWVudEJ1aWxkSWQgfSBmcm9tIFwiLi4vdXRpbHMvZGVwbG95bWVudC1idWlsZC1pZFwiO1xuaW1wb3J0IHtcbiAgZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlLFxuICB0b05vZGVBcmNoaXRlY3R1cmUsXG59IGZyb20gXCIuLi91dGlscy9nZXQtYXJjaGl0ZWN0dXJlXCI7XG5cbi8qKlxuICogTGFtYmRhJ3MgaGFyZCBsaW1pdCBvbiB0aGUgdW56aXBwZWQgc2l6ZSBvZiBhIGZ1bmN0aW9uJ3MgY29kZSwgd2hpY2hcbiAqIENsb3VkRm9ybWF0aW9uIG9ubHkgZW5mb3JjZXMgYXQgZGVwbG95IHRpbWUuIE1lYXN1cmVkIGF0IHN5bnRoIGluc3RlYWQsIHNvIHRoZVxuICogZXJyb3IgbmFtZXMgdGhlIGdyb3VwIGFuZCBhcnJpdmVzIGluIHNlY29uZHMgcmF0aGVyIHRoYW4gbWludXRlcy5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZ2V0dGluZ3N0YXJ0ZWQtbGltaXRzLmh0bWxcbiAqL1xuY29uc3QgTEFNQkRBX1VOWklQUEVEX0xJTUlUX0JZVEVTID0gMjUwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogT3BlbnMgdGhlIHBhdGNoIGBwYXRjaEZldGNoSW5DbGllbnRKc2AgcHJlcGVuZHMgdG8gYSBjbGllbnQgY2h1bmssIGZvbGxvd2VkIGJ5XG4gKiBhIGhhc2ggb2YgdGhlIHBhdGNoIGl0c2VsZiwgc28gYSBzZWNvbmQgc3ludGggb3ZlciB0aGUgc2FtZSBgLm5leHRgIGlzIGEgbm8tb3BcbiAqIHdoaWxlIG9uZSBieSBhIGNkay1uZXh0anMgd2l0aCBhIGRpZmZlcmVudCBgcGF0Y2gtZmV0Y2guanNgIHJlcGxhY2VzIGl0LlxuICovXG5jb25zdCBQQVRDSF9GRVRDSF9NQVJLRVIgPSBcIi8qIGNkay1uZXh0anM6cGF0Y2gtZmV0Y2hcIjtcbi8qKiBDbG9zZXMgdGhlIHByZXBlbmRlZCBwYXRjaDsgdGhlIGNodW5rJ3Mgb3duIGNvbnRlbnQgc3RhcnRzIGFmdGVyIGl0LiAqL1xuY29uc3QgUEFUQ0hfRkVUQ0hfRU5EX01BUktFUiA9IFwiLyogY2RrLW5leHRqczpwYXRjaC1mZXRjaDplbmQgKi9cIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6bmV4dGpzLWJ1aWxkXCIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kOiBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl07XG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIE5leHQuanMgYXBwbGljYXRpb24gaXMgbG9jYXRlZCBmb3IgbG9jYWwgYnVpbGRzLlxuICAgKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBwYWNrYWdlLmpzb24gYW5kIE5leHQuanMgYXBwbGljYXRpb24gZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBidWlsZERpcmVjdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnNraXBCdWlsZH1cbiAgICovXG4gIHJlYWRvbmx5IHNraXBCdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSb3V0ZSBncm91cHMgdG8gcGFja2FnZSBpbnRvIHNlcGFyYXRlIExhbWJkYSBmdW5jdGlvbnMuIE9ubHkgdGhlIHR3b1xuICAgKiBGdW5jdGlvbnMgYE5leHRqc1R5cGVgcyBwYXNzIHRoaXM7IHNlZSBgTmV4dGpzRnVuY3Rpb25Hcm91cGAuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Z1bmN0aW9uR3JvdXBSb3V0ZXNbXTtcbiAgLyoqXG4gICAqIExhbWJkYSBhcmNoaXRlY3R1cmUgdGhlIEZ1bmN0aW9ucyB0eXBlcyBkZXBsb3ksIHdoaWNoIGRlY2lkZXMgdGhlIGBzaGFycGBcbiAgICogYmluYXJpZXMgc3RhZ2VkIGludG8gdGhlIGRlcGxveW1lbnQgcm9vdHMuIElnbm9yZWQgYnkgdGhlIENvbnRhaW5lcnNcbiAgICogdHlwZXMsIHdob3NlIGltYWdlIGlzIGJ1aWx0IGZvciB0aGUgc3ludGggbWFjaGluZS5cbiAgICogQGRlZmF1bHQgLSB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgc3ludGhcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBhIGZ1bmN0aW9uIGdyb3VwIGBOZXh0anNCdWlsZGAgbmVlZHM6IHdoaWNoIHJvdXRlcyBpdCBvd25zLiBUaGVcbiAqIHBlci1ncm91cCBMYW1iZGEgYG92ZXJyaWRlc2AgYXJlIGBOZXh0anNGdW5jdGlvbnNgJyBidXNpbmVzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogT25lIHN0YWdlZCBkZXBsb3ltZW50IHJvb3QsIGFuZCB0aGUgZnVuY3Rpb24gZ3JvdXAgaXQgYmVsb25ncyB0by4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGVwbG95bWVudFJvb3Qge1xuICAvKipcbiAgICogR3JvdXAgbmFtZSwgYGRlZmF1bHRgIGZvciB0aGUgaW1wbGljaXQgZ3JvdXAgdGhhdCBvd25zIGV2ZXJ5IHVuYXNzaWduZWRcbiAgICogcm91dGUuIFRoZSBvbmx5IGVudHJ5IGlzIGBkZWZhdWx0YCB3aGVuIGBmdW5jdGlvbkdyb3Vwc2AgaXMgbm90IHVzZWQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IHJvb3Q6IHRoZSBMYW1iZGEgemlwIGFzc2V0J3Mgc291cmNlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSb3V0ZSB0ZW1wbGF0ZXMgdGhpcyByb290J3MgcGFja2FnZSBob2xkcywgYXMgdGhlIGFkYXB0ZXIgYXNzaWduZWQgdGhlbS5cbiAgICogRW1wdHkgaXMgbGVnYWw6IHRoZSBkZWZhdWx0IGdyb3VwIHN0aWxsIHNlcnZlcyBgL19uZXh0L2ltYWdlYCwgdGhlIHN0YXRpY1xuICAgKiBmaWxlcyB0aGUgcnVudGltZSByZWFkcyBvZmYgZGlzaywgYW5kIGFueXRoaW5nIHRoZSBjYXRjaC1hbGwgcm91dGVzIHRvIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPbmUgYmVoYXZpb3IgdGhhdCByb3V0ZXMgYSBmdW5jdGlvbiBncm91cCdzIFVSTHMgdG8gaXQsIGFzIHRoZSBhZGFwdGVyXG4gKiBjaGVja2VkIHRoZW0gYWdhaW5zdCB3aGF0IGVhY2ggZ3JvdXAgd2FzIHBhY2thZ2VkIHdpdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yIHtcbiAgLyoqIFRoZSBmdW5jdGlvbiBncm91cCB0aGUgYmVoYXZpb3Igcm91dGVzIHRvLiAqL1xuICByZWFkb25seSBncm91cDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGdyb3VwIHBhdHRlcm4gaXQgY2FtZSBmcm9tIChgL2Jsb2cvKipgKSwgb3IgdGhlIHBhcmVudCBvZiBhbiBvcHRpb25hbFxuICAgKiBjYXRjaC1hbGwgYSBzdWJ0cmVlIHBhdHRlcm4gbW92ZWQgaW50byB0aGUgZ3JvdXAgKGAvYmxvZ2AgZm9yXG4gICAqIGAvYmxvZy9bWy4uLnNsdWddXWApLCB3aGljaCB0aGF0IHN1YnRyZWUncyBiZWhhdmlvciBkb2VzIG5vdCBtYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIGJlZm9yZSBiYXNlUGF0aCBhbmQgd2l0aG91dCBhIGxlYWRpbmcgc2xhc2g6XG4gICAqIGBibG9nLypgLCBgcHJpY2luZ2AsIGBwcmljaW5nL2AgZm9yIGEgYHRyYWlsaW5nU2xhc2hgIGFwcCwgYW5kXG4gICAqIGBfbmV4dC9kYXRhLzxidWlsZElkPi9ibG9nLypgIGZvciBhIGdyb3VwIG93bmluZyBhIFBhZ2VzIFJvdXRlciBwYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgZXZlcnkgZGVwbG95bWVudCByb290IGlzIHN0YWdlZCBmb3I6IHRoZSBidWlsZCdzIGBhcmNoaXRlY3R1cmVgLCBlbHNlXG4gKiB0aGUgc3ludGggbWFjaGluZSdzLiBDb250YWluZXJzIGlnbm9yZSBpdDogRG9ja2VyIGJ1aWxkcyB0aGVpciBpbWFnZVxuICogbmF0aXZlbHksIHNvIGl0IGNhbiBvbmx5IG1hdGNoIHRoZSBzeW50aCBtYWNoaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95bWVudEFyY2hpdGVjdHVyZShwcm9wczogTmV4dGpzQnVpbGRQcm9wcyk6IEFyY2hpdGVjdHVyZSB7XG4gIGNvbnN0IGlzRnVuY3Rpb25zID1cbiAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgfHxcbiAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUztcbiAgcmV0dXJuIChpc0Z1bmN0aW9ucyAmJiBwcm9wcy5hcmNoaXRlY3R1cmUpIHx8IGdldExhbWJkYUFyY2hpdGVjdHVyZSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1YmxpY0RpckVudHJ5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBpc0RpcmVjdG9yeTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgTmV4dC5qcyBhc3NldHMuXG4gKiBAbGluayBodHRwczovL25leHRqcy5vcmcvZG9jcy9wYWdlcy9hcGktcmVmZXJlbmNlL25leHQtY29uZmlnLWpzL291dHB1dFxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQnVpbGQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVW5pcXVlIGlkIGZvciB0aGlzIGRlcGxveW1lbnQuIFVzZWQgdG8gcGFydGl0aW9uIGNhY2hlIHN0b3JhZ2UgYW5kIGFzXG4gICAqIG1ldGFkYXRhIGZvciBzdGF0aWMgYXNzZXRzIGluIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogTmV4dC5qcydzIGJ1aWxkIElELCBzdWZmaXhlZCB3aXRoIHRoZSBhcHAncyBgZGVwbG95bWVudElkYCB3aGVuIGl0IHNldHNcbiAgICogb25lLiBUaGUgYnVpbGQgSUQgYWxvbmUgaXMgbm90IHVuaXF1ZSBwZXIgZGVwbG95bWVudDogc2V0dGluZ1xuICAgKiBgZGVwbG95bWVudElkYCAob3IgYnVpbGRpbmcgd2l0aCBgTkVYVF9ERVBMT1lNRU5UX0lEYCkgdHVybnMgb24gc2tld1xuICAgKiBwcm90ZWN0aW9uLCBhbmQgbmV4dC5qcyB0aGVuICpwaW5zKiB0aGUgYnVpbGQgSUQgdG8gdGhlIGNvbnN0YW50XG4gICAqIGBidWlsZC1UZmN0c1dYcGZmMmZLU2Ag4oCUIHNlZSBgZ2V0QnVpbGRJZGAgaW4gYG5leHQvZGlzdC9idWlsZC9pbmRleC5qc2AsXG4gICAqIHdoaWNoIGRvZXMgdGhhdCBkZWxpYmVyYXRlbHkgc28gdGhhdCB0b29saW5nIGRvaW5nXG4gICAqIGAucmVwbGFjZShlc2NhcGVkQnVpbGRJZCwg4oCmKWAgc3RpbGwgaGFzIHNvbWV0aGluZyB0byByZXBsYWNlLiBUd29cbiAgICogc3VjY2Vzc2l2ZSBkZXBsb3ltZW50cyBvZiBzdWNoIGFuIGFwcCB3b3VsZCBzaGFyZSBvbmUgY2FjaGUgcHJlZml4IGFuZCBvbmVcbiAgICogcmV2YWxpZGF0aW9uLXRhYmxlIHBhcnRpdGlvbiwgYW5kIHRoZSBuZXcgb25lIHdvdWxkIHJlYWQgdGhlIHByZXZpb3VzXG4gICAqIG9uZSdzIHByZXJlbmRlcnMuIEFwcGVuZGluZyB0aGUgZGVwbG95bWVudCBJRCByZXN0b3JlcyB0aGUgXCJvbmVcbiAgICogZGVwbG95bWVudCwgb25lIHBhcnRpdGlvblwiIGludmFyaWFudCB0aGF0IElEIGV4aXN0cyB0byBjYXJyeS5cbiAgICpcbiAgICogTm90aGluZyByb3V0ZXMgb24gdGhpcyB2YWx1ZSDigJQgdGhlIGAvX25leHQvZGF0YS88YnVpbGRJZD4v4oCmYCBVUkwgc3BhY2UgaXNcbiAgICogcm91dGVkIG9uIE5leHQuanMncyBvd24gYnVpbGQgSUQsIHdoaWNoIGlzIHdoYXQgdGhlIGFwcCdzIGNsaWVudCBidW5kbGVzXG4gICAqIGNhcnJ5IOKAlCBzbyBpdCBpcyBmcmVlIHRvIGJlIGxvbmdlciB0aGFuIG5leHQuanMncyBvd24uXG4gICAqL1xuICBidWlsZElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBpbml0IGNhY2hlIGRpcmVjdG9yeVxuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwLy5uZXh0L2Nkay1uZXh0anMtaW5pdC1jYWNoZVwiXG4gICAqL1xuICBpbml0Q2FjaGVEaXI6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gcHVibGljLiBVc2UgYnkgQ2xvdWRGcm9udC9BTEIgdG8gY3JlYXRlIGJlaGF2aW9ycy9ydWxlc1xuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwL3B1YmxpY1wiXG4gICAqL1xuICBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogVGhlIEphdmFTY3JpcHQgZmlsZSBOb2RlLmpzIHJ1bnMgdG8gc2VydmUgcmVxdWVzdHMsIHJlbGF0aXZlIHRvIHRoZVxuICAgKiBkZXBsb3ltZW50IHJvb3QuIGNkay1uZXh0anMncyBvd24gY29udGFpbmVyIHNoZWxsLCBub3QgYG5leHQgYnVpbGRgIG91dHB1dCxcbiAgICogc28gaXQgaXMgdGhlIHNhbWUgcGF0aCBmb3IgZXZlcnkgYXBwLlxuICAgKiBAZXhhbXBsZSBcImNkay1uZXh0anMtcnVudGltZS9zZXJ2ZXIubWpzXCJcbiAgICovXG4gIHJlbGF0aXZlUGF0aFRvRW50cnlwb2ludDogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgLm5leHQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTmV4dC5qcyBidWlsZCBhcnRpZmFjdHNcbiAgICovXG4gIGRvdE5leHRQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgTmV4dC5qcyBhcHAncyBvd24gYGJhc2VQYXRoYCDigJQgdGhlIFVSTCBwcmVmaXggaXQgZ2VuZXJhdGVzIGl0cyBsaW5rcyBhbmRcbiAgICogYXNzZXQgaHJlZnMgdW5kZXIg4oCUIGFzIHRoZSBhZGFwdGVyIG1hbmlmZXN0IHJlY29yZGVkIGl0LiBOb3JtYWxpemVkIHRvIGEgYmFyZSBwYXRoIHNlZ21lbnQsIGVtcHR5IHdoZW4gdGhlIGFwcCBzZXRzIG5vbmUuIEV4cG9zZWQgc29cbiAgICogcm9vdCBjb25zdHJ1Y3RzIGNhbiByZWNvbmNpbGUgaXQgd2l0aCB0aGUgQ0RLIGBiYXNlUGF0aGAgcHJvcCwgd2hpY2ggaXMgYVxuICAgKiBkaXN0aW5jdCB0aGluZzsgc2VlIGByZXNvbHZlQmFzZVBhdGhgLlxuICAgKi9cbiAgbmV4dENvbmZpZ0Jhc2VQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgTmV4dC5qcyBhcHAncyBvd24gYGFzc2V0UHJlZml4YCwgYXMgYSBwYXRoIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBub1xuICAgKiB0cmFpbGluZyBvbmUsIGVtcHR5IHdoZW4gdGhlIGFwcCBzZXRzIG5vbmUgb3Igc2V0cyBhbiBhYnNvbHV0ZSBVUkwgKHdoaWNoXG4gICAqIG5hbWVzIGFuIG9yaWdpbiBjZGstbmV4dGpzIGRvZXMgbm90IHNlcnZlKS5cbiAgICpcbiAgICogRXhwb3NlZCBiZWNhdXNlIGl0IGlzIHRoZSBzaGFwZSBvZiBgYXNzZXRQcmVmaXhgIHRoZSByZWdpb25hbFxuICAgKiBgTmV4dGpzVHlwZWBzIGNhbm5vdCBzZXJ2ZSDigJQgc2VlIGB3YXJuVW5zZXJ2ZWRBc3NldFByZWZpeGAuIFdoYXQgdGhlXG4gICAqIGRpc3RyaWJ1dGlvbiBoYXMgdG8gYW5zd2VyIG9uIGlzIHtAbGluayBuZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRofSwgd2hpY2hcbiAgICogYWxzbyBjb3ZlcnMgdGhlIHBhdGggYW4gYWJzb2x1dGUgcHJlZml4IGNhcnJpZXMuXG4gICAqL1xuICBuZXh0Q29uZmlnQXNzZXRQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHBvcnRpb24gb2YgdGhlIGFwcCdzIGBhc3NldFByZWZpeGAsIHdoaWNoZXZlciBmb3JtIGl0IHRha2VzOiBcIi9jZG5cIlxuICAgKiBmb3IgYm90aCBgYXNzZXRQcmVmaXg6IFwiL2NkblwiYCBhbmQgYGFzc2V0UHJlZml4OlxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiYCwgZW1wdHkgd2hlbiB0aGVyZSBpcyBubyBwYXRoIHRvIGFuc3dlciBvbi5cbiAgICpcbiAgICogRXhwb3NlZCBiZWNhdXNlIGl0IGlzIGEgVVJMIHByZWZpeCB0aGUgZGlzdHJpYnV0aW9uIGhhcyB0byBhbnN3ZXIgb246IE5leHQuanNcbiAgICogZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmAgZm9yIGV2ZXJ5IGJ1bmRsZSBhbmQgY29tcGlsZXMgYSByZXdyaXRlXG4gICAqIHRoYXQgc2VydmVzIHRob3NlIFVSTHMnIHBhdGhzIGl0c2VsZiwgd2hpbGUgdGhlIG9iamVjdHMgbGl2ZSBpbiBTMyB1bmRlclxuICAgKiBgPGJhc2VQYXRoPi9fbmV4dC9zdGF0aWMvLi4uYC5cbiAgICovXG4gIG5leHRDb25maWdBc3NldFByZWZpeFBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEV2ZXJ5IHN0YWdlZCBkZXBsb3ltZW50IHJvb3QsIG9uZSBwZXIgZnVuY3Rpb24gZ3JvdXAsIGBkZWZhdWx0YCBmaXJzdDogdGhlXG4gICAqIHN0YWdlZCB1bmlvbiBvZiBlYWNoIGdyb3VwJ3Mgc2hpcHBlZCBvdXRwdXRzIGFuZCB0aGVpciB0cmFjZWQgYXNzZXRzLFxuICAgKiB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyJ3MgYG9uQnVpbGRDb21wbGV0ZWAuIEV4YWN0bHkgb25lIGVudHJ5IChuYW1lZFxuICAgKiBgZGVmYXVsdGAsIGF0IGAubmV4dC9jZGstbmV4dGpzLWFkYXB0ZXIvYXBwYCkgdW5sZXNzIGBmdW5jdGlvbkdyb3Vwc2BcbiAgICogc3BsaXRzIHRoZSBhcHAuIFRoZSBMYW1iZGEgemlwIGFzc2V0czsgQ29udGFpbmVycyBgQ09QWWAgdGhlIGBkZWZhdWx0YCBvbmUuXG4gICAqL1xuICBkZXBsb3ltZW50Um9vdHM6IE5leHRqc0RlcGxveW1lbnRSb290W107XG4gIC8qKlxuICAgKiBXaGF0IHJvdXRlcyBlYWNoIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwJ3MgVVJMcyB0byBpdCwgbW9zdCBzcGVjaWZpY1xuICAgKiBmaXJzdCDigJQgdGhlIG9yZGVyIENsb3VkRnJvbnQgaGFzIHRvIHNlZSB0aGVtIGluLCBzaW5jZSBpdCBzdG9wcyBhdCB0aGVcbiAgICogZmlyc3QgbWF0Y2guIEVtcHR5IHVubGVzcyBgZnVuY3Rpb25Hcm91cHNgIHNwbGl0cyB0aGUgYXBwLlxuICAgKi9cbiAgZnVuY3Rpb25Hcm91cEJlaGF2aW9yczogTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yW107XG4gIC8qKlxuICAgKiBGcm9tIHRoZSBkZXBsb3ltZW50IHJvb3QgdG8gdGhlIE5leHQuanMgcHJvamVjdCBkaXIsIFBPU0lYLCBgXCJcImAgd2hlblxuICAgKiB0aGUgYXBwIGlzIGF0IHRoZSByZXBvIHJvb3QuIFRoZSBydW50aW1lIGBjaGRpcmBzIGhlcmU7IENvbnRhaW5lcnMgcGFzcyBpdCB0b1xuICAgKiB0aGVpciBEb2NrZXJmaWxlIHNvIGAubmV4dC9zdGF0aWNgIGFuZCBgcHVibGljYCBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLlxuICAgKiBAc2VlIEFkYXB0ZXJNYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXJcbiAgICovXG4gIHJlbGF0aXZlUHJvamVjdERpcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFyY2hpdGVjdHVyZSBldmVyeSBkZXBsb3ltZW50IHJvb3QncyBuYXRpdmUgZGVwZW5kZW5jaWVzIChgc2hhcnBgKVxuICAgKiB3ZXJlIHN0YWdlZCBmb3IuIFRoZSBMYW1iZGFzIGRlcGxveWluZyB0aGVtIG11c3QgdXNlIHRoZSBzYW1lIG9uZS5cbiAgICovXG4gIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0J1aWxkUHJvcHM7XG4gIHByaXZhdGUgYnVpbGRDb21tYW5kOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0J1aWxkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmRvdE5leHRQYXRoID0gam9pbihwcm9wcy5idWlsZERpcmVjdG9yeSwgXCIubmV4dFwiKTtcblxuICAgIHRoaXMuYnVpbGRDb21tYW5kID0gcHJvcHMuYnVpbGRDb21tYW5kIHx8IFwibnBtIHJ1biBidWlsZFwiO1xuXG4gICAgLy8gU2V0IGluaXQgY2FjaGUgZGlyZWN0b3J5IHBhdGhcbiAgICB0aGlzLmluaXRDYWNoZURpciA9IGpvaW4oXG4gICAgICBwcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgIFwiLm5leHRcIixcbiAgICAgIFwiY2RrLW5leHRqcy1pbml0LWNhY2hlXCIsXG4gICAgKTtcblxuICAgIC8vIEJlZm9yZSB0aGUgYnVpbGQsIG5vdCBhZnRlciBpdDogdGhlIGJ1aWxkIGlzIG1pbnV0ZXMgbG9uZywgYW5kIHRoZSBlbnYgdmFyXG4gICAgLy8gaXQgcGFzc2VzIGdyb3VwcyB0aHJvdWdoIGlzIG9ubHkgc2V0IGZvciBhIG5vbi1lbXB0eSBhcnJheSDigJQgc28gYW4gaW52YWxpZFxuICAgIC8vIGBmdW5jdGlvbkdyb3Vwc2AgKGFuIGVtcHR5IGFycmF5LCBhIHJlc2VydmVkIG5hbWUsIGEgZ3JvdXAgb3duaW5nIG5vXG4gICAgLy8gcm91dGVzKSB3b3VsZCBvdGhlcndpc2UgYmUgcmVwb3J0ZWQgYXMgXCJ0aGUgYnVpbGQgc3RhZ2VkIHRoZSB3cm9uZ1xuICAgIC8vIGdyb3Vwc1wiLCBhZnRlciBwYXlpbmcgZm9yIHRoZSBidWlsZCwgaW5zdGVhZCBvZiBhcyB0aGUgcHJvcCBlcnJvciBpdCBpcy5cbiAgICBpZiAocHJvcHMuZnVuY3Rpb25Hcm91cHMpIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Hcm91cHMocHJvcHMuZnVuY3Rpb25Hcm91cHMgYXMgRnVuY3Rpb25Hcm91cFNwZWNbXSk7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBsb2NhbCBidWlsZCBwcm9jZXNzXG4gICAgaWYgKHByb3BzLnNraXBCdWlsZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5ydW5OZXh0QnVpbGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gU2tpcHBpbmc6ICR7dGhpcy5idWlsZENvbW1hbmR9YCk7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIGJlZm9yZSBhbnl0aGluZyBlbHNlIHJlYWRzIGAubmV4dGA6IGEgbWlzc2luZyBtYW5pZmVzdCBpcyB0aGUgb25lXG4gICAgLy8gZXJyb3IgdGhhdCBuYW1lcyB0aGUgY2F1c2UgKG5vIGJ1aWxkLCBvciBvbmUgd2l0aG91dCB0aGUgYWRhcHRlciksIHdoZXJlXG4gICAgLy8gZXZlcnkgbGF0ZXIgcmVhZCBmYWlscyB3aXRoIGEgYmFyZSBFTk9FTlQuXG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlYWRBZGFwdGVyTWFuaWZlc3QoKTtcblxuICAgIC8vIERlbGliZXJhdGVseSBvdXRzaWRlIHRoZSBgc2tpcEJ1aWxkYCBnYXRlLiBUaGUgcGF0Y2ggaXMgYSBwcm9wZXJ0eSBvZlxuICAgIC8vICpzZXJ2aW5nKiB0aHJvdWdoIENsb3VkRnJvbnQsIG5vdCBvZiB3aG8gcmFuIGBuZXh0IGJ1aWxkYDogd2l0aG91dCBpdFxuICAgIC8vIGV2ZXJ5IFBPU1Qgd2l0aCBhIGJvZHkgaXMgcmVqZWN0ZWQgYnkgdGhlIExhbWJkYSBGdW5jdGlvbiBVUkwgYmVmb3JlIGl0XG4gICAgLy8gcmVhY2hlcyB0aGUgYXBwIChzZWUgYHBhdGNoRmV0Y2hJbkNsaWVudEpzYCkuIFJ1bm5pbmcgaXQgb25seSBpbnNpZGVcbiAgICAvLyBgcnVuTmV4dEJ1aWxkYCBtZWFudCBgc2tpcEJ1aWxkOiB0cnVlYCBzaWxlbnRseSBzaGlwcGVkIGFuIGFwcCB3aG9zZVxuICAgIC8vIHNlcnZlciBhY3Rpb25zIGFuZCBQT1NUIHJvdXRlIGhhbmRsZXJzIGFsbCByZXR1cm5lZCA0MDMuXG4gICAgaWYgKHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUykge1xuICAgICAgdGhpcy5wYXRjaEZldGNoSW5DbGllbnRKcygpO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbGRJZCA9IGRlcGxveW1lbnRCdWlsZElkKG1hbmlmZXN0KTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldExvY2FsUHVibGljRGlyRW50cmllcygpO1xuICAgIC8vIE5leHQuanMncyByZXNvbHZlZCBjb25maWcsIHRoZSBzYW1lIG9uZSBpdCB3cml0ZXMgaW50b1xuICAgIC8vIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAuXG4gICAgdGhpcy5uZXh0Q29uZmlnQmFzZVBhdGggPSBub3JtYWxpemVCYXNlUGF0aChtYW5pZmVzdC5jb25maWcuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dENvbmZpZ0Fzc2V0UHJlZml4ID0gcmVsYXRpdmVBc3NldFByZWZpeChcbiAgICAgIG1hbmlmZXN0LmNvbmZpZy5hc3NldFByZWZpeCxcbiAgICApO1xuICAgIHRoaXMubmV4dENvbmZpZ0Fzc2V0UHJlZml4UGF0aCA9IGFzc2V0UHJlZml4UGF0aChcbiAgICAgIG1hbmlmZXN0LmNvbmZpZy5hc3NldFByZWZpeCxcbiAgICApO1xuXG4gICAgY29uc3QgaXNGdW5jdGlvbnMgPVxuICAgICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TIHx8XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUztcblxuICAgIHRoaXMucmVsYXRpdmVQcm9qZWN0RGlyID0gbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyO1xuICAgIHRoaXMucmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50ID0gam9pblBvc2l4KFJVTlRJTUVfRElSX05BTUUsIFwic2VydmVyLm1qc1wiKTtcbiAgICB0aGlzLmFyY2hpdGVjdHVyZSA9IGRlcGxveW1lbnRBcmNoaXRlY3R1cmUocHJvcHMpO1xuICAgIHRoaXMuZGVwbG95bWVudFJvb3RzID0gdGhpcy5yZXNvbHZlRGVwbG95bWVudFJvb3RzKG1hbmlmZXN0KTtcbiAgICB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMgPSBtYW5pZmVzdC5iZWhhdmlvcnMgPz8gW107XG5cbiAgICAvLyBPbmx5IHRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgY2FycmllcyBgcHVibGljL2A6IG5vdGhpbmcgaXMgaW4gZnJvbnRcbiAgICAvLyBvZiBpdCB0byBhbnN3ZXIgdGhvc2UgcGF0aHMgZnJvbSBTMy4gRXZlcnkgb3RoZXIgdHlwZSBsaXN0cyBpdCBoZXJlIGFuZFxuICAgIC8vIHJlYWRzIGEgZmlsZSB0aGUgZWRnZSBkaWRuJ3Qgcm91dGUgdG8gUzMgKGEgcmV3cml0ZSBvbnRvIGl0KSBmcm9tIHRoZXJlLlxuICAgIGNvbnN0IHB1YmxpY09uRGlzayA9IHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUztcbiAgICBpZiAocHVibGljT25EaXNrKSB7XG4gICAgICAvLyBJdHMgZ2VuZXJhdGVkIERvY2tlcmZpbGUgYENPUFlgcyBgcHVibGljYCwgd2hpY2ggZmFpbHMgdGhlIGltYWdlIGJ1aWxkXG4gICAgICAvLyB3aGVuIHRoZSBhcHAgaGFzIG5vbmUuIEFuIGVtcHR5IGRpcmVjdG9yeSBpcyB3aGF0IGBuZXh0IHN0YXJ0YCBzZWVzXG4gICAgICAvLyBmb3IgYW4gYXBwIHdpdGhvdXQgb25lIGFueXdheSwgYW5kIGdpdCBkb2Vzbid0IHRyYWNrIGl0LlxuICAgICAgbWtkaXJTeW5jKGpvaW4ocHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5kZXBsb3ltZW50Um9vdHMpIHtcbiAgICAgIHRoaXMuc3RhZ2VSdW50aW1lKHJvb3QucGF0aCwgaXNGdW5jdGlvbnMsIHB1YmxpY09uRGlzayk7XG4gICAgICAvLyBGdW5jdGlvbnMgcnVuIG9uIHRoZSBMYW1iZGEgbWFuYWdlZCBydW50aW1lIChBbWF6b24gTGludXggMjAyMywgZ2xpYmMpLFxuICAgICAgLy8gZm9yIHRoZSBhcmNoaXRlY3R1cmUgdGhlaXIgTGFtYmRhIGRlcGxveXMsIHdoYXRldmVyIHRoaXMgbWFjaGluZSBpcztcbiAgICAgIC8vIENvbnRhaW5lcnMgcnVuIG9uIG5vZGU6MjQtYWxwaW5lIChtdXNsKS5cbiAgICAgIHRoaXMuc3RhZ2VTaGFycEZvclRhcmdldChcbiAgICAgICAgcm9vdCxcbiAgICAgICAgam9pbihyb290LnBhdGgsIHRoaXMucmVsYXRpdmVQcm9qZWN0RGlyKSxcbiAgICAgICAgYCR7aXNGdW5jdGlvbnMgPyBcImxpbnV4XCIgOiBcImxpbnV4bXVzbFwifS0ke3RvTm9kZUFyY2hpdGVjdHVyZSh0aGlzLmFyY2hpdGVjdHVyZSl9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLndhcm5PbkZvcmVpZ25OYXRpdmVCaW5hcmllcyhcbiAgICAgICAgcm9vdCxcbiAgICAgICAgYGxpbnV4LSR7dG9Ob2RlQXJjaGl0ZWN0dXJlKHRoaXMuYXJjaGl0ZWN0dXJlKX1gLFxuICAgICAgKTtcblxuICAgICAgaWYgKGlzRnVuY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0VW5kZXJMYW1iZGFMaW1pdChyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluZSB1cCB0aGUgZ3JvdXBzIHRoZSBwcm9wcyBhc2tlZCBmb3Igd2l0aCB0aGUgcm9vdHMgdGhlIGJ1aWxkIGFjdHVhbGx5XG4gICAqIHN0YWdlZCwgYW5kIGZhaWwgbG91ZGx5IHdoZW4gdGhleSBkaXNhZ3JlZS5cbiAgICpcbiAgICogVGhleSBjYW4gZGlzYWdyZWUgaW4gYm90aCBkaXJlY3Rpb25zLCBhbmQgYm90aCBtZWFuIHRoZSBzYW1lIHRoaW5nIOKAlCB0aGVcbiAgICogYC5uZXh0YCBvbiBkaXNrIGNhbWUgZnJvbSBhIGJ1aWxkIHRoYXQgZGlkIG5vdCBzZWUgdGhpcyBgZnVuY3Rpb25Hcm91cHNgIOKAlFxuICAgKiBidXQgdGhlIGNhdXNlcyBkaWZmZXI6IGBza2lwQnVpbGQ6IHRydWVgIHdpdGggYSBidWlsZCBydW4gYnkgaGFuZCwgb3IgYVxuICAgKiBzdGFsZSBgLm5leHRgIGZyb20gYmVmb3JlIHRoZSBwcm9wIGNoYW5nZWQuIEVpdGhlciB3YXkgZXZlcnkgbGF0ZXIgc3ltcHRvbVxuICAgKiAoYSBMYW1iZGEgbWlzc2luZyBhbiBlbnRyeXBvaW50LCBhIENsb3VkRnJvbnQgYmVoYXZpb3IgcG9pbnRpbmcgYXQgYVxuICAgKiBmdW5jdGlvbiB0aGF0IGNhbm5vdCBzZXJ2ZSBpdCkgaXMgdGhpcywgc2V2ZXJhbCBzdGVwcyBkb3duc3RyZWFtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVwbG95bWVudFJvb3RzKFxuICAgIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4gICk6IE5leHRqc0RlcGxveW1lbnRSb290W10ge1xuICAgIGNvbnN0IHN0YWdlZCA9IG1hbmlmZXN0Lmdyb3VwcztcblxuICAgIC8vIE5hbWVzICphbmQqIHJvdXRlczogbW92aW5nIGAvcmVwb3J0cy8qKmAgaW50byBhbiBleGlzdGluZyBncm91cCBrZWVwcyB0aGVcbiAgICAvLyBuYW1lcyBhbmQgc3RpbGwgbGVhdmVzIHRoYXQgZ3JvdXAncyB6aXAgd2l0aG91dCB0aGUgcmVwb3J0cyBlbnRyeXBvaW50cy5cbiAgICAvLyBPcmRlciBpcyBub3Q6IGFzc2lnbm1lbnQgYW5kIENsb3VkRnJvbnQgYmVoYXZpb3JzIGJvdGggZ28gbW9zdCBzcGVjaWZpY1xuICAgIC8vIGZpcnN0LCBhbmQgbm8gdHdvIGRpc3RpbmN0IHBhdHRlcm5zIHRpZSBvbiBhIFVSTCAoYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLFxuICAgIC8vIHNvIHJlb3JkZXJpbmcgZ3JvdXBzIG9yIHJvdXRlcyBpcyB0aGUgc2FtZSBzcGxpdC5cbiAgICAvLyBBbHJlYWR5IHZhbGlkYXRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHNvIHRoaXMgaXMgYWJzZW50IG9yIG5vbi1lbXB0eS5cbiAgICBjb25zdCB3YW50ZWQgPSB0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzPy5sZW5ndGhcbiAgICAgID8gdG9GdW5jdGlvbkdyb3VwU3BlY3ModGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdvdCA9IG1hbmlmZXN0LmZ1bmN0aW9uR3JvdXBzO1xuXG4gICAgaWYgKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc29ydGVkR3JvdXBTcGVjcyh3YW50ZWQpKSAhPT1cbiAgICAgIEpTT04uc3RyaW5naWZ5KHNvcnRlZEdyb3VwU3BlY3MoZ290KSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cHNcXGAgYXNrcyBmb3IgYCArXG4gICAgICAgICAgYCR7d2FudGVkID8gSlNPTi5zdHJpbmdpZnkod2FudGVkKSA6IFwibm8gc3BsaXR0aW5nXCJ9IGJ1dCB0aGUgYnVpbGQgYCArXG4gICAgICAgICAgYGluICR7dGhpcy5kb3ROZXh0UGF0aH0gd2FzIHNwbGl0IGludG8gYCArXG4gICAgICAgICAgYCR7Z290ID8gSlNPTi5zdHJpbmdpZnkoZ290KSA6IFwiYSBzaW5nbGUgZGVwbG95bWVudCByb290XCJ9LiBgICtcbiAgICAgICAgICBgR3JvdXBzIGFyZSByZXNvbHZlZCBkdXJpbmcgXFxgbmV4dCBidWlsZFxcYCAoY2RrLW5leHRqcyBwYXNzZXMgdGhlbSBpbiBgICtcbiAgICAgICAgICBgdmlhICR7RlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJ9KSwgc28gdGhpcyBtZWFucyB0aGUgYnVpbGQgb3V0cHV0IGlzIGAgK1xuICAgICAgICAgIGBzdGFsZSwgb3IgXFxgc2tpcEJ1aWxkOiB0cnVlXFxgIGFuZCB0aGUgYnVpbGQgd2FzIHJ1biB3aXRob3V0IHRoYXQgYCArXG4gICAgICAgICAgYHZhcmlhYmxlIHNldC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lcyA9IHN0YWdlZCA/IE9iamVjdC5rZXlzKHN0YWdlZCkgOiBbREVGQVVMVF9GVU5DVElPTl9HUk9VUF07XG4gICAgY29uc3Qgcm9vdHMgPSBuYW1lcy5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgcGF0aDogam9pbihcbiAgICAgICAgdGhpcy5kb3ROZXh0UGF0aCxcbiAgICAgICAgQURBUFRFUl9ESVJfTkFNRSxcbiAgICAgICAgLi4uZ3JvdXBTdGFnaW5nRGlyTmFtZShzdGFnZWQgPyBuYW1lIDogdW5kZWZpbmVkKS5zcGxpdChcIi9cIiksXG4gICAgICApLFxuICAgICAgcm91dGVzOiBzdGFnZWQ/LltuYW1lXSA/PyBbXSxcbiAgICB9KSk7XG5cbiAgICAvLyBgZGVmYXVsdGAgZmlyc3QsIHNvIGFueSBcInRoZSByb290XCIgY2FsbGVyIGdldHMgdGhlIGdyb3VwIHRoYXQgb3duc1xuICAgIC8vIGV2ZXJ5dGhpbmcgdW5hc3NpZ25lZC5cbiAgICByb290cy5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQXG4gICAgICAgID8gLTFcbiAgICAgICAgOiBiLm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVBcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiByb290cykge1xuICAgICAgaWYgKCFleGlzdHNTeW5jKHJvb3QucGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFRoZSBkZXBsb3ltZW50IHJvb3QgZm9yIGZ1bmN0aW9uIGdyb3VwIGAgK1xuICAgICAgICAgICAgYFwiJHtyb290Lm5hbWV9XCIgaXMgbWlzc2luZyBmcm9tICR7cm9vdC5wYXRofSwgdGhvdWdoIHRoZSBhZGFwdGVyIGAgK1xuICAgICAgICAgICAgYG1hbmlmZXN0IGxpc3RzIGl0LiBUaGUgXFxgLm5leHRcXGAgZGlyZWN0b3J5IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIGAgK1xuICAgICAgICAgICAgYFxcYG5leHQgYnVpbGRcXGAgcmFuLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290cztcbiAgfVxuXG4gIC8qKlxuICAgKiBgbmV4dCBidWlsZGAgdHJhY2VzIG5hdGl2ZSBhZGRvbnMgZnJvbSB0aGUgbWFjaGluZSBpdCBydW5zIG9uLCBhbmQgb25seVxuICAgKiBgc2hhcnBgIGlzIHN3YXBwZWQgZm9yIHRoZSB0YXJnZXQuIEFueXRoaW5nIGVsc2UgYnVpbHQgZm9yIGFub3RoZXIgcGxhdGZvcm1cbiAgICogZmFpbHMgd2l0aCBNT0RVTEVfTk9UX0ZPVU5EIG9yIEVSUl9ETE9QRU5fRkFJTEVEIG9uIHRoZSBmaXJzdCByZXF1ZXN0IHRoYXRcbiAgICogbG9hZHMgaXQsIHNvIHNheSB3aGljaCBwYWNrYWdlIGF0IHN5bnRoLiBBIHdhcm5pbmcsIG5vdCBhbiBlcnJvcjogc29tZVxuICAgKiBhZGRvbnMgYXJlIG9wdGlvbmFsIChgd3NgJ3MgYGJ1ZmZlcnV0aWxgLCBgZnNldmVudHNgKSBhbmQgZmFsbCBiYWNrIHRvIEpTLlxuICAgKlxuICAgKiBPbmx5IHRoZSBPUyBhbmQgQ1BVIGFyZSBjaGVja2VkOiBnbGliYyBhbmQgbXVzbCBidWlsZHMgc2hhcmUgYSBoZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkZvcmVpZ25OYXRpdmVCaW5hcmllcyhcbiAgICByb290OiBOZXh0anNEZXBsb3ltZW50Um9vdCxcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZm9yZWlnbiA9IGZpbmRGb3JlaWduTmF0aXZlUGFja2FnZXMocm9vdC5wYXRoLCB0YXJnZXQpO1xuICAgIGlmICghZm9yZWlnbi5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgXCJjZGstbmV4dGpzOmZvcmVpZ25OYXRpdmVCaW5hcmllc1wiLFxuICAgICAgYCR7TE9HX1BSRUZJWH0gRGVwbG95bWVudCByb290IFwiJHtyb290Lm5hbWV9XCIgaGFzIG5hdGl2ZSBiaW5hcmllcyBgICtcbiAgICAgICAgYGJ1aWx0IGZvciBhIHBsYXRmb3JtIG90aGVyIHRoYW4gJHt0YXJnZXR9LCB3aGljaCBpdCBydW5zIG9uOiBgICtcbiAgICAgICAgYCR7Zm9yZWlnbi5qb2luKFwiLCBcIil9LiBcXGBuZXh0IGJ1aWxkXFxgIHRyYWNlZCB0aGVtIGZyb20gdGhpcyBtYWNoaW5lLCBgICtcbiAgICAgICAgYHNvIHRoZXkgZmFpbCBvbiB0aGUgZmlyc3QgcmVxdWVzdCB0aGF0IGxvYWRzIHRoZW0gdW5sZXNzIHRoZSBwYWNrYWdlIGAgK1xuICAgICAgICBgZmFsbHMgYmFjayB3aXRob3V0IHRoZW0uIEJ1aWxkIG9uICR7dGFyZ2V0fSwgb3IgcmVwbGFjZSBlYWNoIHdpdGggYCArXG4gICAgICAgIGB0aGUgJHt0YXJnZXR9IHZhcmlhbnQgYWZ0ZXIgXFxgbmV4dCBidWlsZFxcYCAoZS5nLiBcXGBucG0gcGFja1xcYCBpdCBpbiBgICtcbiAgICAgICAgYHlvdXIgXFxgYnVpbGRDb21tYW5kXFxgKS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jZGtsYWJzL2Nkay1uZXh0anMvYCArXG4gICAgICAgIGBibG9iL21haW4vZG9jcy9uYXRpdmUtZGVwZW5kZW5jaWVzLWd1aWRlLm1kYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExhbWJkYSBlbmZvcmNlcyAyNTAgTUIgdW56aXBwZWQgYXQgQ2xvdWRGb3JtYXRpb24gdGltZSwgd2hpY2ggaXMgbWludXRlc1xuICAgKiBpbnRvIGEgZGVwbG95IGFuZCByZXBvcnRzIG9ubHkgYSBzaXplLiBTcGxpdHRpbmcgZXhpc3RzIHRvIHN0YXkgdW5kZXIgdGhhdFxuICAgKiBjYXAsIHNvIHRoZSBlcnJvciB0aGF0IHRlbGxzIHlvdSB0byBzcGxpdCBmdXJ0aGVyIGhhcyB0byBuYW1lIHRoZSBncm91cCwgaXRzXG4gICAqIHNpemUsIGFuZCB3aGF0IHRvIGRvIOKAlCBhbmQgYXJyaXZlIGF0IHN5bnRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnRVbmRlckxhbWJkYUxpbWl0KHJvb3Q6IE5leHRqc0RlcGxveW1lbnRSb290KTogdm9pZCB7XG4gICAgY29uc3QgYnl0ZXMgPSBzdG9yZWRTaXplKHJvb3QucGF0aCk7XG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBEZXBsb3ltZW50IHJvb3QgXCIke3Jvb3QubmFtZX1cIiBpcyAkeyhieXRlcyAvIDFlNikudG9GaXhlZCgxKX0gTUIgdW56aXBwZWRgLFxuICAgICk7XG4gICAgaWYgKGJ5dGVzIDw9IExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYiA9ICh2YWx1ZTogbnVtYmVyKSA9PiBgJHsodmFsdWUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgwKX0gTUJgO1xuICAgIGNvbnN0IGlzU3BsaXQgPSB0aGlzLmRlcGxveW1lbnRSb290cy5sZW5ndGggPiAxO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IEZ1bmN0aW9uIGdyb3VwIFwiJHtyb290Lm5hbWV9XCIgaXMgJHttYihieXRlcyl9IHVuemlwcGVkLCBgICtcbiAgICAgICAgYG92ZXIgTGFtYmRhJ3MgJHttYihMQU1CREFfVU5aSVBQRURfTElNSVRfQllURVMpfSBsaW1pdC4gYCArXG4gICAgICAgIChpc1NwbGl0XG4gICAgICAgICAgPyBgU3BsaXQgaXRzIHJvdXRlcyBmdXJ0aGVyLCBvciBtb3ZlIHNvbWUgb2YgdGhlbSBpbnRvIGFub3RoZXIgZ3JvdXA6IGAgK1xuICAgICAgICAgICAgYHRoZSBjYXAgaXMgcGVyIGZ1bmN0aW9uLCBzbyB0aGUgc2hhcmVkIFxcYG5leHRcXGAgY2xvc3VyZSBldmVyeSBncm91cCBgICtcbiAgICAgICAgICAgIGBkdXBsaWNhdGVzIGNvc3RzIG5vdGhpbmcgYWdhaW5zdCBhbnkgc2luZ2xlIGJ1ZGdldC5gXG4gICAgICAgICAgOiBgVXNlIHRoZSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwcm9wIHRvIHBhY2thZ2Ugcm91dGVzIGludG8gc2VwYXJhdGUgYCArXG4gICAgICAgICAgICBgZnVuY3Rpb25zLiBOb3RlIHRoYXQgc3BsaXR0aW5nIG9ubHkgcmVtb3ZlcyByb3V0ZS1sb2NhbCBjb2RlIOKAlCBgICtcbiAgICAgICAgICAgIGBhbnl0aGluZyByZWFjaGFibGUgZnJvbSBhIHNoYXJlZCBsYXlvdXQgb3IgdGhlIFxcYG5leHRcXGAgcnVudGltZSBpcyBgICtcbiAgICAgICAgICAgIGBpbiBldmVyeSBncm91cC5gKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIG1hbmlmZXN0IHRoZSBhZGFwdGVyJ3MgYG9uQnVpbGRDb21wbGV0ZWAgd3JvdGUuXG4gICAqXG4gICAqIEl0cyBhYnNlbmNlIG1lYW5zIGBuZXh0IGJ1aWxkYCByYW4gd2l0aG91dCBjZGstbmV4dGpzJ3MgYWRhcHRlciByZWdpc3RlcmVkXG4gICAqIChvciB3aXRoIGEgc3RhbGUgYG5leHQuY29uZmlnYCksIHdoaWNoIGlzIHdvcnRoIHNheWluZyBwbGFpbmx5IGhlcmU6IGV2ZXJ5XG4gICAqIGxhdGVyIGZhaWx1cmUg4oCUIGEgTGFtYmRhIHRoYXQgY2Fubm90IGZpbmQgYG1hbmlmZXN0Lmpzb25gLCBhbiBlbXB0eSBhc3NldCDigJRcbiAgICogaXMgdGhlIHNhbWUgY2F1c2Ugc2V2ZXJhbCBzdGVwcyBkb3duc3RyZWFtLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkQWRhcHRlck1hbmlmZXN0KCk6IEFkYXB0ZXJNYW5pZmVzdCB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihcbiAgICAgIHRoaXMuZG90TmV4dFBhdGgsXG4gICAgICBBREFQVEVSX0RJUl9OQU1FLFxuICAgICAgTUFOSUZFU1RfRklMRV9OQU1FLFxuICAgICk7XG4gICAgaWYgKCFleGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBub3QgZm91bmQgYXQgJHttYW5pZmVzdFBhdGh9LiBgICtcbiAgICAgICAgICBgXCIke3RoaXMuYnVpbGRDb21tYW5kfVwiIG11c3QgcnVuIGEgTmV4dC5qcyBidWlsZCB3aXRoIGNkay1uZXh0anMncyBgICtcbiAgICAgICAgICBgYWRhcHRlciByZWdpc3RlcmVkLiBjZGstbmV4dGpzIHNldHMgXFxgTkVYVF9BREFQVEVSX1BBVEhcXGAgb24gdGhlIGAgK1xuICAgICAgICAgIGBidWlsZCBpdCBydW5zIGl0c2VsZiwgc28gdGhpcyB1c3VhbGx5IG1lYW5zIGVpdGhlciB0aGUgYnVpbGQgY29tbWFuZCBgICtcbiAgICAgICAgICBgZG9lcyBub3QgcmVhY2ggXFxgbmV4dCBidWlsZFxcYCAoYSB3cmFwcGVyIHRoYXQgZHJvcHMgdGhlIGVudmlyb25tZW50LCBgICtcbiAgICAgICAgICBgb3IgYSBjYWNoZWQgYnVpbGQgdGhhdCBkaWQgbm90IHJlLXJ1biksIG9yIFxcYHNraXBCdWlsZDogdHJ1ZVxcYCBhbmQgYCArXG4gICAgICAgICAgYHRoZSBidWlsZCBoYXBwZW5lZCBvdXRzaWRlIENESy4gRm9yIHRoZSBsYXR0ZXIsIHNldCBgICtcbiAgICAgICAgICBgXFxgYWRhcHRlclBhdGg6IHJlcXVpcmUucmVzb2x2ZShcImNkay1uZXh0anMvYWRhcHRlclwiKVxcYCBpbiBgICtcbiAgICAgICAgICBgbmV4dC5jb25maWcuIEEgY3VzdG9tIFxcYGRpc3REaXJcXGAgaXMgbm90IHN1cHBvcnRlZCBlaXRoZXI6IGAgK1xuICAgICAgICAgIGBjZGstbmV4dGpzIHJlYWRzIHRoZSBidWlsZCBmcm9tIFxcYC5uZXh0XFxgLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIFwidXRmLThcIiksXG4gICAgKTtcbiAgICBpZiAobWFuaWZlc3QuY2RrTmV4dGpzVmVyc2lvbiAhPT0gQ0RLX05FWFRKU19WRVJTSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IGF0ICR7bWFuaWZlc3RQYXRofSB3YXMgd3JpdHRlbiBieSBgICtcbiAgICAgICAgICBgY2RrLW5leHRqcyAke21hbmlmZXN0LmNka05leHRqc1ZlcnNpb24gPz8gXCIodW5rbm93bilcIn0sIGJ1dCB0aGlzIGlzIGAgK1xuICAgICAgICAgIGBjZGstbmV4dGpzICR7Q0RLX05FWFRKU19WRVJTSU9OfS4gVGhlIGFkYXB0ZXIgdGhhdCB3cm90ZSBpdCBhbmQgdGhlIGAgK1xuICAgICAgICAgIGBjb25zdHJ1Y3RzIHJlYWRpbmcgaXQgY29tZSBmcm9tIHRoZSBzYW1lIHBhY2thZ2UsIHNvIHRoaXMgbWVhbnMgdHdvIGAgK1xuICAgICAgICAgIGBjZGstbmV4dGpzIHZlcnNpb25zIGFyZSBpbnN0YWxsZWQsIG9yIHRoZSBidWlsZCBvdXRwdXQgaXMgc3RhbGUuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBtYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGNkay1uZXh0anMncyBvd24gYnVuZGxlZCByZXF1ZXN0LWhhbmRsaW5nIHNoZWxsIGFuZCB0aGUgbWFuaWZlc3QgaW50b1xuICAgKiBgPGRlcGxveW1lbnRSb290Pi9jZGstbmV4dGpzLXJ1bnRpbWUvYCwgd2hpY2ggaXMgd2hlcmVcbiAgICogYGRlcGxveW1lbnRSb290T2ZgL2BkZXBsb3llZE1hbmlmZXN0UGF0aGAgZXhwZWN0IHRvIGZpbmQgdGhlbS5cbiAgICpcbiAgICogT25seSB0aGUgc2hlbGwgdGhlIGRlcGxveW1lbnQgdHlwZSBhY3R1YWxseSBydW5zIGlzIGNvcGllZCDigJQgdGhlIExhbWJkYVxuICAgKiBoYW5kbGVyIGZvciBGdW5jdGlvbnMsIHRoZSBgbm9kZTpodHRwYCBzZXJ2ZXIgZm9yIENvbnRhaW5lcnMg4oCUIHNvIG5vdGhpbmdcbiAgICogc2hpcHMgfjEuNSBNQiBvZiBkZWFkIGNvZGUgYW5kIHRoZSB0cmVlIHNheXMgd2hpY2ggdHlwZSBwcm9kdWNlZCBpdC4gQm90aFxuICAgKiBhcmUgY29waWVkIGZyb20gdGhpcyBwYWNrYWdlJ3MgYGxpYi9gLCBuZXh0IHRvIHRoZSBjb21waWxlZCBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEV2ZXJ5IGdyb3VwIGdldHMgdGhlIHNhbWUgc2hlbGwgKmFuZCB0aGUgc2FtZSBtYW5pZmVzdCo6IGEgZnVuY3Rpb24gb25seVxuICAgKiBrbm93cyB3aGljaCByb3V0ZXMgaXQgb3ducyBzbyBpdCBjYW4gc2F5IHNvIHdoZW4gbWlzcm91dGVkLCBhbmQgdGhhdCBjb21lc1xuICAgKiBmcm9tIHtAbGluayBGVU5DVElPTl9HUk9VUF9FTlZfVkFSfSwgbm90IGZyb20gYSBwZXItZ3JvdXAgbWFuaWZlc3QuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlUnVudGltZShcbiAgICBkZXBsb3ltZW50Um9vdDogc3RyaW5nLFxuICAgIGlzRnVuY3Rpb25zOiBib29sZWFuLFxuICAgIHB1YmxpY09uRGlzazogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc2hlbGwgPSBpc0Z1bmN0aW9ucyA/IFwibGFtYmRhLm1qc1wiIDogXCJzZXJ2ZXIubWpzXCI7XG4gICAgY29uc3Qgc291cmNlID0gam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCJydW50aW1lXCIsIHNoZWxsKTtcblxuICAgIGNvbnN0IHJ1bnRpbWVEaXIgPSBqb2luKGRlcGxveW1lbnRSb290LCBSVU5USU1FX0RJUl9OQU1FKTtcbiAgICAvLyBSZW1vdmVkIHJhdGhlciB0aGFuIG1lcmdlZDogYSBzdGFsZSBzaGVsbCBmcm9tIHRoZSBvdGhlciBkZXBsb3ltZW50IHR5cGVcbiAgICAvLyB3b3VsZCBvdGhlcndpc2Ugc2l0IGluIHRoZSBhc3NldCBhbmQgY2hhbmdlIGl0cyBoYXNoIGZvciBubyByZWFzb24uXG4gICAgcm1TeW5jKHJ1bnRpbWVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICBta2RpclN5bmMocnVudGltZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY3BTeW5jKHNvdXJjZSwgam9pbihydW50aW1lRGlyLCBzaGVsbCkpO1xuICAgIGNwU3luYyhcbiAgICAgIGpvaW4odGhpcy5kb3ROZXh0UGF0aCwgQURBUFRFUl9ESVJfTkFNRSwgTUFOSUZFU1RfRklMRV9OQU1FKSxcbiAgICAgIGpvaW4ocnVudGltZURpciwgTUFOSUZFU1RfRklMRV9OQU1FKSxcbiAgICApO1xuICAgIGlmICghcHVibGljT25EaXNrKSB7XG4gICAgICAvLyBUaGUgTGFtYmRhIHppcHMgYW5kIHRoZSBHbG9iYWxDb250YWluZXJzIGltYWdlIGRvbid0IGNhcnJ5IGBwdWJsaWMvYFxuICAgICAgLy8gKGl0cyBieXRlcyBhcmUgaW4gUzMpLCBzbyB0aGUgcnVudGltZSBjYW4ndCBsaXN0IGl0IGF0IHN0YXJ0IHRoZSB3YXlcbiAgICAgIC8vIHRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgZG9lcy5cbiAgICAgIC8vIExpc3RlZCBoZXJlLCBhZnRlciB0aGUgYnVpbGQgY29tbWFuZCwgc28gYHBvc3RidWlsZGAgb3V0cHV0IGlzIGluIGl0OlxuICAgICAgLy8gYSByZXdyaXRlIG9udG8gYSBsaXN0ZWQgZmlsZSBpcyB0aGVuIHNlcnZlZCBmcm9tIFMzIHJhdGhlciB0aGFuIDQwNGluZy5cbiAgICAgIHdyaXRlUHVibGljRmlsZUxpc3QoXG4gICAgICAgIHJ1bnRpbWVEaXIsXG4gICAgICAgIGpvaW4odGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFN0YWdlZCAke3NoZWxsfSBhbmQgJHtNQU5JRkVTVF9GSUxFX05BTUV9IGluICR7cnVudGltZURpcn1gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogYE5FWFRfQURBUFRFUl9QQVRIYCBmb3IgdGhlIGJ1aWxkLCBzbyBgYWRhcHRlclBhdGhgIGluIGBuZXh0LmNvbmZpZ2AgaXNcbiAgICogb3B0aW9uYWwuXG4gICAqXG4gICAqIE5leHQuanMgcmVhZHMgdGhlIHZhcmlhYmxlIGFzIHRoZSAqZGVmYXVsdCogdmFsdWUgb2YgYGFkYXB0ZXJQYXRoYFxuICAgKiAoYG5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc2AsIGBkZWZhdWx0Q29uZmlnYCksIHNvIGFuIGFwcCB0aGF0IGRvZXNcbiAgICogc2V0IGBhZGFwdGVyUGF0aGAgc3RpbGwgd2lucyBhbmQgbm90aGluZyBleGlzdGluZyBjaGFuZ2VzLlxuICAgKlxuICAgKiBSZXNvbHZlZCBmcm9tIHRoZSBOZXh0LmpzIGFwcCwgbm90IGZyb20gY2RrLW5leHRqcydzIG93biBgX19kaXJuYW1lYCBhbmQgbm90XG4gICAqIGxlZnQgYXMgYSBiYXJlIHNwZWNpZmllci4gQm90aCBhbHRlcm5hdGl2ZXMgd2VyZSB0cmllZCBhbmQgYm90aCBhcmUgd3Jvbmc6XG4gICAqXG4gICAqIC0gY2RrLW5leHRqcydzIG93biBsb2NhdGlvbiBsb3NlcyBiZWNhdXNlIHRoZSBhZGFwdGVyIHJlc29sdmVzIGl0cyBzaWJsaW5nXG4gICAqICAgY2FjaGUgaGFuZGxlciByZWxhdGl2ZSB0byB3aGVyZXZlciAqaXQqIHdhcyBsb2FkZWQgZnJvbS4gQW4gYWRhcHRlciBsb2FkZWRcbiAgICogICBmcm9tIG91dHNpZGUgdGhlIGFwcCdzIHRyZWUgaGFuZHMgTmV4dC5qcyBhIGBjYWNoZUhhbmRsZXJgIG91dHNpZGVcbiAgICogICBgdHVyYm9wYWNrLnJvb3RgLCB3aGljaCBUdXJib3BhY2sgcmVqZWN0cyBvdXRyaWdodCAoXCJsZWF2ZXMgdGhlIGZpbGVzeXN0ZW1cbiAgICogICByb290XCIpLlxuICAgKiAtIEEgYmFyZSBzcGVjaWZpZXIgbG9zZXMgYmVjYXVzZSBOZXh0LmpzIHJlc29sdmVzIGBhZGFwdGVyUGF0aGAgZnJvbSBpbnNpZGVcbiAgICogICBpdHMgb3duIGNvbmZpZyBsb2FkZXIsIGkuZS4gZnJvbSBgbmV4dGAncyByZWFscGF0aC4gVW5kZXIgcG5wbSB0aGF0IGlzIHRoZVxuICAgKiAgIHZpcnR1YWwgc3RvcmUgKGBub2RlX21vZHVsZXMvLnBucG0vbmV4dEDigKYvbm9kZV9tb2R1bGVzL25leHQvYCksIGFuZCB0aGVcbiAgICogICB3YWxrIHVwIGZyb20gdGhlcmUgbmV2ZXIgcmVhY2hlcyB0aGUgYXBwJ3Mgb3duIGBub2RlX21vZHVsZXNgLlxuICAgKlxuICAgKiBVbnNldCB3aGVuIGBjZGstbmV4dGpzYCBpcyBub3QgcmVzb2x2YWJsZSBmcm9tIHRoZSBhcHAsIHdoaWNoIGlzIGxlZ2l0aW1hdGU6XG4gICAqIHRoZSBOZXh0LmpzIGFwcCBhbmQgdGhlIENESyBhcHAgY2FuIGJlIHNlcGFyYXRlIHBhY2thZ2VzLCBhbmQgb25seSB0aGUgQ0RLIG9uZVxuICAgKiBuZWNlc3NhcmlseSBkZXBlbmRzIG9uIGNkay1uZXh0anMuIHtAbGluayByZWFkQWRhcHRlck1hbmlmZXN0fSByZXBvcnRzIHRoZVxuICAgKiByZXN1bHRpbmcgZmFpbHVyZSBhbmQgbmFtZXMgdGhpcyBjYXNlLlxuICAgKlxuICAgKiBPbmUgc2V0dXAgdGhpcyBjYW5ub3Qgc2VydmUsIGFuZCB0aGUgcmVhc29uIHRoaXMgcmVwbydzIG93biBleGFtcGxlcyBzdGlsbCBzZXRcbiAgICogYGFkYXB0ZXJQYXRoYDogYSBgbGluazpgL2BmaWxlOmAgZGVwZW5kZW5jeSBvbiBhIGNkay1uZXh0anMgY2hlY2tvdXQgKm91dHNpZGUqXG4gICAqIHRoZSBhcHAncyBwcm9qZWN0IHJvb3QuIFRoZSBzeW1saW5rIHJlc29sdmVzIG91dCBvZiB0aGUgcHJvamVjdCwgc28gdGhlXG4gICAqIGBjYWNoZUhhbmRsZXJgIGVzY2FwZSBhYm92ZSBhcHBsaWVzLiBTZXQgYGFkYXB0ZXJQYXRoYCBpbiBgbmV4dC5jb25maWdgIHRoZXJlXG4gICAqIOKAlCBpdCBpcyByZXNvbHZlZCBieSB0aGUgYnVpbGQsIGFmdGVyIHdoYXRldmVyIHB1dCB0aGUgYWRhcHRlciBpbiBwbGFjZS5cbiAgICovXG4gIHByaXZhdGUgYWRhcHRlclBhdGhFbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIE5FWFRfQURBUFRFUl9QQVRIOiByZXF1aXJlLnJlc29sdmUoXCJjZGstbmV4dGpzL2FkYXB0ZXJcIiwge1xuICAgICAgICAgIHBhdGhzOiBbdGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeV0sXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGRlYnVnKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBDb3VsZCBub3QgcmVzb2x2ZSBcImNkay1uZXh0anMvYWRhcHRlclwiIGZyb20gYCArXG4gICAgICAgICAgYCR7dGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeX07IGxlYXZpbmcgTkVYVF9BREFQVEVSX1BBVEggdW5zZXQsIHNvIGAgK1xuICAgICAgICAgIGBuZXh0LmNvbmZpZyBtdXN0IHNldCBcXGBhZGFwdGVyUGF0aFxcYC5gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBsb2NhbCBidWlsZCBjb21tYW5kIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIHJ1bk5leHRCdWlsZCgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFJ1bm5pbmc6IFwiJHt0aGlzLmJ1aWxkQ29tbWFuZH1cIiBpbiBkaXJlY3Rvcnk6ICR7dGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeX1gLFxuICAgICk7XG5cbiAgICAvLyBDbGVhbiBleGlzdGluZyBjYWNoZSBkaXJlY3RvcnkgdG8gYXZvaWQgc3RhbGUgZGF0YSBmcm9tIHByZXZpb3VzIGJ1aWxkc1xuICAgIGlmIChleGlzdHNTeW5jKHRoaXMuaW5pdENhY2hlRGlyKSkge1xuICAgICAgcm1TeW5jKHRoaXMuaW5pdENhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICBkZWJ1ZyhgQ2xlYW5lZCBleGlzdGluZyBjYWNoZSBkaXJlY3Rvcnk6ICR7dGhpcy5pbml0Q2FjaGVEaXJ9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKHRoaXMuYnVpbGRDb21tYW5kLCB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBDREtfTkVYVEpTX0lOSVRfQ0FDSEVfRElSOiB0aGlzLmluaXRDYWNoZURpcixcbiAgICAgICAgICAuLi50aGlzLmFkYXB0ZXJQYXRoRW52KCksXG4gICAgICAgICAgLy8gYG9uQnVpbGRDb21wbGV0ZWAgcnVucyBpbnNpZGUgdGhpcyBwcm9jZXNzIGFuZCBjYW5ub3QgcmVhZCBDREtcbiAgICAgICAgICAvLyBwcm9wcywgc28gdGhlIHJlc29sdmVkIGdyb3VwcyB0cmF2ZWwgYXMgSlNPTi4gQWJzZW50IHdoZW4gbm90XG4gICAgICAgICAgLy8gc3BsaXR0aW5nLCB3aGljaCB0aGUgYWRhcHRlciByZWFkcyBhcyBcIm9uZSBkZXBsb3ltZW50IHJvb3RcIi5cbiAgICAgICAgICAuLi4odGhpcy5wcm9wcy5mdW5jdGlvbkdyb3Vwcz8ubGVuZ3RoXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBbRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJdOiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgIHRvRnVuY3Rpb25Hcm91cFNwZWNzKHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHMpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTG9jYWwgYnVpbGQgZmFpbGVkOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kIGBwYXRjaC1mZXRjaC5qc2AgdG8gdGhlIGNsaWVudCBlbnRyeXBvaW50IGNodW5rcywgZm9yXG4gICAqIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgIG9ubHkuXG4gICAqXG4gICAqIFRoaXMgaXMgd2hhdCBtYWtlcyBQT1NUIHdvcmsgYXQgYWxsIG9uIHRoYXQgdHlwZS4gQ2xvdWRGcm9udCByZWFjaGVzIHRoZVxuICAgKiBzZXJ2ZXIgdGhyb3VnaCBhIExhbWJkYSBGdW5jdGlvbiBVUkwgd2l0aCBgQXV0aFR5cGU6IEFXU19JQU1gLCBzaWduZWQgYnkgYW5cbiAgICogb3JpZ2luIGFjY2VzcyBjb250cm9sLCBhbmQgQVdTIGRvY3VtZW50cyB0aGUgY29uc2VxdWVuY2U6IFwiSWYgeW91IHVzZSBQVVQgb3JcbiAgICogUE9TVCBtZXRob2RzIHdpdGggeW91ciBMYW1iZGEgZnVuY3Rpb24gVVJMLCB5b3VyIHVzZXJzIG11c3QgY29tcHV0ZSB0aGVcbiAgICogU0hBMjU2IG9mIHRoZSBib2R5IGFuZCBpbmNsdWRlIHRoZSBwYXlsb2FkIGhhc2ggdmFsdWUgb2YgdGhlIHJlcXVlc3QgYm9keSBpblxuICAgKiB0aGUgYHgtYW16LWNvbnRlbnQtc2hhMjU2YCBoZWFkZXIgd2hlbiBzZW5kaW5nIHRoZSByZXF1ZXN0IHRvIENsb3VkRnJvbnQuXG4gICAqIExhbWJkYSBkb2Vzbid0IHN1cHBvcnQgdW5zaWduZWQgcGF5bG9hZHMuXCJcbiAgICpcbiAgICogQ2xvdWRGcm9udCBzaWducyBHRVRzIGl0c2VsZiAoZW1wdHktYm9keSBoYXNoKSBidXQgd2lsbCBub3QgaGFzaCBhIGJvZHksIGFuZFxuICAgKiBhIGJyb3dzZXIgaGFzIG5vIHdheSB0byBhZGQgdGhhdCBoZWFkZXIgb24gaXRzIG93biwgc28gYW4gdW5wYXRjaGVkIGFwcFxuICAgKiBhbnN3ZXJzIGV2ZXJ5IHNlcnZlciBhY3Rpb24sIGZvcm0gc3VibWlzc2lvbiBhbmQgUE9TVCByb3V0ZSBoYW5kbGVyIHdpdGhcbiAgICogYDQwMyBJbnZhbGlkU2lnbmF0dXJlRXhjZXB0aW9uYCBiZWZvcmUgdGhlIHJlcXVlc3QgcmVhY2hlcyBOZXh0LmpzLiBUaGVcbiAgICogcGF0Y2ggaW5zdGFsbHMgYGZldGNoYC9gWE1MSHR0cFJlcXVlc3RgIHdyYXBwZXJzIHRoYXQgY29tcHV0ZSB0aGUgaGFzaC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvcHJpdmF0ZS1jb250ZW50LXJlc3RyaWN0aW5nLWFjY2Vzcy10by1sYW1iZGEuaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSBwYXRjaEZldGNoSW5DbGllbnRKcygpIHtcbiAgICBjb25zdCBzdGF0aWNDaHVua3NQYXRoID0gam9pbih0aGlzLmRvdE5leHRQYXRoLCBcInN0YXRpY1wiLCBcImNodW5rc1wiKTtcbiAgICBjb25zdCBjaHVua0ZpbGVzID0gcmVhZGRpclN5bmMoc3RhdGljQ2h1bmtzUGF0aCkuZmlsdGVyKFxuICAgICAgKGZpbGU6IHN0cmluZykgPT5cbiAgICAgICAgLy8gbWFpbi1hcHAtIGZvciB3ZWJwYWNrLCB0dXJib3BhY2stIGZvciB0dXJib1xuICAgICAgICBmaWxlLnN0YXJ0c1dpdGgoXCJtYWluLWFwcC1cIikgfHxcbiAgICAgICAgKGZpbGUuc3RhcnRzV2l0aChcInR1cmJvcGFjay1cIikgJiYgZmlsZS5lbmRzV2l0aChcIi5qc1wiKSksXG4gICAgKTtcblxuICAgIGlmIChjaHVua0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2xpZW50IHNpZGUganMgZW50cnlwb2ludCBmaWxlcyBmb3VuZFwiKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkIHRoZSBwYXRjaC1mZXRjaC5qcyBjb250ZW50XG4gICAgY29uc3QgcGF0Y2hGZXRjaFBhdGggPSBqb2luKF9fZGlybmFtZSwgXCJwYXRjaC1mZXRjaC5qc1wiKTtcbiAgICBjb25zdCBwYXRjaEZldGNoQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRjaEZldGNoUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIFByZXBlbmQgcGF0Y2gtZmV0Y2ggbG9naWMgdG8gZWFjaCBlbnRyeXBvaW50LCBvbmNlLiBOb3cgdGhhdCB0aGlzIHJ1bnNcbiAgICAvLyBvdXRzaWRlIGBydW5OZXh0QnVpbGRgLCB0aGUgc2FtZSBgLm5leHRgIGNhbiBiZSBzeW50aGVzaXplZCBtb3JlIHRoYW5cbiAgICAvLyBvbmNlIChgc2tpcEJ1aWxkOiB0cnVlYCwgYGNkayBzeW50aGAgdGhlbiBgY2RrIGRlcGxveWAsIGEgcmV0cmllZFxuICAgIC8vIGRlcGxveSksIGFuZCBwcmVwZW5kaW5nIHR3aWNlIHdvdWxkIHJlLXdyYXAgdGhlIHdyYXBwZXJzLlxuICAgIGZvciAoY29uc3QgY2h1bmtGaWxlIG9mIGNodW5rRmlsZXMpIHtcbiAgICAgIGNvbnN0IGNodW5rRmlsZVBhdGggPSBqb2luKHN0YXRpY0NodW5rc1BhdGgsIGNodW5rRmlsZSk7XG4gICAgICBjb25zdCBwYXRjaGVkQ29udGVudCA9IHBhdGNoQ2xpZW50Q2h1bmsoXG4gICAgICAgIHJlYWRGaWxlU3luYyhjaHVua0ZpbGVQYXRoLCBcInV0Zi04XCIpLFxuICAgICAgICBwYXRjaEZldGNoQ29udGVudCxcbiAgICAgICAgY2h1bmtGaWxlUGF0aCxcbiAgICAgICk7XG4gICAgICBpZiAocGF0Y2hlZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBBbHJlYWR5IHBhdGNoZWQsIHNraXBwaW5nOiAke2NodW5rRmlsZVBhdGh9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgd3JpdGVGaWxlU3luYyhjaHVua0ZpbGVQYXRoLCBwYXRjaGVkQ29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwdWJsaWMgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBsb2NhbCBmaWxlc3lzdGVtXG4gICAqL1xuICBwcml2YXRlIGdldExvY2FsUHVibGljRGlyRW50cmllcygpOiBQdWJsaWNEaXJFbnRyeVtdIHtcbiAgICBjb25zdCBwdWJsaWNEaXJQYXRoID0gam9pbih0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMocHVibGljRGlyUGF0aCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVhZGRpclN5bmMocHVibGljRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLm1hcCgoZW50cnkpID0+ICh7XG4gICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgaXNEaXJlY3Rvcnk6IGVudHJ5LmlzRGlyZWN0b3J5KCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmlwIHdoYXRldmVyIHBsYXRmb3JtLXNwZWNpZmljIFNoYXJwIGJpbmFyaWVzIGBuZXh0IGJ1aWxkYCdzIG91dHB1dCBmaWxlXG4gICAqIHRyYWNpbmcgc3RhZ2VkLCBzaW5jZSB0aGV5J3JlIHRoZSBob3N0J3MgKGUuZy4gbWFjT1MvZ2xpYmMpIHJhdGhlciB0aGFuIHRoZVxuICAgKiBkZXBsb3ltZW50IHRhcmdldCdzLCB0aGVuIGluc3RhbGwgdGhlIHRhcmdldCdzLiBTa2lwcGluZyB0aGlzIGlzIHNpbGVudDpcbiAgICogYGltYWdlT3B0aW1pemVyYCBjYXRjaGVzIHRoZSBsb2FkIGZhaWx1cmUgaW50ZXJuYWxseSBhbmQgcmV0dXJucyB0aGVcbiAgICogdW5vcHRpbWl6ZWQgb3JpZ2luYWwgd2l0aCBhbiBIVFRQIDIwMC5cbiAgICpcbiAgICogT25seSBhIHJvb3Qgd2l0aCBgc2hhcnBgIHN0YWdlZCBnZXRzIHRoZSBiaW5hcmllczogdGhlIGltYWdlIG9wdGltaXplclxuICAgKiBicmluZ3MgaXQgaW50byBgZGVmYXVsdGAsIHdoaWNoIHNlcnZlcyBldmVyeSBgL19uZXh0L2ltYWdlYCwgYW5kIGFub3RoZXJcbiAgICogZ3JvdXAgaGFzIGl0IG9ubHkgaWYgaXRzIG93biByb3V0ZXMgdXNlIGl0LiBTbyBvbmx5IGBkZWZhdWx0YCB3YXJucyB3aGVuXG4gICAqIGl0J3MgbWlzc2luZy5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VTaGFycEZvclRhcmdldChcbiAgICByb290OiBOZXh0anNEZXBsb3ltZW50Um9vdCxcbiAgICBwcm9qZWN0RGlyOiBzdHJpbmcsXG4gICAgcGxhdGZvcm06IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3Qgc2hhcnBTb3VyY2UgPSB0aGlzLnJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhyb290LnBhdGgsIHByb2plY3REaXIpO1xuICAgIGlmICghc2hhcnBTb3VyY2UpIHtcbiAgICAgIGlmIChyb290Lm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFwic2hhcnBcIiBub3QgZm91bmQgaW4gdGhlIHN0YWdlZCBidWlsZCBvdXRwdXQuIEFkZCBcInNoYXJwXCIgYXMgYSBkZXBlbmRlbmN5IG9mIHlvdXIgTmV4dC5qcyBhcHAgdG8gZW5hYmxlIGltYWdlIG9wdGltaXphdGlvbi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbGxTaGFycFBhY2thZ2VzKFxuICAgICAgc2hhcnBCaW5hcnlEaXIocm9vdC5wYXRoKSxcbiAgICAgIHRoaXMuZ2V0U2hhcnBCaW5hcnlQYWNrYWdlcyhzaGFycFNvdXJjZSwgcGxhdGZvcm0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZmluZCBhbmQgcmVtb3ZlIGV4aXN0aW5nIFNoYXJwIHBsYXRmb3JtIGJpbmFyaWVzLlxuICAgKlxuICAgKiBgcm9vdGAgaXMgd2Fsa2VkIHdob2xlIHJhdGhlciB0aGFuIGp1c3QgaXRzIGBub2RlX21vZHVsZXNgOiB0aGUgc3RhZ2VkIHRyZWVcbiAgICogaXMga2V5ZWQgYnkgcmVwby1yb290LXJlbGF0aXZlIHBhdGgsIHNvIGluIGEgbW9ub3JlcG8gdGhlIGBub2RlX21vZHVsZXNgXG4gICAqIGhvbGRpbmcgYHNoYXJwYCBpcyBzZXZlcmFsIGRpcmVjdG9yaWVzIGRvd24uIHtAbGluayBpc1NoYXJwQmluYXJ5UGFja2FnZX0gaXNcbiAgICogd2hhdCBrZWVwcyB0aGF0IGZyb20gcmVhY2hpbmcgdGhlIGFwcCdzIG93biBvdXRwdXQg4oCUIHRoZSBzdGFnZWQgcm9vdCBob2xkc1xuICAgKiB0aGUgY29tcGlsZWQgYC5uZXh0YCBhcyB3ZWxsIGFzIHRoZSBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9qZWN0RGlyIHRoZSBhcHAncyBkaXJlY3RvcnkgaW5zaWRlIGByb290YCwgd2hpY2ggYG5leHRgIGlzXG4gICAqIHJlc29sdmVkIGZyb20uXG4gICAqIEByZXR1cm5zIHRoZSBzdGFnZWQgYHNoYXJwYCBKUyB3cmFwcGVyIHRvIGluc3RhbGwgbmV4dCB0bywgZm91bmQgaW4gdGhlIHNhbWVcbiAgICogd2FsazogYSByb290IGNhbiBiZSBodW5kcmVkcyBvZiBtZWdhYnl0ZXMsIGFuZCBlYWNoIGdyb3VwIGhhcyBvbmUuXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhcbiAgICByb290OiBzdHJpbmcsXG4gICAgcHJvamVjdERpcjogc3RyaW5nLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoYXJwQ2FuZGlkYXRlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIExpbmtzIGFyZSBsaXN0ZWQsIG5vdCBmb2xsb3dlZDogZXZlcnkgbGluayBpbiBhIHN0YWdlZCByb290IHBvaW50c1xuICAgIC8vIGluc2lkZSBpdCAoYHN0YWdlRmlsZXNgIGNvcGllcyB0aGUgb25lcyB0aGF0IGRvbid0KSwgc28gaXRzIHRhcmdldCBpc1xuICAgIC8vIHdhbGtlZCBhdCBpdHMgb3duIHBhdGggYW55d2F5LCBhbmQgZm9sbG93aW5nIHRoZW0gaXMgd2hhdCBsZXQgYVxuICAgIC8vIHdvcmtzcGFjZSBjeWNsZSBoYW5nIHRoZSBzeW50aC5cbiAgICBjb25zdCBhbGxFbnRyaWVzID0gbGlzdFRyZWUocm9vdCk7XG5cbiAgICAvLyBTeW1saW5rcyBhcmUgdW5saW5rZWQsIG5vdCBgcm1TeW5jYGVkLCBhbmQgdGhleSBnbyBmaXJzdC4gcG5wbSBwb2ludHNcbiAgICAvLyBzZXZlcmFsIGxpbmtzIGF0IG9uZSBzdG9yZSBkaXJlY3RvcnksIGFuZCBgcm1TeW5jKOKApiwgeyByZWN1cnNpdmU6IHRydWUsXG4gICAgLy8gZm9yY2U6IHRydWUgfSlgICpzaWxlbnRseSBuby1vcHMqIG9uIGEgc3ltbGluayB3aG9zZSB0YXJnZXQgaXMgYWxyZWFkeVxuICAgIC8vIGdvbmUg4oCUIGBmb3JjZWAgc3dhbGxvd3MgdGhlIEVOT0VOVCBpdHMgYHJtZGlyYCBnZXRzLiBSZW1vdmluZyBhIHN0b3JlXG4gICAgLy8gZGlyZWN0b3J5IGJlZm9yZSBpdHMgbGlua3MgdGhlcmVmb3JlIGxlZnQgZGFuZ2xpbmdcbiAgICAvLyBgQGltZy9zaGFycC1kYXJ3aW4tYXJtNjRgIGVudHJpZXMgaW4gdGhlIGFzc2V0LCB3aGljaCBpcyBhIGxhdGVudCBFTk9FTlRcbiAgICAvLyBpbiB3aGF0ZXZlciBuZXh0IGZvbGxvd3MgdGhlbSAoYHNoYXJwYCBkb2VzLCB3aGVuIGl0IGxvb2tzIGZvciBiaW5hcmllcykuXG4gICAgY29uc3Qgc3ltbGlua3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZGlyZWN0b3JpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFsbEVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpICYmIGVudHJ5Lm5hbWUgPT09IFwic2hhcnBcIikge1xuICAgICAgICBjb25zdCBwYXRoID0gam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoam9pbihwYXRoLCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgICAgICBzaGFycENhbmRpZGF0ZXMucHVzaChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTaGFycEJpbmFyeVBhY2thZ2UoZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgc3ltbGlua3MucHVzaChmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZGlyZWN0b3JpZXMucHVzaChmdWxsUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBSZW1vdmluZyAke3N5bWxpbmtzLmxlbmd0aH0gU2hhcnAgYmluYXJ5IHN5bWxpbmtzIGFuZCAke2RpcmVjdG9yaWVzLmxlbmd0aH0gZGlyZWN0b3JpZXNgLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHBhdGggb2Ygc3ltbGlua3MpIHtcbiAgICAgIHVubGlua1N5bmMocGF0aCk7XG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBVbmxpbmtlZDogJHtwYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgIHJtU3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBSZW1vdmVkOiAke3BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlKFxuICAgICAgc2hhcnBDYW5kaWRhdGVzLFxuICAgICAgcmVzb2x2ZU5leHRTaGFycChwcm9qZWN0RGlyKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGBAaW1nL3NoYXJwLTxwbGF0Zm9ybT5gIGFuZCBgQGltZy9zaGFycC1saWJ2aXBzLTxwbGF0Zm9ybT5gXG4gICAqIHZlcnNpb25zIHRvIGluc3RhbGwgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0uXG4gICAqXG4gICAqIFRoZXNlIG11c3QgbWF0Y2ggdGhlIGBzaGFycGAgSlMgd3JhcHBlciB0aGF0IG91dHB1dCBmaWxlIHRyYWNpbmcgc3RhZ2VkOlxuICAgKiBgc2hhcnBgJ3MgYGxpYi9saWJ2aXBzLmpzYCBjb21wYXJlcyB0aGUgYmluYXJ5J3NcbiAgICogcmVwb3J0ZWQgbGlidmlwcyB2ZXJzaW9uIGFnYWluc3QgaXRzIG93biBgbWluaW11bUxpYnZpcHNWZXJzaW9uYCBhbmRcbiAgICogdGhyb3dzIGF0IGxvYWQgd2hlbiB0aGV5IGRpc2FncmVlLiBgc2hhcnBgIHBpbnMgYm90aCBpbiBpdHNcbiAgICogYG9wdGlvbmFsRGVwZW5kZW5jaWVzYCwgc28gdGhhdCBtYW5pZmVzdCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2UuXG4gICAqL1xuICBwcml2YXRlIGdldFNoYXJwQmluYXJ5UGFja2FnZXMoXG4gICAgc2hhcnBTb3VyY2U6IHN0cmluZyxcbiAgICBwbGF0Zm9ybTogc3RyaW5nLFxuICApOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXSB7XG4gICAgLy8gT25seSBmb3IgYSBiaW5hcnkgdGhlIHN0YWdlZCBgc2hhcnBgIGRvZXMgbm90IHBpbi5cbiAgICBjb25zdCBmYWxsYmFjayA9IFtcbiAgICAgIHsgbmFtZTogYHNoYXJwLWxpYnZpcHMtJHtwbGF0Zm9ybX1gLCB2ZXJzaW9uOiBcIjEuMi40XCIgfSxcbiAgICAgIHsgbmFtZTogYHNoYXJwLSR7cGxhdGZvcm19YCwgdmVyc2lvbjogXCIwLjM0LjVcIiB9LFxuICAgIF07XG5cbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICByZWFkRmlsZVN5bmMoam9pbihzaGFycFNvdXJjZSwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIiksXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbERlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9XG4gICAgICBtYW5pZmVzdC5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fTtcblxuICAgIHJldHVybiBmYWxsYmFjay5tYXAoKHBrZykgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IG9wdGlvbmFsRGVwZW5kZW5jaWVzW2BAaW1nLyR7cGtnLm5hbWV9YF07XG4gICAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IHNoYXJwQCR7bWFuaWZlc3QudmVyc2lvbn0gZG9lcyBub3QgcGluIFwiQGltZy8ke3BrZy5uYW1lfVwiOyBmYWxsaW5nIGJhY2sgdG8gJHtwa2cudmVyc2lvbn0uYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHBrZztcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG5hbWU6IHBrZy5uYW1lLCB2ZXJzaW9uIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgKHdpdGggY2FjaGluZykgYW5kIGV4dHJhY3QgU2hhcnAncyBwbGF0Zm9ybS1zcGVjaWZpYyBiaW5hcnlcbiAgICogcGFja2FnZXMgaW50byBgaW1nUGF0aGAuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxTaGFycFBhY2thZ2VzKFxuICAgIGltZ1BhdGg6IHN0cmluZyxcbiAgICBwYWNrYWdlczogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W10sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhY2hlRGlyID0gam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLXNoYXJwLWNhY2hlXCIpO1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHBrZyBvZiBwYWNrYWdlcykge1xuICAgICAgY29uc3QgdGFyZ2V0RGlyID0gam9pbihpbWdQYXRoLCBwa2cubmFtZSk7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGltZy8ke3BrZy5uYW1lfS8tLyR7cGtnLm5hbWV9LSR7cGtnLnZlcnNpb259LnRnemA7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvbnNpc3RlbnQgZmlsZW5hbWUgYmFzZWQgb24gcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uXG4gICAgICBjb25zdCBjYWNoZUZpbGVOYW1lID0gYCR7cGtnLm5hbWV9LSR7cGtnLnZlcnNpb259LnRnemA7XG4gICAgICBjb25zdCBjYWNoZWRGaWxlID0gam9pbihjYWNoZURpciwgY2FjaGVGaWxlTmFtZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkIHBhY2thZ2UgY2FjaGVkOyByZS1kb3dubG9hZCBpZlxuICAgICAgLy8gYSBwcmV2aW91cyBydW4gbGVmdCBiZWhpbmQgYSB0cnVuY2F0ZWQvY29ycnVwdCBkb3dubG9hZFxuICAgICAgaWYgKGV4aXN0c1N5bmMoY2FjaGVkRmlsZSkgJiYgdGhpcy5pc0NhY2hlZEZpbGVWYWxpZChjYWNoZWRGaWxlKSkge1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBVc2luZyBjYWNoZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gZnJvbSAke2NhY2hlZEZpbGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IERvd25sb2FkaW5nICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259Li4uYCk7XG5cbiAgICAgICAgLy8gRG93bmxvYWQgdG8gYSBwcm9jZXNzLXVuaXF1ZSB0ZW1wIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LFxuICAgICAgICAvLyB0aGVuIGF0b21pY2FsbHkgcmVuYW1lIGl0IG9udG8gdGhlIHNoYXJlZCBjYWNoZSBwYXRoLiBDb25jdXJyZW50XG4gICAgICAgIC8vIHN5bnRoIHByb2Nlc3NlcyAoZS5nLiBUdXJib3JlcG8gcnVubmluZyBtdWx0aXBsZSBgY2RrYCBjb21tYW5kcylcbiAgICAgICAgLy8gc2hhcmUgdGhpcyBjYWNoZSBkaXIsIHNvIHdyaXRpbmcgZGlyZWN0bHkgdG8gYGNhY2hlZEZpbGVgIHJpc2tzXG4gICAgICAgIC8vIGFub3RoZXIgcHJvY2VzcyBleHRyYWN0aW5nIGEgaGFsZi13cml0dGVuIGZpbGUuIFJlbmFtaW5nIHdpdGhpblxuICAgICAgICAvLyB0aGUgc2FtZSBmaWxlc3lzdGVtIGlzIGF0b21pYywgc28gcmVhZGVycyBvbmx5IGV2ZXIgc2VlIGFcbiAgICAgICAgLy8gY29tcGxldGUgZmlsZSwgd2hpY2hldmVyIHByb2Nlc3Mgd2lucyB0aGUgcmFjZS5cbiAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBqb2luKFxuICAgICAgICAgIGNhY2hlRGlyLFxuICAgICAgICAgIGAke2NhY2hlRmlsZU5hbWV9LiR7cHJvY2Vzcy5waWR9LSR7cmFuZG9tQnl0ZXMoNikudG9TdHJpbmcoXCJoZXhcIil9LnRtcGAsXG4gICAgICAgICk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gLS1mYWlsIG1ha2VzIGN1cmwgZXhpdCBub24temVybyBvbiBIVFRQIGVycm9ycyBhbmQgLS1yZXRyeVxuICAgICAgICAgIC8vIGhhbmRsZXMgdHJhbnNpZW50IGNvbm5lY3Rpb24gZHJvcHMgc28gYSBwYXJ0aWFsIHRyYW5zZmVyXG4gICAgICAgICAgLy8gaXNuJ3QgY2FjaGVkIGFzIHZhbGlkLlxuICAgICAgICAgIGV4ZWNGaWxlU3luYyhcbiAgICAgICAgICAgIFwiY3VybFwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIi1MXCIsXG4gICAgICAgICAgICAgIFwiLS1mYWlsXCIsXG4gICAgICAgICAgICAgIFwiLS1yZXRyeVwiLFxuICAgICAgICAgICAgICBcIjNcIixcbiAgICAgICAgICAgICAgXCItLXJldHJ5LWRlbGF5XCIsXG4gICAgICAgICAgICAgIFwiMVwiLFxuICAgICAgICAgICAgICBcIi1vXCIsXG4gICAgICAgICAgICAgIHRlbXBGaWxlLFxuICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBzdGRpbzogXCJwaXBlXCIgfSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ2FjaGVkRmlsZVZhbGlkKHRlbXBGaWxlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRG93bmxvYWRlZCBmaWxlIGZvciAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufSBpcyBlbXB0eSBvciBtaXNzaW5nOiAke3RlbXBGaWxlfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbmFtZVN5bmModGVtcEZpbGUsIGNhY2hlZEZpbGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJtU3luYyh0ZW1wRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IENhY2hlZCAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufSB0byAke2NhY2hlZEZpbGV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbWtkaXJTeW5jKHRhcmdldERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBleGVjRmlsZVN5bmMoXG4gICAgICAgIFwidGFyXCIsXG4gICAgICAgIFtcIi14emZcIiwgY2FjaGVkRmlsZSwgXCItQ1wiLCB0YXJnZXREaXIsIFwiLS1zdHJpcC1jb21wb25lbnRzPTFcIl0sXG4gICAgICAgIHsgc3RkaW86IFwicGlwZVwiIH0sXG4gICAgICApO1xuXG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBJbnN0YWxsZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgYSBjYWNoZWQgU2hhcnAgYmluYXJ5IGFyY2hpdmUgaXMgbm9uLWVtcHR5LiBHdWFyZHMgYWdhaW5zdFxuICAgKiBhIHRydW5jYXRlZC9jb3JydXB0IGRvd25sb2FkIChlLmcuIGZyb20gYSBkcm9wcGVkIGNvbm5lY3Rpb24pIGJlaW5nXG4gICAqIHJldXNlZCBhY3Jvc3Mgc3ludGggb3BlcmF0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgaXNDYWNoZWRGaWxlVmFsaWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc3RhdFN5bmMoZmlsZVBhdGgpLnNpemUgPiAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgdHJhdmVscyB0byB0aGUgYWRhcHRlciBpbiB7QGxpbmsgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJ9LCBhbmQgd2hhdCBpdFxuICogcmVjb3JkcyBiYWNrIGFzIGBBZGFwdGVyTWFuaWZlc3QuZnVuY3Rpb25Hcm91cHNgLlxuICovXG5mdW5jdGlvbiB0b0Z1bmN0aW9uR3JvdXBTcGVjcyhcbiAgZ3JvdXBzOiBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzW10sXG4pOiBGdW5jdGlvbkdyb3VwU3BlY1tdIHtcbiAgcmV0dXJuIGdyb3Vwcy5tYXAoKHsgbmFtZSwgcm91dGVzIH0pID0+ICh7IG5hbWUsIHJvdXRlcyB9KSk7XG59XG5cbi8qKiBgZ3JvdXBzYCBpbiBhIGNhbm9uaWNhbCBvcmRlciwgZm9yIGNvbXBhcmluZyB0d28gb2YgdGhlbS4gKi9cbmZ1bmN0aW9uIHNvcnRlZEdyb3VwU3BlY3MoXG4gIGdyb3VwczogcmVhZG9ubHkgRnVuY3Rpb25Hcm91cFNwZWNbXSB8IHVuZGVmaW5lZCxcbik6IEZ1bmN0aW9uR3JvdXBTcGVjW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ3JvdXBzXG4gICAgPy5tYXAoKHsgbmFtZSwgcm91dGVzIH0pID0+ICh7IG5hbWUsIHJvdXRlczogWy4uLnJvdXRlc10uc29ydCgpIH0pKVxuICAgIC5zb3J0KChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxKSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgc3RhZ2VkIGBzaGFycGAgSlMgd3JhcHBlciBvdXQgb2YgZXZlcnkgY29weSBmb3VuZCBpbiB0aGUgdHJlZS5cbiAqXG4gKiBVbmxpa2UgYSBzdGFuZGFsb25lIGJ1aWxkIHRoZXJlIGlzIG5vIHNpbmdsZSBgbm9kZV9tb2R1bGVzYCB0byBsb29rIGluOiB0aGVcbiAqIHRyZWUgbWlycm9ycyByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aHMsIHNvIHRoZSBzZWFyY2ggaXMgYnkgZGlyZWN0b3J5IG5hbWUuXG4gKlxuICogQW4gYXBwIGNhbiBoYXZlIHR3byBgc2hhcnBgIGNvcGllcyBhdCBkaWZmZXJlbnQgdmVyc2lvbnMgKGl0cyBvd24sIGhvaXN0ZWQsXG4gKiBhbmQgbmV4dCdzLCBuZXN0ZWQgdW5kZXIgYG5leHQvbm9kZV9tb2R1bGVzYCksIGFuZCBldmVyeSBiaW5hcnkgZ29lcyBpbnRvIHRoZVxuICogb25lIHJvb3QgYEBpbWdgLCBzbyB0aGUgY29weSBwaW5uaW5nIHRoZW0gaGFzIHRvIGJlIHRoZSBvbmUgYG5leHRgJ3MgaW1hZ2VcbiAqIG9wdGltaXplciBsb2FkczogYG5leHRTaGFycGAsIHdoZW4ge0BsaW5rIHJlc29sdmVOZXh0U2hhcnB9IGZvdW5kIGl0LiBPdGhlcndpc2VcbiAqIHNob3J0ZXN0IHBhdGggd2lucyBhcyB0aGUgY2xvc2VzdCB0byBhIGhvaXN0ZWQgaW5zdGFsbCwgc29ydGVkIGZvclxuICogZGV0ZXJtaW5pc20uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlKFxuICBjYW5kaWRhdGVzOiBzdHJpbmdbXSxcbiAgbmV4dFNoYXJwPzogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdXNlZCA9XG4gICAgbmV4dFNoYXJwICYmXG4gICAgY2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+XG4gICAgICBuZXh0U2hhcnAuc3RhcnRzV2l0aChyZWFscGF0aFN5bmMoY2FuZGlkYXRlKSArIHNlcCksXG4gICAgKTtcbiAgaWYgKHVzZWQpIHtcbiAgICByZXR1cm4gdXNlZDtcbiAgfVxuICBjYW5kaWRhdGVzLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGggfHwgYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID4gMSkge1xuICAgIGRlYnVnKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gTXVsdGlwbGUgc3RhZ2VkIFwic2hhcnBcIiBjb3BpZXM7IHVzaW5nICR7Y2FuZGlkYXRlc1swXX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF07XG59XG5cbi8qKlxuICogVGhlIHJlYWwgcGF0aCBvZiB0aGUgYHNoYXJwYCBlbnRyeSBwb2ludCB0aGUgc3RhZ2VkIGBuZXh0YCByZXNvbHZlcyBmcm9tXG4gKiBgcHJvamVjdERpcmAsIGB1bmRlZmluZWRgIHdoZW4gZWl0aGVyIGRvZXMgbm90IHJlc29sdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTmV4dFNoYXJwKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIGFuY2hvciBmaWxlIG5lZWRuJ3QgZXhpc3Q7IGBjcmVhdGVSZXF1aXJlYCBvbmx5IHJlYWRzIGl0cyBkaXJlY3RvcnkuXG4gICAgY29uc3QgbmV4dFBhY2thZ2UgPSBjcmVhdGVSZXF1aXJlKFxuICAgICAgam9pbihwcm9qZWN0RGlyLCBcImNkay1uZXh0anMtbmV4dC1yZXNvbHZlci5janNcIiksXG4gICAgKS5yZXNvbHZlKFwibmV4dC9wYWNrYWdlLmpzb25cIik7XG4gICAgcmV0dXJuIGNyZWF0ZVJlcXVpcmUobmV4dFBhY2thZ2UpLnJlc29sdmUoXCJzaGFycFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGVudHJ5IGBuYW1lYCBpbiBgcGFyZW50UGF0aGAgaXMgYW4gYEBpbWcvc2hhcnAtKmAgcGxhdGZvcm0gYmluYXJ5XG4gKiBwYWNrYWdlLCBvciBwbnBtJ3Mgc3RvcmUgZW50cnkgZm9yIG9uZS5cbiAqXG4gKiBUaGUgbmFtZSBhbG9uZSBpcyBub3QgZW5vdWdoIHRvIGRlbGV0ZSBhIGRpcmVjdG9yeSBieS4gQSByb3V0ZSBzZWdtZW50IGNhbGxlZFxuICogYHNoYXJwLWVkZ2VzYCBzdGFnZXMgYC5uZXh0L3NlcnZlci9hcHAvc2hhcnAtZWRnZXMvYCwgYW5kIHJlbW92aW5nIGl0IGxlZnQgdGhlXG4gKiBtYW5pZmVzdCBsaXN0aW5nIGFuIGVudHJ5cG9pbnQgdGhhdCBpcyBubyBsb25nZXIgb24gZGlzayDigJQgZXZlcnkgcmVxdWVzdCB0b1xuICogdGhhdCByb3V0ZSA1MDBpbmcgd2l0aCBcIkNvdWxkIG5vdCBsb2FkIHRoZSBlbnRyeXBvaW50XCIuIE5vciBpcyBcImEgYHNoYXJwLWBcbiAqIHBhY2thZ2VcIjogYHNoYXJwLWljb2AgYW5kIGBzaGFycC1waGFzaGAgYXJlIHVucmVsYXRlZCBkZXBlbmRlbmNpZXMsIGFuZFxuICogcmVtb3ZpbmcgdGhlbSBmYWlsZWQgdGhlIGFwcCBhdCBydW50aW1lIHdpdGggTU9EVUxFX05PVF9GT1VORC4gU28gYm90aCB0aGVcbiAqIHNjb3BlIGFuZCB0aGUgcGxhY2UgaGF2ZSB0byBtYXRjaDpcbiAqXG4gKiAtIGBub2RlX21vZHVsZXMvQGltZy9zaGFycC3igKZgLCB3aGVyZSBldmVyeSBwbGF0Zm9ybSBiaW5hcnkgYWN0dWFsbHkgbGl2ZXNcbiAqIC0gYG5vZGVfbW9kdWxlcy8ucG5wbS9AaW1nK3NoYXJwLeKApkAwLjM1LjRgLCBwbnBtJ3Mgc3RvcmUsIHdob3NlIGVudHJpZXMgYXJlXG4gKiAgIGFsc28gd2hhdCB0aGUgYEBpbWdgIGxpbmtzIHBvaW50IGF0IChgc2hhcnAtbGlidmlwcy3igKZgIG1hdGNoZXMgdGhlIHNhbWUgd2F5KVxuICpcbiAqIFRoZSBgbm9kZV9tb2R1bGVzYCBzZWdtZW50IGlzIHJlcXVpcmVkIGFzIHdlbGwsIHNvIGFuIGFwcCBkaXJlY3RvcnkgdGhhdFxuICogaGFwcGVucyB0byBiZSBjYWxsZWQgYEBpbWdgIG9yIGAucG5wbWAgaXMgc3RpbGwgbGVmdCBhbG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2hhcnBCaW5hcnlQYWNrYWdlKFxuICBwYXJlbnRQYXRoOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdtZW50cyA9IHBhcmVudFBhdGguc3BsaXQoc2VwKTtcbiAgY29uc3QgcGFyZW50ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gIGNvbnN0IHNjb3BlZCA9XG4gICAgKHBhcmVudCA9PT0gXCJAaW1nXCIgJiYgbmFtZS5zdGFydHNXaXRoKFwic2hhcnAtXCIpKSB8fFxuICAgIChwYXJlbnQgPT09IFwiLnBucG1cIiAmJiBuYW1lLnN0YXJ0c1dpdGgoXCJAaW1nK3NoYXJwLVwiKSk7XG4gIHJldHVybiBzY29wZWQgJiYgc2VnbWVudHMuaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIik7XG59XG5cbi8qKlxuICogV2hlcmUgdGhlIHRhcmdldCdzIGBAaW1nL3NoYXJwLSpgIGJpbmFyaWVzIGdvOiBgPHJvb3Q+L25vZGVfbW9kdWxlcy9AaW1nYC5cbiAqXG4gKiBOb3QgbmV4dCB0byB0aGUgc3RhZ2VkIGBzaGFycGAgcGFja2FnZS4gVW5kZXIgcG5wbSB0aGF0IGlzXG4gKiBgbm9kZV9tb2R1bGVzLy5wbnBtL3NoYXJwQHgvbm9kZV9tb2R1bGVzL0BpbWdgLCB3aGljaCBvbmx5IHRoZSBzdG9yZSBjb3B5IG9mXG4gKiBgc2hhcnBgIHJlc29sdmVzIGZyb206IGEgZGVyZWZlcmVuY2VkIGxpbmsgdG8gYHNoYXJwYCAoYSBjb3B5IGF0XG4gKiBgYXBwL25vZGVfbW9kdWxlcy9zaGFycGAsIHNheSkgbG9va3MgZm9yIGBAaW1nYCBmcm9tIGl0cyBvd24gcGF0aCBhbmQgd2Fsa3NcbiAqIHVwLCBuZXZlciBpbnRvIHRoZSBzdG9yZS4gQm90aCB0aGUgRnVuY3Rpb25zIHppcCAoYHppcERpcmVjdG9yeWApIGFuZCB0aGVcbiAqIENvbnRhaW5lcnMgYENPUFlgIGtlZXAgdGhlIGxpbmtzLCBzbyBpdCBpcyB0aGUgc3RvcmUgY29weSB0aGF0IGxvYWRzLCBhbmQgaXRzXG4gKiB3YWxrIHVwIHJlYWNoZXMgdGhlIHJvb3QgYG5vZGVfbW9kdWxlc2AgdG9vLCBzbyBpdCBzZXJ2ZXMgZWl0aGVyIGxheW91dC4gSXRcbiAqIGlzIGFsc28gd2hlcmUgbWFpbiBpbnN0YWxsZWQgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJwQmluYXJ5RGlyKHJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKHJvb3QsIFwibm9kZV9tb2R1bGVzXCIsIFwiQGltZ1wiKTtcbn1cblxuLyoqXG4gKiBFdmVyeSBlbnRyeSB1bmRlciBgcm9vdGAsIGxpbmtzIGxpc3RlZCBidXQgbm90IGZvbGxvd2VkLlxuICpcbiAqIEFuIGV4cGxpY2l0IHdhbGsgcmF0aGVyIHRoYW4gYHJlYWRkaXJTeW5jKHsgcmVjdXJzaXZlOiB0cnVlIH0pYCwgd2hpY2ggb25cbiAqIE5vZGUgMjQgZGVzY2VuZHMgaW50byBzeW1saW5rZWQgZGlyZWN0b3JpZXMgaXRzZWxmIGFuZCBzbyBuZXZlciByZXR1cm5zIG9uIGFcbiAqIGN5Y2xlIOKAlCB0d28gd29ya3NwYWNlIHBhY2thZ2VzIHRoYXQgbGluayBlYWNoIG90aGVyLCB3aGljaCBpcyBob3cgcG5wbSB3aXJlcyBhXG4gKiBtb25vcmVwby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RUcmVlKHJvb3Q6IHN0cmluZyk6IERpcmVudFtdIHtcbiAgY29uc3QgZW50cmllczogRGlyZW50W10gPSBbXTtcbiAgY29uc3QgcGVuZGluZyA9IFtyb290XTtcbiAgZm9yIChsZXQgZGlyID0gcGVuZGluZy5wb3AoKTsgZGlyICE9PSB1bmRlZmluZWQ7IGRpciA9IHBlbmRpbmcucG9wKCkpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcGVuZGluZy5wdXNoKGpvaW4oZGlyLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5jb25zdCBFTEZfTUFDSElORVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7IDYyOiBcIng2NFwiLCAxODM6IFwiYXJtNjRcIiB9O1xuY29uc3QgTUFDSF9PX01BR0lDUyA9IFtcbiAgMHhmZWVkZmFjZSwgMHhmZWVkZmFjZiwgMHhjZWZhZWRmZSwgMHhjZmZhZWRmZSwgMHhjYWZlYmFiZSxcbl07XG5cbi8qKlxuICogVGhlIHBsYXRmb3JtIGEgbmF0aXZlIGFkZG9uIHdhcyBjb21waWxlZCBmb3IsIHJlYWQgZnJvbSBpdHMgaGVhZGVyOlxuICogYGxpbnV4LTxhcmNoPmAsIGBkYXJ3aW5gIG9yIGB3aW4zMmAsIG9yIGB1bmRlZmluZWRgIGZvciBhIGZpbGUgdGhhdCBpcyBub25lXG4gKiBvZiB0aG9zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUJpbmFyeVBsYXRmb3JtKGZpbGU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYygyMCk7XG4gIGNvbnN0IGZkID0gb3BlblN5bmMoZmlsZSwgXCJyXCIpO1xuICB0cnkge1xuICAgIHJlYWRTeW5jKGZkLCBoZWFkZXIsIDAsIGhlYWRlci5sZW5ndGgsIDApO1xuICB9IGZpbmFsbHkge1xuICAgIGNsb3NlU3luYyhmZCk7XG4gIH1cbiAgY29uc3QgbWFnaWMgPSBoZWFkZXIucmVhZFVJbnQzMkJFKDApO1xuICBpZiAobWFnaWMgPT09IDB4N2Y0NTRjNDYpIHtcbiAgICAvLyBlX21hY2hpbmUsIGluIHRoZSBieXRlIG9yZGVyIEVJX0RBVEEgbmFtZXMgKDIgaXMgYmlnLWVuZGlhbikuXG4gICAgY29uc3QgbWFjaGluZSA9XG4gICAgICBoZWFkZXJbNV0gPT09IDIgPyBoZWFkZXIucmVhZFVJbnQxNkJFKDE4KSA6IGhlYWRlci5yZWFkVUludDE2TEUoMTgpO1xuICAgIHJldHVybiBgbGludXgtJHtFTEZfTUFDSElORVNbbWFjaGluZV0gPz8gYG1hY2hpbmUtJHttYWNoaW5lfWB9YDtcbiAgfVxuICBpZiAoTUFDSF9PX01BR0lDUy5pbmNsdWRlcyhtYWdpYykpIHtcbiAgICByZXR1cm4gXCJkYXJ3aW5cIjtcbiAgfVxuICBpZiAoaGVhZGVyLnRvU3RyaW5nKFwibGF0aW4xXCIsIDAsIDIpID09PSBcIk1aXCIpIHtcbiAgICByZXR1cm4gXCJ3aW4zMlwiO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIHBhY2thZ2VzIHVuZGVyIGByb290YCB0aGF0IGhhdmUgYC5ub2RlYCBhZGRvbnMgYnV0IG5vbmUgYnVpbHQgZm9yXG4gKiBgdGFyZ2V0YCwgc28gdGhleSdkIGZhaWwgdG8gbG9hZCB0aGVyZS4gUmV0dXJuZWQgYXMgYHJvb3RgLXJlbGF0aXZlIHBhdGhzLlxuICpcbiAqIEEgcGFja2FnZSB3aXRoIGFkZG9ucyBmb3Igc2V2ZXJhbCBwbGF0Zm9ybXMgaXMgZmluZSBhcyBsb25nIGFzIG9uZSBvZiB0aGVtXG4gKiBpcyBgdGFyZ2V0YDogcGFja2FnZXMgbGlrZSBgYnVmZmVydXRpbGAgYnVuZGxlIGEgYGRhcndpbmAgYW5kIGFcbiAqIGBsaW51eC14NjRgIGFkZG9uIGFuZCBsb2FkIHdoaWNoZXZlciBtYXRjaGVzIHRoZSBtYWNoaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEZvcmVpZ25OYXRpdmVQYWNrYWdlcyhcbiAgcm9vdDogc3RyaW5nLFxuICB0YXJnZXQ6IHN0cmluZyxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFja2FnZXMgPSBuZXcgTWFwPHN0cmluZywgeyBtYXRjaGVzOiBib29sZWFuOyBmb3JlaWduOiBib29sZWFuIH0+KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgbGlzdFRyZWUocm9vdCkpIHtcbiAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLm5vZGVcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gbmF0aXZlQmluYXJ5UGxhdGZvcm0oam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSk7XG4gICAgaWYgKCFwbGF0Zm9ybSkgY29udGludWU7XG4gICAgY29uc3QgcGtnID0gcGFja2FnZURpck9mKHJvb3QsIGVudHJ5LnBhcmVudFBhdGgpO1xuICAgIGNvbnN0IHNlZW4gPSBwYWNrYWdlcy5nZXQocGtnKSA/PyB7IG1hdGNoZXM6IGZhbHNlLCBmb3JlaWduOiBmYWxzZSB9O1xuICAgIGlmIChwbGF0Zm9ybSA9PT0gdGFyZ2V0KSB7XG4gICAgICBzZWVuLm1hdGNoZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWVuLmZvcmVpZ24gPSB0cnVlO1xuICAgIH1cbiAgICBwYWNrYWdlcy5zZXQocGtnLCBzZWVuKTtcbiAgfVxuICByZXR1cm4gWy4uLnBhY2thZ2VzXVxuICAgIC5maWx0ZXIoKFssIHNlZW5dKSA9PiBzZWVuLmZvcmVpZ24gJiYgIXNlZW4ubWF0Y2hlcylcbiAgICAubWFwKChbcGtnXSkgPT4gcmVsYXRpdmUocm9vdCwgcGtnKSlcbiAgICAuc29ydCgpO1xufVxuXG4vKiogVGhlIG5lYXJlc3QgZGlyZWN0b3J5IGZyb20gYGRpcmAgdXAgdG8gYHJvb3RgIHdpdGggYSBgcGFja2FnZS5qc29uYC4gKi9cbmZ1bmN0aW9uIHBhY2thZ2VEaXJPZihyb290OiBzdHJpbmcsIGRpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgZm9yIChcbiAgICBsZXQgY3VycmVudCA9IGRpcjtcbiAgICBjdXJyZW50LnN0YXJ0c1dpdGgocm9vdCk7XG4gICAgY3VycmVudCA9IGRpcm5hbWUoY3VycmVudClcbiAgKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihjdXJyZW50LCBcInBhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBpZiAoY3VycmVudCA9PT0gcm9vdCkgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGRpcjtcbn1cblxuLyoqXG4gKiBXcml0ZSB7QGxpbmsgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRX0gaW50byBhIGRlcGxveW1lbnQgcm9vdCdzIHJ1bnRpbWVcbiAqIGRpcmVjdG9yeTogZXZlcnkgZmlsZSB1bmRlciBgcHVibGljRGlyYCwgbGlzdGVkIHRoZSB3YXkgdGhlIHJ1bnRpbWUgd291bGRcbiAqIGxpc3QgaXQgb2ZmIGRpc2sgKGByZWFkUHVibGljRmlsZXNgOiBzeW1saW5rcyBmb2xsb3dlZCwgYC9gLXNlcGFyYXRlZCxcbiAqIHNvcnRlZCkuIEFuIGFwcCB3aXRob3V0IGBwdWJsaWMvYCBnZXRzIGBbXWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVB1YmxpY0ZpbGVMaXN0KHJ1bnRpbWVEaXI6IHN0cmluZywgcHVibGljRGlyOiBzdHJpbmcpIHtcbiAgd3JpdGVGaWxlU3luYyhcbiAgICBqb2luKHJ1bnRpbWVEaXIsIFBVQkxJQ19GSUxFU19GSUxFX05BTUUpLFxuICAgIEpTT04uc3RyaW5naWZ5KHJlYWRQdWJsaWNGaWxlcyhwdWJsaWNEaXIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBUb3RhbCBieXRlcyBvZiBhIHRyZWUgYXMgaXRzIGRlcGxveW1lbnQgemlwIHN0b3JlcyBpdC4gYHppcERpcmVjdG9yeWAga2VlcHNcbiAqIGxpbmtzIGFzIGxpbmtzLCBzbyBlYWNoIGNvdW50cyBhcyBpdHMgdGFyZ2V0IHBhdGgsIG5vdCBhcyB0aGUgdGFyZ2V0LCB3aGljaFxuICogaXMgd2Fsa2VkIGF0IGl0cyBvd24gcGF0aCBhbnl3YXkgKGV2ZXJ5IGxpbmsgaW4gYSBzdGFnZWQgcm9vdCBwb2ludHMgaW5zaWRlXG4gKiBpdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdG9yZWRTaXplKHJvb3Q6IHN0cmluZyk6IG51bWJlciB7XG4gIGxldCBieXRlcyA9IDA7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgbGlzdFRyZWUocm9vdCkpIHtcbiAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGJ5dGVzICs9IGxzdGF0U3luYyhqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKS5zaXplO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKlxuICogYGNodW5rYCB3aXRoIGBwYXRjaGAgcHJlcGVuZGVkIGJldHdlZW4gYFBBVENIX0ZFVENIX01BUktFUmAgYW5kXG4gKiBgUEFUQ0hfRkVUQ0hfRU5EX01BUktFUmAsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgYWxyZWFkeSBjYXJyaWVzIHRoaXMgZXhhY3RcbiAqIHBhdGNoLlxuICpcbiAqIFRoZSBvcGVuaW5nIG1hcmtlciBjYXJyaWVzIGEgaGFzaCBvZiB0aGUgcGF0Y2gsIHNvIGEgY2h1bmsgcGF0Y2hlZCBieSBhXG4gKiBjZGstbmV4dGpzIHdob3NlIGBwYXRjaC1mZXRjaC5qc2AgZGlmZmVycyAoYW4gdXBncmFkZSwgb3ZlciBhIGAubmV4dGAgcmV1c2VkXG4gKiB3aXRoIGBza2lwQnVpbGQ6IHRydWVgKSBpcyBub3QgbWlzdGFrZW4gZm9yIGN1cnJlbnQ6IHRoZSBvbGQgcGF0Y2ggaXMgY3V0IG9mZlxuICogYXQgaXRzIGVuZCBtYXJrZXIgYW5kIHRoaXMgb25lIHB1dCBpbiBpdHMgcGxhY2UsIHJhdGhlciB0aGFuIHRoZSBvbGQgb25lXG4gKiBzaGlwcGluZyBvciBib3RoIHN0YWNraW5nIHVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hDbGllbnRDaHVuayhcbiAgY2h1bms6IHN0cmluZyxcbiAgcGF0Y2g6IHN0cmluZyxcbiAgY2h1bmtQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUocGF0Y2gpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAxNik7XG4gIGNvbnN0IG9wZW4gPSBgJHtQQVRDSF9GRVRDSF9NQVJLRVJ9ICR7aGFzaH0gKi9gO1xuICBpZiAoY2h1bmsuc3RhcnRzV2l0aChgJHtvcGVufVxcbmApKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgb3JpZ2luYWwgPSBjaHVuaztcbiAgaWYgKGNodW5rLnN0YXJ0c1dpdGgoUEFUQ0hfRkVUQ0hfTUFSS0VSKSkge1xuICAgIGNvbnN0IGVuZCA9IGNodW5rLmluZGV4T2YoYFxcbiR7UEFUQ0hfRkVUQ0hfRU5EX01BUktFUn1cXG5gKTtcbiAgICBpZiAoZW5kID09PSAtMSkge1xuICAgICAgLy8gT25seSBhIHByZS1yZWxlYXNlIGNkay1uZXh0anMgd3JvdGUgdGhlIG1hcmtlciB3aXRob3V0IGFuIGVuZCwgYW5kXG4gICAgICAvLyB3aGVyZSBpdHMgcGF0Y2ggc3RvcHMgY2Fubm90IGJlIHRvbGQgZnJvbSB0aGUgY2h1bmsncyBvd24gY29kZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gJHtjaHVua1BhdGh9IGNhcnJpZXMgYSBjZGstbmV4dGpzIGZldGNoIHBhdGNoIHRoaXMgYCArXG4gICAgICAgICAgYHZlcnNpb24gY2Fubm90IHJlcGxhY2UuIFJlLXJ1biBcXGBuZXh0IGJ1aWxkXFxgIHRvIHJlZ2VuZXJhdGUgaXQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIG9yaWdpbmFsID0gY2h1bmsuc2xpY2UoZW5kICsgUEFUQ0hfRkVUQ0hfRU5EX01BUktFUi5sZW5ndGggKyAyKTtcbiAgfVxuICByZXR1cm4gYCR7b3Blbn1cXG4ke3BhdGNofVxcbiR7UEFUQ0hfRkVUQ0hfRU5EX01BUktFUn1cXG4ke29yaWdpbmFsfWA7XG59XG4iXX0=