cdk-nextjs 0.6.2 → 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 (263) hide show
  1. package/.jsii +2404 -2723
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +1681 -1930
  4. package/CLAUDE.md +2 -1
  5. package/README.md +429 -130
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
  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 +667 -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 +8 -0
  79. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
  80. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
  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/prune-cache-bucket.d.ts +7 -3
  85. package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
  86. package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
  87. package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
  88. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
  89. package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
  90. package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
  91. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
  92. package/lib/lambdas/post-deploy/prune-s3.d.ts +14 -5
  93. package/lib/lambdas/post-deploy/prune-s3.js +41 -12
  94. package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
  95. package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
  96. package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
  97. package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
  98. package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
  99. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
  100. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
  101. package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
  102. package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
  103. package/lib/nextjs-api.d.ts +102 -18
  104. package/lib/nextjs-api.js +338 -38
  105. package/lib/nextjs-api.test.js +537 -1
  106. package/lib/nextjs-build/global-containers.Dockerfile +15 -10
  107. package/lib/nextjs-build/nextjs-build.d.ts +339 -63
  108. package/lib/nextjs-build/nextjs-build.js +684 -327
  109. package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
  110. package/lib/nextjs-build/nextjs-build.test.js +412 -0
  111. package/lib/nextjs-build/patch-fetch.js +1 -1
  112. package/lib/nextjs-build/patch-fetch.test.js +166 -11
  113. package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
  114. package/lib/nextjs-cache.d.ts +82 -4
  115. package/lib/nextjs-cache.js +186 -10
  116. package/lib/nextjs-cache.test.js +176 -1
  117. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
  118. package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
  119. package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
  120. package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
  121. package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
  122. package/lib/nextjs-compute/nextjs-containers.js +57 -20
  123. package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
  124. package/lib/nextjs-compute/nextjs-functions.js +113 -67
  125. package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
  126. package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
  127. package/lib/nextjs-distribution.d.ts +194 -23
  128. package/lib/nextjs-distribution.js +535 -62
  129. package/lib/nextjs-distribution.test.d.ts +1 -0
  130. package/lib/nextjs-distribution.test.js +697 -0
  131. package/lib/nextjs-post-deploy.d.ts +13 -5
  132. package/lib/nextjs-post-deploy.js +13 -10
  133. package/lib/nextjs-post-deploy.test.d.ts +1 -0
  134. package/lib/nextjs-post-deploy.test.js +34 -0
  135. package/lib/nextjs-static-assets.d.ts +17 -4
  136. package/lib/nextjs-static-assets.js +22 -5
  137. package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
  138. package/lib/root-constructs/nextjs-base-construct.js +139 -47
  139. package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
  140. package/lib/root-constructs/nextjs-global-containers.js +20 -71
  141. package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
  142. package/lib/root-constructs/nextjs-global-functions.js +52 -70
  143. package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
  144. package/lib/root-constructs/nextjs-regional-containers.js +8 -15
  145. package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
  146. package/lib/root-constructs/nextjs-regional-functions.js +8 -26
  147. package/lib/runtime/api-gateway-path.d.ts +34 -0
  148. package/lib/runtime/api-gateway-path.js +71 -0
  149. package/lib/runtime/api-gateway-path.test.d.ts +1 -0
  150. package/lib/runtime/api-gateway-path.test.js +65 -0
  151. package/lib/runtime/case-redirect.d.ts +22 -0
  152. package/lib/runtime/case-redirect.js +63 -0
  153. package/lib/runtime/case-redirect.test.d.ts +1 -0
  154. package/lib/runtime/case-redirect.test.js +32 -0
  155. package/lib/runtime/core.d.ts +234 -0
  156. package/lib/runtime/core.js +1213 -0
  157. package/lib/runtime/core.test.d.ts +1 -0
  158. package/lib/runtime/core.test.js +1678 -0
  159. package/lib/runtime/deployment-root.d.ts +13 -0
  160. package/lib/runtime/deployment-root.js +29 -0
  161. package/lib/runtime/dispatch.d.ts +331 -0
  162. package/lib/runtime/dispatch.js +751 -0
  163. package/lib/runtime/dispatch.test.d.ts +1 -0
  164. package/lib/runtime/dispatch.test.js +853 -0
  165. package/lib/runtime/entrypoints.d.ts +57 -0
  166. package/lib/runtime/entrypoints.js +115 -0
  167. package/lib/runtime/http/abort-signal.d.ts +6 -0
  168. package/lib/runtime/http/abort-signal.js +19 -0
  169. package/lib/runtime/http/abort-signal.test.d.ts +1 -0
  170. package/lib/runtime/http/abort-signal.test.js +49 -0
  171. package/lib/runtime/http/node-server.d.ts +38 -0
  172. package/lib/runtime/http/node-server.js +99 -0
  173. package/lib/runtime/http/node-server.test.d.ts +1 -0
  174. package/lib/runtime/http/node-server.test.js +96 -0
  175. package/lib/runtime/http/node-sink.d.ts +16 -0
  176. package/lib/runtime/http/node-sink.js +48 -0
  177. package/lib/runtime/http/node-sink.test.d.ts +1 -0
  178. package/lib/runtime/http/node-sink.test.js +66 -0
  179. package/lib/runtime/http/request.d.ts +62 -0
  180. package/lib/runtime/http/request.js +134 -0
  181. package/lib/runtime/http/request.test.d.ts +1 -0
  182. package/lib/runtime/http/request.test.js +103 -0
  183. package/lib/runtime/http/response.d.ts +77 -0
  184. package/lib/runtime/http/response.js +229 -0
  185. package/lib/runtime/http/response.test.d.ts +1 -0
  186. package/lib/runtime/http/response.test.js +178 -0
  187. package/lib/runtime/http/sink.d.ts +73 -0
  188. package/lib/runtime/http/sink.js +188 -0
  189. package/lib/runtime/http/sink.test.d.ts +1 -0
  190. package/lib/runtime/http/sink.test.js +257 -0
  191. package/lib/runtime/image-utils.d.ts +78 -0
  192. package/lib/runtime/image-utils.js +129 -0
  193. package/lib/runtime/image-utils.test.d.ts +1 -0
  194. package/lib/runtime/image-utils.test.js +237 -0
  195. package/lib/runtime/image.d.ts +76 -0
  196. package/lib/runtime/image.js +296 -0
  197. package/lib/runtime/image.test.d.ts +1 -0
  198. package/lib/runtime/image.test.js +405 -0
  199. package/lib/runtime/lambda-event.d.ts +4 -0
  200. package/lib/runtime/lambda-event.js +113 -0
  201. package/lib/runtime/lambda-event.test.d.ts +1 -0
  202. package/lib/runtime/lambda-event.test.js +119 -0
  203. package/lib/runtime/lambda.mjs +41595 -0
  204. package/lib/runtime/load-module.d.ts +8 -0
  205. package/lib/runtime/load-module.js +35 -0
  206. package/lib/runtime/manifest.d.ts +215 -0
  207. package/lib/runtime/manifest.js +118 -0
  208. package/lib/runtime/middleware.d.ts +43 -0
  209. package/lib/runtime/middleware.js +113 -0
  210. package/lib/runtime/middleware.test.d.ts +1 -0
  211. package/lib/runtime/middleware.test.js +259 -0
  212. package/lib/runtime/next-modules.d.ts +55 -0
  213. package/lib/runtime/next-modules.js +124 -0
  214. package/lib/runtime/next-modules.test.d.ts +1 -0
  215. package/lib/runtime/next-modules.test.js +34 -0
  216. package/lib/runtime/public-files.d.ts +32 -0
  217. package/lib/runtime/public-files.js +117 -0
  218. package/lib/runtime/public-files.test.d.ts +1 -0
  219. package/lib/runtime/public-files.test.js +97 -0
  220. package/lib/runtime/server.mjs +41588 -0
  221. package/lib/runtime/static-files.d.ts +50 -0
  222. package/lib/runtime/static-files.js +266 -0
  223. package/lib/runtime/static-files.test.d.ts +1 -0
  224. package/lib/runtime/static-files.test.js +118 -0
  225. package/lib/runtime/util.d.ts +28 -0
  226. package/lib/runtime/util.js +79 -0
  227. package/lib/utils/base-path.d.ts +106 -13
  228. package/lib/utils/base-path.js +254 -41
  229. package/lib/utils/base-path.test.js +219 -51
  230. package/lib/utils/get-architecture.d.ts +7 -8
  231. package/lib/utils/get-architecture.js +12 -13
  232. package/lib/utils/zip-directory.d.ts +14 -0
  233. package/lib/utils/zip-directory.js +121 -0
  234. package/lib/utils/zip-directory.test.d.ts +1 -0
  235. package/lib/utils/zip-directory.test.js +99 -0
  236. package/package.json +22 -3
  237. package/scripts/capture-adapter-fixture.mjs +325 -0
  238. package/scripts/e2e-deploy.sh +398 -0
  239. package/scripts/e2e-harness/README.md +707 -0
  240. package/scripts/e2e-harness/app.js +370 -0
  241. package/scripts/e2e-harness/common.sh +249 -0
  242. package/scripts/e2e-harness/screen.mjs +302 -0
  243. package/scripts/e2e-harness/stage-proxy.mjs +145 -0
  244. package/scripts/e2e-harness/type-filters.mjs +47 -0
  245. package/scripts/e2e-logs.sh +75 -0
  246. package/scripts/e2e-offline.sh +91 -0
  247. package/scripts/e2e-sweep.sh +370 -0
  248. package/scripts/e2e-warm.sh +114 -0
  249. package/scripts/zero-config-build.mjs +418 -0
  250. package/docs/1k-concurrent-users-executions.png +0 -0
  251. package/docs/plans/adapter-runtime-release.md +0 -362
  252. package/docs/plans/phase-0-image-function-opt-in.md +0 -295
  253. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
  254. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
  255. package/lib/image-optimization/handler-utils.d.ts +0 -34
  256. package/lib/image-optimization/handler-utils.js +0 -83
  257. package/lib/image-optimization/handler-utils.test.js +0 -178
  258. package/lib/nextjs-build/functions.Dockerfile +0 -31
  259. package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
  260. package/lib/nextjs-compute/nextjs-image-function.js +0 -59
  261. package/lib/utils/experimental-flags.d.ts +0 -24
  262. package/lib/utils/experimental-flags.js +0 -30
  263. /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `createRequire` anchored to the module being loaded, rather than a bare
