cdk-nextjs 0.7.6 → 0.7.8

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 (65) hide show
  1. package/.jsii +3 -3
  2. package/.jsii.tabl.json +1 -1
  3. package/README.md +12 -3
  4. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
  5. package/docs/adapter-runtime.md +1 -1
  6. package/docs/caching-guide.md +11 -1
  7. package/docs/harness-coverage.md +154 -73
  8. package/lib/adapter/adapter.mjs +12 -3
  9. package/lib/adapter/aws-cache-store.d.ts +221 -3
  10. package/lib/adapter/aws-cache-store.js +481 -35
  11. package/lib/adapter/aws-cache-store.test.js +706 -3
  12. package/lib/adapter/cache-handler.d.ts +5 -3
  13. package/lib/adapter/cache-handler.js +16 -10
  14. package/lib/adapter/cache-handler.mjs +517 -49
  15. package/lib/adapter/cache-handler.test.js +44 -1
  16. package/lib/adapter/cache-utils.d.ts +22 -0
  17. package/lib/adapter/cache-utils.js +44 -1
  18. package/lib/adapter/function-groups.js +17 -4
  19. package/lib/adapter/function-groups.test.js +33 -1
  20. package/lib/adapter/memory-cache-handler.d.ts +5 -1
  21. package/lib/adapter/memory-cache-handler.js +6 -2
  22. package/lib/adapter/s3-cache-handler.d.ts +12 -1
  23. package/lib/adapter/s3-cache-handler.js +30 -8
  24. package/lib/adapter/s3-cache-handler.test.js +84 -2
  25. package/lib/adapter/use-cache-common.d.ts +66 -1
  26. package/lib/adapter/use-cache-common.js +142 -19
  27. package/lib/adapter/use-cache-common.test.js +174 -1
  28. package/lib/adapter/use-cache-default-handler.js +36 -6
  29. package/lib/adapter/use-cache-default-handler.mjs +553 -47
  30. package/lib/adapter/use-cache-handlers.test.js +247 -7
  31. package/lib/adapter/use-cache-remote-handler.js +9 -7
  32. package/lib/adapter/use-cache-remote-handler.mjs +542 -45
  33. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
  34. package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
  35. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
  36. package/lib/nextjs-api.js +1 -1
  37. package/lib/nextjs-build/nextjs-build.js +1 -1
  38. package/lib/nextjs-cache.js +1 -1
  39. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  40. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  41. package/lib/nextjs-distribution.js +1 -1
  42. package/lib/nextjs-post-deploy.js +1 -1
  43. package/lib/nextjs-static-assets.js +1 -1
  44. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  45. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  46. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  47. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  48. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  49. package/lib/runtime/core.js +20 -4
  50. package/lib/runtime/core.test.js +17 -1
  51. package/lib/runtime/image-utils.d.ts +8 -9
  52. package/lib/runtime/image-utils.js +16 -1
  53. package/lib/runtime/image-utils.test.js +13 -1
  54. package/lib/runtime/image.js +9 -3
  55. package/lib/runtime/lambda.mjs +66 -18
  56. package/lib/runtime/server.mjs +66 -18
  57. package/lib/runtime/tag-manifest.d.ts +40 -0
  58. package/lib/runtime/tag-manifest.js +59 -0
  59. package/lib/runtime/tag-manifest.test.d.ts +1 -0
  60. package/lib/runtime/tag-manifest.test.js +47 -0
  61. package/package.json +3 -3
  62. package/scripts/e2e-deploy.sh +7 -2
  63. package/scripts/e2e-harness/README.md +72 -35
  64. package/scripts/e2e-harness/screen.mjs +148 -7
  65. package/scripts/playwright-install-deps.sh +40 -0
