{"version":3,"file":"pages-api-turbo.runtime.dev.js","sources":["webpack://next/webpack/runtime/create_fake_namespace_object","webpack://next/./dist/compiled/@edge-runtime/cookies/index.js","webpack://next/./dist/compiled/bytes/index.js","webpack://next/./dist/compiled/content-type/index.js","webpack://next/./dist/compiled/cookie/index.js","webpack://next/./dist/compiled/fresh/index.js","webpack://next/./dist/compiled/path-to-regexp/index.js","webpack://next/./src/lib/picocolors.ts","webpack://next/./src/build/output/log.ts","webpack://next/./src/lib/constants.ts","webpack://next/./src/lib/format-dynamic-import-path.ts","webpack://next/./src/server/api-utils/index.ts","webpack://next/./src/server/api-utils/node/try-get-preview-data.ts","webpack://next/./src/server/crypto-utils.ts","webpack://next/./src/server/lib/lru-cache.ts","webpack://next/./src/server/lib/node-fs-methods.ts","webpack://next/./src/server/lib/trace/constants.ts","webpack://next/./src/server/lib/router-utils/is-postpone.ts","webpack://next/./src/server/node-environment-extensions/process-error-handlers.ts","webpack://next/./src/server/web/spec-extension/adapters/headers.ts","webpack://next/./src/server/web/spec-extension/adapters/reflect.ts","webpack://next/./src/shared/lib/isomorphic/path.js","webpack://next/./src/shared/lib/modern-browserslist-target.js","webpack://next/webpack/runtime/compat_get_default_export","webpack://next/webpack/runtime/define_property_getters","webpack://next/webpack/runtime/has_own_property","webpack://next/webpack/runtime/make_namespace_object","webpack://next/./src/server/response-cache/types.ts","webpack://next/./src/server/route-kind.ts","webpack://next/./src/shared/lib/constants.ts","webpack://next/./src/lib/url.ts","webpack://next/./src/shared/lib/i18n/normalize-locale-path.ts","webpack://next/./src/shared/lib/page-path/ensure-leading-slash.ts","webpack://next/./src/shared/lib/router/utils/app-paths.ts","webpack://next/./src/shared/lib/segment.ts","webpack://next/./src/shared/lib/router/utils/interception-routes.ts","webpack://next/./src/shared/lib/router/utils/is-dynamic.ts","webpack://next/./src/shared/lib/router/utils/parse-path.ts","webpack://next/./src/shared/lib/router/utils/path-has-prefix.ts","webpack://next/./src/shared/lib/router/utils/remove-path-prefix.ts","webpack://next/./src/shared/lib/escape-regexp.ts","webpack://next/./src/shared/lib/router/utils/remove-trailing-slash.ts","webpack://next/./src/shared/lib/invariant-error.ts","webpack://next/./src/shared/lib/router/utils/get-dynamic-param.ts","webpack://next/./src/shared/lib/router/utils/route-regex.ts","webpack://next/./src/shared/lib/utils.ts","webpack://next/./src/lib/route-pattern-normalizer.ts","webpack://next/./src/shared/lib/router/utils/route-match-utils.ts","webpack://next/./src/shared/lib/router/utils/route-matcher.ts","webpack://next/./src/shared/lib/router/utils/querystring.ts","webpack://next/./src/server/api-utils/get-cookie-parser.ts","webpack://next/./src/shared/lib/router/utils/prepare-destination.ts","webpack://next/./src/server/web/utils.ts","webpack://next/./src/server/lib/decode-query-path-parameter.ts","webpack://next/./src/shared/lib/router/utils/format-url.ts","webpack://next/./src/server/server-utils.ts","webpack://next/./src/shared/lib/i18n/detect-domain-locale.ts","webpack://next/./src/shared/lib/get-hostname.ts","webpack://next/./src/shared/lib/page-path/normalize-data-path.ts","webpack://next/./src/server/request-meta.ts","webpack://next/./src/server/lib/patch-set-header.ts","webpack://next/./src/shared/lib/page-path/normalize-page-path.ts","webpack://next/./src/lib/metadata/is-metadata-route.ts","webpack://next/./src/lib/detached-promise.ts","webpack://next/./src/lib/batcher.ts","webpack://next/./src/lib/scheduler.ts","webpack://next/./src/server/stream-utils/node-web-streams-helper.ts","webpack://next/./src/server/stream-utils/encoded-tags.ts","webpack://next/./src/shared/lib/router/utils/cache-busting-search-param.ts","webpack://next/./src/shared/lib/router/utils/add-path-prefix.ts","webpack://next/./src/shared/lib/router/utils/add-path-suffix.ts","webpack://next/./src/server/web/next-url.ts","webpack://next/./src/shared/lib/router/utils/get-next-pathname-info.ts","webpack://next/./src/shared/lib/router/utils/format-next-pathname-info.ts","webpack://next/./src/shared/lib/router/utils/add-locale.ts","webpack://next/./src/server/web/spec-extension/request.ts","webpack://next/./src/server/web/spec-extension/adapters/next-request.ts","webpack://next/./src/server/client-component-renderer-logger.ts","webpack://next/./src/server/pipe-readable.ts","webpack://next/./src/server/render-result.ts","webpack://next/./src/server/response-cache/utils.ts","webpack://next/./src/server/response-cache/index.ts","webpack://next/./src/lib/multi-file-writer.ts","webpack://next/./src/server/lib/incremental-cache/file-system-cache.ts","webpack://next/./src/server/lib/to-route.ts","webpack://next/./src/server/lib/incremental-cache/index.ts","webpack://next/./src/server/lib/cache-handlers/default.ts","webpack://next/./src/server/use-cache/constants.ts","webpack://next/./src/server/use-cache/clone-cache-entry.ts","webpack://next/./src/server/use-cache/tiered-cache-handler.ts","webpack://next/./src/server/use-cache/handlers.ts","webpack://next/./src/server/app-render/interop-default.ts","webpack://next/./src/server/lib/router-utils/router-server-context.ts","webpack://next/./src/lib/is-interception-route-rewrite.ts","webpack://next/./src/client/components/app-router-headers.ts","webpack://next/./src/server/route-modules/route-module.ts","webpack://next/./src/lib/is-app-route-route.ts","webpack://next/./src/shared/lib/page-path/normalize-path-sep.ts","webpack://next/./src/shared/lib/router/utils/path-match.ts","webpack://next/./src/shared/lib/router/utils/parse-url.ts","webpack://next/./src/shared/lib/router/utils/parse-relative-url.ts","webpack://next/./src/server/lib/router-utils/decode-path-params.ts","webpack://next/./src/shared/lib/router/utils/escape-path-delimiters.ts","webpack://next/./src/lib/is-error.ts","webpack://next/./src/server/api-utils/node/parse-body.ts","webpack://next/./src/server/api-utils/node/api-resolver.ts","webpack://next/./src/server/lib/etag.ts","webpack://next/./src/server/send-payload.ts","webpack://next/./src/lib/interop-default.ts","webpack://next/./src/server/route-modules/pages-api/module.ts"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n  __webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => { def[key] = () => (value[key]) });\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/index.ts\nvar src_exports = {};\n__export(src_exports, {\n  RequestCookies: () => RequestCookies,\n  ResponseCookies: () => ResponseCookies,\n  parseCookie: () => parseCookie,\n  parseSetCookie: () => parseSetCookie,\n  stringifyCookie: () => stringifyCookie\n});\nmodule.exports = __toCommonJS(src_exports);\n\n// src/serialize.ts\nfunction stringifyCookie(c) {\n  var _a;\n  const attrs = [\n    \"path\" in c && c.path && `Path=${c.path}`,\n    \"expires\" in c && (c.expires || c.expires === 0) && `Expires=${(typeof c.expires === \"number\" ? new Date(c.expires) : c.expires).toUTCString()}`,\n    \"maxAge\" in c && typeof c.maxAge === \"number\" && `Max-Age=${c.maxAge}`,\n    \"domain\" in c && c.domain && `Domain=${c.domain}`,\n    \"secure\" in c && c.secure && \"Secure\",\n    \"httpOnly\" in c && c.httpOnly && \"HttpOnly\",\n    \"sameSite\" in c && c.sameSite && `SameSite=${c.sameSite}`,\n    \"partitioned\" in c && c.partitioned && \"Partitioned\",\n    \"priority\" in c && c.priority && `Priority=${c.priority}`\n  ].filter(Boolean);\n  const stringified = `${c.name}=${encodeURIComponent((_a = c.value) != null ? _a : \"\")}`;\n  return attrs.length === 0 ? stringified : `${stringified}; ${attrs.join(\"; \")}`;\n}\nfunction parseCookie(cookie) {\n  const map = /* @__PURE__ */ new Map();\n  for (const pair of cookie.split(/; */)) {\n    if (!pair)\n      continue;\n    const splitAt = pair.indexOf(\"=\");\n    if (splitAt === -1) {\n      map.set(pair, \"true\");\n      continue;\n    }\n    const [key, value] = [pair.slice(0, splitAt), pair.slice(splitAt + 1)];\n    try {\n      map.set(key, decodeURIComponent(value != null ? value : \"true\"));\n    } catch {\n    }\n  }\n  return map;\n}\nfunction parseSetCookie(setCookie) {\n  if (!setCookie) {\n    return void 0;\n  }\n  const [[name, value], ...attributes] = parseCookie(setCookie);\n  const {\n    domain,\n    expires,\n    httponly,\n    maxage,\n    path,\n    samesite,\n    secure,\n    partitioned,\n    priority\n  } = Object.fromEntries(\n    attributes.map(([key, value2]) => [\n      key.toLowerCase().replace(/-/g, \"\"),\n      value2\n    ])\n  );\n  const cookie = {\n    name,\n    value: decodeURIComponent(value),\n    domain,\n    ...expires && { expires: new Date(expires) },\n    ...httponly && { httpOnly: true },\n    ...typeof maxage === \"string\" && { maxAge: Number(maxage) },\n    path,\n    ...samesite && { sameSite: parseSameSite(samesite) },\n    ...secure && { secure: true },\n    ...priority && { priority: parsePriority(priority) },\n    ...partitioned && { partitioned: true }\n  };\n  return compact(cookie);\n}\nfunction compact(t) {\n  const newT = {};\n  for (const key in t) {\n    if (t[key]) {\n      newT[key] = t[key];\n    }\n  }\n  return newT;\n}\nvar SAME_SITE = [\"strict\", \"lax\", \"none\"];\nfunction parseSameSite(string) {\n  string = string.toLowerCase();\n  return SAME_SITE.includes(string) ? string : void 0;\n}\nvar PRIORITY = [\"low\", \"medium\", \"high\"];\nfunction parsePriority(string) {\n  string = string.toLowerCase();\n  return PRIORITY.includes(string) ? string : void 0;\n}\nfunction splitCookiesString(cookiesString) {\n  if (!cookiesString)\n    return [];\n  var cookiesStrings = [];\n  var pos = 0;\n  var start;\n  var ch;\n  var lastComma;\n  var nextStart;\n  var cookiesSeparatorFound;\n  function skipWhitespace() {\n    while (pos < cookiesString.length && /\\s/.test(cookiesString.charAt(pos))) {\n      pos += 1;\n    }\n    return pos < cookiesString.length;\n  }\n  function notSpecialChar() {\n    ch = cookiesString.charAt(pos);\n    return ch !== \"=\" && ch !== \";\" && ch !== \",\";\n  }\n  while (pos < cookiesString.length) {\n    start = pos;\n    cookiesSeparatorFound = false;\n    while (skipWhitespace()) {\n      ch = cookiesString.charAt(pos);\n      if (ch === \",\") {\n        lastComma = pos;\n        pos += 1;\n        skipWhitespace();\n        nextStart = pos;\n        while (pos < cookiesString.length && notSpecialChar()) {\n          pos += 1;\n        }\n        if (pos < cookiesString.length && cookiesString.charAt(pos) === \"=\") {\n          cookiesSeparatorFound = true;\n          pos = nextStart;\n          cookiesStrings.push(cookiesString.substring(start, lastComma));\n          start = pos;\n        } else {\n          pos = lastComma + 1;\n        }\n      } else {\n        pos += 1;\n      }\n    }\n    if (!cookiesSeparatorFound || pos >= cookiesString.length) {\n      cookiesStrings.push(cookiesString.substring(start, cookiesString.length));\n    }\n  }\n  return cookiesStrings;\n}\n\n// src/request-cookies.ts\nvar RequestCookies = class {\n  constructor(requestHeaders) {\n    /** @internal */\n    this._parsed = /* @__PURE__ */ new Map();\n    this._headers = requestHeaders;\n    const header = requestHeaders.get(\"cookie\");\n    if (header) {\n      const parsed = parseCookie(header);\n      for (const [name, value] of parsed) {\n        this._parsed.set(name, { name, value });\n      }\n    }\n  }\n  [Symbol.iterator]() {\n    return this._parsed[Symbol.iterator]();\n  }\n  /**\n   * The amount of cookies received from the client\n   */\n  get size() {\n    return this._parsed.size;\n  }\n  get(...args) {\n    const name = typeof args[0] === \"string\" ? args[0] : args[0].name;\n    return this._parsed.get(name);\n  }\n  getAll(...args) {\n    var _a;\n    const all = Array.from(this._parsed);\n    if (!args.length) {\n      return all.map(([_, value]) => value);\n    }\n    const name = typeof args[0] === \"string\" ? args[0] : (_a = args[0]) == null ? void 0 : _a.name;\n    return all.filter(([n]) => n === name).map(([_, value]) => value);\n  }\n  has(name) {\n    return this._parsed.has(name);\n  }\n  set(...args) {\n    const [name, value] = args.length === 1 ? [args[0].name, args[0].value] : args;\n    const map = this._parsed;\n    map.set(name, { name, value });\n    this._headers.set(\n      \"cookie\",\n      Array.from(map).map(([_, value2]) => stringifyCookie(value2)).join(\"; \")\n    );\n    return this;\n  }\n  /**\n   * Delete the cookies matching the passed name or names in the request.\n   */\n  delete(names) {\n    const map = this._parsed;\n    const result = !Array.isArray(names) ? map.delete(names) : names.map((name) => map.delete(name));\n    this._headers.set(\n      \"cookie\",\n      Array.from(map).map(([_, value]) => stringifyCookie(value)).join(\"; \")\n    );\n    return result;\n  }\n  /**\n   * Delete all the cookies in the cookies in the request.\n   */\n  clear() {\n    this.delete(Array.from(this._parsed.keys()));\n    return this;\n  }\n  /**\n   * Format the cookies in the request as a string for logging\n   */\n  [Symbol.for(\"edge-runtime.inspect.custom\")]() {\n    return `RequestCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`;\n  }\n  toString() {\n    return [...this._parsed.values()].map((v) => `${v.name}=${encodeURIComponent(v.value)}`).join(\"; \");\n  }\n};\n\n// src/response-cookies.ts\nvar ResponseCookies = class {\n  constructor(responseHeaders) {\n    /** @internal */\n    this._parsed = /* @__PURE__ */ new Map();\n    var _a, _b, _c;\n    this._headers = responseHeaders;\n    const setCookie = (_c = (_b = (_a = responseHeaders.getSetCookie) == null ? void 0 : _a.call(responseHeaders)) != null ? _b : responseHeaders.get(\"set-cookie\")) != null ? _c : [];\n    const cookieStrings = Array.isArray(setCookie) ? setCookie : splitCookiesString(setCookie);\n    for (const cookieString of cookieStrings) {\n      const parsed = parseSetCookie(cookieString);\n      if (parsed)\n        this._parsed.set(parsed.name, parsed);\n    }\n  }\n  /**\n   * {@link https://wicg.github.io/cookie-store/#CookieStore-get CookieStore#get} without the Promise.\n   */\n  get(...args) {\n    const key = typeof args[0] === \"string\" ? args[0] : args[0].name;\n    return this._parsed.get(key);\n  }\n  /**\n   * {@link https://wicg.github.io/cookie-store/#CookieStore-getAll CookieStore#getAll} without the Promise.\n   */\n  getAll(...args) {\n    var _a;\n    const all = Array.from(this._parsed.values());\n    if (!args.length) {\n      return all;\n    }\n    const key = typeof args[0] === \"string\" ? args[0] : (_a = args[0]) == null ? void 0 : _a.name;\n    return all.filter((c) => c.name === key);\n  }\n  has(name) {\n    return this._parsed.has(name);\n  }\n  /**\n   * {@link https://wicg.github.io/cookie-store/#CookieStore-set CookieStore#set} without the Promise.\n   */\n  set(...args) {\n    const [name, value, cookie] = args.length === 1 ? [args[0].name, args[0].value, args[0]] : args;\n    const map = this._parsed;\n    map.set(name, normalizeCookie({ name, value, ...cookie }));\n    replace(map, this._headers);\n    return this;\n  }\n  /**\n   * {@link https://wicg.github.io/cookie-store/#CookieStore-delete CookieStore#delete} without the Promise.\n   */\n  delete(...args) {\n    const [name, options] = typeof args[0] === \"string\" ? [args[0]] : [args[0].name, args[0]];\n    return this.set({ ...options, name, value: \"\", expires: /* @__PURE__ */ new Date(0) });\n  }\n  [Symbol.for(\"edge-runtime.inspect.custom\")]() {\n    return `ResponseCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`;\n  }\n  toString() {\n    return [...this._parsed.values()].map(stringifyCookie).join(\"; \");\n  }\n};\nfunction replace(bag, headers) {\n  headers.delete(\"set-cookie\");\n  for (const [, value] of bag) {\n    const serialized = stringifyCookie(value);\n    headers.append(\"set-cookie\", serialized);\n  }\n}\nfunction normalizeCookie(cookie = { name: \"\", value: \"\" }) {\n  if (typeof cookie.expires === \"number\") {\n    cookie.expires = new Date(cookie.expires);\n  }\n  if (cookie.maxAge) {\n    cookie.expires = new Date(Date.now() + cookie.maxAge * 1e3);\n  }\n  if (cookie.path === null || cookie.path === void 0) {\n    cookie.path = \"/\";\n  }\n  return cookie;\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n  RequestCookies,\n  ResponseCookies,\n  parseCookie,\n  parseSetCookie,\n  stringifyCookie\n});\n","(()=>{\"use strict\";var e={86:e=>{\n/*!\n * bytes\n * Copyright(c) 2012-2014 TJ Holowaychuk\n * Copyright(c) 2015 Jed Watson\n * MIT Licensed\n */\ne.exports=bytes;e.exports.format=format;e.exports.parse=parse;var r=/\\B(?=(\\d{3})+(?!\\d))/g;var a=/(?:\\.0*|(\\.[^0]+)0+)$/;var t={b:1,kb:1<<10,mb:1<<20,gb:1<<30,tb:Math.pow(1024,4),pb:Math.pow(1024,5)};var i=/^((-|\\+)?(\\d+(?:\\.\\d+)?)) *(kb|mb|gb|tb|pb)$/i;function bytes(e,r){if(typeof e===\"string\"){return parse(e)}if(typeof e===\"number\"){return format(e,r)}return null}function format(e,i){if(!Number.isFinite(e)){return null}var n=Math.abs(e);var o=i&&i.thousandsSeparator||\"\";var s=i&&i.unitSeparator||\"\";var f=i&&i.decimalPlaces!==undefined?i.decimalPlaces:2;var u=Boolean(i&&i.fixedDecimals);var p=i&&i.unit||\"\";if(!p||!t[p.toLowerCase()]){if(n>=t.pb){p=\"PB\"}else if(n>=t.tb){p=\"TB\"}else if(n>=t.gb){p=\"GB\"}else if(n>=t.mb){p=\"MB\"}else if(n>=t.kb){p=\"KB\"}else{p=\"B\"}}var b=e/t[p.toLowerCase()];var l=b.toFixed(f);if(!u){l=l.replace(a,\"$1\")}if(o){l=l.split(\".\").map((function(e,a){return a===0?e.replace(r,o):e})).join(\".\")}return l+s+p}function parse(e){if(typeof e===\"number\"&&!isNaN(e)){return e}if(typeof e!==\"string\"){return null}var r=i.exec(e);var a;var n=\"b\";if(!r){a=parseInt(e,10);n=\"b\"}else{a=parseFloat(r[1]);n=r[4].toLowerCase()}return Math.floor(t[n]*a)}}};var r={};function __nccwpck_require__(a){var t=r[a];if(t!==undefined){return t.exports}var i=r[a]={exports:{}};var n=true;try{e[a](i,i.exports,__nccwpck_require__);n=false}finally{if(n)delete r[a]}return i.exports}if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var a=__nccwpck_require__(86);module.exports=a})();","(()=>{\"use strict\";if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var e={};(()=>{var r=e;\n/*!\n * content-type\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */var t=/; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *(\"(?:[\\u000b\\u0020\\u0021\\u0023-\\u005b\\u005d-\\u007e\\u0080-\\u00ff]|\\\\[\\u000b\\u0020-\\u00ff])*\"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g;var a=/^[\\u000b\\u0020-\\u007e\\u0080-\\u00ff]+$/;var n=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;var i=/\\\\([\\u000b\\u0020-\\u00ff])/g;var o=/([\\\\\"])/g;var f=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;r.format=format;r.parse=parse;function format(e){if(!e||typeof e!==\"object\"){throw new TypeError(\"argument obj is required\")}var r=e.parameters;var t=e.type;if(!t||!f.test(t)){throw new TypeError(\"invalid type\")}var a=t;if(r&&typeof r===\"object\"){var i;var o=Object.keys(r).sort();for(var u=0;u<o.length;u++){i=o[u];if(!n.test(i)){throw new TypeError(\"invalid parameter name\")}a+=\"; \"+i+\"=\"+qstring(r[i])}}return a}function parse(e){if(!e){throw new TypeError(\"argument string is required\")}var r=typeof e===\"object\"?getcontenttype(e):e;if(typeof r!==\"string\"){throw new TypeError(\"argument string is required to be a string\")}var a=r.indexOf(\";\");var n=a!==-1?r.substr(0,a).trim():r.trim();if(!f.test(n)){throw new TypeError(\"invalid media type\")}var o=new ContentType(n.toLowerCase());if(a!==-1){var u;var p;var s;t.lastIndex=a;while(p=t.exec(r)){if(p.index!==a){throw new TypeError(\"invalid parameter format\")}a+=p[0].length;u=p[1].toLowerCase();s=p[2];if(s[0]==='\"'){s=s.substr(1,s.length-2).replace(i,\"$1\")}o.parameters[u]=s}if(a!==r.length){throw new TypeError(\"invalid parameter format\")}}return o}function getcontenttype(e){var r;if(typeof e.getHeader===\"function\"){r=e.getHeader(\"content-type\")}else if(typeof e.headers===\"object\"){r=e.headers&&e.headers[\"content-type\"]}if(typeof r!==\"string\"){throw new TypeError(\"content-type header is missing from object\")}return r}function qstring(e){var r=String(e);if(n.test(r)){return r}if(r.length>0&&!a.test(r)){throw new TypeError(\"invalid parameter value\")}return'\"'+r.replace(o,\"\\\\$1\")+'\"'}function ContentType(e){this.parameters=Object.create(null);this.type=e}})();module.exports=e})();","(()=>{\"use strict\";if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var e={};(()=>{var r=e;\n/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */r.parse=parse;r.serialize=serialize;var i=decodeURIComponent;var t=encodeURIComponent;var a=/; */;var n=/^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;function parse(e,r){if(typeof e!==\"string\"){throw new TypeError(\"argument str must be a string\")}var t={};var n=r||{};var o=e.split(a);var s=n.decode||i;for(var p=0;p<o.length;p++){var f=o[p];var u=f.indexOf(\"=\");if(u<0){continue}var v=f.substr(0,u).trim();var c=f.substr(++u,f.length).trim();if('\"'==c[0]){c=c.slice(1,-1)}if(undefined==t[v]){t[v]=tryDecode(c,s)}}return t}function serialize(e,r,i){var a=i||{};var o=a.encode||t;if(typeof o!==\"function\"){throw new TypeError(\"option encode is invalid\")}if(!n.test(e)){throw new TypeError(\"argument name is invalid\")}var s=o(r);if(s&&!n.test(s)){throw new TypeError(\"argument val is invalid\")}var p=e+\"=\"+s;if(null!=a.maxAge){var f=a.maxAge-0;if(isNaN(f)||!isFinite(f)){throw new TypeError(\"option maxAge is invalid\")}p+=\"; Max-Age=\"+Math.floor(f)}if(a.domain){if(!n.test(a.domain)){throw new TypeError(\"option domain is invalid\")}p+=\"; Domain=\"+a.domain}if(a.path){if(!n.test(a.path)){throw new TypeError(\"option path is invalid\")}p+=\"; Path=\"+a.path}if(a.expires){if(typeof a.expires.toUTCString!==\"function\"){throw new TypeError(\"option expires is invalid\")}p+=\"; Expires=\"+a.expires.toUTCString()}if(a.httpOnly){p+=\"; HttpOnly\"}if(a.secure){p+=\"; Secure\"}if(a.sameSite){var u=typeof a.sameSite===\"string\"?a.sameSite.toLowerCase():a.sameSite;switch(u){case true:p+=\"; SameSite=Strict\";break;case\"lax\":p+=\"; SameSite=Lax\";break;case\"strict\":p+=\"; SameSite=Strict\";break;case\"none\":p+=\"; SameSite=None\";break;default:throw new TypeError(\"option sameSite is invalid\")}}return p}function tryDecode(e,r){try{return r(e)}catch(r){return e}}})();module.exports=e})();","(()=>{\"use strict\";var e={928:e=>{\n/*!\n * fresh\n * Copyright(c) 2012 TJ Holowaychuk\n * Copyright(c) 2016-2017 Douglas Christopher Wilson\n * MIT Licensed\n */\nvar r=/(?:^|,)\\s*?no-cache\\s*?(?:,|$)/;e.exports=fresh;function fresh(e,a){var t=e[\"if-modified-since\"];var s=e[\"if-none-match\"];if(!t&&!s){return false}var i=e[\"cache-control\"];if(i&&r.test(i)){return false}if(s&&s!==\"*\"){var f=a[\"etag\"];if(!f){return false}var n=true;var u=parseTokenList(s);for(var _=0;_<u.length;_++){var o=u[_];if(o===f||o===\"W/\"+f||\"W/\"+o===f){n=false;break}}if(n){return false}}if(t){var p=a[\"last-modified\"];var v=!p||!(parseHttpDate(p)<=parseHttpDate(t));if(v){return false}}return true}function parseHttpDate(e){var r=e&&Date.parse(e);return typeof r===\"number\"?r:NaN}function parseTokenList(e){var r=0;var a=[];var t=0;for(var s=0,i=e.length;s<i;s++){switch(e.charCodeAt(s)){case 32:if(t===r){t=r=s+1}break;case 44:a.push(e.substring(t,r));t=r=s+1;break;default:r=s+1;break}}a.push(e.substring(t,r));return a}}};var r={};function __nccwpck_require__(a){var t=r[a];if(t!==undefined){return t.exports}var s=r[a]={exports:{}};var i=true;try{e[a](s,s.exports,__nccwpck_require__);i=false}finally{if(i)delete r[a]}return s.exports}if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var a=__nccwpck_require__(928);module.exports=a})();","(()=>{\"use strict\";if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var e={};(()=>{var n=e;Object.defineProperty(n,\"__esModule\",{value:true});n.pathToRegexp=n.tokensToRegexp=n.regexpToFunction=n.match=n.tokensToFunction=n.compile=n.parse=void 0;function lexer(e){var n=[];var r=0;while(r<e.length){var t=e[r];if(t===\"*\"||t===\"+\"||t===\"?\"){n.push({type:\"MODIFIER\",index:r,value:e[r++]});continue}if(t===\"\\\\\"){n.push({type:\"ESCAPED_CHAR\",index:r++,value:e[r++]});continue}if(t===\"{\"){n.push({type:\"OPEN\",index:r,value:e[r++]});continue}if(t===\"}\"){n.push({type:\"CLOSE\",index:r,value:e[r++]});continue}if(t===\":\"){var a=\"\";var i=r+1;while(i<e.length){var o=e.charCodeAt(i);if(o>=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122||o===95){a+=e[i++];continue}break}if(!a)throw new TypeError(\"Missing parameter name at \".concat(r));n.push({type:\"NAME\",index:r,value:a});r=i;continue}if(t===\"(\"){var c=1;var f=\"\";var i=r+1;if(e[i]===\"?\"){throw new TypeError('Pattern cannot start with \"?\" at '.concat(i))}while(i<e.length){if(e[i]===\"\\\\\"){f+=e[i++]+e[i++];continue}if(e[i]===\")\"){c--;if(c===0){i++;break}}else if(e[i]===\"(\"){c++;if(e[i+1]!==\"?\"){throw new TypeError(\"Capturing groups are not allowed at \".concat(i))}}f+=e[i++]}if(c)throw new TypeError(\"Unbalanced pattern at \".concat(r));if(!f)throw new TypeError(\"Missing pattern at \".concat(r));n.push({type:\"PATTERN\",index:r,value:f});r=i;continue}n.push({type:\"CHAR\",index:r,value:e[r++]})}n.push({type:\"END\",index:r,value:\"\"});return n}function parse(e,n){if(n===void 0){n={}}var r=lexer(e);var t=n.prefixes,a=t===void 0?\"./\":t,i=n.delimiter,o=i===void 0?\"/#?\":i;var c=[];var f=0;var u=0;var p=\"\";var tryConsume=function(e){if(u<r.length&&r[u].type===e)return r[u++].value};var mustConsume=function(e){var n=tryConsume(e);if(n!==undefined)return n;var t=r[u],a=t.type,i=t.index;throw new TypeError(\"Unexpected \".concat(a,\" at \").concat(i,\", expected \").concat(e))};var consumeText=function(){var e=\"\";var n;while(n=tryConsume(\"CHAR\")||tryConsume(\"ESCAPED_CHAR\")){e+=n}return e};var isSafe=function(e){for(var n=0,r=o;n<r.length;n++){var t=r[n];if(e.indexOf(t)>-1)return true}return false};var safePattern=function(e){var n=c[c.length-1];var r=e||(n&&typeof n===\"string\"?n:\"\");if(n&&!r){throw new TypeError('Must have text between two parameters, missing text after \"'.concat(n.name,'\"'))}if(!r||isSafe(r))return\"[^\".concat(escapeString(o),\"]+?\");return\"(?:(?!\".concat(escapeString(r),\")[^\").concat(escapeString(o),\"])+?\")};while(u<r.length){var v=tryConsume(\"CHAR\");var s=tryConsume(\"NAME\");var d=tryConsume(\"PATTERN\");if(s||d){var g=v||\"\";if(a.indexOf(g)===-1){p+=g;g=\"\"}if(p){c.push(p);p=\"\"}c.push({name:s||f++,prefix:g,suffix:\"\",pattern:d||safePattern(g),modifier:tryConsume(\"MODIFIER\")||\"\"});continue}var x=v||tryConsume(\"ESCAPED_CHAR\");if(x){p+=x;continue}if(p){c.push(p);p=\"\"}var h=tryConsume(\"OPEN\");if(h){var g=consumeText();var l=tryConsume(\"NAME\")||\"\";var m=tryConsume(\"PATTERN\")||\"\";var T=consumeText();mustConsume(\"CLOSE\");c.push({name:l||(m?f++:\"\"),pattern:l&&!m?safePattern(g):m,prefix:g,suffix:T,modifier:tryConsume(\"MODIFIER\")||\"\"});continue}mustConsume(\"END\")}return c}n.parse=parse;function compile(e,n){return tokensToFunction(parse(e,n),n)}n.compile=compile;function tokensToFunction(e,n){if(n===void 0){n={}}var r=flags(n);var t=n.encode,a=t===void 0?function(e){return e}:t,i=n.validate,o=i===void 0?true:i;var c=e.map((function(e){if(typeof e===\"object\"){return new RegExp(\"^(?:\".concat(e.pattern,\")$\"),r)}}));return function(n){var r=\"\";for(var t=0;t<e.length;t++){var i=e[t];if(typeof i===\"string\"){r+=i;continue}var f=n?n[i.name]:undefined;var u=i.modifier===\"?\"||i.modifier===\"*\";var p=i.modifier===\"*\"||i.modifier===\"+\";if(Array.isArray(f)){if(!p){throw new TypeError('Expected \"'.concat(i.name,'\" to not repeat, but got an array'))}if(f.length===0){if(u)continue;throw new TypeError('Expected \"'.concat(i.name,'\" to not be empty'))}for(var v=0;v<f.length;v++){var s=a(f[v],i);if(o&&!c[t].test(s)){throw new TypeError('Expected all \"'.concat(i.name,'\" to match \"').concat(i.pattern,'\", but got \"').concat(s,'\"'))}r+=i.prefix+s+i.suffix}continue}if(typeof f===\"string\"||typeof f===\"number\"){var s=a(String(f),i);if(o&&!c[t].test(s)){throw new TypeError('Expected \"'.concat(i.name,'\" to match \"').concat(i.pattern,'\", but got \"').concat(s,'\"'))}r+=i.prefix+s+i.suffix;continue}if(u)continue;var d=p?\"an array\":\"a string\";throw new TypeError('Expected \"'.concat(i.name,'\" to be ').concat(d))}return r}}n.tokensToFunction=tokensToFunction;function match(e,n){var r=[];var t=pathToRegexp(e,r,n);return regexpToFunction(t,r,n)}n.match=match;function regexpToFunction(e,n,r){if(r===void 0){r={}}var t=r.decode,a=t===void 0?function(e){return e}:t;return function(r){var t=e.exec(r);if(!t)return false;var i=t[0],o=t.index;var c=Object.create(null);var _loop_1=function(e){if(t[e]===undefined)return\"continue\";var r=n[e-1];if(r.modifier===\"*\"||r.modifier===\"+\"){c[r.name]=t[e].split(r.prefix+r.suffix).map((function(e){return a(e,r)}))}else{c[r.name]=a(t[e],r)}};for(var f=1;f<t.length;f++){_loop_1(f)}return{path:i,index:o,params:c}}}n.regexpToFunction=regexpToFunction;function escapeString(e){return e.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g,\"\\\\$1\")}function flags(e){return e&&e.sensitive?\"\":\"i\"}function regexpToRegexp(e,n){if(!n)return e;var r=/\\((?:\\?<(.*?)>)?(?!\\?)/g;var t=0;var a=r.exec(e.source);while(a){n.push({name:a[1]||t++,prefix:\"\",suffix:\"\",modifier:\"\",pattern:\"\"});a=r.exec(e.source)}return e}function arrayToRegexp(e,n,r){var t=e.map((function(e){return pathToRegexp(e,n,r).source}));return new RegExp(\"(?:\".concat(t.join(\"|\"),\")\"),flags(r))}function stringToRegexp(e,n,r){return tokensToRegexp(parse(e,r),n,r)}function tokensToRegexp(e,n,r){if(r===void 0){r={}}var t=r.strict,a=t===void 0?false:t,i=r.start,o=i===void 0?true:i,c=r.end,f=c===void 0?true:c,u=r.encode,p=u===void 0?function(e){return e}:u,v=r.delimiter,s=v===void 0?\"/#?\":v,d=r.endsWith,g=d===void 0?\"\":d;var x=\"[\".concat(escapeString(g),\"]|$\");var h=\"[\".concat(escapeString(s),\"]\");var l=o?\"^\":\"\";for(var m=0,T=e;m<T.length;m++){var E=T[m];if(typeof E===\"string\"){l+=escapeString(p(E))}else{var w=escapeString(p(E.prefix));var y=escapeString(p(E.suffix));if(E.pattern){if(n)n.push(E);if(w||y){if(E.modifier===\"+\"||E.modifier===\"*\"){var R=E.modifier===\"*\"?\"?\":\"\";l+=\"(?:\".concat(w,\"((?:\").concat(E.pattern,\")(?:\").concat(y).concat(w,\"(?:\").concat(E.pattern,\"))*)\").concat(y,\")\").concat(R)}else{l+=\"(?:\".concat(w,\"(\").concat(E.pattern,\")\").concat(y,\")\").concat(E.modifier)}}else{if(E.modifier===\"+\"||E.modifier===\"*\"){throw new TypeError('Can not repeat \"'.concat(E.name,'\" without a prefix and suffix'))}l+=\"(\".concat(E.pattern,\")\").concat(E.modifier)}}else{l+=\"(?:\".concat(w).concat(y,\")\").concat(E.modifier)}}}if(f){if(!a)l+=\"\".concat(h,\"?\");l+=!r.endsWith?\"$\":\"(?=\".concat(x,\")\")}else{var A=e[e.length-1];var _=typeof A===\"string\"?h.indexOf(A[A.length-1])>-1:A===undefined;if(!a){l+=\"(?:\".concat(h,\"(?=\").concat(x,\"))?\")}if(!_){l+=\"(?=\".concat(h,\"|\").concat(x,\")\")}}return new RegExp(l,flags(r))}n.tokensToRegexp=tokensToRegexp;function pathToRegexp(e,n,r){if(e instanceof RegExp)return regexpToRegexp(e,n);if(Array.isArray(e))return arrayToRegexp(e,n,r);return stringToRegexp(e,n,r)}n.pathToRegexp=pathToRegexp})();module.exports=e})();","// ISC License\n\n// Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov\n\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n//\n// https://github.com/alexeyraspopov/picocolors/blob/b6261487e7b81aaab2440e397a356732cad9e342/picocolors.js#L1\n\nconst { env, stdout } = globalThis?.process ?? {}\n\nconst enabled =\n  env &&\n  !env.NO_COLOR &&\n  (env.FORCE_COLOR || (stdout?.isTTY && !env.CI && env.TERM !== 'dumb'))\n\nconst replaceClose = (\n  str: string,\n  close: string,\n  replace: string,\n  index: number\n): string => {\n  const start = str.substring(0, index) + replace\n  const end = str.substring(index + close.length)\n  const nextIndex = end.indexOf(close)\n  return ~nextIndex\n    ? start + replaceClose(end, close, replace, nextIndex)\n    : start + end\n}\n\nconst formatter = (open: string, close: string, replace = open) => {\n  if (!enabled) return String\n  return (input: string) => {\n    const string = '' + input\n    const index = string.indexOf(close, open.length)\n    return ~index\n      ? open + replaceClose(string, close, replace, index) + close\n      : open + string + close\n  }\n}\n\nexport const reset = enabled ? (s: string) => `\\x1b[0m${s}\\x1b[0m` : String\nexport const bold = formatter('\\x1b[1m', '\\x1b[22m', '\\x1b[22m\\x1b[1m')\nexport const dim = formatter('\\x1b[2m', '\\x1b[22m', '\\x1b[22m\\x1b[2m')\nexport const italic = formatter('\\x1b[3m', '\\x1b[23m')\nexport const underline = formatter('\\x1b[4m', '\\x1b[24m')\nexport const inverse = formatter('\\x1b[7m', '\\x1b[27m')\nexport const hidden = formatter('\\x1b[8m', '\\x1b[28m')\nexport const strikethrough = formatter('\\x1b[9m', '\\x1b[29m')\nexport const black = formatter('\\x1b[30m', '\\x1b[39m')\nexport const red = formatter('\\x1b[31m', '\\x1b[39m')\nexport const green = formatter('\\x1b[32m', '\\x1b[39m')\nexport const yellow = formatter('\\x1b[33m', '\\x1b[39m')\nexport const blue = formatter('\\x1b[34m', '\\x1b[39m')\nexport const magenta = formatter('\\x1b[35m', '\\x1b[39m')\nexport const purple = formatter('\\x1b[38;2;173;127;168m', '\\x1b[39m')\nexport const cyan = formatter('\\x1b[36m', '\\x1b[39m')\nexport const white = formatter('\\x1b[37m', '\\x1b[39m')\nexport const gray = formatter('\\x1b[90m', '\\x1b[39m')\nexport const bgBlack = formatter('\\x1b[40m', '\\x1b[49m')\nexport const bgRed = formatter('\\x1b[41m', '\\x1b[49m')\nexport const bgGreen = formatter('\\x1b[42m', '\\x1b[49m')\nexport const bgYellow = formatter('\\x1b[43m', '\\x1b[49m')\nexport const bgBlue = formatter('\\x1b[44m', '\\x1b[49m')\nexport const bgMagenta = formatter('\\x1b[45m', '\\x1b[49m')\nexport const bgCyan = formatter('\\x1b[46m', '\\x1b[49m')\nexport const bgWhite = formatter('\\x1b[47m', '\\x1b[49m')\n","import { bold, green, magenta, red, yellow, white } from '../../lib/picocolors'\nimport { LRUCache } from '../../server/lib/lru-cache'\n\nexport const prefixes = {\n  wait: white(bold('○')),\n  error: red(bold('⨯')),\n  warn: yellow(bold('⚠')),\n  ready: '▲', // no color\n  info: white(bold(' ')),\n  event: green(bold('✓')),\n  trace: magenta(bold('»')),\n} as const\n\nconst LOGGING_METHOD = {\n  log: 'log',\n  warn: 'warn',\n  error: 'error',\n} as const\n\nfunction prefixedLog(prefixType: keyof typeof prefixes, ...message: any[]) {\n  if ((message[0] === '' || message[0] === undefined) && message.length === 1) {\n    message.shift()\n  }\n\n  const consoleMethod: keyof typeof LOGGING_METHOD =\n    prefixType in LOGGING_METHOD\n      ? LOGGING_METHOD[prefixType as keyof typeof LOGGING_METHOD]\n      : 'log'\n\n  const prefix = prefixes[prefixType]\n  // If there's no message, don't print the prefix but a new line\n  if (message.length === 0) {\n    console[consoleMethod]('')\n  } else {\n    // Ensure if there's ANSI escape codes it's concatenated into one string.\n    // Chrome DevTool can only handle color if it's in one string.\n    if (message.length === 1 && typeof message[0] === 'string') {\n      console[consoleMethod](prefix + ' ' + message[0])\n    } else {\n      console[consoleMethod](prefix, ...message)\n    }\n  }\n}\n\nexport function bootstrap(message: string) {\n  console.log(message)\n}\n\nexport function wait(...message: any[]) {\n  prefixedLog('wait', ...message)\n}\n\nexport function error(...message: any[]) {\n  prefixedLog('error', ...message)\n}\n\nexport function warn(...message: any[]) {\n  prefixedLog('warn', ...message)\n}\n\nexport function ready(...message: any[]) {\n  prefixedLog('ready', ...message)\n}\n\nexport function info(...message: any[]) {\n  prefixedLog('info', ...message)\n}\n\nexport function event(...message: any[]) {\n  prefixedLog('event', ...message)\n}\n\nexport function trace(...message: any[]) {\n  prefixedLog('trace', ...message)\n}\n\nconst warnOnceCache = new LRUCache<string>(10_000, (value) => value.length)\nexport function warnOnce(...message: any[]) {\n  const key = message.join(' ')\n  if (!warnOnceCache.has(key)) {\n    warnOnceCache.set(key, key)\n    warn(...message)\n  }\n}\n\nconst errorOnceCache = new LRUCache<string>(10_000, (value) => value.length)\nexport function errorOnce(...message: any[]) {\n  const key = message.join(' ')\n  if (!errorOnceCache.has(key)) {\n    errorOnceCache.set(key, key)\n    error(...message)\n  }\n}\n","import type { ServerRuntime } from '../types'\n\nexport const TEXT_PLAIN_CONTENT_TYPE_HEADER = 'text/plain'\nexport const HTML_CONTENT_TYPE_HEADER = 'text/html; charset=utf-8'\nexport const JSON_CONTENT_TYPE_HEADER = 'application/json; charset=utf-8'\nexport const NEXT_QUERY_PARAM_PREFIX = 'nxtP'\nexport const NEXT_INTERCEPTION_MARKER_PREFIX = 'nxtI'\n\nexport const MATCHED_PATH_HEADER = 'x-matched-path'\nexport const PRERENDER_REVALIDATE_HEADER = 'x-prerender-revalidate'\nexport const PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER =\n  'x-prerender-revalidate-if-generated'\n\nexport const RSC_SEGMENTS_DIR_SUFFIX = '.segments'\nexport const RSC_SEGMENT_SUFFIX = '.segment.rsc'\nexport const RSC_SUFFIX = '.rsc'\nexport const ACTION_SUFFIX = '.action'\nexport const NEXT_DATA_SUFFIX = '.json'\nexport const NEXT_META_SUFFIX = '.meta'\nexport const NEXT_BODY_SUFFIX = '.body'\n\nexport const NEXT_NAV_DEPLOYMENT_ID_HEADER = 'x-nextjs-deployment-id'\n\nexport const NEXT_CACHE_TAGS_HEADER = 'x-next-cache-tags'\nexport const NEXT_CACHE_REVALIDATED_TAGS_HEADER = 'x-next-revalidated-tags'\nexport const NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER =\n  'x-next-revalidate-tag-token'\n\nexport const NEXT_RESUME_HEADER = 'next-resume'\nexport const NEXT_RESUME_STATE_LENGTH_HEADER = 'x-next-resume-state-length'\n\n// if these change make sure we update the related\n// documentation as well\nexport const NEXT_CACHE_TAG_MAX_ITEMS = 128\nexport const NEXT_CACHE_TAG_MAX_LENGTH = 256\nexport const NEXT_CACHE_SOFT_TAG_MAX_LENGTH = 1024\nexport const NEXT_CACHE_IMPLICIT_TAG_ID = '_N_T_'\nexport const NEXT_CACHE_ROOT_PARAM_TAG_ID = '_N_RP_'\n\n// in seconds\nexport const CACHE_ONE_YEAR_SECONDS = 31536000\n\n// in seconds, represents revalidate=false. I.e. never revaliate.\n// We use this value since it can be represented as a V8 SMI for optimal performance.\n// It can also be serialized as JSON if it ever leaks accidentally as an actual value.\nexport const INFINITE_CACHE = 0xfffffffe\n\n// Patterns to detect middleware files\nexport const MIDDLEWARE_FILENAME = 'middleware'\nexport const MIDDLEWARE_LOCATION_REGEXP = `(?:src/)?${MIDDLEWARE_FILENAME}`\n\n// Patterns to detect proxy files (replacement for middleware)\nexport const PROXY_FILENAME = 'proxy'\nexport const PROXY_LOCATION_REGEXP = `(?:src/)?${PROXY_FILENAME}`\n\n// Pattern to detect instrumentation hooks file\nexport const INSTRUMENTATION_HOOK_FILENAME = 'instrumentation'\n\n// Because on Windows absolute paths in the generated code can break because of numbers, eg 1 in the path,\n// we have to use a private alias\nexport const PAGES_DIR_ALIAS = 'private-next-pages'\nexport const DOT_NEXT_ALIAS = 'private-dot-next'\nexport const ROOT_DIR_ALIAS = 'private-next-root-dir'\nexport const APP_DIR_ALIAS = 'private-next-app-dir'\nexport const RSC_MOD_REF_PROXY_ALIAS = 'private-next-rsc-mod-ref-proxy'\nexport const RSC_ACTION_VALIDATE_ALIAS = 'private-next-rsc-action-validate'\nexport const RSC_ACTION_PROXY_ALIAS = 'private-next-rsc-server-reference'\nexport const RSC_CACHE_WRAPPER_ALIAS = 'private-next-rsc-cache-wrapper'\nexport const RSC_DYNAMIC_IMPORT_WRAPPER_ALIAS =\n  'private-next-rsc-track-dynamic-import'\nexport const RSC_ACTION_ENCRYPTION_ALIAS = 'private-next-rsc-action-encryption'\nexport const RSC_ACTION_CLIENT_WRAPPER_ALIAS =\n  'private-next-rsc-action-client-wrapper'\n\nexport const PUBLIC_DIR_MIDDLEWARE_CONFLICT = `You can not have a '_next' folder inside of your public folder. This conflicts with the internal '/_next' route. https://nextjs.org/docs/messages/public-next-folder-conflict`\n\nexport const SSG_GET_INITIAL_PROPS_CONFLICT = `You can not use getInitialProps with getStaticProps. To use SSG, please remove your getInitialProps`\n\nexport const SERVER_PROPS_GET_INIT_PROPS_CONFLICT = `You can not use getInitialProps with getServerSideProps. Please remove getInitialProps.`\n\nexport const SERVER_PROPS_SSG_CONFLICT = `You can not use getStaticProps or getStaticPaths with getServerSideProps. To use SSG, please remove getServerSideProps`\n\nexport const STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR = `can not have getInitialProps/getServerSideProps, https://nextjs.org/docs/messages/404-get-initial-props`\n\nexport const SERVER_PROPS_EXPORT_ERROR = `pages with \\`getServerSideProps\\` can not be exported. See more info here: https://nextjs.org/docs/messages/gssp-export`\n\nexport const GSP_NO_RETURNED_VALUE =\n  'Your `getStaticProps` function did not return an object. Did you forget to add a `return`?'\nexport const GSSP_NO_RETURNED_VALUE =\n  'Your `getServerSideProps` function did not return an object. Did you forget to add a `return`?'\n\nexport const UNSTABLE_REVALIDATE_RENAME_ERROR =\n  'The `unstable_revalidate` property is available for general use.\\n' +\n  'Please use `revalidate` instead.'\n\nexport const GSSP_COMPONENT_MEMBER_ERROR = `can not be attached to a page's component and must be exported from the page. See more info here: https://nextjs.org/docs/messages/gssp-component-member`\n\nexport const NON_STANDARD_NODE_ENV = `You are using a non-standard \"NODE_ENV\" value in your environment. This creates inconsistencies in the project and is strongly advised against. Read more: https://nextjs.org/docs/messages/non-standard-node-env`\n\nexport const SSG_FALLBACK_EXPORT_ERROR = `Pages with \\`fallback\\` enabled in \\`getStaticPaths\\` can not be exported. See more info here: https://nextjs.org/docs/messages/ssg-fallback-true-export`\n\nexport const ESLINT_DEFAULT_DIRS = ['app', 'pages', 'components', 'lib', 'src']\n\nexport const SERVER_RUNTIME: Record<string, ServerRuntime> = {\n  edge: 'edge',\n  experimentalEdge: 'experimental-edge',\n  nodejs: 'nodejs',\n}\n\nexport const WEB_SOCKET_MAX_RECONNECTIONS = 12\n\n/**\n * The names of the webpack layers. These layers are the primitives for the\n * webpack chunks.\n */\nconst WEBPACK_LAYERS_NAMES = {\n  /**\n   * The layer for the shared code between the client and server bundles.\n   */\n  shared: 'shared',\n  /**\n   * The layer for server-only runtime and picking up `react-server` export conditions.\n   * Including app router RSC pages and app router custom routes and metadata routes.\n   */\n  reactServerComponents: 'rsc',\n  /**\n   * Server Side Rendering layer for app (ssr).\n   */\n  serverSideRendering: 'ssr',\n  /**\n   * The browser client bundle layer for actions.\n   */\n  actionBrowser: 'action-browser',\n  /**\n   * The Node.js bundle layer for the API routes.\n   */\n  apiNode: 'api-node',\n  /**\n   * The Edge Lite bundle layer for the API routes.\n   */\n  apiEdge: 'api-edge',\n  /**\n   * The layer for the middleware code.\n   */\n  middleware: 'middleware',\n  /**\n   * The layer for the instrumentation hooks.\n   */\n  instrument: 'instrument',\n  /**\n   * The layer for assets on the edge.\n   */\n  edgeAsset: 'edge-asset',\n  /**\n   * The browser client bundle layer for App directory.\n   */\n  appPagesBrowser: 'app-pages-browser',\n  /**\n   * The browser client bundle layer for Pages directory.\n   */\n  pagesDirBrowser: 'pages-dir-browser',\n  /**\n   * The Edge Lite bundle layer for Pages directory.\n   */\n  pagesDirEdge: 'pages-dir-edge',\n  /**\n   * The Node.js bundle layer for Pages directory.\n   */\n  pagesDirNode: 'pages-dir-node',\n} as const\n\nexport type WebpackLayerName =\n  (typeof WEBPACK_LAYERS_NAMES)[keyof typeof WEBPACK_LAYERS_NAMES]\n\nconst WEBPACK_LAYERS = {\n  ...WEBPACK_LAYERS_NAMES,\n  GROUP: {\n    builtinReact: [\n      WEBPACK_LAYERS_NAMES.reactServerComponents,\n      WEBPACK_LAYERS_NAMES.actionBrowser,\n    ],\n    serverOnly: [\n      WEBPACK_LAYERS_NAMES.reactServerComponents,\n      WEBPACK_LAYERS_NAMES.actionBrowser,\n      WEBPACK_LAYERS_NAMES.instrument,\n      WEBPACK_LAYERS_NAMES.middleware,\n    ],\n    neutralTarget: [\n      // pages api\n      WEBPACK_LAYERS_NAMES.apiNode,\n      WEBPACK_LAYERS_NAMES.apiEdge,\n    ],\n    clientOnly: [\n      WEBPACK_LAYERS_NAMES.serverSideRendering,\n      WEBPACK_LAYERS_NAMES.appPagesBrowser,\n    ],\n    bundled: [\n      WEBPACK_LAYERS_NAMES.reactServerComponents,\n      WEBPACK_LAYERS_NAMES.actionBrowser,\n      WEBPACK_LAYERS_NAMES.serverSideRendering,\n      WEBPACK_LAYERS_NAMES.appPagesBrowser,\n      WEBPACK_LAYERS_NAMES.shared,\n      WEBPACK_LAYERS_NAMES.instrument,\n      WEBPACK_LAYERS_NAMES.middleware,\n    ],\n    appPages: [\n      // app router pages and layouts\n      WEBPACK_LAYERS_NAMES.reactServerComponents,\n      WEBPACK_LAYERS_NAMES.serverSideRendering,\n      WEBPACK_LAYERS_NAMES.appPagesBrowser,\n      WEBPACK_LAYERS_NAMES.actionBrowser,\n    ],\n  },\n}\n\nconst WEBPACK_RESOURCE_QUERIES = {\n  edgeSSREntry: '__next_edge_ssr_entry__',\n  metadata: '__next_metadata__',\n  metadataRoute: '__next_metadata_route__',\n  metadataImageMeta: '__next_metadata_image_meta__',\n}\n\nexport { WEBPACK_LAYERS, WEBPACK_RESOURCE_QUERIES }\n","import path from 'path'\nimport { pathToFileURL, fileURLToPath } from 'url'\n\n/**\n * Converts a cache handler path to a filesystem path.\n * ESM's import.meta.resolve() returns file:// URLs which break when concatenated\n * with .next/ or used with path.join/path.relative.\n * @param filePath - Absolute path, relative path, or file:// URL (e.g. from import.meta.resolve)\n * @returns A filesystem path suitable for path operations\n */\nexport function resolveCacheHandlerPathToFilesystem(filePath: string): string {\n  if (filePath.startsWith('file://')) {\n    return fileURLToPath(filePath)\n  }\n  return filePath\n}\n\n/**\n * The path for a dynamic route must be URLs with a valid scheme.\n *\n * When an absolute Windows path is passed to it, it interprets the beginning of the path as a protocol (`C:`).\n * Therefore, it is important to always construct a complete path.\n * @param dir File directory\n * @param filePath Absolute or relative path, or file:// URL (e.g. from import.meta.resolve)\n */\nexport const formatDynamicImportPath = (dir: string, filePath: string) => {\n  const resolvedFilePath = resolveCacheHandlerPathToFilesystem(filePath)\n\n  const absoluteFilePath = path.isAbsolute(resolvedFilePath)\n    ? resolvedFilePath\n    : path.join(dir, resolvedFilePath)\n  const formattedFilePath = pathToFileURL(absoluteFilePath).toString()\n\n  return formattedFilePath\n}\n","import type { IncomingHttpHeaders, IncomingMessage } from 'http'\nimport type { CookieSerializeOptions } from 'next/dist/compiled/cookie'\nimport type { NextApiResponse } from '../../shared/lib/utils'\n\nimport { HeadersAdapter } from '../web/spec-extension/adapters/headers'\nimport {\n  PRERENDER_REVALIDATE_HEADER,\n  PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER,\n} from '../../lib/constants'\nimport { getTracer } from '../lib/trace/tracer'\nimport { NodeSpan } from '../lib/trace/constants'\n\nexport type NextApiRequestCookies = Partial<{ [key: string]: string }>\nexport type NextApiRequestQuery = Partial<{ [key: string]: string | string[] }>\n\nexport type __ApiPreviewProps = {\n  previewModeId: string\n  previewModeEncryptionKey: string\n  previewModeSigningKey: string\n}\n\nexport function wrapApiHandler<T extends (...args: any[]) => any>(\n  page: string,\n  handler: T\n): T {\n  return ((...args) => {\n    getTracer().setRootSpanAttribute('next.route', page)\n    // Call API route method\n    return getTracer().trace(\n      NodeSpan.runHandler,\n      {\n        spanName: `executing api route (pages) ${page}`,\n      },\n      () => handler(...args)\n    )\n  }) as T\n}\n\n/**\n *\n * @param res response object\n * @param statusCode `HTTP` status code of response\n */\nexport function sendStatusCode(\n  res: NextApiResponse,\n  statusCode: number\n): NextApiResponse<any> {\n  res.statusCode = statusCode\n  return res\n}\n\n/**\n *\n * @param res response object\n * @param [statusOrUrl] `HTTP` status code of redirect\n * @param url URL of redirect\n */\nexport function redirect(\n  res: NextApiResponse,\n  statusOrUrl: string | number,\n  url?: string\n): NextApiResponse<any> {\n  if (typeof statusOrUrl === 'string') {\n    url = statusOrUrl\n    statusOrUrl = 307\n  }\n  if (typeof statusOrUrl !== 'number' || typeof url !== 'string') {\n    throw new Error(\n      `Invalid redirect arguments. Please use a single argument URL, e.g. res.redirect('/destination') or use a status code and URL, e.g. res.redirect(307, '/destination').`\n    )\n  }\n  res.writeHead(statusOrUrl, { Location: url })\n  res.write(url)\n  res.end()\n  return res\n}\n\nexport function checkIsOnDemandRevalidate(\n  rawHeaders: Headers | IncomingHttpHeaders,\n  previewProps: __ApiPreviewProps\n): {\n  isOnDemandRevalidate: boolean\n  revalidateOnlyGenerated: boolean\n} {\n  // Headers is a plain object for Node.js, Headers object in Edge runtime\n  if (typeof rawHeaders.get === 'function') {\n    const headers = HeadersAdapter.from(rawHeaders)\n\n    const previewModeId = headers.get(PRERENDER_REVALIDATE_HEADER)\n    const isOnDemandRevalidate = previewModeId === previewProps.previewModeId\n\n    const revalidateOnlyGenerated = headers.has(\n      PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER\n    )\n\n    return { isOnDemandRevalidate, revalidateOnlyGenerated }\n  }\n\n  const headers = rawHeaders as IncomingHttpHeaders\n\n  const previewModeId = headers[PRERENDER_REVALIDATE_HEADER]\n  const isOnDemandRevalidate = previewModeId === previewProps.previewModeId\n\n  const revalidateOnlyGenerated = headers.hasOwnProperty(\n    PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER\n  )\n\n  return { isOnDemandRevalidate, revalidateOnlyGenerated }\n}\n\nexport const COOKIE_NAME_PRERENDER_BYPASS = `__prerender_bypass`\nexport const COOKIE_NAME_PRERENDER_DATA = `__next_preview_data`\n\nexport const RESPONSE_LIMIT_DEFAULT = 4 * 1024 * 1024\n\nexport const SYMBOL_PREVIEW_DATA = Symbol(COOKIE_NAME_PRERENDER_DATA)\nexport const SYMBOL_CLEARED_COOKIES = Symbol(COOKIE_NAME_PRERENDER_BYPASS)\n\nexport function clearPreviewData<T>(\n  res: NextApiResponse<T>,\n  options: {\n    path?: string\n  } = {}\n): NextApiResponse<T> {\n  if (SYMBOL_CLEARED_COOKIES in res) {\n    return res\n  }\n\n  const { serialize } =\n    require('next/dist/compiled/cookie') as typeof import('next/dist/compiled/cookie')\n  const previous = res.getHeader('Set-Cookie')\n  res.setHeader(`Set-Cookie`, [\n    ...(typeof previous === 'string'\n      ? [previous]\n      : Array.isArray(previous)\n        ? previous\n        : []),\n    serialize(COOKIE_NAME_PRERENDER_BYPASS, '', {\n      // To delete a cookie, set `expires` to a date in the past:\n      // https://tools.ietf.org/html/rfc6265#section-4.1.1\n      // `Max-Age: 0` is not valid, thus ignored, and the cookie is persisted.\n      expires: new Date(0),\n      httpOnly: true,\n      sameSite: process.env.NODE_ENV !== 'development' ? 'none' : 'lax',\n      secure: process.env.NODE_ENV !== 'development',\n      path: '/',\n      ...(options.path !== undefined\n        ? ({ path: options.path } as CookieSerializeOptions)\n        : undefined),\n    }),\n    serialize(COOKIE_NAME_PRERENDER_DATA, '', {\n      // To delete a cookie, set `expires` to a date in the past:\n      // https://tools.ietf.org/html/rfc6265#section-4.1.1\n      // `Max-Age: 0` is not valid, thus ignored, and the cookie is persisted.\n      expires: new Date(0),\n      httpOnly: true,\n      sameSite: process.env.NODE_ENV !== 'development' ? 'none' : 'lax',\n      secure: process.env.NODE_ENV !== 'development',\n      path: '/',\n      ...(options.path !== undefined\n        ? ({ path: options.path } as CookieSerializeOptions)\n        : undefined),\n    }),\n  ])\n\n  Object.defineProperty(res, SYMBOL_CLEARED_COOKIES, {\n    value: true,\n    enumerable: false,\n  })\n  return res\n}\n\n/**\n * Custom error class\n */\nexport class ApiError extends Error {\n  readonly statusCode: number\n\n  constructor(statusCode: number, message: string) {\n    super(message)\n    this.statusCode = statusCode\n  }\n}\n\n/**\n * Sends error in `response`\n * @param res response object\n * @param statusCode of response\n * @param message of response\n */\nexport function sendError(\n  res: NextApiResponse,\n  statusCode: number,\n  message: string\n): void {\n  res.statusCode = statusCode\n  res.statusMessage = message\n  res.end(message)\n}\n\ninterface LazyProps {\n  req: IncomingMessage\n}\n\n/**\n * Execute getter function only if its needed\n * @param LazyProps `req` and `params` for lazyProp\n * @param prop name of property\n * @param getter function to get data\n */\nexport function setLazyProp<T>(\n  { req }: LazyProps,\n  prop: string,\n  getter: () => T\n): void {\n  const opts = { configurable: true, enumerable: true }\n  const optsReset = { ...opts, writable: true }\n\n  Object.defineProperty(req, prop, {\n    ...opts,\n    get: () => {\n      const value = getter()\n      // we set the property on the object to avoid recalculating it\n      Object.defineProperty(req, prop, { ...optsReset, value })\n      return value\n    },\n    set: (value) => {\n      Object.defineProperty(req, prop, { ...optsReset, value })\n    },\n  })\n}\n","import type { IncomingMessage, ServerResponse } from 'http'\nimport type { NextApiResponse } from '../../../shared/lib/utils'\nimport { checkIsOnDemandRevalidate } from '../.'\nimport type { __ApiPreviewProps } from '../.'\nimport type { BaseNextRequest, BaseNextResponse } from '../../base-http'\nimport type { PreviewData } from '../../../types'\n\nimport {\n  clearPreviewData,\n  COOKIE_NAME_PRERENDER_BYPASS,\n  COOKIE_NAME_PRERENDER_DATA,\n  SYMBOL_PREVIEW_DATA,\n} from '../index'\nimport { RequestCookies } from '../../web/spec-extension/cookies'\nimport { HeadersAdapter } from '../../web/spec-extension/adapters/headers'\n\nexport function tryGetPreviewData(\n  req: IncomingMessage | BaseNextRequest | Request,\n  res: ServerResponse | BaseNextResponse,\n  options: __ApiPreviewProps,\n  multiZoneDraftMode: boolean\n): PreviewData {\n  // if an On-Demand revalidation is being done preview mode\n  // is disabled\n  if (\n    options &&\n    checkIsOnDemandRevalidate(req.headers, options).isOnDemandRevalidate\n  ) {\n    return false\n  }\n\n  // Read cached preview data if present\n  // TODO: use request metadata instead of a symbol\n  if (SYMBOL_PREVIEW_DATA in req) {\n    return (req as any)[SYMBOL_PREVIEW_DATA] as any\n  }\n\n  const headers = HeadersAdapter.from(req.headers)\n  const cookies = new RequestCookies(headers)\n\n  const previewModeId = cookies.get(COOKIE_NAME_PRERENDER_BYPASS)?.value\n  const tokenPreviewData = cookies.get(COOKIE_NAME_PRERENDER_DATA)?.value\n  const isValidPreviewModeId =\n    previewModeId === options.previewModeId ||\n    // In dev mode, the cookie can be the actual hash value preview id but the\n    // preview props can still be `development-id`.\n    (process.env.NODE_ENV !== 'production' &&\n      options.previewModeId === 'development-id')\n\n  // Case: preview mode cookie set but data cookie is not set\n  if (previewModeId && !tokenPreviewData && isValidPreviewModeId) {\n    // This is \"Draft Mode\" which doesn't use\n    // previewData, so we return an empty object\n    // for backwards compat with \"Preview Mode\".\n    const data = {}\n    Object.defineProperty(req, SYMBOL_PREVIEW_DATA, {\n      value: data,\n      enumerable: false,\n    })\n    return data\n  }\n\n  // Case: neither cookie is set.\n  if (!previewModeId && !tokenPreviewData) {\n    return false\n  }\n\n  // Case: one cookie is set, but not the other.\n  if (!previewModeId || !tokenPreviewData) {\n    if (!multiZoneDraftMode) {\n      clearPreviewData(res as NextApiResponse)\n    }\n    return false\n  }\n\n  // Case: preview session is for an old build.\n  if (previewModeId !== options.previewModeId) {\n    if (!multiZoneDraftMode) {\n      clearPreviewData(res as NextApiResponse)\n    }\n    return false\n  }\n\n  let encryptedPreviewData: {\n    data: string\n  }\n  try {\n    const jsonwebtoken =\n      require('next/dist/compiled/jsonwebtoken') as typeof import('next/dist/compiled/jsonwebtoken')\n    encryptedPreviewData = jsonwebtoken.verify(\n      tokenPreviewData,\n      options.previewModeSigningKey\n    ) as typeof encryptedPreviewData\n  } catch {\n    // TODO: warn\n    clearPreviewData(res as NextApiResponse)\n    return false\n  }\n\n  const { decryptWithSecret } =\n    require('../../crypto-utils') as typeof import('../../crypto-utils')\n  const decryptedPreviewData = decryptWithSecret(\n    Buffer.from(options.previewModeEncryptionKey),\n    encryptedPreviewData.data\n  )\n\n  try {\n    // TODO: strict runtime type checking\n    const data = JSON.parse(decryptedPreviewData)\n    // Cache lookup\n    Object.defineProperty(req, SYMBOL_PREVIEW_DATA, {\n      value: data,\n      enumerable: false,\n    })\n    return data\n  } catch {\n    return false\n  }\n}\n","import crypto from 'crypto'\n\n// Background:\n// https://security.stackexchange.com/questions/184305/why-would-i-ever-use-aes-256-cbc-if-aes-256-gcm-is-more-secure\n\nconst CIPHER_ALGORITHM = `aes-256-gcm`,\n  CIPHER_KEY_LENGTH = 32, // https://stackoverflow.com/a/28307668/4397028\n  CIPHER_IV_LENGTH = 16, // https://stackoverflow.com/a/28307668/4397028\n  CIPHER_TAG_LENGTH = 16,\n  CIPHER_SALT_LENGTH = 64\n\nconst PBKDF2_ITERATIONS = 100_000 // https://support.1password.com/pbkdf2/\n\nexport function encryptWithSecret(secret: Buffer, data: string): string {\n  const iv = crypto.randomBytes(CIPHER_IV_LENGTH)\n  const salt = crypto.randomBytes(CIPHER_SALT_LENGTH)\n\n  // https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2sync_password_salt_iterations_keylen_digest\n  const key = crypto.pbkdf2Sync(\n    secret,\n    salt,\n    PBKDF2_ITERATIONS,\n    CIPHER_KEY_LENGTH,\n    `sha512`\n  )\n\n  const cipher = crypto.createCipheriv(CIPHER_ALGORITHM, key, iv)\n  const encrypted = Buffer.concat([cipher.update(data, `utf8`), cipher.final()])\n\n  // https://nodejs.org/api/crypto.html#crypto_cipher_getauthtag\n  const tag = cipher.getAuthTag()\n\n  return Buffer.concat([\n    // Data as required by:\n    // Salt for Key: https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2sync_password_salt_iterations_keylen_digest\n    // IV: https://nodejs.org/api/crypto.html#crypto_class_decipher\n    // Tag: https://nodejs.org/api/crypto.html#crypto_decipher_setauthtag_buffer\n    salt,\n    iv,\n    tag,\n    encrypted,\n  ]).toString(`hex`)\n}\n\nexport function decryptWithSecret(\n  secret: Buffer,\n  encryptedData: string\n): string {\n  const buffer = Buffer.from(encryptedData, `hex`)\n\n  const salt = buffer.slice(0, CIPHER_SALT_LENGTH)\n  const iv = buffer.slice(\n    CIPHER_SALT_LENGTH,\n    CIPHER_SALT_LENGTH + CIPHER_IV_LENGTH\n  )\n  const tag = buffer.slice(\n    CIPHER_SALT_LENGTH + CIPHER_IV_LENGTH,\n    CIPHER_SALT_LENGTH + CIPHER_IV_LENGTH + CIPHER_TAG_LENGTH\n  )\n  const encrypted = buffer.slice(\n    CIPHER_SALT_LENGTH + CIPHER_IV_LENGTH + CIPHER_TAG_LENGTH\n  )\n\n  // https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2sync_password_salt_iterations_keylen_digest\n  const key = crypto.pbkdf2Sync(\n    secret,\n    salt,\n    PBKDF2_ITERATIONS,\n    CIPHER_KEY_LENGTH,\n    `sha512`\n  )\n\n  const decipher = crypto.createDecipheriv(CIPHER_ALGORITHM, key, iv)\n  decipher.setAuthTag(tag)\n\n  return decipher.update(encrypted) + decipher.final(`utf8`)\n}\n","/**\n * Node in the doubly-linked list used for LRU tracking.\n * Each node represents a cache entry with bidirectional pointers.\n */\nclass LRUNode<T> {\n  public readonly key: string\n  public data: T\n  public size: number\n  public prev: LRUNode<T> | SentinelNode<T> | null = null\n  public next: LRUNode<T> | SentinelNode<T> | null = null\n\n  constructor(key: string, data: T, size: number) {\n    this.key = key\n    this.data = data\n    this.size = size\n  }\n}\n\n/**\n * Sentinel node used for head/tail boundaries.\n * These nodes don't contain actual cache data but simplify list operations.\n */\nclass SentinelNode<T> {\n  public prev: LRUNode<T> | SentinelNode<T> | null = null\n  public next: LRUNode<T> | SentinelNode<T> | null = null\n}\n\n/**\n * LRU (Least Recently Used) Cache implementation using a doubly-linked list\n * and hash map for O(1) operations.\n *\n * Algorithm:\n * - Uses a doubly-linked list to maintain access order (most recent at head)\n * - Hash map provides O(1) key-to-node lookup\n * - Sentinel head/tail nodes simplify edge case handling\n * - Size-based eviction supports custom size calculation functions\n *\n * Data Structure Layout:\n * HEAD <-> [most recent] <-> ... <-> [least recent] <-> TAIL\n *\n * Operations:\n * - get(): Move accessed node to head (mark as most recent)\n * - set(): Add new node at head, evict from tail if over capacity\n * - Eviction: Remove least recent node (tail.prev) when size exceeds limit\n */\nexport class LRUCache<T> {\n  private readonly cache: Map<string, LRUNode<T>> = new Map()\n  private readonly head: SentinelNode<T>\n  private readonly tail: SentinelNode<T>\n  private totalSize: number = 0\n  private readonly maxSize: number\n  private readonly calculateSize:\n    | ((value: T, key: string) => number)\n    | undefined\n  private readonly onEvict: ((key: string, value: T) => void) | undefined\n\n  constructor(\n    maxSize: number,\n    calculateSize?: (value: T, key: string) => number,\n    onEvict?: (key: string, value: T) => void\n  ) {\n    this.maxSize = maxSize\n    this.calculateSize = calculateSize\n    this.onEvict = onEvict\n\n    // Create sentinel nodes to simplify doubly-linked list operations\n    // HEAD <-> TAIL (empty list)\n    this.head = new SentinelNode<T>()\n    this.tail = new SentinelNode<T>()\n    this.head.next = this.tail\n    this.tail.prev = this.head\n  }\n\n  /**\n   * Adds a node immediately after the head (marks as most recently used).\n   * Used when inserting new items or when an item is accessed.\n   * PRECONDITION: node must be disconnected (prev/next should be null)\n   */\n  private addToHead(node: LRUNode<T>): void {\n    node.prev = this.head\n    node.next = this.head.next\n    // head.next is always non-null (points to tail or another node)\n    this.head.next!.prev = node\n    this.head.next = node\n  }\n\n  /**\n   * Removes a node from its current position in the doubly-linked list.\n   * Updates the prev/next pointers of adjacent nodes to maintain list integrity.\n   * PRECONDITION: node must be connected (prev/next are non-null)\n   */\n  private removeNode(node: LRUNode<T>): void {\n    // Connected nodes always have non-null prev/next\n    node.prev!.next = node.next\n    node.next!.prev = node.prev\n  }\n\n  /**\n   * Moves an existing node to the head position (marks as most recently used).\n   * This is the core LRU operation - accessed items become most recent.\n   */\n  private moveToHead(node: LRUNode<T>): void {\n    this.removeNode(node)\n    this.addToHead(node)\n  }\n\n  /**\n   * Removes and returns the least recently used node (the one before tail).\n   * This is called during eviction when the cache exceeds capacity.\n   * PRECONDITION: cache is not empty (ensured by caller)\n   */\n  private removeTail(): LRUNode<T> {\n    const lastNode = this.tail.prev as LRUNode<T>\n    // tail.prev is always non-null and always LRUNode when cache is not empty\n    this.removeNode(lastNode)\n    return lastNode\n  }\n\n  /**\n   * Sets a key-value pair in the cache.\n   * If the key exists, updates the value and moves to head.\n   * If new, adds at head and evicts from tail if necessary.\n   *\n   * Time Complexity:\n   * - O(1) for uniform item sizes\n   * - O(k) where k is the number of items evicted (can be O(N) for variable sizes)\n   */\n  public set(key: string, value: T): boolean {\n    const size = this.calculateSize?.(value, key) ?? 1\n    if (size <= 0) {\n      throw new Error(\n        `LRUCache: calculateSize returned ${size}, but size must be > 0. ` +\n          `Items with size 0 would never be evicted, causing unbounded cache growth.`\n      )\n    }\n    if (size > this.maxSize) {\n      console.warn('Single item size exceeds maxSize')\n      return false\n    }\n\n    const existing = this.cache.get(key)\n    if (existing) {\n      // Update existing node: adjust size and move to head (most recent)\n      existing.data = value\n      this.totalSize = this.totalSize - existing.size + size\n      existing.size = size\n      this.moveToHead(existing)\n    } else {\n      // Add new node at head (most recent position)\n      const newNode = new LRUNode(key, value, size)\n      this.cache.set(key, newNode)\n      this.addToHead(newNode)\n      this.totalSize += size\n    }\n\n    // Evict least recently used items until under capacity\n    while (this.totalSize > this.maxSize && this.cache.size > 0) {\n      const tail = this.removeTail()\n      this.cache.delete(tail.key)\n      this.totalSize -= tail.size\n      this.onEvict?.(tail.key, tail.data)\n    }\n\n    return true\n  }\n\n  /**\n   * Checks if a key exists in the cache.\n   * This is a pure query operation - does NOT update LRU order.\n   *\n   * Time Complexity: O(1)\n   */\n  public has(key: string): boolean {\n    return this.cache.has(key)\n  }\n\n  /**\n   * Retrieves a value by key and marks it as most recently used.\n   * Moving to head maintains the LRU property for future evictions.\n   *\n   * Time Complexity: O(1)\n   */\n  public get(key: string): T | undefined {\n    const node = this.cache.get(key)\n    if (!node) return undefined\n\n    // Mark as most recently used by moving to head\n    this.moveToHead(node)\n\n    return node.data\n  }\n\n  /**\n   * Returns an iterator over the cache entries. The order is outputted in the\n   * order of most recently used to least recently used.\n   */\n  public *[Symbol.iterator](): IterableIterator<[string, T]> {\n    let current = this.head.next\n    while (current && current !== this.tail) {\n      // Between head and tail, current is always LRUNode\n      const node = current as LRUNode<T>\n      yield [node.key, node.data]\n      current = current.next\n    }\n  }\n\n  /**\n   * Removes a specific key from the cache.\n   * Updates both the hash map and doubly-linked list.\n   *\n   * Note: This is an explicit removal and does NOT trigger the `onEvict`\n   * callback. Use this for intentional deletions where eviction tracking\n   * is not needed.\n   *\n   * Time Complexity: O(1)\n   */\n  public remove(key: string): void {\n    const node = this.cache.get(key)\n    if (!node) return\n\n    this.removeNode(node)\n    this.cache.delete(key)\n    this.totalSize -= node.size\n  }\n\n  /**\n   * Returns the number of items in the cache.\n   */\n  public get size(): number {\n    return this.cache.size\n  }\n\n  /**\n   * Returns the current total size of all cached items.\n   * This uses the custom size calculation if provided.\n   */\n  public get currentSize(): number {\n    return this.totalSize\n  }\n}\n","import type { CacheFs } from '../../shared/lib/utils'\n\nimport fs from 'fs'\n\nexport const nodeFs: CacheFs = {\n  existsSync: fs.existsSync,\n  readFile: fs.promises.readFile,\n  readFileSync: fs.readFileSync,\n  writeFile: (f, d) => fs.promises.writeFile(f, d),\n  mkdir: (dir) => fs.promises.mkdir(dir, { recursive: true }),\n  stat: (f) => fs.promises.stat(f),\n}\n","/**\n * Contains predefined constants for the trace span name in next/server.\n *\n * Currently, next/server/tracer is internal implementation only for tracking\n * next.js's implementation only with known span names defined here.\n **/\n\n// eslint typescript has a bug with TS enums\n\nenum BaseServerSpan {\n  handleRequest = 'BaseServer.handleRequest',\n  run = 'BaseServer.run',\n  pipe = 'BaseServer.pipe',\n  getStaticHTML = 'BaseServer.getStaticHTML',\n  render = 'BaseServer.render',\n  renderToResponseWithComponents = 'BaseServer.renderToResponseWithComponents',\n  renderToResponse = 'BaseServer.renderToResponse',\n  renderToHTML = 'BaseServer.renderToHTML',\n  renderError = 'BaseServer.renderError',\n  renderErrorToResponse = 'BaseServer.renderErrorToResponse',\n  renderErrorToHTML = 'BaseServer.renderErrorToHTML',\n  render404 = 'BaseServer.render404',\n}\n\nenum LoadComponentsSpan {\n  loadDefaultErrorComponents = 'LoadComponents.loadDefaultErrorComponents',\n  loadComponents = 'LoadComponents.loadComponents',\n}\n\nenum NextServerSpan {\n  getRequestHandler = 'NextServer.getRequestHandler',\n  getRequestHandlerWithMetadata = 'NextServer.getRequestHandlerWithMetadata',\n  getServer = 'NextServer.getServer',\n  getServerRequestHandler = 'NextServer.getServerRequestHandler',\n  createServer = 'createServer.createServer',\n}\n\nenum NextNodeServerSpan {\n  compression = 'NextNodeServer.compression',\n  getBuildId = 'NextNodeServer.getBuildId',\n  createComponentTree = 'NextNodeServer.createComponentTree',\n  clientComponentLoading = 'NextNodeServer.clientComponentLoading',\n  getLayoutOrPageModule = 'NextNodeServer.getLayoutOrPageModule',\n  generateStaticRoutes = 'NextNodeServer.generateStaticRoutes',\n  generateFsStaticRoutes = 'NextNodeServer.generateFsStaticRoutes',\n  generatePublicRoutes = 'NextNodeServer.generatePublicRoutes',\n  generateImageRoutes = 'NextNodeServer.generateImageRoutes.route',\n  sendRenderResult = 'NextNodeServer.sendRenderResult',\n  proxyRequest = 'NextNodeServer.proxyRequest',\n  runApi = 'NextNodeServer.runApi',\n  render = 'NextNodeServer.render',\n  renderHTML = 'NextNodeServer.renderHTML',\n  imageOptimizer = 'NextNodeServer.imageOptimizer',\n  getPagePath = 'NextNodeServer.getPagePath',\n  getRoutesManifest = 'NextNodeServer.getRoutesManifest',\n  findPageComponents = 'NextNodeServer.findPageComponents',\n  getFontManifest = 'NextNodeServer.getFontManifest',\n  getServerComponentManifest = 'NextNodeServer.getServerComponentManifest',\n  getRequestHandler = 'NextNodeServer.getRequestHandler',\n  renderToHTML = 'NextNodeServer.renderToHTML',\n  renderError = 'NextNodeServer.renderError',\n  renderErrorToHTML = 'NextNodeServer.renderErrorToHTML',\n  render404 = 'NextNodeServer.render404',\n  startResponse = 'NextNodeServer.startResponse',\n\n  // nested inner span, does not require parent scope name\n  route = 'route',\n  onProxyReq = 'onProxyReq',\n  apiResolver = 'apiResolver',\n  internalFetch = 'internalFetch',\n}\n\nenum StartServerSpan {\n  startServer = 'startServer.startServer',\n}\n\nenum RenderSpan {\n  getServerSideProps = 'Render.getServerSideProps',\n  getStaticProps = 'Render.getStaticProps',\n  renderToString = 'Render.renderToString',\n  renderDocument = 'Render.renderDocument',\n  createBodyResult = 'Render.createBodyResult',\n}\n\nenum AppRenderSpan {\n  renderToString = 'AppRender.renderToString',\n  renderToReadableStream = 'AppRender.renderToReadableStream',\n  getBodyResult = 'AppRender.getBodyResult',\n  fetch = 'AppRender.fetch',\n  waitShellReady = 'AppRender.waitShellReady',\n  renderToNodeFizzStream = 'AppRender.renderToNodeFizzStream',\n  instantInsights = 'AppRender.instantInsights',\n  instantInsightsPrepareValidation = 'AppRender.instantInsights.prepareValidation',\n  instantInsightsRunValidation = 'AppRender.instantInsights.runValidation',\n}\n\nenum RouterSpan {\n  executeRoute = 'Router.executeRoute',\n}\n\nenum NodeSpan {\n  runHandler = 'Node.runHandler',\n}\n\nenum AppRouteRouteHandlersSpan {\n  runHandler = 'AppRouteRouteHandlers.runHandler',\n}\n\nenum ResolveMetadataSpan {\n  generateMetadata = 'ResolveMetadata.generateMetadata',\n  generateViewport = 'ResolveMetadata.generateViewport',\n}\n\nenum MiddlewareSpan {\n  execute = 'Middleware.execute',\n}\n\ntype SpanTypes =\n  | `${BaseServerSpan}`\n  | `${LoadComponentsSpan}`\n  | `${NextServerSpan}`\n  | `${StartServerSpan}`\n  | `${NextNodeServerSpan}`\n  | `${RenderSpan}`\n  | `${RouterSpan}`\n  | `${AppRenderSpan}`\n  | `${NodeSpan}`\n  | `${AppRouteRouteHandlersSpan}`\n  | `${ResolveMetadataSpan}`\n  | `${MiddlewareSpan}`\n\n// This list is used to filter out spans that are not relevant to the user\nexport const NextVanillaSpanAllowlist = new Set([\n  MiddlewareSpan.execute,\n  BaseServerSpan.handleRequest,\n  RenderSpan.getServerSideProps,\n  RenderSpan.getStaticProps,\n  AppRenderSpan.fetch,\n  AppRenderSpan.getBodyResult,\n  RenderSpan.renderDocument,\n  NodeSpan.runHandler,\n  AppRouteRouteHandlersSpan.runHandler,\n  ResolveMetadataSpan.generateMetadata,\n  ResolveMetadataSpan.generateViewport,\n  NextNodeServerSpan.createComponentTree,\n  NextNodeServerSpan.findPageComponents,\n  NextNodeServerSpan.getLayoutOrPageModule,\n  NextNodeServerSpan.startResponse,\n  NextNodeServerSpan.clientComponentLoading,\n])\n\n// These Spans are allowed to be always logged\n// when the otel log prefix env is set\nexport const LogSpanAllowList = new Set([\n  NextNodeServerSpan.findPageComponents,\n  NextNodeServerSpan.createComponentTree,\n  NextNodeServerSpan.clientComponentLoading,\n])\n\nexport {\n  BaseServerSpan,\n  LoadComponentsSpan,\n  NextServerSpan,\n  NextNodeServerSpan,\n  StartServerSpan,\n  RenderSpan,\n  RouterSpan,\n  AppRenderSpan,\n  NodeSpan,\n  AppRouteRouteHandlersSpan,\n  ResolveMetadataSpan,\n  MiddlewareSpan,\n}\n\nexport type { SpanTypes }\n","const REACT_POSTPONE_TYPE: symbol = Symbol.for('react.postpone')\n\nexport function isPostpone(error: any): boolean {\n  return (\n    typeof error === 'object' &&\n    error !== null &&\n    error.$$typeof === REACT_POSTPONE_TYPE\n  )\n}\n","import { isPostpone } from '../lib/router-utils/is-postpone'\nimport * as Log from '../../build/output/log'\n\nlet _global = globalThis as typeof globalThis & {\n  nextInitializedProcessErrorHandlers?: boolean\n  [UNHANDLED_REJECTION_LISTENER_KEY]?: NodeJS.UnhandledRejectionListener\n}\n\n// The listener function is shared via globalThis so that multiple copies of\n// this module (e.g. in the pre-compiled server bundle and in a route module\n// bundle) still register and detect a single listener instance.\nconst UNHANDLED_REJECTION_LISTENER_KEY = Symbol.for(\n  'next.unhandledRejectionListener'\n)\n\nfunction unhandledRejectionListener(reason: unknown) {\n  if (isPostpone(reason)) {\n    // React postpones that are unhandled might end up logged here but they're\n    // not really errors. They're just part of rendering.\n    return\n  }\n  // Immediately log the error.\n  // TODO: Ideally, if we knew that this error was triggered by application\n  // code, we would suppress it entirely without logging. We can't reliably\n  // detect all of these, but when cacheComponents is enabled, we could suppress\n  // at least some of them by waiting to log the error until after all in-\n  // progress renders have completed. Then, only log errors for which there\n  // was not a corresponding \"rejectionHandled\" event.\n  Log.error('unhandledRejection:', reason)\n}\n\n/**\n * Checks if the Next.js unhandled rejection listener is currently attached.\n * This queries the actual process listeners instead of relying on a module\n * global, so it stays accurate even if the listener was removed externally,\n * e.g. via `process.removeAllListeners('unhandledRejection')`.\n */\nexport function isUnhandledRejectionListenerRegistered(): boolean {\n  const listener = _global[UNHANDLED_REJECTION_LISTENER_KEY]\n\n  return (\n    listener !== undefined &&\n    process.listeners('unhandledRejection').includes(listener)\n  )\n}\n\n/**\n * Registers the Next.js unhandled rejection listener, which logs unhandled\n * rejections (except React postpones) and prevents them from crashing the\n * process. Safe to call unconditionally: if the listener is already attached,\n * this is a no-op, so it never registers a duplicate.\n */\nexport function registerUnhandledRejectionListener(): void {\n  if (isUnhandledRejectionListenerRegistered()) {\n    return\n  }\n\n  const listener = (_global[UNHANDLED_REJECTION_LISTENER_KEY] ??=\n    unhandledRejectionListener)\n\n  process.on('unhandledRejection', listener)\n}\n\nexport function installProcessErrorHandlers(\n  shouldRemoveUncaughtErrorAndRejectionListeners: boolean\n) {\n  if (!_global.nextInitializedProcessErrorHandlers) {\n    _global.nextInitializedProcessErrorHandlers = true\n    // The conventional wisdom of Node.js and other runtimes is to treat\n    // unhandled errors as fatal and exit the process.\n    //\n    // But Next.js is not a generic JS runtime — it's a specialized runtime for\n    // React Server Components.\n    //\n    // Many unhandled rejections are due to the late-awaiting pattern for\n    // prefetching data. In Next.js it's OK to call an async function without\n    // immediately awaiting it, to start the request as soon as possible\n    // without blocking unncessarily on the result. These can end up\n    // triggering an \"unhandledRejection\" if it later turns out that the\n    // data is not needed to render the page. Example:\n    //\n    //     const promise = fetchData()\n    //     const shouldShow = await checkCondition()\n    //     if (shouldShow) {\n    //       return <Component promise={promise} />\n    //     }\n    //\n    // In this example, `fetchData` is called immediately to start the request\n    // as soon as possible, but if `shouldShow` is false, then it will be\n    // discarded without unwrapping its result. If it errors, it will trigger\n    // an \"unhandledRejection\" event.\n    //\n    // Ideally, we would suppress these rejections completely without warning,\n    // because we don't consider them real errors. (TODO: Currently we do warn.)\n    //\n    // But regardless of whether we do or don't warn, we definitely shouldn't\n    // crash the entire process.\n    //\n    // Even a \"legit\" unhandled error unrelated to prefetching shouldn't\n    // prevent the rest of the page from rendering.\n    //\n    // So, we're going to intentionally override the default error handling\n    // behavior of the outer JS runtime to be more forgiving\n\n    // Remove any existing \"unhandledRejection\" and \"uncaughtException\" handlers.\n    // This is gated behind an experimental flag until we've considered the impact\n    // in various deployment environments. It's possible this may always need to\n    // be configurable.\n    if (shouldRemoveUncaughtErrorAndRejectionListeners) {\n      process.removeAllListeners('uncaughtException')\n      process.removeAllListeners('unhandledRejection')\n    }\n\n    process.on('rejectionHandled', () => {\n      // TODO: See note in the unhandledRejection listener above. In the\n      // future, we may use the \"rejectionHandled\" event to de-queue an error\n      // from being logged.\n    })\n\n    // Unhandled exceptions are errors triggered by non-async functions, so this\n    // is unrelated to the late-awaiting pattern. However, for similar reasons,\n    // we still shouldn't crash the process. Just log it.\n    process.on('uncaughtException', (reason: unknown) => {\n      if (isPostpone(reason)) {\n        return\n      }\n      console.error(reason)\n    })\n  }\n\n  // Register the listener unconditionally, and not only during the guarded\n  // initialization above: a previous registration may have been undone by the\n  // `removeAllListeners` call of a later `installProcessErrorHandlers` call\n  // (or by external code), and registering is a no-op if the listener is\n  // still attached.\n  registerUnhandledRejectionListener()\n}\n","import type { IncomingHttpHeaders } from 'http'\n\nimport { ReflectAdapter } from './reflect'\n\n/**\n * @internal\n */\nexport class ReadonlyHeadersError extends Error {\n  constructor() {\n    super(\n      'Headers cannot be modified. Read more: https://nextjs.org/docs/app/api-reference/functions/headers'\n    )\n  }\n\n  public static callable() {\n    throw new ReadonlyHeadersError()\n  }\n}\n\nexport type ReadonlyHeaders = Headers & {\n  /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/app/api-reference/functions/headers */\n  append(...args: any[]): void\n  /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/app/api-reference/functions/headers */\n  set(...args: any[]): void\n  /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/app/api-reference/functions/headers */\n  delete(...args: any[]): void\n}\n\n/**\n * The read methods that a sealed view provides itself instead of forwarding to\n * the underlying `Headers`. Deriving the type from `Headers` keeps the\n * implementations in step with the platform signatures.\n */\ntype SealedHeaderMethods = Pick<\n  Headers,\n  | 'get'\n  | 'has'\n  | 'getSetCookie'\n  | 'keys'\n  | 'values'\n  | 'entries'\n  | 'forEach'\n  | typeof Symbol.iterator\n>\n\n/**\n * Builds the read methods for a sealed view that exposes all of `target`.\n */\nfunction createPassThroughMethods(\n  target: Headers,\n  sealed: ReadonlyHeaders\n): SealedHeaderMethods {\n  return {\n    get: target.get.bind(target),\n    has: target.has.bind(target),\n    getSetCookie: target.getSetCookie.bind(target),\n    keys: target.keys.bind(target),\n    values: target.values.bind(target),\n    entries: target.entries.bind(target),\n    [Symbol.iterator]: target[Symbol.iterator].bind(target),\n    // The native method passes the unsealed target as the callback's `parent`\n    // argument. That is a mutable handle on the underlying headers. Pass the\n    // sealed view instead.\n    forEach(callbackfn, thisArg) {\n      for (const [name, value] of target.entries()) {\n        callbackfn.call(thisArg, value, name, sealed)\n      }\n    },\n  }\n}\n\n/**\n * Builds the read methods for a sealed view that omits the header names matched\n * by `isHidden`.\n */\nfunction createHidingMethods(\n  target: Headers,\n  sealed: ReadonlyHeaders,\n  isHidden: (name: string) => boolean\n): SealedHeaderMethods {\n  function* entries(): HeadersIterator<[string, string]> {\n    for (const entry of target.entries()) {\n      if (!isHidden(entry[0])) {\n        yield entry\n      }\n    }\n  }\n\n  return {\n    entries,\n    [Symbol.iterator]: entries,\n    get: (name) => (isHidden(name) ? null : target.get(name)),\n    has: (name) => (isHidden(name) ? false : target.has(name)),\n    getSetCookie: () => (isHidden('set-cookie') ? [] : target.getSetCookie()),\n    *keys(): HeadersIterator<string> {\n      for (const name of target.keys()) {\n        if (!isHidden(name)) {\n          yield name\n        }\n      }\n    },\n    *values(): HeadersIterator<string> {\n      for (const [, value] of entries()) {\n        yield value\n      }\n    },\n    // The native method passes the unsealed target as the callback's `parent`\n    // argument. That is a mutable handle on the underlying headers. Pass the\n    // sealed view instead.\n    forEach(callbackfn, thisArg) {\n      for (const [name, value] of entries()) {\n        callbackfn.call(thisArg, value, name, sealed)\n      }\n    },\n  }\n}\n\nexport class HeadersAdapter extends Headers {\n  private readonly headers: IncomingHttpHeaders\n\n  constructor(headers: IncomingHttpHeaders) {\n    // We've already overridden the methods that would be called, so we're just\n    // calling the super constructor to ensure that the instanceof check works.\n    super()\n\n    this.headers = new Proxy(headers, {\n      get(target, prop, receiver) {\n        // Because this is just an object, we expect that all \"get\" operations\n        // are for properties. If it's a \"get\" for a symbol, we'll just return\n        // the symbol.\n        if (typeof prop === 'symbol') {\n          return ReflectAdapter.get(target, prop, receiver)\n        }\n\n        const lowercased = prop.toLowerCase()\n\n        // Let's find the original casing of the key. This assumes that there is\n        // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n        // headers object.\n        const original = Object.keys(headers).find(\n          (o) => o.toLowerCase() === lowercased\n        )\n\n        // If the original casing doesn't exist, return undefined.\n        if (typeof original === 'undefined') return\n\n        // If the original casing exists, return the value.\n        return ReflectAdapter.get(target, original, receiver)\n      },\n      set(target, prop, value, receiver) {\n        if (typeof prop === 'symbol') {\n          return ReflectAdapter.set(target, prop, value, receiver)\n        }\n\n        const lowercased = prop.toLowerCase()\n\n        // Let's find the original casing of the key. This assumes that there is\n        // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n        // headers object.\n        const original = Object.keys(headers).find(\n          (o) => o.toLowerCase() === lowercased\n        )\n\n        // If the original casing doesn't exist, use the prop as the key.\n        return ReflectAdapter.set(target, original ?? prop, value, receiver)\n      },\n      has(target, prop) {\n        if (typeof prop === 'symbol') return ReflectAdapter.has(target, prop)\n\n        const lowercased = prop.toLowerCase()\n\n        // Let's find the original casing of the key. This assumes that there is\n        // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n        // headers object.\n        const original = Object.keys(headers).find(\n          (o) => o.toLowerCase() === lowercased\n        )\n\n        // If the original casing doesn't exist, return false.\n        if (typeof original === 'undefined') return false\n\n        // If the original casing exists, return true.\n        return ReflectAdapter.has(target, original)\n      },\n      deleteProperty(target, prop) {\n        if (typeof prop === 'symbol')\n          return ReflectAdapter.deleteProperty(target, prop)\n\n        const lowercased = prop.toLowerCase()\n\n        // Let's find the original casing of the key. This assumes that there is\n        // no mixed case keys (e.g. \"Content-Type\" and \"content-type\") in the\n        // headers object.\n        const original = Object.keys(headers).find(\n          (o) => o.toLowerCase() === lowercased\n        )\n\n        // If the original casing doesn't exist, return true.\n        if (typeof original === 'undefined') return true\n\n        // If the original casing exists, delete the property.\n        return ReflectAdapter.deleteProperty(target, original)\n      },\n    })\n  }\n\n  /**\n   * Seals a Headers instance to prevent modification by throwing an error when\n   * any mutating method is called.\n   *\n   * The sealed view stays live. Later writes to `headers` remain visible\n   * through it.\n   *\n   * `hidden` omits the given header names from every read operation (`get`,\n   * `has`, `getSetCookie`, `forEach`, and iteration). The names must be\n   * lowercase. The underlying headers are neither copied nor mutated, so hidden\n   * headers remain available to the framework.\n   */\n  public static seal(\n    headers: Headers,\n    hidden?: ReadonlySet<string>\n  ): ReadonlyHeaders {\n    const isHidden =\n      hidden && hidden.size > 0\n        ? (name: string): boolean => hidden.has(name.toLowerCase())\n        : null\n\n    // The methods are built once per sealed view and reused, so repeated access\n    // returns the same function instead of a fresh closure. They are assigned\n    // after the proxy exists because `forEach` hands the proxy to its callback.\n    // Creating the proxy runs no trap, so nothing can read them before then.\n    let methods: SealedHeaderMethods\n\n    const sealed: ReadonlyHeaders = new Proxy<ReadonlyHeaders>(headers, {\n      get(target, prop, receiver) {\n        switch (prop) {\n          case 'append':\n          case 'delete':\n          case 'set':\n            return ReadonlyHeadersError.callable\n          case Symbol.iterator:\n            return methods[Symbol.iterator]\n          case 'get':\n          case 'has':\n          case 'getSetCookie':\n          case 'keys':\n          case 'values':\n          case 'entries':\n          case 'forEach':\n            return methods[prop]\n          default:\n            return ReflectAdapter.get(target, prop, receiver)\n        }\n      },\n    })\n\n    methods = isHidden\n      ? createHidingMethods(headers, sealed, isHidden)\n      : createPassThroughMethods(headers, sealed)\n\n    return sealed\n  }\n\n  /**\n   * @param headers\n   * @returns A fresh object identity backed by the original value\n   */\n  public static fresh(headers: ReadonlyHeaders): ReadonlyHeaders {\n    return new Proxy<ReadonlyHeaders>(headers, {\n      get(target, prop, receiver) {\n        return ReflectAdapter.get(target, prop, receiver)\n      },\n    })\n  }\n\n  /**\n   * Merges a header value into a string. This stores multiple values as an\n   * array, so we need to merge them into a string.\n   *\n   * @param value a header value\n   * @returns a merged header value (a string)\n   */\n  private merge(value: string | string[]): string {\n    if (Array.isArray(value)) return value.join(', ')\n\n    return value\n  }\n\n  /**\n   * Creates a Headers instance from a plain object or a Headers instance.\n   *\n   * @param headers a plain object or a Headers instance\n   * @returns a headers instance\n   */\n  public static from(headers: IncomingHttpHeaders | Headers): Headers {\n    if (headers instanceof Headers) return headers\n\n    return new HeadersAdapter(headers)\n  }\n\n  public append(name: string, value: string): void {\n    const existing = this.headers[name]\n    if (typeof existing === 'string') {\n      this.headers[name] = [existing, value]\n    } else if (Array.isArray(existing)) {\n      existing.push(value)\n    } else {\n      this.headers[name] = value\n    }\n  }\n\n  public delete(name: string): void {\n    delete this.headers[name]\n  }\n\n  public get(name: string): string | null {\n    const value = this.headers[name]\n    if (typeof value !== 'undefined') return this.merge(value)\n\n    return null\n  }\n\n  public has(name: string): boolean {\n    return typeof this.headers[name] !== 'undefined'\n  }\n\n  public set(name: string, value: string): void {\n    this.headers[name] = value\n  }\n\n  public forEach(\n    callbackfn: (value: string, name: string, parent: Headers) => void,\n    thisArg?: any\n  ): void {\n    for (const [name, value] of this.entries()) {\n      callbackfn.call(thisArg, value, name, this)\n    }\n  }\n\n  public *entries(): HeadersIterator<[string, string]> {\n    for (const key of Object.keys(this.headers)) {\n      const name = key.toLowerCase()\n      // We assert here that this is a string because we got it from the\n      // Object.keys() call above.\n      const value = this.get(name) as string\n\n      yield [name, value] as [string, string]\n    }\n  }\n\n  public *keys(): HeadersIterator<string> {\n    for (const key of Object.keys(this.headers)) {\n      const name = key.toLowerCase()\n      yield name\n    }\n  }\n\n  public *values(): HeadersIterator<string> {\n    for (const key of Object.keys(this.headers)) {\n      // We assert here that this is a string because we got it from the\n      // Object.keys() call above.\n      const value = this.get(key) as string\n\n      yield value\n    }\n  }\n\n  public [Symbol.iterator](): HeadersIterator<[string, string]> {\n    return this.entries()\n  }\n}\n","export class ReflectAdapter {\n  static get<T extends object>(\n    target: T,\n    prop: string | symbol,\n    receiver: unknown\n  ): any {\n    const value = Reflect.get(target, prop, receiver)\n    if (typeof value === 'function') {\n      return value.bind(target)\n    }\n\n    return value\n  }\n\n  static set<T extends object>(\n    target: T,\n    prop: string | symbol,\n    value: any,\n    receiver: any\n  ): boolean {\n    return Reflect.set(target, prop, value, receiver)\n  }\n\n  static has<T extends object>(target: T, prop: string | symbol): boolean {\n    return Reflect.has(target, prop)\n  }\n\n  static deleteProperty<T extends object>(\n    target: T,\n    prop: string | symbol\n  ): boolean {\n    return Reflect.deleteProperty(target, prop)\n  }\n}\n","/**\n * This module is for next.js server internal usage of path module.\n * It will use native path module for nodejs runtime.\n * It will use path-browserify polyfill for edge runtime.\n */\nlet path\n\nif (process.env.NEXT_RUNTIME === 'edge') {\n  path = require('next/dist/compiled/path-browserify')\n} else {\n  path = require('path')\n}\n\nmodule.exports = path\n","// Note: This file is JS because it's used by the taskfile-swc.js file, which is JS.\n// Keep file changes in sync with the corresponding `.d.ts` files.\n\n/**\n * These are the minimum browser versions that we consider \"modern\" and thus compile for by default.\n * This list was generated using `pnpm browserslist \"baseline widely available\"` on 2025-10-01.\n */\nconst MODERN_BROWSERSLIST_TARGET = [\n  'chrome 111',\n  'edge 111',\n  'firefox 111',\n  'safari 16.4',\n]\n\nmodule.exports = MODERN_BROWSERSLIST_TARGET\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n        if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n            Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n        }\n    }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { OutgoingHttpHeaders } from 'http'\nimport type RenderResult from '../render-result'\nimport type { CacheControl, Revalidate } from '../lib/cache-control'\nimport type { RouteKind } from '../route-kind'\n\nexport interface ResponseCacheBase {\n  get(\n    key: string | null,\n    responseGenerator: ResponseGenerator,\n    context: {\n      isOnDemandRevalidate?: boolean\n      isPrefetch?: boolean\n      incrementalCache: IncrementalCache\n      /**\n       * This is a hint to the cache to help it determine what kind of route\n       * this is so it knows where to look up the cache entry from. If not\n       * provided it will test the filesystem to check.\n       */\n      routeKind: RouteKind\n\n      /**\n       * True if this is a fallback request.\n       */\n      isFallback?: boolean\n\n      /**\n       * True if the route is enabled for PPR.\n       */\n      isRoutePPREnabled?: boolean\n    }\n  ): Promise<ResponseCacheEntry | null>\n}\n\n// The server components HMR cache might store other data as well in the future,\n// at which point this should be refactored to a discriminated union type.\nexport interface ServerComponentsHmrCache {\n  get(key: string): CachedFetchData | undefined\n  set(key: string, data: CachedFetchData): void\n}\n\nexport type CachedFetchData = {\n  headers: Record<string, string>\n  body: string\n  url: string\n  status?: number\n}\n\nexport const enum CachedRouteKind {\n  APP_PAGE = 'APP_PAGE',\n  APP_ROUTE = 'APP_ROUTE',\n  PAGES = 'PAGES',\n  FETCH = 'FETCH',\n  REDIRECT = 'REDIRECT',\n  IMAGE = 'IMAGE',\n}\n\nexport interface CachedFetchValue {\n  kind: CachedRouteKind.FETCH\n  data: CachedFetchData\n  // tags are only present with file-system-cache\n  // fetch cache stores tags outside of cache entry\n  tags?: string[]\n  revalidate: number\n}\n\nexport interface CachedRedirectValue {\n  kind: CachedRouteKind.REDIRECT\n  props: Object\n}\n\nexport interface CachedAppPageValue {\n  kind: CachedRouteKind.APP_PAGE\n  // this needs to be a RenderResult so since renderResponse\n  // expects that type instead of a string\n  html: RenderResult\n  rscData: Buffer | undefined\n  status: number | undefined\n  postponed: string | undefined\n  headers: OutgoingHttpHeaders | undefined\n  segmentData: Map<string, Buffer> | undefined\n}\n\nexport interface CachedPageValue {\n  kind: CachedRouteKind.PAGES\n  // this needs to be a RenderResult so since renderResponse\n  // expects that type instead of a string\n  html: RenderResult\n  pageData: Object\n  status: number | undefined\n  headers: OutgoingHttpHeaders | undefined\n}\n\nexport interface CachedRouteValue {\n  kind: CachedRouteKind.APP_ROUTE\n  // this needs to be a RenderResult so since renderResponse\n  // expects that type instead of a string\n  body: Buffer\n  status: number\n  headers: OutgoingHttpHeaders\n}\n\nexport interface CachedImageValue {\n  kind: CachedRouteKind.IMAGE\n  etag: string\n  upstreamEtag: string\n  buffer: Buffer\n  extension: string\n  revalidate?: number\n  isMiss?: boolean\n  isStale?: boolean\n}\n\nexport interface IncrementalCachedAppPageValue {\n  kind: CachedRouteKind.APP_PAGE\n  // this needs to be a string since the cache expects to store\n  // the string value\n  html: string\n  rscData: Buffer | undefined\n  headers: OutgoingHttpHeaders | undefined\n  postponed: string | undefined\n  status: number | undefined\n  segmentData: Map<string, Buffer> | undefined\n}\n\nexport interface IncrementalCachedPageValue {\n  kind: CachedRouteKind.PAGES\n  // this needs to be a string since the cache expects to store\n  // the string value\n  html: string\n  pageData: Object\n  headers: OutgoingHttpHeaders | undefined\n  status: number | undefined\n}\n\nexport interface IncrementalResponseCacheEntry {\n  cacheControl?: CacheControl\n  /**\n   * timestamp in milliseconds to revalidate after\n   */\n  revalidateAfter?: Revalidate\n  /**\n   * `-1` here dictates a blocking revalidate should be used\n   */\n  isStale?: boolean | -1\n  isMiss?: boolean\n  isFallback?: boolean\n  value: Exclude<IncrementalCacheValue, CachedFetchValue> | null\n}\n\nexport interface IncrementalFetchCacheEntry {\n  /**\n   * `-1` here dictates a blocking revalidate should be used\n   */\n  isStale?: boolean | -1\n  value: CachedFetchValue\n}\n\nexport type IncrementalCacheEntry =\n  | IncrementalResponseCacheEntry\n  | IncrementalFetchCacheEntry\n\nexport type IncrementalCacheValue =\n  | CachedRedirectValue\n  | IncrementalCachedPageValue\n  | IncrementalCachedAppPageValue\n  | CachedImageValue\n  | CachedFetchValue\n  | CachedRouteValue\n\nexport type ResponseCacheValue =\n  | CachedRedirectValue\n  | CachedPageValue\n  | CachedAppPageValue\n  | CachedImageValue\n  | CachedRouteValue\n\nexport type ResponseCacheEntry = {\n  cacheControl?: CacheControl\n  value: ResponseCacheValue | null\n  isStale?: boolean | -1\n  isMiss?: boolean\n  isFallback?: boolean\n}\n\n/**\n * @param hasResolved whether the responseGenerator has resolved it's promise\n * @param previousCacheEntry the previous cache entry if it exists or the current\n */\nexport type ResponseGenerator = (state: {\n  hasResolved: boolean\n  previousCacheEntry?: IncrementalResponseCacheEntry | null\n  isRevalidating?: boolean\n  span?: any\n\n  /**\n   * When true, this indicates that the response generator is being called in a\n   * context where the response must be generated statically.\n   *\n   * CRITICAL: This should only currently be used when revalidating due to a\n   * dynamic RSC request.\n   */\n  forceStaticRender?: boolean\n}) => Promise<ResponseCacheEntry | null>\n\nexport const enum IncrementalCacheKind {\n  APP_PAGE = 'APP_PAGE',\n  APP_ROUTE = 'APP_ROUTE',\n  PAGES = 'PAGES',\n  FETCH = 'FETCH',\n  IMAGE = 'IMAGE',\n}\n\nexport interface GetIncrementalFetchCacheContext {\n  kind: IncrementalCacheKind.FETCH\n  revalidate?: Revalidate\n  fetchUrl?: string\n  fetchIdx?: number\n  tags?: string[]\n  softTags?: string[]\n}\n\nexport interface GetIncrementalResponseCacheContext {\n  kind: Exclude<IncrementalCacheKind, IncrementalCacheKind.FETCH>\n\n  /**\n   * True if the route is enabled for PPR.\n   */\n  isRoutePPREnabled?: boolean\n\n  /**\n   * True if this is a fallback request.\n   */\n  isFallback: boolean\n}\n\nexport interface SetIncrementalFetchCacheContext {\n  fetchCache: true\n  fetchUrl?: string\n  fetchIdx?: number\n  tags?: string[]\n  isImplicitBuildTimeCache?: boolean\n}\n\nexport interface SetIncrementalResponseCacheContext {\n  fetchCache?: false\n  cacheControl?: CacheControl\n\n  /**\n   * True if the route is enabled for PPR.\n   */\n  isRoutePPREnabled?: boolean\n\n  /**\n   * True if this is a fallback request.\n   */\n  isFallback?: boolean\n}\n\nexport interface IncrementalResponseCache {\n  get(\n    cacheKey: string,\n    ctx: GetIncrementalResponseCacheContext\n  ): Promise<IncrementalResponseCacheEntry | null>\n  set(\n    key: string,\n    data: Exclude<IncrementalCacheValue, CachedFetchValue> | null,\n    ctx: SetIncrementalResponseCacheContext\n  ): Promise<void>\n}\n\nexport interface IncrementalCache extends IncrementalResponseCache {\n  get(\n    cacheKey: string,\n    ctx: GetIncrementalFetchCacheContext\n  ): Promise<IncrementalFetchCacheEntry | null>\n  get(\n    cacheKey: string,\n    ctx: GetIncrementalResponseCacheContext\n  ): Promise<IncrementalResponseCacheEntry | null>\n  set(\n    key: string,\n    data: CachedFetchValue | null,\n    ctx: SetIncrementalFetchCacheContext\n  ): Promise<void>\n  set(\n    key: string,\n    data: Exclude<IncrementalCacheValue, CachedFetchValue> | null,\n    ctx: SetIncrementalResponseCacheContext\n  ): Promise<void>\n  revalidateTag(\n    tags: string | string[],\n    durations?: { expire?: number }\n  ): Promise<void>\n}\n","export const enum RouteKind {\n  /**\n   * `PAGES` represents all the React pages that are under `pages/`.\n   */\n  PAGES = 'PAGES',\n  /**\n   * `PAGES_API` represents all the API routes under `pages/api/`.\n   */\n  PAGES_API = 'PAGES_API',\n  /**\n   * `APP_PAGE` represents all the React pages that are under `app/` with the\n   * filename of `page.{j,t}s{,x}`.\n   */\n  APP_PAGE = 'APP_PAGE',\n  /**\n   * `APP_ROUTE` represents all the API routes and metadata routes that are under `app/` with the\n   * filename of `route.{j,t}s{,x}`.\n   */\n  APP_ROUTE = 'APP_ROUTE',\n\n  /**\n   * `IMAGE` represents all the images that are generated by `next/image`.\n   */\n  IMAGE = 'IMAGE',\n}\n","import MODERN_BROWSERSLIST_TARGET from './modern-browserslist-target'\n\nexport { MODERN_BROWSERSLIST_TARGET }\n\nexport type ValueOf<T> = Required<T>[keyof T]\n\nexport const COMPILER_NAMES = {\n  client: 'client',\n  server: 'server',\n  edgeServer: 'edge-server',\n} as const\n\nexport type CompilerNameValues = ValueOf<typeof COMPILER_NAMES>\n\nexport const COMPILER_INDEXES: {\n  [compilerKey in CompilerNameValues]: number\n} = {\n  [COMPILER_NAMES.client]: 0,\n  [COMPILER_NAMES.server]: 1,\n  [COMPILER_NAMES.edgeServer]: 2,\n} as const\n\n// Re-export entry constants for backward compatibility\nexport {\n  UNDERSCORE_NOT_FOUND_ROUTE,\n  UNDERSCORE_NOT_FOUND_ROUTE_ENTRY,\n  UNDERSCORE_GLOBAL_ERROR_ROUTE,\n  UNDERSCORE_GLOBAL_ERROR_ROUTE_ENTRY,\n} from './entry-constants'\n\nexport enum AdapterOutputType {\n  /**\n   * `PAGES` represents all the React pages that are under `pages/`.\n   */\n  PAGES = 'PAGES',\n\n  /**\n   * `PAGES_API` represents all the API routes under `pages/api/`.\n   */\n  PAGES_API = 'PAGES_API',\n  /**\n   * `APP_PAGE` represents all the React pages that are under `app/` with the\n   * filename of `page.{j,t}s{,x}`.\n   */\n  APP_PAGE = 'APP_PAGE',\n\n  /**\n   * `APP_ROUTE` represents all the API routes and metadata routes that are under `app/` with the\n   * filename of `route.{j,t}s{,x}`.\n   */\n  APP_ROUTE = 'APP_ROUTE',\n\n  /**\n   * `PRERENDER` represents an ISR enabled route that might\n   * have a seeded cache entry or fallback generated during build\n   */\n  PRERENDER = 'PRERENDER',\n\n  /**\n   * `STATIC_FILE` represents a static file (ie /_next/static)\n   */\n  STATIC_FILE = 'STATIC_FILE',\n\n  /**\n   * `MIDDLEWARE` represents the middleware output if present\n   */\n  MIDDLEWARE = 'MIDDLEWARE',\n}\n\nexport const PHASE_EXPORT = 'phase-export'\nexport const PHASE_ANALYZE = 'phase-analyze'\nexport const PHASE_PRODUCTION_BUILD = 'phase-production-build'\nexport const PHASE_PRODUCTION_SERVER = 'phase-production-server'\nexport const PHASE_DEVELOPMENT_SERVER = 'phase-development-server'\nexport const PHASE_TEST = 'phase-test'\nexport const PHASE_INFO = 'phase-info'\n\nexport type PHASE_TYPE =\n  | typeof PHASE_INFO\n  | typeof PHASE_TEST\n  | typeof PHASE_EXPORT\n  | typeof PHASE_ANALYZE\n  | typeof PHASE_PRODUCTION_BUILD\n  | typeof PHASE_PRODUCTION_SERVER\n  | typeof PHASE_DEVELOPMENT_SERVER\n\nexport const PAGES_MANIFEST = 'pages-manifest.json'\nexport const APP_PATHS_MANIFEST = 'app-paths-manifest.json'\nexport const APP_PATH_ROUTES_MANIFEST = 'app-path-routes-manifest.json'\nexport const BUILD_MANIFEST = 'build-manifest.json'\nexport const FUNCTIONS_CONFIG_MANIFEST = 'functions-config-manifest.json'\nexport const SUBRESOURCE_INTEGRITY_MANIFEST = 'subresource-integrity-manifest'\nexport const NEXT_FONT_MANIFEST = 'next-font-manifest'\nexport const EXPORT_MARKER = 'export-marker.json'\nexport const EXPORT_DETAIL = 'export-detail.json'\nexport const PRERENDER_MANIFEST = 'prerender-manifest.json'\nexport const PREFETCH_HINTS = 'prefetch-hints.json'\nexport const ROUTES_MANIFEST = 'routes-manifest.json'\nexport const IMAGES_MANIFEST = 'images-manifest.json'\nexport const SERVER_FILES_MANIFEST = 'required-server-files'\nexport const DEV_CLIENT_PAGES_MANIFEST = '_devPagesManifest.json'\nexport const REQUEST_INSIGHTS_DEV_ENDPOINT =\n  '/_next/development/request-insights'\nexport const MIDDLEWARE_MANIFEST = 'middleware-manifest.json'\nexport const TURBOPACK_CLIENT_MIDDLEWARE_MANIFEST =\n  '_clientMiddlewareManifest.js'\nexport const TURBOPACK_CLIENT_BUILD_MANIFEST = 'client-build-manifest.json'\nexport const DEV_CLIENT_MIDDLEWARE_MANIFEST = '_devMiddlewareManifest.json'\nexport const REACT_LOADABLE_MANIFEST = 'react-loadable-manifest.json'\nexport const SERVER_DIRECTORY = 'server'\nexport const CONFIG_FILES = [\n  'next.config.js',\n  'next.config.mjs',\n  'next.config.ts',\n  // process.features can be undefined on Edge runtime\n  // TODO: Remove `as any` once we bump @types/node to v22.10.0+\n  ...((process?.features as any)?.typescript ? ['next.config.mts'] : []),\n]\nexport const BUILD_ID_FILE = 'BUILD_ID'\nexport const BLOCKED_PAGES = ['/_document', '/_app', '/_error']\nexport const CLIENT_PUBLIC_FILES_PATH = 'public'\nexport const CLIENT_STATIC_FILES_PATH = 'static'\nexport const STRING_LITERAL_DROP_BUNDLE = '__NEXT_DROP_CLIENT_FILE__'\nexport const NEXT_BUILTIN_DOCUMENT = '__NEXT_BUILTIN_DOCUMENT__'\nexport const BARREL_OPTIMIZATION_PREFIX = '__barrel_optimize__'\n\n// server/[entry]/page_client-reference-manifest.js\nexport const CLIENT_REFERENCE_MANIFEST = 'client-reference-manifest'\n// server/server-reference-manifest\nexport const SERVER_REFERENCE_MANIFEST = 'server-reference-manifest'\n// server/middleware-build-manifest.js\nexport const MIDDLEWARE_BUILD_MANIFEST = 'middleware-build-manifest'\n// server/middleware-react-loadable-manifest.js\nexport const MIDDLEWARE_REACT_LOADABLE_MANIFEST =\n  'middleware-react-loadable-manifest'\n// server/interception-route-rewrite-manifest.js\nexport const INTERCEPTION_ROUTE_REWRITE_MANIFEST =\n  'interception-route-rewrite-manifest'\n// server/dynamic-css-manifest.js\nexport const DYNAMIC_CSS_MANIFEST = 'dynamic-css-manifest'\n\n// static/runtime/main.js\nexport const CLIENT_STATIC_FILES_RUNTIME_MAIN = `main`\nexport const CLIENT_STATIC_FILES_RUNTIME_MAIN_APP = `${CLIENT_STATIC_FILES_RUNTIME_MAIN}-app`\n// next internal client components chunk for layouts\nexport const APP_CLIENT_INTERNALS = 'app-pages-internals'\n// static/runtime/react-refresh.js\nexport const CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH = `react-refresh`\n// static/runtime/webpack.js\nexport const CLIENT_STATIC_FILES_RUNTIME_WEBPACK = `webpack`\n// static/runtime/polyfills.js\nexport const CLIENT_STATIC_FILES_RUNTIME_POLYFILLS = 'polyfills'\nexport const CLIENT_STATIC_FILES_RUNTIME_POLYFILLS_SYMBOL = Symbol(\n  CLIENT_STATIC_FILES_RUNTIME_POLYFILLS\n)\nexport const DEFAULT_RUNTIME_WEBPACK = 'webpack-runtime'\nexport const EDGE_RUNTIME_WEBPACK = 'edge-runtime-webpack'\nexport const STATIC_PROPS_ID = '__N_SSG'\nexport const SERVER_PROPS_ID = '__N_SSP'\nexport const DEFAULT_SERIF_FONT = {\n  name: 'Times New Roman',\n  xAvgCharWidth: 821,\n  azAvgWidth: 854.3953488372093,\n  unitsPerEm: 2048,\n}\nexport const DEFAULT_SANS_SERIF_FONT = {\n  name: 'Arial',\n  xAvgCharWidth: 904,\n  azAvgWidth: 934.5116279069767,\n  unitsPerEm: 2048,\n}\nexport const STATIC_STATUS_PAGES = ['/500']\nexport const TRACE_OUTPUT_VERSION = 1\n// in `MB`\nexport const TURBO_TRACE_DEFAULT_MEMORY_LIMIT = 6000\n\nexport const RSC_MODULE_TYPES = {\n  client: 'client',\n  server: 'server',\n} as const\n\n// comparing\n// https://nextjs.org/docs/api-reference/edge-runtime\n// with\n// https://nodejs.org/docs/latest/api/globals.html\nexport const EDGE_UNSUPPORTED_NODE_APIS = [\n  'clearImmediate',\n  'setImmediate',\n  'BroadcastChannel',\n  'ByteLengthQueuingStrategy',\n  'CompressionStream',\n  'CountQueuingStrategy',\n  'DecompressionStream',\n  'DomException',\n  'MessageChannel',\n  'MessageEvent',\n  'MessagePort',\n  'ReadableByteStreamController',\n  'ReadableStreamBYOBRequest',\n  'ReadableStreamDefaultController',\n  'TransformStreamDefaultController',\n  'WritableStreamDefaultController',\n]\n\nexport const SYSTEM_ENTRYPOINTS = new Set<string>([\n  CLIENT_STATIC_FILES_RUNTIME_MAIN,\n  CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH,\n  CLIENT_STATIC_FILES_RUNTIME_MAIN_APP,\n])\n","import type { UrlWithParsedQuery } from 'url'\nimport { NEXT_RSC_UNION_QUERY } from '../client/components/app-router-headers'\n\nconst DUMMY_ORIGIN = 'http://n'\n\nexport function isFullStringUrl(url: string) {\n  return /https?:\\/\\//.test(url)\n}\n\nexport function parseUrl(url: string): URL | undefined {\n  let parsed: URL | undefined = undefined\n  try {\n    parsed = new URL(url, DUMMY_ORIGIN)\n  } catch {}\n  return parsed\n}\n\nexport function parseReqUrl(url: string): UrlWithParsedQuery | undefined {\n  const parsedUrl: URL | undefined = parseUrl(url)\n\n  if (!parsedUrl) {\n    return\n  }\n\n  const query: Record<string, string | string[]> = {}\n\n  for (const key of parsedUrl.searchParams.keys()) {\n    const values = parsedUrl.searchParams.getAll(key)\n    query[key] = values.length > 1 ? values : values[0]\n  }\n\n  const legacyUrl: UrlWithParsedQuery = {\n    query,\n    hash: parsedUrl.hash,\n    search: parsedUrl.search,\n    path: parsedUrl.pathname,\n    pathname: parsedUrl.pathname,\n    href: `${parsedUrl.pathname}${parsedUrl.search}${parsedUrl.hash}`,\n    host: '',\n    hostname: '',\n    auth: '',\n    protocol: '',\n    slashes: null,\n    port: '',\n  }\n  return legacyUrl\n}\n\nexport function stripNextRscUnionQuery(relativeUrl: string): string {\n  const urlInstance = new URL(relativeUrl, DUMMY_ORIGIN)\n  urlInstance.searchParams.delete(NEXT_RSC_UNION_QUERY)\n\n  return urlInstance.pathname + urlInstance.search\n}\n","export interface PathLocale {\n  detectedLocale?: string\n  pathname: string\n}\n\n/**\n * A cache of lowercased locales for each list of locales. This is stored as a\n * WeakMap so if the locales are garbage collected, the cache entry will be\n * removed as well.\n */\nconst cache = new WeakMap<readonly string[], readonly string[]>()\n\n/**\n * For a pathname that may include a locale from a list of locales, it\n * removes the locale from the pathname returning it alongside with the\n * detected locale.\n *\n * @param pathname A pathname that may include a locale.\n * @param locales A list of locales.\n * @returns The detected locale and pathname without locale\n */\nexport function normalizeLocalePath(\n  pathname: string,\n  locales?: readonly string[]\n): PathLocale {\n  // If locales is undefined, return the pathname as is.\n  if (!locales) return { pathname }\n\n  // Get the cached lowercased locales or create a new cache entry.\n  let lowercasedLocales = cache.get(locales)\n  if (!lowercasedLocales) {\n    lowercasedLocales = locales.map((locale) => locale.toLowerCase())\n    cache.set(locales, lowercasedLocales)\n  }\n\n  let detectedLocale: string | undefined\n\n  // The first segment will be empty, because it has a leading `/`. If\n  // there is no further segment, there is no locale (or it's the default).\n  const segments = pathname.split('/', 2)\n\n  // If there's no second segment (ie, the pathname is just `/`), there's no\n  // locale.\n  if (!segments[1]) return { pathname }\n\n  // The second segment will contain the locale part if any.\n  const segment = segments[1].toLowerCase()\n\n  // See if the segment matches one of the locales. If it doesn't, there is\n  // no locale (or it's the default).\n  const index = lowercasedLocales.indexOf(segment)\n  if (index < 0) return { pathname }\n\n  // Return the case-sensitive locale.\n  detectedLocale = locales[index]\n\n  // Remove the `/${locale}` part of the pathname.\n  pathname = pathname.slice(detectedLocale.length + 1) || '/'\n\n  return { pathname, detectedLocale }\n}\n","/**\n * For a given page path, this function ensures that there is a leading slash.\n * If there is not a leading slash, one is added, otherwise it is noop.\n */\nexport function ensureLeadingSlash(path: string) {\n  return path.startsWith('/') ? path : `/${path}`\n}\n","import { ensureLeadingSlash } from '../../page-path/ensure-leading-slash'\nimport { isGroupSegment } from '../../segment'\n\n/**\n * Normalizes an app route so it represents the actual request path. Essentially\n * performing the following transformations:\n *\n * - `/(dashboard)/user/[id]/page` to `/user/[id]`\n * - `/(dashboard)/account/page` to `/account`\n * - `/user/[id]/page` to `/user/[id]`\n * - `/account/page` to `/account`\n * - `/page` to `/`\n * - `/(dashboard)/user/[id]/route` to `/user/[id]`\n * - `/(dashboard)/account/route` to `/account`\n * - `/user/[id]/route` to `/user/[id]`\n * - `/account/route` to `/account`\n * - `/route` to `/`\n * - `/` to `/`\n *\n * @param route the app route to normalize\n * @returns the normalized pathname\n */\nexport function normalizeAppPath(route: string) {\n  return ensureLeadingSlash(\n    route.split('/').reduce((pathname, segment, index, segments) => {\n      // Empty segments are ignored.\n      if (!segment) {\n        return pathname\n      }\n\n      // Groups are ignored.\n      if (isGroupSegment(segment)) {\n        return pathname\n      }\n\n      // Parallel segments are ignored.\n      if (segment[0] === '@') {\n        return pathname\n      }\n\n      // The last segment (if it's a leaf) should be ignored.\n      if (\n        (segment === 'page' || segment === 'route') &&\n        index === segments.length - 1\n      ) {\n        return pathname\n      }\n\n      return `${pathname}/${segment}`\n    }, '')\n  )\n}\n\n/**\n * Comparator for sorting app paths so that parallel slot paths (containing\n * `/@`) come before the children/root page path. This ensures the last item\n * is always the children page, which is what `renderPageComponent` reads via\n * `appPaths[appPaths.length - 1]`.\n *\n * Without this, route group prefixes like `(group)` (char code 0x28) sort\n * before `@` (0x40), causing the children page to sort first instead of last\n * and leading to a manifest mismatch / 404 in webpack dev mode.\n */\nexport function compareAppPaths(a: string, b: string): number {\n  const aHasSlot = a.includes('/@')\n  const bHasSlot = b.includes('/@')\n  if (aHasSlot && !bHasSlot) return -1\n  if (!aHasSlot && bHasSlot) return 1\n  return a.localeCompare(b)\n}\n\n/**\n * Strips the `.rsc` extension if it's in the pathname.\n * Since this function is used on full urls it checks `?` for searchParams handling.\n */\nexport function normalizeRscURL(url: string) {\n  return url.replace(\n    /\\.rsc($|\\?)/,\n    // $1 ensures `?` is preserved\n    '$1'\n  )\n}\n","import type { FlightRouterState, Segment } from './app-router-types'\n\nexport function getSegmentValue(segment: Segment) {\n  return Array.isArray(segment) ? segment[1] : segment\n}\n\nexport function isGroupSegment(segment: string) {\n  // Use array[0] for performant purpose\n  return segment[0] === '(' && segment.endsWith(')')\n}\n\nexport function isParallelRouteSegment(segment: string) {\n  return segment.startsWith('@') && segment !== '@children'\n}\n\nexport function addSearchParamsIfPageSegment(\n  segment: Segment,\n  searchParams: Record<string, string | string[] | undefined>\n) {\n  const isPageSegment = segment.includes(PAGE_SEGMENT_KEY)\n\n  if (isPageSegment) {\n    const stringifiedQuery = JSON.stringify(searchParams)\n    return stringifiedQuery !== '{}'\n      ? PAGE_SEGMENT_KEY + '?' + stringifiedQuery\n      : PAGE_SEGMENT_KEY\n  }\n\n  return segment\n}\n\nexport function computeSelectedLayoutSegment(\n  segments: string[] | null,\n  parallelRouteKey: string\n): string | null {\n  if (!segments || segments.length === 0) {\n    return null\n  }\n\n  // For 'children', use first segment; for other parallel routes, use last segment\n  const rawSegment =\n    parallelRouteKey === 'children'\n      ? segments[0]\n      : segments[segments.length - 1]\n\n  // If the default slot is showing, return null since it's not technically \"selected\" (it's a fallback)\n  // Returning an internal value like `__DEFAULT__` would be confusing\n  return rawSegment === DEFAULT_SEGMENT_KEY ? null : rawSegment\n}\n\n/** Get the canonical parameters from the current level to the leaf node. */\nexport function getSelectedLayoutSegmentPath(\n  tree: FlightRouterState,\n  parallelRouteKey: string,\n  first = true,\n  segmentPath: string[] = []\n): string[] {\n  let node: FlightRouterState\n  if (first) {\n    // Use the provided parallel route key on the first parallel route\n    node = tree[1][parallelRouteKey]\n  } else {\n    // After first parallel route prefer children, if there's no children pick the first parallel route.\n    const parallelRoutes = tree[1]\n    node = parallelRoutes.children ?? Object.values(parallelRoutes)[0]\n  }\n\n  if (!node) return segmentPath\n  const segment = node[0]\n\n  let segmentValue = getSegmentValue(segment)\n\n  if (!segmentValue || segmentValue.startsWith(PAGE_SEGMENT_KEY)) {\n    return segmentPath\n  }\n\n  segmentPath.push(segmentValue)\n\n  return getSelectedLayoutSegmentPath(\n    node,\n    parallelRouteKey,\n    false,\n    segmentPath\n  )\n}\n\nexport const PAGE_SEGMENT_KEY = '__PAGE__'\nexport const DEFAULT_SEGMENT_KEY = '__DEFAULT__'\nexport const NOT_FOUND_SEGMENT_KEY = '/_not-found'\n","import { normalizeAppPath } from './app-paths'\n\n// order matters here, the first match will be used\nexport const INTERCEPTION_ROUTE_MARKERS = [\n  '(..)(..)',\n  '(.)',\n  '(..)',\n  '(...)',\n] as const\n\nexport type InterceptionMarker = (typeof INTERCEPTION_ROUTE_MARKERS)[number]\n\nexport function isInterceptionRouteAppPath(path: string): boolean {\n  // TODO-APP: add more serious validation\n  return (\n    path\n      .split('/')\n      .find((segment) =>\n        INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m))\n      ) !== undefined\n  )\n}\n\ntype InterceptionRouteInformation = {\n  /**\n   * The intercepting route. This is the route that is being intercepted or the\n   * route that the user was coming from. This is matched by the Next-Url\n   * header.\n   */\n  interceptingRoute: string\n\n  /**\n   * The intercepted route. This is the route that is being intercepted or the\n   * route that the user is going to. This is matched by the request pathname.\n   */\n  interceptedRoute: string\n}\n\nexport function extractInterceptionRouteInformation(\n  path: string\n): InterceptionRouteInformation {\n  let interceptingRoute: string | undefined\n  let marker: (typeof INTERCEPTION_ROUTE_MARKERS)[number] | undefined\n  let interceptedRoute: string | undefined\n\n  for (const segment of path.split('/')) {\n    marker = INTERCEPTION_ROUTE_MARKERS.find((m) => segment.startsWith(m))\n    if (marker) {\n      ;[interceptingRoute, interceptedRoute] = path.split(marker, 2)\n      break\n    }\n  }\n\n  if (!interceptingRoute || !marker || !interceptedRoute) {\n    throw new Error(\n      `Invalid interception route: ${path}. Must be in the format /<intercepting route>/(..|...|..)(..)/<intercepted route>`\n    )\n  }\n\n  interceptingRoute = normalizeAppPath(interceptingRoute) // normalize the path, e.g. /(blog)/feed -> /feed\n\n  switch (marker) {\n    case '(.)':\n      // (.) indicates that we should match with sibling routes, so we just need to append the intercepted route to the intercepting route\n      if (interceptingRoute === '/') {\n        interceptedRoute = `/${interceptedRoute}`\n      } else {\n        interceptedRoute = interceptingRoute + '/' + interceptedRoute\n      }\n      break\n    case '(..)':\n      // (..) indicates that we should match at one level up, so we need to remove the last segment of the intercepting route\n      if (interceptingRoute === '/') {\n        throw new Error(\n          `Invalid interception route: ${path}. Cannot use (..) marker at the root level, use (.) instead.`\n        )\n      }\n      interceptedRoute = interceptingRoute\n        .split('/')\n        .slice(0, -1)\n        .concat(interceptedRoute)\n        .join('/')\n      break\n    case '(...)':\n      // (...) will match the route segment in the root directory, so we need to use the root directory to prepend the intercepted route\n      interceptedRoute = '/' + interceptedRoute\n      break\n    case '(..)(..)':\n      // (..)(..) indicates that we should match at two levels up, so we need to remove the last two segments of the intercepting route\n\n      const splitInterceptingRoute = interceptingRoute.split('/')\n      if (splitInterceptingRoute.length <= 2) {\n        throw new Error(\n          `Invalid interception route: ${path}. Cannot use (..)(..) marker at the root level or one level up.`\n        )\n      }\n\n      interceptedRoute = splitInterceptingRoute\n        .slice(0, -2)\n        .concat(interceptedRoute)\n        .join('/')\n      break\n    default:\n      throw new Error('Invariant: unexpected marker')\n  }\n\n  return { interceptingRoute, interceptedRoute }\n}\n","import {\n  extractInterceptionRouteInformation,\n  isInterceptionRouteAppPath,\n} from './interception-routes'\n\n// Identify /.*[param].*/ in route string\nconst TEST_ROUTE = /\\/[^/]*\\[[^/]+\\][^/]*(?=\\/|$)/\n\n// Identify /[param]/ in route string\nconst TEST_STRICT_ROUTE = /\\/\\[[^/]+\\](?=\\/|$)/\n\n/**\n * Check if a route is dynamic.\n *\n * @param route - The route to check.\n * @param strict - Whether to use strict mode which prohibits segments with prefixes/suffixes (default: true).\n * @returns Whether the route is dynamic.\n */\nexport function isDynamicRoute(route: string, strict: boolean = true): boolean {\n  if (isInterceptionRouteAppPath(route)) {\n    route = extractInterceptionRouteInformation(route).interceptedRoute\n  }\n\n  if (strict) {\n    return TEST_STRICT_ROUTE.test(route)\n  }\n\n  return TEST_ROUTE.test(route)\n}\n","/**\n * Given a path this function will find the pathname, query and hash and return\n * them. This is useful to parse full paths on the client side.\n * @param path A path to parse e.g. /foo/bar?id=1#hash\n */\nexport function parsePath(path: string) {\n  const hashIndex = path.indexOf('#')\n  const queryIndex = path.indexOf('?')\n  const hasQuery = queryIndex > -1 && (hashIndex < 0 || queryIndex < hashIndex)\n\n  if (hasQuery || hashIndex > -1) {\n    return {\n      pathname: path.substring(0, hasQuery ? queryIndex : hashIndex),\n      query: hasQuery\n        ? path.substring(queryIndex, hashIndex > -1 ? hashIndex : undefined)\n        : '',\n      hash: hashIndex > -1 ? path.slice(hashIndex) : '',\n    }\n  }\n\n  return { pathname: path, query: '', hash: '' }\n}\n","import { parsePath } from './parse-path'\n\n/**\n * Checks if a given path starts with a given prefix. It ensures it matches\n * exactly without containing extra chars. e.g. prefix /docs should replace\n * for /docs, /docs/, /docs/a but not /docsss\n * @param path The path to check.\n * @param prefix The prefix to check against.\n */\nexport function pathHasPrefix(path: string, prefix: string) {\n  if (typeof path !== 'string') {\n    return false\n  }\n\n  const { pathname } = parsePath(path)\n  return pathname === prefix || pathname.startsWith(prefix + '/')\n}\n","import { pathHasPrefix } from './path-has-prefix'\n\n/**\n * Given a path and a prefix it will remove the prefix when it exists in the\n * given path. It ensures it matches exactly without containing extra chars\n * and if the prefix is not there it will be noop.\n *\n * @param path The path to remove the prefix from.\n * @param prefix The prefix to be removed.\n */\nexport function removePathPrefix(path: string, prefix: string): string {\n  // If the path doesn't start with the prefix we can return it as is. This\n  // protects us from situations where the prefix is a substring of the path\n  // prefix such as:\n  //\n  // For prefix: /blog\n  //\n  //   /blog -> true\n  //   /blog/ -> true\n  //   /blog/1 -> true\n  //   /blogging -> false\n  //   /blogging/ -> false\n  //   /blogging/1 -> false\n  if (!pathHasPrefix(path, prefix)) {\n    return path\n  }\n\n  // Remove the prefix from the path via slicing.\n  const withoutPrefix = path.slice(prefix.length)\n\n  // If the path without the prefix starts with a `/` we can return it as is.\n  if (withoutPrefix.startsWith('/')) {\n    return withoutPrefix\n  }\n\n  // If the path without the prefix doesn't start with a `/` we need to add it\n  // back to the path to make sure it's a valid path.\n  return `/${withoutPrefix}`\n}\n","// regexp is based on https://github.com/sindresorhus/escape-string-regexp\nconst reHasRegExp = /[|\\\\{}()[\\]^$+*?.-]/\nconst reReplaceRegExp = /[|\\\\{}()[\\]^$+*?.-]/g\n\nexport function escapeStringRegexp(str: string) {\n  // see also: https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/escapeRegExp.js#L23\n  if (reHasRegExp.test(str)) {\n    return str.replace(reReplaceRegExp, '\\\\$&')\n  }\n  return str\n}\n","/**\n * Removes the trailing slash for a given route or page path. Examples:\n *   - `/foo/bar/` -> `/foo/bar`\n *   - `/foo/bar` -> `/foo/bar`\n *\n * Uses charCodeAt (47 === '/') instead of regex to avoid the overhead of\n * compiling and executing a RegExp on every call (~3-5x faster).\n */\nexport function removeTrailingSlash(route: string) {\n  return route.charCodeAt(route.length - 1) === 47 && route.length > 1\n    ? route.slice(0, -1)\n    : route\n}\n","export class InvariantError extends Error {\n  constructor(message: string, options?: ErrorOptions) {\n    super(\n      `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n      options\n    )\n    this.name = 'InvariantError'\n  }\n}\n","import type { DynamicParam } from '../../../../server/app-render/app-render'\nimport type { LoaderTree } from '../../../../server/lib/app-dir-module'\nimport type { OpaqueFallbackRouteParams } from '../../../../server/request/fallback-params'\nimport type { Params } from '../../../../server/request/params'\nimport type { DynamicParamTypesShort } from '../../app-router-types'\nimport { InvariantError } from '../../invariant-error'\nimport { parseLoaderTree } from './parse-loader-tree'\nimport { parseNormalizedAppRoute, parseAppRouteSegment } from '../routes/app'\nimport { resolveParamValue } from './resolve-param-value'\n\n/**\n * Gets the value of a param from the params object. This correctly handles the\n * case where the param is a fallback route param and encodes the resulting\n * value.\n *\n * @param interpolatedParams - The params object.\n * @param segmentKey - The key of the segment.\n * @param fallbackRouteParams - The fallback route params.\n * @returns The value of the param.\n */\nfunction getParamValue(\n  interpolatedParams: Params,\n  segmentKey: string,\n  fallbackRouteParams: OpaqueFallbackRouteParams | null\n) {\n  let value = interpolatedParams[segmentKey]\n\n  if (fallbackRouteParams?.has(segmentKey)) {\n    // We know that the fallback route params has the segment key because we\n    // checked that above.\n    const [searchValue] = fallbackRouteParams.get(segmentKey)!\n    value = searchValue\n  } else if (Array.isArray(value)) {\n    value = value.map((i) => encodeURIComponent(i))\n  } else if (typeof value === 'string') {\n    value = encodeURIComponent(value)\n  }\n\n  return value\n}\n\nexport function interpolateParallelRouteParams(\n  loaderTree: LoaderTree,\n  params: Params,\n  pagePath: string,\n  fallbackRouteParams: OpaqueFallbackRouteParams | null\n): Params {\n  const interpolated = structuredClone(params)\n\n  // Stack-based traversal with depth tracking\n  const stack: Array<{ tree: LoaderTree; depth: number }> = [\n    { tree: loaderTree, depth: 0 },\n  ]\n\n  // Parse the route from the provided page path.\n  const route = parseNormalizedAppRoute(pagePath)\n\n  while (stack.length > 0) {\n    const { tree, depth } = stack.pop()!\n    const { segment, parallelRoutes } = parseLoaderTree(tree)\n\n    const appSegment = parseAppRouteSegment(segment)\n\n    if (\n      appSegment?.type === 'dynamic' &&\n      !interpolated.hasOwnProperty(appSegment.param.paramName) &&\n      // If the param is in the fallback route params, we don't need to\n      // interpolate it because it's already marked as being unknown.\n      !fallbackRouteParams?.has(appSegment.param.paramName)\n    ) {\n      const { paramName, paramType } = appSegment.param\n\n      const paramValue = resolveParamValue(\n        paramName,\n        paramType,\n        depth,\n        route,\n        interpolated\n      )\n\n      if (paramValue !== undefined) {\n        interpolated[paramName] = paramValue\n      } else if (paramType !== 'optional-catchall') {\n        throw new InvariantError(\n          `Could not resolve param value for segment: ${paramName}`\n        )\n      }\n    }\n\n    // Calculate next depth - increment if this is not a route group and not empty\n    let nextDepth = depth\n    if (\n      appSegment &&\n      appSegment.type !== 'route-group' &&\n      appSegment.type !== 'parallel-route'\n    ) {\n      nextDepth++\n    }\n\n    // Add all parallel routes to the stack for processing\n    for (const parallelRoute of Object.values(parallelRoutes)) {\n      stack.push({ tree: parallelRoute, depth: nextDepth })\n    }\n  }\n\n  return interpolated\n}\n\n/**\n *\n * Shared logic on client and server for creating a dynamic param value.\n *\n * This code needs to be shared with the client so it can extract dynamic route\n * params from the URL without a server request.\n *\n * Because everything in this module is sent to the client, we should aim to\n * keep this code as simple as possible. The special case handling for catchall\n * and optional is, alas, unfortunate.\n */\nexport function getDynamicParam(\n  interpolatedParams: Params,\n  segmentKey: string,\n  dynamicParamType: DynamicParamTypesShort,\n  fallbackRouteParams: OpaqueFallbackRouteParams | null,\n  staticSiblings: readonly string[] | null\n): DynamicParam {\n  let value: string | string[] | undefined = getParamValue(\n    interpolatedParams,\n    segmentKey,\n    fallbackRouteParams\n  )\n\n  // handle the case where an optional catchall does not have a value,\n  // e.g. `/dashboard/[[...slug]]` when requesting `/dashboard`\n  if (!value || value.length === 0) {\n    if (dynamicParamType === 'oc') {\n      return {\n        param: segmentKey,\n        value: null,\n        type: dynamicParamType,\n        treeSegment: [segmentKey, '', dynamicParamType, staticSiblings],\n      }\n    }\n\n    throw new InvariantError(\n      `Missing value for segment key: \"${segmentKey}\" with dynamic param type: ${dynamicParamType}`\n    )\n  }\n\n  const paramCacheKey = Array.isArray(value) ? value.join('/') : value\n\n  return {\n    param: segmentKey,\n    // The value that is passed to user code.\n    value,\n    // The value that is rendered in the router tree.\n    // TODO: If the number of static siblings exceeds some threshold (e.g.,\n    // dozens or hundreds), consider sending a Bloom filter instead of the full\n    // array to reduce payload size. The client would then use the Bloom filter\n    // to check membership with a small false positive rate.\n    treeSegment: [segmentKey, paramCacheKey, dynamicParamType, staticSiblings],\n    type: dynamicParamType,\n  }\n}\n\n/**\n * Regular expression pattern used to match route parameters.\n * Matches both single parameters and parameter groups.\n * Examples:\n *   - `[[...slug]]` matches parameter group with key 'slug', repeat: true, optional: true\n *   - `[...slug]` matches parameter group with key 'slug', repeat: true, optional: false\n *   - `[[foo]]` matches parameter with key 'foo', repeat: false, optional: true\n *   - `[bar]` matches parameter with key 'bar', repeat: false, optional: false\n */\nexport const PARAMETER_PATTERN = /^([^[]*)\\[((?:\\[[^\\]]*\\])|[^\\]]+)\\](.*)$/\n\n/**\n * Parses a given parameter from a route to a data structure that can be used\n * to generate the parametrized route.\n * Examples:\n *   - `[[...slug]]` -> `{ key: 'slug', repeat: true, optional: true }`\n *   - `[...slug]` -> `{ key: 'slug', repeat: true, optional: false }`\n *   - `[[foo]]` -> `{ key: 'foo', repeat: false, optional: true }`\n *   - `[bar]` -> `{ key: 'bar', repeat: false, optional: false }`\n *   - `fizz` -> `{ key: 'fizz', repeat: false, optional: false }`\n * @param param - The parameter to parse.\n * @returns The parsed parameter as a data structure.\n */\nexport function parseParameter(param: string) {\n  const match = param.match(PARAMETER_PATTERN)\n\n  if (!match) {\n    return parseMatchedParameter(param)\n  }\n\n  return parseMatchedParameter(match[2])\n}\n\n/**\n * Parses a matched parameter from the PARAMETER_PATTERN regex to a data structure that can be used\n * to generate the parametrized route.\n * Examples:\n *   - `[...slug]` -> `{ key: 'slug', repeat: true, optional: true }`\n *   - `...slug` -> `{ key: 'slug', repeat: true, optional: false }`\n *   - `[foo]` -> `{ key: 'foo', repeat: false, optional: true }`\n *   - `bar` -> `{ key: 'bar', repeat: false, optional: false }`\n * @param param - The matched parameter to parse.\n * @returns The parsed parameter as a data structure.\n */\nexport function parseMatchedParameter(param: string) {\n  const optional = param.startsWith('[') && param.endsWith(']')\n  if (optional) {\n    param = param.slice(1, -1)\n  }\n  const repeat = param.startsWith('...')\n  if (repeat) {\n    param = param.slice(3)\n  }\n  return { key: param, repeat, optional }\n}\n","import {\n  NEXT_INTERCEPTION_MARKER_PREFIX,\n  NEXT_QUERY_PARAM_PREFIX,\n} from '../../../../lib/constants'\nimport { INTERCEPTION_ROUTE_MARKERS } from './interception-routes'\nimport { escapeStringRegexp } from '../../escape-regexp'\nimport { removeTrailingSlash } from './remove-trailing-slash'\nimport { PARAMETER_PATTERN, parseMatchedParameter } from './get-dynamic-param'\n\nexport interface Group {\n  pos: number\n  repeat: boolean\n  optional: boolean\n}\n\nexport interface RouteRegex {\n  groups: { [groupName: string]: Group }\n  re: RegExp\n}\n\nexport type RegexReference = {\n  names: Record<string, string>\n  intercepted: Record<string, string>\n}\n\ntype GetNamedRouteRegexOptions = {\n  /**\n   * Whether to prefix the route keys with the NEXT_INTERCEPTION_MARKER_PREFIX\n   * or NEXT_QUERY_PARAM_PREFIX. This is only relevant when creating the\n   * routes-manifest during the build.\n   */\n  prefixRouteKeys: boolean\n\n  /**\n   * Whether to include the suffix in the route regex. This means that when you\n   * have something like `/[...slug].json` the `.json` part will be included\n   * in the regex, yielding `/(.*).json` as the regex.\n   */\n  includeSuffix?: boolean\n\n  /**\n   * Whether to include the prefix in the route regex. This means that when you\n   * have something like `/[...slug].json` the `/` part will be included\n   * in the regex, yielding `^/(.*).json$` as the regex.\n   *\n   * Note that interception markers will already be included without the need\n   */\n  includePrefix?: boolean\n\n  /**\n   * Whether to exclude the optional trailing slash from the route regex.\n   */\n  excludeOptionalTrailingSlash?: boolean\n\n  /**\n   * Whether to backtrack duplicate keys. This is only relevant when creating\n   * the routes-manifest during the build.\n   */\n  backreferenceDuplicateKeys?: boolean\n\n  /**\n   * If provided, this will be used as the reference for the dynamic parameter\n   * keys instead of generating them in context. This is currently only used for\n   * interception routes.\n   */\n  reference?: RegexReference\n}\n\ntype GetRouteRegexOptions = {\n  /**\n   * Whether to include extra parts in the route regex. This means that when you\n   * have something like `/[...slug].json` the `.json` part will be included\n   * in the regex, yielding `/(.*).json` as the regex.\n   */\n  includeSuffix?: boolean\n\n  /**\n   * Whether to include the prefix in the route regex. This means that when you\n   * have something like `/[...slug].json` the `/` part will be included\n   * in the regex, yielding `^/(.*).json$` as the regex.\n   *\n   * Note that interception markers will already be included without the need\n   * of adding this option.\n   */\n  includePrefix?: boolean\n\n  /**\n   * Whether to exclude the optional trailing slash from the route regex.\n   */\n  excludeOptionalTrailingSlash?: boolean\n}\n\nfunction getParametrizedRoute(\n  route: string,\n  includeSuffix: boolean,\n  includePrefix: boolean\n) {\n  const groups: { [groupName: string]: Group } = {}\n  let groupIndex = 1\n\n  const segments: string[] = []\n  for (const segment of removeTrailingSlash(route).slice(1).split('/')) {\n    const markerMatch = INTERCEPTION_ROUTE_MARKERS.find((m) =>\n      segment.startsWith(m)\n    )\n    const paramMatches = segment.match(PARAMETER_PATTERN) // Check for parameters\n\n    if (markerMatch && paramMatches && paramMatches[2]) {\n      const { key, optional, repeat } = parseMatchedParameter(paramMatches[2])\n      groups[key] = { pos: groupIndex++, repeat, optional }\n      segments.push(`/${escapeStringRegexp(markerMatch)}([^/]+?)`)\n    } else if (paramMatches && paramMatches[2]) {\n      const { key, repeat, optional } = parseMatchedParameter(paramMatches[2])\n      groups[key] = { pos: groupIndex++, repeat, optional }\n\n      if (includePrefix && paramMatches[1]) {\n        segments.push(`/${escapeStringRegexp(paramMatches[1])}`)\n      }\n\n      let s = repeat ? (optional ? '(?:/(.+?))?' : '/(.+?)') : '/([^/]+?)'\n\n      // Remove the leading slash if includePrefix already added it.\n      if (includePrefix && paramMatches[1]) {\n        s = s.substring(1)\n      }\n\n      segments.push(s)\n    } else {\n      segments.push(`/${escapeStringRegexp(segment)}`)\n    }\n\n    // If there's a suffix, add it to the segments if it's enabled.\n    if (includeSuffix && paramMatches && paramMatches[3]) {\n      segments.push(escapeStringRegexp(paramMatches[3]))\n    }\n  }\n\n  return {\n    parameterizedRoute: segments.join(''),\n    groups,\n  }\n}\n\n/**\n * From a normalized route this function generates a regular expression and\n * a corresponding groups object intended to be used to store matching groups\n * from the regular expression.\n */\nexport function getRouteRegex(\n  normalizedRoute: string,\n  {\n    includeSuffix = false,\n    includePrefix = false,\n    excludeOptionalTrailingSlash = false,\n  }: GetRouteRegexOptions = {}\n): RouteRegex {\n  const { parameterizedRoute, groups } = getParametrizedRoute(\n    normalizedRoute,\n    includeSuffix,\n    includePrefix\n  )\n\n  let re = parameterizedRoute\n  if (!excludeOptionalTrailingSlash) {\n    re += '(?:/)?'\n  }\n\n  return {\n    re: new RegExp(`^${re}$`),\n    groups: groups,\n  }\n}\n\n/**\n * Builds a function to generate a minimal routeKey using only a-z and minimal\n * number of characters.\n */\nfunction buildGetSafeRouteKey() {\n  let i = 0\n\n  return () => {\n    let routeKey = ''\n    let j = ++i\n    while (j > 0) {\n      routeKey += String.fromCharCode(97 + ((j - 1) % 26))\n      j = Math.floor((j - 1) / 26)\n    }\n    return routeKey\n  }\n}\n\nfunction getSafeKeyFromSegment({\n  interceptionMarker,\n  getSafeRouteKey,\n  segment,\n  routeKeys,\n  keyPrefix,\n  backreferenceDuplicateKeys,\n}: {\n  interceptionMarker?: string\n  getSafeRouteKey: () => string\n  segment: string\n  routeKeys: Record<string, string>\n  keyPrefix?: string\n  backreferenceDuplicateKeys: boolean\n}) {\n  const { key, optional, repeat } = parseMatchedParameter(segment)\n\n  // replace any non-word characters since they can break\n  // the named regex\n  let cleanedKey = key.replace(/\\W/g, '')\n\n  if (keyPrefix) {\n    cleanedKey = `${keyPrefix}${cleanedKey}`\n  }\n  let invalidKey = false\n\n  // check if the key is still invalid and fallback to using a known\n  // safe key\n  if (cleanedKey.length === 0 || cleanedKey.length > 30) {\n    invalidKey = true\n  }\n  if (!isNaN(parseInt(cleanedKey.slice(0, 1)))) {\n    invalidKey = true\n  }\n\n  if (invalidKey) {\n    cleanedKey = getSafeRouteKey()\n  }\n\n  const duplicateKey = cleanedKey in routeKeys\n\n  if (keyPrefix) {\n    routeKeys[cleanedKey] = `${keyPrefix}${key}`\n  } else {\n    routeKeys[cleanedKey] = key\n  }\n\n  // if the segment has an interception marker, make sure that's part of the regex pattern\n  // this is to ensure that the route with the interception marker doesn't incorrectly match\n  // the non-intercepted route (ie /app/(.)[username] should not match /app/[username])\n  const interceptionPrefix = interceptionMarker\n    ? escapeStringRegexp(interceptionMarker)\n    : ''\n\n  let pattern: string\n  if (duplicateKey && backreferenceDuplicateKeys) {\n    // Use a backreference to the key to ensure that the key is the same value\n    // in each of the placeholders.\n    pattern = `\\\\k<${cleanedKey}>`\n  } else if (repeat) {\n    pattern = `(?<${cleanedKey}>.+?)`\n  } else {\n    pattern = `(?<${cleanedKey}>[^/]+?)`\n  }\n\n  return {\n    key,\n    pattern: optional\n      ? `(?:/${interceptionPrefix}${pattern})?`\n      : `/${interceptionPrefix}${pattern}`,\n    cleanedKey: cleanedKey,\n    optional,\n    repeat,\n  }\n}\n\nfunction getNamedParametrizedRoute(\n  route: string,\n  prefixRouteKeys: boolean,\n  includeSuffix: boolean,\n  includePrefix: boolean,\n  backreferenceDuplicateKeys: boolean,\n  reference: RegexReference = { names: {}, intercepted: {} }\n) {\n  const getSafeRouteKey = buildGetSafeRouteKey()\n  const routeKeys: { [named: string]: string } = {}\n\n  const segments: string[] = []\n  const inverseParts: string[] = []\n\n  // Ensure we don't mutate the original reference object.\n  reference = structuredClone(reference)\n\n  for (const segment of removeTrailingSlash(route).slice(1).split('/')) {\n    const hasInterceptionMarker = INTERCEPTION_ROUTE_MARKERS.some((m) =>\n      segment.startsWith(m)\n    )\n\n    const paramMatches = segment.match(PARAMETER_PATTERN) // Check for parameters\n\n    const interceptionMarker = hasInterceptionMarker\n      ? paramMatches?.[1]\n      : undefined\n\n    let keyPrefix: string | undefined\n    if (interceptionMarker && paramMatches?.[2]) {\n      keyPrefix = prefixRouteKeys ? NEXT_INTERCEPTION_MARKER_PREFIX : undefined\n      reference.intercepted[paramMatches[2]] = interceptionMarker\n    } else if (paramMatches?.[2] && reference.intercepted[paramMatches[2]]) {\n      keyPrefix = prefixRouteKeys ? NEXT_INTERCEPTION_MARKER_PREFIX : undefined\n    } else {\n      keyPrefix = prefixRouteKeys ? NEXT_QUERY_PARAM_PREFIX : undefined\n    }\n\n    if (interceptionMarker && paramMatches && paramMatches[2]) {\n      // If there's an interception marker, add it to the segments.\n      const { key, pattern, cleanedKey, repeat, optional } =\n        getSafeKeyFromSegment({\n          getSafeRouteKey,\n          interceptionMarker,\n          segment: paramMatches[2],\n          routeKeys,\n          keyPrefix,\n          backreferenceDuplicateKeys,\n        })\n\n      segments.push(pattern)\n      inverseParts.push(\n        `/${paramMatches[1]}:${reference.names[key] ?? cleanedKey}${repeat ? (optional ? '*' : '+') : ''}`\n      )\n      reference.names[key] ??= cleanedKey\n    } else if (paramMatches && paramMatches[2]) {\n      // If there's a prefix, add it to the segments if it's enabled.\n      if (includePrefix && paramMatches[1]) {\n        segments.push(`/${escapeStringRegexp(paramMatches[1])}`)\n        inverseParts.push(`/${paramMatches[1]}`)\n      }\n\n      const { key, pattern, cleanedKey, repeat, optional } =\n        getSafeKeyFromSegment({\n          getSafeRouteKey,\n          segment: paramMatches[2],\n          routeKeys,\n          keyPrefix,\n          backreferenceDuplicateKeys,\n        })\n\n      // Remove the leading slash if includePrefix already added it.\n      let s = pattern\n      if (includePrefix && paramMatches[1]) {\n        s = s.substring(1)\n      }\n\n      segments.push(s)\n      inverseParts.push(\n        `/:${reference.names[key] ?? cleanedKey}${repeat ? (optional ? '*' : '+') : ''}`\n      )\n      reference.names[key] ??= cleanedKey\n    } else {\n      segments.push(`/${escapeStringRegexp(segment)}`)\n      inverseParts.push(`/${segment}`)\n    }\n\n    // If there's a suffix, add it to the segments if it's enabled.\n    if (includeSuffix && paramMatches && paramMatches[3]) {\n      segments.push(escapeStringRegexp(paramMatches[3]))\n      inverseParts.push(paramMatches[3])\n    }\n  }\n\n  return {\n    namedParameterizedRoute: segments.join(''),\n    routeKeys,\n    pathToRegexpPattern: inverseParts.join(''),\n    reference,\n  }\n}\n\n/**\n * This function extends `getRouteRegex` generating also a named regexp where\n * each group is named along with a routeKeys object that indexes the assigned\n * named group with its corresponding key. When the routeKeys need to be\n * prefixed to uniquely identify internally the \"prefixRouteKey\" arg should\n * be \"true\" currently this is only the case when creating the routes-manifest\n * during the build\n */\nexport function getNamedRouteRegex(\n  normalizedRoute: string,\n  options: GetNamedRouteRegexOptions\n) {\n  const result = getNamedParametrizedRoute(\n    normalizedRoute,\n    options.prefixRouteKeys,\n    options.includeSuffix ?? false,\n    options.includePrefix ?? false,\n    options.backreferenceDuplicateKeys ?? false,\n    options.reference\n  )\n\n  let namedRegex = result.namedParameterizedRoute\n  if (!options.excludeOptionalTrailingSlash) {\n    namedRegex += '(?:/)?'\n  }\n\n  return {\n    ...getRouteRegex(normalizedRoute, options),\n    namedRegex: `^${namedRegex}$`,\n    routeKeys: result.routeKeys,\n    pathToRegexpPattern: result.pathToRegexpPattern,\n    reference: result.reference,\n  }\n}\n\n/**\n * Generates a named regexp.\n * This is intended to be using for build time only.\n */\nexport function getNamedMiddlewareRegex(\n  normalizedRoute: string,\n  options: {\n    catchAll?: boolean\n  }\n) {\n  const { parameterizedRoute } = getParametrizedRoute(\n    normalizedRoute,\n    false,\n    false\n  )\n  const { catchAll = true } = options\n  if (parameterizedRoute === '/') {\n    let catchAllRegex = catchAll ? '.*' : ''\n    return {\n      namedRegex: `^/${catchAllRegex}$`,\n    }\n  }\n\n  const { namedParameterizedRoute } = getNamedParametrizedRoute(\n    normalizedRoute,\n    false,\n    false,\n    false,\n    false,\n    undefined\n  )\n  let catchAllGroupedRegex = catchAll ? '(?:(/.*)?)' : ''\n  return {\n    namedRegex: `^${namedParameterizedRoute}${catchAllGroupedRegex}$`,\n  }\n}\n","import type { HtmlProps } from './html-context.shared-runtime'\nimport type { ComponentType, JSX } from 'react'\nimport type { DomainLocale } from '../../server/config'\nimport type { Env } from '@next/env'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { NextRouter } from './router/router'\nimport type { ParsedUrlQuery } from 'querystring'\nimport type { PreviewData } from '../../types'\nimport type { COMPILER_NAMES } from './constants'\nimport type fs from 'fs'\n\nexport type NextComponentType<\n  Context extends BaseContext = NextPageContext,\n  InitialProps = {},\n  Props = {},\n> = ComponentType<Props> & {\n  /**\n   * Used for initial page load data population. Data returned from `getInitialProps` is serialized when server rendered.\n   * Make sure to return plain `Object` without using `Date`, `Map`, `Set`.\n   * @param context Context of `page`\n   */\n  getInitialProps?(context: Context): InitialProps | Promise<InitialProps>\n}\n\nexport type DocumentType = NextComponentType<\n  DocumentContext,\n  DocumentInitialProps,\n  DocumentProps\n>\n\nexport type AppType<P = {}> = NextComponentType<\n  AppContextType,\n  P,\n  AppPropsType<any, P>\n>\n\nexport type AppTreeType = ComponentType<\n  AppInitialProps & { [name: string]: any }\n>\n\n/**\n * Web vitals provided to _app.reportWebVitals by Core Web Vitals plugin developed by Google Chrome team.\n * https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting\n */\nexport const WEB_VITALS = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'] as const\nexport type NextWebVitalsMetric = {\n  id: string\n  startTime: number\n  value: number\n  attribution?: { [key: string]: unknown }\n} & (\n  | {\n      label: 'web-vital'\n      name: (typeof WEB_VITALS)[number]\n    }\n  | {\n      label: 'custom'\n      name:\n        | 'Next.js-hydration'\n        | 'Next.js-route-change-to-render'\n        | 'Next.js-render'\n    }\n)\n\nexport type Enhancer<C> = (Component: C) => C\n\nexport type ComponentsEnhancer =\n  | {\n      enhanceApp?: Enhancer<AppType>\n      enhanceComponent?: Enhancer<NextComponentType>\n    }\n  | Enhancer<NextComponentType>\n\nexport type RenderPageResult = {\n  html: string\n  head?: Array<JSX.Element | null>\n}\n\nexport type RenderPage = (\n  options?: ComponentsEnhancer\n) => DocumentInitialProps | Promise<DocumentInitialProps>\n\nexport type BaseContext = {\n  res?: ServerResponse\n  [k: string]: any\n}\n\nexport type NEXT_DATA = {\n  props: Record<string, any>\n  page: string\n  query: ParsedUrlQuery\n  buildId: string\n  assetPrefix?: string\n  nextExport?: boolean\n  autoExport?: boolean\n  isFallback?: boolean\n  isExperimentalCompile?: boolean\n  dynamicIds?: (string | number)[]\n  err?: Error & {\n    statusCode?: number\n    source?: typeof COMPILER_NAMES.server | typeof COMPILER_NAMES.edgeServer\n    __NEXT_ERROR_CODE?: string\n  }\n  gsp?: boolean\n  gssp?: boolean\n  customServer?: boolean\n  gip?: boolean\n  appGip?: boolean\n  locale?: string\n  locales?: readonly string[]\n  defaultLocale?: string\n  domainLocales?: readonly DomainLocale[]\n  scriptLoader?: any[]\n  isPreview?: boolean\n  notFoundSrcPage?: string\n}\n\n/**\n * `Next` context\n */\nexport interface NextPageContext {\n  /**\n   * Error object if encountered during rendering\n   */\n  err?: (Error & { statusCode?: number }) | null\n  /**\n   * `HTTP` request object.\n   */\n  req?: IncomingMessage\n  /**\n   * `HTTP` response object.\n   */\n  res?: ServerResponse\n  /**\n   * Path section of `URL`.\n   */\n  pathname: string\n  /**\n   * Query string section of `URL` parsed as an object.\n   */\n  query: ParsedUrlQuery\n  /**\n   * `String` of the actual path including query.\n   */\n  asPath?: string\n  /**\n   * The currently active locale\n   */\n  locale?: string\n  /**\n   * All configured locales\n   */\n  locales?: readonly string[]\n  /**\n   * The configured default locale\n   */\n  defaultLocale?: string\n  /**\n   * `Component` the tree of the App to use if needing to render separately\n   */\n  AppTree: AppTreeType\n}\n\nexport type AppContextType<Router extends NextRouter = NextRouter> = {\n  Component: NextComponentType<NextPageContext>\n  AppTree: AppTreeType\n  ctx: NextPageContext\n  router: Router\n}\n\nexport type AppInitialProps<PageProps = any> = {\n  pageProps: PageProps\n}\n\nexport type AppPropsType<\n  Router extends NextRouter = NextRouter,\n  PageProps = {},\n> = AppInitialProps<PageProps> & {\n  Component: NextComponentType<NextPageContext, any, any>\n  router: Router\n  __N_SSG?: boolean\n  __N_SSP?: boolean\n}\n\nexport type DocumentContext = NextPageContext & {\n  renderPage: RenderPage\n  defaultGetInitialProps(\n    ctx: DocumentContext,\n    options?: { nonce?: string }\n  ): Promise<DocumentInitialProps>\n}\n\nexport type DocumentInitialProps = RenderPageResult & {\n  styles?: React.ReactElement[] | Iterable<React.ReactNode> | JSX.Element\n}\n\nexport type DocumentProps = DocumentInitialProps & HtmlProps\n\n/**\n * Next `API` route request\n */\nexport interface NextApiRequest extends IncomingMessage {\n  /**\n   * Object of `query` values from url\n   */\n  query: Partial<{\n    [key: string]: string | string[]\n  }>\n  /**\n   * Object of `cookies` from header\n   */\n  cookies: Partial<{\n    [key: string]: string\n  }>\n\n  body: any\n\n  env: Env\n\n  draftMode?: boolean\n\n  preview?: boolean\n  /**\n   * Preview data set on the request, if any\n   * */\n  previewData?: PreviewData\n}\n\n/**\n * Send body of response\n */\ntype Send<T> = (body: T) => void\n\n/**\n * Next `API` route response\n */\nexport type NextApiResponse<Data = any> = ServerResponse & {\n  /**\n   * Send data `any` data in response\n   */\n  send: Send<Data>\n  /**\n   * Send data `json` data in response\n   */\n  json: Send<Data>\n  status: (statusCode: number) => NextApiResponse<Data>\n  redirect(url: string): NextApiResponse<Data>\n  redirect(status: number, url: string): NextApiResponse<Data>\n\n  /**\n   * Set draft mode\n   */\n  setDraftMode: (options: { enable: boolean }) => NextApiResponse<Data>\n\n  /**\n   * Set preview data for Next.js' prerender mode\n   */\n  setPreviewData: (\n    data: object | string,\n    options?: {\n      /**\n       * Specifies the number (in seconds) for the preview session to last for.\n       * The given number will be converted to an integer by rounding down.\n       * By default, no maximum age is set and the preview session finishes\n       * when the client shuts down (browser is closed).\n       */\n      maxAge?: number\n      /**\n       * Specifies the path for the preview session to work under. By default,\n       * the path is considered the \"default path\", i.e., any pages under \"/\".\n       */\n      path?: string\n    }\n  ) => NextApiResponse<Data>\n\n  /**\n   * Clear preview data for Next.js' prerender mode\n   */\n  clearPreviewData: (options?: { path?: string }) => NextApiResponse<Data>\n\n  /**\n   * Revalidate a specific page and regenerate it using On-Demand Incremental\n   * Static Regeneration.\n   * The path should be an actual path, not a rewritten path. E.g. for\n   * \"/blog/[slug]\" this should be \"/blog/post-1\".\n   * @link https://nextjs.org/docs/app/building-your-application/data-fetching/incremental-static-regeneration#on-demand-revalidation-with-revalidatepath\n   */\n  revalidate: (\n    urlPath: string,\n    opts?: {\n      unstable_onlyGenerated?: boolean\n    }\n  ) => Promise<void>\n}\n\n/**\n * Next `API` route handler\n */\nexport type NextApiHandler<T = any> = (\n  req: NextApiRequest,\n  res: NextApiResponse<T>\n) => unknown | Promise<unknown>\n\n/**\n * Utils\n */\nexport function execOnce<T extends (...args: any[]) => ReturnType<T>>(\n  fn: T\n): T {\n  let used = false\n  let result: ReturnType<T>\n\n  return ((...args: any[]) => {\n    if (!used) {\n      used = true\n      result = fn(...args)\n    }\n    return result\n  }) as T\n}\n\n// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1\n// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\nconst ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/\nexport const isAbsoluteUrl = (url: string) => {\n  // Fast path: an absolute URL must start with a letter (the scheme).\n  // Check for a-z and A-Z without the cost of the regex.\n  const c = url.charCodeAt(0)\n  const isLetter =\n    (c >= 65 /* A */ && c <= 90) /* Z */ ||\n    (c >= 97 /* a */ && c <= 122) /* z */\n  if (!isLetter) {\n    return false\n  }\n\n  return ABSOLUTE_URL_REGEX.test(url)\n}\n\nexport function getLocationOrigin() {\n  const { protocol, hostname, port } = window.location\n  return `${protocol}//${hostname}${port ? ':' + port : ''}`\n}\n\nexport function getURL() {\n  const { href } = window.location\n  const origin = getLocationOrigin()\n  return href.substring(origin.length)\n}\n\nexport function getDisplayName<P>(Component: ComponentType<P>) {\n  return typeof Component === 'string'\n    ? Component\n    : Component.displayName || Component.name || 'Unknown'\n}\n\nexport function isResSent(res: ServerResponse) {\n  return res.finished || res.headersSent\n}\n\nexport function normalizeRepeatedSlashes(url: string) {\n  const urlParts = url.split('?')\n  const urlNoQuery = urlParts[0]\n\n  return (\n    urlNoQuery\n      // first we replace any non-encoded backslashes with forward\n      // then normalize repeated forward slashes\n      .replace(/\\\\/g, '/')\n      .replace(/\\/\\/+/g, '/') +\n    (urlParts[1] ? `?${urlParts.slice(1).join('?')}` : '')\n  )\n}\n\nexport async function loadGetInitialProps<\n  C extends BaseContext,\n  IP = {},\n  P = {},\n>(App: NextComponentType<C, IP, P>, ctx: C): Promise<IP> {\n  if (process.env.NODE_ENV !== 'production') {\n    if (App.prototype?.getInitialProps) {\n      const message = `\"${getDisplayName(\n        App\n      )}.getInitialProps()\" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.`\n      throw new Error(message)\n    }\n  }\n  // when called from _app `ctx` is nested in `ctx`\n  const res = ctx.res || (ctx.ctx && ctx.ctx.res)\n\n  if (!App.getInitialProps) {\n    if (ctx.ctx && ctx.Component) {\n      // @ts-ignore pageProps default\n      return {\n        pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx),\n      }\n    }\n    return {} as IP\n  }\n\n  const props = await App.getInitialProps(ctx)\n\n  if (res && isResSent(res)) {\n    return props\n  }\n\n  if (!props) {\n    const message = `\"${getDisplayName(\n      App\n    )}.getInitialProps()\" should resolve to an object. But found \"${props}\" instead.`\n    throw new Error(message)\n  }\n\n  if (process.env.NODE_ENV !== 'production') {\n    if (Object.keys(props).length === 0 && !ctx.ctx) {\n      console.warn(\n        `${getDisplayName(\n          App\n        )} returned an empty object from \\`getInitialProps\\`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps`\n      )\n    }\n  }\n\n  return props\n}\n\nexport const SP = typeof performance !== 'undefined'\nexport const ST =\n  SP &&\n  (['mark', 'measure', 'getEntriesByName'] as const).every(\n    (method) => typeof performance[method] === 'function'\n  )\n\nexport class DecodeError extends Error {}\nexport class NormalizeError extends Error {}\nexport class PageNotFoundError extends Error {\n  code: string\n\n  constructor(page: string) {\n    super()\n    this.code = 'ENOENT'\n    this.name = 'PageNotFoundError'\n    this.message = `Cannot find module for page: ${page}`\n  }\n}\n\nexport class MissingStaticPage extends Error {\n  constructor(page: string, message: string) {\n    super()\n    this.message = `Failed to load static file for page: ${page} ${message}`\n  }\n}\n\nexport class MiddlewareNotFoundError extends Error {\n  code: string\n  constructor() {\n    super()\n    this.code = 'ENOENT'\n    this.message = `Cannot find the middleware module`\n  }\n}\n\nexport interface CacheFs {\n  existsSync: typeof fs.existsSync\n  readFile: typeof fs.promises.readFile\n  readFileSync: typeof fs.readFileSync\n  writeFile(f: string, d: any): Promise<void>\n  mkdir(dir: string): Promise<void | string>\n  stat(f: string): Promise<{ mtime: Date }>\n}\n\nexport function stringifyError(error: Error) {\n  return JSON.stringify({ message: error.message, stack: error.stack })\n}\n","import type { Token } from 'next/dist/compiled/path-to-regexp'\n\n/**\n * Route pattern normalization utilities for path-to-regexp compatibility.\n *\n * path-to-regexp 6.3.0+ introduced stricter validation that rejects certain\n * patterns commonly used in Next.js interception routes. This module provides\n * normalization functions to make Next.js route patterns compatible with the\n * updated library while preserving all functionality.\n */\n\n/**\n * Internal separator used to normalize adjacent parameter patterns.\n * This unique marker is inserted between adjacent parameters and stripped out\n * during parameter extraction to avoid conflicts with real URL content.\n */\nexport const PARAM_SEPARATOR = '_NEXTSEP_'\n\n/**\n * Detects if a route pattern needs normalization for path-to-regexp compatibility.\n */\nexport function hasAdjacentParameterIssues(route: string): boolean {\n  if (typeof route !== 'string') return false\n\n  // Check for interception route markers followed immediately by parameters\n  // Pattern: /(.):param, /(..):param, /(...):param, /(.)(.):param etc.\n  // These patterns cause \"Must have text between two parameters\" errors\n  if (/\\/\\(\\.{1,3}\\):[^/\\s]+/.test(route)) {\n    return true\n  }\n\n  // Check for basic adjacent parameters without separators\n  // Pattern: :param1:param2 (but not :param* or other URL patterns)\n  if (/:[a-zA-Z_][a-zA-Z0-9_]*:[a-zA-Z_][a-zA-Z0-9_]*/.test(route)) {\n    return true\n  }\n\n  return false\n}\n\n/**\n * Normalizes route patterns that have adjacent parameters without text between them.\n * Inserts a unique separator that can be safely stripped out later.\n */\nexport function normalizeAdjacentParameters(route: string): string {\n  let normalized = route\n\n  // Handle interception route patterns: (.):param -> (.)_NEXTSEP_:param\n  normalized = normalized.replace(\n    /(\\([^)]*\\)):([^/\\s]+)/g,\n    `$1${PARAM_SEPARATOR}:$2`\n  )\n\n  // Handle other adjacent parameter patterns: :param1:param2 -> :param1_NEXTSEP_:param2\n  normalized = normalized.replace(/:([^:/\\s)]+)(?=:)/g, `:$1${PARAM_SEPARATOR}`)\n\n  return normalized\n}\n\n/**\n * Normalizes tokens that have repeating modifiers (* or +) but empty prefix and suffix.\n *\n * path-to-regexp 6.3.0+ introduced validation that throws:\n * \"Can not repeat without prefix/suffix\"\n *\n * This occurs when a token has modifier: '*' or '+' with both prefix: '' and suffix: ''\n */\nexport function normalizeTokensForRegexp(tokens: Token[]): Token[] {\n  return tokens.map((token) => {\n    // Token union type: Token = string | TokenObject\n    // Literal path segments are strings, parameters/wildcards are objects\n    if (\n      typeof token === 'object' &&\n      token !== null &&\n      // Not all token objects have 'modifier' property (e.g., simple text tokens)\n      'modifier' in token &&\n      // Only repeating modifiers (* or +) cause the validation error\n      // Other modifiers like '?' (optional) are fine\n      (token.modifier === '*' || token.modifier === '+') &&\n      // Token objects can have different shapes depending on route pattern\n      'prefix' in token &&\n      'suffix' in token &&\n      // Both prefix and suffix must be empty strings\n      // This is what causes the validation error in path-to-regexp\n      token.prefix === '' &&\n      token.suffix === ''\n    ) {\n      // Add minimal prefix to satisfy path-to-regexp validation\n      // We use '/' as it's the most common path delimiter and won't break route matching\n      // The prefix gets used in regex generation but doesn't affect parameter extraction\n      return {\n        ...token,\n        prefix: '/',\n      }\n    }\n    return token\n  })\n}\n\n/**\n * Strips normalization separators from compiled pathname.\n * This removes separators that were inserted by normalizeAdjacentParameters\n * to satisfy path-to-regexp validation.\n *\n * Only removes separators in the specific contexts where they were inserted:\n * - After interception route markers: (.)_NEXTSEP_ -> (.)\n *\n * This targeted approach ensures we don't accidentally remove the separator\n * from legitimate user content.\n */\nexport function stripNormalizedSeparators(pathname: string): string {\n  // Remove separator after interception route markers\n  // Pattern: (.)_NEXTSEP_ -> (.), (..)_NEXTSEP_ -> (..), etc.\n  // The separator appears after the closing paren of interception markers\n  return pathname.replace(new RegExp(`\\\\)${PARAM_SEPARATOR}`, 'g'), ')')\n}\n\n/**\n * Strips normalization separators from extracted route parameters.\n * Used by both server and client code to clean up parameters after route matching.\n */\nexport function stripParameterSeparators(\n  params: Record<string, any>\n): Record<string, any> {\n  const cleaned: Record<string, any> = {}\n\n  for (const [key, value] of Object.entries(params)) {\n    if (typeof value === 'string') {\n      // Remove the separator if it appears at the start of parameter values\n      cleaned[key] = value.replace(new RegExp(`^${PARAM_SEPARATOR}`), '')\n    } else if (Array.isArray(value)) {\n      // Handle array parameters (from repeated route segments)\n      cleaned[key] = value.map((item) =>\n        typeof item === 'string'\n          ? item.replace(new RegExp(`^${PARAM_SEPARATOR}`), '')\n          : item\n      )\n    } else {\n      cleaned[key] = value\n    }\n  }\n\n  return cleaned\n}\n","/**\n * Client-safe utilities for route matching that don't import server-side\n * utilities to avoid bundling issues with Turbopack\n */\n\nimport type {\n  Key,\n  TokensToRegexpOptions,\n  ParseOptions,\n  TokensToFunctionOptions,\n} from 'next/dist/compiled/path-to-regexp'\nimport {\n  pathToRegexp,\n  compile,\n  regexpToFunction,\n} from 'next/dist/compiled/path-to-regexp'\nimport {\n  hasAdjacentParameterIssues,\n  normalizeAdjacentParameters,\n  stripParameterSeparators,\n  stripNormalizedSeparators,\n} from '../../../../lib/route-pattern-normalizer'\n\n/**\n * Client-safe wrapper around pathToRegexp that handles path-to-regexp 6.3.0+ validation errors.\n * This includes both \"Can not repeat without prefix/suffix\" and \"Must have text between parameters\" errors.\n */\nexport function safePathToRegexp(\n  route: string | RegExp | Array<string | RegExp>,\n  keys?: Key[],\n  options?: TokensToRegexpOptions & ParseOptions\n): RegExp {\n  if (typeof route !== 'string') {\n    return pathToRegexp(route, keys, options)\n  }\n\n  // Check if normalization is needed and cache the result\n  const needsNormalization = hasAdjacentParameterIssues(route)\n  const routeToUse = needsNormalization\n    ? normalizeAdjacentParameters(route)\n    : route\n\n  try {\n    return pathToRegexp(routeToUse, keys, options)\n  } catch (error) {\n    // Only try normalization if we haven't already normalized\n    if (!needsNormalization) {\n      try {\n        const normalizedRoute = normalizeAdjacentParameters(route)\n        return pathToRegexp(normalizedRoute, keys, options)\n      } catch (retryError) {\n        // If that doesn't work, fall back to original error\n        throw error\n      }\n    }\n    throw error\n  }\n}\n\n/**\n * Client-safe wrapper around compile that handles path-to-regexp 6.3.0+ validation errors.\n * No server-side error reporting to avoid bundling issues.\n * When normalization is applied, the returned compiler function automatically strips\n * the internal separator from the output URL.\n */\nexport function safeCompile(\n  route: string,\n  options?: TokensToFunctionOptions & ParseOptions\n) {\n  // Check if normalization is needed and cache the result\n  const needsNormalization = hasAdjacentParameterIssues(route)\n  const routeToUse = needsNormalization\n    ? normalizeAdjacentParameters(route)\n    : route\n\n  try {\n    const compiler = compile(routeToUse, options)\n\n    // If we normalized the route, wrap the compiler to strip separators from output\n    // The normalization inserts _NEXTSEP_ as a literal string in the pattern to satisfy\n    // path-to-regexp validation, but we don't want it in the final compiled URL\n    if (needsNormalization) {\n      return (params: any) => {\n        return stripNormalizedSeparators(compiler(params))\n      }\n    }\n\n    return compiler\n  } catch (error) {\n    // Only try normalization if we haven't already normalized\n    if (!needsNormalization) {\n      try {\n        const normalizedRoute = normalizeAdjacentParameters(route)\n        const compiler = compile(normalizedRoute, options)\n\n        // Wrap the compiler to strip separators from output\n        return (params: any) => {\n          return stripNormalizedSeparators(compiler(params))\n        }\n      } catch (retryError) {\n        // If that doesn't work, fall back to original error\n        throw error\n      }\n    }\n    throw error\n  }\n}\n\n/**\n * Client-safe wrapper around regexpToFunction that automatically cleans parameters.\n */\nexport function safeRegexpToFunction<\n  T extends Record<string, any> = Record<string, any>,\n>(regexp: RegExp, keys?: Key[]): (pathname: string) => { params: T } | false {\n  const originalMatcher = regexpToFunction<T>(regexp, keys || [])\n\n  return (pathname: string) => {\n    const result = originalMatcher(pathname)\n    if (!result) return false\n\n    // Clean parameters before returning\n    return {\n      ...result,\n      params: stripParameterSeparators(result.params as any) as T,\n    }\n  }\n}\n\n/**\n * Safe wrapper for route matcher functions that automatically cleans parameters.\n * This is client-safe and doesn't import path-to-regexp.\n */\nexport function safeRouteMatcher<T extends Record<string, any>>(\n  matcherFn: (pathname: string) => false | T\n): (pathname: string) => false | T {\n  return (pathname: string) => {\n    const result = matcherFn(pathname)\n    if (!result) return false\n\n    // Clean parameters before returning\n    return stripParameterSeparators(result) as T\n  }\n}\n","import type { Group } from './route-regex'\nimport { DecodeError } from '../../utils'\nimport type { Params } from '../../../../server/request/params'\nimport { safeRouteMatcher } from './route-match-utils'\n\nexport interface RouteMatchFn {\n  (pathname: string): false | Params\n}\n\ntype RouteMatcherOptions = {\n  // We only use the exec method of the RegExp object. This helps us avoid using\n  // type assertions that the passed in properties are of the correct type.\n  re: Pick<RegExp, 'exec'>\n  groups: Record<string, Group>\n}\n\nexport function getRouteMatcher({\n  re,\n  groups,\n}: RouteMatcherOptions): RouteMatchFn {\n  const rawMatcher = (pathname: string) => {\n    const routeMatch = re.exec(pathname)\n    if (!routeMatch) return false\n\n    const decode = (param: string) => {\n      try {\n        return decodeURIComponent(param)\n      } catch {\n        throw new DecodeError('failed to decode param')\n      }\n    }\n\n    const params: Params = {}\n    for (const [key, group] of Object.entries(groups)) {\n      const match = routeMatch[group.pos]\n      if (match !== undefined) {\n        if (group.repeat) {\n          params[key] = match.split('/').map((entry) => decode(entry))\n        } else {\n          params[key] = decode(match)\n        }\n      }\n    }\n\n    return params\n  }\n\n  // Wrap with safe matcher to handle parameter cleaning\n  return safeRouteMatcher(rawMatcher)\n}\n","import type { ParsedUrlQuery } from 'querystring'\n\nexport function searchParamsToUrlQuery(\n  searchParams: URLSearchParams\n): ParsedUrlQuery {\n  const query: ParsedUrlQuery = {}\n  for (const [key, value] of searchParams.entries()) {\n    const existing = query[key]\n    if (typeof existing === 'undefined') {\n      query[key] = value\n    } else if (Array.isArray(existing)) {\n      existing.push(value)\n    } else {\n      query[key] = [existing, value]\n    }\n  }\n  return query\n}\n\nfunction stringifyUrlQueryParam(param: unknown): string {\n  if (typeof param === 'string') {\n    return param\n  }\n\n  if (\n    (typeof param === 'number' && !isNaN(param)) ||\n    typeof param === 'boolean'\n  ) {\n    return String(param)\n  } else {\n    return ''\n  }\n}\n\nexport function urlQueryToSearchParams(query: ParsedUrlQuery): URLSearchParams {\n  const searchParams = new URLSearchParams()\n  for (const [key, value] of Object.entries(query)) {\n    if (Array.isArray(value)) {\n      for (const item of value) {\n        searchParams.append(key, stringifyUrlQueryParam(item))\n      }\n    } else {\n      searchParams.set(key, stringifyUrlQueryParam(value))\n    }\n  }\n  return searchParams\n}\n\nexport function assign(\n  target: URLSearchParams,\n  ...searchParamsList: URLSearchParams[]\n): URLSearchParams {\n  for (const searchParams of searchParamsList) {\n    for (const key of searchParams.keys()) {\n      target.delete(key)\n    }\n\n    for (const [key, value] of searchParams.entries()) {\n      target.append(key, value)\n    }\n  }\n\n  return target\n}\n","import type { NextApiRequestCookies } from '.'\n\n/**\n * Parse cookies from the `headers` of request\n * @param req request object\n */\n\nexport function getCookieParser(headers: {\n  [key: string]: string | string[] | null | undefined\n}): () => NextApiRequestCookies {\n  return function parseCookie(): NextApiRequestCookies {\n    const { cookie } = headers\n\n    if (!cookie) {\n      return {}\n    }\n\n    const { parse: parseCookieFn } =\n      require('next/dist/compiled/cookie') as typeof import('next/dist/compiled/cookie')\n    return parseCookieFn(Array.isArray(cookie) ? cookie.join('; ') : cookie)\n  }\n}\n","import type { IncomingMessage } from 'http'\nimport type { Key } from 'next/dist/compiled/path-to-regexp'\nimport type { NextParsedUrlQuery } from '../../../../server/request-meta'\nimport type { RouteHas } from '../../../../lib/load-custom-routes'\nimport type { BaseNextRequest } from '../../../../server/base-http'\n\nimport { escapeStringRegexp } from '../../escape-regexp'\nimport { parseUrl, type ParsedUrl } from './parse-url'\nimport {\n  INTERCEPTION_ROUTE_MARKERS,\n  isInterceptionRouteAppPath,\n} from './interception-routes'\nimport { getCookieParser } from '../../../../server/api-utils/get-cookie-parser'\nimport type { Params } from '../../../../server/request/params'\nimport { safePathToRegexp, safeCompile } from './route-match-utils'\n\n/**\n * Ensure only a-zA-Z are used for param names for proper interpolating\n * with path-to-regexp\n */\nfunction getSafeParamName(paramName: string) {\n  let newParamName = ''\n\n  for (let i = 0; i < paramName.length; i++) {\n    const charCode = paramName.charCodeAt(i)\n\n    if (\n      (charCode > 64 && charCode < 91) || // A-Z\n      (charCode > 96 && charCode < 123) // a-z\n    ) {\n      newParamName += paramName[i]\n    }\n  }\n  return newParamName\n}\n\nfunction escapeSegment(str: string, segmentName: string) {\n  return str.replace(\n    new RegExp(`:${escapeStringRegexp(segmentName)}`, 'g'),\n    `__ESC_COLON_${segmentName}`\n  )\n}\n\nfunction unescapeSegments(str: string) {\n  return str.replace(/__ESC_COLON_/gi, ':')\n}\n\nexport function matchHas(\n  req: BaseNextRequest | IncomingMessage,\n  query: Params,\n  has: RouteHas[] = [],\n  missing: RouteHas[] = []\n): false | Params {\n  const params: Params = {}\n\n  const hasMatch = (hasItem: RouteHas) => {\n    let value\n    let key = hasItem.key\n\n    switch (hasItem.type) {\n      case 'header': {\n        key = key!.toLowerCase()\n        value = req.headers[key] as string\n        break\n      }\n      case 'cookie': {\n        if ('cookies' in req) {\n          value = req.cookies[hasItem.key]\n        } else {\n          const cookies = getCookieParser(req.headers)()\n          value = cookies[hasItem.key]\n        }\n\n        break\n      }\n      case 'query': {\n        value = query[key!]\n        break\n      }\n      case 'host': {\n        const { host } = req?.headers || {}\n        // remove port from host if present\n        const hostname = host?.split(':', 1)[0].toLowerCase()\n        value = hostname\n        break\n      }\n      default: {\n        break\n      }\n    }\n\n    if (!hasItem.value && value) {\n      params[getSafeParamName(key!)] = value\n      return true\n    } else if (value) {\n      const matcher = new RegExp(`^${hasItem.value}$`)\n      const matches = Array.isArray(value)\n        ? value.slice(-1)[0].match(matcher)\n        : value.match(matcher)\n\n      if (matches) {\n        if (Array.isArray(matches)) {\n          if (matches.groups) {\n            Object.keys(matches.groups).forEach((groupKey) => {\n              params[groupKey] = matches.groups![groupKey]\n            })\n          } else if (hasItem.type === 'host' && matches[0]) {\n            params.host = matches[0]\n          }\n        }\n        return true\n      }\n    }\n    return false\n  }\n\n  const allMatch =\n    has.every((item) => hasMatch(item)) &&\n    !missing.some((item) => hasMatch(item))\n\n  if (allMatch) {\n    return params\n  }\n  return false\n}\n\nexport function compileNonPath(value: string, params: Params): string {\n  if (!value.includes(':')) {\n    return value\n  }\n\n  for (const key of Object.keys(params)) {\n    if (value.includes(`:${key}`)) {\n      value = value\n        .replace(\n          new RegExp(`:${key}\\\\*`, 'g'),\n          `:${key}--ESCAPED_PARAM_ASTERISKS`\n        )\n        .replace(\n          new RegExp(`:${key}\\\\?`, 'g'),\n          `:${key}--ESCAPED_PARAM_QUESTION`\n        )\n        .replace(new RegExp(`:${key}\\\\+`, 'g'), `:${key}--ESCAPED_PARAM_PLUS`)\n        .replace(\n          new RegExp(`:${key}(?!\\\\w)`, 'g'),\n          `--ESCAPED_PARAM_COLON${key}`\n        )\n    }\n  }\n  value = value\n    .replace(/(:|\\*|\\?|\\+|\\(|\\)|\\{|\\})/g, '\\\\$1')\n    .replace(/--ESCAPED_PARAM_PLUS/g, '+')\n    .replace(/--ESCAPED_PARAM_COLON/g, ':')\n    .replace(/--ESCAPED_PARAM_QUESTION/g, '?')\n    .replace(/--ESCAPED_PARAM_ASTERISKS/g, '*')\n\n  // the value needs to start with a forward-slash to be compiled\n  // correctly\n  return safeCompile(`/${value}`, { validate: false })(params).slice(1)\n}\n\nexport function parseDestination(args: {\n  destination: string\n  params: Readonly<Params>\n  query: Readonly<NextParsedUrlQuery>\n}): ParsedUrl {\n  let escaped = args.destination\n  for (const param of Object.keys({ ...args.params, ...args.query })) {\n    if (!param) continue\n\n    escaped = escapeSegment(escaped, param)\n  }\n\n  const parsed = parseUrl(escaped)\n\n  let pathname = parsed.pathname\n  if (pathname) {\n    pathname = unescapeSegments(pathname)\n  }\n\n  let href = parsed.href\n  if (href) {\n    href = unescapeSegments(href)\n  }\n\n  let hostname = parsed.hostname\n  if (hostname) {\n    hostname = unescapeSegments(hostname)\n  }\n\n  let hash = parsed.hash\n  if (hash) {\n    hash = unescapeSegments(hash)\n  }\n\n  let search = parsed.search\n  if (search) {\n    search = unescapeSegments(search)\n  }\n\n  let origin = parsed.origin\n  if (origin) {\n    origin = unescapeSegments(origin)\n  }\n\n  return {\n    ...parsed,\n    pathname,\n    hostname,\n    href,\n    hash,\n    search,\n    origin,\n  }\n}\n\nexport function prepareDestination(args: {\n  appendParamsToQuery: boolean\n  destination: string\n  params: Params\n  query: NextParsedUrlQuery\n}) {\n  const parsedDestination = parseDestination(args)\n\n  const {\n    hostname: destHostname,\n    query: destQuery,\n    search: destSearch,\n  } = parsedDestination\n\n  // The following code assumes that the pathname here includes the hash if it's\n  // present.\n  let destPath = parsedDestination.pathname\n  if (parsedDestination.hash) {\n    destPath = `${destPath}${parsedDestination.hash}`\n  }\n\n  const destParams: (string | number)[] = []\n\n  const destPathParamKeys: Key[] = []\n  safePathToRegexp(destPath, destPathParamKeys)\n  for (const key of destPathParamKeys) {\n    destParams.push(key.name)\n  }\n\n  if (destHostname) {\n    const destHostnameParamKeys: Key[] = []\n    safePathToRegexp(destHostname, destHostnameParamKeys)\n    for (const key of destHostnameParamKeys) {\n      destParams.push(key.name)\n    }\n  }\n\n  const destPathCompiler = safeCompile(\n    destPath,\n    // we don't validate while compiling the destination since we should\n    // have already validated before we got to this point and validating\n    // breaks compiling destinations with named pattern params from the source\n    // e.g. /something:hello(.*) -> /another/:hello is broken with validation\n    // since compile validation is meant for reversing and not for inserting\n    // params from a separate path-regex into another\n    { validate: false }\n  )\n\n  let destHostnameCompiler\n  if (destHostname) {\n    destHostnameCompiler = safeCompile(destHostname, {\n      validate: false,\n      encode: encodeURIComponent,\n    })\n  }\n\n  // update any params in query values\n  for (const [key, strOrArray] of Object.entries(destQuery)) {\n    // the value needs to start with a forward-slash to be compiled\n    // correctly\n    if (Array.isArray(strOrArray)) {\n      destQuery[key] = strOrArray.map((value) =>\n        compileNonPath(unescapeSegments(value), args.params)\n      )\n    } else if (typeof strOrArray === 'string') {\n      destQuery[key] = compileNonPath(unescapeSegments(strOrArray), args.params)\n    }\n  }\n\n  // add path params to query if it's not a redirect and not\n  // already defined in destination query or path\n  let paramKeys = Object.keys(args.params).filter(\n    (name) => name !== 'nextInternalLocale'\n  )\n\n  if (\n    args.appendParamsToQuery &&\n    !paramKeys.some((key) => destParams.includes(key))\n  ) {\n    for (const key of paramKeys) {\n      if (!(key in destQuery)) {\n        destQuery[key] = args.params[key]\n      }\n    }\n  }\n\n  let newUrl\n\n  // The compiler also that the interception route marker is an unnamed param, hence '0',\n  // so we need to add it to the params object.\n  if (isInterceptionRouteAppPath(destPath)) {\n    for (const segment of destPath.split('/')) {\n      const marker = INTERCEPTION_ROUTE_MARKERS.find((m) =>\n        segment.startsWith(m)\n      )\n      if (marker) {\n        if (marker === '(..)(..)') {\n          args.params['0'] = '(..)'\n          args.params['1'] = '(..)'\n        } else {\n          args.params['0'] = marker\n        }\n        break\n      }\n    }\n  }\n\n  try {\n    newUrl = destPathCompiler(args.params)\n\n    const [pathname, hash] = newUrl.split('#', 2)\n    if (destHostnameCompiler) {\n      parsedDestination.hostname = destHostnameCompiler(args.params)\n    }\n    parsedDestination.pathname = pathname\n    parsedDestination.hash = `${hash ? '#' : ''}${hash || ''}`\n    parsedDestination.search = destSearch\n      ? compileNonPath(destSearch, args.params)\n      : ''\n  } catch (err: any) {\n    if (err.message.match(/Expected .*? to not repeat, but got an array/)) {\n      throw new Error(\n        `To use a multi-match in the destination you must add \\`*\\` at the end of the param name to signify it should repeat. https://nextjs.org/docs/messages/invalid-multi-match`\n      )\n    }\n    throw err\n  }\n\n  // Query merge order lowest priority to highest\n  // 1. initial URL query values\n  // 2. path segment values\n  // 3. destination specified query values\n  parsedDestination.query = {\n    ...args.query,\n    ...parsedDestination.query,\n  }\n\n  return {\n    newUrl,\n    destQuery,\n    parsedDestination,\n  }\n}\n","import type { OutgoingHttpHeaders } from 'http'\nimport {\n  NEXT_INTERCEPTION_MARKER_PREFIX,\n  NEXT_QUERY_PARAM_PREFIX,\n} from '../../lib/constants'\n\n/**\n * Converts a Node.js IncomingHttpHeaders object to a Headers object. Any\n * headers with multiple values will be joined with a comma and space. Any\n * headers that have an undefined value will be ignored and others will be\n * coerced to strings.\n *\n * @param nodeHeaders the headers object to convert\n * @returns the converted headers object\n */\nexport function fromNodeOutgoingHttpHeaders(\n  nodeHeaders: OutgoingHttpHeaders\n): Headers {\n  const headers = new Headers()\n  for (let [key, value] of Object.entries(nodeHeaders)) {\n    const values = Array.isArray(value) ? value : [value]\n    for (let v of values) {\n      if (typeof v === 'undefined') continue\n      if (typeof v === 'number') {\n        v = v.toString()\n      }\n\n      headers.append(key, v)\n    }\n  }\n  return headers\n}\n\n/*\n  Set-Cookie header field-values are sometimes comma joined in one string. This splits them without choking on commas\n  that are within a single set-cookie field-value, such as in the Expires portion.\n  This is uncommon, but explicitly allowed - see https://tools.ietf.org/html/rfc2616#section-4.2\n  Node.js does this for every header *except* set-cookie - see https://github.com/nodejs/node/blob/d5e363b77ebaf1caf67cd7528224b651c86815c1/lib/_http_incoming.js#L128\n  React Native's fetch does this for *every* header, including set-cookie.\n  \n  Based on: https://github.com/google/j2objc/commit/16820fdbc8f76ca0c33472810ce0cb03d20efe25\n  Credits to: https://github.com/tomball for original and https://github.com/chrusart for JavaScript implementation\n*/\nexport function splitCookiesString(cookiesString: string) {\n  var cookiesStrings = []\n  var pos = 0\n  var start\n  var ch\n  var lastComma\n  var nextStart\n  var cookiesSeparatorFound\n\n  function skipWhitespace() {\n    while (pos < cookiesString.length && /\\s/.test(cookiesString.charAt(pos))) {\n      pos += 1\n    }\n    return pos < cookiesString.length\n  }\n\n  function notSpecialChar() {\n    ch = cookiesString.charAt(pos)\n\n    return ch !== '=' && ch !== ';' && ch !== ','\n  }\n\n  while (pos < cookiesString.length) {\n    start = pos\n    cookiesSeparatorFound = false\n\n    while (skipWhitespace()) {\n      ch = cookiesString.charAt(pos)\n      if (ch === ',') {\n        // ',' is a cookie separator if we have later first '=', not ';' or ','\n        lastComma = pos\n        pos += 1\n\n        skipWhitespace()\n        nextStart = pos\n\n        while (pos < cookiesString.length && notSpecialChar()) {\n          pos += 1\n        }\n\n        // currently special character\n        if (pos < cookiesString.length && cookiesString.charAt(pos) === '=') {\n          // we found cookies separator\n          cookiesSeparatorFound = true\n          // pos is inside the next cookie, so back up and return it.\n          pos = nextStart\n          cookiesStrings.push(cookiesString.substring(start, lastComma))\n          start = pos\n        } else {\n          // in param ',' or param separator ';',\n          // we continue from that comma\n          pos = lastComma + 1\n        }\n      } else {\n        pos += 1\n      }\n    }\n\n    if (!cookiesSeparatorFound || pos >= cookiesString.length) {\n      cookiesStrings.push(cookiesString.substring(start, cookiesString.length))\n    }\n  }\n\n  return cookiesStrings\n}\n\n/**\n * Converts a Headers object to a Node.js OutgoingHttpHeaders object. This is\n * required to support the set-cookie header, which may have multiple values.\n *\n * @param headers the headers object to convert\n * @returns the converted headers object\n */\nexport function toNodeOutgoingHttpHeaders(\n  headers: Headers\n): OutgoingHttpHeaders {\n  const nodeHeaders: OutgoingHttpHeaders = {}\n  const cookies: string[] = []\n  if (headers) {\n    for (const [key, value] of headers.entries()) {\n      if (key.toLowerCase() === 'set-cookie') {\n        // We may have gotten a comma joined string of cookies, or multiple\n        // set-cookie headers. We need to merge them into one header array\n        // to represent all the cookies.\n        cookies.push(...splitCookiesString(value))\n        nodeHeaders[key] = cookies.length === 1 ? cookies[0] : cookies\n      } else {\n        nodeHeaders[key] = value\n      }\n    }\n  }\n  return nodeHeaders\n}\n\n/**\n * Validate the correctness of a user-provided URL.\n */\nexport function validateURL(url: string | URL): string {\n  try {\n    return String(new URL(String(url)))\n  } catch (error: any) {\n    throw new Error(\n      `URL is malformed \"${String(\n        url\n      )}\". Please use only absolute URLs - https://nextjs.org/docs/messages/middleware-relative-urls`,\n      { cause: error }\n    )\n  }\n}\n\n/**\n * Normalizes `nxtP` and `nxtI` query param values to remove the prefix.\n * This function does not mutate the input key.\n */\nexport function normalizeNextQueryParam(key: string): null | string {\n  const prefixes = [NEXT_QUERY_PARAM_PREFIX, NEXT_INTERCEPTION_MARKER_PREFIX]\n  for (const prefix of prefixes) {\n    if (key !== prefix && key.startsWith(prefix)) {\n      return key.substring(prefix.length)\n    }\n  }\n  return null\n}\n","/**\n * Decodes a query path parameter.\n *\n * @param value - The value to decode.\n * @returns The decoded value.\n */\nexport function decodeQueryPathParameter(value: string) {\n  // When deployed to Vercel, the value may be encoded, so this attempts to\n  // decode it and returns the original value if it fails.\n  try {\n    return decodeURIComponent(value)\n  } catch {\n    return value\n  }\n}\n","// Format function modified from nodejs\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport type { UrlObject } from 'url'\nimport type { ParsedUrlQuery } from 'querystring'\nimport * as querystring from './querystring'\n\nconst slashedProtocols = /https?|ftp|gopher|file/\n\nexport function formatUrl(urlObj: UrlObject) {\n  let { auth, hostname } = urlObj\n  let protocol = urlObj.protocol || ''\n  let pathname = urlObj.pathname || ''\n  let hash = urlObj.hash || ''\n  let query = urlObj.query || ''\n  let host: string | false = false\n\n  auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ':') + '@' : ''\n\n  if (urlObj.host) {\n    host = auth + urlObj.host\n  } else if (hostname) {\n    host = auth + (~hostname.indexOf(':') ? `[${hostname}]` : hostname)\n    if (urlObj.port) {\n      host += ':' + urlObj.port\n    }\n  }\n\n  if (query && typeof query === 'object') {\n    query = String(querystring.urlQueryToSearchParams(query as ParsedUrlQuery))\n  }\n\n  let search = urlObj.search || (query && `?${query}`) || ''\n\n  if (protocol && !protocol.endsWith(':')) protocol += ':'\n\n  if (\n    urlObj.slashes ||\n    ((!protocol || slashedProtocols.test(protocol)) && host !== false)\n  ) {\n    host = '//' + (host || '')\n    if (pathname && pathname[0] !== '/') pathname = '/' + pathname\n  } else if (!host) {\n    host = ''\n  }\n\n  if (hash && hash[0] !== '#') hash = '#' + hash\n  if (search && search[0] !== '?') search = '?' + search\n\n  pathname = pathname.replace(/[?#]/g, encodeURIComponent)\n  search = search.replace('#', '%23')\n\n  return `${protocol}${host}${pathname}${search}${hash}`\n}\n\nexport const urlObjectKeys = [\n  'auth',\n  'hash',\n  'host',\n  'hostname',\n  'href',\n  'path',\n  'pathname',\n  'port',\n  'protocol',\n  'query',\n  'search',\n  'slashes',\n]\n\nexport function formatWithValidation(url: UrlObject): string {\n  if (process.env.NODE_ENV === 'development') {\n    if (url !== null && typeof url === 'object') {\n      Object.keys(url).forEach((key) => {\n        if (!urlObjectKeys.includes(key)) {\n          console.warn(\n            `Unknown key passed via urlObject into url.format: ${key}`\n          )\n        }\n      })\n    }\n  }\n\n  return formatUrl(url)\n}\n","import type { Rewrite } from '../lib/load-custom-routes'\nimport type { RouteMatchFn } from '../shared/lib/router/utils/route-matcher'\nimport type { NextConfig } from './config'\nimport type { BaseNextRequest } from './base-http'\nimport type { NextUrlWithParsedQuery } from './request-meta'\nimport type { ParsedUrlQuery } from 'querystring'\n\nimport { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path'\nimport { getPathMatch } from '../shared/lib/router/utils/path-match'\nimport { getNamedRouteRegex } from '../shared/lib/router/utils/route-regex'\nimport { getRouteMatcher } from '../shared/lib/router/utils/route-matcher'\nimport {\n  matchHas,\n  prepareDestination,\n} from '../shared/lib/router/utils/prepare-destination'\nimport { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash'\nimport { normalizeRscURL } from '../shared/lib/router/utils/app-paths'\nimport {\n  NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER,\n  NEXT_CACHE_REVALIDATED_TAGS_HEADER,\n  NEXT_INTERCEPTION_MARKER_PREFIX,\n  NEXT_QUERY_PARAM_PREFIX,\n} from '../lib/constants'\nimport { normalizeNextQueryParam } from './web/utils'\nimport type { IncomingHttpHeaders, IncomingMessage } from 'http'\nimport { decodeQueryPathParameter } from './lib/decode-query-path-parameter'\nimport type { DeepReadonly } from '../shared/lib/deep-readonly'\nimport { parseReqUrl } from '../lib/url'\nimport { formatUrl } from '../shared/lib/router/utils/format-url'\n\nfunction filterInternalQuery(\n  query: Record<string, undefined | string | string[]>,\n  paramKeys: string[]\n) {\n  // this is used to pass query information in rewrites\n  // but should not be exposed in final query\n  delete query['nextInternalLocale']\n\n  for (const key in query) {\n    const isNextQueryPrefix =\n      key !== NEXT_QUERY_PARAM_PREFIX && key.startsWith(NEXT_QUERY_PARAM_PREFIX)\n\n    const isNextInterceptionMarkerPrefix =\n      key !== NEXT_INTERCEPTION_MARKER_PREFIX &&\n      key.startsWith(NEXT_INTERCEPTION_MARKER_PREFIX)\n\n    if (\n      isNextQueryPrefix ||\n      isNextInterceptionMarkerPrefix ||\n      paramKeys.includes(key)\n    ) {\n      delete query[key]\n    }\n  }\n}\n\nexport function normalizeCdnUrl(\n  req: BaseNextRequest | IncomingMessage,\n  paramKeys: string[]\n) {\n  // make sure to normalize req.url from CDNs to strip dynamic and rewrite\n  // params from the query which are added during routing\n  const _parsedUrl = parseReqUrl(req.url!)\n\n  // we can't normalize if we can't parse\n  if (!_parsedUrl) {\n    return req.url\n  }\n  delete (_parsedUrl as any).search\n  filterInternalQuery(_parsedUrl.query, paramKeys)\n\n  req.url = formatUrl(_parsedUrl)\n}\n\nexport function interpolateDynamicPath(\n  pathname: string,\n  params: ParsedUrlQuery,\n  defaultRouteRegex?: ReturnType<typeof getNamedRouteRegex> | undefined\n) {\n  if (!defaultRouteRegex) return pathname\n\n  for (const param of Object.keys(defaultRouteRegex.groups)) {\n    const { optional, repeat } = defaultRouteRegex.groups[param]\n    let builtParam = `[${repeat ? '...' : ''}${param}]`\n\n    if (optional) {\n      builtParam = `[${builtParam}]`\n    }\n\n    let paramValue: string\n    const value = params[param]\n\n    if (Array.isArray(value)) {\n      paramValue = value.map((v) => v && encodeURIComponent(v)).join('/')\n    } else if (value) {\n      paramValue = encodeURIComponent(value)\n    } else {\n      paramValue = ''\n    }\n\n    if (paramValue || optional) {\n      pathname = pathname.replaceAll(builtParam, paramValue)\n    }\n  }\n\n  return pathname\n}\n\nexport function normalizeDynamicRouteParams(\n  query: ParsedUrlQuery,\n  defaultRouteRegex: ReturnType<typeof getNamedRouteRegex>,\n  defaultRouteMatches: ParsedUrlQuery,\n  ignoreMissingOptional: boolean\n) {\n  const isDefaultValueMatch = (\n    candidateValue: string | undefined,\n    defaultValue: string\n  ) => {\n    if (!candidateValue) {\n      return false\n    }\n\n    let normalizedCandidateValue = normalizeRscURL(candidateValue)\n    for (let i = 0; i < 3; i++) {\n      if (normalizedCandidateValue === defaultValue) {\n        return true\n      }\n\n      const decodedCandidateValue = decodeQueryPathParameter(\n        normalizedCandidateValue\n      )\n\n      if (decodedCandidateValue === normalizedCandidateValue) {\n        break\n      }\n\n      normalizedCandidateValue = decodedCandidateValue\n    }\n\n    return false\n  }\n\n  let hasValidParams = true\n  let params: ParsedUrlQuery = {}\n\n  for (const key of Object.keys(defaultRouteRegex.groups)) {\n    let value: string | string[] | undefined = query[key]\n\n    if (typeof value === 'string') {\n      value = normalizeRscURL(value)\n    } else if (Array.isArray(value)) {\n      value = value.map(normalizeRscURL)\n    }\n\n    // if the value matches the default value we can't rely\n    // on the parsed params, this is used to signal if we need\n    // to parse x-now-route-matches or not\n    const defaultValue = defaultRouteMatches![key]\n    const isOptional = defaultRouteRegex!.groups[key].optional\n\n    const isDefaultValue = Array.isArray(defaultValue)\n      ? defaultValue.some((defaultVal) => {\n          return Array.isArray(value)\n            ? value.some((val) => isDefaultValueMatch(val, defaultVal))\n            : isDefaultValueMatch(value, defaultVal)\n        })\n      : Array.isArray(value)\n        ? value.some((val) => isDefaultValueMatch(val, defaultValue as string))\n        : isDefaultValueMatch(value, defaultValue as string)\n\n    if (\n      isDefaultValue ||\n      (typeof value === 'undefined' && !(isOptional && ignoreMissingOptional))\n    ) {\n      return { params: {}, hasValidParams: false }\n    }\n\n    // non-provided optional values should be undefined so normalize\n    // them to undefined\n    if (\n      isOptional &&\n      (!value ||\n        (Array.isArray(value) &&\n          value.length === 1 &&\n          // fallback optional catch-all SSG pages have\n          // [[...paramName]] for the root path on Vercel\n          (value[0] === 'index' || value[0] === `[[...${key}]]`)) ||\n        value === 'index' ||\n        value === `[[...${key}]]`)\n    ) {\n      value = undefined\n      delete query[key]\n    }\n\n    // query values from the proxy aren't already split into arrays\n    // so make sure to normalize catch-all values\n    if (\n      value &&\n      typeof value === 'string' &&\n      defaultRouteRegex!.groups[key].repeat\n    ) {\n      value = value.split('/')\n    }\n\n    if (value) {\n      params[key] = value\n    }\n  }\n\n  return {\n    params,\n    hasValidParams,\n  }\n}\n\nexport function getServerUtils({\n  page,\n  i18n,\n  basePath,\n  rewrites,\n  pageIsDynamic,\n  trailingSlash,\n  caseSensitive,\n}: {\n  page: string\n  i18n?: NextConfig['i18n']\n  basePath: string\n  rewrites: DeepReadonly<{\n    fallback?: ReadonlyArray<Rewrite>\n    afterFiles?: ReadonlyArray<Rewrite>\n    beforeFiles?: ReadonlyArray<Rewrite>\n  }>\n  pageIsDynamic: boolean\n  trailingSlash?: boolean\n  caseSensitive: boolean\n}) {\n  let defaultRouteRegex: ReturnType<typeof getNamedRouteRegex> | undefined\n  let dynamicRouteMatcher: RouteMatchFn | undefined\n  let defaultRouteMatches: ParsedUrlQuery | undefined\n\n  if (pageIsDynamic) {\n    defaultRouteRegex = getNamedRouteRegex(page, {\n      prefixRouteKeys: false,\n    })\n    dynamicRouteMatcher = getRouteMatcher(defaultRouteRegex)\n    defaultRouteMatches = dynamicRouteMatcher(page) as ParsedUrlQuery\n  }\n\n  function handleRewrites(\n    req: BaseNextRequest | IncomingMessage,\n    parsedUrl: DeepReadonly<NextUrlWithParsedQuery>\n  ) {\n    // Here we deep clone the parsedUrl to avoid mutating the original. We also\n    // cast this to a mutable type so we can mutate it within this scope.\n    const rewrittenParsedUrl = structuredClone(\n      parsedUrl\n    ) as NextUrlWithParsedQuery\n    const rewriteParams: Record<string, string> = {}\n    let fsPathname = rewrittenParsedUrl.pathname\n\n    const matchesPage = () => {\n      const fsPathnameNoSlash = removeTrailingSlash(fsPathname || '')\n      return (\n        fsPathnameNoSlash === removeTrailingSlash(page) ||\n        dynamicRouteMatcher?.(fsPathnameNoSlash)\n      )\n    }\n\n    const checkRewrite = (rewrite: DeepReadonly<Rewrite>): boolean => {\n      const matcher = getPathMatch(\n        rewrite.source + (trailingSlash ? '(/)?' : ''),\n        {\n          removeUnnamedParams: true,\n          strict: true,\n          sensitive: !!caseSensitive,\n        }\n      )\n\n      if (!rewrittenParsedUrl.pathname) return false\n\n      let params = matcher(rewrittenParsedUrl.pathname)\n\n      if ((rewrite.has || rewrite.missing) && params) {\n        const hasParams = matchHas(\n          req,\n          rewrittenParsedUrl.query,\n          rewrite.has as Rewrite['has'],\n          rewrite.missing as Rewrite['missing']\n        )\n\n        if (hasParams) {\n          Object.assign(params, hasParams)\n        } else {\n          params = false\n        }\n      }\n\n      if (params) {\n        const { parsedDestination, destQuery } = prepareDestination({\n          appendParamsToQuery: true,\n          destination: rewrite.destination,\n          params: params,\n          query: rewrittenParsedUrl.query,\n        })\n\n        // if the rewrite destination is external break rewrite chain\n        if (parsedDestination.protocol) {\n          return true\n        }\n\n        Object.assign(rewriteParams, destQuery, params)\n        Object.assign(rewrittenParsedUrl.query, parsedDestination.query)\n        delete (parsedDestination as any).query\n\n        Object.assign(rewrittenParsedUrl, parsedDestination)\n\n        fsPathname = rewrittenParsedUrl.pathname\n        if (!fsPathname) return false\n\n        if (basePath) {\n          fsPathname = fsPathname.replace(new RegExp(`^${basePath}`), '') || '/'\n        }\n\n        if (i18n) {\n          const result = normalizeLocalePath(fsPathname, i18n.locales)\n          fsPathname = result.pathname\n          rewrittenParsedUrl.query.nextInternalLocale =\n            result.detectedLocale || params.nextInternalLocale\n        }\n\n        if (fsPathname === page) {\n          return true\n        }\n\n        if (pageIsDynamic && dynamicRouteMatcher) {\n          const dynamicParams = dynamicRouteMatcher(fsPathname)\n          if (dynamicParams) {\n            rewrittenParsedUrl.query = {\n              ...rewrittenParsedUrl.query,\n              ...dynamicParams,\n            }\n            return true\n          }\n        }\n      }\n\n      return false\n    }\n\n    for (const rewrite of rewrites.beforeFiles || []) {\n      checkRewrite(rewrite)\n    }\n\n    if (fsPathname !== page) {\n      let finished = false\n\n      for (const rewrite of rewrites.afterFiles || []) {\n        finished = checkRewrite(rewrite)\n        if (finished) break\n      }\n\n      if (!finished && !matchesPage()) {\n        for (const rewrite of rewrites.fallback || []) {\n          finished = checkRewrite(rewrite)\n          if (finished) break\n        }\n      }\n    }\n\n    return { rewriteParams, rewrittenParsedUrl }\n  }\n\n  function getParamsFromRouteMatches(routeMatchesHeader: string) {\n    // If we don't have a default route regex, we can't get params from route\n    // matches\n    if (!defaultRouteRegex) return null\n\n    const { groups, routeKeys } = defaultRouteRegex\n\n    const matcher = getRouteMatcher({\n      re: {\n        // Simulate a RegExp match from the \\`req.url\\` input\n        exec: (str: string) => {\n          // Normalize all the prefixed query params.\n          const obj: Record<string, string> = Object.fromEntries(\n            new URLSearchParams(str)\n          )\n          for (const [key, value] of Object.entries(obj)) {\n            const normalizedKey = normalizeNextQueryParam(key)\n            if (!normalizedKey) continue\n\n            obj[normalizedKey] = value\n            delete obj[key]\n          }\n\n          // Use all the named route keys.\n          const result = {} as RegExpExecArray\n          for (const keyName of Object.keys(routeKeys)) {\n            const paramName = routeKeys[keyName]\n\n            // If this param name is not a valid parameter name, then skip it.\n            if (!paramName) continue\n\n            const group = groups[paramName]\n            const value = obj[keyName]\n\n            // When we're missing a required param, we can't match the route.\n            if (!group.optional && !value) return null\n\n            result[group.pos] = value\n          }\n\n          return result\n        },\n      },\n      groups,\n    })\n\n    const routeMatches = matcher(routeMatchesHeader)\n    if (!routeMatches) return null\n\n    return routeMatches\n  }\n\n  function normalizeQueryParams(\n    query: Record<string, string | string[] | undefined>,\n    routeParamKeys: Set<string>\n  ) {\n    // this is used to pass query information in rewrites\n    // but should not be exposed in final query\n    delete query['nextInternalLocale']\n\n    for (const [key, value] of Object.entries(query)) {\n      const normalizedKey = normalizeNextQueryParam(key)\n      if (!normalizedKey) continue\n\n      // Remove the prefixed key from the query params because we want\n      // to consume it for the dynamic route matcher.\n      delete query[key]\n      routeParamKeys.add(normalizedKey)\n\n      if (typeof value === 'undefined') continue\n\n      query[normalizedKey] = Array.isArray(value)\n        ? value.map((v) => decodeQueryPathParameter(v))\n        : decodeQueryPathParameter(value)\n    }\n  }\n\n  return {\n    handleRewrites,\n    defaultRouteRegex,\n    dynamicRouteMatcher,\n    defaultRouteMatches,\n    normalizeQueryParams,\n    getParamsFromRouteMatches,\n    /**\n     * Normalize dynamic route params.\n     *\n     * @param query - The query params to normalize.\n     * @param ignoreMissingOptional - Whether to ignore missing optional params.\n     * @returns The normalized params and whether they are valid.\n     */\n    normalizeDynamicRouteParams: (\n      query: ParsedUrlQuery,\n      ignoreMissingOptional: boolean\n    ) => {\n      if (!defaultRouteRegex || !defaultRouteMatches) {\n        return { params: {}, hasValidParams: false }\n      }\n\n      return normalizeDynamicRouteParams(\n        query,\n        defaultRouteRegex,\n        defaultRouteMatches,\n        ignoreMissingOptional\n      )\n    },\n\n    normalizeCdnUrl: (\n      req: BaseNextRequest | IncomingMessage,\n      paramKeys: string[]\n    ) => normalizeCdnUrl(req, paramKeys),\n\n    interpolateDynamicPath: (\n      pathname: string,\n      params: Record<string, undefined | string | string[]>\n    ) => interpolateDynamicPath(pathname, params, defaultRouteRegex),\n\n    filterInternalQuery: (query: ParsedUrlQuery, paramKeys: string[]) =>\n      filterInternalQuery(query, paramKeys),\n  }\n}\n\nexport function getPreviouslyRevalidatedTags(\n  headers: IncomingHttpHeaders,\n  previewModeId: string | undefined\n): string[] {\n  return typeof headers[NEXT_CACHE_REVALIDATED_TAGS_HEADER] === 'string' &&\n    headers[NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER] === previewModeId\n    ? headers[NEXT_CACHE_REVALIDATED_TAGS_HEADER].split(',')\n    : []\n}\n","import type { DomainLocale } from '../../../server/config-shared'\n\nexport function detectDomainLocale(\n  domainItems?: readonly DomainLocale[],\n  hostname?: string,\n  detectedLocale?: string\n) {\n  if (!domainItems) return\n\n  if (detectedLocale) {\n    detectedLocale = detectedLocale.toLowerCase()\n  }\n\n  for (const item of domainItems) {\n    // remove port if present\n    const domainHostname = item.domain?.split(':', 1)[0].toLowerCase()\n    if (\n      hostname === domainHostname ||\n      detectedLocale === item.defaultLocale.toLowerCase() ||\n      item.locales?.some((locale) => locale.toLowerCase() === detectedLocale)\n    ) {\n      return item\n    }\n  }\n}\n","import type { OutgoingHttpHeaders } from 'http'\n\n/**\n * Takes an object with a hostname property (like a parsed URL) and some\n * headers that may contain Host and returns the preferred hostname.\n * @param parsed An object containing a hostname property.\n * @param headers A dictionary with headers containing a `host`.\n */\nexport function getHostname(\n  parsed: { hostname?: string | null },\n  headers?: OutgoingHttpHeaders\n): string | undefined {\n  // Get the hostname from the headers if it exists, otherwise use the parsed\n  // hostname.\n  let hostname: string\n  if (headers?.host && !Array.isArray(headers.host)) {\n    hostname = headers.host.toString().split(':', 1)[0]\n  } else if (parsed.hostname) {\n    hostname = parsed.hostname\n  } else return\n\n  return hostname.toLowerCase()\n}\n","import { pathHasPrefix } from '../router/utils/path-has-prefix'\n\n/**\n * strip _next/data/<build-id>/ prefix and .json suffix\n */\nexport function normalizeDataPath(pathname: string) {\n  if (!pathHasPrefix(pathname || '/', '/_next/data')) {\n    return pathname\n  }\n  pathname = pathname\n    .replace(/\\/_next\\/data\\/[^/]{1,}/, '')\n    .replace(/\\.json$/, '')\n\n  if (pathname === '/index') {\n    return '/'\n  }\n  return pathname\n}\n","import type { IncomingMessage, ServerResponse } from 'http'\nimport type { ParsedUrlQuery } from 'querystring'\nimport type { UrlWithParsedQuery } from 'url'\nimport type { BaseNextRequest } from './base-http'\nimport type { CloneableBody } from './body-streams'\nimport type { RouteMatch } from './route-matches/route-match'\nimport type { NEXT_RSC_UNION_QUERY } from '../client/components/app-router-headers'\nimport type {\n  ResponseCacheEntry,\n  ServerComponentsHmrCache,\n} from './response-cache'\nimport type { PagesDevOverlayBridgeType } from '../next-devtools/userspace/pages/pages-dev-overlay-setup'\nimport type { OpaqueFallbackRouteParams } from './request/fallback-params'\nimport type { IncrementalCache } from './lib/incremental-cache'\nimport type { RevalidateFn } from './lib/router-utils/router-server-context'\nimport type { NextRequest } from './web/exports'\n\n// FIXME: (wyattjoh) this is a temporary solution to allow us to pass data between bundled modules\nexport const NEXT_REQUEST_META = Symbol.for('NextInternalRequestMeta')\n\nexport type NextIncomingMessage = (\n  | BaseNextRequest\n  | IncomingMessage\n  | NextRequest\n) & {\n  [NEXT_REQUEST_META]?: RequestMeta\n}\n\n/**\n * The callback function to call when a response cache entry was generated or\n * looked up in the cache. When it returns true, the server assumes that the\n * handler has already responded to the request and will not do so itself.\n */\nexport type OnCacheEntryHandler = (\n  /**\n   * The response cache entry that was generated or looked up in the cache.\n   */\n  cacheEntry: ResponseCacheEntry,\n\n  /**\n   * The request metadata.\n   */\n  requestMeta: {\n    /**\n     * The URL that was used to make the request.\n     */\n    url: string | undefined\n  }\n) => Promise<boolean | void> | boolean | void\n\nexport interface RequestMeta {\n  /**\n   * The query that was used to make the request.\n   */\n  initQuery?: ParsedUrlQuery\n\n  /**\n   * The URL that was used to make the request.\n   */\n  initURL?: string\n\n  /**\n   * The protocol that was used to make the request.\n   */\n  initProtocol?: string\n\n  /**\n   * The body that was read from the request. This is used to allow the body to\n   * be read multiple times.\n   */\n  clonableBody?: CloneableBody\n\n  /**\n   * True when the request matched a locale domain that was configured in the\n   * next.config.js file.\n   */\n  isLocaleDomain?: boolean\n\n  /**\n   * True when the request had locale information stripped from the pathname\n   * part of the URL.\n   */\n  didStripLocale?: boolean\n\n  /**\n   * If the request had its URL rewritten, this is the pathname it was rewritten\n   * to (not a full URL, just the pathname).\n   */\n  rewrittenPathname?: string\n\n  /**\n   * The resolved pathname for the request. Dynamic route params are\n   * interpolated, the pathname is decoded, and the trailing slash is removed.\n   */\n  resolvedPathname?: string\n\n  /**\n   * The cookies that were added by middleware and were added to the response.\n   */\n  middlewareCookie?: string[]\n\n  /**\n   * The match on the request for a given route.\n   */\n  match?: RouteMatch\n\n  /**\n   * The incremental cache to use for the request.\n   */\n  incrementalCache?: IncrementalCache\n\n  /**\n   * The server components HMR cache, only for dev.\n   */\n  serverComponentsHmrCache?: ServerComponentsHmrCache\n\n  /**\n   * The hash of the most recent server component change (dev only), set by the\n   * router-server from the hot-reloader. Included in `\"use cache\"` cache keys\n   * so that cached entries are revalidated after an edit, for every client,\n   * regardless of whether it runs the HMR client.\n   */\n  hmrRefreshHash?: string\n\n  /**\n   * Equals the segment path that was used for the prefetch RSC request.\n   */\n  segmentPrefetchRSCRequest?: string\n\n  /**\n   * True when the request is for the prefetch flight data.\n   */\n  isPrefetchRSCRequest?: true\n\n  /**\n   * True when the request is for the flight data.\n   */\n  isRSCRequest?: true\n\n  /**\n   * A search param set by the Next.js client when performing RSC requests.\n   * Because some CDNs do not vary their cache entries on our custom headers,\n   * this search param represents a hash of the header values. For any cached\n   * RSC request, we should verify that the hash matches before responding.\n   * Otherwise this can lead to cache poisoning.\n   * TODO: Consider not using custom request headers at all, and instead encode\n   * everything into the search param.\n   */\n  cacheBustingSearchParam?: string\n\n  /**\n   * True when the request is for the `/_next/data` route using the pages\n   * router.\n   */\n  isNextDataReq?: true\n\n  /**\n   * Postponed state to use for resumption. When absent, the request is not a\n   * resume request. A non-empty string contains the state to resume, while an\n   * empty string represents a resume request without postponed state and\n   * signals that the renderer should perform a full dynamic render.\n   *\n   * There are no guarantees that the page actually postponed, as verifying\n   * that would incur an additional cache lookup.\n   */\n  postponed?: string\n\n  /**\n   * The action body extracted from a server action request when the postponed\n   * state was prepended to the body by the proxy. This allows the action\n   * handler to read the action payload without re-reading the consumed stream.\n   */\n  actionBody?: Buffer\n\n  /**\n   * If provided, this will be called when a response cache entry was generated\n   * or looked up in the cache.\n   *\n   * @deprecated Use `onCacheEntryV2` instead.\n   */\n  onCacheEntry?: OnCacheEntryHandler\n\n  /**\n   * If provided, this will be called when a response cache entry was generated\n   * or looked up in the cache.\n   */\n  onCacheEntryV2?: OnCacheEntryHandler\n\n  /**\n   * The previous revalidate before rendering 404 page for notFound: true\n   */\n  notFoundRevalidate?: number | false\n\n  /**\n   * In development, the original source page that returned a 404.\n   */\n  developmentNotFoundSourcePage?: string\n\n  /**\n   * The path we routed to and should be invoked\n   */\n  invokePath?: string\n\n  /**\n   * The specific page output we should be matching\n   */\n  invokeOutput?: string\n\n  /**\n   * The status we are invoking the request with from routing\n   */\n  invokeStatus?: number\n\n  /**\n   * The routing error we are invoking with\n   */\n  invokeError?: Error\n\n  /**\n   * The query parsed for the invocation\n   */\n  invokeQuery?: Record<string, undefined | string | string[]>\n\n  /**\n   * Whether the request is a middleware invocation\n   */\n  middlewareInvoke?: boolean\n\n  /**\n   * Whether the request should render the fallback shell or not.\n   */\n  renderFallbackShell?: boolean\n\n  /**\n   * Route param keys that were explicitly resolved from partial nxtP*\n   * query params during background revalidation. Used by app-page.ts to\n   * determine which fallback params should remain deferred vs resolved\n   * in intermediate PPR shells.\n   */\n  resolvedRouteParamKeys?: Set<string>\n\n  /**\n   * Whether the request is for the custom error page.\n   */\n  customErrorRender?: true\n\n  /**\n   * Whether to bubble up the NoFallbackError to the caller when a 404 is\n   * returned.\n   */\n  bubbleNoFallback?: true\n\n  /**\n   * True when the request had locale information inferred from the default\n   * locale.\n   */\n  localeInferredFromDefault?: true\n\n  /**\n   * The locale that was inferred or explicitly set for the request.\n   */\n  locale?: string\n\n  /**\n   * The default locale that was inferred or explicitly set for the request.\n   */\n  defaultLocale?: string\n\n  /**\n   * The relative project dir the server is running in from project root\n   */\n  relativeProjectDir?: string\n\n  /**\n   * The dist directory the server is currently using\n   */\n  distDir?: string\n\n  /**\n    Optional hostname used by route handlers when constructing absolute URLs.\n    hostname: '127.0.0.1',\n   */\n  hostname?: string\n\n  /**\n   Optional internal revalidate function to avoid revalidating over the network\n   */\n  revalidate?: RevalidateFn\n\n  /**\n   Optional function to render the 404 page for pages router `notFound: true`\n   */\n  render404?: (\n    req: IncomingMessage,\n    res: ServerResponse,\n    parsedUrl?: UrlWithParsedQuery,\n    setHeaders?: boolean\n  ) => Promise<void>\n\n  /**\n   * The query after resolving routes\n   */\n  query?: ParsedUrlQuery\n\n  /**\n   * The params after resolving routes\n   */\n  params?: ParsedUrlQuery\n\n  /**\n   * ErrorOverlay component to use in development for pages router\n   */\n  PagesErrorDebug?: PagesDevOverlayBridgeType\n\n  /**\n   * Whether server is in minimal mode (this will be replaced with more\n   * specific flags in future)\n   */\n  minimalMode?: boolean\n\n  /**\n   * The fallback params for this route. In dev, used for validating prerenders.\n   * In production, used to defer params resolution during staged rendering.\n   */\n  fallbackParams?: OpaqueFallbackRouteParams\n\n  /**\n   * DEV only: Request timings in process.hrtime.bigint()\n   */\n  devRequestTimingStart?: bigint\n  devRequestTimingMiddlewareStart?: bigint\n  devRequestTimingMiddlewareEnd?: bigint\n  devRequestTimingInternalsEnd?: bigint\n\n  /**\n   * DEV only: The duration of getStaticPaths/generateStaticParams in process.hrtime.bigint()\n   */\n  devGenerateStaticParamsDuration?: bigint\n\n  /**\n   * DEV only: Server action log info to be logged after the request log\n   */\n  devServerActionLog?: {\n    functionName: string\n    args: unknown[]\n    location: string\n    duration: number\n  }\n}\n\n/**\n * Gets the request metadata. If no key is provided, the entire metadata object\n * is returned.\n *\n * @param req the request to get the metadata from\n * @param key the key to get from the metadata (optional)\n * @returns the value for the key or the entire metadata object\n */\nexport function getRequestMeta(\n  req: NextIncomingMessage,\n  key?: undefined\n): RequestMeta\nexport function getRequestMeta<K extends keyof RequestMeta>(\n  req: NextIncomingMessage,\n  key: K\n): RequestMeta[K]\nexport function getRequestMeta<K extends keyof RequestMeta>(\n  req: NextIncomingMessage,\n  key?: K\n): RequestMeta | RequestMeta[K] {\n  const meta = req[NEXT_REQUEST_META] || {}\n  return typeof key === 'string' ? meta[key] : meta\n}\n\n/**\n * Sets the request metadata.\n *\n * @param req the request to set the metadata on\n * @param meta the metadata to set\n * @returns the mutated request metadata\n */\nexport function setRequestMeta(req: NextIncomingMessage, meta: RequestMeta) {\n  req[NEXT_REQUEST_META] = meta\n  return meta\n}\n\n/**\n * Adds a value to the request metadata.\n *\n * @param request the request to mutate\n * @param key the key to set\n * @param value the value to set\n * @returns the mutated request metadata\n */\nexport function addRequestMeta<K extends keyof RequestMeta>(\n  request: NextIncomingMessage,\n  key: K,\n  value: RequestMeta[K]\n) {\n  const meta = getRequestMeta(request)\n  meta[key] = value\n  return setRequestMeta(request, meta)\n}\n\n/**\n * Removes a key from the request metadata.\n *\n * @param request the request to mutate\n * @param key the key to remove\n * @returns the mutated request metadata\n */\nexport function removeRequestMeta<K extends keyof RequestMeta>(\n  request: NextIncomingMessage,\n  key: K\n) {\n  const meta = getRequestMeta(request)\n  delete meta[key]\n  return setRequestMeta(request, meta)\n}\n\ntype NextQueryMetadata = {\n  /**\n   * The `_rsc` query parameter used for cache busting to ensure that the RSC\n   * requests do not get cached by the browser explicitly.\n   */\n  [NEXT_RSC_UNION_QUERY]?: string\n}\n\nexport type NextParsedUrlQuery = ParsedUrlQuery & NextQueryMetadata\n\n/**\n * subset of `url.parse` return value\n */\ninterface LegacyUrl {\n  auth?: string | null\n  hash: string | null\n  hostname: string | null\n  href: string\n  pathname: string | null\n  protocol: string | null\n  search: string | null\n  slashes: boolean | null\n  port: string | null\n  query: string | null | ParsedUrlQuery\n}\ninterface LegacyUrlWithParsedQuery extends LegacyUrl {\n  query: ParsedUrlQuery\n}\n\n// TODO: Remove in favor of WHATWG URLs\nexport interface NextUrlWithParsedQuery extends LegacyUrlWithParsedQuery {\n  query: NextParsedUrlQuery\n}\n","import { getRequestMeta, type NextIncomingMessage } from '../request-meta'\n\nconst PATCHED_SET_HEADER = Symbol('next.patchSetHeaderWithCookieSupport')\n\ntype PatchableResponse = {\n  setHeader(key: string, value: string | string[]): PatchableResponse\n  headersSent?: boolean\n  [PATCHED_SET_HEADER]?: true\n}\n\n/**\n * Ensure cookies set in middleware are merged and not overridden by API\n * routes/getServerSideProps.\n *\n * @param req Incoming request\n * @param res Outgoing response\n */\nexport function patchSetHeaderWithCookieSupport(\n  req: NextIncomingMessage,\n  res: PatchableResponse\n) {\n  if (res[PATCHED_SET_HEADER]) {\n    return\n  }\n\n  const setHeader = res.setHeader.bind(res)\n\n  Object.defineProperty(res, PATCHED_SET_HEADER, {\n    value: true,\n  })\n\n  res.setHeader = (\n    name: string,\n    value: string | string[]\n  ): PatchableResponse => {\n    // When renders /_error after page is failed, it could attempt to set\n    // headers after headers.\n    if ('headersSent' in res && res.headersSent) {\n      return res\n    }\n\n    if (name.toLowerCase() === 'set-cookie') {\n      const middlewareValue = getRequestMeta(req, 'middlewareCookie')\n\n      if (\n        !middlewareValue ||\n        !Array.isArray(value) ||\n        !value.every((item, idx) => item === middlewareValue[idx])\n      ) {\n        value = [\n          // TODO: (wyattjoh) find out why this is called multiple times resulting in duplicate cookies being added\n          ...new Set([\n            ...(middlewareValue || []),\n            ...(typeof value === 'string'\n              ? [value]\n              : Array.isArray(value)\n                ? value\n                : []),\n          ]),\n        ]\n      }\n    }\n\n    return setHeader(name, value)\n  }\n}\n","import { ensureLeadingSlash } from './ensure-leading-slash'\nimport { isDynamicRoute } from '../router/utils'\nimport { NormalizeError } from '../utils'\n\n/**\n * Takes a page and transforms it into its file counterpart ensuring that the\n * output is normalized. Note this function is not idempotent because a page\n * `/index` can be referencing `/index/index.js` and `/index/index` could be\n * referencing `/index/index/index.js`. Examples:\n *  - `/` -> `/index`\n *  - `/index/foo` -> `/index/index/foo`\n *  - `/index` -> `/index/index`\n */\nexport function normalizePagePath(page: string): string {\n  const normalized =\n    /^\\/index(\\/|$)/.test(page) && !isDynamicRoute(page)\n      ? `/index${page}`\n      : page === '/'\n        ? '/index'\n        : ensureLeadingSlash(page)\n\n  if (process.env.NEXT_RUNTIME !== 'edge') {\n    const { posix } = require('path') as typeof import('path')\n    const resolvedPage = posix.normalize(normalized)\n    if (resolvedPage !== normalized) {\n      throw new NormalizeError(\n        `Requested and resolved page mismatch: ${normalized} ${resolvedPage}`\n      )\n    }\n  }\n\n  return normalized\n}\n","import type { PageExtensions } from '../../build/page-extensions-type'\nimport { normalizePathSep } from '../../shared/lib/page-path/normalize-path-sep'\nimport { normalizeAppPath } from '../../shared/lib/router/utils/app-paths'\nimport { isAppRouteRoute } from '../is-app-route-route'\n\nexport const STATIC_METADATA_IMAGES = {\n  icon: {\n    filename: 'icon',\n    extensions: ['ico', 'jpg', 'jpeg', 'png', 'svg'],\n  },\n  apple: {\n    filename: 'apple-icon',\n    extensions: ['jpg', 'jpeg', 'png'],\n  },\n  favicon: {\n    filename: 'favicon',\n    extensions: ['ico'],\n  },\n  openGraph: {\n    filename: 'opengraph-image',\n    extensions: ['jpg', 'jpeg', 'png', 'gif'],\n  },\n  twitter: {\n    filename: 'twitter-image',\n    extensions: ['jpg', 'jpeg', 'png', 'gif'],\n  },\n} as const\n\n// Match routes that are metadata routes, e.g. /sitemap.xml, /favicon.<ext>, /<icon>.<ext>, etc.\n// TODO-METADATA: support more metadata routes with more extensions\nexport const DEFAULT_METADATA_ROUTE_EXTENSIONS = ['js', 'jsx', 'ts', 'tsx']\n\n// Match the file extension with the dynamic multi-routes extensions\n// e.g. ([xml, js], null) -> can match `/sitemap.xml/route`, `sitemap.js/route`\n// e.g. ([png], [ts]) -> can match `/opengraph-image.png`, `/opengraph-image.ts`\nexport const getExtensionRegexString = (\n  staticExtensions: readonly string[],\n  dynamicExtensions: readonly string[] | null\n) => {\n  let result: string\n  // If there's no possible multi dynamic routes, will not match any <name>[].<ext> files\n  if (!dynamicExtensions || dynamicExtensions.length === 0) {\n    result = `(\\\\.(?:${staticExtensions.join('|')}))`\n  } else {\n    result = `(?:\\\\.(${staticExtensions.join('|')})|(\\\\.(${dynamicExtensions.join('|')})))`\n  }\n  return result\n}\n\n/**\n * Matches the static metadata files, e.g. /robots.txt, /sitemap.xml, /favicon.ico, etc.\n * @param appDirRelativePath the relative file path to app/\n * @returns if the path is a static metadata file route\n */\nexport function isStaticMetadataFile(appDirRelativePath: string) {\n  return isMetadataRouteFile(appDirRelativePath, [], true)\n}\n\n// Pre-compiled static regexes for common cases\nconst FAVICON_REGEX = /^[\\\\/]favicon\\.ico$/\nconst ROBOTS_TXT_REGEX = /^[\\\\/]robots\\.txt$/\nconst MANIFEST_JSON_REGEX = /^[\\\\/]manifest\\.json$/\nconst MANIFEST_WEBMANIFEST_REGEX = /^[\\\\/]manifest\\.webmanifest$/\nconst SITEMAP_XML_REGEX = /[\\\\/]sitemap\\.xml$/\n\n// Cache for compiled regex patterns based on parameters\nconst compiledRegexCache = new Map<string, RegExp[]>()\n\n// Fast path checks for common metadata files\nfunction fastPathCheck(normalizedPath: string): boolean | null {\n  // Check favicon.ico first (most common)\n  if (FAVICON_REGEX.test(normalizedPath)) return true\n\n  // Check other common static files\n  if (ROBOTS_TXT_REGEX.test(normalizedPath)) return true\n  if (MANIFEST_JSON_REGEX.test(normalizedPath)) return true\n  if (MANIFEST_WEBMANIFEST_REGEX.test(normalizedPath)) return true\n  if (SITEMAP_XML_REGEX.test(normalizedPath)) return true\n\n  // Quick negative check - if it doesn't contain any metadata keywords, skip\n  if (\n    !normalizedPath.includes('robots') &&\n    !normalizedPath.includes('manifest') &&\n    !normalizedPath.includes('sitemap') &&\n    !normalizedPath.includes('icon') &&\n    !normalizedPath.includes('apple-icon') &&\n    !normalizedPath.includes('opengraph-image') &&\n    !normalizedPath.includes('twitter-image') &&\n    !normalizedPath.includes('favicon')\n  ) {\n    return false\n  }\n\n  return null // Continue with full regex matching\n}\n\nfunction getCompiledRegexes(\n  pageExtensions: PageExtensions,\n  strictlyMatchExtensions: boolean\n): RegExp[] {\n  // Create cache key\n  const cacheKey = `${pageExtensions.join(',')}|${strictlyMatchExtensions}`\n\n  const cached = compiledRegexCache.get(cacheKey)\n  if (cached) {\n    return cached\n  }\n\n  // Pre-compute common strings\n  const trailingMatcher = strictlyMatchExtensions ? '$' : '?$'\n  const variantsMatcher = '\\\\d?'\n  const groupSuffix = strictlyMatchExtensions ? '' : '(-\\\\w{6})?'\n  const suffixMatcher = variantsMatcher + groupSuffix\n\n  // Pre-compute extension arrays to avoid repeated concatenation\n  const robotsExts =\n    pageExtensions.length > 0 ? [...pageExtensions, 'txt'] : ['txt']\n  const manifestExts =\n    pageExtensions.length > 0\n      ? [...pageExtensions, 'webmanifest', 'json']\n      : ['webmanifest', 'json']\n\n  const regexes = [\n    new RegExp(\n      `^[\\\\\\\\/]robots${getExtensionRegexString(robotsExts, null)}${trailingMatcher}`\n    ),\n    new RegExp(\n      `^[\\\\\\\\/]manifest${getExtensionRegexString(manifestExts, null)}${trailingMatcher}`\n    ),\n    // FAVICON_REGEX removed - already handled in fastPathCheck\n    new RegExp(\n      `[\\\\\\\\/]sitemap${getExtensionRegexString(['xml'], pageExtensions)}${trailingMatcher}`\n    ),\n    new RegExp(\n      `[\\\\\\\\/]icon${suffixMatcher}${getExtensionRegexString(\n        STATIC_METADATA_IMAGES.icon.extensions,\n        pageExtensions\n      )}${trailingMatcher}`\n    ),\n    new RegExp(\n      `[\\\\\\\\/]apple-icon${suffixMatcher}${getExtensionRegexString(\n        STATIC_METADATA_IMAGES.apple.extensions,\n        pageExtensions\n      )}${trailingMatcher}`\n    ),\n    new RegExp(\n      `[\\\\\\\\/]opengraph-image${suffixMatcher}${getExtensionRegexString(\n        STATIC_METADATA_IMAGES.openGraph.extensions,\n        pageExtensions\n      )}${trailingMatcher}`\n    ),\n    new RegExp(\n      `[\\\\\\\\/]twitter-image${suffixMatcher}${getExtensionRegexString(\n        STATIC_METADATA_IMAGES.twitter.extensions,\n        pageExtensions\n      )}${trailingMatcher}`\n    ),\n  ]\n\n  compiledRegexCache.set(cacheKey, regexes)\n  return regexes\n}\n\n/**\n * Determine if the file is a metadata route file entry\n * @param appDirRelativePath the relative file path to app/\n * @param pageExtensions the js extensions, such as ['js', 'jsx', 'ts', 'tsx']\n * @param strictlyMatchExtensions if it's true, match the file with page extension, otherwise match the file with default corresponding extension\n * @returns if the file is a metadata route file\n */\nexport function isMetadataRouteFile(\n  appDirRelativePath: string,\n  pageExtensions: PageExtensions,\n  strictlyMatchExtensions: boolean\n): boolean {\n  // Early exit for empty or obviously non-metadata paths\n  if (!appDirRelativePath || appDirRelativePath.length < 2) {\n    return false\n  }\n\n  const normalizedPath = normalizePathSep(appDirRelativePath)\n\n  // Fast path check for common cases\n  const fastResult = fastPathCheck(normalizedPath)\n  if (fastResult !== null) {\n    return fastResult\n  }\n\n  // Get compiled regexes from cache\n  const regexes = getCompiledRegexes(pageExtensions, strictlyMatchExtensions)\n\n  // Use for loop instead of .some() for better performance\n  for (let i = 0; i < regexes.length; i++) {\n    if (regexes[i].test(normalizedPath)) {\n      return true\n    }\n  }\n\n  return false\n}\n\n// Check if the route is a static metadata route, with /route suffix\n// e.g. /favicon.ico/route, /icon.png/route, etc.\n// But skip the text routes like robots.txt since they might also be dynamic.\n// Checking route path is not enough to determine if text routes is dynamic.\nexport function isStaticMetadataRoute(route: string) {\n  // extract ext with regex\n  const pathname = route.replace(/\\/route$/, '')\n\n  const matched =\n    isAppRouteRoute(route) &&\n    isMetadataRouteFile(pathname, [], true) &&\n    // These routes can either be built by static or dynamic entrypoints,\n    // so we assume they're dynamic\n    pathname !== '/robots.txt' &&\n    pathname !== '/manifest.webmanifest' &&\n    !pathname.endsWith('/sitemap.xml')\n\n  return matched\n}\n\n/**\n * Determine if a page or pathname is a metadata page.\n *\n * The input is a page or pathname, which can be with or without page suffix /foo/page or /foo.\n * But it will not contain the /route suffix.\n *\n * .e.g\n * /robots -> true\n * /sitemap -> true\n * /foo -> false\n */\nexport function isMetadataPage(page: string) {\n  const matched = !isAppRouteRoute(page) && isMetadataRouteFile(page, [], false)\n\n  return matched\n}\n\n/*\n * Determine if a Next.js route is a metadata route.\n * `route` will has a route suffix.\n *\n * e.g.\n * /app/robots/route -> true\n * /robots/route -> true\n * /sitemap/[__metadata_id__]/route -> true\n * /app/sitemap/page -> false\n * /icon-a102f4/route -> true\n */\nexport function isMetadataRoute(route: string): boolean {\n  let page = normalizeAppPath(route)\n    .replace(/^\\/?app\\//, '')\n    // Remove the dynamic route id\n    .replace('/[__metadata_id__]', '')\n    // Remove the /route suffix\n    .replace(/\\/route$/, '')\n\n  if (page[0] !== '/') page = '/' + page\n\n  const matched = isAppRouteRoute(route) && isMetadataRouteFile(page, [], false)\n\n  return matched\n}\n","/**\n * A `Promise.withResolvers` implementation that exposes the `resolve` and\n * `reject` functions on a `Promise`.\n *\n * @see https://tc39.es/proposal-promise-with-resolvers/\n */\nexport class DetachedPromise<T = any> {\n  public readonly resolve: (value: T | PromiseLike<T>) => void\n  public readonly reject: (reason: any) => void\n  public readonly promise: Promise<T>\n\n  constructor() {\n    let resolve: (value: T | PromiseLike<T>) => void\n    let reject: (reason: any) => void\n\n    // Create the promise and assign the resolvers to the object.\n    this.promise = new Promise<T>((res, rej) => {\n      resolve = res\n      reject = rej\n    })\n\n    // We know that resolvers is defined because the Promise constructor runs\n    // synchronously.\n    this.resolve = resolve!\n    this.reject = reject!\n  }\n}\n","import type { SchedulerFn } from './scheduler'\n\nimport { DetachedPromise } from './detached-promise'\n\ntype CacheKeyFn<K, C extends string | number | null> = (\n  key: K\n) => PromiseLike<C> | C\n\ntype BatcherOptions<K, C extends string | number | null> = {\n  cacheKeyFn?: CacheKeyFn<K, C>\n  schedulerFn?: SchedulerFn<void>\n}\n\ntype WorkFnContext<V, K> = {\n  resolve: (value: V | PromiseLike<V>) => void\n  key: K\n}\n\ntype WorkFn<V, K> = (context: WorkFnContext<V, K>) => Promise<V>\n\n/**\n * A wrapper for a function that will only allow one call to the function to\n * execute at a time.\n */\nexport class Batcher<K, V, C extends string | number | null> {\n  private readonly pending = new Map<C, Promise<V>>()\n\n  protected constructor(\n    private readonly cacheKeyFn?: CacheKeyFn<K, C>,\n    /**\n     * A function that will be called to schedule the wrapped function to be\n     * executed. This defaults to a function that will execute the function\n     * immediately.\n     */\n    private readonly schedulerFn: SchedulerFn<void> = (fn) => fn()\n  ) {}\n\n  /**\n   * Creates a new instance of PendingWrapper. If the key extends a string or\n   * number, the key will be used as the cache key. If the key is an object, a\n   * cache key function must be provided.\n   */\n  public static create<K extends string | number | null, V>(\n    options?: BatcherOptions<K, K>\n  ): Batcher<K, V, K>\n  public static create<K, V, C extends string | number | null>(\n    options: BatcherOptions<K, C> &\n      Required<Pick<BatcherOptions<K, C>, 'cacheKeyFn'>>\n  ): Batcher<K, V, C>\n  public static create<K, V, C extends string | number | null>(\n    options?: BatcherOptions<K, C>\n  ): Batcher<K, V, C> {\n    return new Batcher<K, V, C>(options?.cacheKeyFn, options?.schedulerFn)\n  }\n\n  /**\n   * Wraps a function in a promise that will be resolved or rejected only once\n   * for a given key. This will allow multiple calls to the function to be\n   * made, but only one will be executed at a time. The result of the first\n   * call will be returned to all callers.\n   *\n   * @param key the key to use for the cache\n   * @param fn the function to wrap\n   * @returns a promise that resolves to the result of the function\n   */\n  public async batch(key: K, fn: WorkFn<V, K>): Promise<V> {\n    const cacheKey = (this.cacheKeyFn ? await this.cacheKeyFn(key) : key) as C\n    if (cacheKey === null) {\n      return fn({ resolve: (value) => Promise.resolve(value), key })\n    }\n\n    const pending = this.pending.get(cacheKey)\n    if (pending) return pending\n\n    const { promise, resolve, reject } = new DetachedPromise<V>()\n    this.pending.set(cacheKey, promise)\n\n    this.schedulerFn(async () => {\n      try {\n        const result = await fn({ resolve, key })\n\n        // Resolving a promise multiple times is a no-op, so we can safely\n        // resolve all pending promises with the same result.\n        resolve(result)\n      } catch (err) {\n        reject(err)\n      } finally {\n        this.pending.delete(cacheKey)\n      }\n    })\n\n    return promise\n  }\n}\n","export type ScheduledFn<T = void> = () => T | PromiseLike<T>\nexport type SchedulerFn<T = void> = (cb: ScheduledFn<T>) => void\n\n/**\n * Schedules a function to be called on the next tick after the other promises\n * have been resolved.\n *\n * @param cb the function to schedule\n */\nexport const scheduleOnNextTick = (cb: ScheduledFn<void>) => {\n  // We use Promise.resolve().then() here so that the operation is scheduled at\n  // the end of the promise job queue, we then add it to the next process tick\n  // to ensure it's evaluated afterwards.\n  //\n  // This was inspired by the implementation of the DataLoader interface: https://github.com/graphql/dataloader/blob/d336bd15282664e0be4b4a657cb796f09bafbc6b/src/index.js#L213-L255\n  //\n  Promise.resolve().then(() => {\n    if (process.env.NEXT_RUNTIME === 'edge') {\n      setTimeout(cb, 0)\n    } else {\n      process.nextTick(cb)\n    }\n  })\n}\n\n/**\n * Schedules a function to be called using `setImmediate` or `setTimeout` if\n * `setImmediate` is not available (like in the Edge runtime).\n *\n * @param cb the function to schedule\n */\nexport const scheduleImmediate = (cb: ScheduledFn<void>): void => {\n  if (process.env.NEXT_RUNTIME === 'edge') {\n    setTimeout(cb, 0)\n  } else {\n    setImmediate(cb)\n  }\n}\n\n/**\n * returns a promise than resolves in a future task. There is no guarantee that the task it resolves in\n * will be the next task but if you await it you can at least be sure that the current task is over and\n * most usefully that the entire microtask queue of the current task has been emptied.\n */\nexport function atLeastOneTask() {\n  return new Promise<void>((resolve) => scheduleImmediate(resolve))\n}\n\n/**\n * This utility function is extracted to make it easier to find places where we are doing\n * specific timing tricks to try to schedule work after React has rendered. This is especially\n * important at the moment because Next.js uses the edge builds of React which use setTimeout to\n * schedule work when you might expect that something like setImmediate would do the trick.\n *\n * Long term we should switch to the node versions of React rendering when possible and then\n * update this to use setImmediate rather than setTimeout\n */\nexport function waitAtLeastOneReactRenderTask(): Promise<void> {\n  if (process.env.NEXT_RUNTIME === 'edge') {\n    return new Promise((r) => setTimeout(r, 0))\n  } else {\n    return new Promise((r) => setImmediate(r))\n  }\n}\n","import type { ReactDOMServerReadableStream } from 'react-dom/server'\nimport { getTracer } from '../lib/trace/tracer'\nimport { AppRenderSpan } from '../lib/trace/constants'\nimport { DetachedPromise } from '../../lib/detached-promise'\nimport {\n  scheduleImmediate,\n  atLeastOneTask,\n  waitAtLeastOneReactRenderTask,\n} from '../../lib/scheduler'\nimport { ENCODED_TAGS } from './encoded-tags'\nimport {\n  indexOfUint8Array,\n  isEquivalentUint8Arrays,\n  removeFromUint8Array,\n} from './uint8array-helpers'\nimport { MISSING_ROOT_TAGS_ERROR } from '../../shared/lib/errors/constants'\nimport {\n  RSC_HEADER,\n  NEXT_ROUTER_PREFETCH_HEADER,\n  NEXT_ROUTER_SEGMENT_PREFETCH_HEADER,\n  NEXT_RSC_UNION_QUERY,\n} from '../../client/components/app-router-headers'\nimport { computeCacheBustingSearchParam } from '../../shared/lib/router/utils/cache-busting-search-param'\nimport type { AnyStream } from '../app-render/stream-ops'\n\nfunction voidCatch() {\n  // this catcher is designed to be used with pipeTo where we expect the underlying\n  // pipe implementation to forward errors but we don't want the pipeTo promise to reject\n  // and be unhandled\n}\n\n// We can share the same encoder instance everywhere\n// Notably we cannot do the same for TextDecoder because it is stateful\n// when handling streaming data\nconst encoder = new TextEncoder()\n\nexport function chainStreams<T>(\n  ...streams: ReadableStream<T>[]\n): ReadableStream<T> {\n  // If we have no streams, return an empty stream. This behavior is\n  // intentional as we're now providing the `RenderResult.EMPTY` value.\n  if (streams.length === 0) {\n    return new ReadableStream<T>({\n      start(controller) {\n        controller.close()\n      },\n    })\n  }\n\n  // If we only have 1 stream we fast path it by returning just this stream\n  if (streams.length === 1) {\n    return streams[0]\n  }\n\n  const { readable, writable } = new TransformStream()\n\n  // We always initiate pipeTo immediately. We know we have at least 2 streams\n  // so we need to avoid closing the writable when this one finishes.\n  let promise = streams[0].pipeTo(writable, { preventClose: true })\n\n  let i = 1\n  for (; i < streams.length - 1; i++) {\n    const nextStream = streams[i]\n    promise = promise.then(() =>\n      nextStream.pipeTo(writable, { preventClose: true })\n    )\n  }\n\n  // We can omit the length check because we halted before the last stream and there\n  // is at least two streams so the lastStream here will always be defined\n  const lastStream = streams[i]\n  promise = promise.then(() => lastStream.pipeTo(writable))\n\n  // Catch any errors from the streams and ignore them, they will be handled\n  // by whatever is consuming the readable stream.\n  promise.catch(voidCatch)\n\n  return readable\n}\n\nexport function streamFromString(str: string): ReadableStream<Uint8Array> {\n  return new ReadableStream({\n    start(controller) {\n      controller.enqueue(encoder.encode(str))\n      controller.close()\n    },\n  })\n}\n\nexport function streamFromBuffer(chunk: Buffer): ReadableStream<Uint8Array> {\n  return new ReadableStream({\n    start(controller) {\n      controller.enqueue(chunk)\n      controller.close()\n    },\n  })\n}\n\nasync function streamToChunks(\n  stream: ReadableStream<Uint8Array>\n): Promise<Array<Uint8Array>> {\n  const reader = stream.getReader()\n  const chunks: Array<Uint8Array> = []\n\n  while (true) {\n    const { done, value } = await reader.read()\n    if (done) {\n      break\n    }\n\n    chunks.push(value)\n  }\n\n  return chunks\n}\n\nfunction concatUint8Arrays(chunks: Array<Uint8Array>): Uint8Array {\n  const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0)\n  const result = new Uint8Array(totalLength)\n  let offset = 0\n  for (const chunk of chunks) {\n    result.set(chunk, offset)\n    offset += chunk.length\n  }\n  return result\n}\n\nexport async function webstreamToUint8Array(\n  stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n  return concatUint8Arrays(await streamToChunks(stream))\n}\n\nfunction webToReadable(\n  stream: ReadableStream<Uint8Array> | import('node:stream').Readable\n): import('node:stream').Readable {\n  if (process.env.NEXT_RUNTIME === 'edge') {\n    throw new Error('webToReadable cannot be used in the edge runtime')\n  } else {\n    let Readable: typeof import('node:stream').Readable\n    if (process.env.TURBOPACK) {\n      Readable = (require('node:stream') as typeof import('node:stream'))\n        .Readable\n    } else if (\n      process.env.__NEXT_BUNDLER === 'Webpack' ||\n      process.env.__NEXT_BUNDLER === 'Rspack'\n    ) {\n      Readable = (\n        __non_webpack_require__('node:stream') as typeof import('node:stream')\n      ).Readable\n    } else {\n      Readable = (require('node:stream') as typeof import('node:stream'))\n        .Readable\n    }\n    if (stream instanceof Readable) {\n      return stream\n    }\n    return Readable.fromWeb(stream as import('stream/web').ReadableStream)\n  }\n}\n\nexport async function nodestreamToUint8Array(\n  stream: AnyStream\n): Promise<Uint8Array> {\n  const chunks: Buffer[] = []\n  for await (const chunk of webToReadable(stream)) {\n    chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n  }\n  return Buffer.concat(chunks)\n}\n\nexport async function streamToUint8Array(stream: AnyStream) {\n  if (process.env.NEXT_RUNTIME === 'edge') {\n    // Edge runtime always uses web streams\n    return webstreamToUint8Array(stream as ReadableStream<Uint8Array>)\n  } else {\n    let Readable: typeof import('node:stream').Readable\n    if (process.env.TURBOPACK) {\n      Readable = (require('node:stream') as typeof import('node:stream'))\n        .Readable\n    } else if (\n      process.env.__NEXT_BUNDLER === 'Webpack' ||\n      process.env.__NEXT_BUNDLER === 'Rspack'\n    ) {\n      Readable = (\n        __non_webpack_require__('node:stream') as typeof import('node:stream')\n      ).Readable\n    } else {\n      Readable = (require('node:stream') as typeof import('node:stream'))\n        .Readable\n    }\n\n    if (stream instanceof Readable) {\n      return nodestreamToUint8Array(stream)\n    }\n\n    return webstreamToUint8Array(stream)\n  }\n}\n\nexport async function streamToBuffer(\n  stream: ReadableStream<Uint8Array>\n): Promise<Buffer> {\n  return Buffer.concat(await streamToChunks(stream))\n}\n\nexport async function streamToString(\n  stream: ReadableStream<Uint8Array>,\n  signal?: AbortSignal\n): Promise<string> {\n  const decoder = new TextDecoder('utf-8', { fatal: true })\n  let string = ''\n\n  for await (const chunk of stream) {\n    if (signal?.aborted) {\n      return string\n    }\n\n    string += decoder.decode(chunk, { stream: true })\n  }\n\n  string += decoder.decode()\n\n  return string\n}\n\nexport type BufferedTransformOptions = {\n  /**\n   * Flush synchronously once the buffer reaches this many bytes.\n   */\n  readonly maxBufferByteLength?: number\n}\n\nexport function createBufferedTransformStream(\n  options: BufferedTransformOptions = {}\n): TransformStream<Uint8Array, Uint8Array> {\n  const { maxBufferByteLength = Infinity } = options\n\n  let bufferedChunks: Array<Uint8Array> = []\n  let bufferByteLength: number = 0\n  let pending: DetachedPromise<void> | undefined\n\n  const flush = (controller: TransformStreamDefaultController) => {\n    try {\n      if (bufferedChunks.length === 0) {\n        return\n      }\n\n      const chunk = new Uint8Array(bufferByteLength)\n      let copiedBytes = 0\n\n      for (let i = 0; i < bufferedChunks.length; i++) {\n        const bufferedChunk = bufferedChunks[i]\n        chunk.set(bufferedChunk, copiedBytes)\n        copiedBytes += bufferedChunk.byteLength\n      }\n      // We just wrote all the buffered chunks so we need to reset the bufferedChunks array\n      // and our bufferByteLength to prepare for the next round of buffered chunks\n      bufferedChunks.length = 0\n      bufferByteLength = 0\n      controller.enqueue(chunk)\n    } catch {\n      // If an error occurs while enqueuing, it can't be due to this\n      // transformer. It's most likely caused by the controller having been\n      // errored (for example, if the stream was cancelled).\n    }\n  }\n\n  const scheduleFlush = (controller: TransformStreamDefaultController) => {\n    if (pending) {\n      return\n    }\n\n    const detached = new DetachedPromise<void>()\n    pending = detached\n\n    scheduleImmediate(() => {\n      try {\n        flush(controller)\n      } finally {\n        pending = undefined\n        detached.resolve()\n      }\n    })\n  }\n\n  return new TransformStream({\n    transform(chunk, controller) {\n      // Combine the previous buffer with the new chunk.\n      bufferedChunks.push(chunk)\n      bufferByteLength += chunk.byteLength\n\n      if (bufferByteLength >= maxBufferByteLength) {\n        flush(controller)\n      } else {\n        scheduleFlush(controller)\n      }\n    },\n    flush() {\n      return pending?.promise\n    },\n  })\n}\n\n// TODO this is currently unused but once we add proper output:export support, it needs to be\n// revisited. See https://github.com/vercel/next.js/pull/89478 for more details\n//\n// function createPrefetchCommentStream(\n//   isBuildTimePrerendering: boolean,\n//   buildId: string\n// ): TransformStream<Uint8Array, Uint8Array> {\n//   // Insert an extra comment at the beginning of the HTML document. This must\n//   // come after the DOCTYPE, which is inserted by React.\n//   //\n//   // The first chunk sent by React will contain the doctype. After that, we can\n//   // pass through the rest of the chunks as-is.\n//   let didTransformFirstChunk = false\n//   return new TransformStream({\n//     transform(chunk, controller) {\n//       if (isBuildTimePrerendering && !didTransformFirstChunk) {\n//         didTransformFirstChunk = true\n//         const decoder = new TextDecoder('utf-8', { fatal: true })\n//         const chunkStr = decoder.decode(chunk, {\n//           stream: true,\n//         })\n//         const updatedChunkStr = insertBuildIdComment(chunkStr, buildId)\n//         controller.enqueue(encoder.encode(updatedChunkStr))\n//         return\n//       }\n//       controller.enqueue(chunk)\n//     },\n//   })\n// }\n\nexport function renderToInitialFizzStream({\n  ReactDOMServer,\n  element,\n  streamOptions,\n}: {\n  ReactDOMServer: {\n    renderToReadableStream: typeof import('react-dom/server').renderToReadableStream\n  }\n  element: React.ReactElement\n  streamOptions?: Parameters<typeof ReactDOMServer.renderToReadableStream>[1]\n}): Promise<ReactDOMServerReadableStream> {\n  return getTracer().trace(AppRenderSpan.renderToReadableStream, async () =>\n    ReactDOMServer.renderToReadableStream(element, streamOptions)\n  )\n}\n\nexport function createMetadataTransformStream(\n  insert: () => Promise<string> | string\n): TransformStream<Uint8Array, Uint8Array> {\n  let chunkIndex = -1\n  let isMarkRemoved = false\n\n  return new TransformStream({\n    async transform(chunk, controller) {\n      let iconMarkIndex = -1\n      let closedHeadIndex = -1\n      chunkIndex++\n\n      if (isMarkRemoved) {\n        controller.enqueue(chunk)\n        return\n      }\n      let iconMarkLength = 0\n      // Only search for the closed head tag once\n      if (iconMarkIndex === -1) {\n        iconMarkIndex = indexOfUint8Array(chunk, ENCODED_TAGS.META.ICON_MARK)\n        if (iconMarkIndex === -1) {\n          controller.enqueue(chunk)\n          return\n        } else {\n          // When we found the `<meta name=\"«nxt-icon»\"` tag prefix, we will remove it from the chunk.\n          // Its close tag could either be `/>` or `>`, checking the next char to ensure we cover both cases.\n          iconMarkLength = ENCODED_TAGS.META.ICON_MARK.length\n          // Check if next char is /, this is for xml mode.\n          if (chunk[iconMarkIndex + iconMarkLength] === 47) {\n            iconMarkLength += 2\n          } else {\n            // The last char is `>`\n            iconMarkLength++\n          }\n        }\n      }\n\n      // Check if icon mark is inside <head> tag in the first chunk.\n      if (chunkIndex === 0) {\n        closedHeadIndex = indexOfUint8Array(chunk, ENCODED_TAGS.CLOSED.HEAD)\n        if (iconMarkIndex !== -1) {\n          // The mark icon is located in the 1st chunk before the head tag.\n          // We do not need to insert the script tag in this case because it's in the head.\n          // Just remove the icon mark from the chunk.\n          if (iconMarkIndex < closedHeadIndex) {\n            const replaced = new Uint8Array(chunk.length - iconMarkLength)\n\n            // Remove the icon mark from the chunk.\n            replaced.set(chunk.subarray(0, iconMarkIndex))\n            replaced.set(\n              chunk.subarray(iconMarkIndex + iconMarkLength),\n              iconMarkIndex\n            )\n            chunk = replaced\n          } else {\n            // The icon mark is after the head tag, replace and insert the script tag at that position.\n            const insertion = await insert()\n            const encodedInsertion = encoder.encode(insertion)\n            const insertionLength = encodedInsertion.length\n            const replaced = new Uint8Array(\n              chunk.length - iconMarkLength + insertionLength\n            )\n            replaced.set(chunk.subarray(0, iconMarkIndex))\n            replaced.set(encodedInsertion, iconMarkIndex)\n            replaced.set(\n              chunk.subarray(iconMarkIndex + iconMarkLength),\n              iconMarkIndex + insertionLength\n            )\n            chunk = replaced\n          }\n          isMarkRemoved = true\n        }\n        // If there's no icon mark located, it will be handled later when if present in the following chunks.\n      } else {\n        // When it's appeared in the following chunks, we'll need to\n        // remove the mark and then insert the script tag at that position.\n        const insertion = await insert()\n        const encodedInsertion = encoder.encode(insertion)\n        const insertionLength = encodedInsertion.length\n        // Replace the icon mark with the hoist script or empty string.\n        const replaced = new Uint8Array(\n          chunk.length - iconMarkLength + insertionLength\n        )\n        // Set the first part of the chunk, before the icon mark.\n        replaced.set(chunk.subarray(0, iconMarkIndex))\n        // Set the insertion after the icon mark.\n        replaced.set(encodedInsertion, iconMarkIndex)\n\n        // Set the rest of the chunk after the icon mark.\n        replaced.set(\n          chunk.subarray(iconMarkIndex + iconMarkLength),\n          iconMarkIndex + insertionLength\n        )\n        chunk = replaced\n        isMarkRemoved = true\n      }\n      controller.enqueue(chunk)\n    },\n  })\n}\n\nexport function createHeadInsertionTransformStream(\n  insert: () => Promise<string>\n): TransformStream<Uint8Array, Uint8Array> {\n  let inserted = false\n\n  // We need to track if this transform saw any bytes because if it didn't\n  // we won't want to insert any server HTML at all\n  let hasBytes = false\n\n  return new TransformStream({\n    async transform(chunk, controller) {\n      hasBytes = true\n\n      const insertion = await insert()\n      if (inserted) {\n        if (insertion) {\n          const encodedInsertion = encoder.encode(insertion)\n          controller.enqueue(encodedInsertion)\n        }\n        controller.enqueue(chunk)\n      } else {\n        // TODO (@Ethan-Arrowood): Replace the generic `indexOfUint8Array` method with something finely tuned for the subset of things actually being checked for.\n        const index = indexOfUint8Array(chunk, ENCODED_TAGS.CLOSED.HEAD)\n        // In fully static rendering or non PPR rendering cases:\n        // `/head>` will always be found in the chunk in first chunk rendering.\n        if (index !== -1) {\n          if (insertion) {\n            const encodedInsertion = encoder.encode(insertion)\n            // Get the total count of the bytes in the chunk and the insertion\n            // e.g.\n            // chunk = <head><meta charset=\"utf-8\"></head>\n            // insertion = <script>...</script>\n            // output = <head><meta charset=\"utf-8\"> [ <script>...</script> ] </head>\n            const insertedHeadContent = new Uint8Array(\n              chunk.length + encodedInsertion.length\n            )\n            // Append the first part of the chunk, before the head tag\n            insertedHeadContent.set(chunk.slice(0, index))\n            // Append the server inserted content\n            insertedHeadContent.set(encodedInsertion, index)\n            // Append the rest of the chunk\n            insertedHeadContent.set(\n              chunk.slice(index),\n              index + encodedInsertion.length\n            )\n            controller.enqueue(insertedHeadContent)\n          } else {\n            controller.enqueue(chunk)\n          }\n          inserted = true\n        } else {\n          // This will happens in PPR rendering during next start, when the page is partially rendered.\n          // When the page resumes, the head tag will be found in the middle of the chunk.\n          // Where we just need to append the insertion and chunk to the current stream.\n          // e.g.\n          // PPR-static: <head>...</head><body> [ resume content ] </body>\n          // PPR-resume: [ insertion ] [ rest content ]\n          if (insertion) {\n            controller.enqueue(encoder.encode(insertion))\n          }\n          controller.enqueue(chunk)\n          inserted = true\n        }\n      }\n    },\n    async flush(controller) {\n      // Check before closing if there's anything remaining to insert.\n      if (hasBytes) {\n        const insertion = await insert()\n        if (insertion) {\n          controller.enqueue(encoder.encode(insertion))\n        }\n      }\n    },\n  })\n}\n\nasync function createClientResumeScriptInsertionTransformStream(): Promise<\n  TransformStream<Uint8Array, Uint8Array>\n> {\n  const segmentPath = '/_full'\n  const cacheBustingHeader = await computeCacheBustingSearchParam(\n    '1', //            headers[NEXT_ROUTER_PREFETCH_HEADER]\n    '/_full', //       headers[NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]\n    undefined, //      headers[NEXT_ROUTER_STATE_TREE_HEADER]\n    undefined //       headers[NEXT_URL]\n  )\n  const searchStr = `${NEXT_RSC_UNION_QUERY}=${cacheBustingHeader}`\n  const NEXT_CLIENT_RESUME_SCRIPT = `<script>__NEXT_CLIENT_RESUME=fetch(location.pathname+'?${searchStr}',{credentials:'same-origin',headers:{'${RSC_HEADER}': '1','${NEXT_ROUTER_PREFETCH_HEADER}': '1','${NEXT_ROUTER_SEGMENT_PREFETCH_HEADER}': '${segmentPath}'}})</script>`\n\n  let didAlreadyInsert = false\n  return new TransformStream({\n    transform(chunk, controller) {\n      if (didAlreadyInsert) {\n        // Already inserted the script into the head. Pass through.\n        controller.enqueue(chunk)\n        return\n      }\n      // TODO (@Ethan-Arrowood): Replace the generic `indexOfUint8Array` method with something finely tuned for the subset of things actually being checked for.\n      const headClosingTagIndex = indexOfUint8Array(\n        chunk,\n        ENCODED_TAGS.CLOSED.HEAD\n      )\n\n      if (headClosingTagIndex === -1) {\n        // In fully static rendering or non PPR rendering cases:\n        // `/head>` will always be found in the chunk in first chunk rendering.\n        controller.enqueue(chunk)\n        return\n      }\n\n      const encodedInsertion = encoder.encode(NEXT_CLIENT_RESUME_SCRIPT)\n      // Get the total count of the bytes in the chunk and the insertion\n      // e.g.\n      // chunk = <head><meta charset=\"utf-8\"></head>\n      // insertion = <script>...</script>\n      // output = <head><meta charset=\"utf-8\"> [ <script>...</script> ] </head>\n      const insertedHeadContent = new Uint8Array(\n        chunk.length + encodedInsertion.length\n      )\n      // Append the first part of the chunk, before the head tag\n      insertedHeadContent.set(chunk.slice(0, headClosingTagIndex))\n      // Append the server inserted content\n      insertedHeadContent.set(encodedInsertion, headClosingTagIndex)\n      // Append the rest of the chunk\n      insertedHeadContent.set(\n        chunk.slice(headClosingTagIndex),\n        headClosingTagIndex + encodedInsertion.length\n      )\n\n      controller.enqueue(insertedHeadContent)\n      didAlreadyInsert = true\n    },\n  })\n}\n\n// Suffix after main body content - scripts before </body>,\n// but wait for the major chunks to be enqueued.\nexport function createDeferredSuffixStream(\n  suffix: string\n): TransformStream<Uint8Array, Uint8Array> {\n  let flushed = false\n  let pending: DetachedPromise<void> | undefined\n\n  const flush = (controller: TransformStreamDefaultController) => {\n    const detached = new DetachedPromise<void>()\n    pending = detached\n\n    scheduleImmediate(() => {\n      try {\n        controller.enqueue(encoder.encode(suffix))\n      } catch {\n        // If an error occurs while enqueuing it can't be due to this\n        // transformers fault. It's likely due to the controller being\n        // errored due to the stream being cancelled.\n      } finally {\n        pending = undefined\n        detached.resolve()\n      }\n    })\n  }\n\n  return new TransformStream({\n    transform(chunk, controller) {\n      controller.enqueue(chunk)\n\n      // If we've already flushed, we're done.\n      if (flushed) return\n\n      // Schedule the flush to happen.\n      flushed = true\n      flush(controller)\n    },\n    flush(controller) {\n      if (pending) return pending.promise\n      if (flushed) return\n\n      // Flush now.\n      controller.enqueue(encoder.encode(suffix))\n    },\n  })\n}\n\nexport function createFlightDataInjectionTransformStream(\n  stream: ReadableStream<Uint8Array>,\n  delayDataUntilFirstHtmlChunk: boolean\n): TransformStream<Uint8Array, Uint8Array> {\n  let htmlStreamFinished = false\n\n  let pull: Promise<void> | null = null\n  let donePulling = false\n\n  function startOrContinuePulling(\n    controller: TransformStreamDefaultController\n  ) {\n    if (!pull) {\n      pull = startPulling(controller)\n    }\n    return pull\n  }\n\n  async function startPulling(controller: TransformStreamDefaultController) {\n    const reader = stream.getReader()\n\n    if (delayDataUntilFirstHtmlChunk) {\n      // NOTE: streaming flush\n      // We are buffering here for the inlined data stream because the\n      // \"shell\" stream might be chunkenized again by the underlying stream\n      // implementation, e.g. with a specific high-water mark. To ensure it's\n      // the safe timing to pipe the data stream, this extra tick is\n      // necessary.\n\n      // We don't start reading until we've left the current Task to ensure\n      // that it's inserted after flushing the shell. Note that this implementation\n      // might get stale if impl details of Fizz change in the future.\n      await atLeastOneTask()\n    }\n\n    try {\n      while (true) {\n        const { done, value } = await reader.read()\n        if (done) {\n          donePulling = true\n          return\n        }\n\n        // We want to prioritize HTML over RSC data.\n        // The SSR render is based on the same RSC stream, so when we get a new RSC chunk,\n        // we're likely to produce an HTML chunk as well, so give it a chance to flush first.\n        if (!delayDataUntilFirstHtmlChunk && !htmlStreamFinished) {\n          await atLeastOneTask()\n        }\n        controller.enqueue(value)\n      }\n    } catch (err) {\n      controller.error(err)\n    }\n  }\n\n  return new TransformStream({\n    start(controller) {\n      if (!delayDataUntilFirstHtmlChunk) {\n        startOrContinuePulling(controller)\n      }\n    },\n    transform(chunk, controller) {\n      controller.enqueue(chunk)\n\n      // Start the streaming if it hasn't already been started yet.\n      if (delayDataUntilFirstHtmlChunk) {\n        startOrContinuePulling(controller)\n      }\n    },\n    flush(controller) {\n      htmlStreamFinished = true\n      if (donePulling) {\n        return\n      }\n      return startOrContinuePulling(controller)\n    },\n  })\n}\n\nexport const CLOSE_TAG = '</body></html>'\n\n/**\n * This transform stream moves the suffix to the end of the stream, so results\n * like `</body></html><script>...</script>` will be transformed to\n * `<script>...</script></body></html>`.\n */\nexport function createMoveSuffixStream(): TransformStream<\n  Uint8Array,\n  Uint8Array\n> {\n  let foundSuffix = false\n\n  return new TransformStream({\n    transform(chunk, controller) {\n      if (foundSuffix) {\n        return controller.enqueue(chunk)\n      }\n\n      const index = indexOfUint8Array(chunk, ENCODED_TAGS.CLOSED.BODY_AND_HTML)\n      if (index > -1) {\n        foundSuffix = true\n\n        // If the whole chunk is the suffix, then don't write anything, it will\n        // be written in the flush.\n        if (chunk.length === ENCODED_TAGS.CLOSED.BODY_AND_HTML.length) {\n          return\n        }\n\n        // Write out the part before the suffix.\n        const before = chunk.slice(0, index)\n        controller.enqueue(before)\n\n        // In the case where the suffix is in the middle of the chunk, we need\n        // to split the chunk into two parts.\n        if (chunk.length > ENCODED_TAGS.CLOSED.BODY_AND_HTML.length + index) {\n          // Write out the part after the suffix.\n          const after = chunk.slice(\n            index + ENCODED_TAGS.CLOSED.BODY_AND_HTML.length\n          )\n          controller.enqueue(after)\n        }\n      } else {\n        controller.enqueue(chunk)\n      }\n    },\n    flush(controller) {\n      // Even if we didn't find the suffix, the HTML is not valid if we don't\n      // add it, so insert it at the end.\n      controller.enqueue(ENCODED_TAGS.CLOSED.BODY_AND_HTML)\n    },\n  })\n}\n\nfunction createStripDocumentClosingTagsTransform(): TransformStream<\n  Uint8Array,\n  Uint8Array\n> {\n  return new TransformStream({\n    transform(chunk, controller) {\n      // We rely on the assumption that chunks will never break across a code unit.\n      // This is reasonable because we currently concat all of React's output from a single\n      // flush into one chunk before streaming it forward which means the chunk will represent\n      // a single coherent utf-8 string. This is not safe to use if we change our streaming to no\n      // longer do this large buffered chunk\n      if (\n        isEquivalentUint8Arrays(chunk, ENCODED_TAGS.CLOSED.BODY_AND_HTML) ||\n        isEquivalentUint8Arrays(chunk, ENCODED_TAGS.CLOSED.BODY) ||\n        isEquivalentUint8Arrays(chunk, ENCODED_TAGS.CLOSED.HTML)\n      ) {\n        // the entire chunk is the closing tags; return without enqueueing anything.\n        return\n      }\n\n      // We assume these tags will go at together at the end of the document and that\n      // they won't appear anywhere else in the document. This is not really a safe assumption\n      // but until we revamp our streaming infra this is a performant way to string the tags\n      chunk = removeFromUint8Array(chunk, ENCODED_TAGS.CLOSED.BODY)\n      chunk = removeFromUint8Array(chunk, ENCODED_TAGS.CLOSED.HTML)\n\n      controller.enqueue(chunk)\n    },\n  })\n}\n\nexport function createHtmlDataDplIdTransformStream(\n  dplId: string\n): TransformStream<Uint8Array, Uint8Array> {\n  let didTransform = false\n\n  return new TransformStream({\n    transform(chunk, controller) {\n      if (didTransform) {\n        controller.enqueue(chunk)\n        return\n      }\n\n      const htmlTagIndex = indexOfUint8Array(chunk, ENCODED_TAGS.OPENING.HTML)\n      if (htmlTagIndex === -1) {\n        controller.enqueue(chunk)\n        return\n      }\n\n      // Insert the data-dpl-id attribute right after \"<html \"\n      const insertionPoint = htmlTagIndex + ENCODED_TAGS.OPENING.HTML.length\n      const attribute = ` data-dpl-id=\"${dplId}\"`\n      const encodedAttribute = encoder.encode(attribute)\n      const modifiedChunk = new Uint8Array(\n        chunk.length + encodedAttribute.length\n      )\n\n      // Copy everything before the insertion point\n      modifiedChunk.set(chunk.subarray(0, insertionPoint))\n      // Insert the attribute\n      modifiedChunk.set(encodedAttribute, insertionPoint)\n      // Copy everything after\n      modifiedChunk.set(\n        chunk.subarray(insertionPoint),\n        insertionPoint + encodedAttribute.length\n      )\n\n      controller.enqueue(modifiedChunk)\n      didTransform = true\n    },\n  })\n}\n\n/*\n * Checks if the root layout is missing the html or body tags\n * and if so, it will inject a script tag to throw an error in the browser, showing the user\n * the error message in the error overlay.\n */\nexport function createRootLayoutValidatorStream(): TransformStream<\n  Uint8Array,\n  Uint8Array\n> {\n  let foundHtml = false\n  let foundBody = false\n  return new TransformStream({\n    async transform(chunk, controller) {\n      // Peek into the streamed chunk to see if the tags are present.\n      if (\n        !foundHtml &&\n        indexOfUint8Array(chunk, ENCODED_TAGS.OPENING.HTML) > -1\n      ) {\n        foundHtml = true\n      }\n\n      if (\n        !foundBody &&\n        indexOfUint8Array(chunk, ENCODED_TAGS.OPENING.BODY) > -1\n      ) {\n        foundBody = true\n      }\n\n      controller.enqueue(chunk)\n    },\n    flush(controller) {\n      const missingTags: ('html' | 'body')[] = []\n      if (!foundHtml) missingTags.push('html')\n      if (!foundBody) missingTags.push('body')\n\n      if (!missingTags.length) return\n\n      controller.enqueue(\n        encoder.encode(\n          `<html id=\"__next_error__\">\n            <template\n              data-next-error-message=\"Missing ${missingTags\n                .map((c) => `<${c}>`)\n                .join(\n                  missingTags.length > 1 ? ' and ' : ''\n                )} tags in the root layout.\\nRead more at https://nextjs.org/docs/messages/missing-root-layout-tags\"\n              data-next-error-digest=\"${MISSING_ROOT_TAGS_ERROR}\"\n              data-next-error-stack=\"\"\n            ></template>\n          `\n        )\n      )\n    },\n  })\n}\n\nexport function chainTransformers<T>(\n  readable: ReadableStream<T>,\n  transformers: ReadonlyArray<TransformStream<T, T> | null>\n): ReadableStream<T> {\n  let stream = readable\n  for (const transformer of transformers) {\n    if (!transformer) continue\n\n    stream = stream.pipeThrough(transformer)\n  }\n  return stream\n}\n\nexport type ContinueStreamOptions = {\n  inlinedDataStream: ReadableStream<Uint8Array> | undefined\n  isStaticGeneration: boolean\n  deploymentId: string | undefined\n  getServerInsertedHTML: () => Promise<string>\n  getServerInsertedMetadata: () => Promise<string>\n  validateRootLayout?: boolean\n  /**\n   * Suffix to inject after the buffered data, but before the close tags.\n   */\n  suffix?: string | undefined\n}\n\nexport async function continueFizzStream(\n  renderStream: ReactDOMServerReadableStream,\n  {\n    suffix,\n    inlinedDataStream,\n    isStaticGeneration,\n    deploymentId,\n    getServerInsertedHTML,\n    getServerInsertedMetadata,\n    validateRootLayout,\n  }: ContinueStreamOptions\n): Promise<ReadableStream<Uint8Array>> {\n  // Suffix itself might contain close tags at the end, so we need to split it.\n  const suffixUnclosed = suffix ? suffix.split(CLOSE_TAG, 1)[0] : null\n\n  if (isStaticGeneration) {\n    // If we're generating static HTML we need to wait for it to resolve before continuing.\n    await renderStream.allReady\n  } else {\n    // Otherwise, we want to make sure Fizz is done with all microtasky work\n    // before we start pulling the stream and cause a flush.\n    await waitAtLeastOneReactRenderTask()\n  }\n\n  return chainTransformers(renderStream, [\n    // Buffer everything to avoid flushing too frequently\n    createBufferedTransformStream(),\n\n    // Insert data-dpl-id attribute on the html tag\n    deploymentId ? createHtmlDataDplIdTransformStream(deploymentId) : null,\n\n    // Transform metadata\n    createMetadataTransformStream(getServerInsertedMetadata),\n\n    // Insert suffix content\n    suffixUnclosed != null && suffixUnclosed.length > 0\n      ? createDeferredSuffixStream(suffixUnclosed)\n      : null,\n\n    // Insert the inlined data (Flight data, form state, etc.) stream into the HTML\n    inlinedDataStream\n      ? createFlightDataInjectionTransformStream(inlinedDataStream, true)\n      : null,\n\n    // Validate the root layout for missing html or body tags\n    validateRootLayout ? createRootLayoutValidatorStream() : null,\n\n    // Close tags should always be deferred to the end\n    createMoveSuffixStream(),\n\n    // Special head insertions\n    // TODO-APP: Insert server side html to end of head in app layout rendering, to avoid\n    // hydration errors. Remove this once it's ready to be handled by react itself.\n    createHeadInsertionTransformStream(getServerInsertedHTML),\n  ])\n}\n\ntype ContinueDynamicPrerenderOptions = {\n  getServerInsertedHTML: () => Promise<string>\n  getServerInsertedMetadata: () => Promise<string>\n  deploymentId: string | undefined\n}\n\nexport async function continueDynamicPrerender(\n  prerenderStream: ReadableStream<Uint8Array>,\n  {\n    getServerInsertedHTML,\n    getServerInsertedMetadata,\n    deploymentId,\n  }: ContinueDynamicPrerenderOptions\n) {\n  return chainTransformers(prerenderStream, [\n    // Buffer everything to avoid flushing too frequently\n    createBufferedTransformStream(),\n    createStripDocumentClosingTagsTransform(),\n    // Insert data-dpl-id attribute on the html tag\n    deploymentId ? createHtmlDataDplIdTransformStream(deploymentId) : null,\n    // Insert generated tags to head\n    createHeadInsertionTransformStream(getServerInsertedHTML),\n    // Transform metadata\n    createMetadataTransformStream(getServerInsertedMetadata),\n  ])\n}\n\ntype ContinueStaticPrerenderOptions = {\n  inlinedDataStream: ReadableStream<Uint8Array>\n  getServerInsertedHTML: () => Promise<string>\n  getServerInsertedMetadata: () => Promise<string>\n  deploymentId: string | undefined\n}\n\nexport async function continueStaticPrerender(\n  prerenderStream: ReadableStream<Uint8Array>,\n  {\n    inlinedDataStream,\n    getServerInsertedHTML,\n    getServerInsertedMetadata,\n    deploymentId,\n  }: ContinueStaticPrerenderOptions\n) {\n  return chainTransformers(prerenderStream, [\n    // Buffer everything to avoid flushing too frequently\n    createBufferedTransformStream(),\n    // Add build id comment to start of the HTML document (in export mode)\n    // Insert data-dpl-id attribute on the html tag\n    deploymentId ? createHtmlDataDplIdTransformStream(deploymentId) : null,\n    // Insert generated tags to head\n    createHeadInsertionTransformStream(getServerInsertedHTML),\n    // Transform metadata\n    createMetadataTransformStream(getServerInsertedMetadata),\n    // Insert the inlined data (Flight data, form state, etc.) stream into the HTML\n    createFlightDataInjectionTransformStream(inlinedDataStream, true),\n    // Close tags should always be deferred to the end\n    createMoveSuffixStream(),\n  ])\n}\n\nexport async function continueStaticFallbackPrerender(\n  prerenderStream: ReadableStream<Uint8Array>,\n  {\n    inlinedDataStream,\n    getServerInsertedHTML,\n    getServerInsertedMetadata,\n    deploymentId,\n  }: ContinueStaticPrerenderOptions\n) {\n  // Same as `continueStaticPrerender`, but also inserts an additional script\n  // to instruct the client to start fetching the hydration data as early\n  // as possible.\n  return chainTransformers(prerenderStream, [\n    // Buffer everything to avoid flushing too frequently\n    createBufferedTransformStream(),\n    // Insert data-dpl-id attribute on the html tag\n    deploymentId ? createHtmlDataDplIdTransformStream(deploymentId) : null,\n    // Insert generated tags to head\n    createHeadInsertionTransformStream(getServerInsertedHTML),\n    // Insert the client resume script into the head\n    await createClientResumeScriptInsertionTransformStream(),\n    // Transform metadata\n    createMetadataTransformStream(getServerInsertedMetadata),\n    // Insert the inlined data (Flight data, form state, etc.) stream into the HTML\n    createFlightDataInjectionTransformStream(inlinedDataStream, true),\n    // Close tags should always be deferred to the end\n    createMoveSuffixStream(),\n  ])\n}\n\ntype ContinueResumeOptions = {\n  inlinedDataStream: ReadableStream<Uint8Array>\n  getServerInsertedHTML: () => Promise<string>\n  getServerInsertedMetadata: () => Promise<string>\n  delayDataUntilFirstHtmlChunk: boolean\n  deploymentId: string | undefined\n}\n\nexport async function continueDynamicHTMLResume(\n  renderStream: ReadableStream<Uint8Array>,\n  {\n    delayDataUntilFirstHtmlChunk,\n    inlinedDataStream,\n    getServerInsertedHTML,\n    getServerInsertedMetadata,\n    deploymentId,\n  }: ContinueResumeOptions\n) {\n  return chainTransformers(renderStream, [\n    // Buffer everything to avoid flushing too frequently\n    createBufferedTransformStream(),\n    // Insert data-dpl-id attribute on the html tag\n    deploymentId ? createHtmlDataDplIdTransformStream(deploymentId) : null,\n    // Insert generated tags to head\n    createHeadInsertionTransformStream(getServerInsertedHTML),\n    // Transform metadata\n    createMetadataTransformStream(getServerInsertedMetadata),\n    // Insert the inlined data (Flight data, form state, etc.) stream into the HTML\n    createFlightDataInjectionTransformStream(\n      inlinedDataStream,\n      delayDataUntilFirstHtmlChunk\n    ),\n    // Close tags should always be deferred to the end\n    createMoveSuffixStream(),\n  ])\n}\n\nexport function createDocumentClosingStream(): ReadableStream<Uint8Array> {\n  return streamFromString(CLOSE_TAG)\n}\n\n// ---------------------------------------------------------------------------\n// Runtime prefetch transform (Web streams)\n// ---------------------------------------------------------------------------\n\n/**\n * Web TransformStream that replaces the runtime prefetch sentinel in an RSC\n * payload stream: `[<sentinel>]` -> `[<isPartial>,<staleTime>]`.\n *\n * This is the web equivalent of createRuntimePrefetchNodeTransform\n * in node-stream-helpers.ts.\n */\nexport function createRuntimePrefetchTransformStream(\n  sentinel: number,\n  isPartial: boolean,\n  staleTime: number\n): TransformStream<Uint8Array, Uint8Array> {\n  const enc = new TextEncoder()\n\n  // Search for: [<sentinel>]\n  // Replace with: [<isPartial>,<staleTime>]\n  const search = enc.encode(`[${sentinel}]`)\n  const first = search[0]\n  const replace = enc.encode(`[${isPartial},${staleTime}]`)\n  const searchLen = search.length\n\n  let currentChunk: Uint8Array | null = null\n  let found = false\n\n  function processChunk(\n    controller: TransformStreamDefaultController<Uint8Array>,\n    nextChunk: null | Uint8Array\n  ) {\n    if (found) {\n      if (nextChunk) {\n        controller.enqueue(nextChunk)\n      }\n      return\n    }\n\n    if (currentChunk) {\n      // We can't search past the index that can contain a full match\n      let exclusiveUpperBound = currentChunk.length - (searchLen - 1)\n      if (nextChunk) {\n        // If we have any overflow bytes we can search up to the chunk's final byte\n        exclusiveUpperBound += Math.min(nextChunk.length, searchLen - 1)\n      }\n      if (exclusiveUpperBound < 1) {\n        // we can't match the current chunk.\n        controller.enqueue(currentChunk)\n        currentChunk = nextChunk // advance so we don't process this chunk again\n        return\n      }\n\n      let currentIndex = currentChunk.indexOf(first)\n\n      // check the current candidate match if it is within the bounds of our search space for the currentChunk\n      candidateLoop: while (\n        -1 < currentIndex &&\n        currentIndex < exclusiveUpperBound\n      ) {\n        // We already know index 0 matches because we used indexOf to find the candidateIndex so we start at index 1\n        let matchIndex = 1\n        while (matchIndex < searchLen) {\n          const candidateIndex = currentIndex + matchIndex\n          const candidateValue =\n            candidateIndex < currentChunk.length\n              ? currentChunk[candidateIndex]\n              : // if we ever hit this condition it is because there is a nextChunk we can read from\n                nextChunk![candidateIndex - currentChunk.length]\n          if (candidateValue !== search[matchIndex]) {\n            // No match, reset and continue the search from the next position\n            currentIndex = currentChunk.indexOf(first, currentIndex + 1)\n            continue candidateLoop\n          }\n          matchIndex++\n        }\n        // We found a complete match. currentIndex is our starting point to replace the value.\n        found = true\n        // enqueue everything up to the match\n        controller.enqueue(currentChunk.subarray(0, currentIndex))\n        // enqueue the replacement value\n        controller.enqueue(replace)\n        // If there are bytes in the currentChunk after the match enqueue them\n        if (currentIndex + searchLen < currentChunk.length) {\n          controller.enqueue(currentChunk.slice(currentIndex + searchLen))\n        }\n        // If we have a next chunk we enqueue it now\n        if (nextChunk) {\n          // if replacement spills over to the next chunk we first exclude the replaced bytes\n          const overflowBytes = currentIndex + searchLen - currentChunk.length\n          const truncatedChunk =\n            overflowBytes > 0 ? nextChunk!.subarray(overflowBytes) : nextChunk\n          controller.enqueue(truncatedChunk)\n        }\n        // We are now in found mode and don't need to track currentChunk anymore\n        currentChunk = null\n        return\n      }\n      // No match found in this chunk, emit it and wait for the next one\n      controller.enqueue(currentChunk)\n    }\n\n    // Advance to the next chunk\n    currentChunk = nextChunk\n  }\n\n  return new TransformStream<Uint8Array, Uint8Array>({\n    transform(chunk, controller) {\n      processChunk(controller, chunk)\n    },\n    flush(controller) {\n      processChunk(controller, null)\n    },\n  })\n}\n","export const ENCODED_TAGS = {\n  // opening tags do not have the closing `>` since they can contain other attributes such as `<body className=''>`\n  OPENING: {\n    // <html\n    HTML: new Uint8Array([60, 104, 116, 109, 108]),\n    // <head\n    HEAD: new Uint8Array([60, 104, 101, 97, 100]),\n    // <body\n    BODY: new Uint8Array([60, 98, 111, 100, 121]),\n  },\n  CLOSED: {\n    // </head>\n    HEAD: new Uint8Array([60, 47, 104, 101, 97, 100, 62]),\n    // </body>\n    BODY: new Uint8Array([60, 47, 98, 111, 100, 121, 62]),\n    // </html>\n    HTML: new Uint8Array([60, 47, 104, 116, 109, 108, 62]),\n    // </body></html>\n    BODY_AND_HTML: new Uint8Array([\n      60, 47, 98, 111, 100, 121, 62, 60, 47, 104, 116, 109, 108, 62,\n    ]),\n  },\n  META: {\n    // Only the match the prefix cause the suffix can be different wether it's xml compatible or not \">\" or \"/>\"\n    // <meta name=\"«nxt-icon»\"\n    // This is a special mark that will be replaced by the icon insertion script tag.\n    ICON_MARK: new Uint8Array([\n      60, 109, 101, 116, 97, 32, 110, 97, 109, 101, 61, 34, 194, 171, 110, 120,\n      116, 45, 105, 99, 111, 110, 194, 187, 34,\n    ]),\n  },\n} as const\n","import { hexHash } from '../../hash'\n\nconst CACHE_BUSTING_SEARCH_PARAM_DIGEST_BYTES = 12\nconst textEncoder = new TextEncoder()\n\nfunction encodeCacheBustingSearchParam(bytes: Uint8Array): string {\n  let binary = ''\n  for (let i = 0; i < bytes.length; i++) {\n    binary += String.fromCharCode(bytes[i])\n  }\n\n  return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\nfunction normalizeCacheBustingInput(\n  value: string | string[] | undefined\n): string {\n  if (value === undefined) {\n    return '0'\n  }\n  return Array.isArray(value) ? value.join(',') : value\n}\n\nfunction createCacheBustingSearchParamInput(\n  prefetchHeader: '1' | '2' | '3' | '0' | undefined,\n  segmentPrefetchHeader: string | string[] | undefined,\n  stateTreeHeader: string | string[] | undefined,\n  nextUrlHeader: string | string[] | undefined\n): string | null {\n  if (\n    (prefetchHeader === undefined || prefetchHeader === '0') &&\n    segmentPrefetchHeader === undefined &&\n    stateTreeHeader === undefined &&\n    nextUrlHeader === undefined\n  ) {\n    return null\n  }\n\n  return [\n    prefetchHeader ?? '0',\n    normalizeCacheBustingInput(segmentPrefetchHeader),\n    normalizeCacheBustingInput(stateTreeHeader),\n    normalizeCacheBustingInput(nextUrlHeader),\n  ].join(',')\n}\n\nasync function computeCacheBustingSearchParamFromInput(\n  input: string\n): Promise<string> {\n  // Truncate SHA-256 to 96 bits to keep `_rsc` compact\n  const digest = await globalThis.crypto.subtle.digest(\n    'SHA-256',\n    textEncoder.encode(input)\n  )\n  return encodeCacheBustingSearchParam(\n    new Uint8Array(digest).subarray(0, CACHE_BUSTING_SEARCH_PARAM_DIGEST_BYTES)\n  )\n}\n\nexport async function computeCacheBustingSearchParam(\n  prefetchHeader: '1' | '2' | '3' | '0' | undefined,\n  segmentPrefetchHeader: string | string[] | undefined,\n  stateTreeHeader: string | string[] | undefined,\n  nextUrlHeader: string | string[] | undefined\n): Promise<string> {\n  const input = createCacheBustingSearchParamInput(\n    prefetchHeader,\n    segmentPrefetchHeader,\n    stateTreeHeader,\n    nextUrlHeader\n  )\n  if (input === null) {\n    return ''\n  }\n\n  return computeCacheBustingSearchParamFromInput(input)\n}\n\nexport function computeLegacyCacheBustingSearchParam(\n  prefetchHeader: '1' | '2' | '3' | '0' | undefined,\n  segmentPrefetchHeader: string | string[] | undefined,\n  stateTreeHeader: string | string[] | undefined,\n  nextUrlHeader: string | string[] | undefined\n): string {\n  const input = createCacheBustingSearchParamInput(\n    prefetchHeader,\n    segmentPrefetchHeader,\n    stateTreeHeader,\n    nextUrlHeader\n  )\n  if (input === null) {\n    return ''\n  }\n\n  return hexHash(input)\n}\n","import { parsePath } from './parse-path'\n\n/**\n * Adds the provided prefix to the given path. It first ensures that the path\n * is indeed starting with a slash.\n */\nexport function addPathPrefix(path: string, prefix?: string) {\n  if (!path.startsWith('/') || !prefix) {\n    return path\n  }\n\n  const { pathname, query, hash } = parsePath(path)\n  return `${prefix}${pathname}${query}${hash}`\n}\n","import { parsePath } from './parse-path'\n\n/**\n * Similarly to `addPathPrefix`, this function adds a suffix at the end on the\n * provided path. It also works only for paths ensuring the argument starts\n * with a slash.\n */\nexport function addPathSuffix(path: string, suffix?: string) {\n  if (!path.startsWith('/') || !suffix) {\n    return path\n  }\n\n  const { pathname, query, hash } = parsePath(path)\n  return `${pathname}${suffix}${query}${hash}`\n}\n","import type { OutgoingHttpHeaders } from 'http'\nimport type { DomainLocale, I18NConfig } from '../config-shared'\nimport type { I18NProvider } from '../lib/i18n-provider'\n\nimport { detectDomainLocale } from '../../shared/lib/i18n/detect-domain-locale'\nimport { formatNextPathnameInfo } from '../../shared/lib/router/utils/format-next-pathname-info'\nimport { getHostname } from '../../shared/lib/get-hostname'\nimport { getNextPathnameInfo } from '../../shared/lib/router/utils/get-next-pathname-info'\n\ninterface Options {\n  base?: string | URL\n  headers?: OutgoingHttpHeaders\n  forceLocale?: boolean\n  nextConfig?: {\n    basePath?: string\n    i18n?: I18NConfig | null\n    trailingSlash?: boolean\n  }\n  i18nProvider?: I18NProvider\n}\n\nconst REGEX_LOCALHOST_HOSTNAME =\n  /^(?:127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}|\\[::1\\]|localhost)$/\n\nfunction parseURL(url: string | URL, base?: string | URL) {\n  const parsed = new URL(String(url), base && String(base))\n  if (REGEX_LOCALHOST_HOSTNAME.test(parsed.hostname)) {\n    parsed.hostname = 'localhost'\n  }\n  return parsed\n}\n\nconst Internal = Symbol('NextURLInternal')\n\nexport class NextURL {\n  private [Internal]: {\n    basePath: string\n    buildId?: string\n    flightSearchParameters?: Record<string, string>\n    defaultLocale?: string\n    domainLocale?: DomainLocale\n    locale?: string\n    options: Options\n    trailingSlash?: boolean\n    url: URL\n  }\n\n  constructor(input: string | URL, base?: string | URL, opts?: Options)\n  constructor(input: string | URL, opts?: Options)\n  constructor(\n    input: string | URL,\n    baseOrOpts?: string | URL | Options,\n    opts?: Options\n  ) {\n    let base: undefined | string | URL\n    let options: Options\n\n    if (\n      (typeof baseOrOpts === 'object' && 'pathname' in baseOrOpts) ||\n      typeof baseOrOpts === 'string'\n    ) {\n      base = baseOrOpts\n      options = opts || {}\n    } else {\n      options = opts || baseOrOpts || {}\n    }\n\n    this[Internal] = {\n      url: parseURL(input, base ?? options.base),\n      options: options,\n      basePath: '',\n    }\n\n    this.analyze()\n  }\n\n  private analyze() {\n    const info = getNextPathnameInfo(this[Internal].url.pathname, {\n      nextConfig: this[Internal].options.nextConfig,\n      parseData: !process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE,\n      i18nProvider: this[Internal].options.i18nProvider,\n    })\n\n    const hostname = getHostname(\n      this[Internal].url,\n      this[Internal].options.headers\n    )\n    this[Internal].domainLocale = this[Internal].options.i18nProvider\n      ? this[Internal].options.i18nProvider.detectDomainLocale(hostname)\n      : detectDomainLocale(\n          this[Internal].options.nextConfig?.i18n?.domains,\n          hostname\n        )\n\n    const defaultLocale =\n      this[Internal].domainLocale?.defaultLocale ||\n      this[Internal].options.nextConfig?.i18n?.defaultLocale\n\n    this[Internal].url.pathname = info.pathname\n    this[Internal].defaultLocale = defaultLocale\n    this[Internal].basePath = info.basePath ?? ''\n    this[Internal].buildId = info.buildId\n    this[Internal].locale = info.locale ?? defaultLocale\n    this[Internal].trailingSlash = info.trailingSlash\n  }\n\n  private formatPathname() {\n    return formatNextPathnameInfo({\n      basePath: this[Internal].basePath,\n      buildId: this[Internal].buildId,\n      defaultLocale: !this[Internal].options.forceLocale\n        ? this[Internal].defaultLocale\n        : undefined,\n      locale: this[Internal].locale,\n      pathname: this[Internal].url.pathname,\n      trailingSlash: this[Internal].trailingSlash,\n    })\n  }\n\n  private formatSearch() {\n    return this[Internal].url.search\n  }\n\n  public get buildId() {\n    return this[Internal].buildId\n  }\n\n  public set buildId(buildId: string | undefined) {\n    this[Internal].buildId = buildId\n  }\n\n  public get locale() {\n    return this[Internal].locale ?? ''\n  }\n\n  public set locale(locale: string) {\n    if (\n      !this[Internal].locale ||\n      !this[Internal].options.nextConfig?.i18n?.locales.includes(locale)\n    ) {\n      throw new TypeError(\n        `The NextURL configuration includes no locale \"${locale}\"`\n      )\n    }\n\n    this[Internal].locale = locale\n  }\n\n  get defaultLocale() {\n    return this[Internal].defaultLocale\n  }\n\n  get domainLocale() {\n    return this[Internal].domainLocale\n  }\n\n  get searchParams() {\n    return this[Internal].url.searchParams\n  }\n\n  get host() {\n    return this[Internal].url.host\n  }\n\n  set host(value: string) {\n    this[Internal].url.host = value\n  }\n\n  get hostname() {\n    return this[Internal].url.hostname\n  }\n\n  set hostname(value: string) {\n    this[Internal].url.hostname = value\n  }\n\n  get port() {\n    return this[Internal].url.port\n  }\n\n  set port(value: string) {\n    this[Internal].url.port = value\n  }\n\n  get protocol() {\n    return this[Internal].url.protocol\n  }\n\n  set protocol(value: string) {\n    this[Internal].url.protocol = value\n  }\n\n  get href() {\n    const pathname = this.formatPathname()\n    const search = this.formatSearch()\n    return `${this.protocol}//${this.host}${pathname}${search}${this.hash}`\n  }\n\n  set href(url: string) {\n    this[Internal].url = parseURL(url)\n    this.analyze()\n  }\n\n  get origin() {\n    return this[Internal].url.origin\n  }\n\n  get pathname() {\n    return this[Internal].url.pathname\n  }\n\n  set pathname(value: string) {\n    this[Internal].url.pathname = value\n  }\n\n  get hash() {\n    return this[Internal].url.hash\n  }\n\n  set hash(value: string) {\n    this[Internal].url.hash = value\n  }\n\n  get search() {\n    return this[Internal].url.search\n  }\n\n  set search(value: string) {\n    this[Internal].url.search = value\n  }\n\n  get password() {\n    return this[Internal].url.password\n  }\n\n  set password(value: string) {\n    this[Internal].url.password = value\n  }\n\n  get username() {\n    return this[Internal].url.username\n  }\n\n  set username(value: string) {\n    this[Internal].url.username = value\n  }\n\n  get basePath() {\n    return this[Internal].basePath\n  }\n\n  set basePath(value: string) {\n    this[Internal].basePath = value.startsWith('/') ? value : `/${value}`\n  }\n\n  toString() {\n    return this.href\n  }\n\n  toJSON() {\n    return this.href\n  }\n\n  [Symbol.for('edge-runtime.inspect.custom')]() {\n    return {\n      href: this.href,\n      origin: this.origin,\n      protocol: this.protocol,\n      username: this.username,\n      password: this.password,\n      host: this.host,\n      hostname: this.hostname,\n      port: this.port,\n      pathname: this.pathname,\n      search: this.search,\n      searchParams: this.searchParams,\n      hash: this.hash,\n    }\n  }\n\n  clone() {\n    return new NextURL(String(this), this[Internal].options)\n  }\n}\n","import { normalizeLocalePath } from '../../i18n/normalize-locale-path'\nimport { removePathPrefix } from './remove-path-prefix'\nimport { pathHasPrefix } from './path-has-prefix'\nimport type { I18NProvider } from '../../../../server/lib/i18n-provider'\n\nexport interface NextPathnameInfo {\n  /**\n   * The base path in case the pathname included it.\n   */\n  basePath?: string\n  /**\n   * The buildId for when the parsed URL is a data URL. Parsing it can be\n   * disabled with the `parseData` option.\n   */\n  buildId?: string\n  /**\n   * If there was a locale in the pathname, this will hold its value.\n   */\n  locale?: string\n  /**\n   * The processed pathname without a base path, locale, or data URL elements\n   * when parsing it is enabled.\n   */\n  pathname: string\n  /**\n   * A boolean telling if the pathname had a trailingSlash. This can be only\n   * true if trailingSlash is enabled.\n   */\n  trailingSlash?: boolean\n}\n\ninterface Options {\n  /**\n   * When passed to true, this function will also parse Nextjs data URLs.\n   */\n  parseData?: boolean\n  /**\n   * A partial of the Next.js configuration to parse the URL.\n   */\n  nextConfig?: {\n    basePath?: string\n    i18n?: { locales?: readonly string[] } | null\n    trailingSlash?: boolean\n  }\n\n  /**\n   * If provided, this normalizer will be used to detect the locale instead of\n   * the default locale detection.\n   */\n  i18nProvider?: I18NProvider\n}\n\nexport function getNextPathnameInfo(\n  pathname: string,\n  options: Options\n): NextPathnameInfo {\n  const { basePath, i18n, trailingSlash } = options.nextConfig ?? {}\n  const info: NextPathnameInfo = {\n    pathname,\n    trailingSlash: pathname !== '/' ? pathname.endsWith('/') : trailingSlash,\n  }\n\n  if (basePath && pathHasPrefix(info.pathname, basePath)) {\n    info.pathname = removePathPrefix(info.pathname, basePath)\n    info.basePath = basePath\n  }\n  let pathnameNoDataPrefix = info.pathname\n\n  if (\n    info.pathname.startsWith('/_next/data/') &&\n    info.pathname.endsWith('.json')\n  ) {\n    const paths = info.pathname\n      .replace(/^\\/_next\\/data\\//, '')\n      .replace(/\\.json$/, '')\n      .split('/')\n\n    const buildId = paths[0]\n    info.buildId = buildId\n    pathnameNoDataPrefix =\n      paths[1] !== 'index' ? `/${paths.slice(1).join('/')}` : '/'\n\n    // update pathname with normalized if enabled although\n    // we use normalized to populate locale info still\n    if (options.parseData === true) {\n      info.pathname = pathnameNoDataPrefix\n    }\n  }\n\n  // If provided, use the locale route normalizer to detect the locale instead\n  // of the function below.\n  if (i18n) {\n    let result = options.i18nProvider\n      ? options.i18nProvider.analyze(info.pathname)\n      : normalizeLocalePath(info.pathname, i18n.locales)\n\n    info.locale = result.detectedLocale\n    info.pathname = result.pathname ?? info.pathname\n\n    if (!result.detectedLocale && info.buildId) {\n      result = options.i18nProvider\n        ? options.i18nProvider.analyze(pathnameNoDataPrefix)\n        : normalizeLocalePath(pathnameNoDataPrefix, i18n.locales)\n\n      if (result.detectedLocale) {\n        info.locale = result.detectedLocale\n      }\n    }\n  }\n  return info\n}\n","import type { NextPathnameInfo } from './get-next-pathname-info'\nimport { removeTrailingSlash } from './remove-trailing-slash'\nimport { addPathPrefix } from './add-path-prefix'\nimport { addPathSuffix } from './add-path-suffix'\nimport { addLocale } from './add-locale'\n\ninterface ExtendedInfo extends NextPathnameInfo {\n  defaultLocale?: string\n  ignorePrefix?: boolean\n}\n\nexport function formatNextPathnameInfo(info: ExtendedInfo) {\n  let pathname = addLocale(\n    info.pathname,\n    info.locale,\n    info.buildId ? undefined : info.defaultLocale,\n    info.ignorePrefix\n  )\n\n  if (info.buildId || !info.trailingSlash) {\n    pathname = removeTrailingSlash(pathname)\n  }\n\n  if (info.buildId) {\n    pathname = addPathSuffix(\n      addPathPrefix(pathname, `/_next/data/${info.buildId}`),\n      info.pathname === '/' ? 'index.json' : '.json'\n    )\n  }\n\n  pathname = addPathPrefix(pathname, info.basePath)\n  return !info.buildId && info.trailingSlash\n    ? !pathname.endsWith('/')\n      ? addPathSuffix(pathname, '/')\n      : pathname\n    : removeTrailingSlash(pathname)\n}\n","import { addPathPrefix } from './add-path-prefix'\nimport { pathHasPrefix } from './path-has-prefix'\n\n/**\n * For a given path and a locale, if the locale is given, it will prefix the\n * locale. The path shouldn't be an API path. If a default locale is given the\n * prefix will be omitted if the locale is already the default locale.\n */\nexport function addLocale(\n  path: string,\n  locale?: string | false,\n  defaultLocale?: string,\n  ignorePrefix?: boolean\n) {\n  // If no locale was given or the locale is the default locale, we don't need\n  // to prefix the path.\n  if (!locale || locale === defaultLocale) return path\n\n  const lower = path.toLowerCase()\n\n  // If the path is an API path or the path already has the locale prefix, we\n  // don't need to prefix the path.\n  if (!ignorePrefix) {\n    if (pathHasPrefix(lower, '/api')) return path\n    if (pathHasPrefix(lower, `/${locale.toLowerCase()}`)) return path\n  }\n\n  // Add the locale prefix to the path.\n  return addPathPrefix(path, `/${locale}`)\n}\n","import type { I18NConfig } from '../../config-shared'\nimport { NextURL } from '../next-url'\nimport { toNodeOutgoingHttpHeaders, validateURL } from '../utils'\nimport { RemovedUAError, RemovedPageError } from '../error'\nimport { RequestCookies } from './cookies'\n\nexport const INTERNALS = Symbol('internal request')\n\n/**\n * This class extends the [Web `Request` API](https://developer.mozilla.org/docs/Web/API/Request) with additional convenience methods.\n *\n * Read more: [Next.js Docs: `NextRequest`](https://nextjs.org/docs/app/api-reference/functions/next-request)\n */\nexport class NextRequest extends Request {\n  /** @internal */\n  [INTERNALS]: {\n    cookies: RequestCookies\n    url: string\n    nextUrl: NextURL\n  }\n\n  constructor(input: URL | RequestInfo, init: RequestInit = {}) {\n    const url =\n      typeof input !== 'string' && 'url' in input ? input.url : String(input)\n\n    validateURL(url)\n\n    // node Request instance requires duplex option when a body\n    // is present or it errors, we don't handle this for\n    // Request being passed in since it would have already\n    // errored if this wasn't configured\n    if (process.env.NEXT_RUNTIME !== 'edge') {\n      if (init.body && init.duplex !== 'half') {\n        init.duplex = 'half'\n      }\n    }\n\n    if (input instanceof Request) super(input, init)\n    else super(url, init)\n\n    const nextUrl = new NextURL(url, {\n      headers: toNodeOutgoingHttpHeaders(this.headers),\n      nextConfig: init.nextConfig,\n    })\n    this[INTERNALS] = {\n      cookies: new RequestCookies(this.headers),\n      nextUrl,\n      url: process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE\n        ? url\n        : nextUrl.toString(),\n    }\n  }\n\n  [Symbol.for('edge-runtime.inspect.custom')]() {\n    return {\n      cookies: this.cookies,\n      nextUrl: this.nextUrl,\n      url: this.url,\n      // rest of props come from Request\n      bodyUsed: this.bodyUsed,\n      cache: this.cache,\n      credentials: this.credentials,\n      destination: this.destination,\n      headers: Object.fromEntries(this.headers),\n      integrity: this.integrity,\n      keepalive: this.keepalive,\n      method: this.method,\n      mode: this.mode,\n      redirect: this.redirect,\n      referrer: this.referrer,\n      referrerPolicy: this.referrerPolicy,\n      signal: this.signal,\n    }\n  }\n\n  public get cookies() {\n    return this[INTERNALS].cookies\n  }\n\n  public get nextUrl() {\n    return this[INTERNALS].nextUrl\n  }\n\n  /**\n   * @deprecated\n   * `page` has been deprecated in favour of `URLPattern`.\n   * Read more: https://nextjs.org/docs/messages/middleware-request-page\n   */\n  public get page() {\n    throw new RemovedPageError()\n  }\n\n  /**\n   * @deprecated\n   * `ua` has been removed in favour of \\`userAgent\\` function.\n   * Read more: https://nextjs.org/docs/messages/middleware-parse-user-agent\n   */\n  public get ua() {\n    throw new RemovedUAError()\n  }\n\n  public get url() {\n    return this[INTERNALS].url\n  }\n}\n\nexport interface RequestInit extends globalThis.RequestInit {\n  nextConfig?: {\n    basePath?: string\n    i18n?: I18NConfig | null\n    trailingSlash?: boolean\n  }\n  signal?: AbortSignal\n  // see https://github.com/whatwg/fetch/pull/1457\n  duplex?: 'half'\n}\n","import type { BaseNextRequest } from '../../../base-http'\nimport type { NodeNextRequest } from '../../../base-http/node'\nimport type { WebNextRequest } from '../../../base-http/web'\nimport type { Writable } from 'node:stream'\n\nimport { getRequestMeta } from '../../../request-meta'\nimport { fromNodeOutgoingHttpHeaders } from '../../utils'\nimport { NextRequest } from '../request'\nimport { isNodeNextRequest, isWebNextRequest } from '../../../base-http/helpers'\n\nexport const ResponseAbortedName = 'ResponseAborted'\nexport class ResponseAborted extends Error {\n  public readonly name = ResponseAbortedName\n}\n\n/**\n * Creates an AbortController tied to the closing of a ServerResponse (or other\n * appropriate Writable).\n *\n * If the `close` event is fired before the `finish` event, then we'll send the\n * `abort` signal.\n */\nexport function createAbortController(response: Writable): AbortController {\n  const controller = new AbortController()\n\n  // If `finish` fires first, then `res.end()` has been called and the close is\n  // just us finishing the stream on our side. If `close` fires first, then we\n  // know the client disconnected before we finished.\n  response.once('close', () => {\n    if (response.writableFinished) return\n\n    controller.abort(new ResponseAborted())\n  })\n\n  return controller\n}\n\n/**\n * Creates an AbortSignal tied to the closing of a ServerResponse (or other\n * appropriate Writable).\n *\n * This cannot be done with the request (IncomingMessage or Readable) because\n * the `abort` event will not fire if to data has been fully read (because that\n * will \"close\" the readable stream and nothing fires after that).\n */\nexport function signalFromNodeResponse(response: Writable): AbortSignal {\n  const { errored, destroyed } = response\n  if (errored || destroyed) {\n    return AbortSignal.abort(errored ?? new ResponseAborted())\n  }\n\n  const { signal } = createAbortController(response)\n  return signal\n}\n\nexport class NextRequestAdapter {\n  public static fromBaseNextRequest(\n    request: BaseNextRequest,\n    signal: AbortSignal\n  ): NextRequest {\n    if (\n      // The type check here ensures that `req` is correctly typed, and the\n      // environment variable check provides dead code elimination.\n      process.env.NEXT_RUNTIME === 'edge' &&\n      isWebNextRequest(request)\n    ) {\n      return NextRequestAdapter.fromWebNextRequest(request)\n    } else if (\n      // The type check here ensures that `req` is correctly typed, and the\n      // environment variable check provides dead code elimination.\n      process.env.NEXT_RUNTIME !== 'edge' &&\n      isNodeNextRequest(request)\n    ) {\n      return NextRequestAdapter.fromNodeNextRequest(request, signal)\n    } else {\n      throw new Error('Invariant: Unsupported NextRequest type')\n    }\n  }\n\n  public static fromNodeNextRequest(\n    request: NodeNextRequest,\n    signal: AbortSignal\n  ): NextRequest {\n    // HEAD and GET requests can not have a body.\n    let body: BodyInit | null = null\n    if (request.method !== 'GET' && request.method !== 'HEAD' && request.body) {\n      // @ts-expect-error - this is handled by undici, when streams/web land use it instead\n      body = request.body\n    }\n\n    let url: URL\n    if (request.url.startsWith('http')) {\n      url = new URL(request.url)\n    } else {\n      // Grab the full URL from the request metadata.\n      const base = getRequestMeta(request, 'initURL')\n      if (!base || !base.startsWith('http')) {\n        // Because the URL construction relies on the fact that the URL provided\n        // is absolute, we need to provide a base URL. We can't use the request\n        // URL because it's relative, so we use a dummy URL instead.\n        url = new URL(request.url, 'http://n')\n      } else {\n        url = new URL(request.url, base)\n      }\n    }\n\n    return new NextRequest(url, {\n      method: request.method,\n      headers: fromNodeOutgoingHttpHeaders(request.headers),\n      duplex: 'half',\n      signal,\n      // geo\n      // ip\n      // nextConfig\n\n      // body can not be passed if request was aborted\n      // or we get a Request body was disturbed error\n      ...(signal.aborted\n        ? {}\n        : {\n            body,\n          }),\n    })\n  }\n\n  public static fromWebNextRequest(request: WebNextRequest): NextRequest {\n    // HEAD and GET requests can not have a body.\n    let body: ReadableStream | null = null\n    if (request.method !== 'GET' && request.method !== 'HEAD') {\n      body = request.body\n    }\n\n    return new NextRequest(request.url, {\n      method: request.method,\n      headers: fromNodeOutgoingHttpHeaders(request.headers),\n      duplex: 'half',\n      signal: request.request.signal,\n      // geo\n      // ip\n      // nextConfig\n\n      // body can not be passed if request was aborted\n      // or we get a Request body was disturbed error\n      ...(request.request.signal.aborted\n        ? {}\n        : {\n            body,\n          }),\n    })\n  }\n}\n","import type { AppPageModule } from './route-modules/app-page/module'\n\n// Combined load times for loading client components\nlet clientComponentLoadStart = 0\nlet clientComponentLoadTimes = 0\nlet clientComponentLoadCount = 0\n\nexport function wrapClientComponentLoader(\n  ComponentMod: AppPageModule,\n  isTracingEnabled: boolean\n): AppPageModule['__next_app__'] {\n  if (\n    !('performance' in globalThis) ||\n    (!process.env.NEXT_OTEL_PERFORMANCE_PREFIX && !isTracingEnabled)\n  ) {\n    return ComponentMod.__next_app__\n  }\n\n  return {\n    require: (...args) => {\n      const startTime = performance.now()\n\n      if (clientComponentLoadStart === 0) {\n        clientComponentLoadStart = startTime\n      }\n\n      try {\n        clientComponentLoadCount += 1\n        return ComponentMod.__next_app__.require(...args)\n      } finally {\n        clientComponentLoadTimes += performance.now() - startTime\n      }\n    },\n    loadChunk: (...args) => {\n      const startTime = performance.now()\n      const result = ComponentMod.__next_app__.loadChunk(...args)\n      // Avoid wrapping `loadChunk`'s result in an extra promise in case something like React depends on its identity.\n      // We only need to know when it's settled.\n      result.finally(() => {\n        clientComponentLoadTimes += performance.now() - startTime\n      })\n      return result\n    },\n  }\n}\n\nexport function getClientComponentLoaderMetrics(\n  options: { reset?: boolean } = {}\n) {\n  const metrics =\n    clientComponentLoadStart === 0\n      ? undefined\n      : {\n          clientComponentLoadStart,\n          clientComponentLoadTimes,\n          clientComponentLoadCount,\n        }\n\n  if (options.reset) {\n    clientComponentLoadStart = 0\n    clientComponentLoadTimes = 0\n    clientComponentLoadCount = 0\n  }\n\n  return metrics\n}\n","import type { ServerResponse } from 'node:http'\nimport type { Readable } from 'node:stream'\n\nimport {\n  ResponseAbortedName,\n  createAbortController,\n} from './web/spec-extension/adapters/next-request'\nimport { DetachedPromise } from '../lib/detached-promise'\nimport { getTracer } from './lib/trace/tracer'\nimport { NextNodeServerSpan } from './lib/trace/constants'\nimport { getClientComponentLoaderMetrics } from './client-component-renderer-logger'\n\nexport function isAbortError(e: any): e is Error & { name: 'AbortError' } {\n  return e?.name === 'AbortError' || e?.name === ResponseAbortedName\n}\n\nconst HAS_CLIENT_COMPONENT_METRICS_ENABLED =\n  'performance' in globalThis && process.env.NEXT_OTEL_PERFORMANCE_PREFIX\n\nfunction createWriterFromResponse(\n  res: ServerResponse,\n  waitUntilForEnd?: Promise<unknown>\n): WritableStream<Uint8Array> {\n  let started = false\n\n  // Create a promise that will resolve once the response has drained. See\n  // https://nodejs.org/api/stream.html#stream_event_drain\n  let drained = new DetachedPromise<void>()\n  function onDrain() {\n    drained.resolve()\n  }\n  res.on('drain', onDrain)\n\n  // If the finish event fires, it means we shouldn't block and wait for the\n  // drain event.\n  res.once('close', () => {\n    res.off('drain', onDrain)\n    drained.resolve()\n  })\n\n  // Create a promise that will resolve once the response has finished. See\n  // https://nodejs.org/api/http.html#event-finish_1\n  const finished = new DetachedPromise<void>()\n  res.once('finish', () => {\n    finished.resolve()\n  })\n\n  // Create a writable stream that will write to the response.\n  return new WritableStream<Uint8Array>({\n    write: async (chunk) => {\n      // You'd think we'd want to use `start` instead of placing this in `write`\n      // but this ensures that we don't actually flush the headers until we've\n      // started writing chunks.\n      if (!started) {\n        started = true\n\n        if (HAS_CLIENT_COMPONENT_METRICS_ENABLED) {\n          const metrics = getClientComponentLoaderMetrics()\n          if (metrics) {\n            performance.measure(\n              `${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-client-component-loading`,\n              {\n                start: metrics.clientComponentLoadStart,\n                end:\n                  metrics.clientComponentLoadStart +\n                  metrics.clientComponentLoadTimes,\n              }\n            )\n          }\n        }\n\n        res.flushHeaders()\n        getTracer().trace(\n          NextNodeServerSpan.startResponse,\n          {\n            spanName: 'start response',\n          },\n          () => undefined\n        )\n      }\n\n      try {\n        const ok = res.write(chunk)\n\n        // Added by the `compression` middleware, this is a function that will\n        // flush the partially-compressed response to the client.\n        if ('flush' in res && typeof res.flush === 'function') {\n          res.flush()\n        }\n\n        // If the write returns false, it means there's some backpressure, so\n        // wait until it's streamed before continuing.\n        if (!ok) {\n          await drained.promise\n\n          // Reset the drained promise so that we can wait for the next drain event.\n          drained = new DetachedPromise<void>()\n        }\n      } catch (err) {\n        res.end()\n        throw new Error('failed to write chunk to response', { cause: err })\n      }\n    },\n    abort: (err) => {\n      if (res.writableFinished) return\n\n      res.destroy(err)\n    },\n    close: async () => {\n      // if a waitUntil promise was passed, wait for it to resolve before\n      // ending the response.\n      if (waitUntilForEnd) {\n        await waitUntilForEnd\n      }\n\n      if (res.writableFinished) return\n\n      res.end()\n      return finished.promise\n    },\n  })\n}\n\nexport async function pipeToNodeResponse(\n  readable: ReadableStream<Uint8Array>,\n  res: ServerResponse,\n  waitUntilForEnd?: Promise<unknown>\n) {\n  try {\n    // If the response has already errored, then just return now.\n    const { errored, destroyed } = res\n    if (errored || destroyed) return\n\n    // Create a new AbortController so that we can abort the readable if the\n    // client disconnects.\n    const controller = createAbortController(res)\n\n    const writer = createWriterFromResponse(res, waitUntilForEnd)\n\n    await readable.pipeTo(writer, { signal: controller.signal })\n  } catch (err: any) {\n    // If this isn't related to an abort error, re-throw it.\n    if (isAbortError(err)) return\n\n    throw new Error('failed to pipe response', { cause: err })\n  }\n}\n\nexport async function pipeNodeReadableToNodeResponse(\n  readable: Readable,\n  res: ServerResponse,\n  waitUntilForEnd?: Promise<unknown>\n) {\n  try {\n    const { errored, destroyed } = res\n    if (errored || destroyed) return\n\n    let started = false\n\n    const finished = new DetachedPromise<void>()\n\n    res.once('close', () => {\n      readable.destroy()\n      finished.resolve()\n    })\n\n    readable.on('data', (chunk: Buffer) => {\n      if (!started) {\n        started = true\n\n        if (\n          'performance' in globalThis &&\n          process.env.NEXT_OTEL_PERFORMANCE_PREFIX\n        ) {\n          const metrics = getClientComponentLoaderMetrics()\n          if (metrics) {\n            performance.measure(\n              `${process.env.NEXT_OTEL_PERFORMANCE_PREFIX}:next-client-component-loading`,\n              {\n                start: metrics.clientComponentLoadStart,\n                end:\n                  metrics.clientComponentLoadStart +\n                  metrics.clientComponentLoadTimes,\n              }\n            )\n          }\n        }\n\n        res.flushHeaders()\n        getTracer().trace(\n          NextNodeServerSpan.startResponse,\n          {\n            spanName: 'start response',\n          },\n          () => undefined\n        )\n      }\n\n      const ok = res.write(chunk)\n\n      if ('flush' in res && typeof res.flush === 'function') {\n        res.flush()\n      }\n\n      if (!ok) {\n        readable.pause()\n        res.once('drain', () => {\n          readable.resume()\n        })\n      }\n    })\n\n    readable.on('end', async () => {\n      if (waitUntilForEnd) {\n        await waitUntilForEnd\n      }\n\n      if (!res.writableFinished) {\n        res.end()\n      }\n\n      finished.resolve()\n    })\n\n    readable.on('error', (err) => {\n      if (isAbortError(err)) {\n        finished.resolve()\n        return\n      }\n\n      res.destroy(err)\n      finished.resolve()\n    })\n\n    await finished.promise\n  } catch (err: any) {\n    if (isAbortError(err)) return\n\n    throw new Error('failed to pipe response', { cause: err })\n  }\n}\n","import type { OutgoingHttpHeaders, ServerResponse } from 'http'\nimport type { Readable } from 'stream'\nimport type { CacheControl } from './lib/cache-control'\nimport type { FetchMetrics } from './base-http'\nimport type { PrefetchHints } from '../shared/lib/app-router-types'\n\nimport {\n  chainStreams,\n  streamFromBuffer,\n  streamFromString,\n  streamToString,\n} from './stream-utils/node-web-streams-helper'\nimport {\n  isAbortError,\n  pipeToNodeResponse,\n  pipeNodeReadableToNodeResponse,\n} from './pipe-readable'\nimport type { RenderResumeDataCache } from './resume-data-cache/resume-data-cache'\nimport { InvariantError } from '../shared/lib/invariant-error'\nimport type {\n  HTML_CONTENT_TYPE_HEADER,\n  JSON_CONTENT_TYPE_HEADER,\n  TEXT_PLAIN_CONTENT_TYPE_HEADER,\n} from '../lib/constants'\nimport type { RSC_CONTENT_TYPE_HEADER } from '../client/components/app-router-headers'\n\ntype ContentTypeOption =\n  | typeof RSC_CONTENT_TYPE_HEADER // For App Page RSC responses\n  | typeof HTML_CONTENT_TYPE_HEADER // For App Page, Pages HTML responses\n  | typeof JSON_CONTENT_TYPE_HEADER // For API routes, Next.js data requests\n  | typeof TEXT_PLAIN_CONTENT_TYPE_HEADER // For simplified errors\n\nexport type AppPageRenderResultMetadata = {\n  flightData?: Buffer\n  cacheControl?: CacheControl\n  staticBailoutInfo?: {\n    stack?: string\n    description?: string\n  }\n\n  /**\n   * The postponed state if the render had postponed and needs to be resumed.\n   */\n  postponed?: string\n\n  /**\n   * Whether the prerender left any UI pending in a Suspense boundary. This is\n   * reported directly by React's prerender result before Next.js resumes\n   * client-only boundaries.\n   */\n  hasPendingUi?: boolean\n\n  /**\n   * The headers to set on the response that were added by the render.\n   */\n  headers?: OutgoingHttpHeaders\n  statusCode?: number\n  fetchTags?: string\n  fetchMetrics?: FetchMetrics\n\n  segmentData?: Map<string, Buffer>\n\n  /**\n   * Per-route prefetch hints computed at build time (e.g. segment inlining\n   * decisions based on gzip sizes). Written to prefetch-hints.json by the\n   * build pipeline.\n   */\n  prefetchHints?: PrefetchHints\n\n  /**\n   * In development, the resume data cache is warmed up before the render. This\n   * is attached to the metadata so that it can be used during the render. When\n   * prerendering, the filled resume data cache is also attached to the metadata\n   * so that it can be used when prerendering matching fallback shells.\n   */\n  renderResumeDataCache?: RenderResumeDataCache\n}\n\nexport type PagesRenderResultMetadata = {\n  pageData?: any\n  cacheControl?: CacheControl\n  isNotFound?: boolean\n  isRedirect?: boolean\n}\n\nexport type StaticRenderResultMetadata = {}\n\nexport type RenderResultMetadata = AppPageRenderResultMetadata &\n  PagesRenderResultMetadata &\n  StaticRenderResultMetadata\n\nexport type RenderResultResponse =\n  | ReadableStream<Uint8Array>[]\n  | ReadableStream<Uint8Array>\n  | Readable\n  | string\n  | Buffer\n  | null\n\nexport type RenderResultOptions<\n  Metadata extends RenderResultMetadata = RenderResultMetadata,\n> = {\n  contentType: ContentTypeOption | null\n  waitUntil?: Promise<unknown>\n  metadata: Metadata\n}\n\nfunction isNodeReadable(value: unknown): value is Readable {\n  return (\n    value !== null &&\n    typeof value === 'object' &&\n    typeof (value as Record<string, unknown>).pipe === 'function' &&\n    typeof (value as Record<string, unknown>).on === 'function' &&\n    !(value instanceof ReadableStream)\n  )\n}\n\nexport default class RenderResult<\n  Metadata extends RenderResultMetadata = RenderResultMetadata,\n> {\n  /**\n   * The detected content type for the response. This is used to set the\n   * `Content-Type` header.\n   */\n  public readonly contentType: ContentTypeOption | null\n\n  /**\n   * The metadata for the response. This is used to set the revalidation times\n   * and other metadata.\n   */\n  public readonly metadata: Readonly<Metadata>\n\n  /**\n   * The response itself. This can be a string, a stream, or null. If it's a\n   * string, then it's a static response. If it's a stream, then it's a\n   * dynamic response. If it's null, then the response was not found or was\n   * already sent.\n   */\n  private response: RenderResultResponse\n\n  /**\n   * A render result that represents an empty response. This is used to\n   * represent a response that was not found or was already sent.\n   */\n  public static readonly EMPTY = new RenderResult<StaticRenderResultMetadata>(\n    null,\n    { metadata: {}, contentType: null }\n  )\n\n  /**\n   * Creates a new RenderResult instance from a static response.\n   *\n   * @param value the static response value\n   * @param contentType the content type of the response\n   * @returns a new RenderResult instance\n   */\n  public static fromStatic(\n    value: string | Buffer,\n    contentType: ContentTypeOption\n  ) {\n    return new RenderResult<StaticRenderResultMetadata>(value, {\n      metadata: {},\n      contentType,\n    })\n  }\n\n  private readonly waitUntil?: Promise<unknown>\n\n  constructor(\n    response: RenderResultResponse,\n    { contentType, waitUntil, metadata }: RenderResultOptions<Metadata>\n  ) {\n    this.response = response\n    this.contentType = contentType\n    this.metadata = metadata\n    this.waitUntil = waitUntil\n  }\n\n  public assignMetadata(metadata: Metadata) {\n    Object.assign(this.metadata, metadata)\n  }\n\n  /**\n   * Returns true if the response is null. It can be null if the response was\n   * not found or was already sent.\n   */\n  public get isNull(): boolean {\n    return this.response === null\n  }\n\n  /**\n   * Returns false if the response is a string. It can be a string if the page\n   * was prerendered. If it's not, then it was generated dynamically.\n   */\n  public get isDynamic(): boolean {\n    return typeof this.response !== 'string'\n  }\n\n  /**\n   * Returns the response if it is a string. If the page was dynamic, this will\n   * return a promise if the `stream` option is true, or it will throw an error.\n   *\n   * @param stream Whether or not to return a promise if the response is dynamic\n   * @returns The response as a string\n   */\n  public toUnchunkedString(stream?: false): string\n  public toUnchunkedString(stream: true): Promise<string>\n  public toUnchunkedString(stream = false): Promise<string> | string {\n    if (this.response === null) {\n      // If the response is null, return an empty string. This behavior is\n      // intentional as we're now providing the `RenderResult.EMPTY` value.\n      return ''\n    }\n\n    if (typeof this.response !== 'string') {\n      if (!stream) {\n        throw new InvariantError(\n          'dynamic responses cannot be unchunked. This is a bug in Next.js'\n        )\n      }\n\n      return streamToString(this.readable)\n    }\n\n    return this.response\n  }\n\n  /**\n   * Returns a readable stream of the response.\n   */\n  private get readable(): ReadableStream<Uint8Array> {\n    if (this.response === null) {\n      // If the response is null, return an empty stream. This behavior is\n      // intentional as we're now providing the `RenderResult.EMPTY` value.\n      return new ReadableStream<Uint8Array>({\n        start(controller) {\n          controller.close()\n        },\n      })\n    }\n\n    if (typeof this.response === 'string') {\n      return streamFromString(this.response)\n    }\n\n    if (Buffer.isBuffer(this.response)) {\n      return streamFromBuffer(this.response)\n    }\n\n    // If the response is an array of streams, then chain them together.\n    if (Array.isArray(this.response)) {\n      return chainStreams(...this.response)\n    }\n\n    if (isNodeReadable(this.response)) {\n      if (process.env.NEXT_RUNTIME === 'edge') {\n        throw new InvariantError(\n          'Node.js Readable cannot be converted to a web stream in the edge runtime'\n        )\n      } else {\n        let Readable: typeof import('node:stream').Readable\n        if (process.env.TURBOPACK) {\n          Readable = (require('node:stream') as typeof import('node:stream'))\n            .Readable\n        } else {\n          Readable = (\n            __non_webpack_require__(\n              'node:stream'\n            ) as typeof import('node:stream')\n          ).Readable\n        }\n        return Readable.toWeb(this.response) as ReadableStream<Uint8Array>\n      }\n    }\n\n    return this.response\n  }\n\n  /**\n   * Coerces the response to an array of streams. This will convert the response\n   * to an array of streams if it is not already one.\n   *\n   * @returns An array of streams\n   */\n  private coerce(): ReadableStream<Uint8Array>[] {\n    if (this.response === null) {\n      // If the response is null, return an empty stream. This behavior is\n      // intentional as we're now providing the `RenderResult.EMPTY` value.\n      return []\n    }\n\n    if (typeof this.response === 'string') {\n      return [streamFromString(this.response)]\n    } else if (Array.isArray(this.response)) {\n      return this.response\n    } else if (Buffer.isBuffer(this.response)) {\n      return [streamFromBuffer(this.response)]\n    } else if (isNodeReadable(this.response)) {\n      if (process.env.NEXT_RUNTIME === 'edge') {\n        throw new InvariantError(\n          'Node.js Readable cannot be converted to a web stream in the edge runtime'\n        )\n      } else {\n        let Readable: typeof import('node:stream').Readable\n        if (process.env.TURBOPACK) {\n          Readable = (require('node:stream') as typeof import('node:stream'))\n            .Readable\n        } else {\n          Readable = (\n            __non_webpack_require__(\n              'node:stream'\n            ) as typeof import('node:stream')\n          ).Readable\n        }\n        return [Readable.toWeb(this.response) as ReadableStream<Uint8Array>]\n      }\n    } else {\n      return [this.response]\n    }\n  }\n\n  /**\n   * Pipes the response through a transform stream. This converts the response\n   * to a single readable stream (chaining if needed) and pipes it through the\n   * provided transform.\n   *\n   * @param transform The transform stream to pipe through\n   */\n  public pipeThrough(transform: TransformStream<Uint8Array, Uint8Array>): void {\n    this.response = this.readable.pipeThrough(transform)\n  }\n\n  /**\n   * Unshifts a new stream to the response. This will convert the response to an\n   * array of streams if it is not already one and will add the new stream to\n   * the start of the array. When this response is piped, all of the streams\n   * will be piped one after the other.\n   *\n   * @param readable The new stream to unshift\n   */\n  public unshift(readable: ReadableStream<Uint8Array>): void {\n    // Coerce the response to an array of streams.\n    this.response = this.coerce()\n\n    // Add the new stream to the start of the array.\n    this.response.unshift(readable)\n  }\n\n  /**\n   * Chains a new stream to the response. This will convert the response to an\n   * array of streams if it is not already one and will add the new stream to\n   * the end. When this response is piped, all of the streams will be piped\n   * one after the other.\n   *\n   * @param readable The new stream to chain\n   */\n  public push(readable: ReadableStream<Uint8Array>): void {\n    // Coerce the response to an array of streams.\n    this.response = this.coerce()\n\n    // Add the new stream to the end of the array.\n    this.response.push(readable)\n  }\n\n  /**\n   * Pipes the response to a writable stream. This will close/cancel the\n   * writable stream if an error is encountered. If this doesn't throw, then\n   * the writable stream will be closed or aborted.\n   *\n   * @param writable Writable stream to pipe the response to\n   */\n  public async pipeTo(writable: WritableStream<Uint8Array>): Promise<void> {\n    try {\n      await this.readable.pipeTo(writable, {\n        // We want to close the writable stream ourselves so that we can wait\n        // for the waitUntil promise to resolve before closing it. If an error\n        // is encountered, we'll abort the writable stream if we swallowed the\n        // error.\n        preventClose: true,\n      })\n\n      // If there is a waitUntil promise, wait for it to resolve before\n      // closing the writable stream.\n      if (this.waitUntil) await this.waitUntil\n\n      // Close the writable stream.\n      await writable.close()\n    } catch (err) {\n      // If this is an abort error, we should abort the writable stream (as we\n      // took ownership of it when we started piping). We don't need to re-throw\n      // because we handled the error.\n      if (isAbortError(err)) {\n        // Abort the writable stream if an error is encountered.\n        await writable.abort(err)\n\n        return\n      }\n\n      // We're not aborting the writer here as when this method throws it's not\n      // clear as to how so the caller should assume it's their responsibility\n      // to clean up the writer.\n      throw err\n    }\n  }\n\n  /**\n   * Pipes the response to a node response. This will close/cancel the node\n   * response if an error is encountered.\n   *\n   * @param res\n   */\n  public async pipeToNodeResponse(res: ServerResponse) {\n    if (\n      this.response !== null &&\n      typeof this.response !== 'string' &&\n      !Buffer.isBuffer(this.response) &&\n      !Array.isArray(this.response) &&\n      isNodeReadable(this.response)\n    ) {\n      await pipeNodeReadableToNodeResponse(this.response, res, this.waitUntil)\n      return\n    }\n    await pipeToNodeResponse(this.readable, res, this.waitUntil)\n  }\n}\n","import {\n  CachedRouteKind,\n  IncrementalCacheKind,\n  type CachedAppPageValue,\n  type CachedPageValue,\n  type IncrementalResponseCacheEntry,\n  type ResponseCacheEntry,\n} from './types'\n\nimport RenderResult from '../render-result'\nimport { RouteKind } from '../route-kind'\nimport { HTML_CONTENT_TYPE_HEADER } from '../../lib/constants'\n\nexport async function fromResponseCacheEntry(\n  cacheEntry: ResponseCacheEntry\n): Promise<IncrementalResponseCacheEntry> {\n  return {\n    ...cacheEntry,\n    value:\n      cacheEntry.value?.kind === CachedRouteKind.PAGES\n        ? {\n            kind: CachedRouteKind.PAGES,\n            html: await cacheEntry.value.html.toUnchunkedString(true),\n            pageData: cacheEntry.value.pageData,\n            headers: cacheEntry.value.headers,\n            status: cacheEntry.value.status,\n          }\n        : cacheEntry.value?.kind === CachedRouteKind.APP_PAGE\n          ? {\n              kind: CachedRouteKind.APP_PAGE,\n              html: await cacheEntry.value.html.toUnchunkedString(true),\n              postponed: cacheEntry.value.postponed,\n              rscData: cacheEntry.value.rscData,\n              headers: cacheEntry.value.headers,\n              status: cacheEntry.value.status,\n              segmentData: cacheEntry.value.segmentData,\n            }\n          : cacheEntry.value,\n  }\n}\n\nexport async function toResponseCacheEntry(\n  response: IncrementalResponseCacheEntry | null\n): Promise<ResponseCacheEntry | null> {\n  if (!response) return null\n\n  return {\n    isMiss: response.isMiss,\n    isStale: response.isStale,\n    cacheControl: response.cacheControl,\n    isFallback: response.isFallback,\n    value:\n      response.value?.kind === CachedRouteKind.PAGES\n        ? ({\n            kind: CachedRouteKind.PAGES,\n            html: RenderResult.fromStatic(\n              response.value.html,\n              HTML_CONTENT_TYPE_HEADER\n            ),\n            pageData: response.value.pageData,\n            headers: response.value.headers,\n            status: response.value.status,\n          } satisfies CachedPageValue)\n        : response.value?.kind === CachedRouteKind.APP_PAGE\n          ? ({\n              kind: CachedRouteKind.APP_PAGE,\n              html: RenderResult.fromStatic(\n                response.value.html,\n                HTML_CONTENT_TYPE_HEADER\n              ),\n              rscData: response.value.rscData,\n              headers: response.value.headers,\n              status: response.value.status,\n              postponed: response.value.postponed,\n              segmentData: response.value.segmentData,\n            } satisfies CachedAppPageValue)\n          : response.value,\n  }\n}\n\nexport function routeKindToIncrementalCacheKind(\n  routeKind: RouteKind\n): Exclude<IncrementalCacheKind, IncrementalCacheKind.FETCH> {\n  switch (routeKind) {\n    case RouteKind.PAGES:\n      return IncrementalCacheKind.PAGES\n    case RouteKind.APP_PAGE:\n      return IncrementalCacheKind.APP_PAGE\n    case RouteKind.IMAGE:\n      return IncrementalCacheKind.IMAGE\n    case RouteKind.APP_ROUTE:\n      return IncrementalCacheKind.APP_ROUTE\n    case RouteKind.PAGES_API:\n      // Pages Router API routes are not cached in the incremental cache.\n      throw new Error(`Unexpected route kind ${routeKind}`)\n    default:\n      return routeKind satisfies never\n  }\n}\n","import type {\n  ResponseCacheEntry,\n  ResponseGenerator,\n  ResponseCacheBase,\n  IncrementalResponseCacheEntry,\n  IncrementalResponseCache,\n} from './types'\n\nimport { Batcher } from '../../lib/batcher'\nimport { LRUCache } from '../lib/lru-cache'\nimport { warnOnce } from '../../build/output/log'\nimport { scheduleOnNextTick } from '../../lib/scheduler'\nimport {\n  fromResponseCacheEntry,\n  routeKindToIncrementalCacheKind,\n  toResponseCacheEntry,\n} from './utils'\nimport type { RouteKind } from '../route-kind'\n\n/**\n * Parses an environment variable as a positive integer, returning the fallback\n * if the value is missing, not a number, or not positive.\n */\nfunction parsePositiveInt(\n  envValue: string | undefined,\n  fallback: number\n): number {\n  if (!envValue) return fallback\n  const parsed = parseInt(envValue, 10)\n  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback\n}\n\n/**\n * Default TTL (in milliseconds) for minimal mode response cache entries.\n * Used for cache hit validation as a fallback for providers that don't\n * send the x-invocation-id header yet.\n *\n * 10 seconds chosen because:\n * - Long enough to dedupe rapid successive requests (e.g., page + data)\n * - Short enough to not serve stale data across unrelated requests\n *\n * Can be configured via `NEXT_PRIVATE_RESPONSE_CACHE_TTL` environment variable.\n */\nconst DEFAULT_TTL_MS = parsePositiveInt(\n  process.env.NEXT_PRIVATE_RESPONSE_CACHE_TTL,\n  10_000\n)\n\n/**\n * Default maximum number of entries in the response cache.\n * Can be configured via `NEXT_PRIVATE_RESPONSE_CACHE_MAX_SIZE` environment variable.\n */\nconst DEFAULT_MAX_SIZE = parsePositiveInt(\n  process.env.NEXT_PRIVATE_RESPONSE_CACHE_MAX_SIZE,\n  150\n)\n\n/**\n * Separator used in compound cache keys to join pathname and invocationID.\n * Using null byte (\\0) since it cannot appear in valid URL paths or UUIDs.\n */\nconst KEY_SEPARATOR = '\\0'\n\n/**\n * Sentinel value used for TTL-based cache entries (when invocationID is undefined).\n * Chosen to be a clearly reserved marker for internal cache keys.\n */\nconst TTL_SENTINEL = '__ttl_sentinel__'\n\n/**\n * Entry stored in the LRU cache.\n */\ntype CacheEntry = {\n  entry: IncrementalResponseCacheEntry | null\n  /**\n   * TTL expiration timestamp in milliseconds. Used as a fallback for\n   * cache hit validation when providers don't send x-invocation-id.\n   * Memory pressure is managed by LRU eviction rather than timers.\n   */\n  expiresAt: number\n}\n\n/**\n * Creates a compound cache key from pathname and invocationID.\n */\nfunction createCacheKey(\n  pathname: string,\n  invocationID: string | undefined\n): string {\n  return `${pathname}${KEY_SEPARATOR}${invocationID ?? TTL_SENTINEL}`\n}\n\n/**\n * Extracts the invocationID from a compound cache key.\n * Returns undefined if the key used TTL_SENTINEL.\n */\nfunction extractInvocationID(compoundKey: string): string | undefined {\n  const separatorIndex = compoundKey.lastIndexOf(KEY_SEPARATOR)\n  if (separatorIndex === -1) return undefined\n\n  const invocationID = compoundKey.slice(separatorIndex + 1)\n  return invocationID === TTL_SENTINEL ? undefined : invocationID\n}\n\nexport * from './types'\n\nexport default class ResponseCache implements ResponseCacheBase {\n  private readonly getBatcher = Batcher.create<\n    { key: string; isOnDemandRevalidate: boolean },\n    IncrementalResponseCacheEntry | null,\n    string\n  >({\n    // Ensure on-demand revalidate doesn't block normal requests, it should be\n    // safe to run an on-demand revalidate for the same key as a normal request.\n    cacheKeyFn: ({ key, isOnDemandRevalidate }) =>\n      `${key}-${isOnDemandRevalidate ? '1' : '0'}`,\n    // We wait to do any async work until after we've added our promise to\n    // `pendingResponses` to ensure that any any other calls will reuse the\n    // same promise until we've fully finished our work.\n    schedulerFn: scheduleOnNextTick,\n  })\n\n  private readonly revalidateBatcher = Batcher.create<\n    string,\n    IncrementalResponseCacheEntry | null\n  >({\n    // We wait to do any async work until after we've added our promise to\n    // `pendingResponses` to ensure that any any other calls will reuse the\n    // same promise until we've fully finished our work.\n    schedulerFn: scheduleOnNextTick,\n  })\n\n  /**\n   * LRU cache for minimal mode using compound keys (pathname + invocationID).\n   * This allows multiple invocations to cache the same pathname without\n   * overwriting each other's entries.\n   */\n  private readonly cache: LRUCache<CacheEntry>\n\n  /**\n   * Set of invocation IDs that have had cache entries evicted.\n   * Used to detect when the cache size may be too small.\n   * Bounded to prevent memory growth.\n   */\n  private readonly evictedInvocationIDs: Set<string> = new Set()\n\n  /**\n   * The configured max size, stored for logging.\n   */\n  private readonly maxSize: number\n\n  /**\n   * The configured TTL for cache entries in milliseconds.\n   */\n  private readonly ttl: number\n\n  // we don't use minimal_mode name here as this.minimal_mode is\n  // statically replace for server runtimes but we need it to\n  // be dynamic here\n  private minimal_mode?: boolean\n\n  constructor(\n    minimal_mode: boolean,\n    maxSize: number = DEFAULT_MAX_SIZE,\n    ttl: number = DEFAULT_TTL_MS\n  ) {\n    this.minimal_mode = minimal_mode\n    this.maxSize = maxSize\n    this.ttl = ttl\n\n    // Create the LRU cache with eviction tracking\n    this.cache = new LRUCache(maxSize, undefined, (compoundKey) => {\n      const invocationID = extractInvocationID(compoundKey)\n      if (invocationID) {\n        // Bound to 100 entries to prevent unbounded memory growth.\n        // FIFO eviction is acceptable here because:\n        // 1. Invocations are short-lived (single request lifecycle), so older\n        //    invocations are unlikely to still be active after 100 newer ones\n        // 2. This warning mechanism is best-effort for developer guidance—\n        //    missing occasional eviction warnings doesn't affect correctness\n        // 3. If a long-running invocation is somehow evicted and then has\n        //    another cache entry evicted, it will simply be re-added\n        if (this.evictedInvocationIDs.size >= 100) {\n          const first = this.evictedInvocationIDs.values().next().value\n          if (first) this.evictedInvocationIDs.delete(first)\n        }\n        this.evictedInvocationIDs.add(invocationID)\n      }\n    })\n  }\n\n  /**\n   * Gets the response cache entry for the given key.\n   *\n   * @param key - The key to get the response cache entry for.\n   * @param responseGenerator - The response generator to use to generate the response cache entry.\n   * @param context - The context for the get request.\n   * @returns The response cache entry.\n   */\n  public async get(\n    key: string | null,\n    responseGenerator: ResponseGenerator,\n    context: {\n      routeKind: RouteKind\n      isOnDemandRevalidate?: boolean\n      isPrefetch?: boolean\n      incrementalCache: IncrementalResponseCache\n      isRoutePPREnabled?: boolean\n      isFallback?: boolean\n      waitUntil?: (prom: Promise<any>) => void\n\n      /**\n       * The invocation ID from the infrastructure. Used to scope the\n       * in-memory cache to a single revalidation request in minimal mode.\n       */\n      invocationID?: string\n    }\n  ): Promise<ResponseCacheEntry | null> {\n    // If there is no key for the cache, we can't possibly look this up in the\n    // cache so just return the result of the response generator.\n    if (!key) {\n      return responseGenerator({\n        hasResolved: false,\n        previousCacheEntry: null,\n      })\n    }\n\n    // Check minimal mode cache before doing any other work.\n    if (this.minimal_mode) {\n      const cacheKey = createCacheKey(key, context.invocationID)\n      const cachedItem = this.cache.get(cacheKey)\n\n      if (cachedItem) {\n        // With invocationID: exact match found - always a hit\n        // With TTL mode: must check expiration\n        if (context.invocationID !== undefined) {\n          return toResponseCacheEntry(cachedItem.entry)\n        }\n\n        // TTL mode: check expiration\n        const now = Date.now()\n        if (cachedItem.expiresAt > now) {\n          return toResponseCacheEntry(cachedItem.entry)\n        }\n\n        // TTL expired - clean up\n        this.cache.remove(cacheKey)\n      }\n\n      // Warn if this invocation had entries evicted - indicates cache may be too small.\n      if (\n        context.invocationID &&\n        this.evictedInvocationIDs.has(context.invocationID)\n      ) {\n        warnOnce(\n          `Response cache entry was evicted for invocation ${context.invocationID}. ` +\n            `Consider increasing NEXT_PRIVATE_RESPONSE_CACHE_MAX_SIZE (current: ${this.maxSize}).`\n        )\n      }\n    }\n\n    const {\n      incrementalCache,\n      isOnDemandRevalidate = false,\n      isFallback = false,\n      isRoutePPREnabled = false,\n      isPrefetch = false,\n      waitUntil,\n      routeKind,\n      invocationID,\n    } = context\n\n    const response = await this.getBatcher.batch(\n      { key, isOnDemandRevalidate },\n      ({ resolve }) => {\n        const promise = this.handleGet(\n          key,\n          responseGenerator,\n          {\n            incrementalCache,\n            isOnDemandRevalidate,\n            isFallback,\n            isRoutePPREnabled,\n            isPrefetch,\n            routeKind,\n            invocationID,\n          },\n          resolve\n        )\n\n        // We need to ensure background revalidates are passed to waitUntil.\n        if (waitUntil) waitUntil(promise)\n\n        return promise\n      }\n    )\n\n    if (this.minimal_mode && response?.cacheControl) {\n      const cacheKey = createCacheKey(key, invocationID)\n      this.cache.set(cacheKey, {\n        entry: response,\n        expiresAt: Date.now() + this.ttl,\n      })\n    }\n\n    return toResponseCacheEntry(response)\n  }\n\n  /**\n   * Handles the get request for the response cache.\n   *\n   * @param key - The key to get the response cache entry for.\n   * @param responseGenerator - The response generator to use to generate the response cache entry.\n   * @param context - The context for the get request.\n   * @param resolve - The resolve function to use to resolve the response cache entry.\n   * @returns The response cache entry.\n   */\n  private async handleGet(\n    key: string,\n    responseGenerator: ResponseGenerator,\n    context: {\n      incrementalCache: IncrementalResponseCache\n      isOnDemandRevalidate: boolean\n      isFallback: boolean\n      isRoutePPREnabled: boolean\n      isPrefetch: boolean\n      routeKind: RouteKind\n      invocationID: string | undefined\n    },\n    resolve: (value: IncrementalResponseCacheEntry | null) => void\n  ): Promise<IncrementalResponseCacheEntry | null> {\n    let previousIncrementalCacheEntry: IncrementalResponseCacheEntry | null =\n      null\n    let resolved = false\n\n    try {\n      // Get the previous cache entry if not in minimal mode\n      previousIncrementalCacheEntry = !this.minimal_mode\n        ? await context.incrementalCache.get(key, {\n            kind: routeKindToIncrementalCacheKind(context.routeKind),\n            isRoutePPREnabled: context.isRoutePPREnabled,\n            isFallback: context.isFallback,\n          })\n        : null\n\n      // `isStale === -1` signals that the entry is past its `expire` (either\n      // via an expired tag or, with `cacheLife({ expire })`, past the route's\n      // expire time in the prerender manifest). In that case we must NOT\n      // early-resolve with the stale value — instead we fall through to a\n      // blocking revalidation so the response returned to the user is fresh.\n      if (\n        previousIncrementalCacheEntry &&\n        !context.isOnDemandRevalidate &&\n        previousIncrementalCacheEntry.isStale !== -1\n      ) {\n        resolve(previousIncrementalCacheEntry)\n        resolved = true\n\n        if (!previousIncrementalCacheEntry.isStale || context.isPrefetch) {\n          // The cached value is still valid, so we don't need to update it yet.\n          return previousIncrementalCacheEntry\n        }\n      }\n\n      // Revalidate the cache entry.\n      //\n      // A prefetch request that missed must run its own response generator\n      // rather than joining an in-flight revalidation through the batcher. A\n      // background revalidation may be regenerating the concrete (non-fallback)\n      // entry for this route — e.g. an ISR fallback-shell upgrade scheduled by\n      // an earlier prefetch sub-request. Joining it would serve that concrete\n      // result to the prefetch instead of the fallback shell, and which segment\n      // wins would depend purely on request timing. Running the generator\n      // directly lets every prefetch segment take the same fallback-shell path,\n      // independent of any concurrent background upgrade.\n      const incrementalResponseCacheEntry =\n        context.isPrefetch && previousIncrementalCacheEntry === null\n          ? await this.handleRevalidate(\n              key,\n              context.incrementalCache,\n              context.isRoutePPREnabled,\n              context.isFallback,\n              responseGenerator,\n              previousIncrementalCacheEntry,\n              resolved\n            )\n          : await this.revalidate(\n              key,\n              context.incrementalCache,\n              context.isRoutePPREnabled,\n              context.isFallback,\n              responseGenerator,\n              previousIncrementalCacheEntry,\n              resolved\n            )\n\n      // Handle null response\n      if (!incrementalResponseCacheEntry) {\n        // Remove the cache item if it was set so we don't use it again.\n        if (this.minimal_mode) {\n          const cacheKey = createCacheKey(key, context.invocationID)\n          this.cache.remove(cacheKey)\n        }\n        return null\n      }\n\n      // Resolve for on-demand revalidation or if not already resolved\n      if (context.isOnDemandRevalidate && !resolved) {\n        return incrementalResponseCacheEntry\n      }\n\n      return incrementalResponseCacheEntry\n    } catch (err) {\n      // If we've already resolved the cache entry, we can't reject as we\n      // already resolved the cache entry so log the error here.\n      if (resolved) {\n        console.error(err)\n        return null\n      }\n\n      throw err\n    }\n  }\n\n  /**\n   * Revalidates the cache entry for the given key.\n   *\n   * @param key - The key to revalidate the cache entry for.\n   * @param incrementalCache - The incremental cache to use to revalidate the cache entry.\n   * @param isRoutePPREnabled - Whether the route is PPR enabled.\n   * @param isFallback - Whether the route is a fallback.\n   * @param responseGenerator - The response generator to use to generate the response cache entry.\n   * @param previousIncrementalCacheEntry - The previous cache entry to use to revalidate the cache entry.\n   * @param hasResolved - Whether the response has been resolved.\n   * @param waitUntil - Optional function to register background work.\n   * @param invocationID - The invocation ID for cache key scoping.\n   * @returns The revalidated cache entry.\n   */\n  public async revalidate(\n    key: string,\n    incrementalCache: IncrementalResponseCache,\n    isRoutePPREnabled: boolean,\n    isFallback: boolean,\n    responseGenerator: ResponseGenerator,\n    previousIncrementalCacheEntry: IncrementalResponseCacheEntry | null,\n    hasResolved: boolean,\n    waitUntil?: (prom: Promise<any>) => void\n  ) {\n    return this.revalidateBatcher.batch(key, () => {\n      const promise = this.handleRevalidate(\n        key,\n        incrementalCache,\n        isRoutePPREnabled,\n        isFallback,\n        responseGenerator,\n        previousIncrementalCacheEntry,\n        hasResolved\n      )\n\n      // We need to ensure background revalidates are passed to waitUntil.\n      if (waitUntil) waitUntil(promise)\n\n      return promise\n    })\n  }\n\n  private async handleRevalidate(\n    key: string,\n    incrementalCache: IncrementalResponseCache,\n    isRoutePPREnabled: boolean,\n    isFallback: boolean,\n    responseGenerator: ResponseGenerator,\n    previousIncrementalCacheEntry: IncrementalResponseCacheEntry | null,\n    hasResolved: boolean\n  ) {\n    try {\n      // Generate the response cache entry using the response generator.\n      const responseCacheEntry = await responseGenerator({\n        hasResolved,\n        previousCacheEntry: previousIncrementalCacheEntry,\n        isRevalidating: true,\n      })\n      if (!responseCacheEntry) {\n        return null\n      }\n\n      // Convert the response cache entry to an incremental response cache entry.\n      const incrementalResponseCacheEntry = await fromResponseCacheEntry({\n        ...responseCacheEntry,\n        isMiss: !previousIncrementalCacheEntry,\n      })\n\n      // We want to persist the result only if it has a cache control value\n      // defined. The minimal mode LRU write is handled in get() so that\n      // every caller — including batched invocations — populates the cache.\n      if (incrementalResponseCacheEntry.cacheControl && !this.minimal_mode) {\n        await incrementalCache.set(key, incrementalResponseCacheEntry.value, {\n          cacheControl: incrementalResponseCacheEntry.cacheControl,\n          isRoutePPREnabled,\n          isFallback,\n        })\n      }\n\n      return incrementalResponseCacheEntry\n    } catch (err) {\n      // When a path is erroring we automatically re-set the existing cache\n      // with new revalidate and expire times to prevent non-stop retrying.\n      if (previousIncrementalCacheEntry?.cacheControl) {\n        const revalidate = Math.min(\n          Math.max(\n            previousIncrementalCacheEntry.cacheControl.revalidate || 3,\n            3\n          ),\n          30\n        )\n        const expire =\n          previousIncrementalCacheEntry.cacheControl.expire === undefined\n            ? undefined\n            : Math.max(\n                revalidate + 3,\n                previousIncrementalCacheEntry.cacheControl.expire\n              )\n\n        await incrementalCache.set(key, previousIncrementalCacheEntry.value, {\n          cacheControl: { revalidate: revalidate, expire: expire },\n          isRoutePPREnabled,\n          isFallback,\n        })\n      }\n\n      // We haven't resolved yet, so let's throw to indicate an error.\n      throw err\n    }\n  }\n}\n","import path from '../shared/lib/isomorphic/path'\nimport type { CacheFs } from '../shared/lib/utils'\n\n/**\n * A task to be written.\n */\ntype Task = [\n  /**\n   * The directory to create.\n   */\n  directory: string,\n\n  /**\n   * The promise to create the directory.\n   */\n  mkdir: Promise<unknown>,\n\n  /**\n   * The promises to write the files that are dependent on the directory being\n   * created.\n   */\n  writeFile: Promise<unknown>[],\n]\n/**\n * MultiFileWriter is a utility for writing multiple files in parallel that\n * guarantees that all files will be written after their containing directory\n * is created, and that the directory will only be created once.\n */\nexport class MultiFileWriter {\n  /**\n   * The tasks to be written.\n   */\n  private readonly tasks: Task[] = []\n\n  constructor(\n    /**\n     * The file system methods to use.\n     */\n    private readonly fs: Pick<CacheFs, 'mkdir' | 'writeFile'>\n  ) {}\n\n  /**\n   * Finds or creates a task for a directory.\n   *\n   * @param directory - The directory to find or create a task for.\n   * @returns The task for the directory.\n   */\n  private findOrCreateTask(directory: string): Task {\n    // See if this directory already has a task to create it.\n    for (const task of this.tasks) {\n      if (task[0] === directory) {\n        return task\n      }\n    }\n\n    const promise = this.fs.mkdir(directory)\n\n    // Attach a catch handler so that it doesn't throw an unhandled promise\n    // rejection warning.\n    promise.catch(() => {})\n\n    // Otherwise, create a new task for this directory.\n    const task: Task = [directory, promise, []]\n    this.tasks.push(task)\n\n    return task\n  }\n\n  /**\n   * Appends a file to the writer to be written after its containing directory\n   * is created. The file writer should be awaited after all the files have been\n   * appended. Any async operation that occurs between appending and awaiting\n   * may cause an unhandled promise rejection warning and potentially crash the\n   * process.\n   *\n   * @param filePath - The path to the file to write.\n   * @param data - The data to write to the file.\n   */\n  public append(filePath: string, data: Buffer | string): void {\n    // Find or create a task for the directory that contains the file.\n    const task = this.findOrCreateTask(path.dirname(filePath))\n\n    const promise = task[1].then(() => this.fs.writeFile(filePath, data))\n\n    // Attach a catch handler so that it doesn't throw an unhandled promise\n    // rejection warning.\n    promise.catch(() => {})\n\n    // Add the file write to the task AFTER the directory promise has resolved.\n    task[2].push(promise)\n  }\n\n  /**\n   * Returns a promise that resolves when all the files have been written.\n   */\n  public wait(): Promise<unknown> {\n    return Promise.all(this.tasks.flatMap((task) => task[2]))\n  }\n}\n","import type { RouteMetadata } from '../../../export/routes/types'\nimport type { CacheHandler, CacheHandlerContext, CacheHandlerValue } from '.'\nimport type { CacheFs } from '../../../shared/lib/utils'\nimport type { TagManifestEntry } from './tags-manifest.external'\nimport {\n  CachedRouteKind,\n  IncrementalCacheKind,\n  type CachedFetchValue,\n  type IncrementalCacheValue,\n  type SetIncrementalFetchCacheContext,\n  type SetIncrementalResponseCacheContext,\n} from '../../response-cache'\n\nimport type { LRUCache } from '../lru-cache'\nimport path from '../../../shared/lib/isomorphic/path'\nimport {\n  NEXT_CACHE_TAGS_HEADER,\n  NEXT_DATA_SUFFIX,\n  NEXT_META_SUFFIX,\n  RSC_SEGMENT_SUFFIX,\n  RSC_SEGMENTS_DIR_SUFFIX,\n  RSC_SUFFIX,\n} from '../../../lib/constants'\nimport { areTagsExpired, tagsManifest } from './tags-manifest.external'\nimport { MultiFileWriter } from '../../../lib/multi-file-writer'\nimport { getMemoryCache } from './memory-cache.external'\n\ntype FileSystemCacheContext = Omit<\n  CacheHandlerContext,\n  'fs' | 'serverDistDir'\n> & {\n  fs: CacheFs\n  serverDistDir: string\n}\n\nexport default class FileSystemCache implements CacheHandler {\n  private fs: FileSystemCacheContext['fs']\n  private flushToDisk?: FileSystemCacheContext['flushToDisk']\n  private serverDistDir: FileSystemCacheContext['serverDistDir']\n  private revalidatedTags: string[]\n  private static debug: boolean = !!process.env.NEXT_PRIVATE_DEBUG_CACHE\n  private static memoryCache: LRUCache<CacheHandlerValue> | undefined\n\n  constructor(ctx: FileSystemCacheContext) {\n    this.fs = ctx.fs\n    this.flushToDisk = ctx.flushToDisk\n    this.serverDistDir = ctx.serverDistDir\n    this.revalidatedTags = ctx.revalidatedTags\n\n    if (ctx.maxMemoryCacheSize) {\n      if (!FileSystemCache.memoryCache) {\n        if (FileSystemCache.debug) {\n          console.log('FileSystemCache: using memory store for fetch cache')\n        }\n\n        FileSystemCache.memoryCache = getMemoryCache(ctx.maxMemoryCacheSize)\n      } else if (FileSystemCache.debug) {\n        console.log('FileSystemCache: memory store already initialized')\n      }\n    } else if (FileSystemCache.debug) {\n      console.log('FileSystemCache: not using memory store for fetch cache')\n    }\n  }\n\n  public resetRequestCache(): void {}\n\n  public async revalidateTag(\n    tags: string | string[],\n    durations?: { expire?: number }\n  ) {\n    tags = typeof tags === 'string' ? [tags] : tags\n\n    if (FileSystemCache.debug) {\n      console.log('FileSystemCache: revalidateTag', tags, durations)\n    }\n\n    if (tags.length === 0) {\n      return\n    }\n\n    const now = Date.now()\n\n    for (const tag of tags) {\n      const existingEntry = tagsManifest.get(tag) || {}\n\n      if (durations) {\n        // Use provided durations directly\n        const updates: TagManifestEntry = { ...existingEntry }\n\n        // mark as stale immediately\n        updates.stale = now\n\n        if (durations.expire !== undefined) {\n          updates.expired = now + durations.expire * 1000 // Convert seconds to ms\n        }\n\n        tagsManifest.set(tag, updates)\n      } else {\n        // Update expired field for immediate expiration (default behavior when no durations provided)\n        tagsManifest.set(tag, { ...existingEntry, expired: now })\n      }\n    }\n  }\n\n  public async get(...args: Parameters<CacheHandler['get']>) {\n    const [key, ctx] = args\n    const { kind } = ctx\n\n    let data = FileSystemCache.memoryCache?.get(key)\n\n    if (FileSystemCache.debug) {\n      if (kind === IncrementalCacheKind.FETCH) {\n        console.log('FileSystemCache: get', key, ctx.tags, kind, !!data)\n      } else {\n        console.log('FileSystemCache: get', key, kind, !!data)\n      }\n    }\n\n    // let's check the disk for seed data\n    if (!data && process.env.NEXT_RUNTIME !== 'edge') {\n      try {\n        if (kind === IncrementalCacheKind.APP_ROUTE) {\n          const filePath = this.getFilePath(\n            `${key}.body`,\n            IncrementalCacheKind.APP_ROUTE\n          )\n          const fileData = await this.fs.readFile(filePath)\n          const { mtime } = await this.fs.stat(filePath)\n\n          const meta = JSON.parse(\n            await this.fs.readFile(\n              filePath.replace(/\\.body$/, NEXT_META_SUFFIX),\n              'utf8'\n            )\n          )\n\n          data = {\n            lastModified: mtime.getTime(),\n            value: {\n              kind: CachedRouteKind.APP_ROUTE,\n              body: fileData,\n              headers: meta.headers,\n              status: meta.status,\n            },\n          }\n        } else {\n          const filePath = this.getFilePath(\n            kind === IncrementalCacheKind.FETCH ? key : `${key}.html`,\n            kind\n          )\n\n          const fileData = await this.fs.readFile(filePath, 'utf8')\n          const { mtime } = await this.fs.stat(filePath)\n\n          if (kind === IncrementalCacheKind.FETCH) {\n            const { tags, fetchIdx, fetchUrl } = ctx\n\n            if (!this.flushToDisk) return null\n\n            const lastModified = mtime.getTime()\n            const parsedData: CachedFetchValue = JSON.parse(fileData)\n            data = {\n              lastModified,\n              value: parsedData,\n            }\n\n            if (data.value?.kind === CachedRouteKind.FETCH) {\n              const storedTags = data.value?.tags\n\n              // update stored tags if a new one is being added\n              // TODO: remove this when we can send the tags\n              // via header on GET same as SET\n              if (!tags?.every((tag) => storedTags?.includes(tag))) {\n                if (FileSystemCache.debug) {\n                  console.log(\n                    'FileSystemCache: tags vs storedTags mismatch',\n                    tags,\n                    storedTags\n                  )\n                }\n                await this.set(key, data.value, {\n                  fetchCache: true,\n                  tags,\n                  fetchIdx,\n                  fetchUrl,\n                })\n              }\n            }\n          } else if (kind === IncrementalCacheKind.APP_PAGE) {\n            // We try to load the metadata file, but if it fails, we don't\n            // error. We also don't load it if this is a fallback.\n            let meta: RouteMetadata | undefined\n            try {\n              meta = JSON.parse(\n                await this.fs.readFile(\n                  filePath.replace(/\\.html$/, NEXT_META_SUFFIX),\n                  'utf8'\n                )\n              )\n            } catch {}\n\n            let maybeSegmentData: Map<string, Buffer> | undefined\n            if (meta?.segmentPaths) {\n              // Collect all the segment data for this page.\n              // TODO: To optimize file system reads, we should consider creating\n              // separate cache entries for each segment, rather than storing them\n              // all on the page's entry. Though the behavior is\n              // identical regardless.\n              const segmentData: Map<string, Buffer> = new Map()\n              maybeSegmentData = segmentData\n              const segmentsDir = key + RSC_SEGMENTS_DIR_SUFFIX\n              await Promise.all(\n                meta.segmentPaths.map(async (segmentPath: string) => {\n                  const segmentDataFilePath = this.getFilePath(\n                    segmentsDir + segmentPath + RSC_SEGMENT_SUFFIX,\n                    IncrementalCacheKind.APP_PAGE\n                  )\n                  try {\n                    segmentData.set(\n                      segmentPath,\n                      await this.fs.readFile(segmentDataFilePath)\n                    )\n                  } catch {\n                    // This shouldn't happen, but if for some reason we fail to\n                    // load a segment from the filesystem, treat it the same as if\n                    // the segment is dynamic and does not have a prefetch.\n                  }\n                })\n              )\n            }\n\n            let rscData: Buffer | undefined\n            if (\n              !ctx.isFallback &&\n              (!ctx.isRoutePPREnabled || meta?.postponed == null)\n            ) {\n              rscData = await this.fs.readFile(\n                this.getFilePath(\n                  `${key}${RSC_SUFFIX}`,\n                  IncrementalCacheKind.APP_PAGE\n                )\n              )\n            }\n\n            data = {\n              lastModified: mtime.getTime(),\n              value: {\n                kind: CachedRouteKind.APP_PAGE,\n                html: fileData,\n                rscData,\n                postponed: meta?.postponed,\n                headers: meta?.headers,\n                status: meta?.status,\n                segmentData: maybeSegmentData,\n              },\n            }\n          } else if (kind === IncrementalCacheKind.PAGES) {\n            let meta: RouteMetadata | undefined\n            let pageData: string | object = {}\n\n            if (!ctx.isFallback) {\n              pageData = JSON.parse(\n                await this.fs.readFile(\n                  this.getFilePath(\n                    `${key}${NEXT_DATA_SUFFIX}`,\n                    IncrementalCacheKind.PAGES\n                  ),\n                  'utf8'\n                )\n              )\n            }\n\n            data = {\n              lastModified: mtime.getTime(),\n              value: {\n                kind: CachedRouteKind.PAGES,\n                html: fileData,\n                pageData,\n                headers: meta?.headers,\n                status: meta?.status,\n              },\n            }\n          } else {\n            throw new Error(\n              `Invariant: Unexpected route kind ${kind} in file system cache.`\n            )\n          }\n        }\n\n        if (data) {\n          FileSystemCache.memoryCache?.set(key, data)\n        }\n      } catch {\n        return null\n      }\n    }\n\n    if (\n      data?.value?.kind === CachedRouteKind.APP_PAGE ||\n      data?.value?.kind === CachedRouteKind.APP_ROUTE ||\n      data?.value?.kind === CachedRouteKind.PAGES\n    ) {\n      const tagsHeader = data.value.headers?.[NEXT_CACHE_TAGS_HEADER]\n      if (typeof tagsHeader === 'string') {\n        const cacheTags = tagsHeader.split(',')\n\n        // we trigger a blocking validation if an ISR page\n        // had a tag revalidated, if we want to be a background\n        // revalidation instead we return data.lastModified = -1\n        if (\n          cacheTags.length > 0 &&\n          areTagsExpired(cacheTags, data.lastModified)\n        ) {\n          if (FileSystemCache.debug) {\n            console.log('FileSystemCache: expired tags', cacheTags)\n          }\n\n          return null\n        }\n      }\n    } else if (data?.value?.kind === CachedRouteKind.FETCH) {\n      const combinedTags =\n        ctx.kind === IncrementalCacheKind.FETCH\n          ? [...(ctx.tags || []), ...(ctx.softTags || [])]\n          : []\n\n      // When revalidate tag is called we don't return stale data so it's\n      // updated right away.\n      if (combinedTags.some((tag) => this.revalidatedTags.includes(tag))) {\n        if (FileSystemCache.debug) {\n          console.log('FileSystemCache: was revalidated', combinedTags)\n        }\n\n        return null\n      }\n\n      if (areTagsExpired(combinedTags, data.lastModified)) {\n        if (FileSystemCache.debug) {\n          console.log('FileSystemCache: expired tags', combinedTags)\n        }\n\n        return null\n      }\n    }\n\n    return data ?? null\n  }\n\n  public async set(\n    key: string,\n    data: IncrementalCacheValue | null,\n    ctx: SetIncrementalFetchCacheContext | SetIncrementalResponseCacheContext\n  ) {\n    FileSystemCache.memoryCache?.set(key, {\n      value: data,\n      lastModified: Date.now(),\n    })\n\n    if (FileSystemCache.debug) {\n      console.log('FileSystemCache: set', key)\n    }\n\n    if (!this.flushToDisk || !data) return\n\n    // Create a new writer that will prepare to write all the files to disk\n    // after their containing directory is created.\n    const writer = new MultiFileWriter(this.fs)\n\n    if (data.kind === CachedRouteKind.APP_ROUTE) {\n      const filePath = this.getFilePath(\n        `${key}.body`,\n        IncrementalCacheKind.APP_ROUTE\n      )\n\n      writer.append(filePath, data.body)\n\n      const meta: RouteMetadata = {\n        headers: data.headers,\n        status: data.status,\n        postponed: undefined,\n        segmentPaths: undefined,\n        prefetchHints: undefined,\n      }\n\n      writer.append(\n        filePath.replace(/\\.body$/, NEXT_META_SUFFIX),\n        JSON.stringify(meta, null, 2)\n      )\n    } else if (\n      data.kind === CachedRouteKind.PAGES ||\n      data.kind === CachedRouteKind.APP_PAGE\n    ) {\n      const isAppPath = data.kind === CachedRouteKind.APP_PAGE\n      const htmlPath = this.getFilePath(\n        `${key}.html`,\n        isAppPath ? IncrementalCacheKind.APP_PAGE : IncrementalCacheKind.PAGES\n      )\n\n      writer.append(htmlPath, data.html)\n\n      // Fallbacks don't generate a data file.\n      if (!ctx.fetchCache && !ctx.isFallback && !ctx.isRoutePPREnabled) {\n        writer.append(\n          this.getFilePath(\n            `${key}${isAppPath ? RSC_SUFFIX : NEXT_DATA_SUFFIX}`,\n            isAppPath\n              ? IncrementalCacheKind.APP_PAGE\n              : IncrementalCacheKind.PAGES\n          ),\n          isAppPath ? data.rscData! : JSON.stringify(data.pageData)\n        )\n      }\n\n      if (data?.kind === CachedRouteKind.APP_PAGE) {\n        let segmentPaths: string[] | undefined\n        if (data.segmentData) {\n          segmentPaths = []\n          const segmentsDir = htmlPath.replace(\n            /\\.html$/,\n            RSC_SEGMENTS_DIR_SUFFIX\n          )\n\n          for (const [segmentPath, buffer] of data.segmentData) {\n            segmentPaths.push(segmentPath)\n            const segmentDataFilePath =\n              segmentsDir + segmentPath + RSC_SEGMENT_SUFFIX\n            writer.append(segmentDataFilePath, buffer)\n          }\n        }\n\n        const meta: RouteMetadata = {\n          headers: data.headers,\n          status: data.status,\n          postponed: data.postponed,\n          segmentPaths,\n          prefetchHints: undefined,\n        }\n\n        writer.append(\n          htmlPath.replace(/\\.html$/, NEXT_META_SUFFIX),\n          JSON.stringify(meta)\n        )\n      }\n    } else if (data.kind === CachedRouteKind.FETCH) {\n      const filePath = this.getFilePath(key, IncrementalCacheKind.FETCH)\n      writer.append(\n        filePath,\n        JSON.stringify({\n          ...data,\n          tags: ctx.fetchCache ? ctx.tags : [],\n        })\n      )\n    }\n\n    // Wait for all FS operations to complete.\n    await writer.wait()\n  }\n\n  private getFilePath(key: string, kind: IncrementalCacheKind): string {\n    let rootDir: string\n    switch (kind) {\n      case IncrementalCacheKind.FETCH:\n        // we store in .next/cache/fetch-cache so it can be persisted\n        // across deploys\n        rootDir = path.join(this.serverDistDir, '..', 'cache', 'fetch-cache')\n        break\n      case IncrementalCacheKind.PAGES:\n        rootDir = path.join(this.serverDistDir, 'pages')\n        break\n      case IncrementalCacheKind.IMAGE:\n      case IncrementalCacheKind.APP_PAGE:\n      case IncrementalCacheKind.APP_ROUTE:\n        rootDir = path.join(this.serverDistDir, 'app')\n        break\n      default:\n        throw new Error(`Unexpected file path kind: ${kind}`)\n    }\n\n    const filePath = path.join(rootDir, key)\n    if (!(filePath.startsWith(rootDir + path.sep) || filePath === rootDir)) {\n      throw new Error(`Invalid file path: ${filePath}`)\n    }\n\n    return filePath\n  }\n}\n","/**\n * This transforms a URL pathname into a route. It removes any trailing slashes\n * and the `/index` suffix.\n *\n * @param pathname - The URL path that needs to be optimized.\n * @returns - The route\n *\n * @example\n * // returns '/example'\n * toRoute('/example/index/');\n *\n * @example\n * // returns '/example'\n * toRoute('/example/');\n *\n * @example\n * // returns '/'\n * toRoute('/index/');\n *\n * @example\n * // returns '/'\n * toRoute('/');\n */\nexport function toRoute(pathname: string): string {\n  return pathname.replace(/(?:\\/index)?\\/?$/, '') || '/'\n}\n","import type { CacheFs } from '../../../shared/lib/utils'\nimport type { PrerenderManifest } from '../../../build'\nimport {\n  type IncrementalCacheValue,\n  type IncrementalCacheEntry,\n  type IncrementalCache as IncrementalCacheType,\n  IncrementalCacheKind,\n  CachedRouteKind,\n  type IncrementalResponseCacheEntry,\n  type IncrementalFetchCacheEntry,\n  type GetIncrementalFetchCacheContext,\n  type GetIncrementalResponseCacheContext,\n  type CachedFetchValue,\n  type SetIncrementalFetchCacheContext,\n  type SetIncrementalResponseCacheContext,\n} from '../../response-cache'\nimport type { DeepReadonly } from '../../../shared/lib/deep-readonly'\nimport FileSystemCache from './file-system-cache'\nimport { normalizePagePath } from '../../../shared/lib/page-path/normalize-page-path'\n\nimport {\n  CACHE_ONE_YEAR_SECONDS,\n  NEXT_CACHE_TAGS_HEADER,\n  PRERENDER_REVALIDATE_HEADER,\n} from '../../../lib/constants'\nimport { toRoute } from '../to-route'\nimport { SharedCacheControls } from './shared-cache-controls.external'\nimport {\n  getResumeDataCache,\n  workUnitAsyncStorage,\n} from '../../app-render/work-unit-async-storage.external'\nimport { InvariantError } from '../../../shared/lib/invariant-error'\nimport type { Revalidate } from '../cache-control'\nimport { getPreviouslyRevalidatedTags } from '../../server-utils'\nimport { workAsyncStorage } from '../../app-render/work-async-storage.external'\nimport { DetachedPromise } from '../../../lib/detached-promise'\nimport { areTagsExpired, areTagsStale } from './tags-manifest.external'\n\nexport interface CacheHandlerContext {\n  fs?: CacheFs\n  dev?: boolean\n  flushToDisk?: boolean\n  serverDistDir?: string\n  maxMemoryCacheSize?: number\n  fetchCacheKeyPrefix?: string\n  prerenderManifest?: PrerenderManifest\n  revalidatedTags: string[]\n  _requestHeaders: IncrementalCache['requestHeaders']\n}\n\nexport interface CacheHandlerValue {\n  lastModified: number\n  age?: number\n  cacheState?: string\n  value: IncrementalCacheValue | null\n}\n\nfunction toHex(buffer: ArrayBufferView | ArrayBuffer): string {\n  // Hex-encode body bytes losslessly: decoding as UTF-8 would collapse\n  // distinct bytes (0xff/0xfe to U+FFFD) and collide; Buffer isn't on edge.\n  const bytes = isArrayBuffer(buffer)\n    ? new Uint8Array(buffer)\n    : new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)\n  let hex = ''\n  for (const byte of bytes) {\n    hex += byte.toString(16).padStart(2, '0')\n  }\n  return hex\n}\n\ntype Body = NonNullable<RequestInit['body'] | Request['body']>\n\n// Duck typing to support Edge runtime\n// TODO: Switch to instanceof checks once Edge runtime is removed.\n\nfunction isArrayBuffer(\n  buffer: ArrayBuffer | ArrayBufferView\n): buffer is ArrayBuffer {\n  return !('buffer' in buffer)\n}\n\nfunction isBodyByteSequence(\n  body: Body\n): body is ArrayBufferView<ArrayBuffer> | ArrayBuffer {\n  return typeof body === 'object' && 'byteLength' in body\n}\n\nfunction isBodyReadableStream(body: Body): body is ReadableStream {\n  return typeof (body as any).getReader === 'function'\n}\n\nfunction isBodyFormDataOrURLSearchParams(\n  body: Body\n): body is FormData | URLSearchParams {\n  return typeof (body as any).keys === 'function'\n}\n\nfunction isBodyBlob(body: Body): body is Blob {\n  return typeof (body as any).arrayBuffer === 'function'\n}\n\nexport class CacheHandler {\n  // eslint-disable-next-line\n  constructor(_ctx: CacheHandlerContext) {}\n\n  public async get(\n    _cacheKey: string,\n    _ctx: GetIncrementalFetchCacheContext | GetIncrementalResponseCacheContext\n  ): Promise<CacheHandlerValue | null> {\n    return {} as any\n  }\n\n  public async set(\n    _cacheKey: string,\n    _data: IncrementalCacheValue | null,\n    _ctx: SetIncrementalFetchCacheContext | SetIncrementalResponseCacheContext\n  ): Promise<void> {}\n\n  public async revalidateTag(\n    _tags: string | string[],\n    _durations?: { expire?: number }\n  ): Promise<void> {}\n\n  public resetRequestCache(): void {}\n}\n\nasync function hashString(cacheString: string): Promise<string> {\n  if (process.env.NEXT_RUNTIME === 'edge') {\n    const encoder = new TextEncoder()\n    const buffer = encoder.encode(cacheString)\n    return toHex(await crypto.subtle.digest('SHA-256', buffer))\n  } else {\n    const crypto = require('crypto') as typeof import('crypto')\n    return crypto.createHash('sha256').update(cacheString).digest('hex')\n  }\n}\n\n// this should be bumped anytime a fix is made to cache entries\n// that should bust the cache\nconst MAIN_KEY_PREFIX = 'v4'\n\nexport class IncrementalCache implements IncrementalCacheType {\n  readonly dev?: boolean\n  readonly disableForTestmode?: boolean\n  readonly cacheHandler?: CacheHandler\n  readonly hasCustomCacheHandler: boolean\n  readonly prerenderManifest: DeepReadonly<PrerenderManifest>\n  readonly requestHeaders: Record<string, undefined | string | string[]>\n  readonly allowedRevalidateHeaderKeys?: string[]\n  readonly minimalMode?: boolean\n  readonly fetchCacheKeyPrefix?: string\n  readonly isOnDemandRevalidate?: boolean\n  readonly revalidatedTags?: readonly string[]\n\n  private static readonly debug: boolean =\n    !!process.env.NEXT_PRIVATE_DEBUG_CACHE\n  private readonly locks = new Map<string, Promise<void>>()\n\n  /**\n   * The cache controls for routes. This will source the values from the\n   * prerender manifest until the in-memory cache is updated with new values.\n   */\n  private readonly cacheControls: SharedCacheControls\n\n  constructor({\n    fs,\n    dev,\n    flushToDisk,\n    minimalMode,\n    serverDistDir,\n    requestHeaders,\n    maxMemoryCacheSize,\n    getPrerenderManifest,\n    fetchCacheKeyPrefix,\n    CurCacheHandler,\n    allowedRevalidateHeaderKeys,\n  }: {\n    fs?: CacheFs\n    dev: boolean\n    minimalMode?: boolean\n    serverDistDir?: string\n    flushToDisk?: boolean\n    allowedRevalidateHeaderKeys?: string[]\n    requestHeaders: IncrementalCache['requestHeaders']\n    maxMemoryCacheSize?: number\n    getPrerenderManifest: () => DeepReadonly<PrerenderManifest>\n    fetchCacheKeyPrefix?: string\n    CurCacheHandler?: typeof CacheHandler\n  }) {\n    this.hasCustomCacheHandler = Boolean(CurCacheHandler)\n\n    const cacheHandlersSymbol = Symbol.for('@next/cache-handlers')\n    const _globalThis: typeof globalThis & {\n      [cacheHandlersSymbol]?: {\n        FetchCache?: typeof CacheHandler\n      }\n    } = globalThis\n\n    if (!CurCacheHandler) {\n      // if we have a global cache handler available leverage it\n      const globalCacheHandler = _globalThis[cacheHandlersSymbol]\n\n      if (globalCacheHandler?.FetchCache) {\n        CurCacheHandler = globalCacheHandler.FetchCache\n        if (IncrementalCache.debug) {\n          console.log('IncrementalCache: using global FetchCache cache handler')\n        }\n      } else {\n        if (fs && serverDistDir) {\n          if (IncrementalCache.debug) {\n            console.log('IncrementalCache: using filesystem cache handler')\n          }\n          CurCacheHandler = FileSystemCache\n        }\n      }\n    } else if (IncrementalCache.debug) {\n      console.log(\n        'IncrementalCache: using custom cache handler',\n        CurCacheHandler.name\n      )\n    }\n\n    if (process.env.__NEXT_TEST_MAX_ISR_CACHE) {\n      // Allow cache size to be overridden for testing purposes\n      maxMemoryCacheSize = parseInt(process.env.__NEXT_TEST_MAX_ISR_CACHE, 10)\n    }\n    this.dev = dev\n    this.disableForTestmode = process.env.NEXT_PRIVATE_TEST_PROXY === 'true'\n    // this is a hack to avoid Webpack knowing this is equal to this.minimalMode\n    // because we replace this.minimalMode to true in production bundles.\n    const minimalModeKey = 'minimalMode'\n    this[minimalModeKey] = minimalMode\n    this.requestHeaders = requestHeaders\n    this.allowedRevalidateHeaderKeys = allowedRevalidateHeaderKeys\n    this.prerenderManifest = getPrerenderManifest()\n    this.cacheControls = new SharedCacheControls(this.prerenderManifest)\n    this.fetchCacheKeyPrefix = fetchCacheKeyPrefix\n    let revalidatedTags: string[] = []\n\n    if (\n      requestHeaders[PRERENDER_REVALIDATE_HEADER] ===\n      this.prerenderManifest?.preview?.previewModeId\n    ) {\n      this.isOnDemandRevalidate = true\n    }\n\n    if (minimalMode) {\n      revalidatedTags = this.revalidatedTags = getPreviouslyRevalidatedTags(\n        requestHeaders,\n        this.prerenderManifest?.preview?.previewModeId\n      )\n    }\n\n    if (CurCacheHandler) {\n      this.cacheHandler = new CurCacheHandler({\n        dev,\n        fs,\n        flushToDisk,\n        serverDistDir,\n        revalidatedTags,\n        maxMemoryCacheSize,\n        _requestHeaders: requestHeaders,\n        fetchCacheKeyPrefix,\n      })\n    }\n  }\n\n  private calculateRevalidate(\n    pathname: string,\n    fromTime: number,\n    dev: boolean,\n    isFallback: boolean | undefined\n  ): Revalidate {\n    // in development we don't have a prerender-manifest\n    // and default to always revalidating to allow easier debugging\n    if (dev)\n      return Math.floor(performance.timeOrigin + performance.now() - 1000)\n\n    const cacheControl = this.cacheControls.get(toRoute(pathname))\n\n    // if an entry isn't present in routes we fallback to a default\n    // of revalidating after 1 second unless it's a fallback request.\n    const initialRevalidateSeconds = cacheControl\n      ? cacheControl.revalidate\n      : isFallback\n        ? false\n        : 1\n\n    const revalidateAfter =\n      typeof initialRevalidateSeconds === 'number'\n        ? initialRevalidateSeconds * 1000 + fromTime\n        : initialRevalidateSeconds\n\n    return revalidateAfter\n  }\n\n  _getPathname(pathname: string, fetchCache?: boolean) {\n    return fetchCache ? pathname : normalizePagePath(pathname)\n  }\n\n  resetRequestCache() {\n    this.cacheHandler?.resetRequestCache?.()\n  }\n\n  async lock(cacheKey: string): Promise<() => Promise<void> | void> {\n    // Wait for any existing lock on this cache key to be released\n    // This implements a simple queue-based locking mechanism\n    while (true) {\n      const lock = this.locks.get(cacheKey)\n\n      if (IncrementalCache.debug) {\n        console.log('IncrementalCache: lock get', cacheKey, !!lock)\n      }\n\n      // If no lock exists, we can proceed to acquire it\n      if (!lock) break\n\n      // Wait for the existing lock to be released before trying again\n      await lock\n    }\n\n    // Create a new detached promise that will represent this lock\n    // The resolve function (unlock) will be returned to the caller\n    const { resolve, promise } = new DetachedPromise<void>()\n\n    if (IncrementalCache.debug) {\n      console.log('IncrementalCache: successfully locked', cacheKey)\n    }\n\n    // Store the lock promise in the locks map\n    this.locks.set(cacheKey, promise)\n\n    return () => {\n      // Resolve the promise to release the lock.\n      resolve()\n\n      // Remove the lock from the map once it's released so that future gets\n      // can acquire the lock.\n      this.locks.delete(cacheKey)\n    }\n  }\n\n  async revalidateTag(\n    tags: string | string[],\n    durations?: { expire?: number }\n  ): Promise<void> {\n    return this.cacheHandler?.revalidateTag(tags, durations)\n  }\n\n  async generateSimpleCacheKey(input: string): Promise<string> {\n    const cacheString = JSON.stringify([\n      MAIN_KEY_PREFIX,\n      this.fetchCacheKeyPrefix || '',\n      input,\n    ])\n\n    return hashString(cacheString)\n  }\n\n  // x-ref: https://github.com/facebook/react/blob/2655c9354d8e1c54ba888444220f63e836925caa/packages/react/src/ReactFetch.js#L23\n  async generateCacheKey(\n    url: string,\n    init: RequestInit | Request = {}\n  ): Promise<string> {\n    const bodyChunks: string[] = []\n\n    const encoder = new TextEncoder()\n\n    // Will be set implementing https://fetch.spec.whatwg.org/#concept-bodyinit-extract\n    let bodyType: string | null = null\n    const body = init.body\n    if (body) {\n      if (isBodyByteSequence(body)) {\n        bodyChunks.push(`bytes:${toHex(body)}`)\n        ;(init as any)._ogBody = body\n      } else if (isBodyReadableStream(body)) {\n        const readableBody = body\n\n        const chunks: Uint8Array[] = []\n\n        try {\n          await readableBody.pipeTo(\n            new WritableStream({\n              write(chunk) {\n                chunks.push(\n                  typeof chunk === 'string' ? encoder.encode(chunk) : chunk\n                )\n              },\n            })\n          )\n\n          // Create a new buffer with all the chunks.\n          const length = chunks.reduce((total, arr) => total + arr.length, 0)\n          const arrayBuffer = new Uint8Array(length)\n\n          // Push each of the chunks into the new array buffer.\n          let offset = 0\n          for (const chunk of chunks) {\n            arrayBuffer.set(chunk, offset)\n            offset += chunk.length\n          }\n\n          bodyChunks.push(`bytes:${toHex(arrayBuffer)}`)\n          ;(init as any)._ogBody = arrayBuffer\n        } catch (err) {\n          console.error('Problem reading body', err)\n        }\n      } else if (isBodyFormDataOrURLSearchParams(body)) {\n        bodyType =\n          String(body) === '[object FormData]'\n            ? // We don't need a boundary because we're not actually using this for a Content-Type header\n              'multipart/form-data; boundary='\n            : 'application/x-www-form-urlencoded;charset=UTF-8'\n        const iterable = body\n        ;(init as any)._ogBody = body\n        // Separate, tagged chunks so `[\"a\",\"b\"]` can't collide with `[\"a,b\"]`.\n        for (const [key, val] of iterable.entries()) {\n          bodyChunks.push(`key:${key}`)\n          if (typeof val === 'string') {\n            bodyChunks.push(`str:${val}`)\n          } else {\n            bodyChunks.push(\n              'file',\n              val.name,\n              val.type,\n              `bytes:${toHex(await val.arrayBuffer())}`\n            )\n          }\n        }\n        // handle blob body\n      } else if (isBodyBlob(body)) {\n        const blob = body\n        const arrayBuffer = await blob.arrayBuffer()\n        bodyChunks.push('blob', blob.type, `bytes:${toHex(arrayBuffer)}`)\n        ;(init as any)._ogBody = new Blob([arrayBuffer], { type: blob.type })\n        bodyType = blob.type\n      } else if (typeof body === 'string') {\n        bodyChunks.push(`str:${body}`)\n        ;(init as any)._ogBody = body\n        bodyType = 'text/plain;charset=UTF-8'\n      } else {\n        body satisfies never\n        throw new Error(`Unsupported body type: ${typeof body}`)\n      }\n    }\n\n    const headers =\n      typeof (init.headers || {}).keys === 'function'\n        ? Object.fromEntries(init.headers as Headers)\n        : Object.assign({} as Record<string, string>, init.headers)\n\n    // w3c trace context headers can break request caching and deduplication\n    // so we remove them from the cache key\n    if ('traceparent' in headers) delete headers['traceparent']\n    if ('tracestate' in headers) delete headers['tracestate']\n\n    const cacheString = JSON.stringify([\n      MAIN_KEY_PREFIX,\n      this.fetchCacheKeyPrefix || '',\n      url,\n      init.method,\n      // Ensures default Content-Type is part of the cache key\n      // TODO: Only necessary when headers are not used from the Request instance\n      bodyType,\n      headers,\n      init.mode,\n      init.redirect,\n      init.credentials,\n      init.referrer,\n      init.referrerPolicy,\n      init.integrity,\n      init.cache,\n      bodyChunks,\n    ])\n\n    return hashString(cacheString)\n  }\n\n  async get(\n    cacheKey: string,\n    ctx: GetIncrementalFetchCacheContext\n  ): Promise<IncrementalFetchCacheEntry | null>\n  async get(\n    cacheKey: string,\n    ctx: GetIncrementalResponseCacheContext\n  ): Promise<IncrementalResponseCacheEntry | null>\n  async get(\n    cacheKey: string,\n    ctx: GetIncrementalFetchCacheContext | GetIncrementalResponseCacheContext\n  ): Promise<IncrementalCacheEntry | null> {\n    // Unlike other caches if we have a resume data cache, we use it even if\n    // testmode would normally disable it or if requestHeaders say 'no-cache'.\n    if (ctx.kind === IncrementalCacheKind.FETCH) {\n      const workUnitStore = workUnitAsyncStorage.getStore()\n      const resumeDataCache = workUnitStore\n        ? getResumeDataCache(workUnitStore)\n        : null\n      if (resumeDataCache) {\n        const memoryCacheData = resumeDataCache.fetch.get(cacheKey)\n        if (memoryCacheData?.kind === CachedRouteKind.FETCH) {\n          // Check if any tags were recently revalidated before returning RDC entry.\n          // When a server action calls updateTag(), the re-render should see fresh\n          // data instead of stale RDC data.\n          const workStore = workAsyncStorage.getStore()\n          const combinedTags = [...(ctx.tags || []), ...(ctx.softTags || [])]\n          const hasRevalidatedTag = combinedTags.some(\n            (tag) =>\n              this.revalidatedTags?.includes(tag) ||\n              workStore?.pendingRevalidatedTags?.some(\n                (item) => item.tag === tag\n              )\n          )\n\n          if (hasRevalidatedTag) {\n            if (IncrementalCache.debug) {\n              console.log('IncrementalCache: rdc:revalidated-tag', cacheKey)\n            }\n            // Fall through to cacheHandler lookup\n          } else {\n            if (IncrementalCache.debug) {\n              console.log('IncrementalCache: rdc:hit', cacheKey)\n            }\n\n            return { isStale: false, value: memoryCacheData }\n          }\n        } else if (IncrementalCache.debug) {\n          console.log('IncrementalCache: rdc:miss', cacheKey)\n        }\n      } else {\n        if (IncrementalCache.debug) {\n          console.log('IncrementalCache: rdc:no-resume-data')\n        }\n      }\n    }\n\n    // we don't leverage the prerender cache in dev mode\n    // so that getStaticProps is always called for easier debugging\n    if (\n      this.disableForTestmode ||\n      (this.dev &&\n        (ctx.kind !== IncrementalCacheKind.FETCH ||\n          this.requestHeaders['cache-control'] === 'no-cache'))\n    ) {\n      return null\n    }\n\n    cacheKey = this._getPathname(\n      cacheKey,\n      ctx.kind === IncrementalCacheKind.FETCH\n    )\n\n    const cacheData = await this.cacheHandler?.get(cacheKey, ctx)\n\n    if (ctx.kind === IncrementalCacheKind.FETCH) {\n      if (!cacheData) {\n        return null\n      }\n\n      if (cacheData.value?.kind !== CachedRouteKind.FETCH) {\n        throw new InvariantError(\n          `Expected cached value for cache key ${JSON.stringify(cacheKey)} to be a \"FETCH\" kind, got ${JSON.stringify(cacheData.value?.kind)} instead.`\n        )\n      }\n\n      const workStore = workAsyncStorage.getStore()\n      const combinedTags = [...(ctx.tags || []), ...(ctx.softTags || [])]\n      // if a tag was revalidated we don't return stale data\n      if (\n        combinedTags.some(\n          (tag) =>\n            this.revalidatedTags?.includes(tag) ||\n            workStore?.pendingRevalidatedTags?.some((item) => item.tag === tag)\n        )\n      ) {\n        if (IncrementalCache.debug) {\n          console.log('IncrementalCache: expired tag', cacheKey)\n        }\n\n        return null\n      }\n\n      // As we're able to get the cache entry for this fetch, and the prerender\n      // resume data cache (RDC) is available, it must have been populated by a\n      // previous fetch, but was not yet present in the in-memory cache. This\n      // could be the case when performing multiple renders in parallel during\n      // build time where we de-duplicate the fetch calls.\n      //\n      // We add it to the RDC so that the next fetch call will be able to use it\n      // and it won't have to reach into the fetch cache implementation.\n      const workUnitStore = workUnitAsyncStorage.getStore()\n      if (workUnitStore) {\n        const resumeDataCache = getResumeDataCache(workUnitStore)\n        if (resumeDataCache?.mutable) {\n          if (IncrementalCache.debug) {\n            console.log('IncrementalCache: rdc:set', cacheKey)\n          }\n\n          resumeDataCache.fetch.set(cacheKey, cacheData.value)\n        }\n      }\n\n      const revalidate = ctx.revalidate || cacheData.value.revalidate\n      const age =\n        (performance.timeOrigin +\n          performance.now() -\n          (cacheData.lastModified || 0)) /\n        1000\n\n      let isStale = age > revalidate\n      const data = cacheData.value.data\n\n      if (areTagsExpired(combinedTags, cacheData.lastModified)) {\n        return null\n      } else if (areTagsStale(combinedTags, cacheData.lastModified)) {\n        isStale = true\n      }\n\n      return {\n        isStale,\n        value: { kind: CachedRouteKind.FETCH, data, revalidate },\n      }\n    } else if (cacheData?.value?.kind === CachedRouteKind.FETCH) {\n      throw new InvariantError(\n        `Expected cached value for cache key ${JSON.stringify(cacheKey)} not to be a ${JSON.stringify(ctx.kind)} kind, got \"FETCH\" instead.`\n      )\n    }\n\n    let entry: IncrementalResponseCacheEntry | null = null\n    const { isFallback } = ctx\n    const cacheControl = this.cacheControls.get(toRoute(cacheKey))\n\n    let isStale: boolean | -1 | undefined\n    let revalidateAfter: Revalidate\n\n    if (cacheData?.lastModified === -1) {\n      isStale = -1\n      revalidateAfter = -1 * CACHE_ONE_YEAR_SECONDS * 1000\n    } else {\n      const now = performance.timeOrigin + performance.now()\n      const lastModified = cacheData?.lastModified || now\n\n      revalidateAfter = this.calculateRevalidate(\n        cacheKey,\n        lastModified,\n        this.dev ?? false,\n        ctx.isFallback\n      )\n\n      // If the route's `expire` time has passed, force a blocking revalidation\n      // by signalling `isStale = -1`. The response cache treats `-1` as \"skip\n      // the early SWR resolve\" and awaits a fresh render before the user sees a\n      // response.\n      const expireAfter =\n        typeof cacheControl?.expire === 'number'\n          ? cacheControl.expire * 1000 + lastModified\n          : undefined\n\n      if (expireAfter !== undefined && expireAfter < now) {\n        isStale = -1\n      } else {\n        isStale =\n          revalidateAfter !== false && revalidateAfter < now ? true : undefined\n\n        // If the stale time couldn't be determined based on the revalidation\n        // time, we check if the tags are expired or stale.\n        if (\n          isStale === undefined &&\n          (cacheData?.value?.kind === CachedRouteKind.APP_PAGE ||\n            cacheData?.value?.kind === CachedRouteKind.APP_ROUTE)\n        ) {\n          const tagsHeader = cacheData.value.headers?.[NEXT_CACHE_TAGS_HEADER]\n\n          if (typeof tagsHeader === 'string') {\n            const cacheTags = tagsHeader.split(',')\n\n            if (cacheTags.length > 0) {\n              if (areTagsExpired(cacheTags, lastModified)) {\n                isStale = -1\n              } else if (areTagsStale(cacheTags, lastModified)) {\n                isStale = true\n              }\n            }\n          }\n        }\n      }\n    }\n\n    if (cacheData) {\n      entry = {\n        isStale,\n        cacheControl,\n        revalidateAfter,\n        value: cacheData.value,\n        isFallback,\n      }\n    }\n\n    if (\n      !cacheData &&\n      this.prerenderManifest.notFoundRoutes.includes(cacheKey)\n    ) {\n      // for the first hit after starting the server the cache\n      // may not have a way to save notFound: true so if\n      // the prerender-manifest marks this as notFound then we\n      // return that entry and trigger a cache set to give it a\n      // chance to update in-memory entries\n      entry = {\n        isStale,\n        value: null,\n        cacheControl,\n        revalidateAfter,\n        isFallback,\n      }\n      this.set(cacheKey, entry.value, { ...ctx, cacheControl })\n    }\n    return entry\n  }\n\n  async set(\n    pathname: string,\n    data: CachedFetchValue | null,\n    ctx: SetIncrementalFetchCacheContext\n  ): Promise<void>\n  async set(\n    pathname: string,\n    data: Exclude<IncrementalCacheValue, CachedFetchValue> | null,\n    ctx: SetIncrementalResponseCacheContext\n  ): Promise<void>\n  async set(\n    pathname: string,\n    data: IncrementalCacheValue | null,\n    ctx: SetIncrementalFetchCacheContext | SetIncrementalResponseCacheContext\n  ): Promise<void> {\n    // Even if we otherwise disable caching for testMode or if no fetchCache is\n    // configured we still always stash results in the resume data cache if one\n    // exists. This is because this is a transient in memory cache that\n    // populates caches ahead of a dynamic render in dev mode to allow the RSC\n    // debug info to have the right environment associated to it.\n    if (data?.kind === CachedRouteKind.FETCH) {\n      const workUnitStore = workUnitAsyncStorage.getStore()\n      const resumeDataCache = workUnitStore\n        ? getResumeDataCache(workUnitStore)\n        : null\n      if (resumeDataCache?.mutable) {\n        if (IncrementalCache.debug) {\n          console.log('IncrementalCache: rdc:set', pathname)\n        }\n\n        resumeDataCache.fetch.set(pathname, data)\n      }\n    }\n\n    if (this.disableForTestmode || (this.dev && !ctx.fetchCache)) return\n\n    pathname = this._getPathname(pathname, ctx.fetchCache)\n\n    // FetchCache has upper limit of 2MB per-entry currently\n    const itemSize = JSON.stringify(data).length\n    if (\n      ctx.fetchCache &&\n      itemSize > 2 * 1024 * 1024 &&\n      // We ignore the size limit when custom cache handler is being used, as it\n      // might not have this limit\n      !this.hasCustomCacheHandler &&\n      // We also ignore the size limit when it's an implicit build-time-only\n      // caching that the user isn't even aware of.\n      !ctx.isImplicitBuildTimeCache\n    ) {\n      const warningText = `Failed to set Next.js data cache for ${ctx.fetchUrl || pathname}, items over 2MB can not be cached (${itemSize} bytes)`\n\n      if (this.dev) {\n        throw new Error(warningText)\n      }\n      console.warn(warningText)\n      return\n    }\n\n    try {\n      if (!ctx.fetchCache && ctx.cacheControl) {\n        this.cacheControls.set(toRoute(pathname), ctx.cacheControl)\n      }\n\n      await this.cacheHandler?.set(pathname, data, ctx)\n    } catch (error) {\n      console.warn('Failed to update prerender cache for', pathname, error)\n    }\n  }\n}\n","/**\n * This is the default \"use cache\" handler it defaults to an in-memory store.\n * In-memory caches are fragile and should not use stale-while-revalidate\n * semantics on the caches because it's not worth warming up an entry that's\n * likely going to get evicted before we get to use it anyway. However, we also\n * don't want to reuse a stale entry for too long so stale entries should be\n * considered expired/missing in such cache handlers.\n *\n * The dev server (`next dev`) is the exception: to keep reloads fast it serves\n * stale entries until they expire, relying on the wrapper's\n * stale-while-revalidate path to warm a fresh entry in the background. See\n * `get` for where this branches.\n */\n\nimport { LRUCache } from '../lru-cache'\nimport type { CacheEntry, CacheHandler } from './types'\nimport {\n  areTagsExpired,\n  areTagsStale,\n  tagsManifest,\n  type TagManifestEntry,\n} from '../incremental-cache/tags-manifest.external'\nimport { MIN_PRERENDERABLE_EXPIRE } from '../../use-cache/constants'\n\ntype PrivateCacheEntry = {\n  entry: CacheEntry\n\n  // For the default cache we store errored cache\n  // entries and allow them to be used up to 3 times\n  // after that we want to dispose it and try for fresh\n\n  // If an entry is errored we return no entry\n  // three times so that we retry hitting origin (MISS)\n  // and then if it still fails to set after the third we\n  // return the errored content and use expiration of\n  // Math.min(30, entry.expiration)\n  isErrored: boolean\n  errorRetryCount: number\n\n  // compute size on set since we need to read size\n  // of the ReadableStream for LRU evicting\n  size: number\n}\n\nexport function createDefaultCacheHandler(maxSize: number): CacheHandler {\n  // If the max size is 0, return a cache handler that doesn't cache anything,\n  // this avoids an unnecessary LRUCache instance and potential memory\n  // allocation.\n  if (maxSize === 0) {\n    return {\n      get: () => Promise.resolve(undefined),\n      set: () => Promise.resolve(),\n      refreshTags: () => Promise.resolve(),\n      getExpiration: () => Promise.resolve(0),\n      updateTags: () => Promise.resolve(),\n    }\n  }\n\n  const memoryCache = new LRUCache<PrivateCacheEntry>(\n    maxSize,\n    (entry, cacheKey) => entry.size + cacheKey.length\n  )\n  const pendingSets = new Map<string, Promise<void>>()\n\n  const debug = process.env.NEXT_PRIVATE_DEBUG_CACHE\n    ? console.debug.bind(console, 'DefaultCacheHandler:')\n    : undefined\n\n  return {\n    async get(cacheKey) {\n      const pendingPromise = pendingSets.get(cacheKey)\n\n      if (pendingPromise) {\n        debug?.('get', cacheKey, 'pending')\n        await pendingPromise\n      }\n\n      const privateEntry = memoryCache.get(cacheKey)\n\n      if (!privateEntry) {\n        debug?.('get', cacheKey, 'not found')\n        return undefined\n      }\n\n      const entry = privateEntry.entry\n\n      // A negative `expire` is an eviction sentinel: the tiered cache handler\n      // (dev-only) marks a front entry for deletion by overwriting it with a\n      // negative `expire`, since the cache-handler interface has no per-key\n      // delete. Treat it as missing here, independently of the minimum\n      // retention below (which would otherwise keep it alive). This is distinct\n      // from `revalidate = -1` below, which keeps serving the entry but forces\n      // a revalidation.\n      if (entry.expire < 0) {\n        debug?.('get', cacheKey, 'evicted')\n        return undefined\n      }\n\n      // The dev server serves stale entries until they expire (see the file\n      // overview); production drops them once past the revalidate time. In dev,\n      // an entry is retained for at least `MIN_PRERENDERABLE_EXPIRE` so that\n      // entries with a short `expire` (for example a `cacheLife({ expire: 0 })`\n      // client-only cache) still linger long enough that a reload hits the\n      // cache. That minimum is the same threshold below which the \"use cache\"\n      // wrapper treats an entry as dynamic, so it only extends the retention of\n      // entries that are dynamic anyway. It affects retention only; the\n      // returned entry keeps its real `expire`, so staging decisions are\n      // unchanged.\n      const maxAgeSeconds = process.env.__NEXT_DEV_SERVER\n        ? Math.max(entry.expire, MIN_PRERENDERABLE_EXPIRE)\n        : entry.revalidate\n\n      if (\n        performance.timeOrigin + performance.now() >\n        entry.timestamp + maxAgeSeconds * 1000\n      ) {\n        debug?.('get', cacheKey, 'expired')\n\n        return undefined\n      }\n\n      let revalidate = entry.revalidate\n\n      if (areTagsExpired(entry.tags, entry.timestamp)) {\n        debug?.('get', cacheKey, 'had expired tag')\n        return undefined\n      }\n\n      if (areTagsStale(entry.tags, entry.timestamp)) {\n        debug?.('get', cacheKey, 'had stale tag')\n        revalidate = -1\n      }\n\n      const [returnStream, newSaved] = entry.value.tee()\n      entry.value = newSaved\n\n      debug?.('get', cacheKey, 'found', {\n        tags: entry.tags,\n        timestamp: entry.timestamp,\n        expire: entry.expire,\n        revalidate,\n      })\n\n      return {\n        ...entry,\n        revalidate,\n        value: returnStream,\n      }\n    },\n\n    async set(cacheKey, pendingEntry) {\n      debug?.('set', cacheKey, 'start')\n\n      let resolvePending: () => void = () => {}\n      const pendingPromise = new Promise<void>((resolve) => {\n        resolvePending = resolve\n      })\n      pendingSets.set(cacheKey, pendingPromise)\n\n      const entry = await pendingEntry\n\n      let size = 0\n\n      try {\n        // In production an `expire: 0` entry is dynamic: the \"use cache\"\n        // wrapper regenerates it on every read instead of serving the stored\n        // copy, so persisting it would be a wasted write of a value that is\n        // never served back. Skip storing it so the next read is a plain miss.\n        // The dev server keeps it, because its minimum retention serves the\n        // previously cached value across reloads. The `finally` below still\n        // resolves the pending set.\n        if (!process.env.__NEXT_DEV_SERVER && entry.expire === 0) {\n          debug?.('set', cacheKey, 'skipped dynamic entry')\n          return\n        }\n\n        const [value, clonedValue] = entry.value.tee()\n        entry.value = value\n        const reader = clonedValue.getReader()\n\n        for (let chunk; !(chunk = await reader.read()).done; ) {\n          size += Buffer.from(chunk.value).byteLength\n        }\n\n        memoryCache.set(cacheKey, {\n          entry,\n          isErrored: false,\n          errorRetryCount: 0,\n          size,\n        })\n\n        debug?.('set', cacheKey, 'done')\n      } catch (err) {\n        // TODO: store partial buffer with error after we retry 3 times\n        debug?.('set', cacheKey, 'failed', err)\n      } finally {\n        resolvePending()\n        pendingSets.delete(cacheKey)\n      }\n    },\n\n    async refreshTags() {\n      // Nothing to do for an in-memory cache handler.\n    },\n\n    async getExpiration(tags) {\n      const expirations = tags.map((tag) => {\n        const entry = tagsManifest.get(tag)\n        if (!entry) return 0\n        // Return the most recent timestamp (either expired or stale)\n        return entry.expired || 0\n      })\n\n      const expiration = Math.max(...expirations, 0)\n\n      debug?.('getExpiration', { tags, expiration })\n\n      return expiration\n    },\n\n    async updateTags(tags, durations) {\n      const now = Math.round(performance.timeOrigin + performance.now())\n      debug?.('updateTags', { tags, timestamp: now })\n\n      for (const tag of tags) {\n        // TODO: update file-system-cache?\n        const existingEntry = tagsManifest.get(tag) || {}\n\n        if (durations) {\n          // Use provided durations directly\n          const updates: TagManifestEntry = { ...existingEntry }\n\n          // mark as stale immediately\n          updates.stale = now\n\n          if (durations.expire !== undefined) {\n            updates.expired = now + durations.expire * 1000 // Convert seconds to ms\n          }\n\n          tagsManifest.set(tag, updates)\n        } else {\n          // Update expired field for immediate expiration (default behavior when no durations provided)\n          tagsManifest.set(tag, { ...existingEntry, expired: now })\n        }\n      }\n    },\n  }\n}\n","import { InvariantError } from '../../shared/lib/invariant-error'\n\nexport const MIN_PRERENDERABLE_EXPIRE = 300 // 5 minutes\nexport const MIN_PREFETCHABLE_STALE = 30 // 30 seconds\nexport const MIN_SHELL_STALE = 300 // 5 minutes\n\nif (process.env.NODE_ENV !== 'production') {\n  if (MIN_PREFETCHABLE_STALE > MIN_SHELL_STALE) {\n    throw new InvariantError(\n      'MIN_PREFETCHABLE_STALE must not exceed MIN_SHELL_STALE.'\n    )\n  }\n}\n","import type { CacheEntry } from '../lib/cache-handlers/types'\n\n/**\n * Tees a cache entry's single-use value stream into two independent entries.\n * The original entry is mutated to hold one branch of the tee, and a clone is\n * returned holding the other, so both can be consumed independently.\n */\nexport function cloneCacheEntry(entry: CacheEntry): [CacheEntry, CacheEntry] {\n  const [streamA, streamB] = entry.value.tee()\n  entry.value = streamA\n  const clonedEntry: CacheEntry = {\n    value: streamB,\n    timestamp: entry.timestamp,\n    revalidate: entry.revalidate,\n    expire: entry.expire,\n    stale: entry.stale,\n    tags: entry.tags,\n  }\n  return [entry, clonedEntry]\n}\n","import type { CacheEntry, CacheHandler } from '../lib/cache-handlers/types'\nimport { workAsyncStorage } from '../app-render/work-async-storage.external'\nimport { cloneCacheEntry } from './clone-cache-entry'\n\n/**\n * The subset of the cache-handler interface used on the per-invocation\n * read/write path in the \"use cache\" wrapper. Tag operations are intentionally\n * excluded: they are applied to the front and backing handlers individually by\n * the registry iterators (`getCacheHandlers` / `getCacheHandlerEntries`), never\n * through this composite, so the composite is never registered.\n */\nexport type CacheReadWriteHandler = Pick<CacheHandler, 'get' | 'set'>\n\n/**\n * Development-only. Puts a fast built-in in-memory `front` handler in front of\n * a slower or persistent user-configured `backing` handler. Its only job is to\n * guarantee that cache hits resolve in a microtask (so they aren't counted as\n * cache misses at a staged-render boundary, which would otherwise surface a\n * cold cache indicator), while keeping the front in sync with the backing.\n *\n * It implements only `get` and `set` because that is all the wrapper calls on\n * its handler. Regeneration is never done here; this only reads, mirrors, and\n * writes through.\n *\n * The handler is a per-kind singleton (the front and backing are both shared),\n * so its in-flight map can serialize background front syncs for a key across\n * concurrent reads, running them one at a time instead of in parallel.\n */\nexport function createTieredCacheHandler(\n  front: CacheHandler,\n  backing: CacheHandler\n): CacheReadWriteHandler {\n  // Holds the in-flight (or chained) background sync per key, so a sync for a\n  // key runs after any earlier one for that key rather than in parallel.\n  const inFlightSyncs = new Map<string, Promise<void>>()\n\n  function scheduleBackgroundSync(\n    cacheKey: string,\n    sync: () => Promise<void>\n  ): void {\n    // Serialize syncs per key: chain this one after any in-flight sync rather\n    // than running a second in parallel. The trailing sync still re-reads the\n    // backing, so the front converges to the latest state; a later read is\n    // never dropped in favor of an earlier, possibly stale, in-flight read.\n    const previous = inFlightSyncs.get(cacheKey)\n\n    let pending: Promise<void>\n    if (previous) {\n      pending = previous.then(sync)\n    } else {\n      pending = sync()\n    }\n\n    pending = pending.finally(() => {\n      if (inFlightSyncs.get(cacheKey) === pending) {\n        inFlightSyncs.delete(cacheKey)\n      }\n    })\n\n    inFlightSyncs.set(cacheKey, pending)\n\n    // Register the sync on the current request's revalidation writes so it is\n    // awaited rather than left untracked. Reading the work store here (rather\n    // than capturing it at construction) is what lets the handler be a shared\n    // singleton; `get` always runs within the request's async context, so the\n    // store is present.\n    const workStore = workAsyncStorage.getStore()\n    if (workStore) {\n      workStore.pendingRevalidateWrites ??= []\n      workStore.pendingRevalidateWrites.push(pending)\n    }\n  }\n\n  return {\n    async get(cacheKey, softTags) {\n      const frontEntry = await front.get(cacheKey, softTags)\n\n      if (frontEntry) {\n        // Cache hit: serve immediately (in a microtask). A background reconcile\n        // keeps the front in sync with the backing for the next read;\n        // reconciles for the same key are serialized, so concurrent cache hits\n        // don't hit the backing in parallel.\n        scheduleBackgroundSync(cacheKey, () =>\n          reconcileFrontFromBacking(\n            front,\n            backing,\n            cacheKey,\n            softTags,\n            frontEntry\n          )\n        )\n\n        return frontEntry\n      }\n\n      // Cold or evicted front entry: we pay the backing latency here (this is a\n      // read that may legitimately surface a cold cache indicator). A miss\n      // returns undefined and the \"use cache\" wrapper generates the entry and\n      // writes it through both tiers via `set`.\n      const backingEntry = await backing.get(cacheKey, softTags)\n\n      if (!backingEntry) {\n        return undefined\n      }\n\n      // Mirror this freshly read backing entry into the front so the next read\n      // hits it. The mirror is serialized per key: if a sync is already\n      // running, this chains after it, so the front converges to this read even\n      // if the backing changed since that sync started.\n      const [servedEntry, mirroredEntry] = cloneCacheEntry(backingEntry)\n      scheduleBackgroundSync(cacheKey, () =>\n        mirrorIntoFront(front, cacheKey, mirroredEntry)\n      )\n\n      return servedEntry\n    },\n\n    async set(cacheKey, pendingEntry) {\n      // Write through to both tiers. The entry's value stream is single-use, so\n      // tee it into one entry per tier.\n      const entry = await pendingEntry\n      const [frontEntry, backingEntry] = cloneCacheEntry(entry)\n\n      await Promise.all([\n        front.set(cacheKey, Promise.resolve(frontEntry)),\n        backing.set(cacheKey, Promise.resolve(backingEntry)),\n      ])\n    },\n  }\n}\n\n/**\n * After serving a cache hit from the front, consult the backing and mirror a\n * newer entry into the front for the next read. Runs in the background;\n * failures are non-fatal.\n */\nasync function reconcileFrontFromBacking(\n  front: CacheHandler,\n  backing: CacheHandler,\n  cacheKey: string,\n  softTags: string[],\n  frontEntry: CacheEntry\n): Promise<void> {\n  try {\n    const backingEntry = await backing.get(cacheKey, softTags)\n\n    if (!backingEntry) {\n      // The backing no longer has this entry (it was purged out-of-band). The\n      // cache-handler interface has no per-key delete, so evict the front entry\n      // by overwriting it with an already-expired copy: the next read sees a\n      // front miss, falls through to the (also empty) backing, and the wrapper\n      // regenerates. The entry we just served was the last stale read.\n      await front.set(cacheKey, Promise.resolve(toExpiredEntry(frontEntry)))\n\n      return\n    }\n\n    if (backingEntry.timestamp > frontEntry.timestamp) {\n      await front.set(cacheKey, Promise.resolve(backingEntry))\n    } else {\n      // The front is already up to date, so the backing entry goes unused.\n      // Release its stream without awaiting: a teed stream's `cancel()` only\n      // settles once the sibling branch (retained by the backing handler) is\n      // also cancelled, so awaiting it here would hang the reconcile.\n      void backingEntry.value.cancel()\n    }\n  } catch {\n    // Background warming; failures are non-fatal.\n  }\n}\n\n/**\n * Mirror a backing entry into the front.\n */\nasync function mirrorIntoFront(\n  front: CacheHandler,\n  cacheKey: string,\n  entry: CacheEntry\n): Promise<void> {\n  try {\n    await front.set(cacheKey, Promise.resolve(entry))\n  } catch {\n    // Background warming; failures are non-fatal.\n  }\n}\n\n/**\n * Build an already-expired copy of an entry, used to evict it from the front\n * handler (which has no per-key delete) once the backing no longer has it. The\n * default handler treats a negative `expire` as an eviction sentinel and\n * reports the entry as missing on the next read. A negative `expire` is used\n * rather than `0` because the dev front handler enforces a minimum retention,\n * so a `0` `expire` would be kept alive by that minimum instead of evicted. The\n * value is never read once the entry is evicted, but it must carry at least one\n * byte because the built-in LRU cache refuses to store size-0 entries.\n */\nfunction toExpiredEntry(entry: CacheEntry): CacheEntry {\n  return {\n    ...entry,\n    expire: -1,\n    value: new ReadableStream({\n      start(controller) {\n        controller.enqueue(new Uint8Array(1))\n        controller.close()\n      },\n    }),\n  }\n}\n","import { createDefaultCacheHandler } from '../lib/cache-handlers/default'\nimport type { CacheHandler } from '../lib/cache-handlers/types'\nimport {\n  createTieredCacheHandler,\n  type CacheReadWriteHandler,\n} from './tiered-cache-handler'\n\nconst debug = process.env.NEXT_PRIVATE_DEBUG_CACHE\n  ? (message: string, ...args: any[]) => {\n      console.log(`use-cache: ${message}`, ...args)\n    }\n  : undefined\n\nconst handlersSymbol = Symbol.for('@next/cache-handlers')\nconst handlersMapSymbol = Symbol.for('@next/cache-handlers-map')\nconst handlersSetSymbol = Symbol.for('@next/cache-handlers-set')\nconst privateHandlerSymbol = Symbol.for('@next/cache-handlers-private')\nconst builtInHandlersSymbol = Symbol.for('@next/cache-handlers-built-in')\nconst devFrontHandlersSymbol = Symbol.for('@next/cache-handlers-dev-fronts')\nconst devTieredHandlersSymbol = Symbol.for('@next/cache-handlers-dev-tiered')\nconst memoryCacheDisabledSymbol = Symbol.for(\n  '@next/cache-handlers-memory-disabled'\n)\n\n/**\n * The in-memory size used for the dev-only built-in handlers (the private\n * handler, the size-0 replacement, and the per-kind front handlers for custom\n * kinds). Mirrors the framework default so `cacheMaxMemorySize: 0` does not\n * disable caching in development.\n */\nconst DEV_MEMORY_CACHE_SIZE = 50 * 1024 * 1024\n\n/**\n * The reference to the cache handlers. We store the cache handlers on the\n * global object so that we can access the same instance across different\n * boundaries (such as different copies of the same module).\n */\nconst reference: typeof globalThis & {\n  [handlersSymbol]?: {\n    RemoteCache?: CacheHandler\n    DefaultCache?: CacheHandler\n  }\n  [handlersMapSymbol]?: Map<string, CacheHandler>\n  [handlersSetSymbol]?: Set<CacheHandler>\n  [builtInHandlersSymbol]?: Set<CacheHandler>\n  // DEV-only\n  [privateHandlerSymbol]?: CacheHandler\n  [devFrontHandlersSymbol]?: Map<string, CacheHandler>\n  [devTieredHandlersSymbol]?: Map<string, CacheReadWriteHandler>\n  [memoryCacheDisabledSymbol]?: boolean\n} = globalThis\n\n/**\n * Initialize the cache handlers.\n * @param cacheMaxMemorySize - The maximum memory size of the cache in bytes, if\n *  not provided, the default memory size will be used.\n * @returns `true` if the cache handlers were initialized, `false` if they were already initialized.\n */\nexport function initializeCacheHandlers(cacheMaxMemorySize: number): boolean {\n  // If the cache handlers have already been initialized, don't do it again.\n  if (reference[handlersMapSymbol]) {\n    debug?.('cache handlers already initialized')\n    return false\n  }\n\n  debug?.('initializing cache handlers')\n  const handlersMap = new Map<string, CacheHandler>()\n  reference[handlersMapSymbol] = handlersMap\n  const builtInHandlers = new Set<CacheHandler>()\n  reference[builtInHandlersSymbol] = builtInHandlers\n\n  // In development, `cacheMaxMemorySize: 0` would make the built-in default\n  // handler a no-op, so every reload would miss. Use a real in-memory size\n  // instead so dev stays fast; the \"use cache\" wrapper forces a dynamic cache\n  // life for this case so it still behaves close to \"no cache\" (serve stale,\n  // regenerate in the background). Production keeps the no-op handler.\n  const builtInSize =\n    process.env.__NEXT_DEV_SERVER && cacheMaxMemorySize === 0\n      ? DEV_MEMORY_CACHE_SIZE\n      : cacheMaxMemorySize\n\n  // Initialize the cache from the symbol contents first.\n  if (reference[handlersSymbol]) {\n    let fallback: CacheHandler\n    if (reference[handlersSymbol].DefaultCache) {\n      debug?.('setting \"default\" cache handler from symbol')\n      fallback = reference[handlersSymbol].DefaultCache\n    } else {\n      debug?.('setting \"default\" cache handler from default')\n      fallback = createDefaultCacheHandler(builtInSize)\n      builtInHandlers.add(fallback)\n    }\n\n    handlersMap.set('default', fallback)\n\n    if (reference[handlersSymbol].RemoteCache) {\n      debug?.('setting \"remote\" cache handler from symbol')\n      handlersMap.set('remote', reference[handlersSymbol].RemoteCache)\n    } else {\n      debug?.('setting \"remote\" cache handler from default')\n      handlersMap.set('remote', fallback)\n    }\n  } else {\n    const handler = createDefaultCacheHandler(builtInSize)\n    builtInHandlers.add(handler)\n\n    debug?.('setting \"default\" cache handler from default')\n    handlersMap.set('default', handler)\n    debug?.('setting \"remote\" cache handler from default')\n    handlersMap.set('remote', handler)\n  }\n\n  // Create a set of the cache handlers.\n  reference[handlersSetSymbol] = new Set(handlersMap.values())\n\n  // In development we add dedicated built-in in-memory handlers so that reloads\n  // are fast. These are always built-in handlers, never a user-configured one,\n  // and are gated on the dev server so production behaves exactly as\n  // configured.\n  if (process.env.__NEXT_DEV_SERVER) {\n    reference[memoryCacheDisabledSymbol] = cacheMaxMemorySize === 0\n\n    // Private caches are persisted here so reloads are fast. Private entries\n    // can hold data specific to the incoming request (for example, derived from\n    // its cookies or headers), so this is never the user-configured `default`\n    // alias. Sized so it still caches under `cacheMaxMemorySize: 0` (otherwise\n    // it would become the no-op stub and private reloads would miss).\n    reference[privateHandlerSymbol] = createDefaultCacheHandler(\n      DEV_MEMORY_CACHE_SIZE\n    )\n\n    // Built-in front handlers, one per custom kind, and the tiered handlers\n    // that place a front in front of a (possibly slow or remote) backing\n    // handler so cache hits resolve in a microtask, are both created per kind\n    // in `setCacheHandler`.\n    reference[devFrontHandlersSymbol] = new Map()\n    reference[devTieredHandlersSymbol] = new Map()\n  }\n\n  return true\n}\n\n/**\n * Get a cache handler by kind.\n * @param kind - The kind of cache handler to get.\n * @returns The cache handler, or `undefined` if it does not exist.\n * @throws If the cache handlers are not initialized.\n */\nexport function getCacheHandler(kind: string): CacheHandler | undefined {\n  // This should never be called before initializeCacheHandlers.\n  if (!reference[handlersMapSymbol]) {\n    throw new Error('Cache handlers not initialized')\n  }\n\n  return reference[handlersMapSymbol].get(kind)\n}\n\n/**\n * Get the dedicated in-memory cache handler that persists private caches in\n * development. Returns `undefined` outside the dev server, where private caches\n * must not be persisted. This is intentionally not part of the kind-keyed\n * handlers map so that it can never be replaced by a user-configured handler.\n */\nexport function getPrivateCacheHandler(): CacheHandler | undefined {\n  // This should never be called before initializeCacheHandlers.\n  if (!reference[handlersMapSymbol]) {\n    throw new Error('Cache handlers not initialized')\n  }\n\n  return reference[privateHandlerSymbol]\n}\n\n/**\n * Whether the in-memory cache is disabled (`cacheMaxMemorySize: 0`). Dev-only\n * signal used to force a dynamic cache life so that the size-0 case still\n * serves stale and regenerates in the background. Always `false` in production.\n */\nexport function isMemoryCacheDisabled(): boolean {\n  return reference[memoryCacheDisabledSymbol] ?? false\n}\n\n/**\n * Whether `kind` is backed by a real user-configured handler rather than the\n * built-in in-memory default. Such a handler may be slow or remote, so in\n * development a built-in front handler is placed in front of it (see\n * `getDevTieredCacheHandler`) to keep cache hits microtask-fast. The presence\n * of a dev front handler is the signal, since front handlers are created\n * exactly for user-registered kinds. Always `false` in production.\n */\nexport function isCustomCacheHandler(kind: string): boolean {\n  if (!process.env.__NEXT_DEV_SERVER) {\n    return false\n  }\n\n  return reference[devFrontHandlersSymbol]?.has(kind) ?? false\n}\n\n/**\n * Whether `kind` resolves to one of the in-memory handlers that\n * `initializeCacheHandlers` constructs itself, rather than one supplied by the\n * platform through the `@next/cache-handlers` global or by `cacheHandlers`\n * config. Reads from a built-in handler are map lookups, so repeating one\n * within a request costs nothing; reads from a supplied handler may be a\n * network round trip. Unlike `isCustomCacheHandler`, this holds in production.\n *\n * Tracking the instances rather than the kinds is what keeps aliasing correct:\n * self-hosted, `remote` resolves to the same handler as `default` and so\n * reports as built-in, while a platform-supplied `remote` does not.\n */\nexport function isBuiltInCacheHandler(kind: string): boolean {\n  const handler = reference[handlersMapSymbol]?.get(kind)\n\n  return (\n    handler !== undefined &&\n    Boolean(reference[builtInHandlersSymbol]?.has(handler))\n  )\n}\n\n/**\n * Get the dev-only tiered cache handler for a custom `kind`: a fast built-in\n * in-memory front handler in front of the user-configured backing handler, so\n * cache hits resolve in a microtask. Returns `undefined` if there is none (a\n * built-in kind, or production).\n */\nexport function getDevTieredCacheHandler(\n  kind: string\n): CacheReadWriteHandler | undefined {\n  if (!process.env.__NEXT_DEV_SERVER) {\n    return undefined\n  }\n\n  return reference[devTieredHandlersSymbol]?.get(kind)\n}\n\n/**\n * Get an iterator over the cache handlers.\n * @returns An iterator over the cache handlers, or `undefined` if they are not\n * initialized.\n */\nexport function getCacheHandlers(): IterableIterator<CacheHandler> | undefined {\n  const handlersSet = reference[handlersSetSymbol]\n  if (!handlersSet) {\n    return undefined\n  }\n\n  if (process.env.__NEXT_DEV_SERVER) {\n    return iterateCacheHandlersWithDevBuiltIns(handlersSet)\n  }\n\n  return handlersSet.values()\n}\n\n/**\n * Yields the registered handlers plus the dev-only built-in handlers (the\n * private handler and the per-kind front handlers). The built-in handlers are\n * not part of the registered set, but tag operations must still reach them:\n * their `updateTags` writes the shared tags manifest that their `get` consults,\n * so `revalidateTag` can invalidate their entries.\n */\nfunction* iterateCacheHandlersWithDevBuiltIns(\n  handlersSet: Set<CacheHandler>\n): IterableIterator<CacheHandler> {\n  yield* handlersSet\n\n  const privateHandler = reference[privateHandlerSymbol]\n  if (privateHandler) {\n    yield privateHandler\n  }\n\n  const devFrontHandlers = reference[devFrontHandlersSymbol]\n  if (devFrontHandlers) {\n    yield* devFrontHandlers.values()\n  }\n}\n\n/**\n * Get a map iterator over the cache handlers (keyed by kind).\n * @returns An iterator over the cache handler entries, or `undefined` if they\n * are not initialized.\n * @throws If the cache handlers are not initialized.\n */\nexport function getCacheHandlerEntries():\n  | IterableIterator<[string, CacheHandler]>\n  | undefined {\n  const handlersMap = reference[handlersMapSymbol]\n  if (!handlersMap) {\n    return undefined\n  }\n\n  if (process.env.__NEXT_DEV_SERVER) {\n    return iterateCacheHandlerEntriesWithDevBuiltIns(handlersMap)\n  }\n\n  return handlersMap.entries()\n}\n\n/**\n * Yields the registered entries plus the dev-only private handler under its\n * kind, so that per-kind tag operations (`refreshTags` / `getExpiration` for\n * implicit tags) apply to private entries. Custom-kind front handlers are\n * intentionally omitted: the backing handler (already in the map) is\n * authoritative for that kind's `getExpiration`, and a front entry is discarded\n * via that same value.\n */\nfunction* iterateCacheHandlerEntriesWithDevBuiltIns(\n  handlersMap: Map<string, CacheHandler>\n): IterableIterator<[string, CacheHandler]> {\n  yield* handlersMap.entries()\n\n  const privateHandler = reference[privateHandlerSymbol]\n  if (privateHandler) {\n    const privateEntry: [string, CacheHandler] = ['private', privateHandler]\n    yield privateEntry\n  }\n}\n\n/**\n * Set a cache handler by kind.\n * @param kind - The kind of cache handler to set.\n * @param cacheHandler - The cache handler to set.\n */\nexport function setCacheHandler(\n  kind: string,\n  cacheHandler: CacheHandler\n): void {\n  // This should never be called before initializeCacheHandlers.\n  if (!reference[handlersMapSymbol] || !reference[handlersSetSymbol]) {\n    throw new Error('Cache handlers not initialized')\n  }\n\n  debug?.('setting cache handler for \"%s\"', kind)\n  reference[handlersMapSymbol].set(kind, cacheHandler)\n  reference[handlersSetSymbol].add(cacheHandler)\n\n  // A user-configured handler may be slow or remote. In development, give it a\n  // dedicated built-in in-memory front handler so cache hits resolve in a\n  // microtask, and pair the two into a tiered handler the wrapper reads\n  // through. Both are created alongside registration so their lifecycle matches\n  // the backing handler's, and the front handler's presence is the signal that\n  // this kind is backed by a real handler (see `isCustomCacheHandler`). Being a\n  // built-in default handler, the front inherits the dev minimum retention, so\n  // a short-`expire` value still hits the front instead of falling through to\n  // the slow backing on every read.\n  if (process.env.__NEXT_DEV_SERVER) {\n    const frontHandler = createDefaultCacheHandler(DEV_MEMORY_CACHE_SIZE)\n    reference[devFrontHandlersSymbol]?.set(kind, frontHandler)\n    reference[devTieredHandlersSymbol]?.set(\n      kind,\n      createTieredCacheHandler(frontHandler, cacheHandler)\n    )\n  }\n}\n","/**\n * Interop between \"export default\" and \"module.exports\".\n */\nexport function interopDefault(mod: any) {\n  return mod.default || mod\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { NextConfigRuntime } from '../../config-shared'\nimport type { UrlWithParsedQuery } from 'node:url'\nimport type { ServerCacheStatus } from '../../../next-devtools/dev-overlay/cache-indicator'\nimport type { AnyStream } from '../../app-render/stream-ops'\n\nexport type RevalidateFn = (config: {\n  urlPath: string\n  headers: { [key: string]: string | string[] }\n  opts: { unstable_onlyGenerated?: boolean }\n}) => Promise<void>\n\n// The RouterServerContext contains instance specific\n// information that isn't available/relevant when\n// deployed in serverless environments, the key is\n// the relative project dir this allows separate contexts\n// when running multiple next instances in same process\nexport type RouterServerContext = Record<\n  string,\n  {\n    // hostname the server is started with\n    hostname?: string\n    // revalidate function to bypass going through network\n    // to invoke revalidate request (uses mocked req/res)\n    revalidate?: RevalidateFn\n    // function to render the 404 page\n    render404?: (\n      req: IncomingMessage,\n      res: ServerResponse,\n      parsedUrl?: UrlWithParsedQuery,\n      setHeaders?: boolean\n    ) => Promise<void>\n    // exposing nextConfig for dev mode specifically\n    nextConfig?: NextConfigRuntime\n    // whether running in custom server mode\n    isCustomServer?: boolean\n    // whether test proxy is enabled\n    experimentalTestProxy?: boolean\n    // allow dev server to log with original stack\n    logErrorWithOriginalStack?: (err: unknown, type: string) => void\n    // allow setting ISR status in dev\n    setIsrStatus?: (key: string, value: boolean | undefined) => void\n    setReactDebugChannel?: (\n      debugChannel: { readable: AnyStream },\n      htmlRequestId: string,\n      requestId: string\n    ) => void\n    setCacheStatus?: (status: ServerCacheStatus, htmlRequestId: string) => void\n    sendErrorsToBrowser?: (\n      errorsRscStream: AnyStream,\n      htmlRequestId: string\n    ) => void\n    // indicates request handlers are already wrapped by next-server tracing\n    isWrappedByNextServer?: boolean\n  }\n>\n\nexport const RouterServerContextSymbol = Symbol.for(\n  '@next/router-server-methods'\n)\n\nexport const routerServerGlobal = globalThis as typeof globalThis & {\n  [RouterServerContextSymbol]?: RouterServerContext\n}\n","import { NEXT_URL } from '../client/components/app-router-headers'\nimport type { Rewrite } from './load-custom-routes'\nimport type { DeepReadonly } from '../shared/lib/deep-readonly'\n\nexport function isInterceptionRouteRewrite(route: DeepReadonly<Rewrite>) {\n  // When we generate interception rewrites in the above implementation, we always do so with only a single `has` condition.\n  return route.has?.[0]?.key === NEXT_URL\n}\n","export const RSC_HEADER = 'rsc' as const\nexport const ACTION_HEADER = 'next-action' as const\n// TODO: Instead of sending the full router state, we only need to send the\n// segment path. Saves bytes. Then we could also use this field for segment\n// prefetches, which also need to specify a particular segment.\nexport const NEXT_ROUTER_STATE_TREE_HEADER = 'next-router-state-tree' as const\nexport const NEXT_ROUTER_PREFETCH_HEADER = 'next-router-prefetch' as const\n// This contains the path to the segment being prefetched.\n// TODO: If we change next-router-state-tree to be a segment path, we can use\n// that instead. Then next-router-prefetch and next-router-segment-prefetch can\n// be merged into a single enum.\nexport const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER =\n  'next-router-segment-prefetch' as const\nexport const NEXT_HMR_REFRESH_HEADER = 'next-hmr-refresh' as const\nexport const NEXT_URL = 'next-url' as const\nexport const RSC_CONTENT_TYPE_HEADER = 'text/x-component' as const\n\n// Cookie for the Instant Navigation Testing API. Sent automatically with all\n// requests while a navigation lock is held; the server uses its presence to\n// render only the shell. Not exposed in production builds by default.\nexport const NEXT_INSTANT_TEST_COOKIE =\n  'next-instant-navigation-testing' as const\n\nexport const FLIGHT_HEADERS = [\n  RSC_HEADER,\n  NEXT_ROUTER_STATE_TREE_HEADER,\n  NEXT_ROUTER_PREFETCH_HEADER,\n  NEXT_HMR_REFRESH_HEADER,\n  NEXT_ROUTER_SEGMENT_PREFETCH_HEADER,\n] as const\n\nexport const NEXT_RSC_UNION_QUERY = '_rsc' as const\n\nexport const NEXT_ROUTER_STALE_TIME_HEADER = 'x-nextjs-stale-time' as const\nexport const NEXT_DID_POSTPONE_HEADER = 'x-nextjs-postponed' as const\nexport const NEXT_REWRITTEN_PATH_HEADER = 'x-nextjs-rewritten-path' as const\nexport const NEXT_REWRITTEN_QUERY_HEADER = 'x-nextjs-rewritten-query' as const\nexport const NEXT_IS_PRERENDER_HEADER = 'x-nextjs-prerender' as const\nexport const NEXT_ACTION_NOT_FOUND_HEADER = 'x-nextjs-action-not-found' as const\nexport const NEXT_REQUEST_ID_HEADER = 'x-nextjs-request-id' as const\nexport const NEXT_HTML_REQUEST_ID_HEADER = 'x-nextjs-html-request-id' as const\n\n// TODO: Should this include nextjs in the name, like the others?\nexport const NEXT_ACTION_REVALIDATED_HEADER = 'x-action-revalidated' as const\n","import '../../build/adapter/setup-node-env.external'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type {\n  InstrumentationOnRequestError,\n  RequestErrorContext,\n} from '../instrumentation/types'\nimport type { ParsedUrlQuery } from 'node:querystring'\nimport type { UrlWithParsedQuery } from 'node:url'\nimport type {\n  PrerenderManifest,\n  RequiredServerFilesManifest,\n} from '../../build'\nimport type { DevRoutesManifest } from '../lib/router-utils/setup-dev-bundler'\nimport type { RouteDefinition } from '../route-definitions/route-definition'\nimport type { DeepReadonly } from '../../shared/lib/deep-readonly'\nimport {\n  BUILD_ID_FILE,\n  BUILD_MANIFEST,\n  CLIENT_REFERENCE_MANIFEST,\n  DYNAMIC_CSS_MANIFEST,\n  NEXT_FONT_MANIFEST,\n  PREFETCH_HINTS,\n  PRERENDER_MANIFEST,\n  REACT_LOADABLE_MANIFEST,\n  ROUTES_MANIFEST,\n  SERVER_FILES_MANIFEST,\n  SERVER_REFERENCE_MANIFEST,\n  SUBRESOURCE_INTEGRITY_MANIFEST,\n} from '../../shared/lib/constants'\nimport { parseReqUrl } from '../../lib/url'\nimport {\n  normalizeLocalePath,\n  type PathLocale,\n} from '../../shared/lib/i18n/normalize-locale-path'\nimport { isDynamicRoute } from '../../shared/lib/router/utils'\nimport { removePathPrefix } from '../../shared/lib/router/utils/remove-path-prefix'\nimport { getServerUtils } from '../server-utils'\nimport { detectDomainLocale } from '../../shared/lib/i18n/detect-domain-locale'\nimport { getHostname } from '../../shared/lib/get-hostname'\nimport { checkIsOnDemandRevalidate } from '../api-utils'\nimport type { PreviewData } from '../../types'\nimport type { BuildManifest } from '../get-page-files'\nimport type { ReactLoadableManifest } from '../load-components'\nimport type { NextFontManifest } from '../../build/webpack/plugins/next-font-manifest-plugin'\nimport { normalizeDataPath } from '../../shared/lib/page-path/normalize-data-path'\nimport { pathHasPrefix } from '../../shared/lib/router/utils/path-has-prefix'\nimport {\n  addRequestMeta,\n  getRequestMeta,\n  type NextIncomingMessage,\n} from '../request-meta'\nimport { patchSetHeaderWithCookieSupport } from '../lib/patch-set-header'\nimport { normalizePagePath } from '../../shared/lib/page-path/normalize-page-path'\nimport { isStaticMetadataRoute } from '../../lib/metadata/is-metadata-route'\nimport { IncrementalCache } from '../lib/incremental-cache'\nimport { initializeCacheHandlers, setCacheHandler } from '../use-cache/handlers'\nimport { interopDefault } from '../app-render/interop-default'\nimport { RouteKind } from '../route-kind'\nimport type { BaseNextRequest } from '../base-http'\nimport type { I18NConfig, NextConfigRuntime } from '../config-shared'\nimport ResponseCache, { type ResponseGenerator } from '../response-cache'\nimport { normalizeAppPath } from '../../shared/lib/router/utils/app-paths'\nimport {\n  RouterServerContextSymbol,\n  routerServerGlobal,\n  type RouterServerContext,\n} from '../lib/router-utils/router-server-context'\nimport { decodePathParams } from '../lib/router-utils/decode-path-params'\nimport { removeTrailingSlash } from '../../shared/lib/router/utils/remove-trailing-slash'\nimport { isInterceptionRouteRewrite } from '../../lib/is-interception-route-rewrite'\n\n/**\n * RouteModuleOptions is the options that are passed to the route module, other\n * route modules should extend this class to add specific options for their\n * route.\n */\nexport interface RouteModuleOptions<\n  D extends RouteDefinition = RouteDefinition,\n  U = unknown,\n> {\n  readonly definition: Readonly<D>\n  readonly userland: Readonly<U>\n  readonly distDir: string\n  readonly relativeProjectDir: string\n}\n\n/**\n * RouteHandlerContext is the base context for a route handler.\n */\nexport interface RouteModuleHandleContext {\n  /**\n   * Any matched parameters for the request. This is only defined for dynamic\n   * routes.\n   */\n  params: Record<string, string | string[] | undefined> | undefined\n}\n\nconst dynamicImportEsmDefault = (id: string) =>\n  import(/* webpackIgnore: true */ /* turbopackIgnore: true */ id).then(\n    (mod) => mod.default || mod\n  )\n\n/**\n * RouteModule is the base class for all route modules. This class should be\n * extended by all route modules.\n */\nexport abstract class RouteModule<\n  D extends RouteDefinition = RouteDefinition,\n  U = unknown,\n> {\n  /**\n   * The userland module. This is the module that is exported from the user's\n   * code. Exposed as a getter so subclasses can override with lazy loading.\n   */\n  protected _userland: Readonly<U>\n\n  get userland(): Readonly<U> {\n    return this._userland\n  }\n\n  /**\n   * The definition of the route.\n   */\n  public readonly definition: Readonly<D>\n\n  /**\n   * The shared modules that are exposed and required for the route module.\n   */\n  public static readonly sharedModules: any\n\n  public isDev: boolean\n  public distDir: string\n  public relativeProjectDir: string\n  public incrementCache?: IncrementalCache\n  public responseCache?: ResponseCache\n\n  constructor({\n    userland,\n    definition,\n    distDir,\n    relativeProjectDir,\n  }: RouteModuleOptions<D, U>) {\n    this._userland = userland\n    this.definition = definition\n    this.isDev = !!process.env.__NEXT_DEV_SERVER\n    this.distDir = distDir\n    this.relativeProjectDir = relativeProjectDir\n  }\n\n  private getRouterServerContext(\n    req: NextIncomingMessage\n  ): RouterServerContext[string] | undefined {\n    const hostname = getRequestMeta(req, 'hostname')\n    const revalidate = getRequestMeta(req, 'revalidate')\n    const render404 = getRequestMeta(req, 'render404')\n    const relativeProjectDir =\n      getRequestMeta(req, 'relativeProjectDir') || this.relativeProjectDir\n    const routerServerContext =\n      routerServerGlobal[RouterServerContextSymbol]?.[relativeProjectDir]\n\n    return {\n      ...routerServerContext,\n      ...(hostname !== undefined ? { hostname } : {}),\n      ...(revalidate !== undefined ? { revalidate } : {}),\n      ...(render404 !== undefined ? { render404 } : {}),\n    }\n  }\n\n  public normalizeUrl(\n    _req: IncomingMessage | BaseNextRequest,\n    _parsedUrl: UrlWithParsedQuery\n  ) {}\n\n  public async instrumentationOnRequestError(\n    req: IncomingMessage | BaseNextRequest,\n    ...args: Parameters<InstrumentationOnRequestError>\n  ) {\n    if (process.env.NEXT_RUNTIME === 'edge') {\n      const { getEdgeInstrumentationModule } = await import('../web/globals')\n      const instrumentation = await getEdgeInstrumentationModule()\n\n      if (instrumentation) {\n        await instrumentation.onRequestError?.(...args)\n      }\n    } else {\n      const { join } = require('node:path') as typeof import('node:path')\n      const absoluteProjectDir = join(\n        /* turbopackIgnore: true */\n        process.cwd(),\n        getRequestMeta(req, 'relativeProjectDir') || this.relativeProjectDir\n      )\n\n      const { instrumentationOnRequestError } = await import(\n        '../lib/router-utils/instrumentation-globals.external.js'\n      )\n\n      return instrumentationOnRequestError(\n        absoluteProjectDir,\n        this.distDir,\n        ...args\n      )\n    }\n  }\n\n  private loadManifests(\n    srcPage: string,\n    projectDir?: string\n  ): {\n    buildId: string\n    buildManifest: BuildManifest\n    fallbackBuildManifest: BuildManifest\n    routesManifest: DeepReadonly<DevRoutesManifest>\n    nextFontManifest: DeepReadonly<NextFontManifest>\n    prerenderManifest: DeepReadonly<PrerenderManifest>\n    serverFilesManifest: DeepReadonly<RequiredServerFilesManifest> | undefined\n    reactLoadableManifest: DeepReadonly<ReactLoadableManifest>\n    subresourceIntegrityManifest: any\n    clientReferenceManifest: any\n    serverActionsManifest: any\n    dynamicCssManifest: any\n    prefetchHintsManifest: Record<string, any> | undefined\n    interceptionRoutePatterns: RegExp[]\n  } {\n    let result\n    if (process.env.NEXT_RUNTIME === 'edge') {\n      const { getEdgePreviewProps } =\n        require('../web/get-edge-preview-props') as typeof import('../web/get-edge-preview-props')\n\n      const maybeJSONParse = (str?: string) =>\n        str ? JSON.parse(str) : undefined\n\n      result = {\n        buildId: process.env.__NEXT_BUILD_ID || '',\n        buildManifest: self.__BUILD_MANIFEST as any,\n        fallbackBuildManifest: {} as any,\n        reactLoadableManifest: maybeJSONParse(self.__REACT_LOADABLE_MANIFEST),\n        nextFontManifest: maybeJSONParse(self.__NEXT_FONT_MANIFEST),\n        prerenderManifest: {\n          routes: {},\n          dynamicRoutes: {},\n          notFoundRoutes: [],\n          version: 4,\n          preview: getEdgePreviewProps(),\n        } as const,\n        routesManifest: {\n          version: 4,\n          caseSensitive: Boolean(process.env.__NEXT_CASE_SENSITIVE_ROUTES),\n          basePath: process.env.__NEXT_BASE_PATH || '',\n          rewrites: (process.env.__NEXT_REWRITES as any) || {\n            beforeFiles: [],\n            afterFiles: [],\n            fallback: [],\n          },\n          redirects: [],\n          headers: [],\n          onMatchHeaders: [],\n          i18n:\n            (process.env.__NEXT_I18N_CONFIG as any as I18NConfig) || undefined,\n          skipProxyUrlNormalize: Boolean(\n            process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE\n          ),\n        },\n        serverFilesManifest: self.__SERVER_FILES_MANIFEST,\n        clientReferenceManifest: self.__RSC_MANIFEST?.[srcPage],\n        serverActionsManifest: maybeJSONParse(self.__RSC_SERVER_MANIFEST),\n        subresourceIntegrityManifest: maybeJSONParse(\n          self.__SUBRESOURCE_INTEGRITY_MANIFEST\n        ),\n        dynamicCssManifest: maybeJSONParse(self.__DYNAMIC_CSS_MANIFEST),\n        // Edge pages are always dynamic so prefetch inlining hints\n        // don't apply. The runtime handles missing hints gracefully.\n        prefetchHintsManifest: undefined,\n        interceptionRoutePatterns: (\n          maybeJSONParse(self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST) ?? []\n        ).map((rewrite: any) => new RegExp(rewrite.regex)),\n      }\n    } else {\n      if (!projectDir) {\n        throw new Error('Invariant: projectDir is required for node runtime')\n      }\n      const { loadManifestFromRelativePath } =\n        require('../load-manifest.external') as typeof import('../load-manifest.external')\n      const normalizedPagePath = normalizePagePath(srcPage)\n\n      const router =\n        this.definition.kind === RouteKind.PAGES ||\n        this.definition.kind === RouteKind.PAGES_API\n          ? 'pages'\n          : 'app'\n\n      const [\n        routesManifest,\n        prerenderManifest,\n        buildManifest,\n        fallbackBuildManifest,\n        reactLoadableManifest,\n        nextFontManifest,\n        clientReferenceManifest,\n        serverActionsManifest,\n        subresourceIntegrityManifest,\n        serverFilesManifest,\n        buildId,\n        dynamicCssManifest,\n        prefetchHintsManifest,\n      ] = [\n        loadManifestFromRelativePath<DevRoutesManifest>({\n          projectDir,\n          distDir: this.distDir,\n          manifest: ROUTES_MANIFEST,\n          shouldCache: !this.isDev,\n        }),\n        loadManifestFromRelativePath<PrerenderManifest>({\n          projectDir,\n          distDir: this.distDir,\n          manifest: PRERENDER_MANIFEST,\n          shouldCache: !this.isDev,\n        }),\n        loadManifestFromRelativePath<BuildManifest>({\n          projectDir,\n          distDir: this.distDir,\n          manifest: BUILD_MANIFEST,\n          shouldCache: !this.isDev,\n        }),\n        srcPage === '/_error'\n          ? loadManifestFromRelativePath<BuildManifest>({\n              projectDir,\n              distDir: this.distDir,\n              manifest: `fallback-${BUILD_MANIFEST}`,\n              shouldCache: !this.isDev,\n              handleMissing: true,\n            })\n          : ({} as BuildManifest),\n        loadManifestFromRelativePath<ReactLoadableManifest>({\n          projectDir,\n          distDir: this.distDir,\n          manifest: process.env.TURBOPACK\n            ? `server/${router === 'app' ? 'app' : 'pages'}${normalizedPagePath}/${REACT_LOADABLE_MANIFEST}`\n            : REACT_LOADABLE_MANIFEST,\n          handleMissing: true,\n          shouldCache: !this.isDev,\n        }),\n        loadManifestFromRelativePath<NextFontManifest>({\n          projectDir,\n          distDir: this.distDir,\n          manifest: `server/${NEXT_FONT_MANIFEST}.json`,\n          shouldCache: !this.isDev,\n        }),\n        router === 'app' && !isStaticMetadataRoute(srcPage)\n          ? loadManifestFromRelativePath({\n              distDir: this.distDir,\n              projectDir,\n              useEval: true,\n              handleMissing: true,\n              manifest: `server/app${srcPage.replace(/%5F/g, '_') + '_' + CLIENT_REFERENCE_MANIFEST}.js`,\n              shouldCache: !this.isDev,\n            })\n          : undefined,\n        router === 'app'\n          ? loadManifestFromRelativePath<any>({\n              distDir: this.distDir,\n              projectDir,\n              manifest: `server/${SERVER_REFERENCE_MANIFEST}.json`,\n              handleMissing: true,\n              shouldCache: !this.isDev,\n            })\n          : {},\n        loadManifestFromRelativePath<Record<string, string>>({\n          projectDir,\n          distDir: this.distDir,\n          manifest: `server/${SUBRESOURCE_INTEGRITY_MANIFEST}.json`,\n          handleMissing: true,\n          shouldCache: !this.isDev,\n        }),\n        this.isDev\n          ? undefined\n          : loadManifestFromRelativePath<RequiredServerFilesManifest>({\n              projectDir,\n              distDir: this.distDir,\n              shouldCache: true,\n              manifest: `${SERVER_FILES_MANIFEST}.json`,\n            }),\n        this.isDev\n          ? 'development'\n          : loadManifestFromRelativePath<any>({\n              projectDir,\n              distDir: this.distDir,\n              manifest: BUILD_ID_FILE,\n              skipParse: true,\n              shouldCache: true,\n            }),\n        loadManifestFromRelativePath<any>({\n          projectDir,\n          distDir: this.distDir,\n          manifest: DYNAMIC_CSS_MANIFEST,\n          shouldCache: !this.isDev,\n          handleMissing: true,\n        }),\n        router === 'app'\n          ? loadManifestFromRelativePath<Record<string, any>>({\n              projectDir,\n              distDir: this.distDir,\n              manifest: `server/${PREFETCH_HINTS}`,\n              shouldCache: !this.isDev,\n              handleMissing: true,\n            })\n          : undefined,\n      ]\n\n      result = {\n        buildId,\n        buildManifest,\n        fallbackBuildManifest,\n        routesManifest,\n        nextFontManifest,\n        prerenderManifest,\n        serverFilesManifest,\n        reactLoadableManifest,\n        clientReferenceManifest: (clientReferenceManifest as any)\n          ?.__RSC_MANIFEST?.[srcPage.replace(/%5F/g, '_')],\n        serverActionsManifest,\n        subresourceIntegrityManifest,\n        dynamicCssManifest,\n        prefetchHintsManifest,\n        interceptionRoutePatterns: routesManifest.rewrites.beforeFiles\n          .filter(isInterceptionRouteRewrite)\n          .map((rewrite) => new RegExp(rewrite.regex)),\n      }\n    }\n\n    return result\n  }\n\n  public async loadCustomCacheHandlers(\n    req: IncomingMessage | BaseNextRequest,\n    nextConfig: NextConfigRuntime\n  ) {\n    if (process.env.NEXT_RUNTIME !== 'edge') {\n      const { cacheMaxMemorySize, cacheHandlers } = nextConfig\n      if (!cacheHandlers) return\n\n      // If we've already initialized the cache handlers interface, don't do it\n      // again.\n      if (!initializeCacheHandlers(cacheMaxMemorySize)) return\n\n      for (const [kind, handler] of Object.entries(cacheHandlers)) {\n        if (!handler) continue\n\n        const { formatDynamicImportPath } =\n          require('../../lib/format-dynamic-import-path') as typeof import('../../lib/format-dynamic-import-path')\n\n        const { join } = require('node:path') as typeof import('node:path')\n        const absoluteProjectDir = join(\n          /* turbopackIgnore: true */\n          process.cwd(),\n          getRequestMeta(req, 'relativeProjectDir') || this.relativeProjectDir\n        )\n\n        setCacheHandler(\n          kind,\n          interopDefault(\n            await dynamicImportEsmDefault(\n              formatDynamicImportPath(\n                `${absoluteProjectDir}/${this.distDir}`,\n                handler\n              )\n            )\n          )\n        )\n      }\n    }\n  }\n\n  public async getIncrementalCache(\n    req: IncomingMessage | BaseNextRequest,\n    nextConfig: NextConfigRuntime,\n    prerenderManifest: DeepReadonly<PrerenderManifest>,\n    isMinimalMode: boolean\n  ): Promise<IncrementalCache> {\n    if (process.env.NEXT_RUNTIME === 'edge') {\n      return (globalThis as any).__incrementalCache\n    } else {\n      let CacheHandler: any\n      const { cacheHandler } = nextConfig\n\n      if (cacheHandler) {\n        const { formatDynamicImportPath } =\n          require('../../lib/format-dynamic-import-path') as typeof import('../../lib/format-dynamic-import-path')\n\n        CacheHandler = interopDefault(\n          await dynamicImportEsmDefault(\n            formatDynamicImportPath(this.distDir, cacheHandler)\n          )\n        )\n      }\n      const { join } = require('node:path') as typeof import('node:path')\n      const projectDir = join(\n        /* turbopackIgnore: true */\n        process.cwd(),\n        getRequestMeta(req, 'relativeProjectDir') || this.relativeProjectDir\n      )\n\n      await this.loadCustomCacheHandlers(req, nextConfig)\n\n      // incremental-cache is request specific\n      // although can have shared caches in module scope\n      // per-cache handler\n      const incrementalCache = new IncrementalCache({\n        fs: (\n          require('../lib/node-fs-methods') as typeof import('../lib/node-fs-methods')\n        ).nodeFs,\n        dev: this.isDev,\n        requestHeaders: req.headers,\n        allowedRevalidateHeaderKeys:\n          nextConfig.experimental.allowedRevalidateHeaderKeys,\n        minimalMode: isMinimalMode,\n        serverDistDir: `${projectDir}/${this.distDir}/server`,\n        fetchCacheKeyPrefix: nextConfig.experimental.fetchCacheKeyPrefix,\n        maxMemoryCacheSize: nextConfig.cacheMaxMemorySize,\n        flushToDisk: !isMinimalMode && nextConfig.experimental.isrFlushToDisk,\n        getPrerenderManifest: () => prerenderManifest,\n        CurCacheHandler: CacheHandler,\n      })\n\n      // we need to expose this on globalThis as the app-render\n      // workStore grabs the incrementalCache from there\n      ;(globalThis as any).__incrementalCache = incrementalCache\n      return incrementalCache\n    }\n  }\n\n  public async onRequestError(\n    req: IncomingMessage | BaseNextRequest,\n    err: unknown,\n    errorContext: RequestErrorContext,\n    silenceLog: boolean,\n    routerServerContext?: RouterServerContext[string]\n  ) {\n    if (!silenceLog) {\n      if (routerServerContext?.logErrorWithOriginalStack) {\n        routerServerContext.logErrorWithOriginalStack(err, 'app-dir')\n      } else {\n        console.error(err)\n      }\n    }\n    await this.instrumentationOnRequestError(\n      req,\n      err,\n      {\n        path: req.url || '/',\n        headers: req.headers,\n        method: req.method || 'GET',\n      },\n      errorContext\n    )\n  }\n\n  /** A more lightweight version of `prepare()` for only retrieving the config on edge */\n  public getNextConfigEdge(req: NextIncomingMessage): {\n    nextConfig: NextConfigRuntime\n    deploymentId: string\n  } {\n    if (process.env.NEXT_RUNTIME !== 'edge') {\n      throw new Error(\n        'Invariant: getNextConfigEdge must only be called in edge runtime'\n      )\n    }\n\n    let serverFilesManifest = self.__SERVER_FILES_MANIFEST as any as\n      | RequiredServerFilesManifest\n      | undefined\n    const routerServerContext = this.getRouterServerContext(req)\n    const nextConfig =\n      routerServerContext?.nextConfig || serverFilesManifest?.config\n\n    if (!nextConfig) {\n      throw new Error(\"Invariant: nextConfig couldn't be loaded\")\n    }\n\n    let deploymentId\n    if (nextConfig.experimental?.runtimeServerDeploymentId) {\n      if (!process.env.NEXT_DEPLOYMENT_ID) {\n        throw new Error(\n          'process.env.NEXT_DEPLOYMENT_ID is missing but runtimeServerDeploymentId is enabled'\n        )\n      }\n      deploymentId = process.env.NEXT_DEPLOYMENT_ID\n    } else {\n      deploymentId = nextConfig.deploymentId || ''\n    }\n\n    return { nextConfig, deploymentId }\n  }\n\n  public async prepare(\n    req: IncomingMessage | BaseNextRequest,\n    res: ServerResponse | null,\n    {\n      srcPage,\n      multiZoneDraftMode,\n    }: {\n      srcPage: string\n      multiZoneDraftMode?: boolean\n    }\n  ): Promise<\n    | {\n        buildId: string\n        deploymentId: string\n        clientAssetToken: string\n        locale?: string\n        locales?: readonly string[]\n        defaultLocale?: string\n        query: ParsedUrlQuery\n        originalQuery: ParsedUrlQuery\n        originalPathname: string\n        params?: ParsedUrlQuery\n        parsedUrl: UrlWithParsedQuery\n        previewData: PreviewData\n        pageIsDynamic: boolean\n        isDraftMode: boolean\n        resolvedPathname: string\n        encodedResolvedPathname: string\n        isNextDataRequest: boolean\n        buildManifest: DeepReadonly<BuildManifest>\n        fallbackBuildManifest: DeepReadonly<BuildManifest>\n        nextFontManifest: DeepReadonly<NextFontManifest>\n        serverFilesManifest:\n          | DeepReadonly<RequiredServerFilesManifest>\n          | undefined\n        reactLoadableManifest: DeepReadonly<ReactLoadableManifest>\n        routesManifest: DeepReadonly<DevRoutesManifest>\n        prerenderManifest: DeepReadonly<PrerenderManifest>\n        // we can't pull in the client reference type or it causes issues with\n        // our pre-compiled types\n        clientReferenceManifest?: any\n        serverActionsManifest?: any\n        dynamicCssManifest?: any\n        prefetchHintsManifest?: Record<string, any>\n        subresourceIntegrityManifest?: DeepReadonly<Record<string, string>>\n        isOnDemandRevalidate: boolean\n        revalidateOnlyGenerated: boolean\n        nextConfig: NextConfigRuntime\n        routerServerContext?: RouterServerContext[string]\n        interceptionRoutePatterns?: any\n      }\n    | undefined\n  > {\n    let absoluteProjectDir: string | undefined\n\n    // edge runtime handles loading instrumentation at the edge adapter level\n    if (process.env.NEXT_RUNTIME !== 'edge') {\n      if (res) {\n        patchSetHeaderWithCookieSupport(req, res)\n      }\n\n      const { join, relative } =\n        require('node:path') as typeof import('node:path')\n\n      absoluteProjectDir = join(\n        /* turbopackIgnore: true */\n        process.cwd(),\n        getRequestMeta(req, 'relativeProjectDir') || this.relativeProjectDir\n      )\n\n      const absoluteDistDir = getRequestMeta(req, 'distDir')\n\n      if (absoluteDistDir) {\n        this.distDir = relative(absoluteProjectDir, absoluteDistDir)\n      }\n      const { ensureInstrumentationRegistered } = await import(\n        '../lib/router-utils/instrumentation-globals.external.js'\n      )\n      // ensure instrumentation is registered and pass\n      // onRequestError below. Awaited so any caller of `RouteModule.prepare`\n      // that bypasses `BaseServer.handleRequest` (where this is also awaited\n      // via `prepareImpl`) still observes the instrumentation hook completing\n      // before the userland route handler runs.\n      await ensureInstrumentationRegistered(absoluteProjectDir, this.distDir)\n    }\n    const manifests = this.loadManifests(srcPage, absoluteProjectDir)\n    const { routesManifest, prerenderManifest, serverFilesManifest } = manifests\n\n    const { basePath, i18n, rewrites } = routesManifest\n\n    const routerServerContext = this.getRouterServerContext(req)\n    const nextConfig =\n      routerServerContext?.nextConfig || serverFilesManifest?.config\n\n    // Injected in base-server.ts\n    const protocol = req.headers['x-forwarded-proto']?.includes('https')\n      ? 'https'\n      : 'http'\n\n    // When there are hostname and port we build an absolute URL\n    if (!getRequestMeta(req, 'initURL')) {\n      const initUrl = serverFilesManifest?.config.experimental.trustHostHeader\n        ? `${protocol}://${req.headers.host || 'localhost'}${req.url}`\n        : `${protocol}://${routerServerContext?.hostname || 'localhost'}${req.url}`\n\n      addRequestMeta(req, 'initURL', initUrl)\n      addRequestMeta(req, 'initProtocol', protocol)\n    }\n\n    if (basePath) {\n      req.url = removePathPrefix(req.url || '/', basePath)\n    }\n\n    const parsedUrl = parseReqUrl(req.url || '/')\n    addRequestMeta(req, 'initQuery', { ...parsedUrl?.query })\n    // if we couldn't parse the URL we can't continue\n    if (!parsedUrl) {\n      return\n    }\n    let isNextDataRequest = false\n\n    if (pathHasPrefix(parsedUrl.pathname || '/', '/_next/data')) {\n      isNextDataRequest = true\n      parsedUrl.pathname = normalizeDataPath(parsedUrl.pathname || '/')\n    }\n    this.normalizeUrl(req, parsedUrl)\n    let originalPathname = parsedUrl.pathname || '/'\n    const originalQuery = { ...parsedUrl.query }\n    const pageIsDynamic = isDynamicRoute(srcPage)\n\n    let localeResult: PathLocale | undefined\n    let detectedLocale: string | undefined\n\n    if (i18n) {\n      localeResult = normalizeLocalePath(\n        parsedUrl.pathname || '/',\n        i18n.locales\n      )\n\n      if (localeResult.detectedLocale) {\n        req.url = `${localeResult.pathname}${parsedUrl.search}`\n        originalPathname = localeResult.pathname\n\n        if (!detectedLocale) {\n          detectedLocale = localeResult.detectedLocale\n        }\n      }\n    }\n\n    // Normalize the page path for route matching. The srcPage contains the\n    // internal page path (e.g., /app/[slug]/page), but route matchers expect\n    // the pathname format (e.g., /app/[slug]).\n    const normalizedSrcPage = normalizeAppPath(srcPage)\n\n    const serverUtils = getServerUtils({\n      page: normalizedSrcPage,\n      i18n,\n      basePath,\n      rewrites,\n      pageIsDynamic,\n      trailingSlash: process.env.__NEXT_TRAILING_SLASH as any as boolean,\n      caseSensitive: Boolean(routesManifest.caseSensitive),\n    })\n\n    const domainLocale = detectDomainLocale(\n      i18n?.domains,\n      getHostname(parsedUrl, req.headers),\n      detectedLocale\n    )\n\n    if (Boolean(domainLocale)) {\n      addRequestMeta(req, 'isLocaleDomain', Boolean(domainLocale))\n    }\n\n    const defaultLocale =\n      getRequestMeta(req, 'defaultLocale') ||\n      domainLocale?.defaultLocale ||\n      i18n?.defaultLocale\n\n    // Ensure parsedUrl.pathname includes locale before processing\n    // rewrites or they won't match correctly.\n    if (defaultLocale && !detectedLocale) {\n      parsedUrl.pathname = `/${defaultLocale}${parsedUrl.pathname === '/' ? '' : parsedUrl.pathname}`\n    }\n    const locale =\n      getRequestMeta(req, 'locale') || detectedLocale || defaultLocale\n\n    // we apply rewrites against cloned URL so that we don't\n    // modify the original with the rewrite destination\n    const { rewriteParams, rewrittenParsedUrl } = serverUtils.handleRewrites(\n      req,\n      parsedUrl\n    )\n    const rewriteParamKeys = Object.keys(rewriteParams)\n    Object.assign(parsedUrl.query, rewrittenParsedUrl.query)\n\n    // after processing rewrites we want to remove locale\n    // from parsedUrl pathname\n    if (i18n) {\n      parsedUrl.pathname = normalizeLocalePath(\n        parsedUrl.pathname || '/',\n        i18n.locales\n      ).pathname\n\n      rewrittenParsedUrl.pathname = normalizeLocalePath(\n        rewrittenParsedUrl.pathname || '/',\n        i18n.locales\n      ).pathname\n    }\n\n    let params: Record<string, undefined | string | string[]> | undefined =\n      getRequestMeta(req, 'params')\n\n    // attempt parsing from pathname\n    if (!params && serverUtils.dynamicRouteMatcher) {\n      const paramsMatch = serverUtils.dynamicRouteMatcher(\n        normalizeDataPath(\n          rewrittenParsedUrl?.pathname || parsedUrl.pathname || '/'\n        )\n      )\n      const paramsResult = serverUtils.normalizeDynamicRouteParams(\n        paramsMatch || {},\n        true\n      )\n\n      if (paramsResult.hasValidParams) {\n        params = paramsResult.params\n      }\n    }\n\n    // Local \"next start\" expects the routing parsed query values\n    // to not be present in the URL although when deployed proxies\n    // will add query values from resolving the routes to pass to function.\n\n    // TODO: do we want to change expectations for \"next start\"\n    // to include these query values in the URL which affects asPath\n    // but would match deployed behavior, e.g. a rewrite from middleware\n    // that adds a query param would be in asPath as query but locally\n    // it won't be in the asPath but still available in the query object\n    const query = getRequestMeta(req, 'query') || {\n      ...parsedUrl.query,\n    }\n\n    const routeParamKeys = new Set<string>()\n    const combinedParamKeys = []\n\n    // We don't include rewriteParamKeys in the combinedParamKeys\n    // for app router since the searchParams is populated from the\n    // URL so we don't want to strip the rewrite params from the URL\n    // so that searchParams can include them.\n    if (\n      this.definition.kind === RouteKind.PAGES ||\n      this.definition.kind === RouteKind.PAGES_API\n    ) {\n      for (const key of [\n        ...rewriteParamKeys,\n        ...Object.keys(serverUtils.defaultRouteMatches || {}),\n      ]) {\n        // We only want to filter rewrite param keys from the URL\n        // if they are matches from the URL e.g. the key/value matches\n        // before and after applying the rewrites /:path for /hello and\n        // { path: 'hello' } but not for { path: 'another' } and /hello\n        // TODO: we should prefix rewrite param keys the same as we do\n        // for dynamic routes so we can identify them properly\n        const originalValue = Array.isArray(originalQuery[key])\n          ? originalQuery[key].join('')\n          : originalQuery[key]\n\n        const queryValue = Array.isArray(query[key])\n          ? query[key].join('')\n          : query[key]\n\n        if (!(key in originalQuery) || originalValue === queryValue) {\n          combinedParamKeys.push(key)\n        }\n      }\n    }\n\n    serverUtils.normalizeCdnUrl(req, combinedParamKeys)\n    // When Next is not hosted in a single process, upstream proxies will add query values for route params that were used to match the route.\n    // Outside of that environment, there is no reason to do any normalization to honor those query values.\n    if (!routerServerContext?.isWrappedByNextServer) {\n      serverUtils.normalizeQueryParams(query, routeParamKeys)\n    } else {\n      serverUtils.filterInternalQuery(query, [])\n    }\n    serverUtils.filterInternalQuery(originalQuery, combinedParamKeys)\n\n    if (pageIsDynamic) {\n      const queryResult = serverUtils.normalizeDynamicRouteParams(query, true)\n\n      const paramsResult = serverUtils.normalizeDynamicRouteParams(\n        params || {},\n        true\n      )\n\n      let paramsToInterpolate: ParsedUrlQuery\n\n      if (\n        // if both query and params are valid but one\n        // provided more information and the query params\n        // were nxtP prefixed rely on that one\n        query &&\n        params &&\n        paramsResult.hasValidParams &&\n        queryResult.hasValidParams &&\n        routeParamKeys.size > 0 &&\n        Object.keys(paramsResult.params).length <=\n          Object.keys(queryResult.params).length\n      ) {\n        paramsToInterpolate = queryResult.params\n        params = Object.assign(queryResult.params)\n      } else {\n        paramsToInterpolate =\n          paramsResult.hasValidParams && params\n            ? params\n            : queryResult.hasValidParams\n              ? query\n              : {}\n      }\n\n      req.url = serverUtils.interpolateDynamicPath(\n        req.url || '/',\n        paramsToInterpolate\n      )\n      parsedUrl.pathname = serverUtils.interpolateDynamicPath(\n        parsedUrl.pathname || '/',\n        paramsToInterpolate\n      )\n      originalPathname = serverUtils.interpolateDynamicPath(\n        originalPathname,\n        paramsToInterpolate\n      )\n\n      // try pulling from query if valid\n      if (!params) {\n        if (queryResult.hasValidParams) {\n          params = Object.assign({}, queryResult.params)\n\n          // If we pulled from query remove it so it's\n          // only in params\n          for (const key in serverUtils.defaultRouteMatches) {\n            delete query[key]\n          }\n        } else {\n          // use final params from URL matching\n          const paramsMatch = serverUtils.dynamicRouteMatcher?.(\n            normalizeDataPath(\n              localeResult?.pathname || parsedUrl.pathname || '/'\n            )\n          )\n          // we don't normalize these as they are allowed to be\n          // the literal slug matches here e.g. /blog/[slug]\n          // actually being requested\n          if (paramsMatch) {\n            params = Object.assign({}, paramsMatch)\n          }\n        }\n      }\n\n      // When partial nxtP* params are provided (e.g. background\n      // revalidation for intermediate PPR shells), both\n      // normalizeDynamicRouteParams calls above fail because not all\n      // route params are present. Merge the normalized query params\n      // (from nxtP*) into the current params to override placeholders\n      // with concrete values.\n      if (\n        params &&\n        routeParamKeys.size > 0 &&\n        !paramsResult.hasValidParams &&\n        !queryResult.hasValidParams\n      ) {\n        for (const key of routeParamKeys) {\n          if (query[key] !== undefined) {\n            params[key] = query[key]\n          }\n        }\n        addRequestMeta(req, 'resolvedRouteParamKeys', routeParamKeys)\n      }\n    }\n\n    // Remove any normalized params from the query if they\n    // weren't present as non-prefixed query key e.g.\n    // ?search=1&nxtPsearch=hello we don't delete search\n    for (const key of routeParamKeys) {\n      if (!(key in originalQuery)) {\n        delete query[key]\n        // handle the case where there's collision and we\n        // normalized nxtPid=123 -> id=123 but user also\n        // sends id=456 as separate key\n      } else if (\n        originalQuery[key] &&\n        query[key] &&\n        originalQuery[key] !== query[key]\n      ) {\n        query[key] = originalQuery[key]\n      }\n    }\n\n    const { isOnDemandRevalidate, revalidateOnlyGenerated } =\n      checkIsOnDemandRevalidate(req.headers, prerenderManifest.preview)\n\n    let isDraftMode = false\n    let previewData: PreviewData\n\n    // preview data relies on non-edge utils\n    if (process.env.NEXT_RUNTIME !== 'edge' && res) {\n      const { tryGetPreviewData } =\n        require('../api-utils/node/try-get-preview-data') as typeof import('../api-utils/node/try-get-preview-data')\n\n      previewData = tryGetPreviewData(\n        req,\n        res,\n        prerenderManifest.preview,\n        Boolean(multiZoneDraftMode)\n      )\n      isDraftMode = previewData !== false\n    }\n\n    if (!nextConfig) {\n      throw new Error(\"Invariant: nextConfig couldn't be loaded\")\n    }\n\n    if (process.env.NEXT_RUNTIME !== 'edge') {\n      const { installProcessErrorHandlers } =\n        require('../node-environment-extensions/process-error-handlers') as typeof import('../node-environment-extensions/process-error-handlers')\n\n      installProcessErrorHandlers(\n        Boolean(\n          nextConfig.experimental.removeUncaughtErrorAndRejectionListeners\n        )\n      )\n    }\n\n    let resolvedPathname = normalizedSrcPage\n    if (isDynamicRoute(resolvedPathname) && params) {\n      resolvedPathname = serverUtils.interpolateDynamicPath(\n        resolvedPathname,\n        params\n      )\n    }\n\n    if (resolvedPathname === '/index') {\n      resolvedPathname = '/'\n    }\n\n    if (\n      res &&\n      Boolean(req.headers['x-nextjs-data']) &&\n      (!res.statusCode || res.statusCode === 200)\n    ) {\n      res.setHeader(\n        'x-nextjs-matched-path',\n        removeTrailingSlash(`${locale ? `/${locale}` : ''}${normalizedSrcPage}`)\n      )\n    }\n    const encodedResolvedPathname = resolvedPathname\n\n    // we decode for cache key/manifest usage encoded is\n    // for URL building\n    try {\n      resolvedPathname = decodePathParams(resolvedPathname)\n    } catch (_) {}\n\n    resolvedPathname = removeTrailingSlash(resolvedPathname)\n    addRequestMeta(req, 'resolvedPathname', resolvedPathname)\n\n    let deploymentId\n    if (nextConfig.experimental?.runtimeServerDeploymentId) {\n      if (!process.env.NEXT_DEPLOYMENT_ID) {\n        throw new Error(\n          'process.env.NEXT_DEPLOYMENT_ID is missing but runtimeServerDeploymentId is enabled'\n        )\n      }\n      deploymentId = process.env.NEXT_DEPLOYMENT_ID\n    } else {\n      deploymentId = nextConfig.deploymentId || ''\n    }\n\n    return {\n      query,\n      originalQuery,\n      originalPathname,\n      params,\n      parsedUrl,\n      locale,\n      isNextDataRequest,\n      locales: i18n?.locales,\n      defaultLocale,\n      isDraftMode,\n      previewData,\n      pageIsDynamic,\n      resolvedPathname,\n      encodedResolvedPathname,\n      isOnDemandRevalidate,\n      revalidateOnlyGenerated,\n      ...manifests,\n      // loadManifest returns a readonly object, but we don't want to propagate that throughout the\n      // whole codebase (for now)\n      nextConfig:\n        nextConfig satisfies DeepReadonly<NextConfigRuntime> as NextConfigRuntime,\n      routerServerContext,\n      deploymentId,\n      clientAssetToken: nextConfig.supportsImmutableAssets ? '' : deploymentId,\n    }\n  }\n\n  public getResponseCache(req: IncomingMessage | BaseNextRequest) {\n    if (!this.responseCache) {\n      const minimalMode = getRequestMeta(req, 'minimalMode') ?? false\n      this.responseCache = new ResponseCache(minimalMode)\n    }\n    return this.responseCache\n  }\n\n  public async handleResponse({\n    req,\n    nextConfig,\n    cacheKey,\n    routeKind,\n    isFallback,\n    prerenderManifest,\n    isRoutePPREnabled,\n    isOnDemandRevalidate,\n    revalidateOnlyGenerated,\n    responseGenerator,\n    waitUntil,\n    isMinimalMode,\n  }: {\n    req: IncomingMessage | BaseNextRequest\n    nextConfig: NextConfigRuntime\n    cacheKey: string | null\n    routeKind: RouteKind\n    isFallback?: boolean\n    prerenderManifest: DeepReadonly<PrerenderManifest>\n    isRoutePPREnabled?: boolean\n    isOnDemandRevalidate?: boolean\n    revalidateOnlyGenerated?: boolean\n    responseGenerator: ResponseGenerator\n    waitUntil?: (prom: Promise<any>) => void\n    isMinimalMode: boolean\n  }) {\n    const responseCache = this.getResponseCache(req)\n    const cacheEntry = await responseCache.get(cacheKey, responseGenerator, {\n      routeKind,\n      isFallback,\n      isRoutePPREnabled,\n      isOnDemandRevalidate,\n      // A Next.js Segment Cache prefetch uses the `Next-Router-Prefetch`\n      // header (surfaced as the `isPrefetchRSCRequest` request meta), not the\n      // standard browser `purpose: prefetch` header. Recognize both so the\n      // response cache treats segment prefetches as prefetches — most\n      // importantly, so a prefetch that misses serves a fallback shell rather\n      // than joining an in-flight background (concrete) revalidation.\n      isPrefetch:\n        req.headers.purpose === 'prefetch' ||\n        getRequestMeta(req, 'isPrefetchRSCRequest') === true,\n      // Use x-invocation-id header to scope the in-memory cache to a single\n      // revalidation request in minimal mode.\n      invocationID: req.headers['x-invocation-id'] as string | undefined,\n      incrementalCache: await this.getIncrementalCache(\n        req,\n        nextConfig,\n        prerenderManifest,\n        isMinimalMode\n      ),\n      waitUntil,\n    })\n\n    if (!cacheEntry) {\n      if (\n        cacheKey &&\n        // revalidate only generated can bail even if cacheKey is provided\n        !(isOnDemandRevalidate && revalidateOnlyGenerated)\n      ) {\n        // A cache entry might not be generated if a response is written\n        // in `getInitialProps` or `getServerSideProps`, but those shouldn't\n        // have a cache key. If we do have a cache key but we don't end up\n        // with a cache entry, then either Next.js or the application has a\n        // bug that needs fixing.\n        throw new Error('invariant: cache entry required but not generated')\n      }\n    }\n    return cacheEntry\n  }\n}\n","export function isAppRouteRoute(route: string): boolean {\n  return route.endsWith('/route')\n}\n","/**\n * For a given page path, this function ensures that there is no backslash\n * escaping slashes in the path. Example:\n *  - `foo\\/bar\\/baz` -> `foo/bar/baz`\n */\nexport function normalizePathSep(path: string): string {\n  return path.replace(/\\\\/g, '/')\n}\n","import type { Key } from 'next/dist/compiled/path-to-regexp'\nimport { regexpToFunction } from 'next/dist/compiled/path-to-regexp'\nimport { pathToRegexp } from 'next/dist/compiled/path-to-regexp'\n\ninterface Options {\n  /**\n   * A transformer function that will be applied to the regexp generated\n   * from the provided path and path-to-regexp.\n   */\n  regexModifier?: (regex: string) => string\n  /**\n   * When true the function will remove all unnamed parameters\n   * from the matched parameters.\n   */\n  removeUnnamedParams?: boolean\n  /**\n   * When true the regexp won't allow an optional trailing delimiter\n   * to match.\n   */\n  strict?: boolean\n\n  /**\n   * When true the matcher will be case-sensitive, defaults to false\n   */\n  sensitive?: boolean\n}\n\nexport type PatchMatcher = (\n  pathname: string,\n  params?: Record<string, any>\n) => Record<string, any> | false\n\n/**\n * Generates a path matcher function for a given path and options based on\n * path-to-regexp. By default the match will be case insensitive, non strict\n * and delimited by `/`.\n */\nexport function getPathMatch(path: string, options?: Options): PatchMatcher {\n  const keys: Key[] = []\n  const regexp = pathToRegexp(path, keys, {\n    delimiter: '/',\n    sensitive:\n      typeof options?.sensitive === 'boolean' ? options.sensitive : false,\n    strict: options?.strict,\n  })\n\n  const matcher = regexpToFunction<Record<string, any>>(\n    options?.regexModifier\n      ? new RegExp(options.regexModifier(regexp.source), regexp.flags)\n      : regexp,\n    keys\n  )\n\n  /**\n   * A matcher function that will check if a given pathname matches the path\n   * given in the builder function. When the path does not match it will return\n   * `false` but if it does it will return an object with the matched params\n   * merged with the params provided in the second argument.\n   */\n  return (pathname, params) => {\n    // If no pathname is provided it's not a match.\n    if (typeof pathname !== 'string') return false\n\n    const match = matcher(pathname)\n\n    // If the path did not match `false` will be returned.\n    if (!match) return false\n\n    /**\n     * If unnamed params are not allowed they must be removed from\n     * the matched parameters. path-to-regexp uses \"string\" for named and\n     * \"number\" for unnamed parameters.\n     */\n    if (options?.removeUnnamedParams) {\n      for (const key of keys) {\n        if (typeof key.name === 'number') {\n          delete match.params[key.name]\n        }\n      }\n    }\n\n    return { ...params, ...match.params }\n  }\n}\n","import type { ParsedUrlQuery } from 'querystring'\n\nimport { searchParamsToUrlQuery } from './querystring'\nimport { parseRelativeUrl } from './parse-relative-url'\n\nexport interface ParsedUrl {\n  auth: string | null\n  hash: string\n  hostname: string | null\n  href: string\n  origin?: string | null\n  pathname: string\n  port: string | null\n  protocol: string | null\n  query: ParsedUrlQuery\n  search: string\n  slashes: boolean | null\n}\n\nexport function parseUrl(url: string): ParsedUrl {\n  if (url.startsWith('/')) {\n    return parseRelativeUrl(url)\n  }\n\n  const parsedURL = new URL(url)\n  const username = parsedURL.username\n  const password = parsedURL.password\n  const auth = username\n    ? password\n      ? `${username}:${password}`\n      : username\n    : null\n  const pathname = parsedURL.pathname\n  const search = parsedURL.search\n  return {\n    auth,\n    hash: parsedURL.hash,\n    hostname: parsedURL.hostname,\n    href: parsedURL.href,\n    pathname,\n    port: parsedURL.port,\n    protocol: parsedURL.protocol,\n    query: searchParamsToUrlQuery(parsedURL.searchParams),\n    search,\n    origin: parsedURL.origin,\n    slashes:\n      parsedURL.href.slice(\n        parsedURL.protocol.length,\n        parsedURL.protocol.length + 2\n      ) === '//',\n  }\n}\n","import type { ParsedUrlQuery } from 'querystring'\nimport { getLocationOrigin } from '../../utils'\nimport { searchParamsToUrlQuery } from './querystring'\n\nexport interface ParsedRelativeUrl {\n  auth: string | null\n  hash: string\n  host: string | null\n  hostname: string | null\n  href: string\n  pathname: string\n  port: string | null\n  protocol: string | null\n  query: ParsedUrlQuery\n  search: string\n  slashes: null\n}\n\n/**\n * Parses path-relative urls (e.g. `/hello/world?foo=bar`). If url isn't path-relative\n * (e.g. `./hello`) then at least base must be.\n * Absolute urls are rejected with one exception, in the browser, absolute urls that are on\n * the current origin will be parsed as relative\n */\nexport function parseRelativeUrl(\n  url: string,\n  base?: string,\n  parseQuery?: true\n): ParsedRelativeUrl\nexport function parseRelativeUrl(\n  url: string,\n  base: string | undefined,\n  parseQuery: false\n): Omit<ParsedRelativeUrl, 'query'>\nexport function parseRelativeUrl(\n  url: string,\n  base?: string,\n  parseQuery = true\n): ParsedRelativeUrl | Omit<ParsedRelativeUrl, 'query'> {\n  const globalBase = new URL(\n    typeof window === 'undefined' ? 'http://n' : getLocationOrigin()\n  )\n\n  const resolvedBase = base\n    ? new URL(base, globalBase)\n    : url.startsWith('.')\n      ? new URL(\n          typeof window === 'undefined' ? 'http://n' : window.location.href\n        )\n      : globalBase\n\n  const { pathname, searchParams, search, hash, href, origin } = url.startsWith(\n    '/'\n  )\n    ? // 'http://localhost:3000///' would be received as '///' in Node.js' IncomingMessage\n      // See https://nodejs.org/api/http.html#messageurl\n      // Not using `origin` to support other protocols\n      new URL(`${resolvedBase.protocol}//${resolvedBase.host}${url}`)\n    : new URL(url, resolvedBase)\n\n  if (origin !== globalBase.origin) {\n    throw new Error(`invariant: invalid relative URL, router received ${url}`)\n  }\n\n  return {\n    auth: null,\n    host: null,\n    hostname: null,\n    pathname,\n    port: null,\n    protocol: null,\n    query: parseQuery ? searchParamsToUrlQuery(searchParams) : undefined,\n    search,\n    hash,\n    href: href.slice(origin.length),\n    // We don't know for relative URLs at this point since we set a custom, internal\n    // base that isn't surfaced to users.\n    slashes: null,\n  }\n}\n","import escapePathDelimiters from '../../../shared/lib/router/utils/escape-path-delimiters'\nimport { DecodeError } from '../../../shared/lib/utils'\n\n/**\n * We only encode path delimiters for path segments from\n * getStaticPaths so we need to attempt decoding the URL\n * to match against and only escape the path delimiters\n * this allows non-ascii values to be handled e.g.\n * Japanese characters.\n * */\nfunction decodePathParams(pathname: string): string {\n  // TODO: investigate adding this handling for non-SSG\n  // pages so non-ascii names also work there.\n  return pathname\n    .split('/')\n    .map((seg) => {\n      try {\n        seg = escapePathDelimiters(decodeURIComponent(seg), true)\n      } catch (_) {\n        // An improperly encoded URL was provided\n        throw new DecodeError('Failed to decode path param(s).')\n      }\n      return seg\n    })\n    .join('/')\n}\n\nexport { decodePathParams }\n","// escape delimiters used by path-to-regexp\nexport default function escapePathDelimiters(\n  segment: string,\n  escapeEncoded?: boolean\n): string {\n  return segment.replace(\n    new RegExp(`([/#?\\\\\\\\]${escapeEncoded ? '|%(2f|23|3f|5c)' : ''})`, 'gi'),\n    (char: string) => encodeURIComponent(char)\n  )\n}\n","import { isPlainObject } from '../shared/lib/is-plain-object'\n\n// We allow some additional attached properties for Next.js errors\nexport interface NextError extends Error {\n  type?: string\n  page?: string\n  code?: string | number\n  cancelled?: boolean\n  digest?: string\n}\n\n/**\n * This is a safe stringify function that handles circular references.\n * We're using a simpler version here to avoid introducing\n * the dependency `safe-stable-stringify` into production bundle.\n *\n * This helper is used both in development and production.\n */\nfunction safeStringifyLite(obj: any) {\n  const seen = new WeakSet()\n\n  return JSON.stringify(obj, (_key, value) => {\n    // If value is an object and already seen, replace with \"[Circular]\"\n    if (typeof value === 'object' && value !== null) {\n      if (seen.has(value)) {\n        return '[Circular]'\n      }\n      seen.add(value)\n    }\n    return value\n  })\n}\n\n/**\n * Checks whether the given value is a NextError.\n * This can be used to print a more detailed error message with properties like `code` & `digest`.\n */\nexport default function isError(err: unknown): err is NextError {\n  return (\n    typeof err === 'object' && err !== null && 'name' in err && 'message' in err\n  )\n}\n\nexport function getProperError(err: unknown): Error {\n  if (isError(err)) {\n    return err\n  }\n\n  if (process.env.NODE_ENV === 'development') {\n    // provide better error for case where `throw undefined`\n    // is called in development\n    if (typeof err === 'undefined') {\n      return new Error(\n        'An undefined error was thrown, ' +\n          'see here for more info: https://nextjs.org/docs/messages/threw-undefined'\n      )\n    }\n\n    if (err === null) {\n      return new Error(\n        'A null error was thrown, ' +\n          'see here for more info: https://nextjs.org/docs/messages/threw-undefined'\n      )\n    }\n  }\n\n  return new Error(isPlainObject(err) ? safeStringifyLite(err) : err + '')\n}\n","import type { IncomingMessage } from 'http'\n\nimport { parse } from 'next/dist/compiled/content-type'\nimport isError from '../../../lib/is-error'\nimport type { SizeLimit } from '../../../types'\nimport { ApiError } from '../index'\n\n/**\n * Parse `JSON` and handles invalid `JSON` strings\n * @param str `JSON` string\n */\nfunction parseJson(str: string): object {\n  if (str.length === 0) {\n    // special-case empty json body, as it's a common client-side mistake\n    return {}\n  }\n\n  try {\n    return JSON.parse(str)\n  } catch (e) {\n    throw new ApiError(400, 'Invalid JSON')\n  }\n}\n\n/**\n * Parse incoming message like `json` or `urlencoded`\n * @param req request object\n */\nexport async function parseBody(\n  req: IncomingMessage,\n  limit: SizeLimit\n): Promise<any> {\n  let contentType\n  try {\n    contentType = parse(req.headers['content-type'] || 'text/plain')\n  } catch {\n    contentType = parse('text/plain')\n  }\n  const { type, parameters } = contentType\n  const encoding = parameters.charset || 'utf-8'\n\n  let buffer\n\n  try {\n    const getRawBody =\n      require('next/dist/compiled/raw-body') as typeof import('next/dist/compiled/raw-body')\n    buffer = await getRawBody(req, { encoding, limit })\n  } catch (e) {\n    if (isError(e) && e.type === 'entity.too.large') {\n      throw new ApiError(413, `Body exceeded ${limit} limit`)\n    } else {\n      throw new ApiError(400, 'Invalid body')\n    }\n  }\n\n  const body = buffer.toString()\n\n  if (type === 'application/json' || type === 'application/ld+json') {\n    return parseJson(body)\n  } else if (type === 'application/x-www-form-urlencoded') {\n    const qs = require('querystring') as typeof import('querystring')\n    return qs.decode(body)\n  } else {\n    return body\n  }\n}\n","import type { IncomingMessage, ServerResponse } from 'http'\nimport type { NextApiRequest, NextApiResponse } from '../../../shared/lib/utils'\nimport type { PageConfig, ResponseLimit } from '../../../types'\nimport type { __ApiPreviewProps } from '../.'\nimport type { CookieSerializeOptions } from 'next/dist/compiled/cookie'\n\nimport bytes from 'next/dist/compiled/bytes'\nimport { generateETag } from '../../lib/etag'\nimport { sendEtagResponse } from '../../send-payload'\nimport { Stream } from 'stream'\nimport isError from '../../../lib/is-error'\nimport { isResSent } from '../../../shared/lib/utils'\nimport { interopDefault } from '../../../lib/interop-default'\nimport {\n  setLazyProp,\n  sendStatusCode,\n  redirect,\n  clearPreviewData,\n  sendError,\n  ApiError,\n  COOKIE_NAME_PRERENDER_BYPASS,\n  COOKIE_NAME_PRERENDER_DATA,\n  RESPONSE_LIMIT_DEFAULT,\n} from './../index'\nimport { getCookieParser } from './../get-cookie-parser'\nimport {\n  JSON_CONTENT_TYPE_HEADER,\n  PRERENDER_REVALIDATE_HEADER,\n  PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER,\n} from '../../../lib/constants'\nimport { tryGetPreviewData } from './try-get-preview-data'\nimport { parseBody } from './parse-body'\nimport type { RevalidateFn } from '../../lib/router-utils/router-server-context'\nimport type { InstrumentationOnRequestError } from '../../instrumentation/types'\n\ntype ApiContext = __ApiPreviewProps & {\n  trustHostHeader?: boolean\n  allowedRevalidateHeaderKeys?: string[]\n  hostname?: string\n  multiZoneDraftMode?: boolean\n  dev: boolean\n  internalRevalidate?: RevalidateFn\n}\n\nfunction getMaxContentLength(responseLimit?: ResponseLimit) {\n  if (responseLimit && typeof responseLimit !== 'boolean') {\n    return bytes.parse(responseLimit)\n  }\n  return RESPONSE_LIMIT_DEFAULT\n}\n\n/**\n * Send `any` body to response\n * @param req request object\n * @param res response object\n * @param body of response\n */\nfunction sendData(req: NextApiRequest, res: NextApiResponse, body: any): void {\n  if (body === null || body === undefined) {\n    res.end()\n    return\n  }\n\n  // strip irrelevant headers/body\n  if (res.statusCode === 204 || res.statusCode === 304) {\n    res.removeHeader('Content-Type')\n    res.removeHeader('Content-Length')\n    res.removeHeader('Transfer-Encoding')\n\n    if (process.env.NODE_ENV === 'development' && body) {\n      console.warn(\n        `A body was attempted to be set with a 204 statusCode for ${req.url}, this is invalid and the body was ignored.\\n` +\n          `See more info here https://nextjs.org/docs/messages/invalid-api-status-body`\n      )\n    }\n    res.end()\n    return\n  }\n\n  const contentType = res.getHeader('Content-Type')\n\n  if (body instanceof Stream) {\n    if (!contentType) {\n      res.setHeader('Content-Type', 'application/octet-stream')\n    }\n    body.pipe(res)\n    return\n  }\n\n  const isJSONLike = ['object', 'number', 'boolean'].includes(typeof body)\n  const stringifiedBody = isJSONLike ? JSON.stringify(body) : body\n  const etag = generateETag(stringifiedBody)\n  if (sendEtagResponse(req, res, etag)) {\n    return\n  }\n\n  if (Buffer.isBuffer(body)) {\n    if (!contentType) {\n      res.setHeader('Content-Type', 'application/octet-stream')\n    }\n    res.setHeader('Content-Length', body.length)\n    res.end(body)\n    return\n  }\n\n  if (isJSONLike) {\n    res.setHeader('Content-Type', JSON_CONTENT_TYPE_HEADER)\n  }\n\n  res.setHeader('Content-Length', Buffer.byteLength(stringifiedBody))\n  res.end(stringifiedBody)\n}\n\n/**\n * Send `JSON` object\n * @param res response object\n * @param jsonBody of data\n */\nfunction sendJson(res: NextApiResponse, jsonBody: any): void {\n  // Set header to application/json\n  res.setHeader('Content-Type', JSON_CONTENT_TYPE_HEADER)\n\n  // Use send to handle request\n  res.send(JSON.stringify(jsonBody))\n}\n\nfunction isValidData(str: any): str is string {\n  return typeof str === 'string' && str.length >= 16\n}\n\nfunction setDraftMode<T>(\n  res: NextApiResponse<T>,\n  options: {\n    enable: boolean\n    previewModeId?: string\n  }\n): NextApiResponse<T> {\n  if (!isValidData(options.previewModeId)) {\n    throw new Error('invariant: invalid previewModeId')\n  }\n  const expires = options.enable ? undefined : new Date(0)\n  // To delete a cookie, set `expires` to a date in the past:\n  // https://tools.ietf.org/html/rfc6265#section-4.1.1\n  // `Max-Age: 0` is not valid, thus ignored, and the cookie is persisted.\n  const { serialize } =\n    require('next/dist/compiled/cookie') as typeof import('next/dist/compiled/cookie')\n  const previous = res.getHeader('Set-Cookie')\n  res.setHeader(`Set-Cookie`, [\n    ...(typeof previous === 'string'\n      ? [previous]\n      : Array.isArray(previous)\n        ? previous\n        : []),\n    serialize(COOKIE_NAME_PRERENDER_BYPASS, options.previewModeId, {\n      httpOnly: true,\n      sameSite: process.env.NODE_ENV !== 'development' ? 'none' : 'lax',\n      secure: process.env.NODE_ENV !== 'development',\n      path: '/',\n      expires,\n    }),\n  ])\n  return res\n}\n\nfunction setPreviewData<T>(\n  res: NextApiResponse<T>,\n  data: object | string, // TODO: strict runtime type checking\n  options: {\n    maxAge?: number\n    path?: string\n  } & __ApiPreviewProps\n): NextApiResponse<T> {\n  if (!isValidData(options.previewModeId)) {\n    throw new Error('invariant: invalid previewModeId')\n  }\n  if (!isValidData(options.previewModeEncryptionKey)) {\n    throw new Error('invariant: invalid previewModeEncryptionKey')\n  }\n  if (!isValidData(options.previewModeSigningKey)) {\n    throw new Error('invariant: invalid previewModeSigningKey')\n  }\n\n  const jsonwebtoken =\n    require('next/dist/compiled/jsonwebtoken') as typeof import('next/dist/compiled/jsonwebtoken')\n  const { encryptWithSecret } =\n    require('../../crypto-utils') as typeof import('../../crypto-utils')\n  const payload = jsonwebtoken.sign(\n    {\n      data: encryptWithSecret(\n        Buffer.from(options.previewModeEncryptionKey),\n        JSON.stringify(data)\n      ),\n    },\n    options.previewModeSigningKey,\n    {\n      algorithm: 'HS256',\n      ...(options.maxAge !== undefined\n        ? { expiresIn: options.maxAge }\n        : undefined),\n    }\n  )\n\n  // limit preview mode cookie to 2KB since we shouldn't store too much\n  // data here and browsers drop cookies over 4KB\n  if (payload.length > 2048) {\n    throw new Error(\n      `Preview data is limited to 2KB currently, reduce how much data you are storing as preview data to continue`\n    )\n  }\n\n  const { serialize } =\n    require('next/dist/compiled/cookie') as typeof import('next/dist/compiled/cookie')\n  const previous = res.getHeader('Set-Cookie')\n  res.setHeader(`Set-Cookie`, [\n    ...(typeof previous === 'string'\n      ? [previous]\n      : Array.isArray(previous)\n        ? previous\n        : []),\n    serialize(COOKIE_NAME_PRERENDER_BYPASS, options.previewModeId, {\n      httpOnly: true,\n      sameSite: process.env.NODE_ENV !== 'development' ? 'none' : 'lax',\n      secure: process.env.NODE_ENV !== 'development',\n      path: '/',\n      ...(options.maxAge !== undefined\n        ? ({ maxAge: options.maxAge } as CookieSerializeOptions)\n        : undefined),\n      ...(options.path !== undefined\n        ? ({ path: options.path } as CookieSerializeOptions)\n        : undefined),\n    }),\n    serialize(COOKIE_NAME_PRERENDER_DATA, payload, {\n      httpOnly: true,\n      sameSite: process.env.NODE_ENV !== 'development' ? 'none' : 'lax',\n      secure: process.env.NODE_ENV !== 'development',\n      path: '/',\n      ...(options.maxAge !== undefined\n        ? ({ maxAge: options.maxAge } as CookieSerializeOptions)\n        : undefined),\n      ...(options.path !== undefined\n        ? ({ path: options.path } as CookieSerializeOptions)\n        : undefined),\n    }),\n  ])\n  return res\n}\n\nasync function revalidate(\n  urlPath: string,\n  opts: {\n    unstable_onlyGenerated?: boolean\n  },\n  req: IncomingMessage,\n  context: ApiContext\n) {\n  if (typeof urlPath !== 'string' || !urlPath.startsWith('/')) {\n    throw new Error(\n      `Invalid urlPath provided to revalidate(), must be a path e.g. /blog/post-1, received ${urlPath}`\n    )\n  }\n  const headers: HeadersInit = {\n    [PRERENDER_REVALIDATE_HEADER]: context.previewModeId,\n    ...(opts.unstable_onlyGenerated\n      ? {\n          [PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER]: '1',\n        }\n      : {}),\n  }\n  const allowedRevalidateHeaderKeys = [\n    ...(context.allowedRevalidateHeaderKeys || []),\n  ]\n\n  if (context.trustHostHeader || context.dev) {\n    allowedRevalidateHeaderKeys.push('cookie')\n  }\n\n  if (context.trustHostHeader) {\n    allowedRevalidateHeaderKeys.push('x-vercel-protection-bypass')\n  }\n\n  for (const key of Object.keys(req.headers)) {\n    if (allowedRevalidateHeaderKeys.includes(key)) {\n      headers[key] = req.headers[key] as string\n    }\n  }\n\n  const internalRevalidate = context.internalRevalidate\n\n  try {\n    // We use the revalidate in router-server if available.\n    // If we are operating without router-server (serverless)\n    // we must go through network layer with fetch request\n    if (internalRevalidate) {\n      return await internalRevalidate({\n        urlPath,\n        headers,\n        opts,\n      })\n    }\n\n    if (context.trustHostHeader) {\n      const res = await fetch(`https://${req.headers.host}${urlPath}`, {\n        method: 'HEAD',\n        headers,\n      })\n      // we use the cache header to determine successful revalidate as\n      // a non-200 status code can be returned from a successful revalidate\n      // e.g. notFound: true returns 404 status code but is successful\n      const cacheHeader =\n        res.headers.get('x-vercel-cache') || res.headers.get('x-nextjs-cache')\n\n      if (\n        cacheHeader?.toUpperCase() !== 'REVALIDATED' &&\n        res.status !== 200 &&\n        !(res.status === 404 && opts.unstable_onlyGenerated)\n      ) {\n        throw new Error(`Invalid response ${res.status}`)\n      }\n    } else {\n      throw new Error(\n        `Invariant: missing internal router-server-methods this is an internal bug`\n      )\n    }\n  } catch (err: unknown) {\n    throw new Error(\n      `Failed to revalidate ${urlPath}: ${isError(err) ? err.message : err}`\n    )\n  }\n}\n\nexport async function apiResolver(\n  req: IncomingMessage,\n  res: ServerResponse,\n  query: any,\n  resolverModule: any,\n  apiContext: ApiContext,\n  propagateError: boolean,\n  dev?: boolean,\n  page?: string,\n  onError?: InstrumentationOnRequestError\n): Promise<void> {\n  const apiReq = req as NextApiRequest\n  const apiRes = res as NextApiResponse\n\n  try {\n    if (!resolverModule) {\n      res.statusCode = 404\n      res.end('Not Found')\n      return\n    }\n    const config: PageConfig = resolverModule.config || {}\n    const bodyParser = config.api?.bodyParser !== false\n    const responseLimit = config.api?.responseLimit ?? true\n    const externalResolver = config.api?.externalResolver || false\n\n    // Parsing of cookies\n    setLazyProp({ req: apiReq }, 'cookies', getCookieParser(req.headers))\n    // Ensure req.query is a writable, enumerable property by using Object.defineProperty.\n    // This addresses Express 5.x, which defines query as a getter only (read-only).\n    Object.defineProperty(apiReq, 'query', {\n      value: { ...query },\n      writable: true,\n      enumerable: true,\n      configurable: true,\n    })\n    // Parsing preview data\n    setLazyProp({ req: apiReq }, 'previewData', () =>\n      tryGetPreviewData(req, res, apiContext, !!apiContext.multiZoneDraftMode)\n    )\n    // Checking if preview mode is enabled\n    setLazyProp({ req: apiReq }, 'preview', () =>\n      apiReq.previewData !== false ? true : undefined\n    )\n    // Set draftMode to the same value as preview\n    setLazyProp({ req: apiReq }, 'draftMode', () => apiReq.preview)\n\n    // Parsing of body\n    if (bodyParser && !apiReq.body) {\n      apiReq.body = await parseBody(\n        apiReq,\n        config.api && config.api.bodyParser && config.api.bodyParser.sizeLimit\n          ? config.api.bodyParser.sizeLimit\n          : '1mb'\n      )\n    }\n\n    let contentLength = 0\n    const maxContentLength = getMaxContentLength(responseLimit)\n    const writeData = apiRes.write\n    const endResponse = apiRes.end\n    apiRes.write = (...args: any[2]) => {\n      contentLength += Buffer.byteLength(args[0] || '')\n      return writeData.apply(apiRes, args)\n    }\n    apiRes.end = (...args: any[2]) => {\n      if (args.length && typeof args[0] !== 'function') {\n        contentLength += Buffer.byteLength(args[0] || '')\n      }\n\n      if (responseLimit && contentLength >= maxContentLength) {\n        console.warn(\n          `API response for ${req.url} exceeds ${bytes.format(\n            maxContentLength\n          )}. API Routes are meant to respond quickly. https://nextjs.org/docs/messages/api-routes-response-size-limit`\n        )\n      }\n\n      return endResponse.apply(apiRes, args)\n    }\n    apiRes.status = (statusCode) => sendStatusCode(apiRes, statusCode)\n    apiRes.send = (data) => sendData(apiReq, apiRes, data)\n    apiRes.json = (data) => sendJson(apiRes, data)\n    apiRes.redirect = (statusOrUrl: number | string, url?: string) =>\n      redirect(apiRes, statusOrUrl, url)\n    apiRes.setDraftMode = (options = { enable: true }) =>\n      setDraftMode(apiRes, Object.assign({}, apiContext, options))\n    apiRes.setPreviewData = (data, options = {}) =>\n      setPreviewData(apiRes, data, Object.assign({}, apiContext, options))\n    apiRes.clearPreviewData = (options = {}) =>\n      clearPreviewData(apiRes, options)\n    apiRes.revalidate = (\n      urlPath: string,\n      opts?: {\n        unstable_onlyGenerated?: boolean\n      }\n    ) => revalidate(urlPath, opts || {}, req, apiContext)\n\n    const resolver = interopDefault(resolverModule)\n    let wasPiped = false\n\n    if (process.env.NODE_ENV !== 'production') {\n      // listen for pipe event and don't show resolve warning\n      res.once('pipe', () => (wasPiped = true))\n    }\n\n    const apiRouteResult = await resolver(req, res)\n\n    if (process.env.NODE_ENV !== 'production') {\n      if (typeof apiRouteResult !== 'undefined') {\n        if (apiRouteResult instanceof Response) {\n          throw new Error(\n            'API route returned a Response object in the Node.js runtime, this is not supported. Please use `runtime: \"edge\"` instead: https://nextjs.org/docs/api-routes/edge-api-routes'\n          )\n        }\n        console.warn(\n          `API handler should not return a value, received ${typeof apiRouteResult}.`\n        )\n      }\n\n      if (!externalResolver && !isResSent(res) && !wasPiped) {\n        console.warn(\n          `API resolved without sending a response for ${req.url}, this may result in stalled requests.`\n        )\n      }\n    }\n  } catch (err) {\n    await onError?.(\n      err,\n      {\n        method: req.method || 'GET',\n        headers: req.headers,\n        path: req.url || '/',\n      },\n      {\n        routerKind: 'Pages Router',\n        routePath: page || '',\n        routeType: 'route',\n        revalidateReason: undefined,\n      }\n    )\n\n    if (err instanceof ApiError) {\n      sendError(apiRes, err.statusCode, err.message)\n    } else {\n      if (dev) {\n        if (isError(err)) {\n          err.page = page\n        }\n        throw err\n      }\n\n      console.error(err)\n      if (propagateError) {\n        throw err\n      }\n      sendError(apiRes, 500, 'Internal Server Error')\n    }\n  }\n}\n","/**\n * FNV-1a Hash implementation\n * @author Travis Webb (tjwebb) <me@traviswebb.com>\n *\n * Ported from https://github.com/tjwebb/fnv-plus/blob/master/index.js\n *\n * Simplified, optimized and add modified for 52 bit, which provides a larger hash space\n * and still making use of Javascript's 53-bit integer space.\n */\nexport const fnv1a52 = (str: string) => {\n  const len = str.length\n  let i = 0,\n    t0 = 0,\n    v0 = 0x2325,\n    t1 = 0,\n    v1 = 0x8422,\n    t2 = 0,\n    v2 = 0x9ce4,\n    t3 = 0,\n    v3 = 0xcbf2\n\n  while (i < len) {\n    v0 ^= str.charCodeAt(i++)\n    t0 = v0 * 435\n    t1 = v1 * 435\n    t2 = v2 * 435\n    t3 = v3 * 435\n    t2 += v0 << 8\n    t3 += v1 << 8\n    t1 += t0 >>> 16\n    v0 = t0 & 65535\n    t2 += t1 >>> 16\n    v1 = t1 & 65535\n    v3 = (t3 + (t2 >>> 16)) & 65535\n    v2 = t2 & 65535\n  }\n\n  return (\n    (v3 & 15) * 281474976710656 +\n    v2 * 4294967296 +\n    v1 * 65536 +\n    (v0 ^ (v3 >> 4))\n  )\n}\n\nexport const generateETag = (payload: string, weak = false) => {\n  const prefix = weak ? 'W/\"' : '\"'\n  return (\n    prefix + fnv1a52(payload).toString(36) + payload.length.toString(36) + '\"'\n  )\n}\n","import type { IncomingMessage, ServerResponse } from 'http'\nimport type RenderResult from './render-result'\nimport type { CacheControl } from './lib/cache-control'\n\nimport { isResSent } from '../shared/lib/utils'\nimport { generateETag } from './lib/etag'\nimport fresh from 'next/dist/compiled/fresh'\nimport { getCacheControlHeader } from './lib/cache-control'\nimport { HTML_CONTENT_TYPE_HEADER } from '../lib/constants'\n\nexport function sendEtagResponse(\n  req: IncomingMessage,\n  res: ServerResponse,\n  etag: string | undefined\n): boolean {\n  if (etag) {\n    /**\n     * The server generating a 304 response MUST generate any of the\n     * following header fields that would have been sent in a 200 (OK)\n     * response to the same request: Cache-Control, Content-Location, Date,\n     * ETag, Expires, and Vary. https://tools.ietf.org/html/rfc7232#section-4.1\n     */\n    res.setHeader('ETag', etag)\n  }\n\n  if (fresh(req.headers, { etag })) {\n    res.statusCode = 304\n    res.end()\n    return true\n  }\n\n  return false\n}\n\nexport async function sendRenderResult({\n  req,\n  res,\n  result,\n  generateEtags,\n  poweredByHeader,\n  cacheControl,\n}: {\n  req: IncomingMessage\n  res: ServerResponse\n  result: RenderResult\n  generateEtags: boolean\n  poweredByHeader: boolean\n  cacheControl: CacheControl | undefined\n}): Promise<void> {\n  if (isResSent(res)) {\n    return\n  }\n\n  if (poweredByHeader && result.contentType === HTML_CONTENT_TYPE_HEADER) {\n    res.setHeader('X-Powered-By', 'Next.js')\n  }\n\n  // If cache control is already set on the response we don't\n  // override it to allow users to customize it via next.config\n  if (cacheControl && !res.getHeader('Cache-Control')) {\n    res.setHeader('Cache-Control', getCacheControlHeader(cacheControl))\n  }\n\n  const payload = result.isDynamic ? null : result.toUnchunkedString()\n\n  if (generateEtags && payload !== null) {\n    const etag = generateETag(payload)\n    if (sendEtagResponse(req, res, etag)) {\n      return\n    }\n  }\n\n  if (!res.getHeader('Content-Type') && result.contentType) {\n    res.setHeader('Content-Type', result.contentType)\n  }\n\n  if (payload) {\n    res.setHeader('Content-Length', Buffer.byteLength(payload))\n  }\n\n  if (req.method === 'HEAD') {\n    res.end(null)\n    return\n  }\n\n  if (payload !== null) {\n    res.end(payload)\n    return\n  }\n\n  // Pipe the render result to the response after we get a writer for it.\n  await result.pipeToNodeResponse(res)\n}\n","export function interopDefault<T>(mod: { default: T } | T): T {\n  // @ts-ignore\n  return mod.default || mod\n}\n","import type { IncomingMessage, ServerResponse } from 'http'\nimport type { PagesAPIRouteDefinition } from '../../route-definitions/pages-api-route-definition'\nimport type { PageConfig } from '../../../types'\nimport type { ParsedUrlQuery } from 'querystring'\nimport { wrapApiHandler, type __ApiPreviewProps } from '../../api-utils'\nimport type { RouteModuleOptions } from '../route-module'\n\nimport { RouteModule, type RouteModuleHandleContext } from '../route-module'\nimport { apiResolver } from '../../api-utils/node/api-resolver'\nimport type { RevalidateFn } from '../../lib/router-utils/router-server-context'\n\ntype PagesAPIHandleFn = (\n  req: IncomingMessage,\n  res: ServerResponse\n) => Promise<void>\n\n/**\n * The PagesAPIModule is the type of the module exported by the bundled Pages\n * API module.\n */\nexport type PagesAPIModule = typeof import('../../../build/templates/pages-api')\n\ntype PagesAPIUserlandModule = {\n  /**\n   * The exported handler method.\n   */\n  readonly default: PagesAPIHandleFn\n\n  /**\n   * The exported page config.\n   */\n  readonly config?: PageConfig\n}\n\ntype PagesAPIRouteHandlerContext = RouteModuleHandleContext & {\n  /**\n   * The incoming server request in non-edge runtime.\n   */\n  req?: IncomingMessage\n\n  /**\n   * The outgoing server response in non-edge runtime.\n   */\n  res?: ServerResponse\n\n  /**\n   * The hostname for the request.\n   */\n  hostname?: string\n\n  /**\n   * Keys allowed in the revalidate call.\n   */\n  allowedRevalidateHeaderKeys?: string[]\n\n  /**\n   * Whether to trust the host header.\n   */\n  trustHostHeader?: boolean\n\n  /**\n   * The query for the request.\n   */\n  query: ParsedUrlQuery\n\n  /**\n   * The preview props used by the `preview` API.\n   */\n  previewProps: __ApiPreviewProps\n\n  /**\n   * True if the server is in development mode.\n   */\n  dev: boolean\n\n  /**\n   * Whether errors should be left uncaught to handle\n   * higher up\n   */\n  propagateError: boolean\n\n  /**\n   * The page that's being rendered.\n   */\n  page: string\n\n  /**\n   * The error handler for the request.\n   */\n  onError?: Parameters<typeof apiResolver>[8]\n\n  /**\n   * whether multi-zone flag is enabled for draft mode\n   */\n  multiZoneDraftMode?: boolean\n\n  /**\n   * Internal revalidate function to avoid revalidating\n   * over the network\n   */\n  internalRevalidate?: RevalidateFn\n}\n\nexport type PagesAPIRouteModuleOptions = RouteModuleOptions<\n  PagesAPIRouteDefinition,\n  PagesAPIUserlandModule\n>\n\nexport class PagesAPIRouteModule extends RouteModule<\n  PagesAPIRouteDefinition,\n  PagesAPIUserlandModule\n> {\n  private apiResolverWrapped: typeof apiResolver\n\n  constructor(options: PagesAPIRouteModuleOptions) {\n    super(options)\n\n    if (typeof options.userland.default !== 'function') {\n      throw new Error(\n        `Page ${options.definition.page} does not export a default function.`\n      )\n    }\n\n    this.apiResolverWrapped = wrapApiHandler(\n      options.definition.page,\n      apiResolver\n    )\n  }\n\n  /**\n   *\n   * @param req the incoming server request\n   * @param res the outgoing server response\n   * @param context the context for the render\n   */\n  public async render(\n    req: IncomingMessage,\n    res: ServerResponse,\n    context: PagesAPIRouteHandlerContext\n  ): Promise<void> {\n    const { apiResolverWrapped } = this\n    await apiResolverWrapped(\n      req,\n      res,\n      context.query,\n      this.userland,\n      {\n        ...context.previewProps,\n        trustHostHeader: context.trustHostHeader,\n        allowedRevalidateHeaderKeys: context.allowedRevalidateHeaderKeys,\n        hostname: context.hostname,\n        multiZoneDraftMode: context.multiZoneDraftMode,\n        dev: context.dev,\n        internalRevalidate: context.internalRevalidate,\n      },\n      context.propagateError,\n      context.dev,\n      context.page,\n      context.onError\n    )\n  }\n}\n\nexport default PagesAPIRouteModule\n"],"names":["leafPrototypes","getProto","__defProp","Object","__getOwnPropDesc","__getOwnPropNames","__hasOwnProp","src_exports","all","RequestCookies","ResponseCookies","parseCookie","parseSetCookie","stringifyCookie","name","c","_a","attrs","Date","Boolean","stringified","encodeURIComponent","cookie","map","Map","pair","splitAt","key","value","decodeURIComponent","setCookie","attributes","domain","expires","httponly","maxage","path","samesite","secure","partitioned","priority","value2","string","t","Number","SAME_SITE","PRIORITY","newT","to","from","except","desc","requestHeaders","header","Symbol","args","Array","_","n","names","result","JSON","v","responseHeaders","_b","_c","cookieString","cookiesString","start","ch","lastComma","nextStart","cookiesSeparatorFound","cookiesStrings","pos","skipWhitespace","parsed","bag","headers","serialized","options","e","r","parse","format","a","i","Math","o","s","f","u","p","l","isNaN","parseFloat","parseInt","__dirname","__nccwpck_require__","ContentType","TypeError","String","isFinite","parseHttpDate","NaN","tryConsume","mustConsume","consumeText","isSafe","safePattern","escapeString","d","g","x","m","T","tokensToFunction","flags","RegExp","regexpToFunction","tokensToRegexp","h","E","w","y","R","A","pathToRegexp","env","stdout","globalThis","process","enabled","NO_COLOR","FORCE_COLOR","isTTY","CI","TERM","replaceClose","str","close","replace","index","substring","end","length","nextIndex","indexOf","formatter","open","input","bold","red","green","yellow","magenta","white","prefixes","wait","error","warn","ready","info","event","trace","LOGGING_METHOD","log","prefixedLog","prefixType","message","undefined","shift","consoleMethod","prefix","console","bootstrap","warnOnceCache","LRUCache","warnOnce","join","has","set","errorOnceCache","errorOnce","TEXT_PLAIN_CONTENT_TYPE_HEADER","HTML_CONTENT_TYPE_HEADER","JSON_CONTENT_TYPE_HEADER","NEXT_QUERY_PARAM_PREFIX","NEXT_INTERCEPTION_MARKER_PREFIX","MATCHED_PATH_HEADER","PRERENDER_REVALIDATE_HEADER","PRERENDER_REVALIDATE_ONLY_GENERATED_HEADER","RSC_SEGMENTS_DIR_SUFFIX","RSC_SEGMENT_SUFFIX","RSC_SUFFIX","ACTION_SUFFIX","NEXT_DATA_SUFFIX","NEXT_META_SUFFIX","NEXT_BODY_SUFFIX","NEXT_NAV_DEPLOYMENT_ID_HEADER","NEXT_CACHE_TAGS_HEADER","NEXT_CACHE_REVALIDATED_TAGS_HEADER","NEXT_CACHE_REVALIDATE_TAG_TOKEN_HEADER","NEXT_RESUME_HEADER","NEXT_RESUME_STATE_LENGTH_HEADER","NEXT_CACHE_TAG_MAX_ITEMS","NEXT_CACHE_TAG_MAX_LENGTH","NEXT_CACHE_SOFT_TAG_MAX_LENGTH","NEXT_CACHE_IMPLICIT_TAG_ID","NEXT_CACHE_ROOT_PARAM_TAG_ID","CACHE_ONE_YEAR_SECONDS","INFINITE_CACHE","MIDDLEWARE_FILENAME","MIDDLEWARE_LOCATION_REGEXP","PROXY_FILENAME","PROXY_LOCATION_REGEXP","INSTRUMENTATION_HOOK_FILENAME","PAGES_DIR_ALIAS","DOT_NEXT_ALIAS","ROOT_DIR_ALIAS","APP_DIR_ALIAS","RSC_MOD_REF_PROXY_ALIAS","RSC_ACTION_VALIDATE_ALIAS","RSC_ACTION_PROXY_ALIAS","RSC_CACHE_WRAPPER_ALIAS","RSC_DYNAMIC_IMPORT_WRAPPER_ALIAS","RSC_ACTION_ENCRYPTION_ALIAS","RSC_ACTION_CLIENT_WRAPPER_ALIAS","PUBLIC_DIR_MIDDLEWARE_CONFLICT","SSG_GET_INITIAL_PROPS_CONFLICT","SERVER_PROPS_GET_INIT_PROPS_CONFLICT","SERVER_PROPS_SSG_CONFLICT","STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR","SERVER_PROPS_EXPORT_ERROR","GSP_NO_RETURNED_VALUE","GSSP_NO_RETURNED_VALUE","UNSTABLE_REVALIDATE_RENAME_ERROR","GSSP_COMPONENT_MEMBER_ERROR","NON_STANDARD_NODE_ENV","SSG_FALLBACK_EXPORT_ERROR","ESLINT_DEFAULT_DIRS","SERVER_RUNTIME","edge","experimentalEdge","nodejs","WEB_SOCKET_MAX_RECONNECTIONS","WEBPACK_LAYERS_NAMES","shared","reactServerComponents","serverSideRendering","actionBrowser","apiNode","apiEdge","middleware","instrument","edgeAsset","appPagesBrowser","pagesDirBrowser","pagesDirEdge","pagesDirNode","WEBPACK_LAYERS","GROUP","builtinReact","serverOnly","neutralTarget","clientOnly","bundled","appPages","WEBPACK_RESOURCE_QUERIES","edgeSSREntry","metadata","metadataRoute","metadataImageMeta","resolveCacheHandlerPathToFilesystem","filePath","startsWith","fileURLToPath","formatDynamicImportPath","dir","resolvedFilePath","absoluteFilePath","pathToFileURL","toString","wrapApiHandler","page","handler","getTracer","setRootSpanAttribute","NodeSpan","spanName","sendStatusCode","res","statusCode","redirect","statusOrUrl","url","Error","writeHead","Location","write","checkIsOnDemandRevalidate","rawHeaders","previewProps","get","HeadersAdapter","isOnDemandRevalidate","previewModeId","revalidateOnlyGenerated","hasOwnProperty","COOKIE_NAME_PRERENDER_BYPASS","COOKIE_NAME_PRERENDER_DATA","RESPONSE_LIMIT_DEFAULT","SYMBOL_PREVIEW_DATA","SYMBOL_CLEARED_COOKIES","clearPreviewData","serialize","require","previous","getHeader","setHeader","isArray","httpOnly","sameSite","defineProperty","enumerable","ApiError","constructor","sendError","statusMessage","setLazyProp","req","prop","getter","opts","configurable","optsReset","writable","tryGetPreviewData","multiZoneDraftMode","cookies","encryptedPreviewData","tokenPreviewData","isValidPreviewModeId","data","jsonwebtoken","verify","previewModeSigningKey","decryptWithSecret","decryptedPreviewData","Buffer","previewModeEncryptionKey","CIPHER_ALGORITHM","encryptWithSecret","secret","iv","crypto","salt","cipher","encrypted","concat","update","final","tag","getAuthTag","encryptedData","buffer","slice","CIPHER_SALT_LENGTH","decipher","setAuthTag","LRUNode","size","prev","next","SentinelNode","maxSize","calculateSize","onEvict","cache","totalSize","head","tail","addToHead","node","removeNode","moveToHead","removeTail","lastNode","existing","newNode","delete","iterator","current","remove","currentSize","nodeFs","existsSync","fs","readFile","readFileSync","writeFile","mkdir","recursive","stat","BaseServerSpan","LoadComponentsSpan","NextServerSpan","NextNodeServerSpan","StartServerSpan","RenderSpan","AppRenderSpan","RouterSpan","AppRouteRouteHandlersSpan","ResolveMetadataSpan","MiddlewareSpan","NextVanillaSpanAllowlist","Set","LogSpanAllowList","REACT_POSTPONE_TYPE","for","isPostpone","$$typeof","_global","UNHANDLED_REJECTION_LISTENER_KEY","unhandledRejectionListener","reason","Log","isUnhandledRejectionListenerRegistered","listener","listeners","includes","registerUnhandledRejectionListener","on","installProcessErrorHandlers","shouldRemoveUncaughtErrorAndRejectionListeners","nextInitializedProcessErrorHandlers","removeAllListeners","ReadonlyHeadersError","callable","Headers","Proxy","target","receiver","ReflectAdapter","lowercased","toLowerCase","original","keys","find","deleteProperty","seal","hidden","methods","isHidden","sealed","createHidingMethods","entries","entry","getSetCookie","values","forEach","callbackfn","thisArg","call","bind","fresh","merge","append","push","Reflect","module","__webpack_require__","obj","mode","ns","def","exports","definition","CachedRouteKind","IncrementalCacheKind","RouteKind","BUILD_MANIFEST","parseReqUrl","parsedUrl","parseUrl","URL","query","searchParams","getAll","hash","search","pathname","href","host","hostname","auth","protocol","slashes","port","features","typescript","WeakMap","normalizeLocalePath","locales","detectedLocale","lowercasedLocales","locale","segments","split","segment","ensureLeadingSlash","normalizeAppPath","route","reduce","endsWith","normalizeRscURL","INTERCEPTION_ROUTE_MARKERS","isInterceptionRouteAppPath","TEST_ROUTE","TEST_STRICT_ROUTE","isDynamicRoute","strict","extractInterceptionRouteInformation","interceptingRoute","marker","interceptedRoute","splitInterceptingRoute","test","parsePath","hashIndex","queryIndex","hasQuery","pathHasPrefix","removePathPrefix","withoutPrefix","reHasRegExp","reReplaceRegExp","escapeStringRegexp","removeTrailingSlash","charCodeAt","InvariantError","PARAMETER_PATTERN","parseMatchedParameter","param","optional","repeat","getSafeKeyFromSegment","interceptionMarker","getSafeRouteKey","routeKeys","keyPrefix","backreferenceDuplicateKeys","pattern","cleanedKey","invalidKey","duplicateKey","interceptionPrefix","SP","performance","every","method","DecodeError","NormalizeError","PARAM_SEPARATOR","hasAdjacentParameterIssues","normalizeAdjacentParameters","normalized","stripNormalizedSeparators","safePathToRegexp","needsNormalization","routeToUse","normalizedRoute","retryError","safeCompile","compiler","compile","params","getRouteMatcher","re","groups","matcherFn","routeMatch","exec","decode","group","match","cleaned","item","searchParamsToUrlQuery","stringifyUrlQueryParam","getCookieParser","parseCookieFn","unescapeSegments","compileNonPath","validate","normalizeNextQueryParam","decodeQueryPathParameter","slashedProtocols","filterInternalQuery","paramKeys","isNextQueryPrefix","isNextInterceptionMarkerPrefix","detectDomainLocale","domainItems","defaultLocale","some","getHostname","normalizeDataPath","NEXT_REQUEST_META","getRequestMeta","meta","addRequestMeta","request","PATCHED_SET_HEADER","normalizePagePath","posix","resolvedPage","normalize","getExtensionRegexString","staticExtensions","dynamicExtensions","FAVICON_REGEX","ROBOTS_TXT_REGEX","MANIFEST_JSON_REGEX","MANIFEST_WEBMANIFEST_REGEX","SITEMAP_XML_REGEX","compiledRegexCache","DetachedPromise","resolve","reject","promise","Promise","rej","Batcher","cacheKeyFn","schedulerFn","fn","pending","create","batch","cacheKey","err","scheduleOnNextTick","cb","then","nextTick","voidCatch","Uint8Array","TextEncoder","encoder","streamFromString","ReadableStream","controller","enqueue","encode","streamFromBuffer","chunk","streamToString","stream","signal","decoder","TextDecoder","fatal","aborted","addPathPrefix","addPathSuffix","suffix","REGEX_LOCALHOST_HOSTNAME","parseURL","base","Internal","NextURL","baseOrOpts","basePath","analyze","getNextPathnameInfo","i18n","trailingSlash","nextConfig","pathnameNoDataPrefix","paths","buildId","parseData","i18nProvider","__NEXT_NO_MIDDLEWARE_URL_NORMALIZE","domainLocale","domains","formatPathname","addLocale","ignorePrefix","lower","forceLocale","formatSearch","origin","password","username","toJSON","clone","Request","ResponseAbortedName","ResponseAborted","clientComponentLoadStart","clientComponentLoadTimes","clientComponentLoadCount","getClientComponentLoaderMetrics","metrics","reset","isAbortError","HAS_CLIENT_COMPONENT_METRICS_ENABLED","NEXT_OTEL_PERFORMANCE_PREFIX","pipeToNodeResponse","readable","waitUntilForEnd","errored","destroyed","AbortController","response","once","writableFinished","abort","writer","createWriterFromResponse","started","drained","onDrain","off","finished","WritableStream","measure","flushHeaders","ok","flush","cause","destroy","pipeTo","pipeNodeReadableToNodeResponse","pause","resume","isNodeReadable","pipe","RenderResult","EMPTY","contentType","fromStatic","waitUntil","assignMetadata","assign","isNull","isDynamic","toUnchunkedString","isBuffer","chainStreams","streams","TransformStream","preventClose","nextStream","lastStream","catch","Readable","toWeb","coerce","pipeThrough","transform","unshift","fromResponseCacheEntry","cacheEntry","kind","html","pageData","status","postponed","rscData","segmentData","toResponseCacheEntry","isMiss","isStale","cacheControl","isFallback","parsePositiveInt","envValue","fallback","DEFAULT_TTL_MS","NEXT_PRIVATE_RESPONSE_CACHE_TTL","DEFAULT_MAX_SIZE","NEXT_PRIVATE_RESPONSE_CACHE_MAX_SIZE","TTL_SENTINEL","createCacheKey","invocationID","ResponseCache","minimal_mode","ttl","getBatcher","revalidateBatcher","evictedInvocationIDs","compoundKey","extractInvocationID","separatorIndex","lastIndexOf","first","add","responseGenerator","context","hasResolved","previousCacheEntry","cachedItem","now","expiresAt","incrementalCache","isRoutePPREnabled","isPrefetch","routeKind","handleGet","previousIncrementalCacheEntry","resolved","routeKindToIncrementalCacheKind","incrementalResponseCacheEntry","handleRevalidate","revalidate","responseCacheEntry","isRevalidating","min","max","expire","MultiFileWriter","tasks","findOrCreateTask","directory","task","flatMap","FileSystemCache","debug","NEXT_PRIVATE_DEBUG_CACHE","ctx","flushToDisk","serverDistDir","revalidatedTags","maxMemoryCacheSize","memoryCache","getMemoryCache","resetRequestCache","revalidateTag","tags","durations","existingEntry","tagsManifest","updates","stale","expired","getFilePath","fileData","mtime","lastModified","getTime","body","fetchIdx","fetchUrl","parsedData","storedTags","fetchCache","maybeSegmentData","segmentPaths","segmentsDir","segmentPath","segmentDataFilePath","tagsHeader","cacheTags","areTagsExpired","combinedTags","softTags","prefetchHints","stringify","isAppPath","htmlPath","rootDir","toRoute","toHex","bytes","isArrayBuffer","byteOffset","byteLength","hex","byte","padStart","hashString","cacheString","createHash","digest","IncrementalCache","dev","minimalMode","getPrerenderManifest","fetchCacheKeyPrefix","CurCacheHandler","allowedRevalidateHeaderKeys","locks","hasCustomCacheHandler","cacheHandlersSymbol","_globalThis","globalCacheHandler","FetchCache","__NEXT_TEST_MAX_ISR_CACHE","disableForTestmode","NEXT_PRIVATE_TEST_PROXY","prerenderManifest","cacheControls","SharedCacheControls","preview","getPreviouslyRevalidatedTags","cacheHandler","_requestHeaders","calculateRevalidate","fromTime","floor","timeOrigin","initialRevalidateSeconds","_getPathname","lock","generateSimpleCacheKey","generateCacheKey","init","bodyChunks","bodyType","_ogBody","getReader","chunks","readableBody","total","arr","arrayBuffer","offset","val","iterable","type","blob","Blob","fromEntries","credentials","referrer","referrerPolicy","integrity","cacheData","revalidateAfter","workUnitStore","workUnitAsyncStorage","resumeDataCache","getResumeDataCache","memoryCacheData","fetch","workStore","workAsyncStorage","pendingRevalidatedTags","mutable","age","areTagsStale","expireAfter","notFoundRoutes","itemSize","isImplicitBuildTimeCache","warningText","createDefaultCacheHandler","refreshTags","getExpiration","updateTags","pendingSets","pendingPromise","privateEntry","maxAgeSeconds","__NEXT_DEV_SERVER","timestamp","returnStream","newSaved","tee","pendingEntry","resolvePending","clonedValue","reader","read","done","isErrored","errorRetryCount","expiration","round","cloneCacheEntry","streamA","streamB","clonedEntry","reconcileFrontFromBacking","front","backing","frontEntry","backingEntry","cancel","mirrorIntoFront","handlersSymbol","handlersMapSymbol","handlersSetSymbol","privateHandlerSymbol","builtInHandlersSymbol","devFrontHandlersSymbol","devTieredHandlersSymbol","memoryCacheDisabledSymbol","reference","interopDefault","mod","default","RouterServerContextSymbol","routerServerGlobal","isInterceptionRouteRewrite","dynamicImportEsmDefault","id","RouteModule","userland","_userland","distDir","relativeProjectDir","isDev","getRouterServerContext","render404","routerServerContext","normalizeUrl","_req","_parsedUrl","instrumentationOnRequestError","absoluteProjectDir","cwd","loadManifests","srcPage","projectDir","loadManifestFromRelativePath","normalizedPagePath","router","routesManifest","buildManifest","fallbackBuildManifest","reactLoadableManifest","nextFontManifest","clientReferenceManifest","serverActionsManifest","subresourceIntegrityManifest","serverFilesManifest","dynamicCssManifest","prefetchHintsManifest","manifest","shouldCache","handleMissing","isAppRouteRoute","isMetadataRouteFile","appDirRelativePath","pageExtensions","strictlyMatchExtensions","normalizedPath","fastResult","regexes","getCompiledRegexes","cached","trailingMatcher","suffixMatcher","variantsMatcher","robotsExts","manifestExts","useEval","skipParse","__RSC_MANIFEST","interceptionRoutePatterns","rewrites","beforeFiles","filter","rewrite","regex","loadCustomCacheHandlers","cacheMaxMemorySize","cacheHandlers","initializeCacheHandlers","handlersMap","builtInHandlers","builtInSize","DefaultCache","RemoteCache","setCacheHandler","frontHandler","createTieredCacheHandler","inFlightSyncs","scheduleBackgroundSync","sync","finally","pendingRevalidateWrites","servedEntry","mirroredEntry","getIncrementalCache","isMinimalMode","CacheHandler","experimental","isrFlushToDisk","__incrementalCache","onRequestError","errorContext","silenceLog","logErrorWithOriginalStack","getNextConfigEdge","prepare","localeResult","previewData","deploymentId","patchSetHeaderWithCookieSupport","headersSent","middlewareValue","idx","relative","absoluteDistDir","ensureInstrumentationRegistered","manifests","config","initUrl","trustHostHeader","isNextDataRequest","originalPathname","originalQuery","pageIsDynamic","normalizedSrcPage","serverUtils","getServerUtils","caseSensitive","defaultRouteRegex","dynamicRouteMatcher","defaultRouteMatches","namedRegex","getNamedParametrizedRoute","prefixRouteKeys","includeSuffix","includePrefix","intercepted","routeKey","j","fromCharCode","inverseParts","structuredClone","hasInterceptionMarker","paramMatches","namedParameterizedRoute","pathToRegexpPattern","excludeOptionalTrailingSlash","getRouteRegex","parameterizedRoute","getParametrizedRoute","groupIndex","markerMatch","handleRewrites","rewrittenParsedUrl","rewriteParams","fsPathname","checkRewrite","regexp","matcher","source","removeUnnamedParams","sensitive","delimiter","regexModifier","missing","hasParams","matchHas","hasMatch","hasItem","getSafeParamName","paramName","newParamName","charCode","matches","groupKey","parsedDestination","destQuery","prepareDestination","destHostnameCompiler","newUrl","parseDestination","escaped","destination","parseRelativeUrl","parseQuery","globalBase","resolvedBase","parsedURL","destHostname","destSearch","destPath","destParams","destPathParamKeys","destHostnameParamKeys","destPathCompiler","strOrArray","appendParamsToQuery","nextInternalLocale","dynamicParams","fsPathnameNoSlash","afterFiles","normalizeQueryParams","routeParamKeys","normalizedKey","getParamsFromRouteMatches","routeMatchesHeader","routeMatches","URLSearchParams","keyName","normalizeDynamicRouteParams","ignoreMissingOptional","isDefaultValueMatch","candidateValue","defaultValue","normalizedCandidateValue","decodedCandidateValue","isOptional","isDefaultValue","defaultVal","hasValidParams","normalizeCdnUrl","formatUrl","urlObj","querystring","interpolateDynamicPath","paramValue","builtParam","replaceAll","__NEXT_TRAILING_SLASH","rewriteParamKeys","paramsMatch","paramsResult","combinedParamKeys","originalValue","queryValue","isWrappedByNextServer","paramsToInterpolate","queryResult","isDraftMode","removeUncaughtErrorAndRejectionListeners","resolvedPathname","encodedResolvedPathname","seg","char","runtimeServerDeploymentId","NEXT_DEPLOYMENT_ID","clientAssetToken","supportsImmutableAssets","getResponseCache","responseCache","handleResponse","purpose","isError","parseBody","limit","parameters","encoding","charset","getRawBody","parseJson","qs","isValidData","urlPath","unstable_onlyGenerated","internalRevalidate","cacheHeader","toUpperCase","apiResolver","resolverModule","apiContext","propagateError","onError","bodyParser","api","responseLimit","externalResolver","apiReq","sizeLimit","contentLength","maxContentLength","writeData","apiRes","endResponse","apply","send","sendData","removeHeader","Stream","isJSONLike","stringifiedBody","etag","generateETag","payload","weak","fnv1a52","len","t0","v0","t1","v1","t2","v2","t3","v3","json","setDraftMode","enable","setPreviewData","sign","algorithm","maxAge","expiresIn","resolver","wasPiped","apiRouteResult","Response","routerKind","routePath","routeType","revalidateReason","PagesAPIRouteModule","apiResolverWrapped","render"],"mappings":"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","ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109]}