cdk-nextjs 0.3.11 → 0.4.1

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 (106) hide show
  1. package/.jsii +1248 -748
  2. package/API.md +1033 -531
  3. package/README.md +1 -2
  4. package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +12 -8
  5. package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +67 -56
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +246 -0
  7. package/docs/breaking-changes.md +9 -0
  8. package/docs/notes.md +170 -20
  9. package/lib/constants.d.ts +32 -0
  10. package/lib/constants.js +38 -0
  11. package/lib/generated-structs/OptionalCustomResourceProps.d.ts +104 -0
  12. package/lib/generated-structs/OptionalCustomResourceProps.js +3 -0
  13. package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +21 -0
  14. package/lib/generated-structs/OptionalDockerImageAssetProps.js +1 -1
  15. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +4 -3
  16. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +1 -1
  17. package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +1 -1
  18. package/lib/generated-structs/OptionalNextjsBuildProps.js +1 -1
  19. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +3 -3
  20. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  21. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +42 -0
  22. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +3 -0
  23. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +41 -0
  24. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +4 -0
  25. package/lib/index.d.ts +6 -5
  26. package/lib/index.js +6 -8
  27. package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +5 -23
  28. package/lib/lambdas/assets-deployment/fs-to-fs.js +18 -3
  29. package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +8 -2
  30. package/lib/lambdas/assets-deployment/fs-to-s3.js +14 -8
  31. package/lib/lambdas/post-deploy/create-invalidation.d.ts +2 -0
  32. package/lib/lambdas/post-deploy/create-invalidation.js +19 -0
  33. package/lib/lambdas/post-deploy/post-deploy-function.d.ts +13 -0
  34. package/lib/lambdas/post-deploy/post-deploy-function.js +22 -0
  35. package/lib/lambdas/post-deploy/post-deploy.lambda.d.ts +9 -0
  36. package/lib/lambdas/post-deploy/post-deploy.lambda.js +56 -0
  37. package/lib/lambdas/post-deploy/prune-fs.d.ts +10 -0
  38. package/lib/lambdas/post-deploy/prune-fs.js +33 -0
  39. package/lib/lambdas/post-deploy/prune-s3.d.ts +15 -0
  40. package/lib/lambdas/post-deploy/prune-s3.js +101 -0
  41. package/lib/lambdas/utils.js +35 -0
  42. package/lib/nextjs-assets-deployment.d.ts +15 -51
  43. package/lib/nextjs-assets-deployment.js +27 -25
  44. package/lib/nextjs-build/builder.Dockerfile +12 -8
  45. package/lib/nextjs-build/cdk-nextjs-cache-handler.cjs +63 -0
  46. package/lib/nextjs-build/cdk-nextjs-cache-handler.d.ts +21 -0
  47. package/lib/nextjs-build/cdk-nextjs-cache-handler.js +49 -0
  48. package/lib/nextjs-build/global-containers.Dockerfile +29 -19
  49. package/lib/nextjs-build/global-functions.Dockerfile +30 -24
  50. package/lib/nextjs-build/nextjs-build.d.ts +51 -26
  51. package/lib/nextjs-build/nextjs-build.js +108 -88
  52. package/lib/nextjs-build/regional-containers.Dockerfile +30 -20
  53. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +0 -1
  54. package/lib/nextjs-compute/nextjs-compute-base-props.js +1 -1
  55. package/lib/nextjs-compute/nextjs-containers.d.ts +2 -1
  56. package/lib/nextjs-compute/nextjs-containers.js +7 -5
  57. package/lib/nextjs-compute/nextjs-functions.d.ts +1 -0
  58. package/lib/nextjs-compute/nextjs-functions.js +8 -11
  59. package/lib/nextjs-distribution.d.ts +1 -1
  60. package/lib/nextjs-distribution.js +4 -4
  61. package/lib/nextjs-file-system.js +1 -1
  62. package/lib/nextjs-post-deploy.d.ts +101 -0
  63. package/lib/nextjs-post-deploy.js +78 -0
  64. package/lib/nextjs-static-assets.js +1 -1
  65. package/lib/nextjs-vpc.d.ts +1 -1
  66. package/lib/nextjs-vpc.js +4 -4
  67. package/lib/root-constructs/nextjs-base-overrides.d.ts +4 -0
  68. package/lib/root-constructs/nextjs-base-overrides.js +1 -1
  69. package/lib/root-constructs/nextjs-base-props.d.ts +15 -7
  70. package/lib/root-constructs/nextjs-base-props.js +1 -1
  71. package/lib/root-constructs/nextjs-global-containers.d.ts +8 -8
  72. package/lib/root-constructs/nextjs-global-containers.js +25 -15
  73. package/lib/root-constructs/nextjs-global-functions.d.ts +8 -11
  74. package/lib/root-constructs/nextjs-global-functions.js +25 -25
  75. package/lib/root-constructs/nextjs-regional-containers.d.ts +8 -0
  76. package/lib/root-constructs/nextjs-regional-containers.js +26 -9
  77. package/lib/utils/get-architecture.d.ts +2 -0
  78. package/lib/utils/get-architecture.js +8 -0
  79. package/lib/utils/handle-deprecated-properties.d.ts +7 -0
  80. package/lib/utils/handle-deprecated-properties.js +14 -0
  81. package/package.json +17 -19
  82. package/assets/lambdas/revalidate/revalidate.lambda/index.js +0 -67
  83. package/lib/common.d.ts +0 -25
  84. package/lib/common.js +0 -30
  85. package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +0 -11
  86. package/lib/generated-structs/OptionalNextjsInvalidationProps.js +0 -3
  87. package/lib/lambdas/assets-deployment/prune-s3.d.ts +0 -15
  88. package/lib/lambdas/assets-deployment/prune-s3.js +0 -42
  89. package/lib/lambdas/assets-deployment/s3.d.ts +0 -2
  90. package/lib/lambdas/assets-deployment/s3.js +0 -7
  91. package/lib/lambdas/assets-deployment/utils.js +0 -35
  92. package/lib/lambdas/revalidate/revalidate-function.d.ts +0 -13
  93. package/lib/lambdas/revalidate/revalidate-function.js +0 -22
  94. package/lib/lambdas/revalidate/revalidate.lambda.d.ts +0 -2
  95. package/lib/lambdas/revalidate/revalidate.lambda.js +0 -53
  96. package/lib/nextjs-build/add-cache-handler.d.ts +0 -1
  97. package/lib/nextjs-build/add-cache-handler.js +0 -23
  98. package/lib/nextjs-build/add-cache-handler.mjs +0 -18
  99. package/lib/nextjs-build/cache-handler.cjs +0 -21878
  100. package/lib/nextjs-build/cache-handler.d.ts +0 -6
  101. package/lib/nextjs-build/cache-handler.js +0 -26
  102. package/lib/nextjs-invalidation.d.ts +0 -19
  103. package/lib/nextjs-invalidation.js +0 -52
  104. package/lib/nextjs-revalidation.d.ts +0 -30
  105. package/lib/nextjs-revalidation.js +0 -65
  106. /package/lib/lambdas/{assets-deployment/utils.d.ts → utils.d.ts} +0 -0
@@ -11,7 +11,7 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
11
11
  const aws_ecr_assets_1 = require("aws-cdk-lib/aws-ecr-assets");
12
12
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
13
13
  const constructs_1 = require("constructs");
14
- const common_1 = require("../common");
14
+ const constants_1 = require("../constants");
15
15
  /**
16
16
  * Builds Next.js assets.
17
17
  * @link https://nextjs.org/docs/pages/api-reference/next-config-js/output
@@ -20,24 +20,22 @@ class NextjsBuild extends constructs_1.Construct {
20
20
  constructor(scope, id, props) {
21
21
  super(scope, id);
22
22
  /**
23
- * Mount path in container for EFS. Next.js image optimization, data, and full
24
- * route cache will be symlinked to this location.
25
- *
26
- * Must comply with pattern: ^/mnt/[a-zA-Z0-9-_.]+$ due to lambda requirement.
27
- * Fargate doesn't have this same requirement but we share code for lambda and
28
- * fargate.
29
- * @see https://docs.aws.amazon.com/lambda/latest/api/API_FileSystemConfig.html
23
+ * Repository name for the builder image.
30
24
  */
31
- this.containerMountPathForEfs = "/mnt/cdk-nextjs";
25
+ this.builderImageRepo = "cdk-nextjs/builder";
32
26
  this.containerRuntime = process.env.CDK_DOCKER || "docker";
33
- this.builderImageTag = `cdk-nextjs/builder-${this.node.addr.slice(30)}`;
34
- this.relativePathToWorkspace = props.relativePathToWorkspace || ".";
27
+ this.builderImageAlias = `${this.builderImageRepo}:${this.node.addr.slice(30)}`;
28
+ this.relativePathToPackage = props.relativePathToPackage || ".";
35
29
  this.props = props;
36
30
  this.relativePathToEntrypoint = this.getRelativeEntrypointPath();
37
- this.buildImageDigest = this.createBuilderImage();
31
+ if (!props.builderImageProps?.skipBuild) {
32
+ this.createBuilderImage();
33
+ }
34
+ this.buildImageDigest = this.getBuilderImageDigest();
35
+ this.buildId = this.getBuildId();
38
36
  this.publicDirEntries = this.getPublicDirEntries();
39
- if (props.nextjsType === common_1.NextjsType.GLOBAL_CONTAINERS ||
40
- props.nextjsType === common_1.NextjsType.REGIONAL_CONTAINERS) {
37
+ if (props.nextjsType === constants_1.NextjsType.GLOBAL_CONTAINERS ||
38
+ props.nextjsType === constants_1.NextjsType.REGIONAL_CONTAINERS) {
41
39
  this.imageForNextjsContainers = this.createImageForNextjsContainers();
42
40
  }
43
41
  else {
@@ -48,7 +46,7 @@ class NextjsBuild extends constructs_1.Construct {
48
46
  }
49
47
  getRelativeEntrypointPath() {
50
48
  // joinPosix b/c this will be used in linux container
51
- return (0, posix_1.join)(this.props.relativePathToWorkspace || "", "server.js");
49
+ return (0, posix_1.join)(this.props.relativePathToPackage || "", "server.js");
52
50
  }
53
51
  /**
54
52
  * A builder or base image needs to be created so that the same image can be
@@ -60,7 +58,7 @@ class NextjsBuild extends constructs_1.Construct {
60
58
  const buildCommand = this.props.buildCommand || "npm run build";
61
59
  const { buildArgs = {
62
60
  BUILD_COMMAND: buildCommand,
63
- RELATIVE_PATH_TO_WORKSPACE: this.relativePathToWorkspace,
61
+ RELATIVE_PATH_TO_PACKAGE: this.relativePathToPackage,
64
62
  ...this.props.builderImageProps?.buildArgs,
65
63
  }, envVarNames = [], exclude = [
66
64
  "**/node_modules",
@@ -69,92 +67,112 @@ class NextjsBuild extends constructs_1.Construct {
69
67
  "**/.next",
70
68
  ".gitignore",
71
69
  "*.md",
72
- ], file = "builder.Dockerfile", platform, skipBuild = false, } = this.props.builderImageProps || {};
73
- const srcDockerfilePath = this.props.builderImageProps?.customDockerfilePath ||
74
- (0, node_path_1.join)(__dirname, file);
75
- const destDockerfilePath = (0, node_path_1.join)(this.props.buildContext, file);
76
- (0, node_fs_1.cpSync)(srcDockerfilePath, destDockerfilePath);
77
- const excludeFileStr = exclude?.join("\n");
78
- const dockerignoreFilePath = (0, node_path_1.join)(this.props.buildContext, ".dockerignore");
79
- (0, node_fs_1.writeFileSync)(dockerignoreFilePath, excludeFileStr);
80
- const buildArgsStr = this.createBuildArgStr(buildArgs);
81
- const loadEnvVarsScriptPath = (0, node_path_1.join)(this.props.buildContext, "cdk-nextjs-load-env-vars.sh");
82
- if (envVarNames.length) {
83
- this.createLoadEnvVarsScript(envVarNames, loadEnvVarsScriptPath);
70
+ ], file = "builder.Dockerfile", platform, } = this.props.builderImageProps || {};
71
+ // to be added to user provided build context before builder image is built
72
+ const filePathsToCopy = [
73
+ (0, node_path_1.join)(__dirname, "cdk-nextjs-cache-handler.cjs"),
74
+ ];
75
+ // to be removed from user provided build context after builder image is built
76
+ const filePathsToRemove = [
77
+ (0, node_path_1.join)(this.props.buildContext, "cdk-nextjs-cache-handler.cjs"),
78
+ ];
79
+ // if custom file (Dockerfile) is not specified then use library's default builder.Dockerfile + .dockerignore
80
+ if (!this.props.builderImageProps?.file) {
81
+ filePathsToCopy.push((0, node_path_1.join)(__dirname, file));
82
+ filePathsToRemove.push((0, node_path_1.join)(this.props.buildContext, file));
83
+ const excludeFileStr = exclude?.join("\n");
84
+ const dockerignoreFilePath = (0, node_path_1.join)(this.props.buildContext, ".dockerignore");
85
+ (0, node_fs_1.writeFileSync)(dockerignoreFilePath, excludeFileStr);
86
+ filePathsToRemove.push(dockerignoreFilePath);
84
87
  }