3
+ * `require`: this file is bundled to ESM by esbuild, where the ambient `require`
4
+ * resolves relative to `lib/runtime/`, not the staged app tree.
5
+ */
6
+ export declare function loadBuiltModule(absolutePath: string): Promise<unknown>;
7
+ /** Pulls a named function export off a loaded module, or throws saying why not. */
8
+ export declare function requireFunctionExport<T>(exports: unknown, name: string, describe: () => string): T;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadBuiltModule = loadBuiltModule;
4
+ exports.requireFunctionExport = requireFunctionExport;
5
+ /**
6
+ * Loading built Next.js modules out of the staged deployment tree.
7
+ *
8
+ * Shared by the middleware runner and the entrypoint registry, because the one
9
+ * non-obvious part is the same for both: Turbopack emits **async modules** whose
10
+ * `module.exports` is a `Promise`. Its keys live behind
11
+ * `Symbol(turbopack exports)`, so `Object.keys` reports nothing and a
12
+ * synchronous `require(...).handler` is `undefined` — which looks exactly like
13
+ * Next.js having changed its template API. `await` covers both that and the
14
+ * plain-CJS/webpack shape.
15
+ */
16
+ const node_module_1 = require("node:module");
17
+ /**
18
+ * `createRequire` anchored to the module being loaded, rather than a bare
19
+ * `require`: this file is bundled to ESM by esbuild, where the ambient `require`
20
+ * resolves relative to `lib/runtime/`, not the staged app tree.
21
+ */
22
+ async function loadBuiltModule(absolutePath) {
23
+ return (0, node_module_1.createRequire)(absolutePath)(absolutePath);
24
+ }
25
+ /** Pulls a named function export off a loaded module, or throws saying why not. */
26
+ function requireFunctionExport(exports, name, describe) {
27
+ const value = exports?.[name];
28
+ if (typeof value !== "function") {
29
+ throw new Error(`${describe()} does not export a \`${name}\` function (got ` +
30
+ `${typeof value}). This means Next.js changed the shape of its build ` +
31
+ `templates (next/dist/build/templates/).`);
32
+ }
33
+ return value;
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9sb2FkLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWtCQSwwQ0FFQztBQUdELHNEQWNDO0FBckNEOzs7Ozs7Ozs7O0dBVUc7QUFDSCw2Q0FBNEM7QUFFNUM7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxlQUFlLENBQUMsWUFBb0I7SUFDeEQsT0FBTyxJQUFBLDJCQUFhLEVBQUMsWUFBWSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixTQUFnQixxQkFBcUIsQ0FDbkMsT0FBZ0IsRUFDaEIsSUFBWSxFQUNaLFFBQXNCO0lBRXRCLE1BQU0sS0FBSyxHQUFJLE9BQStDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxRQUFRLEVBQUUsd0JBQXdCLElBQUksbUJBQW1CO1lBQzFELEdBQUcsT0FBTyxLQUFLLHVEQUF1RDtZQUN0RSx5Q0FBeUMsQ0FDNUMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMb2FkaW5nIGJ1aWx0IE5leHQuanMgbW9kdWxlcyBvdXQgb2YgdGhlIHN0YWdlZCBkZXBsb3ltZW50IHRyZWUuXG4gKlxuICogU2hhcmVkIGJ5IHRoZSBtaWRkbGV3YXJlIHJ1bm5lciBhbmQgdGhlIGVudHJ5cG9pbnQgcmVnaXN0cnksIGJlY2F1c2UgdGhlIG9uZVxuICogbm9uLW9idmlvdXMgcGFydCBpcyB0aGUgc2FtZSBmb3IgYm90aDogVHVyYm9wYWNrIGVtaXRzICoqYXN5bmMgbW9kdWxlcyoqIHdob3NlXG4gKiBgbW9kdWxlLmV4cG9ydHNgIGlzIGEgYFByb21pc2VgLiBJdHMga2V5cyBsaXZlIGJlaGluZFxuICogYFN5bWJvbCh0dXJib3BhY2sgZXhwb3J0cylgLCBzbyBgT2JqZWN0LmtleXNgIHJlcG9ydHMgbm90aGluZyBhbmQgYVxuICogc3luY2hyb25vdXMgYHJlcXVpcmUoLi4uKS5oYW5kbGVyYCBpcyBgdW5kZWZpbmVkYCDigJQgd2hpY2ggbG9va3MgZXhhY3RseSBsaWtlXG4gKiBOZXh0LmpzIGhhdmluZyBjaGFuZ2VkIGl0cyB0ZW1wbGF0ZSBBUEkuIGBhd2FpdGAgY292ZXJzIGJvdGggdGhhdCBhbmQgdGhlXG4gKiBwbGFpbi1DSlMvd2VicGFjayBzaGFwZS5cbiAqL1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuXG4vKipcbiAqIGBjcmVhdGVSZXF1aXJlYCBhbmNob3JlZCB0byB0aGUgbW9kdWxlIGJlaW5nIGxvYWRlZCwgcmF0aGVyIHRoYW4gYSBiYXJlXG4gKiBgcmVxdWlyZWA6IHRoaXMgZmlsZSBpcyBidW5kbGVkIHRvIEVTTSBieSBlc2J1aWxkLCB3aGVyZSB0aGUgYW1iaWVudCBgcmVxdWlyZWBcbiAqIHJlc29sdmVzIHJlbGF0aXZlIHRvIGBsaWIvcnVudGltZS9gLCBub3QgdGhlIHN0YWdlZCBhcHAgdHJlZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRCdWlsdE1vZHVsZShhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gY3JlYXRlUmVxdWlyZShhYnNvbHV0ZVBhdGgpKGFic29sdXRlUGF0aCk7XG59XG5cbi8qKiBQdWxscyBhIG5hbWVkIGZ1bmN0aW9uIGV4cG9ydCBvZmYgYSBsb2FkZWQgbW9kdWxlLCBvciB0aHJvd3Mgc2F5aW5nIHdoeSBub3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUZ1bmN0aW9uRXhwb3J0PFQ+KFxuICBleHBvcnRzOiB1bmtub3duLFxuICBuYW1lOiBzdHJpbmcsXG4gIGRlc2NyaWJlOiAoKSA9PiBzdHJpbmcsXG4pOiBUIHtcbiAgY29uc3QgdmFsdWUgPSAoZXhwb3J0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LltuYW1lXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7ZGVzY3JpYmUoKX0gZG9lcyBub3QgZXhwb3J0IGEgXFxgJHtuYW1lfVxcYCBmdW5jdGlvbiAoZ290IGAgK1xuICAgICAgICBgJHt0eXBlb2YgdmFsdWV9KS4gVGhpcyBtZWFucyBOZXh0LmpzIGNoYW5nZWQgdGhlIHNoYXBlIG9mIGl0cyBidWlsZCBgICtcbiAgICAgICAgYHRlbXBsYXRlcyAobmV4dC9kaXN0L2J1aWxkL3RlbXBsYXRlcy8pLmAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgVDtcbn1cbiJdfQ==
@@ -0,0 +1,215 @@
1
+ /** Current {@link AdapterManifest.version}. Bump on any breaking shape change. */
2
+ export declare const ADAPTER_MANIFEST_VERSION = 1;
3
+ /**
4
+ * Directory written inside `distDir` (`.next`), matching the existing
5
+ * `cdk-nextjs-init-cache` convention.
6
+ */
7
+ export declare const ADAPTER_DIR_NAME = "cdk-nextjs-adapter";
8
+ /**
9
+ * Deployment root inside {@link ADAPTER_DIR_NAME}: the staged union of every
10
+ * shipped output's traced `assets`, keyed by repo-root-relative path. This is
11
+ * what replaces `output: "standalone"`.
12
+ */
13
+ export declare const STAGING_DIR_NAME = "app";
14
+ /**
15
+ * Parent of the per-group deployment roots, used instead of
16
+ * {@link STAGING_DIR_NAME} when `functionGroups` splits the app: each group is
17
+ * staged at `<distDir>/cdk-nextjs-adapter/groups/<name>/`, including the implicit
18
+ * `default` one.
19
+ *
20
+ * Splitting gets its own subtree rather than reusing `app/` for the default group
21
+ * so that a tree left over from a build with different grouping can never be
22
+ * mistaken for this build's, and so `du` on either directory answers "how big is
23
+ * the thing I deploy" without qualification.
24
+ */
25
+ export declare const GROUPS_DIR_NAME = "groups";
26
+ /**
27
+ * Which group the running function *is*. Set per Lambda at synth, read by the
28
+ * runtime only to make a misroute say so; see `ownedRouteError`.
29
+ */
30
+ export declare const FUNCTION_GROUP_ENV_VAR = "CDK_NEXTJS_FUNCTION_GROUP";
31
+ /**
32
+ * The global the cache handler (`src/adapter/s3-cache-handler.ts`) registers its
33
+ * CloudFront invalidation hook under, and the runtime (`core.ts`) calls. A global
34
+ * rather than an import, because the cache handler is a separate bundle that
35
+ * Next.js loads itself: the two share a process, not a module graph.
36
+ */
37
+ export declare const REVALIDATED_PAGE_HOOK: unique symbol;
38
+ /**
39
+ * Directory inside {@link ADAPTER_DIR_NAME} holding one deployment root, relative
40
+ * and POSIX. `undefined` means "not splitting", which is its own layout rather
41
+ * than a group named `default`.
42
+ */
43
+ export declare function groupStagingDirName(group?: string): string;
44
+ /** {@link AdapterManifest}, written inside {@link ADAPTER_DIR_NAME}. */
45
+ export declare const MANIFEST_FILE_NAME = "manifest.json";
46
+ /**
47
+ * The entrypoints the runtime renders a 404 or a 500 with, in the order it
48
+ * tries them, and `/_error`, the last resort for both. Before basePath.
49
+ */
50
+ export declare const STATUS_PAGE_SUFFIXES: {
51
+ 404: string[];
52
+ 500: string[];
53
+ fallback: string;
54
+ };
55
+ /**
56
+ * Every {@link STATUS_PAGE_SUFFIXES} page: App Router's `/_not-found`, Pages
57
+ * Router's `/404` and `/500`, and `/_error`. The runtime may render any request
58
+ * with them, wherever it landed, so every function group stages them
59
+ * (`collectGroupStagingPlan`) and no URL has to be routed to them.
60
+ */
61
+ export declare const ERROR_PAGE_SUFFIXES: string[];
62
+ /**
63
+ * Reserved key inside the staging tree that cdk-nextjs's own bundled runtime
64
+ * files are copied to at synth (Lambda handler
65
+ * `cdk-nextjs-runtime/lambda.handler`). Reserved because a repo-root-relative
66
+ * asset key could otherwise collide with it.
67
+ */
68
+ export declare const RUNTIME_DIR_NAME = "cdk-nextjs-runtime";
69
+ /**
70
+ * The file, next to the manifest in {@link RUNTIME_DIR_NAME}, that lists
71
+ * `public/` on every type but `NextjsRegionalContainers`: a JSON array of
72
+ * `/`-separated paths relative to `public/`, as `readPublicFiles` returns them.
73
+ * Synth writes it after the build command (so `postbuild` output is listed)
74
+ * because those deployment packages do not carry `public/` itself; the runtime
75
+ * serves a listed file from S3. The RegionalContainers image copies `public/`
76
+ * in and has no such file.
77
+ */
78
+ export declare const PUBLIC_FILES_FILE_NAME = "public-files.json";
79
+ /**
80
+ * Where the runtime reads {@link AdapterManifest} from, given the deployment
81
+ * root. Synth copies `manifest.json` in next to the bundled shells rather than
82
+ * leaving it at its build-time location (`<distDir>/cdk-nextjs-adapter/`, one
83
+ * level *above* the staging tree) so that a single asset is self-describing.
84
+ */
85
+ export declare function deployedManifestPath(deploymentRoot: string): string;
86
+ export interface AdapterManifest {
87
+ readonly version: 1;
88
+ readonly buildId: string;
89
+ /**
90
+ * From the deployment root to the Next.js project dir. "" when the app is at
91
+ * the repo root.
92
+ *
93
+ * **The runtime `chdir`s here at cold start, and that is load-bearing.** Next
94
+ * inlines `__NEXT_RELATIVE_PROJECT_DIR = relative(buildCwd, projectDir)` into
95
+ * every entrypoint at build time (`next/dist/build/define-env.js`), and the
96
+ * built code resolves it as `join(process.cwd(), relativeProjectDir)` to find
97
+ * `required-server-files.json`, the prerender manifest, and the app's own
98
+ * files. `requestMeta.relativeProjectDir` overrides it in
99
+ * `next/dist/server/route-modules/route-module.js` but **not** in
100
+ * `app-page-runtime.js`, which passes the inlined value through as the render
101
+ * `dir` — so `process.cwd()` is the only mechanism that covers every
102
+ * entrypoint type. `build-outputs.ts` asserts `buildCwd === projectDir` to
103
+ * keep the inlined value `""` and this field the whole answer.
104
+ */
105
+ readonly relativeProjectDir: string;
106
+ readonly config: AdapterManifestConfig;
107
+ /** `ctx.routing` verbatim, including `middlewareMatchers`. */
108
+ readonly routing: unknown;
109
+ /**
110
+ * Every pathname `resolveRoutes` is allowed to match: the {@link entrypoints}
111
+ * keys plus {@link staticFiles}. Sorted and deduped.
112
+ */
113
+ readonly pathnames: string[];
114
+ /**
115
+ * Route *template* (`/blog/[slug]`) → entrypoint. Keys are basePath- and
116
+ * locale-prefixed exactly as `resolveRoutes` reports `resolvedPathname`, so
117
+ * the lookup is a plain index with no normalization.
118
+ *
119
+ * Includes dynamic *prerender* templates (notably Pages Router
120
+ * `/_next/data/<buildId>/<locale>/blog/[slug].json`) mapped to the entrypoint
121
+ * of the route that owns them.
122
+ */
123
+ readonly entrypoints: Record<string, AdapterEntrypoint>;
124
+ readonly middleware: AdapterMiddleware | null;
125
+ /**
126
+ * Pathname → repo-root-relative POSIX key of the file to serve.
127
+ *
128
+ * A map rather than a list of pathnames because the two are not derivable from
129
+ * each other: `/favicon.ico` is `<distDir>/server/app/favicon.ico.body`, `/404`
130
+ * is `<distDir>/server/pages/404.html`, and a fully-static Pages Router route
131
+ * is `<distDir>/server/pages/<route>.html`. The runtime serves these itself —
132
+ * `NextjsStaticAssets` only uploads `<distDir>/static` and `public`, so nothing
133
+ * in front of the compute can answer them.
134
+ *
135
+ * Whether the file is present in the deployment package depends on the
136
+ * deployment type; see `stageServedStaticFiles` in `build-outputs.ts`.
137
+ */
138
+ readonly staticFiles: Record<string, string>;
139
+ /**
140
+ * Group name → the route templates that group's deployment package holds,
141
+ * including the implicit `default`. Absent when `functionGroups` is not used.
142
+ *
143
+ * Every group gets the *same* manifest, because routing is identical in all of
144
+ * them: middleware, redirects and rewrites are duplicated by design, and a
145
+ * group has to be able to resolve a pathname it does not own in order to say so
146
+ * rather than crash on a missing file. This field is what lets it say so.
147
+ */
148
+ readonly groups?: Record<string, string[]>;
149
+ /**
150
+ * Every behavior the edge routes a non-default group on, most specific first
151
+ * (`GroupBehavior` in `function-groups.ts`). Present exactly when
152
+ * {@link groups} is. Recorded by the assignment rather than recomputed at
153
+ * synth, so the behaviors deployed are the ones it checked.
154
+ */
155
+ readonly behaviors?: {
156
+ group: string;
157
+ route: string;
158
+ pattern: string;
159
+ }[];
160
+ /**
161
+ * The `functionGroups` the build was split by (name and routes, as passed in
162
+ * `CDK_NEXTJS_FUNCTION_GROUPS`), present exactly when {@link groups} is. Synth
163
+ * compares it with its own props to catch a stale or hand-run build.
164
+ */
165
+ readonly functionGroups?: {
166
+ name: string;
167
+ routes: string[];
168
+ }[];
169
+ }
170
+ export interface AdapterManifestConfig {
171
+ readonly basePath: string;
172
+ readonly trailingSlash: boolean;
173
+ readonly assetPrefix: string;
174
+ /**
175
+ * `distDir` relative to the project dir — `.next` unless configured. POSIX.
176
+ * The runtime reads `required-server-files.json` from here for the image
177
+ * optimizer's config.
178
+ */
179
+ readonly distDir: string;
180
+ /**
181
+ * `next.config` `compress`. The runtime gzips streamed responses itself
182
+ * (neither API Gateway in STREAM mode nor CloudFront can), so honoring this
183
+ * is on us.
184
+ */
185
+ readonly compress: boolean;
186
+ /**
187
+ * `next.config` `generateEtags`. Honored for the files the runtime serves
188
+ * itself, as `next start` does (`serveStatic`'s `etag` option).
189
+ */
190
+ readonly generateEtags: boolean;
191
+ /**
192
+ * `ResolveRoutesParams["i18n"]`-shaped, narrower than NextConfigComplete.
193
+ * `null` when the app configures no `i18n`.
194
+ */
195
+ readonly i18n: unknown | null;
196
+ /**
197
+ * `next.config` `deploymentId` (or `NEXT_DEPLOYMENT_ID`), reduced to the
198
+ * characters safe in an S3 key prefix and a DynamoDB partition key — `/` in
199
+ * particular would split the prefix `prune-cache-bucket.ts` matches on. `""`
200
+ * when the app sets none.
201
+ */
202
+ readonly deploymentId: string;
203
+ }
204
+ export type AdapterEntrypointType = "app-page" | "app-route" | "page" | "page-api";
205
+ export interface AdapterEntrypoint {
206
+ readonly id: string;
207
+ /** Repo-root-relative POSIX key inside the staging tree. Never absolute. */
208
+ readonly filePath: string;
209
+ readonly type: AdapterEntrypointType;
210
+ }
211
+ export interface AdapterMiddleware {
212
+ readonly id: string;
213
+ /** Repo-root-relative POSIX key inside the staging tree. Never absolute. */
214
+ readonly filePath: string;
215
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PUBLIC_FILES_FILE_NAME = exports.RUNTIME_DIR_NAME = exports.ERROR_PAGE_SUFFIXES = exports.STATUS_PAGE_SUFFIXES = exports.MANIFEST_FILE_NAME = exports.REVALIDATED_PAGE_HOOK = exports.FUNCTION_GROUP_ENV_VAR = exports.GROUPS_DIR_NAME = exports.STAGING_DIR_NAME = exports.ADAPTER_DIR_NAME = exports.ADAPTER_MANIFEST_VERSION = void 0;
4
+ exports.groupStagingDirName = groupStagingDirName;
5
+ exports.deployedManifestPath = deployedManifestPath;
6
+ /**
7
+ * The build-time → run-time contract for the adapter runtime.
8
+ *
9
+ * `src/adapter/build-outputs.ts` writes an {@link AdapterManifest} during
10
+ * `next build`; the runtime shells in `src/runtime/` read it at cold start and
11
+ * the CDK constructs read it at synth. It is the only thing that crosses those
12
+ * three boundaries, so it is deliberately plain JSON.
13
+ *
14
+ * **Every path in this manifest is a repo-root-relative POSIX key**, never a
15
+ * build-machine absolute path: absolute paths work on the build machine and
16
+ * fail in Lambda. The staging tree those keys index into is
17
+ * `<distDir>/cdk-nextjs-adapter/app`; the runtime calls that directory the
18
+ * *deployment root* and resolves every key against it.
19
+ *
20
+ * This file is intentionally not exported from `src/index.ts`: it is an
21
+ * internal contract, not public construct API, so it is exempt from the JSII
22
+ * restrictions the rest of `src/` follows.
23
+ */
24
+ const node_path_1 = require("node:path");
25
+ /** Current {@link AdapterManifest.version}. Bump on any breaking shape change. */
26
+ exports.ADAPTER_MANIFEST_VERSION = 1;
27
+ /**
28
+ * Directory written inside `distDir` (`.next`), matching the existing
29
+ * `cdk-nextjs-init-cache` convention.
30
+ */
31
+ exports.ADAPTER_DIR_NAME = "cdk-nextjs-adapter";
32
+ /**
33
+ * Deployment root inside {@link ADAPTER_DIR_NAME}: the staged union of every
34
+ * shipped output's traced `assets`, keyed by repo-root-relative path. This is
35
+ * what replaces `output: "standalone"`.
36
+ */
37
+ exports.STAGING_DIR_NAME = "app";
38
+ /**
39
+ * Parent of the per-group deployment roots, used instead of
40
+ * {@link STAGING_DIR_NAME} when `functionGroups` splits the app: each group is
41
+ * staged at `<distDir>/cdk-nextjs-adapter/groups/<name>/`, including the implicit
42
+ * `default` one.
43
+ *
44
+ * Splitting gets its own subtree rather than reusing `app/` for the default group
45
+ * so that a tree left over from a build with different grouping can never be
46
+ * mistaken for this build's, and so `du` on either directory answers "how big is
47
+ * the thing I deploy" without qualification.
48
+ */
49
+ exports.GROUPS_DIR_NAME = "groups";
50
+ /**
51
+ * Which group the running function *is*. Set per Lambda at synth, read by the
52
+ * runtime only to make a misroute say so; see `ownedRouteError`.
53
+ */
54
+ exports.FUNCTION_GROUP_ENV_VAR = "CDK_NEXTJS_FUNCTION_GROUP";
55
+ /**
56
+ * The global the cache handler (`src/adapter/s3-cache-handler.ts`) registers its
57
+ * CloudFront invalidation hook under, and the runtime (`core.ts`) calls. A global
58
+ * rather than an import, because the cache handler is a separate bundle that
59
+ * Next.js loads itself: the two share a process, not a module graph.
60
+ */
61
+ exports.REVALIDATED_PAGE_HOOK = Symbol.for("cdk-nextjs.invalidateRevalidatedPage");
62
+ /**
63
+ * Directory inside {@link ADAPTER_DIR_NAME} holding one deployment root, relative
64
+ * and POSIX. `undefined` means "not splitting", which is its own layout rather
65
+ * than a group named `default`.
66
+ */
67
+ function groupStagingDirName(group) {
68
+ return group === undefined ? exports.STAGING_DIR_NAME : `${exports.GROUPS_DIR_NAME}/${group}`;
69
+ }
70
+ /** {@link AdapterManifest}, written inside {@link ADAPTER_DIR_NAME}. */
71
+ exports.MANIFEST_FILE_NAME = "manifest.json";
72
+ /**
73
+ * The entrypoints the runtime renders a 404 or a 500 with, in the order it
74
+ * tries them, and `/_error`, the last resort for both. Before basePath.
75
+ */
76
+ exports.STATUS_PAGE_SUFFIXES = {
77
+ 404: ["/_not-found", "/404"],
78
+ 500: ["/500"],
79
+ fallback: "/_error",
80
+ };
81
+ /**
82
+ * Every {@link STATUS_PAGE_SUFFIXES} page: App Router's `/_not-found`, Pages
83
+ * Router's `/404` and `/500`, and `/_error`. The runtime may render any request
84
+ * with them, wherever it landed, so every function group stages them
85
+ * (`collectGroupStagingPlan`) and no URL has to be routed to them.
86
+ */
87
+ exports.ERROR_PAGE_SUFFIXES = [
88
+ ...exports.STATUS_PAGE_SUFFIXES[404],
89
+ ...exports.STATUS_PAGE_SUFFIXES[500],
90
+ exports.STATUS_PAGE_SUFFIXES.fallback,
91
+ ];
92
+ /**
93
+ * Reserved key inside the staging tree that cdk-nextjs's own bundled runtime
94
+ * files are copied to at synth (Lambda handler
95
+ * `cdk-nextjs-runtime/lambda.handler`). Reserved because a repo-root-relative
96
+ * asset key could otherwise collide with it.
97
+ */
98
+ exports.RUNTIME_DIR_NAME = "cdk-nextjs-runtime";
99
+ /**
100
+ * The file, next to the manifest in {@link RUNTIME_DIR_NAME}, that lists
101
+ * `public/` on every type but `NextjsRegionalContainers`: a JSON array of
102
+ * `/`-separated paths relative to `public/`, as `readPublicFiles` returns them.
103
+ * Synth writes it after the build command (so `postbuild` output is listed)
104
+ * because those deployment packages do not carry `public/` itself; the runtime
105
+ * serves a listed file from S3. The RegionalContainers image copies `public/`
106
+ * in and has no such file.
107
+ */
108
+ exports.PUBLIC_FILES_FILE_NAME = "public-files.json";
109
+ /**
110
+ * Where the runtime reads {@link AdapterManifest} from, given the deployment
111
+ * root. Synth copies `manifest.json` in next to the bundled shells rather than
112
+ * leaving it at its build-time location (`<distDir>/cdk-nextjs-adapter/`, one
113
+ * level *above* the staging tree) so that a single asset is self-describing.
114
+ */
115
+ function deployedManifestPath(deploymentRoot) {
116
+ return (0, node_path_1.join)(deploymentRoot, exports.RUNTIME_DIR_NAME, exports.MANIFEST_FILE_NAME);
117
+ }
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzRUEsa0RBRUM7QUFvREQsb0RBRUM7QUE5SEQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gseUNBQWlDO0FBRWpDLGtGQUFrRjtBQUNyRSxRQUFBLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUUxQzs7O0dBR0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7O0dBSUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ1UsUUFBQSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBRXhDOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsMkJBQTJCLENBQUM7QUFFbEU7Ozs7O0dBS0c7QUFDVSxRQUFBLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQzdDLHNDQUFzQyxDQUN2QyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyx3QkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyx1QkFBZSxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ2hGLENBQUM7QUFFRCx3RUFBd0U7QUFDM0QsUUFBQSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFFbEQ7OztHQUdHO0FBQ1UsUUFBQSxvQkFBb0IsR0FBRztJQUNsQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQzVCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNiLFFBQVEsRUFBRSxTQUFTO0NBQ3BCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNVLFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsNEJBQW9CLENBQUMsUUFBUTtDQUM5QixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQztBQUUxRDs7Ozs7R0FLRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLGNBQXNCO0lBQ3pELE9BQU8sSUFBQSxnQkFBSSxFQUFDLGNBQWMsRUFBRSx3QkFBZ0IsRUFBRSwwQkFBa0IsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBidWlsZC10aW1lIOKGkiBydW4tdGltZSBjb250cmFjdCBmb3IgdGhlIGFkYXB0ZXIgcnVudGltZS5cbiAqXG4gKiBgc3JjL2FkYXB0ZXIvYnVpbGQtb3V0cHV0cy50c2Agd3JpdGVzIGFuIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9IGR1cmluZ1xuICogYG5leHQgYnVpbGRgOyB0aGUgcnVudGltZSBzaGVsbHMgaW4gYHNyYy9ydW50aW1lL2AgcmVhZCBpdCBhdCBjb2xkIHN0YXJ0IGFuZFxuICogdGhlIENESyBjb25zdHJ1Y3RzIHJlYWQgaXQgYXQgc3ludGguIEl0IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY3Jvc3NlcyB0aG9zZVxuICogdGhyZWUgYm91bmRhcmllcywgc28gaXQgaXMgZGVsaWJlcmF0ZWx5IHBsYWluIEpTT04uXG4gKlxuICogKipFdmVyeSBwYXRoIGluIHRoaXMgbWFuaWZlc3QgaXMgYSByZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5KiosIG5ldmVyIGFcbiAqIGJ1aWxkLW1hY2hpbmUgYWJzb2x1dGUgcGF0aDogYWJzb2x1dGUgcGF0aHMgd29yayBvbiB0aGUgYnVpbGQgbWFjaGluZSBhbmRcbiAqIGZhaWwgaW4gTGFtYmRhLiBUaGUgc3RhZ2luZyB0cmVlIHRob3NlIGtleXMgaW5kZXggaW50byBpc1xuICogYDxkaXN0RGlyPi9jZGstbmV4dGpzLWFkYXB0ZXIvYXBwYDsgdGhlIHJ1bnRpbWUgY2FsbHMgdGhhdCBkaXJlY3RvcnkgdGhlXG4gKiAqZGVwbG95bWVudCByb290KiBhbmQgcmVzb2x2ZXMgZXZlcnkga2V5IGFnYWluc3QgaXQuXG4gKlxuICogVGhpcyBmaWxlIGlzIGludGVudGlvbmFsbHkgbm90IGV4cG9ydGVkIGZyb20gYHNyYy9pbmRleC50c2A6IGl0IGlzIGFuXG4gKiBpbnRlcm5hbCBjb250cmFjdCwgbm90IHB1YmxpYyBjb25zdHJ1Y3QgQVBJLCBzbyBpdCBpcyBleGVtcHQgZnJvbSB0aGUgSlNJSVxuICogcmVzdHJpY3Rpb25zIHRoZSByZXN0IG9mIGBzcmMvYCBmb2xsb3dzLlxuICovXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG4vKiogQ3VycmVudCB7QGxpbmsgQWRhcHRlck1hbmlmZXN0LnZlcnNpb259LiBCdW1wIG9uIGFueSBicmVha2luZyBzaGFwZSBjaGFuZ2UuICovXG5leHBvcnQgY29uc3QgQURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBEaXJlY3Rvcnkgd3JpdHRlbiBpbnNpZGUgYGRpc3REaXJgIChgLm5leHRgKSwgbWF0Y2hpbmcgdGhlIGV4aXN0aW5nXG4gKiBgY2RrLW5leHRqcy1pbml0LWNhY2hlYCBjb252ZW50aW9uLlxuICovXG5leHBvcnQgY29uc3QgQURBUFRFUl9ESVJfTkFNRSA9IFwiY2RrLW5leHRqcy1hZGFwdGVyXCI7XG5cbi8qKlxuICogRGVwbG95bWVudCByb290IGluc2lkZSB7QGxpbmsgQURBUFRFUl9ESVJfTkFNRX06IHRoZSBzdGFnZWQgdW5pb24gb2YgZXZlcnlcbiAqIHNoaXBwZWQgb3V0cHV0J3MgdHJhY2VkIGBhc3NldHNgLCBrZXllZCBieSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aC4gVGhpcyBpc1xuICogd2hhdCByZXBsYWNlcyBgb3V0cHV0OiBcInN0YW5kYWxvbmVcImAuXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFHSU5HX0RJUl9OQU1FID0gXCJhcHBcIjtcblxuLyoqXG4gKiBQYXJlbnQgb2YgdGhlIHBlci1ncm91cCBkZXBsb3ltZW50IHJvb3RzLCB1c2VkIGluc3RlYWQgb2ZcbiAqIHtAbGluayBTVEFHSU5HX0RJUl9OQU1FfSB3aGVuIGBmdW5jdGlvbkdyb3Vwc2Agc3BsaXRzIHRoZSBhcHA6IGVhY2ggZ3JvdXAgaXNcbiAqIHN0YWdlZCBhdCBgPGRpc3REaXI+L2Nkay1uZXh0anMtYWRhcHRlci9ncm91cHMvPG5hbWU+L2AsIGluY2x1ZGluZyB0aGUgaW1wbGljaXRcbiAqIGBkZWZhdWx0YCBvbmUuXG4gKlxuICogU3BsaXR0aW5nIGdldHMgaXRzIG93biBzdWJ0cmVlIHJhdGhlciB0aGFuIHJldXNpbmcgYGFwcC9gIGZvciB0aGUgZGVmYXVsdCBncm91cFxuICogc28gdGhhdCBhIHRyZWUgbGVmdCBvdmVyIGZyb20gYSBidWlsZCB3aXRoIGRpZmZlcmVudCBncm91cGluZyBjYW4gbmV2ZXIgYmVcbiAqIG1pc3Rha2VuIGZvciB0aGlzIGJ1aWxkJ3MsIGFuZCBzbyBgZHVgIG9uIGVpdGhlciBkaXJlY3RvcnkgYW5zd2VycyBcImhvdyBiaWcgaXNcbiAqIHRoZSB0aGluZyBJIGRlcGxveVwiIHdpdGhvdXQgcXVhbGlmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEdST1VQU19ESVJfTkFNRSA9IFwiZ3JvdXBzXCI7XG5cbi8qKlxuICogV2hpY2ggZ3JvdXAgdGhlIHJ1bm5pbmcgZnVuY3Rpb24gKmlzKi4gU2V0IHBlciBMYW1iZGEgYXQgc3ludGgsIHJlYWQgYnkgdGhlXG4gKiBydW50aW1lIG9ubHkgdG8gbWFrZSBhIG1pc3JvdXRlIHNheSBzbzsgc2VlIGBvd25lZFJvdXRlRXJyb3JgLlxuICovXG5leHBvcnQgY29uc3QgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUiA9IFwiQ0RLX05FWFRKU19GVU5DVElPTl9HUk9VUFwiO1xuXG4vKipcbiAqIFRoZSBnbG9iYWwgdGhlIGNhY2hlIGhhbmRsZXIgKGBzcmMvYWRhcHRlci9zMy1jYWNoZS1oYW5kbGVyLnRzYCkgcmVnaXN0ZXJzIGl0c1xuICogQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gaG9vayB1bmRlciwgYW5kIHRoZSBydW50aW1lIChgY29yZS50c2ApIGNhbGxzLiBBIGdsb2JhbFxuICogcmF0aGVyIHRoYW4gYW4gaW1wb3J0LCBiZWNhdXNlIHRoZSBjYWNoZSBoYW5kbGVyIGlzIGEgc2VwYXJhdGUgYnVuZGxlIHRoYXRcbiAqIE5leHQuanMgbG9hZHMgaXRzZWxmOiB0aGUgdHdvIHNoYXJlIGEgcHJvY2Vzcywgbm90IGEgbW9kdWxlIGdyYXBoLlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFURURfUEFHRV9IT09LID0gU3ltYm9sLmZvcihcbiAgXCJjZGstbmV4dGpzLmludmFsaWRhdGVSZXZhbGlkYXRlZFBhZ2VcIixcbik7XG5cbi8qKlxuICogRGlyZWN0b3J5IGluc2lkZSB7QGxpbmsgQURBUFRFUl9ESVJfTkFNRX0gaG9sZGluZyBvbmUgZGVwbG95bWVudCByb290LCByZWxhdGl2ZVxuICogYW5kIFBPU0lYLiBgdW5kZWZpbmVkYCBtZWFucyBcIm5vdCBzcGxpdHRpbmdcIiwgd2hpY2ggaXMgaXRzIG93biBsYXlvdXQgcmF0aGVyXG4gKiB0aGFuIGEgZ3JvdXAgbmFtZWQgYGRlZmF1bHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBTdGFnaW5nRGlyTmFtZShncm91cD86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBncm91cCA9PT0gdW5kZWZpbmVkID8gU1RBR0lOR19ESVJfTkFNRSA6IGAke0dST1VQU19ESVJfTkFNRX0vJHtncm91cH1gO1xufVxuXG4vKioge0BsaW5rIEFkYXB0ZXJNYW5pZmVzdH0sIHdyaXR0ZW4gaW5zaWRlIHtAbGluayBBREFQVEVSX0RJUl9OQU1FfS4gKi9cbmV4cG9ydCBjb25zdCBNQU5JRkVTVF9GSUxFX05BTUUgPSBcIm1hbmlmZXN0Lmpzb25cIjtcblxuLyoqXG4gKiBUaGUgZW50cnlwb2ludHMgdGhlIHJ1bnRpbWUgcmVuZGVycyBhIDQwNCBvciBhIDUwMCB3aXRoLCBpbiB0aGUgb3JkZXIgaXRcbiAqIHRyaWVzIHRoZW0sIGFuZCBgL19lcnJvcmAsIHRoZSBsYXN0IHJlc29ydCBmb3IgYm90aC4gQmVmb3JlIGJhc2VQYXRoLlxuICovXG5leHBvcnQgY29uc3QgU1RBVFVTX1BBR0VfU1VGRklYRVMgPSB7XG4gIDQwNDogW1wiL19ub3QtZm91bmRcIiwgXCIvNDA0XCJdLFxuICA1MDA6IFtcIi81MDBcIl0sXG4gIGZhbGxiYWNrOiBcIi9fZXJyb3JcIixcbn07XG5cbi8qKlxuICogRXZlcnkge0BsaW5rIFNUQVRVU19QQUdFX1NVRkZJWEVTfSBwYWdlOiBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCwgUGFnZXNcbiAqIFJvdXRlcidzIGAvNDA0YCBhbmQgYC81MDBgLCBhbmQgYC9fZXJyb3JgLiBUaGUgcnVudGltZSBtYXkgcmVuZGVyIGFueSByZXF1ZXN0XG4gKiB3aXRoIHRoZW0sIHdoZXJldmVyIGl0IGxhbmRlZCwgc28gZXZlcnkgZnVuY3Rpb24gZ3JvdXAgc3RhZ2VzIHRoZW1cbiAqIChgY29sbGVjdEdyb3VwU3RhZ2luZ1BsYW5gKSBhbmQgbm8gVVJMIGhhcyB0byBiZSByb3V0ZWQgdG8gdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVSUk9SX1BBR0VfU1VGRklYRVMgPSBbXG4gIC4uLlNUQVRVU19QQUdFX1NVRkZJWEVTWzQwNF0sXG4gIC4uLlNUQVRVU19QQUdFX1NVRkZJWEVTWzUwMF0sXG4gIFNUQVRVU19QQUdFX1NVRkZJWEVTLmZhbGxiYWNrLFxuXTtcblxuLyoqXG4gKiBSZXNlcnZlZCBrZXkgaW5zaWRlIHRoZSBzdGFnaW5nIHRyZWUgdGhhdCBjZGstbmV4dGpzJ3Mgb3duIGJ1bmRsZWQgcnVudGltZVxuICogZmlsZXMgYXJlIGNvcGllZCB0byBhdCBzeW50aCAoTGFtYmRhIGhhbmRsZXJcbiAqIGBjZGstbmV4dGpzLXJ1bnRpbWUvbGFtYmRhLmhhbmRsZXJgKS4gUmVzZXJ2ZWQgYmVjYXVzZSBhIHJlcG8tcm9vdC1yZWxhdGl2ZVxuICogYXNzZXQga2V5IGNvdWxkIG90aGVyd2lzZSBjb2xsaWRlIHdpdGggaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSVU5USU1FX0RJUl9OQU1FID0gXCJjZGstbmV4dGpzLXJ1bnRpbWVcIjtcblxuLyoqXG4gKiBUaGUgZmlsZSwgbmV4dCB0byB0aGUgbWFuaWZlc3QgaW4ge0BsaW5rIFJVTlRJTUVfRElSX05BTUV9LCB0aGF0IGxpc3RzXG4gKiBgcHVibGljL2Agb24gZXZlcnkgdHlwZSBidXQgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2A6IGEgSlNPTiBhcnJheSBvZlxuICogYC9gLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byBgcHVibGljL2AsIGFzIGByZWFkUHVibGljRmlsZXNgIHJldHVybnMgdGhlbS5cbiAqIFN5bnRoIHdyaXRlcyBpdCBhZnRlciB0aGUgYnVpbGQgY29tbWFuZCAoc28gYHBvc3RidWlsZGAgb3V0cHV0IGlzIGxpc3RlZClcbiAqIGJlY2F1c2UgdGhvc2UgZGVwbG95bWVudCBwYWNrYWdlcyBkbyBub3QgY2FycnkgYHB1YmxpYy9gIGl0c2VsZjsgdGhlIHJ1bnRpbWVcbiAqIHNlcnZlcyBhIGxpc3RlZCBmaWxlIGZyb20gUzMuIFRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgY29waWVzIGBwdWJsaWMvYFxuICogaW4gYW5kIGhhcyBubyBzdWNoIGZpbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUJMSUNfRklMRVNfRklMRV9OQU1FID0gXCJwdWJsaWMtZmlsZXMuanNvblwiO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBydW50aW1lIHJlYWRzIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9IGZyb20sIGdpdmVuIHRoZSBkZXBsb3ltZW50XG4gKiByb290LiBTeW50aCBjb3BpZXMgYG1hbmlmZXN0Lmpzb25gIGluIG5leHQgdG8gdGhlIGJ1bmRsZWQgc2hlbGxzIHJhdGhlciB0aGFuXG4gKiBsZWF2aW5nIGl0IGF0IGl0cyBidWlsZC10aW1lIGxvY2F0aW9uIChgPGRpc3REaXI+L2Nkay1uZXh0anMtYWRhcHRlci9gLCBvbmVcbiAqIGxldmVsICphYm92ZSogdGhlIHN0YWdpbmcgdHJlZSkgc28gdGhhdCBhIHNpbmdsZSBhc3NldCBpcyBzZWxmLWRlc2NyaWJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3llZE1hbmlmZXN0UGF0aChkZXBsb3ltZW50Um9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oZGVwbG95bWVudFJvb3QsIFJVTlRJTUVfRElSX05BTUUsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlck1hbmlmZXN0IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogMTtcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICAvKipcbiAgICogRnJvbSB0aGUgZGVwbG95bWVudCByb290IHRvIHRoZSBOZXh0LmpzIHByb2plY3QgZGlyLiBcIlwiIHdoZW4gdGhlIGFwcCBpcyBhdFxuICAgKiB0aGUgcmVwbyByb290LlxuICAgKlxuICAgKiAqKlRoZSBydW50aW1lIGBjaGRpcmBzIGhlcmUgYXQgY29sZCBzdGFydCwgYW5kIHRoYXQgaXMgbG9hZC1iZWFyaW5nLioqIE5leHRcbiAgICogaW5saW5lcyBgX19ORVhUX1JFTEFUSVZFX1BST0pFQ1RfRElSID0gcmVsYXRpdmUoYnVpbGRDd2QsIHByb2plY3REaXIpYCBpbnRvXG4gICAqIGV2ZXJ5IGVudHJ5cG9pbnQgYXQgYnVpbGQgdGltZSAoYG5leHQvZGlzdC9idWlsZC9kZWZpbmUtZW52LmpzYCksIGFuZCB0aGVcbiAgICogYnVpbHQgY29kZSByZXNvbHZlcyBpdCBhcyBgam9pbihwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVByb2plY3REaXIpYCB0byBmaW5kXG4gICAqIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAsIHRoZSBwcmVyZW5kZXIgbWFuaWZlc3QsIGFuZCB0aGUgYXBwJ3Mgb3duXG4gICAqIGZpbGVzLiBgcmVxdWVzdE1ldGEucmVsYXRpdmVQcm9qZWN0RGlyYCBvdmVycmlkZXMgaXQgaW5cbiAgICogYG5leHQvZGlzdC9zZXJ2ZXIvcm91dGUtbW9kdWxlcy9yb3V0ZS1tb2R1bGUuanNgIGJ1dCAqKm5vdCoqIGluXG4gICAqIGBhcHAtcGFnZS1ydW50aW1lLmpzYCwgd2hpY2ggcGFzc2VzIHRoZSBpbmxpbmVkIHZhbHVlIHRocm91Z2ggYXMgdGhlIHJlbmRlclxuICAgKiBgZGlyYCDigJQgc28gYHByb2Nlc3MuY3dkKClgIGlzIHRoZSBvbmx5IG1lY2hhbmlzbSB0aGF0IGNvdmVycyBldmVyeVxuICAgKiBlbnRyeXBvaW50IHR5cGUuIGBidWlsZC1vdXRwdXRzLnRzYCBhc3NlcnRzIGBidWlsZEN3ZCA9PT0gcHJvamVjdERpcmAgdG9cbiAgICoga2VlcCB0aGUgaW5saW5lZCB2YWx1ZSBgXCJcImAgYW5kIHRoaXMgZmllbGQgdGhlIHdob2xlIGFuc3dlci5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUHJvamVjdERpcjogc3RyaW5nO1xuICByZWFkb25seSBjb25maWc6IEFkYXB0ZXJNYW5pZmVzdENvbmZpZztcbiAgLyoqIGBjdHgucm91dGluZ2AgdmVyYmF0aW0sIGluY2x1ZGluZyBgbWlkZGxld2FyZU1hdGNoZXJzYC4gKi9cbiAgcmVhZG9ubHkgcm91dGluZzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV2ZXJ5IHBhdGhuYW1lIGByZXNvbHZlUm91dGVzYCBpcyBhbGxvd2VkIHRvIG1hdGNoOiB0aGUge0BsaW5rIGVudHJ5cG9pbnRzfVxuICAgKiBrZXlzIHBsdXMge0BsaW5rIHN0YXRpY0ZpbGVzfS4gU29ydGVkIGFuZCBkZWR1cGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aG5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJvdXRlICp0ZW1wbGF0ZSogKGAvYmxvZy9bc2x1Z11gKSDihpIgZW50cnlwb2ludC4gS2V5cyBhcmUgYmFzZVBhdGgtIGFuZFxuICAgKiBsb2NhbGUtcHJlZml4ZWQgZXhhY3RseSBhcyBgcmVzb2x2ZVJvdXRlc2AgcmVwb3J0cyBgcmVzb2x2ZWRQYXRobmFtZWAsIHNvXG4gICAqIHRoZSBsb29rdXAgaXMgYSBwbGFpbiBpbmRleCB3aXRoIG5vIG5vcm1hbGl6YXRpb24uXG4gICAqXG4gICAqIEluY2x1ZGVzIGR5bmFtaWMgKnByZXJlbmRlciogdGVtcGxhdGVzIChub3RhYmx5IFBhZ2VzIFJvdXRlclxuICAgKiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+Lzxsb2NhbGU+L2Jsb2cvW3NsdWddLmpzb25gKSBtYXBwZWQgdG8gdGhlIGVudHJ5cG9pbnRcbiAgICogb2YgdGhlIHJvdXRlIHRoYXQgb3ducyB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PjtcbiAgcmVhZG9ubHkgbWlkZGxld2FyZTogQWRhcHRlck1pZGRsZXdhcmUgfCBudWxsO1xuICAvKipcbiAgICogUGF0aG5hbWUg4oaSIHJlcG8tcm9vdC1yZWxhdGl2ZSBQT1NJWCBrZXkgb2YgdGhlIGZpbGUgdG8gc2VydmUuXG4gICAqXG4gICAqIEEgbWFwIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBwYXRobmFtZXMgYmVjYXVzZSB0aGUgdHdvIGFyZSBub3QgZGVyaXZhYmxlIGZyb21cbiAgICogZWFjaCBvdGhlcjogYC9mYXZpY29uLmljb2AgaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvYXBwL2Zhdmljb24uaWNvLmJvZHlgLCBgLzQwNGBcbiAgICogaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvcGFnZXMvNDA0Lmh0bWxgLCBhbmQgYSBmdWxseS1zdGF0aWMgUGFnZXMgUm91dGVyIHJvdXRlXG4gICAqIGlzIGA8ZGlzdERpcj4vc2VydmVyL3BhZ2VzLzxyb3V0ZT4uaHRtbGAuIFRoZSBydW50aW1lIHNlcnZlcyB0aGVzZSBpdHNlbGYg4oCUXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHNgIG9ubHkgdXBsb2FkcyBgPGRpc3REaXI+L3N0YXRpY2AgYW5kIGBwdWJsaWNgLCBzbyBub3RoaW5nXG4gICAqIGluIGZyb250IG9mIHRoZSBjb21wdXRlIGNhbiBhbnN3ZXIgdGhlbS5cbiAgICpcbiAgICogV2hldGhlciB0aGUgZmlsZSBpcyBwcmVzZW50IGluIHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgZGVwZW5kcyBvbiB0aGVcbiAgICogZGVwbG95bWVudCB0eXBlOyBzZWUgYHN0YWdlU2VydmVkU3RhdGljRmlsZXNgIGluIGBidWlsZC1vdXRwdXRzLnRzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogR3JvdXAgbmFtZSDihpIgdGhlIHJvdXRlIHRlbXBsYXRlcyB0aGF0IGdyb3VwJ3MgZGVwbG95bWVudCBwYWNrYWdlIGhvbGRzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGltcGxpY2l0IGBkZWZhdWx0YC4gQWJzZW50IHdoZW4gYGZ1bmN0aW9uR3JvdXBzYCBpcyBub3QgdXNlZC5cbiAgICpcbiAgICogRXZlcnkgZ3JvdXAgZ2V0cyB0aGUgKnNhbWUqIG1hbmlmZXN0LCBiZWNhdXNlIHJvdXRpbmcgaXMgaWRlbnRpY2FsIGluIGFsbCBvZlxuICAgKiB0aGVtOiBtaWRkbGV3YXJlLCByZWRpcmVjdHMgYW5kIHJld3JpdGVzIGFyZSBkdXBsaWNhdGVkIGJ5IGRlc2lnbiwgYW5kIGFcbiAgICogZ3JvdXAgaGFzIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSBhIHBhdGhuYW1lIGl0IGRvZXMgbm90IG93biBpbiBvcmRlciB0byBzYXkgc29cbiAgICogcmF0aGVyIHRoYW4gY3Jhc2ggb24gYSBtaXNzaW5nIGZpbGUuIFRoaXMgZmllbGQgaXMgd2hhdCBsZXRzIGl0IHNheSBzby5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3Vwcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIEV2ZXJ5IGJlaGF2aW9yIHRoZSBlZGdlIHJvdXRlcyBhIG5vbi1kZWZhdWx0IGdyb3VwIG9uLCBtb3N0IHNwZWNpZmljIGZpcnN0XG4gICAqIChgR3JvdXBCZWhhdmlvcmAgaW4gYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLiBQcmVzZW50IGV4YWN0bHkgd2hlblxuICAgKiB7QGxpbmsgZ3JvdXBzfSBpcy4gUmVjb3JkZWQgYnkgdGhlIGFzc2lnbm1lbnQgcmF0aGVyIHRoYW4gcmVjb21wdXRlZCBhdFxuICAgKiBzeW50aCwgc28gdGhlIGJlaGF2aW9ycyBkZXBsb3llZCBhcmUgdGhlIG9uZXMgaXQgY2hlY2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJlaGF2aW9ycz86IHsgZ3JvdXA6IHN0cmluZzsgcm91dGU6IHN0cmluZzsgcGF0dGVybjogc3RyaW5nIH1bXTtcbiAgLyoqXG4gICAqIFRoZSBgZnVuY3Rpb25Hcm91cHNgIHRoZSBidWlsZCB3YXMgc3BsaXQgYnkgKG5hbWUgYW5kIHJvdXRlcywgYXMgcGFzc2VkIGluXG4gICAqIGBDREtfTkVYVEpTX0ZVTkNUSU9OX0dST1VQU2ApLCBwcmVzZW50IGV4YWN0bHkgd2hlbiB7QGxpbmsgZ3JvdXBzfSBpcy4gU3ludGhcbiAgICogY29tcGFyZXMgaXQgd2l0aCBpdHMgb3duIHByb3BzIHRvIGNhdGNoIGEgc3RhbGUgb3IgaGFuZC1ydW4gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IHsgbmFtZTogc3RyaW5nOyByb3V0ZXM6IHN0cmluZ1tdIH1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyTWFuaWZlc3RDb25maWcge1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSB0cmFpbGluZ1NsYXNoOiBib29sZWFuO1xuICByZWFkb25seSBhc3NldFByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogYGRpc3REaXJgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpciDigJQgYC5uZXh0YCB1bmxlc3MgY29uZmlndXJlZC4gUE9TSVguXG4gICAqIFRoZSBydW50aW1lIHJlYWRzIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZnJvbSBoZXJlIGZvciB0aGUgaW1hZ2VcbiAgICogb3B0aW1pemVyJ3MgY29uZmlnLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdERpcjogc3RyaW5nO1xuICAvKipcbiAgICogYG5leHQuY29uZmlnYCBgY29tcHJlc3NgLiBUaGUgcnVudGltZSBnemlwcyBzdHJlYW1lZCByZXNwb25zZXMgaXRzZWxmXG4gICAqIChuZWl0aGVyIEFQSSBHYXRld2F5IGluIFNUUkVBTSBtb2RlIG5vciBDbG91ZEZyb250IGNhbiksIHNvIGhvbm9yaW5nIHRoaXNcbiAgICogaXMgb24gdXMuXG4gICAqL1xuICByZWFkb25seSBjb21wcmVzczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGdlbmVyYXRlRXRhZ3NgLiBIb25vcmVkIGZvciB0aGUgZmlsZXMgdGhlIHJ1bnRpbWUgc2VydmVzXG4gICAqIGl0c2VsZiwgYXMgYG5leHQgc3RhcnRgIGRvZXMgKGBzZXJ2ZVN0YXRpY2AncyBgZXRhZ2Agb3B0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyYXRlRXRhZ3M6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBgUmVzb2x2ZVJvdXRlc1BhcmFtc1tcImkxOG5cIl1gLXNoYXBlZCwgbmFycm93ZXIgdGhhbiBOZXh0Q29uZmlnQ29tcGxldGUuXG4gICAqIGBudWxsYCB3aGVuIHRoZSBhcHAgY29uZmlndXJlcyBubyBgaTE4bmAuXG4gICAqL1xuICByZWFkb25seSBpMThuOiB1bmtub3duIHwgbnVsbDtcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGRlcGxveW1lbnRJZGAgKG9yIGBORVhUX0RFUExPWU1FTlRfSURgKSwgcmVkdWNlZCB0byB0aGVcbiAgICogY2hhcmFjdGVycyBzYWZlIGluIGFuIFMzIGtleSBwcmVmaXggYW5kIGEgRHluYW1vREIgcGFydGl0aW9uIGtleSDigJQgYC9gIGluXG4gICAqIHBhcnRpY3VsYXIgd291bGQgc3BsaXQgdGhlIHByZWZpeCBgcHJ1bmUtY2FjaGUtYnVja2V0LnRzYCBtYXRjaGVzIG9uLiBgXCJcImBcbiAgICogd2hlbiB0aGUgYXBwIHNldHMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBBZGFwdGVyRW50cnlwb2ludFR5cGUgPVxuICBcImFwcC1wYWdlXCIgfCBcImFwcC1yb3V0ZVwiIHwgXCJwYWdlXCIgfCBcInBhZ2UtYXBpXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckVudHJ5cG9pbnQge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogUmVwby1yb290LXJlbGF0aXZlIFBPU0lYIGtleSBpbnNpZGUgdGhlIHN0YWdpbmcgdHJlZS4gTmV2ZXIgYWJzb2x1dGUuICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU6IEFkYXB0ZXJFbnRyeXBvaW50VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyTWlkZGxld2FyZSB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIC8qKiBSZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5IGluc2lkZSB0aGUgc3RhZ2luZyB0cmVlLiBOZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,43 @@
1
+ import { MiddlewareInvoker } from "./dispatch";
2
+ import { AdapterMiddleware } from "./manifest";
3
+ /**
4
+ * The adapter-facing export of `.next/server/middleware.js`.
5
+ *
6
+ * Web-style (`Request` in, `Response` out) even for `runtime: "nodejs"` — see
7
+ * `next/dist/build/templates/middleware.js`. Next's own `next-server` reaches
8
+ * the same module through its *default* export with an internal
9
+ * `{ handler, request, page }` options object; that path is not ours.
10
+ */
11
+ export type MiddlewareHandler = (request: Request, ctx: MiddlewarePerRequest) => Promise<Response>;
12
+ /** Per-request context handed to {@link MiddlewareHandler}. */
13
+ export interface MiddlewarePerRequest {
14
+ readonly waitUntil?: (promise: Promise<unknown>) => void;
15
+ readonly signal?: AbortSignal;
16
+ }
17
+ export interface MiddlewareRunnerOptions {
18
+ readonly middleware: AdapterMiddleware;
19
+ /**
20
+ * Absolute path the manifest's repo-root-relative `filePath`s resolve against
21
+ * — the staging tree root, which is `process.cwd()` at runtime.
22
+ */
23
+ readonly root: string;
24
+ /** Test seam, and step 4's hook for a preloaded handler. */
25
+ readonly loadHandler?: () => Promise<MiddlewareHandler>;
26
+ }
27
+ export declare class MiddlewareRunner {
28
+ private readonly options;
29
+ /**
30
+ * Memoized across requests: loading `.next/server/middleware.js` pulls in the
31
+ * app's whole middleware closure, which is cold-start-expensive and must not
32
+ * be repeated. Held as the promise so concurrent first requests share it.
33
+ */
34
+ private handler?;
35
+ constructor(options: MiddlewareRunnerOptions);
36
+ /**
37
+ * The `invokeMiddleware` callback for one request. Created per request because
38
+ * `waitUntil` / `signal` are per-request while the loaded
39
+ * handler is not.
40
+ */
41
+ invokerFor(perRequest?: MiddlewarePerRequest): MiddlewareInvoker;
42
+ private load;
43
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MiddlewareRunner = void 0;
4
+ /* eslint-disable import/no-extraneous-dependencies */
5
+ /**
6
+ * The middleware runner: the `invokeMiddleware` callback `resolveRoutes` calls,
7
+ * and nothing more.
8
+ *
9
+ * Deliberately small. A middleware runner would normally own two more jobs,
10
+ * deciding whether middleware runs and interpreting what it returned, but
11
+ * neither is done here:
12
+ *
13
+ * - **Matcher evaluation** (does this path run middleware?). `resolveRoutes`
14
+ * already checks `routes.middlewareMatchers` before calling us, and Next
15
+ * builds those matchers with the `x-prerender-revalidate` `missing` rule
16
+ * injected, so ISR revalidation requests skip user middleware too.
17
+ * Re-checking here would duplicate that and risk disagreeing with it.
18
+ * - **The `x-middleware-*` header protocol** (what did middleware ask for?).
19
+ * `@next/routing` exports `responseToMiddlewareResult`, which translates
20
+ * `x-middleware-override-headers` / `x-middleware-request-*` /
21
+ * `x-middleware-rewrite` / `location` / `x-middleware-refresh` into a
22
+ * `MiddlewareResult`. The previous implementation parsed these headers by
23
+ * hand and drifted from `next start`.
24
+ */
25
+ const node_path_1 = require("node:path");
26
+ const routing_1 = require("@next/routing");
27
+ const load_module_1 = require("./load-module");
28
+ /**
29
+ * Methods that cannot carry a body. `new Request(url, { body })` throws for
30
+ * these, so the stream is simply not attached.
31
+ */
32
+ const BODYLESS_METHODS = new Set(["GET", "HEAD"]);
33
+ class MiddlewareRunner {
34
+ options;
35
+ /**
36
+ * Memoized across requests: loading `.next/server/middleware.js` pulls in the
37
+ * app's whole middleware closure, which is cold-start-expensive and must not
38
+ * be repeated. Held as the promise so concurrent first requests share it.
39
+ */
40
+ handler;
41
+ constructor(options) {
42
+ this.options = options;
43
+ }
44
+ /**
45
+ * The `invokeMiddleware` callback for one request. Created per request because
46
+ * `waitUntil` / `signal` are per-request while the loaded
47
+ * handler is not.
48
+ */
49
+ invokerFor(perRequest = {}) {
50
+ return async ({ url, headers, requestBody, method }) => {
51
+ const handler = await this.load();
52
+ const hasBody = !BODYLESS_METHODS.has(method.toUpperCase());
53
+ const request = new Request(url, {
54
+ method,
55
+ headers,
56
+ body: hasBody ? requestBody : undefined,
57
+ // Required by undici whenever the body is a stream, and absent from
58
+ // TypeScript's `RequestInit`.
59
+ ...(hasBody ? { duplex: "half" } : {}),
60
+ });
61
+ let response;
62
+ try {
63
+ response = await handler(request, perRequest);
64
+ }
65
+ catch (error) {
66
+ // Middleware runs on every request, so an unattributed stack here is
67
+ // expensive to debug. Rethrown, not swallowed: the caller turns it into
68
+ // a 500, the same as `next start`.
69
+ throw new Error(`Middleware (${this.options.middleware.filePath}) threw while ` +
70
+ `handling ${method} ${url.pathname}`, { cause: error });
71
+ }
72
+ // Mutates `headers` in place as well as returning the result, which is
73
+ // why dispatch hands it a copy it owns.
74
+ return {
75
+ ...(0, routing_1.responseToMiddlewareResult)(response, headers, url),
76
+ response,
77
+ };
78
+ };
79
+ }
80
+ load() {
81
+ if (!this.handler) {
82
+ const handler = this.options.loadHandler
83
+ ? this.options.loadHandler()
84
+ : loadMiddlewareHandler(this.options.root, this.options.middleware);
85
+ this.handler = handler;
86
+ // Forgotten on failure: middleware runs on every request, so a cached
87
+ // rejection is the whole app answering 500 for the life of the sandbox over
88
+ // a load failure that may have nothing to do with the module (EMFILE under
89
+ // a cold-start burst, an allocation near the memory limit).
90
+ handler.catch(() => {
91
+ if (this.handler === handler) {
92
+ this.handler = undefined;
93
+ }
94
+ });
95
+ }
96
+ return this.handler;
97
+ }
98
+ }
99
+ exports.MiddlewareRunner = MiddlewareRunner;
100
+ /** `require` the built middleware module and pull `handler` off it. */
101
+ async function loadMiddlewareHandler(root, middleware) {
102
+ const absolute = (0, node_path_1.join)(root, middleware.filePath);
103
+ let exports;
104
+ try {
105
+ exports = await (0, load_module_1.loadBuiltModule)(absolute);
106
+ }
107
+ catch (error) {
108
+ throw new Error(`Could not load middleware from "${absolute}" (manifest filePath ` +
109
+ `"${middleware.filePath}"). The deployment package is incomplete.`, { cause: error });
110
+ }
111
+ return (0, load_module_1.requireFunctionExport)(exports, "handler", () => `Middleware at "${absolute}"`);
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQXNEO0FBQ3REOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gseUNBQWlDO0FBQ2pDLDJDQUEyRDtBQUUzRCwrQ0FBdUU7QUFpQ3ZFOzs7R0FHRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUVsRCxNQUFhLGdCQUFnQjtJQVFTO0lBUHBDOzs7O09BSUc7SUFDSyxPQUFPLENBQThCO0lBRTdDLFlBQW9DLE9BQWdDO1FBQWhDLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQUcsQ0FBQztJQUV4RTs7OztPQUlHO0lBQ0ksVUFBVSxDQUFDLGFBQW1DLEVBQUU7UUFDckQsT0FBTyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1lBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDL0IsTUFBTTtnQkFDTixPQUFPO2dCQUNQLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDdkMsb0VBQW9FO2dCQUNwRSw4QkFBOEI7Z0JBQzlCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDeEIsQ0FBQyxDQUFDO1lBRWxCLElBQUksUUFBa0IsQ0FBQztZQUN2QixJQUFJLENBQUM7Z0JBQ0gsUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixxRUFBcUU7Z0JBQ3JFLHdFQUF3RTtnQkFDeEUsbUNBQW1DO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLGVBQWUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxnQkFBZ0I7b0JBQzdELFlBQVksTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFDdEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQ2pCLENBQUM7WUFDSixDQUFDO1lBRUQsdUVBQXVFO1lBQ3ZFLHdDQUF3QztZQUN4QyxPQUFPO2dCQUNMLEdBQUcsSUFBQSxvQ0FBMEIsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQztnQkFDckQsUUFBUTthQUNULENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sSUFBSTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO2dCQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQzVCLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLHNFQUFzRTtZQUN0RSw0RUFBNEU7WUFDNUUsMkVBQTJFO1lBQzNFLDREQUE0RDtZQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFyRUQsNENBcUVDO0FBRUQsdUVBQXVFO0FBQ3ZFLEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsSUFBWSxFQUNaLFVBQTZCO0lBRTdCLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQUksRUFBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLENBQUM7UUFDSCxPQUFPLEdBQUcsTUFBTSxJQUFBLDZCQUFlLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxRQUFRLHVCQUF1QjtZQUNoRSxJQUFJLFVBQVUsQ0FBQyxRQUFRLDJDQUEyQyxFQUNwRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FDakIsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUEsbUNBQXFCLEVBQzFCLE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxFQUFFLENBQUMsa0JBQWtCLFFBQVEsR0FBRyxDQUNwQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBUaGUgbWlkZGxld2FyZSBydW5uZXI6IHRoZSBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgYHJlc29sdmVSb3V0ZXNgIGNhbGxzLFxuICogYW5kIG5vdGhpbmcgbW9yZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgc21hbGwuIEEgbWlkZGxld2FyZSBydW5uZXIgd291bGQgbm9ybWFsbHkgb3duIHR3byBtb3JlIGpvYnMsXG4gKiBkZWNpZGluZyB3aGV0aGVyIG1pZGRsZXdhcmUgcnVucyBhbmQgaW50ZXJwcmV0aW5nIHdoYXQgaXQgcmV0dXJuZWQsIGJ1dFxuICogbmVpdGhlciBpcyBkb25lIGhlcmU6XG4gKlxuICogLSAqKk1hdGNoZXIgZXZhbHVhdGlvbioqIChkb2VzIHRoaXMgcGF0aCBydW4gbWlkZGxld2FyZT8pLiBgcmVzb2x2ZVJvdXRlc2BcbiAqICAgYWxyZWFkeSBjaGVja3MgYHJvdXRlcy5taWRkbGV3YXJlTWF0Y2hlcnNgIGJlZm9yZSBjYWxsaW5nIHVzLCBhbmQgTmV4dFxuICogICBidWlsZHMgdGhvc2UgbWF0Y2hlcnMgd2l0aCB0aGUgYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIGBtaXNzaW5nYCBydWxlXG4gKiAgIGluamVjdGVkLCBzbyBJU1IgcmV2YWxpZGF0aW9uIHJlcXVlc3RzIHNraXAgdXNlciBtaWRkbGV3YXJlIHRvby5cbiAqICAgUmUtY2hlY2tpbmcgaGVyZSB3b3VsZCBkdXBsaWNhdGUgdGhhdCBhbmQgcmlzayBkaXNhZ3JlZWluZyB3aXRoIGl0LlxuICogLSAqKlRoZSBgeC1taWRkbGV3YXJlLSpgIGhlYWRlciBwcm90b2NvbCoqICh3aGF0IGRpZCBtaWRkbGV3YXJlIGFzayBmb3I/KS5cbiAqICAgYEBuZXh0L3JvdXRpbmdgIGV4cG9ydHMgYHJlc3BvbnNlVG9NaWRkbGV3YXJlUmVzdWx0YCwgd2hpY2ggdHJhbnNsYXRlc1xuICogICBgeC1taWRkbGV3YXJlLW92ZXJyaWRlLWhlYWRlcnNgIC8gYHgtbWlkZGxld2FyZS1yZXF1ZXN0LSpgIC9cbiAqICAgYHgtbWlkZGxld2FyZS1yZXdyaXRlYCAvIGBsb2NhdGlvbmAgLyBgeC1taWRkbGV3YXJlLXJlZnJlc2hgIGludG8gYVxuICogICBgTWlkZGxld2FyZVJlc3VsdGAuIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBwYXJzZWQgdGhlc2UgaGVhZGVycyBieVxuICogICBoYW5kIGFuZCBkcmlmdGVkIGZyb20gYG5leHQgc3RhcnRgLlxuICovXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcmVzcG9uc2VUb01pZGRsZXdhcmVSZXN1bHQgfSBmcm9tIFwiQG5leHQvcm91dGluZ1wiO1xuaW1wb3J0IHsgTWlkZGxld2FyZUludm9rZXIgfSBmcm9tIFwiLi9kaXNwYXRjaFwiO1xuaW1wb3J0IHsgbG9hZEJ1aWx0TW9kdWxlLCByZXF1aXJlRnVuY3Rpb25FeHBvcnQgfSBmcm9tIFwiLi9sb2FkLW1vZHVsZVwiO1xuaW1wb3J0IHsgQWRhcHRlck1pZGRsZXdhcmUgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuXG4vKipcbiAqIFRoZSBhZGFwdGVyLWZhY2luZyBleHBvcnQgb2YgYC5uZXh0L3NlcnZlci9taWRkbGV3YXJlLmpzYC5cbiAqXG4gKiBXZWItc3R5bGUgKGBSZXF1ZXN0YCBpbiwgYFJlc3BvbnNlYCBvdXQpIGV2ZW4gZm9yIGBydW50aW1lOiBcIm5vZGVqc1wiYCDigJQgc2VlXG4gKiBgbmV4dC9kaXN0L2J1aWxkL3RlbXBsYXRlcy9taWRkbGV3YXJlLmpzYC4gTmV4dCdzIG93biBgbmV4dC1zZXJ2ZXJgIHJlYWNoZXNcbiAqIHRoZSBzYW1lIG1vZHVsZSB0aHJvdWdoIGl0cyAqZGVmYXVsdCogZXhwb3J0IHdpdGggYW4gaW50ZXJuYWxcbiAqIGB7IGhhbmRsZXIsIHJlcXVlc3QsIHBhZ2UgfWAgb3B0aW9ucyBvYmplY3Q7IHRoYXQgcGF0aCBpcyBub3Qgb3Vycy5cbiAqL1xuZXhwb3J0IHR5cGUgTWlkZGxld2FyZUhhbmRsZXIgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGN0eDogTWlkZGxld2FyZVBlclJlcXVlc3QsXG4pID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG4vKiogUGVyLXJlcXVlc3QgY29udGV4dCBoYW5kZWQgdG8ge0BsaW5rIE1pZGRsZXdhcmVIYW5kbGVyfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZVBlclJlcXVlc3Qge1xuICByZWFkb25seSB3YWl0VW50aWw/OiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZVJ1bm5lck9wdGlvbnMge1xuICByZWFkb25seSBtaWRkbGV3YXJlOiBBZGFwdGVyTWlkZGxld2FyZTtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdGhlIG1hbmlmZXN0J3MgcmVwby1yb290LXJlbGF0aXZlIGBmaWxlUGF0aGBzIHJlc29sdmUgYWdhaW5zdFxuICAgKiDigJQgdGhlIHN0YWdpbmcgdHJlZSByb290LCB3aGljaCBpcyBgcHJvY2Vzcy5jd2QoKWAgYXQgcnVudGltZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbiAgLyoqIFRlc3Qgc2VhbSwgYW5kIHN0ZXAgNCdzIGhvb2sgZm9yIGEgcHJlbG9hZGVkIGhhbmRsZXIuICovXG4gIHJlYWRvbmx5IGxvYWRIYW5kbGVyPzogKCkgPT4gUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcj47XG59XG5cbi8qKlxuICogTWV0aG9kcyB0aGF0IGNhbm5vdCBjYXJyeSBhIGJvZHkuIGBuZXcgUmVxdWVzdCh1cmwsIHsgYm9keSB9KWAgdGhyb3dzIGZvclxuICogdGhlc2UsIHNvIHRoZSBzdHJlYW0gaXMgc2ltcGx5IG5vdCBhdHRhY2hlZC5cbiAqL1xuY29uc3QgQk9EWUxFU1NfTUVUSE9EUyA9IG5ldyBTZXQoW1wiR0VUXCIsIFwiSEVBRFwiXSk7XG5cbmV4cG9ydCBjbGFzcyBNaWRkbGV3YXJlUnVubmVyIHtcbiAgLyoqXG4gICAqIE1lbW9pemVkIGFjcm9zcyByZXF1ZXN0czogbG9hZGluZyBgLm5leHQvc2VydmVyL21pZGRsZXdhcmUuanNgIHB1bGxzIGluIHRoZVxuICAgKiBhcHAncyB3aG9sZSBtaWRkbGV3YXJlIGNsb3N1cmUsIHdoaWNoIGlzIGNvbGQtc3RhcnQtZXhwZW5zaXZlIGFuZCBtdXN0IG5vdFxuICAgKiBiZSByZXBlYXRlZC4gSGVsZCBhcyB0aGUgcHJvbWlzZSBzbyBjb25jdXJyZW50IGZpcnN0IHJlcXVlc3RzIHNoYXJlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVyPzogUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTWlkZGxld2FyZVJ1bm5lck9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgZm9yIG9uZSByZXF1ZXN0LiBDcmVhdGVkIHBlciByZXF1ZXN0IGJlY2F1c2VcbiAgICogYHdhaXRVbnRpbGAgLyBgc2lnbmFsYCBhcmUgcGVyLXJlcXVlc3Qgd2hpbGUgdGhlIGxvYWRlZFxuICAgKiBoYW5kbGVyIGlzIG5vdC5cbiAgICovXG4gIHB1YmxpYyBpbnZva2VyRm9yKHBlclJlcXVlc3Q6IE1pZGRsZXdhcmVQZXJSZXF1ZXN0ID0ge30pOiBNaWRkbGV3YXJlSW52b2tlciB7XG4gICAgcmV0dXJuIGFzeW5jICh7IHVybCwgaGVhZGVycywgcmVxdWVzdEJvZHksIG1ldGhvZCB9KSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgICBjb25zdCBoYXNCb2R5ID0gIUJPRFlMRVNTX01FVEhPRFMuaGFzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiBoYXNCb2R5ID8gcmVxdWVzdEJvZHkgOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIFJlcXVpcmVkIGJ5IHVuZGljaSB3aGVuZXZlciB0aGUgYm9keSBpcyBhIHN0cmVhbSwgYW5kIGFic2VudCBmcm9tXG4gICAgICAgIC8vIFR5cGVTY3JpcHQncyBgUmVxdWVzdEluaXRgLlxuICAgICAgICAuLi4oaGFzQm9keSA/IHsgZHVwbGV4OiBcImhhbGZcIiB9IDoge30pLFxuICAgICAgfSBhcyBSZXF1ZXN0SW5pdCk7XG5cbiAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGhhbmRsZXIocmVxdWVzdCwgcGVyUmVxdWVzdCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBNaWRkbGV3YXJlIHJ1bnMgb24gZXZlcnkgcmVxdWVzdCwgc28gYW4gdW5hdHRyaWJ1dGVkIHN0YWNrIGhlcmUgaXNcbiAgICAgICAgLy8gZXhwZW5zaXZlIHRvIGRlYnVnLiBSZXRocm93biwgbm90IHN3YWxsb3dlZDogdGhlIGNhbGxlciB0dXJucyBpdCBpbnRvXG4gICAgICAgIC8vIGEgNTAwLCB0aGUgc2FtZSBhcyBgbmV4dCBzdGFydGAuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWlkZGxld2FyZSAoJHt0aGlzLm9wdGlvbnMubWlkZGxld2FyZS5maWxlUGF0aH0pIHRocmV3IHdoaWxlIGAgK1xuICAgICAgICAgICAgYGhhbmRsaW5nICR7bWV0aG9kfSAke3VybC5wYXRobmFtZX1gLFxuICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE11dGF0ZXMgYGhlYWRlcnNgIGluIHBsYWNlIGFzIHdlbGwgYXMgcmV0dXJuaW5nIHRoZSByZXN1bHQsIHdoaWNoIGlzXG4gICAgICAvLyB3aHkgZGlzcGF0Y2ggaGFuZHMgaXQgYSBjb3B5IGl0IG93bnMuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXNwb25zZVRvTWlkZGxld2FyZVJlc3VsdChyZXNwb25zZSwgaGVhZGVycywgdXJsKSxcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxvYWQoKTogUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcj4ge1xuICAgIGlmICghdGhpcy5oYW5kbGVyKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vcHRpb25zLmxvYWRIYW5kbGVyXG4gICAgICAgID8gdGhpcy5vcHRpb25zLmxvYWRIYW5kbGVyKClcbiAgICAgICAgOiBsb2FkTWlkZGxld2FyZUhhbmRsZXIodGhpcy5vcHRpb25zLnJvb3QsIHRoaXMub3B0aW9ucy5taWRkbGV3YXJlKTtcbiAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAvLyBGb3Jnb3R0ZW4gb24gZmFpbHVyZTogbWlkZGxld2FyZSBydW5zIG9uIGV2ZXJ5IHJlcXVlc3QsIHNvIGEgY2FjaGVkXG4gICAgICAvLyByZWplY3Rpb24gaXMgdGhlIHdob2xlIGFwcCBhbnN3ZXJpbmcgNTAwIGZvciB0aGUgbGlmZSBvZiB0aGUgc2FuZGJveCBvdmVyXG4gICAgICAvLyBhIGxvYWQgZmFpbHVyZSB0aGF0IG1heSBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgbW9kdWxlIChFTUZJTEUgdW5kZXJcbiAgICAgIC8vIGEgY29sZC1zdGFydCBidXJzdCwgYW4gYWxsb2NhdGlvbiBuZWFyIHRoZSBtZW1vcnkgbGltaXQpLlxuICAgICAgaGFuZGxlci5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXIgPT09IGhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyO1xuICB9XG59XG5cbi8qKiBgcmVxdWlyZWAgdGhlIGJ1aWx0IG1pZGRsZXdhcmUgbW9kdWxlIGFuZCBwdWxsIGBoYW5kbGVyYCBvZmYgaXQuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkTWlkZGxld2FyZUhhbmRsZXIoXG4gIHJvb3Q6IHN0cmluZyxcbiAgbWlkZGxld2FyZTogQWRhcHRlck1pZGRsZXdhcmUsXG4pOiBQcm9taXNlPE1pZGRsZXdhcmVIYW5kbGVyPiB7XG4gIGNvbnN0IGFic29sdXRlID0gam9pbihyb290LCBtaWRkbGV3YXJlLmZpbGVQYXRoKTtcbiAgbGV0IGV4cG9ydHM6IHVua25vd247XG4gIHRyeSB7XG4gICAgZXhwb3J0cyA9IGF3YWl0IGxvYWRCdWlsdE1vZHVsZShhYnNvbHV0ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBsb2FkIG1pZGRsZXdhcmUgZnJvbSBcIiR7YWJzb2x1dGV9XCIgKG1hbmlmZXN0IGZpbGVQYXRoIGAgK1xuICAgICAgICBgXCIke21pZGRsZXdhcmUuZmlsZVBhdGh9XCIpLiBUaGUgZGVwbG95bWVudCBwYWNrYWdlIGlzIGluY29tcGxldGUuYCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVxdWlyZUZ1bmN0aW9uRXhwb3J0PE1pZGRsZXdhcmVIYW5kbGVyPihcbiAgICBleHBvcnRzLFxuICAgIFwiaGFuZGxlclwiLFxuICAgICgpID0+IGBNaWRkbGV3YXJlIGF0IFwiJHthYnNvbHV0ZX1cImAsXG4gICk7XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};