cdk-nextjs 0.7.10 → 0.7.12

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 (64) hide show
  1. package/.jsii +76 -22
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +59 -3
  4. package/README.md +2 -2
  5. package/docs/breaking-changes.md +32 -0
  6. package/docs/harness-coverage.md +1 -1
  7. package/docs/next-build-output-guide.md +1 -1
  8. package/docs/nextjs-private-apis.md +128 -0
  9. package/lib/adapter/adapter.mjs +276 -24
  10. package/lib/adapter/build-outputs.d.ts +1 -1
  11. package/lib/adapter/build-outputs.js +29 -13
  12. package/lib/adapter/build-outputs.test.js +35 -7
  13. package/lib/adapter/cache-handler.d.ts +1 -1
  14. package/lib/adapter/cache-handler.js +1 -1
  15. package/lib/adapter/cache-kinds.d.ts +12 -1
  16. package/lib/adapter/cache-kinds.js +16 -4
  17. package/lib/adapter/init-cache.js +7 -7
  18. package/lib/adapter/local-file-cache-handler.d.ts +1 -1
  19. package/lib/adapter/local-file-cache-handler.js +1 -1
  20. package/lib/adapter/memory-cache-handler.d.ts +2 -2
  21. package/lib/adapter/memory-cache-handler.js +1 -1
  22. package/lib/adapter/s3-cache-handler.d.ts +2 -2
  23. package/lib/adapter/s3-cache-handler.js +1 -1
  24. package/lib/adapter/use-cache-common.d.ts +1 -1
  25. package/lib/adapter/use-cache-common.js +1 -1
  26. package/lib/adapter/use-cache-common.test.js +1 -1
  27. package/lib/adapter/use-cache-default-handler.d.ts +1 -1
  28. package/lib/adapter/use-cache-default-handler.js +1 -1
  29. package/lib/adapter/use-cache-handlers.test.js +1 -1
  30. package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
  31. package/lib/adapter/use-cache-remote-handler.js +1 -1
  32. package/lib/cdk-nextjs-version.d.ts +10 -0
  33. package/lib/cdk-nextjs-version.js +15 -0
  34. package/lib/nextjs-api.js +1 -1
  35. package/lib/nextjs-build/nextjs-build.js +7 -6
  36. package/lib/nextjs-build/nextjs-build.test.js +16 -3
  37. package/lib/nextjs-cache.js +1 -1
  38. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  39. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  40. package/lib/nextjs-distribution.js +5 -5
  41. package/lib/nextjs-post-deploy.js +1 -1
  42. package/lib/nextjs-static-assets.d.ts +74 -5
  43. package/lib/nextjs-static-assets.js +276 -41
  44. package/lib/nextjs-static-assets.test.js +286 -1
  45. package/lib/root-constructs/nextjs-base-construct.d.ts +5 -4
  46. package/lib/root-constructs/nextjs-base-construct.js +17 -8
  47. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  48. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  49. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  50. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  51. package/lib/runtime/core.test.js +17 -8
  52. package/lib/runtime/dispatch.js +4 -5
  53. package/lib/runtime/image-utils.d.ts +1 -0
  54. package/lib/runtime/image-utils.js +2 -1
  55. package/lib/runtime/image-utils.test.js +17 -1
  56. package/lib/runtime/image.js +47 -33
  57. package/lib/runtime/image.test.js +47 -26
  58. package/lib/runtime/lambda.mjs +281 -37
  59. package/lib/runtime/manifest.d.ts +34 -8
  60. package/lib/runtime/manifest.js +7 -5
  61. package/lib/runtime/server.mjs +281 -37
  62. package/package.json +1 -1
  63. package/scripts/capture-adapter-fixture.mjs +13 -1
  64. package/scripts/zero-config-build.mjs +5 -1
@@ -5,6 +5,10 @@ const node_fs_1 = require("node:fs");
5
5
  const node_os_1 = require("node:os");
6
6
  const node_path_1 = require("node:path");
7
7
  const aws_cdk_lib_1 = require("aws-cdk-lib");
8
+ const assertions_1 = require("aws-cdk-lib/assertions");
9
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
10
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
11
+ const cx_api_1 = require("aws-cdk-lib/cx-api");
8
12
  const nextjs_static_assets_1 = require("./nextjs-static-assets");
9
13
  describe("NextjsStaticAssets", () => {
10
14
  let stack;
@@ -73,5 +77,286 @@ describe("NextjsStaticAssets", () => {
73
77
  expect(staticAssets.keyPrefix).toBe("base");
74
78
  });
75
79
  });