@@ -26,19 +26,21 @@ export default class CdkNextjsCacheHandler implements CacheHandler {
26
26
  /**
27
27
  * Get cache entry
28
28
  * - Build time: Not implemented (build doesn't read cache)
29
- * - Runtime: Try memory first, then S3/DynamoDB
29
+ * - Runtime: Try memory first, then S3/DynamoDB, {@link outsideRender}
30
30
  */
31
31
  get(cacheKey: string, ctx: GetCacheHandlerContext): Promise<CacheHandlerValue | null>;
32
+ private getAtRuntime;
32
33
  /**
33
34
  * Set cache entry
34
35
  * - Build time: Write to local file cache only (or delete if data is null)
35
- * - Runtime: Write to both memory and S3/DynamoDB (or delete if data is null)
36
+ * - Runtime: Write to both memory and S3/DynamoDB (or delete if data is null),
37
+ * {@link outsideRender}
36
38
  */
37
39
  set(cacheKey: string, data: IncrementalCacheValue | null, ctx: SetCacheHandlerContext): Promise<void>;
38
40
  /**
39
41
  * Revalidate tags
40
42
  * - Build time: Not implemented
41
- * - Runtime: Delegate to S3/DynamoDB handler
43
+ * - Runtime: Delegate to S3/DynamoDB handler, {@link outsideRender}
42
44
  */
43
45
  revalidateTag(tag: string | string[], durations?: {
44
46
  expire?: number;
@@ -47,7 +47,7 @@ class CdkNextjsCacheHandler {
47
47
  }
48
48
  else {
49
49
  this.s3DynamoHandler = CdkNextjsCacheHandler.sharedS3DynamoHandler ??=
50
- new s3_cache_handler_1.S3CacheHandler({ context: options });
50
+ (0, use_cache_common_1.outsideRender)(() => new s3_cache_handler_1.S3CacheHandler({ context: options }));
51
51
  this.memoryHandler = CdkNextjsCacheHandler.sharedMemoryHandler ??=
52
52
  new memory_cache_handler_1.MemoryCacheHandler();
53
53
  }
@@ -55,7 +55,7 @@ class CdkNextjsCacheHandler {
55
55
  /**
56
56
  * Get cache entry
57
57
  * - Build time: Not implemented (build doesn't read cache)
58
- * - Runtime: Try memory first, then S3/DynamoDB
58
+ * - Runtime: Try memory first, then S3/DynamoDB, {@link outsideRender}
59
59
  */
60
60
  async get(cacheKey, ctx) {
61
61
  if (this.isBuildTime) {
@@ -63,6 +63,9 @@ class CdkNextjsCacheHandler {
63
63
  // requires; see {@link LocalFileCacheHandler.get}.
64
64
  return this.localFileHandler.get(cacheKey);
65
65
  }
66
+ return (0, use_cache_common_1.outsideRender)(() => this.getAtRuntime(cacheKey, ctx));
67
+ }
68
+ async getAtRuntime(cacheKey, ctx) {
66
69
  // Runtime: try memory first
67
70
  const memoryResult = await this.memoryHandler.get(cacheKey);
68
71
  // A memory hit is checked against the same tag markers an S3 read is.
@@ -99,7 +102,7 @@ class CdkNextjsCacheHandler {
99
102
  // copied at all: the re-render it asks for writes the fresh entry to
100
103
  // both layers.
101
104
  if (s3Result.lastModified !== -1) {
102
- await this.memoryHandler.set(cacheKey, s3Result.value, s3Result.lastModified);
105
+ await this.memoryHandler.set(cacheKey, s3Result.value, s3Result.lastModified, s3Result.cacheControl);
103
106
  }
104
107
  return s3Result;
105
108
  }
@@ -109,7 +112,8 @@ class CdkNextjsCacheHandler {
109
112
  /**
110
113
  * Set cache entry
111
114
  * - Build time: Write to local file cache only (or delete if data is null)
112
- * - Runtime: Write to both memory and S3/DynamoDB (or delete if data is null)
115
+ * - Runtime: Write to both memory and S3/DynamoDB (or delete if data is null),
116
+ * {@link outsideRender}
113
117
  */
114
118
  async set(cacheKey, data, ctx) {
115
119
  if (this.isBuildTime) {
@@ -124,14 +128,16 @@ class CdkNextjsCacheHandler {
124
128
  return;
125
129
  }
126
130
  // Runtime: both layers, where `null` is a delete.
127
- this.debug(`Cache ${data ? "write" : "delete"}: ${cacheKey}`);
128
- await this.memoryHandler.set(cacheKey, data);
129
- await this.s3DynamoHandler.set(cacheKey, data, ctx);
131
+ await (0, use_cache_common_1.outsideRender)(async () => {
132
+ this.debug(`Cache ${data ? "write" : "delete"}: ${cacheKey}`);
133
+ await this.memoryHandler.set(cacheKey, data, undefined, (0, cache_utils_1.getCacheControl)(ctx));
134
+ await this.s3DynamoHandler.set(cacheKey, data, ctx);
135
+ });
130
136
  }
131
137
  /**
132
138
  * Revalidate tags
133
139
  * - Build time: Not implemented
134
- * - Runtime: Delegate to S3/DynamoDB handler
140
+ * - Runtime: Delegate to S3/DynamoDB handler, {@link outsideRender}
135
141
  */
136
142
  async revalidateTag(tag, durations) {
137
143
  if (this.isBuildTime) {
@@ -139,7 +145,7 @@ class CdkNextjsCacheHandler {
139
145
  }
140
146
  // Memory hits are checked against the same markers (see `get`), so only
141
147
  // the S3/DynamoDB handler has anything to record.
142
- await this.s3DynamoHandler.revalidateTag(tag, durations);
148
+ await (0, use_cache_common_1.outsideRender)(() => this.s3DynamoHandler.revalidateTag(tag, durations));
143
149
  }
144
150
  /**
145
151
  * Deliberately a no-op. Next.js calls `resetRequestCache` at the start of
@@ -152,4 +158,4 @@ class CdkNextjsCacheHandler {
152
158
  async resetRequestCache() { }
153
159
  }
154
160
  exports.default = CdkNextjsCacheHandler;
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2NhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7O0VBTUU7QUFDRixzREFBc0Q7QUFDdEQsa0RBQTZCO0FBTzdCLCtDQUl1QjtBQUN2Qix5RUFBbUU7QUFDbkUsaUVBQTREO0FBQzVELHlEQUFvRDtBQUNwRCx5REFBa0Q7QUFFbEQ7O0dBRUc7QUFDSCxNQUFxQixxQkFBcUI7SUFDeEM7Ozs7Ozs7OztPQVNHO0lBQ0ssTUFBTSxDQUFDLG1CQUFtQixHQUE4QixJQUFJLENBQUM7SUFDN0QsTUFBTSxDQUFDLHFCQUFxQixHQUEwQixJQUFJLENBQUM7SUFFbEQsV0FBVyxHQUFHLElBQUEsK0JBQVksR0FBRSxDQUFDO0lBQzdCLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBRTNFLDBCQUEwQjtJQUNsQixnQkFBZ0IsQ0FBeUI7SUFFakQsb0RBQW9EO0lBQzVDLGFBQWEsQ0FBc0I7SUFDbkMsZUFBZSxDQUFrQjtJQUV6QyxZQUFZLE9BQTRCO1FBQ3RDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdEQUFxQixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FDUiwrQkFBK0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQ3JFLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcscUJBQXFCLENBQUMscUJBQXFCO2dCQUNoRSxJQUFJLGlDQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLHFCQUFxQixDQUFDLG1CQUFtQjtnQkFDNUQsSUFBSSx5Q0FBa0IsRUFB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S0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQ2pCLEdBQXNCLEVBQ3RCLFNBQStCO1FBRS9CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBRUQsd0VBQXdFO1FBQ3hFLGtEQUFrRDtRQUNsRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsS0FBbUIsQ0FBQzs7QUFoSzdDLHdDQWlLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIE5leHQuanMgQ3VzdG9tIENhY2hlIEhhbmRsZXIuIFNlZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvaW5jcmVtZW50YWxDYWNoZUhhbmRsZXJQYXRoXG4gIFxuICBPcmNoZXN0cmF0b3IgY2FjaGUgaGFuZGxlciB0aGF0IGNvbmRpdGlvbmFsbHkgdXNlcyBkaWZmZXJlbnQgY2FjaGluZyBzdHJhdGVnaWVzOlxuICAtIEJ1aWxkIHRpbWU6IExvY2FsRmlsZUNhY2hlSGFuZGxlciBmb3IgcHJlLWNhY2hpbmdcbiAgLSBSdW50aW1lOiBNZW1vcnlDYWNoZUhhbmRsZXIgKGZhc3QpICsgUzNEeW5hbW9DYWNoZUhhbmRsZXIgKHBlcnNpc3RlbnQpXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQge1xuICBDYWNoZUhhbmRsZXIsXG4gIENhY2hlSGFuZGxlclZhbHVlLFxuICBDYWNoZUhhbmRsZXJDb250ZXh0LFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvaW5jcmVtZW50YWwtY2FjaGVcIjtcbmltcG9ydCB0eXBlIHsgSW5jcmVtZW50YWxDYWNoZVZhbHVlIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGVcIjtcbmltcG9ydCB7XG4gIEdldENhY2hlSGFuZGxlckNvbnRleHQsXG4gIGdldFRhZ3MsXG4gIFNldENhY2hlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5pbXBvcnQgeyBMb2NhbEZpbGVDYWNoZUhhbmRsZXIgfSBmcm9tIFwiLi9sb2NhbC1maWxlLWNhY2hlLWhhbmRsZXJcIjtcbmltcG9ydCB7IE1lbW9yeUNhY2hlSGFuZGxlciB9IGZyb20gXCIuL21lbW9yeS1jYWNoZS1oYW5kbGVyXCI7XG5pbXBvcnQgeyBTM0NhY2hlSGFuZGxlciB9IGZyb20gXCIuL3MzLWNhY2hlLWhhbmRsZXJcIjtcbmltcG9ydCB7IGlzQnVpbGRQaGFzZSB9IGZyb20gXCIuL3VzZS1jYWNoZS1jb21tb25cIjtcblxuLyoqXG4gKiBPcmNoZXN0cmF0b3IgY2FjaGUgaGFuZGxlciB0aGF0IGNvbmRpdGlvbmFsbHkgaW5zdGFudGlhdGVzIGhhbmRsZXJzIGJhc2VkIG9uIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENka05leHRqc0NhY2hlSGFuZGxlciBpbXBsZW1lbnRzIENhY2hlSGFuZGxlciB7XG4gIC8qKlxuICAgKiBTaGFyZWQgc2luZ2xldG9uIGhhbmRsZXJzIGZvciBydW50aW1lLlxuICAgKlxuICAgKiBOZXh0LmpzIGNyZWF0ZXMgbXVsdGlwbGUgY2FjaGUgaGFuZGxlciBpbnN0YW5jZXMgKG9uZSBlYWNoIGZvciBBUFBfUEFHRSwgQVBQX1JPVVRFLCBGRVRDSCwgZXRjKS5cbiAgICogVXNpbmcgc2luZ2xldG9uIHBhdHRlcm4gcHJvdmlkZXM6XG4gICAqIC0gU2luZ2xlIFMzIGNsaWVudCBjb25uZWN0aW9uIHBvb2wgc2hhcmVkIGFjcm9zcyBhbGwgY2FjaGUgdHlwZXNcbiAgICogLSBVbmlmaWVkIG1lbW9yeSBjYWNoZSBhY2Nlc3NpYmxlIGJ5IGFsbCBpbnN0YW5jZXMgKGNhY2hlIGhpdHMgYmVuZWZpdCBhbGwpXG4gICAqIC0gTG93ZXIgbWVtb3J5IGZvb3RwcmludCBhbmQgZmFzdGVyIGluaXRpYWxpemF0aW9uXG4gICAqIC0gU2FtZSBDYWNoZUhhbmRsZXJDb250ZXh0IGZvciBhbGwgaW5zdGFuY2VzLCBzbyBubyBjb25maWd1cmF0aW9uIGxvc3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNoYXJlZE1lbW9yeUhhbmRsZXI6IE1lbW9yeUNhY2hlSGFuZGxlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBzaGFyZWRTM0R5bmFtb0hhbmRsZXI6IFMzQ2FjaGVIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0J1aWxkVGltZSA9IGlzQnVpbGRQaGFzZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOmNhY2hlLWhhbmRsZXI6b3JjaGVzdHJhdG9yXCIpO1xuXG4gIC8vIFNldCBvbmx5IGF0IGJ1aWxkIHRpbWUuXG4gIHByaXZhdGUgbG9jYWxGaWxlSGFuZGxlciE6IExvY2FsRmlsZUNhY2hlSGFuZGxlcjtcblxuICAvLyBTZXQgb25seSBhdCBydW50aW1lLCBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5jZXMuXG4gIHByaXZhdGUgbWVtb3J5SGFuZGxlciE6IE1lbW9yeUNhY2hlSGFuZGxlcjtcbiAgcHJpdmF0ZSBzM0R5bmFtb0hhbmRsZXIhOiBTM0NhY2hlSGFuZGxlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDYWNoZUhhbmRsZXJDb250ZXh0KSB7XG4gICAgaWYgKHRoaXMuaXNCdWlsZFRpbWUpIHtcbiAgICAgIHRoaXMubG9jYWxGaWxlSGFuZGxlciA9IG5ldyBMb2NhbEZpbGVDYWNoZUhhbmRsZXIoKTtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBCdWlsZC10aW1lIGNhY2hlIGRpcmVjdG9yeTogJHt0aGlzLmxvY2FsRmlsZUhhbmRsZXIuZ2V0Q2FjaGVEaXIoKX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zM0R5bmFtb0hhbmRsZXIgPSBDZGtOZXh0anNDYWNoZUhhbmRsZXIuc2hhcmVkUzNEeW5hbW9IYW5kbGVyID8/PVxuICAgICAgICBuZXcgUzNDYWNoZUhhbmRsZXIoeyBjb250ZXh0OiBvcHRpb25zIH0pO1xuICAgICAgdGhpcy5tZW1vcnlIYW5kbGVyID0gQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyLnNoYXJlZE1lbW9yeUhhbmRsZXIgPz89XG4gICAgICAgIG5ldyBNZW1vcnlDYWNoZUhhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIGVudHJ5XG4gICAqIC0gQnVpbGQgdGltZTogTm90IGltcGxlbWVudGVkIChidWlsZCBkb2Vzbid0IHJlYWQgY2FjaGUpXG4gICAqIC0gUnVudGltZTogVHJ5IG1lbW9yeSBmaXJzdCwgdGhlbiBTMy9EeW5hbW9EQlxuICAgKi9cbiAgYXN5bmMgZ2V0KFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgY3R4OiBHZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICApOiBQcm9taXNlPENhY2hlSGFuZGxlclZhbHVlIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmlzQnVpbGRUaW1lKSB7XG4gICAgICAvLyBSZWFkcyBiYWNrIHdoYXQgdGhpcyBidWlsZCB3cm90ZSwgd2hpY2ggYGNhY2hlQ29tcG9uZW50c2AgcHJlcmVuZGVyaW5nXG4gICAgICAvLyByZXF1aXJlczsgc2VlIHtAbGluayBMb2NhbEZpbGVDYWNoZUhhbmRsZXIuZ2V0fS5cbiAgICAgIHJldHVybiB0aGlzLmxvY2FsRmlsZUhhbmRsZXIuZ2V0KGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICAvLyBSdW50aW1lOiB0cnkgbWVtb3J5IGZpcnN0XG4gICAgY29uc3QgbWVtb3J5UmVzdWx0ID0gYXdhaXQgdGhpcy5tZW1vcnlIYW5kbGVyLmdldChjYWNoZUtleSk7XG4gICAgLy8gQSBtZW1vcnkgaGl0IGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2FtZSB0YWcgbWFya2VycyBhbiBTMyByZWFkIGlzLlxuICAgIC8vIGByZXZhbGlkYXRlVGFnYCBjYW4gb25seSBjbGVhciB0aGUgbWVtb3J5IG9mIHRoZSBpbnN0YW5jZSB0aGF0IHJhbiBpdCxcbiAgICAvLyBzbyBza2lwcGluZyB0aGUgY2hlY2sgbGVmdCBldmVyeSBvdGhlciBpbnN0YW5jZSBhbnN3ZXJpbmcgZnJvbSBtZW1vcnlcbiAgICAvLyBmb3IgdGhlIHdob2xlIG1lbW9yeSBUVEwgLSBhbmQgQ2xvdWRGcm9udCwgd2hvc2UgY29weSB0aGF0XG4gICAgLy8gYHJldmFsaWRhdGVUYWdgIGhhZCBqdXN0IGludmFsaWRhdGVkLCBjYWNoZWQgdGhlIHN0YWxlIHBhZ2UgYWdhaW4uXG4gICAgLy8gVGhlIGNoZWNrIGlzIG9uZSBEeW5hbW9EQiBgQmF0Y2hHZXRJdGVtYDsgd2hhdCB0aGUgbWVtb3J5IGxheWVyIHN0aWxsXG4gICAgLy8gc2F2ZXMgaXMgdGhlIFMzIHJlYWQgYW5kIHRoZSBwYXJzZSBvZiB0aGUgYm9keS4gQSByZXZhbGlkYXRlZCBlbnRyeSBpc1xuICAgIC8vIGRyb3BwZWQgYW5kIHJlYWQgZnJvbSBTMywgd2hpY2ggaGFuZHMgaXQgYmFjayBleHBpcmVkIG9yIGFzIGEgbWlzcy5cbiAgICBpZiAoXG4gICAgICBtZW1vcnlSZXN1bHQgJiZcbiAgICAgIChhd2FpdCB0aGlzLnMzRHluYW1vSGFuZGxlci5pc1JldmFsaWRhdGVkKFxuICAgICAgICB7XG4gICAgICAgICAgbGFzdE1vZGlmaWVkOiBtZW1vcnlSZXN1bHQubGFzdE1vZGlmaWVkLFxuICAgICAgICAgIHZhbHVlOiBtZW1vcnlSZXN1bHQudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICAgIGN0eCxcbiAgICAgICAgY2FjaGVLZXksXG4gICAgICApKVxuICAgICkge1xuICAgICAgdGhpcy5kZWJ1ZyhgTWVtb3J5IGNhY2hlIFJFVkFMSURBVEVEOiAke2NhY2hlS2V5fWApO1xuICAgICAgYXdhaXQgdGhpcy5tZW1vcnlIYW5kbGVyLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChtZW1vcnlSZXN1bHQpIHtcbiAgICAgIHRoaXMuZGVidWcoYE1lbW9yeSBjYWNoZSBISVQ6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICByZXR1cm4gbWVtb3J5UmVzdWx0O1xuICAgIH1cblxuICAgIC8vIE1lbW9yeSBtaXNzIC0gdHJ5IFMzL0R5bmFtb0RCXG4gICAgY29uc3QgczNSZXN1bHQgPSBhd2FpdCB0aGlzLnMzRHluYW1vSGFuZGxlci5nZXQoY2FjaGVLZXksIGN0eCk7XG4gICAgaWYgKHMzUmVzdWx0KSB7XG4gICAgICB0aGlzLmRlYnVnKGBTMyBjYWNoZSBISVQ6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAvLyBQcm9tb3RlZCB3aXRoIHRoZSBTMyBlbnRyeSdzIG93biBgbGFzdE1vZGlmaWVkYCwgbm90IHRoZSB0aW1lIG9mIHRoZVxuICAgICAgLy8gY29weTogTmV4dC5qcyBhZ2VzIHRoZSBlbnRyeSBmcm9tIGl0IGZvciB0aW1lLWJhc2VkIHJldmFsaWRhdGlvbiwgYW5kXG4gICAgICAvLyB0aGUgdGFnIG1hcmtlcnMgYXJlIGNvbXBhcmVkIGFnYWluc3QgaXQgdG9vLiBTdGFtcGluZyBgRGF0ZS5ub3coKWBcbiAgICAgIC8vIG1hZGUgYW4gZW50cnkgdGhhdCB3YXMgZHVlIGZvciByZWdlbmVyYXRpb24gbG9vayBmcmVzaGx5IHJlbmRlcmVkLFxuICAgICAgLy8gYW5kIG9uZSBhIHNvZnQgYHJldmFsaWRhdGVUYWdgIGhhZCBtYWRlIHN0YWxlIGxvb2sgbmV3ZXIgdGhhbiB0aGVcbiAgICAgIC8vIHN0YWxlIG1hcmssIHNvIG1lbW9yeSBoaXRzIHNlcnZlZCBpdCBhcyBmcmVzaCBmb3IgdGhlIHdob2xlIG1lbW9yeVxuICAgICAgLy8gVFRMLiBBbiBlbnRyeSBhIHRhZyByZXZhbGlkYXRpb24gZXhwaXJlZCAoYGxhc3RNb2RpZmllZDogLTFgKSBpcyBub3RcbiAgICAgIC8vIGNvcGllZCBhdCBhbGw6IHRoZSByZS1yZW5kZXIgaXQgYXNrcyBmb3Igd3JpdGVzIHRoZSBmcmVzaCBlbnRyeSB0b1xuICAgICAgLy8gYm90aCBsYXllcnMuXG4gICAgICBpZiAoczNSZXN1bHQubGFzdE1vZGlmaWVkICE9PSAtMSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1lbW9yeUhhbmRsZXIuc2V0KFxuICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgIHMzUmVzdWx0LnZhbHVlLFxuICAgICAgICAgIHMzUmVzdWx0Lmxhc3RNb2RpZmllZCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzM1Jlc3VsdDtcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnKGBDYWNoZSBNSVNTOiAke2NhY2hlS2V5fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjYWNoZSBlbnRyeVxuICAgKiAtIEJ1aWxkIHRpbWU6IFdyaXRlIHRvIGxvY2FsIGZpbGUgY2FjaGUgb25seSAob3IgZGVsZXRlIGlmIGRhdGEgaXMgbnVsbClcbiAgICogLSBSdW50aW1lOiBXcml0ZSB0byBib3RoIG1lbW9yeSBhbmQgUzMvRHluYW1vREIgKG9yIGRlbGV0ZSBpZiBkYXRhIGlzIG51bGwpXG4gICAqL1xuICBhc3luYyBzZXQoXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICBkYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgfCBudWxsLFxuICAgIGN0eDogU2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNCdWlsZFRpbWUpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9jYWxGaWxlSGFuZGxlci5zZXQoY2FjaGVLZXksIGRhdGEsIGdldFRhZ3MoY3R4KSk7XG4gICAgICAgIHRoaXMuZGVidWcoYEJ1aWxkIGNhY2hlIHdyaXRlOiAke2NhY2hlS2V5fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVsZXRlIG5vdCBpbXBsZW1lbnRlZCBmb3IgbG9jYWwgZmlsZSBjYWNoZSAoYnVpbGQtdGltZSBvbmx5IGNyZWF0ZXMgZmlsZXMpXG4gICAgICAgIHRoaXMuZGVidWcoYEJ1aWxkIGNhY2hlIGRlbGV0ZSBpZ25vcmVkOiAke2NhY2hlS2V5fWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW50aW1lOiBib3RoIGxheWVycywgd2hlcmUgYG51bGxgIGlzIGEgZGVsZXRlLlxuICAgIHRoaXMuZGVidWcoYENhY2hlICR7ZGF0YSA/IFwid3JpdGVcIiA6IFwiZGVsZXRlXCJ9OiAke2NhY2hlS2V5fWApO1xuICAgIGF3YWl0IHRoaXMubWVtb3J5SGFuZGxlci5zZXQoY2FjaGVLZXksIGRhdGEpO1xuICAgIGF3YWl0IHRoaXMuczNEeW5hbW9IYW5kbGVyLnNldChjYWNoZUtleSwgZGF0YSwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZhbGlkYXRlIHRhZ3NcbiAgICogLSBCdWlsZCB0aW1lOiBOb3QgaW1wbGVtZW50ZWRcbiAgICogLSBSdW50aW1lOiBEZWxlZ2F0ZSB0byBTMy9EeW5hbW9EQiBoYW5kbGVyXG4gICAqL1xuICBhc3luYyByZXZhbGlkYXRlVGFnKFxuICAgIHRhZzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgZHVyYXRpb25zPzogeyBleHBpcmU/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNCdWlsZFRpbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNZW1vcnkgaGl0cyBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzYW1lIG1hcmtlcnMgKHNlZSBgZ2V0YCksIHNvIG9ubHlcbiAgICAvLyB0aGUgUzMvRHluYW1vREIgaGFuZGxlciBoYXMgYW55dGhpbmcgdG8gcmVjb3JkLlxuICAgIGF3YWl0IHRoaXMuczNEeW5hbW9IYW5kbGVyLnJldmFsaWRhdGVUYWcodGFnLCBkdXJhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGliZXJhdGVseSBhIG5vLW9wLiBOZXh0LmpzIGNhbGxzIGByZXNldFJlcXVlc3RDYWNoZWAgYXQgdGhlIHN0YXJ0IG9mXG4gICAqIGV2ZXJ5IHJlcXVlc3QgKGBiYXNlLXNlcnZlcmAsIGBhcHAtcGFnZWAsIGBhcHAtcm91dGVgKSwgYW5kIGl0cyBvd25cbiAgICogYEZpbGVTeXN0ZW1DYWNoZWAgLSB3aG9zZSBMUlUgaXMgc2hhcmVkIGFjcm9zcyByZXF1ZXN0cyB0aGUgc2FtZSB3YXkgdGhlXG4gICAqIG1lbW9yeSBsYXllciBpcyAtIGxlYXZlcyBpdCBlbXB0eTogdGhlIGhvb2sgaXMgZm9yIHN0YXRlIHNjb3BlZCB0byBvbmVcbiAgICogcmVxdWVzdCwgYW5kIG5vdGhpbmcgaGVyZSBpcy4gQ2xlYXJpbmcgdGhlIG1lbW9yeSBsYXllciBpbiBpdCBtZWFudCBub1xuICAgKiBlbnRyeSBldmVyIHN1cnZpdmVkIHRvIGEgc2Vjb25kIHJlcXVlc3QsIHNvIGV2ZXJ5IHJlYWQgd2VudCB0byBTMy5cbiAgICovXG4gIGFzeW5jIHJlc2V0UmVxdWVzdENhY2hlKCk6IFByb21pc2U8dm9pZD4ge31cbn1cbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL2NhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7O0VBTUU7QUFDRixzREFBc0Q7QUFDdEQsa0RBQTZCO0FBTzdCLCtDQUt1QjtBQUN2Qix5RUFBbUU7QUFDbkUsaUVBQTREO0FBQzVELHlEQUFvRDtBQUNwRCx5REFBaUU7QUFFakU7O0dBRUc7QUFDSCxNQUFxQixxQkFBcUI7SUFDeEM7Ozs7Ozs7OztPQVNHO0lBQ0ssTUFBTSxDQUFDLG1CQUFtQixHQUE4QixJQUFJLENBQUM7SUFDN0QsTUFBTSxDQUFDLHFCQUFxQixHQUEwQixJQUFJLENBQUM7SUFFbEQsV0FBVyxHQUFHLElBQUEsK0JBQVksR0FBRSxDQUFDO0lBQzdCLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBRTNFLDBCQUEwQjtJQUNsQixnQkFBZ0IsQ0FBeUI7SUFFakQsb0RBQW9EO0lBQzVDLGFBQWEsQ0FBc0I7SUFDbkMsZUFBZSxDQUFrQjtJQUV6QyxZQUFZLE9BQTRCO1FBQ3RDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdEQUFxQixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FDUiwrQkFBK0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQ3JFLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcscUJBQXFCLENBQUMscUJBQXFCO2dCQUNoRSxJQUFBLGdDQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxpQ0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsYUFBYSxHQUFHLHFCQUFx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c3RvbSBDYWNoZSBIYW5kbGVyLiBTZWU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9hcGktcmVmZXJlbmNlL25leHQtY29uZmlnLWpzL2luY3JlbWVudGFsQ2FjaGVIYW5kbGVyUGF0aFxuICBcbiAgT3JjaGVzdHJhdG9yIGNhY2hlIGhhbmRsZXIgdGhhdCBjb25kaXRpb25hbGx5IHVzZXMgZGlmZmVyZW50IGNhY2hpbmcgc3RyYXRlZ2llczpcbiAgLSBCdWlsZCB0aW1lOiBMb2NhbEZpbGVDYWNoZUhhbmRsZXIgZm9yIHByZS1jYWNoaW5nXG4gIC0gUnVudGltZTogTWVtb3J5Q2FjaGVIYW5kbGVyIChmYXN0KSArIFMzRHluYW1vQ2FjaGVIYW5kbGVyIChwZXJzaXN0ZW50KVxuKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHtcbiAgQ2FjaGVIYW5kbGVyLFxuICBDYWNoZUhhbmRsZXJWYWx1ZSxcbiAgQ2FjaGVIYW5kbGVyQ29udGV4dCxcbn0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQgdHlwZSB7IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQge1xuICBHZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICBnZXRDYWNoZUNvbnRyb2wsXG4gIGdldFRhZ3MsXG4gIFNldENhY2hlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5pbXBvcnQgeyBMb2NhbEZpbGVDYWNoZUhhbmRsZXIgfSBmcm9tIFwiLi9sb2NhbC1maWxlLWNhY2hlLWhhbmRsZXJcIjtcbmltcG9ydCB7IE1lbW9yeUNhY2hlSGFuZGxlciB9IGZyb20gXCIuL21lbW9yeS1jYWNoZS1oYW5kbGVyXCI7XG5pbXBvcnQgeyBTM0NhY2hlSGFuZGxlciB9IGZyb20gXCIuL3MzLWNhY2hlLWhhbmRsZXJcIjtcbmltcG9ydCB7IGlzQnVpbGRQaGFzZSwgb3V0c2lkZVJlbmRlciB9IGZyb20gXCIuL3VzZS1jYWNoZS1jb21tb25cIjtcblxuLyoqXG4gKiBPcmNoZXN0cmF0b3IgY2FjaGUgaGFuZGxlciB0aGF0IGNvbmRpdGlvbmFsbHkgaW5zdGFudGlhdGVzIGhhbmRsZXJzIGJhc2VkIG9uIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENka05leHRqc0NhY2hlSGFuZGxlciBpbXBsZW1lbnRzIENhY2hlSGFuZGxlciB7XG4gIC8qKlxuICAgKiBTaGFyZWQgc2luZ2xldG9uIGhhbmRsZXJzIGZvciBydW50aW1lLlxuICAgKlxuICAgKiBOZXh0LmpzIGNyZWF0ZXMgbXVsdGlwbGUgY2FjaGUgaGFuZGxlciBpbnN0YW5jZXMgKG9uZSBlYWNoIGZvciBBUFBfUEFHRSwgQVBQX1JPVVRFLCBGRVRDSCwgZXRjKS5cbiAgICogVXNpbmcgc2luZ2xldG9uIHBhdHRlcm4gcHJvdmlkZXM6XG4gICAqIC0gU2luZ2xlIFMzIGNsaWVudCBjb25uZWN0aW9uIHBvb2wgc2hhcmVkIGFjcm9zcyBhbGwgY2FjaGUgdHlwZXNcbiAgICogLSBVbmlmaWVkIG1lbW9yeSBjYWNoZSBhY2Nlc3NpYmxlIGJ5IGFsbCBpbnN0YW5jZXMgKGNhY2hlIGhpdHMgYmVuZWZpdCBhbGwpXG4gICAqIC0gTG93ZXIgbWVtb3J5IGZvb3RwcmludCBhbmQgZmFzdGVyIGluaXRpYWxpemF0aW9uXG4gICAqIC0gU2FtZSBDYWNoZUhhbmRsZXJDb250ZXh0IGZvciBhbGwgaW5zdGFuY2VzLCBzbyBubyBjb25maWd1cmF0aW9uIGxvc3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNoYXJlZE1lbW9yeUhhbmRsZXI6IE1lbW9yeUNhY2hlSGFuZGxlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBzaGFyZWRTM0R5bmFtb0hhbmRsZXI6IFMzQ2FjaGVIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0J1aWxkVGltZSA9IGlzQnVpbGRQaGFzZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOmNhY2hlLWhhbmRsZXI6b3JjaGVzdHJhdG9yXCIpO1xuXG4gIC8vIFNldCBvbmx5IGF0IGJ1aWxkIHRpbWUuXG4gIHByaXZhdGUgbG9jYWxGaWxlSGFuZGxlciE6IExvY2FsRmlsZUNhY2hlSGFuZGxlcjtcblxuICAvLyBTZXQgb25seSBhdCBydW50aW1lLCBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5jZXMuXG4gIHByaXZhdGUgbWVtb3J5SGFuZGxlciE6IE1lbW9yeUNhY2hlSGFuZGxlcjtcbiAgcHJpdmF0ZSBzM0R5bmFtb0hhbmRsZXIhOiBTM0NhY2hlSGFuZGxlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDYWNoZUhhbmRsZXJDb250ZXh0KSB7XG4gICAgaWYgKHRoaXMuaXNCdWlsZFRpbWUpIHtcbiAgICAgIHRoaXMubG9jYWxGaWxlSGFuZGxlciA9IG5ldyBMb2NhbEZpbGVDYWNoZUhhbmRsZXIoKTtcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBCdWlsZC10aW1lIGNhY2hlIGRpcmVjdG9yeTogJHt0aGlzLmxvY2FsRmlsZUhhbmRsZXIuZ2V0Q2FjaGVEaXIoKX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zM0R5bmFtb0hhbmRsZXIgPSBDZGtOZXh0anNDYWNoZUhhbmRsZXIuc2hhcmVkUzNEeW5hbW9IYW5kbGVyID8/PVxuICAgICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IG5ldyBTM0NhY2hlSGFuZGxlcih7IGNvbnRleHQ6IG9wdGlvbnMgfSkpO1xuICAgICAgdGhpcy5tZW1vcnlIYW5kbGVyID0gQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyLnNoYXJlZE1lbW9yeUhhbmRsZXIgPz89XG4gICAgICAgIG5ldyBNZW1vcnlDYWNoZUhhbmRsZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIGVudHJ5XG4gICAqIC0gQnVpbGQgdGltZTogTm90IGltcGxlbWVudGVkIChidWlsZCBkb2Vzbid0IHJlYWQgY2FjaGUpXG4gICAqIC0gUnVudGltZTogVHJ5IG1lbW9yeSBmaXJzdCwgdGhlbiBTMy9EeW5hbW9EQiwge0BsaW5rIG91dHNpZGVSZW5kZXJ9XG4gICAqL1xuICBhc3luYyBnZXQoXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICBjdHg6IEdldENhY2hlSGFuZGxlckNvbnRleHQsXG4gICk6IFByb21pc2U8Q2FjaGVIYW5kbGVyVmFsdWUgfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuaXNCdWlsZFRpbWUpIHtcbiAgICAgIC8vIFJlYWRzIGJhY2sgd2hhdCB0aGlzIGJ1aWxkIHdyb3RlLCB3aGljaCBgY2FjaGVDb21wb25lbnRzYCBwcmVyZW5kZXJpbmdcbiAgICAgIC8vIHJlcXVpcmVzOyBzZWUge0BsaW5rIExvY2FsRmlsZUNhY2hlSGFuZGxlci5nZXR9LlxuICAgICAgcmV0dXJuIHRoaXMubG9jYWxGaWxlSGFuZGxlci5nZXQoY2FjaGVLZXkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0c2lkZVJlbmRlcigoKSA9PiB0aGlzLmdldEF0UnVudGltZShjYWNoZUtleSwgY3R4KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEF0UnVudGltZShcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIGN0eDogR2V0Q2FjaGVIYW5kbGVyQ29udGV4dCxcbiAgKTogUHJvbWlzZTxDYWNoZUhhbmRsZXJWYWx1ZSB8IG51bGw+IHtcbiAgICAvLyBSdW50aW1lOiB0cnkgbWVtb3J5IGZpcnN0XG4gICAgY29uc3QgbWVtb3J5UmVzdWx0ID0gYXdhaXQgdGhpcy5tZW1vcnlIYW5kbGVyLmdldChjYWNoZUtleSk7XG4gICAgLy8gQSBtZW1vcnkgaGl0IGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2FtZSB0YWcgbWFya2VycyBhbiBTMyByZWFkIGlzLlxuICAgIC8vIGByZXZhbGlkYXRlVGFnYCBjYW4gb25seSBjbGVhciB0aGUgbWVtb3J5IG9mIHRoZSBpbnN0YW5jZSB0aGF0IHJhbiBpdCxcbiAgICAvLyBzbyBza2lwcGluZyB0aGUgY2hlY2sgbGVmdCBldmVyeSBvdGhlciBpbnN0YW5jZSBhbnN3ZXJpbmcgZnJvbSBtZW1vcnlcbiAgICAvLyBmb3IgdGhlIHdob2xlIG1lbW9yeSBUVEwgLSBhbmQgQ2xvdWRGcm9udCwgd2hvc2UgY29weSB0aGF0XG4gICAgLy8gYHJldmFsaWRhdGVUYWdgIGhhZCBqdXN0IGludmFsaWRhdGVkLCBjYWNoZWQgdGhlIHN0YWxlIHBhZ2UgYWdhaW4uXG4gICAgLy8gVGhlIGNoZWNrIGlzIG9uZSBEeW5hbW9EQiBgQmF0Y2hHZXRJdGVtYDsgd2hhdCB0aGUgbWVtb3J5IGxheWVyIHN0aWxsXG4gICAgLy8gc2F2ZXMgaXMgdGhlIFMzIHJlYWQgYW5kIHRoZSBwYXJzZSBvZiB0aGUgYm9keS4gQSByZXZhbGlkYXRlZCBlbnRyeSBpc1xuICAgIC8vIGRyb3BwZWQgYW5kIHJlYWQgZnJvbSBTMywgd2hpY2ggaGFuZHMgaXQgYmFjayBleHBpcmVkIG9yIGFzIGEgbWlzcy5cbiAgICBpZiAoXG4gICAgICBtZW1vcnlSZXN1bHQgJiZcbiAgICAgIChhd2FpdCB0aGlzLnMzRHluYW1vSGFuZGxlci5pc1JldmFsaWRhdGVkKFxuICAgICAgICB7XG4gICAgICAgICAgbGFzdE1vZGlmaWVkOiBtZW1vcnlSZXN1bHQubGFzdE1vZGlmaWVkLFxuICAgICAgICAgIHZhbHVlOiBtZW1vcnlSZXN1bHQudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICAgIGN0eCxcbiAgICAgICAgY2FjaGVLZXksXG4gICAgICApKVxuICAgICkge1xuICAgICAgdGhpcy5kZWJ1ZyhgTWVtb3J5IGNhY2hlIFJFVkFMSURBVEVEOiAke2NhY2hlS2V5fWApO1xuICAgICAgYXdhaXQgdGhpcy5tZW1vcnlIYW5kbGVyLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChtZW1vcnlSZXN1bHQpIHtcbiAgICAgIHRoaXMuZGVidWcoYE1lbW9yeSBjYWNoZSBISVQ6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICByZXR1cm4gbWVtb3J5UmVzdWx0O1xuICAgIH1cblxuICAgIC8vIE1lbW9yeSBtaXNzIC0gdHJ5IFMzL0R5bmFtb0RCXG4gICAgY29uc3QgczNSZXN1bHQgPSBhd2FpdCB0aGlzLnMzRHluYW1vSGFuZGxlci5nZXQoY2FjaGVLZXksIGN0eCk7XG4gICAgaWYgKHMzUmVzdWx0KSB7XG4gICAgICB0aGlzLmRlYnVnKGBTMyBjYWNoZSBISVQ6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAvLyBQcm9tb3RlZCB3aXRoIHRoZSBTMyBlbnRyeSdzIG93biBgbGFzdE1vZGlmaWVkYCwgbm90IHRoZSB0aW1lIG9mIHRoZVxuICAgICAgLy8gY29weTogTmV4dC5qcyBhZ2VzIHRoZSBlbnRyeSBmcm9tIGl0IGZvciB0aW1lLWJhc2VkIHJldmFsaWRhdGlvbiwgYW5kXG4gICAgICAvLyB0aGUgdGFnIG1hcmtlcnMgYXJlIGNvbXBhcmVkIGFnYWluc3QgaXQgdG9vLiBTdGFtcGluZyBgRGF0ZS5ub3coKWBcbiAgICAgIC8vIG1hZGUgYW4gZW50cnkgdGhhdCB3YXMgZHVlIGZvciByZWdlbmVyYXRpb24gbG9vayBmcmVzaGx5IHJlbmRlcmVkLFxuICAgICAgLy8gYW5kIG9uZSBhIHNvZnQgYHJldmFsaWRhdGVUYWdgIGhhZCBtYWRlIHN0YWxlIGxvb2sgbmV3ZXIgdGhhbiB0aGVcbiAgICAgIC8vIHN0YWxlIG1hcmssIHNvIG1lbW9yeSBoaXRzIHNlcnZlZCBpdCBhcyBmcmVzaCBmb3IgdGhlIHdob2xlIG1lbW9yeVxuICAgICAgLy8gVFRMLiBBbiBlbnRyeSBhIHRhZyByZXZhbGlkYXRpb24gZXhwaXJlZCAoYGxhc3RNb2RpZmllZDogLTFgKSBpcyBub3RcbiAgICAgIC8vIGNvcGllZCBhdCBhbGw6IHRoZSByZS1yZW5kZXIgaXQgYXNrcyBmb3Igd3JpdGVzIHRoZSBmcmVzaCBlbnRyeSB0b1xuICAgICAgLy8gYm90aCBsYXllcnMuXG4gICAgICBpZiAoczNSZXN1bHQubGFzdE1vZGlmaWVkICE9PSAtMSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1lbW9yeUhhbmRsZXIuc2V0KFxuICAgICAgICAgIGNhY2hlS2V5LFxuICAgICAgICAgIHMzUmVzdWx0LnZhbHVlLFxuICAgICAgICAgIHMzUmVzdWx0Lmxhc3RNb2RpZmllZCxcbiAgICAgICAgICBzM1Jlc3VsdC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gczNSZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1ZyhgQ2FjaGUgTUlTUzogJHtjYWNoZUtleX1gKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2FjaGUgZW50cnlcbiAgICogLSBCdWlsZCB0aW1lOiBXcml0ZSB0byBsb2NhbCBmaWxlIGNhY2hlIG9ubHkgKG9yIGRlbGV0ZSBpZiBkYXRhIGlzIG51bGwpXG4gICAqIC0gUnVudGltZTogV3JpdGUgdG8gYm90aCBtZW1vcnkgYW5kIFMzL0R5bmFtb0RCIChvciBkZWxldGUgaWYgZGF0YSBpcyBudWxsKSxcbiAgICogICB7QGxpbmsgb3V0c2lkZVJlbmRlcn1cbiAgICovXG4gIGFzeW5jIHNldChcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIGRhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSB8IG51bGwsXG4gICAgY3R4OiBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0J1aWxkVGltZSkge1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2NhbEZpbGVIYW5kbGVyLnNldChjYWNoZUtleSwgZGF0YSwgZ2V0VGFncyhjdHgpKTtcbiAgICAgICAgdGhpcy5kZWJ1ZyhgQnVpbGQgY2FjaGUgd3JpdGU6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEZWxldGUgbm90IGltcGxlbWVudGVkIGZvciBsb2NhbCBmaWxlIGNhY2hlIChidWlsZC10aW1lIG9ubHkgY3JlYXRlcyBmaWxlcylcbiAgICAgICAgdGhpcy5kZWJ1ZyhgQnVpbGQgY2FjaGUgZGVsZXRlIGlnbm9yZWQ6ICR7Y2FjaGVLZXl9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJ1bnRpbWU6IGJvdGggbGF5ZXJzLCB3aGVyZSBgbnVsbGAgaXMgYSBkZWxldGUuXG4gICAgYXdhaXQgb3V0c2lkZVJlbmRlcihhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmRlYnVnKGBDYWNoZSAke2RhdGEgPyBcIndyaXRlXCIgOiBcImRlbGV0ZVwifTogJHtjYWNoZUtleX1gKTtcbiAgICAgIGF3YWl0IHRoaXMubWVtb3J5SGFuZGxlci5zZXQoXG4gICAgICAgIGNhY2hlS2V5LFxuICAgICAgICBkYXRhLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGdldENhY2hlQ29udHJvbChjdHgpLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuczNEeW5hbW9IYW5kbGVyLnNldChjYWNoZUtleSwgZGF0YSwgY3R4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZhbGlkYXRlIHRhZ3NcbiAgICogLSBCdWlsZCB0aW1lOiBOb3QgaW1wbGVtZW50ZWRcbiAgICogLSBSdW50aW1lOiBEZWxlZ2F0ZSB0byBTMy9EeW5hbW9EQiBoYW5kbGVyLCB7QGxpbmsgb3V0c2lkZVJlbmRlcn1cbiAgICovXG4gIGFzeW5jIHJldmFsaWRhdGVUYWcoXG4gICAgdGFnOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBkdXJhdGlvbnM/OiB7IGV4cGlyZT86IG51bWJlciB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0J1aWxkVGltZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1lbW9yeSBoaXRzIGFyZSBjaGVja2VkIGFnYWluc3QgdGhlIHNhbWUgbWFya2VycyAoc2VlIGBnZXRgKSwgc28gb25seVxuICAgIC8vIHRoZSBTMy9EeW5hbW9EQiBoYW5kbGVyIGhhcyBhbnl0aGluZyB0byByZWNvcmQuXG4gICAgYXdhaXQgb3V0c2lkZVJlbmRlcigoKSA9PlxuICAgICAgdGhpcy5zM0R5bmFtb0hhbmRsZXIucmV2YWxpZGF0ZVRhZyh0YWcsIGR1cmF0aW9ucyksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxpYmVyYXRlbHkgYSBuby1vcC4gTmV4dC5qcyBjYWxscyBgcmVzZXRSZXF1ZXN0Q2FjaGVgIGF0IHRoZSBzdGFydCBvZlxuICAgKiBldmVyeSByZXF1ZXN0IChgYmFzZS1zZXJ2ZXJgLCBgYXBwLXBhZ2VgLCBgYXBwLXJvdXRlYCksIGFuZCBpdHMgb3duXG4gICAqIGBGaWxlU3lzdGVtQ2FjaGVgIC0gd2hvc2UgTFJVIGlzIHNoYXJlZCBhY3Jvc3MgcmVxdWVzdHMgdGhlIHNhbWUgd2F5IHRoZVxuICAgKiBtZW1vcnkgbGF5ZXIgaXMgLSBsZWF2ZXMgaXQgZW1wdHk6IHRoZSBob29rIGlzIGZvciBzdGF0ZSBzY29wZWQgdG8gb25lXG4gICAqIHJlcXVlc3QsIGFuZCBub3RoaW5nIGhlcmUgaXMuIENsZWFyaW5nIHRoZSBtZW1vcnkgbGF5ZXIgaW4gaXQgbWVhbnQgbm9cbiAgICogZW50cnkgZXZlciBzdXJ2aXZlZCB0byBhIHNlY29uZCByZXF1ZXN0LCBzbyBldmVyeSByZWFkIHdlbnQgdG8gUzMuXG4gICAqL1xuICBhc3luYyByZXNldFJlcXVlc3RDYWNoZSgpOiBQcm9taXNlPHZvaWQ+IHt9XG59XG4iXX0=