@farm.js/core 0.1.0-beta.97 → 0.1.0-beta.98

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 (248) hide show
  1. package/dist/after.cjs.map +1 -0
  2. package/dist/agent-runtime.cjs +7 -3
  3. package/dist/agent-runtime.cjs.map +1 -0
  4. package/dist/agent-runtime.d.mts +2 -2
  5. package/dist/agent-runtime.d.ts +2 -2
  6. package/dist/agent-runtime.mjs +2 -1
  7. package/dist/agent-runtime.mjs.map +1 -1
  8. package/dist/api/route-manager.cjs.map +1 -0
  9. package/dist/api/route-manager.d.mts +2 -2
  10. package/dist/api/route-manager.d.ts +2 -2
  11. package/dist/api/runtime.cjs.map +1 -0
  12. package/dist/api.cjs +26 -1
  13. package/dist/api.cjs.map +1 -0
  14. package/dist/api.d.mts +3 -3
  15. package/dist/api.d.ts +3 -3
  16. package/dist/api.mjs +2 -2
  17. package/dist/{app-CIOx3LvY.d.ts → app-CJKz2mbi.d.ts} +4 -4
  18. package/dist/{app-DBd6437H.d.mts → app-DMEGFLR2.d.mts} +4 -4
  19. package/dist/app-markdown.cjs.map +1 -0
  20. package/dist/app-markdown.d.mts +3 -3
  21. package/dist/app-markdown.d.ts +3 -3
  22. package/dist/cache.cjs.map +1 -0
  23. package/dist/{chunk-WD2EBM3I.mjs → chunk-3CQJV3NC.mjs} +2 -2
  24. package/dist/{chunk-I3OOUWO5.mjs → chunk-3GDRV7SG.mjs} +2 -2
  25. package/dist/{chunk-X4SFHKFH.mjs → chunk-6KJY25DQ.mjs} +5 -5
  26. package/dist/{chunk-FP5Q67FO.mjs → chunk-AAEZP2EY.mjs} +9 -9
  27. package/dist/{chunk-WMJGA32P.mjs → chunk-BXVOHG6B.mjs} +27 -2
  28. package/dist/{chunk-WMJGA32P.mjs.map → chunk-BXVOHG6B.mjs.map} +1 -1
  29. package/dist/{chunk-BZAIS65C.mjs → chunk-DIHNOVZZ.mjs} +40 -13
  30. package/dist/chunk-DIHNOVZZ.mjs.map +1 -0
  31. package/dist/{chunk-ISSFLGJ5.mjs → chunk-FDWECN3W.mjs} +8 -4
  32. package/dist/chunk-FDWECN3W.mjs.map +1 -0
  33. package/dist/chunk-FDWXXTWR.mjs +114 -0
  34. package/dist/chunk-FDWXXTWR.mjs.map +1 -0
  35. package/dist/{chunk-J3MPQ4MQ.mjs → chunk-IHADQ6J7.mjs} +2 -2
  36. package/dist/{chunk-J3MPQ4MQ.mjs.map → chunk-IHADQ6J7.mjs.map} +1 -1
  37. package/dist/{chunk-FSIXEIOB.mjs → chunk-L7FSTPGS.mjs} +2 -2
  38. package/dist/{chunk-AAC66ILR.mjs → chunk-LXXG3K2Y.mjs} +61 -2
  39. package/dist/chunk-LXXG3K2Y.mjs.map +1 -0
  40. package/dist/{chunk-GJ7W6LNK.mjs → chunk-N5RK4LK6.mjs} +3 -3
  41. package/dist/{chunk-WKDAA6V2.mjs → chunk-NBF56FXB.mjs} +20 -5
  42. package/dist/chunk-NBF56FXB.mjs.map +1 -0
  43. package/dist/chunk-RKUPOYQV.mjs +28 -0
  44. package/dist/chunk-RKUPOYQV.mjs.map +1 -0
  45. package/dist/{chunk-2SKCXYLB.mjs → chunk-RL3THP3L.mjs} +54 -5
  46. package/dist/chunk-RL3THP3L.mjs.map +1 -0
  47. package/dist/{chunk-52BR7LTX.mjs → chunk-STSPSJUI.mjs} +3 -3
  48. package/dist/{chunk-EPDIF432.mjs → chunk-UOGX6UNO.mjs} +37 -17
  49. package/dist/chunk-UOGX6UNO.mjs.map +1 -0
  50. package/dist/{chunk-YIBV77KZ.mjs → chunk-URQELPSH.mjs} +2 -2
  51. package/dist/{chunk-UMUWR5XA.mjs → chunk-UWQ4EEW7.mjs} +2 -2
  52. package/dist/{chunk-IZBX2TEU.mjs → chunk-VQG3QWWK.mjs} +2 -2
  53. package/dist/{chunk-D7F7YZ7L.mjs → chunk-WA77FWAO.mjs} +8 -8
  54. package/dist/{chunk-35NPLKQJ.mjs → chunk-XWM2C267.mjs} +21 -105
  55. package/dist/chunk-XWM2C267.mjs.map +1 -0
  56. package/dist/client/lifecycle.cjs.map +1 -0
  57. package/dist/client/lifecycle.mjs +2 -2
  58. package/dist/{client-plugins-B6-07YmP.d.mts → client-plugins-CyTLPqjP.d.mts} +38 -2
  59. package/dist/{client-plugins-By6MVUX-.d.ts → client-plugins-D-UgzngJ.d.ts} +38 -2
  60. package/dist/client-plugins.cjs +1 -1
  61. package/dist/client-plugins.cjs.map +1 -0
  62. package/dist/client-plugins.d.mts +2 -2
  63. package/dist/client-plugins.d.ts +2 -2
  64. package/dist/client-plugins.mjs +2 -2
  65. package/dist/client.cjs +61 -16
  66. package/dist/client.cjs.map +1 -0
  67. package/dist/client.d.mts +5 -5
  68. package/dist/client.d.ts +5 -5
  69. package/dist/client.mjs +7 -7
  70. package/dist/config.cjs.map +1 -0
  71. package/dist/config.d.mts +2 -2
  72. package/dist/config.d.ts +2 -2
  73. package/dist/cron.cjs +48 -12
  74. package/dist/cron.cjs.map +1 -0
  75. package/dist/cron.mjs +2 -1
  76. package/dist/deferred.cjs.map +1 -0
  77. package/dist/deployment.cjs.map +1 -0
  78. package/dist/{devtools-XWZX6CCL.mjs → devtools-KQ2PXSIC.mjs} +8 -6
  79. package/dist/{devtools-XWZX6CCL.mjs.map → devtools-KQ2PXSIC.mjs.map} +1 -1
  80. package/dist/docs.cjs +7 -3
  81. package/dist/docs.cjs.map +1 -0
  82. package/dist/docs.mjs +8 -6
  83. package/dist/env-types.cjs.map +1 -0
  84. package/dist/env.cjs.map +1 -0
  85. package/dist/environment/vite.cjs.map +1 -0
  86. package/dist/environment.cjs.map +1 -0
  87. package/dist/font.cjs.map +1 -0
  88. package/dist/headers.cjs.map +1 -0
  89. package/dist/i18n/client.cjs.map +1 -0
  90. package/dist/i18n/index.cjs.map +1 -0
  91. package/dist/i18n/server.cjs.map +1 -0
  92. package/dist/image/server.cjs +19 -4
  93. package/dist/image/server.cjs.map +1 -0
  94. package/dist/image/server.d.mts +6 -0
  95. package/dist/image/server.d.ts +6 -0
  96. package/dist/image/server.mjs +1 -1
  97. package/dist/image/sharp.cjs +1 -0
  98. package/dist/image/sharp.cjs.map +1 -0
  99. package/dist/image/sharp.mjs +1 -1
  100. package/dist/image.cjs.map +1 -0
  101. package/dist/index.cjs +370 -143
  102. package/dist/index.cjs.map +1 -0
  103. package/dist/index.d.mts +10 -10
  104. package/dist/index.d.ts +10 -10
  105. package/dist/index.mjs +29 -21
  106. package/dist/index.mjs.map +1 -1
  107. package/dist/instrumentation.cjs.map +1 -0
  108. package/dist/{integration-orm-LLW6WZNK.mjs → integration-orm-G5BPBT5X.mjs} +3 -3
  109. package/dist/integrations.cjs +168 -5
  110. package/dist/integrations.cjs.map +1 -0
  111. package/dist/integrations.d.mts +2 -2
  112. package/dist/integrations.d.ts +2 -2
  113. package/dist/integrations.mjs +10 -3
  114. package/dist/internal/build-runtime.cjs +178 -51
  115. package/dist/internal/build-runtime.cjs.map +1 -0
  116. package/dist/internal/build-runtime.d.mts +4 -4
  117. package/dist/internal/build-runtime.d.ts +4 -4
  118. package/dist/internal/build-runtime.mjs +13 -11
  119. package/dist/internal/client-runtime.cjs +1 -1
  120. package/dist/internal/client-runtime.cjs.map +1 -0
  121. package/dist/internal/client-runtime.mjs +2 -2
  122. package/dist/internal/config-runtime.cjs +48 -42
  123. package/dist/internal/config-runtime.cjs.map +1 -0
  124. package/dist/internal/config-runtime.d.mts +3 -3
  125. package/dist/internal/config-runtime.d.ts +3 -3
  126. package/dist/internal/config-runtime.mjs +7 -5
  127. package/dist/internal/isolated-boundary.cjs.map +1 -0
  128. package/dist/internal/metadata-image-runtime.cjs.map +1 -0
  129. package/dist/internal/product-telemetry-runtime.cjs +6 -2
  130. package/dist/internal/product-telemetry-runtime.cjs.map +1 -0
  131. package/dist/internal/product-telemetry-runtime.mjs +6 -2
  132. package/dist/internal/product-telemetry-runtime.mjs.map +1 -1
  133. package/dist/internal/production-node-env.cjs.map +1 -0
  134. package/dist/internal/production-runtime.cjs.map +1 -0
  135. package/dist/internal/production-runtime.d.mts +8 -8
  136. package/dist/internal/production-runtime.d.ts +8 -8
  137. package/dist/markdown.cjs.map +1 -0
  138. package/dist/{metadata-route-8_V3UonT.d.ts → metadata-route-BpU8K9RI.d.ts} +1 -1
  139. package/dist/{metadata-route-CWP_HjGU.d.mts → metadata-route-D1AYgWni.d.mts} +1 -1
  140. package/dist/middleware.cjs.map +1 -0
  141. package/dist/middleware.d.mts +4 -4
  142. package/dist/middleware.d.ts +4 -4
  143. package/dist/navigation.cjs.map +1 -0
  144. package/dist/{nitro-EGRNOB5P.mjs → nitro-IITKBMUI.mjs} +4 -3
  145. package/dist/{nitro-EGRNOB5P.mjs.map → nitro-IITKBMUI.mjs.map} +1 -1
  146. package/dist/observability.cjs.map +1 -0
  147. package/dist/plugin.cjs +143 -50
  148. package/dist/plugin.cjs.map +1 -0
  149. package/dist/plugin.d.mts +2 -2
  150. package/dist/plugin.d.ts +2 -2
  151. package/dist/plugin.mjs +10 -8
  152. package/dist/{production-runtime-BGRH1dKG.d.mts → production-runtime-BIKA-BVT.d.mts} +2 -2
  153. package/dist/{production-runtime-CdmzsDax.d.ts → production-runtime-DtCUEELY.d.ts} +2 -2
  154. package/dist/query/client.cjs.map +1 -0
  155. package/dist/query/index.cjs.map +1 -0
  156. package/dist/query/parsers.cjs.map +1 -0
  157. package/dist/query/server.cjs.map +1 -0
  158. package/dist/{render-plan-DLxJYAA5.d.mts → render-plan-Dimb23ux.d.mts} +1 -1
  159. package/dist/{render-plan-0GeHiGVZ.d.ts → render-plan-rg3uiSo3.d.ts} +1 -1
  160. package/dist/renderer/react/client.cjs.map +1 -0
  161. package/dist/renderer/react/server.cjs.map +1 -0
  162. package/dist/renderer/react/vite.cjs.map +1 -0
  163. package/dist/renderer-client.cjs +26 -1
  164. package/dist/renderer-client.cjs.map +1 -0
  165. package/dist/renderer-client.d.mts +4 -4
  166. package/dist/renderer-client.d.ts +4 -4
  167. package/dist/renderer-client.mjs +2 -2
  168. package/dist/renderer.cjs.map +1 -0
  169. package/dist/{request-BstWbZ6O.d.ts → request-ColD-ChW.d.ts} +1 -1
  170. package/dist/{request-BCNXSXLh.d.mts → request-D5zvbU2Z.d.mts} +1 -1
  171. package/dist/request.cjs.map +1 -0
  172. package/dist/request.d.mts +3 -3
  173. package/dist/request.d.ts +3 -3
  174. package/dist/router.cjs.map +1 -0
  175. package/dist/routes.cjs.map +1 -0
  176. package/dist/routes.d.mts +2 -2
  177. package/dist/routes.d.ts +2 -2
  178. package/dist/server-action-security.cjs +117 -104
  179. package/dist/server-action-security.cjs.map +1 -0
  180. package/dist/server-action-security.mjs +2 -1
  181. package/dist/server-fn-client.cjs.map +1 -0
  182. package/dist/server-fn.cjs.map +1 -0
  183. package/dist/server-fn.mjs +3 -2
  184. package/dist/server-plugins.cjs.map +1 -0
  185. package/dist/server-plugins.d.mts +3 -3
  186. package/dist/server-plugins.d.ts +3 -3
  187. package/dist/server-query-client.cjs +26 -1
  188. package/dist/server-query-client.cjs.map +1 -0
  189. package/dist/server-query-client.mjs +3 -3
  190. package/dist/server-query.cjs.map +1 -0
  191. package/dist/server-query.mjs +4 -3
  192. package/dist/server.cjs +221 -116
  193. package/dist/server.cjs.map +1 -0
  194. package/dist/server.d.mts +8 -8
  195. package/dist/server.d.ts +8 -8
  196. package/dist/server.mjs +13 -11
  197. package/dist/server.mjs.map +1 -1
  198. package/dist/{spa-router-BeyAVSc6.d.mts → spa-router-BlilYGAN.d.mts} +1 -1
  199. package/dist/{spa-router-COgu4txb.d.ts → spa-router-kXORcsT_.d.ts} +1 -1
  200. package/dist/storage.cjs +7 -3
  201. package/dist/storage.cjs.map +1 -0
  202. package/dist/storage.mjs +1 -1
  203. package/dist/testing.cjs.map +1 -0
  204. package/dist/testing.d.mts +2 -2
  205. package/dist/testing.d.ts +2 -2
  206. package/dist/testing.mjs +2 -1
  207. package/dist/testing.mjs.map +1 -1
  208. package/dist/theme/client.cjs.map +1 -0
  209. package/dist/theme/index.cjs.map +1 -0
  210. package/dist/theme/runtime.cjs.map +1 -0
  211. package/dist/theme/server.cjs.map +1 -0
  212. package/dist/{utils-DkU2c_1B.d.ts → utils-BhvF7Hhl.d.ts} +1 -1
  213. package/dist/{utils-DL2VwDQl.d.mts → utils-uF32evNX.d.mts} +1 -1
  214. package/dist/version.cjs +1 -1
  215. package/dist/version.cjs.map +1 -0
  216. package/dist/version.mjs +1 -1
  217. package/dist/vite.cjs +143 -50
  218. package/dist/vite.cjs.map +1 -0
  219. package/dist/vite.d.mts +2 -2
  220. package/dist/vite.d.ts +2 -2
  221. package/dist/vite.mjs +10 -8
  222. package/dist/{workflows-ChyK_oTu.d.mts → workflows-BantWytQ.d.mts} +7 -0
  223. package/dist/{workflows-ChyK_oTu.d.ts → workflows-BantWytQ.d.ts} +7 -0
  224. package/dist/workflows.cjs +67 -4
  225. package/dist/workflows.cjs.map +1 -0
  226. package/dist/workflows.d.mts +1 -1
  227. package/dist/workflows.d.ts +1 -1
  228. package/dist/workflows.mjs +2 -1
  229. package/package.json +17 -17
  230. package/dist/chunk-2SKCXYLB.mjs.map +0 -1
  231. package/dist/chunk-35NPLKQJ.mjs.map +0 -1
  232. package/dist/chunk-AAC66ILR.mjs.map +0 -1
  233. package/dist/chunk-BZAIS65C.mjs.map +0 -1
  234. package/dist/chunk-EPDIF432.mjs.map +0 -1
  235. package/dist/chunk-ISSFLGJ5.mjs.map +0 -1
  236. package/dist/chunk-WKDAA6V2.mjs.map +0 -1
  237. /package/dist/{chunk-WD2EBM3I.mjs.map → chunk-3CQJV3NC.mjs.map} +0 -0
  238. /package/dist/{chunk-I3OOUWO5.mjs.map → chunk-3GDRV7SG.mjs.map} +0 -0
  239. /package/dist/{chunk-X4SFHKFH.mjs.map → chunk-6KJY25DQ.mjs.map} +0 -0
  240. /package/dist/{chunk-FP5Q67FO.mjs.map → chunk-AAEZP2EY.mjs.map} +0 -0
  241. /package/dist/{chunk-FSIXEIOB.mjs.map → chunk-L7FSTPGS.mjs.map} +0 -0
  242. /package/dist/{chunk-GJ7W6LNK.mjs.map → chunk-N5RK4LK6.mjs.map} +0 -0
  243. /package/dist/{chunk-52BR7LTX.mjs.map → chunk-STSPSJUI.mjs.map} +0 -0
  244. /package/dist/{chunk-YIBV77KZ.mjs.map → chunk-URQELPSH.mjs.map} +0 -0
  245. /package/dist/{chunk-UMUWR5XA.mjs.map → chunk-UWQ4EEW7.mjs.map} +0 -0
  246. /package/dist/{chunk-IZBX2TEU.mjs.map → chunk-VQG3QWWK.mjs.map} +0 -0
  247. /package/dist/{chunk-D7F7YZ7L.mjs.map → chunk-WA77FWAO.mjs.map} +0 -0
  248. /package/dist/{integration-orm-LLW6WZNK.mjs.map → integration-orm-G5BPBT5X.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integration-request-security.ts","../src/plugin-integration-context.ts","../src/request-context.ts","../src/integrations.ts"],"sourcesContent":["import {\n getRequestSourceOrigin,\n matchesAllowedOrigin,\n matchesHostHeader,\n normalizeAllowedOriginPattern,\n} from \"./request-origin\";\n\n/**\n * Integration auth routes accept ordinary form posts, which browsers send\n * cross-site without a CORS preflight. Without an origin check, a third-party\n * page can submit credentials to an app's own sign-in route and plant an\n * attacker-controlled session in the victim's browser (login CSRF), or drive a\n * forced sign-out. This mirrors the server-action origin contract so both\n * entry points reject the same requests.\n */\n\nexport type IntegrationOriginRejection =\n | \"missing-origin\"\n | \"opaque-origin\"\n | \"invalid-origin\"\n | \"cross-site\";\n\nexport type IntegrationOriginResult =\n | { ok: true }\n | { ok: false; reason: IntegrationOriginRejection };\n\nexport interface IntegrationOriginPolicy {\n /** Extra trusted origins, using the `serverActions.allowedOrigins` pattern syntax. */\n allowedOrigins?: readonly string[];\n /**\n * Whether a request carrying no origin metadata at all must be rejected.\n *\n * Form posts always carry an Origin header in supported browsers, so\n * state-changing POSTs default to rejecting (`true`). Top-level GET\n * navigations legitimately arrive with no Origin and no Referer — a typed\n * URL or a bookmark — so GET callers pass `false` to avoid breaking them.\n */\n requireOriginMetadata?: boolean;\n}\n\n/**\n * Resolve configured origin patterns once, at integration construction, so an\n * invalid pattern fails loudly at startup instead of per request.\n */\nexport function resolveIntegrationAllowedOrigins(\n values: readonly string[] | undefined,\n label: string,\n): readonly string[] {\n return Object.freeze((values ?? []).map((value) => normalizeAllowedOriginPattern(value, label)));\n}\n\nexport function validateIntegrationRequestOrigin(\n request: Request,\n policy: IntegrationOriginPolicy = {},\n): IntegrationOriginResult {\n const allowedOrigins = policy.allowedOrigins ?? [];\n const requireOriginMetadata = policy.requireOriginMetadata ?? true;\n const fetchSite = request.headers.get(\"sec-fetch-site\")?.trim().toLowerCase();\n const source = getRequestSourceOrigin(request);\n\n if (!source.ok) {\n return { ok: false, reason: source.reason };\n }\n\n if (source.origin === null) {\n // No Origin and no Referer. `sec-fetch-site: same-origin` still proves the\n // request is first-party.\n if (fetchSite === \"same-origin\") {\n return { ok: true };\n }\n\n // Strict mode (state-changing POSTs) has nothing left to verify against.\n if (requireOriginMetadata) {\n return { ok: false, reason: fetchSite === \"cross-site\" ? \"cross-site\" : \"missing-origin\" };\n }\n\n // Lenient mode still rejects a request the browser labelled cross-site.\n // Everything else here is a direct navigation (`none`), a same-site\n // navigation, or a client too old to send Sec-Fetch-Site at all.\n return fetchSite === \"cross-site\" ? { ok: false, reason: \"cross-site\" } : { ok: true };\n }\n\n const requestUrl = new URL(request.url);\n const matchesConfiguredOrigin = allowedOrigins.some((pattern) =>\n matchesAllowedOrigin(source.origin as string, pattern),\n );\n const matchesRequest =\n source.origin === requestUrl.origin || matchesHostHeader(source.origin, request);\n\n if (!matchesRequest && !matchesConfiguredOrigin) {\n return { ok: false, reason: \"cross-site\" };\n }\n\n if (fetchSite === \"cross-site\" && !matchesConfiguredOrigin) {\n return { ok: false, reason: \"cross-site\" };\n }\n\n return { ok: true };\n}\n\nexport function describeIntegrationOriginRejection(reason: IntegrationOriginRejection): string {\n switch (reason) {\n case \"missing-origin\":\n return \"Request is missing same-origin metadata.\";\n case \"opaque-origin\":\n return \"Opaque origins are not allowed.\";\n case \"invalid-origin\":\n return \"Invalid request origin.\";\n case \"cross-site\":\n return \"Cross-site request was rejected.\";\n }\n}\n","import type { FarmPlugin, FarmPluginIntegrationContext } from \"./plugin\";\n\nconst FARM_PLUGIN_INTEGRATION_CONTEXT = Symbol.for(\"@farm.js/core/plugin-integration-context\");\n\nexport function setFarmPluginIntegrationContext(\n plugin: FarmPlugin,\n integration: Readonly<FarmPluginIntegrationContext>,\n): void {\n Object.defineProperty(plugin, FARM_PLUGIN_INTEGRATION_CONTEXT, {\n value: integration,\n });\n}\n\nexport function getFarmPluginIntegrationContext(\n plugin: FarmPlugin,\n): Readonly<FarmPluginIntegrationContext> | undefined {\n const value = (plugin as FarmPlugin & Record<symbol, unknown>)[FARM_PLUGIN_INTEGRATION_CONTEXT];\n return value && typeof value === \"object\"\n ? (value as Readonly<FarmPluginIntegrationContext>)\n : undefined;\n}\n","type RequestContextCarrier = object;\n\nexport interface SetRequestContextOptions {\n exposeToPage?: boolean;\n}\n\nexport interface RequestContextSnapshotOptions {\n exposedOnly?: boolean;\n}\n\ninterface RequestContextBucket {\n privateData: Map<string, any>;\n exposedData: Map<string, any>;\n}\n\nconst REQUEST_CONTEXT_STORE_KEY = Symbol.for(\"farm.requestContextStore\");\n\ntype GlobalWithRequestContextStore = typeof globalThis & {\n [REQUEST_CONTEXT_STORE_KEY]?: WeakMap<RequestContextCarrier, RequestContextBucket>;\n};\n\nfunction getRequestContextStore() {\n const globalState = globalThis as GlobalWithRequestContextStore;\n if (!globalState[REQUEST_CONTEXT_STORE_KEY]) {\n globalState[REQUEST_CONTEXT_STORE_KEY] = new WeakMap<\n RequestContextCarrier,\n RequestContextBucket\n >();\n }\n\n return globalState[REQUEST_CONTEXT_STORE_KEY]!;\n}\n\nfunction getBucket(target: RequestContextCarrier): RequestContextBucket {\n const requestContextStore = getRequestContextStore();\n let bucket = requestContextStore.get(target);\n if (!bucket) {\n bucket = {\n privateData: new Map<string, any>(),\n exposedData: new Map<string, any>(),\n };\n requestContextStore.set(target, bucket);\n }\n return bucket;\n}\n\nexport function setRequestContext(\n target: RequestContextCarrier,\n key: string,\n value: any,\n options: SetRequestContextOptions = {},\n): void {\n const bucket = getBucket(target);\n bucket.privateData.set(key, value);\n if (options.exposeToPage) {\n bucket.exposedData.set(key, value);\n }\n}\n\nexport function getRequestContext<T = any>(\n target: RequestContextCarrier,\n key: string,\n): T | undefined {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n return bucket?.privateData.get(key) as T | undefined;\n}\n\nexport function hasRequestContext(target: RequestContextCarrier, key: string): boolean {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n return bucket?.privateData.has(key) ?? false;\n}\n\nexport function deleteRequestContext(target: RequestContextCarrier, key: string): boolean {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return false;\n const removedPrivate = bucket.privateData.delete(key);\n bucket.exposedData.delete(key);\n return removedPrivate;\n}\n\nexport function clearRequestContext(target: RequestContextCarrier): void {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return;\n bucket.privateData.clear();\n bucket.exposedData.clear();\n}\n\nexport function getRequestContextSnapshot(\n target: RequestContextCarrier,\n options: RequestContextSnapshotOptions = {},\n): Map<string, any> {\n const requestContextStore = getRequestContextStore();\n const bucket = requestContextStore.get(target);\n if (!bucket) return new Map<string, any>();\n if (options.exposedOnly) {\n return new Map(bucket.exposedData);\n }\n return new Map(bucket.privateData);\n}\n","import { validateConfigRouteSource } from \"./plugins/route-pattern\";\n\n// Origin validation for integration auth routes is part of the integration\n// contract, so it is re-exported here alongside defineIntegration rather than\n// only from the package root.\nexport {\n describeIntegrationOriginRejection,\n resolveIntegrationAllowedOrigins,\n validateIntegrationRequestOrigin,\n type IntegrationOriginPolicy,\n type IntegrationOriginRejection,\n type IntegrationOriginResult,\n} from \"./integration-request-security\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { api as integrationApi, defineIntegrationAPIOperation } from \"./integration-api\";\nimport type {\n FarmIntegrationAPI,\n FarmIntegrationAPIBodyFormat,\n FarmIntegrationAPIMethod,\n FarmIntegrationAPIOperation,\n FarmIntegrationAPIResponseFormat,\n FarmIntegrationRouteOperationCarrier,\n InferIntegrationAPIFromRoutes,\n} from \"./integration-api\";\nimport type { InferFarmIntegrationOrmClient } from \"./integration-orm\";\nimport { setFarmPluginIntegrationContext } from \"./plugin-integration-context\";\nimport { decodeRouteSegment } from \"./utils/decode\";\nimport {\n assertTerminalCatchAll,\n assertUniqueRouteParameters,\n compareRouteSpecificity,\n getRoutePatternSpecificity,\n} from \"./routing/specificity\";\nimport type {\n FarmPlugin,\n FarmPluginContext,\n FarmPluginIntegrationContext,\n FarmRequestStore,\n} from \"./plugin\";\nimport {\n clearRequestContext,\n deleteRequestContext,\n getRequestContext,\n getRequestContextSnapshot,\n hasRequestContext,\n setRequestContext,\n} from \"./request-context\";\nimport { sendWebResponse } from \"./server/response\";\nimport type { FarmRequest } from \"./types\";\nimport {\n bufferFarmRequestBody,\n createFarmRequestBodyErrorResponse,\n readNodeRequestBody,\n resolveFarmServerConfig,\n} from \"./server-http\";\n\nexport { api, defineIntegrationAPI, defineIntegrationAPIOperation } from \"./integration-api\";\nexport type {\n FarmIntegrationAPI,\n FarmIntegrationAPIBodyFormat,\n FarmIntegrationAPIMethod,\n FarmIntegrationAPIOperation,\n FarmIntegrationAPIResponseFormat,\n} from \"./integration-api\";\n\nexport type FarmIntegrationCategory = \"auth\" | \"payment\" | \"monitoring\" | \"logging\" | (string & {});\n\n/** @deprecated Use FarmIntegrationCategory instead. */\nexport type FarmIntegrationSlot = FarmIntegrationCategory;\n\nexport type FarmIntegrationRouteParamValue = string | string[];\nexport type FarmIntegrationRouteParams = Record<string, FarmIntegrationRouteParamValue>;\nexport type FarmIntegrationRouteMethod =\n | FarmIntegrationAPIMethod\n | Lowercase<FarmIntegrationAPIMethod>\n | \"ALL\"\n | \"all\";\nexport type FarmIntegrationRouteInputSource = \"body\" | \"query\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type FarmIntegrationValidationPathSegment =\n | PropertyKey\n | {\n readonly key: PropertyKey;\n };\n\nexport interface FarmIntegrationRouteInput<TBody = unknown, TQuery = unknown> {\n body?: TBody;\n query?: TQuery;\n}\n\nexport interface FarmIntegrationValidationIssue {\n source: FarmIntegrationRouteInputSource;\n path?: readonly (string | number)[];\n code?: string;\n message: string;\n}\n\nexport interface FarmIntegrationValidationErrorLike {\n issues?: readonly {\n path?: readonly FarmIntegrationValidationPathSegment[];\n code?: string;\n message?: string;\n }[];\n message?: string;\n}\n\nexport type FarmIntegrationValidationResult<TValue> =\n | {\n success: true;\n data: TValue;\n }\n | {\n success: false;\n error: FarmIntegrationValidationErrorLike;\n };\n\nexport type FarmIntegrationStandardValidationResult<TValue> =\n | {\n value: TValue;\n }\n | {\n issues: readonly {\n path?: readonly FarmIntegrationValidationPathSegment[];\n code?: string;\n message: string;\n }[];\n };\n\nexport interface FarmIntegrationInputSchema<TValue = unknown> {\n _output?: TValue;\n parse?(value: unknown): MaybePromise<TValue>;\n safeParse?(value: unknown): MaybePromise<FarmIntegrationValidationResult<TValue>>;\n safeParseAsync?(value: unknown): Promise<FarmIntegrationValidationResult<TValue>>;\n \"~standard\"?: {\n validate(value: unknown): MaybePromise<FarmIntegrationStandardValidationResult<TValue>>;\n types?: {\n output: TValue;\n };\n };\n}\n\nexport interface FarmIntegrationRouteInputSchemas<TBody = unknown, TQuery = unknown> {\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n}\n\n/** @deprecated Use `FarmRequestStore` and access it through `ctx.req`. */\nexport type FarmIntegrationRequestContextStore = FarmRequestStore;\n\nexport const FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY = \"farm.integration.internalDispatch\";\n\nexport type FarmIntegrationRouteDb<TSchema extends FarmIntegrationSchema | undefined> =\n InferFarmIntegrationOrmClient<TSchema>;\n\nexport interface FarmIntegrationRouteStorageArgs<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n getClient(): Promise<unknown | undefined>;\n getOrm(): Promise<FarmIntegrationRouteDb<TSchema>>;\n}\n\nexport interface FarmIntegrationRouteArgs<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n db: FarmIntegrationRouteDb<TSchema>;\n getDb(): Promise<FarmIntegrationRouteDb<TSchema>>;\n storage: FarmIntegrationRouteStorageArgs<TSchema>;\n}\n\nexport interface FarmIntegrationConfigContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n key: string;\n integration: FarmIntegration<TSchema, any>;\n appConfig: FarmPluginContext[\"config\"];\n /** Alias for appConfig. */\n config: FarmPluginContext[\"config\"];\n args: FarmIntegrationRouteArgs<TSchema>;\n env: Record<string, string | undefined>;\n isDev: boolean;\n isProd: boolean;\n}\n\nexport interface FarmIntegrationConfigDefinition<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n schema?: FarmIntegrationInputSchema<TConfig>;\n env?: Record<string, string | readonly string[]>;\n defaults?:\n | Partial<TConfig>\n | ((context: FarmIntegrationConfigContext<TSchema>) => MaybePromise<Partial<TConfig>>);\n input?:\n | Partial<TConfig>\n | ((context: FarmIntegrationConfigContext<TSchema>) => MaybePromise<Partial<TConfig>>);\n resolve?(\n context: FarmIntegrationConfigContext<TSchema>,\n ): MaybePromise<TConfig | Partial<TConfig> | undefined>;\n}\n\nexport type FarmIntegrationConfigInput<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = FarmIntegrationInputSchema<TConfig> | FarmIntegrationConfigDefinition<TConfig, TSchema>;\n\nexport type FarmIntegrationLifecycleLogLevel = \"info\" | \"warn\" | \"error\";\n\nexport interface FarmIntegrationLifecycleLogger {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n}\n\nexport interface FarmIntegrationLifecycleContext<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationConfigContext<TSchema> {\n integration: FarmIntegration<TSchema, TConfig>;\n integrationConfig: TConfig;\n log: FarmIntegrationLifecycleLogger;\n reason?: string;\n cleanup(callback?: () => MaybePromise<void>): Promise<void>;\n}\n\nexport type FarmIntegrationLifecycleHook<\n TConfig = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (context: FarmIntegrationLifecycleContext<TConfig, TSchema>) => MaybePromise<void>;\n\n/**\n * Small per-call integration metadata. Values received over HTTP are\n * client-controlled and should be validated before authorization decisions.\n */\nexport type FarmIntegrationData = Record<string, unknown>;\n\nexport interface FarmIntegrationHandlerContext<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n request: Request;\n requestId: string;\n url: URL;\n pathname: string;\n method: string;\n params: FarmIntegrationRouteParams;\n input: FarmIntegrationRouteInput<TBody, TQuery>;\n args: FarmIntegrationRouteArgs<TSchema>;\n data: FarmIntegrationData;\n integration: {\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot: FarmIntegrationCategory;\n type: string;\n instance: unknown;\n };\n route: {\n kind: \"route\" | \"middleware\";\n path: string;\n methods: readonly string[];\n };\n req: FarmRequestStore;\n /** @deprecated Use `req` instead. */\n requestContext: FarmRequestStore;\n config: FarmPluginContext[\"config\"];\n isDev: boolean;\n isProd: boolean;\n}\n\nexport interface FarmIntegrationRouteHookContext<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationHandlerContext<TBody, TQuery, TSchema> {\n response?: Response;\n}\n\nexport type FarmIntegrationRouteHook<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = {\n bivarianceHack(\n request: Request,\n context: FarmIntegrationRouteHookContext<TBody, TQuery, TSchema>,\n ): Promise<Response | void> | Response | void;\n}[\"bivarianceHack\"];\n\nexport interface FarmIntegrationRoute<\n TBody = unknown,\n TQuery = unknown,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n path: string;\n method?: FarmIntegrationRouteMethod;\n methods?: readonly FarmIntegrationRouteMethod[];\n middleware?: readonly FarmIntegrationRouteMiddleware<TSchema>[];\n before?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n after?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n rawBody?: boolean;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n input?: FarmIntegrationRouteInputSchemas<TBody, TQuery>;\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<TBody, TQuery, TSchema>,\n ): Promise<Response> | Response;\n}\n\nexport interface FarmTypedIntegrationRoute<\n TPath extends string = string,\n TBody = never,\n TQuery = never,\n TResponse = unknown,\n TServer extends boolean = false,\n TMethod extends FarmIntegrationAPIMethod = FarmIntegrationAPIMethod,\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationRoute<TBody, TQuery, TSchema> {\n path: TPath;\n method: TMethod;\n __operation: FarmIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>;\n}\n\nexport interface FarmIntegrationRouteMiddleware<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<unknown, unknown, TSchema>,\n ): Promise<Response | void> | Response | void;\n}\n\nexport interface FarmIntegrationMiddleware<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n matcher?: string | string[];\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<unknown, unknown, TSchema>,\n ): Promise<Response | void> | Response | void;\n}\n\nexport interface FarmIntegrationProviderProps {\n children: ReactNode;\n}\n\nexport interface FarmIntegrationProviderComponentReference {\n /** Client-safe module specifier using `@/`, a path relative to the app root, or a package. */\n module: string;\n /** Named export to use. Defaults to the module's default export. */\n export?: string;\n}\n\nexport interface FarmIntegrationProvider {\n name: string;\n type: string;\n props?: Record<string, unknown>;\n /**\n * The provider can be instantiated independently around each isolated\n * client root without relying on context or state owned by the route root.\n * Providers are treated as route-wide unless they explicitly opt in.\n */\n supportsIsolatedHydration?: boolean;\n component?:\n | ComponentType<FarmIntegrationProviderProps>\n | FarmIntegrationProviderComponentReference;\n}\n\nexport interface FarmIntegrationDocumentNavigation {\n matcher: string | readonly string[];\n}\n\nexport type FarmIntegrationSchemaFieldType =\n | \"id\"\n | \"uuid\"\n | \"string\"\n | \"text\"\n | \"boolean\"\n | \"integer\"\n | \"number\"\n | \"datetime\"\n | \"json\"\n | \"enum\";\n\nexport interface FarmIntegrationSchemaReference {\n model: string;\n field: string;\n relation?: \"belongsTo\" | \"hasOne\" | \"hasMany\";\n onDelete?: \"cascade\" | \"restrict\" | \"setNull\" | \"noAction\";\n enforced?: \"db\" | \"app\" | \"none\";\n}\n\nexport interface FarmIntegrationSchemaField {\n type: FarmIntegrationSchemaFieldType;\n name?: string;\n description?: string;\n required?: boolean;\n nullable?: boolean;\n primaryKey?: boolean;\n unique?: boolean;\n index?: boolean;\n list?: boolean;\n default?: unknown;\n values?: readonly string[];\n reference?: FarmIntegrationSchemaReference;\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaConstraint {\n type: \"unique\" | \"index\";\n fields: readonly string[];\n name?: string;\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModel {\n name?: string;\n description?: string;\n fields: Record<string, FarmIntegrationSchemaField>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModelExtension {\n name?: string;\n description?: string;\n fields?: Record<string, FarmIntegrationSchemaField>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchemaModelOverride {\n name?: string;\n description?: string;\n fields?: Record<string, Partial<FarmIntegrationSchemaField>>;\n constraints?: readonly FarmIntegrationSchemaConstraint[];\n meta?: Record<string, unknown>;\n}\n\nexport interface FarmIntegrationSchema {\n models: Record<string, FarmIntegrationSchemaModel>;\n meta?: Record<string, unknown>;\n extend?: Record<string, FarmIntegrationSchemaModelExtension>;\n override?: Record<string, FarmIntegrationSchemaModelOverride>;\n}\n\nexport function defineIntegrationSchema<TSchema extends FarmIntegrationSchema>(\n schema: TSchema,\n): TSchema {\n return schema;\n}\n\nexport type FarmIntegrationLogPhase =\n | \"registered\"\n | \"validate\"\n | \"setup\"\n | \"ready\"\n | \"dispose\"\n | \"request:start\"\n | \"request:end\"\n | \"request:error\";\n\nexport interface FarmIntegrationLogEvent {\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot: FarmIntegrationCategory;\n type: string;\n phase: FarmIntegrationLogPhase;\n route?: {\n kind: \"route\" | \"middleware\";\n path: string;\n methods: readonly string[];\n };\n requestId?: string;\n request?: Request;\n response?: Response;\n error?: unknown;\n durationMs?: number;\n level?: FarmIntegrationLifecycleLogLevel;\n message?: string;\n meta?: Record<string, unknown>;\n context: Map<string, unknown>;\n}\n\nexport type FarmIntegrationLogger = (event: FarmIntegrationLogEvent) => void | Promise<void>;\n\nexport interface FarmIntegrationPluginOwner {\n key: string;\n category: FarmIntegrationCategory;\n type: string;\n source: \"lifecycle\" | \"contribution\";\n serverRuntime: boolean;\n}\n\n/** A normal plugin or an integration-bound plugin compatible with the shared instance. */\nexport type FarmIntegrationContributedPlugin<TInstance = unknown> =\n | FarmPlugin<any, any, any, any, unknown, false>\n | FarmPlugin<any, any, any, any, TInstance, true>;\n\nexport interface FarmIntegration<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n TConfig = unknown,\n TInstance = unknown,\n> {\n readonly kind: \"farm-integration\";\n category: FarmIntegrationCategory;\n /** @deprecated Use category instead. */\n slot?: FarmIntegrationCategory;\n type: string;\n instance: TInstance;\n /** Set to false when a platform adapter owns this integration's production routes. */\n serverRuntime?: boolean;\n api?: FarmIntegrationAPI;\n schema?: TSchema;\n config?: FarmIntegrationConfigInput<TConfig, TSchema>;\n validate?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n setup?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n ready?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n dispose?: FarmIntegrationLifecycleHook<TConfig, TSchema>;\n log?: FarmIntegrationLogger;\n routes?: readonly FarmIntegrationRoute<any, any, TSchema>[];\n endpoints?: FarmIntegrationEndpoints<TSchema>;\n middleware?: readonly FarmIntegrationMiddleware<TSchema>[];\n providers?: readonly FarmIntegrationProvider[];\n documentNavigations?: readonly FarmIntegrationDocumentNavigation[];\n /** Additional Farm plugins owned and configured by this integration. */\n plugins?: readonly FarmIntegrationContributedPlugin<NoInfer<TInstance>>[];\n}\n\nexport type FarmIntegrationsUserConfig = Record<string, FarmIntegration<any, any, any> | undefined>;\n\nconst FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME = Symbol.for(\n \"@farm.js/core/integration-plugin-server-runtime\",\n);\nconst FARM_INTEGRATION_PLUGIN_OWNER = Symbol.for(\"@farm.js/core/integration-plugin-owner\");\n\n/** @internal Identifies plugins owned by platform-managed integrations. */\nexport function getFarmIntegrationPluginServerRuntime(plugin: FarmPlugin): boolean | undefined {\n const value = (plugin as FarmPlugin & Record<symbol, unknown>)[\n FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME\n ];\n return typeof value === \"boolean\" ? value : undefined;\n}\n\n/** Returns the integration that contributed a normalized plugin, when applicable. */\nexport function getFarmIntegrationPluginOwner(\n plugin: FarmPlugin,\n): Readonly<FarmIntegrationPluginOwner> | undefined {\n const value = (plugin as FarmPlugin & Record<symbol, unknown>)[FARM_INTEGRATION_PLUGIN_OWNER];\n return value && typeof value === \"object\"\n ? (value as Readonly<FarmIntegrationPluginOwner>)\n : undefined;\n}\n\ntype IntegrationRouteBuilderOptions<\n TBody,\n TQuery,\n TServer extends boolean,\n TSchema extends FarmIntegrationSchema | undefined,\n> = {\n middleware?: readonly FarmIntegrationRouteMiddleware<TSchema>[];\n before?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n after?: readonly FarmIntegrationRouteHook<TBody, TQuery, TSchema>[];\n rawBody?: boolean;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n bodyFormat?: FarmIntegrationAPIBodyFormat;\n responseFormat?: FarmIntegrationAPIResponseFormat;\n isServer?: TServer;\n body?: FarmIntegrationInputSchema<TBody>;\n query?: FarmIntegrationInputSchema<TQuery>;\n input?: FarmIntegrationRouteInputSchemas<TBody, TQuery>;\n handler(\n request: Request,\n context: FarmIntegrationHandlerContext<TBody, TQuery, TSchema>,\n ): Promise<Response> | Response;\n};\n\nfunction defineTypedIntegrationRoute<\n TPath extends string,\n TBody,\n TQuery,\n TResponse,\n TServer extends boolean,\n TMethod extends FarmIntegrationAPIMethod,\n TSchema extends FarmIntegrationSchema | undefined,\n>(\n method: TMethod,\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, TMethod, TSchema> {\n return {\n path,\n method,\n middleware: input.middleware,\n before: input.before,\n after: input.after,\n rawBody: input.rawBody,\n bodyFormat: input.bodyFormat,\n input: normalizeIntegrationRouteInputSchemas(input),\n handler: input.handler,\n __operation: defineIntegrationAPIOperation<TBody, TQuery, TResponse, TServer, TMethod>({\n path,\n method,\n bodyFormat: input.bodyFormat,\n responseFormat: input.responseFormat,\n headers: input.headers,\n credentials: input.credentials,\n isServer: input.isServer,\n }),\n };\n}\n\nexport interface FarmIntegrationRouteFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n get<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"GET\", TSchema>;\n post<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"POST\", TSchema>;\n query<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"QUERY\", TSchema>;\n put<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PUT\", TSchema>;\n patch<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PATCH\", TSchema>;\n delete<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>,\n ): FarmTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"DELETE\", TSchema>;\n options<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"OPTIONS\", TSchema>;\n head<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ): FarmTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"HEAD\", TSchema>;\n}\n\nexport interface FarmIntegrationRoutesFactoryContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> {\n route: FarmIntegrationRouteFactory<TSchema>;\n integrationRoute: FarmIntegrationRouteFactory<TSchema>;\n}\n\nexport type FarmIntegrationRoutesFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (\n context: FarmIntegrationRoutesFactoryContext<TSchema>,\n) => readonly FarmIntegrationRoute<any, any, TSchema>[];\n\nexport type FarmIntegrationEndpointValue<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> =\n | FarmIntegrationRoute<any, any, TSchema>\n | readonly FarmIntegrationEndpointValue<TSchema>[]\n | {\n readonly [key: string]: FarmIntegrationEndpointValue<TSchema> | undefined;\n };\n\nexport type FarmIntegrationEndpoints<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = {\n readonly [key: string]: FarmIntegrationEndpointValue<TSchema> | undefined;\n};\n\nexport interface FarmIntegrationEndpointsFactoryContext<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> extends FarmIntegrationRoutesFactoryContext<TSchema> {\n endpoint: FarmIntegrationRouteFactory<TSchema>;\n}\n\nexport type FarmIntegrationEndpointsFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = (context: FarmIntegrationEndpointsFactoryContext<TSchema>) => FarmIntegrationEndpoints<TSchema>;\n\nfunction createIntegrationRouteFactory<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n>(): FarmIntegrationRouteFactory<TSchema> {\n return {\n get<TPath extends string, TResponse = unknown, TQuery = never, TServer extends boolean = false>(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"GET\", TSchema>(\n \"GET\",\n path,\n input,\n );\n },\n post<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"POST\", TSchema>(\n \"POST\",\n path,\n {\n bodyFormat: \"json\",\n ...input,\n },\n );\n },\n query<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<\n TPath,\n TBody,\n TQuery,\n TResponse,\n TServer,\n \"QUERY\",\n TSchema\n >(\"QUERY\", path, {\n bodyFormat: \"json\",\n ...input,\n });\n },\n put<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<TPath, TBody, TQuery, TResponse, TServer, \"PUT\", TSchema>(\n \"PUT\",\n path,\n {\n bodyFormat: \"json\",\n ...input,\n },\n );\n },\n patch<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<\n TPath,\n TBody,\n TQuery,\n TResponse,\n TServer,\n \"PATCH\",\n TSchema\n >(\"PATCH\", path, {\n bodyFormat: \"json\",\n ...input,\n });\n },\n delete<\n TPath extends string,\n TBody = never,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(path: TPath, input: IntegrationRouteBuilderOptions<TBody, TQuery, TServer, TSchema>) {\n return defineTypedIntegrationRoute<\n TPath,\n TBody,\n TQuery,\n TResponse,\n TServer,\n \"DELETE\",\n TSchema\n >(\"DELETE\", path, {\n bodyFormat: \"json\",\n ...input,\n });\n },\n options<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<\n TPath,\n never,\n TQuery,\n TResponse,\n TServer,\n \"OPTIONS\",\n TSchema\n >(\"OPTIONS\", path, input);\n },\n head<\n TPath extends string,\n TResponse = unknown,\n TQuery = never,\n TServer extends boolean = false,\n >(\n path: TPath,\n input: Omit<IntegrationRouteBuilderOptions<never, TQuery, TServer, TSchema>, \"bodyFormat\">,\n ) {\n return defineTypedIntegrationRoute<TPath, never, TQuery, TResponse, TServer, \"HEAD\", TSchema>(\n \"HEAD\",\n path,\n input,\n );\n },\n };\n}\n\nexport function createIntegrationRoute<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n>(_schema?: TSchema): FarmIntegrationRouteFactory<TSchema> {\n return createIntegrationRouteFactory<TSchema>();\n}\n\nexport const integrationRoute = createIntegrationRouteFactory<undefined>();\n\ntype RegisteredIntegrationRuntime = {\n integration: FarmIntegration;\n config: FarmPluginContext[\"config\"];\n isDev: boolean;\n isProd: boolean;\n};\n\nconst INTEGRATION_RUNTIME_REGISTRY_KEY = Symbol.for(\"farm.integrationRuntimeRegistry\");\nconst INTEGRATION_REQUEST_DISPATCHER_KEY = Symbol.for(\"farm.integrationRequestDispatcher\");\n\ntype IntegrationRequestDispatcher = (\n runtime: RegisteredIntegrationRuntime,\n request: Request,\n options?: { currentRequest?: Request },\n) => Promise<Response | null>;\n\ntype GlobalWithIntegrationRuntimeRegistry = typeof globalThis & {\n [INTEGRATION_RUNTIME_REGISTRY_KEY]?: Map<string, RegisteredIntegrationRuntime>;\n [INTEGRATION_REQUEST_DISPATCHER_KEY]?: IntegrationRequestDispatcher;\n};\n\nfunction getIntegrationRuntimeRegistry() {\n const globalState = globalThis as GlobalWithIntegrationRuntimeRegistry;\n if (!globalState[INTEGRATION_RUNTIME_REGISTRY_KEY]) {\n globalState[INTEGRATION_RUNTIME_REGISTRY_KEY] = new Map<string, RegisteredIntegrationRuntime>();\n }\n\n return globalState[INTEGRATION_RUNTIME_REGISTRY_KEY]!;\n}\n\ntype FarmIntegrationRoutesInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = readonly FarmIntegrationRoute<any, any, TSchema>[] | FarmIntegrationRoutesFactory<TSchema>;\n\ntype FarmIntegrationEndpointsInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n> = FarmIntegrationEndpoints<TSchema> | FarmIntegrationEndpointsFactory<TSchema>;\n\ntype FarmIntegrationInput<\n TSchema extends FarmIntegrationSchema | undefined = FarmIntegrationSchema | undefined,\n TConfig = unknown,\n TInstance = unknown,\n> = Omit<\n FarmIntegration<TSchema, TConfig, TInstance>,\n \"kind\" | \"category\" | \"slot\" | \"instance\" | \"config\" | \"routes\" | \"endpoints\" | \"plugins\"\n> & {\n instance: TInstance;\n config?: FarmIntegrationConfigInput<TConfig, TSchema>;\n routes?: FarmIntegrationRoutesInput<TSchema>;\n endpoints?: FarmIntegrationEndpointsInput<TSchema>;\n plugins?: readonly FarmIntegrationContributedPlugin<NoInfer<TInstance>>[];\n} & (\n | {\n category: FarmIntegrationCategory;\n slot?: FarmIntegrationCategory;\n }\n | {\n category?: FarmIntegrationCategory;\n slot: FarmIntegrationCategory;\n }\n );\n\ntype FarmIntegrationCategoryInput =\n | {\n category: FarmIntegrationCategory;\n slot?: FarmIntegrationCategory;\n }\n | {\n category?: FarmIntegrationCategory;\n slot: FarmIntegrationCategory;\n };\n\ntype FarmIntegrationShapeForInference = FarmIntegrationCategoryInput & {\n api?: FarmIntegrationAPI;\n schema?: FarmIntegrationSchema;\n config?: unknown;\n routes?: unknown;\n endpoints?: unknown;\n};\n\ntype ExtractIntegrationSchema<TIntegration> = TIntegration extends {\n schema: infer TSchema extends FarmIntegrationSchema;\n}\n ? TSchema\n : undefined;\n\ntype ResolveIntegrationRoutesInput<TRoutes, TSchema extends FarmIntegrationSchema | undefined> =\n TRoutes extends FarmIntegrationRoutesFactory<TSchema> ? ReturnType<TRoutes> : TRoutes;\n\ntype ResolveIntegrationEndpointsInput<\n TEndpoints,\n TSchema extends FarmIntegrationSchema | undefined,\n> =\n TEndpoints extends FarmIntegrationEndpointsFactory<TSchema> ? ReturnType<TEndpoints> : TEndpoints;\n\ntype ExtractIntegrationRoutesFromRoutesInput<\n TRoutes,\n TSchema extends FarmIntegrationSchema | undefined,\n> =\n ResolveIntegrationRoutesInput<TRoutes, TSchema> extends readonly (infer TRoute)[]\n ? TRoute\n : never;\n\ntype ExtractIntegrationRoutesFromEndpointValue<TValue> =\n TValue extends FarmIntegrationRouteOperationCarrier<string, any>\n ? TValue\n : TValue extends readonly (infer TItem)[]\n ? ExtractIntegrationRoutesFromEndpointValue<TItem>\n : TValue extends object\n ? ExtractIntegrationRoutesFromEndpointValue<TValue[keyof TValue]>\n : never;\n\ntype ExtractIntegrationRoutesFromEndpointsInput<\n TEndpoints,\n TSchema extends FarmIntegrationSchema | undefined,\n> = ExtractIntegrationRoutesFromEndpointValue<\n ResolveIntegrationEndpointsInput<TEndpoints, TSchema>\n>;\n\ntype ExtractIntegrationRouteUnion<TIntegration, TSchema extends FarmIntegrationSchema | undefined> =\n | (TIntegration extends { routes: infer TRoutes }\n ? ExtractIntegrationRoutesFromRoutesInput<TRoutes, TSchema>\n : never)\n | (TIntegration extends { endpoints: infer TEndpoints }\n ? ExtractIntegrationRoutesFromEndpointsInput<TEndpoints, TSchema>\n : never);\n\ntype ExtractDefinedIntegrationRoutes<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = [ExtractIntegrationRouteUnion<TIntegration, TSchema>] extends [never]\n ? undefined\n : readonly ExtractIntegrationRouteUnion<TIntegration, TSchema>[];\n\ntype ExtractDefinedIntegrationEndpoints<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = TIntegration extends { endpoints: infer TEndpoints }\n ? ResolveIntegrationEndpointsInput<TEndpoints, TSchema>\n : undefined;\n\ntype ExtractIntegrationAPIRoutes<\n TIntegration,\n TSchema extends FarmIntegrationSchema | undefined,\n> = Extract<\n ExtractIntegrationRouteUnion<TIntegration, TSchema>,\n FarmIntegrationRouteOperationCarrier<string, any>\n>;\n\ntype ExtractIntegrationCategory<TIntegration extends FarmIntegrationCategoryInput> =\n TIntegration extends {\n category: infer TCategory extends FarmIntegrationCategory;\n }\n ? TCategory\n : TIntegration extends { slot: infer TSlot extends FarmIntegrationCategory }\n ? TSlot\n : FarmIntegrationCategory;\n\ntype ExtractDerivedIntegrationAPI<\n TIntegration extends FarmIntegrationShapeForInference,\n TSchema extends FarmIntegrationSchema | undefined = ExtractIntegrationSchema<TIntegration>,\n> = TIntegration extends { api: infer TAPI extends FarmIntegrationAPI }\n ? TAPI\n : [ExtractIntegrationAPIRoutes<TIntegration, TSchema>] extends [never]\n ? FarmIntegrationAPI | undefined\n : InferIntegrationAPIFromRoutes<readonly ExtractIntegrationAPIRoutes<TIntegration, TSchema>[]>;\n\nexport type DefinedIntegration<\n TIntegration extends FarmIntegrationShapeForInference,\n TSchema extends FarmIntegrationSchema | undefined = ExtractIntegrationSchema<TIntegration>,\n> = Omit<TIntegration, \"kind\" | \"category\" | \"slot\" | \"api\" | \"routes\" | \"endpoints\"> & {\n readonly kind: \"farm-integration\";\n category: ExtractIntegrationCategory<TIntegration>;\n slot: ExtractIntegrationCategory<TIntegration>;\n routes: ExtractDefinedIntegrationRoutes<TIntegration, TSchema>;\n endpoints: ExtractDefinedIntegrationEndpoints<TIntegration, TSchema>;\n api: ExtractDerivedIntegrationAPI<TIntegration, TSchema>;\n};\n\nfunction isIntegrationEndpointRoute(value: unknown): value is FarmIntegrationRoute {\n return (\n !!value &&\n typeof value === \"object\" &&\n typeof (value as { path?: unknown }).path === \"string\" &&\n typeof (value as { handler?: unknown }).handler === \"function\"\n );\n}\n\nfunction flattenIntegrationEndpoints(\n endpoints: FarmIntegrationEndpointValue | FarmIntegrationEndpoints | undefined,\n): FarmIntegrationRoute[] {\n if (!endpoints) {\n return [];\n }\n\n if (Array.isArray(endpoints)) {\n return endpoints.flatMap((endpoint) => flattenIntegrationEndpoints(endpoint));\n }\n\n if (isIntegrationEndpointRoute(endpoints)) {\n return [endpoints];\n }\n\n if (typeof endpoints === \"object\") {\n return Object.values(endpoints).flatMap((endpoint) => flattenIntegrationEndpoints(endpoint));\n }\n\n return [];\n}\n\nexport function defineIntegration<\n const TSchema extends FarmIntegrationSchema | undefined,\n const TConfig,\n TIntegration extends FarmIntegrationInput<TSchema, TConfig, any>,\n>(\n integration: TIntegration &\n FarmIntegrationInput<TSchema, TConfig, NoInfer<TIntegration[\"instance\"]>>,\n): DefinedIntegration<TIntegration, TSchema>;\nexport function defineIntegration<\n const TSchema extends FarmIntegrationSchema | undefined,\n const TConfig,\n TIntegration extends FarmIntegrationInput<TSchema, TConfig, any>,\n>(\n integration: TIntegration &\n FarmIntegrationInput<TSchema, TConfig, NoInfer<TIntegration[\"instance\"]>>,\n): DefinedIntegration<TIntegration, TSchema> {\n const category = integration.category ?? integration.slot;\n\n if (!category) {\n throw new Error(\"Integration category is required.\");\n }\n\n if (integration.category && integration.slot && integration.category !== integration.slot) {\n throw new Error(\"Integration category and slot must match when both are provided.\");\n }\n\n const routeFactory = createIntegrationRoute(integration.schema);\n const routes =\n typeof integration.routes === \"function\"\n ? integration.routes({\n route: routeFactory,\n integrationRoute: routeFactory,\n })\n : integration.routes;\n const endpoints =\n typeof integration.endpoints === \"function\"\n ? integration.endpoints({\n endpoint: routeFactory,\n route: routeFactory,\n integrationRoute: routeFactory,\n })\n : integration.endpoints;\n const endpointRoutes = flattenIntegrationEndpoints(endpoints);\n const allRoutes =\n routes?.length || endpointRoutes.length\n ? ([...(routes || []), ...endpointRoutes] as readonly FarmIntegrationRoute[])\n : undefined;\n\n for (const route of allRoutes || []) {\n assertUniqueRouteParameters(route.path, \"api\");\n validateConfigRouteSource(route.path, `Integration route \"${route.path}\"`);\n assertTerminalCatchAll(route.path, \"api\");\n }\n\n const derivedApi =\n integration.api ||\n (allRoutes?.length\n ? integrationApi.fromRoutes(\n allRoutes as unknown as ReadonlyArray<{\n path: string;\n __operation: FarmIntegrationAPIOperation<any, any, any, any, any>;\n }>,\n )\n : undefined);\n\n return {\n kind: \"farm-integration\",\n ...integration,\n endpoints,\n routes: allRoutes,\n api: derivedApi,\n category,\n slot: category,\n } as unknown as DefinedIntegration<TIntegration, TSchema>;\n}\n\nexport function isFarmIntegration(value: unknown): value is FarmIntegration {\n return (\n !!value && typeof value === \"object\" && (value as FarmIntegration).kind === \"farm-integration\"\n );\n}\n\nexport function resolveIntegrationPlugins(\n integrations: FarmIntegrationsUserConfig | undefined,\n): FarmPlugin[] {\n if (!integrations) {\n return [];\n }\n\n const plugins: FarmPlugin[] = [];\n for (const [key, integration] of Object.entries(integrations)) {\n if (!integration || !isFarmIntegration(integration)) {\n continue;\n }\n\n const owner = createIntegrationPluginOwner(key, integration, \"lifecycle\");\n plugins.push(withIntegrationPluginOwner(createIntegrationPlugin(key, integration), owner));\n plugins.push(...resolveIntegrationPluginContributions(key, integration));\n }\n\n return plugins;\n}\n\nfunction resolveIntegrationPluginContributions(\n key: string,\n integration: FarmIntegration<any, any>,\n): FarmPlugin[] {\n const contributions = integration.plugins;\n if (!contributions) return [];\n if (!Array.isArray(contributions)) {\n throw new TypeError(`Integration \"${key}\" plugins must be an array`);\n }\n\n const names = new Set<string>();\n return contributions.map((plugin, index) => {\n if (!plugin || typeof plugin !== \"object\" || typeof plugin.name !== \"string\") {\n throw new TypeError(`Integration \"${key}\" plugin at index ${index} is invalid`);\n }\n const name = plugin.name.trim();\n if (!name) {\n throw new TypeError(`Integration \"${key}\" plugin at index ${index} requires a name`);\n }\n if (names.has(name)) {\n throw new Error(`Integration \"${key}\" contributes duplicate plugin name \"${name}\"`);\n }\n names.add(name);\n\n return withIntegrationPluginOwner(\n plugin,\n createIntegrationPluginOwner(key, integration, \"contribution\"),\n createIntegrationPluginContext(key, integration),\n );\n });\n}\n\nfunction createIntegrationPluginOwner(\n key: string,\n integration: FarmIntegration<any, any>,\n source: FarmIntegrationPluginOwner[\"source\"],\n): Readonly<FarmIntegrationPluginOwner> {\n return Object.freeze({\n key,\n category: integration.category,\n type: integration.type,\n source,\n serverRuntime: integration.serverRuntime !== false,\n });\n}\n\nfunction createIntegrationPluginContext(\n key: string,\n integration: FarmIntegration<any, any>,\n): Readonly<FarmPluginIntegrationContext> {\n return Object.freeze({\n key,\n category: integration.category,\n type: integration.type,\n instance: integration.instance,\n serverRuntime: integration.serverRuntime !== false,\n });\n}\n\nfunction withIntegrationPluginOwner(\n plugin: FarmPlugin<any, any, any, any, any, boolean>,\n owner: Readonly<FarmIntegrationPluginOwner>,\n integration?: Readonly<FarmPluginIntegrationContext>,\n): FarmPlugin {\n const descriptors = Object.getOwnPropertyDescriptors(plugin);\n Reflect.deleteProperty(descriptors, FARM_INTEGRATION_PLUGIN_OWNER);\n Reflect.deleteProperty(descriptors, FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME);\n const ownedPlugin = Object.create(Object.getPrototypeOf(plugin), descriptors) as FarmPlugin;\n Object.defineProperty(ownedPlugin, FARM_INTEGRATION_PLUGIN_OWNER, { value: owner });\n Object.defineProperty(ownedPlugin, FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME, {\n value: owner.serverRuntime,\n });\n if (integration) {\n setFarmPluginIntegrationContext(ownedPlugin, integration);\n }\n return ownedPlugin;\n}\n\nexport function getIntegrationProviders(\n integrations: FarmIntegrationsUserConfig | undefined,\n): FarmIntegrationProvider[] {\n if (!integrations) {\n return [];\n }\n\n const providers: FarmIntegrationProvider[] = [];\n for (const integration of Object.values(integrations)) {\n if (!integration || !isFarmIntegration(integration) || !integration.providers?.length) {\n continue;\n }\n\n for (const provider of integration.providers) {\n providers.push({\n name: provider.name,\n type: provider.type,\n props: provider.props,\n supportsIsolatedHydration: provider.supportsIsolatedHydration,\n component: provider.component,\n });\n }\n }\n\n return providers;\n}\n\nexport function isFarmIntegrationProviderComponentReference(\n value: FarmIntegrationProvider[\"component\"],\n): value is FarmIntegrationProviderComponentReference {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"module\" in value &&\n typeof value.module === \"string\" &&\n value.module.length > 0,\n );\n}\n\nexport function getIntegrationDocumentNavigationMatchers(\n integrations: FarmIntegrationsUserConfig | undefined,\n): string[] {\n if (!integrations) {\n return [];\n }\n\n const matchers: string[] = [];\n for (const integration of Object.values(integrations)) {\n if (\n !integration ||\n !isFarmIntegration(integration) ||\n !integration.documentNavigations?.length\n ) {\n continue;\n }\n\n for (const navigation of integration.documentNavigations) {\n const items = Array.isArray(navigation.matcher) ? navigation.matcher : [navigation.matcher];\n\n for (const item of items) {\n matchers.push(item);\n }\n }\n }\n\n return matchers;\n}\n\nexport function getIntegrationSchemas(\n integrations: FarmIntegrationsUserConfig | undefined,\n): Record<string, FarmIntegrationSchema> {\n if (!integrations) {\n return {};\n }\n\n const schemaEntries = Object.entries(integrations)\n .map(([key, integration]) => {\n const schema = integration && isFarmIntegration(integration) ? integration.schema : undefined;\n return schema ? ([key, schema] as const) : null;\n })\n .filter((value): value is readonly [string, FarmIntegrationSchema] => value !== null);\n\n return Object.fromEntries(schemaEntries);\n}\n\nexport function getRegisteredIntegrationRuntime(\n key: string,\n): RegisteredIntegrationRuntime | undefined {\n return getIntegrationRuntimeRegistry().get(key);\n}\n\nexport function getRegisteredIntegrations(): Record<string, FarmIntegration> {\n return Object.fromEntries(\n Array.from(getIntegrationRuntimeRegistry().entries()).map(([key, runtime]) => [\n key,\n runtime.integration,\n ]),\n );\n}\n\nexport function getRegisteredIntegrationSchemas(): Record<string, FarmIntegrationSchema> {\n return getIntegrationSchemas(getRegisteredIntegrations());\n}\n\nexport function matchIntegrationRoute(\n integrations: FarmIntegrationsUserConfig | undefined,\n input: {\n pathname: string;\n method?: string;\n },\n): {\n key: string;\n integration: FarmIntegration;\n route: {\n path: string;\n methods: readonly string[];\n };\n params: FarmIntegrationRouteParams;\n} | null {\n if (!integrations) {\n return null;\n }\n\n for (const [key, integration] of Object.entries(integrations)) {\n if (!integration || !isFarmIntegration(integration)) {\n continue;\n }\n\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n\n for (const route of routes) {\n if (!matchesMethod(route.methods, input.method)) {\n continue;\n }\n\n const params = extractPathParams(route.path, input.pathname);\n if (!params) {\n continue;\n }\n\n return {\n key,\n integration,\n route: {\n path: route.path,\n methods: route.methods,\n },\n params,\n };\n }\n }\n\n return null;\n}\n\nexport function matchRegisteredIntegrationRoute(input: { pathname: string; method?: string }): {\n key: string;\n integration: FarmIntegration;\n route: {\n path: string;\n methods: readonly string[];\n };\n params: FarmIntegrationRouteParams;\n} | null {\n return matchIntegrationRoute(getRegisteredIntegrations(), input);\n}\n\nfunction createClientSafeIntegrationAPI(\n api: FarmIntegrationAPI | undefined,\n): FarmIntegrationAPI | undefined {\n if (!api) {\n return undefined;\n }\n\n const entries = Object.entries(api as Record<string, unknown>).map(([key, value]) => {\n if (\n value &&\n typeof value === \"object\" &&\n (value as FarmIntegrationAPIOperation<any, any, any, any, any>).kind ===\n \"farm-integration-api-operation\"\n ) {\n const operation = value as FarmIntegrationAPIOperation<any, any, any, any, any>;\n return [\n key,\n defineIntegrationAPIOperation({\n path: operation.path,\n method: operation.method,\n bodyFormat: operation.bodyFormat,\n responseFormat: operation.responseFormat,\n credentials: operation.credentials,\n isServer: operation.isServer,\n }),\n ];\n }\n\n if (value && typeof value === \"object\") {\n return [key, createClientSafeIntegrationAPI(value as FarmIntegrationAPI)];\n }\n\n return [key, value];\n });\n\n return Object.fromEntries(entries) as FarmIntegrationAPI;\n}\n\nexport function getRegisteredIntegrationAPIManifest(): Record<string, FarmIntegrationAPI> {\n const manifestEntries = Object.entries(getRegisteredIntegrations())\n .map(([key, integration]) => {\n const api = createClientSafeIntegrationAPI(integration.api);\n return api ? ([key, api] as const) : null;\n })\n .filter((value): value is readonly [string, FarmIntegrationAPI] => value !== null);\n\n return Object.fromEntries(manifestEntries);\n}\n\ntype IntegrationLifecycleCleanup = () => MaybePromise<void>;\n\nfunction getIntegrationRuntimeEnv(): Record<string, string | undefined> {\n return typeof process !== \"undefined\" ? process.env : {};\n}\n\nfunction isIntegrationConfigDefinition(\n value: unknown,\n): value is FarmIntegrationConfigDefinition<unknown> {\n return (\n !!value &&\n typeof value === \"object\" &&\n (\"schema\" in value ||\n \"env\" in value ||\n \"defaults\" in value ||\n \"input\" in value ||\n \"resolve\" in value)\n );\n}\n\nfunction mergeIntegrationConfigValue(current: unknown, next: unknown): unknown {\n if (next === undefined) {\n return current;\n }\n\n if (isPlainIntegrationConfigObject(current) && isPlainIntegrationConfigObject(next)) {\n return {\n ...current,\n ...next,\n };\n }\n\n return next;\n}\n\nfunction isPlainIntegrationConfigObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nasync function resolveIntegrationConfigPart<TValue>(\n value: TValue | ((context: FarmIntegrationConfigContext) => MaybePromise<TValue>) | undefined,\n context: FarmIntegrationConfigContext,\n): Promise<TValue | undefined> {\n if (typeof value === \"function\") {\n return (value as (context: FarmIntegrationConfigContext) => MaybePromise<TValue>)(context);\n }\n\n return value;\n}\n\nfunction resolveIntegrationEnvConfig(\n env: Record<string, string | readonly string[]> | undefined,\n): Record<string, string> | undefined {\n if (!env) {\n return undefined;\n }\n\n const runtimeEnv = getIntegrationRuntimeEnv();\n const config: Record<string, string> = {};\n\n for (const [key, names] of Object.entries(env)) {\n const envNames = Array.isArray(names) ? names : [names];\n const value = envNames.map((name) => runtimeEnv[name]).find((entry) => entry !== undefined);\n if (value !== undefined) {\n config[key] = value;\n }\n }\n\n return config;\n}\n\nasync function parseIntegrationConfigSchema<TConfig>(\n integration: FarmIntegration<any, any>,\n schema: FarmIntegrationInputSchema<TConfig>,\n value: unknown,\n): Promise<TConfig> {\n const parser = schema.safeParseAsync || schema.safeParse;\n if (parser) {\n const result = await parser.call(schema, value);\n if (result.success) {\n return result.data;\n }\n\n throw createIntegrationConfigValidationError(integration, result.error);\n }\n\n if (schema[\"~standard\"]?.validate) {\n const result = await schema[\"~standard\"].validate(value);\n if (\"value\" in result) {\n return result.value;\n }\n\n throw createIntegrationConfigValidationError(integration, {\n issues: result.issues,\n });\n }\n\n if (schema.parse) {\n try {\n return await schema.parse(value);\n } catch (error) {\n throw createIntegrationConfigValidationError(\n integration,\n normalizeIntegrationValidationError(error),\n );\n }\n }\n\n throw new Error(\n `Integration \"${integration.type}\" config schema must expose safeParse, safeParseAsync, parse, or ~standard.validate.`,\n );\n}\n\nfunction createIntegrationConfigValidationError(\n integration: FarmIntegration<any, any>,\n error: FarmIntegrationValidationErrorLike,\n) {\n const issues =\n Array.isArray(error.issues) && error.issues.length > 0\n ? error.issues\n .map((issue) => {\n const normalizedPath = normalizeIntegrationValidationPath(issue.path);\n const path = normalizedPath.length ? `${normalizedPath.join(\".\")}: ` : \"\";\n return `${path}${issue.message || \"Invalid config\"}`;\n })\n .join(\"; \")\n : error.message || \"Invalid config\";\n\n return new Error(`Integration \"${integration.type}\" config validation failed: ${issues}`);\n}\n\nasync function resolveIntegrationConfig<TConfig>(\n integration: FarmIntegration<any, TConfig>,\n context: FarmIntegrationConfigContext,\n): Promise<TConfig> {\n const config = integration.config;\n if (!config) {\n return undefined as TConfig;\n }\n\n if (!isIntegrationConfigDefinition(config)) {\n return parseIntegrationConfigSchema(integration, config, {});\n }\n\n let value: unknown = {};\n value = mergeIntegrationConfigValue(\n value,\n await resolveIntegrationConfigPart(config.defaults, context),\n );\n value = mergeIntegrationConfigValue(value, resolveIntegrationEnvConfig(config.env));\n value = mergeIntegrationConfigValue(\n value,\n await resolveIntegrationConfigPart(config.input, context),\n );\n value = mergeIntegrationConfigValue(value, await config.resolve?.(context));\n\n return config.schema\n ? parseIntegrationConfigSchema(integration, config.schema, value)\n : (value as TConfig);\n}\n\nfunction createIntegrationLifecycleLogger(\n integration: FarmIntegration<any, any>,\n phase: FarmIntegrationLogPhase,\n): FarmIntegrationLifecycleLogger {\n const write = (\n level: FarmIntegrationLifecycleLogLevel,\n message: string,\n meta?: Record<string, unknown>,\n ) => {\n if (!integration.log) {\n return;\n }\n\n void Promise.resolve(\n integration.log({\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase,\n level,\n message,\n meta,\n context: new Map(),\n }),\n ).catch(() => {});\n };\n\n return {\n info(message, meta) {\n write(\"info\", message, meta);\n },\n warn(message, meta) {\n write(\"warn\", message, meta);\n },\n error(message, meta) {\n write(\"error\", message, meta);\n },\n };\n}\n\nasync function emitIntegrationLog(\n integration: FarmIntegration,\n event: FarmIntegrationLogEvent,\n): Promise<void> {\n try {\n await integration.log?.(event);\n } catch {\n // Integration logging is optional observability. A failed sink must not\n // block lifecycle startup, request handlers, responses, or cleanup.\n }\n}\n\nconst INTEGRATION_DATA_HEADER = \"x-farm-integration-data\";\nconst INTEGRATION_DATA_HEADER_MAX_LENGTH = 16 * 1024;\nconst BLOCKED_INTEGRATION_DATA_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction isFarmIntegrationData(value: unknown): value is FarmIntegrationData {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPlainIntegrationDataObject(value: unknown): value is Record<string, unknown> {\n if (!isFarmIntegrationData(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction sanitizeIntegrationDataValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeIntegrationDataValue(item));\n }\n\n if (!isPlainIntegrationDataObject(value)) {\n return value;\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (BLOCKED_INTEGRATION_DATA_KEYS.has(key)) {\n continue;\n }\n\n sanitized[key] = sanitizeIntegrationDataValue(item);\n }\n\n return sanitized;\n}\n\nfunction normalizeIntegrationData(value: FarmIntegrationData | undefined): FarmIntegrationData {\n if (!isFarmIntegrationData(value)) {\n return {};\n }\n\n const sanitized = sanitizeIntegrationDataValue(value);\n return isFarmIntegrationData(sanitized) ? sanitized : {};\n}\n\nfunction getIntegrationDataHeaderByteLength(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nfunction parseIntegrationDataHeader(request: Request): FarmIntegrationData {\n const raw = request.headers.get(INTEGRATION_DATA_HEADER);\n if (!raw) {\n return {};\n }\n\n if (getIntegrationDataHeaderByteLength(raw) > INTEGRATION_DATA_HEADER_MAX_LENGTH) {\n return {};\n }\n\n try {\n const value = JSON.parse(raw);\n return normalizeIntegrationData(value);\n } catch {\n return {};\n }\n}\n\nfunction resolveIntegrationData(request: Request, data?: FarmIntegrationData): FarmIntegrationData {\n return {\n ...parseIntegrationDataHeader(request),\n ...normalizeIntegrationData(data),\n };\n}\n\nfunction createIntegrationPlugin(integrationKey: string, integration: FarmIntegration): FarmPlugin {\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n const middleware = [...(integration.middleware || [])];\n const cleanupCallbacks: IntegrationLifecycleCleanup[] = [];\n let integrationConfigPromise: Promise<unknown> | undefined;\n\n const runCleanup = async () => {\n const callbacks = cleanupCallbacks.splice(0).reverse();\n for (const callback of callbacks) {\n await callback();\n }\n };\n\n const createLifecycleContext = async (\n context: FarmPluginContext,\n phase: FarmIntegrationLogPhase,\n options: { reason?: string } = {},\n ): Promise<FarmIntegrationLifecycleContext> => {\n const args = createIntegrationRouteArgs({\n integration,\n config: context.config,\n });\n const configContext: FarmIntegrationConfigContext = {\n key: integrationKey,\n integration,\n appConfig: context.config,\n config: context.config,\n args,\n env: getIntegrationRuntimeEnv(),\n isDev: context.isDev,\n isProd: context.isProd,\n };\n integrationConfigPromise ??= resolveIntegrationConfig(integration, configContext);\n\n return {\n ...configContext,\n integrationConfig: await integrationConfigPromise,\n log: createIntegrationLifecycleLogger(integration, phase),\n reason: options.reason,\n async cleanup(callback) {\n if (callback) {\n cleanupCallbacks.push(callback);\n return;\n }\n\n await runCleanup();\n },\n };\n };\n\n const plugin: FarmPlugin = {\n name: `farm:integration:${integration.category}:${integration.type}`,\n enforce: \"pre\",\n\n async init(context) {\n getIntegrationRuntimeRegistry().set(integrationKey, {\n integration,\n config: context.config,\n isDev: context.isDev,\n isProd: context.isProd,\n });\n\n await createLifecycleContext(context, \"validate\");\n\n if (integration.validate) {\n await integration.validate(await createLifecycleContext(context, \"validate\"));\n }\n\n if (integration.setup) {\n await integration.setup(await createLifecycleContext(context, \"setup\"));\n }\n\n if (!integration.log) {\n return;\n }\n\n for (const route of routes) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"registered\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n context: new Map(),\n });\n }\n\n for (const entry of middleware) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"registered\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n context: new Map(),\n });\n }\n },\n\n async ready(context) {\n if (integration.ready) {\n await integration.ready(await createLifecycleContext(context, \"ready\"));\n }\n },\n\n async shutdown(payload, context) {\n try {\n if (integration.dispose) {\n await integration.dispose(\n await createLifecycleContext(context, \"dispose\", {\n reason: payload.reason,\n }),\n );\n }\n } finally {\n await runCleanup();\n }\n },\n\n async beforeRequest(req, res, context) {\n const fullUrl = `http://${req.headers.host || \"localhost\"}${req.url || \"/\"}`;\n const url = new URL(fullUrl);\n const pathname = url.pathname;\n const requestId = getRequestId(req);\n let bodyLoaded = false;\n let requestBody: Buffer | undefined;\n\n const getRequestBody = async () => {\n if (!bodyLoaded) {\n bodyLoaded = true;\n if (req.method && req.method !== \"GET\" && req.method !== \"HEAD\") {\n requestBody = await readNodeRequestBody(\n req,\n resolveFarmServerConfig(context.config.server).bodySizeLimit,\n );\n }\n }\n\n return requestBody;\n };\n\n const createHandlerRequest = async (): Promise<Request | null> => {\n try {\n return createWebRequest(req, fullUrl, await getRequestBody());\n } catch (error) {\n const response = createFarmRequestBodyErrorResponse(error);\n if (!response) throw error;\n await sendWebResponse(res, response);\n return null;\n }\n };\n\n for (const entry of middleware) {\n const params = resolveMatcherParams(entry.matcher, pathname);\n if (!params) {\n continue;\n }\n\n const request = await createHandlerRequest();\n if (!request) return;\n const handlerContext = createIntegrationHandlerContext({\n integration,\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n rawRequest: req,\n params,\n pathname,\n requestId,\n pluginContext: context,\n });\n const startedAt = Date.now();\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const response = await entry.handler(request, handlerContext);\n if (response) {\n await sendWebResponse(res, response);\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n } catch (error) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n for (const route of routes) {\n const params = matchesMethod(route.methods, req.method)\n ? extractPathParams(route.path, pathname)\n : null;\n if (!params) {\n continue;\n }\n\n const request = await createHandlerRequest();\n if (!request) return;\n const handlerContext = createIntegrationHandlerContext({\n integration,\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n rawRequest: req,\n params,\n pathname,\n requestId,\n pluginContext: context,\n });\n const startedAt = Date.now();\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const validation = await validateIntegrationRouteInput(route, request, url);\n if (!validation.success) {\n await sendWebResponse(res, validation.response);\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: validation.response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n handlerContext.input = validation.input;\n\n for (const middlewareEntry of route.middleware || []) {\n const middlewareResponse = await middlewareEntry.handler(request, handlerContext);\n if (middlewareResponse) {\n await sendWebResponse(res, middlewareResponse);\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: middlewareResponse,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n }\n\n const beforeResponse = await runIntegrationRouteBeforeHooks(\n route,\n request,\n handlerContext,\n );\n if (beforeResponse) {\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n beforeResponse,\n );\n await sendWebResponse(res, response);\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n }\n\n const handlerResponse = await route.handler(request, handlerContext);\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n handlerResponse,\n );\n await sendWebResponse(res, response);\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return;\n } catch (error) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n },\n };\n\n Object.defineProperty(plugin, FARM_INTEGRATION_PLUGIN_SERVER_RUNTIME, {\n value: integration.serverRuntime !== false,\n });\n\n return plugin;\n}\n\nfunction createIntegrationHandlerContext(input: {\n integration: FarmIntegration;\n route: FarmIntegrationHandlerContext[\"route\"];\n request: Request;\n rawRequest: FarmRequest;\n params: FarmIntegrationRouteParams;\n pathname: string;\n requestId: string;\n pluginContext: FarmPluginContext;\n}): FarmIntegrationHandlerContext {\n const req = createIntegrationRequestContextStore(\n input.rawRequest,\n input.request,\n input.pluginContext,\n );\n\n return {\n request: input.request,\n requestId: input.requestId,\n url: new URL(input.request.url),\n pathname: input.pathname,\n method: input.request.method,\n params: input.params,\n input: {},\n args: createIntegrationRouteArgs({\n integration: input.integration,\n config: input.pluginContext.config,\n }),\n data: resolveIntegrationData(input.request),\n integration: {\n category: input.integration.category,\n slot: input.integration.category,\n type: input.integration.type,\n instance: input.integration.instance,\n },\n route: input.route,\n req,\n requestContext: req,\n config: input.pluginContext.config,\n isDev: input.pluginContext.isDev,\n isProd: input.pluginContext.isProd,\n };\n}\n\ntype NormalizedIntegrationRoute = Omit<FarmIntegrationRoute, \"method\" | \"methods\"> & {\n methods: readonly string[];\n __operation?: FarmIntegrationAPIOperation<any, any, any, any, any>;\n};\n\nfunction normalizeIntegrationRoutes(\n routes: readonly FarmIntegrationRoute[],\n): NormalizedIntegrationRoute[] {\n return routes\n .map((route, index) => {\n // Raw FarmIntegration objects and direct dispatch also pass through here.\n assertUniqueRouteParameters(route.path, \"api\");\n return {\n index,\n route: {\n ...route,\n methods: normalizeIntegrationRouteMethods(route),\n input: normalizeIntegrationRouteInputSchemas(route),\n },\n specificity: getRoutePatternSpecificity(route.path, \"api\"),\n };\n })\n .sort(\n (left, right) =>\n compareRouteSpecificity(left.specificity, right.specificity) || left.index - right.index,\n )\n .map(({ route }) => route);\n}\n\nfunction normalizeIntegrationRouteMethods(route: Pick<FarmIntegrationRoute, \"method\" | \"methods\">) {\n const input =\n route.methods && route.methods.length > 0\n ? [...route.methods]\n : route.method\n ? [route.method]\n : [\"ALL\"];\n\n return input.map((method) => String(method).toUpperCase());\n}\n\nfunction normalizeIntegrationRouteInputSchemas<TBody, TQuery>(\n route: Pick<FarmIntegrationRoute<TBody, TQuery>, \"body\" | \"query\" | \"input\">,\n): FarmIntegrationRouteInputSchemas<TBody, TQuery> | undefined {\n const input: FarmIntegrationRouteInputSchemas<TBody, TQuery> = {\n ...route.input,\n };\n\n if (route.body) {\n input.body = route.body;\n }\n\n if (route.query) {\n input.query = route.query;\n }\n\n return input.body || input.query ? input : undefined;\n}\n\ntype IntegrationRouteInputValidationResult =\n | {\n success: true;\n input: FarmIntegrationRouteInput;\n }\n | {\n success: false;\n response: Response;\n };\n\nasync function validateIntegrationRouteInput(\n route: NormalizedIntegrationRoute,\n request: Request,\n url: URL,\n): Promise<IntegrationRouteInputValidationResult> {\n if (request.method.toUpperCase() === \"QUERY\" && !request.headers.has(\"content-type\")) {\n return {\n success: false,\n response: Response.json(\n {\n error: \"Invalid QUERY request\",\n message: \"QUERY requests must include a Content-Type header.\",\n },\n { status: 400 },\n ),\n };\n }\n\n const schemas = route.input;\n if (!schemas?.body && !schemas?.query) {\n return {\n success: true,\n input: {},\n };\n }\n\n const input: FarmIntegrationRouteInput = {};\n const issues: FarmIntegrationValidationIssue[] = [];\n\n if (schemas.query) {\n const queryResult = await parseIntegrationInputSchema(\n \"query\",\n schemas.query,\n createQueryInput(url.searchParams),\n );\n if (queryResult.success) {\n input.query = queryResult.data;\n } else {\n issues.push(...queryResult.issues);\n }\n }\n\n if (schemas.body) {\n const bodyInput = await readIntegrationValidationBody(\n request,\n getIntegrationRouteBodyFormat(route),\n );\n\n if (bodyInput.success) {\n const bodyResult = await parseIntegrationInputSchema(\"body\", schemas.body, bodyInput.data);\n if (bodyResult.success) {\n input.body = bodyResult.data;\n } else {\n issues.push(...bodyResult.issues);\n }\n } else {\n issues.push(bodyInput.issue);\n }\n }\n\n if (issues.length > 0) {\n return {\n success: false,\n response: createIntegrationValidationResponse(issues),\n };\n }\n\n return {\n success: true,\n input,\n };\n}\n\nasync function parseIntegrationInputSchema<TValue>(\n source: FarmIntegrationRouteInputSource,\n schema: FarmIntegrationInputSchema<TValue>,\n value: unknown,\n): Promise<\n | {\n success: true;\n data: TValue;\n }\n | {\n success: false;\n issues: FarmIntegrationValidationIssue[];\n }\n> {\n const parser = schema.safeParseAsync || schema.safeParse;\n if (parser) {\n const result = await parser.call(schema, value);\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(source, result.error),\n };\n }\n\n if (schema[\"~standard\"]?.validate) {\n const result = await schema[\"~standard\"].validate(value);\n if (\"value\" in result) {\n return {\n success: true,\n data: result.value,\n };\n }\n\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(source, {\n issues: result.issues,\n }),\n };\n }\n\n if (schema.parse) {\n try {\n return {\n success: true,\n data: await schema.parse(value),\n };\n } catch (error) {\n return {\n success: false,\n issues: normalizeIntegrationValidationIssues(\n source,\n normalizeIntegrationValidationError(error),\n ),\n };\n }\n }\n\n return {\n success: false,\n issues: [\n {\n source,\n message:\n \"Input schema must expose safeParse, safeParseAsync, parse, or ~standard.validate.\",\n },\n ],\n };\n}\n\nfunction createIntegrationValidationResponse(issues: readonly FarmIntegrationValidationIssue[]) {\n return Response.json(\n {\n error: \"Integration route input validation failed\",\n issues,\n },\n {\n status: 400,\n },\n );\n}\n\nfunction normalizeIntegrationValidationIssues(\n source: FarmIntegrationRouteInputSource,\n error: FarmIntegrationValidationErrorLike,\n): FarmIntegrationValidationIssue[] {\n if (Array.isArray(error.issues) && error.issues.length > 0) {\n return error.issues.map((issue) => ({\n source,\n path: normalizeIntegrationValidationPath(issue.path),\n code: issue.code,\n message: issue.message || \"Invalid input\",\n }));\n }\n\n return [\n {\n source,\n path: [],\n message: error.message || \"Invalid input\",\n },\n ];\n}\n\nfunction normalizeIntegrationValidationPath(\n path: readonly FarmIntegrationValidationPathSegment[] | undefined,\n): (string | number)[] {\n return (path || []).map((segment) => {\n const key =\n typeof segment === \"object\" && segment !== null && \"key\" in segment ? segment.key : segment;\n return typeof key === \"symbol\" ? key.description || key.toString() : key;\n });\n}\n\nfunction normalizeIntegrationValidationError(error: unknown): FarmIntegrationValidationErrorLike {\n if (error && typeof error === \"object\") {\n return error as FarmIntegrationValidationErrorLike;\n }\n\n return {\n message: error instanceof Error ? error.message : String(error || \"Invalid input\"),\n };\n}\n\nasync function readIntegrationValidationBody(\n request: Request,\n format: FarmIntegrationAPIBodyFormat,\n): Promise<\n | {\n success: true;\n data: unknown;\n }\n | {\n success: false;\n issue: FarmIntegrationValidationIssue;\n }\n> {\n if (request.method === \"GET\" || request.method === \"HEAD\" || format === \"none\") {\n return {\n success: true,\n data: undefined,\n };\n }\n\n try {\n if (format === \"form\") {\n return {\n success: true,\n data: createFormInput(await request.clone().formData()),\n };\n }\n\n const text = await request.clone().text();\n if (text.trim().length === 0) {\n return {\n success: true,\n data: undefined,\n };\n }\n\n return {\n success: true,\n data: JSON.parse(text),\n };\n } catch (error) {\n return {\n success: false,\n issue: {\n source: \"body\",\n path: [],\n message:\n format === \"json\"\n ? \"Expected a valid JSON request body.\"\n : error instanceof Error && error.message\n ? error.message\n : \"Could not parse request body.\",\n },\n };\n }\n}\n\nfunction getIntegrationRouteBodyFormat(route: NormalizedIntegrationRoute) {\n return route.bodyFormat || route.__operation?.bodyFormat || \"json\";\n}\n\nfunction createIntegrationRouteArgs(input: {\n integration: FarmIntegration;\n config: FarmPluginContext[\"config\"];\n}): FarmIntegrationRouteArgs {\n let clientPromise: Promise<unknown | undefined> | undefined;\n let ormPromise: Promise<unknown> | undefined;\n\n const getClient = () => {\n clientPromise ??= import(\"./storage\").then(({ resolveStorageRuntimeClient }) =>\n resolveStorageRuntimeClient(input.config.storage),\n );\n return clientPromise;\n };\n\n const getOrm = () => {\n if (!input.integration.schema) {\n throw new Error(\n `Integration \"${input.integration.type}\" does not define a schema for ctx.args.db.`,\n );\n }\n\n ormPromise ??= import(\"./integration-orm\").then(({ createIntegrationOrm }) =>\n createIntegrationOrm({\n schema: input.integration.schema!,\n config: input.config,\n }),\n );\n return ormPromise;\n };\n\n return {\n db: createLazyIntegrationOrmClient(getOrm) as never,\n getDb: getOrm as never,\n storage: {\n getClient,\n getOrm: getOrm as never,\n },\n };\n}\n\nfunction createLazyIntegrationOrmClient(resolveOrm: () => Promise<unknown>) {\n const modelProxyCache = new Map<PropertyKey, unknown>();\n\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"then\") {\n return undefined;\n }\n\n if (prop === \"transaction\" || prop === \"batch\") {\n return async (...args: unknown[]) => {\n const orm = (await resolveOrm()) as Record<PropertyKey, unknown>;\n const member = orm[prop];\n if (typeof member !== \"function\") {\n throw new Error(`Integration ORM does not expose \"${String(prop)}\".`);\n }\n return member.apply(orm, args);\n };\n }\n\n if (prop === \"$driver\") {\n return undefined;\n }\n\n if (!modelProxyCache.has(prop)) {\n modelProxyCache.set(prop, createLazyIntegrationOrmModel(resolveOrm, prop));\n }\n\n return modelProxyCache.get(prop);\n },\n },\n );\n}\n\nfunction createLazyIntegrationOrmModel(resolveOrm: () => Promise<unknown>, modelName: PropertyKey) {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === \"then\") {\n return undefined;\n }\n\n return async (...args: unknown[]) => {\n const orm = (await resolveOrm()) as Record<PropertyKey, Record<PropertyKey, unknown>>;\n const model = orm[modelName];\n const member = model?.[prop];\n if (typeof member !== \"function\") {\n throw new Error(\n `Integration ORM model \"${String(modelName)}\" does not expose \"${String(prop)}\".`,\n );\n }\n return member.apply(model, args);\n };\n },\n },\n );\n}\n\nasync function runIntegrationRouteBeforeHooks(\n route: NormalizedIntegrationRoute,\n request: Request,\n context: FarmIntegrationHandlerContext,\n): Promise<Response | undefined> {\n const hookContext = context as FarmIntegrationRouteHookContext;\n hookContext.response = undefined;\n\n for (const hook of route.before || []) {\n const response = await hook(request, hookContext);\n if (response) {\n hookContext.response = response;\n return response;\n }\n\n if (hookContext.response) {\n return hookContext.response;\n }\n }\n\n return undefined;\n}\n\nasync function runIntegrationRouteAfterHooks(\n route: NormalizedIntegrationRoute,\n request: Request,\n context: FarmIntegrationHandlerContext,\n response: Response,\n): Promise<Response> {\n const hookContext = context as FarmIntegrationRouteHookContext;\n let currentResponse = response;\n\n for (const hook of route.after || []) {\n hookContext.response = currentResponse;\n const nextResponse = await hook(request, hookContext);\n currentResponse = nextResponse || hookContext.response || currentResponse;\n }\n\n hookContext.response = currentResponse;\n return currentResponse;\n}\n\nfunction createQueryInput(searchParams: URLSearchParams): Record<string, string | string[]> {\n const input: Record<string, string | string[]> = {};\n searchParams.forEach((value, key) => {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") return;\n\n const existing = input[key];\n if (existing === undefined) {\n input[key] = value;\n return;\n }\n\n input[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n });\n return input;\n}\n\nfunction createFormInput(\n formData: FormData,\n): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n const input: Record<string, FormDataEntryValue | FormDataEntryValue[]> = {};\n formData.forEach((value, key) => {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") return;\n\n const existing = input[key];\n if (existing === undefined) {\n input[key] = value;\n return;\n }\n\n input[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n });\n return input;\n}\n\nexport async function dispatchIntegrationRequest(\n runtime: RegisteredIntegrationRuntime,\n request: Request,\n options: {\n currentRequest?: Request;\n data?: FarmIntegrationData;\n internal?: boolean;\n } = {},\n): Promise<Response | null> {\n try {\n request = await bufferFarmRequestBody(\n request,\n resolveFarmServerConfig(runtime.config.server).bodySizeLimit,\n );\n } catch (error) {\n const response = createFarmRequestBodyErrorResponse(error);\n if (response) return response;\n throw error;\n }\n\n const integration = runtime.integration;\n const url = new URL(request.url);\n const pathname = url.pathname;\n const requestId =\n request.headers.get(\"x-request-id\") ||\n options.currentRequest?.headers.get(\"x-request-id\") ||\n String(Date.now());\n const routes = normalizeIntegrationRoutes(integration.routes || []);\n const middleware = [...(integration.middleware || [])];\n\n for (const entry of middleware) {\n const params = resolveMatcherParams(entry.matcher, pathname);\n if (!params) {\n continue;\n }\n\n const handlerContext = createServerIntegrationHandlerContext({\n runtime,\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n params,\n pathname,\n requestId,\n currentRequest: options.currentRequest,\n data: options.data,\n internal: options.internal === true,\n });\n const startedAt = Date.now();\n\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const response = await entry.handler(request, handlerContext);\n if (response) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n }\n\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n } catch (error) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"middleware\",\n path: normalizeMatcher(entry.matcher),\n methods: [\"ALL\"],\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n for (const route of routes) {\n const params = matchesMethod(route.methods, request.method)\n ? extractPathParams(route.path, pathname)\n : null;\n if (!params) {\n continue;\n }\n\n const handlerContext = createServerIntegrationHandlerContext({\n runtime,\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n params,\n pathname,\n requestId,\n currentRequest: options.currentRequest,\n data: options.data,\n internal: options.internal === true,\n });\n const startedAt = Date.now();\n\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:start\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n context: handlerContext.req.snapshot(),\n });\n\n try {\n const validation = await validateIntegrationRouteInput(route, request, url);\n if (!validation.success) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: validation.response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return validation.response;\n }\n handlerContext.input = validation.input;\n\n for (const middlewareEntry of route.middleware || []) {\n const middlewareResponse = await middlewareEntry.handler(request, handlerContext);\n if (middlewareResponse) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response: middlewareResponse,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return middlewareResponse;\n }\n }\n\n const beforeResponse = await runIntegrationRouteBeforeHooks(route, request, handlerContext);\n if (beforeResponse) {\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n beforeResponse,\n );\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n }\n\n const handlerResponse = await route.handler(request, handlerContext);\n const response = await runIntegrationRouteAfterHooks(\n route,\n request,\n handlerContext,\n handlerResponse,\n );\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:end\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n response,\n requestId,\n durationMs: Date.now() - startedAt,\n context: handlerContext.req.snapshot(),\n });\n return response;\n } catch (error) {\n await emitIntegrationLog(integration, {\n category: integration.category,\n slot: integration.category,\n type: integration.type,\n phase: \"request:error\",\n route: {\n kind: \"route\",\n path: route.path,\n methods: route.methods,\n },\n request,\n requestId,\n durationMs: Date.now() - startedAt,\n error,\n context: handlerContext.req.snapshot(),\n });\n throw error;\n }\n }\n\n return null;\n}\n\n(globalThis as GlobalWithIntegrationRuntimeRegistry)[INTEGRATION_REQUEST_DISPATCHER_KEY] =\n dispatchIntegrationRequest;\n\nfunction createIntegrationRequestContextStore(\n rawRequest: FarmRequest,\n request: Request,\n pluginContext: FarmPluginContext,\n): FarmIntegrationRequestContextStore {\n return {\n get(key) {\n const requestValue = pluginContext.requestContext.get(request, key);\n if (requestValue !== undefined) {\n return requestValue;\n }\n\n return pluginContext.requestContext.get(rawRequest, key);\n },\n set(key, value, options) {\n pluginContext.requestContext.set(rawRequest, key, value, options);\n pluginContext.requestContext.set(request, key, value, options);\n },\n has(key) {\n return (\n pluginContext.requestContext.has(request, key) ||\n pluginContext.requestContext.has(rawRequest, key)\n );\n },\n delete(key) {\n const deletedRequest = pluginContext.requestContext.delete(request, key);\n const deletedRaw = pluginContext.requestContext.delete(rawRequest, key);\n return deletedRequest || deletedRaw;\n },\n clear() {\n pluginContext.requestContext.clear(rawRequest);\n pluginContext.requestContext.clear(request);\n },\n snapshot(options) {\n const merged = pluginContext.requestContext.getAll(rawRequest, options);\n const requestSnapshot = pluginContext.requestContext.getAll(request, options);\n for (const [key, value] of requestSnapshot) {\n merged.set(key, value);\n }\n return merged;\n },\n };\n}\n\nfunction createServerIntegrationHandlerContext(input: {\n runtime: RegisteredIntegrationRuntime;\n route: FarmIntegrationHandlerContext[\"route\"];\n request: Request;\n params: FarmIntegrationRouteParams;\n pathname: string;\n requestId: string;\n currentRequest?: Request;\n data?: FarmIntegrationData;\n internal?: boolean;\n}): FarmIntegrationHandlerContext {\n const req = createServerIntegrationRequestContextStore(input.request, input.currentRequest);\n\n if (input.internal) {\n req.set(FARM_INTEGRATION_INTERNAL_DISPATCH_CONTEXT_KEY, true);\n }\n\n return {\n request: input.request,\n requestId: input.requestId,\n url: new URL(input.request.url),\n pathname: input.pathname,\n method: input.request.method,\n params: input.params,\n input: {},\n args: createIntegrationRouteArgs({\n integration: input.runtime.integration,\n config: input.runtime.config,\n }),\n data: resolveIntegrationData(input.request, input.data),\n integration: {\n category: input.runtime.integration.category,\n slot: input.runtime.integration.category,\n type: input.runtime.integration.type,\n instance: input.runtime.integration.instance,\n },\n route: input.route,\n req,\n requestContext: req,\n config: input.runtime.config,\n isDev: input.runtime.isDev,\n isProd: input.runtime.isProd,\n };\n}\n\nfunction createServerIntegrationRequestContextStore(\n request: Request,\n currentRequest?: Request,\n): FarmIntegrationRequestContextStore {\n return {\n get(key) {\n const requestValue = getRequestContext(request, key);\n if (requestValue !== undefined) {\n return requestValue;\n }\n\n if (currentRequest) {\n return getRequestContext(currentRequest, key);\n }\n\n return undefined;\n },\n set(key, value, options) {\n setRequestContext(request, key, value, options);\n if (currentRequest) {\n setRequestContext(currentRequest, key, value, options);\n }\n },\n has(key) {\n return (\n hasRequestContext(request, key) ||\n (!!currentRequest && hasRequestContext(currentRequest, key))\n );\n },\n delete(key) {\n const deletedRequest = deleteRequestContext(request, key);\n const deletedCurrent = currentRequest ? deleteRequestContext(currentRequest, key) : false;\n return deletedRequest || deletedCurrent;\n },\n clear() {\n clearRequestContext(request);\n if (currentRequest) {\n clearRequestContext(currentRequest);\n }\n },\n snapshot(options) {\n const merged = currentRequest\n ? getRequestContextSnapshot(currentRequest, options)\n : new Map<string, unknown>();\n const requestSnapshot = getRequestContextSnapshot(request, options);\n for (const [key, value] of requestSnapshot) {\n merged.set(key, value);\n }\n return merged;\n },\n };\n}\n\nfunction createWebRequest(req: FarmRequest, fullUrl: string, body?: Buffer): Request {\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value == null) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n\n headers.set(key, value);\n }\n\n return new Request(fullUrl, {\n method: req.method,\n headers,\n body: body as BodyInit | undefined,\n });\n}\n\nfunction matchesMethod(methods: readonly string[], method: string | undefined): boolean {\n if (!method) {\n return false;\n }\n\n const normalizedMethod = method.toUpperCase();\n return methods.some((item) => {\n const candidate = item.toUpperCase();\n return candidate === \"ALL\" || candidate === normalizedMethod;\n });\n}\n\nfunction matchesMatcher(\n matcher: string | readonly string[] | undefined,\n pathname: string,\n): boolean {\n return resolveMatcherParams(matcher, pathname) !== null;\n}\n\nfunction resolveMatcherParams(\n matcher: string | readonly string[] | undefined,\n pathname: string,\n): FarmIntegrationRouteParams | null {\n if (!matcher) {\n return {};\n }\n\n const list = Array.isArray(matcher) ? matcher : [matcher];\n for (const item of list) {\n if (item === \"/(.*)\" || item === \"*\") {\n return {};\n }\n if (item.endsWith(\"(.*)\")) {\n const prefix = item.slice(0, -4);\n if (pathname === prefix || pathname.startsWith(`${prefix}/`)) {\n return {};\n }\n continue;\n }\n const params = extractPathParams(item, pathname);\n if (params) {\n return params;\n }\n }\n\n return null;\n}\n\nfunction matchesPath(pattern: string, pathname: string): boolean {\n return extractPathParams(pattern, pathname) !== null;\n}\n\nfunction extractPathParams(pattern: string, pathname: string): FarmIntegrationRouteParams | null {\n const routeSegments = splitPath(pattern);\n const pathSegments = splitPath(pathname);\n const params: FarmIntegrationRouteParams = {};\n\n let routeIndex = 0;\n let pathIndex = 0;\n\n while (routeIndex < routeSegments.length && pathIndex < pathSegments.length) {\n const routeSegment = routeSegments[routeIndex];\n const pathSegment = pathSegments[pathIndex];\n\n if (isCatchAllSegment(routeSegment)) {\n params[getSegmentParamName(routeSegment)] = pathSegments\n .slice(pathIndex)\n .map((segment) => decodeRouteSegment(segment));\n return params;\n }\n\n if (isDynamicSegment(routeSegment)) {\n params[getSegmentParamName(routeSegment)] = decodeRouteSegment(pathSegment);\n routeIndex += 1;\n pathIndex += 1;\n continue;\n }\n\n if (routeSegment !== pathSegment) {\n return null;\n }\n\n routeIndex += 1;\n pathIndex += 1;\n }\n\n if (routeIndex === routeSegments.length && pathIndex === pathSegments.length) {\n return params;\n }\n\n if (routeIndex === routeSegments.length - 1 && isCatchAllSegment(routeSegments[routeIndex])) {\n params[getSegmentParamName(routeSegments[routeIndex])] = [];\n return params;\n }\n\n return null;\n}\n\nfunction splitPath(value: string): string[] {\n return value.split(\"/\").filter(Boolean);\n}\n\nfunction isDynamicSegment(segment: string): boolean {\n return segment.startsWith(\"[\") && segment.endsWith(\"]\");\n}\n\nfunction isCatchAllSegment(segment: string): boolean {\n return segment.startsWith(\"[...\") && segment.endsWith(\"]\");\n}\n\nfunction getSegmentParamName(segment: string): string {\n if (isCatchAllSegment(segment)) {\n return segment.slice(4, -1);\n }\n\n return segment.slice(1, -1);\n}\n\nfunction getRequestId(req: FarmRequest): string {\n const headerValue = req.headers[\"x-request-id\"];\n if (Array.isArray(headerValue)) {\n return headerValue[0] || String(Date.now());\n }\n return headerValue || String(Date.now());\n}\n\nfunction normalizeMatcher(matcher: string | readonly string[] | undefined): string {\n if (!matcher) {\n return \"/(.*)\";\n }\n return typeof matcher === \"string\" ? matcher : matcher.join(\", \");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CO,SAAS,iCACd,QACA,OACmB;AACnB,SAAO,OAAO,QAAQ,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,8BAA8B,OAAO,KAAK,CAAC,CAAC;AACjG;AALgB;AAOT,SAAS,iCACd,SACA,SAAkC,CAAC,GACV;AACzB,QAAM,iBAAiB,OAAO,kBAAkB,CAAC;AACjD,QAAM,wBAAwB,OAAO,yBAAyB;AAC9D,QAAM,YAAY,QAAQ,QAAQ,IAAI,gBAAgB,GAAG,KAAK,EAAE,YAAY;AAC5E,QAAM,SAAS,uBAAuB,OAAO;AAE7C,MAAI,CAAC,OAAO,IAAI;AACd,WAAO,EAAE,IAAI,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC5C;AAEA,MAAI,OAAO,WAAW,MAAM;AAG1B,QAAI,cAAc,eAAe;AAC/B,aAAO,EAAE,IAAI,KAAK;AAAA,IACpB;AAGA,QAAI,uBAAuB;AACzB,aAAO,EAAE,IAAI,OAAO,QAAQ,cAAc,eAAe,eAAe,iBAAiB;AAAA,IAC3F;AAKA,WAAO,cAAc,eAAe,EAAE,IAAI,OAAO,QAAQ,aAAa,IAAI,EAAE,IAAI,KAAK;AAAA,EACvF;AAEA,QAAM,aAAa,IAAI,IAAI,QAAQ,GAAG;AACtC,QAAM,0BAA0B,eAAe;AAAA,IAAK,CAAC,YACnD,qBAAqB,OAAO,QAAkB,OAAO;AAAA,EACvD;AACA,QAAM,iBACJ,OAAO,WAAW,WAAW,UAAU,kBAAkB,OAAO,QAAQ,OAAO;AAEjF,MAAI,CAAC,kBAAkB,CAAC,yBAAyB;AAC/C,WAAO,EAAE,IAAI,OAAO,QAAQ,aAAa;AAAA,EAC3C;AAEA,MAAI,cAAc,gBAAgB,CAAC,yBAAyB;AAC1D,WAAO,EAAE,IAAI,OAAO,QAAQ,aAAa;AAAA,EAC3C;AAEA,SAAO,EAAE,IAAI,KAAK;AACpB;AA/CgB;AAiDT,SAAS,mCAAmC,QAA4C;AAC7F,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAXgB;;;AClGhB,IAAM,kCAAkC,uBAAO,IAAI,0CAA0C;AAEtF,SAAS,gCACd,QACA,aACM;AACN,SAAO,eAAe,QAAQ,iCAAiC;AAAA,IAC7D,OAAO;AAAA,EACT,CAAC;AACH;AAPgB;AAST,SAAS,gCACd,QACoD;AACpD,QAAM,QAAS,OAAgD,+BAA+B;AAC9F,SAAO,SAAS,OAAO,UAAU,WAC5B,QACD;AACN;AAPgB;;;ACEhB,IAAM,4BAA4B,uBAAO,IAAI,0BAA0B;AAMvE,SAAS,yBAAyB;AAChC,QAAM,cAAc;AACpB,MAAI,CAAC,YAAY,yBAAyB,GAAG;AAC3C,gBAAY,yBAAyB,IAAI,oBAAI,QAG3C;AAAA,EACJ;AAEA,SAAO,YAAY,yBAAyB;AAC9C;AAVS;AAYT,SAAS,UAAU,QAAqD;AACtE,QAAM,sBAAsB,uBAAuB;AACnD,MAAI,SAAS,oBAAoB,IAAI,MAAM;AAC3C,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,MACP,aAAa,oBAAI,IAAiB;AAAA,MAClC,aAAa,oBAAI,IAAiB;AAAA,IACpC;AACA,wBAAoB,IAAI,QAAQ,MAAM;AAAA,EACxC;AACA,SAAO;AACT;AAXS;AAaF,SAAS,kBACd,QACA,KACA,OACA,UAAoC,CAAC,GAC/B;AACN,QAAM,SAAS,UAAU,MAAM;AAC/B,SAAO,YAAY,IAAI,KAAK,KAAK;AACjC,MAAI,QAAQ,cAAc;AACxB,WAAO,YAAY,IAAI,KAAK,KAAK;AAAA,EACnC;AACF;AAXgB;AAaT,SAAS,kBACd,QACA,KACe;AACf,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,SAAO,QAAQ,YAAY,IAAI,GAAG;AACpC;AAPgB;AAST,SAAS,kBAAkB,QAA+B,KAAsB;AACrF,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,SAAO,QAAQ,YAAY,IAAI,GAAG,KAAK;AACzC;AAJgB;AAMT,SAAS,qBAAqB,QAA+B,KAAsB;AACxF,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,iBAAiB,OAAO,YAAY,OAAO,GAAG;AACpD,SAAO,YAAY,OAAO,GAAG;AAC7B,SAAO;AACT;AAPgB;AAST,SAAS,oBAAoB,QAAqC;AACvE,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,MAAI,CAAC,OAAQ;AACb,SAAO,YAAY,MAAM;AACzB,SAAO,YAAY,MAAM;AAC3B;AANgB;AAQT,SAAS,0BACd,QACA,UAAyC,CAAC,GACxB;AAClB,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,SAAS,oBAAoB,IAAI,MAAM;AAC7C,MAAI,CAAC,OAAQ,QAAO,oBAAI,IAAiB;AACzC,MAAI,QAAQ,aAAa;AACvB,WAAO,IAAI,IAAI,OAAO,WAAW;AAAA,EACnC;AACA,SAAO,IAAI,IAAI,OAAO,WAAW;AACnC;AAXgB;;;AC6DT,IAAM,iDAAiD;AA0SvD,SAAS,wBACd,QACS;AACT,SAAO;AACT;AAJgB;AAqFhB,IAAM,yCAAyC,uBAAO;AAAA,EACpD;AACF;AACA,IAAM,gCAAgC,uBAAO,IAAI,wCAAwC;AAGlF,SAAS,sCAAsC,QAAyC;AAC7F,QAAM,QAAS,OACb,sCACF;AACA,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AALgB;AAQT,SAAS,8BACd,QACkD;AAClD,QAAM,QAAS,OAAgD,6BAA6B;AAC5F,SAAO,SAAS,OAAO,UAAU,WAC5B,QACD;AACN;AAPgB;AAiChB,SAAS,4BASP,QACA,MACA,OACuF;AACvF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,YAAY,MAAM;AAAA,IAClB,OAAO,sCAAsC,KAAK;AAAA,IAClD,SAAS,MAAM;AAAA,IACf,aAAa,8BAA0E;AAAA,MACrF;AAAA,MACA;AAAA,MACA,YAAY,MAAM;AAAA,MAClB,gBAAgB,MAAM;AAAA,MACtB,SAAS,MAAM;AAAA,MACf,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAjCS;AAiJT,SAAS,gCAEiC;AACxC,SAAO;AAAA,IACL,IACE,MACA,OACA;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAME,MAAa,OAAwE;AACrF,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,UACE,YAAY;AAAA,UACZ,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAME,MAAa,OAAwE;AACrF,aAAO,4BAQL,SAAS,MAAM;AAAA,QACf,YAAY;AAAA,QACZ,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACA,IAME,MAAa,OAAwE;AACrF,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,UACE,YAAY;AAAA,UACZ,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAME,MAAa,OAAwE;AACrF,aAAO,4BAQL,SAAS,MAAM;AAAA,QACf,YAAY;AAAA,QACZ,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACA,OAME,MAAa,OAAwE;AACrF,aAAO,4BAQL,UAAU,MAAM;AAAA,QAChB,YAAY;AAAA,QACZ,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACA,QAME,MACA,OACA;AACA,aAAO,4BAQL,WAAW,MAAM,KAAK;AAAA,IAC1B;AAAA,IACA,KAME,MACA,OACA;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA7IS;AA+IF,SAAS,uBAEd,SAAyD;AACzD,SAAO,8BAAuC;AAChD;AAJgB;AAMT,IAAM,mBAAmB,8BAAyC;AASzE,IAAM,mCAAmC,uBAAO,IAAI,iCAAiC;AACrF,IAAM,qCAAqC,uBAAO,IAAI,mCAAmC;AAazF,SAAS,gCAAgC;AACvC,QAAM,cAAc;AACpB,MAAI,CAAC,YAAY,gCAAgC,GAAG;AAClD,gBAAY,gCAAgC,IAAI,oBAAI,IAA0C;AAAA,EAChG;AAEA,SAAO,YAAY,gCAAgC;AACrD;AAPS;AA8JT,SAAS,2BAA2B,OAA+C;AACjF,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,OAAQ,MAA6B,SAAS,YAC9C,OAAQ,MAAgC,YAAY;AAExD;AAPS;AAST,SAAS,4BACP,WACwB;AACxB,MAAI,CAAC,WAAW;AACd,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,WAAO,UAAU,QAAQ,CAAC,aAAa,4BAA4B,QAAQ,CAAC;AAAA,EAC9E;AAEA,MAAI,2BAA2B,SAAS,GAAG;AACzC,WAAO,CAAC,SAAS;AAAA,EACnB;AAEA,MAAI,OAAO,cAAc,UAAU;AACjC,WAAO,OAAO,OAAO,SAAS,EAAE,QAAQ,CAAC,aAAa,4BAA4B,QAAQ,CAAC;AAAA,EAC7F;AAEA,SAAO,CAAC;AACV;AApBS;AA8BF,SAAS,kBAKd,aAE2C;AAC3C,QAAM,WAAW,YAAY,YAAY,YAAY;AAErD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,MAAI,YAAY,YAAY,YAAY,QAAQ,YAAY,aAAa,YAAY,MAAM;AACzF,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AAEA,QAAM,eAAe,uBAAuB,YAAY,MAAM;AAC9D,QAAM,SACJ,OAAO,YAAY,WAAW,aAC1B,YAAY,OAAO;AAAA,IACjB,OAAO;AAAA,IACP,kBAAkB;AAAA,EACpB,CAAC,IACD,YAAY;AAClB,QAAM,YACJ,OAAO,YAAY,cAAc,aAC7B,YAAY,UAAU;AAAA,IACpB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,kBAAkB;AAAA,EACpB,CAAC,IACD,YAAY;AAClB,QAAM,iBAAiB,4BAA4B,SAAS;AAC5D,QAAM,YACJ,QAAQ,UAAU,eAAe,SAC5B,CAAC,GAAI,UAAU,CAAC,GAAI,GAAG,cAAc,IACtC;AAEN,aAAW,SAAS,aAAa,CAAC,GAAG;AACnC,gCAA4B,MAAM,MAAM,KAAK;AAC7C,8BAA0B,MAAM,MAAM,sBAAsB,MAAM,IAAI,GAAG;AACzE,2BAAuB,MAAM,MAAM,KAAK;AAAA,EAC1C;AAEA,QAAM,aACJ,YAAY,QACX,WAAW,SACR,IAAe;AAAA,IACb;AAAA,EAIF,IACA;AAEN,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,IACH;AAAA,IACA,QAAQ;AAAA,IACR,KAAK;AAAA,IACL;AAAA,IACA,MAAM;AAAA,EACR;AACF;AAlEgB;AAoET,SAAS,kBAAkB,OAA0C;AAC1E,SACE,CAAC,CAAC,SAAS,OAAO,UAAU,YAAa,MAA0B,SAAS;AAEhF;AAJgB;AAMT,SAAS,0BACd,cACc;AACd,MAAI,CAAC,cAAc;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAwB,CAAC;AAC/B,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC7D,QAAI,CAAC,eAAe,CAAC,kBAAkB,WAAW,GAAG;AACnD;AAAA,IACF;AAEA,UAAM,QAAQ,6BAA6B,KAAK,aAAa,WAAW;AACxE,YAAQ,KAAK,2BAA2B,wBAAwB,KAAK,WAAW,GAAG,KAAK,CAAC;AACzF,YAAQ,KAAK,GAAG,sCAAsC,KAAK,WAAW,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAnBgB;AAqBhB,SAAS,sCACP,KACA,aACc;AACd,QAAM,gBAAgB,YAAY;AAClC,MAAI,CAAC,cAAe,QAAO,CAAC;AAC5B,MAAI,CAAC,MAAM,QAAQ,aAAa,GAAG;AACjC,UAAM,IAAI,UAAU,gBAAgB,GAAG,4BAA4B;AAAA,EACrE;AAEA,QAAM,QAAQ,oBAAI,IAAY;AAC9B,SAAO,cAAc,IAAI,CAAC,QAAQ,UAAU;AAC1C,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,OAAO,OAAO,SAAS,UAAU;AAC5E,YAAM,IAAI,UAAU,gBAAgB,GAAG,qBAAqB,KAAK,aAAa;AAAA,IAChF;AACA,UAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,UAAU,gBAAgB,GAAG,qBAAqB,KAAK,kBAAkB;AAAA,IACrF;AACA,QAAI,MAAM,IAAI,IAAI,GAAG;AACnB,YAAM,IAAI,MAAM,gBAAgB,GAAG,wCAAwC,IAAI,GAAG;AAAA,IACpF;AACA,UAAM,IAAI,IAAI;AAEd,WAAO;AAAA,MACL;AAAA,MACA,6BAA6B,KAAK,aAAa,cAAc;AAAA,MAC7D,+BAA+B,KAAK,WAAW;AAAA,IACjD;AAAA,EACF,CAAC;AACH;AA9BS;AAgCT,SAAS,6BACP,KACA,aACA,QACsC;AACtC,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,UAAU,YAAY;AAAA,IACtB,MAAM,YAAY;AAAA,IAClB;AAAA,IACA,eAAe,YAAY,kBAAkB;AAAA,EAC/C,CAAC;AACH;AAZS;AAcT,SAAS,+BACP,KACA,aACwC;AACxC,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,UAAU,YAAY;AAAA,IACtB,MAAM,YAAY;AAAA,IAClB,UAAU,YAAY;AAAA,IACtB,eAAe,YAAY,kBAAkB;AAAA,EAC/C,CAAC;AACH;AAXS;AAaT,SAAS,2BACP,QACA,OACA,aACY;AACZ,QAAM,cAAc,OAAO,0BAA0B,MAAM;AAC3D,UAAQ,eAAe,aAAa,6BAA6B;AACjE,UAAQ,eAAe,aAAa,sCAAsC;AAC1E,QAAM,cAAc,OAAO,OAAO,OAAO,eAAe,MAAM,GAAG,WAAW;AAC5E,SAAO,eAAe,aAAa,+BAA+B,EAAE,OAAO,MAAM,CAAC;AAClF,SAAO,eAAe,aAAa,wCAAwC;AAAA,IACzE,OAAO,MAAM;AAAA,EACf,CAAC;AACD,MAAI,aAAa;AACf,oCAAgC,aAAa,WAAW;AAAA,EAC1D;AACA,SAAO;AACT;AAjBS;AAmBF,SAAS,wBACd,cAC2B;AAC3B,MAAI,CAAC,cAAc;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAuC,CAAC;AAC9C,aAAW,eAAe,OAAO,OAAO,YAAY,GAAG;AACrD,QAAI,CAAC,eAAe,CAAC,kBAAkB,WAAW,KAAK,CAAC,YAAY,WAAW,QAAQ;AACrF;AAAA,IACF;AAEA,eAAW,YAAY,YAAY,WAAW;AAC5C,gBAAU,KAAK;AAAA,QACb,MAAM,SAAS;AAAA,QACf,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,2BAA2B,SAAS;AAAA,QACpC,WAAW,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAzBgB;AA2BT,SAAS,4CACd,OACoD;AACpD,SAAO;AAAA,IACL,SACA,OAAO,UAAU,YACjB,YAAY,SACZ,OAAO,MAAM,WAAW,YACxB,MAAM,OAAO,SAAS;AAAA,EACxB;AACF;AAVgB;AAYT,SAAS,yCACd,cACU;AACV,MAAI,CAAC,cAAc;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAqB,CAAC;AAC5B,aAAW,eAAe,OAAO,OAAO,YAAY,GAAG;AACrD,QACE,CAAC,eACD,CAAC,kBAAkB,WAAW,KAC9B,CAAC,YAAY,qBAAqB,QAClC;AACA;AAAA,IACF;AAEA,eAAW,cAAc,YAAY,qBAAqB;AACxD,YAAM,QAAQ,MAAM,QAAQ,WAAW,OAAO,IAAI,WAAW,UAAU,CAAC,WAAW,OAAO;AAE1F,iBAAW,QAAQ,OAAO;AACxB,iBAAS,KAAK,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AA3BgB;AA6BT,SAAS,sBACd,cACuC;AACvC,MAAI,CAAC,cAAc;AACjB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,gBAAgB,OAAO,QAAQ,YAAY,EAC9C,IAAI,CAAC,CAAC,KAAK,WAAW,MAAM;AAC3B,UAAM,SAAS,eAAe,kBAAkB,WAAW,IAAI,YAAY,SAAS;AACpF,WAAO,SAAU,CAAC,KAAK,MAAM,IAAc;AAAA,EAC7C,CAAC,EACA,OAAO,CAAC,UAA6D,UAAU,IAAI;AAEtF,SAAO,OAAO,YAAY,aAAa;AACzC;AAfgB;AAiBT,SAAS,gCACd,KAC0C;AAC1C,SAAO,8BAA8B,EAAE,IAAI,GAAG;AAChD;AAJgB;AAMT,SAAS,4BAA6D;AAC3E,SAAO,OAAO;AAAA,IACZ,MAAM,KAAK,8BAA8B,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM;AAAA,MAC5E;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAPgB;AAST,SAAS,kCAAyE;AACvF,SAAO,sBAAsB,0BAA0B,CAAC;AAC1D;AAFgB;AAIT,SAAS,sBACd,cACA,OAYO;AACP,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC7D,QAAI,CAAC,eAAe,CAAC,kBAAkB,WAAW,GAAG;AACnD;AAAA,IACF;AAEA,UAAM,SAAS,2BAA2B,YAAY,UAAU,CAAC,CAAC;AAElE,eAAW,SAAS,QAAQ;AAC1B,UAAI,CAAC,cAAc,MAAM,SAAS,MAAM,MAAM,GAAG;AAC/C;AAAA,MACF;AAEA,YAAM,SAAS,kBAAkB,MAAM,MAAM,MAAM,QAAQ;AAC3D,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,OAAO;AAAA,UACL,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAjDgB;AAmDT,SAAS,gCAAgC,OAQvC;AACP,SAAO,sBAAsB,0BAA0B,GAAG,KAAK;AACjE;AAVgB;AAYhB,SAAS,+BACPA,MACgC;AAChC,MAAI,CAACA,MAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQA,IAA8B,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACnF,QACE,SACA,OAAO,UAAU,YAChB,MAA+D,SAC9D,kCACF;AACA,YAAM,YAAY;AAClB,aAAO;AAAA,QACL;AAAA,QACA,8BAA8B;AAAA,UAC5B,MAAM,UAAU;AAAA,UAChB,QAAQ,UAAU;AAAA,UAClB,YAAY,UAAU;AAAA,UACtB,gBAAgB,UAAU;AAAA,UAC1B,aAAa,UAAU;AAAA,UACvB,UAAU,UAAU;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,aAAO,CAAC,KAAK,+BAA+B,KAA2B,CAAC;AAAA,IAC1E;AAEA,WAAO,CAAC,KAAK,KAAK;AAAA,EACpB,CAAC;AAED,SAAO,OAAO,YAAY,OAAO;AACnC;AApCS;AAsCF,SAAS,sCAA0E;AACxF,QAAM,kBAAkB,OAAO,QAAQ,0BAA0B,CAAC,EAC/D,IAAI,CAAC,CAAC,KAAK,WAAW,MAAM;AAC3B,UAAMA,OAAM,+BAA+B,YAAY,GAAG;AAC1D,WAAOA,OAAO,CAAC,KAAKA,IAAG,IAAc;AAAA,EACvC,CAAC,EACA,OAAO,CAAC,UAA0D,UAAU,IAAI;AAEnF,SAAO,OAAO,YAAY,eAAe;AAC3C;AATgB;AAahB,SAAS,2BAA+D;AACtE,SAAO,OAAO,YAAY,cAAc,QAAQ,MAAM,CAAC;AACzD;AAFS;AAIT,SAAS,8BACP,OACmD;AACnD,SACE,CAAC,CAAC,SACF,OAAO,UAAU,aAChB,YAAY,SACX,SAAS,SACT,cAAc,SACd,WAAW,SACX,aAAa;AAEnB;AAZS;AAcT,SAAS,4BAA4B,SAAkB,MAAwB;AAC7E,MAAI,SAAS,QAAW;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,+BAA+B,OAAO,KAAK,+BAA+B,IAAI,GAAG;AACnF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AACT;AAbS;AAeT,SAAS,+BAA+B,OAAkD;AACxF,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAFS;AAIT,eAAe,6BACb,OACA,SAC6B;AAC7B,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAQ,MAA0E,OAAO;AAAA,EAC3F;AAEA,SAAO;AACT;AATe;AAWf,SAAS,4BACP,KACoC;AACpC,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,yBAAyB;AAC5C,QAAM,SAAiC,CAAC;AAExC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,UAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACtD,UAAM,QAAQ,SAAS,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,UAAU,MAAS;AAC1F,QAAI,UAAU,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAnBS;AAqBT,eAAe,6BACb,aACA,QACA,OACkB;AAClB,QAAM,SAAS,OAAO,kBAAkB,OAAO;AAC/C,MAAI,QAAQ;AACV,UAAM,SAAS,MAAM,OAAO,KAAK,QAAQ,KAAK;AAC9C,QAAI,OAAO,SAAS;AAClB,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,uCAAuC,aAAa,OAAO,KAAK;AAAA,EACxE;AAEA,MAAI,OAAO,WAAW,GAAG,UAAU;AACjC,UAAM,SAAS,MAAM,OAAO,WAAW,EAAE,SAAS,KAAK;AACvD,QAAI,WAAW,QAAQ;AACrB,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,uCAAuC,aAAa;AAAA,MACxD,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI;AACF,aAAO,MAAM,OAAO,MAAM,KAAK;AAAA,IACjC,SAAS,OAAO;AACd,YAAM;AAAA,QACJ;AAAA,QACA,oCAAoC,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,gBAAgB,YAAY,IAAI;AAAA,EAClC;AACF;AAxCe;AA0Cf,SAAS,uCACP,aACA,OACA;AACA,QAAM,SACJ,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,IACjD,MAAM,OACH,IAAI,CAAC,UAAU;AACd,UAAM,iBAAiB,mCAAmC,MAAM,IAAI;AACpE,UAAM,OAAO,eAAe,SAAS,GAAG,eAAe,KAAK,GAAG,CAAC,OAAO;AACvE,WAAO,GAAG,IAAI,GAAG,MAAM,WAAW,gBAAgB;AAAA,EACpD,CAAC,EACA,KAAK,IAAI,IACZ,MAAM,WAAW;AAEvB,SAAO,IAAI,MAAM,gBAAgB,YAAY,IAAI,+BAA+B,MAAM,EAAE;AAC1F;AAhBS;AAkBT,eAAe,yBACb,aACA,SACkB;AAClB,QAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,8BAA8B,MAAM,GAAG;AAC1C,WAAO,6BAA6B,aAAa,QAAQ,CAAC,CAAC;AAAA,EAC7D;AAEA,MAAI,QAAiB,CAAC;AACtB,UAAQ;AAAA,IACN;AAAA,IACA,MAAM,6BAA6B,OAAO,UAAU,OAAO;AAAA,EAC7D;AACA,UAAQ,4BAA4B,OAAO,4BAA4B,OAAO,GAAG,CAAC;AAClF,UAAQ;AAAA,IACN;AAAA,IACA,MAAM,6BAA6B,OAAO,OAAO,OAAO;AAAA,EAC1D;AACA,UAAQ,4BAA4B,OAAO,MAAM,OAAO,UAAU,OAAO,CAAC;AAE1E,SAAO,OAAO,SACV,6BAA6B,aAAa,OAAO,QAAQ,KAAK,IAC7D;AACP;AA5Be;AA8Bf,SAAS,iCACP,aACA,OACgC;AAChC,QAAM,QAAQ,wBACZ,OACA,SACA,SACG;AACH,QAAI,CAAC,YAAY,KAAK;AACpB;AAAA,IACF;AAEA,SAAK,QAAQ;AAAA,MACX,YAAY,IAAI;AAAA,QACd,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,oBAAI,IAAI;AAAA,MACnB,CAAC;AAAA,IACH,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAClB,GArBc;AAuBd,SAAO;AAAA,IACL,KAAK,SAAS,MAAM;AAClB,YAAM,QAAQ,SAAS,IAAI;AAAA,IAC7B;AAAA,IACA,KAAK,SAAS,MAAM;AAClB,YAAM,QAAQ,SAAS,IAAI;AAAA,IAC7B;AAAA,IACA,MAAM,SAAS,MAAM;AACnB,YAAM,SAAS,SAAS,IAAI;AAAA,IAC9B;AAAA,EACF;AACF;AAtCS;AAwCT,eAAe,mBACb,aACA,OACe;AACf,MAAI;AACF,UAAM,YAAY,MAAM,KAAK;AAAA,EAC/B,QAAQ;AAAA,EAGR;AACF;AAVe;AAYf,IAAM,0BAA0B;AAChC,IAAM,qCAAqC,KAAK;AAChD,IAAM,gCAAgC,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAEvF,SAAS,sBAAsB,OAA8C;AAC3E,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAFS;AAIT,SAAS,6BAA6B,OAAkD;AACtF,MAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,SAAO,cAAc,OAAO,aAAa,cAAc;AACzD;AAPS;AAST,SAAS,6BAA6B,OAAyB;AAC7D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,6BAA6B,IAAI,CAAC;AAAA,EAC/D;AAEA,MAAI,CAAC,6BAA6B,KAAK,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,YAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,8BAA8B,IAAI,GAAG,GAAG;AAC1C;AAAA,IACF;AAEA,cAAU,GAAG,IAAI,6BAA6B,IAAI;AAAA,EACpD;AAEA,SAAO;AACT;AAnBS;AAqBT,SAAS,yBAAyB,OAA6D;AAC7F,MAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAY,6BAA6B,KAAK;AACpD,SAAO,sBAAsB,SAAS,IAAI,YAAY,CAAC;AACzD;AAPS;AAST,SAAS,mCAAmC,OAAuB;AACjE,SAAO,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE;AACzC;AAFS;AAIT,SAAS,2BAA2B,SAAuC;AACzE,QAAM,MAAM,QAAQ,QAAQ,IAAI,uBAAuB;AACvD,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,mCAAmC,GAAG,IAAI,oCAAoC;AAChF,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,WAAO,yBAAyB,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAhBS;AAkBT,SAAS,uBAAuB,SAAkB,MAAiD;AACjG,SAAO;AAAA,IACL,GAAG,2BAA2B,OAAO;AAAA,IACrC,GAAG,yBAAyB,IAAI;AAAA,EAClC;AACF;AALS;AAOT,SAAS,wBAAwB,gBAAwB,aAA0C;AACjG,QAAM,SAAS,2BAA2B,YAAY,UAAU,CAAC,CAAC;AAClE,QAAM,aAAa,CAAC,GAAI,YAAY,cAAc,CAAC,CAAE;AACrD,QAAM,mBAAkD,CAAC;AACzD,MAAI;AAEJ,QAAM,aAAa,mCAAY;AAC7B,UAAM,YAAY,iBAAiB,OAAO,CAAC,EAAE,QAAQ;AACrD,eAAW,YAAY,WAAW;AAChC,YAAM,SAAS;AAAA,IACjB;AAAA,EACF,GALmB;AAOnB,QAAM,yBAAyB,8BAC7B,SACA,OACA,UAA+B,CAAC,MACa;AAC7C,UAAM,OAAO,2BAA2B;AAAA,MACtC;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,UAAM,gBAA8C;AAAA,MAClD,KAAK;AAAA,MACL;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,KAAK,yBAAyB;AAAA,MAC9B,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB;AACA,4DAA6B,yBAAyB,aAAa,aAAa;AAEhF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,mBAAmB,MAAM;AAAA,MACzB,KAAK,iCAAiC,aAAa,KAAK;AAAA,MACxD,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ,UAAU;AACtB,YAAI,UAAU;AACZ,2BAAiB,KAAK,QAAQ;AAC9B;AAAA,QACF;AAEA,cAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAnC+B;AAqC/B,QAAM,SAAqB;AAAA,IACzB,MAAM,oBAAoB,YAAY,QAAQ,IAAI,YAAY,IAAI;AAAA,IAClE,SAAS;AAAA,IAET,MAAM,KAAK,SAAS;AAClB,oCAA8B,EAAE,IAAI,gBAAgB;AAAA,QAClD;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,YAAM,uBAAuB,SAAS,UAAU;AAEhD,UAAI,YAAY,UAAU;AACxB,cAAM,YAAY,SAAS,MAAM,uBAAuB,SAAS,UAAU,CAAC;AAAA,MAC9E;AAEA,UAAI,YAAY,OAAO;AACrB,cAAM,YAAY,MAAM,MAAM,uBAAuB,SAAS,OAAO,CAAC;AAAA,MACxE;AAEA,UAAI,CAAC,YAAY,KAAK;AACpB;AAAA,MACF;AAEA,iBAAW,SAAS,QAAQ;AAC1B,cAAM,mBAAmB,aAAa;AAAA,UACpC,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA,SAAS,oBAAI,IAAI;AAAA,QACnB,CAAC;AAAA,MACH;AAEA,iBAAW,SAAS,YAAY;AAC9B,cAAM,mBAAmB,aAAa;AAAA,UACpC,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA,SAAS,oBAAI,IAAI;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,SAAS;AACnB,UAAI,YAAY,OAAO;AACrB,cAAM,YAAY,MAAM,MAAM,uBAAuB,SAAS,OAAO,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,SAAS,SAAS;AAC/B,UAAI;AACF,YAAI,YAAY,SAAS;AACvB,gBAAM,YAAY;AAAA,YAChB,MAAM,uBAAuB,SAAS,WAAW;AAAA,cAC/C,QAAQ,QAAQ;AAAA,YAClB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,UAAE;AACA,cAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,MAAM,cAAc,KAAK,KAAK,SAAS;AACrC,YAAM,UAAU,UAAU,IAAI,QAAQ,QAAQ,WAAW,GAAG,IAAI,OAAO,GAAG;AAC1E,YAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,YAAM,WAAW,IAAI;AACrB,YAAM,YAAY,aAAa,GAAG;AAClC,UAAI,aAAa;AACjB,UAAI;AAEJ,YAAM,iBAAiB,mCAAY;AACjC,YAAI,CAAC,YAAY;AACf,uBAAa;AACb,cAAI,IAAI,UAAU,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AAC/D,0BAAc,MAAM;AAAA,cAClB;AAAA,cACA,wBAAwB,QAAQ,OAAO,MAAM,EAAE;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,MACT,GAZuB;AAcvB,YAAM,uBAAuB,mCAAqC;AAChE,YAAI;AACF,iBAAO,iBAAiB,KAAK,SAAS,MAAM,eAAe,CAAC;AAAA,QAC9D,SAAS,OAAO;AACd,gBAAM,WAAW,mCAAmC,KAAK;AACzD,cAAI,CAAC,SAAU,OAAM;AACrB,gBAAM,gBAAgB,KAAK,QAAQ;AACnC,iBAAO;AAAA,QACT;AAAA,MACF,GAT6B;AAW7B,iBAAW,SAAS,YAAY;AAC9B,cAAM,SAAS,qBAAqB,MAAM,SAAS,QAAQ;AAC3D,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,qBAAqB;AAC3C,YAAI,CAAC,QAAS;AACd,cAAM,iBAAiB,gCAAgC;AAAA,UACrD;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AACD,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,mBAAmB,aAAa;AAAA,UACpC,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AAED,YAAI;AACF,gBAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,cAAc;AAC5D,cAAI,UAAU;AACZ,kBAAM,gBAAgB,KAAK,QAAQ;AACnC,kBAAM,mBAAmB,aAAa;AAAA,cACpC,UAAU,YAAY;AAAA,cACtB,MAAM,YAAY;AAAA,cAClB,MAAM,YAAY;AAAA,cAClB,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,gBACpC,SAAS,CAAC,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,SAAS,eAAe,IAAI,SAAS;AAAA,YACvC,CAAC;AACD;AAAA,UACF;AAEA,gBAAM,mBAAmB,aAAa;AAAA,YACpC,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,cACpC,SAAS,CAAC,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,mBAAmB,aAAa;AAAA,YACpC,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,cACpC,SAAS,CAAC,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB;AAAA,YACA,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAEA,iBAAW,SAAS,QAAQ;AAC1B,cAAM,SAAS,cAAc,MAAM,SAAS,IAAI,MAAM,IAClD,kBAAkB,MAAM,MAAM,QAAQ,IACtC;AACJ,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,qBAAqB;AAC3C,YAAI,CAAC,QAAS;AACd,cAAM,iBAAiB,gCAAgC;AAAA,UACrD;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AACD,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,mBAAmB,aAAa;AAAA,UACpC,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AAED,YAAI;AACF,gBAAM,aAAa,MAAM,8BAA8B,OAAO,SAAS,GAAG;AAC1E,cAAI,CAAC,WAAW,SAAS;AACvB,kBAAM,gBAAgB,KAAK,WAAW,QAAQ;AAC9C,kBAAM,mBAAmB,aAAa;AAAA,cACpC,UAAU,YAAY;AAAA,cACtB,MAAM,YAAY;AAAA,cAClB,MAAM,YAAY;AAAA,cAClB,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,MAAM;AAAA,gBACZ,SAAS,MAAM;AAAA,cACjB;AAAA,cACA;AAAA,cACA,UAAU,WAAW;AAAA,cACrB;AAAA,cACA,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,SAAS,eAAe,IAAI,SAAS;AAAA,YACvC,CAAC;AACD;AAAA,UACF;AACA,yBAAe,QAAQ,WAAW;AAElC,qBAAW,mBAAmB,MAAM,cAAc,CAAC,GAAG;AACpD,kBAAM,qBAAqB,MAAM,gBAAgB,QAAQ,SAAS,cAAc;AAChF,gBAAI,oBAAoB;AACtB,oBAAM,gBAAgB,KAAK,kBAAkB;AAC7C,oBAAM,mBAAmB,aAAa;AAAA,gBACpC,UAAU,YAAY;AAAA,gBACtB,MAAM,YAAY;AAAA,gBAClB,MAAM,YAAY;AAAA,gBAClB,OAAO;AAAA,gBACP,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,MAAM,MAAM;AAAA,kBACZ,SAAS,MAAM;AAAA,gBACjB;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV;AAAA,gBACA,YAAY,KAAK,IAAI,IAAI;AAAA,gBACzB,SAAS,eAAe,IAAI,SAAS;AAAA,cACvC,CAAC;AACD;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,iBAAiB,MAAM;AAAA,YAC3B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,gBAAgB;AAClB,kBAAMC,YAAW,MAAM;AAAA,cACrB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,kBAAM,gBAAgB,KAAKA,SAAQ;AACnC,kBAAM,mBAAmB,aAAa;AAAA,cACpC,UAAU,YAAY;AAAA,cACtB,MAAM,YAAY;AAAA,cAClB,MAAM,YAAY;AAAA,cAClB,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,MAAM,MAAM;AAAA,gBACZ,SAAS,MAAM;AAAA,cACjB;AAAA,cACA;AAAA,cACA,UAAAA;AAAA,cACA;AAAA,cACA,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,SAAS,eAAe,IAAI,SAAS;AAAA,YACvC,CAAC;AACD;AAAA,UACF;AAEA,gBAAM,kBAAkB,MAAM,MAAM,QAAQ,SAAS,cAAc;AACnE,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,gBAAM,gBAAgB,KAAK,QAAQ;AACnC,gBAAM,mBAAmB,aAAa;AAAA,YACpC,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,MAAM;AAAA,cACZ,SAAS,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,mBAAmB,aAAa;AAAA,YACpC,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,MAAM;AAAA,cACZ,SAAS,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB;AAAA,YACA,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,eAAe,QAAQ,wCAAwC;AAAA,IACpE,OAAO,YAAY,kBAAkB;AAAA,EACvC,CAAC;AAED,SAAO;AACT;AA9aS;AAgbT,SAAS,gCAAgC,OASP;AAChC,QAAM,MAAM;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,KAAK,IAAI,IAAI,MAAM,QAAQ,GAAG;AAAA,IAC9B,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,QAAQ;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,OAAO,CAAC;AAAA,IACR,MAAM,2BAA2B;AAAA,MAC/B,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM,cAAc;AAAA,IAC9B,CAAC;AAAA,IACD,MAAM,uBAAuB,MAAM,OAAO;AAAA,IAC1C,aAAa;AAAA,MACX,UAAU,MAAM,YAAY;AAAA,MAC5B,MAAM,MAAM,YAAY;AAAA,MACxB,MAAM,MAAM,YAAY;AAAA,MACxB,UAAU,MAAM,YAAY;AAAA,IAC9B;AAAA,IACA,OAAO,MAAM;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,IAChB,QAAQ,MAAM,cAAc;AAAA,IAC5B,OAAO,MAAM,cAAc;AAAA,IAC3B,QAAQ,MAAM,cAAc;AAAA,EAC9B;AACF;AA1CS;AAiDT,SAAS,2BACP,QAC8B;AAC9B,SAAO,OACJ,IAAI,CAAC,OAAO,UAAU;AAErB,gCAA4B,MAAM,MAAM,KAAK;AAC7C,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,iCAAiC,KAAK;AAAA,QAC/C,OAAO,sCAAsC,KAAK;AAAA,MACpD;AAAA,MACA,aAAa,2BAA2B,MAAM,MAAM,KAAK;AAAA,IAC3D;AAAA,EACF,CAAC,EACA;AAAA,IACC,CAAC,MAAM,UACL,wBAAwB,KAAK,aAAa,MAAM,WAAW,KAAK,KAAK,QAAQ,MAAM;AAAA,EACvF,EACC,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK;AAC7B;AAtBS;AAwBT,SAAS,iCAAiC,OAAyD;AACjG,QAAM,QACJ,MAAM,WAAW,MAAM,QAAQ,SAAS,IACpC,CAAC,GAAG,MAAM,OAAO,IACjB,MAAM,SACJ,CAAC,MAAM,MAAM,IACb,CAAC,KAAK;AAEd,SAAO,MAAM,IAAI,CAAC,WAAW,OAAO,MAAM,EAAE,YAAY,CAAC;AAC3D;AATS;AAWT,SAAS,sCACP,OAC6D;AAC7D,QAAM,QAAyD;AAAA,IAC7D,GAAG,MAAM;AAAA,EACX;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,OAAO,MAAM;AAAA,EACrB;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,MAAM;AAAA,EACtB;AAEA,SAAO,MAAM,QAAQ,MAAM,QAAQ,QAAQ;AAC7C;AAhBS;AA4BT,eAAe,8BACb,OACA,SACA,KACgD;AAChD,MAAI,QAAQ,OAAO,YAAY,MAAM,WAAW,CAAC,QAAQ,QAAQ,IAAI,cAAc,GAAG;AACpF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,SAAS;AAAA,QACjB;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,SAAS,QAAQ,CAAC,SAAS,OAAO;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,QAAmC,CAAC;AAC1C,QAAM,SAA2C,CAAC;AAElD,MAAI,QAAQ,OAAO;AACjB,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA,QAAQ;AAAA,MACR,iBAAiB,IAAI,YAAY;AAAA,IACnC;AACA,QAAI,YAAY,SAAS;AACvB,YAAM,QAAQ,YAAY;AAAA,IAC5B,OAAO;AACL,aAAO,KAAK,GAAG,YAAY,MAAM;AAAA,IACnC;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM;AAChB,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA,8BAA8B,KAAK;AAAA,IACrC;AAEA,QAAI,UAAU,SAAS;AACrB,YAAM,aAAa,MAAM,4BAA4B,QAAQ,QAAQ,MAAM,UAAU,IAAI;AACzF,UAAI,WAAW,SAAS;AACtB,cAAM,OAAO,WAAW;AAAA,MAC1B,OAAO;AACL,eAAO,KAAK,GAAG,WAAW,MAAM;AAAA,MAClC;AAAA,IACF,OAAO;AACL,aAAO,KAAK,UAAU,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,oCAAoC,MAAM;AAAA,IACtD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAvEe;AAyEf,eAAe,4BACb,QACA,QACA,OAUA;AACA,QAAM,SAAS,OAAO,kBAAkB,OAAO;AAC/C,MAAI,QAAQ;AACV,UAAM,SAAS,MAAM,OAAO,KAAK,QAAQ,KAAK;AAC9C,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,qCAAqC,QAAQ,OAAO,KAAK;AAAA,IACnE;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,GAAG,UAAU;AACjC,UAAM,SAAS,MAAM,OAAO,WAAW,EAAE,SAAS,KAAK;AACvD,QAAI,WAAW,QAAQ;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,qCAAqC,QAAQ;AAAA,QACnD,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,OAAO,OAAO;AAChB,QAAI;AACF,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,MAAM,OAAO,MAAM,KAAK;AAAA,MAChC;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,UACN;AAAA,UACA,oCAAoC,KAAK;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,MACN;AAAA,QACE;AAAA,QACA,SACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AA1Ee;AA4Ef,SAAS,oCAAoC,QAAmD;AAC9F,SAAO,SAAS;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAVS;AAYT,SAAS,qCACP,QACA,OACkC;AAClC,MAAI,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,GAAG;AAC1D,WAAO,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,MAClC;AAAA,MACA,MAAM,mCAAmC,MAAM,IAAI;AAAA,MACnD,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,WAAW;AAAA,IAC5B,EAAE;AAAA,EACJ;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,MAAM,CAAC;AAAA,MACP,SAAS,MAAM,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AApBS;AAsBT,SAAS,mCACP,MACqB;AACrB,UAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,YAAY;AACnC,UAAM,MACJ,OAAO,YAAY,YAAY,YAAY,QAAQ,SAAS,UAAU,QAAQ,MAAM;AACtF,WAAO,OAAO,QAAQ,WAAW,IAAI,eAAe,IAAI,SAAS,IAAI;AAAA,EACvE,CAAC;AACH;AARS;AAUT,SAAS,oCAAoC,OAAoD;AAC/F,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe;AAAA,EACnF;AACF;AARS;AAUT,eAAe,8BACb,SACA,QAUA;AACA,MAAI,QAAQ,WAAW,SAAS,QAAQ,WAAW,UAAU,WAAW,QAAQ;AAC9E,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI;AACF,QAAI,WAAW,QAAQ;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,gBAAgB,MAAM,QAAQ,MAAM,EAAE,SAAS,CAAC;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,QAAQ,MAAM,EAAE,KAAK;AACxC,QAAI,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,KAAK,MAAM,IAAI;AAAA,IACvB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,SACE,WAAW,SACP,wCACA,iBAAiB,SAAS,MAAM,UAC9B,MAAM,UACN;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAvDe;AAyDf,SAAS,8BAA8B,OAAmC;AACxE,SAAO,MAAM,cAAc,MAAM,aAAa,cAAc;AAC9D;AAFS;AAIT,SAAS,2BAA2B,OAGP;AAC3B,MAAI;AACJ,MAAI;AAEJ,QAAM,YAAY,6BAAM;AACtB,sCAAkB,OAAO,eAAW,EAAE;AAAA,MAAK,CAAC,EAAE,4BAA4B,MACxE,4BAA4B,MAAM,OAAO,OAAO;AAAA,IAClD;AACA,WAAO;AAAA,EACT,GALkB;AAOlB,QAAM,SAAS,6BAAM;AACnB,QAAI,CAAC,MAAM,YAAY,QAAQ;AAC7B,YAAM,IAAI;AAAA,QACR,gBAAgB,MAAM,YAAY,IAAI;AAAA,MACxC;AAAA,IACF;AAEA,gCAAe,OAAO,gCAAmB,EAAE;AAAA,MAAK,CAAC,EAAE,qBAAqB,MACtE,qBAAqB;AAAA,QACnB,QAAQ,MAAM,YAAY;AAAA,QAC1B,QAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT,GAde;AAgBf,SAAO;AAAA,IACL,IAAI,+BAA+B,MAAM;AAAA,IACzC,OAAO;AAAA,IACP,SAAS;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAtCS;AAwCT,SAAS,+BAA+B,YAAoC;AAC1E,QAAM,kBAAkB,oBAAI,IAA0B;AAEtD,SAAO,IAAI;AAAA,IACT,CAAC;AAAA,IACD;AAAA,MACE,IAAI,SAAS,MAAM;AACjB,YAAI,SAAS,QAAQ;AACnB,iBAAO;AAAA,QACT;AAEA,YAAI,SAAS,iBAAiB,SAAS,SAAS;AAC9C,iBAAO,UAAU,SAAoB;AACnC,kBAAM,MAAO,MAAM,WAAW;AAC9B,kBAAM,SAAS,IAAI,IAAI;AACvB,gBAAI,OAAO,WAAW,YAAY;AAChC,oBAAM,IAAI,MAAM,oCAAoC,OAAO,IAAI,CAAC,IAAI;AAAA,YACtE;AACA,mBAAO,OAAO,MAAM,KAAK,IAAI;AAAA,UAC/B;AAAA,QACF;AAEA,YAAI,SAAS,WAAW;AACtB,iBAAO;AAAA,QACT;AAEA,YAAI,CAAC,gBAAgB,IAAI,IAAI,GAAG;AAC9B,0BAAgB,IAAI,MAAM,8BAA8B,YAAY,IAAI,CAAC;AAAA,QAC3E;AAEA,eAAO,gBAAgB,IAAI,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAlCS;AAoCT,SAAS,8BAA8B,YAAoC,WAAwB;AACjG,SAAO,IAAI;AAAA,IACT,CAAC;AAAA,IACD;AAAA,MACE,IAAI,SAAS,MAAM;AACjB,YAAI,SAAS,QAAQ;AACnB,iBAAO;AAAA,QACT;AAEA,eAAO,UAAU,SAAoB;AACnC,gBAAM,MAAO,MAAM,WAAW;AAC9B,gBAAM,QAAQ,IAAI,SAAS;AAC3B,gBAAM,SAAS,QAAQ,IAAI;AAC3B,cAAI,OAAO,WAAW,YAAY;AAChC,kBAAM,IAAI;AAAA,cACR,0BAA0B,OAAO,SAAS,CAAC,sBAAsB,OAAO,IAAI,CAAC;AAAA,YAC/E;AAAA,UACF;AACA,iBAAO,OAAO,MAAM,OAAO,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAvBS;AAyBT,eAAe,+BACb,OACA,SACA,SAC+B;AAC/B,QAAM,cAAc;AACpB,cAAY,WAAW;AAEvB,aAAW,QAAQ,MAAM,UAAU,CAAC,GAAG;AACrC,UAAM,WAAW,MAAM,KAAK,SAAS,WAAW;AAChD,QAAI,UAAU;AACZ,kBAAY,WAAW;AACvB,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,UAAU;AACxB,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AArBe;AAuBf,eAAe,8BACb,OACA,SACA,SACA,UACmB;AACnB,QAAM,cAAc;AACpB,MAAI,kBAAkB;AAEtB,aAAW,QAAQ,MAAM,SAAS,CAAC,GAAG;AACpC,gBAAY,WAAW;AACvB,UAAM,eAAe,MAAM,KAAK,SAAS,WAAW;AACpD,sBAAkB,gBAAgB,YAAY,YAAY;AAAA,EAC5D;AAEA,cAAY,WAAW;AACvB,SAAO;AACT;AAjBe;AAmBf,SAAS,iBAAiB,cAAkE;AAC1F,QAAM,QAA2C,CAAC;AAClD,eAAa,QAAQ,CAAC,OAAO,QAAQ;AACnC,QAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,YAAa;AAEzE,UAAM,WAAW,MAAM,GAAG;AAC1B,QAAI,aAAa,QAAW;AAC1B,YAAM,GAAG,IAAI;AACb;AAAA,IACF;AAEA,UAAM,GAAG,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,UAAU,KAAK,IAAI,CAAC,UAAU,KAAK;AAAA,EAChF,CAAC;AACD,SAAO;AACT;AAdS;AAgBT,SAAS,gBACP,UAC2D;AAC3D,QAAM,QAAmE,CAAC;AAC1E,WAAS,QAAQ,CAAC,OAAO,QAAQ;AAC/B,QAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,YAAa;AAEzE,UAAM,WAAW,MAAM,GAAG;AAC1B,QAAI,aAAa,QAAW;AAC1B,YAAM,GAAG,IAAI;AACb;AAAA,IACF;AAEA,UAAM,GAAG,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,UAAU,KAAK,IAAI,CAAC,UAAU,KAAK;AAAA,EAChF,CAAC;AACD,SAAO;AACT;AAhBS;AAkBT,eAAsB,2BACpB,SACA,SACA,UAII,CAAC,GACqB;AAC1B,MAAI;AACF,cAAU,MAAM;AAAA,MACd;AAAA,MACA,wBAAwB,QAAQ,OAAO,MAAM,EAAE;AAAA,IACjD;AAAA,EACF,SAAS,OAAO;AACd,UAAM,WAAW,mCAAmC,KAAK;AACzD,QAAI,SAAU,QAAO;AACrB,UAAM;AAAA,EACR;AAEA,QAAM,cAAc,QAAQ;AAC5B,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,WAAW,IAAI;AACrB,QAAM,YACJ,QAAQ,QAAQ,IAAI,cAAc,KAClC,QAAQ,gBAAgB,QAAQ,IAAI,cAAc,KAClD,OAAO,KAAK,IAAI,CAAC;AACnB,QAAM,SAAS,2BAA2B,YAAY,UAAU,CAAC,CAAC;AAClE,QAAM,aAAa,CAAC,GAAI,YAAY,cAAc,CAAC,CAAE;AAErD,aAAW,SAAS,YAAY;AAC9B,UAAM,SAAS,qBAAqB,MAAM,SAAS,QAAQ;AAC3D,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,iBAAiB,sCAAsC;AAAA,MAC3D;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,QACpC,SAAS,CAAC,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,QAAQ;AAAA,MACxB,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ,aAAa;AAAA,IACjC,CAAC;AACD,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,mBAAmB,aAAa;AAAA,MACpC,UAAU,YAAY;AAAA,MACtB,MAAM,YAAY;AAAA,MAClB,MAAM,YAAY;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,QACpC,SAAS,CAAC,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,eAAe,IAAI,SAAS;AAAA,IACvC,CAAC;AAED,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,QAAQ,SAAS,cAAc;AAC5D,UAAI,UAAU;AACZ,cAAM,mBAAmB,aAAa;AAAA,UACpC,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,YACpC,SAAS,CAAC,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AACD,eAAO;AAAA,MACT;AAEA,YAAM,mBAAmB,aAAa;AAAA,QACpC,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,UACpC,SAAS,CAAC,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,mBAAmB,aAAa;AAAA,QACpC,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,iBAAiB,MAAM,OAAO;AAAA,UACpC,SAAS,CAAC,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,QACA,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,UAAM,SAAS,cAAc,MAAM,SAAS,QAAQ,MAAM,IACtD,kBAAkB,MAAM,MAAM,QAAQ,IACtC;AACJ,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,iBAAiB,sCAAsC;AAAA,MAC3D;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,QAAQ;AAAA,MACxB,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ,aAAa;AAAA,IACjC,CAAC;AACD,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,mBAAmB,aAAa;AAAA,MACpC,UAAU,YAAY;AAAA,MACtB,MAAM,YAAY;AAAA,MAClB,MAAM,YAAY;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,eAAe,IAAI,SAAS;AAAA,IACvC,CAAC;AAED,QAAI;AACF,YAAM,aAAa,MAAM,8BAA8B,OAAO,SAAS,GAAG;AAC1E,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,mBAAmB,aAAa;AAAA,UACpC,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,UAAU,WAAW;AAAA,UACrB;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AACD,eAAO,WAAW;AAAA,MACpB;AACA,qBAAe,QAAQ,WAAW;AAElC,iBAAW,mBAAmB,MAAM,cAAc,CAAC,GAAG;AACpD,cAAM,qBAAqB,MAAM,gBAAgB,QAAQ,SAAS,cAAc;AAChF,YAAI,oBAAoB;AACtB,gBAAM,mBAAmB,aAAa;AAAA,YACpC,UAAU,YAAY;AAAA,YACtB,MAAM,YAAY;AAAA,YAClB,MAAM,YAAY;AAAA,YAClB,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,MAAM;AAAA,cACZ,SAAS,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,SAAS,eAAe,IAAI,SAAS;AAAA,UACvC,CAAC;AACD,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,iBAAiB,MAAM,+BAA+B,OAAO,SAAS,cAAc;AAC1F,UAAI,gBAAgB;AAClB,cAAMA,YAAW,MAAM;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,mBAAmB,aAAa;AAAA,UACpC,UAAU,YAAY;AAAA,UACtB,MAAM,YAAY;AAAA,UAClB,MAAM,YAAY;AAAA,UAClB,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,UAAAA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,SAAS,eAAe,IAAI,SAAS;AAAA,QACvC,CAAC;AACD,eAAOA;AAAA,MACT;AAEA,YAAM,kBAAkB,MAAM,MAAM,QAAQ,SAAS,cAAc;AACnE,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,mBAAmB,aAAa;AAAA,QACpC,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,mBAAmB,aAAa;AAAA,QACpC,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,QACA,SAAS,eAAe,IAAI,SAAS;AAAA,MACvC,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AA7RsB;AA+RrB,WAAoD,kCAAkC,IACrF;AAEF,SAAS,qCACP,YACA,SACA,eACoC;AACpC,SAAO;AAAA,IACL,IAAI,KAAK;AACP,YAAM,eAAe,cAAc,eAAe,IAAI,SAAS,GAAG;AAClE,UAAI,iBAAiB,QAAW;AAC9B,eAAO;AAAA,MACT;AAEA,aAAO,cAAc,eAAe,IAAI,YAAY,GAAG;AAAA,IACzD;AAAA,IACA,IAAI,KAAK,OAAO,SAAS;AACvB,oBAAc,eAAe,IAAI,YAAY,KAAK,OAAO,OAAO;AAChE,oBAAc,eAAe,IAAI,SAAS,KAAK,OAAO,OAAO;AAAA,IAC/D;AAAA,IACA,IAAI,KAAK;AACP,aACE,cAAc,eAAe,IAAI,SAAS,GAAG,KAC7C,cAAc,eAAe,IAAI,YAAY,GAAG;AAAA,IAEpD;AAAA,IACA,OAAO,KAAK;AACV,YAAM,iBAAiB,cAAc,eAAe,OAAO,SAAS,GAAG;AACvE,YAAM,aAAa,cAAc,eAAe,OAAO,YAAY,GAAG;AACtE,aAAO,kBAAkB;AAAA,IAC3B;AAAA,IACA,QAAQ;AACN,oBAAc,eAAe,MAAM,UAAU;AAC7C,oBAAc,eAAe,MAAM,OAAO;AAAA,IAC5C;AAAA,IACA,SAAS,SAAS;AAChB,YAAM,SAAS,cAAc,eAAe,OAAO,YAAY,OAAO;AACtE,YAAM,kBAAkB,cAAc,eAAe,OAAO,SAAS,OAAO;AAC5E,iBAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB;AAC1C,eAAO,IAAI,KAAK,KAAK;AAAA,MACvB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AA1CS;AA4CT,SAAS,sCAAsC,OAUb;AAChC,QAAM,MAAM,2CAA2C,MAAM,SAAS,MAAM,cAAc;AAE1F,MAAI,MAAM,UAAU;AAClB,QAAI,IAAI,gDAAgD,IAAI;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,KAAK,IAAI,IAAI,MAAM,QAAQ,GAAG;AAAA,IAC9B,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,QAAQ;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,OAAO,CAAC;AAAA,IACR,MAAM,2BAA2B;AAAA,MAC/B,aAAa,MAAM,QAAQ;AAAA,MAC3B,QAAQ,MAAM,QAAQ;AAAA,IACxB,CAAC;AAAA,IACD,MAAM,uBAAuB,MAAM,SAAS,MAAM,IAAI;AAAA,IACtD,aAAa;AAAA,MACX,UAAU,MAAM,QAAQ,YAAY;AAAA,MACpC,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,MAAM,MAAM,QAAQ,YAAY;AAAA,MAChC,UAAU,MAAM,QAAQ,YAAY;AAAA,IACtC;AAAA,IACA,OAAO,MAAM;AAAA,IACb;AAAA,IACA,gBAAgB;AAAA,IAChB,QAAQ,MAAM,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ;AAAA,IACrB,QAAQ,MAAM,QAAQ;AAAA,EACxB;AACF;AA3CS;AA6CT,SAAS,2CACP,SACA,gBACoC;AACpC,SAAO;AAAA,IACL,IAAI,KAAK;AACP,YAAM,eAAe,kBAAkB,SAAS,GAAG;AACnD,UAAI,iBAAiB,QAAW;AAC9B,eAAO;AAAA,MACT;AAEA,UAAI,gBAAgB;AAClB,eAAO,kBAAkB,gBAAgB,GAAG;AAAA,MAC9C;AAEA,aAAO;AAAA,IACT;AAAA,IACA,IAAI,KAAK,OAAO,SAAS;AACvB,wBAAkB,SAAS,KAAK,OAAO,OAAO;AAC9C,UAAI,gBAAgB;AAClB,0BAAkB,gBAAgB,KAAK,OAAO,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,IACA,IAAI,KAAK;AACP,aACE,kBAAkB,SAAS,GAAG,KAC7B,CAAC,CAAC,kBAAkB,kBAAkB,gBAAgB,GAAG;AAAA,IAE9D;AAAA,IACA,OAAO,KAAK;AACV,YAAM,iBAAiB,qBAAqB,SAAS,GAAG;AACxD,YAAM,iBAAiB,iBAAiB,qBAAqB,gBAAgB,GAAG,IAAI;AACpF,aAAO,kBAAkB;AAAA,IAC3B;AAAA,IACA,QAAQ;AACN,0BAAoB,OAAO;AAC3B,UAAI,gBAAgB;AAClB,4BAAoB,cAAc;AAAA,MACpC;AAAA,IACF;AAAA,IACA,SAAS,SAAS;AAChB,YAAM,SAAS,iBACX,0BAA0B,gBAAgB,OAAO,IACjD,oBAAI,IAAqB;AAC7B,YAAM,kBAAkB,0BAA0B,SAAS,OAAO;AAClE,iBAAW,CAAC,KAAK,KAAK,KAAK,iBAAiB;AAC1C,eAAO,IAAI,KAAK,KAAK;AAAA,MACvB;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAnDS;AAqDT,SAAS,iBAAiB,KAAkB,SAAiB,MAAwB;AACnF,QAAM,UAAU,IAAI,QAAQ;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,OAAO,GAAG;AACtD,QAAI,SAAS,MAAM;AACjB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,OAAO,KAAK,IAAI;AAAA,MAC1B;AACA;AAAA,IACF;AAEA,YAAQ,IAAI,KAAK,KAAK;AAAA,EACxB;AAEA,SAAO,IAAI,QAAQ,SAAS;AAAA,IAC1B,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAtBS;AAwBT,SAAS,cAAc,SAA4B,QAAqC;AACtF,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,OAAO,YAAY;AAC5C,SAAO,QAAQ,KAAK,CAAC,SAAS;AAC5B,UAAM,YAAY,KAAK,YAAY;AACnC,WAAO,cAAc,SAAS,cAAc;AAAA,EAC9C,CAAC;AACH;AAVS;AAmBT,SAAS,qBACP,SACA,UACmC;AACnC,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACxD,aAAW,QAAQ,MAAM;AACvB,QAAI,SAAS,WAAW,SAAS,KAAK;AACpC,aAAO,CAAC;AAAA,IACV;AACA,QAAI,KAAK,SAAS,MAAM,GAAG;AACzB,YAAM,SAAS,KAAK,MAAM,GAAG,EAAE;AAC/B,UAAI,aAAa,UAAU,SAAS,WAAW,GAAG,MAAM,GAAG,GAAG;AAC5D,eAAO,CAAC;AAAA,MACV;AACA;AAAA,IACF;AACA,UAAM,SAAS,kBAAkB,MAAM,QAAQ;AAC/C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AA3BS;AAiCT,SAAS,kBAAkB,SAAiB,UAAqD;AAC/F,QAAM,gBAAgB,UAAU,OAAO;AACvC,QAAM,eAAe,UAAU,QAAQ;AACvC,QAAM,SAAqC,CAAC;AAE5C,MAAI,aAAa;AACjB,MAAI,YAAY;AAEhB,SAAO,aAAa,cAAc,UAAU,YAAY,aAAa,QAAQ;AAC3E,UAAM,eAAe,cAAc,UAAU;AAC7C,UAAM,cAAc,aAAa,SAAS;AAE1C,QAAI,kBAAkB,YAAY,GAAG;AACnC,aAAO,oBAAoB,YAAY,CAAC,IAAI,aACzC,MAAM,SAAS,EACf,IAAI,CAAC,YAAY,mBAAmB,OAAO,CAAC;AAC/C,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,YAAY,GAAG;AAClC,aAAO,oBAAoB,YAAY,CAAC,IAAI,mBAAmB,WAAW;AAC1E,oBAAc;AACd,mBAAa;AACb;AAAA,IACF;AAEA,QAAI,iBAAiB,aAAa;AAChC,aAAO;AAAA,IACT;AAEA,kBAAc;AACd,iBAAa;AAAA,EACf;AAEA,MAAI,eAAe,cAAc,UAAU,cAAc,aAAa,QAAQ;AAC5E,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,cAAc,SAAS,KAAK,kBAAkB,cAAc,UAAU,CAAC,GAAG;AAC3F,WAAO,oBAAoB,cAAc,UAAU,CAAC,CAAC,IAAI,CAAC;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA5CS;AA8CT,SAAS,UAAU,OAAyB;AAC1C,SAAO,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AACxC;AAFS;AAIT,SAAS,iBAAiB,SAA0B;AAClD,SAAO,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AACxD;AAFS;AAIT,SAAS,kBAAkB,SAA0B;AACnD,SAAO,QAAQ,WAAW,MAAM,KAAK,QAAQ,SAAS,GAAG;AAC3D;AAFS;AAIT,SAAS,oBAAoB,SAAyB;AACpD,MAAI,kBAAkB,OAAO,GAAG;AAC9B,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AAEA,SAAO,QAAQ,MAAM,GAAG,EAAE;AAC5B;AANS;AAQT,SAAS,aAAa,KAA0B;AAC9C,QAAM,cAAc,IAAI,QAAQ,cAAc;AAC9C,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,WAAO,YAAY,CAAC,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,EAC5C;AACA,SAAO,eAAe,OAAO,KAAK,IAAI,CAAC;AACzC;AANS;AAQT,SAAS,iBAAiB,SAAyD;AACjF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,OAAO,YAAY,WAAW,UAAU,QAAQ,KAAK,IAAI;AAClE;AALS;","names":["api","response"]}
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  _parseServerFnSchema,
3
3
  createServerFn
4
- } from "./chunk-I3OOUWO5.mjs";
4
+ } from "./chunk-3GDRV7SG.mjs";
5
5
  import {
6
6
  createFarmServerQueryResult
7
7
  } from "./chunk-EHTUKVSW.mjs";