80
+ describe("Cache-Control", () => {
81
+ const IMMUTABLE = "public, max-age=31536000, immutable";
82
+ /** The deployment resources' properties, by construct ID. */
83
+ function deployments() {
84
+ const resources = assertions_1.Template.fromStack(stack).findResources("Custom::CDKBucketDeployment");
85
+ return Object.fromEntries(Object.entries(resources).map(([logicalId, resource]) => [
86
+ logicalId.match(/NextjsStaticAssets(\w+?)CustomResource/)[1],
87
+ resource.Properties,
88
+ ]));
89
+ }
90
+ function writePublicFile() {
91
+ const publicDir = (0, node_path_1.join)(buildDirectory, "public");
92
+ (0, node_fs_1.mkdirSync)(publicDir, { recursive: true });
93
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(publicDir, "logo.png"), "png");
94
+ }
95
+ // CloudFront and API Gateway serve these straight from S3, so the
96
+ // object's metadata is the only Cache-Control a browser gets.
97
+ it("uploads _next/static immutable and public/ without a header", () => {
98
+ writePublicFile();
99
+ const staticAssets = createStaticAssets({});
100
+ expect(staticAssets.staticDeployment).toBeDefined();
101
+ expect(staticAssets.publicDeployment).toBeDefined();
102
+ const { Deployment: staticUpload, PublicDeployment: publicUpload } = deployments();
103
+ expect(staticUpload.SystemMetadata).toEqual({
104
+ "cache-control": IMMUTABLE,
105
+ });
106
+ expect(publicUpload.SystemMetadata).toBeUndefined();
107
+ for (const upload of [staticUpload, publicUpload]) {
108
+ expect(upload.UserMetadata).toEqual({ build_id: "test-build-id" });
109
+ }
110
+ });
111
+ it("applies an overridden cacheControl to public/ files only", () => {
112
+ writePublicFile();
113
+ new nextjs_static_assets_1.NextjsStaticAssets(stack, "NextjsStaticAssets", {
114
+ buildDirectory,
115
+ buildId: "test-build-id",
116
+ overrides: {
117
+ bucketDeploymentProps: {
118
+ cacheControl: [aws_s3_deployment_1.CacheControl.fromString("public, max-age=3600")],
119
+ },
120
+ },
121
+ });
122
+ const { Deployment: staticUpload, PublicDeployment: publicUpload } = deployments();
123
+ expect(staticUpload.SystemMetadata).toEqual({
124
+ "cache-control": IMMUTABLE,
125
+ });
126
+ expect(publicUpload.SystemMetadata).toEqual({
127
+ "cache-control": "public, max-age=3600",
128
+ });
129
+ });
130
+ it("creates only the _next/static upload without a public/ directory", () => {
131
+ const staticAssets = createStaticAssets({ basePath: "/base" });
132
+ expect(staticAssets.publicDeployment).toBeUndefined();
133
+ expect(staticAssets.deployment).toBe(staticAssets.staticDeployment);
134
+ const uploads = deployments();
135
+ expect(Object.keys(uploads)).toEqual(["Deployment"]);
136
+ expect(uploads.Deployment.DestinationBucketKeyPrefix).toBe("base");
137
+ });
138
+ /**
139
+ * Keeps the staging directories, which are otherwise removed once CDK has
140
+ * copied them into `cdk.out`, so `stagedDir` can look inside them.
141
+ */
142
+ function keepStaging() {
143
+ stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App({ context: { [cx_api_1.DISABLE_ASSET_STAGING_CONTEXT]: true } }), "TestStack");
144
+ }
145
+ /** The directory a deployment uploads, for checking what was staged. */
146
+ function stagedDir(deployment) {
147
+ // The deployment's own source asset, not the AWS CLI layer's.
148
+ return deployment.node
149
+ .findAll()
150
+ .filter((c) => c instanceof aws_cdk_lib_1.AssetStaging)
151
+ .map((c) => c.sourcePath)
152
+ .find((path) => path.includes("nextjs-assets-"));
153
+ }
154
+ // `next start` serves the built file over a public/ one at the same path,
155
+ // and the public/ one everywhere else.
156
+ it("leaves out only the public/_next/static files a built file shadows", () => {
157
+ keepStaging();
158
+ writePublicFile();
159
+ const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
160
+ (0, node_fs_1.mkdirSync)(shadowDir, { recursive: true });
161
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "chunk.js"), "// shadowed");
162
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "legacy.js"), "// public only");
163
+ const staticAssets = createStaticAssets({});
164
+ const staged = stagedDir(staticAssets.publicDeployment);
165
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "logo.png"))).toBe(true);
166
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunk.js"))).toBe(false);
167
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "legacy.js"))).toBe(true);
168
+ });
169
+ // Next.js and S3 keys are case-sensitive, even where the filesystem isn't.
170
+ it("doesn't treat a public/_next/static file as shadowed by another case", () => {
171
+ keepStaging();
172
+ const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
173
+ (0, node_fs_1.mkdirSync)(shadowDir, { recursive: true });
174
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "Chunk.js"), "// public only");
175
+ const staticAssets = createStaticAssets({});
176
+ const staged = stagedDir(staticAssets.publicDeployment);
177
+ expect((0, node_fs_1.readdirSync)((0, node_path_1.join)(staged, "_next", "static"))).toEqual([
178
+ "Chunk.js",
179
+ ]);
180
+ });
181
+ it("uploads a .next/static/service-worker file with the other assets", () => {
182
+ keepStaging();
183
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(buildDirectory, ".next", "static", "service-worker"), "// not a directory");
184
+ const staticAssets = createStaticAssets({});
185
+ expect(staticAssets.serviceWorkerDeployment).toBeUndefined();
186
+ const staged = stagedDir(staticAssets.staticDeployment);
187
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "service-worker"))).toBe(true);
188
+ });
189
+ it("uploads a public/ made only of symlinks", () => {
190
+ const target = (0, node_path_1.join)(buildDirectory, "logo.png");
191
+ (0, node_fs_1.writeFileSync)(target, "png");
192
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(buildDirectory, "public"));
193
+ (0, node_fs_1.symlinkSync)(target, (0, node_path_1.join)(buildDirectory, "public", "logo.png"));
194
+ const staticAssets = createStaticAssets({});
195
+ expect(staticAssets.publicDeployment).toBeDefined();
196
+ });
197
+ // A service worker keeps its URL across builds, so Next.js serves it
198
+ // revalidated rather than immutable.
199
+ it("uploads service workers with max-age=0, must-revalidate", () => {
200
+ keepStaging();
201
+ const swDir = (0, node_path_1.join)(buildDirectory, ".next", "static", "service-worker");
202
+ (0, node_fs_1.mkdirSync)(swDir, { recursive: true });
203
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(swDir, "sw.js"), "// sw");
204
+ const staticAssets = createStaticAssets({});
205
+ const { Deployment: staticUpload, ServiceWorkerDeployment: swUpload } = deployments();
206
+ expect(swUpload.SystemMetadata).toEqual({
207
+ "cache-control": "public, max-age=0, must-revalidate",
208
+ });
209
+ expect(staticUpload.SystemMetadata).toEqual({
210
+ "cache-control": IMMUTABLE,
211
+ });
212
+ const swStaged = stagedDir(staticAssets.serviceWorkerDeployment);
213
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(swStaged, "_next", "static", "service-worker", "sw.js"))).toBe(true);
214
+ const staticStaged = stagedDir(staticAssets.staticDeployment);
215
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staticStaged, "_next", "static", "chunk.js"))).toBe(true);
216
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staticStaged, "_next", "static", "service-worker"))).toBe(false);
217
+ });
218
+ it("stages a symlinked .next/static", () => {
219
+ keepStaging();
220
+ const realStatic = (0, node_path_1.join)(buildDirectory, "real-static");
221
+ (0, node_fs_1.renameSync)((0, node_path_1.join)(buildDirectory, ".next", "static"), realStatic);
222
+ (0, node_fs_1.symlinkSync)(realStatic, (0, node_path_1.join)(buildDirectory, ".next", "static"));
223
+ const staticAssets = createStaticAssets({});
224
+ const staged = stagedDir(staticAssets.staticDeployment);
225
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunk.js"))).toBe(true);
226
+ });
227
+ // CDK uploads the files a linked directory holds, so they shadow too.
228
+ it("treats files under a symlinked .next/static directory as shadowing", () => {
229
+ keepStaging();
230
+ const realChunks = (0, node_path_1.join)(buildDirectory, "real-chunks");
231
+ (0, node_fs_1.mkdirSync)(realChunks);
232
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(realChunks, "a.js"), "// built");
233
+ (0, node_fs_1.symlinkSync)(realChunks, (0, node_path_1.join)(buildDirectory, ".next", "static", "chunks"));
234
+ const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
235
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(shadowDir, "chunks"), { recursive: true });
236
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "chunks", "a.js"), "// shadowed");
237
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(buildDirectory, "public", "logo.png"), "png");
238
+ const staticAssets = createStaticAssets({});
239
+ const staged = stagedDir(staticAssets.publicDeployment);
240
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunks", "a.js"))).toBe(false);
241
+ });
242
+ // CDK uploads a directory under every name a link gives it.
243
+ it("treats files reached through a second name as shadowing", () => {
244
+ keepStaging();
245
+ const builtStatic = (0, node_path_1.join)(buildDirectory, ".next", "static");
246
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(builtStatic, "chunks"));
247
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(builtStatic, "chunks", "a.js"), "// built");
248
+ (0, node_fs_1.symlinkSync)((0, node_path_1.join)(builtStatic, "chunks"), (0, node_path_1.join)(builtStatic, "alias"));
249
+ const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
250
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(shadowDir, "alias"), { recursive: true });
251
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "alias", "a.js"), "// shadowed");
252
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(buildDirectory, "public", "logo.png"), "png");
253
+ const staticAssets = createStaticAssets({});
254
+ const staged = stagedDir(staticAssets.publicDeployment);
255
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "alias", "a.js"))).toBe(false);
256
+ });
257
+ it("leaves out a shadowed file under a symlinked public/ directory", () => {
258
+ keepStaging();
259
+ const linked = (0, node_path_1.join)(buildDirectory, "linked-static");
260
+ (0, node_fs_1.mkdirSync)(linked);
261
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(linked, "chunk.js"), "// shadowed");
262
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(linked, "legacy.js"), "// public only");
263
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(buildDirectory, "public", "_next"), { recursive: true });
264
+ (0, node_fs_1.symlinkSync)(linked, (0, node_path_1.join)(buildDirectory, "public", "_next", "static"));
265
+ const staticAssets = createStaticAssets({});
266
+ const staged = stagedDir(staticAssets.publicDeployment);
267
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunk.js"))).toBe(false);
268
+ expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "legacy.js"))).toBe(true);
269
+ });
270
+ it("lists a .next/static holding a link loop", () => {
271
+ const builtStatic = (0, node_path_1.join)(buildDirectory, ".next", "static");
272
+ (0, node_fs_1.symlinkSync)((0, node_path_1.join)(builtStatic, "loop"), (0, node_path_1.join)(builtStatic, "loop"));
273
+ writePublicFile();
274
+ expect(() => createStaticAssets({})).not.toThrow(/ELOOP/);
275
+ });
276
+ it("removes the staging directories when a deployment fails", () => {
277
+ writePublicFile();
278
+ const before = new Set((0, node_fs_1.readdirSync)((0, node_os_1.tmpdir)()));
279
+ jest
280
+ .spyOn(nextjs_static_assets_1.NextjsStaticAssets.prototype, "createDeployment")
281
+ .mockImplementation(() => {
282
+ throw new Error("deployment failed");
283
+ });
284
+ try {
285
+ expect(() => createStaticAssets({})).toThrow("deployment failed");
286
+ }
287
+ finally {
288
+ jest.restoreAllMocks();
289
+ }
290
+ const leaked = (0, node_fs_1.readdirSync)((0, node_os_1.tmpdir)()).filter((name) => name.startsWith("nextjs-assets-") && !before.has(name));
291
+ expect(leaked).toEqual([]);
292
+ });
293
+ it("removes its staging directories once CDK has copied them", () => {
294
+ writePublicFile();
295
+ const staticAssets = createStaticAssets({});
296
+ for (const upload of [
297
+ staticAssets.staticDeployment,
298
+ staticAssets.publicDeployment,
299
+ ]) {
300
+ expect((0, node_fs_1.existsSync)(stagedDir(upload))).toBe(false);
301
+ }
302
+ });
303
+ // The asset manifest then points at the staging directory itself.
304
+ it("keeps them when asset staging is disabled", () => {
305
+ keepStaging();
306
+ const staticAssets = createStaticAssets({});
307
+ expect((0, node_fs_1.existsSync)(stagedDir(staticAssets.staticDeployment))).toBe(true);
308
+ });
309
+ it("falls back to the public/ upload for a build without .next/static", () => {
310
+ (0, node_fs_1.rmSync)((0, node_path_1.join)(buildDirectory, ".next"), { recursive: true, force: true });
311
+ writePublicFile();
312
+ const staticAssets = createStaticAssets({});
313
+ expect(staticAssets.staticDeployment).toBeUndefined();
314
+ expect(staticAssets.deployment).toBe(staticAssets.publicDeployment);
315
+ expect(Object.keys(deployments())).toEqual(["PublicDeployment"]);
316
+ });
317
+ });
318
+ describe("bucketDeploymentProps that would break the other uploads", () => {
319
+ function withOverrides(bucketDeploymentProps) {
320
+ return () => new nextjs_static_assets_1.NextjsStaticAssets(stack, "NextjsStaticAssets", {
321
+ buildDirectory,
322
+ buildId: "test-build-id",
323
+ overrides: { bucketDeploymentProps: bucketDeploymentProps },
324
+ });
325
+ }
326
+ it("rejects prune: true", () => {
327
+ expect(withOverrides({ prune: true })).toThrow(/`prune: true`/);
328
+ });
329
+ // CDK's Update path deletes the old prefix without checking the bucket's
330
+ // owner, racing the other uploads, so no bucket is safe.
331
+ it("rejects retainOnDelete: false", () => {
332
+ expect(withOverrides({ retainOnDelete: false })).toThrow(/`retainOnDelete: false`/);
333
+ });
334
+ // The type requires both, so a typed caller always passes them.
335
+ it("ignores sources and destinationBucket", () => {
336
+ const other = aws_s3_1.Bucket.fromBucketName(stack, "Other", "other");
337
+ new nextjs_static_assets_1.NextjsStaticAssets(stack, "NextjsStaticAssets", {
338
+ buildDirectory,
339
+ buildId: "test-build-id",
340
+ overrides: {
341
+ bucketDeploymentProps: {
342
+ sources: [],
343
+ destinationBucket: other,
344
+ cacheControl: [aws_s3_deployment_1.CacheControl.fromString("public, max-age=60")],
345
+ },
346
+ },
347
+ });
348
+ const [upload] = Object.values(assertions_1.Template.fromStack(stack).findResources("Custom::CDKBucketDeployment"));
349
+ expect(upload.Properties.SourceObjectKeys).toHaveLength(1);
350
+ expect(JSON.stringify(upload.Properties.DestinationBucketName)).toContain("NextjsStaticAssetsBucket");
351
+ });
352
+ // A JSII binding can materialize an unset field as an explicit undefined.
353
+ it("allows the fields when they are explicitly undefined", () => {
354
+ expect(withOverrides({ prune: undefined, sources: undefined })).not.toThrow();
355
+ // Not CDK's default `prune: true`, nor a deployment with no sources.
356
+ const [upload] = Object.values(assertions_1.Template.fromStack(stack).findResources("Custom::CDKBucketDeployment"));
357
+ expect(upload.Properties.Prune).toBe(false);
358
+ expect(upload.Properties.SourceObjectKeys).toHaveLength(1);
359
+ });
360
+ });
76
361
  });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtc3RhdGljLWFzc2V0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELHFDQUF3RTtBQUN4RSxxQ0FBaUM7QUFDakMseUNBQWlDO0FBQ2pDLDZDQUF5QztBQUN6QyxpRUFBNEQ7QUFFNUQsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLEtBQVksQ0FBQztJQUNqQixJQUFJLGNBQXNCLENBQUM7SUFFM0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUMsY0FBYyxHQUFHLElBQUEscUJBQVcsRUFBQyxJQUFBLGdCQUFJLEVBQUMsSUFBQSxnQkFBTSxHQUFFLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sU0FBUyxHQUFHLElBQUEsZ0JBQUksRUFBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUEsbUJBQVMsRUFBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFBLHVCQUFhLEVBQUMsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFBLGdCQUFNLEVBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsa0JBQWtCLENBQUMsS0FHM0I7UUFDQyxPQUFPLElBQUkseUNBQWtCLENBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFO1lBQ3pELGNBQWM7WUFDZCxPQUFPLEVBQUUsZUFBZTtZQUN4QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsU0FBUyxFQUNQLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxTQUFTO2dCQUN0QyxDQUFDLENBQUMsU0FBUztnQkFDWCxDQUFDLENBQUM7b0JBQ0UscUJBQXFCLEVBQUU7d0JBQ3JCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7cUJBQzFDO2lCQUNUO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7WUFDbEQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLHNFQUFzRTtRQUN0RSxrREFBa0Q7UUFDbEQsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEdBQUcsRUFBRTtZQUN2RSxNQUFNLENBQ0osa0JBQWtCLENBQUM7Z0JBQ2pCLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixvQkFBb0IsRUFBRSxVQUFVO2FBQ2pDLENBQUMsQ0FBQyxTQUFTLENBQ2IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1lBQ3JELE1BQU0sQ0FDSixrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxFQUFFLENBQUM7aUJBQ2hFLFNBQVMsQ0FDYixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSw2RUFBNkU7UUFDN0UsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSxpQkFBaUI7UUFDakIsRUFBRSxDQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtZQUMvRSxNQUFNLFlBQVksR0FBRyxJQUFJLHlDQUFrQixDQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRTtnQkFDdkUsY0FBYztnQkFDZCxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFNBQVMsRUFBRTtvQkFDVCxxQkFBcUIsRUFBRTt3QkFDckIsb0JBQW9CLEVBQUUsU0FBUztxQkFDekI7aUJBQ1Q7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IG1rZGlyU3luYywgbWtkdGVtcFN5bmMsIHJtU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IEFwcCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IE5leHRqc1N0YXRpY0Fzc2V0cyB9IGZyb20gXCIuL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5cbmRlc2NyaWJlKFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsICgpID0+IHtcbiAgbGV0IHN0YWNrOiBTdGFjaztcbiAgbGV0IGJ1aWxkRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiKTtcbiAgICBidWlsZERpcmVjdG9yeSA9IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFwibmV4dGpzLXN0YXRpYy1hc3NldHMtXCIpKTtcbiAgICBjb25zdCBzdGF0aWNEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgIG1rZGlyU3luYyhzdGF0aWNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihzdGF0aWNEaXIsIFwiY2h1bmsuanNcIiksIFwiLy8gY2h1bmtcIik7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgcm1TeW5jKGJ1aWxkRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0Fzc2V0cyhwcm9wczoge1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4Pzogc3RyaW5nO1xuICB9KSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNTdGF0aWNBc3NldHMoc3RhY2ssIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgIGJ1aWxkRGlyZWN0b3J5LFxuICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICBiYXNlUGF0aDogcHJvcHMuYmFzZVBhdGgsXG4gICAgICBvdmVycmlkZXM6XG4gICAgICAgIHByb3BzLmRlc3RpbmF0aW9uS2V5UHJlZml4ID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBidWNrZXREZXBsb3ltZW50UHJvcHM6IHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogcHJvcHMuZGVzdGluYXRpb25LZXlQcmVmaXgsXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGRlc2NyaWJlKFwia2V5UHJlZml4XCIsICgpID0+IHtcbiAgICBpdChcImlzIGVtcHR5IHdoZW4gbm8gYmFzZVBhdGggaXMgc2V0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChjcmVhdGVTdGF0aWNBc3NldHMoe30pLmtleVByZWZpeCkudG9CZShcIlwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic3RyaXBzIHN1cnJvdW5kaW5nIHNsYXNoZXMgZnJvbSBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY3JlYXRlU3RhdGljQXNzZXRzKHsgYmFzZVBhdGg6IFwiL2Jhc2UvXCIgfSkua2V5UHJlZml4KS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBvdmVycmlkZSBpcyBzcHJlYWQgbGFzdCBpbnRvIEJ1Y2tldERlcGxveW1lbnQsIHNvIGl0IGRlY2lkZXMgd2hlcmVcbiAgICAvLyB0aGUgb2JqZWN0cyBhY3R1YWxseSBsYW5kLiBDb25zdW1lcnMgcmVhZGluZyBhc3NldHMgYmFjayBvdXQgb2YgdGhlXG4gICAgLy8gYnVja2V0IGhhdmUgdG8gc2VlIHRoYXQsIG5vdCB0aGUgYmFzZVBhdGggcHJvcC5cbiAgICBpdChcInJlZmxlY3RzIGEgZGVzdGluYXRpb25LZXlQcmVmaXggb3ZlcnJpZGUgcmF0aGVyIHRoYW4gYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjcmVhdGVTdGF0aWNBc3NldHMoe1xuICAgICAgICAgIGJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IFwiYnJhbmNoLXhcIixcbiAgICAgICAgfSkua2V5UHJlZml4LFxuICAgICAgKS50b0JlKFwiYnJhbmNoLXhcIik7XG4gICAgfSk7XG5cbiAgICBpdChcImlzIGVtcHR5IHdoZW4gYW4gb3ZlcnJpZGUgY2xlYXJzIHRoZSBwcmVmaXhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjcmVhdGVTdGF0aWNBc3NldHMoeyBiYXNlUGF0aDogXCIvYmFzZVwiLCBkZXN0aW5hdGlvbktleVByZWZpeDogXCJcIiB9KVxuICAgICAgICAgIC5rZXlQcmVmaXgsXG4gICAgICApLnRvQmUoXCJcIik7XG4gICAgfSk7XG5cbiAgICAvLyBBIEpTSUkgbGFuZ3VhZ2UgYmluZGluZywgb3IgYSBwcm9ncmFtbWF0aWNhbGx5IGJ1aWx0IHByb3BzIG9iamVjdCwgY2FuXG4gICAgLy8gbWF0ZXJpYWxpemUgYW4gdW5zZXQgb3B0aW9uYWwgZmllbGQgYXMgYW4gZXhwbGljaXQgYHVuZGVmaW5lZGAuIFRyZWF0aW5nXG4gICAgLy8gdGhhdCBhcyBhbiBpbnRlbnRpb25hbCBcIm1vdmUgdGhlIGFzc2V0cyB0byB0aGUgYnVja2V0IHJvb3RcIiBvdmVycmlkZSB3b3VsZFxuICAgIC8vIHVwbG9hZCB0aGVtIHRoZXJlIHdoaWxlIENsb3VkRnJvbnQgc3RpbGwgcmVxdWVzdGVkIHRoZW0gdW5kZXIgYmFzZVBhdGgsXG4gICAgLy8gZmFpbGluZyBzeW50aCB3aXRoIGEga2V5IHByZWZpeCBtaXNtYXRjaCB0aGF0IG5hbWVzIG5laXRoZXIgdGhlIG92ZXJyaWRlXG4gICAgLy8gbm9yIHRoZSBjYXVzZS5cbiAgICBpdChcImZhbGxzIGJhY2sgdG8gYmFzZVBhdGggd2hlbiB0aGUgb3ZlcnJpZGUga2V5IGlzIHByZXNlbnQgYnV0IHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHN0YWNrLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICAgIGJ1aWxkRGlyZWN0b3J5LFxuICAgICAgICBidWlsZElkOiBcInRlc3QtYnVpbGQtaWRcIixcbiAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgYnVja2V0RGVwbG95bWVudFByb3BzOiB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMua2V5UHJlZml4KS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
