cdk-nextjs 0.6.1 → 0.7.0

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 (266) hide show
  1. package/.jsii +2467 -2714
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +1725 -1909
  4. package/CLAUDE.md +2 -1
  5. package/README.md +429 -130
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +152 -170
  7. package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
  8. package/docs/adapter-runtime.md +185 -0
  9. package/docs/breaking-changes.md +687 -4
  10. package/docs/caching-guide.md +156 -112
  11. package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
  12. package/docs/development-guide.md +1 -1
  13. package/docs/harness-coverage.md +598 -0
  14. package/docs/init-cache-deployment.md +32 -1
  15. package/docs/next-build-output-guide.md +30 -20
  16. package/examples/README.md +5 -1
  17. package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
  18. package/lib/adapter/__fixtures__/app-playground.json +4917 -0
  19. package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
  20. package/lib/adapter/adapter.mjs +1548 -185
  21. package/lib/adapter/adapter.test.js +106 -0
  22. package/lib/adapter/aws-cache-store.d.ts +489 -0
  23. package/lib/adapter/aws-cache-store.js +1004 -0
  24. package/lib/adapter/aws-cache-store.test.d.ts +1 -0
  25. package/lib/adapter/aws-cache-store.test.js +361 -0
  26. package/lib/adapter/build-outputs.d.ts +80 -0
  27. package/lib/adapter/build-outputs.js +852 -0
  28. package/lib/adapter/build-outputs.test.d.ts +1 -0
  29. package/lib/adapter/build-outputs.test.js +861 -0
  30. package/lib/adapter/cache-handler.d.ts +9 -2
  31. package/lib/adapter/cache-handler.js +72 -96
  32. package/lib/adapter/cache-handler.mjs +18956 -17774
  33. package/lib/adapter/cache-handler.test.js +263 -31
  34. package/lib/adapter/cache-kinds.d.ts +32 -0
  35. package/lib/adapter/cache-kinds.js +35 -0
  36. package/lib/adapter/cache-kinds.test.d.ts +1 -0
  37. package/lib/adapter/cache-kinds.test.js +69 -0
  38. package/lib/adapter/cache-utils.d.ts +90 -0
  39. package/lib/adapter/cache-utils.js +199 -4
  40. package/lib/adapter/cache-utils.test.d.ts +1 -0
  41. package/lib/adapter/cache-utils.test.js +179 -0
  42. package/lib/adapter/function-groups.d.ts +215 -0
  43. package/lib/adapter/function-groups.js +1099 -0
  44. package/lib/adapter/function-groups.test.d.ts +1 -0
  45. package/lib/adapter/function-groups.test.js +743 -0
  46. package/lib/adapter/init-cache.d.ts +6 -0
  47. package/lib/adapter/init-cache.js +245 -0
  48. package/lib/adapter/init-cache.test.d.ts +1 -0
  49. package/lib/adapter/init-cache.test.js +137 -0
  50. package/lib/adapter/local-file-cache-handler.d.ts +23 -0
  51. package/lib/adapter/local-file-cache-handler.js +52 -1
  52. package/lib/adapter/memory-cache-handler.d.ts +26 -17
  53. package/lib/adapter/memory-cache-handler.js +32 -50
  54. package/lib/adapter/memory-cache-handler.test.js +105 -85
  55. package/lib/adapter/s3-cache-handler.d.ts +179 -40
  56. package/lib/adapter/s3-cache-handler.js +807 -277
  57. package/lib/adapter/s3-cache-handler.test.js +1186 -31
  58. package/lib/adapter/use-cache-common.d.ts +90 -0
  59. package/lib/adapter/use-cache-common.js +250 -0
  60. package/lib/adapter/use-cache-common.test.d.ts +1 -0
  61. package/lib/adapter/use-cache-common.test.js +646 -0
  62. package/lib/adapter/use-cache-default-handler.d.ts +24 -0
  63. package/lib/adapter/use-cache-default-handler.js +90 -0
  64. package/lib/adapter/use-cache-default-handler.mjs +38645 -0
  65. package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
  66. package/lib/adapter/use-cache-handlers.test.js +349 -0
  67. package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
  68. package/lib/adapter/use-cache-remote-handler.js +186 -0
  69. package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
  70. package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
  71. package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
  72. package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
  73. package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
  74. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
  75. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  76. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
  77. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  78. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +13 -0
  79. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
  80. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +11 -2
  81. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
  82. package/lib/index.d.ts +6 -7
  83. package/lib/index.js +2 -4
  84. package/lib/lambdas/post-deploy/post-deploy.lambda.js +3 -2
  85. package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
  86. package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
  87. package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
  88. package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
  89. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
  90. package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
  91. package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
  92. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
  93. package/lib/lambdas/post-deploy/prune-s3.d.ts +19 -3
  94. package/lib/lambdas/post-deploy/prune-s3.js +54 -15
  95. package/lib/lambdas/post-deploy/prune-s3.test.d.ts +1 -0
  96. package/lib/lambdas/post-deploy/prune-s3.test.js +255 -0
  97. package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
  98. package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
  99. package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
  100. package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
  101. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
  102. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
  103. package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
  104. package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
  105. package/lib/nextjs-api.d.ts +107 -18
  106. package/lib/nextjs-api.js +349 -39
  107. package/lib/nextjs-api.test.js +582 -1
  108. package/lib/nextjs-build/global-containers.Dockerfile +15 -10
  109. package/lib/nextjs-build/nextjs-build.d.ts +339 -63
  110. package/lib/nextjs-build/nextjs-build.js +684 -327
  111. package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
  112. package/lib/nextjs-build/nextjs-build.test.js +412 -0
  113. package/lib/nextjs-build/patch-fetch.js +1 -1
  114. package/lib/nextjs-build/patch-fetch.test.js +166 -11
  115. package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
  116. package/lib/nextjs-cache.d.ts +82 -4
  117. package/lib/nextjs-cache.js +186 -10
  118. package/lib/nextjs-cache.test.js +176 -1
  119. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
  120. package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
  121. package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
  122. package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
  123. package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
  124. package/lib/nextjs-compute/nextjs-containers.js +57 -20
  125. package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
  126. package/lib/nextjs-compute/nextjs-functions.js +113 -67
  127. package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
  128. package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
  129. package/lib/nextjs-distribution.d.ts +194 -23
  130. package/lib/nextjs-distribution.js +535 -62
  131. package/lib/nextjs-distribution.test.d.ts +1 -0
  132. package/lib/nextjs-distribution.test.js +697 -0
  133. package/lib/nextjs-post-deploy.d.ts +23 -3
  134. package/lib/nextjs-post-deploy.js +14 -10
  135. package/lib/nextjs-post-deploy.test.d.ts +1 -0
  136. package/lib/nextjs-post-deploy.test.js +34 -0
  137. package/lib/nextjs-static-assets.d.ts +23 -4
  138. package/lib/nextjs-static-assets.js +29 -6
  139. package/lib/nextjs-static-assets.test.js +20 -1
  140. package/lib/root-constructs/nextjs-base-construct.d.ts +105 -45
  141. package/lib/root-constructs/nextjs-base-construct.js +144 -34
  142. package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
  143. package/lib/root-constructs/nextjs-global-containers.js +20 -70
  144. package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
  145. package/lib/root-constructs/nextjs-global-functions.js +52 -69
  146. package/lib/root-constructs/nextjs-regional-containers.d.ts +25 -5
  147. package/lib/root-constructs/nextjs-regional-containers.js +17 -15
  148. package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
  149. package/lib/root-constructs/nextjs-regional-functions.js +8 -25
  150. package/lib/runtime/api-gateway-path.d.ts +34 -0
  151. package/lib/runtime/api-gateway-path.js +71 -0
  152. package/lib/runtime/api-gateway-path.test.d.ts +1 -0
  153. package/lib/runtime/api-gateway-path.test.js +65 -0
  154. package/lib/runtime/case-redirect.d.ts +22 -0
  155. package/lib/runtime/case-redirect.js +63 -0
  156. package/lib/runtime/case-redirect.test.d.ts +1 -0
  157. package/lib/runtime/case-redirect.test.js +32 -0
  158. package/lib/runtime/core.d.ts +234 -0
  159. package/lib/runtime/core.js +1213 -0
  160. package/lib/runtime/core.test.d.ts +1 -0
  161. package/lib/runtime/core.test.js +1678 -0
  162. package/lib/runtime/deployment-root.d.ts +13 -0
  163. package/lib/runtime/deployment-root.js +29 -0
  164. package/lib/runtime/dispatch.d.ts +331 -0
  165. package/lib/runtime/dispatch.js +751 -0
  166. package/lib/runtime/dispatch.test.d.ts +1 -0
  167. package/lib/runtime/dispatch.test.js +853 -0
  168. package/lib/runtime/entrypoints.d.ts +57 -0
  169. package/lib/runtime/entrypoints.js +115 -0
  170. package/lib/runtime/http/abort-signal.d.ts +6 -0
  171. package/lib/runtime/http/abort-signal.js +19 -0
  172. package/lib/runtime/http/abort-signal.test.d.ts +1 -0
  173. package/lib/runtime/http/abort-signal.test.js +49 -0
  174. package/lib/runtime/http/node-server.d.ts +38 -0
  175. package/lib/runtime/http/node-server.js +99 -0
  176. package/lib/runtime/http/node-server.test.d.ts +1 -0
  177. package/lib/runtime/http/node-server.test.js +96 -0
  178. package/lib/runtime/http/node-sink.d.ts +16 -0
  179. package/lib/runtime/http/node-sink.js +48 -0
  180. package/lib/runtime/http/node-sink.test.d.ts +1 -0
  181. package/lib/runtime/http/node-sink.test.js +66 -0
  182. package/lib/runtime/http/request.d.ts +62 -0
  183. package/lib/runtime/http/request.js +134 -0
  184. package/lib/runtime/http/request.test.d.ts +1 -0
  185. package/lib/runtime/http/request.test.js +103 -0
  186. package/lib/runtime/http/response.d.ts +77 -0
  187. package/lib/runtime/http/response.js +229 -0
  188. package/lib/runtime/http/response.test.d.ts +1 -0
  189. package/lib/runtime/http/response.test.js +178 -0
  190. package/lib/runtime/http/sink.d.ts +73 -0
  191. package/lib/runtime/http/sink.js +188 -0
  192. package/lib/runtime/http/sink.test.d.ts +1 -0
  193. package/lib/runtime/http/sink.test.js +257 -0
  194. package/lib/runtime/image-utils.d.ts +78 -0
  195. package/lib/runtime/image-utils.js +129 -0
  196. package/lib/runtime/image-utils.test.d.ts +1 -0
  197. package/lib/runtime/image-utils.test.js +237 -0
  198. package/lib/runtime/image.d.ts +76 -0
  199. package/lib/runtime/image.js +296 -0
  200. package/lib/runtime/image.test.d.ts +1 -0
  201. package/lib/runtime/image.test.js +405 -0
  202. package/lib/runtime/lambda-event.d.ts +4 -0
  203. package/lib/runtime/lambda-event.js +113 -0
  204. package/lib/runtime/lambda-event.test.d.ts +1 -0
  205. package/lib/runtime/lambda-event.test.js +119 -0
  206. package/lib/runtime/lambda.mjs +41595 -0
  207. package/lib/runtime/load-module.d.ts +8 -0
  208. package/lib/runtime/load-module.js +35 -0
  209. package/lib/runtime/manifest.d.ts +215 -0
  210. package/lib/runtime/manifest.js +118 -0
  211. package/lib/runtime/middleware.d.ts +43 -0
  212. package/lib/runtime/middleware.js +113 -0
  213. package/lib/runtime/middleware.test.d.ts +1 -0
  214. package/lib/runtime/middleware.test.js +259 -0
  215. package/lib/runtime/next-modules.d.ts +55 -0
  216. package/lib/runtime/next-modules.js +124 -0
  217. package/lib/runtime/next-modules.test.d.ts +1 -0
  218. package/lib/runtime/next-modules.test.js +34 -0
  219. package/lib/runtime/public-files.d.ts +32 -0
  220. package/lib/runtime/public-files.js +117 -0
  221. package/lib/runtime/public-files.test.d.ts +1 -0
  222. package/lib/runtime/public-files.test.js +97 -0
  223. package/lib/runtime/server.mjs +41588 -0
  224. package/lib/runtime/static-files.d.ts +50 -0
  225. package/lib/runtime/static-files.js +266 -0
  226. package/lib/runtime/static-files.test.d.ts +1 -0
  227. package/lib/runtime/static-files.test.js +118 -0
  228. package/lib/runtime/util.d.ts +28 -0
  229. package/lib/runtime/util.js +79 -0
  230. package/lib/utils/base-path.d.ts +123 -11
  231. package/lib/utils/base-path.js +276 -39
  232. package/lib/utils/base-path.test.js +275 -50
  233. package/lib/utils/get-architecture.d.ts +7 -8
  234. package/lib/utils/get-architecture.js +12 -13
  235. package/lib/utils/zip-directory.d.ts +14 -0
  236. package/lib/utils/zip-directory.js +121 -0
  237. package/lib/utils/zip-directory.test.d.ts +1 -0
  238. package/lib/utils/zip-directory.test.js +99 -0
  239. package/package.json +22 -3
  240. package/scripts/capture-adapter-fixture.mjs +325 -0
  241. package/scripts/e2e-deploy.sh +398 -0
  242. package/scripts/e2e-harness/README.md +707 -0
  243. package/scripts/e2e-harness/app.js +370 -0
  244. package/scripts/e2e-harness/common.sh +249 -0
  245. package/scripts/e2e-harness/screen.mjs +302 -0
  246. package/scripts/e2e-harness/stage-proxy.mjs +145 -0
  247. package/scripts/e2e-harness/type-filters.mjs +47 -0
  248. package/scripts/e2e-logs.sh +75 -0
  249. package/scripts/e2e-offline.sh +91 -0
  250. package/scripts/e2e-sweep.sh +370 -0
  251. package/scripts/e2e-warm.sh +114 -0
  252. package/scripts/zero-config-build.mjs +418 -0
  253. package/docs/1k-concurrent-users-executions.png +0 -0
  254. package/docs/plans/adapter-runtime-release.md +0 -362
  255. package/docs/plans/phase-0-image-function-opt-in.md +0 -295
  256. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
  257. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
  258. package/lib/image-optimization/handler-utils.d.ts +0 -34
  259. package/lib/image-optimization/handler-utils.js +0 -83
  260. package/lib/image-optimization/handler-utils.test.js +0 -178
  261. package/lib/nextjs-build/functions.Dockerfile +0 -31
  262. package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
  263. package/lib/nextjs-compute/nextjs-image-function.js +0 -59
  264. package/lib/utils/experimental-flags.d.ts +0 -24
  265. package/lib/utils/experimental-flags.js +0 -30
  266. /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