88
+ for (const filePathToCopy of filePathsToCopy) {
89
+ (0, node_fs_1.cpSync)(filePathToCopy, (0, node_path_1.join)(this.props.buildContext, (0, node_path_1.basename)(filePathToCopy)));
90
+ }
91
+ const buildArgsStr = this.createBuildArgStr(buildArgs);
92
+ this.injectBuilderDockerfileEnvVars((0, node_path_1.join)(this.props.buildContext, file), envVarNames);
85
93
  const command = this.props.builderImageProps?.command ||
86
- `${this.containerRuntime} build ${platform ? `--platform ${platform.platform}` : ""} --file ${file} --tag ${this.builderImageTag} ${buildArgsStr} .`;
94
+ `${this.containerRuntime} build ${platform ? `--platform ${platform.platform}` : ""} --file ${file} --tag ${this.builderImageAlias} ${buildArgsStr} .`;
87
95
  let error;
88
96
  try {
89
- if (!skipBuild) {
90
- console.log(`Building image with command: ${command} in directory: ${this.props.buildContext}`);
91
- (0, node_child_process_1.execSync)(command, {
92
- stdio: "inherit",
93
- cwd: this.props.buildContext,
94
- env: process.env,
95
- });
96
- }
97
+ console.log(`Building image with command: ${command} in directory: ${this.props.buildContext}`);
98
+ (0, node_child_process_1.execSync)(command, {
99
+ stdio: "inherit",
100
+ cwd: this.props.buildContext,
101
+ env: process.env,
102
+ });
97
103
  }
98
104
  catch (err) {
99
105
  error = err;
100
106
  }
101
107
  finally {
102
- (0, node_fs_1.rmSync)(destDockerfilePath);
103
- (0, node_fs_1.rmSync)(dockerignoreFilePath);
104
- if (envVarNames.length) {
105
- (0, node_fs_1.rmSync)(loadEnvVarsScriptPath);
108
+ for (const filePathToRemove of filePathsToRemove) {
109
+ (0, node_fs_1.rmSync)(filePathToRemove);
106
110
  }
107
111
  }
108
112
  if (error)
109
113
  throw error;
110
- return this.getBuilderImageDigest();
114
+ }
115
+ injectBuilderDockerfileEnvVars(builderDockerfilePath, envVarNames) {
116
+ const envVars = {};
117
+ for (const envVarName of envVarNames) {
118
+ if (process.env[envVarName]) {
119
+ envVars[envVarName] = process.env[envVarName];
120
+ }
121
+ }
122
+ const content = Object.entries(envVars)
123
+ .map(([name, value]) => `${name}=${value}`)
124
+ .join(" ");
125
+ const oldFile = (0, node_fs_1.readFileSync)(builderDockerfilePath).toString();
126
+ const newFile = oldFile.replace(constants_1.INJECT_CDK_NEXTJS_BUILD_ENV_VARS, content);
127
+ (0, node_fs_1.writeFileSync)(builderDockerfilePath, newFile);
111
128
  }
112
129
  createBuildArgStr(buildArgs) {
113
130
  return Object.entries(buildArgs).reduce((acc, [key, value]) => {
114
131
  return `${acc} --build-arg ${key}="${value}"`;
115
132
  }, "");
116
133
  }
117
- createLoadEnvVarsScript(envVarNames = [], loadEnvVarsScriptPath) {
118
- let loadEnvVarsScript = "# Dynamically generated script to load env vars into build container";
119
- for (const envVarName of envVarNames) {
120
- loadEnvVarsScript += `\nexport ${envVarName}=${process.env[envVarName] || '""'}`;
121
- }
122
- (0, node_fs_1.writeFileSync)(loadEnvVarsScriptPath, loadEnvVarsScript);
123
- }
124
134
  getBuilderImageDigest() {
125
- const digest = (0, node_child_process_1.execSync)(`${this.containerRuntime} images --no-trunc --quiet ${this.builderImageTag}`, { encoding: "utf-8" });
135
+ const digest = (0, node_child_process_1.execSync)(`${this.containerRuntime} images --no-trunc --quiet ${this.builderImageAlias}`, { encoding: "utf-8" });
126
136
  return digest.slice(0, -1); // remove trailing \n
127
137
  }
128
138
  getPublicDirEntries() {
129
- const publicDirPath = (0, posix_1.join)("/app", this.props.relativePathToWorkspace || "", "public");
130
- const publicDirEntriesString = (0, node_child_process_1.execSync)(`${this.containerRuntime} run ${this.builderImageTag} node -e "console.log(JSON.stringify(fs.readdirSync('${publicDirPath}', { withFileTypes: true }).map((e) => ({ name: e.name, isDirectory: e.isDirectory()}))))"`, { encoding: "utf-8" });
139
+ const publicDirPath = (0, posix_1.join)("/app", this.props.relativePathToPackage || "", "public");
140
+ const publicDirEntriesString = (0, node_child_process_1.execSync)(`${this.containerRuntime} run ${this.builderImageAlias} node -e "console.log(JSON.stringify(fs.readdirSync('${publicDirPath}', { withFileTypes: true }).map((e) => ({ name: e.name, isDirectory: e.isDirectory()}))))"`, { encoding: "utf-8" });
131
141
  return JSON.parse(publicDirEntriesString);
132
142
  }
143
+ getBuildId() {
144
+ const buildIdPath = (0, posix_1.join)("/app", this.props.relativePathToPackage || "", ".next", "BUILD_ID");
145
+ const buildId = (0, node_child_process_1.execSync)(`${this.containerRuntime} run ${this.builderImageAlias} /bin/sh -c "cat ${buildIdPath}"`, { encoding: "utf-8" });
146
+ return buildId;
147
+ }
133
148
  createImageForNextjsContainers() {
134
- const dockerfileNamePrefix = this.props.nextjsType === common_1.NextjsType.GLOBAL_CONTAINERS
149
+ const dockerfileNamePrefix = this.props.nextjsType === constants_1.NextjsType.GLOBAL_CONTAINERS
135
150
  ? "global"
136
151
  : "regional";
137
152
  const dockerfileName = `${dockerfileNamePrefix}-containers.Dockerfile`;
138
153
  // cdk-nextjs/builder-{hash} already contains built nextjs app which we'll
139
154
  // `COPY --from=cdk-nextjs/builder-{hash}` so we just need the Dockerfile
140
155
  // which is in lib/nextjs-build folder.
141
- const buildContext = (0, node_path_1.join)(__dirname, "..", "..", "lib", "nextjs-build");
156
+ const buildContext = this.props.overrides?.containersImageBuildContext ??
157
+ (0, node_path_1.join)(__dirname, "..", "..", "lib", "nextjs-build");
142
158
  const dockerImageAsset = new aws_ecr_assets_1.DockerImageAsset(this, "Image", {
143
- buildArgs: {
144
- BUILDER_IMAGE_TAG: this.builderImageTag,
145
- DATA_CACHE_DIR: common_1.DATA_CACHE_DIR,
146
- FULL_ROUTE_CACHE_DIR: common_1.FULL_ROUTE_CACHE_DIR,
147
- PUBLIC_DIR: common_1.PUBLIC_DIR,
148
- IMAGE_CACHE_DIR: common_1.IMAGE_CACHE_DIR,
149
- MOUNT_PATH: this.containerMountPathForEfs,
150
- RELATIVE_PATH_TO_WORKSPACE: this.relativePathToWorkspace,
151
- },
152
159
  directory: buildContext,
153
- exclude: ["*", `!${dockerfileName}`, "!add-cache-handler.mjs"],
154
160
  extraHash: this.buildImageDigest, // rebuild when builder hash changes
155
161
  file: dockerfileName,
156
162
  ignoreMode: aws_cdk_lib_1.IgnoreMode.DOCKER,
157
163
  ...this.props.overrides?.nextjsContainersDockerImageAssetProps,
164
+ buildArgs: {
165
+ [constants_1.BUILD_ID_ARG_NAME]: this.buildId,
166
+ [constants_1.BUILDER_IMAGE_ALIAS_ARG_NAME]: this.builderImageAlias,
167
+ [constants_1.CACHE_PATH_ARG_NAME]: constants_1.CACHE_PATH,
168
+ [constants_1.DATA_CACHE_PATH_ARG_NAME]: constants_1.DATA_CACHE_PATH,
169
+ [constants_1.PUBLIC_PATH_ARG_NAME]: constants_1.PUBLIC_PATH,
170
+ [constants_1.IMAGE_CACHE_PATH_ARG_NAME]: constants_1.IMAGE_CACHE_PATH,
171
+ [constants_1.MOUNT_PATH_ARG_NAME]: constants_1.MOUNT_PATH,
172
+ [constants_1.RELATIVE_PATH_TO_PACKAGE_ARG_NAME]: this.relativePathToPackage,
173
+ ...this.props.overrides?.nextjsContainersDockerImageAssetProps
174
+ ?.buildArgs,
175
+ },
158
176
  });
159
177
  return dockerImageAsset;
160
178
  }