8
8
  import {
9
9
  getServerActionExecutionContext
10
- } from "./chunk-35NPLKQJ.mjs";
10
+ } from "./chunk-XWM2C267.mjs";
11
11
  import {
12
12
  createFarmCacheKey,
13
13
  createRouteDataCacheKey,
@@ -140,4 +140,4 @@ export {
140
140
  FARM_SERVER_QUERY_SYMBOL,
141
141
  createServerQuery
142
142
  };
143
- //# sourceMappingURL=chunk-GJ7W6LNK.mjs.map
143
+ //# sourceMappingURL=chunk-N5RK4LK6.mjs.map
@@ -47,10 +47,11 @@ function createFarmImageHandler(config, options) {
47
47
  "quality"
48
48
  );
49
49
  const accept = request.headers.get("accept") ?? "";
50
+ const negotiatedFormat = selectOutputFormat(accept, config.formats) ?? "";
50
51
  const cacheKey = `${sourceUrl.href}
51
52
  ${width}
52
53
  ${quality}
53
- ${accept}`;
54
+ ${negotiatedFormat}`;
54
55
  let optimized = cache.get(cacheKey);
55
56
  if (!optimized) {
56
57
  const fetchedSource = await fetchImageSource(
@@ -77,7 +78,8 @@ ${accept}`;
77
78
  quality,
78
79
  accept,
79
80
  formats: config.formats,
80
- signal: request.signal
81
+ signal: request.signal,
82
+ maximumResponseBody: config.maximumResponseBody
81
83
  });
