cdk-nextjs 0.7.9 → 0.7.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/.jsii +3 -3
  2. package/README.md +1 -1
  3. package/docs/harness-coverage.md +1 -1
  4. package/docs/nextjs-private-apis.md +128 -0
  5. package/lib/adapter/adapter.mjs +276 -24
  6. package/lib/adapter/build-outputs.d.ts +1 -1
  7. package/lib/adapter/build-outputs.js +29 -13
  8. package/lib/adapter/build-outputs.test.js +35 -7
  9. package/lib/adapter/cache-handler.d.ts +1 -1
  10. package/lib/adapter/cache-handler.js +1 -1
  11. package/lib/adapter/cache-kinds.d.ts +12 -1
  12. package/lib/adapter/cache-kinds.js +16 -4
  13. package/lib/adapter/init-cache.js +7 -7
  14. package/lib/adapter/local-file-cache-handler.d.ts +1 -1
  15. package/lib/adapter/local-file-cache-handler.js +1 -1
  16. package/lib/adapter/memory-cache-handler.d.ts +2 -2
  17. package/lib/adapter/memory-cache-handler.js +1 -1
  18. package/lib/adapter/s3-cache-handler.d.ts +2 -2
  19. package/lib/adapter/s3-cache-handler.js +1 -1
  20. package/lib/adapter/use-cache-common.d.ts +1 -1
  21. package/lib/adapter/use-cache-common.js +1 -1
  22. package/lib/adapter/use-cache-common.test.js +1 -1
  23. package/lib/adapter/use-cache-default-handler.d.ts +1 -1
  24. package/lib/adapter/use-cache-default-handler.js +1 -1
  25. package/lib/adapter/use-cache-handlers.test.js +1 -1
  26. package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
  27. package/lib/adapter/use-cache-remote-handler.js +1 -1
  28. package/lib/cdk-nextjs-version.d.ts +10 -0
  29. package/lib/cdk-nextjs-version.js +15 -0
  30. package/lib/nextjs-api.js +1 -1
  31. package/lib/nextjs-build/nextjs-build.js +7 -6
  32. package/lib/nextjs-build/nextjs-build.test.js +16 -3
  33. package/lib/nextjs-cache.js +1 -1
  34. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  35. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  36. package/lib/nextjs-distribution.js +5 -5
  37. package/lib/nextjs-post-deploy.js +1 -1
  38. package/lib/nextjs-static-assets.js +1 -1
  39. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  40. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  41. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  42. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  43. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  44. package/lib/runtime/core.test.js +17 -8
  45. package/lib/runtime/dispatch.js +4 -5
  46. package/lib/runtime/image.js +43 -32
  47. package/lib/runtime/image.test.js +27 -26
  48. package/lib/runtime/lambda.mjs +276 -36
  49. package/lib/runtime/manifest.d.ts +34 -8
  50. package/lib/runtime/manifest.js +7 -5
  51. package/lib/runtime/server.mjs +276 -36
  52. package/package.json +1 -1
  53. package/scripts/capture-adapter-fixture.mjs +13 -1
  54. package/scripts/zero-config-build.mjs +5 -1
@@ -1037,4 +1037,4 @@ class S3CacheHandler {
1037
1037
  }
1038
1038
  }
1039
1039
  exports.S3CacheHandler = S3CacheHandler;