@@ -5,14 +5,12 @@ import { Construct } from "constructs";
5
5
  import { NextjsBaseConstructOverrides, NextjsBaseOverrides, NextjsBaseConstruct, NextjsBaseProps } from "./nextjs-base-construct";
6
6
  import { OptionalNextjsContainersProps } from "../generated-structs/OptionalNextjsContainersProps";
7
7
  import { OptionalNextjsDistributionProps } from "../generated-structs/OptionalNextjsDistributionProps";
8
- import { OptionalNextjsPostDeployProps } from "../generated-structs/OptionalNextjsPostDeployProps";
9
8
  import { NextjsContainers, NextjsContainersOverrides } from "../nextjs-compute/nextjs-containers";
10
9
  import { NextjsDistribution, NextjsDistributionOverrides } from "../nextjs-distribution";
11
- import { NextjsPostDeploy, NextjsPostDeployOverrides } from "../nextjs-post-deploy";
10
+ import { NextjsPostDeploy } from "../nextjs-post-deploy";
12
11
  export interface NextjsGlobalContainersConstructOverrides extends NextjsBaseConstructOverrides {
13
12
  readonly nextjsContainersProps?: OptionalNextjsContainersProps;
14
13
  readonly nextjsDistributionProps?: OptionalNextjsDistributionProps;
15
- readonly nextjsPostDeployProps?: OptionalNextjsPostDeployProps;
16
14
  }
17
15
  /**
18
16
  * Overrides for `NextjsGlobalContainers`. Overrides are lower level than
@@ -23,7 +21,6 @@ export interface NextjsGlobalContainersOverrides extends NextjsBaseOverrides {
23
21
  readonly nextjsGlobalContainers?: NextjsGlobalContainersConstructOverrides;
24
22
  readonly nextjsContainers?: NextjsContainersOverrides;
25
23
  readonly nextjsDistribution?: NextjsDistributionOverrides;
26
- readonly nextjsPostDeploy?: NextjsPostDeployOverrides;
27
24
  }
28
25
  export interface NextjsGlobalContainersProps extends NextjsBaseProps {
29
26
  /**
@@ -43,6 +40,23 @@ export interface NextjsGlobalContainersProps extends NextjsBaseProps {
43
40
  * a new cluster and VPC gateway endpoints.
44
41
  */
45
42
  readonly ecsCluster?: ICluster;
43
+ /**
44
+ * Path to API Route Handler that returns HTTP 200 to ensure compute health.
45
+ * Used by the ALB target group and the ECS container health check, both of
46
+ * which have to be able to tell a running task from a wedged one.
47
+ *
48
+ * Give the path as your app routes it, without your app's `basePath` —
49
+ * cdk-nextjs adds that prefix, since both checks hit the app directly.
50
+ * @example "/api/health"
51
+ * @example
52
+ * // api/health/route.ts
53
+ * import { NextResponse } from "next/server";
54
+ *
55
+ * export function GET() {
56
+ * return NextResponse.json("");
57
+ * }
58
+ */
59
+ readonly healthCheckPath: string;
46
60
  /**
47
61
  * Override props of any construct.
48
62
  */
@@ -66,22 +80,6 @@ export declare class NextjsGlobalContainers extends NextjsBaseConstruct {
66
80
  get url(): string;
67
81
  private props;
68
82
  constructor(scope: Construct, id: string, props: NextjsGlobalContainersProps);
69
- /**
70
- * Grants the task role permission to invalidate the distribution and passes
71
- * along a way to look up its ID, so on-demand revalidation
72
- * (revalidateTag/revalidatePath) can evict stale responses from the CDN
73
- * edge cache, not just the origin's S3/DynamoDB cache.
74
- *
75
- * The distribution ID is published to an SSM Parameter (whose *name* is
76
- * static and safe to embed in the task's environment) rather than passed
77
- * directly, and the IAM grant is scoped to all distributions in this
78
- * account/region rather than this specific one. See the equivalent method
79
- * in `NextjsGlobalFunctions` for why: the same pattern is used here for
80
- * consistency, even though containers' distribution (ALB-origin-based)
81
- * doesn't hit the circular CloudFormation dependency functions' does.
82
- */
83
- private wireCloudFrontInvalidation;
84
83
  private createNextjsContainers;
85
84
  private createNextjsDistribution;
86
- private createNextjsPostDeploy;
87
85
  }
@@ -2,14 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NextjsGlobalContainers = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
- const aws_cdk_lib_1 = require("aws-cdk-lib");
6
- const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
- const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
8
5
  const constants_1 = require("../constants");
9
6
  const nextjs_base_construct_1 = require("./nextjs-base-construct");
10
7
  const nextjs_containers_1 = require("../nextjs-compute/nextjs-containers");
11
8
  const nextjs_distribution_1 = require("../nextjs-distribution");
12
- const nextjs_post_deploy_1 = require("../nextjs-post-deploy");
13
9
  const base_path_1 = require("../utils/base-path");
14
10
  /**
15
11
  * Deploy Next.js globally distributed with containers. Uses [CloudFront
@@ -18,7 +14,7 @@ const base_path_1 = require("../utils/base-path");
18
14
  * for containers.
19
15
  */
20
16
  class NextjsGlobalContainers extends nextjs_base_construct_1.NextjsBaseConstruct {
21
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.6.1" };
17
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.7.0" };
22
18
  nextjsContainers;
23
19
  nextjsDistribution;
24
20
  nextjsPostDeploy;
@@ -36,72 +32,36 @@ class NextjsGlobalContainers extends nextjs_base_construct_1.NextjsBaseConstruct
36
32
  this.props = props;
37
33
  this.nextjsContainers = this.createNextjsContainers();
38
34
  this.nextjsDistribution = this.createNextjsDistribution();
39
- this.wireCloudFrontInvalidation();
40
- this.nextjsPostDeploy = this.createNextjsPostDeploy();
41
- }
42
- /**
43
- * Grants the task role permission to invalidate the distribution and passes
44
- * along a way to look up its ID, so on-demand revalidation
45
- * (revalidateTag/revalidatePath) can evict stale responses from the CDN
46
- * edge cache, not just the origin's S3/DynamoDB cache.
47
- *
48
- * The distribution ID is published to an SSM Parameter (whose *name* is
49
- * static and safe to embed in the task's environment) rather than passed
50
- * directly, and the IAM grant is scoped to all distributions in this
51
- * account/region rather than this specific one. See the equivalent method
52
- * in `NextjsGlobalFunctions` for why: the same pattern is used here for
53
- * consistency, even though containers' distribution (ALB-origin-based)
54
- * doesn't hit the circular CloudFormation dependency functions' does.
55
- */
56
- wireCloudFrontInvalidation() {
57
- const stack = aws_cdk_lib_1.Stack.of(this);
58
35
  const { taskDefinition } = this.nextjsContainers.albFargateService;
59
- const distributionIdParameterName = `cdk-nextjs-distribution-id-${this.node.addr}`;
60
- new aws_ssm_1.StringParameter(this, "DistributionIdParameter", {
61
- parameterName: distributionIdParameterName,
62
- stringValue: this.nextjsDistribution.distribution.distributionId,
63
- });
64
- taskDefinition.addToTaskRolePolicy(new aws_iam_1.PolicyStatement({
65
- actions: ["ssm:GetParameter"],
66
- resources: [
67
- stack.formatArn({
68
- service: "ssm",
69
- resource: "parameter",
70
- resourceName: distributionIdParameterName,
71
- }),
72
- ],
73
- }));
74
- taskDefinition.addToTaskRolePolicy(new aws_iam_1.PolicyStatement({
75
- actions: ["cloudfront:CreateInvalidation"],
76
- // Scoped to all distributions (not just this one) for consistency
77
- // with NextjsGlobalFunctions, which can't scope this to its specific
78
- // distribution due to a circular CloudFormation dependency (see the
79
- // class doc comment above and the equivalent method there). Hence
80
- // the SSM parameter indirection above for looking up the ID at
81
- // runtime instead of synth time.
82
- resources: [
83
- stack.formatArn({
84
- service: "cloudfront",
85
- region: "",
86
- resource: "distribution",
87
- resourceName: "*",
88
- }),
89
- ],
90
- }));
91
- taskDefinition.defaultContainer?.addEnvironment("CDK_NEXTJS_DISTRIBUTION_ID_PARAM_NAME", distributionIdParameterName);
36
+ // Lets on-demand revalidation evict stale responses from the CDN edge, not
37
+ // just the origin's cache. The origin is the ALB, which the task doesn't
38
+ // depend on, so naming the distribution here makes no dependency cycle.
39
+ const { distribution } = this.nextjsDistribution;
40
+ distribution.grantCreateInvalidation(taskDefinition.taskRole);
41
+ taskDefinition.defaultContainer?.addEnvironment("CDK_NEXTJS_DISTRIBUTION_ID", distribution.distributionId);
42
+ // The ALB is reachable through the distribution's VPC origin alone, so
43
+ // `CloudFront-Forwarded-Proto` is always CloudFront's own; see
44
+ // `viewerHeaders` in src/runtime/http/node-server.ts.
45
+ taskDefinition.defaultContainer?.addEnvironment("CDK_NEXTJS_TRUST_CLOUDFRONT_PROTO", "1");
46
+ this.nextjsPostDeploy = this.createNextjsPostDeploy(this.nextjsDistribution.distribution);
92
47
  }