82
84
  throwIfAborted(request.signal);
83
85
  validateTransformedResult(result, config);
@@ -105,11 +107,13 @@ ${accept}`;
105
107
  }, "handleFarmImage");
106
108
  }
107
109
  __name(createFarmImageHandler, "createFarmImageHandler");
110
+ var DEFAULT_IMAGE_TRANSFORM_BODY_LIMIT = 10 * 1024 * 1024;
108
111
  function createCloudflareImageTransformer(fetcher = globalThis.fetch) {
109
- return async ({ sourceUrl, width, quality, accept, formats, signal }) => {
112
+ return async ({ sourceUrl, width, quality, accept, formats, signal, maximumResponseBody }) => {
110
113
  const format = selectOutputFormat(accept, formats);
111
114
  const response = await fetcher(sourceUrl, {
112
115
  signal,
116
+ redirect: "manual",
113
117
  headers: { accept: "image/*" },
114
118
  cf: {
115
119
  image: {
@@ -120,6 +124,14 @@ function createCloudflareImageTransformer(fetcher = globalThis.fetch) {
120
124
  }
121
125
  }
122
126
  });
127
+ if (response.status >= 300 && response.status < 400) {
128
+ void cancelResponseBody(response);
129
+ throw new FarmImageRequestError(
130
+ "UNSUPPORTED_IMAGE",
131
+ 502,
132
+ "Source image redirected after validation"
133
+ );
134
+ }
123
135
  if (!response.ok) {
124
136
  throw new FarmImageRequestError(
125
137
  "UNSUPPORTED_IMAGE",
@@ -127,7 +139,10 @@ function createCloudflareImageTransformer(fetcher = globalThis.fetch) {
127
139
  "Cloudflare could not transform the source image"
128
140
  );
129
141
  }
130
- const body = new Uint8Array(await response.arrayBuffer());
142
+ const body = await readResponseWithLimit(
143
+ response,
144
+ maximumResponseBody ?? DEFAULT_IMAGE_TRANSFORM_BODY_LIMIT
145
+ );
131
146
  return {
132
147
  body,
133
148
  contentType: normalizeImageContentType(response.headers.get("content-type")) || detectImageContentType(body)
@@ -498,4 +513,4 @@ export {
498
513
  selectOutputFormat,
499
514
  isPrivateImageAddress
500
515
  };
501
- //# sourceMappingURL=chunk-WKDAA6V2.mjs.map
516
+ //# sourceMappingURL=chunk-NBF56FXB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/image-server.ts"],"sourcesContent":["import type {\n FarmImageFormat,\n FarmImageLocalPattern,\n FarmImageRemotePattern,\n ResolvedFarmImageConfig,\n} from \"./image-config\";\nimport { matchesFarmIfNoneMatch } from \"./server-http\";\n\nexport interface FarmImageTransformInput {\n source: Uint8Array;\n sourceUrl: URL;\n sourceType: string;\n width: number;\n quality: number;\n accept: string;\n formats: readonly FarmImageFormat[];\n signal: AbortSignal;\n /**\n * Byte ceiling for any source the transformer fetches itself. Supplied by the\n * image handler; transformers that re-fetch the origin (Cloudflare) must\n * enforce it, since they bypass the handler's bounded read.\n */\n maximumResponseBody?: number;\n}\n\nexport interface FarmImageTransformResult {\n body: Uint8Array;\n contentType: string;\n}\n\nexport type FarmImageTransformer = (\n input: FarmImageTransformInput,\n) => Promise<FarmImageTransformResult>;\n\nexport interface CreateFarmImageHandlerOptions {\n fetch?: typeof globalThis.fetch;\n /** Node-only fetcher that validates the DNS result used for remote connections. @internal */\n fetchRemote?: typeof globalThis.fetch;\n transform: FarmImageTransformer;\n validateRemoteUrl?: (url: URL) => void | Promise<void>;\n onError?: (error: unknown, request: Request) => void;\n cacheEntries?: number;\n}\n\nexport type FarmImageHandler = (request: Request) => Promise<Response | null>;\n\ntype OptimizedImage = FarmImageTransformResult & {\n etag: string;\n cacheControl: string;\n expiresAt: number;\n};\n\ntype FarmImageRequestErrorCode =\n | \"BODY_TOO_LARGE\"\n | \"DISALLOWED_SOURCE\"\n | \"INVALID_METHOD\"\n | \"INVALID_PARAMETER\"\n | \"PRIVATE_SOURCE\"\n | \"TOO_MANY_REDIRECTS\"\n | \"UNSUPPORTED_IMAGE\";\n\nexport class FarmImageRequestError extends Error {\n readonly code: FarmImageRequestErrorCode;\n readonly status: number;\n\n constructor(code: FarmImageRequestErrorCode, status: number, message: string) {\n super(message);\n this.name = \"FarmImageRequestError\";\n this.code = code;\n this.status = status;\n }\n}\n\nexport function createFarmImageHandler(\n config: ResolvedFarmImageConfig,\n options: CreateFarmImageHandlerOptions,\n): FarmImageHandler {\n const fetcher = options.fetch ?? globalThis.fetch;\n const cache = new FarmImageMemoryCache(options.cacheEntries ?? 100);\n const allowedWidths = new Set([...config.deviceSizes, ...config.imageSizes]);\n const allowedQualities = new Set(config.qualities);\n\n return async function handleFarmImage(request): Promise<Response | null> {\n const requestUrl = new URL(request.url);\n if (requestUrl.pathname !== config.path) return null;\n\n try {\n if (config.provider === \"none\") {\n throw new FarmImageRequestError(\n \"DISALLOWED_SOURCE\",\n 404,\n \"The Farm image optimizer is disabled\",\n );\n }\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n throw new FarmImageRequestError(\n \"INVALID_METHOD\",\n 405,\n \"The Farm image optimizer only accepts GET and HEAD\",\n );\n }\n\n const sourceUrl = await resolveImageSourceUrl(requestUrl, config, options.validateRemoteUrl);\n const width = parseAllowedInteger(requestUrl.searchParams.get(\"w\"), allowedWidths, \"width\");\n const quality = parseAllowedInteger(\n requestUrl.searchParams.get(\"q\"),\n allowedQualities,\n \"quality\",\n );\n const accept = request.headers.get(\"accept\") ?? \"\";\n // Key on the format the Accept header negotiates to, not the header text.\n // Both transformers derive their output from `selectOutputFormat(accept,\n // formats)` alone, so every header that negotiates to the same format\n // produces byte-identical output. Keying on the raw header let a caller\n // vary it freely (`image/webp,*/*;q=0.8`, reordered lists, extra params)\n // and force an uncached fetch and transform each time.\n const negotiatedFormat = selectOutputFormat(accept, config.formats) ?? \"\";\n const cacheKey = `${sourceUrl.href}\\n${width}\\n${quality}\\n${negotiatedFormat}`;\n let optimized = cache.get(cacheKey);\n\n if (!optimized) {\n const fetchedSource = await fetchImageSource(\n sourceUrl,\n requestUrl.origin,\n config,\n fetcher,\n options.fetchRemote,\n options.validateRemoteUrl,\n request.signal,\n );\n const source = await readResponseWithLimit(\n fetchedSource.response,\n config.maximumResponseBody,\n );\n const sourceType = detectImageContentType(source);\n validateSourceType(sourceType, config);\n throwIfAborted(request.signal);\n\n const result = await options.transform({\n source,\n sourceUrl: fetchedSource.url,\n sourceType,\n width,\n quality,\n accept,\n formats: config.formats,\n signal: request.signal,\n maximumResponseBody: config.maximumResponseBody,\n });\n throwIfAborted(request.signal);\n validateTransformedResult(result, config);\n\n optimized = {\n ...result,\n etag: createImageEtag(result.body),\n cacheControl: `public, max-age=${config.minimumCacheTTL}, stale-while-revalidate=${Math.max(\n config.minimumCacheTTL,\n 60,\n )}`,\n expiresAt: Date.now() + config.minimumCacheTTL * 1_000,\n };\n cache.set(cacheKey, optimized);\n }\n\n return createOptimizedImageResponse(request, optimized, config);\n } catch (error) {\n if (!(error instanceof FarmImageRequestError) && !isAbortError(error)) {\n try {\n options.onError?.(error, request);\n } catch {\n // Error reporting must not replace the optimizer's sanitized response.\n }\n }\n return createFarmImageErrorResponse(error);\n }\n };\n}\n\n/** Mirrors the `images.maximumResponseBody` default (\"10mb\"). */\nconst DEFAULT_IMAGE_TRANSFORM_BODY_LIMIT = 10 * 1024 * 1024;\n\nexport function createCloudflareImageTransformer(\n fetcher: typeof globalThis.fetch = globalThis.fetch,\n): FarmImageTransformer {\n return async ({ sourceUrl, width, quality, accept, formats, signal, maximumResponseBody }) => {\n const format = selectOutputFormat(accept, formats);\n // Cloudflare resizing works by letting the edge fetch the origin, so this\n // request cannot reuse the bytes the handler already read. It still must not\n // be a weaker fetch than the validated one: `redirect: \"manual\"` keeps it\n // from silently following a hop the handler never validated, and the body is\n // read under the same ceiling as the handler's own read.\n const response = await fetcher(sourceUrl, {\n signal,\n redirect: \"manual\",\n headers: { accept: \"image/*\" },\n cf: {\n image: {\n fit: \"scale-down\",\n width,\n quality,\n ...(format ? { format: format === \"image/avif\" ? \"avif\" : \"webp\" } : {}),\n },\n },\n } as RequestInit);\n\n if (response.status >= 300 && response.status < 400) {\n void cancelResponseBody(response);\n throw new FarmImageRequestError(\n \"UNSUPPORTED_IMAGE\",\n 502,\n \"Source image redirected after validation\",\n );\n }\n\n if (!response.ok) {\n throw new FarmImageRequestError(\n \"UNSUPPORTED_IMAGE\",\n response.status === 404 ? 404 : 502,\n \"Cloudflare could not transform the source image\",\n );\n }\n\n const body = await readResponseWithLimit(\n response,\n maximumResponseBody ?? DEFAULT_IMAGE_TRANSFORM_BODY_LIMIT,\n );\n return {\n body,\n contentType:\n normalizeImageContentType(response.headers.get(\"content-type\")) ||\n detectImageContentType(body),\n };\n };\n}\n\nexport function selectOutputFormat(\n accept: string,\n formats: readonly FarmImageFormat[],\n): FarmImageFormat | undefined {\n const qualityByFormat = new Map<string, number>();\n\n for (const range of accept.split(\",\")) {\n const [rawType, ...parameters] = range.split(\";\");\n const type = rawType.trim().toLowerCase();\n if (!type) continue;\n\n let quality = 1;\n for (const parameter of parameters) {\n const [rawName, rawValue] = parameter.split(\"=\", 2);\n if (rawName.trim().toLowerCase() !== \"q\") continue;\n const parsed = Number(rawValue?.trim());\n quality = Number.isFinite(parsed) && parsed >= 0 && parsed <= 1 ? parsed : 0;\n break;\n }\n\n qualityByFormat.set(type, Math.max(qualityByFormat.get(type) ?? 0, quality));\n }\n\n let selected: FarmImageFormat | undefined;\n let selectedQuality = 0;\n for (const format of formats) {\n const quality = qualityByFormat.get(format) ?? 0;\n if (quality > selectedQuality) {\n selected = format;\n selectedQuality = quality;\n }\n }\n return selected;\n}\n\nexport function isPrivateImageAddress(address: string): boolean {\n const value = address.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n if (value === \"::\" || value === \"::1\") return true;\n if (/^(?:fc|fd)[0-9a-f]{2}:/.test(value) || /^fe[89ab][0-9a-f]:/.test(value)) return true;\n if (value.startsWith(\"::ffff:\")) return isPrivateImageAddress(value.slice(7));\n\n const parts = value.split(\".\");\n if (parts.length !== 4 || parts.some((part) => !/^\\d{1,3}$/.test(part))) return false;\n const octets = parts.map(Number);\n if (octets.some((part) => part > 255)) return false;\n\n const [a, b] = octets;\n return (\n a === 0 ||\n a === 10 ||\n a === 127 ||\n (a === 100 && b >= 64 && b <= 127) ||\n (a === 169 && b === 254) ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && (b === 0 || b === 168)) ||\n (a === 198 && (b === 18 || b === 19)) ||\n a >= 224\n );\n}\n\nfunction parseAllowedInteger(\n raw: string | null,\n allowed: ReadonlySet<number>,\n name: string,\n): number {\n if (!raw || !/^\\d+$/.test(raw)) {\n throw new FarmImageRequestError(\n \"INVALID_PARAMETER\",\n 400,\n `Image ${name} must be an allowed integer`,\n );\n }\n const value = Number(raw);\n if (!allowed.has(value)) {\n throw new FarmImageRequestError(\"INVALID_PARAMETER\", 400, `Image ${name} is not configured`);\n }\n return value;\n}\n\nasync function resolveImageSourceUrl(\n requestUrl: URL,\n config: ResolvedFarmImageConfig,\n validateRemoteUrl: CreateFarmImageHandlerOptions[\"validateRemoteUrl\"],\n): Promise<URL> {\n const raw = requestUrl.searchParams.get(\"url\");\n if (!raw || raw.length > 4096 || raw.startsWith(\"//\")) {\n throw new FarmImageRequestError(\"INVALID_PARAMETER\", 400, \"Invalid image source URL\");\n }\n\n let sourceUrl: URL;\n try {\n sourceUrl = raw.startsWith(\"/\") ? new URL(raw, requestUrl.origin) : new URL(raw);\n } catch {\n throw new FarmImageRequestError(\"INVALID_PARAMETER\", 400, \"Invalid image source URL\");\n }\n\n await validateImageSourceUrl(sourceUrl, requestUrl.origin, config, validateRemoteUrl);\n return sourceUrl;\n}\n\nasync function validateImageSourceUrl(\n sourceUrl: URL,\n requestOrigin: string,\n config: ResolvedFarmImageConfig,\n validateRemoteUrl: CreateFarmImageHandlerOptions[\"validateRemoteUrl\"],\n): Promise<void> {\n if (sourceUrl.protocol !== \"http:\" && sourceUrl.protocol !== \"https:\") {\n throw new FarmImageRequestError(\"DISALLOWED_SOURCE\", 400, \"Unsupported image protocol\");\n }\n if (sourceUrl.username || sourceUrl.password || sourceUrl.hash) {\n throw new FarmImageRequestError(\"DISALLOWED_SOURCE\", 400, \"Unsafe image source URL\");\n }\n\n if (sourceUrl.origin === requestOrigin) {\n if (\n sourceUrl.pathname === config.path ||\n !matchesLocalPatterns(sourceUrl, config.localPatterns)\n ) {\n throw new FarmImageRequestError(\n \"DISALLOWED_SOURCE\",\n 400,\n \"Local image source is not allowed\",\n );\n }\n return;\n }\n\n if (!matchesRemoteSource(sourceUrl, config)) {\n throw new FarmImageRequestError(\"DISALLOWED_SOURCE\", 400, \"Remote image source is not allowed\");\n }\n if (!config.dangerouslyAllowLocalIP && isPrivateImageAddress(sourceUrl.hostname)) {\n throw new FarmImageRequestError(\"PRIVATE_SOURCE\", 400, \"Private image source is not allowed\");\n }\n if (!config.dangerouslyAllowLocalIP) {\n await validateRemoteUrl?.(sourceUrl);\n }\n}\n\nasync function fetchImageSource(\n initialUrl: URL,\n requestOrigin: string,\n config: ResolvedFarmImageConfig,\n fetcher: typeof globalThis.fetch,\n fetchRemote: typeof globalThis.fetch | undefined,\n validateRemoteUrl: CreateFarmImageHandlerOptions[\"validateRemoteUrl\"],\n signal: AbortSignal,\n): Promise<{ response: Response; url: URL }> {\n let currentUrl = initialUrl;\n\n for (let redirectCount = 0; ; redirectCount += 1) {\n throwIfAborted(signal);\n const sourceFetcher = currentUrl.origin === requestOrigin ? fetcher : (fetchRemote ?? fetcher);\n const response = await sourceFetcher(currentUrl, {\n method: \"GET\",\n redirect: \"manual\",\n signal,\n headers: {\n accept: \"image/avif,image/webp,image/*,*/*;q=0.8\",\n \"user-agent\": \"Farm.js Image Optimizer\",\n },\n });\n\n if (![301, 302, 303, 307, 308].includes(response.status)) {\n if (!response.ok) {\n await cancelResponseBody(response);\n throw new FarmImageRequestError(\n \"UNSUPPORTED_IMAGE\",\n response.status === 404 ? 404 : 502,\n \"Could not fetch source image\",\n );\n }\n return { response, url: currentUrl };\n }\n\n if (redirectCount >= config.maximumRedirects) {\n await cancelResponseBody(response);\n throw new FarmImageRequestError(\n \"TOO_MANY_REDIRECTS\",\n 400,\n \"Source image exceeded the redirect limit\",\n );\n }\n const location = response.headers.get(\"location\");\n if (!location) {\n await cancelResponseBody(response);\n throw new FarmImageRequestError(\"UNSUPPORTED_IMAGE\", 502, \"Invalid image redirect\");\n }\n await cancelResponseBody(response);\n currentUrl = new URL(location, currentUrl);\n await validateImageSourceUrl(currentUrl, requestOrigin, config, validateRemoteUrl);\n }\n}\n\nasync function readResponseWithLimit(response: Response, limit: number): Promise<Uint8Array> {\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && Number(contentLength) > limit) {\n // Cleanup (including an unread tee branch) must not delay the size rejection.\n void cancelResponseBody(response);\n throw new FarmImageRequestError(\"BODY_TOO_LARGE\", 413, \"Source image is too large\");\n }\n\n if (!response.body) return new Uint8Array();\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let byteLength = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n byteLength += value.byteLength;\n if (byteLength > limit) {\n const error = new FarmImageRequestError(\"BODY_TOO_LARGE\", 413, \"Source image is too large\");\n void reader.cancel(error).catch(() => {});\n throw error;\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n const result = new Uint8Array(byteLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return result;\n}\n\nasync function cancelResponseBody(response: Response): Promise<void> {\n try {\n await response.body?.cancel();\n } catch {\n // Cleanup must not replace the request error or redirect result.\n }\n}\n\nfunction detectImageContentType(bytes: Uint8Array): string {\n if (\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47\n ) {\n return \"image/png\";\n }\n if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {\n return \"image/jpeg\";\n }\n if (bytes.length >= 6) {\n const signature = new TextDecoder().decode(bytes.slice(0, 6));\n if (signature === \"GIF87a\" || signature === \"GIF89a\") return \"image/gif\";\n }\n if (bytes.length >= 12) {\n const riff = new TextDecoder().decode(bytes.slice(0, 4));\n const webp = new TextDecoder().decode(bytes.slice(8, 12));\n if (riff === \"RIFF\" && webp === \"WEBP\") return \"image/webp\";\n const box = new TextDecoder().decode(bytes.slice(4, 12));\n if (box.startsWith(\"ftypavif\") || box.startsWith(\"ftypavis\")) return \"image/avif\";\n }\n\n const prefix = new TextDecoder().decode(bytes.slice(0, 512)).trimStart().toLowerCase();\n if (prefix.startsWith(\"<svg\") || (prefix.startsWith(\"<?xml\") && prefix.includes(\"<svg\"))) {\n return \"image/svg+xml\";\n }\n return \"\";\n}\n\nfunction validateSourceType(type: string, config: ResolvedFarmImageConfig): void {\n if (!type || (type === \"image/svg+xml\" && !config.dangerouslyAllowSVG)) {\n throw new FarmImageRequestError(\"UNSUPPORTED_IMAGE\", 415, \"Unsupported source image\");\n }\n}\n\nfunction validateTransformedResult(\n result: FarmImageTransformResult,\n config: ResolvedFarmImageConfig,\n): void {\n if (!(result.body instanceof Uint8Array) || result.body.byteLength === 0) {\n throw new Error(\"The image transformer returned an empty response\");\n }\n if (result.body.byteLength > config.maximumResponseBody) {\n throw new FarmImageRequestError(\"BODY_TOO_LARGE\", 413, \"Optimized image is too large\");\n }\n const contentType = normalizeImageContentType(result.contentType);\n if (!contentType || (contentType === \"image/svg+xml\" && !config.dangerouslyAllowSVG)) {\n throw new Error(\"The image transformer returned an unsupported content type\");\n }\n result.contentType = contentType;\n}\n\nfunction normalizeImageContentType(value: string | null): string {\n const type = value?.split(\";\", 1)[0].trim().toLowerCase() ?? \"\";\n return type.startsWith(\"image/\") ? type : \"\";\n}\n\nfunction matchesRemoteSource(url: URL, config: ResolvedFarmImageConfig): boolean {\n if (config.domains.includes(url.hostname.toLowerCase())) return true;\n return config.remotePatterns.some((pattern) => matchesRemotePattern(url, pattern));\n}\n\nfunction matchesRemotePattern(url: URL, pattern: FarmImageRemotePattern): boolean {\n return (\n (!pattern.protocol || url.protocol === `${pattern.protocol}:`) &&\n matchesHostname(url.hostname, pattern.hostname) &&\n (pattern.port === undefined || url.port === pattern.port) &&\n matchesGlob(url.pathname, pattern.pathname ?? \"/**\") &&\n (pattern.search === undefined || url.search === pattern.search)\n );\n}\n\nfunction matchesLocalPatterns(url: URL, patterns: readonly FarmImageLocalPattern[]): boolean {\n return patterns.some(\n (pattern) =>\n matchesGlob(url.pathname, pattern.pathname) &&\n (pattern.search === undefined || url.search === pattern.search),\n );\n}\n\nfunction matchesHostname(hostname: string, pattern: string): boolean {\n const normalizedHostname = hostname.toLowerCase();\n const normalizedPattern = pattern.toLowerCase();\n if (normalizedPattern.startsWith(\"**.\")) {\n const suffix = normalizedPattern.slice(3);\n return normalizedHostname === suffix || normalizedHostname.endsWith(`.${suffix}`);\n }\n if (normalizedPattern.startsWith(\"*.\")) {\n const suffix = normalizedPattern.slice(2);\n const prefix = normalizedHostname.slice(0, -(suffix.length + 1));\n return normalizedHostname.endsWith(`.${suffix}`) && !!prefix && !prefix.includes(\".\");\n }\n return normalizedHostname === normalizedPattern;\n}\n\nfunction matchesGlob(value: string, pattern: string): boolean {\n const escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const source = escaped.replace(/\\*\\*/g, \"\\0\").replace(/\\*/g, \"[^/]*\").replace(/\\0/g, \".*\");\n return new RegExp(`^${source}$`).test(value);\n}\n\nfunction createOptimizedImageResponse(\n request: Request,\n image: OptimizedImage,\n config: ResolvedFarmImageConfig,\n): Response {\n const headers = new Headers({\n \"cache-control\": image.cacheControl,\n \"content-type\": image.contentType,\n \"content-length\": String(image.body.byteLength),\n \"content-disposition\": \"inline\",\n etag: image.etag,\n vary: \"Accept\",\n \"x-content-type-options\": \"nosniff\",\n });\n if (image.contentType === \"image/svg+xml\" && config.dangerouslyAllowSVG) {\n headers.set(\"content-security-policy\", \"default-src 'none'; sandbox\");\n }\n if (matchesFarmIfNoneMatch(request.headers.get(\"if-none-match\"), image.etag)) {\n headers.delete(\"content-length\");\n return new Response(null, { status: 304, headers });\n }\n const body =\n request.method === \"HEAD\"\n ? null\n : image.body.buffer.slice(\n image.body.byteOffset,\n image.body.byteOffset + image.body.byteLength,\n );\n return new Response(body as ArrayBuffer | null, { status: 200, headers });\n}\n\nfunction createFarmImageErrorResponse(error: unknown): Response {\n const status =\n error instanceof FarmImageRequestError ? error.status : isAbortError(error) ? 499 : 500;\n const headers = new Headers({\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/plain; charset=utf-8\",\n \"x-content-type-options\": \"nosniff\",\n });\n if (status === 405) headers.set(\"allow\", \"GET, HEAD\");\n\n const message =\n status === 400\n ? \"Invalid image request\"\n : status === 404\n ? \"Image not found\"\n : status === 405\n ? \"Method not allowed\"\n : status === 413\n ? \"Image is too large\"\n : status === 415\n ? \"Unsupported image\"\n : status === 499\n ? \"Image request cancelled\"\n : \"Image optimization failed\";\n return new Response(message, { status, headers });\n}\n\nfunction createImageEtag(bytes: Uint8Array): string {\n let hash = 0x811c9dc5;\n for (const byte of bytes) {\n hash ^= byte;\n hash = Math.imul(hash, 0x01000193);\n }\n return `W/\"farm-${bytes.byteLength.toString(16)}-${(hash >>> 0).toString(16)}\"`;\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw signal.reason instanceof Error\n ? signal.reason\n : new DOMException(\"The image request was aborted\", \"AbortError\");\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nclass FarmImageMemoryCache {\n private readonly entries = new Map<string, OptimizedImage>();\n\n constructor(private readonly capacity: number) {}\n\n get(key: string): OptimizedImage | undefined {\n const value = this.entries.get(key);\n if (!value) return undefined;\n if (value.expiresAt <= Date.now()) {\n this.entries.delete(key);\n return undefined;\n }\n this.entries.delete(key);\n this.entries.set(key, value);\n return value;\n }\n\n set(key: string, value: OptimizedImage): void {\n if (this.capacity <= 0) return;\n this.entries.delete(key);\n this.entries.set(key, value);\n while (this.entries.size > this.capacity) {\n const oldestKey = this.entries.keys().next().value as string | undefined;\n if (oldestKey === undefined) break;\n this.entries.delete(oldestKey);\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,28 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-CGILA3WO.mjs";
4
+
5
+ // src/utils/runtime-env.ts
6
+ function getFarmRuntimeBindings() {
7
+ const runtimeBindings = globalThis.__env__;
8
+ return runtimeBindings && typeof runtimeBindings === "object" ? runtimeBindings : void 0;
9
+ }
10
+ __name(getFarmRuntimeBindings, "getFarmRuntimeBindings");
11
+ function readFarmEnvironmentValue(name) {
12
+ const runtimeValue = getFarmRuntimeBindings()?.[name];
13
+ if (typeof runtimeValue === "string") return runtimeValue;
14
+ return typeof process !== "undefined" ? process.env?.[name] : void 0;
15
+ }
16
+ __name(readFarmEnvironmentValue, "readFarmEnvironmentValue");
17
+ function isFarmDeployedRuntime() {
18
+ if (getFarmRuntimeBindings()) return true;
19
+ return readFarmEnvironmentValue("NODE_ENV") === "production";
20
+ }
21
+ __name(isFarmDeployedRuntime, "isFarmDeployedRuntime");
22
+
23
+ export {
24
+ getFarmRuntimeBindings,
25
+ readFarmEnvironmentValue,
26
+ isFarmDeployedRuntime
27
+ };
28
+ //# sourceMappingURL=chunk-RKUPOYQV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/runtime-env.ts"],"sourcesContent":["/**\n * Environment access that works across the runtimes Farm targets.\n *\n * Serverless and edge runtimes (Cloudflare Workers in particular) expose\n * bindings on `globalThis.__env__` rather than `process.env`, so security\n * checks that read `process.env` directly see an empty value there and can\n * silently take an \"unconfigured\" code path in a deployed environment.\n */\nexport function getFarmRuntimeBindings(): Record<string, unknown> | undefined {\n const runtimeBindings = (\n globalThis as typeof globalThis & {\n __env__?: Record<string, unknown>;\n }\n ).__env__;\n return runtimeBindings && typeof runtimeBindings === \"object\" ? runtimeBindings : undefined;\n}\n\nexport function readFarmEnvironmentValue(name: string): string | undefined {\n const runtimeValue = getFarmRuntimeBindings()?.[name];\n if (typeof runtimeValue === \"string\") return runtimeValue;\n return typeof process !== \"undefined\" ? process.env?.[name] : undefined;\n}\n\n/**\n * True when the process looks like a deployed runtime rather than local\n * development: either NODE_ENV is production, or runtime bindings are present\n * (a deployed worker where NODE_ENV is frequently unset).\n */\nexport function isFarmDeployedRuntime(): boolean {\n if (getFarmRuntimeBindings()) return true;\n return readFarmEnvironmentValue(\"NODE_ENV\") === \"production\";\n}\n"],"mappings":";;;;;AAQO,SAAS,yBAA8D;AAC5E,QAAM,kBACJ,WAGA;AACF,SAAO,mBAAmB,OAAO,oBAAoB,WAAW,kBAAkB;AACpF;AAPgB;AAST,SAAS,yBAAyB,MAAkC;AACzE,QAAM,eAAe,uBAAuB,IAAI,IAAI;AACpD,MAAI,OAAO,iBAAiB,SAAU,QAAO;AAC7C,SAAO,OAAO,YAAY,cAAc,QAAQ,MAAM,IAAI,IAAI;AAChE;AAJgB;AAWT,SAAS,wBAAiC;AAC/C,MAAI,uBAAuB,EAAG,QAAO;AACrC,SAAO,yBAAyB,UAAU,MAAM;AAClD;AAHgB;","names":[]}