1040
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3MzLWNhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0VBRUU7QUFDRixzREFBc0Q7QUFDdEQsNkNBQXlDO0FBQ3pDLHFDQUF1QztBQUN2Qyw2Q0FBNEM7QUFDNUMseUNBQWlDO0FBQ2pDLGtFQUdvQztBQUNwQyw4REFNa0M7QUFDbEMsa0RBQW1FO0FBQ25FLG9EQUFxRTtBQUNyRSxrREFBNkI7QUFVN0IsdURBYTJCO0FBQzNCLCtDQVl1QjtBQUN2Qix5REFBdUQ7QUFDdkQsa0RBQTREO0FBQzVELGtEQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUE0QztJQUM3RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLEdBQTJCO0lBRTNCLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDOUIsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztBQUUzQzs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRywwQkFBMEIsR0FB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LEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQ1IsU0FBUyxJQUFJLDhCQUE4QixpQkFBaUIsRUFBRSxDQUMvRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FDUixTQUFTLElBQUksNENBQTRDO2dCQUN2RCx5Q0FBeUMsQ0FDNUMsQ0FBQztZQUNGLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUM1QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQ0UsT0FBTyxLQUFLLFNBQVM7Z0JBQ3JCLE9BQU8sR0FBRyxpQkFBaUI7Z0JBQzNCLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQ2hDLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQXo1QkQsd0NBeTVCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFMzIGFuZCBEeW5hbW9EQiBjYWNoZSBoYW5kbGVyIGZvciBOZXh0LmpzIGluY3JlbWVudGFsIGNhY2hlXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIENsb3VkRnJvbnRDbGllbnQsXG4gIENyZWF0ZUludmFsaWRhdGlvbkNvbW1hbmQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsdWUsXG4gIERlbGV0ZUl0ZW1Db21tYW5kLFxuICBEeW5hbW9EQkNsaWVudCxcbiAgUXVlcnlDb21tYW5kLFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHsgUzNDbGllbnQsIERlbGV0ZU9iamVjdENvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBTU01DbGllbnQsIEdldFBhcmFtZXRlckNvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNzbVwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHtcbiAgQ2FjaGVIYW5kbGVyLFxuICBDYWNoZUhhbmRsZXJWYWx1ZSxcbiAgQ2FjaGVIYW5kbGVyQ29udGV4dCxcbn0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQge1xuICBJbmNyZW1lbnRhbENhY2hlVmFsdWUsXG4gIEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHQsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQge1xuICBBd3NDYWNoZUNvbmZpZyxcbiAgYnVpbGRTM0tleSxcbiAgQ2FjaGVCdWNrZXQsXG4gIGhhc2hlZFRhZyxcbiAgbWFya2VyQ2xvY2ssXG4gIE1BWF9TT1JUX0tFWV9CWVRFUyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSZXZhbGlkYXRlRHVyYXRpb25zLFxuICBSZXZhbGlkYXRpb25TdGF0ZSxcbiAgc29ydEtleVRhZyxcbiAgczNPYmplY3RLZXksXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7XG4gIHNlcmlhbGl6ZUNhY2hlVmFsdWUsXG4gIHBhcnNlQ2FjaGVWYWx1ZSxcbiAgZGVub3JtYWxpemVQYWdlUGF0aCxcbiAgZ2V0Q2FjaGVDb250cm9sLFxuICBnZXRUYWdzLFxuICBHZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICBoZWFkZXJUYWdzLFxuICBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCxcbiAgUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWCxcbiAgc3RvcmVkQ2FjaGVDb250cm9sLFxufSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuaW1wb3J0IHsgc2hhcmVkVGFnTWFuaWZlc3QgfSBmcm9tIFwiLi91c2UtY2FjaGUtY29tbW9uXCI7XG5pbXBvcnQgeyBSRVZBTElEQVRFRF9QQUdFX0hPT0sgfSBmcm9tIFwiLi4vcnVudGltZS9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgYmFzZVBhdGhQcmVmaXgsIHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMgfSBmcm9tIFwiLi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbi8qKlxuICogVGhlIHRhZ3MgYSBzdG9yZWQgZW50cnkgaGFzIHRvIGJlIHRhZy1yZXZhbGlkYXRlZCBhZ2FpbnN0LlxuICpcbiAqIEEgcnVudGltZSBgc2V0YCByZWNvcmRzIGB0YWdzYCBhbG9uZ3NpZGUgdGhlIGVudHJ5LCBidXQgYSBidWlsZC10aW1lIHByZXJlbmRlclxuICogZG9lcyBub3Q6IHRob3NlIGVudHJpZXMgYXJlIHdyaXR0ZW4gYXMgZmlsZXMgYnkgdGhlIGFkYXB0ZXInc1xuICogYG9uQnVpbGRDb21wbGV0ZWAgcmF0aGVyIHRoYW4gdGhyb3VnaCBgc2V0YCwgYW5kIGNhcnJ5IHRoZWlyIHRhZ3Mgb25seSBpbiB0aGVcbiAqIHJlbmRlcidzIGB4LW5leHQtY2FjaGUtdGFnc2AgaGVhZGVyIOKAlCB0aGUgc2FtZSBwbGFjZSBOZXh0LmpzJ3Mgb3duXG4gKiBgSW5jcmVtZW50YWxDYWNoZS5nZXRgIHJlYWRzIHRoZW0gZnJvbSB3aGVuIGl0IGRlY2lkZXMgc3RhbGVuZXNzLiBXaXRob3V0IHRoaXNcbiAqIGZhbGxiYWNrIG5vIHByZXJlbmRlcmVkIHBhZ2UgaXMgcmVhY2hhYmxlIGJ5IGByZXZhbGlkYXRlVGFnYC9gcmV2YWxpZGF0ZVBhdGhgXG4gKiB1bnRpbCBzb21lIGxhdGVyIHJ1bnRpbWUgcmUtcmVuZGVyIGhhcHBlbnMgdG8gcmVwbGFjZSB0aGUgc2VlZGVkIGVudHJ5LCBzbyBhblxuICogYXBwIHdob3NlIHBhZ2VzIGFyZSBhbGwgc3RhdGljIG5ldmVyIHJldmFsaWRhdGVzIGF0IGFsbC4gTWVhc3VyZWQgYWdhaW5zdFxuICogbmV4dC5qcydzIGB0ZXN0L2UyZS9hcHAtZGlyL3Jlc3VtZS1kYXRhLWNhY2hlYC5cbiAqL1xuZnVuY3Rpb24gZW50cnlUYWdzKHN0b3JlZDogeyB0YWdzPzogc3RyaW5nW107IHZhbHVlPzogdW5rbm93biB9KTogc3RyaW5nW10ge1xuICByZXR1cm4gc3RvcmVkLnRhZ3M/Lmxlbmd0aCA/IHN0b3JlZC50YWdzIDogaGVhZGVyVGFncyhzdG9yZWQudmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBgbGFzdE1vZGlmaWVkYCB0aGF0IHRlbGxzIE5leHQuanMgXCJ0aGlzIGVudHJ5IGlzIGV4cGlyZWQsIHJlLXJlbmRlciBpdFxuICogYmVmb3JlIGFuc3dlcmluZ1wiLlxuICpcbiAqIGBJbmNyZW1lbnRhbENhY2hlLmdldGAgdHVybnMgaXQgaW50byBgaXNTdGFsZTogLTFgLCB3aGljaCBgYXBwLXBhZ2UtcnVudGltZWBcbiAqIHJlYWRzIGFzIGFuIG9uLWRlbWFuZCByZXZhbGlkYXRpb24gYW5kIGFuc3dlcnMgd2l0aCBhIGJsb2NraW5nIHJlbmRlciBvZlxuICogKnRoaXMqIHJvdXRlLCB0aGVuIHN0b3JlcyBpdC4gUmV0dXJuaW5nIGBudWxsYCBpbnN0ZWFkIGlzIG5vdCB0aGUgc2FtZSB0aGluZzpcbiAqIGEgbWlzcyBvbiBhIFBQUiByb3V0ZSB3aG9zZSBgcHJlcmVuZGVyLW1hbmlmZXN0Lmpzb25gIGVudHJ5IGNhcnJpZXMgYVxuICogYGZhbGxiYWNrYCAoYGNvbXB1dGU6IFwicmVzdW1pbmdcImApIGlzIGFuc3dlcmVkIGZyb20gdGhlIHJvdXRlJ3MgZmFsbGJhY2tcbiAqIHNoZWxsLCB3aGljaCBpcyBzZXJ2ZWQgYGNhY2hlLWNvbnRyb2w6IHByaXZhdGUsIG5vLXN0b3JlYCB3aXRoIG5vXG4gKiBgeC1uZXh0anMtY2FjaGVgIGhlYWRlciwgYW5kIC0gdW5sZXNzIGBwYXJ0aWFsUHJlZmV0Y2hpbmdgIGlzIG9uIC0gaXMgbmV2ZXJcbiAqIHVwZ3JhZGVkIGludG8gYSBjb25jcmV0ZSBlbnRyeS4gU28gdGhlIGZpcnN0IGByZXZhbGlkYXRlVGFnYCB0byByZWFjaCBhXG4gKiBzZWVkZWQgcHJlcmVuZGVyIGxlZnQgdGhhdCBwYWdlIHVuY2FjaGVhYmxlLCBhbmQgZHluYW1pY2FsbHkgcmVzdW1lZCBwZXJcbiAqIHJlcXVlc3QsIGZvciB0aGUgcmVzdCBvZiB0aGUgZGVwbG95bWVudCdzIGxpZmUuIFRoZSBpc3IgZTJlIHNlZXMgaXQgYXMgYW5cbiAqIGFic2VudCBgeC1uZXh0anMtY2FjaGVgLlxuICovXG5jb25zdCBFWFBJUkVEX0xBU1RfTU9ESUZJRUQgPSAtMTtcblxuLyoqXG4gKiBXaGV0aGVyIGEgYGdldGAgaXMgZm9yIHRoZSBgZmV0Y2hgIGNhY2hlIHJhdGhlciB0aGFuIGZvciBhIHJvdXRlJ3MgcmVzcG9uc2UsXG4gKiBhcyBhIG5hcnJvd2luZyBwcmVkaWNhdGUgc28gdGhhdCBgY3R4LnRhZ3NgIGFuZCBgY3R4LnNvZnRUYWdzYCDigJQgd2hpY2ggb25seVxuICoge0BsaW5rIEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHR9IGhhcyDigJQgYXJlIHJlYWNoYWJsZSB3aXRob3V0IGEgY2FzdC5cbiAqXG4gKiBgSW5jcmVtZW50YWxDYWNoZUtpbmQuRkVUQ0hgLCBjb21wYXJlZCBhcyBpdHMgb3duIHN0cmluZyB2YWx1ZSBzbyB0aGlzIGZpbGVcbiAqIGtlZXBzIGltcG9ydGluZyBubyBOZXh0LmpzIGludGVybmFscyAodGhlIGVudW0gaXMgYGNvbnN0YCwgc28gaXQgaGFzIG5vXG4gKiBydW50aW1lIHJlcHJlc2VudGF0aW9uIHRvIGltcG9ydCBhbnl3YXkpLlxuICovXG5mdW5jdGlvbiBpc0ZldGNoQ2FjaGVHZXQoXG4gIGN0eDogR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbik6IGN0eCBpcyBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0IHtcbiAgcmV0dXJuIGN0eC5raW5kID09PSBcIkZFVENIXCI7XG59XG5cbi8qKiBgTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSURgLCBpbmxpbmVkIHNvIHRoaXMgZmlsZSBpbXBvcnRzIG5vIE5leHQuanMgaW50ZXJuYWxzLiAqL1xuY29uc3QgTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSUQgPSBcIl9OX1RfXCI7XG5cbi8qKlxuICogVGhlIGB0eXBlYCBhcmd1bWVudCBvZiBgcmV2YWxpZGF0ZVBhdGhgLCB3aGljaCBOZXh0LmpzIGFwcGVuZHMgdG8gdGhlIGltcGxpY2l0XG4gKiB0YWcgYXMgYSBwYXRoIHNlZ21lbnQuIEBzZWUgaW1wbGljaXRUYWdQYXRoc1xuICovXG5jb25zdCBSRVZBTElEQVRFX1BBVEhfVFlQRVMgPSBbXCJsYXlvdXRcIiwgXCJwYWdlXCJdO1xuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHBhdGhzIGEgYHJldmFsaWRhdGVQYXRoYCB0YWcgY291bGQgbmFtZSwgb3IgZW1wdHkgZm9yIGFuIGFwcCB0YWcuXG4gKlxuICogYHJldmFsaWRhdGVQYXRoKFwiL2Jsb2dcIilgIHJlYWNoZXMgdGhlIGNhY2hlIGhhbmRsZXIgYXMgdGhlIGltcGxpY2l0IHRhZ1xuICogYF9OX1RfL2Jsb2dgIC0gdGhlIHBhdGggaXMgcmlnaHQgdGhlcmUgaW4gdGhlIHRhZywgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgQ0ROXG4gKiBjb3B5IG9mIGEgYnVpbGQtdGltZSBwcmVyZW5kZXIgcmVhY2hhYmxlIGF0IGFsbC4gQSBgcmV2YWxpZGF0ZVRhZyhcInBvc3RzXCIpYFxuICogY2FycmllcyBubyBwYXRoIGFuZCBkZXBlbmRzIG9uIHRoZSBtYXBwaW5nIHJvd3MgaW5zdGVhZC5cbiAqXG4gKiBUd28gcGF0aHMgY29tZSBiYWNrIHdoZW4gdGhlIHRhZyBlbmRzIGluIGEgYHJldmFsaWRhdGVQYXRoYCAqdHlwZSosIGJlY2F1c2VcbiAqIGByZXZhbGlkYXRlUGF0aChwYXRoLCB0eXBlKWAgYXBwZW5kcyBpdCB0byB0aGUgdGFnXG4gKiAoYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NwZWMtZXh0ZW5zaW9uL3JldmFsaWRhdGUuanNgKTpcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIsIFwibGF5b3V0XCIpYCBpcyBgX05fVF8vYmxvZy9sYXlvdXRgLCBhbmRcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9cIiwgXCJsYXlvdXRcIilgIGlzIGBfTl9UXy9sYXlvdXRgLiBSZWFkaW5nIGVpdGhlciBvZiB0aG9zZSBhcyBhXG4gKiByZXF1ZXN0IHBhdGggaW52YWxpZGF0ZXMgYSBVUkkgdGhhdCBkb2VzIG5vdCBleGlzdCBhbmQgbmV2ZXIgdG91Y2hlcyB0aGUgb25lXG4gKiB0aGF0IGRvZXMuIFRoZSBzdWZmaXggY2Fubm90IGJlIHRvbGQgYXBhcnQgZnJvbSBhIHJvdXRlIHRoYXQgZ2VudWluZWx5IGVuZHMgaW5cbiAqIGAvbGF5b3V0YCwgc28gYm90aCByZWFkaW5ncyBhcmUgZW1pdHRlZDogYW4gaW52YWxpZGF0aW9uIHBhdGggbWF0Y2hpbmcgbm90aGluZ1xuICogY29zdHMgYSBwYXRoLCB3aGlsZSBtaXNzaW5nIHRoZSByZWFsIG9uZSBsZWF2ZXMgdGhlIGVkZ2Ugc3RhbGUgZm9yIHRoZSB3aG9sZVxuICogYHMtbWF4YWdlYC5cbiAqL1xuZnVuY3Rpb24gaW1wbGljaXRUYWdQYXRocyh0YWc6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0YWcuc3RhcnRzV2l0aChgJHtORVhUX0NBQ0hFX0lNUExJQ0lUX1RBR19JRH0vYCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgcGF0aCA9IHRhZy5zbGljZShORVhUX0NBQ0hFX0lNUExJQ0lUX1RBR19JRC5sZW5ndGgpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gW3BhdGhdO1xuICBmb3IgKGNvbnN0IHR5cGUgb2YgUkVWQUxJREFURV9QQVRIX1RZUEVTKSB7XG4gICAgaWYgKHBhdGguZW5kc1dpdGgoYC8ke3R5cGV9YCkpIHtcbiAgICAgIC8vIGBfTl9UXy9sYXlvdXRgIGlzIHRoZSByb290LCBub3QgdGhlIGVtcHR5IHBhdGguXG4gICAgICBjYW5kaWRhdGVzLnB1c2gocGF0aC5zbGljZSgwLCAtKHR5cGUubGVuZ3RoICsgMSkpIHx8IFwiL1wiKTtcbiAgICB9XG4gIH1cbiAgLy8gQSBkeW5hbWljIHJvdXRlIHRlbXBsYXRlIChcIi9ibG9nL1tzbHVnXVwiKSBtYXRjaGVzIG5vIGNhY2hlZCBVUkkuIEhhcm1sZXNzIHRvXG4gIC8vIHNlbmQsIGJ1dCBpdCBjb3N0cyBhbiBpbnZhbGlkYXRpb24gcGF0aCwgYW5kIHRob3NlIGFyZSBtZXRlcmVkLlxuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGNhbmRpZGF0ZXMpKS5maWx0ZXIoKHApID0+ICFwLmluY2x1ZGVzKFwiW1wiKSk7XG59XG5cbi8qKlxuICogSW52YWxpZGF0aW9uIHBhdGhzIGNvdmVyaW5nIGV2ZXJ5IFVSSSBDbG91ZEZyb250IGNvdWxkIGJlIGhvbGRpbmcgdGhlIHJlc3BvbnNlXG4gKiBmb3IgYHJvdXRlYCB1bmRlciwgb25jZSBgYmFzZVBhdGhgIGlzIHByZWZpeGVkLlxuICpcbiAqIEFuIGludmFsaWRhdGlvbiBwYXRoIG1hdGNoZXMgb25seSB0aGUgcXVlcnkgc3RyaW5nIGl0IHNwZWxscyBvdXQsIGFuZCBhIHBhZ2Unc1xuICogUlNDIHBheWxvYWQgaXMgY2FjaGVkIHVuZGVyIGA/X3JzYz08aGFzaD5gOyBkcm9wcGluZyB0aGUgSFRNTCB3aGlsZSBsZWF2aW5nIHRoZVxuICogcGF5bG9hZCBiZWhpbmQgbGVhdmVzIHRoZSByb3V0ZXIgbmF2aWdhdGluZyB0byB0aGUgcHJlLXJldmFsaWRhdGlvbiBwYWdlLiBBXG4gKiBgdHJhaWxpbmdTbGFzaGAgYXBwIGNhY2hlcyB0aGUgcmVkaXJlY3QgdGFyZ2V0IHJhdGhlciB0aGFuIHRoZSByb3V0ZSwgc28gdGhlXG4gKiBzbGFzaCB2YXJpYW50IGhhcyB0byBnbyB0b28uXG4gKlxuICogT25lIHRyYWlsaW5nIHdpbGRjYXJkIGNvdmVycyBhbGwgZm91ciAoYC9ibG9nYCwgYC9ibG9nP+KApmAsIGAvYmxvZy9gLFxuICogYC9ibG9nLz/igKZgKSBmb3IgYSBzaW5nbGUgd2lsZGNhcmQgcGF0aCwgd2hlcmUgc3BlbGxpbmcgdGhlbSBvdXQgY29zdCB0d28gLVxuICogYW5kIHdpbGRjYXJkcyBhcmUgdGhlIHF1b3RhIHRoYXQgcnVucyBvdXQuIEl0IGFsc28gbWF0Y2hlcyBgL2Jsb2dyb2xsYCBhbmRcbiAqIGV2ZXJ5dGhpbmcgdW5kZXIgYC9ibG9nL2AsIHdoaWNoIGlzIGEgbG93ZXIgaGl0IHJhdGUgb24gdGhvc2UsIG5ldmVyIGEgc3RhbGVcbiAqIHBhZ2UuIFRoZSBhcHAncyByb290IGlzIHRoZSBleGNlcHRpb246IGAvKmAgdGhlcmUgaXMgdGhlIHdob2xlIGFwcC5cbiAqXG4gKiBgYmFzZVBhdGhgIGlzIHByZWZpeGVkIGhlcmUgYmVjYXVzZSBuZWl0aGVyIHNvdXJjZSBvZiBhIHJvdXRlIGNhcnJpZXMgaXQuXG4gKiBDYWNoZSBrZXlzIGFyZSByb3V0ZXMg4oCUIE5leHQuanMgc3RyaXBzIGBiYXNlUGF0aGAgYmVmb3JlIHJvdXRpbmcsIHNvIHRoZSBjYWNoZVxuICogaGFuZGxlciBuZXZlciBzZWVzIG9uZSDigJQgYW5kIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIpYCBuYW1lcyB0aGUgcm91dGUgYXNcbiAqIHdlbGwuIENsb3VkRnJvbnQgb25seSBldmVyIHNhdyBgL2Jhc2UvYmxvZ2AsIHNvIGludmFsaWRhdGluZyBgL2Jsb2dgIGNsZWFyc1xuICogbm90aGluZyBhbmQgdGhlIGVkZ2Uga2VlcHMgc2VydmluZyB0aGUgcHJlLXJldmFsaWRhdGlvbiBwYWdlIHVudGlsIGBzLW1heGFnZWBcbiAqIGV4cGlyZXMuIFRoZSBhcHAncyByb290IHVuZGVyIGEgYGJhc2VQYXRoYCBpcyBgL2Jhc2VgLCBub3QgYC9iYXNlL2AuXG4gKi9cbmZ1bmN0aW9uIGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlOiBzdHJpbmcsIGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRyaW1tZWQgPSByb3V0ZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICBpZiAodHJpbW1lZCA9PT0gXCJcIikge1xuICAgIHJldHVybiBiYXNlUGF0aFxuICAgICAgPyBbYmFzZVBhdGgsIGAke2Jhc2VQYXRofT8qYCwgYCR7YmFzZVBhdGh9L2AsIGAke2Jhc2VQYXRofS8/KmBdXG4gICAgICA6IFtcIi9cIiwgXCIvPypcIl07XG4gIH1cbiAgcmV0dXJuIFtgJHtiYXNlUGF0aH0ke2VuY29kZUludmFsaWRhdGlvblJvdXRlKHRyaW1tZWQpfSpgXTtcbn1cblxuLyoqXG4gKiBUaGUgYXBwJ3MgYGJhc2VQYXRoYCwgZnJvbSB0aGUgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBldmVyeSBkZXBsb3ltZW50XG4gKiByb290IHN0YWdlcyBuZXh0IHRvIGBzZXJ2ZXJEaXN0RGlyYDogTmV4dC5qcyBoYW5kcyB0aGUgY2FjaGUgaGFuZGxlciBub1xuICogb3RoZXIgY29weS5cbiAqL1xuZnVuY3Rpb24gYXBwQmFzZVBhdGgoc2VydmVyRGlzdERpcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzZXJ2ZXJEaXN0RGlyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGZpbGUgPSBqb2luKHNlcnZlckRpc3REaXIsIFwiLi5cIiwgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoZmlsZSwgXCJ1dGY4XCIpKS5jb25maWc/LmJhc2VQYXRoO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCByZWFkIGJhc2VQYXRoIGZvciBDRE4gaW52YWxpZGF0aW9uOlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIGByb3V0ZWAgYXMgdGhlIFVSSSBhIGJyb3dzZXIgcmVxdWVzdHMgaXQgdW5kZXIsIHdoaWNoIGlzIHdoYXQgQ2xvdWRGcm9udFxuICogY2FjaGVzIGl0IGJ5LlxuICpcbiAqIE5leHQuanMgYnVpbGRzIGNhY2hlIGtleXMgZnJvbSB0aGUgKmRlY29kZWQqIHBhdGhuYW1lIChgZGVjb2RlUGF0aFBhcmFtc2AgaW5cbiAqIGByb3V0ZS1tb2R1bGUuanNgKSwgc28gYC9ibG9nL2jDqWxsb2Agb3IgYC9ibG9nL2hlbGxvIHdvcmxkYCByZWFjaCBoZXJlIHJhdyxcbiAqIHdoaWxlIENsb3VkRnJvbnQgaG9sZHMgYC9ibG9nL2glQzMlQTlsbG9gLCBhbmQgYW4gaW52YWxpZGF0aW9uIHBhdGggbWF0Y2hlc1xuICogdGhlIGVuY29kZWQgZm9ybSBvbmx5IC0gQVdTIHJlcXVpcmVzIG5vbi1BU0NJSSBhbmQgdW5zYWZlIGNoYXJhY3RlcnMgdG8gYmVcbiAqIHBlcmNlbnQtZW5jb2RlZCwgYW5kIG5vdGhpbmcgZWxzZS4gRWFjaCBzZWdtZW50IGlzIGVuY29kZWQgdGhlIHdheVxuICogYGVuY29kZVVSSWAgZG9lcywgd2hpY2ggbGVhdmVzIHRoZSBjaGFyYWN0ZXJzIGEgYnJvd3NlciBzZW5kcyByYXcgaW4gYSBwYXRoXG4gKiAoYEBgLCBgOmAsIGAsYCwgYDtgLCAuLi4pIGFsb25lLiBBIGAlYCB0aGF0IGFscmVhZHkgc3RhcnRzIGFuIGVzY2FwZSBpcyBrZXB0OlxuICogYGRlY29kZVBhdGhQYXJhbXNgIHJlLWVzY2FwZXMgcGF0aCBkZWxpbWl0ZXJzIChgJTJGYCwgYCUzRmAsIGAlMjNgLCBgJTVDYCksXG4gKiBhbmQgYSBgcmV2YWxpZGF0ZVBhdGhgIHRhZyBtYXkgbmFtZSB0aGUgZW5jb2RlZCBwYXRoIGl0c2VsZi4gYD9gIGFuZCBgI2AgY2FuXG4gKiBvbmx5IGJlIGluIGEgZGVjb2RlZCBzZWdtZW50IGFzIGRhdGEsIHNvIHRoZXkgYXJlIGVuY29kZWQgdG9vLlxuICovXG5mdW5jdGlvbiBlbmNvZGVJbnZhbGlkYXRpb25Sb3V0ZShyb3V0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJvdXRlXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5zcGxpdCgvKCVbMC05QS1GYS1mXXsyfSkvKVxuICAgICAgICAubWFwKChwYXJ0LCBpKSA9PlxuICAgICAgICAgIGkgJSAyID09PSAxXG4gICAgICAgICAgICA/IHBhcnRcbiAgICAgICAgICAgIDogZW5jb2RlVVJJKHBhcnQpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgL1s/I10vZyxcbiAgICAgICAgICAgICAgICAoYykgPT4gYCUke2MuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5qb2luKFwiXCIpLFxuICAgIClcbiAgICAuam9pbihcIi9cIik7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGNhY2hlIGtleSBpcyBhIGZldGNoLWNhY2hlIGVudHJ5IHJhdGhlciB0aGFuIGEgcGFnZSByb3V0ZS5cbiAqXG4gKiBUaG9zZSBrZXlzIGFyZSB0aGUgaGFzaCBOZXh0LmpzIGRlcml2ZXMgZnJvbSB0aGUgcmVxdWVzdCDigJQgYSBzaW5nbGUgc2VnbWVudCBvZlxuICogbG93ZXJjYXNlIGhleCwgbG9uZyBlbm91Z2ggdGhhdCBubyByb3V0ZSBwYXRobmFtZSB0YWtlcyB0aGUgc2FtZSBzaGFwZS4gVGhleVxuICogYXJlIG1hcHBlZCB0byB0YWdzIGV4YWN0bHkgbGlrZSBwYWdlcyBhcmUsIGJ1dCBuYW1lIG5vIFVSSSBDbG91ZEZyb250IGNvdWxkIGJlXG4gKiBob2xkaW5nLCBzbyBhbiBpbnZhbGlkYXRpb24gcGF0aCBidWlsdCBmcm9tIG9uZSBpcyBhbHdheXMgd2FzdGVkLlxuICovXG5mdW5jdGlvbiBpc0ZldGNoQ2FjaGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eWzAtOWEtZl17MzIsfSQvLnRlc3Qoa2V5KTtcbn1cblxuLyoqIFdoZXRoZXIgQ2xvdWRGcm9udCBjb3VudHMgdGhpcyBwYXRoIGFnYWluc3QgdGhlIHdpbGRjYXJkIHF1b3RhLiAqL1xuZnVuY3Rpb24gaXNXaWxkY2FyZFBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYXRoLmluY2x1ZGVzKFwiKlwiKTtcbn1cblxuLyoqXG4gKiBUaGUgbW9zdCB3aWxkY2FyZCBwYXRocyBvbmUgYHJldmFsaWRhdGVUYWdgIHNlbmRzIGJlZm9yZSBjb2xsYXBzaW5nIHRvIGEgc2luZ2xlXG4gKiBhcHAtd2lkZSB3aWxkY2FyZCwgYW5kIHRoZSBtb3N0IHBhdGhzIG9mIGFueSBraW5kLlxuICpcbiAqIENsb3VkRnJvbnQncyB3aWxkY2FyZCBxdW90YSBpcyBwZXIgKmRpc3RyaWJ1dGlvbiosIG5vdCBwZXIgcmVxdWVzdDogdGhlXG4gKiBpbnZhbGlkYXRpb25zIGl0IGhhcyBpbiBwcm9ncmVzcyBzaGFyZSBpdCwgc28gc3BsaXR0aW5nIGFuIG92ZXJzaXplZCBzZXQgaW50b1xuICogYmFjay10by1iYWNrIHJlcXVlc3RzIGlzIHdoYXQgZ2V0cyB0aGUgbGF0ZXIgb25lcyByZWplY3RlZFxuICogKGBUb29NYW55SW52YWxpZGF0aW9uc0luUHJvZ3Jlc3NgLCBvciBhIHRocm90dGxlIHVuZGVyIHRoZSBuZXdlciByYXRlLWJhc2VkXG4gKiBxdW90YXMpIC0gYW5kIGEgcmVqZWN0ZWQgcmVxdWVzdCBpcyBhIHBhZ2UgdGhhdCBzdGF5cyBzdGFsZSBhdCB0aGUgZWRnZS4gU29cbiAqIGV2ZXJ5dGhpbmcgZ29lcyBvdXQgYXMgb25lIHJlcXVlc3QsIGFuZCBhIHNldCB0aGF0IHdvdWxkIG5vdCBmaXQgaW4gb25lIGlzXG4gKiBhbnN3ZXJlZCB3aXRoIHRoZSB3aG9sZSBhcHAgKGAvKmAsIHNlZSBgd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRoc2ApIGluc3RlYWQ6XG4gKiBhIHdvcnNlIGhpdCByYXRlLCBhbmQgYSBzdHJpY3RseSBjb3JyZWN0IGFuc3dlci5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLWludmFsaWRhdGlvbnNcbiAqL1xuY29uc3QgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT04gPSAxNTtcblxuY29uc3QgTUFYX1BBVEhTX1BFUl9JTlZBTElEQVRJT04gPSAzMDAwO1xuXG4vKipcbiAqIFJldHJpZXMgb2YgYW4gaW52YWxpZGF0aW9uIENsb3VkRnJvbnQgcmVqZWN0ZWQgZm9yIGl0cyBpbi1wcm9ncmVzcyBxdW90YSwgYW5kXG4gKiB0aGUgZGVsYXkgYmVmb3JlIHRoZSBmaXJzdDsgZWFjaCBsYXRlciBvbmUgd2FpdHMgdHdpY2UgYXMgbG9uZy5cbiAqXG4gKiBTaXppbmcgYSByZXF1ZXN0IGFnYWluc3QgdGhlIHF1b3RhIGNhbm5vdCBzZWUgdGhlIGludmFsaWRhdGlvbnMgb3RoZXJcbiAqIGluc3RhbmNlcyBhbHJlYWR5IGhhdmUgaW4gZmxpZ2h0LCBzbyB0d28gYHJldmFsaWRhdGVUYWdgcyBjbG9zZSB0b2dldGhlciBjYW5cbiAqIGVhY2ggZml0IG9uIHRoZWlyIG93biBhbmQgc3RpbGwgYmUgcmVqZWN0ZWQgdG9nZXRoZXIuIERyb3BwaW5nIHRoZSByZWplY3RlZFxuICogb25lIGxlZnQgaXRzIHBhZ2VzIHN0YWxlIGF0IHRoZSBlZGdlIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC4gVGhlIHJldHJ5IGFza3NcbiAqIGZvciB0aGUgd2hvbGUgYXBwIGluc3RlYWQsIHdoaWNoIGlzIG9uZSB3aWxkY2FyZCAtIHRoZSBsZWFzdCBvZiB0aGUgcXVvdGEgYW55XG4gKiByZXF1ZXN0IGNhbiB0YWtlIC0gYXQgdGhlIGNvc3Qgb2YgYSBjb2xkZXIgZWRnZS5cbiAqL1xuY29uc3QgSU5WQUxJREFUSU9OX1JFVFJJRVMgPSAyO1xuY29uc3QgSU5WQUxJREFUSU9OX1JFVFJZX0RFTEFZX01TID0gMTAwMDtcblxuLyoqIFRoZSBlcnJvcnMgdGhhdCBtZWFuIFwidGhlIHF1b3RhIGlzIGZ1bGwgcmlnaHQgbm93XCIsIG5vdCBcInRoaXMgaXMgd3JvbmdcIi4gKi9cbmZ1bmN0aW9uIGlzSW52YWxpZGF0aW9uUXVvdGFFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBuYW1lID0gKGVycm9yIGFzIHsgbmFtZT86IHVua25vd24gfSB8IG51bGwpPy5uYW1lO1xuICByZXR1cm4gbmFtZSA9PT0gXCJUb29NYW55SW52YWxpZGF0aW9uc0luUHJvZ3Jlc3NcIiB8fCBuYW1lID09PSBcIlRocm90dGxpbmdcIjtcbn1cblxuLyoqXG4gKiBUaGUgbW9zdCBjYWNoZSBrZXlzIHRvIHJlbWVtYmVyIGFzIHNlcnZlZCBzdGFsZSB3aGlsZSBhd2FpdGluZyB0aGVpclxuICogcmVnZW5lcmF0aW9uLiBBIGJhY2tncm91bmQgcmVuZGVyIHRoYXQgZmFpbHMgbmV2ZXIgY2FsbHMgYHNldGAsIHNvIHdpdGhvdXQgYVxuICogYm91bmQgaXRzIGtleSB3b3VsZCBzdGF5IGJlaGluZCBmb3IgdGhlIGxpZmUgb2YgdGhlIGluc3RhbmNlLlxuICogQHNlZSBTM0NhY2hlSGFuZGxlci5zb2Z0UmV2YWxpZGF0ZWRLZXlzXG4gKi9cbmNvbnN0IE1BWF9TT0ZUX1JFVkFMSURBVEVEX0tFWVMgPSAxMDAwO1xuXG4vKipcbiAqIEhvdyBtYW55IDEgTUIgUXVlcnkgcGFnZXMgb2Ygb25lIHRhZydzIG1hcHBpbmcgcm93cyB0byB3YWxrLiBBIGNlaWxpbmcgcmF0aGVyXG4gKiB0aGFuIGEgcmVhbCBsaW1pdDogaXQgYm91bmRzIGEgcnVuYXdheSB0YWcgaW5zdGVhZCBvZiBwYWdpbmF0aW5nIGEgd2hvbGUgdGFibGVcbiAqIG9uIGEgcmVxdWVzdCBwYXRoLiBBIHRhZyBjdXQgb2ZmIGhlcmUgaW52YWxpZGF0ZXMgdGhlIHdob2xlIGFwcCwgYmVjYXVzZSB0aGVcbiAqIHJvd3MgaXQgbmV2ZXIgcmVhZCBhcmUgcGFnZXMgd2hvc2UgZWRnZSBjb3B5IHdvdWxkIG90aGVyd2lzZSBzdGF5IHN0YWxlLlxuICovXG5jb25zdCBNQVhfVEFHX1FVRVJZX1BBR0VTID0gMjA7XG5cbi8qKlxuICogTmV4dC5qcydzIGluLXByb2Nlc3MgdGFnIG1hbmlmZXN0LCB3aGljaCBgSW5jcmVtZW50YWxDYWNoZS5nZXRgIGNvbnN1bHRzIHRvXG4gKiBkZWNpZGUgd2hldGhlciBhbiBlbnRyeSBpcyBzdGFsZSAtIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGZvdW5kXG4gKiB1bmFtYmlndW91c2x5LlxuICpcbiAqIGByZXZhbGlkYXRlVGFnKHRhZywgcHJvZmlsZSlgIGFza3MgZm9yIHN0YWxlLXdoaWxlLXJldmFsaWRhdGU6IHRoZSBlbnRyeSBpc1xuICogc2VydmVkIG9uY2UgbW9yZSB3aGlsZSBhIGJhY2tncm91bmQgcmVuZGVyIHJlcGxhY2VzIGl0LiBBIGNhY2hlIGhhbmRsZXIgaGFzXG4gKiBubyBmaWVsZCB0byBzYXkgXCJzdGFsZVwiIGluIC0gYGxhc3RNb2RpZmllZDogLTFgIG1lYW5zIGV4cGlyZWQsIHdoaWNoIGJsb2NrcyAtXG4gKiBzbyB0aGlzIHNldHMgdGhlIHRhZydzIGBzdGFsZWAgdGltZXN0YW1wIHdoZXJlIE5leHQuanMgYWxyZWFkeSBsb29rcyBmb3IgaXQsXG4gKiB3aGljaCBpcyBleGFjdGx5IHdoYXQgaXRzIG93biBgRmlsZVN5c3RlbUNhY2hlLnJldmFsaWRhdGVUYWdgIGRvZXMuIFRoZSBtb2R1bGVcbiAqIGlzIHJlYWQgZnJvbSB0aGUgbG9hZGVkLW1vZHVsZSBjYWNoZSByYXRoZXIgdGhhbiBgcmVxdWlyZWBkOiB0aGUgaGFuZGxlciBpc1xuICogYnVuZGxlZCBhcGFydCBmcm9tIHRoZSBhcHAsIGFuZCByZXNvbHZpbmcgYG5leHRgIGZyb20gaGVyZSBjb3VsZCByZWFjaCBhXG4gKiBkaWZmZXJlbnQgY29weSB0aGFuIHRoZSBzZXJ2ZXIgbG9hZGVkLCB3aG9zZSBtYW5pZmVzdCBub3RoaW5nIHJlYWRzLiBBIHN0YWxlXG4gKiBtYXJrIHdyaXR0ZW4gdGhlcmUgd291bGQgc2VydmUgdGhlIGVudHJ5IGFzIGZyZXNoLCBzbyB3aXRob3V0IGV4YWN0bHkgb25lXG4gKiBsb2FkZWQgY29weSB0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gZXhwaXJpbmcgdGhlIGVudHJ5IG91dHJpZ2h0LlxuICovXG5jb25zdCBUQUdTX01BTklGRVNUX01PRFVMRSA9XG4gIFwiL25leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlL3RhZ3MtbWFuaWZlc3QuZXh0ZXJuYWwuanNcIjtcbmZ1bmN0aW9uIG5leHRUYWdzTWFuaWZlc3QoKTpcbiAgTWFwPHN0cmluZywgeyBzdGFsZT86IG51bWJlcjsgZXhwaXJlZD86IG51bWJlciB9PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhY2hlID0gY3JlYXRlUmVxdWlyZShqb2luKHByb2Nlc3MuY3dkKCksIFwiaW5kZXguanNcIikpLmNhY2hlO1xuICBjb25zdCBsb2FkZWQgPSBPYmplY3Qua2V5cyhjYWNoZSkuZmlsdGVyKChwYXRoKSA9PlxuICAgIHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikuZW5kc1dpdGgoVEFHU19NQU5JRkVTVF9NT0RVTEUpLFxuICApO1xuICBpZiAobG9hZGVkLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBjYWNoZVtsb2FkZWRbMF1dPy5leHBvcnRzPy50YWdzTWFuaWZlc3Q7XG4gIHJldHVybiBtYW5pZmVzdCBpbnN0YW5jZW9mIE1hcCA/IG1hbmlmZXN0IDogdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uIElELCB3aGVuIHRoZSBjb21wdXRlJ3MgZW52aXJvbm1lbnQgY2FuIGNhcnJ5IGl0XG4gICAqIChgTmV4dGpzR2xvYmFsQ29udGFpbmVyc2ApLlxuICAgKi9cbiAgZGlzdHJpYnV0aW9uSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE90aGVyd2lzZSwgdGhlIG5hbWUgKG5vdCB2YWx1ZSkgb2YgdGhlIFNTTSBQYXJhbWV0ZXIgaG9sZGluZyBpdC5cbiAgICpcbiAgICogT24gYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AgdGhlIGRpc3RyaWJ1dGlvbidzIG9yaWdpbiBpcyB0aGUgZnVuY3Rpb24nc1xuICAgKiBVUkwsIHNvIHRoZSBmdW5jdGlvbidzIGVudmlyb25tZW50IG5hbWluZyB0aGUgZGlzdHJpYnV0aW9uIGJhY2sgd291bGQgYmVcbiAgICogYSBjaXJjdWxhciBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5LiBUaGUgcGFyYW1ldGVyICpuYW1lKiBpcyBzdGF0aWMgYW5kXG4gICAqIGtub3duIGF0IHN5bnRoIHRpbWU7IG9ubHkgaXRzICp2YWx1ZSogZGVwZW5kcyBvbiB0aGUgZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3MgYGJhc2VQYXRoYCwgYXMgdGhlIFVSSSBwcmVmaXggQ2xvdWRGcm9udCBjYWNoZWQgdGhlIHJlc3BvbnNlc1xuICAgKiB1bmRlci5cbiAgICogQHNlZSBjZG5JbnZhbGlkYXRpb25QYXRoc1xuICAgKi9cbiAgYmFzZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM0NhY2hlSGFuZGxlck9wdGlvbnMge1xuICBjb250ZXh0OiBDYWNoZUhhbmRsZXJDb250ZXh0O1xuICAvKipcbiAgICogVGhlIGFwcCdzIGBiYXNlUGF0aGAsIGZvciB0ZXN0czogcmVhZCBmcm9tIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmBcbiAgICogb3RoZXJ3aXNlLlxuICAgKi9cbiAgYmFzZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTM0NhY2hlSGFuZGxlciBpbXBsZW1lbnRzIENhY2hlSGFuZGxlciB7XG4gIHByaXZhdGUgczNDbGllbnQ6IFMzQ2xpZW50O1xuICBwcml2YXRlIGR5bmFtb0NsaWVudDogRHluYW1vREJDbGllbnQ7XG4gIHByaXZhdGUgY2xvdWRGcm9udENsaWVudDogQ2xvdWRGcm9udENsaWVudDtcbiAgcHJpdmF0ZSBzc21DbGllbnQ6IFNTTUNsaWVudDtcbiAgcHJpdmF0ZSBidWNrZXQ6IENhY2hlQnVja2V0O1xuICBwcml2YXRlIHRhZ3M6IFRyYWNrZWRUYWdNYXJrZXJzO1xuICBwcml2YXRlIGNvbmZpZzogQXdzQ2FjaGVDb25maWc7XG4gIHByaXZhdGUgY2xvdWRGcm9udENvbmZpZzogQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZztcbiAgcHJpdmF0ZSBkZWJ1ZyA9IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnMzXCIpO1xuXG4gIC8vIENhY2hlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgaW5zdGFuY2UgKGkuZS4gdGhlIGNvbXB1dGUgaW5zdGFuY2UpIG9uY2VcbiAgLy8gcmVzb2x2ZWQsIHNpbmNlIGEgZGVwbG95bWVudCdzIGRpc3RyaWJ1dGlvbiBJRCBuZXZlciBjaGFuZ2VzIGF0IHJ1bnRpbWUuXG4gIHByaXZhdGUgY2FjaGVkRGlzdHJpYnV0aW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDYWNoZSBrZXlzIHRoaXMgaW5zdGFuY2Ugc2VydmVkIHN0YWxlIGJlY2F1c2Ugb2YgYSBzb2Z0IGByZXZhbGlkYXRlVGFnYCxcbiAgICogd2hvc2UgcmVnZW5lcmF0ZWQgZW50cnkgYHNldGAgaGFzIHlldCB0byB3cml0ZS5cbiAgICpcbiAgICogYHJldmFsaWRhdGVUYWcodGFnLCBwcm9maWxlKWAgaW52YWxpZGF0ZXMgQ2xvdWRGcm9udCBhdCBvbmNlLCBidXQgdGhlIG5leHRcbiAgICogcmVxdWVzdCBpcyBhbnN3ZXJlZCBmcm9tIHRoZSBzdGFsZSBlbnRyeSAtIHN0YWxlLXdoaWxlLXJldmFsaWRhdGUgLSBhbmQgdGhhdFxuICAgKiByZXNwb25zZSBjYXJyaWVzIHRoZSBlbnRyeSdzIG9yaWdpbmFsIGBzLW1heGFnZWAsIHNvIHRoZSBlZGdlIGNhY2hlcyB0aGVcbiAgICogc3RhbGUgYm9keSBhZ2Fpbi4gVGhlIGJhY2tncm91bmQgcmVuZGVyIHRoYXQgcmVwbGFjZXMgaXQgcnVucyBpbiB0aGlzIHNhbWVcbiAgICogcHJvY2Vzcywgc28gYHNldGAgY2hlY2tzIGZvciB0aGUga2V5IGhlcmUgYW5kIGludmFsaWRhdGVzIHRoZSBrZXkncyBwYXRocyBhIHNlY29uZFxuICAgKiB0aW1lIG9uY2UgdGhlIGZyZXNoIGVudHJ5IGlzIGluIFMzLiBXaXRob3V0IHRoYXQsIHRoZSBlZGdlIGtlcHQgc2VydmluZyB0aGVcbiAgICogcHJlLXJldmFsaWRhdGlvbiBwYWdlIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC5cbiAgICpcbiAgICogRXhwaXJpbmcgc29mdC1yZXZhbGlkYXRlZCBlbnRyaWVzIG91dHJpZ2h0IGluc3RlYWQgd291bGQgYWxzbyBrZWVwIHRoZSBlZGdlXG4gICAqIHJpZ2h0LCBidXQgaXQgdHVybnMgZXZlcnkgYHJldmFsaWRhdGVUYWcodGFnLCBcIm1heFwiKWAgaW50byBhIGJsb2NraW5nIHJlbmRlclxuICAgKiBhdCB0aGUgb3JpZ2luLCB3aGljaCBpcyB0aGUgdGhpbmcgYSBwcm9maWxlIGFza3Mgbm90IHRvIGhhcHBlbi5cbiAgICpcbiAgICogV2hlbiB0aGUgcmUtcmVuZGVyIGZhaWxzLCBuZXh0IDE2LjQncyBgcmV0YWluUHJldmlvdXNDYWNoZUVudHJ5YCB3cml0ZXMgdGhlXG4gICAqIHN0YWxlIHZhbHVlIGJhY2sgd2l0aCBhIHNob3J0IGxpZmV0aW1lOiB0aGF0IGlzIG5vIHJlZ2VuZXJhdGlvbiwgc28gdGhlIGtleVxuICAgKiBrZWVwcyB3YWl0aW5nIHJhdGhlciB0aGFuIGludmFsaWRhdGluZyB0aGUgZWRnZSBmb3IgYSBwYWdlIHRoYXQgaGFzIG5vdFxuICAgKiBjaGFuZ2VkLiB7QGxpbmsgc2VydmVkU3RhbGV9IGlzIGhvdyBgc2V0YCByZWNvZ25pc2VzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzb2Z0UmV2YWxpZGF0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHZhbHVlIGhhbmRlZCBvdXQgc3RhbGUsIGJ5IGlkZW50aXR5OiB0aGUgb2JqZWN0IGBnZXRgIHJldHVybmVkIGlzIHRoZVxuICAgKiBvbmUgYHJldGFpblByZXZpb3VzQ2FjaGVFbnRyeWAgd3JpdGVzIGJhY2suIFdlYWssIHNvIGEgcGFnZSBib2R5IGlzIGhlbGQgbm9cbiAgICogbG9uZ2VyIHRoYW4gdGhlIG1lbW9yeSBsYXllciBvciB0aGUgcmVxdWVzdCBob2xkcyBpdC5cbiAgICovXG4gIHByaXZhdGUgc2VydmVkU3RhbGUgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqIEBzZWUgYnVpbGRUYWdNYW5pZmVzdCAqL1xuICBwcml2YXRlIGJ1aWxkVGFnczogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmdbXT4+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFMzQ2FjaGVIYW5kbGVyT3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG5cbiAgICAvLyBPbmx5IHNldCBmb3IgQ2xvdWRGcm9udC1mcm9udGVkIGRlcGxveW1lbnRzIChOZXh0anNHbG9iYWxGdW5jdGlvbnMvQ29udGFpbmVycykuXG4gICAgLy8gV2hlbiB1bnNldCwgb24tZGVtYW5kIHJldmFsaWRhdGlvbiBza2lwcyBDRE4gaW52YWxpZGF0aW9uIGFuZCByZWxpZXMgb24gdGhlXG4gICAgLy8gZGlzdHJpYnV0aW9uJ3MgY2FjaGUgcG9saWN5IFRUTCAoZHJpdmVuIGJ5IHRoZSBvcmlnaW4ncyBDYWNoZS1Db250cm9sIGhlYWRlcilcbiAgICAvLyB0byBldmVudHVhbGx5IHBpY2sgdXAgZnJlc2ggY29udGVudC5cbiAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcgPSB7XG4gICAgICBkaXN0cmlidXRpb25JZDogcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19ESVNUUklCVVRJT05fSUQgfHwgXCJcIixcbiAgICAgIGRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZTpcbiAgICAgICAgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19ESVNUUklCVVRJT05fSURfUEFSQU1fTkFNRSB8fCBcIlwiLFxuICAgICAgYmFzZVBhdGg6IGJhc2VQYXRoUHJlZml4KG9wdGlvbnMuYmFzZVBhdGgpLFxuICAgIH07XG4gICAgLy8gT25seSBpbnZhbGlkYXRpb24gbmVlZHMgaXQsIHNvIG9ubHkgYSBoYW5kbGVyIGJlaGluZCBhIGRpc3RyaWJ1dGlvbiByZWFkc1xuICAgIC8vIGl0LCBhbmQgYSBtaXNzaW5nIGZpbGUgdGhlcmUgaXMgd29ydGggYSB3YXJuaW5nLlxuICAgIGlmICh0aGlzLmludmFsaWRhdGVzQ2RuICYmIG9wdGlvbnMuYmFzZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoID0gYmFzZVBhdGhQcmVmaXgoXG4gICAgICAgIGFwcEJhc2VQYXRoKG9wdGlvbnMuY29udGV4dC5zZXJ2ZXJEaXN0RGlyKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBBV1MgY2xpZW50c1xuICAgIGNvbnN0IHsgcmVnaW9uIH0gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLnMzQ2xpZW50ID0gbmV3IFMzQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuZHluYW1vQ2xpZW50ID0gbmV3IER5bmFtb0RCQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuY2xvdWRGcm9udENsaWVudCA9IG5ldyBDbG91ZEZyb250Q2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHRoaXMuc3NtQ2xpZW50ID0gbmV3IFNTTUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBDYWNoZUJ1Y2tldCh0aGlzLnMzQ2xpZW50LCB0aGlzLmNvbmZpZy5idWNrZXROYW1lKTtcbiAgICAvLyBUaGUgcHJvY2VzcydzIG9uZSBjb3B5IG9mIHRoZSB0YWcgbWFya2Vycywgc2hhcmVkIHdpdGggdGhlIGAndXNlIGNhY2hlJ2BcbiAgICAvLyBoYW5kbGVyczogb25lIGByZXZhbGlkYXRlVGFnYCB3cml0ZXMgZWFjaCB0YWcncyByb3dzIG9uY2UsIGFuZCBvbmUgbG9nXG4gICAgLy8gYFF1ZXJ5YCBwZXIgaW50ZXJ2YWwgc2VydmVzIGV2ZXJ5IGhhbmRsZXIuXG4gICAgdGhpcy50YWdzID0gc2hhcmVkVGFnTWFuaWZlc3QoKTtcblxuICAgIC8vIGByZXMucmV2YWxpZGF0ZSgpYCByZWdlbmVyYXRlcyBhIHBhZ2Ugd2l0aG91dCBnb2luZyB0aHJvdWdoXG4gICAgLy8gYHJldmFsaWRhdGVUYWdgLCBzbyB0aGUgcnVudGltZSBhc2tzIGZvciB0aGUgQ0ROIGNvcGllcyBpdHNlbGYsIHRocm91Z2hcbiAgICAvLyB0aGlzIGhvb2sgKGBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlYCBpbiBgc3JjL3J1bnRpbWUvY29yZS50c2ApLiBBIGdsb2JhbFxuICAgIC8vIGJlY2F1c2UgdGhlIHJ1bnRpbWUgYW5kIHRoaXMgaGFuZGxlciBhcmUgc2VwYXJhdGUgYnVuZGxlcyBpbiBvbmUgcHJvY2Vzcy5cbiAgICAvLyBFdmVyeSBpbnN0YW5jZSByZWdpc3RlcnMgdGhlIHNhbWUgdGhpbmcsIHNvIHRoZSBsYXRlc3Qgb25lIHdpbm5pbmcgaXMgZmluZS5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlc0Nkbikge1xuICAgICAgKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1JFVkFMSURBVEVEX1BBR0VfSE9PS10gPSAoXG4gICAgICAgIHJvdXRlczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCB9ID0gdGhpcy5jbG91ZEZyb250Q29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKFxuICAgICAgICAgIHJvdXRlcy5mbGF0TWFwKChyb3V0ZSkgPT4gY2RuSW52YWxpZGF0aW9uUGF0aHMocm91dGUsIGJhc2VQYXRoKSksXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcuYnVja2V0TmFtZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCwgUzMgY2FjaGUgZGlzYWJsZWRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy50YWJsZU5hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIHJldmFsaWRhdGlvbiB0cmFja2luZyBkaXNhYmxlZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkNES19ORVhUSlNfQlVJTERfSUQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDREtfTkVYVEpTX0JVSUxEX0lEIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIGNhY2hlIGlzb2xhdGlvbiBtYXkgbm90IHdvcmsgY29ycmVjdGx5XCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldChcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIGN0eDogR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgKTogUHJvbWlzZTxDYWNoZUhhbmRsZXJWYWx1ZSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5idWNrZXROYW1lKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvYmplY3RLZXkgPSBzM09iamVjdEtleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5idWNrZXQuZ2V0KG9iamVjdEtleSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgTUlTUzogJHtjYWNoZUtleX1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIEV2ZXJ5IG9iamVjdCBpcyBKU09OIChgcHV0SnNvbmAsIGFuZCB0aGUgc2VlZGVkIGAuanNvbmAgZmlsZXMpOyBvbmVcbiAgICAgIC8vIHRoYXQgZG9lcyBub3QgcGFyc2UgaXMgYSBtaXNzLCB0aHJvdWdoIHRoZSBgY2F0Y2hgIGJlbG93LlxuICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBwYXJzZUNhY2hlVmFsdWUocmVzcG9uc2UpO1xuXG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc1JldmFsaWRhdGVkKHBhcnNlZFZhbHVlLCBjdHgsIGNhY2hlS2V5KSkge1xuICAgICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBJTlZBTElEQVRFRCBCWSBUQUc6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIC8vIEEgcmV2YWxpZGF0ZWQgYGZldGNoYCBlbnRyeSBoYXMgdG8gcmVhZCBhcyBhIG1pc3Mgc28gdGhlIHJlcXVlc3RcbiAgICAgICAgLy8gcmVmZXRjaGVzIGluc3RlYWQgb2YgcmV1c2luZyB0aGUgYm9keSAtIHRoZSBzYW1lIHRoaW5nIE5leHQuanMnc1xuICAgICAgICAvLyBvd24gYEZpbGVTeXN0ZW1DYWNoZWAgZG9lcyB3aXRoIGByZXZhbGlkYXRlZFRhZ3NgLiBPbmx5IGFcbiAgICAgICAgLy8gKnJlc3BvbnNlKiBlbnRyeSBnZXRzIGhhbmRlZCBiYWNrIGV4cGlyZWQsIGJlY2F1c2UgZm9yIHRob3NlIGFcbiAgICAgICAgLy8gbWlzcyBpcyB3b3JzZSB0aGFuIHN0YWxlOiBzZWUgYEVYUElSRURfTEFTVF9NT0RJRklFRGAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5laXRoZXIgaXMgZGVsZXRlZC4gVGhlIHJlZmV0Y2ggb3IgcmUtcmVuZGVyIHRoaXMgcHJvdm9rZXNcbiAgICAgICAgLy8gb3ZlcndyaXRlcyB0aGUgb2JqZWN0IHRocm91Z2ggYHNldGAsIHdpdGggYSBgbGFzdE1vZGlmaWVkYCBwYXN0IHRoZVxuICAgICAgICAvLyB0YWcncyBtYXJrZXI7IGRlbGV0aW5nIGl0IGhlcmUgYXMgd2VsbCByYWNlZCB0aGF0IHdyaXRlLCBhbmQgYVxuICAgICAgICAvLyBjb25jdXJyZW50IHJlcXVlc3QncyBmcmVzaCBlbnRyeSBjb3VsZCBiZSB0aGUgb25lIHJlbW92ZWQuIEtlZXBpbmdcbiAgICAgICAgLy8gYSByZXNwb25zZSBlbnRyeSBhbHNvIG1lYW5zIGEgcmVuZGVyIHRoYXQgZmFpbHMgaXMgYW5zd2VyZWQgZnJvbVxuICAgICAgICAvLyB0aGUgbGFzdCBnb29kIGNvcHkgcmF0aGVyIHRoYW4gZnJvbSBhIHNoZWxsLlxuICAgICAgICByZXR1cm4gaXNGZXRjaENhY2hlR2V0KGN0eClcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBFWFBJUkVEX0xBU1RfTU9ESUZJRUQsXG4gICAgICAgICAgICAgIHZhbHVlOiBwYXJzZWRWYWx1ZS52YWx1ZSxcbiAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBzdG9yZWRDYWNoZUNvbnRyb2wocGFyc2VkVmFsdWUuY2FjaGVDb250cm9sKSxcbiAgICAgICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIEhJVDogJHtjYWNoZUtleX0gKCR7b2JqZWN0S2V5fSlgKTtcblxuICAgICAgLy8gV2l0aG91dCB0aGUgc3RvcmVkIHRhZ3MuIFdpdGggdGhlIHN0b3JlZCBsaWZldGltZTogc2VlXG4gICAgICAvLyBgZ2V0Q2FjaGVDb250cm9sYC5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhc3RNb2RpZmllZDogcGFyc2VkVmFsdWUubGFzdE1vZGlmaWVkLFxuICAgICAgICB2YWx1ZTogcGFyc2VkVmFsdWUudmFsdWUsXG4gICAgICAgIGNhY2hlQ29udHJvbDogc3RvcmVkQ2FjaGVDb250cm9sKHBhcnNlZFZhbHVlLmNhY2hlQ29udHJvbCksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgYWN0dWFsIGVycm9ycyAoYSBjYWNoZSBtaXNzIGlzIG5vdCBvbmU6IHNlZSBgQ2FjaGVCdWNrZXQuZ2V0YClcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHJldHJpZXZpbmcgY2FjaGUgZnJvbSBTMzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHRhZyByZXZhbGlkYXRpb24gaGFzIGV4cGlyZWQgYGVudHJ5YCwgZm9yIGEgYGdldGAgd2l0aCBgY3R4YC5cbiAgICpcbiAgICogUHVibGljIGJlY2F1c2UgdGhlIGluLW1lbW9yeSBsYXllciBpbiBmcm9udCBvZiB0aGlzIGhhbmRsZXIgaGFzIHRvIGFzayB0b286XG4gICAqIGEgbWVtb3J5IGhpdCBuZXZlciByZWFjaGVzIHtAbGluayBnZXR9LCBhbmQgd2l0aG91dCB0aGlzIGNoZWNrIGFuIGluc3RhbmNlXG4gICAqIG90aGVyIHRoYW4gdGhlIG9uZSB0aGF0IHJhbiBgcmV2YWxpZGF0ZVRhZ2Aga2VwdCBhbnN3ZXJpbmcgZnJvbSBtZW1vcnkgZm9yXG4gICAqIHRoZSB3aG9sZSBtZW1vcnkgVFRMIC0gbG9uZyBlbm91Z2ggZm9yIENsb3VkRnJvbnQgdG8gY2FjaGUgdGhlIHN0YWxlIHBhZ2VcbiAgICogYWdhaW4gYWZ0ZXIgdGhlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogV2hpY2ggdGFncyB0byBjaGVjayBkZXBlbmRzIG9uIHRoZSBraW5kLCBhbmQgTmV4dC5qcydzIG93blxuICAgKiBgRmlsZVN5c3RlbUNhY2hlLmdldGAgc3BsaXRzIHRoZSBzYW1lIHR3byB3YXlzOiBhIHJlc3BvbnNlIGVudHJ5IGlzIGNoZWNrZWRcbiAgICogYWdhaW5zdCB0aGUgdGFncyAqaXQqIHdhcyBzdG9yZWQgd2l0aCwgYnV0IGEgYGZldGNoYCBlbnRyeSBpcyBjaGVja2VkXG4gICAqIGFnYWluc3QgYFsuLi5jdHgudGFncywgLi4uY3R4LnNvZnRUYWdzXWAg4oCUIHRoZSB0YWdzIG9mIHRoZSByZXF1ZXN0IGFza2luZ1xuICAgKiBmb3IgaXQuIFRoYXQgZGlzdGluY3Rpb24gaXMgbG9hZC1iZWFyaW5nLCBiZWNhdXNlIGEgYGZldGNoYCBlbnRyeSBpcyBvbmx5XG4gICAqIGV2ZXIgc3RvcmVkIHdpdGggaXRzICpleHBsaWNpdCogYGNhY2hlOiB7IHRhZ3MgfWAgYW5kIG5ldmVyIHdpdGggdGhlXG4gICAqIGltcGxpY2l0IGBfTl9UXy88cGF0aD5gIGNoYWluLCB3aGljaCBhcnJpdmVzIG9ubHkgYXMgYGN0eC5zb2Z0VGFnc2AuXG4gICAqIFJlYWRpbmcgdGhlIHN0b3JlZCB0YWdzIGZvciBhIGBmZXRjaGAgdG9vIG1lYW50IGFuIHVudGFnZ2VkIGBmb3JjZS1jYWNoZWBcbiAgICogZmV0Y2ggaGFkIGBbXWAsIHNraXBwZWQgdGhlIGNoZWNrIGVudGlyZWx5LCBhbmQgbm8gYHJldmFsaWRhdGVQYXRoYCBjb3VsZFxuICAgKiBldmVyIGV2aWN0IGl0OiBhIGBmb3JjZS1keW5hbWljYCBwYWdlIHdob3NlIGRhdGEgY29tZXMgZnJvbSBzdWNoIGEgZmV0Y2hcbiAgICogcmUtcmVuZGVyZWQgb24gZXZlcnkgcmVxdWVzdCBhbmQgc3RpbGwgc2VydmVkIHRoZSBzYW1lIGJvZHkgZm9yZXZlci5cbiAgICogTWVhc3VyZWQgYWdhaW5zdCBuZXh0LmpzJ3MgYHRlc3QvZTJlL2FwcC1kaXIvcmV2YWxpZGF0ZS1wYXRoLXdpdGgtcmV3cml0ZXNgLlxuICAgKlxuICAgKiBgY2FjaGVLZXlgIGlzIHRoZSBrZXkgdGhlIGVudHJ5IHdhcyByZWFkIHVuZGVyLiBBIHJlc3BvbnNlIGVudHJ5IGZvdW5kXG4gICAqIHN0YWxlIGlzIHJlbWVtYmVyZWQgYnkgaXQsIGZvciBgc2V0YCB0byBpbnZhbGlkYXRlIENsb3VkRnJvbnQgYWdhaW4gb25jZVxuICAgKiBpdHMgcmVnZW5lcmF0aW9uIGxhbmRzOiBzZWUge0BsaW5rIHNvZnRSZXZhbGlkYXRlZEtleXN9LlxuICAgKi9cbiAgYXN5bmMgaXNSZXZhbGlkYXRlZChcbiAgICBlbnRyeTogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IHRhZ3M/OiBzdHJpbmdbXTsgdmFsdWU/OiB1bmtub3duIH0sXG4gICAgY3R4OiBHZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5jb25maWcudGFibGVOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrVGFncyA9IGlzRmV0Y2hDYWNoZUdldChjdHgpXG4gICAgICA/IFsuLi4oY3R4LnRhZ3MgPz8gW10pLCAuLi4oY3R4LnNvZnRUYWdzID8/IFtdKV1cbiAgICAgIDogZW50cnlUYWdzKGVudHJ5KTtcbiAgICBpZiAoY2hlY2tUYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuY2hlY2tJZlJldmFsaWRhdGVkKFxuICAgICAgZW50cnkubGFzdE1vZGlmaWVkID8/IDAsXG4gICAgICBjaGVja1RhZ3MsXG4gICAgKTtcbiAgICBpZiAoc3RhdGUgPT09IFwic3RhbGVcIiAmJiAhaXNGZXRjaENhY2hlR2V0KGN0eCkpIHtcbiAgICAgIHRoaXMubm90ZVNvZnRSZXZhbGlkYXRlZChjYWNoZUtleSwgZW50cnkudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUgPT09IFwiZXhwaXJlZFwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbWVtYmVyIHRoYXQgYGNhY2hlS2V5YCB3YXMgc2VydmVkIHN0YWxlLCB3aGVuIHRoZXJlIGlzIGEgZGlzdHJpYnV0aW9uXG4gICAqIHdob3NlIGNvcHkgb2YgaXQgd2lsbCBuZWVkIGludmFsaWRhdGluZyBhZ2Fpbi4gU2VlXG4gICAqIHtAbGluayBzb2Z0UmV2YWxpZGF0ZWRLZXlzfS5cbiAgICovXG4gIHByaXZhdGUgbm90ZVNvZnRSZXZhbGlkYXRlZChjYWNoZUtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnZhbGlkYXRlc0Nkbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnNlcnZlZFN0YWxlLmFkZCh2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpO1xuICAgIGlmICh0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuc2l6ZSA+PSBNQVhfU09GVF9SRVZBTElEQVRFRF9LRVlTKSB7XG4gICAgICAvLyBJbnNlcnRpb24gb3JkZXI6IHRoZSBmaXJzdCBrZXkgaXMgdGhlIG9uZSB3YWl0aW5nIGxvbmdlc3QuXG4gICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5hZGQoY2FjaGVLZXkpO1xuICB9XG5cbiAgYXN5bmMgc2V0KFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgZGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlIHwgbnVsbCxcbiAgICBjdHg6IFNldENhY2hlSGFuZGxlckNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSBlbnRyeSdzIG5hbWUgaW4gdGFnIG1hcHBpbmdzIGFuZCBDbG91ZEZyb250IHBhdGhzLCBhbmQgdGhlIG9iamVjdFxuICAgIC8vIGl0IGlzIHN0b3JlZCBpbiwgd2hpY2ggZGlmZmVyIGZvciBhIG5hbWUgdG9vIGxvbmcgZm9yIFMzLlxuICAgIGNvbnN0IHMzS2V5ID0gYnVpbGRTM0tleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSk7XG4gICAgY29uc3Qgb2JqZWN0S2V5ID0gczNPYmplY3RLZXkodGhpcy5jb25maWcuYnVpbGRJZCwgY2FjaGVLZXkpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgLy8gRGVsZXRlIGZyb20gUzMgYW5kIER5bmFtb0RCXG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURTogJHtjYWNoZUtleX1gKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZW50cnkgaXMgZ29uZSwgc28gdGhlcmUgaXMgbm8gcmVnZW5lcmF0aW9uIGxlZnQgdG8gd2FpdCBmb3IuXG4gICAgICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGVudHJ5J3MgdGFncyBiZWZvcmUgdGhlIG9iamVjdCBpcyBnb25lOiB0aGV5IGFyZSB0aGUgb25seVxuICAgICAgICAvLyB3YXkgdG8gbmFtZSBpdHMgbWFwcGluZyByb3dzLCB3aG9zZSBzb3J0IGtleSBpcyBgdGFnI3MzS2V5YCBhbmQgc29cbiAgICAgICAgLy8gY2Fubm90IGJlIHF1ZXJpZWQgZnJvbSB0aGUga2V5IHNpZGUuIFNlZSBgc3RvcmVkRW50cnlUYWdzYC5cbiAgICAgICAgY29uc3QgdGFncyA9IGF3YWl0IHRoaXMuc3RvcmVkRW50cnlUYWdzKG9iamVjdEtleSwgY3R4KTtcblxuICAgICAgICBhd2FpdCB0aGlzLnMzQ2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IERlbGV0ZU9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmNvbmZpZy5idWNrZXROYW1lLFxuICAgICAgICAgICAgS2V5OiBvYmplY3RLZXksXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIERFTEVURUQ6ICR7b2JqZWN0S2V5fWApO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRHluYW1vREJUYWdNYXBwaW5ncyhzM0tleSwgdGFncyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gYGVudHJ5VGFnc2AsIG5vdCBgZ2V0VGFncyhjdHgpYCBhbG9uZTogZm9yIGEgcGFnZSBvciByb3V0ZSByZXNwb25zZVxuICAgICAgLy8gYGN0eGAgY2FycmllcyBvbmx5IGB7IGNhY2hlQ29udHJvbCwgaXNSb3V0ZVBQUkVuYWJsZWQsIGlzRmFsbGJhY2sgfWAg4oCUXG4gICAgICAvLyBgUmVzcG9uc2VDYWNoZS5zZXRgIGJ1aWxkcyBpdCB0aGF0IHdheSBhbmQgYEluY3JlbWVudGFsQ2FjaGUuc2V0YFxuICAgICAgLy8gZm9yd2FyZHMgaXQgdW5jaGFuZ2VkIOKAlCBzbyB0aGUgdGFncyBsaXZlIGluIHRoZSByZW5kZXInc1xuICAgICAgLy8gYHgtbmV4dC1jYWNoZS10YWdzYCBoZWFkZXIgYW5kIG5vd2hlcmUgZWxzZS4gUmVhZGluZyBvbmx5IGBjdHhgIG1lYW50IG5vXG4gICAgICAvLyBydW50aW1lLXJlbmRlcmVkIHBhZ2UgZXZlciBnb3QgYSBtYXBwaW5nIHJvdywgYW5kIGEgcGFnZSB0aGF0IGlzIG5vdCBpblxuICAgICAgLy8gdGhlIGJ1aWxkJ3MgdGFnIG1hbmlmZXN0IG5hbWVzIG5vbmUgZWl0aGVyOiBhIGxhdGVyXG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AgZm91bmQgbm90aGluZyB0byBpbnZhbGlkYXRlIGFuZCBDbG91ZEZyb250IGtlcHQgc2VydmluZ1xuICAgICAgLy8gdGhlIHN0YWxlIEhUTUwgYW5kIFJTQyBwYXlsb2FkIGZvciB0aGUgd2hvbGUgYHMtbWF4YWdlYC4gU2FtZSBzb3VyY2UgdGhlXG4gICAgICAvLyByZWFkIHBhdGggYWJvdmUgYWxyZWFkeSBmYWxscyBiYWNrIHRvLlxuICAgICAgY29uc3QgdGFncyA9IGVudHJ5VGFncyh7IHRhZ3M6IGdldFRhZ3MoY3R4KSwgdmFsdWU6IGRhdGEgfSk7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgUzMgQ0FDSEUgU0VUOiBLZXk6ICR7Y2FjaGVLZXl9LCB0YWdzOiAke3RhZ3MubGVuZ3RoID8gdGFncyA6IFwibm9uZVwifWAsXG4gICAgICApO1xuXG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgQ2FjaGVIYW5kbGVyVmFsdWUgc3RydWN0dXJlIGZvciBTMyBzdG9yYWdlIHdpdGggdGFnc1xuICAgICAgY29uc3QgY2FjaGVIYW5kbGVyVmFsdWU6IENhY2hlSGFuZGxlclZhbHVlID0ge1xuICAgICAgICAvLyBPbiB0aGUgbWFya2VyIGNsb2NrLCBzaW5jZSB0aGF0IGlzIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aC5cbiAgICAgICAgbGFzdE1vZGlmaWVkOiBtYXJrZXJDbG9jaygpLFxuICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgY2FjaGVDb250cm9sOiBnZXRDYWNoZUNvbnRyb2woY3R4KSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRhZ3Mgd2l0aCB0aGUgY2FjaGUgZW50cnkgZm9yIHJldmFsaWRhdGlvbiBjaGVja2luZ1xuICAgICAgY29uc3QgY2FjaGVFbnRyeVdpdGhUYWdzID0ge1xuICAgICAgICAuLi5jYWNoZUhhbmRsZXJWYWx1ZSxcbiAgICAgICAgdGFncyxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSB3aXRoIGN1c3RvbSBoYW5kbGluZyBmb3IgTWFwIGFuZCBCdWZmZXIgb2JqZWN0c1xuICAgICAgY29uc3QgYm9keSA9IHNlcmlhbGl6ZUNhY2hlVmFsdWUoY2FjaGVFbnRyeVdpdGhUYWdzKTtcblxuICAgICAgLy8gQWx3YXlzIEpTT04gc2luY2Ugd2Ugc3RvcmUgQ2FjaGVIYW5kbGVyVmFsdWVcbiAgICAgIGF3YWl0IHRoaXMuYnVja2V0LnB1dEpzb24ob2JqZWN0S2V5LCBib2R5KTtcblxuICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgU1RPUkVEOiAke2NhY2hlS2V5fSAoJHtkYXRhLmtpbmR9KWApO1xuXG4gICAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIG9mIGFuIGVudHJ5IHNlcnZlZCBzdGFsZTogQ2xvdWRGcm9udCBtYXkgaGF2ZSBjYWNoZWRcbiAgICAgIC8vIHRoYXQgc3RhbGUgcmVzcG9uc2UgYWZ0ZXIgYHJldmFsaWRhdGVUYWdgJ3MgaW52YWxpZGF0aW9uLCBzbyB0aGUga2V5J3NcbiAgICAgIC8vIHBhdGhzIGdvIG9uY2UgbW9yZSBub3cgdGhhdCBTMyBob2xkcyB0aGUgZnJlc2ggb25lLlxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5zZXJ2ZWRTdGFsZS5oYXMoZGF0YSkgJiZcbiAgICAgICAgdGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLmRlbGV0ZShjYWNoZUtleSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuczNLZXlUb0ludmFsaWRhdGlvblBhdGgoczNLZXkpO1xuICAgICAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuZGVidWcoYFNPRlQgUkVWQUxJREFUSU9OIFJFR0VORVJBVEVEOiAke2NhY2hlS2V5fWApO1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhcbiAgICAgICAgICAgIGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlLCB0aGlzLmNsb3VkRnJvbnRDb25maWcuYmFzZVBhdGgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGFnLXRvLWNhY2hlLWtleSBtYXBwaW5ncyBpbiBEeW5hbW9EQiBmb3IgcmV2YWxpZGF0aW9uXG4gICAgICBpZiAodGFncy5sZW5ndGggPiAwICYmIHRoaXMubWFwc1RhZ3NUb1BhdGhzKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYFNUT1JJTkcgVEFHUzogJHtjYWNoZUtleX0gLT4gWyR7dGFncy5qb2luKFwiLCBcIil9XWApO1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JlRHluYW1vREJUYWdNYXBwaW5ncyhzM0tleSwgdGFncyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzdG9yaW5nIGNhY2hlIHRvIFMzOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV2YWxpZGF0ZVRhZyhcbiAgICB0YWc6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIGR1cmF0aW9ucz86IFJldmFsaWRhdGVEdXJhdGlvbnMsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHRhZykgPyB0YWcgOiBbdGFnXTtcbiAgICB0aGlzLmRlYnVnKGBSRVZBTElEQVRJTkcgVEFHUzogWyR7dGFncy5qb2luKFwiLCBcIil9XWApO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy50YWJsZU5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWNvcmQgdGhlIHJldmFsaWRhdGlvbiBhZ2FpbnN0IGVhY2ggdGFnIGl0c2VsZiwgbm90IG9ubHkgYWdhaW5zdCB0aGVcbiAgICAvLyBjYWNoZSBrZXlzIGFscmVhZHkgbWFwcGVkIHRvIGl0OiBgY2hlY2tJZlJldmFsaWRhdGVkYCByZWFkcyB0aGVzZSBtYXJrZXJcbiAgICAvLyByb3dzLCBhbmQgYSBidWlsZC10aW1lIHByZXJlbmRlciBoYXMgbm8gbWFwcGluZyByb3dzIGF0IGFsbC5cbiAgICBjb25zdCByZWNvcmRlZCA9IGF3YWl0IHRoaXMudGFncy51cGRhdGUodGFncywgZHVyYXRpb25zKTtcblxuICAgIGlmICghdGhpcy5tYXBzVGFnc1RvUGF0aHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGJhc2VQYXRoIH0gPSB0aGlzLmNsb3VkRnJvbnRDb25maWc7XG4gICAgaWYgKCFyZWNvcmRlZCkge1xuICAgICAgLy8gT3RoZXIgaW5zdGFuY2VzIG1heSBuZXZlciBsZWFybiBvZiB0aGlzIHJldmFsaWRhdGlvbiwgc28gbm8gcGF0aCBsaXN0XG4gICAgICAvLyBpcyBlbm91Z2g6IGRyb3AgdGhlIHdob2xlIGFwcCBmcm9tIENsb3VkRnJvbnQgcmF0aGVyIHRoYW4gc2VydmUgc3RhbGVcbiAgICAgIC8vIHBhZ2VzIHVudGlsIHRoZWlyIFRUTC5cbiAgICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyh3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzKGJhc2VQYXRoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0dGxlZCByYXRoZXIgdGhhbiBgYWxsYDogb25lIHRhZydzIHRocm90dGxlZCBRdWVyeSBtdXN0IG5vdCBkcm9wIHRoZVxuICAgIC8vIENsb3VkRnJvbnQgcGF0aHMgZXZlcnkgb3RoZXIgdGFnIHJlc29sdmVkLlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0YWdzLm1hcCgodCkgPT4gdGhpcy50YWdSb3V0ZXModCkpLFxuICAgICk7XG4gICAgY29uc3Qgcm91dGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCB3aG9sZUFwcCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgdGFnIG1hcHBpbmdzOlwiLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgLy8gVGhlIHRhZydzIGVudHJpZXMgYXJlIHJldmFsaWRhdGVkIGF0IHRoZSBvcmlnaW4gd2hpbGUgbm90aGluZyBuYW1lc1xuICAgICAgICAvLyB0aGVpciBDbG91ZEZyb250IHBhdGhzLiBUaGUgc2FtZSBhbnN3ZXIgYXMgYSB0YWcgY3V0IHNob3J0IGJ5XG4gICAgICAgIC8vIGBNQVhfVEFHX1FVRVJZX1BBR0VTYDogdGhlIHdob2xlIGFwcCwgbmV2ZXIgYSBzdGFsZSBwYWdlLlxuICAgICAgICB3aG9sZUFwcCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goLi4ucmVzdWx0LnZhbHVlLnJvdXRlcyk7XG4gICAgICB3aG9sZUFwcCB8fD0gcmVzdWx0LnZhbHVlLnRydW5jYXRlZDtcbiAgICB9XG5cbiAgICAvLyBJbnZhbGlkYXRlIHRoZSBDRE4gZWRnZSBjYWNoZSBzbyBDbG91ZEZyb250LWZyb250ZWQgZGVwbG95bWVudHMgZG9uJ3RcbiAgICAvLyBrZWVwIHNlcnZpbmcgc3RhbGUgcmVzcG9uc2VzIHVudGlsIHRoZSBjYWNoZSBwb2xpY3kncyBUVEwgbmF0dXJhbGx5XG4gICAgLy8gZXhwaXJlcy4gT25lIHJlcXVlc3QgZm9yIGV2ZXJ5IHRhZyBhdCBvbmNlOiBzZWVcbiAgICAvLyBgTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT05gIGZvciB3aHkgbmV2ZXIgc2V2ZXJhbC5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250UGF0aHMoXG4gICAgICB3aG9sZUFwcFxuICAgICAgICA/IHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoYmFzZVBhdGgpXG4gICAgICAgIDogcm91dGVzLmZsYXRNYXAoKHJvdXRlKSA9PiBjZG5JbnZhbGlkYXRpb25QYXRocyhyb3V0ZSwgYmFzZVBhdGgpKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByb3V0ZXMgQ2xvdWRGcm9udCBjb3VsZCBiZSBob2xkaW5nIGEgcmVzcG9uc2UgZm9yIGB0YWdgIHVuZGVyIC1cbiAgICogYHRydW5jYXRlZGAgd2hlbiB0aGV5IGNvdWxkIG5vdCBhbGwgYmUgbmFtZWQ6IG1vcmUgbWFwcGluZyByb3dzIHRoYW5cbiAgICoge0BsaW5rIE1BWF9UQUdfUVVFUllfUEFHRVN9LCBvciBubyBidWlsZCB0YWcgbWFuaWZlc3QgdG8gcmVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdGFnUm91dGVzKFxuICAgIHRhZzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgcm91dGVzOiBzdHJpbmdbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBza1ByZWZpeCA9IHRoaXMudGFnTWFwcGluZ1ByZWZpeCh0YWcpO1xuICAgIGNvbnN0IFt7IGl0ZW1zLCB0cnVuY2F0ZWQgfSwgYnVpbGRUYWdzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMucXVlcnlUYWdNYXBwaW5ncyh0YWcsIHNrUHJlZml4KSxcbiAgICAgIHRoaXMuYnVpbGRUYWdNYW5pZmVzdCgpLFxuICAgIF0pO1xuICAgIC8vIEV4dHJhY3QgUzMga2V5cyBmcm9tIHNvcnQga2V5cyAoZm9ybWF0OiBcInRhZyNzM0tleVwiKS4gU3BsaXQgYXQgdGhlIHRhZydzXG4gICAgLy8gb3duIGxlbmd0aCByYXRoZXIgdGhhbiBhdCB0aGUgZmlyc3QgXCIjXCI6IGEgdGFnIGlzIGFwcC1kZWZpbmVkIGFuZCBtYXlcbiAgICAvLyBjb250YWluIG9uZSwgYW5kIGByZXZhbGlkYXRlVGFnKFwidXNlciM0MlwiKWAgdGhlbiB5aWVsZGVkXG4gICAgLy8gXCI0MiM8YnVpbGRJZD4vYWNjb3VudC5qc29uXCIg4oCUIHdob3NlIGludmFsaWRhdGlvbiBwYXRoXG4gICAgLy8gKFwiLzQyIzxidWlsZElkPi9hY2NvdW50XCIpIG5hbWVzIG5vdGhpbmcgQ2xvdWRGcm9udCBjYWNoZWQsIHNvIHRoZSBlZGdlXG4gICAgLy8ga2VwdCBzZXJ2aW5nIHRoZSBzdGFsZSBwYWdlLlxuICAgIC8vXG4gICAgLy8gVGhlIHNhbWUgYCNgIG1ha2VzIGBiZWdpbnNfd2l0aChzaywgXCJ1c2VyI1wiKWAgbWF0Y2ggcm93cyB0aGF0IGFyZSBub3RcbiAgICAvLyBgdXNlcmAncyBhdCBhbGw6IHRoZSBtYXJrZXIgcm93IG9mIHRhZyBgdXNlciM0MmAgKHNrIGB1c2VyIzQyYCkgYW5kIGV2ZXJ5XG4gICAgLy8gbWFwcGluZyByb3cgb2YgaXQgKGB1c2VyIzQyIzxidWlsZElkPi/igKZgKS4gV2hhdCBpcyBsZWZ0IGFmdGVyIHRoZSBwcmVmaXhcbiAgICAvLyBpcyBhbiBTMyBrZXkgb25seSBpZiBpdCBzdGFydHMgd2l0aCB0aGUgYnVpbGQncyBvd24gcHJlZml4LCB3aGljaCBpcyBob3dcbiAgICAvLyBgYnVpbGRTM0tleWAgd3JpdGVzIGV2ZXJ5IG9uZS5cbiAgICAvL1xuICAgIC8vIEEgcm93IHdob3NlIGtleSB3b3VsZCBub3QgZml0IGEgc29ydCBrZXkgaGFzIGl0IGhhc2hlZCB0aGVyZSwgYW5kIGV2ZXJ5XG4gICAgLy8gcm93IGNhcnJpZXMgaXQgaW4gYHMzS2V5YCAocm93cyB3cml0dGVuIGJlZm9yZSB0aGF0IGF0dHJpYnV0ZSBmYWxsIGJhY2tcbiAgICAvLyB0byB0aGUgc29ydCBrZXkpOiBzZWUgYHRhZ01hcHBpbmdTb3J0S2V5YC4gQW4gZW1wdHkgcmVtYWluZGVyIGlzIG5ldmVyIGFcbiAgICAvLyBtYXBwaW5nIHJvdzogaXQgaXMgdGhlIG1hcmtlciByb3cgb2YgYSB0YWcgb25lIGAjYCBsb25nZXIuXG4gICAgY29uc3QgcHJlZml4TGVuZ3RoID0gc2tQcmVmaXgubGVuZ3RoO1xuICAgIGNvbnN0IGtleVByZWZpeCA9IHRoaXMuY29uZmlnLmJ1aWxkSWQgPyBgJHt0aGlzLmNvbmZpZy5idWlsZElkfS9gIDogXCJcIjtcbiAgICBjb25zdCBzM0tleXMgPSBpdGVtcy5mbGF0TWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZXN0ID0gaXRlbS5zaz8uUz8uc2xpY2UocHJlZml4TGVuZ3RoKTtcbiAgICAgIHJldHVybiByZXN0ICYmIHJlc3Quc3RhcnRzV2l0aChrZXlQcmVmaXgpID8gW2l0ZW0uczNLZXk/LlMgPz8gcmVzdF0gOiBbXTtcbiAgICB9KTtcbiAgICAvLyBUaGUgYnVpbGQtdGltZSBwcmVyZW5kZXJzIGNhcnJ5aW5nIHRoZSB0YWcsIHdoaWNoIG5vIGBzZXRgIHdyb3RlIGEgcm93XG4gICAgLy8gZm9yLlxuICAgIGZvciAoY29uc3QgY2FjaGVLZXkgb2YgYnVpbGRUYWdzPy5nZXQodGFnKSA/PyBbXSkge1xuICAgICAgczNLZXlzLnB1c2goYnVpbGRTM0tleSh0aGlzLmNvbmZpZy5idWlsZElkLCBjYWNoZUtleSkpO1xuICAgIH1cblxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgVEFHICR7dGFnfTogRm91bmQgJHtzM0tleXMubGVuZ3RofSBjYWNoZSBlbnRyaWVzIHRvIGludmFsaWRhdGVgLFxuICAgICk7XG5cbiAgICAvLyBUaGUgbWFwcGluZyByb3dzIHRoZW1zZWx2ZXMgYXJlIGRlbGliZXJhdGVseSBsZWZ0IGFsb25lLiBTdGFtcGluZ1xuICAgIC8vIGByZXZhbGlkYXRlZEF0YCBvbiBlYWNoIGB0YWcjY2FjaGVLZXlgIHJvdyBpcyB3aGF0IHRoaXMgdXNlZCB0byBkbywgYW5kXG4gICAgLy8gbm90aGluZyBoYXMgcmVhZCB0aGF0IGF0dHJpYnV0ZSBzaW5jZSBgY2hlY2tJZlJldmFsaWRhdGVkYCBiZWdhbiByZWFkaW5nXG4gICAgLy8gdGhlIGJhcmUtdGFnIG1hcmtlciByb3cgd3JpdHRlbiBhYm92ZSDigJQgc28gdGhlIHdyaXRlcyB3ZXJlIGRlYWQsIGFuZCB0aGV5XG4gICAgLy8gd2VyZSBkZWFkICppbiBmcm9udCBvZiogdGhlIGludmFsaWRhdGlvbi4gT25lIHRocm90dGxlZCBgVXBkYXRlSXRlbWBcbiAgICAvLyByZWplY3RlZCB0aGUgYmF0Y2gsIHRoZSBDbG91ZEZyb250IGludmFsaWRhdGlvbiBuZXZlciByYW4sIGFuZCB0aGUgb25seVxuICAgIC8vIHRyYWNlIHdhcyBhIGBjb25zb2xlLmVycm9yYCB3aGlsZSB0aGUgZWRnZSBrZXB0IHNlcnZpbmcgdGhlIHN0YWxlIHBhZ2UuXG4gICAgLy9cbiAgICAvLyBEZWxpYmVyYXRlbHkgbm90IGRlbGV0aW5nIHRoZSB0YWcncyBTMyBvYmplY3RzIGVpdGhlci4gVGhlIG1hcmtlciByb3dcbiAgICAvLyBhYm92ZSBpcyB3aGF0IGludmFsaWRhdGVzIHRoZW06IGBnZXRgIGNvbXBhcmVzIGl0IGFnYWluc3QgZWFjaCBlbnRyeSdzXG4gICAgLy8gb3duIGBsYXN0TW9kaWZpZWRgIGFuZCBoYW5kcyB0aGUgZW50cnkgYmFjayBleHBpcmVkLCB3aGljaCBpcyB0aGUgc2lnbmFsXG4gICAgLy8gdGhhdCBtYWtlcyBOZXh0LmpzIHJlLXJlbmRlciAqdGhpcyogcm91dGUgYW5kIHN0b3JlIHRoZSByZXN1bHQgKHNlZVxuICAgIC8vIGBFWFBJUkVEX0xBU1RfTU9ESUZJRURgKS4gRGVsZXRpbmcgdGhlIG9iamVjdCBpbnN0ZWFkIHR1cm5lZCB0aGUgbmV4dFxuICAgIC8vIHJlcXVlc3QgaW50byBhIGhhcmQgbWlzcywgYW5kIGEgaGFyZCBtaXNzIG9uIGEgUFBSIHJvdXRlIGlzIGFuc3dlcmVkIGZyb21cbiAgICAvLyB0aGUgcm91dGUncyBmYWxsYmFjayBzaGVsbCDigJQgdW5jYWNoZWFibGUsIGFuZCBuZXZlciB1cGdyYWRlZCBiYWNrIGludG8gYVxuICAgIC8vIGNvbmNyZXRlIGVudHJ5LCBzbyBvbmUgYHJldmFsaWRhdGVUYWdgIGxlZnQgdGhlIHBhZ2UgcmVzdW1pbmdcbiAgICAvLyBkeW5hbWljYWxseSBmb3IgZ29vZC5cbiAgICBjb25zdCByb3V0ZXMgPSBzM0tleXNcbiAgICAgIC5tYXAoKHMzS2V5KSA9PiB0aGlzLnMzS2V5VG9JbnZhbGlkYXRpb25QYXRoKHMzS2V5KSlcbiAgICAgIC5maWx0ZXIoKHJvdXRlKTogcm91dGUgaXMgc3RyaW5nID0+IHJvdXRlICE9PSB1bmRlZmluZWQpO1xuICAgIC8vIEEgYHJldmFsaWRhdGVQYXRoYCBuYW1lcyBpdHMgcGF0aCBpbiB0aGUgdGFnIGl0c2VsZiwgd2hpY2ggaXMgdGhlIG9ubHlcbiAgICAvLyB3YXkgdG8gcmVhY2ggYSBidWlsZC10aW1lIHByZXJlbmRlcidzIENETiBjb3B5IHdoZW4gaXQgaGFzIG5vIG1hcHBpbmdcbiAgICAvLyByb3cuXG4gICAgcm91dGVzLnB1c2goLi4uaW1wbGljaXRUYWdQYXRocyh0YWcpKTtcbiAgICByZXR1cm4geyByb3V0ZXMsIHRydW5jYXRlZDogdHJ1bmNhdGVkIHx8ICFidWlsZFRhZ3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQtdGltZSBwcmVyZW5kZXJzJyBjYWNoZSBrZXlzIGJ5IHRhZyAoe0BsaW5rIElOSVRfQ0FDSEVfVEFHX01BTklGRVNUfSksXG4gICAqIHJlYWQgZnJvbSB0aGUgY2FjaGUgYnVja2V0IG9uY2UgcGVyIGluc3RhbmNlLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoYXRcbiAgICogZmFpbGVkLCB0byBiZSByZWFkIGFnYWluIG5leHQgdGltZS4gQSBwcmVyZW5kZXIgaXMgd3JpdHRlbiBieSB0aGUgYWRhcHRlcixcbiAgICogbmV2ZXIgdGhyb3VnaCBgc2V0YCwgc28gdGhpcyBpcyB0aGUgb25seSByZWNvcmQgb2Ygd2hpY2ggdGFncyBuYW1lIGl0c1xuICAgKiBDbG91ZEZyb250IHBhdGhzLCBhbmQgaXQgaXMgc2VydmVkIHdpdGggYSB5ZWFyLWxvbmcgYHMtbWF4YWdlYC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUYWdNYW5pZmVzdCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZD4ge1xuICAgIHRoaXMuYnVpbGRUYWdzID8/PSB0aGlzLmJ1Y2tldFxuICAgICAgLmdldChgJHt0aGlzLmNvbmZpZy5idWlsZElkfS8ke0lOSVRfQ0FDSEVfVEFHX01BTklGRVNUfWApXG4gICAgICAvLyBOb25lIGlzIG5vcm1hbDogb25seSB0YWdnZWQgcHJlcmVuZGVycyB3cml0ZSBvbmUuXG4gICAgICAudGhlbigob2JqZWN0KSA9PiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKEpTT04ucGFyc2Uob2JqZWN0ID8/IFwie31cIikpKSk7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRUYWdzLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5idWlsZFRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVhZCB0aGUgYnVpbGQncyB0YWcgbWFuaWZlc3Q6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlcnkgbWFwcGluZyByb3cgZm9yIGB0YWdgIC0gdGhvc2Ugd2hvc2Ugc29ydCBrZXkgc3RhcnRzIHdpdGhcbiAgICogYHNrUHJlZml4YCwgaXRzIHtAbGluayB0YWdNYXBwaW5nUHJlZml4fSAtIGZvbGxvd2luZyBgTGFzdEV2YWx1YXRlZEtleWAsIGFuZCB3aGV0aGVyXG4gICAqIHtAbGluayBNQVhfVEFHX1FVRVJZX1BBR0VTfSBjdXQgdGhlIHdhbGsgc2hvcnQuXG4gICAqXG4gICAqIER5bmFtb0RCIGNhcHMgYSBRdWVyeSBhdCAxIE1CIG9mIGl0ZW1zIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgbWF0Y2gsIGFuZFxuICAgKiB0aGVyZSBpcyBvbmUgcm93IHBlciB0YWdnZWQgZW50cnkgYSBydW50aW1lIGBzZXRgIHdyb3RlLCBzbyBhIGxhcmdlIHNpdGVcbiAgICogcGFzc2VzIDEgTUIgb24gYSBjb21tb24gdGFnLiBTdG9wcGluZyBhdCB0aGVcbiAgICogZmlyc3QgcGFnZSBpbnZhbGlkYXRlcyBvbmx5IHRoYXQgcGFnZSdzIGVudHJpZXMgd2hpbGUgc3RpbGwgcmVwb3J0aW5nXG4gICAqIHN1Y2Nlc3MsIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gcmV2YWxpZGF0aW9uIGhhdmluZyB3b3JrZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHF1ZXJ5VGFnTWFwcGluZ3MoXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgc2tQcmVmaXg6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT5bXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBpdGVtczogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+W10gPSBbXTtcbiAgICBsZXQgZXhjbHVzaXZlU3RhcnRLZXk6IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcGFnZXMgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmR5bmFtb0NsaWVudC5zZW5kKFxuICAgICAgICBuZXcgUXVlcnlDb21tYW5kKHtcbiAgICAgICAgICBUYWJsZU5hbWU6IHRoaXMuY29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICBLZXlDb25kaXRpb25FeHByZXNzaW9uOiBcInBrID0gOnBrIEFORCBiZWdpbnNfd2l0aChzaywgOnNrUHJlZml4KVwiLFxuICAgICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgIFwiOnBrXCI6IHsgUzogdGhpcy5jb25maWcuYnVpbGRJZCB9LFxuICAgICAgICAgICAgXCI6c2tQcmVmaXhcIjogeyBTOiBza1ByZWZpeCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgRXhjbHVzaXZlU3RhcnRLZXk6IGV4Y2x1c2l2ZVN0YXJ0S2V5LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBpdGVtcy5wdXNoKC4uLihyZXNwb25zZS5JdGVtcyA/PyBbXSkpO1xuICAgICAgZXhjbHVzaXZlU3RhcnRLZXkgPSByZXNwb25zZS5MYXN0RXZhbHVhdGVkS2V5O1xuICAgICAgcGFnZXMrKztcbiAgICB9IHdoaWxlIChleGNsdXNpdmVTdGFydEtleSAmJiBwYWdlcyA8IE1BWF9UQUdfUVVFUllfUEFHRVMpO1xuXG4gICAgY29uc3QgdHJ1bmNhdGVkID0gZXhjbHVzaXZlU3RhcnRLZXkgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTdG9wcGVkIHBhZ2luYXRpbmcgdGFnIFwiJHt0YWd9XCIgYWZ0ZXIgJHtwYWdlc30gcGFnZXMgYCArXG4gICAgICAgICAgYCgke2l0ZW1zLmxlbmd0aH0gZW50cmllcyk7IGludmFsaWRhdGluZyB0aGUgd2hvbGUgYXBwIGluc3RlYWQuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IGl0ZW1zLCB0cnVuY2F0ZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnNlcyBgYnVpbGRTM0tleWAgdG8gcmVjb3ZlciB0aGUgcm91dGUgdGhlIHJlc3BvbnNlIHdhcyBjYWNoZWQgZm9yLCBmb3JcbiAgICoge0BsaW5rIGNkbkludmFsaWRhdGlvblBhdGhzfSB0byB0dXJuIGludG8gdGhlIFVSSXMgQ2xvdWRGcm9udCBob2xkcyBpdCB1bmRlciwgb3JcbiAgICogYHVuZGVmaW5lZGAgZm9yIGEga2V5IHRoYXQgbmFtZXMgbm8gY2FjaGVkIFVSSS5cbiAgICpcbiAgICogVHdvIGtpbmRzIG9mIG1hcHBpbmcgcm93IGRvIG5vdDogYSBkeW5hbWljIHJvdXRlIHRlbXBsYXRlIChgYmxvZy9bc2x1Z10uanNvbmAsXG4gICAqIHdoaWNoIHRoZSBhZGFwdGVyJ3Mgc2VlZGVkIGVudHJpZXMgaW5jbHVkZSksIGFuZCBhIGZldGNoLWNhY2hlIGVudHJ5LCB3aG9zZVxuICAgKiBrZXkgaXMgYW4gb3BhcXVlIGhhc2ggcmF0aGVyIHRoYW4gYSByb3V0ZS4gQm90aCB3b3VsZCBpbnZhbGlkYXRlIGEgVVJJIHRoYXRcbiAgICogY2Fubm90IGV4aXN0LCBhbmQgZWFjaCBvbmUgY29zdHMgb25lIG9mIHRoZSBmaWZ0ZWVuIHdpbGRjYXJkIHBhdGhzIGFuXG4gICAqIGludmFsaWRhdGlvbiBtYXkgY2Fycnkg4oCUIHNvIHRoZXkgYXJlIGRyb3BwZWQgaGVyZSByYXRoZXIgdGhhbiBjcm93ZGluZyBvdXRcbiAgICogdGhlIHJlYWwgb25lcy5cbiAgICovXG4gIHByaXZhdGUgczNLZXlUb0ludmFsaWRhdGlvblBhdGgoczNLZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHJlZml4ID0gYCR7dGhpcy5jb25maWcuYnVpbGRJZH0vYDtcbiAgICBjb25zdCB3aXRob3V0UHJlZml4ID0gczNLZXkuc3RhcnRzV2l0aChwcmVmaXgpXG4gICAgICA/IHMzS2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpXG4gICAgICA6IHMzS2V5O1xuICAgIGNvbnN0IHdpdGhvdXRTdWZmaXggPSB3aXRob3V0UHJlZml4LmVuZHNXaXRoKFwiLmpzb25cIilcbiAgICAgID8gd2l0aG91dFByZWZpeC5zbGljZSgwLCAtXCIuanNvblwiLmxlbmd0aClcbiAgICAgIDogd2l0aG91dFByZWZpeDtcblxuICAgIGlmICh3aXRob3V0U3VmZml4LmluY2x1ZGVzKFwiW1wiKSB8fCBpc0ZldGNoQ2FjaGVLZXkod2l0aG91dFN1ZmZpeCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIG5leHQgPj0gMTYuMy44OiBgcm91dGUtY2FjaGUvPGtpbmQ+LzxoYXNoPi8kPHBhdGhuYW1lPmAsIHRoZSBwYXRobmFtZVxuICAgIC8vIHRocm91Z2ggYG5vcm1hbGl6ZVBhZ2VQYXRoYC5cbiAgICBjb25zdCByb3V0ZUNhY2hlS2V5ID0gUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWC5leGVjKHdpdGhvdXRTdWZmaXgpO1xuICAgIGlmIChyb3V0ZUNhY2hlS2V5KSB7XG4gICAgICByZXR1cm4gZGVub3JtYWxpemVQYWdlUGF0aCh3aXRob3V0U3VmZml4LnNsaWNlKHJvdXRlQ2FjaGVLZXlbMF0ubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiB3aXRob3V0U3VmZml4ID09PSBcImluZGV4XCIgPyBcIi9cIiA6IGAvJHt3aXRob3V0U3VmZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBgcGF0aHNgIGluIGEgc2luZ2xlIHJlcXVlc3QsIG9yIHRoZSB3aG9sZSBhcHBcbiAgICogKHtAbGluayB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzfSkgd2hlbiB0aGV5IHdvdWxkIG5vdCBmaXQgaW4gb25lLiBTZWVcbiAgICoge0BsaW5rIE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OfS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhwYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgYmF0Y2ggPSBBcnJheS5mcm9tKG5ldyBTZXQocGF0aHMpKTtcbiAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uSWQgPSBhd2FpdCB0aGlzLmdldERpc3RyaWJ1dGlvbklkKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVzb2x2ZSB0aGUgZGlzdHJpYnV0aW9uIHRvIGludmFsaWRhdGU6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIGlmICghZGlzdHJpYnV0aW9uSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aWxkY2FyZHMgPSBiYXRjaC5maWx0ZXIoaXNXaWxkY2FyZFBhdGgpLmxlbmd0aDtcbiAgICBpZiAoXG4gICAgICB3aWxkY2FyZHMgPiBNQVhfV0lMRENBUkRfUEFUSFNfUEVSX0lOVkFMSURBVElPTiB8fFxuICAgICAgYmF0Y2gubGVuZ3RoID4gTUFYX1BBVEhTX1BFUl9JTlZBTElEQVRJT05cbiAgICApIHtcbiAgICAgIGNvbnN0IHdob2xlQXBwID0gd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhcbiAgICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBDTE9VREZST05UIElOVkFMSURBVElPTjogJHtiYXRjaC5sZW5ndGh9IHBhdGhzICgke3dpbGRjYXJkc30gYCArXG4gICAgICAgICAgYHdpbGRjYXJkcykgZG8gbm90IGZpdCBvbmUgcmVxdWVzdCwgY29sbGFwc2luZyB0byBgICtcbiAgICAgICAgICBgWyR7d2hvbGVBcHAuam9pbihcIiwgXCIpfV1gLFxuICAgICAgKTtcbiAgICAgIGJhdGNoID0gd2hvbGVBcHA7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgQ0xPVURGUk9OVCBJTlZBTElEQVRJT046IFske2JhdGNoLmpvaW4oXCIsIFwiKX1dIG9uIGRpc3RyaWJ1dGlvbiAke2Rpc3RyaWJ1dGlvbklkfWAsXG4gICAgICApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbG91ZEZyb250Q2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IENyZWF0ZUludmFsaWRhdGlvbkNvbW1hbmQoe1xuICAgICAgICAgICAgRGlzdHJpYnV0aW9uSWQ6IGRpc3RyaWJ1dGlvbklkLFxuICAgICAgICAgICAgSW52YWxpZGF0aW9uQmF0Y2g6IHtcbiAgICAgICAgICAgICAgQ2FsbGVyUmVmZXJlbmNlOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgICAgIFBhdGhzOiB7XG4gICAgICAgICAgICAgICAgUXVhbnRpdHk6IGJhdGNoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBJdGVtczogYmF0Y2gsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNJbnZhbGlkYXRpb25RdW90YUVycm9yKGVycm9yKSAmJiBhdHRlbXB0IDwgSU5WQUxJREFUSU9OX1JFVFJJRVMpIHtcbiAgICAgICAgICAvLyBTZWUgYElOVkFMSURBVElPTl9SRVRSSUVTYC5cbiAgICAgICAgICBiYXRjaCA9IHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHModGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSU5WQUxJREFUSU9OX1JFVFJZX0RFTEFZX01TICogMiAqKiBhdHRlbXB0KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCAtIHRoZSBTMy9EeW5hbW9EQiBpbnZhbGlkYXRpb24gYWxyZWFkeSBzdWNjZWVkZWQsXG4gICAgICAgIC8vIGFuZCB0aGUgQ2xvdWRGcm9udCBjYWNoZSBwb2xpY3kgVFRMIHByb3ZpZGVzIGFuIGV2ZW50dWFsIGZhbGxiYWNrLlxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gZm9yIFske2JhdGNoLmpvaW4oXCIsIFwiKX1dOmAsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRpc3RyaWJ1dGlvbidzIHBoeXNpY2FsIElELCBmcm9tIHRoZSBlbnZpcm9ubWVudCBvciBlbHNlIFNTTSBQYXJhbWV0ZXJcbiAgICogU3RvcmUsIGNhY2hlZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoaXMgaW5zdGFuY2UuIFNlZVxuICAgKiBgQ2xvdWRGcm9udEludmFsaWRhdGlvbkNvbmZpZ2AgZm9yIHdoeSBGdW5jdGlvbnMgbmVlZCB0aGUgaW5kaXJlY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERpc3RyaWJ1dGlvbklkKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWREaXN0cmlidXRpb25JZDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zc21DbGllbnQuc2VuZChcbiAgICAgIG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHtcbiAgICAgICAgTmFtZTogdGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkID0gcmVzcG9uc2UuUGFyYW1ldGVyPy5WYWx1ZSB8fCBudWxsO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZERpc3RyaWJ1dGlvbklkO1xuICB9XG5cbiAgYXN5bmMgcmVzZXRSZXF1ZXN0Q2FjaGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVGhpcyBoYW5kbGVyIGRvZXNuJ3QgbWFpbnRhaW4gcmVxdWVzdC1sZXZlbCBjYWNoZSBzdGF0ZVxuICAgIC8vIFRoZSBhY3R1YWwgY2FjaGUgY2xlYXJpbmcgaXMgaGFuZGxlZCBieSB0aGUgbWVtb3J5IGNhY2hlIGhhbmRsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZGVwbG95bWVudCBrZWVwcyBgdGFnI3MzS2V5YCBtYXBwaW5nIHJvd3MgYXQgYWxsLlxuICAgKlxuICAgKiBUaGVpciBvbmUgcmVhZGVyIGlzIGByZXZhbGlkYXRlVGFnYCdzIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uLCB3aGljaCBuZWVkc1xuICAgKiB0aGUgZW50cmllcycgcGF0aHMgLSB0YWcgcmV2YWxpZGF0aW9uIGl0c2VsZiBydW5zIG9uIHRoZSBiYXJlLXRhZyBtYXJrZXJcbiAgICogcm93cy4gQSBkZXBsb3ltZW50IHdpdGggbm8gZGlzdHJpYnV0aW9uICh0aGUgUmVnaW9uYWwgY29uc3RydWN0cykgd291bGQgcGF5XG4gICAqIGEgRHluYW1vREIgd3JpdGUgcGVyIHRhZyBvbiBldmVyeSBgc2V0YCwgYSBRdWVyeSBwZXIgYHJldmFsaWRhdGVUYWdgLCBhbmQgYW5cbiAgICogZXh0cmEgUzMgcmVhZCBiZWZvcmUgZXZlcnkgZGVsZXRlLCBmb3Igcm93cyBub3RoaW5nIGV2ZXIgcmVhZHMuXG4gICAqL1xuICBwcml2YXRlIGdldCBtYXBzVGFnc1RvUGF0aHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jb25maWcudGFibGVOYW1lKSAmJiB0aGlzLmludmFsaWRhdGVzQ2RuO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYSBkaXN0cmlidXRpb24gdG8gaW52YWxpZGF0ZS4gKi9cbiAgcHJpdmF0ZSBnZXQgaW52YWxpZGF0ZXNDZG4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWQgfHxcbiAgICAgIHRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc29ydCBrZXkgb2YgYHRhZ2AncyBtYXBwaW5nIHJvdyBmb3IgYHMzS2V5YDogYDxwcmVmaXg+czNLZXlgLCBvciwgd2hlblxuICAgKiB0aGF0IHBhc3NlcyBEeW5hbW9EQidzIDEwMjQtYnl0ZSBzb3J0IGtleSBsaW1pdCwgYDxwcmVmaXg+PGJ1aWxkSWQ+LyM8c2hhMjU2PmAuXG4gICAqIEVpdGhlciB3YXkgdGhlIHJvdyBjYXJyaWVzIHRoZSBrZXkgaXRzZWxmIGluIGBzM0tleWAuIG5leHQgMTYuMy44J3NcbiAgICogcm91dGUtc2NvcGVkIGtleXMgYXJlIH44OCBieXRlcyBsb25nZXIgdGhhbiBhIHBhdGhuYW1lLCBlbm91Z2ggdG8gcHVzaCBhXG4gICAqIGxvbmcgdGFnIG9uIGEgbG9uZyBwYXRoIG92ZXIgLSBhbmQgYSByZWplY3RlZCBgUHV0SXRlbWAgbGVmdFxuICAgKiBgcmV2YWxpZGF0ZVRhZ2Agbm90aGluZyB0byBpbnZhbGlkYXRlLCBzbyBDbG91ZEZyb250IGtlcHQgdGhlIHN0YWxlIHBhZ2UuXG4gICAqIFRoZSBwcmVmaXggaXMge0BsaW5rIHRhZ01hcHBpbmdQcmVmaXh9J3MsIHdoaWNoIHtAbGluayBNQVhfVEFHX0JZVEVTfSBhbmRcbiAgICogdGhlIGJ1aWxkIElEJ3MgY2FwIGxlYXZlIHJvb20gZm9yIHRoZSBoYXNoZWQgZm9ybSBhZnRlci5cbiAgICovXG4gIHByaXZhdGUgdGFnTWFwcGluZ1NvcnRLZXkodGFnOiBzdHJpbmcsIHMzS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMudGFnTWFwcGluZ1ByZWZpeCh0YWcpO1xuICAgIGNvbnN0IHNrID0gYCR7cHJlZml4fSR7czNLZXl9YDtcbiAgICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgoc2spIDw9IE1BWF9TT1JUX0tFWV9CWVRFU1xuICAgICAgPyBza1xuICAgICAgOiBgJHtwcmVmaXh9JHt0aGlzLmNvbmZpZy5idWlsZElkfS8ke2hhc2hlZFRhZyhzM0tleSl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IGV2ZXJ5IG1hcHBpbmcgcm93IG9mIGB0YWdgIHN0YXJ0cyB3aXRoLCBhbmQgc28gd2hhdFxuICAgKiB7QGxpbmsgcXVlcnlUYWdNYXBwaW5nc30gbWF0Y2hlczogYDxzb3J0S2V5VGFnKHRhZyk+I2AuXG4gICAqL1xuICBwcml2YXRlIHRhZ01hcHBpbmdQcmVmaXgodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzb3J0S2V5VGFnKHRhZyl9I2A7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0b3JlRHluYW1vREJUYWdNYXBwaW5ncyhcbiAgICBzM0tleTogc3RyaW5nLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXBkYXRlUHJvbWlzZXMgPSB0YWdzLm1hcChhc3luYyAodGFnKSA9PiB7XG4gICAgICAgIGNvbnN0IHNrID0gdGhpcy50YWdNYXBwaW5nU29ydEtleSh0YWcsIHMzS2V5KTtcbiAgICAgICAgY29uc3QgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLmNvbmZpZy50YWJsZU5hbWUsXG4gICAgICAgICAgS2V5OiB7XG4gICAgICAgICAgICBwazogeyBTOiB0aGlzLmNvbmZpZy5idWlsZElkIH0sXG4gICAgICAgICAgICBzazogeyBTOiBzayB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vIGByZXZhbGlkYXRlZEF0YDogYSBtYXBwaW5nIHJvdyByZWNvcmRzIG9ubHkgdGhhdCBhblxuICAgICAgICAgIC8vIGVudHJ5IGNhcnJpZXMgdGhlIHRhZy4gU3RhbXBpbmcgaXQgYXQgd3JpdGUgdGltZSBtYWRlIGV2ZXJ5IHRhZ2dlZFxuICAgICAgICAgIC8vIGVudHJ5IGxvb2sgcmV2YWxpZGF0ZWQgb25lIG1pbGxpc2Vjb25kIGFmdGVyIGl0IHdhcyBzdG9yZWQg4oCUIHRoZVxuICAgICAgICAgIC8vIHJvdydzIHRpbWVzdGFtcCBpcyB0YWtlbiBhZnRlciB0aGUgZW50cnkncyBgbGFzdE1vZGlmaWVkYCDigJQgc29cbiAgICAgICAgICAvLyBgY2hlY2tJZlJldmFsaWRhdGVkYCBkZWxldGVkIGhlYWx0aHkgZW50cmllcyBhbmQgdGhlIHBhZ2VcbiAgICAgICAgICAvLyByZS1yZW5kZXJlZCBvbiBldmVyeSByZXF1ZXN0LlxuICAgICAgICAgIFVwZGF0ZUV4cHJlc3Npb246XG4gICAgICAgICAgICBcIlNFVCBjcmVhdGVkQXQgPSBpZl9ub3RfZXhpc3RzKGNyZWF0ZWRBdCwgOm5vdyksIHMzS2V5ID0gOnMzS2V5XCIsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgXCI6bm93XCI6IHsgTjogRGF0ZS5ub3coKS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICBcIjpzM0tleVwiOiB7IFM6IHMzS2V5IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5keW5hbW9DbGllbnQuc2VuZCh1cGRhdGVDb21tYW5kKTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh1cGRhdGVQcm9taXNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzdG9yaW5nIER5bmFtb0RCIHRhZyBtYXBwaW5nczpcIiwgZXJyb3IpO1xuICAgICAgLy8gRG9uJ3QgdGhyb3cgLSBjYWNoZSBzdG9yYWdlIHNob3VsZCBjb250aW51ZSBldmVuIGlmIHRhZyBtYXBwaW5nIGZhaWxzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGhlIGB0YWcjczNLZXlgIG1hcHBpbmcgcm93cyBmb3IgYW4gZW50cnkgdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgKlxuICAgKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIHN0b3JlRHluYW1vREJUYWdNYXBwaW5nc30sIGFuZCB0aGUgcmVhc29uIGl0c1xuICAgKiBjYWxsZXIgaGFzIHRvIGtub3cgdGhlIGVudHJ5J3MgdGFnczogYSBtYXBwaW5nIHJvdydzIHNvcnQga2V5IHN0YXJ0cyB3aXRoXG4gICAqIHRoZSB0YWcsIHNvIHRoZSByb3dzIGJlbG9uZ2luZyB0byBvbmUgY2FjaGUga2V5IGNhbm5vdCBiZSBxdWVyaWVkIGZvciAtIG9ubHlcbiAgICogYSBmdWxsIHNjYW4gb2YgdGhlIGJ1aWxkJ3MgcGFydGl0aW9uIHdvdWxkIGZpbmQgdGhlbS5cbiAgICpcbiAgICogTGVmdCBiZWhpbmQsIGEgcm93IHN0aWxsIHJlc29sdmVzIHRvIGEgY2FjaGUga2V5IG9uIHRoZSBuZXh0XG4gICAqIGByZXZhbGlkYXRlVGFnYCwgd2hpY2ggc3BlbmRzIG9uZSBvZiBDbG91ZEZyb250J3MgZmlmdGVlbiB3aWxkY2FyZCBwYXRoc1xuICAgKiBpbnZhbGlkYXRpbmcgYSBVUkkgd2hvc2UgZW50cnkgd2FzIGRlbGV0ZWQgLSBjcm93ZGluZyBvdXQgdGhlIHBhdGhzIHRoYXQgZG9cbiAgICogbmVlZCBpdCwgYW5kIHBhc3Qge0BsaW5rIE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OfSBjb2xsYXBzaW5nIHRoZVxuICAgKiB3aG9sZSBhcHAgaW50byBvbmUgd2lsZGNhcmQuIFRoZSByb3dzIGFsc28gY291bnQgYWdhaW5zdCB0aGUgMSBNQiBhIHRhZydzIFF1ZXJ5IHJldHVybnMsIHNvXG4gICAqIGVub3VnaCBvZiB0aGVtIHB1c2ggbGl2ZSBlbnRyaWVzIG9udG8gYSBwYWdlXG4gICAqIHtAbGluayBNQVhfVEFHX1FVRVJZX1BBR0VTfSBtYXkgbm90IHJlYWNoLlxuICAgKlxuICAgKiBPbmx5IHRoZSBtYXBwaW5nIHJvd3M6IHRoZSBiYXJlLWB0YWdgIG1hcmtlciByb3cgYHJldmFsaWRhdGVUYWdgXG4gICAqIHdyaXRlcyBiZWxvbmdzIHRvIHRoZSB0YWcgcmF0aGVyIHRoYW4gdG8gYW55IGVudHJ5LCBhbmQgYGNoZWNrSWZSZXZhbGlkYXRlZGBcbiAgICogcmVhZHMgaXQgZm9yIGV2ZXJ5ICpvdGhlciogZW50cnkgY2FycnlpbmcgdGhhdCB0YWcuXG4gICAqXG4gICAqIERlbGliZXJhdGVseSBubyBDbG91ZEZyb250IGludmFsaWRhdGlvbiBmb3IgdGhlIGRlbGV0ZWQgcGF0aC4gVGhlIGVkZ2UgY29weVxuICAgKiBkb2VzIG91dGxpdmUgdGhlIG9iamVjdCwgYnV0IHRoaXMgcnVucyBvbiBldmVyeSByZXZhbGlkYXRlZCBgZmV0Y2hgIGVudHJ5IGFzXG4gICAqIHdlbGwsIHdoZXJlIHRoZSBrZXkgbmFtZXMgbm8gVVJJLCBhbmQgYW4gaW52YWxpZGF0aW9uIHJlcXVlc3QgcGVyIGRlbGV0ZWRcbiAgICogZW50cnkgaXMgYSBjb3N0IHRoZSBUVEwgYWxyZWFkeSBib3VuZHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUR5bmFtb0RCVGFnTWFwcGluZ3MoXG4gICAgczNLZXk6IHN0cmluZyxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm1hcHNUYWdzVG9QYXRocyB8fCB0YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIC8vIEEgcGFnZSdzIHRhZ3MgY2FuIHJlcGVhdCAtIGBjdHgudGFnc2AgYW5kIHRoZSByZW5kZXIncyBoZWFkZXIgYXJlIGJvdGhcbiAgICAgICAgLy8gcmVhZCAtIGFuZCBvbmUgZGVsZXRlIHBlciB0YWcgaXMgZW5vdWdoLlxuICAgICAgICBBcnJheS5mcm9tKG5ldyBTZXQodGFncykpLm1hcChhc3luYyAodGFnKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5keW5hbW9DbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBEZWxldGVJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy5jb25maWcudGFibGVOYW1lLFxuICAgICAgICAgICAgICBLZXk6IHtcbiAgICAgICAgICAgICAgICBwazogeyBTOiB0aGlzLmNvbmZpZy5idWlsZElkIH0sXG4gICAgICAgICAgICAgICAgc2s6IHsgUzogdGhpcy50YWdNYXBwaW5nU29ydEtleSh0YWcsIHMzS2V5KSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgdGhpcy5kZWJ1ZyhgREVMRVRFRCBUQUcgTUFQUElOR1M6ICR7czNLZXl9IC0+IFske3RhZ3Muam9pbihcIiwgXCIpfV1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGJ1dCBkb24ndCBmYWlsOiB0aGUgZW50cnkgaXRzZWxmIGlzIGFscmVhZHkgZ29uZSwgYW5kIGEgc3RhbGVcbiAgICAgIC8vIG1hcHBpbmcgcm93IGNvc3RzIGFuIGludmFsaWRhdGlvbiBwYXRoIHJhdGhlciB0aGFuIGEgd3JvbmcgcmVzcG9uc2UuXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZGVsZXRpbmcgRHluYW1vREIgdGFnIG1hcHBpbmdzOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGFuIGVudHJ5IGFib3V0IHRvIGJlIGRlbGV0ZWQgd2FzIHN0b3JlZCB3aXRoLlxuICAgKlxuICAgKiBgY3R4YCBjYXJyaWVzIHRoZW0gZm9yIGEgYGZldGNoYCBkZWxldGUsIGJ1dCBhIHJlc3BvbnNlIGRlbGV0ZSBhcnJpdmVzIGFzXG4gICAqIGB7IGNhY2hlQ29udHJvbCwgaXNSb3V0ZVBQUkVuYWJsZWQsIGlzRmFsbGJhY2sgfWAgLSBgUmVzcG9uc2VDYWNoZS5zZXRgXG4gICAqIGJ1aWxkcyBpdCB0aGF0IHdheSAtIHNvIHRoZSBlbnRyeSBpdHNlbGYgaXMgdGhlIG9ubHkgc291cmNlLCBhbmQgaXQgaGFzIHRvXG4gICAqIGJlIHJlYWQgYmVmb3JlIGl0IGlzIHJlbW92ZWQuIFRoYXQgaXMgb25lIGV4dHJhIEdFVCBvbiBhIHBhdGggdGhhdCBydW5zIHdoZW5cbiAgICogYSBjYWNoZWQgcm91dGUgc3RhcnRzIGFuc3dlcmluZyBgbm90Rm91bmQoKWA6IGBJbmNyZW1lbnRhbENhY2hlLnNldGBcbiAgICogZm9yd2FyZHMgYFJlc3BvbnNlQ2FjaGVgJ3MgbnVsbCB2YWx1ZSB0aHJvdWdoIHRvIGhlcmUuXG4gICAqXG4gICAqIEEgcGFnZSBpcyBhbHNvIHRoZSBjYXNlIHdvcnRoIHBheWluZyBpdCBmb3IsIHNpbmNlIGl0IGNhcnJpZXMgdGhlIHdob2xlXG4gICAqIGltcGxpY2l0IGBfTl9UXy/igKZgIGNoYWluIGFuZCB0aGVyZWZvcmUgdGhlIG1vc3Qgcm93cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3RvcmVkRW50cnlUYWdzKFxuICAgIHMzS2V5OiBzdHJpbmcsXG4gICAgY3R4OiBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgY3R4VGFncyA9IGdldFRhZ3MoY3R4KTtcbiAgICBpZiAoY3R4VGFncz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY3R4VGFncztcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1hcHNUYWdzVG9QYXRocykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJ1Y2tldC5nZXQoczNLZXkpO1xuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnlUYWdzKHBhcnNlQ2FjaGVWYWx1ZShyZXNwb25zZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byByZWFkIHRhZ3Mgb2YgJHtzM0tleX0gYmVmb3JlIGRlbGV0aW5nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhbnkgb2YgYHRhZ3NgIHdhcyByZXZhbGlkYXRlZCBhZnRlciB0aGlzIGVudHJ5IHdhcyBzdG9yZWQsIGFuZCBob3cuXG4gICAqXG4gICAqIFJlYWRzIHRoZSBwZXItdGFnIG1hcmtlciByb3dzIGByZXZhbGlkYXRlVGFnYCB3cml0ZXMsIGFzIHRoaXMgaW5zdGFuY2VcbiAgICogdHJhY2tzIHRoZW06IHNlZSBgVHJhY2tlZFRhZ01hcmtlcnNgIGZvciB3aGVuIHRoZXkgYXJlIHJlYWQuXG4gICAqIFNjYW5uaW5nIHRoZSB0YWcncyBtYXBwaW5nIHJvd3MgaW5zdGVhZCB3b3VsZCBhbnN3ZXIgdGhlIHdyb25nIHF1ZXN0aW9uOlxuICAgKiB0aG9zZSByb3dzIGV4aXN0IHBlciBjYWNoZSAqa2V5Kiwgc28gd2hpY2ggb25lIGEgYExpbWl0OiAxYCBxdWVyeSByZXR1cm5lZFxuICAgKiBkZXBlbmRlZCBvbiBzb3J0IG9yZGVyLCBhbmQgYW4gZW50cnkgY291bGQgYmUganVkZ2VkIGFnYWluc3QgYW5vdGhlclxuICAgKiBlbnRyeSdzIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQSB0YWcgcmV2YWxpZGF0ZWQgd2l0aCBhIHByb2ZpbGUgb25seSBtYWtlcyB0aGUgZW50cnkgKnN0YWxlKjogdGhhdCBpc1xuICAgKiByZXBvcnRlZCB0byBOZXh0LmpzIHRocm91Z2ggaXRzIHRhZyBtYW5pZmVzdCAoc2VlIHtAbGluayBuZXh0VGFnc01hbmlmZXN0fSlcbiAgICogYW5kIGFuc3dlcmVkIGBcInN0YWxlXCJgIGhlcmUsIHNvIHRoZSBlbnRyeSBpcyBzZXJ2ZWQgd2hpbGUgYSBiYWNrZ3JvdW5kXG4gICAqIHJlbmRlciByZXBsYWNlcyBpdC4gV2hlbiB0aGUgbWFuaWZlc3QgY2Fubm90IGJlIHJlYWNoZWQgYSBzdGFsZSBlbnRyeSBpc1xuICAgKiByZXBvcnRlZCBleHBpcmVkIGluc3RlYWQgLSBhIGJsb2NraW5nIHJlbmRlciwgbmV2ZXIgYSBzdGFsZSBwYWdlIHByZXNlbnRlZFxuICAgKiBhcyBmcmVzaC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJZlJldmFsaWRhdGVkKFxuICAgIGNhY2hlTGFzdE1vZGlmaWVkOiBudW1iZXIsXG4gICAgdGFnczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8UmV2YWxpZGF0aW9uU3RhdGU+IHtcbiAgICBhd2FpdCB0aGlzLnRhZ3MucmVmcmVzaCgpO1xuICAgIGF3YWl0IHRoaXMudGFncy5lbnN1cmUodGFncyk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnRhZ3Muc3RhdGUodGFncywgY2FjaGVMYXN0TW9kaWZpZWQpO1xuICAgIGlmIChzdGF0ZSAhPT0gXCJzdGFsZVwiKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYFRhZ3MgWyR7dGFnc31dIGV4cGlyZWQgZW50cnkgY3JlYXRlZCBhdCAke2NhY2hlTGFzdE1vZGlmaWVkfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBuZXh0VGFnc01hbmlmZXN0KCk7XG4gICAgaWYgKCFtYW5pZmVzdCkge1xuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYFRhZ3MgWyR7dGFnc31dIGFyZSBzdGFsZSBhbmQgTmV4dC5qcydzIHRhZyBtYW5pZmVzdCBpcyBgICtcbiAgICAgICAgICBgdW5yZWFjaGFibGUsIGV4cGlyaW5nIHRoZSBlbnRyeSBpbnN0ZWFkYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gXCJleHBpcmVkXCI7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGNvbnN0IHN0YWxlQXQgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk/LnN0YWxlQXQ7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG1hbmlmZXN0LmdldCh0YWcpO1xuICAgICAgaWYgKFxuICAgICAgICBzdGFsZUF0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgc3RhbGVBdCA+IGNhY2hlTGFzdE1vZGlmaWVkICYmXG4gICAgICAgIChleGlzdGluZz8uc3RhbGUgPz8gMCkgPCBzdGFsZUF0XG4gICAgICApIHtcbiAgICAgICAgbWFuaWZlc3Quc2V0KHRhZywgeyAuLi5leGlzdGluZywgc3RhbGU6IHN0YWxlQXQgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBcInN0YWxlXCI7XG4gIH1cbn1cbiJdfQ==
1040
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3MzLWNhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0VBRUU7QUFDRixzREFBc0Q7QUFDdEQsNkNBQXlDO0FBQ3pDLHFDQUF1QztBQUN2Qyw2Q0FBNEM7QUFDNUMseUNBQWlDO0FBQ2pDLGtFQUdvQztBQUNwQyw4REFNa0M7QUFDbEMsa0RBQW1FO0FBQ25FLG9EQUFxRTtBQUNyRSxrREFBNkI7QUFVN0IsdURBYTJCO0FBQzNCLCtDQVl1QjtBQUN2Qix5REFBdUQ7QUFDdkQsa0RBQTREO0FBQzVELGtEQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxNQUE0QztJQUM3RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFBLHdCQUFVLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLEdBQTJCO0lBRTNCLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDOUIsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztBQUUzQzs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEdBQVc7SUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRywwQkFBMEIsR0FB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LEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQ1IsU0FBUyxJQUFJLDhCQUE4QixpQkFBaUIsRUFBRSxDQUMvRCxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FDUixTQUFTLElBQUksNENBQTRDO2dCQUN2RCx5Q0FBeUMsQ0FDNUMsQ0FBQztZQUNGLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUM1QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQ0UsT0FBTyxLQUFLLFNBQVM7Z0JBQ3JCLE9BQU8sR0FBRyxpQkFBaUI7Z0JBQzNCLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQ2hDLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQXo1QkQsd0NBeTVCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFMzIGFuZCBEeW5hbW9EQiBjYWNoZSBoYW5kbGVyIGZvciBOZXh0LmpzIGluY3JlbWVudGFsIGNhY2hlXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIENsb3VkRnJvbnRDbGllbnQsXG4gIENyZWF0ZUludmFsaWRhdGlvbkNvbW1hbmQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsdWUsXG4gIERlbGV0ZUl0ZW1Db21tYW5kLFxuICBEeW5hbW9EQkNsaWVudCxcbiAgUXVlcnlDb21tYW5kLFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHsgUzNDbGllbnQsIERlbGV0ZU9iamVjdENvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBTU01DbGllbnQsIEdldFBhcmFtZXRlckNvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNzbVwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHR5cGUge1xuICBDYWNoZUhhbmRsZXIsXG4gIENhY2hlSGFuZGxlclZhbHVlLFxuICBDYWNoZUhhbmRsZXJDb250ZXh0LFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvaW5jcmVtZW50YWwtY2FjaGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgSW5jcmVtZW50YWxDYWNoZVZhbHVlLFxuICBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0LFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yZXNwb25zZS1jYWNoZVwiO1xuaW1wb3J0IHtcbiAgQXdzQ2FjaGVDb25maWcsXG4gIGJ1aWxkUzNLZXksXG4gIENhY2hlQnVja2V0LFxuICBoYXNoZWRUYWcsXG4gIG1hcmtlckNsb2NrLFxuICBNQVhfU09SVF9LRVlfQllURVMsXG4gIHJlc29sdmVBd3NDYWNoZUNvbmZpZyxcbiAgUmV2YWxpZGF0ZUR1cmF0aW9ucyxcbiAgUmV2YWxpZGF0aW9uU3RhdGUsXG4gIHNvcnRLZXlUYWcsXG4gIHMzT2JqZWN0S2V5LFxuICBUcmFja2VkVGFnTWFya2Vycyxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5pbXBvcnQge1xuICBzZXJpYWxpemVDYWNoZVZhbHVlLFxuICBwYXJzZUNhY2hlVmFsdWUsXG4gIGRlbm9ybWFsaXplUGFnZVBhdGgsXG4gIGdldENhY2hlQ29udHJvbCxcbiAgZ2V0VGFncyxcbiAgR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgU2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgaGVhZGVyVGFncyxcbiAgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1QsXG4gIFJPVVRFX0NBQ0hFX0tFWV9QUkVGSVgsXG4gIHN0b3JlZENhY2hlQ29udHJvbCxcbn0gZnJvbSBcIi4vY2FjaGUtdXRpbHNcIjtcbmltcG9ydCB7IHNoYXJlZFRhZ01hbmlmZXN0IH0gZnJvbSBcIi4vdXNlLWNhY2hlLWNvbW1vblwiO1xuaW1wb3J0IHsgUkVWQUxJREFURURfUEFHRV9IT09LIH0gZnJvbSBcIi4uL3J1bnRpbWUvbWFuaWZlc3RcIjtcbmltcG9ydCB7IGJhc2VQYXRoUHJlZml4LCB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzIH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIFRoZSB0YWdzIGEgc3RvcmVkIGVudHJ5IGhhcyB0byBiZSB0YWctcmV2YWxpZGF0ZWQgYWdhaW5zdC5cbiAqXG4gKiBBIHJ1bnRpbWUgYHNldGAgcmVjb3JkcyBgdGFnc2AgYWxvbmdzaWRlIHRoZSBlbnRyeSwgYnV0IGEgYnVpbGQtdGltZSBwcmVyZW5kZXJcbiAqIGRvZXMgbm90OiB0aG9zZSBlbnRyaWVzIGFyZSB3cml0dGVuIGFzIGZpbGVzIGJ5IHRoZSBhZGFwdGVyJ3NcbiAqIGBvbkJ1aWxkQ29tcGxldGVgIHJhdGhlciB0aGFuIHRocm91Z2ggYHNldGAsIGFuZCBjYXJyeSB0aGVpciB0YWdzIG9ubHkgaW4gdGhlXG4gKiByZW5kZXIncyBgeC1uZXh0LWNhY2hlLXRhZ3NgIGhlYWRlciDigJQgdGhlIHNhbWUgcGxhY2UgTmV4dC5qcydzIG93blxuICogYEluY3JlbWVudGFsQ2FjaGUuZ2V0YCByZWFkcyB0aGVtIGZyb20gd2hlbiBpdCBkZWNpZGVzIHN0YWxlbmVzcy4gV2l0aG91dCB0aGlzXG4gKiBmYWxsYmFjayBubyBwcmVyZW5kZXJlZCBwYWdlIGlzIHJlYWNoYWJsZSBieSBgcmV2YWxpZGF0ZVRhZ2AvYHJldmFsaWRhdGVQYXRoYFxuICogdW50aWwgc29tZSBsYXRlciBydW50aW1lIHJlLXJlbmRlciBoYXBwZW5zIHRvIHJlcGxhY2UgdGhlIHNlZWRlZCBlbnRyeSwgc28gYW5cbiAqIGFwcCB3aG9zZSBwYWdlcyBhcmUgYWxsIHN0YXRpYyBuZXZlciByZXZhbGlkYXRlcyBhdCBhbGwuIE1lYXN1cmVkIGFnYWluc3RcbiAqIG5leHQuanMncyBgdGVzdC9lMmUvYXBwLWRpci9yZXN1bWUtZGF0YS1jYWNoZWAuXG4gKi9cbmZ1bmN0aW9uIGVudHJ5VGFncyhzdG9yZWQ6IHsgdGFncz86IHN0cmluZ1tdOyB2YWx1ZT86IHVua25vd24gfSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHN0b3JlZC50YWdzPy5sZW5ndGggPyBzdG9yZWQudGFncyA6IGhlYWRlclRhZ3Moc3RvcmVkLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgYGxhc3RNb2RpZmllZGAgdGhhdCB0ZWxscyBOZXh0LmpzIFwidGhpcyBlbnRyeSBpcyBleHBpcmVkLCByZS1yZW5kZXIgaXRcbiAqIGJlZm9yZSBhbnN3ZXJpbmdcIi5cbiAqXG4gKiBgSW5jcmVtZW50YWxDYWNoZS5nZXRgIHR1cm5zIGl0IGludG8gYGlzU3RhbGU6IC0xYCwgd2hpY2ggYGFwcC1wYWdlLXJ1bnRpbWVgXG4gKiByZWFkcyBhcyBhbiBvbi1kZW1hbmQgcmV2YWxpZGF0aW9uIGFuZCBhbnN3ZXJzIHdpdGggYSBibG9ja2luZyByZW5kZXIgb2ZcbiAqICp0aGlzKiByb3V0ZSwgdGhlbiBzdG9yZXMgaXQuIFJldHVybmluZyBgbnVsbGAgaW5zdGVhZCBpcyBub3QgdGhlIHNhbWUgdGhpbmc6XG4gKiBhIG1pc3Mgb24gYSBQUFIgcm91dGUgd2hvc2UgYHByZXJlbmRlci1tYW5pZmVzdC5qc29uYCBlbnRyeSBjYXJyaWVzIGFcbiAqIGBmYWxsYmFja2AgKGBjb21wdXRlOiBcInJlc3VtaW5nXCJgKSBpcyBhbnN3ZXJlZCBmcm9tIHRoZSByb3V0ZSdzIGZhbGxiYWNrXG4gKiBzaGVsbCwgd2hpY2ggaXMgc2VydmVkIGBjYWNoZS1jb250cm9sOiBwcml2YXRlLCBuby1zdG9yZWAgd2l0aCBub1xuICogYHgtbmV4dGpzLWNhY2hlYCBoZWFkZXIsIGFuZCAtIHVubGVzcyBgcGFydGlhbFByZWZldGNoaW5nYCBpcyBvbiAtIGlzIG5ldmVyXG4gKiB1cGdyYWRlZCBpbnRvIGEgY29uY3JldGUgZW50cnkuIFNvIHRoZSBmaXJzdCBgcmV2YWxpZGF0ZVRhZ2AgdG8gcmVhY2ggYVxuICogc2VlZGVkIHByZXJlbmRlciBsZWZ0IHRoYXQgcGFnZSB1bmNhY2hlYWJsZSwgYW5kIGR5bmFtaWNhbGx5IHJlc3VtZWQgcGVyXG4gKiByZXF1ZXN0LCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGRlcGxveW1lbnQncyBsaWZlLiBUaGUgaXNyIGUyZSBzZWVzIGl0IGFzIGFuXG4gKiBhYnNlbnQgYHgtbmV4dGpzLWNhY2hlYC5cbiAqL1xuY29uc3QgRVhQSVJFRF9MQVNUX01PRElGSUVEID0gLTE7XG5cbi8qKlxuICogV2hldGhlciBhIGBnZXRgIGlzIGZvciB0aGUgYGZldGNoYCBjYWNoZSByYXRoZXIgdGhhbiBmb3IgYSByb3V0ZSdzIHJlc3BvbnNlLFxuICogYXMgYSBuYXJyb3dpbmcgcHJlZGljYXRlIHNvIHRoYXQgYGN0eC50YWdzYCBhbmQgYGN0eC5zb2Z0VGFnc2Ag4oCUIHdoaWNoIG9ubHlcbiAqIHtAbGluayBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0fSBoYXMg4oCUIGFyZSByZWFjaGFibGUgd2l0aG91dCBhIGNhc3QuXG4gKlxuICogYEluY3JlbWVudGFsQ2FjaGVLaW5kLkZFVENIYCwgY29tcGFyZWQgYXMgaXRzIG93biBzdHJpbmcgdmFsdWUgc28gdGhpcyBmaWxlXG4gKiBrZWVwcyBpbXBvcnRpbmcgbm8gTmV4dC5qcyBpbnRlcm5hbHMgKHRoZSBlbnVtIGlzIGBjb25zdGAsIHNvIGl0IGhhcyBub1xuICogcnVudGltZSByZXByZXNlbnRhdGlvbiB0byBpbXBvcnQgYW55d2F5KS5cbiAqL1xuZnVuY3Rpb24gaXNGZXRjaENhY2hlR2V0KFxuICBjdHg6IEdldENhY2hlSGFuZGxlckNvbnRleHQsXG4pOiBjdHggaXMgR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCB7XG4gIHJldHVybiBjdHgua2luZCA9PT0gXCJGRVRDSFwiO1xufVxuXG4vKiogYE5FWFRfQ0FDSEVfSU1QTElDSVRfVEFHX0lEYCwgaW5saW5lZCBzbyB0aGlzIGZpbGUgaW1wb3J0cyBubyBOZXh0LmpzIGludGVybmFscy4gKi9cbmNvbnN0IE5FWFRfQ0FDSEVfSU1QTElDSVRfVEFHX0lEID0gXCJfTl9UX1wiO1xuXG4vKipcbiAqIFRoZSBgdHlwZWAgYXJndW1lbnQgb2YgYHJldmFsaWRhdGVQYXRoYCwgd2hpY2ggTmV4dC5qcyBhcHBlbmRzIHRvIHRoZSBpbXBsaWNpdFxuICogdGFnIGFzIGEgcGF0aCBzZWdtZW50LiBAc2VlIGltcGxpY2l0VGFnUGF0aHNcbiAqL1xuY29uc3QgUkVWQUxJREFURV9QQVRIX1RZUEVTID0gW1wibGF5b3V0XCIsIFwicGFnZVwiXTtcblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBwYXRocyBhIGByZXZhbGlkYXRlUGF0aGAgdGFnIGNvdWxkIG5hbWUsIG9yIGVtcHR5IGZvciBhbiBhcHAgdGFnLlxuICpcbiAqIGByZXZhbGlkYXRlUGF0aChcIi9ibG9nXCIpYCByZWFjaGVzIHRoZSBjYWNoZSBoYW5kbGVyIGFzIHRoZSBpbXBsaWNpdCB0YWdcbiAqIGBfTl9UXy9ibG9nYCAtIHRoZSBwYXRoIGlzIHJpZ2h0IHRoZXJlIGluIHRoZSB0YWcsIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIENETlxuICogY29weSBvZiBhIGJ1aWxkLXRpbWUgcHJlcmVuZGVyIHJlYWNoYWJsZSBhdCBhbGwuIEEgYHJldmFsaWRhdGVUYWcoXCJwb3N0c1wiKWBcbiAqIGNhcnJpZXMgbm8gcGF0aCBhbmQgZGVwZW5kcyBvbiB0aGUgbWFwcGluZyByb3dzIGluc3RlYWQuXG4gKlxuICogVHdvIHBhdGhzIGNvbWUgYmFjayB3aGVuIHRoZSB0YWcgZW5kcyBpbiBhIGByZXZhbGlkYXRlUGF0aGAgKnR5cGUqLCBiZWNhdXNlXG4gKiBgcmV2YWxpZGF0ZVBhdGgocGF0aCwgdHlwZSlgIGFwcGVuZHMgaXQgdG8gdGhlIHRhZ1xuICogKGBuZXh0L2Rpc3Qvc2VydmVyL3dlYi9zcGVjLWV4dGVuc2lvbi9yZXZhbGlkYXRlLmpzYCk6XG4gKiBgcmV2YWxpZGF0ZVBhdGgoXCIvYmxvZ1wiLCBcImxheW91dFwiKWAgaXMgYF9OX1RfL2Jsb2cvbGF5b3V0YCwgYW5kXG4gKiBgcmV2YWxpZGF0ZVBhdGgoXCIvXCIsIFwibGF5b3V0XCIpYCBpcyBgX05fVF8vbGF5b3V0YC4gUmVhZGluZyBlaXRoZXIgb2YgdGhvc2UgYXMgYVxuICogcmVxdWVzdCBwYXRoIGludmFsaWRhdGVzIGEgVVJJIHRoYXQgZG9lcyBub3QgZXhpc3QgYW5kIG5ldmVyIHRvdWNoZXMgdGhlIG9uZVxuICogdGhhdCBkb2VzLiBUaGUgc3VmZml4IGNhbm5vdCBiZSB0b2xkIGFwYXJ0IGZyb20gYSByb3V0ZSB0aGF0IGdlbnVpbmVseSBlbmRzIGluXG4gKiBgL2xheW91dGAsIHNvIGJvdGggcmVhZGluZ3MgYXJlIGVtaXR0ZWQ6IGFuIGludmFsaWRhdGlvbiBwYXRoIG1hdGNoaW5nIG5vdGhpbmdcbiAqIGNvc3RzIGEgcGF0aCwgd2hpbGUgbWlzc2luZyB0aGUgcmVhbCBvbmUgbGVhdmVzIHRoZSBlZGdlIHN0YWxlIGZvciB0aGUgd2hvbGVcbiAqIGBzLW1heGFnZWAuXG4gKi9cbmZ1bmN0aW9uIGltcGxpY2l0VGFnUGF0aHModGFnOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghdGFnLnN0YXJ0c1dpdGgoYCR7TkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSUR9L2ApKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHBhdGggPSB0YWcuc2xpY2UoTkVYVF9DQUNIRV9JTVBMSUNJVF9UQUdfSUQubGVuZ3RoKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtwYXRoXTtcbiAgZm9yIChjb25zdCB0eXBlIG9mIFJFVkFMSURBVEVfUEFUSF9UWVBFUykge1xuICAgIGlmIChwYXRoLmVuZHNXaXRoKGAvJHt0eXBlfWApKSB7XG4gICAgICAvLyBgX05fVF8vbGF5b3V0YCBpcyB0aGUgcm9vdCwgbm90IHRoZSBlbXB0eSBwYXRoLlxuICAgICAgY2FuZGlkYXRlcy5wdXNoKHBhdGguc2xpY2UoMCwgLSh0eXBlLmxlbmd0aCArIDEpKSB8fCBcIi9cIik7XG4gICAgfVxuICB9XG4gIC8vIEEgZHluYW1pYyByb3V0ZSB0ZW1wbGF0ZSAoXCIvYmxvZy9bc2x1Z11cIikgbWF0Y2hlcyBubyBjYWNoZWQgVVJJLiBIYXJtbGVzcyB0b1xuICAvLyBzZW5kLCBidXQgaXQgY29zdHMgYW4gaW52YWxpZGF0aW9uIHBhdGgsIGFuZCB0aG9zZSBhcmUgbWV0ZXJlZC5cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSkuZmlsdGVyKChwKSA9PiAhcC5pbmNsdWRlcyhcIltcIikpO1xufVxuXG4vKipcbiAqIEludmFsaWRhdGlvbiBwYXRocyBjb3ZlcmluZyBldmVyeSBVUkkgQ2xvdWRGcm9udCBjb3VsZCBiZSBob2xkaW5nIHRoZSByZXNwb25zZVxuICogZm9yIGByb3V0ZWAgdW5kZXIsIG9uY2UgYGJhc2VQYXRoYCBpcyBwcmVmaXhlZC5cbiAqXG4gKiBBbiBpbnZhbGlkYXRpb24gcGF0aCBtYXRjaGVzIG9ubHkgdGhlIHF1ZXJ5IHN0cmluZyBpdCBzcGVsbHMgb3V0LCBhbmQgYSBwYWdlJ3NcbiAqIFJTQyBwYXlsb2FkIGlzIGNhY2hlZCB1bmRlciBgP19yc2M9PGhhc2g+YDsgZHJvcHBpbmcgdGhlIEhUTUwgd2hpbGUgbGVhdmluZyB0aGVcbiAqIHBheWxvYWQgYmVoaW5kIGxlYXZlcyB0aGUgcm91dGVyIG5hdmlnYXRpbmcgdG8gdGhlIHByZS1yZXZhbGlkYXRpb24gcGFnZS4gQVxuICogYHRyYWlsaW5nU2xhc2hgIGFwcCBjYWNoZXMgdGhlIHJlZGlyZWN0IHRhcmdldCByYXRoZXIgdGhhbiB0aGUgcm91dGUsIHNvIHRoZVxuICogc2xhc2ggdmFyaWFudCBoYXMgdG8gZ28gdG9vLlxuICpcbiAqIE9uZSB0cmFpbGluZyB3aWxkY2FyZCBjb3ZlcnMgYWxsIGZvdXIgKGAvYmxvZ2AsIGAvYmxvZz/igKZgLCBgL2Jsb2cvYCxcbiAqIGAvYmxvZy8/4oCmYCkgZm9yIGEgc2luZ2xlIHdpbGRjYXJkIHBhdGgsIHdoZXJlIHNwZWxsaW5nIHRoZW0gb3V0IGNvc3QgdHdvIC1cbiAqIGFuZCB3aWxkY2FyZHMgYXJlIHRoZSBxdW90YSB0aGF0IHJ1bnMgb3V0LiBJdCBhbHNvIG1hdGNoZXMgYC9ibG9ncm9sbGAgYW5kXG4gKiBldmVyeXRoaW5nIHVuZGVyIGAvYmxvZy9gLCB3aGljaCBpcyBhIGxvd2VyIGhpdCByYXRlIG9uIHRob3NlLCBuZXZlciBhIHN0YWxlXG4gKiBwYWdlLiBUaGUgYXBwJ3Mgcm9vdCBpcyB0aGUgZXhjZXB0aW9uOiBgLypgIHRoZXJlIGlzIHRoZSB3aG9sZSBhcHAuXG4gKlxuICogYGJhc2VQYXRoYCBpcyBwcmVmaXhlZCBoZXJlIGJlY2F1c2UgbmVpdGhlciBzb3VyY2Ugb2YgYSByb3V0ZSBjYXJyaWVzIGl0LlxuICogQ2FjaGUga2V5cyBhcmUgcm91dGVzIOKAlCBOZXh0LmpzIHN0cmlwcyBgYmFzZVBhdGhgIGJlZm9yZSByb3V0aW5nLCBzbyB0aGUgY2FjaGVcbiAqIGhhbmRsZXIgbmV2ZXIgc2VlcyBvbmUg4oCUIGFuZCBgcmV2YWxpZGF0ZVBhdGgoXCIvYmxvZ1wiKWAgbmFtZXMgdGhlIHJvdXRlIGFzXG4gKiB3ZWxsLiBDbG91ZEZyb250IG9ubHkgZXZlciBzYXcgYC9iYXNlL2Jsb2dgLCBzbyBpbnZhbGlkYXRpbmcgYC9ibG9nYCBjbGVhcnNcbiAqIG5vdGhpbmcgYW5kIHRoZSBlZGdlIGtlZXBzIHNlcnZpbmcgdGhlIHByZS1yZXZhbGlkYXRpb24gcGFnZSB1bnRpbCBgcy1tYXhhZ2VgXG4gKiBleHBpcmVzLiBUaGUgYXBwJ3Mgcm9vdCB1bmRlciBhIGBiYXNlUGF0aGAgaXMgYC9iYXNlYCwgbm90IGAvYmFzZS9gLlxuICovXG5mdW5jdGlvbiBjZG5JbnZhbGlkYXRpb25QYXRocyhyb3V0ZTogc3RyaW5nLCBiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0cmltbWVkID0gcm91dGUucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHRyaW1tZWQgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gYmFzZVBhdGhcbiAgICAgID8gW2Jhc2VQYXRoLCBgJHtiYXNlUGF0aH0/KmAsIGAke2Jhc2VQYXRofS9gLCBgJHtiYXNlUGF0aH0vPypgXVxuICAgICAgOiBbXCIvXCIsIFwiLz8qXCJdO1xuICB9XG4gIHJldHVybiBbYCR7YmFzZVBhdGh9JHtlbmNvZGVJbnZhbGlkYXRpb25Sb3V0ZSh0cmltbWVkKX0qYF07XG59XG5cbi8qKlxuICogVGhlIGFwcCdzIGBiYXNlUGF0aGAsIGZyb20gdGhlIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZXZlcnkgZGVwbG95bWVudFxuICogcm9vdCBzdGFnZXMgbmV4dCB0byBgc2VydmVyRGlzdERpcmA6IE5leHQuanMgaGFuZHMgdGhlIGNhY2hlIGhhbmRsZXIgbm9cbiAqIG90aGVyIGNvcHkuXG4gKi9cbmZ1bmN0aW9uIGFwcEJhc2VQYXRoKHNlcnZlckRpc3REaXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc2VydmVyRGlzdERpcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlID0gam9pbihzZXJ2ZXJEaXN0RGlyLCBcIi4uXCIsIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIik7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGZpbGUsIFwidXRmOFwiKSkuY29uZmlnPy5iYXNlUGF0aDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgcmVhZCBiYXNlUGF0aCBmb3IgQ0ROIGludmFsaWRhdGlvbjpcIiwgZXJyb3IpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBgcm91dGVgIGFzIHRoZSBVUkkgYSBicm93c2VyIHJlcXVlc3RzIGl0IHVuZGVyLCB3aGljaCBpcyB3aGF0IENsb3VkRnJvbnRcbiAqIGNhY2hlcyBpdCBieS5cbiAqXG4gKiBOZXh0LmpzIGJ1aWxkcyBjYWNoZSBrZXlzIGZyb20gdGhlICpkZWNvZGVkKiBwYXRobmFtZSAoYGRlY29kZVBhdGhQYXJhbXNgIGluXG4gKiBgcm91dGUtbW9kdWxlLmpzYCksIHNvIGAvYmxvZy9ow6lsbG9gIG9yIGAvYmxvZy9oZWxsbyB3b3JsZGAgcmVhY2ggaGVyZSByYXcsXG4gKiB3aGlsZSBDbG91ZEZyb250IGhvbGRzIGAvYmxvZy9oJUMzJUE5bGxvYCwgYW5kIGFuIGludmFsaWRhdGlvbiBwYXRoIG1hdGNoZXNcbiAqIHRoZSBlbmNvZGVkIGZvcm0gb25seSAtIEFXUyByZXF1aXJlcyBub24tQVNDSUkgYW5kIHVuc2FmZSBjaGFyYWN0ZXJzIHRvIGJlXG4gKiBwZXJjZW50LWVuY29kZWQsIGFuZCBub3RoaW5nIGVsc2UuIEVhY2ggc2VnbWVudCBpcyBlbmNvZGVkIHRoZSB3YXlcbiAqIGBlbmNvZGVVUklgIGRvZXMsIHdoaWNoIGxlYXZlcyB0aGUgY2hhcmFjdGVycyBhIGJyb3dzZXIgc2VuZHMgcmF3IGluIGEgcGF0aFxuICogKGBAYCwgYDpgLCBgLGAsIGA7YCwgLi4uKSBhbG9uZS4gQSBgJWAgdGhhdCBhbHJlYWR5IHN0YXJ0cyBhbiBlc2NhcGUgaXMga2VwdDpcbiAqIGBkZWNvZGVQYXRoUGFyYW1zYCByZS1lc2NhcGVzIHBhdGggZGVsaW1pdGVycyAoYCUyRmAsIGAlM0ZgLCBgJTIzYCwgYCU1Q2ApLFxuICogYW5kIGEgYHJldmFsaWRhdGVQYXRoYCB0YWcgbWF5IG5hbWUgdGhlIGVuY29kZWQgcGF0aCBpdHNlbGYuIGA/YCBhbmQgYCNgIGNhblxuICogb25seSBiZSBpbiBhIGRlY29kZWQgc2VnbWVudCBhcyBkYXRhLCBzbyB0aGV5IGFyZSBlbmNvZGVkIHRvby5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlSW52YWxpZGF0aW9uUm91dGUocm91dGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByb3V0ZVxuICAgIC5zcGxpdChcIi9cIilcbiAgICAubWFwKChzZWdtZW50KSA9PlxuICAgICAgc2VnbWVudFxuICAgICAgICAuc3BsaXQoLyglWzAtOUEtRmEtZl17Mn0pLylcbiAgICAgICAgLm1hcCgocGFydCwgaSkgPT5cbiAgICAgICAgICBpICUgMiA9PT0gMVxuICAgICAgICAgICAgPyBwYXJ0XG4gICAgICAgICAgICA6IGVuY29kZVVSSShwYXJ0KS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIC9bPyNdL2csXG4gICAgICAgICAgICAgICAgKGMpID0+IGAlJHtjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlwiKSxcbiAgICApXG4gICAgLmpvaW4oXCIvXCIpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBjYWNoZSBrZXkgaXMgYSBmZXRjaC1jYWNoZSBlbnRyeSByYXRoZXIgdGhhbiBhIHBhZ2Ugcm91dGUuXG4gKlxuICogVGhvc2Uga2V5cyBhcmUgdGhlIGhhc2ggTmV4dC5qcyBkZXJpdmVzIGZyb20gdGhlIHJlcXVlc3Qg4oCUIGEgc2luZ2xlIHNlZ21lbnQgb2ZcbiAqIGxvd2VyY2FzZSBoZXgsIGxvbmcgZW5vdWdoIHRoYXQgbm8gcm91dGUgcGF0aG5hbWUgdGFrZXMgdGhlIHNhbWUgc2hhcGUuIFRoZXlcbiAqIGFyZSBtYXBwZWQgdG8gdGFncyBleGFjdGx5IGxpa2UgcGFnZXMgYXJlLCBidXQgbmFtZSBubyBVUkkgQ2xvdWRGcm9udCBjb3VsZCBiZVxuICogaG9sZGluZywgc28gYW4gaW52YWxpZGF0aW9uIHBhdGggYnVpbHQgZnJvbSBvbmUgaXMgYWx3YXlzIHdhc3RlZC5cbiAqL1xuZnVuY3Rpb24gaXNGZXRjaENhY2hlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlswLTlhLWZdezMyLH0kLy50ZXN0KGtleSk7XG59XG5cbi8qKiBXaGV0aGVyIENsb3VkRnJvbnQgY291bnRzIHRoaXMgcGF0aCBhZ2FpbnN0IHRoZSB3aWxkY2FyZCBxdW90YS4gKi9cbmZ1bmN0aW9uIGlzV2lsZGNhcmRQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGF0aC5pbmNsdWRlcyhcIipcIik7XG59XG5cbi8qKlxuICogVGhlIG1vc3Qgd2lsZGNhcmQgcGF0aHMgb25lIGByZXZhbGlkYXRlVGFnYCBzZW5kcyBiZWZvcmUgY29sbGFwc2luZyB0byBhIHNpbmdsZVxuICogYXBwLXdpZGUgd2lsZGNhcmQsIGFuZCB0aGUgbW9zdCBwYXRocyBvZiBhbnkga2luZC5cbiAqXG4gKiBDbG91ZEZyb250J3Mgd2lsZGNhcmQgcXVvdGEgaXMgcGVyICpkaXN0cmlidXRpb24qLCBub3QgcGVyIHJlcXVlc3Q6IHRoZVxuICogaW52YWxpZGF0aW9ucyBpdCBoYXMgaW4gcHJvZ3Jlc3Mgc2hhcmUgaXQsIHNvIHNwbGl0dGluZyBhbiBvdmVyc2l6ZWQgc2V0IGludG9cbiAqIGJhY2stdG8tYmFjayByZXF1ZXN0cyBpcyB3aGF0IGdldHMgdGhlIGxhdGVyIG9uZXMgcmVqZWN0ZWRcbiAqIChgVG9vTWFueUludmFsaWRhdGlvbnNJblByb2dyZXNzYCwgb3IgYSB0aHJvdHRsZSB1bmRlciB0aGUgbmV3ZXIgcmF0ZS1iYXNlZFxuICogcXVvdGFzKSAtIGFuZCBhIHJlamVjdGVkIHJlcXVlc3QgaXMgYSBwYWdlIHRoYXQgc3RheXMgc3RhbGUgYXQgdGhlIGVkZ2UuIFNvXG4gKiBldmVyeXRoaW5nIGdvZXMgb3V0IGFzIG9uZSByZXF1ZXN0LCBhbmQgYSBzZXQgdGhhdCB3b3VsZCBub3QgZml0IGluIG9uZSBpc1xuICogYW5zd2VyZWQgd2l0aCB0aGUgd2hvbGUgYXBwIChgLypgLCBzZWUgYHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHNgKSBpbnN0ZWFkOlxuICogYSB3b3JzZSBoaXQgcmF0ZSwgYW5kIGEgc3RyaWN0bHkgY29ycmVjdCBhbnN3ZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy1pbnZhbGlkYXRpb25zXG4gKi9cbmNvbnN0IE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OID0gMTU7XG5cbmNvbnN0IE1BWF9QQVRIU19QRVJfSU5WQUxJREFUSU9OID0gMzAwMDtcblxuLyoqXG4gKiBSZXRyaWVzIG9mIGFuIGludmFsaWRhdGlvbiBDbG91ZEZyb250IHJlamVjdGVkIGZvciBpdHMgaW4tcHJvZ3Jlc3MgcXVvdGEsIGFuZFxuICogdGhlIGRlbGF5IGJlZm9yZSB0aGUgZmlyc3Q7IGVhY2ggbGF0ZXIgb25lIHdhaXRzIHR3aWNlIGFzIGxvbmcuXG4gKlxuICogU2l6aW5nIGEgcmVxdWVzdCBhZ2FpbnN0IHRoZSBxdW90YSBjYW5ub3Qgc2VlIHRoZSBpbnZhbGlkYXRpb25zIG90aGVyXG4gKiBpbnN0YW5jZXMgYWxyZWFkeSBoYXZlIGluIGZsaWdodCwgc28gdHdvIGByZXZhbGlkYXRlVGFnYHMgY2xvc2UgdG9nZXRoZXIgY2FuXG4gKiBlYWNoIGZpdCBvbiB0aGVpciBvd24gYW5kIHN0aWxsIGJlIHJlamVjdGVkIHRvZ2V0aGVyLiBEcm9wcGluZyB0aGUgcmVqZWN0ZWRcbiAqIG9uZSBsZWZ0IGl0cyBwYWdlcyBzdGFsZSBhdCB0aGUgZWRnZSBmb3IgdGhlIHdob2xlIGBzLW1heGFnZWAuIFRoZSByZXRyeSBhc2tzXG4gKiBmb3IgdGhlIHdob2xlIGFwcCBpbnN0ZWFkLCB3aGljaCBpcyBvbmUgd2lsZGNhcmQgLSB0aGUgbGVhc3Qgb2YgdGhlIHF1b3RhIGFueVxuICogcmVxdWVzdCBjYW4gdGFrZSAtIGF0IHRoZSBjb3N0IG9mIGEgY29sZGVyIGVkZ2UuXG4gKi9cbmNvbnN0IElOVkFMSURBVElPTl9SRVRSSUVTID0gMjtcbmNvbnN0IElOVkFMSURBVElPTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDA7XG5cbi8qKiBUaGUgZXJyb3JzIHRoYXQgbWVhbiBcInRoZSBxdW90YSBpcyBmdWxsIHJpZ2h0IG5vd1wiLCBub3QgXCJ0aGlzIGlzIHdyb25nXCIuICovXG5mdW5jdGlvbiBpc0ludmFsaWRhdGlvblF1b3RhRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgbmFtZSA9IChlcnJvciBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCBudWxsKT8ubmFtZTtcbiAgcmV0dXJuIG5hbWUgPT09IFwiVG9vTWFueUludmFsaWRhdGlvbnNJblByb2dyZXNzXCIgfHwgbmFtZSA9PT0gXCJUaHJvdHRsaW5nXCI7XG59XG5cbi8qKlxuICogVGhlIG1vc3QgY2FjaGUga2V5cyB0byByZW1lbWJlciBhcyBzZXJ2ZWQgc3RhbGUgd2hpbGUgYXdhaXRpbmcgdGhlaXJcbiAqIHJlZ2VuZXJhdGlvbi4gQSBiYWNrZ3JvdW5kIHJlbmRlciB0aGF0IGZhaWxzIG5ldmVyIGNhbGxzIGBzZXRgLCBzbyB3aXRob3V0IGFcbiAqIGJvdW5kIGl0cyBrZXkgd291bGQgc3RheSBiZWhpbmQgZm9yIHRoZSBsaWZlIG9mIHRoZSBpbnN0YW5jZS5cbiAqIEBzZWUgUzNDYWNoZUhhbmRsZXIuc29mdFJldmFsaWRhdGVkS2V5c1xuICovXG5jb25zdCBNQVhfU09GVF9SRVZBTElEQVRFRF9LRVlTID0gMTAwMDtcblxuLyoqXG4gKiBIb3cgbWFueSAxIE1CIFF1ZXJ5IHBhZ2VzIG9mIG9uZSB0YWcncyBtYXBwaW5nIHJvd3MgdG8gd2Fsay4gQSBjZWlsaW5nIHJhdGhlclxuICogdGhhbiBhIHJlYWwgbGltaXQ6IGl0IGJvdW5kcyBhIHJ1bmF3YXkgdGFnIGluc3RlYWQgb2YgcGFnaW5hdGluZyBhIHdob2xlIHRhYmxlXG4gKiBvbiBhIHJlcXVlc3QgcGF0aC4gQSB0YWcgY3V0IG9mZiBoZXJlIGludmFsaWRhdGVzIHRoZSB3aG9sZSBhcHAsIGJlY2F1c2UgdGhlXG4gKiByb3dzIGl0IG5ldmVyIHJlYWQgYXJlIHBhZ2VzIHdob3NlIGVkZ2UgY29weSB3b3VsZCBvdGhlcndpc2Ugc3RheSBzdGFsZS5cbiAqL1xuY29uc3QgTUFYX1RBR19RVUVSWV9QQUdFUyA9IDIwO1xuXG4vKipcbiAqIE5leHQuanMncyBpbi1wcm9jZXNzIHRhZyBtYW5pZmVzdCwgd2hpY2ggYEluY3JlbWVudGFsQ2FjaGUuZ2V0YCBjb25zdWx0cyB0b1xuICogZGVjaWRlIHdoZXRoZXIgYW4gZW50cnkgaXMgc3RhbGUgLSBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbm5vdCBiZSBmb3VuZFxuICogdW5hbWJpZ3VvdXNseS5cbiAqXG4gKiBgcmV2YWxpZGF0ZVRhZyh0YWcsIHByb2ZpbGUpYCBhc2tzIGZvciBzdGFsZS13aGlsZS1yZXZhbGlkYXRlOiB0aGUgZW50cnkgaXNcbiAqIHNlcnZlZCBvbmNlIG1vcmUgd2hpbGUgYSBiYWNrZ3JvdW5kIHJlbmRlciByZXBsYWNlcyBpdC4gQSBjYWNoZSBoYW5kbGVyIGhhc1xuICogbm8gZmllbGQgdG8gc2F5IFwic3RhbGVcIiBpbiAtIGBsYXN0TW9kaWZpZWQ6IC0xYCBtZWFucyBleHBpcmVkLCB3aGljaCBibG9ja3MgLVxuICogc28gdGhpcyBzZXRzIHRoZSB0YWcncyBgc3RhbGVgIHRpbWVzdGFtcCB3aGVyZSBOZXh0LmpzIGFscmVhZHkgbG9va3MgZm9yIGl0LFxuICogd2hpY2ggaXMgZXhhY3RseSB3aGF0IGl0cyBvd24gYEZpbGVTeXN0ZW1DYWNoZS5yZXZhbGlkYXRlVGFnYCBkb2VzLiBUaGUgbW9kdWxlXG4gKiBpcyByZWFkIGZyb20gdGhlIGxvYWRlZC1tb2R1bGUgY2FjaGUgcmF0aGVyIHRoYW4gYHJlcXVpcmVgZDogdGhlIGhhbmRsZXIgaXNcbiAqIGJ1bmRsZWQgYXBhcnQgZnJvbSB0aGUgYXBwLCBhbmQgcmVzb2x2aW5nIGBuZXh0YCBmcm9tIGhlcmUgY291bGQgcmVhY2ggYVxuICogZGlmZmVyZW50IGNvcHkgdGhhbiB0aGUgc2VydmVyIGxvYWRlZCwgd2hvc2UgbWFuaWZlc3Qgbm90aGluZyByZWFkcy4gQSBzdGFsZVxuICogbWFyayB3cml0dGVuIHRoZXJlIHdvdWxkIHNlcnZlIHRoZSBlbnRyeSBhcyBmcmVzaCwgc28gd2l0aG91dCBleGFjdGx5IG9uZVxuICogbG9hZGVkIGNvcHkgdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIGV4cGlyaW5nIHRoZSBlbnRyeSBvdXRyaWdodC5cbiAqL1xuY29uc3QgVEFHU19NQU5JRkVTVF9NT0RVTEUgPVxuICBcIi9uZXh0L2Rpc3Qvc2VydmVyL2xpYi9pbmNyZW1lbnRhbC1jYWNoZS90YWdzLW1hbmlmZXN0LmV4dGVybmFsLmpzXCI7XG5mdW5jdGlvbiBuZXh0VGFnc01hbmlmZXN0KCk6XG4gIE1hcDxzdHJpbmcsIHsgc3RhbGU/OiBudW1iZXI7IGV4cGlyZWQ/OiBudW1iZXIgfT4gfCB1bmRlZmluZWQge1xuICBjb25zdCBjYWNoZSA9IGNyZWF0ZVJlcXVpcmUoam9pbihwcm9jZXNzLmN3ZCgpLCBcImluZGV4LmpzXCIpKS5jYWNoZTtcbiAgY29uc3QgbG9hZGVkID0gT2JqZWN0LmtleXMoY2FjaGUpLmZpbHRlcigocGF0aCkgPT5cbiAgICBwYXRoLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLmVuZHNXaXRoKFRBR1NfTUFOSUZFU1RfTU9EVUxFKSxcbiAgKTtcbiAgaWYgKGxvYWRlZC5sZW5ndGggIT09IDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0ID0gY2FjaGVbbG9hZGVkWzBdXT8uZXhwb3J0cz8udGFnc01hbmlmZXN0O1xuICByZXR1cm4gbWFuaWZlc3QgaW5zdGFuY2VvZiBNYXAgPyBtYW5pZmVzdCA6IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIENsb3VkRnJvbnRJbnZhbGlkYXRpb25Db25maWcge1xuICAvKipcbiAgICogVGhlIGRpc3RyaWJ1dGlvbiBJRCwgd2hlbiB0aGUgY29tcHV0ZSdzIGVudmlyb25tZW50IGNhbiBjYXJyeSBpdFxuICAgKiAoYE5leHRqc0dsb2JhbENvbnRhaW5lcnNgKS5cbiAgICovXG4gIGRpc3RyaWJ1dGlvbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdGhlcndpc2UsIHRoZSBuYW1lIChub3QgdmFsdWUpIG9mIHRoZSBTU00gUGFyYW1ldGVyIGhvbGRpbmcgaXQuXG4gICAqXG4gICAqIE9uIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgIHRoZSBkaXN0cmlidXRpb24ncyBvcmlnaW4gaXMgdGhlIGZ1bmN0aW9uJ3NcbiAgICogVVJMLCBzbyB0aGUgZnVuY3Rpb24ncyBlbnZpcm9ubWVudCBuYW1pbmcgdGhlIGRpc3RyaWJ1dGlvbiBiYWNrIHdvdWxkIGJlXG4gICAqIGEgY2lyY3VsYXIgQ2xvdWRGb3JtYXRpb24gZGVwZW5kZW5jeS4gVGhlIHBhcmFtZXRlciAqbmFtZSogaXMgc3RhdGljIGFuZFxuICAgKiBrbm93biBhdCBzeW50aCB0aW1lOyBvbmx5IGl0cyAqdmFsdWUqIGRlcGVuZHMgb24gdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIGRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFwcCdzIGBiYXNlUGF0aGAsIGFzIHRoZSBVUkkgcHJlZml4IENsb3VkRnJvbnQgY2FjaGVkIHRoZSByZXNwb25zZXNcbiAgICogdW5kZXIuXG4gICAqIEBzZWUgY2RuSW52YWxpZGF0aW9uUGF0aHNcbiAgICovXG4gIGJhc2VQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUzNDYWNoZUhhbmRsZXJPcHRpb25zIHtcbiAgY29udGV4dDogQ2FjaGVIYW5kbGVyQ29udGV4dDtcbiAgLyoqXG4gICAqIFRoZSBhcHAncyBgYmFzZVBhdGhgLCBmb3IgdGVzdHM6IHJlYWQgZnJvbSBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gXG4gICAqIG90aGVyd2lzZS5cbiAgICovXG4gIGJhc2VQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUzNDYWNoZUhhbmRsZXIgaW1wbGVtZW50cyBDYWNoZUhhbmRsZXIge1xuICBwcml2YXRlIHMzQ2xpZW50OiBTM0NsaWVudDtcbiAgcHJpdmF0ZSBkeW5hbW9DbGllbnQ6IER5bmFtb0RCQ2xpZW50O1xuICBwcml2YXRlIGNsb3VkRnJvbnRDbGllbnQ6IENsb3VkRnJvbnRDbGllbnQ7XG4gIHByaXZhdGUgc3NtQ2xpZW50OiBTU01DbGllbnQ7XG4gIHByaXZhdGUgYnVja2V0OiBDYWNoZUJ1Y2tldDtcbiAgcHJpdmF0ZSB0YWdzOiBUcmFja2VkVGFnTWFya2VycztcbiAgcHJpdmF0ZSBjb25maWc6IEF3c0NhY2hlQ29uZmlnO1xuICBwcml2YXRlIGNsb3VkRnJvbnRDb25maWc6IENsb3VkRnJvbnRJbnZhbGlkYXRpb25Db25maWc7XG4gIHByaXZhdGUgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6Y2FjaGUtaGFuZGxlcjpzM1wiKTtcblxuICAvLyBDYWNoZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIGluc3RhbmNlIChpLmUuIHRoZSBjb21wdXRlIGluc3RhbmNlKSBvbmNlXG4gIC8vIHJlc29sdmVkLCBzaW5jZSBhIGRlcGxveW1lbnQncyBkaXN0cmlidXRpb24gSUQgbmV2ZXIgY2hhbmdlcyBhdCBydW50aW1lLlxuICBwcml2YXRlIGNhY2hlZERpc3RyaWJ1dGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ2FjaGUga2V5cyB0aGlzIGluc3RhbmNlIHNlcnZlZCBzdGFsZSBiZWNhdXNlIG9mIGEgc29mdCBgcmV2YWxpZGF0ZVRhZ2AsXG4gICAqIHdob3NlIHJlZ2VuZXJhdGVkIGVudHJ5IGBzZXRgIGhhcyB5ZXQgdG8gd3JpdGUuXG4gICAqXG4gICAqIGByZXZhbGlkYXRlVGFnKHRhZywgcHJvZmlsZSlgIGludmFsaWRhdGVzIENsb3VkRnJvbnQgYXQgb25jZSwgYnV0IHRoZSBuZXh0XG4gICAqIHJlcXVlc3QgaXMgYW5zd2VyZWQgZnJvbSB0aGUgc3RhbGUgZW50cnkgLSBzdGFsZS13aGlsZS1yZXZhbGlkYXRlIC0gYW5kIHRoYXRcbiAgICogcmVzcG9uc2UgY2FycmllcyB0aGUgZW50cnkncyBvcmlnaW5hbCBgcy1tYXhhZ2VgLCBzbyB0aGUgZWRnZSBjYWNoZXMgdGhlXG4gICAqIHN0YWxlIGJvZHkgYWdhaW4uIFRoZSBiYWNrZ3JvdW5kIHJlbmRlciB0aGF0IHJlcGxhY2VzIGl0IHJ1bnMgaW4gdGhpcyBzYW1lXG4gICAqIHByb2Nlc3MsIHNvIGBzZXRgIGNoZWNrcyBmb3IgdGhlIGtleSBoZXJlIGFuZCBpbnZhbGlkYXRlcyB0aGUga2V5J3MgcGF0aHMgYSBzZWNvbmRcbiAgICogdGltZSBvbmNlIHRoZSBmcmVzaCBlbnRyeSBpcyBpbiBTMy4gV2l0aG91dCB0aGF0LCB0aGUgZWRnZSBrZXB0IHNlcnZpbmcgdGhlXG4gICAqIHByZS1yZXZhbGlkYXRpb24gcGFnZSBmb3IgdGhlIHdob2xlIGBzLW1heGFnZWAuXG4gICAqXG4gICAqIEV4cGlyaW5nIHNvZnQtcmV2YWxpZGF0ZWQgZW50cmllcyBvdXRyaWdodCBpbnN0ZWFkIHdvdWxkIGFsc28ga2VlcCB0aGUgZWRnZVxuICAgKiByaWdodCwgYnV0IGl0IHR1cm5zIGV2ZXJ5IGByZXZhbGlkYXRlVGFnKHRhZywgXCJtYXhcIilgIGludG8gYSBibG9ja2luZyByZW5kZXJcbiAgICogYXQgdGhlIG9yaWdpbiwgd2hpY2ggaXMgdGhlIHRoaW5nIGEgcHJvZmlsZSBhc2tzIG5vdCB0byBoYXBwZW4uXG4gICAqXG4gICAqIFdoZW4gdGhlIHJlLXJlbmRlciBmYWlscywgbmV4dCAxNi40J3MgYHJldGFpblByZXZpb3VzQ2FjaGVFbnRyeWAgd3JpdGVzIHRoZVxuICAgKiBzdGFsZSB2YWx1ZSBiYWNrIHdpdGggYSBzaG9ydCBsaWZldGltZTogdGhhdCBpcyBubyByZWdlbmVyYXRpb24sIHNvIHRoZSBrZXlcbiAgICoga2VlcHMgd2FpdGluZyByYXRoZXIgdGhhbiBpbnZhbGlkYXRpbmcgdGhlIGVkZ2UgZm9yIGEgcGFnZSB0aGF0IGhhcyBub3RcbiAgICogY2hhbmdlZC4ge0BsaW5rIHNlcnZlZFN0YWxlfSBpcyBob3cgYHNldGAgcmVjb2duaXNlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgc29mdFJldmFsaWRhdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBFdmVyeSB2YWx1ZSBoYW5kZWQgb3V0IHN0YWxlLCBieSBpZGVudGl0eTogdGhlIG9iamVjdCBgZ2V0YCByZXR1cm5lZCBpcyB0aGVcbiAgICogb25lIGByZXRhaW5QcmV2aW91c0NhY2hlRW50cnlgIHdyaXRlcyBiYWNrLiBXZWFrLCBzbyBhIHBhZ2UgYm9keSBpcyBoZWxkIG5vXG4gICAqIGxvbmdlciB0aGFuIHRoZSBtZW1vcnkgbGF5ZXIgb3IgdGhlIHJlcXVlc3QgaG9sZHMgaXQuXG4gICAqL1xuICBwcml2YXRlIHNlcnZlZFN0YWxlID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKiBAc2VlIGJ1aWxkVGFnTWFuaWZlc3QgKi9cbiAgcHJpdmF0ZSBidWlsZFRhZ3M6IFByb21pc2U8TWFwPHN0cmluZywgc3RyaW5nW10+PiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTM0NhY2hlSGFuZGxlck9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHJlc29sdmVBd3NDYWNoZUNvbmZpZygpO1xuXG4gICAgLy8gT25seSBzZXQgZm9yIENsb3VkRnJvbnQtZnJvbnRlZCBkZXBsb3ltZW50cyAoTmV4dGpzR2xvYmFsRnVuY3Rpb25zL0NvbnRhaW5lcnMpLlxuICAgIC8vIFdoZW4gdW5zZXQsIG9uLWRlbWFuZCByZXZhbGlkYXRpb24gc2tpcHMgQ0ROIGludmFsaWRhdGlvbiBhbmQgcmVsaWVzIG9uIHRoZVxuICAgIC8vIGRpc3RyaWJ1dGlvbidzIGNhY2hlIHBvbGljeSBUVEwgKGRyaXZlbiBieSB0aGUgb3JpZ2luJ3MgQ2FjaGUtQ29udHJvbCBoZWFkZXIpXG4gICAgLy8gdG8gZXZlbnR1YWxseSBwaWNrIHVwIGZyZXNoIGNvbnRlbnQuXG4gICAgdGhpcy5jbG91ZEZyb250Q29uZmlnID0ge1xuICAgICAgZGlzdHJpYnV0aW9uSWQ6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfRElTVFJJQlVUSU9OX0lEIHx8IFwiXCIsXG4gICAgICBkaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWU6XG4gICAgICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfRElTVFJJQlVUSU9OX0lEX1BBUkFNX05BTUUgfHwgXCJcIixcbiAgICAgIGJhc2VQYXRoOiBiYXNlUGF0aFByZWZpeChvcHRpb25zLmJhc2VQYXRoKSxcbiAgICB9O1xuICAgIC8vIE9ubHkgaW52YWxpZGF0aW9uIG5lZWRzIGl0LCBzbyBvbmx5IGEgaGFuZGxlciBiZWhpbmQgYSBkaXN0cmlidXRpb24gcmVhZHNcbiAgICAvLyBpdCwgYW5kIGEgbWlzc2luZyBmaWxlIHRoZXJlIGlzIHdvcnRoIGEgd2FybmluZy5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlc0NkbiAmJiBvcHRpb25zLmJhc2VQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2xvdWRGcm9udENvbmZpZy5iYXNlUGF0aCA9IGJhc2VQYXRoUHJlZml4KFxuICAgICAgICBhcHBCYXNlUGF0aChvcHRpb25zLmNvbnRleHQuc2VydmVyRGlzdERpciksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgQVdTIGNsaWVudHNcbiAgICBjb25zdCB7IHJlZ2lvbiB9ID0gdGhpcy5jb25maWc7XG4gICAgdGhpcy5zM0NsaWVudCA9IG5ldyBTM0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICB0aGlzLmR5bmFtb0NsaWVudCA9IG5ldyBEeW5hbW9EQkNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICB0aGlzLmNsb3VkRnJvbnRDbGllbnQgPSBuZXcgQ2xvdWRGcm9udENsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICB0aGlzLnNzbUNsaWVudCA9IG5ldyBTU01DbGllbnQoeyByZWdpb24gfSk7XG4gICAgdGhpcy5idWNrZXQgPSBuZXcgQ2FjaGVCdWNrZXQodGhpcy5zM0NsaWVudCwgdGhpcy5jb25maWcuYnVja2V0TmFtZSk7XG4gICAgLy8gVGhlIHByb2Nlc3MncyBvbmUgY29weSBvZiB0aGUgdGFnIG1hcmtlcnMsIHNoYXJlZCB3aXRoIHRoZSBgJ3VzZSBjYWNoZSdgXG4gICAgLy8gaGFuZGxlcnM6IG9uZSBgcmV2YWxpZGF0ZVRhZ2Agd3JpdGVzIGVhY2ggdGFnJ3Mgcm93cyBvbmNlLCBhbmQgb25lIGxvZ1xuICAgIC8vIGBRdWVyeWAgcGVyIGludGVydmFsIHNlcnZlcyBldmVyeSBoYW5kbGVyLlxuICAgIHRoaXMudGFncyA9IHNoYXJlZFRhZ01hbmlmZXN0KCk7XG5cbiAgICAvLyBgcmVzLnJldmFsaWRhdGUoKWAgcmVnZW5lcmF0ZXMgYSBwYWdlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaFxuICAgIC8vIGByZXZhbGlkYXRlVGFnYCwgc28gdGhlIHJ1bnRpbWUgYXNrcyBmb3IgdGhlIENETiBjb3BpZXMgaXRzZWxmLCB0aHJvdWdoXG4gICAgLy8gdGhpcyBob29rIChgaW52YWxpZGF0ZVJldmFsaWRhdGVkUGFnZWAgaW4gYHNyYy9ydW50aW1lL2NvcmUudHNgKS4gQSBnbG9iYWxcbiAgICAvLyBiZWNhdXNlIHRoZSBydW50aW1lIGFuZCB0aGlzIGhhbmRsZXIgYXJlIHNlcGFyYXRlIGJ1bmRsZXMgaW4gb25lIHByb2Nlc3MuXG4gICAgLy8gRXZlcnkgaW5zdGFuY2UgcmVnaXN0ZXJzIHRoZSBzYW1lIHRoaW5nLCBzbyB0aGUgbGF0ZXN0IG9uZSB3aW5uaW5nIGlzIGZpbmUuXG4gICAgaWYgKHRoaXMuaW52YWxpZGF0ZXNDZG4pIHtcbiAgICAgIChnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtSRVZBTElEQVRFRF9QQUdFX0hPT0tdID0gKFxuICAgICAgICByb3V0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IHsgYmFzZVBhdGggfSA9IHRoaXMuY2xvdWRGcm9udENvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZGF0ZUNsb3VkRnJvbnRQYXRocyhcbiAgICAgICAgICByb3V0ZXMuZmxhdE1hcCgocm91dGUpID0+IGNkbkludmFsaWRhdGlvblBhdGhzKHJvdXRlLCBiYXNlUGF0aCkpLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlnLmJ1Y2tldE5hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIFMzIGNhY2hlIGRpc2FibGVkXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jb25maWcudGFibGVOYW1lKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCByZXZhbGlkYXRpb24gdHJhY2tpbmcgZGlzYWJsZWRcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9jZXNzLmVudi5DREtfTkVYVEpTX0JVSUxEX0lEKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQ0RLX05FWFRKU19CVUlMRF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCBjYWNoZSBpc29sYXRpb24gbWF5IG5vdCB3b3JrIGNvcnJlY3RseVwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXQoXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICBjdHg6IEdldENhY2hlSGFuZGxlckNvbnRleHQsXG4gICk6IFByb21pc2U8Q2FjaGVIYW5kbGVyVmFsdWUgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5jb25maWcuYnVja2V0TmFtZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2JqZWN0S2V5ID0gczNPYmplY3RLZXkodGhpcy5jb25maWcuYnVpbGRJZCwgY2FjaGVLZXkpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYnVja2V0LmdldChvYmplY3RLZXkpO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIE1JU1M6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVyeSBvYmplY3QgaXMgSlNPTiAoYHB1dEpzb25gLCBhbmQgdGhlIHNlZWRlZCBgLmpzb25gIGZpbGVzKTsgb25lXG4gICAgICAvLyB0aGF0IGRvZXMgbm90IHBhcnNlIGlzIGEgbWlzcywgdGhyb3VnaCB0aGUgYGNhdGNoYCBiZWxvdy5cbiAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gcGFyc2VDYWNoZVZhbHVlKHJlc3BvbnNlKTtcblxuICAgICAgaWYgKGF3YWl0IHRoaXMuaXNSZXZhbGlkYXRlZChwYXJzZWRWYWx1ZSwgY3R4LCBjYWNoZUtleSkpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgUzMgQ0FDSEUgSU5WQUxJREFURUQgQlkgVEFHOiAke2NhY2hlS2V5fWApO1xuICAgICAgICAvLyBBIHJldmFsaWRhdGVkIGBmZXRjaGAgZW50cnkgaGFzIHRvIHJlYWQgYXMgYSBtaXNzIHNvIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIHJlZmV0Y2hlcyBpbnN0ZWFkIG9mIHJldXNpbmcgdGhlIGJvZHkgLSB0aGUgc2FtZSB0aGluZyBOZXh0LmpzJ3NcbiAgICAgICAgLy8gb3duIGBGaWxlU3lzdGVtQ2FjaGVgIGRvZXMgd2l0aCBgcmV2YWxpZGF0ZWRUYWdzYC4gT25seSBhXG4gICAgICAgIC8vICpyZXNwb25zZSogZW50cnkgZ2V0cyBoYW5kZWQgYmFjayBleHBpcmVkLCBiZWNhdXNlIGZvciB0aG9zZSBhXG4gICAgICAgIC8vIG1pc3MgaXMgd29yc2UgdGhhbiBzdGFsZTogc2VlIGBFWFBJUkVEX0xBU1RfTU9ESUZJRURgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBOZWl0aGVyIGlzIGRlbGV0ZWQuIFRoZSByZWZldGNoIG9yIHJlLXJlbmRlciB0aGlzIHByb3Zva2VzXG4gICAgICAgIC8vIG92ZXJ3cml0ZXMgdGhlIG9iamVjdCB0aHJvdWdoIGBzZXRgLCB3aXRoIGEgYGxhc3RNb2RpZmllZGAgcGFzdCB0aGVcbiAgICAgICAgLy8gdGFnJ3MgbWFya2VyOyBkZWxldGluZyBpdCBoZXJlIGFzIHdlbGwgcmFjZWQgdGhhdCB3cml0ZSwgYW5kIGFcbiAgICAgICAgLy8gY29uY3VycmVudCByZXF1ZXN0J3MgZnJlc2ggZW50cnkgY291bGQgYmUgdGhlIG9uZSByZW1vdmVkLiBLZWVwaW5nXG4gICAgICAgIC8vIGEgcmVzcG9uc2UgZW50cnkgYWxzbyBtZWFucyBhIHJlbmRlciB0aGF0IGZhaWxzIGlzIGFuc3dlcmVkIGZyb21cbiAgICAgICAgLy8gdGhlIGxhc3QgZ29vZCBjb3B5IHJhdGhlciB0aGFuIGZyb20gYSBzaGVsbC5cbiAgICAgICAgcmV0dXJuIGlzRmV0Y2hDYWNoZUdldChjdHgpXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogRVhQSVJFRF9MQVNUX01PRElGSUVELFxuICAgICAgICAgICAgICB2YWx1ZTogcGFyc2VkVmFsdWUudmFsdWUsXG4gICAgICAgICAgICAgIGNhY2hlQ29udHJvbDogc3RvcmVkQ2FjaGVDb250cm9sKHBhcnNlZFZhbHVlLmNhY2hlQ29udHJvbCksXG4gICAgICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBISVQ6ICR7Y2FjaGVLZXl9ICgke29iamVjdEtleX0pYCk7XG5cbiAgICAgIC8vIFdpdGhvdXQgdGhlIHN0b3JlZCB0YWdzLiBXaXRoIHRoZSBzdG9yZWQgbGlmZXRpbWU6IHNlZVxuICAgICAgLy8gYGdldENhY2hlQ29udHJvbGAuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IHBhcnNlZFZhbHVlLmxhc3RNb2RpZmllZCxcbiAgICAgICAgdmFsdWU6IHBhcnNlZFZhbHVlLnZhbHVlLFxuICAgICAgICBjYWNoZUNvbnRyb2w6IHN0b3JlZENhY2hlQ29udHJvbChwYXJzZWRWYWx1ZS5jYWNoZUNvbnRyb2wpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGFjdHVhbCBlcnJvcnMgKGEgY2FjaGUgbWlzcyBpcyBub3Qgb25lOiBzZWUgYENhY2hlQnVja2V0LmdldGApXG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciByZXRyaWV2aW5nIGNhY2hlIGZyb20gUzM6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0YWcgcmV2YWxpZGF0aW9uIGhhcyBleHBpcmVkIGBlbnRyeWAsIGZvciBhIGBnZXRgIHdpdGggYGN0eGAuXG4gICAqXG4gICAqIFB1YmxpYyBiZWNhdXNlIHRoZSBpbi1tZW1vcnkgbGF5ZXIgaW4gZnJvbnQgb2YgdGhpcyBoYW5kbGVyIGhhcyB0byBhc2sgdG9vOlxuICAgKiBhIG1lbW9yeSBoaXQgbmV2ZXIgcmVhY2hlcyB7QGxpbmsgZ2V0fSwgYW5kIHdpdGhvdXQgdGhpcyBjaGVjayBhbiBpbnN0YW5jZVxuICAgKiBvdGhlciB0aGFuIHRoZSBvbmUgdGhhdCByYW4gYHJldmFsaWRhdGVUYWdgIGtlcHQgYW5zd2VyaW5nIGZyb20gbWVtb3J5IGZvclxuICAgKiB0aGUgd2hvbGUgbWVtb3J5IFRUTCAtIGxvbmcgZW5vdWdoIGZvciBDbG91ZEZyb250IHRvIGNhY2hlIHRoZSBzdGFsZSBwYWdlXG4gICAqIGFnYWluIGFmdGVyIHRoZSBpbnZhbGlkYXRpb24uXG4gICAqXG4gICAqIFdoaWNoIHRhZ3MgdG8gY2hlY2sgZGVwZW5kcyBvbiB0aGUga2luZCwgYW5kIE5leHQuanMncyBvd25cbiAgICogYEZpbGVTeXN0ZW1DYWNoZS5nZXRgIHNwbGl0cyB0aGUgc2FtZSB0d28gd2F5czogYSByZXNwb25zZSBlbnRyeSBpcyBjaGVja2VkXG4gICAqIGFnYWluc3QgdGhlIHRhZ3MgKml0KiB3YXMgc3RvcmVkIHdpdGgsIGJ1dCBhIGBmZXRjaGAgZW50cnkgaXMgY2hlY2tlZFxuICAgKiBhZ2FpbnN0IGBbLi4uY3R4LnRhZ3MsIC4uLmN0eC5zb2Z0VGFnc11gIOKAlCB0aGUgdGFncyBvZiB0aGUgcmVxdWVzdCBhc2tpbmdcbiAgICogZm9yIGl0LiBUaGF0IGRpc3RpbmN0aW9uIGlzIGxvYWQtYmVhcmluZywgYmVjYXVzZSBhIGBmZXRjaGAgZW50cnkgaXMgb25seVxuICAgKiBldmVyIHN0b3JlZCB3aXRoIGl0cyAqZXhwbGljaXQqIGBjYWNoZTogeyB0YWdzIH1gIGFuZCBuZXZlciB3aXRoIHRoZVxuICAgKiBpbXBsaWNpdCBgX05fVF8vPHBhdGg+YCBjaGFpbiwgd2hpY2ggYXJyaXZlcyBvbmx5IGFzIGBjdHguc29mdFRhZ3NgLlxuICAgKiBSZWFkaW5nIHRoZSBzdG9yZWQgdGFncyBmb3IgYSBgZmV0Y2hgIHRvbyBtZWFudCBhbiB1bnRhZ2dlZCBgZm9yY2UtY2FjaGVgXG4gICAqIGZldGNoIGhhZCBgW11gLCBza2lwcGVkIHRoZSBjaGVjayBlbnRpcmVseSwgYW5kIG5vIGByZXZhbGlkYXRlUGF0aGAgY291bGRcbiAgICogZXZlciBldmljdCBpdDogYSBgZm9yY2UtZHluYW1pY2AgcGFnZSB3aG9zZSBkYXRhIGNvbWVzIGZyb20gc3VjaCBhIGZldGNoXG4gICAqIHJlLXJlbmRlcmVkIG9uIGV2ZXJ5IHJlcXVlc3QgYW5kIHN0aWxsIHNlcnZlZCB0aGUgc2FtZSBib2R5IGZvcmV2ZXIuXG4gICAqIE1lYXN1cmVkIGFnYWluc3QgbmV4dC5qcydzIGB0ZXN0L2UyZS9hcHAtZGlyL3JldmFsaWRhdGUtcGF0aC13aXRoLXJld3JpdGVzYC5cbiAgICpcbiAgICogYGNhY2hlS2V5YCBpcyB0aGUga2V5IHRoZSBlbnRyeSB3YXMgcmVhZCB1bmRlci4gQSByZXNwb25zZSBlbnRyeSBmb3VuZFxuICAgKiBzdGFsZSBpcyByZW1lbWJlcmVkIGJ5IGl0LCBmb3IgYHNldGAgdG8gaW52YWxpZGF0ZSBDbG91ZEZyb250IGFnYWluIG9uY2VcbiAgICogaXRzIHJlZ2VuZXJhdGlvbiBsYW5kczogc2VlIHtAbGluayBzb2Z0UmV2YWxpZGF0ZWRLZXlzfS5cbiAgICovXG4gIGFzeW5jIGlzUmV2YWxpZGF0ZWQoXG4gICAgZW50cnk6IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyB0YWdzPzogc3RyaW5nW107IHZhbHVlPzogdW5rbm93biB9LFxuICAgIGN0eDogR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnRhYmxlTmFtZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjaGVja1RhZ3MgPSBpc0ZldGNoQ2FjaGVHZXQoY3R4KVxuICAgICAgPyBbLi4uKGN0eC50YWdzID8/IFtdKSwgLi4uKGN0eC5zb2Z0VGFncyA/PyBbXSldXG4gICAgICA6IGVudHJ5VGFncyhlbnRyeSk7XG4gICAgaWYgKGNoZWNrVGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmNoZWNrSWZSZXZhbGlkYXRlZChcbiAgICAgIGVudHJ5Lmxhc3RNb2RpZmllZCA/PyAwLFxuICAgICAgY2hlY2tUYWdzLFxuICAgICk7XG4gICAgaWYgKHN0YXRlID09PSBcInN0YWxlXCIgJiYgIWlzRmV0Y2hDYWNoZUdldChjdHgpKSB7XG4gICAgICB0aGlzLm5vdGVTb2Z0UmV2YWxpZGF0ZWQoY2FjaGVLZXksIGVudHJ5LnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlID09PSBcImV4cGlyZWRcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlciB0aGF0IGBjYWNoZUtleWAgd2FzIHNlcnZlZCBzdGFsZSwgd2hlbiB0aGVyZSBpcyBhIGRpc3RyaWJ1dGlvblxuICAgKiB3aG9zZSBjb3B5IG9mIGl0IHdpbGwgbmVlZCBpbnZhbGlkYXRpbmcgYWdhaW4uIFNlZVxuICAgKiB7QGxpbmsgc29mdFJldmFsaWRhdGVkS2V5c30uXG4gICAqL1xuICBwcml2YXRlIG5vdGVTb2Z0UmV2YWxpZGF0ZWQoY2FjaGVLZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW52YWxpZGF0ZXNDZG4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXJ2ZWRTdGFsZS5hZGQodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICBpZiAodGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLnNpemUgPj0gTUFYX1NPRlRfUkVWQUxJREFURURfS0VZUykge1xuICAgICAgLy8gSW5zZXJ0aW9uIG9yZGVyOiB0aGUgZmlyc3Qga2V5IGlzIHRoZSBvbmUgd2FpdGluZyBsb25nZXN0LlxuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zb2Z0UmV2YWxpZGF0ZWRLZXlzLmRlbGV0ZShvbGRlc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuYWRkKGNhY2hlS2V5KTtcbiAgfVxuXG4gIGFzeW5jIHNldChcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIGRhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSB8IG51bGwsXG4gICAgY3R4OiBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgZW50cnkncyBuYW1lIGluIHRhZyBtYXBwaW5ncyBhbmQgQ2xvdWRGcm9udCBwYXRocywgYW5kIHRoZSBvYmplY3RcbiAgICAvLyBpdCBpcyBzdG9yZWQgaW4sIHdoaWNoIGRpZmZlciBmb3IgYSBuYW1lIHRvbyBsb25nIGZvciBTMy5cbiAgICBjb25zdCBzM0tleSA9IGJ1aWxkUzNLZXkodGhpcy5jb25maWcuYnVpbGRJZCwgY2FjaGVLZXkpO1xuICAgIGNvbnN0IG9iamVjdEtleSA9IHMzT2JqZWN0S2V5KHRoaXMuY29uZmlnLmJ1aWxkSWQsIGNhY2hlS2V5KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIC8vIERlbGV0ZSBmcm9tIFMzIGFuZCBEeW5hbW9EQlxuICAgICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBERUxFVEU6ICR7Y2FjaGVLZXl9YCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5idWNrZXROYW1lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGVudHJ5IGlzIGdvbmUsIHNvIHRoZXJlIGlzIG5vIHJlZ2VuZXJhdGlvbiBsZWZ0IHRvIHdhaXQgZm9yLlxuICAgICAgICB0aGlzLnNvZnRSZXZhbGlkYXRlZEtleXMuZGVsZXRlKGNhY2hlS2V5KTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBlbnRyeSdzIHRhZ3MgYmVmb3JlIHRoZSBvYmplY3QgaXMgZ29uZTogdGhleSBhcmUgdGhlIG9ubHlcbiAgICAgICAgLy8gd2F5IHRvIG5hbWUgaXRzIG1hcHBpbmcgcm93cywgd2hvc2Ugc29ydCBrZXkgaXMgYHRhZyNzM0tleWAgYW5kIHNvXG4gICAgICAgIC8vIGNhbm5vdCBiZSBxdWVyaWVkIGZyb20gdGhlIGtleSBzaWRlLiBTZWUgYHN0b3JlZEVudHJ5VGFnc2AuXG4gICAgICAgIGNvbnN0IHRhZ3MgPSBhd2FpdCB0aGlzLnN0b3JlZEVudHJ5VGFncyhvYmplY3RLZXksIGN0eCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zM0NsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBEZWxldGVPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5jb25maWcuYnVja2V0TmFtZSxcbiAgICAgICAgICAgIEtleTogb2JqZWN0S2V5LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRlYnVnKGBTMyBDQUNIRSBERUxFVEVEOiAke29iamVjdEtleX1gKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUR5bmFtb0RCVGFnTWFwcGluZ3MoczNLZXksIHRhZ3MpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGBlbnRyeVRhZ3NgLCBub3QgYGdldFRhZ3MoY3R4KWAgYWxvbmU6IGZvciBhIHBhZ2Ugb3Igcm91dGUgcmVzcG9uc2VcbiAgICAgIC8vIGBjdHhgIGNhcnJpZXMgb25seSBgeyBjYWNoZUNvbnRyb2wsIGlzUm91dGVQUFJFbmFibGVkLCBpc0ZhbGxiYWNrIH1gIOKAlFxuICAgICAgLy8gYFJlc3BvbnNlQ2FjaGUuc2V0YCBidWlsZHMgaXQgdGhhdCB3YXkgYW5kIGBJbmNyZW1lbnRhbENhY2hlLnNldGBcbiAgICAgIC8vIGZvcndhcmRzIGl0IHVuY2hhbmdlZCDigJQgc28gdGhlIHRhZ3MgbGl2ZSBpbiB0aGUgcmVuZGVyJ3NcbiAgICAgIC8vIGB4LW5leHQtY2FjaGUtdGFnc2AgaGVhZGVyIGFuZCBub3doZXJlIGVsc2UuIFJlYWRpbmcgb25seSBgY3R4YCBtZWFudCBub1xuICAgICAgLy8gcnVudGltZS1yZW5kZXJlZCBwYWdlIGV2ZXIgZ290IGEgbWFwcGluZyByb3csIGFuZCBhIHBhZ2UgdGhhdCBpcyBub3QgaW5cbiAgICAgIC8vIHRoZSBidWlsZCdzIHRhZyBtYW5pZmVzdCBuYW1lcyBub25lIGVpdGhlcjogYSBsYXRlclxuICAgICAgLy8gYHJldmFsaWRhdGVUYWdgIGZvdW5kIG5vdGhpbmcgdG8gaW52YWxpZGF0ZSBhbmQgQ2xvdWRGcm9udCBrZXB0IHNlcnZpbmdcbiAgICAgIC8vIHRoZSBzdGFsZSBIVE1MIGFuZCBSU0MgcGF5bG9hZCBmb3IgdGhlIHdob2xlIGBzLW1heGFnZWAuIFNhbWUgc291cmNlIHRoZVxuICAgICAgLy8gcmVhZCBwYXRoIGFib3ZlIGFscmVhZHkgZmFsbHMgYmFjayB0by5cbiAgICAgIGNvbnN0IHRhZ3MgPSBlbnRyeVRhZ3MoeyB0YWdzOiBnZXRUYWdzKGN0eCksIHZhbHVlOiBkYXRhIH0pO1xuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYFMzIENBQ0hFIFNFVDogS2V5OiAke2NhY2hlS2V5fSwgdGFnczogJHt0YWdzLmxlbmd0aCA/IHRhZ3MgOiBcIm5vbmVcIn1gLFxuICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5idWNrZXROYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIENhY2hlSGFuZGxlclZhbHVlIHN0cnVjdHVyZSBmb3IgUzMgc3RvcmFnZSB3aXRoIHRhZ3NcbiAgICAgIGNvbnN0IGNhY2hlSGFuZGxlclZhbHVlOiBDYWNoZUhhbmRsZXJWYWx1ZSA9IHtcbiAgICAgICAgLy8gT24gdGhlIG1hcmtlciBjbG9jaywgc2luY2UgdGhhdCBpcyB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGguXG4gICAgICAgIGxhc3RNb2RpZmllZDogbWFya2VyQ2xvY2soKSxcbiAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgIGNhY2hlQ29udHJvbDogZ2V0Q2FjaGVDb250cm9sKGN0eCksXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0YWdzIHdpdGggdGhlIGNhY2hlIGVudHJ5IGZvciByZXZhbGlkYXRpb24gY2hlY2tpbmdcbiAgICAgIGNvbnN0IGNhY2hlRW50cnlXaXRoVGFncyA9IHtcbiAgICAgICAgLi4uY2FjaGVIYW5kbGVyVmFsdWUsXG4gICAgICAgIHRhZ3MsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZXJpYWxpemUgd2l0aCBjdXN0b20gaGFuZGxpbmcgZm9yIE1hcCBhbmQgQnVmZmVyIG9iamVjdHNcbiAgICAgIGNvbnN0IGJvZHkgPSBzZXJpYWxpemVDYWNoZVZhbHVlKGNhY2hlRW50cnlXaXRoVGFncyk7XG5cbiAgICAgIC8vIEFsd2F5cyBKU09OIHNpbmNlIHdlIHN0b3JlIENhY2hlSGFuZGxlclZhbHVlXG4gICAgICBhd2FpdCB0aGlzLmJ1Y2tldC5wdXRKc29uKG9iamVjdEtleSwgYm9keSk7XG5cbiAgICAgIHRoaXMuZGVidWcoYFMzIENBQ0hFIFNUT1JFRDogJHtjYWNoZUtleX0gKCR7ZGF0YS5raW5kfSlgKTtcblxuICAgICAgLy8gVGhlIHJlZ2VuZXJhdGlvbiBvZiBhbiBlbnRyeSBzZXJ2ZWQgc3RhbGU6IENsb3VkRnJvbnQgbWF5IGhhdmUgY2FjaGVkXG4gICAgICAvLyB0aGF0IHN0YWxlIHJlc3BvbnNlIGFmdGVyIGByZXZhbGlkYXRlVGFnYCdzIGludmFsaWRhdGlvbiwgc28gdGhlIGtleSdzXG4gICAgICAvLyBwYXRocyBnbyBvbmNlIG1vcmUgbm93IHRoYXQgUzMgaG9sZHMgdGhlIGZyZXNoIG9uZS5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc2VydmVkU3RhbGUuaGFzKGRhdGEpICYmXG4gICAgICAgIHRoaXMuc29mdFJldmFsaWRhdGVkS2V5cy5kZWxldGUoY2FjaGVLZXkpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLnMzS2V5VG9JbnZhbGlkYXRpb25QYXRoKHMzS2V5KTtcbiAgICAgICAgaWYgKHJvdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmRlYnVnKGBTT0ZUIFJFVkFMSURBVElPTiBSRUdFTkVSQVRFRDogJHtjYWNoZUtleX1gKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250UGF0aHMoXG4gICAgICAgICAgICBjZG5JbnZhbGlkYXRpb25QYXRocyhyb3V0ZSwgdGhpcy5jbG91ZEZyb250Q29uZmlnLmJhc2VQYXRoKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRhZy10by1jYWNoZS1rZXkgbWFwcGluZ3MgaW4gRHluYW1vREIgZm9yIHJldmFsaWRhdGlvblxuICAgICAgaWYgKHRhZ3MubGVuZ3RoID4gMCAmJiB0aGlzLm1hcHNUYWdzVG9QYXRocykge1xuICAgICAgICB0aGlzLmRlYnVnKGBTVE9SSU5HIFRBR1M6ICR7Y2FjaGVLZXl9IC0+IFske3RhZ3Muam9pbihcIiwgXCIpfV1gKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZUR5bmFtb0RCVGFnTWFwcGluZ3MoczNLZXksIHRhZ3MpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc3RvcmluZyBjYWNoZSB0byBTMzpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJldmFsaWRhdGVUYWcoXG4gICAgdGFnOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBkdXJhdGlvbnM/OiBSZXZhbGlkYXRlRHVyYXRpb25zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheSh0YWcpID8gdGFnIDogW3RhZ107XG4gICAgdGhpcy5kZWJ1ZyhgUkVWQUxJREFUSU5HIFRBR1M6IFske3RhZ3Muam9pbihcIiwgXCIpfV1gKTtcblxuICAgIGlmICghdGhpcy5jb25maWcudGFibGVOYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHRoZSByZXZhbGlkYXRpb24gYWdhaW5zdCBlYWNoIHRhZyBpdHNlbGYsIG5vdCBvbmx5IGFnYWluc3QgdGhlXG4gICAgLy8gY2FjaGUga2V5cyBhbHJlYWR5IG1hcHBlZCB0byBpdDogYGNoZWNrSWZSZXZhbGlkYXRlZGAgcmVhZHMgdGhlc2UgbWFya2VyXG4gICAgLy8gcm93cywgYW5kIGEgYnVpbGQtdGltZSBwcmVyZW5kZXIgaGFzIG5vIG1hcHBpbmcgcm93cyBhdCBhbGwuXG4gICAgY29uc3QgcmVjb3JkZWQgPSBhd2FpdCB0aGlzLnRhZ3MudXBkYXRlKHRhZ3MsIGR1cmF0aW9ucyk7XG5cbiAgICBpZiAoIXRoaXMubWFwc1RhZ3NUb1BhdGhzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBiYXNlUGF0aCB9ID0gdGhpcy5jbG91ZEZyb250Q29uZmlnO1xuICAgIGlmICghcmVjb3JkZWQpIHtcbiAgICAgIC8vIE90aGVyIGluc3RhbmNlcyBtYXkgbmV2ZXIgbGVhcm4gb2YgdGhpcyByZXZhbGlkYXRpb24sIHNvIG5vIHBhdGggbGlzdFxuICAgICAgLy8gaXMgZW5vdWdoOiBkcm9wIHRoZSB3aG9sZSBhcHAgZnJvbSBDbG91ZEZyb250IHJhdGhlciB0aGFuIHNlcnZlIHN0YWxlXG4gICAgICAvLyBwYWdlcyB1bnRpbCB0aGVpciBUVEwuXG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVDbG91ZEZyb250UGF0aHMod2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhiYXNlUGF0aCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldHRsZWQgcmF0aGVyIHRoYW4gYGFsbGA6IG9uZSB0YWcncyB0aHJvdHRsZWQgUXVlcnkgbXVzdCBub3QgZHJvcCB0aGVcbiAgICAvLyBDbG91ZEZyb250IHBhdGhzIGV2ZXJ5IG90aGVyIHRhZyByZXNvbHZlZC5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGFncy5tYXAoKHQpID0+IHRoaXMudGFnUm91dGVzKHQpKSxcbiAgICApO1xuICAgIGNvbnN0IHJvdXRlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgd2hvbGVBcHAgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIHRhZyBtYXBwaW5nczpcIiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIC8vIFRoZSB0YWcncyBlbnRyaWVzIGFyZSByZXZhbGlkYXRlZCBhdCB0aGUgb3JpZ2luIHdoaWxlIG5vdGhpbmcgbmFtZXNcbiAgICAgICAgLy8gdGhlaXIgQ2xvdWRGcm9udCBwYXRocy4gVGhlIHNhbWUgYW5zd2VyIGFzIGEgdGFnIGN1dCBzaG9ydCBieVxuICAgICAgICAvLyBgTUFYX1RBR19RVUVSWV9QQUdFU2A6IHRoZSB3aG9sZSBhcHAsIG5ldmVyIGEgc3RhbGUgcGFnZS5cbiAgICAgICAgd2hvbGVBcHAgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJvdXRlcy5wdXNoKC4uLnJlc3VsdC52YWx1ZS5yb3V0ZXMpO1xuICAgICAgd2hvbGVBcHAgfHw9IHJlc3VsdC52YWx1ZS50cnVuY2F0ZWQ7XG4gICAgfVxuXG4gICAgLy8gSW52YWxpZGF0ZSB0aGUgQ0ROIGVkZ2UgY2FjaGUgc28gQ2xvdWRGcm9udC1mcm9udGVkIGRlcGxveW1lbnRzIGRvbid0XG4gICAgLy8ga2VlcCBzZXJ2aW5nIHN0YWxlIHJlc3BvbnNlcyB1bnRpbCB0aGUgY2FjaGUgcG9saWN5J3MgVFRMIG5hdHVyYWxseVxuICAgIC8vIGV4cGlyZXMuIE9uZSByZXF1ZXN0IGZvciBldmVyeSB0YWcgYXQgb25jZTogc2VlXG4gICAgLy8gYE1BWF9XSUxEQ0FSRF9QQVRIU19QRVJfSU5WQUxJREFUSU9OYCBmb3Igd2h5IG5ldmVyIHNldmVyYWwuXG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlQ2xvdWRGcm9udFBhdGhzKFxuICAgICAgd2hvbGVBcHBcbiAgICAgICAgPyB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzKGJhc2VQYXRoKVxuICAgICAgICA6IHJvdXRlcy5mbGF0TWFwKChyb3V0ZSkgPT4gY2RuSW52YWxpZGF0aW9uUGF0aHMocm91dGUsIGJhc2VQYXRoKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcm91dGVzIENsb3VkRnJvbnQgY291bGQgYmUgaG9sZGluZyBhIHJlc3BvbnNlIGZvciBgdGFnYCB1bmRlciAtXG4gICAqIGB0cnVuY2F0ZWRgIHdoZW4gdGhleSBjb3VsZCBub3QgYWxsIGJlIG5hbWVkOiBtb3JlIG1hcHBpbmcgcm93cyB0aGFuXG4gICAqIHtAbGluayBNQVhfVEFHX1FVRVJZX1BBR0VTfSwgb3Igbm8gYnVpbGQgdGFnIG1hbmlmZXN0IHRvIHJlYWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRhZ1JvdXRlcyhcbiAgICB0YWc6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHJvdXRlczogc3RyaW5nW107IHRydW5jYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgc2tQcmVmaXggPSB0aGlzLnRhZ01hcHBpbmdQcmVmaXgodGFnKTtcbiAgICBjb25zdCBbeyBpdGVtcywgdHJ1bmNhdGVkIH0sIGJ1aWxkVGFnc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnF1ZXJ5VGFnTWFwcGluZ3ModGFnLCBza1ByZWZpeCksXG4gICAgICB0aGlzLmJ1aWxkVGFnTWFuaWZlc3QoKSxcbiAgICBdKTtcbiAgICAvLyBFeHRyYWN0IFMzIGtleXMgZnJvbSBzb3J0IGtleXMgKGZvcm1hdDogXCJ0YWcjczNLZXlcIikuIFNwbGl0IGF0IHRoZSB0YWcnc1xuICAgIC8vIG93biBsZW5ndGggcmF0aGVyIHRoYW4gYXQgdGhlIGZpcnN0IFwiI1wiOiBhIHRhZyBpcyBhcHAtZGVmaW5lZCBhbmQgbWF5XG4gICAgLy8gY29udGFpbiBvbmUsIGFuZCBgcmV2YWxpZGF0ZVRhZyhcInVzZXIjNDJcIilgIHRoZW4geWllbGRlZFxuICAgIC8vIFwiNDIjPGJ1aWxkSWQ+L2FjY291bnQuanNvblwiIOKAlCB3aG9zZSBpbnZhbGlkYXRpb24gcGF0aFxuICAgIC8vIChcIi80MiM8YnVpbGRJZD4vYWNjb3VudFwiKSBuYW1lcyBub3RoaW5nIENsb3VkRnJvbnQgY2FjaGVkLCBzbyB0aGUgZWRnZVxuICAgIC8vIGtlcHQgc2VydmluZyB0aGUgc3RhbGUgcGFnZS5cbiAgICAvL1xuICAgIC8vIFRoZSBzYW1lIGAjYCBtYWtlcyBgYmVnaW5zX3dpdGgoc2ssIFwidXNlciNcIilgIG1hdGNoIHJvd3MgdGhhdCBhcmUgbm90XG4gICAgLy8gYHVzZXJgJ3MgYXQgYWxsOiB0aGUgbWFya2VyIHJvdyBvZiB0YWcgYHVzZXIjNDJgIChzayBgdXNlciM0MmApIGFuZCBldmVyeVxuICAgIC8vIG1hcHBpbmcgcm93IG9mIGl0IChgdXNlciM0MiM8YnVpbGRJZD4v4oCmYCkuIFdoYXQgaXMgbGVmdCBhZnRlciB0aGUgcHJlZml4XG4gICAgLy8gaXMgYW4gUzMga2V5IG9ubHkgaWYgaXQgc3RhcnRzIHdpdGggdGhlIGJ1aWxkJ3Mgb3duIHByZWZpeCwgd2hpY2ggaXMgaG93XG4gICAgLy8gYGJ1aWxkUzNLZXlgIHdyaXRlcyBldmVyeSBvbmUuXG4gICAgLy9cbiAgICAvLyBBIHJvdyB3aG9zZSBrZXkgd291bGQgbm90IGZpdCBhIHNvcnQga2V5IGhhcyBpdCBoYXNoZWQgdGhlcmUsIGFuZCBldmVyeVxuICAgIC8vIHJvdyBjYXJyaWVzIGl0IGluIGBzM0tleWAgKHJvd3Mgd3JpdHRlbiBiZWZvcmUgdGhhdCBhdHRyaWJ1dGUgZmFsbCBiYWNrXG4gICAgLy8gdG8gdGhlIHNvcnQga2V5KTogc2VlIGB0YWdNYXBwaW5nU29ydEtleWAuIEFuIGVtcHR5IHJlbWFpbmRlciBpcyBuZXZlciBhXG4gICAgLy8gbWFwcGluZyByb3c6IGl0IGlzIHRoZSBtYXJrZXIgcm93IG9mIGEgdGFnIG9uZSBgI2AgbG9uZ2VyLlxuICAgIGNvbnN0IHByZWZpeExlbmd0aCA9IHNrUHJlZml4Lmxlbmd0aDtcbiAgICBjb25zdCBrZXlQcmVmaXggPSB0aGlzLmNvbmZpZy5idWlsZElkID8gYCR7dGhpcy5jb25maWcuYnVpbGRJZH0vYCA6IFwiXCI7XG4gICAgY29uc3QgczNLZXlzID0gaXRlbXMuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgcmVzdCA9IGl0ZW0uc2s/LlM/LnNsaWNlKHByZWZpeExlbmd0aCk7XG4gICAgICByZXR1cm4gcmVzdCAmJiByZXN0LnN0YXJ0c1dpdGgoa2V5UHJlZml4KSA/IFtpdGVtLnMzS2V5Py5TID8/IHJlc3RdIDogW107XG4gICAgfSk7XG4gICAgLy8gVGhlIGJ1aWxkLXRpbWUgcHJlcmVuZGVycyBjYXJyeWluZyB0aGUgdGFnLCB3aGljaCBubyBgc2V0YCB3cm90ZSBhIHJvd1xuICAgIC8vIGZvci5cbiAgICBmb3IgKGNvbnN0IGNhY2hlS2V5IG9mIGJ1aWxkVGFncz8uZ2V0KHRhZykgPz8gW10pIHtcbiAgICAgIHMzS2V5cy5wdXNoKGJ1aWxkUzNLZXkodGhpcy5jb25maWcuYnVpbGRJZCwgY2FjaGVLZXkpKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRBRyAke3RhZ306IEZvdW5kICR7czNLZXlzLmxlbmd0aH0gY2FjaGUgZW50cmllcyB0byBpbnZhbGlkYXRlYCxcbiAgICApO1xuXG4gICAgLy8gVGhlIG1hcHBpbmcgcm93cyB0aGVtc2VsdmVzIGFyZSBkZWxpYmVyYXRlbHkgbGVmdCBhbG9uZS4gU3RhbXBpbmdcbiAgICAvLyBgcmV2YWxpZGF0ZWRBdGAgb24gZWFjaCBgdGFnI2NhY2hlS2V5YCByb3cgaXMgd2hhdCB0aGlzIHVzZWQgdG8gZG8sIGFuZFxuICAgIC8vIG5vdGhpbmcgaGFzIHJlYWQgdGhhdCBhdHRyaWJ1dGUgc2luY2UgYGNoZWNrSWZSZXZhbGlkYXRlZGAgYmVnYW4gcmVhZGluZ1xuICAgIC8vIHRoZSBiYXJlLXRhZyBtYXJrZXIgcm93IHdyaXR0ZW4gYWJvdmUg4oCUIHNvIHRoZSB3cml0ZXMgd2VyZSBkZWFkLCBhbmQgdGhleVxuICAgIC8vIHdlcmUgZGVhZCAqaW4gZnJvbnQgb2YqIHRoZSBpbnZhbGlkYXRpb24uIE9uZSB0aHJvdHRsZWQgYFVwZGF0ZUl0ZW1gXG4gICAgLy8gcmVqZWN0ZWQgdGhlIGJhdGNoLCB0aGUgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gbmV2ZXIgcmFuLCBhbmQgdGhlIG9ubHlcbiAgICAvLyB0cmFjZSB3YXMgYSBgY29uc29sZS5lcnJvcmAgd2hpbGUgdGhlIGVkZ2Uga2VwdCBzZXJ2aW5nIHRoZSBzdGFsZSBwYWdlLlxuICAgIC8vXG4gICAgLy8gRGVsaWJlcmF0ZWx5IG5vdCBkZWxldGluZyB0aGUgdGFnJ3MgUzMgb2JqZWN0cyBlaXRoZXIuIFRoZSBtYXJrZXIgcm93XG4gICAgLy8gYWJvdmUgaXMgd2hhdCBpbnZhbGlkYXRlcyB0aGVtOiBgZ2V0YCBjb21wYXJlcyBpdCBhZ2FpbnN0IGVhY2ggZW50cnknc1xuICAgIC8vIG93biBgbGFzdE1vZGlmaWVkYCBhbmQgaGFuZHMgdGhlIGVudHJ5IGJhY2sgZXhwaXJlZCwgd2hpY2ggaXMgdGhlIHNpZ25hbFxuICAgIC8vIHRoYXQgbWFrZXMgTmV4dC5qcyByZS1yZW5kZXIgKnRoaXMqIHJvdXRlIGFuZCBzdG9yZSB0aGUgcmVzdWx0IChzZWVcbiAgICAvLyBgRVhQSVJFRF9MQVNUX01PRElGSUVEYCkuIERlbGV0aW5nIHRoZSBvYmplY3QgaW5zdGVhZCB0dXJuZWQgdGhlIG5leHRcbiAgICAvLyByZXF1ZXN0IGludG8gYSBoYXJkIG1pc3MsIGFuZCBhIGhhcmQgbWlzcyBvbiBhIFBQUiByb3V0ZSBpcyBhbnN3ZXJlZCBmcm9tXG4gICAgLy8gdGhlIHJvdXRlJ3MgZmFsbGJhY2sgc2hlbGwg4oCUIHVuY2FjaGVhYmxlLCBhbmQgbmV2ZXIgdXBncmFkZWQgYmFjayBpbnRvIGFcbiAgICAvLyBjb25jcmV0ZSBlbnRyeSwgc28gb25lIGByZXZhbGlkYXRlVGFnYCBsZWZ0IHRoZSBwYWdlIHJlc3VtaW5nXG4gICAgLy8gZHluYW1pY2FsbHkgZm9yIGdvb2QuXG4gICAgY29uc3Qgcm91dGVzID0gczNLZXlzXG4gICAgICAubWFwKChzM0tleSkgPT4gdGhpcy5zM0tleVRvSW52YWxpZGF0aW9uUGF0aChzM0tleSkpXG4gICAgICAuZmlsdGVyKChyb3V0ZSk6IHJvdXRlIGlzIHN0cmluZyA9PiByb3V0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAvLyBBIGByZXZhbGlkYXRlUGF0aGAgbmFtZXMgaXRzIHBhdGggaW4gdGhlIHRhZyBpdHNlbGYsIHdoaWNoIGlzIHRoZSBvbmx5XG4gICAgLy8gd2F5IHRvIHJlYWNoIGEgYnVpbGQtdGltZSBwcmVyZW5kZXIncyBDRE4gY29weSB3aGVuIGl0IGhhcyBubyBtYXBwaW5nXG4gICAgLy8gcm93LlxuICAgIHJvdXRlcy5wdXNoKC4uLmltcGxpY2l0VGFnUGF0aHModGFnKSk7XG4gICAgcmV0dXJuIHsgcm91dGVzLCB0cnVuY2F0ZWQ6IHRydW5jYXRlZCB8fCAhYnVpbGRUYWdzIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJ1aWxkLXRpbWUgcHJlcmVuZGVycycgY2FjaGUga2V5cyBieSB0YWcgKHtAbGluayBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVH0pLFxuICAgKiByZWFkIGZyb20gdGhlIGNhY2hlIGJ1Y2tldCBvbmNlIHBlciBpbnN0YW5jZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGF0XG4gICAqIGZhaWxlZCwgdG8gYmUgcmVhZCBhZ2FpbiBuZXh0IHRpbWUuIEEgcHJlcmVuZGVyIGlzIHdyaXR0ZW4gYnkgdGhlIGFkYXB0ZXIsXG4gICAqIG5ldmVyIHRocm91Z2ggYHNldGAsIHNvIHRoaXMgaXMgdGhlIG9ubHkgcmVjb3JkIG9mIHdoaWNoIHRhZ3MgbmFtZSBpdHNcbiAgICogQ2xvdWRGcm9udCBwYXRocywgYW5kIGl0IGlzIHNlcnZlZCB3aXRoIGEgeWVhci1sb25nIGBzLW1heGFnZWAuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVGFnTWFuaWZlc3QoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQ+IHtcbiAgICB0aGlzLmJ1aWxkVGFncyA/Pz0gdGhpcy5idWNrZXRcbiAgICAgIC5nZXQoYCR7dGhpcy5jb25maWcuYnVpbGRJZH0vJHtJTklUX0NBQ0hFX1RBR19NQU5JRkVTVH1gKVxuICAgICAgLy8gTm9uZSBpcyBub3JtYWw6IG9ubHkgdGFnZ2VkIHByZXJlbmRlcnMgd3JpdGUgb25lLlxuICAgICAgLnRoZW4oKG9iamVjdCkgPT4gbmV3IE1hcChPYmplY3QuZW50cmllcyhKU09OLnBhcnNlKG9iamVjdCA/PyBcInt9XCIpKSkpO1xuICAgIHJldHVybiB0aGlzLmJ1aWxkVGFncy5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuYnVpbGRUYWdzID0gdW5kZWZpbmVkO1xuICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJlYWQgdGhlIGJ1aWxkJ3MgdGFnIG1hbmlmZXN0OlwiLCBlcnJvcik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IG1hcHBpbmcgcm93IGZvciBgdGFnYCAtIHRob3NlIHdob3NlIHNvcnQga2V5IHN0YXJ0cyB3aXRoXG4gICAqIGBza1ByZWZpeGAsIGl0cyB7QGxpbmsgdGFnTWFwcGluZ1ByZWZpeH0gLSBmb2xsb3dpbmcgYExhc3RFdmFsdWF0ZWRLZXlgLCBhbmQgd2hldGhlclxuICAgKiB7QGxpbmsgTUFYX1RBR19RVUVSWV9QQUdFU30gY3V0IHRoZSB3YWxrIHNob3J0LlxuICAgKlxuICAgKiBEeW5hbW9EQiBjYXBzIGEgUXVlcnkgYXQgMSBNQiBvZiBpdGVtcyByZWdhcmRsZXNzIG9mIGhvdyBtYW55IG1hdGNoLCBhbmRcbiAgICogdGhlcmUgaXMgb25lIHJvdyBwZXIgdGFnZ2VkIGVudHJ5IGEgcnVudGltZSBgc2V0YCB3cm90ZSwgc28gYSBsYXJnZSBzaXRlXG4gICAqIHBhc3NlcyAxIE1CIG9uIGEgY29tbW9uIHRhZy4gU3RvcHBpbmcgYXQgdGhlXG4gICAqIGZpcnN0IHBhZ2UgaW52YWxpZGF0ZXMgb25seSB0aGF0IHBhZ2UncyBlbnRyaWVzIHdoaWxlIHN0aWxsIHJlcG9ydGluZ1xuICAgKiBzdWNjZXNzLCB3aGljaCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHJldmFsaWRhdGlvbiBoYXZpbmcgd29ya2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBxdWVyeVRhZ01hcHBpbmdzKFxuICAgIHRhZzogc3RyaW5nLFxuICAgIHNrUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBpdGVtczogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+W107IHRydW5jYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgaXRlbXM6IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPltdID0gW107XG4gICAgbGV0IGV4Y2x1c2l2ZVN0YXJ0S2V5OiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHBhZ2VzID0gMDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5keW5hbW9DbGllbnQuc2VuZChcbiAgICAgICAgbmV3IFF1ZXJ5Q29tbWFuZCh7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLmNvbmZpZy50YWJsZU5hbWUsXG4gICAgICAgICAgS2V5Q29uZGl0aW9uRXhwcmVzc2lvbjogXCJwayA9IDpwayBBTkQgYmVnaW5zX3dpdGgoc2ssIDpza1ByZWZpeClcIixcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICBcIjpwa1wiOiB7IFM6IHRoaXMuY29uZmlnLmJ1aWxkSWQgfSxcbiAgICAgICAgICAgIFwiOnNrUHJlZml4XCI6IHsgUzogc2tQcmVmaXggfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEV4Y2x1c2l2ZVN0YXJ0S2V5OiBleGNsdXNpdmVTdGFydEtleSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaXRlbXMucHVzaCguLi4ocmVzcG9uc2UuSXRlbXMgPz8gW10pKTtcbiAgICAgIGV4Y2x1c2l2ZVN0YXJ0S2V5ID0gcmVzcG9uc2UuTGFzdEV2YWx1YXRlZEtleTtcbiAgICAgIHBhZ2VzKys7XG4gICAgfSB3aGlsZSAoZXhjbHVzaXZlU3RhcnRLZXkgJiYgcGFnZXMgPCBNQVhfVEFHX1FVRVJZX1BBR0VTKTtcblxuICAgIGNvbnN0IHRydW5jYXRlZCA9IGV4Y2x1c2l2ZVN0YXJ0S2V5ICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKHRydW5jYXRlZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgU3RvcHBlZCBwYWdpbmF0aW5nIHRhZyBcIiR7dGFnfVwiIGFmdGVyICR7cGFnZXN9IHBhZ2VzIGAgK1xuICAgICAgICAgIGAoJHtpdGVtcy5sZW5ndGh9IGVudHJpZXMpOyBpbnZhbGlkYXRpbmcgdGhlIHdob2xlIGFwcCBpbnN0ZWFkLmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4geyBpdGVtcywgdHJ1bmNhdGVkIH07XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJzZXMgYGJ1aWxkUzNLZXlgIHRvIHJlY292ZXIgdGhlIHJvdXRlIHRoZSByZXNwb25zZSB3YXMgY2FjaGVkIGZvciwgZm9yXG4gICAqIHtAbGluayBjZG5JbnZhbGlkYXRpb25QYXRoc30gdG8gdHVybiBpbnRvIHRoZSBVUklzIENsb3VkRnJvbnQgaG9sZHMgaXQgdW5kZXIsIG9yXG4gICAqIGB1bmRlZmluZWRgIGZvciBhIGtleSB0aGF0IG5hbWVzIG5vIGNhY2hlZCBVUkkuXG4gICAqXG4gICAqIFR3byBraW5kcyBvZiBtYXBwaW5nIHJvdyBkbyBub3Q6IGEgZHluYW1pYyByb3V0ZSB0ZW1wbGF0ZSAoYGJsb2cvW3NsdWddLmpzb25gLFxuICAgKiB3aGljaCB0aGUgYWRhcHRlcidzIHNlZWRlZCBlbnRyaWVzIGluY2x1ZGUpLCBhbmQgYSBmZXRjaC1jYWNoZSBlbnRyeSwgd2hvc2VcbiAgICoga2V5IGlzIGFuIG9wYXF1ZSBoYXNoIHJhdGhlciB0aGFuIGEgcm91dGUuIEJvdGggd291bGQgaW52YWxpZGF0ZSBhIFVSSSB0aGF0XG4gICAqIGNhbm5vdCBleGlzdCwgYW5kIGVhY2ggb25lIGNvc3RzIG9uZSBvZiB0aGUgZmlmdGVlbiB3aWxkY2FyZCBwYXRocyBhblxuICAgKiBpbnZhbGlkYXRpb24gbWF5IGNhcnJ5IOKAlCBzbyB0aGV5IGFyZSBkcm9wcGVkIGhlcmUgcmF0aGVyIHRoYW4gY3Jvd2Rpbmcgb3V0XG4gICAqIHRoZSByZWFsIG9uZXMuXG4gICAqL1xuICBwcml2YXRlIHMzS2V5VG9JbnZhbGlkYXRpb25QYXRoKHMzS2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHByZWZpeCA9IGAke3RoaXMuY29uZmlnLmJ1aWxkSWR9L2A7XG4gICAgY29uc3Qgd2l0aG91dFByZWZpeCA9IHMzS2V5LnN0YXJ0c1dpdGgocHJlZml4KVxuICAgICAgPyBzM0tleS5zbGljZShwcmVmaXgubGVuZ3RoKVxuICAgICAgOiBzM0tleTtcbiAgICBjb25zdCB3aXRob3V0U3VmZml4ID0gd2l0aG91dFByZWZpeC5lbmRzV2l0aChcIi5qc29uXCIpXG4gICAgICA/IHdpdGhvdXRQcmVmaXguc2xpY2UoMCwgLVwiLmpzb25cIi5sZW5ndGgpXG4gICAgICA6IHdpdGhvdXRQcmVmaXg7XG5cbiAgICBpZiAod2l0aG91dFN1ZmZpeC5pbmNsdWRlcyhcIltcIikgfHwgaXNGZXRjaENhY2hlS2V5KHdpdGhvdXRTdWZmaXgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBuZXh0ID49IDE2LjMuODogYHJvdXRlLWNhY2hlLzxraW5kPi88aGFzaD4vJDxwYXRobmFtZT5gLCB0aGUgcGF0aG5hbWVcbiAgICAvLyB0aHJvdWdoIGBub3JtYWxpemVQYWdlUGF0aGAuXG4gICAgY29uc3Qgcm91dGVDYWNoZUtleSA9IFJPVVRFX0NBQ0hFX0tFWV9QUkVGSVguZXhlYyh3aXRob3V0U3VmZml4KTtcbiAgICBpZiAocm91dGVDYWNoZUtleSkge1xuICAgICAgcmV0dXJuIGRlbm9ybWFsaXplUGFnZVBhdGgod2l0aG91dFN1ZmZpeC5zbGljZShyb3V0ZUNhY2hlS2V5WzBdLmxlbmd0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gd2l0aG91dFN1ZmZpeCA9PT0gXCJpbmRleFwiID8gXCIvXCIgOiBgLyR7d2l0aG91dFN1ZmZpeH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEludmFsaWRhdGUgYHBhdGhzYCBpbiBhIHNpbmdsZSByZXF1ZXN0LCBvciB0aGUgd2hvbGUgYXBwXG4gICAqICh7QGxpbmsgd2hvbGVBcHBJbnZhbGlkYXRpb25QYXRoc30pIHdoZW4gdGhleSB3b3VsZCBub3QgZml0IGluIG9uZS4gU2VlXG4gICAqIHtAbGluayBNQVhfV0lMRENBUkRfUEFUSFNfUEVSX0lOVkFMSURBVElPTn0uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGludmFsaWRhdGVDbG91ZEZyb250UGF0aHMocGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGJhdGNoID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhdGhzKSk7XG4gICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbklkID0gYXdhaXQgdGhpcy5nZXREaXN0cmlidXRpb25JZCgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHJlc29sdmUgdGhlIGRpc3RyaWJ1dGlvbiB0byBpbnZhbGlkYXRlOlwiLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBpZiAoIWRpc3RyaWJ1dGlvbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2lsZGNhcmRzID0gYmF0Y2guZmlsdGVyKGlzV2lsZGNhcmRQYXRoKS5sZW5ndGg7XG4gICAgaWYgKFxuICAgICAgd2lsZGNhcmRzID4gTUFYX1dJTERDQVJEX1BBVEhTX1BFUl9JTlZBTElEQVRJT04gfHxcbiAgICAgIGJhdGNoLmxlbmd0aCA+IE1BWF9QQVRIU19QRVJfSU5WQUxJREFUSU9OXG4gICAgKSB7XG4gICAgICBjb25zdCB3aG9sZUFwcCA9IHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoXG4gICAgICAgIHRoaXMuY2xvdWRGcm9udENvbmZpZy5iYXNlUGF0aCxcbiAgICAgICk7XG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICBgQ0xPVURGUk9OVCBJTlZBTElEQVRJT046ICR7YmF0Y2gubGVuZ3RofSBwYXRocyAoJHt3aWxkY2FyZHN9IGAgK1xuICAgICAgICAgIGB3aWxkY2FyZHMpIGRvIG5vdCBmaXQgb25lIHJlcXVlc3QsIGNvbGxhcHNpbmcgdG8gYCArXG4gICAgICAgICAgYFske3dob2xlQXBwLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgICk7XG4gICAgICBiYXRjaCA9IHdob2xlQXBwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyA7IGF0dGVtcHQrKykge1xuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYENMT1VERlJPTlQgSU5WQUxJREFUSU9OOiBbJHtiYXRjaC5qb2luKFwiLCBcIil9XSBvbiBkaXN0cmlidXRpb24gJHtkaXN0cmlidXRpb25JZH1gLFxuICAgICAgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xvdWRGcm9udENsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBDcmVhdGVJbnZhbGlkYXRpb25Db21tYW5kKHtcbiAgICAgICAgICAgIERpc3RyaWJ1dGlvbklkOiBkaXN0cmlidXRpb25JZCxcbiAgICAgICAgICAgIEludmFsaWRhdGlvbkJhdGNoOiB7XG4gICAgICAgICAgICAgIENhbGxlclJlZmVyZW5jZTogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgICBQYXRoczoge1xuICAgICAgICAgICAgICAgIFF1YW50aXR5OiBiYXRjaC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgSXRlbXM6IGJhdGNoLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzSW52YWxpZGF0aW9uUXVvdGFFcnJvcihlcnJvcikgJiYgYXR0ZW1wdCA8IElOVkFMSURBVElPTl9SRVRSSUVTKSB7XG4gICAgICAgICAgLy8gU2VlIGBJTlZBTElEQVRJT05fUkVUUklFU2AuXG4gICAgICAgICAgYmF0Y2ggPSB3aG9sZUFwcEludmFsaWRhdGlvblBhdGhzKHRoaXMuY2xvdWRGcm9udENvbmZpZy5iYXNlUGF0aCk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIElOVkFMSURBVElPTl9SRVRSWV9ERUxBWV9NUyAqIDIgKiogYXR0ZW1wdCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBMb2cgYnV0IGRvbid0IGZhaWwgLSB0aGUgUzMvRHluYW1vREIgaW52YWxpZGF0aW9uIGFscmVhZHkgc3VjY2VlZGVkLFxuICAgICAgICAvLyBhbmQgdGhlIENsb3VkRnJvbnQgY2FjaGUgcG9saWN5IFRUTCBwcm92aWRlcyBhbiBldmVudHVhbCBmYWxsYmFjay5cbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uIGZvciBbJHtiYXRjaC5qb2luKFwiLCBcIil9XTpgLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0cmlidXRpb24ncyBwaHlzaWNhbCBJRCwgZnJvbSB0aGUgZW52aXJvbm1lbnQgb3IgZWxzZSBTU00gUGFyYW1ldGVyXG4gICAqIFN0b3JlLCBjYWNoZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIGluc3RhbmNlLiBTZWVcbiAgICogYENsb3VkRnJvbnRJbnZhbGlkYXRpb25Db25maWdgIGZvciB3aHkgRnVuY3Rpb25zIG5lZWQgdGhlIGluZGlyZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXREaXN0cmlidXRpb25JZCgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAodGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkO1xuICAgIH1cbiAgICBpZiAodGhpcy5jYWNoZWREaXN0cmlidXRpb25JZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkRGlzdHJpYnV0aW9uSWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc3NtQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgR2V0UGFyYW1ldGVyQ29tbWFuZCh7XG4gICAgICAgIE5hbWU6IHRoaXMuY2xvdWRGcm9udENvbmZpZy5kaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5jYWNoZWREaXN0cmlidXRpb25JZCA9IHJlc3BvbnNlLlBhcmFtZXRlcj8uVmFsdWUgfHwgbnVsbDtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWREaXN0cmlidXRpb25JZDtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0UmVxdWVzdENhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoaXMgaGFuZGxlciBkb2Vzbid0IG1haW50YWluIHJlcXVlc3QtbGV2ZWwgY2FjaGUgc3RhdGVcbiAgICAvLyBUaGUgYWN0dWFsIGNhY2hlIGNsZWFyaW5nIGlzIGhhbmRsZWQgYnkgdGhlIG1lbW9yeSBjYWNoZSBoYW5kbGVyXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGRlcGxveW1lbnQga2VlcHMgYHRhZyNzM0tleWAgbWFwcGluZyByb3dzIGF0IGFsbC5cbiAgICpcbiAgICogVGhlaXIgb25lIHJlYWRlciBpcyBgcmV2YWxpZGF0ZVRhZ2AncyBDbG91ZEZyb250IGludmFsaWRhdGlvbiwgd2hpY2ggbmVlZHNcbiAgICogdGhlIGVudHJpZXMnIHBhdGhzIC0gdGFnIHJldmFsaWRhdGlvbiBpdHNlbGYgcnVucyBvbiB0aGUgYmFyZS10YWcgbWFya2VyXG4gICAqIHJvd3MuIEEgZGVwbG95bWVudCB3aXRoIG5vIGRpc3RyaWJ1dGlvbiAodGhlIFJlZ2lvbmFsIGNvbnN0cnVjdHMpIHdvdWxkIHBheVxuICAgKiBhIER5bmFtb0RCIHdyaXRlIHBlciB0YWcgb24gZXZlcnkgYHNldGAsIGEgUXVlcnkgcGVyIGByZXZhbGlkYXRlVGFnYCwgYW5kIGFuXG4gICAqIGV4dHJhIFMzIHJlYWQgYmVmb3JlIGV2ZXJ5IGRlbGV0ZSwgZm9yIHJvd3Mgbm90aGluZyBldmVyIHJlYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgbWFwc1RhZ3NUb1BhdGhzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29uZmlnLnRhYmxlTmFtZSkgJiYgdGhpcy5pbnZhbGlkYXRlc0NkbjtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZXJlIGlzIGEgZGlzdHJpYnV0aW9uIHRvIGludmFsaWRhdGUuICovXG4gIHByaXZhdGUgZ2V0IGludmFsaWRhdGVzQ2RuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5jbG91ZEZyb250Q29uZmlnLmRpc3RyaWJ1dGlvbklkIHx8XG4gICAgICB0aGlzLmNsb3VkRnJvbnRDb25maWcuZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNvcnQga2V5IG9mIGB0YWdgJ3MgbWFwcGluZyByb3cgZm9yIGBzM0tleWA6IGA8cHJlZml4PnMzS2V5YCwgb3IsIHdoZW5cbiAgICogdGhhdCBwYXNzZXMgRHluYW1vREIncyAxMDI0LWJ5dGUgc29ydCBrZXkgbGltaXQsIGA8cHJlZml4PjxidWlsZElkPi8jPHNoYTI1Nj5gLlxuICAgKiBFaXRoZXIgd2F5IHRoZSByb3cgY2FycmllcyB0aGUga2V5IGl0c2VsZiBpbiBgczNLZXlgLiBuZXh0IDE2LjMuOCdzXG4gICAqIHJvdXRlLXNjb3BlZCBrZXlzIGFyZSB+ODggYnl0ZXMgbG9uZ2VyIHRoYW4gYSBwYXRobmFtZSwgZW5vdWdoIHRvIHB1c2ggYVxuICAgKiBsb25nIHRhZyBvbiBhIGxvbmcgcGF0aCBvdmVyIC0gYW5kIGEgcmVqZWN0ZWQgYFB1dEl0ZW1gIGxlZnRcbiAgICogYHJldmFsaWRhdGVUYWdgIG5vdGhpbmcgdG8gaW52YWxpZGF0ZSwgc28gQ2xvdWRGcm9udCBrZXB0IHRoZSBzdGFsZSBwYWdlLlxuICAgKiBUaGUgcHJlZml4IGlzIHtAbGluayB0YWdNYXBwaW5nUHJlZml4fSdzLCB3aGljaCB7QGxpbmsgTUFYX1RBR19CWVRFU30gYW5kXG4gICAqIHRoZSBidWlsZCBJRCdzIGNhcCBsZWF2ZSByb29tIGZvciB0aGUgaGFzaGVkIGZvcm0gYWZ0ZXIuXG4gICAqL1xuICBwcml2YXRlIHRhZ01hcHBpbmdTb3J0S2V5KHRhZzogc3RyaW5nLCBzM0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLnRhZ01hcHBpbmdQcmVmaXgodGFnKTtcbiAgICBjb25zdCBzayA9IGAke3ByZWZpeH0ke3MzS2V5fWA7XG4gICAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHNrKSA8PSBNQVhfU09SVF9LRVlfQllURVNcbiAgICAgID8gc2tcbiAgICAgIDogYCR7cHJlZml4fSR7dGhpcy5jb25maWcuYnVpbGRJZH0vJHtoYXNoZWRUYWcoczNLZXkpfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBldmVyeSBtYXBwaW5nIHJvdyBvZiBgdGFnYCBzdGFydHMgd2l0aCwgYW5kIHNvIHdoYXRcbiAgICoge0BsaW5rIHF1ZXJ5VGFnTWFwcGluZ3N9IG1hdGNoZXM6IGA8c29ydEtleVRhZyh0YWcpPiNgLlxuICAgKi9cbiAgcHJpdmF0ZSB0YWdNYXBwaW5nUHJlZml4KHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7c29ydEtleVRhZyh0YWcpfSNgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdG9yZUR5bmFtb0RCVGFnTWFwcGluZ3MoXG4gICAgczNLZXk6IHN0cmluZyxcbiAgICB0YWdzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVwZGF0ZVByb21pc2VzID0gdGFncy5tYXAoYXN5bmMgKHRhZykgPT4ge1xuICAgICAgICBjb25zdCBzayA9IHRoaXMudGFnTWFwcGluZ1NvcnRLZXkodGFnLCBzM0tleSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlSXRlbUNvbW1hbmQoe1xuICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy5jb25maWcudGFibGVOYW1lLFxuICAgICAgICAgIEtleToge1xuICAgICAgICAgICAgcGs6IHsgUzogdGhpcy5jb25maWcuYnVpbGRJZCB9LFxuICAgICAgICAgICAgc2s6IHsgUzogc2sgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBgcmV2YWxpZGF0ZWRBdGA6IGEgbWFwcGluZyByb3cgcmVjb3JkcyBvbmx5IHRoYXQgYW5cbiAgICAgICAgICAvLyBlbnRyeSBjYXJyaWVzIHRoZSB0YWcuIFN0YW1waW5nIGl0IGF0IHdyaXRlIHRpbWUgbWFkZSBldmVyeSB0YWdnZWRcbiAgICAgICAgICAvLyBlbnRyeSBsb29rIHJldmFsaWRhdGVkIG9uZSBtaWxsaXNlY29uZCBhZnRlciBpdCB3YXMgc3RvcmVkIOKAlCB0aGVcbiAgICAgICAgICAvLyByb3cncyB0aW1lc3RhbXAgaXMgdGFrZW4gYWZ0ZXIgdGhlIGVudHJ5J3MgYGxhc3RNb2RpZmllZGAg4oCUIHNvXG4gICAgICAgICAgLy8gYGNoZWNrSWZSZXZhbGlkYXRlZGAgZGVsZXRlZCBoZWFsdGh5IGVudHJpZXMgYW5kIHRoZSBwYWdlXG4gICAgICAgICAgLy8gcmUtcmVuZGVyZWQgb24gZXZlcnkgcmVxdWVzdC5cbiAgICAgICAgICBVcGRhdGVFeHByZXNzaW9uOlxuICAgICAgICAgICAgXCJTRVQgY3JlYXRlZEF0ID0gaWZfbm90X2V4aXN0cyhjcmVhdGVkQXQsIDpub3cpLCBzM0tleSA9IDpzM0tleVwiLFxuICAgICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgIFwiOm5vd1wiOiB7IE46IERhdGUubm93KCkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgXCI6czNLZXlcIjogeyBTOiBzM0tleSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZHluYW1vQ2xpZW50LnNlbmQodXBkYXRlQ29tbWFuZCk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodXBkYXRlUHJvbWlzZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igc3RvcmluZyBEeW5hbW9EQiB0YWcgbWFwcGluZ3M6XCIsIGVycm9yKTtcbiAgICAgIC8vIERvbid0IHRocm93IC0gY2FjaGUgc3RvcmFnZSBzaG91bGQgY29udGludWUgZXZlbiBpZiB0YWcgbWFwcGluZyBmYWlsc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wIHRoZSBgdGFnI3MzS2V5YCBtYXBwaW5nIHJvd3MgZm9yIGFuIGVudHJ5IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICpcbiAgICogVGhlIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBzdG9yZUR5bmFtb0RCVGFnTWFwcGluZ3N9LCBhbmQgdGhlIHJlYXNvbiBpdHNcbiAgICogY2FsbGVyIGhhcyB0byBrbm93IHRoZSBlbnRyeSdzIHRhZ3M6IGEgbWFwcGluZyByb3cncyBzb3J0IGtleSBzdGFydHMgd2l0aFxuICAgKiB0aGUgdGFnLCBzbyB0aGUgcm93cyBiZWxvbmdpbmcgdG8gb25lIGNhY2hlIGtleSBjYW5ub3QgYmUgcXVlcmllZCBmb3IgLSBvbmx5XG4gICAqIGEgZnVsbCBzY2FuIG9mIHRoZSBidWlsZCdzIHBhcnRpdGlvbiB3b3VsZCBmaW5kIHRoZW0uXG4gICAqXG4gICAqIExlZnQgYmVoaW5kLCBhIHJvdyBzdGlsbCByZXNvbHZlcyB0byBhIGNhY2hlIGtleSBvbiB0aGUgbmV4dFxuICAgKiBgcmV2YWxpZGF0ZVRhZ2AsIHdoaWNoIHNwZW5kcyBvbmUgb2YgQ2xvdWRGcm9udCdzIGZpZnRlZW4gd2lsZGNhcmQgcGF0aHNcbiAgICogaW52YWxpZGF0aW5nIGEgVVJJIHdob3NlIGVudHJ5IHdhcyBkZWxldGVkIC0gY3Jvd2Rpbmcgb3V0IHRoZSBwYXRocyB0aGF0IGRvXG4gICAqIG5lZWQgaXQsIGFuZCBwYXN0IHtAbGluayBNQVhfV0lMRENBUkRfUEFUSFNfUEVSX0lOVkFMSURBVElPTn0gY29sbGFwc2luZyB0aGVcbiAgICogd2hvbGUgYXBwIGludG8gb25lIHdpbGRjYXJkLiBUaGUgcm93cyBhbHNvIGNvdW50IGFnYWluc3QgdGhlIDEgTUIgYSB0YWcncyBRdWVyeSByZXR1cm5zLCBzb1xuICAgKiBlbm91Z2ggb2YgdGhlbSBwdXNoIGxpdmUgZW50cmllcyBvbnRvIGEgcGFnZVxuICAgKiB7QGxpbmsgTUFYX1RBR19RVUVSWV9QQUdFU30gbWF5IG5vdCByZWFjaC5cbiAgICpcbiAgICogT25seSB0aGUgbWFwcGluZyByb3dzOiB0aGUgYmFyZS1gdGFnYCBtYXJrZXIgcm93IGByZXZhbGlkYXRlVGFnYFxuICAgKiB3cml0ZXMgYmVsb25ncyB0byB0aGUgdGFnIHJhdGhlciB0aGFuIHRvIGFueSBlbnRyeSwgYW5kIGBjaGVja0lmUmV2YWxpZGF0ZWRgXG4gICAqIHJlYWRzIGl0IGZvciBldmVyeSAqb3RoZXIqIGVudHJ5IGNhcnJ5aW5nIHRoYXQgdGFnLlxuICAgKlxuICAgKiBEZWxpYmVyYXRlbHkgbm8gQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gZm9yIHRoZSBkZWxldGVkIHBhdGguIFRoZSBlZGdlIGNvcHlcbiAgICogZG9lcyBvdXRsaXZlIHRoZSBvYmplY3QsIGJ1dCB0aGlzIHJ1bnMgb24gZXZlcnkgcmV2YWxpZGF0ZWQgYGZldGNoYCBlbnRyeSBhc1xuICAgKiB3ZWxsLCB3aGVyZSB0aGUga2V5IG5hbWVzIG5vIFVSSSwgYW5kIGFuIGludmFsaWRhdGlvbiByZXF1ZXN0IHBlciBkZWxldGVkXG4gICAqIGVudHJ5IGlzIGEgY29zdCB0aGUgVFRMIGFscmVhZHkgYm91bmRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVEeW5hbW9EQlRhZ01hcHBpbmdzKFxuICAgIHMzS2V5OiBzdHJpbmcsXG4gICAgdGFnczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5tYXBzVGFnc1RvUGF0aHMgfHwgdGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAvLyBBIHBhZ2UncyB0YWdzIGNhbiByZXBlYXQgLSBgY3R4LnRhZ3NgIGFuZCB0aGUgcmVuZGVyJ3MgaGVhZGVyIGFyZSBib3RoXG4gICAgICAgIC8vIHJlYWQgLSBhbmQgb25lIGRlbGV0ZSBwZXIgdGFnIGlzIGVub3VnaC5cbiAgICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHRhZ3MpKS5tYXAoYXN5bmMgKHRhZykgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZHluYW1vQ2xpZW50LnNlbmQoXG4gICAgICAgICAgICBuZXcgRGVsZXRlSXRlbUNvbW1hbmQoe1xuICAgICAgICAgICAgICBUYWJsZU5hbWU6IHRoaXMuY29uZmlnLnRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgS2V5OiB7XG4gICAgICAgICAgICAgICAgcGs6IHsgUzogdGhpcy5jb25maWcuYnVpbGRJZCB9LFxuICAgICAgICAgICAgICAgIHNrOiB7IFM6IHRoaXMudGFnTWFwcGluZ1NvcnRLZXkodGFnLCBzM0tleSkgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHRoaXMuZGVidWcoYERFTEVURUQgVEFHIE1BUFBJTkdTOiAke3MzS2V5fSAtPiBbJHt0YWdzLmpvaW4oXCIsIFwiKX1dYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbDogdGhlIGVudHJ5IGl0c2VsZiBpcyBhbHJlYWR5IGdvbmUsIGFuZCBhIHN0YWxlXG4gICAgICAvLyBtYXBwaW5nIHJvdyBjb3N0cyBhbiBpbnZhbGlkYXRpb24gcGF0aCByYXRoZXIgdGhhbiBhIHdyb25nIHJlc3BvbnNlLlxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRlbGV0aW5nIER5bmFtb0RCIHRhZyBtYXBwaW5nczpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFncyBhbiBlbnRyeSBhYm91dCB0byBiZSBkZWxldGVkIHdhcyBzdG9yZWQgd2l0aC5cbiAgICpcbiAgICogYGN0eGAgY2FycmllcyB0aGVtIGZvciBhIGBmZXRjaGAgZGVsZXRlLCBidXQgYSByZXNwb25zZSBkZWxldGUgYXJyaXZlcyBhc1xuICAgKiBgeyBjYWNoZUNvbnRyb2wsIGlzUm91dGVQUFJFbmFibGVkLCBpc0ZhbGxiYWNrIH1gIC0gYFJlc3BvbnNlQ2FjaGUuc2V0YFxuICAgKiBidWlsZHMgaXQgdGhhdCB3YXkgLSBzbyB0aGUgZW50cnkgaXRzZWxmIGlzIHRoZSBvbmx5IHNvdXJjZSwgYW5kIGl0IGhhcyB0b1xuICAgKiBiZSByZWFkIGJlZm9yZSBpdCBpcyByZW1vdmVkLiBUaGF0IGlzIG9uZSBleHRyYSBHRVQgb24gYSBwYXRoIHRoYXQgcnVucyB3aGVuXG4gICAqIGEgY2FjaGVkIHJvdXRlIHN0YXJ0cyBhbnN3ZXJpbmcgYG5vdEZvdW5kKClgOiBgSW5jcmVtZW50YWxDYWNoZS5zZXRgXG4gICAqIGZvcndhcmRzIGBSZXNwb25zZUNhY2hlYCdzIG51bGwgdmFsdWUgdGhyb3VnaCB0byBoZXJlLlxuICAgKlxuICAgKiBBIHBhZ2UgaXMgYWxzbyB0aGUgY2FzZSB3b3J0aCBwYXlpbmcgaXQgZm9yLCBzaW5jZSBpdCBjYXJyaWVzIHRoZSB3aG9sZVxuICAgKiBpbXBsaWNpdCBgX05fVF8v4oCmYCBjaGFpbiBhbmQgdGhlcmVmb3JlIHRoZSBtb3N0IHJvd3MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0b3JlZEVudHJ5VGFncyhcbiAgICBzM0tleTogc3RyaW5nLFxuICAgIGN0eDogU2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGN0eFRhZ3MgPSBnZXRUYWdzKGN0eCk7XG4gICAgaWYgKGN0eFRhZ3M/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGN0eFRhZ3M7XG4gICAgfVxuICAgIGlmICghdGhpcy5tYXBzVGFnc1RvUGF0aHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5idWNrZXQuZ2V0KHMzS2V5KTtcbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5VGFncyhwYXJzZUNhY2hlVmFsdWUocmVzcG9uc2UpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcmVhZCB0YWdzIG9mICR7czNLZXl9IGJlZm9yZSBkZWxldGluZzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW55IG9mIGB0YWdzYCB3YXMgcmV2YWxpZGF0ZWQgYWZ0ZXIgdGhpcyBlbnRyeSB3YXMgc3RvcmVkLCBhbmQgaG93LlxuICAgKlxuICAgKiBSZWFkcyB0aGUgcGVyLXRhZyBtYXJrZXIgcm93cyBgcmV2YWxpZGF0ZVRhZ2Agd3JpdGVzLCBhcyB0aGlzIGluc3RhbmNlXG4gICAqIHRyYWNrcyB0aGVtOiBzZWUgYFRyYWNrZWRUYWdNYXJrZXJzYCBmb3Igd2hlbiB0aGV5IGFyZSByZWFkLlxuICAgKiBTY2FubmluZyB0aGUgdGFnJ3MgbWFwcGluZyByb3dzIGluc3RlYWQgd291bGQgYW5zd2VyIHRoZSB3cm9uZyBxdWVzdGlvbjpcbiAgICogdGhvc2Ugcm93cyBleGlzdCBwZXIgY2FjaGUgKmtleSosIHNvIHdoaWNoIG9uZSBhIGBMaW1pdDogMWAgcXVlcnkgcmV0dXJuZWRcbiAgICogZGVwZW5kZWQgb24gc29ydCBvcmRlciwgYW5kIGFuIGVudHJ5IGNvdWxkIGJlIGp1ZGdlZCBhZ2FpbnN0IGFub3RoZXJcbiAgICogZW50cnkncyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEEgdGFnIHJldmFsaWRhdGVkIHdpdGggYSBwcm9maWxlIG9ubHkgbWFrZXMgdGhlIGVudHJ5ICpzdGFsZSo6IHRoYXQgaXNcbiAgICogcmVwb3J0ZWQgdG8gTmV4dC5qcyB0aHJvdWdoIGl0cyB0YWcgbWFuaWZlc3QgKHNlZSB7QGxpbmsgbmV4dFRhZ3NNYW5pZmVzdH0pXG4gICAqIGFuZCBhbnN3ZXJlZCBgXCJzdGFsZVwiYCBoZXJlLCBzbyB0aGUgZW50cnkgaXMgc2VydmVkIHdoaWxlIGEgYmFja2dyb3VuZFxuICAgKiByZW5kZXIgcmVwbGFjZXMgaXQuIFdoZW4gdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSByZWFjaGVkIGEgc3RhbGUgZW50cnkgaXNcbiAgICogcmVwb3J0ZWQgZXhwaXJlZCBpbnN0ZWFkIC0gYSBibG9ja2luZyByZW5kZXIsIG5ldmVyIGEgc3RhbGUgcGFnZSBwcmVzZW50ZWRcbiAgICogYXMgZnJlc2guXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrSWZSZXZhbGlkYXRlZChcbiAgICBjYWNoZUxhc3RNb2RpZmllZDogbnVtYmVyLFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPFJldmFsaWRhdGlvblN0YXRlPiB7XG4gICAgYXdhaXQgdGhpcy50YWdzLnJlZnJlc2goKTtcbiAgICBhd2FpdCB0aGlzLnRhZ3MuZW5zdXJlKHRhZ3MpO1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy50YWdzLnN0YXRlKHRhZ3MsIGNhY2hlTGFzdE1vZGlmaWVkKTtcbiAgICBpZiAoc3RhdGUgIT09IFwic3RhbGVcIikge1xuICAgICAgaWYgKHN0YXRlID09PSBcImV4cGlyZWRcIikge1xuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBUYWdzIFske3RhZ3N9XSBleHBpcmVkIGVudHJ5IGNyZWF0ZWQgYXQgJHtjYWNoZUxhc3RNb2RpZmllZH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gbmV4dFRhZ3NNYW5pZmVzdCgpO1xuICAgIGlmICghbWFuaWZlc3QpIHtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBUYWdzIFske3RhZ3N9XSBhcmUgc3RhbGUgYW5kIE5leHQuanMncyB0YWcgbWFuaWZlc3QgaXMgYCArXG4gICAgICAgICAgYHVucmVhY2hhYmxlLCBleHBpcmluZyB0aGUgZW50cnkgaW5zdGVhZGAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIFwiZXhwaXJlZFwiO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICBjb25zdCBzdGFsZUF0ID0gdGhpcy50YWdzLmdldCh0YWcpPy5zdGFsZUF0O1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtYW5pZmVzdC5nZXQodGFnKTtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhbGVBdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHN0YWxlQXQgPiBjYWNoZUxhc3RNb2RpZmllZCAmJlxuICAgICAgICAoZXhpc3Rpbmc/LnN0YWxlID8/IDApIDwgc3RhbGVBdFxuICAgICAgKSB7XG4gICAgICAgIG1hbmlmZXN0LnNldCh0YWcsIHsgLi4uZXhpc3RpbmcsIHN0YWxlOiBzdGFsZUF0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCJzdGFsZVwiO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import type { CacheEntry, CacheHandler } from "next/dist/server/lib/cache-handlers/types";
1
+ import type { CacheEntry, CacheHandler } from "next/cache";
2
2
  import { TrackedTagMarkers } from "./aws-cache-store";
3
3
  export { markerClock as now } from "./aws-cache-store";
4
4
  /** Whether this process is `next build` rather than a deployed server. */