93
48
  createNextjsContainers() {
94
49
  // Create containers with local build output
95
50
  return new nextjs_containers_1.NextjsContainers(this, "NextjsContainers", {
96
51
  ...this.computeBaseProps(),
97
52
  alb: this.props.alb,
53
+ buildDirectory: this.props.buildDirectory,
98
54
  ecsCluster: this.props.ecsCluster,
55
+ healthCheckPath: this.resolvedHealthCheckPath(this.props.healthCheckPath),
99
56
  relativeEntrypointPath: this.nextjsBuild.relativePathToEntrypoint,
57
+ relativeProjectDir: this.nextjsBuild.relativeProjectDir,
100
58
  overrides: {
101
59
  ...this.props.overrides?.nextjsContainers,
102
60
  ecsClusterProps: {
103
61
  ...this.props.overrides?.nextjsContainers?.ecsClusterProps,
104
- vpc: this.baseProps.vpc,
62
+ // Conditional for the same reason as the Functions' `vpc`: assigned
63
+ // unconditionally, an unset `vpc` prop would erase the override's.
64
+ ...(this.baseProps.vpc ? { vpc: this.baseProps.vpc } : {}),
105
65
  },
106
66
  },
107
67
  ...this.props.overrides?.nextjsGlobalContainers?.nextjsContainersProps,
@@ -110,6 +70,7 @@ class NextjsGlobalContainers extends nextjs_base_construct_1.NextjsBaseConstruct
110
70
  createNextjsDistribution() {
111
71
  return new nextjs_distribution_1.NextjsDistribution(this, "NextjsDistribution", {
112
72
  assetsBucket: this.nextjsStaticAssets.bucket,
73
+ assetPrefix: this.nextjsBuild.nextConfigAssetPrefixPath,
113
74
  basePath: this.resolvedBasePath,
114
75
  certificate: this.nextjsContainers.albFargateService.certificate,
115
76
  distribution: this.props.distribution,
@@ -120,17 +81,6 @@ class NextjsGlobalContainers extends nextjs_base_construct_1.NextjsBaseConstruct
120
81
  ...this.props.overrides?.nextjsGlobalContainers?.nextjsDistributionProps,
121
82
  });
122
83
  }
123
- createNextjsPostDeploy() {
124
- return new nextjs_post_deploy_1.NextjsPostDeploy(this, "NextjsPostDeploy", {
125
- buildId: this.nextjsBuild.buildId,
126
- distribution: this.nextjsDistribution.distribution,
127
- cacheBucket: this.nextjsCache.cacheBucket,
128
- revalidationTable: this.nextjsCache.revalidationTable,
129
- staticAssetsBucket: this.nextjsStaticAssets.bucket,
130
- overrides: this.props.overrides?.nextjsPostDeploy,
131
- ...this.props.overrides?.nextjsGlobalContainers?.nextjsPostDeployProps,
132
- });
133
- }
134
84
  }
135
85
  exports.NextjsGlobalContainers = NextjsGlobalContainers;
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWdsb2JhbC1jb250YWluZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtZ2xvYmFsLWNvbnRhaW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUFvQztBQUlwQyxpREFBc0Q7QUFDdEQsaURBQXNEO0FBRXRELDRDQUEwQztBQUMxQyxtRUFLaUM7QUFJakMsMkVBRzZDO0FBQzdDLGdFQUdnQztBQUNoQyw4REFHK0I7QUFDL0Isa0RBQThDO0FBNEM5Qzs7Ozs7R0FLRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsMkNBQW1COztJQUM3RCxnQkFBZ0IsQ0FBbUI7SUFDbkMsa0JBQWtCLENBQXFCO0lBQ3ZDLGdCQUFnQixDQUFtQjtJQUNuQzs7OztPQUlHO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFBLG9CQUFRLEVBQ2IsV0FBVyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxFQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQ3RCLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUE4QjtJQUUzQyxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsc0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3hELENBQUM7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LENBQUMsVUFBVTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsa0JBQWtCO1lBQ25ELGdCQUFnQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO1lBQ25ELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsT0FBTyxJQUFJLHFDQUFnQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNwRCxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ2pDLFlBQVksRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWTtZQUNsRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXO1lBQ3pDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCO1lBQ3JELGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO1lBQ2xELFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0I7WUFDakQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUI7U0FDdkUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF2SUgsd0RBd0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IERpc3RyaWJ1dGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHsgSUNsdXN0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zc21cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNDb250YWluZXJzLFxuICBOZXh0anNDb250YWluZXJzT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWRpc3RyaWJ1dGlvblwiO1xuaW1wb3J0IHtcbiAgTmV4dGpzUG9zdERlcGxveSxcbiAgTmV4dGpzUG9zdERlcGxveU92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1wb3N0LWRlcGxveVwiO1xuaW1wb3J0IHsgam9pblBhdGggfSBmcm9tIFwiLi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzR2xvYmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNDb250YWluZXJzUHJvcHM/OiBPcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzRGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzO1xuICByZWFkb25seSBuZXh0anNQb3N0RGVwbG95UHJvcHM/OiBPcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wcztcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgZm9yIGBOZXh0anNHbG9iYWxDb250YWluZXJzYC4gT3ZlcnJpZGVzIGFyZSBsb3dlciBsZXZlbCB0aGFuXG4gKiBwcm9wcyBhbmQgYXJlIHBhc3NlZCBkaXJlY3RseSB0byBDREsgQ29uc3RydWN0cyBnaXZpbmcgeW91IG1vcmUgY29udHJvbC4gSXQnc1xuICogcmVjb21tZW5kZWQgdG8gdXNlIGNhdXRpb24gYW5kIHJldmlldyBzb3VyY2UgY29kZSBzbyB5b3Uga25vdyBob3cgdGhleSdyZSB1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNPdmVycmlkZXMgZXh0ZW5kcyBOZXh0anNCYXNlT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzR2xvYmFsQ29udGFpbmVycz86IE5leHRqc0dsb2JhbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lcnM/OiBOZXh0anNDb250YWluZXJzT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNEaXN0cmlidXRpb24/OiBOZXh0anNEaXN0cmlidXRpb25PdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc1Bvc3REZXBsb3k/OiBOZXh0anNQb3N0RGVwbG95T3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNQcm9wcyBleHRlbmRzIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyLiBXaGVuIHByb3ZpZGVkLCBpdCBpcyBwYXNzZWRcbiAgICogZGlyZWN0bHkgdG8gYEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkRmFyZ2F0ZVNlcnZpY2VgLiBJZiB0aGUgQUxCIGFscmVhZHlcbiAgICogaGFzIGEgbGlzdGVuZXIgb24gcG9ydCA4MCwgY2FsbCBgcmVtb3ZlQXV0b0NyZWF0ZWRMaXN0ZW5lcigpYCBhZnRlclxuICAgKiBjb25zdHJ1Y3Rpb24gdG8gYXZvaWQgZGVwbG95bWVudCBmYWlsdXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFsYj86IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcjtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIGRpc3RyaWJ1dGlvbi4gQ2FuIGJlIHVzZWQgd2l0aCBgYmFzZVBhdGhgIHRvIGhvc3QgbXVsdGlwbGVcbiAgICogYXBwcyBvbiB0aGUgc2FtZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIEVDUyBjbHVzdGVyLiBXaGVuIHByb3ZpZGVkLCBjZGstbmV4dGpzIHdpbGwgc2tpcCBjcmVhdGluZ1xuICAgKiBhIG5ldyBjbHVzdGVyIGFuZCBWUEMgZ2F0ZXdheSBlbmRwb2ludHMuXG4gICAqL1xuICByZWFkb25seSBlY3NDbHVzdGVyPzogSUNsdXN0ZXI7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBwcm9wcyBvZiBhbnkgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzR2xvYmFsQ29udGFpbmVyc092ZXJyaWRlcztcbn1cblxuLyoqXG4gKiBEZXBsb3kgTmV4dC5qcyBnbG9iYWxseSBkaXN0cmlidXRlZCB3aXRoIGNvbnRhaW5lcnMuIFVzZXMgW0Nsb3VkRnJvbnRcbiAqIERpc3RyaWJ1dGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Rpc3RyaWJ1dGlvbi13b3JraW5nLXdpdGguaHRtbClcbiAqIGFzIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayAoQ0ROKSBmb3IgZ2xvYmFsIGRpc3RyaWJ1dGlvbiBhbmQgW0FXUyBGYXJnYXRlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9BV1NfRmFyZ2F0ZS5odG1sKVxuICogZm9yIGNvbnRhaW5lcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNHbG9iYWxDb250YWluZXJzIGV4dGVuZHMgTmV4dGpzQmFzZUNvbnN0cnVjdCB7XG4gIG5leHRqc0NvbnRhaW5lcnM6IE5leHRqc0NvbnRhaW5lcnM7XG4gIG5leHRqc0Rpc3RyaWJ1dGlvbjogTmV4dGpzRGlzdHJpYnV0aW9uO1xuICBuZXh0anNQb3N0RGVwbG95OiBOZXh0anNQb3N0RGVwbG95O1xuICAvKipcbiAgICogUHVibGljIFVSTCBvZiB0aGUgYXBwLCBpbmNsdWRpbmcgYGJhc2VQYXRoYCDigJQgdGhlIGFwcCBvbmx5IGFuc3dlcnMgdW5kZXJcbiAgICogdGhhdCBwcmVmaXgsIGFuZCBpdCdzIGRlcml2ZWQgZnJvbSB0aGUgYXBwJ3Mgb3duIGBiYXNlUGF0aGAgd2hlbiB0aGUgcHJvcCBpc1xuICAgKiBsZWZ0IHVuc2V0LCBzbyBpdCdzIHRoZXJlIHdoZXRoZXIgb3Igbm90IHlvdSBhc2tlZCBmb3IgaXQuXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKFxuICAgICAgYGh0dHBzOi8vJHt0aGlzLm5leHRqc0Rpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb24uZG9tYWluTmFtZX1gLFxuICAgICAgdGhpcy5yZXNvbHZlZEJhc2VQYXRoLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNHbG9iYWxDb250YWluZXJzUHJvcHM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBOZXh0anNHbG9iYWxDb250YWluZXJzUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMsIE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMubmV4dGpzQ29udGFpbmVycyA9IHRoaXMuY3JlYXRlTmV4dGpzQ29udGFpbmVycygpO1xuICAgIHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNEaXN0cmlidXRpb24oKTtcbiAgICB0aGlzLndpcmVDbG91ZEZyb250SW52YWxpZGF0aW9uKCk7XG4gICAgdGhpcy5uZXh0anNQb3N0RGVwbG95ID0gdGhpcy5jcmVhdGVOZXh0anNQb3N0RGVwbG95KCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHRoZSB0YXNrIHJvbGUgcGVybWlzc2lvbiB0byBpbnZhbGlkYXRlIHRoZSBkaXN0cmlidXRpb24gYW5kIHBhc3Nlc1xuICAgKiBhbG9uZyBhIHdheSB0byBsb29rIHVwIGl0cyBJRCwgc28gb24tZGVtYW5kIHJldmFsaWRhdGlvblxuICAgKiAocmV2YWxpZGF0ZVRhZy9yZXZhbGlkYXRlUGF0aCkgY2FuIGV2aWN0IHN0YWxlIHJlc3BvbnNlcyBmcm9tIHRoZSBDRE5cbiAgICogZWRnZSBjYWNoZSwgbm90IGp1c3QgdGhlIG9yaWdpbidzIFMzL0R5bmFtb0RCIGNhY2hlLlxuICAgKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uIElEIGlzIHB1Ymxpc2hlZCB0byBhbiBTU00gUGFyYW1ldGVyICh3aG9zZSAqbmFtZSogaXNcbiAgICogc3RhdGljIGFuZCBzYWZlIHRvIGVtYmVkIGluIHRoZSB0YXNrJ3MgZW52aXJvbm1lbnQpIHJhdGhlciB0aGFuIHBhc3NlZFxuICAgKiBkaXJlY3RseSwgYW5kIHRoZSBJQU0gZ3JhbnQgaXMgc2NvcGVkIHRvIGFsbCBkaXN0cmlidXRpb25zIGluIHRoaXNcbiAgICogYWNjb3VudC9yZWdpb24gcmF0aGVyIHRoYW4gdGhpcyBzcGVjaWZpYyBvbmUuIFNlZSB0aGUgZXF1aXZhbGVudCBtZXRob2RcbiAgICogaW4gYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AgZm9yIHdoeTogdGhlIHNhbWUgcGF0dGVybiBpcyB1c2VkIGhlcmUgZm9yXG4gICAqIGNvbnNpc3RlbmN5LCBldmVuIHRob3VnaCBjb250YWluZXJzJyBkaXN0cmlidXRpb24gKEFMQi1vcmlnaW4tYmFzZWQpXG4gICAqIGRvZXNuJ3QgaGl0IHRoZSBjaXJjdWxhciBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGZ1bmN0aW9ucycgZG9lcy5cbiAgICovXG4gIHByaXZhdGUgd2lyZUNsb3VkRnJvbnRJbnZhbGlkYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCB7IHRhc2tEZWZpbml0aW9uIH0gPSB0aGlzLm5leHRqc0NvbnRhaW5lcnMuYWxiRmFyZ2F0ZVNlcnZpY2U7XG4gICAgY29uc3QgZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lID0gYGNkay1uZXh0anMtZGlzdHJpYnV0aW9uLWlkLSR7dGhpcy5ub2RlLmFkZHJ9YDtcblxuICAgIG5ldyBTdHJpbmdQYXJhbWV0ZXIodGhpcywgXCJEaXN0cmlidXRpb25JZFBhcmFtZXRlclwiLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBkaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUsXG4gICAgICBzdHJpbmdWYWx1ZTogdGhpcy5uZXh0anNEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkLFxuICAgIH0pO1xuXG4gICAgdGFza0RlZmluaXRpb24uYWRkVG9UYXNrUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzc206R2V0UGFyYW1ldGVyXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgICAgICAgc2VydmljZTogXCJzc21cIixcbiAgICAgICAgICAgIHJlc291cmNlOiBcInBhcmFtZXRlclwiLFxuICAgICAgICAgICAgcmVzb3VyY2VOYW1lOiBkaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHRhc2tEZWZpbml0aW9uLmFkZFRvVGFza1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wiY2xvdWRmcm9udDpDcmVhdGVJbnZhbGlkYXRpb25cIl0sXG4gICAgICAgIC8vIFNjb3BlZCB0byBhbGwgZGlzdHJpYnV0aW9ucyAobm90IGp1c3QgdGhpcyBvbmUpIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAvLyB3aXRoIE5leHRqc0dsb2JhbEZ1bmN0aW9ucywgd2hpY2ggY2FuJ3Qgc2NvcGUgdGhpcyB0byBpdHMgc3BlY2lmaWNcbiAgICAgICAgLy8gZGlzdHJpYnV0aW9uIGR1ZSB0byBhIGNpcmN1bGFyIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgKHNlZSB0aGVcbiAgICAgICAgLy8gY2xhc3MgZG9jIGNvbW1lbnQgYWJvdmUgYW5kIHRoZSBlcXVpdmFsZW50IG1ldGhvZCB0aGVyZSkuIEhlbmNlXG4gICAgICAgIC8vIHRoZSBTU00gcGFyYW1ldGVyIGluZGlyZWN0aW9uIGFib3ZlIGZvciBsb29raW5nIHVwIHRoZSBJRCBhdFxuICAgICAgICAvLyBydW50aW1lIGluc3RlYWQgb2Ygc3ludGggdGltZS5cbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgICAgIHNlcnZpY2U6IFwiY2xvdWRmcm9udFwiLFxuICAgICAgICAgICAgcmVnaW9uOiBcIlwiLFxuICAgICAgICAgICAgcmVzb3VyY2U6IFwiZGlzdHJpYnV0aW9uXCIsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6IFwiKlwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICB0YXNrRGVmaW5pdGlvbi5kZWZhdWx0Q29udGFpbmVyPy5hZGRFbnZpcm9ubWVudChcbiAgICAgIFwiQ0RLX05FWFRKU19ESVNUUklCVVRJT05fSURfUEFSQU1fTkFNRVwiLFxuICAgICAgZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0NvbnRhaW5lcnMoKTogTmV4dGpzQ29udGFpbmVycyB7XG4gICAgLy8gQ3JlYXRlIGNvbnRhaW5lcnMgd2l0aCBsb2NhbCBidWlsZCBvdXRwdXRcbiAgICByZXR1cm4gbmV3IE5leHRqc0NvbnRhaW5lcnModGhpcywgXCJOZXh0anNDb250YWluZXJzXCIsIHtcbiAgICAgIC4uLnRoaXMuY29tcHV0ZUJhc2VQcm9wcygpLFxuICAgICAgYWxiOiB0aGlzLnByb3BzLmFsYixcbiAgICAgIGVjc0NsdXN0ZXI6IHRoaXMucHJvcHMuZWNzQ2x1c3RlcixcbiAgICAgIHJlbGF0aXZlRW50cnlwb2ludFBhdGg6IHRoaXMubmV4dGpzQnVpbGQucmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50LFxuICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNDb250YWluZXJzLFxuICAgICAgICBlY3NDbHVzdGVyUHJvcHM6IHtcbiAgICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQ29udGFpbmVycz8uZWNzQ2x1c3RlclByb3BzLFxuICAgICAgICAgIHZwYzogdGhpcy5iYXNlUHJvcHMudnBjLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNDb250YWluZXJzUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0Rpc3RyaWJ1dGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbih0aGlzLCBcIk5leHRqc0Rpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBhc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLnJlc29sdmVkQmFzZVBhdGgsXG4gICAgICBjZXJ0aWZpY2F0ZTogdGhpcy5uZXh0anNDb250YWluZXJzLmFsYkZhcmdhdGVTZXJ2aWNlLmNlcnRpZmljYXRlLFxuICAgICAgZGlzdHJpYnV0aW9uOiB0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbixcbiAgICAgIGxvYWRCYWxhbmNlcjogdGhpcy5uZXh0anNDb250YWluZXJzLmFsYkZhcmdhdGVTZXJ2aWNlLmxvYWRCYWxhbmNlcixcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IHRoaXMubmV4dGpzQnVpbGQucHVibGljRGlyRW50cmllcyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNEaXN0cmlidXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzUG9zdERlcGxveSgpOiBOZXh0anNQb3N0RGVwbG95IHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1Bvc3REZXBsb3kodGhpcywgXCJOZXh0anNQb3N0RGVwbG95XCIsIHtcbiAgICAgIGJ1aWxkSWQ6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJZCxcbiAgICAgIGRpc3RyaWJ1dGlvbjogdGhpcy5uZXh0anNEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uLFxuICAgICAgY2FjaGVCdWNrZXQ6IHRoaXMubmV4dGpzQ2FjaGUuY2FjaGVCdWNrZXQsXG4gICAgICByZXZhbGlkYXRpb25UYWJsZTogdGhpcy5uZXh0anNDYWNoZS5yZXZhbGlkYXRpb25UYWJsZSxcbiAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogdGhpcy5uZXh0anNTdGF0aWNBc3NldHMuYnVja2V0LFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUG9zdERlcGxveSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNQb3N0RGVwbG95UHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWdsb2JhbC1jb250YWluZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtZ2xvYmFsLWNvbnRhaW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUlBLDRDQUEwQztBQUMxQyxtRUFLaUM7QUFHakMsMkVBRzZDO0FBQzdDLGdFQUdnQztBQUVoQyxrREFBOEM7QUEyRDlDOzs7OztHQUtHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSwyQ0FBbUI7O0lBQzdELGdCQUFnQixDQUFtQjtJQUNuQyxrQkFBa0IsQ0FBcUI7SUFDdkMsZ0JBQWdCLENBQW1CO0lBQ25DOzs7O09BSUc7SUFDSCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUEsb0JBQVEsRUFDYixXQUFXLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLEVBQzVELElBQUksQ0FBQyxnQkFBZ0IsQ0FDdEIsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQThCO0lBRTNDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWtDO1FBRWxDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMxRCxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDO1FBQ25FLDJFQUEyRTtRQUMzRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDakQsWUFBWSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5RCxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUM3Qyw0QkFBNEIsRUFDNUIsWUFBWSxDQUFDLGNBQWMsQ0FDNUIsQ0FBQztRQUNGLHVFQUF1RTtRQUN2RSwrREFBK0Q7UUFDL0Qsc0RBQXNEO1FBQ3RELGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQzdDLG1DQUFtQyxFQUNuQyxHQUFHLENBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLDRDQUE0QztRQUM1QyxPQUFPLElBQUksb0NBQWdCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDbkIsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLGVBQWUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDekUsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0I7WUFDakUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0I7WUFDdkQsU0FBUyxFQUFFO2dCQUNULEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO2dCQUN6QyxlQUFlLEVBQUU7b0JBQ2YsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlO29CQUMxRCxvRUFBb0U7b0JBQ3BFLG1FQUFtRTtvQkFDbkUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzNEO2FBQ0Y7WUFDRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQjtTQUN2RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLE9BQU8sSUFBSSx3Q0FBa0IsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDeEQsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO1lBQzVDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QjtZQUN2RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFdBQVc7WUFDaEUsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtZQUNyQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVk7WUFDbEUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxrQkFBa0I7WUFDbkQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7WUFDbkQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUI7U0FDekUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0Rkgsd0RBdUZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlzdHJpYnV0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQgeyBJQ2x1c3RlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0NvbnRhaW5lcnMsXG4gIE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29udGFpbmVyc1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzRGlzdHJpYnV0aW9uLFxuICBOZXh0anNEaXN0cmlidXRpb25PdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtZGlzdHJpYnV0aW9uXCI7XG5pbXBvcnQgeyBOZXh0anNQb3N0RGVwbG95IH0gZnJvbSBcIi4uL25leHRqcy1wb3N0LWRlcGxveVwiO1xuaW1wb3J0IHsgam9pblBhdGggfSBmcm9tIFwiLi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzR2xvYmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNDb250YWluZXJzUHJvcHM/OiBPcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzRGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzO1xufVxuXG4vKipcbiAqIE92ZXJyaWRlcyBmb3IgYE5leHRqc0dsb2JhbENvbnRhaW5lcnNgLiBPdmVycmlkZXMgYXJlIGxvd2VyIGxldmVsIHRoYW5cbiAqIHByb3BzIGFuZCBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIENESyBDb25zdHJ1Y3RzIGdpdmluZyB5b3UgbW9yZSBjb250cm9sLiBJdCdzXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgY2F1dGlvbiBhbmQgcmV2aWV3IHNvdXJjZSBjb2RlIHNvIHlvdSBrbm93IGhvdyB0aGV5J3JlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzR2xvYmFsQ29udGFpbmVyc092ZXJyaWRlcyBleHRlbmRzIE5leHRqc0Jhc2VPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNHbG9iYWxDb250YWluZXJzPzogTmV4dGpzR2xvYmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVycz86IE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0Rpc3RyaWJ1dGlvbj86IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNHbG9iYWxDb250YWluZXJzUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlci4gV2hlbiBwcm92aWRlZCwgaXQgaXMgcGFzc2VkXG4gICAqIGRpcmVjdGx5IHRvIGBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlYC4gSWYgdGhlIEFMQiBhbHJlYWR5XG4gICAqIGhhcyBhIGxpc3RlbmVyIG9uIHBvcnQgODAsIGNhbGwgYHJlbW92ZUF1dG9DcmVhdGVkTGlzdGVuZXIoKWAgYWZ0ZXJcbiAgICogY29uc3RydWN0aW9uIHRvIGF2b2lkIGRlcGxveW1lbnQgZmFpbHVyZXMuXG4gICAqL1xuICByZWFkb25seSBhbGI/OiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBkaXN0cmlidXRpb24uIENhbiBiZSB1c2VkIHdpdGggYGJhc2VQYXRoYCB0byBob3N0IG11bHRpcGxlXG4gICAqIGFwcHMgb24gdGhlIHNhbWUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICByZWFkb25seSBkaXN0cmlidXRpb24/OiBEaXN0cmlidXRpb247XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBFQ1MgY2x1c3Rlci4gV2hlbiBwcm92aWRlZCwgY2RrLW5leHRqcyB3aWxsIHNraXAgY3JlYXRpbmdcbiAgICogYSBuZXcgY2x1c3RlciBhbmQgVlBDIGdhdGV3YXkgZW5kcG9pbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWNzQ2x1c3Rlcj86IElDbHVzdGVyO1xuICAvKipcbiAgICogUGF0aCB0byBBUEkgUm91dGUgSGFuZGxlciB0aGF0IHJldHVybnMgSFRUUCAyMDAgdG8gZW5zdXJlIGNvbXB1dGUgaGVhbHRoLlxuICAgKiBVc2VkIGJ5IHRoZSBBTEIgdGFyZ2V0IGdyb3VwIGFuZCB0aGUgRUNTIGNvbnRhaW5lciBoZWFsdGggY2hlY2ssIGJvdGggb2ZcbiAgICogd2hpY2ggaGF2ZSB0byBiZSBhYmxlIHRvIHRlbGwgYSBydW5uaW5nIHRhc2sgZnJvbSBhIHdlZGdlZCBvbmUuXG4gICAqXG4gICAqIEdpdmUgdGhlIHBhdGggYXMgeW91ciBhcHAgcm91dGVzIGl0LCB3aXRob3V0IHlvdXIgYXBwJ3MgYGJhc2VQYXRoYCDigJRcbiAgICogY2RrLW5leHRqcyBhZGRzIHRoYXQgcHJlZml4LCBzaW5jZSBib3RoIGNoZWNrcyBoaXQgdGhlIGFwcCBkaXJlY3RseS5cbiAgICogQGV4YW1wbGUgXCIvYXBpL2hlYWx0aFwiXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGFwaS9oZWFsdGgvcm91dGUudHNcbiAgICogaW1wb3J0IHsgTmV4dFJlc3BvbnNlIH0gZnJvbSBcIm5leHQvc2VydmVyXCI7XG4gICAqXG4gICAqIGV4cG9ydCBmdW5jdGlvbiBHRVQoKSB7XG4gICAqICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFwiXCIpO1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVja1BhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIG9mIGFueSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNHbG9iYWxDb250YWluZXJzT3ZlcnJpZGVzO1xufVxuXG4vKipcbiAqIERlcGxveSBOZXh0LmpzIGdsb2JhbGx5IGRpc3RyaWJ1dGVkIHdpdGggY29udGFpbmVycy4gVXNlcyBbQ2xvdWRGcm9udFxuICogRGlzdHJpYnV0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZGlzdHJpYnV0aW9uLXdvcmtpbmctd2l0aC5odG1sKVxuICogYXMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIChDRE4pIGZvciBnbG9iYWwgZGlzdHJpYnV0aW9uIGFuZCBbQVdTIEZhcmdhdGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0FXU19GYXJnYXRlLmh0bWwpXG4gKiBmb3IgY29udGFpbmVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0dsb2JhbENvbnRhaW5lcnMgZXh0ZW5kcyBOZXh0anNCYXNlQ29uc3RydWN0IHtcbiAgbmV4dGpzQ29udGFpbmVyczogTmV4dGpzQ29udGFpbmVycztcbiAgbmV4dGpzRGlzdHJpYnV0aW9uOiBOZXh0anNEaXN0cmlidXRpb247XG4gIG5leHRqc1Bvc3REZXBsb3k6IE5leHRqc1Bvc3REZXBsb3k7XG4gIC8qKlxuICAgKiBQdWJsaWMgVVJMIG9mIHRoZSBhcHAsIGluY2x1ZGluZyBgYmFzZVBhdGhgIOKAlCB0aGUgYXBwIG9ubHkgYW5zd2VycyB1bmRlclxuICAgKiB0aGF0IHByZWZpeCwgYW5kIGl0J3MgZGVyaXZlZCBmcm9tIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCB3aGVuIHRoZSBwcm9wIGlzXG4gICAqIGxlZnQgdW5zZXQsIHNvIGl0J3MgdGhlcmUgd2hldGhlciBvciBub3QgeW91IGFza2VkIGZvciBpdC5cbiAgICovXG4gIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gam9pblBhdGgoXG4gICAgICBgaHR0cHM6Ly8ke3RoaXMubmV4dGpzRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbi5kb21haW5OYW1lfWAsXG4gICAgICB0aGlzLnJlc29sdmVkQmFzZVBhdGgsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0dsb2JhbENvbnRhaW5lcnNQcm9wcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc0dsb2JhbENvbnRhaW5lcnNQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcywgTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSUyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5uZXh0anNDb250YWluZXJzID0gdGhpcy5jcmVhdGVOZXh0anNDb250YWluZXJzKCk7XG4gICAgdGhpcy5uZXh0anNEaXN0cmlidXRpb24gPSB0aGlzLmNyZWF0ZU5leHRqc0Rpc3RyaWJ1dGlvbigpO1xuICAgIGNvbnN0IHsgdGFza0RlZmluaXRpb24gfSA9IHRoaXMubmV4dGpzQ29udGFpbmVycy5hbGJGYXJnYXRlU2VydmljZTtcbiAgICAvLyBMZXRzIG9uLWRlbWFuZCByZXZhbGlkYXRpb24gZXZpY3Qgc3RhbGUgcmVzcG9uc2VzIGZyb20gdGhlIENETiBlZGdlLCBub3RcbiAgICAvLyBqdXN0IHRoZSBvcmlnaW4ncyBjYWNoZS4gVGhlIG9yaWdpbiBpcyB0aGUgQUxCLCB3aGljaCB0aGUgdGFzayBkb2Vzbid0XG4gICAgLy8gZGVwZW5kIG9uLCBzbyBuYW1pbmcgdGhlIGRpc3RyaWJ1dGlvbiBoZXJlIG1ha2VzIG5vIGRlcGVuZGVuY3kgY3ljbGUuXG4gICAgY29uc3QgeyBkaXN0cmlidXRpb24gfSA9IHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uO1xuICAgIGRpc3RyaWJ1dGlvbi5ncmFudENyZWF0ZUludmFsaWRhdGlvbih0YXNrRGVmaW5pdGlvbi50YXNrUm9sZSk7XG4gICAgdGFza0RlZmluaXRpb24uZGVmYXVsdENvbnRhaW5lcj8uYWRkRW52aXJvbm1lbnQoXG4gICAgICBcIkNES19ORVhUSlNfRElTVFJJQlVUSU9OX0lEXCIsXG4gICAgICBkaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWQsXG4gICAgKTtcbiAgICAvLyBUaGUgQUxCIGlzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBkaXN0cmlidXRpb24ncyBWUEMgb3JpZ2luIGFsb25lLCBzb1xuICAgIC8vIGBDbG91ZEZyb250LUZvcndhcmRlZC1Qcm90b2AgaXMgYWx3YXlzIENsb3VkRnJvbnQncyBvd247IHNlZVxuICAgIC8vIGB2aWV3ZXJIZWFkZXJzYCBpbiBzcmMvcnVudGltZS9odHRwL25vZGUtc2VydmVyLnRzLlxuICAgIHRhc2tEZWZpbml0aW9uLmRlZmF1bHRDb250YWluZXI/LmFkZEVudmlyb25tZW50KFxuICAgICAgXCJDREtfTkVYVEpTX1RSVVNUX0NMT1VERlJPTlRfUFJPVE9cIixcbiAgICAgIFwiMVwiLFxuICAgICk7XG4gICAgdGhpcy5uZXh0anNQb3N0RGVwbG95ID0gdGhpcy5jcmVhdGVOZXh0anNQb3N0RGVwbG95KFxuICAgICAgdGhpcy5uZXh0anNEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0NvbnRhaW5lcnMoKTogTmV4dGpzQ29udGFpbmVycyB7XG4gICAgLy8gQ3JlYXRlIGNvbnRhaW5lcnMgd2l0aCBsb2NhbCBidWlsZCBvdXRwdXRcbiAgICByZXR1cm4gbmV3IE5leHRqc0NvbnRhaW5lcnModGhpcywgXCJOZXh0anNDb250YWluZXJzXCIsIHtcbiAgICAgIC4uLnRoaXMuY29tcHV0ZUJhc2VQcm9wcygpLFxuICAgICAgYWxiOiB0aGlzLnByb3BzLmFsYixcbiAgICAgIGJ1aWxkRGlyZWN0b3J5OiB0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgZWNzQ2x1c3RlcjogdGhpcy5wcm9wcy5lY3NDbHVzdGVyLFxuICAgICAgaGVhbHRoQ2hlY2tQYXRoOiB0aGlzLnJlc29sdmVkSGVhbHRoQ2hlY2tQYXRoKHRoaXMucHJvcHMuaGVhbHRoQ2hlY2tQYXRoKSxcbiAgICAgIHJlbGF0aXZlRW50cnlwb2ludFBhdGg6IHRoaXMubmV4dGpzQnVpbGQucmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50LFxuICAgICAgcmVsYXRpdmVQcm9qZWN0RGlyOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUHJvamVjdERpcixcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQ29udGFpbmVycyxcbiAgICAgICAgZWNzQ2x1c3RlclByb3BzOiB7XG4gICAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnM/LmVjc0NsdXN0ZXJQcm9wcyxcbiAgICAgICAgICAvLyBDb25kaXRpb25hbCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBGdW5jdGlvbnMnIGB2cGNgOiBhc3NpZ25lZFxuICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSwgYW4gdW5zZXQgYHZwY2AgcHJvcCB3b3VsZCBlcmFzZSB0aGUgb3ZlcnJpZGUncy5cbiAgICAgICAgICAuLi4odGhpcy5iYXNlUHJvcHMudnBjID8geyB2cGM6IHRoaXMuYmFzZVByb3BzLnZwYyB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNDb250YWluZXJzUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0Rpc3RyaWJ1dGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbih0aGlzLCBcIk5leHRqc0Rpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBhc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIGFzc2V0UHJlZml4OiB0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdBc3NldFByZWZpeFBhdGgsXG4gICAgICBiYXNlUGF0aDogdGhpcy5yZXNvbHZlZEJhc2VQYXRoLFxuICAgICAgY2VydGlmaWNhdGU6IHRoaXMubmV4dGpzQ29udGFpbmVycy5hbGJGYXJnYXRlU2VydmljZS5jZXJ0aWZpY2F0ZSxcbiAgICAgIGRpc3RyaWJ1dGlvbjogdGhpcy5wcm9wcy5kaXN0cmlidXRpb24sXG4gICAgICBsb2FkQmFsYW5jZXI6IHRoaXMubmV4dGpzQ29udGFpbmVycy5hbGJGYXJnYXRlU2VydmljZS5sb2FkQmFsYW5jZXIsXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNEaXN0cmlidXRpb24sXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiB0aGlzLm5leHRqc0J1aWxkLnB1YmxpY0RpckVudHJpZXMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzR2xvYmFsQ29udGFpbmVycz8ubmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,15 +1,12 @@
1
1
  import { Distribution } from "aws-cdk-lib/aws-cloudfront";
2
2
  import { Construct } from "constructs";
3
- import { NextjsFunctionsConstructOverrides, NextjsBaseOverrides, NextjsBaseConstruct, NextjsBaseProps } from "./nextjs-base-construct";
3
+ import { NextjsBaseConstructOverrides, NextjsBaseOverrides, NextjsBaseConstruct, NextjsBaseProps } from "./nextjs-base-construct";
4
4
  import { OptionalNextjsDistributionProps } from "../generated-structs/OptionalNextjsDistributionProps";
5
- import { OptionalNextjsPostDeployProps } from "../generated-structs/OptionalNextjsPostDeployProps";
6
- import { NextjsFunctions, NextjsFunctionsOverrides } from "../nextjs-compute/nextjs-functions";
7
- import { NextjsImageFunction, NextjsImageFunctionOverrides } from "../nextjs-compute/nextjs-image-function";
5
+ import { NextjsFunctionGroup, NextjsFunctions, NextjsFunctionsOverrides } from "../nextjs-compute/nextjs-functions";
8
6
  import { NextjsDistribution, NextjsDistributionOverrides } from "../nextjs-distribution";
9
- import { NextjsPostDeploy, NextjsPostDeployOverrides } from "../nextjs-post-deploy";
10
- export interface NextjsGlobalFunctionsConstructOverrides extends NextjsFunctionsConstructOverrides {
7
+ import { NextjsPostDeploy } from "../nextjs-post-deploy";
8
+ export interface NextjsGlobalFunctionsConstructOverrides extends NextjsBaseConstructOverrides {
11
9
  readonly nextjsDistributionProps?: OptionalNextjsDistributionProps;
12
- readonly nextjsPostDeployProps?: OptionalNextjsPostDeployProps;
13
10
  }
14
11
  /**
15
12
  * Overrides for `NextjsGlobalFunctions`. Overrides are lower level than
@@ -19,9 +16,7 @@ export interface NextjsGlobalFunctionsConstructOverrides extends NextjsFunctions
19
16
  export interface NextjsGlobalFunctionsOverrides extends NextjsBaseOverrides {
20
17
  readonly nextjsGlobalFunctions?: NextjsGlobalFunctionsConstructOverrides;
21
18
  readonly nextjsFunctions?: NextjsFunctionsOverrides;
22
- readonly nextjsImageFunction?: NextjsImageFunctionOverrides;
23
19
  readonly nextjsDistribution?: NextjsDistributionOverrides;
24
- readonly nextjsPostDeploy?: NextjsPostDeployOverrides;
25
20
  }
26
21
  export interface NextjsGlobalFunctionsProps extends NextjsBaseProps {
27
22
  /**
@@ -29,6 +24,19 @@ export interface NextjsGlobalFunctionsProps extends NextjsBaseProps {
29
24
  * apps on the same CloudFront distribution.
30
25
  */
31
26
  readonly distribution?: Distribution;
27
+ /**
28
+ * Package sets of routes into separate Lambda functions, each fronted by its
29
+ * own CloudFront behaviors.
30
+ *
31
+ * Reach for this when a single function exceeds Lambda's 250 MB unzipped
32
+ * limit — cdk-nextjs throws at synth with the measured size when it does. It is
33
+ * not a performance or isolation feature: every group ships the same Next.js
34
+ * runtime, so splitting only moves route-local code.
35
+ *
36
+ * @see NextjsFunctionGroup for the pattern grammar and its limits.
37
+ * @default - one function serves every route
38
+ */
39
+ readonly functionGroups?: NextjsFunctionGroup[];
32
40
  /**
33
41
  * Override props of any construct.
34
42
  */
@@ -42,12 +50,6 @@ export interface NextjsGlobalFunctionsProps extends NextjsBaseProps {
42
50
  */
43
51
  export declare class NextjsGlobalFunctions extends NextjsBaseConstruct {
44
52
  nextjsFunctions: NextjsFunctions;
45
- /**
46
- * Only created when the (experimental, unsupported) dedicated image
47
- * optimization Lambda is enabled. `_next/image` is otherwise served by
48
- * {@link nextjsFunctions}.
49
- */
50
- nextjsImageFunction?: NextjsImageFunction;
51
53
  nextjsDistribution: NextjsDistribution;
52
54
  nextjsPostDeploy: NextjsPostDeploy;
53
55
  /**
@@ -59,21 +61,17 @@ export declare class NextjsGlobalFunctions extends NextjsBaseConstruct {
59
61
  private props;
60
62
  constructor(scope: Construct, id: string, props: NextjsGlobalFunctionsProps);
61
63
  /**
62
- * Grants the function permission to invalidate the distribution and passes
63
- * along a way to look up its ID, so on-demand revalidation
64
- * (revalidateTag/revalidatePath) can evict stale responses from the CDN
65
- * edge cache, not just the origin's S3/DynamoDB cache.
64
+ * Lets `functions` invalidate the distribution, so on-demand revalidation
65
+ * (revalidateTag/revalidatePath) can evict stale responses from the CDN edge
66
+ * cache, not just the origin's S3/DynamoDB cache.
66
67
  *
67
- * The distribution ID can't be passed as a plain env var or scoped IAM
68
- * resource ARN: the distribution's origin references this function's URL,
69
- * so making the function's role/environment reference the distribution's
70
- * ID in return would create a circular CloudFormation dependency. Instead,
71
- * the ID is published to an SSM Parameter (whose *name* is static and safe
72
- * to embed) that the function reads at runtime, and the IAM grant is
73
- * scoped to all distributions in this account/region rather than this
74
- * specific (not-yet-known-at-synth-time) distribution.
68
+ * The distribution's origin is the functions' URL, so a function naming the
69
+ * distribution back — in its environment, or in its role's default policy,
70
+ * which a function depends on — would be a circular CloudFormation
71
+ * dependency. So the ID is published to an SSM Parameter whose *name* is
72
+ * static, and the grants go in a separate policy that depends on the
73
+ * distribution while no function depends on it.
75
74
  */
76
75
  private wireCloudFrontInvalidation;
77
76
  private createNextjsDistribution;
78
- private createNextjsPostDeploy;
79
77
  }
@@ -5,12 +5,11 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const aws_cdk_lib_1 = require("aws-cdk-lib");
6
6
  const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
7
  const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
8
+ const function_groups_1 = require("../adapter/function-groups");
8
9
  const constants_1 = require("../constants");
9
10
  const nextjs_base_construct_1 = require("./nextjs-base-construct");
10
11
  const nextjs_distribution_1 = require("../nextjs-distribution");
11
- const nextjs_post_deploy_1 = require("../nextjs-post-deploy");
12
12
  const base_path_1 = require("../utils/base-path");
13
- const experimental_flags_1 = require("../utils/experimental-flags");
14
13
  /**
15
14
  * Deploy Next.js globally distributed with functions. Uses [CloudFront
16
15
  * Distribution](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html)
@@ -18,14 +17,8 @@ const experimental_flags_1 = require("../utils/experimental-flags");
18
17
  * for functions.
19
18
  */
20
19
  class NextjsGlobalFunctions extends nextjs_base_construct_1.NextjsBaseConstruct {
21
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalFunctions", version: "0.6.1" };
20
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalFunctions", version: "0.7.0" };
22
21
  nextjsFunctions;
23
- /**
24
- * Only created when the (experimental, unsupported) dedicated image
25
- * optimization Lambda is enabled. `_next/image` is otherwise served by
26
- * {@link nextjsFunctions}.
27
- */
28
- nextjsImageFunction;
29
22
  nextjsDistribution;
30
23
  nextjsPostDeploy;
31
24
  /**
@@ -40,87 +33,77 @@ class NextjsGlobalFunctions extends nextjs_base_construct_1.NextjsBaseConstruct
40
33
  constructor(scope, id, props) {
41
34
  super(scope, id, props, constants_1.NextjsType.GLOBAL_FUNCTIONS);
42
35
  this.props = props;
43
- this.nextjsFunctions = this.createNextjsFunctions(this.props.overrides?.nextjsFunctions);
44
- if ((0, experimental_flags_1.useDedicatedImageFunction)()) {
45
- this.nextjsImageFunction = this.createNextjsImageFunction(this.props.overrides?.nextjsImageFunction);
46
- }
36
+ this.nextjsFunctions = this.createNextjsFunctions();
47
37
  this.nextjsDistribution = this.createNextjsDistribution();
48
- this.wireCloudFrontInvalidation();
49
- this.nextjsPostDeploy = this.createNextjsPostDeploy();
38
+ // Every group, not just the default one: `revalidateTag`/`revalidatePath` can
39
+ // be called from any route handler, so any function may need to invalidate.
40
+ const functions = this.nextjsFunctions.functionGroups.map((group) => group.function);
41
+ this.wireCloudFrontInvalidation(functions);
42
+ this.nextjsPostDeploy = this.createNextjsPostDeploy(this.nextjsDistribution.distribution);
50
43
  }
51
44
  /**
52
- * Grants the function permission to invalidate the distribution and passes
53
- * along a way to look up its ID, so on-demand revalidation
54
- * (revalidateTag/revalidatePath) can evict stale responses from the CDN
55
- * edge cache, not just the origin's S3/DynamoDB cache.
45
+ * Lets `functions` invalidate the distribution, so on-demand revalidation
46
+ * (revalidateTag/revalidatePath) can evict stale responses from the CDN edge
47
+ * cache, not just the origin's S3/DynamoDB cache.
56
48
  *
57
- * The distribution ID can't be passed as a plain env var or scoped IAM
58
- * resource ARN: the distribution's origin references this function's URL,
59
- * so making the function's role/environment reference the distribution's
60
- * ID in return would create a circular CloudFormation dependency. Instead,
61
- * the ID is published to an SSM Parameter (whose *name* is static and safe
62
- * to embed) that the function reads at runtime, and the IAM grant is
63
- * scoped to all distributions in this account/region rather than this
64
- * specific (not-yet-known-at-synth-time) distribution.
49
+ * The distribution's origin is the functions' URL, so a function naming the
50
+ * distribution back — in its environment, or in its role's default policy,
51
+ * which a function depends on — would be a circular CloudFormation
52
+ * dependency. So the ID is published to an SSM Parameter whose *name* is
53
+ * static, and the grants go in a separate policy that depends on the
54
+ * distribution while no function depends on it.
65
55
  */
66
- wireCloudFrontInvalidation() {
67
- const stack = aws_cdk_lib_1.Stack.of(this);
68
- const distributionIdParameterName = `cdk-nextjs-distribution-id-${this.node.addr}`;
56
+ wireCloudFrontInvalidation(functions) {
57
+ const { distribution } = this.nextjsDistribution;
58
+ const parameterName = `cdk-nextjs-distribution-id-${this.node.addr}`;
69
59
  new aws_ssm_1.StringParameter(this, "DistributionIdParameter", {
70
- parameterName: distributionIdParameterName,
71
- stringValue: this.nextjsDistribution.distribution.distributionId,
60
+ parameterName,
61
+ stringValue: distribution.distributionId,
72
62
  });
73
- this.nextjsFunctions.function.addToRolePolicy(new aws_iam_1.PolicyStatement({
74
- actions: ["ssm:GetParameter"],
75
- resources: [
76
- stack.formatArn({
77
- service: "ssm",
78
- resource: "parameter",
79
- resourceName: distributionIdParameterName,
63
+ new aws_iam_1.Policy(this, "InvalidationPolicy", {
64
+ // A `new Function` always has a role; only imported ones lack it.
65
+ roles: functions.map((fn) => fn.role),
66
+ statements: [
67
+ new aws_iam_1.PolicyStatement({
68
+ actions: ["ssm:GetParameter"],
69
+ resources: [
70
+ aws_cdk_lib_1.Stack.of(this).formatArn({
71
+ service: "ssm",
72
+ resource: "parameter",
73
+ resourceName: parameterName,
74
+ }),
75
+ ],
80
76
  }),
81
- ],
82
- }));
83
- this.nextjsFunctions.function.addToRolePolicy(new aws_iam_1.PolicyStatement({
84
- actions: ["cloudfront:CreateInvalidation"],
85
- // Can't scope this to the specific distribution: the distribution's
86
- // origin already depends on this function (via its FunctionUrl), so
87
- // referencing the distribution's ID here would create a circular
88
- // CloudFormation dependency. Hence the SSM parameter indirection
89
- // above for looking up the ID at runtime instead of synth time.
90
- resources: [
91
- stack.formatArn({
92
- service: "cloudfront",
93
- region: "",
94
- resource: "distribution",
95
- resourceName: "*",
77
+ new aws_iam_1.PolicyStatement({
78
+ actions: ["cloudfront:CreateInvalidation"],
79
+ resources: [distribution.distributionArn],
96
80
  }),
97
81
  ],
98
- }));
99
- this.nextjsFunctions.function.addEnvironment("CDK_NEXTJS_DISTRIBUTION_ID_PARAM_NAME", distributionIdParameterName);
82
+ });
83
+ functions.forEach((fn) => fn.addEnvironment("CDK_NEXTJS_DISTRIBUTION_ID_PARAM_NAME", parameterName));
100
84
  }
101
85
  createNextjsDistribution() {
102
86
  return new nextjs_distribution_1.NextjsDistribution(this, "NextjsDistribution", {
103
87
  assetsBucket: this.nextjsStaticAssets.bucket,
88
+ assetPrefix: this.nextjsBuild.nextConfigAssetPrefixPath,
104
89
  basePath: this.resolvedBasePath,
90
+ distribution: this.props.distribution,
105
91
  functionUrl: this.nextjsFunctions.functionUrl,
106
- imageFunctionUrl: this.nextjsImageFunction?.functionUrl,
107
92
  nextjsType: this.nextjsType,
108
93
  overrides: this.props.overrides?.nextjsDistribution,
109
94
  publicDirEntries: this.nextjsBuild.publicDirEntries,
95
+ // The default group backs the default behavior, so only the rest need
96
+ // behaviors of their own.
97
+ functionGroups: this.nextjsFunctions.functionGroups
98
+ .filter((group) => group.name !== function_groups_1.DEFAULT_FUNCTION_GROUP)
99
+ .map((group) => ({
100
+ name: group.name,
101
+ functionUrl: group.functionUrl,
102
+ })),
103
+ functionGroupBehaviors: this.nextjsBuild.functionGroupBehaviors,
110
104
  ...this.props.overrides?.nextjsGlobalFunctions?.nextjsDistributionProps,
111
105
  });
112
106
  }
113
- createNextjsPostDeploy() {
114
- return new nextjs_post_deploy_1.NextjsPostDeploy(this, "NextjsPostDeploy", {
115
- buildId: this.nextjsBuild.buildId,
116
- distribution: this.nextjsDistribution.distribution,
117
- cacheBucket: this.nextjsCache.cacheBucket,
118
- revalidationTable: this.nextjsCache.revalidationTable,
119
- staticAssetsBucket: this.nextjsStaticAssets.bucket,
120
- overrides: this.props.overrides?.nextjsPostDeploy,
121
- ...this.props.overrides?.nextjsGlobalFunctions?.nextjsPostDeployProps,
122
- });
123
- }
124
107
  }
125
108
  exports.NextjsGlobalFunctions = NextjsGlobalFunctions;
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWdsb2JhbC1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1nbG9iYWwtZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBb0M7QUFFcEMsaURBQXNEO0FBQ3RELGlEQUFzRDtBQUV0RCw0Q0FBMEM7QUFDMUMsbUVBS2lDO0FBV2pDLGdFQUdnQztBQUNoQyw4REFHK0I7QUFDL0Isa0RBQThDO0FBQzlDLG9FQUF3RTtBQWdDeEU7Ozs7O0dBS0c7QUFDSCxNQUFhLHFCQUFzQixTQUFRLDJDQUFtQjs7SUFDNUQsZUFBZSxDQUFrQjtJQUNqQzs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQXVCO0lBQzFDLGtCQUFrQixDQUFxQjtJQUN2QyxnQkFBZ0IsQ0FBbUI7SUFDbkM7Ozs7T0FJRztJQUNILElBQUksR0FBRztRQUNMLE9BQU8sSUFBQSxvQkFBUSxFQUNiLFdBQVcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBNkI7SUFFMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsc0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQ3RDLENBQUM7UUFDRixJQUFJLElBQUEsOENBQXlCLEdBQUUsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQ3ZELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUMxQyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ssMEJBQTBCO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0sMkJBQTJCLEdBQUcsOEJBQThCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFbkYsSUFBSSx5QkFBZSxDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRTtZQUNuRCxhQUFhLEVBQUUsMkJBQTJCO1lBQzFDLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGNBQWM7U0FDakUsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUMzQyxJQUFJLHlCQUFlLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7WUFDN0IsU0FBUyxFQUFFO2dCQUNULEtBQUssQ0FBQyxTQUFTLENBQUM7b0JBQ2QsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFlBQVksRUFBRSwyQkFBMkI7aUJBQzFDLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUMzQyxJQUFJLHlCQUFlLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUMsK0JBQStCLENBQUM7WUFDMUMsb0VBQW9FO1lBQ3BFLG9FQUFvRTtZQUNwRSxpRUFBaUU7WUFDakUsaUVBQWlFO1lBQ2pFLGdFQUFnRTtZQUNoRSxTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxDQUFDLFNBQVMsQ0FBQztvQkFDZCxPQUFPLEVBQUUsWUFBWTtvQkFDckIsTUFBTSxFQUFFLEVBQUU7b0JBQ1YsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFlBQVksRUFBRSxHQUFHO2lCQUNsQixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FDMUMsdUNBQXVDLEVBQ3ZDLDJCQUEyQixDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixPQUFPLElBQUksd0NBQWtCLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ3hELFlBQVksRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtZQUM1QyxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUMvQixXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXO1lBQzdDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxXQUFXO1lBQ3ZELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsa0JBQWtCO1lBQ25ELGdCQUFnQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO1lBQ25ELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCO1NBQ3hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsT0FBTyxJQUFJLHFDQUFnQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNwRCxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPO1lBQ2pDLFlBQVksRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWTtZQUNsRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXO1lBQ3pDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCO1lBQ3JELGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO1lBQ2xELFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0I7WUFDakQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUI7U0FDdEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE1SEgsc0RBNkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IERpc3RyaWJ1dGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3NtXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTmV4dGpzVHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Z1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNQb3N0RGVwbG95UHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNQb3N0RGVwbG95UHJvcHNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Z1bmN0aW9ucyxcbiAgTmV4dGpzRnVuY3Rpb25zT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWZ1bmN0aW9uc1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzSW1hZ2VGdW5jdGlvbixcbiAgTmV4dGpzSW1hZ2VGdW5jdGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1jb21wdXRlL25leHRqcy1pbWFnZS1mdW5jdGlvblwiO1xuaW1wb3J0IHtcbiAgTmV4dGpzRGlzdHJpYnV0aW9uLFxuICBOZXh0anNEaXN0cmlidXRpb25PdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtZGlzdHJpYnV0aW9uXCI7XG5pbXBvcnQge1xuICBOZXh0anNQb3N0RGVwbG95LFxuICBOZXh0anNQb3N0RGVwbG95T3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5pbXBvcnQgeyBqb2luUGF0aCB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcbmltcG9ydCB7IHVzZURlZGljYXRlZEltYWdlRnVuY3Rpb24gfSBmcm9tIFwiLi4vdXRpbHMvZXhwZXJpbWVudGFsLWZsYWdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzR2xvYmFsRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzIGV4dGVuZHMgTmV4dGpzRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzRGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzO1xuICByZWFkb25seSBuZXh0anNQb3N0RGVwbG95UHJvcHM/OiBPcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wcztcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgZm9yIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgLiBPdmVycmlkZXMgYXJlIGxvd2VyIGxldmVsIHRoYW5cbiAqIHByb3BzIGFuZCBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIENESyBDb25zdHJ1Y3RzIGdpdmluZyB5b3UgbW9yZSBjb250cm9sLiBJdCdzXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgY2F1dGlvbiBhbmQgcmV2aWV3IHNvdXJjZSBjb2RlIHNvIHlvdSBrbm93IGhvdyB0aGV5J3JlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzR2xvYmFsRnVuY3Rpb25zT3ZlcnJpZGVzIGV4dGVuZHMgTmV4dGpzQmFzZU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0dsb2JhbEZ1bmN0aW9ucz86IE5leHRqc0dsb2JhbEZ1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzRnVuY3Rpb25zPzogTmV4dGpzRnVuY3Rpb25zT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNJbWFnZUZ1bmN0aW9uPzogTmV4dGpzSW1hZ2VGdW5jdGlvbk92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzRGlzdHJpYnV0aW9uPzogTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNQb3N0RGVwbG95PzogTmV4dGpzUG9zdERlcGxveU92ZXJyaWRlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNHbG9iYWxGdW5jdGlvbnNQcm9wcyBleHRlbmRzIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBkaXN0cmlidXRpb24uIENhbiBiZSB1c2VkIHdpdGggYGJhc2VQYXRoYCB0byBob3N0IG11bHRpcGxlXG4gICAqIGFwcHMgb24gdGhlIHNhbWUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICByZWFkb25seSBkaXN0cmlidXRpb24/OiBEaXN0cmlidXRpb247XG4gIC8qKlxuICAgKiBPdmVycmlkZSBwcm9wcyBvZiBhbnkgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzR2xvYmFsRnVuY3Rpb25zT3ZlcnJpZGVzO1xufVxuXG4vKipcbiAqIERlcGxveSBOZXh0LmpzIGdsb2JhbGx5IGRpc3RyaWJ1dGVkIHdpdGggZnVuY3Rpb25zLiBVc2VzIFtDbG91ZEZyb250XG4gKiBEaXN0cmlidXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td29ya2luZy13aXRoLmh0bWwpXG4gKiBhcyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgKENETikgZm9yIGdsb2JhbCBkaXN0cmlidXRpb24gYW5kIFtBV1MgTGFtYmRhIEZ1bmN0aW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvd2VsY29tZS5odG1sKVxuICogZm9yIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0dsb2JhbEZ1bmN0aW9ucyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3Qge1xuICBuZXh0anNGdW5jdGlvbnM6IE5leHRqc0Z1bmN0aW9ucztcbiAgLyoqXG4gICAqIE9ubHkgY3JlYXRlZCB3aGVuIHRoZSAoZXhwZXJpbWVudGFsLCB1bnN1cHBvcnRlZCkgZGVkaWNhdGVkIGltYWdlXG4gICAqIG9wdGltaXphdGlvbiBMYW1iZGEgaXMgZW5hYmxlZC4gYF9uZXh0L2ltYWdlYCBpcyBvdGhlcndpc2Ugc2VydmVkIGJ5XG4gICAqIHtAbGluayBuZXh0anNGdW5jdGlvbnN9LlxuICAgKi9cbiAgbmV4dGpzSW1hZ2VGdW5jdGlvbj86IE5leHRqc0ltYWdlRnVuY3Rpb247XG4gIG5leHRqc0Rpc3RyaWJ1dGlvbjogTmV4dGpzRGlzdHJpYnV0aW9uO1xuICBuZXh0anNQb3N0RGVwbG95OiBOZXh0anNQb3N0RGVwbG95O1xuICAvKipcbiAgICogUHVibGljIFVSTCBvZiB0aGUgYXBwLCBpbmNsdWRpbmcgYGJhc2VQYXRoYCDigJQgdGhlIGFwcCBvbmx5IGFuc3dlcnMgdW5kZXJcbiAgICogdGhhdCBwcmVmaXgsIGFuZCBpdCdzIGRlcml2ZWQgZnJvbSB0aGUgYXBwJ3Mgb3duIGBiYXNlUGF0aGAgd2hlbiB0aGUgcHJvcCBpc1xuICAgKiBsZWZ0IHVuc2V0LCBzbyBpdCdzIHRoZXJlIHdoZXRoZXIgb3Igbm90IHlvdSBhc2tlZCBmb3IgaXQuXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKFxuICAgICAgYGh0dHBzOi8vJHt0aGlzLm5leHRqc0Rpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb24uZG9tYWluTmFtZX1gLFxuICAgICAgdGhpcy5yZXNvbHZlZEJhc2VQYXRoLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNHbG9iYWxGdW5jdGlvbnNQcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzR2xvYmFsRnVuY3Rpb25zUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzLCBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMubmV4dGpzRnVuY3Rpb25zID0gdGhpcy5jcmVhdGVOZXh0anNGdW5jdGlvbnMoXG4gICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzRnVuY3Rpb25zLFxuICAgICk7XG4gICAgaWYgKHVzZURlZGljYXRlZEltYWdlRnVuY3Rpb24oKSkge1xuICAgICAgdGhpcy5uZXh0anNJbWFnZUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNJbWFnZUZ1bmN0aW9uKFxuICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzSW1hZ2VGdW5jdGlvbixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNEaXN0cmlidXRpb24oKTtcbiAgICB0aGlzLndpcmVDbG91ZEZyb250SW52YWxpZGF0aW9uKCk7XG4gICAgdGhpcy5uZXh0anNQb3N0RGVwbG95ID0gdGhpcy5jcmVhdGVOZXh0anNQb3N0RGVwbG95KCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHRoZSBmdW5jdGlvbiBwZXJtaXNzaW9uIHRvIGludmFsaWRhdGUgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgcGFzc2VzXG4gICAqIGFsb25nIGEgd2F5IHRvIGxvb2sgdXAgaXRzIElELCBzbyBvbi1kZW1hbmQgcmV2YWxpZGF0aW9uXG4gICAqIChyZXZhbGlkYXRlVGFnL3JldmFsaWRhdGVQYXRoKSBjYW4gZXZpY3Qgc3RhbGUgcmVzcG9uc2VzIGZyb20gdGhlIENETlxuICAgKiBlZGdlIGNhY2hlLCBub3QganVzdCB0aGUgb3JpZ2luJ3MgUzMvRHluYW1vREIgY2FjaGUuXG4gICAqXG4gICAqIFRoZSBkaXN0cmlidXRpb24gSUQgY2FuJ3QgYmUgcGFzc2VkIGFzIGEgcGxhaW4gZW52IHZhciBvciBzY29wZWQgSUFNXG4gICAqIHJlc291cmNlIEFSTjogdGhlIGRpc3RyaWJ1dGlvbidzIG9yaWdpbiByZWZlcmVuY2VzIHRoaXMgZnVuY3Rpb24ncyBVUkwsXG4gICAqIHNvIG1ha2luZyB0aGUgZnVuY3Rpb24ncyByb2xlL2Vudmlyb25tZW50IHJlZmVyZW5jZSB0aGUgZGlzdHJpYnV0aW9uJ3NcbiAgICogSUQgaW4gcmV0dXJuIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kuIEluc3RlYWQsXG4gICAqIHRoZSBJRCBpcyBwdWJsaXNoZWQgdG8gYW4gU1NNIFBhcmFtZXRlciAod2hvc2UgKm5hbWUqIGlzIHN0YXRpYyBhbmQgc2FmZVxuICAgKiB0byBlbWJlZCkgdGhhdCB0aGUgZnVuY3Rpb24gcmVhZHMgYXQgcnVudGltZSwgYW5kIHRoZSBJQU0gZ3JhbnQgaXNcbiAgICogc2NvcGVkIHRvIGFsbCBkaXN0cmlidXRpb25zIGluIHRoaXMgYWNjb3VudC9yZWdpb24gcmF0aGVyIHRoYW4gdGhpc1xuICAgKiBzcGVjaWZpYyAobm90LXlldC1rbm93bi1hdC1zeW50aC10aW1lKSBkaXN0cmlidXRpb24uXG4gICAqL1xuICBwcml2YXRlIHdpcmVDbG91ZEZyb250SW52YWxpZGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgZGlzdHJpYnV0aW9uSWRQYXJhbWV0ZXJOYW1lID0gYGNkay1uZXh0anMtZGlzdHJpYnV0aW9uLWlkLSR7dGhpcy5ub2RlLmFkZHJ9YDtcblxuICAgIG5ldyBTdHJpbmdQYXJhbWV0ZXIodGhpcywgXCJEaXN0cmlidXRpb25JZFBhcmFtZXRlclwiLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBkaXN0cmlidXRpb25JZFBhcmFtZXRlck5hbWUsXG4gICAgICBzdHJpbmdWYWx1ZTogdGhpcy5uZXh0anNEaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInNzbTpHZXRQYXJhbWV0ZXJcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIHN0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICBzZXJ2aWNlOiBcInNzbVwiLFxuICAgICAgICAgICAgcmVzb3VyY2U6IFwicGFyYW1ldGVyXCIsXG4gICAgICAgICAgICByZXNvdXJjZU5hbWU6IGRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImNsb3VkZnJvbnQ6Q3JlYXRlSW52YWxpZGF0aW9uXCJdLFxuICAgICAgICAvLyBDYW4ndCBzY29wZSB0aGlzIHRvIHRoZSBzcGVjaWZpYyBkaXN0cmlidXRpb246IHRoZSBkaXN0cmlidXRpb24nc1xuICAgICAgICAvLyBvcmlnaW4gYWxyZWFkeSBkZXBlbmRzIG9uIHRoaXMgZnVuY3Rpb24gKHZpYSBpdHMgRnVuY3Rpb25VcmwpLCBzb1xuICAgICAgICAvLyByZWZlcmVuY2luZyB0aGUgZGlzdHJpYnV0aW9uJ3MgSUQgaGVyZSB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhclxuICAgICAgICAvLyBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5LiBIZW5jZSB0aGUgU1NNIHBhcmFtZXRlciBpbmRpcmVjdGlvblxuICAgICAgICAvLyBhYm92ZSBmb3IgbG9va2luZyB1cCB0aGUgSUQgYXQgcnVudGltZSBpbnN0ZWFkIG9mIHN5bnRoIHRpbWUuXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIHN0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICBzZXJ2aWNlOiBcImNsb3VkZnJvbnRcIixcbiAgICAgICAgICAgIHJlZ2lvbjogXCJcIixcbiAgICAgICAgICAgIHJlc291cmNlOiBcImRpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgICAgcmVzb3VyY2VOYW1lOiBcIipcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb24uYWRkRW52aXJvbm1lbnQoXG4gICAgICBcIkNES19ORVhUSlNfRElTVFJJQlVUSU9OX0lEX1BBUkFNX05BTUVcIixcbiAgICAgIGRpc3RyaWJ1dGlvbklkUGFyYW1ldGVyTmFtZSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNEaXN0cmlidXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNEaXN0cmlidXRpb24odGhpcywgXCJOZXh0anNEaXN0cmlidXRpb25cIiwge1xuICAgICAgYXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBiYXNlUGF0aDogdGhpcy5yZXNvbHZlZEJhc2VQYXRoLFxuICAgICAgZnVuY3Rpb25Vcmw6IHRoaXMubmV4dGpzRnVuY3Rpb25zLmZ1bmN0aW9uVXJsLFxuICAgICAgaW1hZ2VGdW5jdGlvblVybDogdGhpcy5uZXh0anNJbWFnZUZ1bmN0aW9uPy5mdW5jdGlvblVybCxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IHRoaXMubmV4dGpzQnVpbGQucHVibGljRGlyRW50cmllcyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxGdW5jdGlvbnM/Lm5leHRqc0Rpc3RyaWJ1dGlvblByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNQb3N0RGVwbG95KCk6IE5leHRqc1Bvc3REZXBsb3kge1xuICAgIHJldHVybiBuZXcgTmV4dGpzUG9zdERlcGxveSh0aGlzLCBcIk5leHRqc1Bvc3REZXBsb3lcIiwge1xuICAgICAgYnVpbGRJZDogdGhpcy5uZXh0anNCdWlsZC5idWlsZElkLFxuICAgICAgZGlzdHJpYnV0aW9uOiB0aGlzLm5leHRqc0Rpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb24sXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5uZXh0anNDYWNoZS5jYWNoZUJ1Y2tldCxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLm5leHRqc0NhY2hlLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNQb3N0RGVwbG95LFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbEZ1bmN0aW9ucz8ubmV4dGpzUG9zdERlcGxveVByb3BzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWdsb2JhbC1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1nbG9iYWwtZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBb0M7QUFFcEMsaURBQThEO0FBRTlELGlEQUFzRDtBQUV0RCxnRUFBb0U7QUFDcEUsNENBQTBDO0FBQzFDLG1FQUtpQztBQU9qQyxnRUFHZ0M7QUFFaEMsa0RBQThDO0FBMEM5Qzs7Ozs7R0FLRztBQUNILE1BQWEscUJBQXNCLFNBQVEsMkNBQW1COztJQUM1RCxlQUFlLENBQWtCO0lBQ2pDLGtCQUFrQixDQUFxQjtJQUN2QyxnQkFBZ0IsQ0FBbUI7SUFDbkM7Ozs7T0FJRztJQUNILElBQUksR0FBRztRQUNMLE9BQU8sSUFBQSxvQkFBUSxFQUNiLFdBQVcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBNkI7SUFFMUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQztRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsc0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzFELDhFQUE4RTtRQUM5RSw0RUFBNEU7UUFDNUUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUN2RCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxD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U0FDeEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFwR0gsc0RBcUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IERpc3RyaWJ1dGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHsgUG9saWN5LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgU3RyaW5nUGFyYW1ldGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zc21cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0ZVTkNUSU9OX0dST1VQIH0gZnJvbSBcIi4uL2FkYXB0ZXIvZnVuY3Rpb24tZ3JvdXBzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wc1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzRnVuY3Rpb25Hcm91cCxcbiAgTmV4dGpzRnVuY3Rpb25zLFxuICBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtZnVuY3Rpb25zXCI7XG5pbXBvcnQge1xuICBOZXh0anNEaXN0cmlidXRpb24sXG4gIE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1kaXN0cmlidXRpb25cIjtcbmltcG9ydCB7IE5leHRqc1Bvc3REZXBsb3kgfSBmcm9tIFwiLi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5pbXBvcnQgeyBqb2luUGF0aCB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNHbG9iYWxGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXMgZXh0ZW5kcyBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzRGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzO1xufVxuXG4vKipcbiAqIE92ZXJyaWRlcyBmb3IgYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AuIE92ZXJyaWRlcyBhcmUgbG93ZXIgbGV2ZWwgdGhhblxuICogcHJvcHMgYW5kIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gQ0RLIENvbnN0cnVjdHMgZ2l2aW5nIHlvdSBtb3JlIGNvbnRyb2wuIEl0J3NcbiAqIHJlY29tbWVuZGVkIHRvIHVzZSBjYXV0aW9uIGFuZCByZXZpZXcgc291cmNlIGNvZGUgc28geW91IGtub3cgaG93IHRoZXkncmUgdXNlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNHbG9iYWxGdW5jdGlvbnNPdmVycmlkZXMgZXh0ZW5kcyBOZXh0anNCYXNlT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzR2xvYmFsRnVuY3Rpb25zPzogTmV4dGpzR2xvYmFsRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNGdW5jdGlvbnM/OiBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0Rpc3RyaWJ1dGlvbj86IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNHbG9iYWxGdW5jdGlvbnNQcm9wcyBleHRlbmRzIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBkaXN0cmlidXRpb24uIENhbiBiZSB1c2VkIHdpdGggYGJhc2VQYXRoYCB0byBob3N0IG11bHRpcGxlXG4gICAqIGFwcHMgb24gdGhlIHNhbWUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAqL1xuICByZWFkb25seSBkaXN0cmlidXRpb24/OiBEaXN0cmlidXRpb247XG4gIC8qKlxuICAgKiBQYWNrYWdlIHNldHMgb2Ygcm91dGVzIGludG8gc2VwYXJhdGUgTGFtYmRhIGZ1bmN0aW9ucywgZWFjaCBmcm9udGVkIGJ5IGl0c1xuICAgKiBvd24gQ2xvdWRGcm9udCBiZWhhdmlvcnMuXG4gICAqXG4gICAqIFJlYWNoIGZvciB0aGlzIHdoZW4gYSBzaW5nbGUgZnVuY3Rpb24gZXhjZWVkcyBMYW1iZGEncyAyNTAgTUIgdW56aXBwZWRcbiAgICogbGltaXQg4oCUIGNkay1uZXh0anMgdGhyb3dzIGF0IHN5bnRoIHdpdGggdGhlIG1lYXN1cmVkIHNpemUgd2hlbiBpdCBkb2VzLiBJdCBpc1xuICAgKiBub3QgYSBwZXJmb3JtYW5jZSBvciBpc29sYXRpb24gZmVhdHVyZTogZXZlcnkgZ3JvdXAgc2hpcHMgdGhlIHNhbWUgTmV4dC5qc1xuICAgKiBydW50aW1lLCBzbyBzcGxpdHRpbmcgb25seSBtb3ZlcyByb3V0ZS1sb2NhbCBjb2RlLlxuICAgKlxuICAgKiBAc2VlIE5leHRqc0Z1bmN0aW9uR3JvdXAgZm9yIHRoZSBwYXR0ZXJuIGdyYW1tYXIgYW5kIGl0cyBsaW1pdHMuXG4gICAqIEBkZWZhdWx0IC0gb25lIGZ1bmN0aW9uIHNlcnZlcyBldmVyeSByb3V0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cHM/OiBOZXh0anNGdW5jdGlvbkdyb3VwW107XG4gIC8qKlxuICAgKiBPdmVycmlkZSBwcm9wcyBvZiBhbnkgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzR2xvYmFsRnVuY3Rpb25zT3ZlcnJpZGVzO1xufVxuXG4vKipcbiAqIERlcGxveSBOZXh0LmpzIGdsb2JhbGx5IGRpc3RyaWJ1dGVkIHdpdGggZnVuY3Rpb25zLiBVc2VzIFtDbG91ZEZyb250XG4gKiBEaXN0cmlidXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td29ya2luZy13aXRoLmh0bWwpXG4gKiBhcyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgKENETikgZm9yIGdsb2JhbCBkaXN0cmlidXRpb24gYW5kIFtBV1MgTGFtYmRhIEZ1bmN0aW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvd2VsY29tZS5odG1sKVxuICogZm9yIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0dsb2JhbEZ1bmN0aW9ucyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3Qge1xuICBuZXh0anNGdW5jdGlvbnM6IE5leHRqc0Z1bmN0aW9ucztcbiAgbmV4dGpzRGlzdHJpYnV0aW9uOiBOZXh0anNEaXN0cmlidXRpb247XG4gIG5leHRqc1Bvc3REZXBsb3k6IE5leHRqc1Bvc3REZXBsb3k7XG4gIC8qKlxuICAgKiBQdWJsaWMgVVJMIG9mIHRoZSBhcHAsIGluY2x1ZGluZyBgYmFzZVBhdGhgIOKAlCB0aGUgYXBwIG9ubHkgYW5zd2VycyB1bmRlclxuICAgKiB0aGF0IHByZWZpeCwgYW5kIGl0J3MgZGVyaXZlZCBmcm9tIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCB3aGVuIHRoZSBwcm9wIGlzXG4gICAqIGxlZnQgdW5zZXQsIHNvIGl0J3MgdGhlcmUgd2hldGhlciBvciBub3QgeW91IGFza2VkIGZvciBpdC5cbiAgICovXG4gIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gam9pblBhdGgoXG4gICAgICBgaHR0cHM6Ly8ke3RoaXMubmV4dGpzRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbi5kb21haW5OYW1lfWAsXG4gICAgICB0aGlzLnJlc29sdmVkQmFzZVBhdGgsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0dsb2JhbEZ1bmN0aW9uc1Byb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNHbG9iYWxGdW5jdGlvbnNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMsIE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5uZXh0anNGdW5jdGlvbnMgPSB0aGlzLmNyZWF0ZU5leHRqc0Z1bmN0aW9ucygpO1xuICAgIHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNEaXN0cmlidXRpb24oKTtcbiAgICAvLyBFdmVyeSBncm91cCwgbm90IGp1c3QgdGhlIGRlZmF1bHQgb25lOiBgcmV2YWxpZGF0ZVRhZ2AvYHJldmFsaWRhdGVQYXRoYCBjYW5cbiAgICAvLyBiZSBjYWxsZWQgZnJvbSBhbnkgcm91dGUgaGFuZGxlciwgc28gYW55IGZ1bmN0aW9uIG1heSBuZWVkIHRvIGludmFsaWRhdGUuXG4gICAgY29uc3QgZnVuY3Rpb25zID0gdGhpcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb25Hcm91cHMubWFwKFxuICAgICAgKGdyb3VwKSA9PiBncm91cC5mdW5jdGlvbixcbiAgICApO1xuICAgIHRoaXMud2lyZUNsb3VkRnJvbnRJbnZhbGlkYXRpb24oZnVuY3Rpb25zKTtcbiAgICB0aGlzLm5leHRqc1Bvc3REZXBsb3kgPSB0aGlzLmNyZWF0ZU5leHRqc1Bvc3REZXBsb3koXG4gICAgICB0aGlzLm5leHRqc0Rpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMZXRzIGBmdW5jdGlvbnNgIGludmFsaWRhdGUgdGhlIGRpc3RyaWJ1dGlvbiwgc28gb24tZGVtYW5kIHJldmFsaWRhdGlvblxuICAgKiAocmV2YWxpZGF0ZVRhZy9yZXZhbGlkYXRlUGF0aCkgY2FuIGV2aWN0IHN0YWxlIHJlc3BvbnNlcyBmcm9tIHRoZSBDRE4gZWRnZVxuICAgKiBjYWNoZSwgbm90IGp1c3QgdGhlIG9yaWdpbidzIFMzL0R5bmFtb0RCIGNhY2hlLlxuICAgKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uJ3Mgb3JpZ2luIGlzIHRoZSBmdW5jdGlvbnMnIFVSTCwgc28gYSBmdW5jdGlvbiBuYW1pbmcgdGhlXG4gICAqIGRpc3RyaWJ1dGlvbiBiYWNrIOKAlCBpbiBpdHMgZW52aXJvbm1lbnQsIG9yIGluIGl0cyByb2xlJ3MgZGVmYXVsdCBwb2xpY3ksXG4gICAqIHdoaWNoIGEgZnVuY3Rpb24gZGVwZW5kcyBvbiDigJQgd291bGQgYmUgYSBjaXJjdWxhciBDbG91ZEZvcm1hdGlvblxuICAgKiBkZXBlbmRlbmN5LiBTbyB0aGUgSUQgaXMgcHVibGlzaGVkIHRvIGFuIFNTTSBQYXJhbWV0ZXIgd2hvc2UgKm5hbWUqIGlzXG4gICAqIHN0YXRpYywgYW5kIHRoZSBncmFudHMgZ28gaW4gYSBzZXBhcmF0ZSBwb2xpY3kgdGhhdCBkZXBlbmRzIG9uIHRoZVxuICAgKiBkaXN0cmlidXRpb24gd2hpbGUgbm8gZnVuY3Rpb24gZGVwZW5kcyBvbiBpdC5cbiAgICovXG4gIHByaXZhdGUgd2lyZUNsb3VkRnJvbnRJbnZhbGlkYXRpb24oZnVuY3Rpb25zOiBMYW1iZGFGdW5jdGlvbltdKSB7XG4gICAgY29uc3QgeyBkaXN0cmlidXRpb24gfSA9IHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uO1xuICAgIGNvbnN0IHBhcmFtZXRlck5hbWUgPSBgY2RrLW5leHRqcy1kaXN0cmlidXRpb24taWQtJHt0aGlzLm5vZGUuYWRkcn1gO1xuICAgIG5ldyBTdHJpbmdQYXJhbWV0ZXIodGhpcywgXCJEaXN0cmlidXRpb25JZFBhcmFtZXRlclwiLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgc3RyaW5nVmFsdWU6IGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25JZCxcbiAgICB9KTtcbiAgICBuZXcgUG9saWN5KHRoaXMsIFwiSW52YWxpZGF0aW9uUG9saWN5XCIsIHtcbiAgICAgIC8vIEEgYG5ldyBGdW5jdGlvbmAgYWx3YXlzIGhhcyBhIHJvbGU7IG9ubHkgaW1wb3J0ZWQgb25lcyBsYWNrIGl0LlxuICAgICAgcm9sZXM6IGZ1bmN0aW9ucy5tYXAoKGZuKSA9PiBmbi5yb2xlISksXG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcInNzbTpHZXRQYXJhbWV0ZXJcIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICBTdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgICAgICAgICBzZXJ2aWNlOiBcInNzbVwiLFxuICAgICAgICAgICAgICByZXNvdXJjZTogXCJwYXJhbWV0ZXJcIixcbiAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcImNsb3VkZnJvbnQ6Q3JlYXRlSW52YWxpZGF0aW9uXCJdLFxuICAgICAgICAgIHJlc291cmNlczogW2Rpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Bcm5dLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZnVuY3Rpb25zLmZvckVhY2goKGZuKSA9PlxuICAgICAgZm4uYWRkRW52aXJvbm1lbnQoXCJDREtfTkVYVEpTX0RJU1RSSUJVVElPTl9JRF9QQVJBTV9OQU1FXCIsIHBhcmFtZXRlck5hbWUpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0Rpc3RyaWJ1dGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbih0aGlzLCBcIk5leHRqc0Rpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBhc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIGFzc2V0UHJlZml4OiB0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdBc3NldFByZWZpeFBhdGgsXG4gICAgICBiYXNlUGF0aDogdGhpcy5yZXNvbHZlZEJhc2VQYXRoLFxuICAgICAgZGlzdHJpYnV0aW9uOiB0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbixcbiAgICAgIGZ1bmN0aW9uVXJsOiB0aGlzLm5leHRqc0Z1bmN0aW9ucy5mdW5jdGlvblVybCxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IHRoaXMubmV4dGpzQnVpbGQucHVibGljRGlyRW50cmllcyxcbiAgICAgIC8vIFRoZSBkZWZhdWx0IGdyb3VwIGJhY2tzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBzbyBvbmx5IHRoZSByZXN0IG5lZWRcbiAgICAgIC8vIGJlaGF2aW9ycyBvZiB0aGVpciBvd24uXG4gICAgICBmdW5jdGlvbkdyb3VwczogdGhpcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb25Hcm91cHNcbiAgICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLm5hbWUgIT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVApXG4gICAgICAgIC5tYXAoKGdyb3VwKSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGdyb3VwLm5hbWUsXG4gICAgICAgICAgZnVuY3Rpb25Vcmw6IGdyb3VwLmZ1bmN0aW9uVXJsISxcbiAgICAgICAgfSkpLFxuICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9yczogdGhpcy5uZXh0anNCdWlsZC5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbEZ1bmN0aW9ucz8ubmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==