@@ -163,28 +181,25 @@ class NextjsBuild extends constructs_1.Construct {
163
181
  // cdk-nextjs/builder-{hash} already contains built nextjs app which we'll
164
182
  // `COPY --from=cdk-nextjs/builder-{hash}` so we just need the Dockerfile
165
183
  // which is in lib/nextjs-build folder.
166
- const buildContext = (0, node_path_1.join)(__dirname, "..", "..", "lib", "nextjs-build");
184
+ const buildContext = this.props.overrides?.functionsImageBuildContext ??
185
+ (0, node_path_1.join)(__dirname, "..", "..", "lib", "nextjs-build");
167
186
  const dockerImageCode = aws_lambda_1.DockerImageCode.fromImageAsset(buildContext, {
168
- buildArgs: {
169
- BUILDER_IMAGE_TAG: this.builderImageTag,
170
- DATA_CACHE_DIR: common_1.DATA_CACHE_DIR,
171
- FULL_ROUTE_CACHE_DIR: common_1.FULL_ROUTE_CACHE_DIR,
172
- PUBLIC_DIR: common_1.PUBLIC_DIR,
173
- IMAGE_CACHE_DIR: common_1.IMAGE_CACHE_DIR,
174
- MOUNT_PATH: this.containerMountPathForEfs,
175
- RELATIVE_PATH_TO_WORKSPACE: this.relativePathToWorkspace,
176
- },
177
187
  cmd: ["node", this.relativePathToEntrypoint],
178
- exclude: [
179
- "*",
180
- `!${dockerfileName}`,
181
- "!add-cache-handler.mjs",
182
- "!cache-handler.cjs",
183
- ],
184
188
  extraHash: this.buildImageDigest, // rebuild when builder hash changes
185
189
  file: dockerfileName,
186
190
  ignoreMode: aws_cdk_lib_1.IgnoreMode.DOCKER,
187
191
  ...this.props.overrides?.nextjsFunctionsAssetImageCodeProps,
192
+ buildArgs: {
193
+ [constants_1.BUILD_ID_ARG_NAME]: this.buildId,
194
+ [constants_1.BUILDER_IMAGE_ALIAS_ARG_NAME]: this.builderImageAlias,
195
+ [constants_1.CACHE_PATH_ARG_NAME]: constants_1.CACHE_PATH,
196
+ [constants_1.DATA_CACHE_PATH_ARG_NAME]: constants_1.DATA_CACHE_PATH,
197
+ [constants_1.PUBLIC_PATH_ARG_NAME]: constants_1.PUBLIC_PATH,
198
+ [constants_1.IMAGE_CACHE_PATH_ARG_NAME]: constants_1.IMAGE_CACHE_PATH,
199
+ [constants_1.MOUNT_PATH_ARG_NAME]: constants_1.MOUNT_PATH,
200
+ [constants_1.RELATIVE_PATH_TO_PACKAGE_ARG_NAME]: this.relativePathToPackage,
201
+ ...this.props.overrides?.nextjsFunctionsAssetImageCodeProps?.buildArgs,
202
+ },
188
203
  });
189
204
  // TODO: how to clean up temp dir?
190
205
  // rmSync(tempDir, { recursive: true });
@@ -195,24 +210,29 @@ class NextjsBuild extends constructs_1.Construct {
195
210
  /**
196
211
  * Path to bundled custom resource code
197
212
  */
198
- const lambdaBuildContext = (0, node_path_1.join)(__dirname, "..", "..", "assets", "lambdas", "assets-deployment", "assets-deployment.lambda");
213
+ const buildContext = this.props.overrides?.assetsDeploymentImageBuildContext ??
214
+ (0, node_path_1.join)(__dirname, "..", "..", "assets", "lambdas", "assets-deployment", "assets-deployment.lambda");
199
215
  // cdk-nextjs/builder-{hash} already contains Next.js built code which
200
216
  // we'll copy into final image. But we also need lambda code to run
201
217
  // asset deployment tasks
202
- const dockerImageCode = aws_lambda_1.DockerImageCode.fromImageAsset(lambdaBuildContext, {
203
- buildArgs: {
204
- BUILDER_IMAGE_TAG: this.builderImageTag,
205
- RELATIVE_PATH_TO_WORKSPACE: this.relativePathToWorkspace,
206
- },
218
+ const dockerImageCode = aws_lambda_1.DockerImageCode.fromImageAsset(buildContext, {
207
219
  extraHash: this.buildImageDigest, // rebuild when builder hash changes
208
220
  file: dockerfileName,
209
221
  ignoreMode: aws_cdk_lib_1.IgnoreMode.DOCKER,
210
222
  ...this.props.overrides?.nextjsAssetDeploymentAssetImageCodeProps,
223
+ buildArgs: {
224
+ [constants_1.BUILD_ID_ARG_NAME]: this.buildId,
225
+ [constants_1.BUILDER_IMAGE_ALIAS_ARG_NAME]: this.builderImageAlias,
226
+ [constants_1.PUBLIC_PATH_ARG_NAME]: constants_1.PUBLIC_PATH,
227
+ [constants_1.RELATIVE_PATH_TO_PACKAGE_ARG_NAME]: this.relativePathToPackage,
228
+ ...this.props.overrides?.nextjsAssetDeploymentAssetImageCodeProps
229
+ ?.buildArgs,
230
+ },
211
231
  });
212
232
  return dockerImageCode;
213
233
  }
214
234
  }
215
235
  exports.NextjsBuild = NextjsBuild;
216
236
  _a = JSII_RTTI_SYMBOL_1;
217
- NextjsBuild[_a] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.3.11" };
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyREFBOEM7QUFDOUMscUNBQXdEO0FBQ3hELHlDQUFpQztBQUNqQywyQ0FBb0Q7QUFDcEQsNkNBQXlDO0FBQ3pDLCtEQUF3RTtBQUN4RSx1REFBOEU7QUFDOUUsMkNBQXVDO0FBQ3ZDLHNDQU1tQjtBQWtGbkI7OztHQUdHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFxRHhDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQS9DbkI7Ozs7Ozs7O1dBUUc7UUFDSCw2QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztRQWlDckMscUJBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDO1FBTTVELElBQUksQ0FBQyxlQUFlLEdBQUcsc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsdUJBQXVCLElBQUksR0FBRyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ25ELElBQ0UsS0FBSyxDQUFDLFVBQVUsS0FBSyxtQkFBVSxDQUFDLGlCQUFpQjtZQUNqRCxLQUFLLENBQUMsVUFB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RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsb0NBQW9DO1lBQ3RFLElBQUksRUFBRSxjQUFjO1lBQ3BCLFVBQVUsRUFBRSx3QkFBVSxDQUFDLE1BQU07WUFDN0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx3Q0FBd0M7U0FDbEUsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQzs7QUFuUkgsa0NBb1JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcFN5bmMsIHJtU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgam9pbiBhcyBqb2luUG9zaXggfSBmcm9tIFwibm9kZTpwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgeyBJZ25vcmVNb2RlIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBEb2NrZXJJbWFnZUFzc2V0LCBQbGF0Zm9ybSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0c1wiO1xuaW1wb3J0IHsgQXNzZXRJbWFnZUNvZGVQcm9wcywgRG9ja2VySW1hZ2VDb2RlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBEQVRBX0NBQ0hFX0RJUixcbiAgRlVMTF9ST1VURV9DQUNIRV9ESVIsXG4gIElNQUdFX0NBQ0hFX0RJUixcbiAgTmV4dGpzVHlwZSxcbiAgUFVCTElDX0RJUixcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxEb2NrZXJJbWFnZUFzc2V0UHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUFzc2V0UHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0Jhc2VQcm9wcyB9IGZyb20gXCIuLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLWJhc2UtcHJvcHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVySW1hZ2VQcm9wcyB7XG4gIC8qKlxuICAgKiBCdWlsZCBBcmdzIHRvIGJlIHBhc3NlZCB0byBgZG9ja2VyIGJ1aWxkYCBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRBcmdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIGBkb2NrZXIgYnVpbGQgLi4uYCBjb21tYW5kIHRvIHJ1biBpbiB7QGxpbmsgTmV4dEJhc2VQcm9wcy5idWlsZENvbnRleHR9LlxuICAgKiBEZWZhdWx0IGludGVycG9sYXRlcyBvdGhlciBwcm9wcy4gSWYgeW91IG92ZXJyaWRlLCBvdGhlciBwcm9wcyB3aWxsIGhhdmVcbiAgICogbm8gZWZmZWN0IG9uIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kPzogc3RyaW5nO1xuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIG5hbWVzIHRvIHBhc3MgZnJvbSBob3N0IHRvIGNvbnRhaW5lciBkdXJpbmcgYnVpbGQgcHJvY2Vzcy5cbiAgICpcbiAgICogTm90ZSwgYSBzaGVsbCBzY3JpcHQsIGNkay1uZXh0anMtbG9hZC1lbnYtdmFycy5zaCBpcyBjcmVhdGVkIHdpdGhpbiB0aGVcbiAgICoge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fSBkaXJlY3RvcnksIHdoaWNoIHdpbGwgY29udGFpbiBhbGwgdGhlXG4gICAqIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoaXMgcHJvcC4gSWYgeW91J3ZlIGNyZWF0ZWQgeW91ciBvd25cbiAgICogY3VzdG9tIERvY2tlcmZpbGUgKHBhc3NlZCBpbiB2aWEge0BsaW5rIEJ1aWxkZXJJbWFnZVByb3BzLmN1c3RvbURvY2tlcmZpbGVQYXRofSlcbiAgICogdGhlbiB5b3UgbmVlZCB0byBtYWtlIHN1cmUgeW91J3JlIGNvcHlpbmcgaXQgaW50byB0aGUgaW1hZ2UuXG4gICAqXG4gICAqIEBleGFtcGxlIFtcIk1ZX0FQSV9LRVlcIl1cbiAgICovXG4gIHJlYWRvbmx5IGVudlZhck5hbWVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMaW5lcyBpbiAuZG9ja2VyaWdub3JlIGZpbGUgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGluIHlvdXIge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fVxuICAgKiBAZGVmYXVsdCBbXCJub2RlX21vZHVsZXNcIiwgXCIuZ2l0XCIsIFwiLmdpdGlnbm9yZVwiLCBcIi5tZFwiXVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTmFtZSBvZiBEb2NrZXJmaWxlXG4gICAqIEBkZWZhdWx0IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCJcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogUGxhdGZvcm07XG4gIC8qKlxuICAgKiBTa2lwIGJ1aWxkaW5nIHRoZSBidWlsZGVyIGltYWdlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcEJ1aWxkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFBhdGggdG8geW91ciBjdXN0b20gYnVpbGRlci5Eb2NrZXJmaWxlIHdoaWNoIHdpbGwgYmUgY29waWVkIGludG8ge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fS5cbiAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gb3ZlcnJpZGUgdGhpcyBwcm9wIHRvIG9wdGltaXplIGJ1aWxkIGNhY2hpbmcgZm9yIHlvdXIgc2V0dXAuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Eb2NrZXJmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCdWlsZE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lcnNEb2NrZXJJbWFnZUFzc2V0UHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzRnVuY3Rpb25zQXNzZXRJbWFnZUNvZGVQcm9wcz86IEFzc2V0SW1hZ2VDb2RlUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHM/OiBBc3NldEltYWdlQ29kZVByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kOiBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl07XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbnRleHRcIl19XG4gICAqL1xuICByZWFkb25seSBidWlsZENvbnRleHQ6IE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29udGV4dFwiXTtcbiAgLyoqXG4gICAqXG4gICAqL1xuICByZWFkb25seSBidWlsZGVySW1hZ2VQcm9wcz86IEJ1aWxkZXJJbWFnZVByb3BzO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U/OiBOZXh0anNCYXNlUHJvcHNbXCJyZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZVwiXTtcbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQnVpbGRPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljRGlyRW50cnkge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBOZXh0LmpzIGFzc2V0cy5cbiAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBIYXNoIG9mIGJ1aWxkZXIgaW1hZ2Ugd2hpY2ggd2lsbCBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGltYWdlIGNoYW5nZXMuIFVzZWZ1bFxuICAgKiBmb3IgcGFzc2luZyB0byBwcm9wZXJ0aWVzIG9mIGN1c3RvbSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgYnVpbGRlclxuICAgKiBpbWFnZSB0byByZS1ydW4gd2hlbiBidWlsZCBpbWFnZSBjaGFuZ2VzLlxuICAgKi9cbiAgYnVpbGRJbWFnZURpZ2VzdDogc3RyaW5nO1xuICAvKipcbiAgICogTW91bnQgcGF0aCBpbiBjb250YWluZXIgZm9yIEVGUy4gTmV4dC5qcyBpbWFnZSBvcHRpbWl6YXRpb24sIGRhdGEsIGFuZCBmdWxsXG4gICAqIHJvdXRlIGNhY2hlIHdpbGwgYmUgc3ltbGlua2VkIHRvIHRoaXMgbG9jYXRpb24uXG4gICAqXG4gICAqIE11c3QgY29tcGx5IHdpdGggcGF0dGVybjogXi9tbnQvW2EtekEtWjAtOS1fLl0rJCBkdWUgdG8gbGFtYmRhIHJlcXVpcmVtZW50LlxuICAgKiBGYXJnYXRlIGRvZXNuJ3QgaGF2ZSB0aGlzIHNhbWUgcmVxdWlyZW1lbnQgYnV0IHdlIHNoYXJlIGNvZGUgZm9yIGxhbWJkYSBhbmRcbiAgICogZmFyZ2F0ZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9hcGkvQVBJX0ZpbGVTeXN0ZW1Db25maWcuaHRtbFxuICAgKi9cbiAgY29udGFpbmVyTW91bnRQYXRoRm9yRWZzID0gXCIvbW50L2Nkay1uZXh0anNcIjtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBGYXJnYXRlLlxuICAgKi9cbiAgaW1hZ2VGb3JOZXh0anNDb250YWluZXJzPzogRG9ja2VySW1hZ2VBc3NldDtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBMYW1iZGEuXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Z1bmN0aW9ucz86IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBmb3IgYE5leHRqc0Fzc2V0c0RlcGxveW1lbnRgXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQ6IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gcHVibGljLiBVc2UgYnkgQ2xvdWRGcm9udC9BTEIgdG8gY3JlYXRlIGJlaGF2aW9ycy9ydWxlc1xuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwL3B1YmxpY1wiXG4gICAqL1xuICBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogVGhlIGVudHJ5cG9pbnQgSmF2YVNjcmlwdCBmaWxlIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yIE5vZGUuanMgdG8gcnVuIHRoZVxuICAgKiBOZXh0LmpzIHN0YW5kYWxvbmUgc2VydmVyIHJlbGF0aXZlIHRvIHRoZSBzdGFuZGFsb25lIGRpcmVjdG9yeS5cbiAgICogQGV4YW1wbGUgXCIuL3NlcnZlci5qc1wiXG4gICAqIEBleGFtcGxlIFwiLi9wYWNrYWdlcy91aS9zZXJ2ZXIuanNcIiAobW9ub3JlcG8pXG4gICAqL1xuICByZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGFnIG9mIGJ1aWxkZXIgaW1hZ2UgTmV4dC5qcyBhcHAgd2hpY2ggaXMgYnVpbHQgZm9yIG90aGVyIGltYWdlcyB0byBiZVxuICAgKiBidWlsdCBgRlJPTWAuIFRoaXMgaW1hZ2UgaXNuJ3QgYnVpbHQgd2l0aCBDREsgQXNzZXRzIGNvbnN0cnVjdCBiL2MgaXRcbiAgICogZG9lc24ndCBuZWVkIHRvIGJlIHVwbG9hZGVkIHRvIEVDUi4gV2Ugc3RpbGwgbmVlZCB0byBpbmNsdWRlIHNsaWNlIG9mXG4gICAqIGBub2RlLmFkZHJgIGluIHRhZyBpbiBjYXNlIG11bHRpcGxlIGNkay1uZXh0anMgY29uc3RydWN0cyBhcmUgdXNlZC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRlckltYWdlVGFnOiBzdHJpbmc7XG4gIHByaXZhdGUgY29udGFpbmVyUnVudGltZSA9IHByb2Nlc3MuZW52LkNES19ET0NLRVIgfHwgXCJkb2NrZXJcIjtcbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQnVpbGRQcm9wcztcbiAgcHJpdmF0ZSByZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNCdWlsZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmJ1aWxkZXJJbWFnZVRhZyA9IGBjZGstbmV4dGpzL2J1aWxkZXItJHt0aGlzLm5vZGUuYWRkci5zbGljZSgzMCl9YDtcbiAgICB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlID0gcHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UgfHwgXCIuXCI7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMucmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50ID0gdGhpcy5nZXRSZWxhdGl2ZUVudHJ5cG9pbnRQYXRoKCk7XG4gICAgdGhpcy5idWlsZEltYWdlRGlnZXN0ID0gdGhpcy5jcmVhdGVCdWlsZGVySW1hZ2UoKTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldFB1YmxpY0RpckVudHJpZXMoKTtcbiAgICBpZiAoXG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTIHx8XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNcbiAgICApIHtcbiAgICAgIHRoaXMuaW1hZ2VGb3JOZXh0anNDb250YWluZXJzID0gdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0NvbnRhaW5lcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZUZvck5leHRqc0Z1bmN0aW9ucyA9IHRoaXMuY3JlYXRlSW1hZ2VGb3JOZXh0anNGdW5jdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQgPVxuICAgICAgdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVFbnRyeXBvaW50UGF0aCgpIHtcbiAgICAvLyBqb2luUG9zaXggYi9jIHRoaXMgd2lsbCBiZSB1c2VkIGluIGxpbnV4IGNvbnRhaW5lclxuICAgIHJldHVybiBqb2luUG9zaXgodGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSB8fCBcIlwiLCBcInNlcnZlci5qc1wiKTtcbiAgfVxuICAvKipcbiAgICogQSBidWlsZGVyIG9yIGJhc2UgaW1hZ2UgbmVlZHMgdG8gYmUgY3JlYXRlZCBzbyB0aGF0IHRoZSBzYW1lIGltYWdlIGNhbiBiZVxuICAgKiBidWlsdCBgRlJPTWAgZm9yIGBOZXh0anNGdW5jdGlvbnNgIG9yIGBOZXh0anNDb250YWluZXJzYCBhbmQgYE5leHRqc0Fzc2V0c0RlcGxveW1lbnRgLlxuICAgKiBUaGlzIGltYWdlIGRvZXNuJ3QgbmVlZCB0byBiZSB1cGxvYWRlZCB0byBFQ1Igc28gd2UncmUgXCJtYW51YWxseVwiIGNyZWF0aW5nXG4gICAqIGl0IHdpdGggYGV4ZWNTeW5jYCBhbmQgb3RoZXIgaW1hZ2VzIHdpbGwgYmUgYnVpbHQgYEZST01gIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVCdWlsZGVySW1hZ2UoKSB7XG4gICAgY29uc3QgYnVpbGRDb21tYW5kID0gdGhpcy5wcm9wcy5idWlsZENvbW1hbmQgfHwgXCJucG0gcnVuIGJ1aWxkXCI7XG4gICAgY29uc3Qge1xuICAgICAgYnVpbGRBcmdzID0ge1xuICAgICAgICBCVUlMRF9DT01NQU5EOiBidWlsZENvbW1hbmQsXG4gICAgICAgIFJFTEFUSVZFX1BBVEhfVE9fV09SS1NQQUNFOiB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgICAuLi50aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgICAgZW52VmFyTmFtZXMgPSBbXSxcbiAgICAgIGV4Y2x1ZGUgPSBbXG4gICAgICAgIFwiKiovbm9kZV9tb2R1bGVzXCIsXG4gICAgICAgIFwiLmdpdFwiLFxuICAgICAgICBcIioqL2Nkay5vdXRcIixcbiAgICAgICAgXCIqKi8ubmV4dFwiLFxuICAgICAgICBcIi5naXRpZ25vcmVcIixcbiAgICAgICAgXCIqLm1kXCIsXG4gICAgICBdLFxuICAgICAgZmlsZSA9IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCIsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIHNraXBCdWlsZCA9IGZhbHNlLFxuICAgIH0gPSB0aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzIHx8IHt9O1xuICAgIGNvbnN0IHNyY0RvY2tlcmZpbGVQYXRoID1cbiAgICAgIHRoaXMucHJvcHMuYnVpbGRlckltYWdlUHJvcHM/LmN1c3RvbURvY2tlcmZpbGVQYXRoIHx8XG4gICAgICBqb2luKF9fZGlybmFtZSwgZmlsZSk7XG4gICAgY29uc3QgZGVzdERvY2tlcmZpbGVQYXRoID0gam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgZmlsZSk7XG4gICAgY3BTeW5jKHNyY0RvY2tlcmZpbGVQYXRoLCBkZXN0RG9ja2VyZmlsZVBhdGgpO1xuICAgIGNvbnN0IGV4Y2x1ZGVGaWxlU3RyID0gZXhjbHVkZT8uam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBkb2NrZXJpZ25vcmVGaWxlUGF0aCA9IGpvaW4odGhpcy5wcm9wcy5idWlsZENvbnRleHQsIFwiLmRvY2tlcmlnbm9yZVwiKTtcbiAgICB3cml0ZUZpbGVTeW5jKGRvY2tlcmlnbm9yZUZpbGVQYXRoLCBleGNsdWRlRmlsZVN0cik7XG4gICAgY29uc3QgYnVpbGRBcmdzU3RyID0gdGhpcy5jcmVhdGVCdWlsZEFyZ1N0cihidWlsZEFyZ3MpO1xuICAgIGNvbnN0IGxvYWRFbnZWYXJzU2NyaXB0UGF0aCA9IGpvaW4oXG4gICAgICB0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCxcbiAgICAgIFwiY2RrLW5leHRqcy1sb2FkLWVudi12YXJzLnNoXCIsXG4gICAgKTtcbiAgICBpZiAoZW52VmFyTmFtZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNyZWF0ZUxvYWRFbnZWYXJzU2NyaXB0KGVudlZhck5hbWVzLCBsb2FkRW52VmFyc1NjcmlwdFBhdGgpO1xuICAgIH1cbiAgICBjb25zdCBjb21tYW5kID1cbiAgICAgIHRoaXMucHJvcHMuYnVpbGRlckltYWdlUHJvcHM/LmNvbW1hbmQgfHxcbiAgICAgIGAke3RoaXMuY29udGFpbmVyUnVudGltZX0gYnVpbGQgJHtwbGF0Zm9ybSA/IGAtLXBsYXRmb3JtICR7cGxhdGZvcm0ucGxhdGZvcm19YCA6IFwiXCJ9IC0tZmlsZSAke2ZpbGV9IC0tdGFnICR7dGhpcy5idWlsZGVySW1hZ2VUYWd9ICR7YnVpbGRBcmdzU3RyfSAuYDtcbiAgICBsZXQgZXJyb3I6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIGlmICghc2tpcEJ1aWxkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBCdWlsZGluZyBpbWFnZSB3aXRoIGNvbW1hbmQ6ICR7Y29tbWFuZH0gaW4gZGlyZWN0b3J5OiAke3RoaXMucHJvcHMuYnVpbGRDb250ZXh0fWAsXG4gICAgICAgICk7XG4gICAgICAgIGV4ZWNTeW5jKGNvbW1hbmQsIHtcbiAgICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCxcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBybVN5bmMoZGVzdERvY2tlcmZpbGVQYXRoKTtcbiAgICAgIHJtU3luYyhkb2NrZXJpZ25vcmVGaWxlUGF0aCk7XG4gICAgICBpZiAoZW52VmFyTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIHJtU3luYyhsb2FkRW52VmFyc1NjcmlwdFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgIHJldHVybiB0aGlzLmdldEJ1aWxkZXJJbWFnZURpZ2VzdCgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQnVpbGRBcmdTdHIoXG4gICAgYnVpbGRBcmdzOiBSZXF1aXJlZDxCdWlsZGVySW1hZ2VQcm9wcz5bXCJidWlsZEFyZ3NcIl0sXG4gICkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhidWlsZEFyZ3MpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHthY2N9IC0tYnVpbGQtYXJnICR7a2V5fT1cIiR7dmFsdWV9XCJgO1xuICAgIH0sIFwiXCIpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTG9hZEVudlZhcnNTY3JpcHQoXG4gICAgZW52VmFyTmFtZXM6IFJlcXVpcmVkPEJ1aWxkZXJJbWFnZVByb3BzPltcImVudlZhck5hbWVzXCJdID0gW10sXG4gICAgbG9hZEVudlZhcnNTY3JpcHRQYXRoOiBzdHJpbmcsXG4gICkge1xuICAgIGxldCBsb2FkRW52VmFyc1NjcmlwdCA9XG4gICAgICBcIiMgRHluYW1pY2FsbHkgZ2VuZXJhdGVkIHNjcmlwdCB0byBsb2FkIGVudiB2YXJzIGludG8gYnVpbGQgY29udGFpbmVyXCI7XG4gICAgZm9yIChjb25zdCBlbnZWYXJOYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgICBsb2FkRW52VmFyc1NjcmlwdCArPSBgXFxuZXhwb3J0ICR7ZW52VmFyTmFtZX09JHtwcm9jZXNzLmVudltlbnZWYXJOYW1lXSB8fCAnXCJcIid9YDtcbiAgICB9XG4gICAgd3JpdGVGaWxlU3luYyhsb2FkRW52VmFyc1NjcmlwdFBhdGgsIGxvYWRFbnZWYXJzU2NyaXB0KTtcbiAgfVxuICBwcml2YXRlIGdldEJ1aWxkZXJJbWFnZURpZ2VzdCgpIHtcbiAgICBjb25zdCBkaWdlc3QgPSBleGVjU3luYyhcbiAgICAgIGAke3RoaXMuY29udGFpbmVyUnVudGltZX0gaW1hZ2VzIC0tbm8tdHJ1bmMgLS1xdWlldCAke3RoaXMuYnVpbGRlckltYWdlVGFnfWAsXG4gICAgICB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSxcbiAgICApO1xuICAgIHJldHVybiBkaWdlc3Quc2xpY2UoMCwgLTEpOyAvLyByZW1vdmUgdHJhaWxpbmcgXFxuXG4gIH1cbiAgcHJpdmF0ZSBnZXRQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luUG9zaXgoXG4gICAgICBcIi9hcHBcIixcbiAgICAgIHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UgfHwgXCJcIixcbiAgICAgIFwicHVibGljXCIsXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaWNEaXJFbnRyaWVzU3RyaW5nID0gZXhlY1N5bmMoXG4gICAgICBgJHt0aGlzLmNvbnRhaW5lclJ1bnRpbWV9IHJ1biAke3RoaXMuYnVpbGRlckltYWdlVGFnfSBub2RlIC1lIFwiY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZnMucmVhZGRpclN5bmMoJyR7cHVibGljRGlyUGF0aH0nLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkubWFwKChlKSA9PiAoeyBuYW1lOiBlLm5hbWUsIGlzRGlyZWN0b3J5OiBlLmlzRGlyZWN0b3J5KCl9KSkpKVwiYCxcbiAgICAgIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9LFxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocHVibGljRGlyRW50cmllc1N0cmluZykgYXMgUHVibGljRGlyRW50cnlbXTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUltYWdlRm9yTmV4dGpzQ29udGFpbmVycygpIHtcbiAgICBjb25zdCBkb2NrZXJmaWxlTmFtZVByZWZpeCA9XG4gICAgICB0aGlzLnByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNcbiAgICAgICAgPyBcImdsb2JhbFwiXG4gICAgICAgIDogXCJyZWdpb25hbFwiO1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gYCR7ZG9ja2VyZmlsZU5hbWVQcmVmaXh9LWNvbnRhaW5lcnMuRG9ja2VyZmlsZWA7XG4gICAgLy8gY2RrLW5leHRqcy9idWlsZGVyLXtoYXNofSBhbHJlYWR5IGNvbnRhaW5zIGJ1aWx0IG5leHRqcyBhcHAgd2hpY2ggd2UnbGxcbiAgICAvLyBgQ09QWSAtLWZyb209Y2RrLW5leHRqcy9idWlsZGVyLXtoYXNofWAgc28gd2UganVzdCBuZWVkIHRoZSBEb2NrZXJmaWxlXG4gICAgLy8gd2hpY2ggaXMgaW4gbGliL25leHRqcy1idWlsZCBmb2xkZXIuXG4gICAgY29uc3QgYnVpbGRDb250ZXh0ID0gam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcImxpYlwiLCBcIm5leHRqcy1idWlsZFwiKTtcbiAgICBjb25zdCBkb2NrZXJJbWFnZUFzc2V0ID0gbmV3IERvY2tlckltYWdlQXNzZXQodGhpcywgXCJJbWFnZVwiLCB7XG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgQlVJTERFUl9JTUFHRV9UQUc6IHRoaXMuYnVpbGRlckltYWdlVGFnLFxuICAgICAgICBEQVRBX0NBQ0hFX0RJUixcbiAgICAgICAgRlVMTF9ST1VURV9DQUNIRV9ESVIsXG4gICAgICAgIFBVQkxJQ19ESVIsXG4gICAgICAgIElNQUdFX0NBQ0hFX0RJUixcbiAgICAgICAgTU9VTlRfUEFUSDogdGhpcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgIFJFTEFUSVZFX1BBVEhfVE9fV09SS1NQQUNFOiB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgfSxcbiAgICAgIGRpcmVjdG9yeTogYnVpbGRDb250ZXh0LFxuICAgICAgZXhjbHVkZTogW1wiKlwiLCBgISR7ZG9ja2VyZmlsZU5hbWV9YCwgXCIhYWRkLWNhY2hlLWhhbmRsZXIubWpzXCJdLFxuICAgICAgZXh0cmFIYXNoOiB0aGlzLmJ1aWxkSW1hZ2VEaWdlc3QsIC8vIHJlYnVpbGQgd2hlbiBidWlsZGVyIGhhc2ggY2hhbmdlc1xuICAgICAgZmlsZTogZG9ja2VyZmlsZU5hbWUsXG4gICAgICBpZ25vcmVNb2RlOiBJZ25vcmVNb2RlLkRPQ0tFUixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNDb250YWluZXJzRG9ja2VySW1hZ2VBc3NldFByb3BzLFxuICAgIH0pO1xuICAgIHJldHVybiBkb2NrZXJJbWFnZUFzc2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUZvck5leHRqc0Z1bmN0aW9ucygpIHtcbiAgICBjb25zdCBkb2NrZXJmaWxlTmFtZSA9IFwiZ2xvYmFsLWZ1bmN0aW9ucy5Eb2NrZXJmaWxlXCI7XG4gICAgLy8gY2RrLW5leHRqcy9idWlsZGVyLXtoYXNofSBhbHJlYWR5IGNvbnRhaW5zIGJ1aWx0IG5leHRqcyBhcHAgd2hpY2ggd2UnbGxcbiAgICAvLyBgQ09QWSAtLWZyb209Y2RrLW5leHRqcy9idWlsZGVyLXtoYXNofWAgc28gd2UganVzdCBuZWVkIHRoZSBEb2NrZXJmaWxlXG4gICAgLy8gd2hpY2ggaXMgaW4gbGliL25leHRqcy1idWlsZCBmb2xkZXIuXG4gICAgY29uc3QgYnVpbGRDb250ZXh0ID0gam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcImxpYlwiLCBcIm5leHRqcy1idWlsZFwiKTtcbiAgICBjb25zdCBkb2NrZXJJbWFnZUNvZGUgPSBEb2NrZXJJbWFnZUNvZGUuZnJvbUltYWdlQXNzZXQoYnVpbGRDb250ZXh0LCB7XG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgQlVJTERFUl9JTUFHRV9UQUc6IHRoaXMuYnVpbGRlckltYWdlVGFnLFxuICAgICAgICBEQVRBX0NBQ0hFX0RJUixcbiAgICAgICAgRlVMTF9ST1VURV9DQUNIRV9ESVIsXG4gICAgICAgIFBVQkxJQ19ESVIsXG4gICAgICAgIElNQUdFX0NBQ0hFX0RJUixcbiAgICAgICAgTU9VTlRfUEFUSDogdGhpcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgIFJFTEFUSVZFX1BBVEhfVE9fV09SS1NQQUNFOiB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgfSxcbiAgICAgIGNtZDogW1wibm9kZVwiLCB0aGlzLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludF0sXG4gICAgICBleGNsdWRlOiBbXG4gICAgICAgIFwiKlwiLFxuICAgICAgICBgISR7ZG9ja2VyZmlsZU5hbWV9YCxcbiAgICAgICAgXCIhYWRkLWNhY2hlLWhhbmRsZXIubWpzXCIsXG4gICAgICAgIFwiIWNhY2hlLWhhbmRsZXIuY2pzXCIsXG4gICAgICBdLFxuICAgICAgZXh0cmFIYXNoOiB0aGlzLmJ1aWxkSW1hZ2VEaWdlc3QsIC8vIHJlYnVpbGQgd2hlbiBidWlsZGVyIGhhc2ggY2hhbmdlc1xuICAgICAgZmlsZTogZG9ja2VyZmlsZU5hbWUsXG4gICAgICBpZ25vcmVNb2RlOiBJZ25vcmVNb2RlLkRPQ0tFUixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNGdW5jdGlvbnNBc3NldEltYWdlQ29kZVByb3BzLFxuICAgIH0pO1xuICAgIC8vIFRPRE86IGhvdyB0byBjbGVhbiB1cCB0ZW1wIGRpcj9cbiAgICAvLyBybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VGb3JOZXh0anNBc3NldHNEZXBsb3ltZW50KCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gXCJhc3NldHMtZGVwbG95bWVudC5Eb2NrZXJmaWxlXCI7XG4gICAgLyoqXG4gICAgICogUGF0aCB0byBidW5kbGVkIGN1c3RvbSByZXNvdXJjZSBjb2RlXG4gICAgICovXG4gICAgY29uc3QgbGFtYmRhQnVpbGRDb250ZXh0ID0gam9pbihcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgIFwiLi5cIixcbiAgICAgIFwiLi5cIixcbiAgICAgIFwiYXNzZXRzXCIsXG4gICAgICBcImxhbWJkYXNcIixcbiAgICAgIFwiYXNzZXRzLWRlcGxveW1lbnRcIixcbiAgICAgIFwiYXNzZXRzLWRlcGxveW1lbnQubGFtYmRhXCIsXG4gICAgKTtcbiAgICAvLyBjZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9IGFscmVhZHkgY29udGFpbnMgTmV4dC5qcyBidWlsdCBjb2RlIHdoaWNoXG4gICAgLy8gd2UnbGwgY29weSBpbnRvIGZpbmFsIGltYWdlLiBCdXQgd2UgYWxzbyBuZWVkIGxhbWJkYSBjb2RlIHRvIHJ1blxuICAgIC8vIGFzc2V0IGRlcGxveW1lbnQgdGFza3NcbiAgICBjb25zdCBkb2NrZXJJbWFnZUNvZGUgPSBEb2NrZXJJbWFnZUNvZGUuZnJvbUltYWdlQXNzZXQobGFtYmRhQnVpbGRDb250ZXh0LCB7XG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgQlVJTERFUl9JTUFHRV9UQUc6IHRoaXMuYnVpbGRlckltYWdlVGFnLFxuICAgICAgICBSRUxBVElWRV9QQVRIX1RPX1dPUktTUEFDRTogdGhpcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSxcbiAgICAgIH0sXG4gICAgICBleHRyYUhhc2g6IHRoaXMuYnVpbGRJbWFnZURpZ2VzdCwgLy8gcmVidWlsZCB3aGVuIGJ1aWxkZXIgaGFzaCBjaGFuZ2VzXG4gICAgICBmaWxlOiBkb2NrZXJmaWxlTmFtZSxcbiAgICAgIGlnbm9yZU1vZGU6IElnbm9yZU1vZGUuRE9DS0VSLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxufVxuIl19
237
+ NextjsBuild[_a] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.4.1" };
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyREFBOEM7QUFDOUMscUNBQXNFO0FBQ3RFLHlDQUEyQztBQUMzQywyQ0FBb0Q7QUFDcEQsNkNBQXlDO0FBQ3pDLCtEQUF3RTtBQUN4RSx1REFBOEU7QUFDOUUsMkNBQXVDO0FBQ3ZDLDRDQWdCc0I7QUE0R3RCOzs7R0FHRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBb0R4QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFWbkI7O1dBRUc7UUFDSyxxQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQztRQUV4QyxxQkFBZ0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUM7UUFNNUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMscUJBQXFCLElBQUksR0FBRyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDckQsSUFBSSxD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QUVPLG9DQUFvQztRQUMxQyxNQUFNLGNBQWMsR0FBRyw4QkFBOEIsQ0FBQztRQUN0RDs7V0FFRztRQUNILE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxpQ0FBaUM7WUFDdkQsSUFBQSxnQkFBSSxFQUNGLFNBQVMsRUFDVCxJQUFJLEVBQ0osSUFBSSxFQUNKLFFBQVEsRUFDUixTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLDBCQUEwQixDQUMzQixDQUFDO1FBQ0osc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSx5QkFBeUI7UUFDekIsTUFBTSxlQUFlLEdBQUcsNEJBQWUsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFO1lBQ25FLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsb0NBQW9DO1lBQ3RFLElBQUksRUFBRSxjQUFjO1lBQ3BCLFVBQVUsRUFBRSx3QkFBVSxDQUFDLE1BQU07WUFDN0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx3Q0FBd0M7WUFDakUsU0FBUyxFQUFFO2dCQUNULENBQUMsNkJBQWlCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDakMsQ0FBQyx3Q0FBNEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3RELENBQUMsZ0NBQW9CLENBQUMsRUFBRSx1QkFBVztnQkFDbkMsQ0FBQyw2Q0FBaUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7Z0JBQy9ELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsd0NBQXdDO29CQUMvRCxFQUFFLFNBQVM7YUFDZDtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7O0FBOVRILGtDQStUQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3BTeW5jLCByZWFkRmlsZVN5bmMsIHJtU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpvaW4gYXMgam9pblBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aC9wb3NpeFwiO1xuaW1wb3J0IHsgSWdub3JlTW9kZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2VBc3NldCwgUGxhdGZvcm0gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjci1hc3NldHNcIjtcbmltcG9ydCB7IEFzc2V0SW1hZ2VDb2RlUHJvcHMsIERvY2tlckltYWdlQ29kZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgQlVJTERFUl9JTUFHRV9BTElBU19BUkdfTkFNRSxcbiAgTU9VTlRfUEFUSCxcbiAgSU1BR0VfQ0FDSEVfUEFUSCxcbiAgSU1BR0VfQ0FDSEVfUEFUSF9BUkdfTkFNRSxcbiAgTU9VTlRfUEFUSF9BUkdfTkFNRSxcbiAgTmV4dGpzVHlwZSxcbiAgUFVCTElDX1BBVEgsXG4gIFBVQkxJQ19QQVRIX0FSR19OQU1FLFxuICBSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0VfQVJHX05BTUUsXG4gIEJVSUxEX0lEX0FSR19OQU1FLFxuICBEQVRBX0NBQ0hFX1BBVEhfQVJHX05BTUUsXG4gIERBVEFfQ0FDSEVfUEFUSCxcbiAgQ0FDSEVfUEFUSCxcbiAgQ0FDSEVfUEFUSF9BUkdfTkFNRSxcbiAgSU5KRUNUX0NES19ORVhUSlNfQlVJTERfRU5WX1ZBUlMsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VBc3NldFByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRG9ja2VySW1hZ2VBc3NldFByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNCYXNlUHJvcHMgfSBmcm9tIFwiLi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLXByb3BzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlckltYWdlUHJvcHMge1xuICAvKipcbiAgICogQnVpbGQgQXJncyB0byBiZSBwYXNzZWQgdG8gYGRvY2tlciBidWlsZGAgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQXJncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBgZG9ja2VyIGJ1aWxkIC4uLmAgY29tbWFuZCB0byBydW4gaW4ge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fS5cbiAgICogRGVmYXVsdCBpbnRlcnBvbGF0ZXMgb3RoZXIgcHJvcHMuIElmIHlvdSBvdmVycmlkZSwgb3RoZXIgcHJvcHMgd2lsbCBoYXZlXG4gICAqIG5vIGVmZmVjdCBvbiBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZD86IHN0cmluZztcbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBuYW1lcyB0byBwYXNzIGZyb20gaG9zdCB0byBjb250YWluZXIgZHVyaW5nIGJ1aWxkIHByb2Nlc3MuXG4gICAqXG4gICAqIE5vdGUsIGEgc2hlbGwgc2NyaXB0LCBjZGstbmV4dGpzLWxvYWQtZW52LXZhcnMuc2ggaXMgY3JlYXRlZCB3aXRoaW4gdGhlXG4gICAqIHtAbGluayBOZXh0QmFzZVByb3BzLmJ1aWxkQ29udGV4dH0gZGlyZWN0b3J5LCB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIHRoZVxuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGlzIHByb3AuIElmIHlvdSd2ZSBjcmVhdGVkIHlvdXIgb3duXG4gICAqIGN1c3RvbSBEb2NrZXJmaWxlIChwYXNzZWQgaW4gdmlhIHtAbGluayBCdWlsZGVySW1hZ2VQcm9wcy5jdXN0b21Eb2NrZXJmaWxlUGF0aH0pXG4gICAqIHRoZW4geW91IG5lZWQgdG8gbWFrZSBzdXJlIHlvdSdyZSBjb3B5aW5nIGl0IGludG8gdGhlIGltYWdlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBbXCJNWV9BUElfS0VZXCJdXG4gICAqL1xuICByZWFkb25seSBlbnZWYXJOYW1lcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTGluZXMgaW4gLmRvY2tlcmlnbm9yZSBmaWxlIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpbiB5b3VyIHtAbGluayBOZXh0QmFzZVByb3BzLmJ1aWxkQ29udGV4dH1cbiAgICogQGRlZmF1bHQgW1wibm9kZV9tb2R1bGVzXCIsIFwiLmdpdFwiLCBcIi5naXRpZ25vcmVcIiwgXCIubWRcIl1cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIE5hbWUgb2YgRG9ja2VyZmlsZSBpbiBidWlsZGVyIGJ1aWxkIGNvbnRleHQuIElmIHNwZWNpZmllZCwgeW91IGFyZSByZXNwb25zaWJsZVxuICAgKiBmb3IgZW5zdXJpbmcgaXQgZXhpc3RzIGluIGJ1aWxkIGNvbnRleHQgYmVmb3JlIGNvbnN0cnVjdCBpcyBpbnN0YW50aWF0ZWQuXG4gICAqIEBkZWZhdWx0IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCJcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogUGxhdGZvcm07XG4gIC8qKlxuICAgKiBTa2lwIGJ1aWxkaW5nIHRoZSBidWlsZGVyIGltYWdlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcEJ1aWxkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCdWlsZE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lcnNEb2NrZXJJbWFnZUFzc2V0UHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzRnVuY3Rpb25zQXNzZXRJbWFnZUNvZGVQcm9wcz86IEFzc2V0SW1hZ2VDb2RlUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHM/OiBBc3NldEltYWdlQ29kZVByb3BzO1xuICAvKipcbiAgICogRGVmYXVsdCBmb2xkZXIgZm9yIGJ1aWxkIGNvbnRleHQgaXMgdGhlIFwibGliL25leHRqcy1idWlsZFwiIGZvbGRlciBpbiB0aGVcbiAgICogaW5zdGFsbGVkIGNkay1uZXh0anMgbGlicmFyeSB3aGljaCBoYXMgdGhlIFwiZ2xvYmFsLWZ1bmN0aW9ucy5Eb2NrZXJmaWxlXCIuXG4gICAqIE5vdGUsIGlmIHlvdSBzcGVjaWZ5IHRoaXMgdGhlbiB5b3UncmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoZSBkb2NrZXJmaWxlXG4gICAqIGlzIHByZXNlbnQgaW4gdGhlIGJ1aWxkIGNvbnRleHQgZGlyZWN0b3J5IGFuZCBhbnkgcmVmZXJlbmNlZCBmaWxlcyBhcmVcbiAgICogcHJlc2VudCBhcyB3ZWxsLiBZb3UgY2FuIHNwZWNpZnkgZG9ja2VyZmlsZSBuYW1lIHdpdGggYWRqYWNlbnRcbiAgICogYG5leHRqc0Z1bmN0aW9uc0Fzc2V0SW1hZ2VDb2RlUHJvcHMuZmlsZWAgcHJvcGVydHkuXG4gICAqIEBkZWZhdWx0IFwiY2RrLW5leHRqcy9saWIvbmV4dGpzLWJ1aWxkXCJcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uc0ltYWdlQnVpbGRDb250ZXh0Pzogc3RyaW5nO1xuICAvKipcbiAgICogRGVmYXVsdCBmb2xkZXIgZm9yIGJ1aWxkIGNvbnRleHQgaXMgdGhlIFwibGliL25leHRqcy1idWlsZFwiIGZvbGRlciBpbiB0aGVcbiAgICogaW5zdGFsbGVkIGNkay1uZXh0anMgbGlicmFyeSB3aGljaCBoYXMgdGhlIFwiYXNzZXRzLWRlcGxveW1lbnQuRG9ja2VyZmlsZVwiLlxuICAgKiBOb3RlLCBpZiB5b3Ugc3BlY2lmeSB0aGlzIHRoZW4geW91J3JlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGUgZG9ja2VyZmlsZVxuICAgKiBpcyBwcmVzZW50IGluIHRoZSBidWlsZCBjb250ZXh0IGRpcmVjdG9yeSBhbmQgYW55IHJlZmVyZW5jZWQgZmlsZXMgYXJlXG4gICAqIHByZXNlbnQgYXMgd2VsbC4gWW91IGNhbiBzcGVjaWZ5IGRvY2tlcmZpbGUgbmFtZSB3aXRoIGFkamFjZW50XG4gICAqIGBuZXh0anNBc3NldERlcGxveW1lbnRBc3NldEltYWdlQ29kZVByb3BzLmZpbGVgIHByb3BlcnR5LlxuICAgKiBAZGVmYXVsdCBcImNkay1uZXh0anMvbGliL25leHRqcy1idWlsZFwiXG4gICAqL1xuICByZWFkb25seSBhc3NldHNEZXBsb3ltZW50SW1hZ2VCdWlsZENvbnRleHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZhdWx0IGZvbGRlciBmb3IgYnVpbGQgY29udGV4dCBpcyB0aGUgXCJhc3NldHMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9hc3NldHMtZGVwbG95bWVudC5sYW1iZGFcIiBmb2xkZXIgaW4gdGhlXG4gICAqIGluc3RhbGxlZCBjZGstbmV4dGpzIGxpYnJhcnkgd2hpY2ggaGFzIHRoZSBcInsuLi59LWNvbnRhaW5lcnMuRG9ja2VyZmlsZVwiLlxuICAgKiBOb3RlLCBpZiB5b3Ugc3BlY2lmeSB0aGlzIHRoZW4geW91J3JlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGUgZG9ja2VyZmlsZVxuICAgKiBpcyBwcmVzZW50IGluIHRoZSBidWlsZCBjb250ZXh0IGRpcmVjdG9yeSBhbmQgYW55IHJlZmVyZW5jZWQgZmlsZXMgYXJlXG4gICAqIHByZXNlbnQgYXMgd2VsbC4gWW91IGNhbiBzcGVjaWZ5IGRvY2tlcmZpbGUgbmFtZSB3aXRoIGFkamFjZW50XG4gICAqIGBuZXh0anNDb250YWluZXJzRG9ja2VySW1hZ2VBc3NldFByb3BzLmZpbGVgIHByb3BlcnR5LlxuICAgKiBAZGVmYXVsdCBcImNkay1uZXh0anMvbGliL25leHRqcy1idWlsZFwiXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJzSW1hZ2VCdWlsZENvbnRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQnVpbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl19XG4gICAqL1xuICByZWFkb25seSBidWlsZENvbW1hbmQ6IE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29tbWFuZFwiXTtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29udGV4dFwiXX1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb250ZXh0XCJdO1xuICAvKipcbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkZXJJbWFnZVByb3BzPzogQnVpbGRlckltYWdlUHJvcHM7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCYXNlUHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoVG9QYWNrYWdlPzogTmV4dGpzQmFzZVByb3BzW1wicmVsYXRpdmVQYXRoVG9QYWNrYWdlXCJdO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNCdWlsZE92ZXJyaWRlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWJsaWNEaXJFbnRyeSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgaXNEaXJlY3Rvcnk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQnVpbGRzIE5leHQuanMgYXNzZXRzLlxuICogQGxpbmsgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvcGFnZXMvYXBpLXJlZmVyZW5jZS9uZXh0LWNvbmZpZy1qcy9vdXRwdXRcbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0J1aWxkIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEltYWdlIGFsaWFzIG9mIGJ1aWxkZXIgaW1hZ2UgTmV4dC5qcyBhcHAgd2hpY2ggaXMgYnVpbHQgZm9yIG90aGVyIGltYWdlcyB0byBiZVxuICAgKiBidWlsdCBgRlJPTWAuIFRoaXMgaW1hZ2UgaXNuJ3QgYnVpbHQgd2l0aCBDREsgQXNzZXRzIGNvbnN0cnVjdCBiL2MgaXRcbiAgICogZG9lc24ndCBuZWVkIHRvIGJlIHVwbG9hZGVkIHRvIEVDUi4gV2Ugc3RpbGwgbmVlZCB0byBpbmNsdWRlIHNsaWNlIG9mXG4gICAqIGBub2RlLmFkZHJgIGluIHRhZyBpbiBjYXNlIG11bHRpcGxlIGNkay1uZXh0anMgY29uc3RydWN0cyBhcmUgdXNlZC5cbiAgICovXG4gIGJ1aWxkZXJJbWFnZUFsaWFzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgZm9yIE5leHQuanMgYnVpbGQuIFVzZWQgdG8gcGFydGl0aW9uIEVGUyBGaWxlU3lzdGVtLlxuICAgKi9cbiAgYnVpbGRJZDogc3RyaW5nO1xuICAvKipcbiAgICogSGFzaCBvZiBidWlsZGVyIGltYWdlIHdoaWNoIHdpbGwgY2hhbmdlIHdoZW5ldmVyIHRoZSBpbWFnZSBjaGFuZ2VzLiBVc2VmdWxcbiAgICogZm9yIHBhc3NpbmcgdG8gcHJvcGVydGllcyBvZiBjdXN0b20gcmVzb3VyY2VzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGJ1aWxkZXJcbiAgICogaW1hZ2UgdG8gcmUtcnVuIHdoZW4gYnVpbGQgaW1hZ2UgY2hhbmdlcy5cbiAgICovXG4gIGJ1aWxkSW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBGYXJnYXRlLlxuICAgKi9cbiAgaW1hZ2VGb3JOZXh0anNDb250YWluZXJzPzogRG9ja2VySW1hZ2VBc3NldDtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBMYW1iZGEuXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Z1bmN0aW9ucz86IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBmb3IgYE5leHRqc0Fzc2V0c0RlcGxveW1lbnRgXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQ6IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gcHVibGljLiBVc2UgYnkgQ2xvdWRGcm9udC9BTEIgdG8gY3JlYXRlIGJlaGF2aW9ycy9ydWxlc1xuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwL3B1YmxpY1wiXG4gICAqL1xuICBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogVGhlIGVudHJ5cG9pbnQgSmF2YVNjcmlwdCBmaWxlIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yIE5vZGUuanMgdG8gcnVuIHRoZVxuICAgKiBOZXh0LmpzIHN0YW5kYWxvbmUgc2VydmVyIHJlbGF0aXZlIHRvIHRoZSBzdGFuZGFsb25lIGRpcmVjdG9yeS5cbiAgICogQGV4YW1wbGUgXCIuL3NlcnZlci5qc1wiXG4gICAqIEBleGFtcGxlIFwiLi9wYWNrYWdlcy91aS9zZXJ2ZXIuanNcIiAobW9ub3JlcG8pXG4gICAqL1xuICByZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUmVwb3NpdG9yeSBuYW1lIGZvciB0aGUgYnVpbGRlciBpbWFnZS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRlckltYWdlUmVwbyA9IFwiY2RrLW5leHRqcy9idWlsZGVyXCI7XG5cbiAgcHJpdmF0ZSBjb250YWluZXJSdW50aW1lID0gcHJvY2Vzcy5lbnYuQ0RLX0RPQ0tFUiB8fCBcImRvY2tlclwiO1xuICBwcml2YXRlIHByb3BzOiBOZXh0anNCdWlsZFByb3BzO1xuICBwcml2YXRlIHJlbGF0aXZlUGF0aFRvUGFja2FnZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNCdWlsZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzID0gYCR7dGhpcy5idWlsZGVySW1hZ2VSZXBvfToke3RoaXMubm9kZS5hZGRyLnNsaWNlKDMwKX1gO1xuICAgIHRoaXMucmVsYXRpdmVQYXRoVG9QYWNrYWdlID0gcHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlIHx8IFwiLlwiO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludCA9IHRoaXMuZ2V0UmVsYXRpdmVFbnRyeXBvaW50UGF0aCgpO1xuICAgIGlmICghcHJvcHMuYnVpbGRlckltYWdlUHJvcHM/LnNraXBCdWlsZCkge1xuICAgICAgdGhpcy5jcmVhdGVCdWlsZGVySW1hZ2UoKTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEltYWdlRGlnZXN0ID0gdGhpcy5nZXRCdWlsZGVySW1hZ2VEaWdlc3QoKTtcbiAgICB0aGlzLmJ1aWxkSWQgPSB0aGlzLmdldEJ1aWxkSWQoKTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldFB1YmxpY0RpckVudHJpZXMoKTtcbiAgICBpZiAoXG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTIHx8XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNcbiAgICApIHtcbiAgICAgIHRoaXMuaW1hZ2VGb3JOZXh0anNDb250YWluZXJzID0gdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0NvbnRhaW5lcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZUZvck5leHRqc0Z1bmN0aW9ucyA9IHRoaXMuY3JlYXRlSW1hZ2VGb3JOZXh0anNGdW5jdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQgPVxuICAgICAgdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVFbnRyeXBvaW50UGF0aCgpIHtcbiAgICAvLyBqb2luUG9zaXggYi9jIHRoaXMgd2lsbCBiZSB1c2VkIGluIGxpbnV4IGNvbnRhaW5lclxuICAgIHJldHVybiBqb2luUG9zaXgodGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2UgfHwgXCJcIiwgXCJzZXJ2ZXIuanNcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgYnVpbGRlciBvciBiYXNlIGltYWdlIG5lZWRzIHRvIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgc2FtZSBpbWFnZSBjYW4gYmVcbiAgICogYnVpbHQgYEZST01gIGZvciBgTmV4dGpzRnVuY3Rpb25zYCBvciBgTmV4dGpzQ29udGFpbmVyc2AgYW5kIGBOZXh0anNBc3NldHNEZXBsb3ltZW50YC5cbiAgICogVGhpcyBpbWFnZSBkb2Vzbid0IG5lZWQgdG8gYmUgdXBsb2FkZWQgdG8gRUNSIHNvIHdlJ3JlIFwibWFudWFsbHlcIiBjcmVhdGluZ1xuICAgKiBpdCB3aXRoIGBleGVjU3luY2AgYW5kIG90aGVyIGltYWdlcyB3aWxsIGJlIGJ1aWx0IGBGUk9NYCBpdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQnVpbGRlckltYWdlKCkge1xuICAgIGNvbnN0IGJ1aWxkQ29tbWFuZCA9IHRoaXMucHJvcHMuYnVpbGRDb21tYW5kIHx8IFwibnBtIHJ1biBidWlsZFwiO1xuICAgIGNvbnN0IHtcbiAgICAgIGJ1aWxkQXJncyA9IHtcbiAgICAgICAgQlVJTERfQ09NTUFORDogYnVpbGRDb21tYW5kLFxuICAgICAgICBSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0U6IHRoaXMucmVsYXRpdmVQYXRoVG9QYWNrYWdlLFxuICAgICAgICAuLi50aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgICAgZW52VmFyTmFtZXMgPSBbXSxcbiAgICAgIGV4Y2x1ZGUgPSBbXG4gICAgICAgIFwiKiovbm9kZV9tb2R1bGVzXCIsXG4gICAgICAgIFwiLmdpdFwiLFxuICAgICAgICBcIioqL2Nkay5vdXRcIixcbiAgICAgICAgXCIqKi8ubmV4dFwiLFxuICAgICAgICBcIi5naXRpZ25vcmVcIixcbiAgICAgICAgXCIqLm1kXCIsXG4gICAgICBdLFxuICAgICAgZmlsZSA9IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCIsXG4gICAgICBwbGF0Zm9ybSxcbiAgICB9ID0gdGhpcy5wcm9wcy5idWlsZGVySW1hZ2VQcm9wcyB8fCB7fTtcblxuICAgIC8vIHRvIGJlIGFkZGVkIHRvIHVzZXIgcHJvdmlkZWQgYnVpbGQgY29udGV4dCBiZWZvcmUgYnVpbGRlciBpbWFnZSBpcyBidWlsdFxuICAgIGNvbnN0IGZpbGVQYXRoc1RvQ29weTogc3RyaW5nW10gPSBbXG4gICAgICBqb2luKF9fZGlybmFtZSwgXCJjZGstbmV4dGpzLWNhY2hlLWhhbmRsZXIuY2pzXCIpLFxuICAgIF07XG4gICAgLy8gdG8gYmUgcmVtb3ZlZCBmcm9tIHVzZXIgcHJvdmlkZWQgYnVpbGQgY29udGV4dCBhZnRlciBidWlsZGVyIGltYWdlIGlzIGJ1aWx0XG4gICAgY29uc3QgZmlsZVBhdGhzVG9SZW1vdmU6IHN0cmluZ1tdID0gW1xuICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgXCJjZGstbmV4dGpzLWNhY2hlLWhhbmRsZXIuY2pzXCIpLFxuICAgIF07XG5cbiAgICAvLyBpZiBjdXN0b20gZmlsZSAoRG9ja2VyZmlsZSkgaXMgbm90IHNwZWNpZmllZCB0aGVuIHVzZSBsaWJyYXJ5J3MgZGVmYXVsdCBidWlsZGVyLkRvY2tlcmZpbGUgKyAuZG9ja2VyaWdub3JlXG4gICAgaWYgKCF0aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzPy5maWxlKSB7XG4gICAgICBmaWxlUGF0aHNUb0NvcHkucHVzaChqb2luKF9fZGlybmFtZSwgZmlsZSkpO1xuICAgICAgZmlsZVBhdGhzVG9SZW1vdmUucHVzaChqb2luKHRoaXMucHJvcHMuYnVpbGRDb250ZXh0LCBmaWxlKSk7XG4gICAgICBjb25zdCBleGNsdWRlRmlsZVN0ciA9IGV4Y2x1ZGU/LmpvaW4oXCJcXG5cIik7XG4gICAgICBjb25zdCBkb2NrZXJpZ25vcmVGaWxlUGF0aCA9IGpvaW4oXG4gICAgICAgIHRoaXMucHJvcHMuYnVpbGRDb250ZXh0LFxuICAgICAgICBcIi5kb2NrZXJpZ25vcmVcIixcbiAgICAgICk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGRvY2tlcmlnbm9yZUZpbGVQYXRoLCBleGNsdWRlRmlsZVN0cik7XG4gICAgICBmaWxlUGF0aHNUb1JlbW92ZS5wdXNoKGRvY2tlcmlnbm9yZUZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoVG9Db3B5IG9mIGZpbGVQYXRoc1RvQ29weSkge1xuICAgICAgY3BTeW5jKFxuICAgICAgICBmaWxlUGF0aFRvQ29weSxcbiAgICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgYmFzZW5hbWUoZmlsZVBhdGhUb0NvcHkpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRBcmdzU3RyID0gdGhpcy5jcmVhdGVCdWlsZEFyZ1N0cihidWlsZEFyZ3MpO1xuICAgIHRoaXMuaW5qZWN0QnVpbGRlckRvY2tlcmZpbGVFbnZWYXJzKFxuICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgZmlsZSksXG4gICAgICBlbnZWYXJOYW1lcyxcbiAgICApO1xuICAgIGNvbnN0IGNvbW1hbmQgPVxuICAgICAgdGhpcy5wcm9wcy5idWlsZGVySW1hZ2VQcm9wcz8uY29tbWFuZCB8fFxuICAgICAgYCR7dGhpcy5jb250YWluZXJSdW50aW1lfSBidWlsZCAke3BsYXRmb3JtID8gYC0tcGxhdGZvcm0gJHtwbGF0Zm9ybS5wbGF0Zm9ybX1gIDogXCJcIn0gLS1maWxlICR7ZmlsZX0gLS10YWcgJHt0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzfSAke2J1aWxkQXJnc1N0cn0gLmA7XG4gICAgbGV0IGVycm9yOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEJ1aWxkaW5nIGltYWdlIHdpdGggY29tbWFuZDogJHtjb21tYW5kfSBpbiBkaXJlY3Rvcnk6ICR7dGhpcy5wcm9wcy5idWlsZENvbnRleHR9YCxcbiAgICAgICk7XG4gICAgICBleGVjU3luYyhjb21tYW5kLCB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyb3IgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGhUb1JlbW92ZSBvZiBmaWxlUGF0aHNUb1JlbW92ZSkge1xuICAgICAgICBybVN5bmMoZmlsZVBhdGhUb1JlbW92ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcHJpdmF0ZSBpbmplY3RCdWlsZGVyRG9ja2VyZmlsZUVudlZhcnMoXG4gICAgYnVpbGRlckRvY2tlcmZpbGVQYXRoOiBzdHJpbmcsXG4gICAgZW52VmFyTmFtZXM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBlbnZWYXJOYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnZbZW52VmFyTmFtZV0pIHtcbiAgICAgICAgZW52VmFyc1tlbnZWYXJOYW1lXSA9IHByb2Nlc3MuZW52W2VudlZhck5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAgIC5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IGAke25hbWV9PSR7dmFsdWV9YClcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBvbGRGaWxlID0gcmVhZEZpbGVTeW5jKGJ1aWxkZXJEb2NrZXJmaWxlUGF0aCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBuZXdGaWxlID0gb2xkRmlsZS5yZXBsYWNlKElOSkVDVF9DREtfTkVYVEpTX0JVSUxEX0VOVl9WQVJTLCBjb250ZW50KTtcbiAgICB3cml0ZUZpbGVTeW5jKGJ1aWxkZXJEb2NrZXJmaWxlUGF0aCwgbmV3RmlsZSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVCdWlsZEFyZ1N0cihcbiAgICBidWlsZEFyZ3M6IFJlcXVpcmVkPEJ1aWxkZXJJbWFnZVByb3BzPltcImJ1aWxkQXJnc1wiXSxcbiAgKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJ1aWxkQXJncykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIGAke2FjY30gLS1idWlsZC1hcmcgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgfSwgXCJcIik7XG4gIH1cbiAgcHJpdmF0ZSBnZXRCdWlsZGVySW1hZ2VEaWdlc3QoKSB7XG4gICAgY29uc3QgZGlnZXN0ID0gZXhlY1N5bmMoXG4gICAgICBgJHt0aGlzLmNvbnRhaW5lclJ1bnRpbWV9IGltYWdlcyAtLW5vLXRydW5jIC0tcXVpZXQgJHt0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzfWAsXG4gICAgICB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSxcbiAgICApO1xuICAgIHJldHVybiBkaWdlc3Quc2xpY2UoMCwgLTEpOyAvLyByZW1vdmUgdHJhaWxpbmcgXFxuXG4gIH1cbiAgcHJpdmF0ZSBnZXRQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luUG9zaXgoXG4gICAgICBcIi9hcHBcIixcbiAgICAgIHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlIHx8IFwiXCIsXG4gICAgICBcInB1YmxpY1wiLFxuICAgICk7XG4gICAgY29uc3QgcHVibGljRGlyRW50cmllc1N0cmluZyA9IGV4ZWNTeW5jKFxuICAgICAgYCR7dGhpcy5jb250YWluZXJSdW50aW1lfSBydW4gJHt0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzfSBub2RlIC1lIFwiY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZnMucmVhZGRpclN5bmMoJyR7cHVibGljRGlyUGF0aH0nLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkubWFwKChlKSA9PiAoeyBuYW1lOiBlLm5hbWUsIGlzRGlyZWN0b3J5OiBlLmlzRGlyZWN0b3J5KCl9KSkpKVwiYCxcbiAgICAgIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9LFxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocHVibGljRGlyRW50cmllc1N0cmluZykgYXMgUHVibGljRGlyRW50cnlbXTtcbiAgfVxuICBwcml2YXRlIGdldEJ1aWxkSWQoKSB7XG4gICAgY29uc3QgYnVpbGRJZFBhdGggPSBqb2luUG9zaXgoXG4gICAgICBcIi9hcHBcIixcbiAgICAgIHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlIHx8IFwiXCIsXG4gICAgICBcIi5uZXh0XCIsXG4gICAgICBcIkJVSUxEX0lEXCIsXG4gICAgKTtcbiAgICBjb25zdCBidWlsZElkID0gZXhlY1N5bmMoXG4gICAgICBgJHt0aGlzLmNvbnRhaW5lclJ1bnRpbWV9IHJ1biAke3RoaXMuYnVpbGRlckltYWdlQWxpYXN9IC9iaW4vc2ggLWMgXCJjYXQgJHtidWlsZElkUGF0aH1cImAsXG4gICAgICB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSxcbiAgICApO1xuICAgIHJldHVybiBidWlsZElkO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VGb3JOZXh0anNDb250YWluZXJzKCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lUHJlZml4ID1cbiAgICAgIHRoaXMucHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU1xuICAgICAgICA/IFwiZ2xvYmFsXCJcbiAgICAgICAgOiBcInJlZ2lvbmFsXCI7XG4gICAgY29uc3QgZG9ja2VyZmlsZU5hbWUgPSBgJHtkb2NrZXJmaWxlTmFtZVByZWZpeH0tY29udGFpbmVycy5Eb2NrZXJmaWxlYDtcbiAgICAvLyBjZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9IGFscmVhZHkgY29udGFpbnMgYnVpbHQgbmV4dGpzIGFwcCB3aGljaCB3ZSdsbFxuICAgIC8vIGBDT1BZIC0tZnJvbT1jZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9YCBzbyB3ZSBqdXN0IG5lZWQgdGhlIERvY2tlcmZpbGVcbiAgICAvLyB3aGljaCBpcyBpbiBsaWIvbmV4dGpzLWJ1aWxkIGZvbGRlci5cbiAgICBjb25zdCBidWlsZENvbnRleHQgPVxuICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmNvbnRhaW5lcnNJbWFnZUJ1aWxkQ29udGV4dCA/P1xuICAgICAgam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcImxpYlwiLCBcIm5leHRqcy1idWlsZFwiKTtcbiAgICBjb25zdCBkb2NrZXJJbWFnZUFzc2V0ID0gbmV3IERvY2tlckltYWdlQXNzZXQodGhpcywgXCJJbWFnZVwiLCB7XG4gICAgICBkaXJlY3Rvcnk6IGJ1aWxkQ29udGV4dCxcbiAgICAgIGV4dHJhSGFzaDogdGhpcy5idWlsZEltYWdlRGlnZXN0LCAvLyByZWJ1aWxkIHdoZW4gYnVpbGRlciBoYXNoIGNoYW5nZXNcbiAgICAgIGZpbGU6IGRvY2tlcmZpbGVOYW1lLFxuICAgICAgaWdub3JlTW9kZTogSWdub3JlTW9kZS5ET0NLRVIsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQ29udGFpbmVyc0RvY2tlckltYWdlQXNzZXRQcm9wcyxcbiAgICAgIGJ1aWxkQXJnczoge1xuICAgICAgICBbQlVJTERfSURfQVJHX05BTUVdOiB0aGlzLmJ1aWxkSWQsXG4gICAgICAgIFtCVUlMREVSX0lNQUdFX0FMSUFTX0FSR19OQU1FXTogdGhpcy5idWlsZGVySW1hZ2VBbGlhcyxcbiAgICAgICAgW0NBQ0hFX1BBVEhfQVJHX05BTUVdOiBDQUNIRV9QQVRILFxuICAgICAgICBbREFUQV9DQUNIRV9QQVRIX0FSR19OQU1FXTogREFUQV9DQUNIRV9QQVRILFxuICAgICAgICBbUFVCTElDX1BBVEhfQVJHX05BTUVdOiBQVUJMSUNfUEFUSCxcbiAgICAgICAgW0lNQUdFX0NBQ0hFX1BBVEhfQVJHX05BTUVdOiBJTUFHRV9DQUNIRV9QQVRILFxuICAgICAgICBbTU9VTlRfUEFUSF9BUkdfTkFNRV06IE1PVU5UX1BBVEgsXG4gICAgICAgIFtSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0VfQVJHX05BTUVdOiB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnNEb2NrZXJJbWFnZUFzc2V0UHJvcHNcbiAgICAgICAgICA/LmJ1aWxkQXJncyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQXNzZXQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUltYWdlRm9yTmV4dGpzRnVuY3Rpb25zKCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gXCJnbG9iYWwtZnVuY3Rpb25zLkRvY2tlcmZpbGVcIjtcbiAgICAvLyBjZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9IGFscmVhZHkgY29udGFpbnMgYnVpbHQgbmV4dGpzIGFwcCB3aGljaCB3ZSdsbFxuICAgIC8vIGBDT1BZIC0tZnJvbT1jZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9YCBzbyB3ZSBqdXN0IG5lZWQgdGhlIERvY2tlcmZpbGVcbiAgICAvLyB3aGljaCBpcyBpbiBsaWIvbmV4dGpzLWJ1aWxkIGZvbGRlci5cbiAgICBjb25zdCBidWlsZENvbnRleHQgPVxuICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmZ1bmN0aW9uc0ltYWdlQnVpbGRDb250ZXh0ID8/XG4gICAgICBqb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwibGliXCIsIFwibmV4dGpzLWJ1aWxkXCIpO1xuICAgIGNvbnN0IGRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tSW1hZ2VBc3NldChidWlsZENvbnRleHQsIHtcbiAgICAgIGNtZDogW1wibm9kZVwiLCB0aGlzLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludF0sXG4gICAgICBleHRyYUhhc2g6IHRoaXMuYnVpbGRJbWFnZURpZ2VzdCwgLy8gcmVidWlsZCB3aGVuIGJ1aWxkZXIgaGFzaCBjaGFuZ2VzXG4gICAgICBmaWxlOiBkb2NrZXJmaWxlTmFtZSxcbiAgICAgIGlnbm9yZU1vZGU6IElnbm9yZU1vZGUuRE9DS0VSLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Z1bmN0aW9uc0Fzc2V0SW1hZ2VDb2RlUHJvcHMsXG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgW0JVSUxEX0lEX0FSR19OQU1FXTogdGhpcy5idWlsZElkLFxuICAgICAgICBbQlVJTERFUl9JTUFHRV9BTElBU19BUkdfTkFNRV06IHRoaXMuYnVpbGRlckltYWdlQWxpYXMsXG4gICAgICAgIFtDQUNIRV9QQVRIX0FSR19OQU1FXTogQ0FDSEVfUEFUSCxcbiAgICAgICAgW0RBVEFfQ0FDSEVfUEFUSF9BUkdfTkFNRV06IERBVEFfQ0FDSEVfUEFUSCxcbiAgICAgICAgW1BVQkxJQ19QQVRIX0FSR19OQU1FXTogUFVCTElDX1BBVEgsXG4gICAgICAgIFtJTUFHRV9DQUNIRV9QQVRIX0FSR19OQU1FXTogSU1BR0VfQ0FDSEVfUEFUSCxcbiAgICAgICAgW01PVU5UX1BBVEhfQVJHX05BTUVdOiBNT1VOVF9QQVRILFxuICAgICAgICBbUkVMQVRJVkVfUEFUSF9UT19QQUNLQUdFX0FSR19OQU1FXTogdGhpcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2UsXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNGdW5jdGlvbnNBc3NldEltYWdlQ29kZVByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIFRPRE86IGhvdyB0byBjbGVhbiB1cCB0ZW1wIGRpcj9cbiAgICAvLyBybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VGb3JOZXh0anNBc3NldHNEZXBsb3ltZW50KCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gXCJhc3NldHMtZGVwbG95bWVudC5Eb2NrZXJmaWxlXCI7XG4gICAgLyoqXG4gICAgICogUGF0aCB0byBidW5kbGVkIGN1c3RvbSByZXNvdXJjZSBjb2RlXG4gICAgICovXG4gICAgY29uc3QgYnVpbGRDb250ZXh0ID1cbiAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5hc3NldHNEZXBsb3ltZW50SW1hZ2VCdWlsZENvbnRleHQgPz9cbiAgICAgIGpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgXCIuLlwiLFxuICAgICAgICBcIi4uXCIsXG4gICAgICAgIFwiYXNzZXRzXCIsXG4gICAgICAgIFwibGFtYmRhc1wiLFxuICAgICAgICBcImFzc2V0cy1kZXBsb3ltZW50XCIsXG4gICAgICAgIFwiYXNzZXRzLWRlcGxveW1lbnQubGFtYmRhXCIsXG4gICAgICApO1xuICAgIC8vIGNkay1uZXh0anMvYnVpbGRlci17aGFzaH0gYWxyZWFkeSBjb250YWlucyBOZXh0LmpzIGJ1aWx0IGNvZGUgd2hpY2hcbiAgICAvLyB3ZSdsbCBjb3B5IGludG8gZmluYWwgaW1hZ2UuIEJ1dCB3ZSBhbHNvIG5lZWQgbGFtYmRhIGNvZGUgdG8gcnVuXG4gICAgLy8gYXNzZXQgZGVwbG95bWVudCB0YXNrc1xuICAgIGNvbnN0IGRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tSW1hZ2VBc3NldChidWlsZENvbnRleHQsIHtcbiAgICAgIGV4dHJhSGFzaDogdGhpcy5idWlsZEltYWdlRGlnZXN0LCAvLyByZWJ1aWxkIHdoZW4gYnVpbGRlciBoYXNoIGNoYW5nZXNcbiAgICAgIGZpbGU6IGRvY2tlcmZpbGVOYW1lLFxuICAgICAgaWdub3JlTW9kZTogSWdub3JlTW9kZS5ET0NLRVIsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQXNzZXREZXBsb3ltZW50QXNzZXRJbWFnZUNvZGVQcm9wcyxcbiAgICAgIGJ1aWxkQXJnczoge1xuICAgICAgICBbQlVJTERfSURfQVJHX05BTUVdOiB0aGlzLmJ1aWxkSWQsXG4gICAgICAgIFtCVUlMREVSX0lNQUdFX0FMSUFTX0FSR19OQU1FXTogdGhpcy5idWlsZGVySW1hZ2VBbGlhcyxcbiAgICAgICAgW1BVQkxJQ19QQVRIX0FSR19OQU1FXTogUFVCTElDX1BBVEgsXG4gICAgICAgIFtSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0VfQVJHX05BTUVdOiB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHNcbiAgICAgICAgICA/LmJ1aWxkQXJncyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxufVxuIl19
@@ -1,10 +1,10 @@
1
1
  #checkov:skip=CKV_DOCKER_2: healthcheck run by ALB and ECS
2
2
  #checkov:skip=CKV_DOCKER_7: latest tag is ok to use for local builder container
3
3
  # Modified from: https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
4
- ARG BUILDER_IMAGE_TAG
5
- FROM $BUILDER_IMAGE_TAG as builder
4
+ ARG BUILDER_IMAGE_ALIAS=cdk-nextjs/builder:latest
5
+ FROM $BUILDER_IMAGE_ALIAS AS builder
6
6
  # Production image, copy all the files and run next
7
- FROM public.ecr.aws/docker/library/node:22-alpine as runner
7
+ FROM public.ecr.aws/docker/library/node:22-alpine AS runner
8
8
  WORKDIR /app
9
9
 
10
10
  ENV NODE_ENV production
@@ -14,25 +14,35 @@ ENV NODE_ENV production
14
14
  RUN addgroup --system --gid 1001 nodejs
15
15
  RUN adduser --system --uid 1001 nextjs
16
16
 
17
- ARG RELATIVE_PATH_TO_WORKSPACE
18
- COPY --from=builder --chown=nextjs:nodejs /app/$RELATIVE_PATH_TO_WORKSPACE/.next/standalone ./
17
+ ARG RELATIVE_PATH_TO_PACKAGE
18
+ COPY --from=builder --chown=nextjs:nodejs /app/$RELATIVE_PATH_TO_PACKAGE/.next/standalone ./
19
+ # html,rsc,body,meta files don't need to be in compute container b/c they're handled by cdk-nextjs-cache-handler.cjs
20
+ RUN find . -type f \( -name "*.html" -o -name "*.rsc" -name "*.body" -name "*.meta" \) -delete
21
+ COPY --from=builder --chown=nextjs:nodejs /app/cdk-nextjs-cache-handler.cjs ./$RELATIVE_PATH_TO_PACKAGE/
19
22
  # static properties needed b/c we don't have cloudfront to serve them from s3
20
- COPY --from=builder --chown=nextjs:nodejs /app/$RELATIVE_PATH_TO_WORKSPACE/.next/static ./$RELATIVE_PATH_TO_WORKSPACE/.next/static
23
+ COPY --from=builder --chown=nextjs:nodejs /app/$RELATIVE_PATH_TO_PACKAGE/.next/static ./$RELATIVE_PATH_TO_PACKAGE/.next/static
24
+ ARG BUILD_ID
25
+ ARG CACHE_PATH
26
+ ARG DATA_CACHE_PATH
27
+ ARG IMAGE_CACHE_PATH
21
28
  ARG MOUNT_PATH
22
- ARG DATA_CACHE_DIR
23
- ARG FULL_ROUTE_CACHE_DIR
24
- ARG IMAGE_CACHE_DIR
25
- ARG PUBLIC_DIR
26
- RUN mkdir -p $MOUNT_PATH/$DATA_CACHE_DIR && \
27
- mkdir -p $MOUNT_PATH/$FULL_ROUTE_CACHE_DIR && \
28
- mkdir -p $MOUNT_PATH/$IMAGE_CACHE_DIR && \
29
- mkdir -p $MOUNT_PATH/$PUBLIC_DIR && \
30
- chmod -R u+rw $MOUNT_PATH && \
31
- mkdir -p ./$RELATIVE_PATH_TO_WORKSPACE/.next/cache && \
32
- ln -s $MOUNT_PATH/$DATA_CACHE_DIR ./$RELATIVE_PATH_TO_WORKSPACE/.next/cache/fetch-cache && \
33
- ln -s $MOUNT_PATH/$IMAGE_CACHE_DIR ./$RELATIVE_PATH_TO_WORKSPACE/.next/cache/images && \
34
- ln -s $MOUNT_PATH/$PUBLIC_DIR ./$RELATIVE_PATH_TO_WORKSPACE/public && \
35
- ln -s $MOUNT_PATH/$FULL_ROUTE_CACHE_DIR ./$RELATIVE_PATH_TO_WORKSPACE/.next/server/app
29
+ ARG PUBLIC_PATH
30
+ RUN sed -i 's/"env":{},/"env":{},cacheHandler:"\.\.\/cdk-nextjs-cache-handler.cjs",/g' ./$RELATIVE_PATH_TO_PACKAGE/server.js && \
31
+ # locally in this docker image the paths where EFS will be mounted need to exist for symlinks to be made
32
+ mkdir -p $MOUNT_PATH/$BUILD_ID/$DATA_CACHE_PATH && \
33
+ mkdir -p $MOUNT_PATH/$BUILD_ID/$IMAGE_CACHE_PATH && \
34
+ mkdir -p $MOUNT_PATH/$BUILD_ID/$PUBLIC_PATH && \
35
+ # delete if exists so that symlinks can be made; image cache doesn't exist at build time
36
+ rm -rf ./$RELATIVE_PATH_TO_PACKAGE/$DATA_CACHE_PATH && \
37
+ rm -rf ./$RELATIVE_PATH_TO_PACKAGE/$PUBLIC_PATH && \
38
+ # create .next/cache if doesn't exist. won't exist if no cached fetch data.
39
+ mkdir -p ./$RELATIVE_PATH_TO_PACKAGE/$CACHE_PATH && \
40
+ # `ln -s <src_file> <target_file>` such that accessing <target_file> accesses <src_file>
41
+ ln -s $MOUNT_PATH/$BUILD_ID/$DATA_CACHE_PATH ./$RELATIVE_PATH_TO_PACKAGE/$DATA_CACHE_PATH && \
42
+ ln -s $MOUNT_PATH/$BUILD_ID/$IMAGE_CACHE_PATH ./$RELATIVE_PATH_TO_PACKAGE/$IMAGE_CACHE_PATH && \
43
+ ln -s $MOUNT_PATH/$BUILD_ID/$PUBLIC_PATH ./$RELATIVE_PATH_TO_PACKAGE/$PUBLIC_PATH && \
44
+ # chown needs to be at end after all files are added so that nextjs:nodejs can access all files
45
+ chown -R nextjs:nodejs $MOUNT_PATH/$BUILD_ID
36
46
 
37
47
  USER nextjs
38
48
 
@@ -2,7 +2,6 @@ import { IVpc } from "aws-cdk-lib/aws-ec2";
2
2
  import { AccessPoint } from "aws-cdk-lib/aws-efs";
3
3
  export interface NextjsComputeBaseProps {
4
4
  readonly accessPoint: AccessPoint;
5
- readonly containerMountPathForEfs: string;
6
5
  readonly healthCheckPath: string;
7
6
  readonly vpc: IVpc;
8
7
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWNvbXB1dGUtYmFzZS1wcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IEFjY2Vzc1BvaW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lZnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnQ6IEFjY2Vzc1BvaW50O1xuICByZWFkb25seSBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhbHRoQ2hlY2tQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZwYzogSVZwYztcbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWNvbXB1dGUtYmFzZS1wcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IEFjY2Vzc1BvaW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lZnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnQ6IEFjY2Vzc1BvaW50O1xuICByZWFkb25seSBoZWFsdGhDaGVja1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgdnBjOiBJVnBjO1xufVxuIl19
@@ -4,7 +4,7 @@ import { ApplicationLoadBalancedFargateService, ApplicationLoadBalancedFargateSe
4
4
  import { FileSystem } from "aws-cdk-lib/aws-efs";
5
5
  import { Construct } from "constructs";
6
6
  import { NextjsComputeBaseProps } from "./nextjs-compute-base-props";
7
- import { NextjsType } from "../common";
7
+ import { NextjsType } from "../constants";
8
8
  import { OptionalApplicationLoadBalancedTaskImageOptions } from "../generated-structs/OptionalApplicationLoadBalancedTaskImageOptions";
9
9
  import { OptionalClusterProps } from "../generated-structs/OptionalClusterProps";
10
10
  export interface NextjsContainersOverrides {
@@ -18,6 +18,7 @@ export interface NextjsContainersProps extends NextjsComputeBaseProps {
18
18
  readonly nextjsType: NextjsType;
19
19
  readonly overrides?: NextjsContainersOverrides;
20
20
  readonly relativeEntrypointPath: string;
21
+ readonly buildId: string;
21
22
  }
22
23
  /**
23
24
  * Next.js load balanced via Application Load Balancer with containers via AWS