362
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtc3RhdGljLWFzc2V0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELHFDQVNpQjtBQUNqQixxQ0FBaUM7QUFDakMseUNBQWlDO0FBQ2pDLDZDQUF1RDtBQUN2RCx1REFBa0Q7QUFDbEQsK0NBQTRDO0FBQzVDLHFFQUErRTtBQUMvRSwrQ0FBbUU7QUFDbkUsaUVBQTREO0FBRTVELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxjQUFzQixDQUFDO0lBRTNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLElBQUksaUJBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLGNBQWMsR0FBRyxJQUFBLHFCQUFXLEVBQUMsSUFBQSxnQkFBSSxFQUFDLElBQUEsZ0JBQU0sR0FBRSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRCxJQUFBLG1CQUFTLEVBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBQSx1QkFBYSxFQUFDLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBQSxnQkFBTSxFQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFD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Q0FBQyw2QkFBNkIsQ0FBQyxDQUN2RSxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUN2RSwwQkFBMEIsQ0FDM0IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsMEVBQTBFO1FBQzFFLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxDQUNKLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQ3hELENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLHFFQUFxRTtZQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDNUIscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQ3ZFLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgcm1TeW5jLFxuICBzeW1saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQXBwLCBBc3NldFN0YWdpbmcsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBDYWNoZUNvbnRyb2wgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IERJU0FCTEVfQVNTRVRfU1RBR0lOR19DT05URVhUIH0gZnJvbSBcImF3cy1jZGstbGliL2N4LWFwaVwiO1xuaW1wb3J0IHsgTmV4dGpzU3RhdGljQXNzZXRzIH0gZnJvbSBcIi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcblxuZGVzY3JpYmUoXCJOZXh0anNTdGF0aWNBc3NldHNcIiwgKCkgPT4ge1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksIFwiVGVzdFN0YWNrXCIpO1xuICAgIGJ1aWxkRGlyZWN0b3J5ID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJuZXh0anMtc3RhdGljLWFzc2V0cy1cIikpO1xuICAgIGNvbnN0IHN0YXRpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwiLm5leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgbWtkaXJTeW5jKHN0YXRpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHN0YXRpY0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBjaHVua1wiKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmMoYnVpbGREaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdGljQXNzZXRzKHByb3BzOiB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZGVzdGluYXRpb25LZXlQcmVmaXg/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICBidWlsZElkOiBcInRlc3QtYnVpbGQtaWRcIixcbiAgICAgIGJhc2VQYXRoOiBwcm9wcy5iYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczpcbiAgICAgICAgcHJvcHMuZGVzdGluYXRpb25LZXlQcmVmaXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBwcm9wcy5kZXN0aW5hdGlvbktleVByZWZpeCxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZGVzY3JpYmUoXCJrZXlQcmVmaXhcIiwgKCkgPT4ge1xuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBubyBiYXNlUGF0aCBpcyBzZXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSkua2V5UHJlZml4KS50b0JlKFwiXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdHJpcHMgc3Vycm91bmRpbmcgc2xhc2hlcyBmcm9tIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChjcmVhdGVTdGF0aWNBc3NldHMoeyBiYXNlUGF0aDogXCIvYmFzZS9cIiB9KS5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG92ZXJyaWRlIGlzIHNwcmVhZCBsYXN0IGludG8gQnVja2V0RGVwbG95bWVudCwgc28gaXQgZGVjaWRlcyB3aGVyZVxuICAgIC8vIHRoZSBvYmplY3RzIGFjdHVhbGx5IGxhbmQuIENvbnN1bWVycyByZWFkaW5nIGFzc2V0cyBiYWNrIG91dCBvZiB0aGVcbiAgICAvLyBidWNrZXQgaGF2ZSB0byBzZWUgdGhhdCwgbm90IHRoZSBiYXNlUGF0aCBwcm9wLlxuICAgIGl0KFwicmVmbGVjdHMgYSBkZXN0aW5hdGlvbktleVByZWZpeCBvdmVycmlkZSByYXRoZXIgdGhhbiBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7XG4gICAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogXCJicmFuY2gteFwiLFxuICAgICAgICB9KS5rZXlQcmVmaXgsXG4gICAgICApLnRvQmUoXCJicmFuY2gteFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBhbiBvdmVycmlkZSBjbGVhcnMgdGhlIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIsIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBcIlwiIH0pXG4gICAgICAgICAgLmtleVByZWZpeCxcbiAgICAgICkudG9CZShcIlwiKTtcbiAgICB9KTtcblxuICAgIC8vIEEgSlNJSSBsYW5ndWFnZSBiaW5kaW5nLCBvciBhIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQgcHJvcHMgb2JqZWN0LCBjYW5cbiAgICAvLyBtYXRlcmlhbGl6ZSBhbiB1bnNldCBvcHRpb25hbCBmaWVsZCBhcyBhbiBleHBsaWNpdCBgdW5kZWZpbmVkYC4gVHJlYXRpbmdcbiAgICAvLyB0aGF0IGFzIGFuIGludGVudGlvbmFsIFwibW92ZSB0aGUgYXNzZXRzIHRvIHRoZSBidWNrZXQgcm9vdFwiIG92ZXJyaWRlIHdvdWxkXG4gICAgLy8gdXBsb2FkIHRoZW0gdGhlcmUgd2hpbGUgQ2xvdWRGcm9udCBzdGlsbCByZXF1ZXN0ZWQgdGhlbSB1bmRlciBiYXNlUGF0aCxcbiAgICAvLyBmYWlsaW5nIHN5bnRoIHdpdGggYSBrZXkgcHJlZml4IG1pc21hdGNoIHRoYXQgbmFtZXMgbmVpdGhlciB0aGUgb3ZlcnJpZGVcbiAgICAvLyBub3IgdGhlIGNhdXNlLlxuICAgIGl0KFwiZmFsbHMgYmFjayB0byBiYXNlUGF0aCB3aGVuIHRoZSBvdmVycmlkZSBrZXkgaXMgcHJlc2VudCBidXQgdW5kZWZpbmVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IG5ldyBOZXh0anNTdGF0aWNBc3NldHMoc3RhY2ssIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgIGJ1aWxkSWQ6IFwidGVzdC1idWlsZC1pZFwiLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICBidWNrZXREZXBsb3ltZW50UHJvcHM6IHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiB1bmRlZmluZWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkNhY2hlLUNvbnRyb2xcIiwgKCkgPT4ge1xuICAgIGNvbnN0IElNTVVUQUJMRSA9IFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGVcIjtcblxuICAgIC8qKiBUaGUgZGVwbG95bWVudCByZXNvdXJjZXMnIHByb3BlcnRpZXMsIGJ5IGNvbnN0cnVjdCBJRC4gKi9cbiAgICBmdW5jdGlvbiBkZXBsb3ltZW50cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgICAgXCJDdXN0b206OkNES0J1Y2tldERlcGxveW1lbnRcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvdXJjZXMpLm1hcCgoW2xvZ2ljYWxJZCwgcmVzb3VyY2VdKSA9PiBbXG4gICAgICAgICAgbG9naWNhbElkLm1hdGNoKC9OZXh0anNTdGF0aWNBc3NldHMoXFx3Kz8pQ3VzdG9tUmVzb3VyY2UvKSFbMV0sXG4gICAgICAgICAgcmVzb3VyY2UuUHJvcGVydGllcyxcbiAgICAgICAgXSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdyaXRlUHVibGljRmlsZSgpIHtcbiAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgICAgbWtkaXJTeW5jKHB1YmxpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4ocHVibGljRGlyLCBcImxvZ28ucG5nXCIpLCBcInBuZ1wiKTtcbiAgICB9XG5cbiAgICAvLyBDbG91ZEZyb250IGFuZCBBUEkgR2F0ZXdheSBzZXJ2ZSB0aGVzZSBzdHJhaWdodCBmcm9tIFMzLCBzbyB0aGVcbiAgICAvLyBvYmplY3QncyBtZXRhZGF0YSBpcyB0aGUgb25seSBDYWNoZS1Db250cm9sIGEgYnJvd3NlciBnZXRzLlxuICAgIGl0KFwidXBsb2FkcyBfbmV4dC9zdGF0aWMgaW1tdXRhYmxlIGFuZCBwdWJsaWMvIHdpdGhvdXQgYSBoZWFkZXJcIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBjb25zdCB7IERlcGxveW1lbnQ6IHN0YXRpY1VwbG9hZCwgUHVibGljRGVwbG95bWVudDogcHVibGljVXBsb2FkIH0gPVxuICAgICAgICBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwdWJsaWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGZvciAoY29uc3QgdXBsb2FkIG9mIFtzdGF0aWNVcGxvYWQsIHB1YmxpY1VwbG9hZF0pIHtcbiAgICAgICAgZXhwZWN0KHVwbG9hZC5Vc2VyTWV0YWRhdGEpLnRvRXF1YWwoeyBidWlsZF9pZDogXCJ0ZXN0LWJ1aWxkLWlkXCIgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcImFwcGxpZXMgYW4gb3ZlcnJpZGRlbiBjYWNoZUNvbnRyb2wgdG8gcHVibGljLyBmaWxlcyBvbmx5XCIsICgpID0+IHtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBbQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoXCJwdWJsaWMsIG1heC1hZ2U9MzYwMFwiKV0sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFB1YmxpY0RlcGxveW1lbnQ6IHB1YmxpY1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvRXF1YWwoe1xuICAgICAgICBcImNhY2hlLWNvbnRyb2xcIjogSU1NVVRBQkxFLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocHVibGljVXBsb2FkLlN5c3RlbU1ldGFkYXRhKS50b0VxdWFsKHtcbiAgICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTM2MDBcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJjcmVhdGVzIG9ubHkgdGhlIF9uZXh0L3N0YXRpYyB1cGxvYWQgd2l0aG91dCBhIHB1YmxpYy8gZGlyZWN0b3J5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5kZXBsb3ltZW50KS50b0JlKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50KTtcbiAgICAgIGNvbnN0IHVwbG9hZHMgPSBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHVwbG9hZHMpKS50b0VxdWFsKFtcIkRlcGxveW1lbnRcIl0pO1xuICAgICAgZXhwZWN0KHVwbG9hZHMuRGVwbG95bWVudC5EZXN0aW5hdGlvbkJ1Y2tldEtleVByZWZpeCkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBLZWVwcyB0aGUgc3RhZ2luZyBkaXJlY3Rvcmllcywgd2hpY2ggYXJlIG90aGVyd2lzZSByZW1vdmVkIG9uY2UgQ0RLIGhhc1xuICAgICAqIGNvcGllZCB0aGVtIGludG8gYGNkay5vdXRgLCBzbyBgc3RhZ2VkRGlyYCBjYW4gbG9vayBpbnNpZGUgdGhlbS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZWVwU3RhZ2luZygpIHtcbiAgICAgIHN0YWNrID0gbmV3IFN0YWNrKFxuICAgICAgICBuZXcgQXBwKHsgY29udGV4dDogeyBbRElTQUJMRV9BU1NFVF9TVEFHSU5HX0NPTlRFWFRdOiB0cnVlIH0gfSksXG4gICAgICAgIFwiVGVzdFN0YWNrXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKiBUaGUgZGlyZWN0b3J5IGEgZGVwbG95bWVudCB1cGxvYWRzLCBmb3IgY2hlY2tpbmcgd2hhdCB3YXMgc3RhZ2VkLiAqL1xuICAgIGZ1bmN0aW9uIHN0YWdlZERpcihkZXBsb3ltZW50OiBCdWNrZXREZXBsb3ltZW50KTogc3RyaW5nIHtcbiAgICAgIC8vIFRoZSBkZXBsb3ltZW50J3Mgb3duIHNvdXJjZSBhc3NldCwgbm90IHRoZSBBV1MgQ0xJIGxheWVyJ3MuXG4gICAgICByZXR1cm4gZGVwbG95bWVudC5ub2RlXG4gICAgICAgIC5maW5kQWxsKClcbiAgICAgICAgLmZpbHRlcigoYyk6IGMgaXMgQXNzZXRTdGFnaW5nID0+IGMgaW5zdGFuY2VvZiBBc3NldFN0YWdpbmcpXG4gICAgICAgIC5tYXAoKGMpID0+IGMuc291cmNlUGF0aClcbiAgICAgICAgLmZpbmQoKHBhdGgpID0+IHBhdGguaW5jbHVkZXMoXCJuZXh0anMtYXNzZXRzLVwiKSkhO1xuICAgIH1cblxuICAgIC8vIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgdGhlIGJ1aWx0IGZpbGUgb3ZlciBhIHB1YmxpYy8gb25lIGF0IHRoZSBzYW1lIHBhdGgsXG4gICAgLy8gYW5kIHRoZSBwdWJsaWMvIG9uZSBldmVyeXdoZXJlIGVsc2UuXG4gICAgaXQoXCJsZWF2ZXMgb3V0IG9ubHkgdGhlIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZXMgYSBidWlsdCBmaWxlIHNoYWRvd3NcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgY29uc3Qgc2hhZG93RGlyID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhzaGFkb3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJsb2dvLnBuZ1wiKSkpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rLmpzXCIpKSkudG9CZShcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJsZWdhY3kuanNcIikpKS50b0JlKFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIE5leHQuanMgYW5kIFMzIGtleXMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdoZXJlIHRoZSBmaWxlc3lzdGVtIGlzbid0LlxuICAgIGl0KFwiZG9lc24ndCB0cmVhdCBhIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZSBhcyBzaGFkb3dlZCBieSBhbm90aGVyIGNhc2VcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoc2hhZG93RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwiQ2h1bmsuanNcIiksIFwiLy8gcHVibGljIG9ubHlcIik7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBjb25zdCBzdGFnZWQgPSBzdGFnZWREaXIoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhKTtcbiAgICAgIGV4cGVjdChyZWFkZGlyU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKSkpLnRvRXF1YWwoW1xuICAgICAgICBcIkNodW5rLmpzXCIsXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwidXBsb2FkcyBhIC5uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlciBmaWxlIHdpdGggdGhlIG90aGVyIGFzc2V0c1wiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcInNlcnZpY2Utd29ya2VyXCIpLFxuICAgICAgICBcIi8vIG5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuc2VydmljZVdvcmtlckRlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIikpLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ1cGxvYWRzIGEgcHVibGljLyBtYWRlIG9ubHkgb2Ygc3ltbGlua3NcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJsb2dvLnBuZ1wiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0LCBcInBuZ1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKSk7XG4gICAgICBzeW1saW5rU3luYyh0YXJnZXQsIGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIikpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gQSBzZXJ2aWNlIHdvcmtlciBrZWVwcyBpdHMgVVJMIGFjcm9zcyBidWlsZHMsIHNvIE5leHQuanMgc2VydmVzIGl0XG4gICAgLy8gcmV2YWxpZGF0ZWQgcmF0aGVyIHRoYW4gaW1tdXRhYmxlLlxuICAgIGl0KFwidXBsb2FkcyBzZXJ2aWNlIHdvcmtlcnMgd2l0aCBtYXgtYWdlPTAsIG11c3QtcmV2YWxpZGF0ZVwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIik7XG4gICAgICBta2RpclN5bmMoc3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHN3RGlyLCBcInN3LmpzXCIpLCBcIi8vIHN3XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFNlcnZpY2VXb3JrZXJEZXBsb3ltZW50OiBzd1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzd1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN3U3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zZXJ2aWNlV29ya2VyRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKFxuICAgICAgICAgIGpvaW4oc3dTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiLCBcInN3LmpzXCIpLFxuICAgICAgICApLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgICAgY29uc3Qgc3RhdGljU3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSksXG4gICAgICApLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiKSksXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdGFnZXMgYSBzeW1saW5rZWQgLm5leHQvc3RhdGljXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsU3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLXN0YXRpY1wiKTtcbiAgICAgIHJlbmFtZVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSwgcmVhbFN0YXRpYyk7XG4gICAgICBzeW1saW5rU3luYyhyZWFsU3RhdGljLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLIHVwbG9hZHMgdGhlIGZpbGVzIGEgbGlua2VkIGRpcmVjdG9yeSBob2xkcywgc28gdGhleSBzaGFkb3cgdG9vLlxuICAgIGl0KFwidHJlYXRzIGZpbGVzIHVuZGVyIGEgc3ltbGlua2VkIC5uZXh0L3N0YXRpYyBkaXJlY3RvcnkgYXMgc2hhZG93aW5nXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsQ2h1bmtzID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLWNodW5rc1wiKTtcbiAgICAgIG1rZGlyU3luYyhyZWFsQ2h1bmtzKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihyZWFsQ2h1bmtzLCBcImEuanNcIiksIFwiLy8gYnVpbHRcIik7XG4gICAgICBzeW1saW5rU3luYyhcbiAgICAgICAgcmVhbENodW5rcyxcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rc1wiKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzaGFkb3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVua3NcIiwgXCJhLmpzXCIpKSxcbiAgICAgICkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDREsgdXBsb2FkcyBhIGRpcmVjdG9yeSB1bmRlciBldmVyeSBuYW1lIGEgbGluayBnaXZlcyBpdC5cbiAgICBpdChcInRyZWF0cyBmaWxlcyByZWFjaGVkIHRocm91Z2ggYSBzZWNvbmQgbmFtZSBhcyBzaGFkb3dpbmdcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGJ1aWx0U3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWx0U3RhdGljLCBcImNodW5rc1wiKSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIsIFwiYS5qc1wiKSwgXCIvLyBidWlsdFwiKTtcbiAgICAgIHN5bWxpbmtTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImFsaWFzXCIpKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoam9pbihzaGFkb3dEaXIsIFwiYWxpYXNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJhbGlhc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImFsaWFzXCIsIFwiYS5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVhdmVzIG91dCBhIHNoYWRvd2VkIGZpbGUgdW5kZXIgYSBzeW1saW5rZWQgcHVibGljLyBkaXJlY3RvcnlcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGxpbmtlZCA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwibGlua2VkLXN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhsaW5rZWQpO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKGxpbmtlZCwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihsaW5rZWQsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgc3ltbGlua1N5bmMobGlua2VkLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwibGVnYWN5LmpzXCIpKSkudG9CZShcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImxpc3RzIGEgLm5leHQvc3RhdGljIGhvbGRpbmcgYSBsaW5rIGxvb3BcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbHRTdGF0aWMgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgc3ltbGlua1N5bmMoam9pbihidWlsdFN0YXRpYywgXCJsb29wXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImxvb3BcIikpO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG5cbiAgICAgIGV4cGVjdCgoKSA9PiBjcmVhdGVTdGF0aWNBc3NldHMoe30pKS5ub3QudG9UaHJvdygvRUxPT1AvKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVtb3ZlcyB0aGUgc3RhZ2luZyBkaXJlY3RvcmllcyB3aGVuIGEgZGVwbG95bWVudCBmYWlsc1wiLCAoKSA9PiB7XG4gICAgICB3cml0ZVB1YmxpY0ZpbGUoKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IG5ldyBTZXQocmVhZGRpclN5bmModG1wZGlyKCkpKTtcbiAgICAgIGplc3RcbiAgICAgICAgLnNweU9uKE5leHRqc1N0YXRpY0Fzc2V0cy5wcm90b3R5cGUgYXMgYW55LCBcImNyZWF0ZURlcGxveW1lbnRcIilcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGVwbG95bWVudCBmYWlsZWRcIik7XG4gICAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhwZWN0KCgpID0+IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSkpLnRvVGhyb3coXCJkZXBsb3ltZW50IGZhaWxlZFwiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxlYWtlZCA9IHJlYWRkaXJTeW5jKHRtcGRpcigpKS5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoXCJuZXh0anMtYXNzZXRzLVwiKSAmJiAhYmVmb3JlLmhhcyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QobGVha2VkKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVtb3ZlcyBpdHMgc3RhZ2luZyBkaXJlY3RvcmllcyBvbmNlIENESyBoYXMgY29waWVkIHRoZW1cIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbG9hZCBvZiBbXG4gICAgICAgIHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISxcbiAgICAgICAgc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhLFxuICAgICAgXSkge1xuICAgICAgICBleHBlY3QoZXhpc3RzU3luYyhzdGFnZWREaXIodXBsb2FkKSkpLnRvQmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGFzc2V0IG1hbmlmZXN0IHRoZW4gcG9pbnRzIGF0IHRoZSBzdGFnaW5nIGRpcmVjdG9yeSBpdHNlbGYuXG4gICAgaXQoXCJrZWVwcyB0aGVtIHdoZW4gYXNzZXQgc3RhZ2luZyBpcyBkaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISkpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmYWxscyBiYWNrIHRvIHRoZSBwdWJsaWMvIHVwbG9hZCBmb3IgYSBidWlsZCB3aXRob3V0IC5uZXh0L3N0YXRpY1wiLCAoKSA9PiB7XG4gICAgICBybVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuZGVwbG95bWVudCkudG9CZShzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCk7XG4gICAgICBleHBlY3QoT2JqZWN0LmtleXMoZGVwbG95bWVudHMoKSkpLnRvRXF1YWwoW1wiUHVibGljRGVwbG95bWVudFwiXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiYnVja2V0RGVwbG95bWVudFByb3BzIHRoYXQgd291bGQgYnJlYWsgdGhlIG90aGVyIHVwbG9hZHNcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHdpdGhPdmVycmlkZXMoYnVja2V0RGVwbG95bWVudFByb3BzOiBvYmplY3QpIHtcbiAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHN0YWNrLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB7IGJ1Y2tldERlcGxveW1lbnRQcm9wczogYnVja2V0RGVwbG95bWVudFByb3BzIGFzIGFueSB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpdChcInJlamVjdHMgcHJ1bmU6IHRydWVcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdHJ1ZSB9KSkudG9UaHJvdygvYHBydW5lOiB0cnVlYC8pO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLJ3MgVXBkYXRlIHBhdGggZGVsZXRlcyB0aGUgb2xkIHByZWZpeCB3aXRob3V0IGNoZWNraW5nIHRoZSBidWNrZXQnc1xuICAgIC8vIG93bmVyLCByYWNpbmcgdGhlIG90aGVyIHVwbG9hZHMsIHNvIG5vIGJ1Y2tldCBpcyBzYWZlLlxuICAgIGl0KFwicmVqZWN0cyByZXRhaW5PbkRlbGV0ZTogZmFsc2VcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyByZXRhaW5PbkRlbGV0ZTogZmFsc2UgfSkpLnRvVGhyb3coXG4gICAgICAgIC9gcmV0YWluT25EZWxldGU6IGZhbHNlYC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHR5cGUgcmVxdWlyZXMgYm90aCwgc28gYSB0eXBlZCBjYWxsZXIgYWx3YXlzIHBhc3NlcyB0aGVtLlxuICAgIGl0KFwiaWdub3JlcyBzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbkJ1Y2tldFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBvdGhlciA9IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJPdGhlclwiLCBcIm90aGVyXCIpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgc291cmNlczogW10sXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogb3RoZXIsXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IFtDYWNoZUNvbnRyb2wuZnJvbVN0cmluZyhcInB1YmxpYywgbWF4LWFnZT02MFwiKV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBbdXBsb2FkXSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkN1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudFwiKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHVwbG9hZC5Qcm9wZXJ0aWVzLkRlc3RpbmF0aW9uQnVja2V0TmFtZSkpLnRvQ29udGFpbihcbiAgICAgICAgXCJOZXh0anNTdGF0aWNBc3NldHNCdWNrZXRcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBBIEpTSUkgYmluZGluZyBjYW4gbWF0ZXJpYWxpemUgYW4gdW5zZXQgZmllbGQgYXMgYW4gZXhwbGljaXQgdW5kZWZpbmVkLlxuICAgIGl0KFwiYWxsb3dzIHRoZSBmaWVsZHMgd2hlbiB0aGV5IGFyZSBleHBsaWNpdGx5IHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdW5kZWZpbmVkLCBzb3VyY2VzOiB1bmRlZmluZWQgfSksXG4gICAgICApLm5vdC50b1Rocm93KCk7XG4gICAgICAvLyBOb3QgQ0RLJ3MgZGVmYXVsdCBgcHJ1bmU6IHRydWVgLCBub3IgYSBkZXBsb3ltZW50IHdpdGggbm8gc291cmNlcy5cbiAgICAgIGNvbnN0IFt1cGxvYWRdID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQ3VzdG9tOjpDREtCdWNrZXREZXBsb3ltZW50XCIpLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh1cGxvYWQuUHJvcGVydGllcy5QcnVuZSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -226,10 +226,11 @@ export declare abstract class NextjsBaseConstruct extends Construct {
226
226
  */
227
227
  protected computeBaseProps(): NextjsComputeBaseProps;
228
228
  /**
229
- * Runs after the init cache upload: invalidating the CDN before the new
230
- * cache is in place would only re-cache the responses the invalidation was
231
- * meant to drop, and CloudFormation infers no ordering between the two
232
- * custom resources on its own.
229
+ * Runs after the init cache and static asset uploads: invalidating the CDN
230
+ * before the new files are in place would only re-cache the responses the
231
+ * invalidation was meant to drop, and pruning before them could delete an
232
+ * object the upload is about to re-tag with this build's ID. CloudFormation
233
+ * infers no ordering between these custom resources on its own.
233
234
  */
234
235
  protected createNextjsPostDeploy(distribution?: IDistribution): NextjsPostDeploy;
235
236
  private createNextjsBuild;