{"ast":null,"code":"/**\n * React Router DOM v6.8.1\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { UNSAFE_enhanceManualRouteObjects, Router, useHref, useResolvedPath, useLocation, UNSAFE_DataRouterStateContext, UNSAFE_NavigationContext, useNavigate, createPath, UNSAFE_RouteContext, useMatches, useNavigation, unstable_useBlocker, UNSAFE_DataRouterContext } from 'react-router';\nexport { AbortedDeferredError, Await, MemoryRouter, Navigate, NavigationType, Outlet, Route, Router, RouterProvider, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_NavigationContext, UNSAFE_RouteContext, UNSAFE_enhanceManualRouteObjects, createMemoryRouter, createPath, createRoutesFromChildren, createRoutesFromElements, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, parsePath, redirect, renderMatches, resolvePath, unstable_useBlocker, useActionData, useAsyncError, useAsyncValue, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes } from 'react-router';\nimport { createRouter, createBrowserHistory, createHashHistory, ErrorResponse, invariant, joinPaths } from '@remix-run/router';\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\nconst defaultMethod = \"get\";\nconst defaultEncType = \"application/x-www-form-urlencoded\";\nfunction isHtmlElement(object) {\n  return object != null && typeof object.tagName === \"string\";\n}\nfunction isButtonElement(object) {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\nfunction isFormElement(object) {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\nfunction isInputElement(object) {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n  return event.button === 0 && (\n  // Ignore everything but left clicks\n  !target || target === \"_self\") &&\n  // Let browser handle \"target=_blank\" etc.\n  !isModifiedEvent(event) // Ignore clicks with modifier keys\n  ;\n}\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n *   let searchParams = new URLSearchParams([\n *     ['sort', 'name'],\n *     ['sort', 'price']\n *   ]);\n *\n * you can do:\n *\n *   let searchParams = createSearchParams({\n *     sort: ['name', 'price']\n *   });\n */\n\nfunction createSearchParams(init) {\n  if (init === void 0) {\n    init = \"\";\n  }\n  return new URLSearchParams(typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo, key) => {\n    let value = init[key];\n    return memo.concat(Array.isArray(value) ? value.map(v => [key, v]) : [[key, value]]);\n  }, []));\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n  let searchParams = createSearchParams(locationSearch);\n  if (defaultSearchParams) {\n    for (let key of defaultSearchParams.keys()) {\n      if (!searchParams.has(key)) {\n        defaultSearchParams.getAll(key).forEach(value => {\n          searchParams.append(key, value);\n        });\n      }\n    }\n  }\n  return searchParams;\n}\nfunction getFormSubmissionInfo(target, defaultAction, options) {\n  let method;\n  let action;\n  let encType;\n  let formData;\n  if (isFormElement(target)) {\n    let submissionTrigger = options.submissionTrigger;\n    method = options.method || target.getAttribute(\"method\") || defaultMethod;\n    action = options.action || target.getAttribute(\"action\") || defaultAction;\n    encType = options.encType || target.getAttribute(\"enctype\") || defaultEncType;\n    formData = new FormData(target);\n    if (submissionTrigger && submissionTrigger.name) {\n      formData.append(submissionTrigger.name, submissionTrigger.value);\n    }\n  } else if (isButtonElement(target) || isInputElement(target) && (target.type === \"submit\" || target.type === \"image\")) {\n    let form = target.form;\n    if (form == null) {\n      throw new Error(\"Cannot submit a <button> or <input type=\\\"submit\\\"> without a <form>\");\n    } // <button>/<input type=\"submit\"> may override attributes of <form>\n\n    method = options.method || target.getAttribute(\"formmethod\") || form.getAttribute(\"method\") || defaultMethod;\n    action = options.action || target.getAttribute(\"formaction\") || form.getAttribute(\"action\") || defaultAction;\n    encType = options.encType || target.getAttribute(\"formenctype\") || form.getAttribute(\"enctype\") || defaultEncType;\n    formData = new FormData(form); // Include name + value from a <button>, appending in case the button name\n    // matches an existing input name\n\n    if (target.name) {\n      formData.append(target.name, target.value);\n    }\n  } else if (isHtmlElement(target)) {\n    throw new Error(\"Cannot submit element that is not <form>, <button>, or \" + \"<input type=\\\"submit|image\\\">\");\n  } else {\n    method = options.method || defaultMethod;\n    action = options.action || defaultAction;\n    encType = options.encType || defaultEncType;\n    if (target instanceof FormData) {\n      formData = target;\n    } else {\n      formData = new FormData();\n      if (target instanceof URLSearchParams) {\n        for (let [name, value] of target) {\n          formData.append(name, value);\n        }\n      } else if (target != null) {\n        for (let name of Object.keys(target)) {\n          formData.append(name, target[name]);\n        }\n      }\n    }\n  }\n  let {\n    protocol,\n    host\n  } = window.location;\n  let url = new URL(action, protocol + \"//\" + host);\n  return {\n    url,\n    method: method.toLowerCase(),\n    encType,\n    formData\n  };\n}\nconst _excluded = [\"onClick\", \"relative\", \"reloadDocument\", \"replace\", \"state\", \"target\", \"to\", \"preventScrollReset\"],\n  _excluded2 = [\"aria-current\", \"caseSensitive\", \"className\", \"end\", \"style\", \"to\", \"children\"],\n  _excluded3 = [\"reloadDocument\", \"replace\", \"method\", \"action\", \"onSubmit\", \"fetcherKey\", \"routeId\", \"relative\", \"preventScrollReset\"];\n//#region Routers\n////////////////////////////////////////////////////////////////////////////////\n\nfunction createBrowserRouter(routes, opts) {\n  return createRouter({\n    basename: opts == null ? void 0 : opts.basename,\n    history: createBrowserHistory({\n      window: opts == null ? void 0 : opts.window\n    }),\n    hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n    routes: UNSAFE_enhanceManualRouteObjects(routes)\n  }).initialize();\n}\nfunction createHashRouter(routes, opts) {\n  return createRouter({\n    basename: opts == null ? void 0 : opts.basename,\n    history: createHashHistory({\n      window: opts == null ? void 0 : opts.window\n    }),\n    hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n    routes: UNSAFE_enhanceManualRouteObjects(routes)\n  }).initialize();\n}\nfunction parseHydrationData() {\n  var _window;\n  let state = (_window = window) == null ? void 0 : _window.__staticRouterHydrationData;\n  if (state && state.errors) {\n    state = _extends({}, state, {\n      errors: deserializeErrors(state.errors)\n    });\n  }\n  return state;\n}\nfunction deserializeErrors(errors) {\n  if (!errors) return null;\n  let entries = Object.entries(errors);\n  let serialized = {};\n  for (let [key, val] of entries) {\n    // Hey you!  If you change this, please change the corresponding logic in\n    // serializeErrors in react-router-dom/server.tsx :)\n    if (val && val.__type === \"RouteErrorResponse\") {\n      serialized[key] = new ErrorResponse(val.status, val.statusText, val.data, val.internal === true);\n    } else if (val && val.__type === \"Error\") {\n      let error = new Error(val.message); // Wipe away the client-side stack trace.  Nothing to fill it in with\n      // because we don't serialize SSR stack traces for security reasons\n\n      error.stack = \"\";\n      serialized[key] = error;\n    } else {\n      serialized[key] = val;\n    }\n  }\n  return serialized;\n}\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\n\nfunction BrowserRouter(_ref) {\n  let {\n    basename,\n    children,\n    window\n  } = _ref;\n  let historyRef = React.useRef();\n  if (historyRef.current == null) {\n    historyRef.current = createBrowserHistory({\n      window,\n      v5Compat: true\n    });\n  }\n  let history = historyRef.current;\n  let [state, setState] = React.useState({\n    action: history.action,\n    location: history.location\n  });\n  React.useLayoutEffect(() => history.listen(setState), [history]);\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: state.location,\n    navigationType: state.action,\n    navigator: history\n  });\n}\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\n\nfunction HashRouter(_ref2) {\n  let {\n    basename,\n    children,\n    window\n  } = _ref2;\n  let historyRef = React.useRef();\n  if (historyRef.current == null) {\n    historyRef.current = createHashHistory({\n      window,\n      v5Compat: true\n    });\n  }\n  let history = historyRef.current;\n  let [state, setState] = React.useState({\n    action: history.action,\n    location: history.location\n  });\n  React.useLayoutEffect(() => history.listen(setState), [history]);\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: state.location,\n    navigationType: state.action,\n    navigator: history\n  });\n}\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\n\nfunction HistoryRouter(_ref3) {\n  let {\n    basename,\n    children,\n    history\n  } = _ref3;\n  const [state, setState] = React.useState({\n    action: history.action,\n    location: history.location\n  });\n  React.useLayoutEffect(() => history.listen(setState), [history]);\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: state.location,\n    navigationType: state.action,\n    navigator: history\n  });\n}\nif (process.env.NODE_ENV !== \"production\") {\n  HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\n/**\n * The public API for rendering a history-aware <a>.\n */\n\nconst Link = /*#__PURE__*/React.forwardRef(function LinkWithRef(_ref4, ref) {\n  let {\n      onClick,\n      relative,\n      reloadDocument,\n      replace,\n      state,\n      target,\n      to,\n      preventScrollReset\n    } = _ref4,\n    rest = _objectWithoutPropertiesLoose(_ref4, _excluded);\n\n  // Rendered into <a href> for absolute URLs\n  let absoluteHref;\n  let isExternal = false;\n  if (isBrowser && typeof to === \"string\" && /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i.test(to)) {\n    absoluteHref = to;\n    let currentUrl = new URL(window.location.href);\n    let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n    if (targetUrl.origin === currentUrl.origin) {\n      // Strip the protocol/origin for same-origin absolute URLs\n      to = targetUrl.pathname + targetUrl.search + targetUrl.hash;\n    } else {\n      isExternal = true;\n    }\n  } // Rendered into <a href> for relative URLs\n\n  let href = useHref(to, {\n    relative\n  });\n  let internalOnClick = useLinkClickHandler(to, {\n    replace,\n    state,\n    target,\n    preventScrollReset,\n    relative\n  });\n  function handleClick(event) {\n    if (onClick) onClick(event);\n    if (!event.defaultPrevented) {\n      internalOnClick(event);\n    }\n  }\n  return /*#__PURE__*/(\n    // eslint-disable-next-line jsx-a11y/anchor-has-content\n    React.createElement(\"a\", _extends({}, rest, {\n      href: absoluteHref || href,\n      onClick: isExternal || reloadDocument ? onClick : handleClick,\n      ref: ref,\n      target: target\n    }))\n  );\n});\nif (process.env.NODE_ENV !== \"production\") {\n  Link.displayName = \"Link\";\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\n\nconst NavLink = /*#__PURE__*/React.forwardRef(function NavLinkWithRef(_ref5, ref) {\n  let {\n      \"aria-current\": ariaCurrentProp = \"page\",\n      caseSensitive = false,\n      className: classNameProp = \"\",\n      end = false,\n      style: styleProp,\n      to,\n      children\n    } = _ref5,\n    rest = _objectWithoutPropertiesLoose(_ref5, _excluded2);\n  let path = useResolvedPath(to, {\n    relative: rest.relative\n  });\n  let location = useLocation();\n  let routerState = React.useContext(UNSAFE_DataRouterStateContext);\n  let {\n    navigator\n  } = React.useContext(UNSAFE_NavigationContext);\n  let toPathname = navigator.encodeLocation ? navigator.encodeLocation(path).pathname : path.pathname;\n  let locationPathname = location.pathname;\n  let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null;\n  if (!caseSensitive) {\n    locationPathname = locationPathname.toLowerCase();\n    nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null;\n    toPathname = toPathname.toLowerCase();\n  }\n  let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(toPathname.length) === \"/\";\n  let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === \"/\");\n  let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n  let className;\n  if (typeof classNameProp === \"function\") {\n    className = classNameProp({\n      isActive,\n      isPending\n    });\n  } else {\n    // If the className prop is not a function, we use a default `active`\n    // class for <NavLink />s that are active. In v5 `active` was the default\n    // value for `activeClassName`, but we are removing that API and can still\n    // use the old default behavior for a cleaner upgrade path and keep the\n    // simple styling rules working as they currently do.\n    className = [classNameProp, isActive ? \"active\" : null, isPending ? \"pending\" : null].filter(Boolean).join(\" \");\n  }\n  let style = typeof styleProp === \"function\" ? styleProp({\n    isActive,\n    isPending\n  }) : styleProp;\n  return /*#__PURE__*/React.createElement(Link, _extends({}, rest, {\n    \"aria-current\": ariaCurrent,\n    className: className,\n    ref: ref,\n    style: style,\n    to: to\n  }), typeof children === \"function\" ? children({\n    isActive,\n    isPending\n  }) : children);\n});\nif (process.env.NODE_ENV !== \"production\") {\n  NavLink.displayName = \"NavLink\";\n}\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\n\nconst Form = /*#__PURE__*/React.forwardRef((props, ref) => {\n  return /*#__PURE__*/React.createElement(FormImpl, _extends({}, props, {\n    ref: ref\n  }));\n});\nif (process.env.NODE_ENV !== \"production\") {\n  Form.displayName = \"Form\";\n}\nconst FormImpl = /*#__PURE__*/React.forwardRef((_ref6, forwardedRef) => {\n  let {\n      reloadDocument,\n      replace,\n      method = defaultMethod,\n      action,\n      onSubmit,\n      fetcherKey,\n      routeId,\n      relative,\n      preventScrollReset\n    } = _ref6,\n    props = _objectWithoutPropertiesLoose(_ref6, _excluded3);\n  let submit = useSubmitImpl(fetcherKey, routeId);\n  let formMethod = method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n  let formAction = useFormAction(action, {\n    relative\n  });\n  let submitHandler = event => {\n    onSubmit && onSubmit(event);\n    if (event.defaultPrevented) return;\n    event.preventDefault();\n    let submitter = event.nativeEvent.submitter;\n    let submitMethod = (submitter == null ? void 0 : submitter.getAttribute(\"formmethod\")) || method;\n    submit(submitter || event.currentTarget, {\n      method: submitMethod,\n      replace,\n      relative,\n      preventScrollReset\n    });\n  };\n  return /*#__PURE__*/React.createElement(\"form\", _extends({\n    ref: forwardedRef,\n    method: formMethod,\n    action: formAction,\n    onSubmit: reloadDocument ? onSubmit : submitHandler\n  }, props));\n});\nif (process.env.NODE_ENV !== \"production\") {\n  FormImpl.displayName = \"FormImpl\";\n}\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */\n\nfunction ScrollRestoration(_ref7) {\n  let {\n    getKey,\n    storageKey\n  } = _ref7;\n  useScrollRestoration({\n    getKey,\n    storageKey\n  });\n  return null;\n}\nif (process.env.NODE_ENV !== \"production\") {\n  ScrollRestoration.displayName = \"ScrollRestoration\";\n} //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\n\nvar DataRouterHook;\n(function (DataRouterHook) {\n  DataRouterHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n  DataRouterHook[\"UseSubmitImpl\"] = \"useSubmitImpl\";\n  DataRouterHook[\"UseFetcher\"] = \"useFetcher\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function (DataRouterStateHook) {\n  DataRouterStateHook[\"UseFetchers\"] = \"useFetchers\";\n  DataRouterStateHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction getDataRouterConsoleError(hookName) {\n  return hookName + \" must be used within a data router.  See https://reactrouter.com/routers/picking-a-router.\";\n}\nfunction useDataRouterContext(hookName) {\n  let ctx = React.useContext(UNSAFE_DataRouterContext);\n  !ctx ? process.env.NODE_ENV !== \"production\" ? invariant(false, getDataRouterConsoleError(hookName)) : invariant(false) : void 0;\n  return ctx;\n}\nfunction useDataRouterState(hookName) {\n  let state = React.useContext(UNSAFE_DataRouterStateContext);\n  !state ? process.env.NODE_ENV !== \"production\" ? invariant(false, getDataRouterConsoleError(hookName)) : invariant(false) : void 0;\n  return state;\n}\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\n\nfunction useLinkClickHandler(to, _temp) {\n  let {\n    target,\n    replace: replaceProp,\n    state,\n    preventScrollReset,\n    relative\n  } = _temp === void 0 ? {} : _temp;\n  let navigate = useNavigate();\n  let location = useLocation();\n  let path = useResolvedPath(to, {\n    relative\n  });\n  return React.useCallback(event => {\n    if (shouldProcessLinkClick(event, target)) {\n      event.preventDefault(); // If the URL hasn't changed, a regular <a> will do a replace instead of\n      // a push, so do the same here unless the replace prop is explicitly set\n\n      let replace = replaceProp !== undefined ? replaceProp : createPath(location) === createPath(path);\n      navigate(to, {\n        replace,\n        state,\n        preventScrollReset,\n        relative\n      });\n    }\n  }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative]);\n}\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\n\nfunction useSearchParams(defaultInit) {\n  process.env.NODE_ENV !== \"production\" ? warning(typeof URLSearchParams !== \"undefined\", \"You cannot use the `useSearchParams` hook in a browser that does not \" + \"support the URLSearchParams API. If you need to support Internet \" + \"Explorer 11, we recommend you load a polyfill such as \" + \"https://github.com/ungap/url-search-params\\n\\n\" + \"If you're unsure how to load polyfills, we recommend you check out \" + \"https://polyfill.io/v3/ which provides some recommendations about how \" + \"to load polyfills only for users that need them, instead of for every \" + \"user.\") : void 0;\n  let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n  let hasSetSearchParamsRef = React.useRef(false);\n  let location = useLocation();\n  let searchParams = React.useMemo(() =>\n  // Only merge in the defaults if we haven't yet called setSearchParams.\n  // Once we call that we want those to take precedence, otherwise you can't\n  // remove a param with setSearchParams({}) if it has an initial value\n  getSearchParamsForLocation(location.search, hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current), [location.search]);\n  let navigate = useNavigate();\n  let setSearchParams = React.useCallback((nextInit, navigateOptions) => {\n    const newSearchParams = createSearchParams(typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit);\n    hasSetSearchParamsRef.current = true;\n    navigate(\"?\" + newSearchParams, navigateOptions);\n  }, [navigate, searchParams]);\n  return [searchParams, setSearchParams];\n}\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\n\nfunction useSubmit() {\n  return useSubmitImpl();\n}\nfunction useSubmitImpl(fetcherKey, routeId) {\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseSubmitImpl);\n  let defaultAction = useFormAction();\n  return React.useCallback(function (target, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    if (typeof document === \"undefined\") {\n      throw new Error(\"You are calling submit during the server render. \" + \"Try calling submit within a `useEffect` or callback instead.\");\n    }\n    let {\n      method,\n      encType,\n      formData,\n      url\n    } = getFormSubmissionInfo(target, defaultAction, options);\n    let href = url.pathname + url.search;\n    let opts = {\n      replace: options.replace,\n      preventScrollReset: options.preventScrollReset,\n      formData,\n      formMethod: method,\n      formEncType: encType\n    };\n    if (fetcherKey) {\n      !(routeId != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"No routeId available for useFetcher()\") : invariant(false) : void 0;\n      router.fetch(fetcherKey, routeId, href, opts);\n    } else {\n      router.navigate(href, opts);\n    }\n  }, [defaultAction, router, fetcherKey, routeId]);\n}\nfunction useFormAction(action, _temp2) {\n  let {\n    relative\n  } = _temp2 === void 0 ? {} : _temp2;\n  let {\n    basename\n  } = React.useContext(UNSAFE_NavigationContext);\n  let routeContext = React.useContext(UNSAFE_RouteContext);\n  !routeContext ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"useFormAction must be used inside a RouteContext\") : invariant(false) : void 0;\n  let [match] = routeContext.matches.slice(-1); // Shallow clone path so we can modify it below, otherwise we modify the\n  // object referenced by useMemo inside useResolvedPath\n\n  let path = _extends({}, useResolvedPath(action ? action : \".\", {\n    relative\n  })); // Previously we set the default action to \".\". The problem with this is that\n  // `useResolvedPath(\".\")` excludes search params and the hash of the resolved\n  // URL. This is the intended behavior of when \".\" is specifically provided as\n  // the form action, but inconsistent w/ browsers when the action is omitted.\n  // https://github.com/remix-run/remix/issues/927\n\n  let location = useLocation();\n  if (action == null) {\n    // Safe to write to these directly here since if action was undefined, we\n    // would have called useResolvedPath(\".\") which will never include a search\n    // or hash\n    path.search = location.search;\n    path.hash = location.hash; // When grabbing search params from the URL, remove the automatically\n    // inserted ?index param so we match the useResolvedPath search behavior\n    // which would not include ?index\n\n    if (match.route.index) {\n      let params = new URLSearchParams(path.search);\n      params.delete(\"index\");\n      path.search = params.toString() ? \"?\" + params.toString() : \"\";\n    }\n  }\n  if ((!action || action === \".\") && match.route.index) {\n    path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n  } // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the form action.  If this is a root navigation, then just use\n  // the raw basename which allows the basename to have full control over the\n  // presence of a trailing slash on root actions\n\n  if (basename !== \"/\") {\n    path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n  return createPath(path);\n}\nfunction createFetcherForm(fetcherKey, routeId) {\n  let FetcherForm = /*#__PURE__*/React.forwardRef((props, ref) => {\n    return /*#__PURE__*/React.createElement(FormImpl, _extends({}, props, {\n      ref: ref,\n      fetcherKey: fetcherKey,\n      routeId: routeId\n    }));\n  });\n  if (process.env.NODE_ENV !== \"production\") {\n    FetcherForm.displayName = \"fetcher.Form\";\n  }\n  return FetcherForm;\n}\nlet fetcherId = 0;\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\n\nfunction useFetcher() {\n  var _route$matches;\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseFetcher);\n  let route = React.useContext(UNSAFE_RouteContext);\n  !route ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"useFetcher must be used inside a RouteContext\") : invariant(false) : void 0;\n  let routeId = (_route$matches = route.matches[route.matches.length - 1]) == null ? void 0 : _route$matches.route.id;\n  !(routeId != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"useFetcher can only be used on routes that contain a unique \\\"id\\\"\") : invariant(false) : void 0;\n  let [fetcherKey] = React.useState(() => String(++fetcherId));\n  let [Form] = React.useState(() => {\n    !routeId ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"No routeId available for fetcher.Form()\") : invariant(false) : void 0;\n    return createFetcherForm(fetcherKey, routeId);\n  });\n  let [load] = React.useState(() => href => {\n    !router ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"No router available for fetcher.load()\") : invariant(false) : void 0;\n    !routeId ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"No routeId available for fetcher.load()\") : invariant(false) : void 0;\n    router.fetch(fetcherKey, routeId, href);\n  });\n  let submit = useSubmitImpl(fetcherKey, routeId);\n  let fetcher = router.getFetcher(fetcherKey);\n  let fetcherWithComponents = React.useMemo(() => _extends({\n    Form,\n    submit,\n    load\n  }, fetcher), [fetcher, Form, submit, load]);\n  React.useEffect(() => {\n    // Is this busted when the React team gets real weird and calls effects\n    // twice on mount?  We really just need to garbage collect here when this\n    // fetcher is no longer around.\n    return () => {\n      if (!router) {\n        console.warn(\"No fetcher available to clean up from useFetcher()\");\n        return;\n      }\n      router.deleteFetcher(fetcherKey);\n    };\n  }, [router, fetcherKey]);\n  return fetcherWithComponents;\n}\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\n\nfunction useFetchers() {\n  let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n  return [...state.fetchers.values()];\n}\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions = {};\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\n\nfunction useScrollRestoration(_temp3) {\n  let {\n    getKey,\n    storageKey\n  } = _temp3 === void 0 ? {} : _temp3;\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n  let {\n    restoreScrollPosition,\n    preventScrollReset\n  } = useDataRouterState(DataRouterStateHook.UseScrollRestoration);\n  let location = useLocation();\n  let matches = useMatches();\n  let navigation = useNavigation(); // Trigger manual scroll restoration while we're active\n\n  React.useEffect(() => {\n    window.history.scrollRestoration = \"manual\";\n    return () => {\n      window.history.scrollRestoration = \"auto\";\n    };\n  }, []); // Save positions on pagehide\n\n  usePageHide(React.useCallback(() => {\n    if (navigation.state === \"idle\") {\n      let key = (getKey ? getKey(location, matches) : null) || location.key;\n      savedScrollPositions[key] = window.scrollY;\n    }\n    sessionStorage.setItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY, JSON.stringify(savedScrollPositions));\n    window.history.scrollRestoration = \"auto\";\n  }, [storageKey, getKey, navigation.state, location, matches])); // Read in any saved scroll locations\n\n  if (typeof document !== \"undefined\") {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      try {\n        let sessionPositions = sessionStorage.getItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY);\n        if (sessionPositions) {\n          savedScrollPositions = JSON.parse(sessionPositions);\n        }\n      } catch (e) {// no-op, use default empty object\n      }\n    }, [storageKey]); // Enable scroll restoration in the router\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n\n    React.useLayoutEffect(() => {\n      let disableScrollRestoration = router == null ? void 0 : router.enableScrollRestoration(savedScrollPositions, () => window.scrollY, getKey);\n      return () => disableScrollRestoration && disableScrollRestoration();\n    }, [router, getKey]); // Restore scrolling when state.restoreScrollPosition changes\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n\n    React.useLayoutEffect(() => {\n      // Explicit false means don't do anything (used for submissions)\n      if (restoreScrollPosition === false) {\n        return;\n      } // been here before, scroll to it\n\n      if (typeof restoreScrollPosition === \"number\") {\n        window.scrollTo(0, restoreScrollPosition);\n        return;\n      } // try to scroll to the hash\n\n      if (location.hash) {\n        let el = document.getElementById(location.hash.slice(1));\n        if (el) {\n          el.scrollIntoView();\n          return;\n        }\n      } // Don't reset if this navigation opted out\n\n      if (preventScrollReset === true) {\n        return;\n      } // otherwise go to the top on new locations\n\n      window.scrollTo(0, 0);\n    }, [location, restoreScrollPosition, preventScrollReset]);\n  }\n}\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\n\nfunction useBeforeUnload(callback, options) {\n  let {\n    capture\n  } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? {\n      capture\n    } : undefined;\n    window.addEventListener(\"beforeunload\", callback, opts);\n    return () => {\n      window.removeEventListener(\"beforeunload\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.  This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\n\nfunction usePageHide(callback, options) {\n  let {\n    capture\n  } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? {\n      capture\n    } : undefined;\n    window.addEventListener(\"pagehide\", callback, opts);\n    return () => {\n      window.removeEventListener(\"pagehide\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open.  Use at your own risk.\n */\n\nfunction usePrompt(_ref8) {\n  let {\n    when,\n    message\n  } = _ref8;\n  let blocker = unstable_useBlocker(when);\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\" && !when) {\n      blocker.reset();\n    }\n  }, [blocker, when]);\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\") {\n      let proceed = window.confirm(message);\n      if (proceed) {\n        setTimeout(blocker.proceed, 0);\n      } else {\n        blocker.reset();\n      }\n    }\n  }, [blocker, message]);\n}\n////////////////////////////////////////////////////////////////////////////////\n//#region Utils\n////////////////////////////////////////////////////////////////////////////////\n\nfunction warning(cond, message) {\n  if (!cond) {\n    // eslint-disable-next-line no-console\n    if (typeof console !== \"undefined\") console.warn(message);\n    try {\n      // Welcome to debugging React Router!\n      //\n      // This error is thrown as a convenience so you can more easily\n      // find the source for a warning that appears in the console by\n      // enabling \"pause on exceptions\" in your JavaScript debugger.\n      throw new Error(message); // eslint-disable-next-line no-empty\n    } catch (e) {}\n  }\n} //#endregion\n\nexport { BrowserRouter, Form, HashRouter, Link, NavLink, ScrollRestoration, useScrollRestoration as UNSAFE_useScrollRestoration, createBrowserRouter, createHashRouter, createSearchParams, HistoryRouter as unstable_HistoryRouter, usePrompt as unstable_usePrompt, useBeforeUnload, useFetcher, useFetchers, useFormAction, useLinkClickHandler, useSearchParams, useSubmit };","map":{"version":3,"mappings":"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","names":["defaultMethod","defaultEncType","isHtmlElement","object","tagName","isButtonElement","toLowerCase","isFormElement","isInputElement","isModifiedEvent","event","metaKey","altKey","ctrlKey","shiftKey","target","button","init","URLSearchParams","Array","isArray","Object","keys","reduce","memo","key","value","concat","map","v","locationSearch","defaultSearchParams","searchParams","createSearchParams","has","getAll","forEach","append","getFormSubmissionInfo","defaultAction","options","method","action","encType","formData","submissionTrigger","getAttribute","FormData","name","type","form","Error","protocol","host","window","location","url","URL","routes","opts","createRouter","basename","history","createBrowserHistory","hydrationData","parseHydrationData","enhanceManualRouteObjects","initialize","createHashHistory","state","_window","__staticRouterHydrationData","errors","deserializeErrors","entries","serialized","val","__type","ErrorResponse","status","statusText","data","internal","error","message","stack","BrowserRouter","_ref","children","historyRef","React","useRef","current","v5Compat","setState","useState","useLayoutEffect","listen","Router","navigationType","navigator","HashRouter","_ref2","HistoryRouter","_ref3","process","displayName","isBrowser","document","createElement","Link","forwardRef","LinkWithRef","ref","onClick","relative","reloadDocument","replace","to","preventScrollReset","rest","absoluteHref","isExternal","test","currentUrl","href","targetUrl","startsWith","origin","pathname","search","hash","useHref","internalOnClick","useLinkClickHandler","handleClick","defaultPrevented","NavLink","NavLinkWithRef","ariaCurrentProp","caseSensitive","className","classNameProp","end","style","styleProp","path","useResolvedPath","useLocation","routerState","useContext","DataRouterStateContext","NavigationContext","toPathname","encodeLocation","locationPathname","nextLocationPathname","navigation","isActive","charAt","length","isPending","ariaCurrent","undefined","filter","Boolean","join","Form","props","FormImpl","forwardedRef","onSubmit","fetcherKey","routeId","submit","useSubmitImpl","formMethod","formAction","useFormAction","submitHandler","preventDefault","submitter","nativeEvent","submitMethod","currentTarget","ScrollRestoration","_ref7","getKey","storageKey","useScrollRestoration","DataRouterHook","DataRouterStateHook","getDataRouterConsoleError","hookName","useDataRouterContext","ctx","DataRouterContext","useDataRouterState","_temp","replaceProp","navigate","useNavigate","useCallback","shouldProcessLinkClick","createPath","useSearchParams","defaultInit","defaultSearchParamsRef","hasSetSearchParamsRef","useMemo","getSearchParamsForLocation","setSearchParams","nextInit","navigateOptions","newSearchParams","useSubmit","router","UseSubmitImpl","formEncType","fetch","_temp2","routeContext","RouteContext","match","matches","slice","route","index","params","delete","toString","joinPaths","createFetcherForm","FetcherForm","fetcherId","useFetcher","UseFetcher","_route$matches","id","String","load","fetcher","getFetcher","fetcherWithComponents","useEffect","console","warn","deleteFetcher","useFetchers","UseFetchers","fetchers","values","SCROLL_RESTORATION_STORAGE_KEY","savedScrollPositions","_temp3","UseScrollRestoration","restoreScrollPosition","useMatches","useNavigation","scrollRestoration","usePageHide","scrollY","sessionStorage","setItem","JSON","stringify","sessionPositions","getItem","parse","e","disableScrollRestoration","enableScrollRestoration","scrollTo","el","getElementById","scrollIntoView","callback","capture","addEventListener","removeEventListener","usePrompt","_ref8","when","blocker","useBlocker","reset","proceed","confirm","setTimeout","warning","cond"],"sources":["C:\\Users\\user\\Desktop\\00monsite\\front\\node_modules\\react-router-dom\\dom.ts","C:\\Users\\user\\Desktop\\00monsite\\front\\node_modules\\react-router-dom\\index.tsx"],"sourcesContent":["import type { FormEncType, FormMethod } from \"@remix-run/router\";\nimport type { RelativeRoutingType } from \"react-router\";\n\nexport const defaultMethod = \"get\";\nconst defaultEncType = \"application/x-www-form-urlencoded\";\n\nexport function isHtmlElement(object: any): object is HTMLElement {\n  return object != null && typeof object.tagName === \"string\";\n}\n\nexport function isButtonElement(object: any): object is HTMLButtonElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\n\nexport function isFormElement(object: any): object is HTMLFormElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\n\nexport function isInputElement(object: any): object is HTMLInputElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\n\ntype LimitedMouseEvent = Pick<\n  MouseEvent,\n  \"button\" | \"metaKey\" | \"altKey\" | \"ctrlKey\" | \"shiftKey\"\n>;\n\nfunction isModifiedEvent(event: LimitedMouseEvent) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nexport function shouldProcessLinkClick(\n  event: LimitedMouseEvent,\n  target?: string\n) {\n  return (\n    event.button === 0 && // Ignore everything but left clicks\n    (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n    !isModifiedEvent(event) // Ignore clicks with modifier keys\n  );\n}\n\nexport type ParamKeyValuePair = [string, string];\n\nexport type URLSearchParamsInit =\n  | string\n  | ParamKeyValuePair[]\n  | Record<string, string | string[]>\n  | URLSearchParams;\n\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n *   let searchParams = new URLSearchParams([\n *     ['sort', 'name'],\n *     ['sort', 'price']\n *   ]);\n *\n * you can do:\n *\n *   let searchParams = createSearchParams({\n *     sort: ['name', 'price']\n *   });\n */\nexport function createSearchParams(\n  init: URLSearchParamsInit = \"\"\n): URLSearchParams {\n  return new URLSearchParams(\n    typeof init === \"string\" ||\n    Array.isArray(init) ||\n    init instanceof URLSearchParams\n      ? init\n      : Object.keys(init).reduce((memo, key) => {\n          let value = init[key];\n          return memo.concat(\n            Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]\n          );\n        }, [] as ParamKeyValuePair[])\n  );\n}\n\nexport function getSearchParamsForLocation(\n  locationSearch: string,\n  defaultSearchParams: URLSearchParams | null\n) {\n  let searchParams = createSearchParams(locationSearch);\n\n  if (defaultSearchParams) {\n    for (let key of defaultSearchParams.keys()) {\n      if (!searchParams.has(key)) {\n        defaultSearchParams.getAll(key).forEach((value) => {\n          searchParams.append(key, value);\n        });\n      }\n    }\n  }\n\n  return searchParams;\n}\n\nexport interface SubmitOptions {\n  /**\n   * The HTTP method used to submit the form. Overrides `<form method>`.\n   * Defaults to \"GET\".\n   */\n  method?: FormMethod;\n\n  /**\n   * The action URL path used to submit the form. Overrides `<form action>`.\n   * Defaults to the path of the current route.\n   *\n   * Note: It is assumed the path is already resolved. If you need to resolve a\n   * relative path, use `useFormAction`.\n   */\n  action?: string;\n\n  /**\n   * The action URL used to submit the form. Overrides `<form encType>`.\n   * Defaults to \"application/x-www-form-urlencoded\".\n   */\n  encType?: FormEncType;\n\n  /**\n   * Set `true` to replace the current entry in the browser's history stack\n   * instead of creating a new one (i.e. stay on \"the same page\"). Defaults\n   * to `false`.\n   */\n  replace?: boolean;\n\n  /**\n   * Determines whether the form action is relative to the route hierarchy or\n   * the pathname.  Use this if you want to opt out of navigating the route\n   * hierarchy and want to instead route based on /-delimited URL segments\n   */\n  relative?: RelativeRoutingType;\n\n  /**\n   * In browser-based environments, prevent resetting scroll after this\n   * navigation when using the <ScrollRestoration> component\n   */\n  preventScrollReset?: boolean;\n}\n\nexport function getFormSubmissionInfo(\n  target:\n    | HTMLFormElement\n    | HTMLButtonElement\n    | HTMLInputElement\n    | FormData\n    | URLSearchParams\n    | { [name: string]: string }\n    | null,\n  defaultAction: string,\n  options: SubmitOptions\n): {\n  url: URL;\n  method: string;\n  encType: string;\n  formData: FormData;\n} {\n  let method: string;\n  let action: string;\n  let encType: string;\n  let formData: FormData;\n\n  if (isFormElement(target)) {\n    let submissionTrigger: HTMLButtonElement | HTMLInputElement = (\n      options as any\n    ).submissionTrigger;\n\n    method = options.method || target.getAttribute(\"method\") || defaultMethod;\n    action = options.action || target.getAttribute(\"action\") || defaultAction;\n    encType =\n      options.encType || target.getAttribute(\"enctype\") || defaultEncType;\n\n    formData = new FormData(target);\n\n    if (submissionTrigger && submissionTrigger.name) {\n      formData.append(submissionTrigger.name, submissionTrigger.value);\n    }\n  } else if (\n    isButtonElement(target) ||\n    (isInputElement(target) &&\n      (target.type === \"submit\" || target.type === \"image\"))\n  ) {\n    let form = target.form;\n\n    if (form == null) {\n      throw new Error(\n        `Cannot submit a <button> or <input type=\"submit\"> without a <form>`\n      );\n    }\n\n    // <button>/<input type=\"submit\"> may override attributes of <form>\n\n    method =\n      options.method ||\n      target.getAttribute(\"formmethod\") ||\n      form.getAttribute(\"method\") ||\n      defaultMethod;\n    action =\n      options.action ||\n      target.getAttribute(\"formaction\") ||\n      form.getAttribute(\"action\") ||\n      defaultAction;\n    encType =\n      options.encType ||\n      target.getAttribute(\"formenctype\") ||\n      form.getAttribute(\"enctype\") ||\n      defaultEncType;\n\n    formData = new FormData(form);\n\n    // Include name + value from a <button>, appending in case the button name\n    // matches an existing input name\n    if (target.name) {\n      formData.append(target.name, target.value);\n    }\n  } else if (isHtmlElement(target)) {\n    throw new Error(\n      `Cannot submit element that is not <form>, <button>, or ` +\n        `<input type=\"submit|image\">`\n    );\n  } else {\n    method = options.method || defaultMethod;\n    action = options.action || defaultAction;\n    encType = options.encType || defaultEncType;\n\n    if (target instanceof FormData) {\n      formData = target;\n    } else {\n      formData = new FormData();\n\n      if (target instanceof URLSearchParams) {\n        for (let [name, value] of target) {\n          formData.append(name, value);\n        }\n      } else if (target != null) {\n        for (let name of Object.keys(target)) {\n          formData.append(name, target[name]);\n        }\n      }\n    }\n  }\n\n  let { protocol, host } = window.location;\n  let url = new URL(action, `${protocol}//${host}`);\n\n  return { url, method: method.toLowerCase(), encType, formData };\n}\n","/**\n * NOTE: If you refactor this to split up the modules into separate files,\n * you'll need to update the rollup config for react-router-dom-v5-compat.\n */\nimport * as React from \"react\";\nimport type {\n  NavigateOptions,\n  RelativeRoutingType,\n  RouteObject,\n  To,\n} from \"react-router\";\nimport {\n  Router,\n  createPath,\n  useHref,\n  useLocation,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useResolvedPath,\n  unstable_useBlocker as useBlocker,\n  UNSAFE_DataRouterContext as DataRouterContext,\n  UNSAFE_DataRouterStateContext as DataRouterStateContext,\n  UNSAFE_NavigationContext as NavigationContext,\n  UNSAFE_RouteContext as RouteContext,\n  UNSAFE_enhanceManualRouteObjects as enhanceManualRouteObjects,\n} from \"react-router\";\nimport type {\n  BrowserHistory,\n  Fetcher,\n  FormEncType,\n  FormMethod,\n  GetScrollRestorationKeyFunction,\n  HashHistory,\n  History,\n  HydrationState,\n  Router as RemixRouter,\n} from \"@remix-run/router\";\nimport {\n  createRouter,\n  createBrowserHistory,\n  createHashHistory,\n  invariant,\n  joinPaths,\n  ErrorResponse,\n} from \"@remix-run/router\";\n\nimport type {\n  SubmitOptions,\n  ParamKeyValuePair,\n  URLSearchParamsInit,\n} from \"./dom\";\nimport {\n  createSearchParams,\n  defaultMethod,\n  getFormSubmissionInfo,\n  getSearchParamsForLocation,\n  shouldProcessLinkClick,\n} from \"./dom\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Re-exports\n////////////////////////////////////////////////////////////////////////////////\n\nexport type {\n  FormEncType,\n  FormMethod,\n  GetScrollRestorationKeyFunction,\n  ParamKeyValuePair,\n  SubmitOptions,\n  URLSearchParamsInit,\n};\nexport { createSearchParams };\n\n// Note: Keep in sync with react-router exports!\nexport type {\n  ActionFunction,\n  ActionFunctionArgs,\n  AwaitProps,\n  unstable_Blocker,\n  unstable_BlockerFunction,\n  DataRouteMatch,\n  DataRouteObject,\n  Fetcher,\n  Hash,\n  IndexRouteObject,\n  IndexRouteProps,\n  JsonFunction,\n  LayoutRouteProps,\n  LoaderFunction,\n  LoaderFunctionArgs,\n  Location,\n  MemoryRouterProps,\n  NavigateFunction,\n  NavigateOptions,\n  NavigateProps,\n  Navigation,\n  Navigator,\n  NonIndexRouteObject,\n  OutletProps,\n  Params,\n  ParamParseKey,\n  Path,\n  PathMatch,\n  Pathname,\n  PathPattern,\n  PathRouteProps,\n  RedirectFunction,\n  RelativeRoutingType,\n  RouteMatch,\n  RouteObject,\n  RouteProps,\n  RouterProps,\n  RouterProviderProps,\n  RoutesProps,\n  Search,\n  ShouldRevalidateFunction,\n  To,\n} from \"react-router\";\nexport {\n  AbortedDeferredError,\n  Await,\n  MemoryRouter,\n  Navigate,\n  NavigationType,\n  Outlet,\n  Route,\n  Router,\n  RouterProvider,\n  Routes,\n  createMemoryRouter,\n  createPath,\n  createRoutesFromChildren,\n  createRoutesFromElements,\n  defer,\n  isRouteErrorResponse,\n  generatePath,\n  json,\n  matchPath,\n  matchRoutes,\n  parsePath,\n  redirect,\n  renderMatches,\n  resolvePath,\n  useActionData,\n  useAsyncError,\n  useAsyncValue,\n  unstable_useBlocker,\n  useHref,\n  useInRouterContext,\n  useLoaderData,\n  useLocation,\n  useMatch,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useNavigationType,\n  useOutlet,\n  useOutletContext,\n  useParams,\n  useResolvedPath,\n  useRevalidator,\n  useRouteError,\n  useRouteLoaderData,\n  useRoutes,\n} from \"react-router\";\n\n///////////////////////////////////////////////////////////////////////////////\n// DANGER! PLEASE READ ME!\n// We provide these exports as an escape hatch in the event that you need any\n// routing data that we don't provide an explicit API for. With that said, we\n// want to cover your use case if we can, so if you feel the need to use these\n// we want to hear from you. Let us know what you're building and we'll do our\n// best to make sure we can support you!\n//\n// We consider these exports an implementation detail and do not guarantee\n// against any breaking changes, regardless of the semver release. Use with\n// extreme caution and only if you understand the consequences. Godspeed.\n///////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport {\n  UNSAFE_DataRouterContext,\n  UNSAFE_DataRouterStateContext,\n  UNSAFE_NavigationContext,\n  UNSAFE_LocationContext,\n  UNSAFE_RouteContext,\n  UNSAFE_enhanceManualRouteObjects,\n} from \"react-router\";\n//#endregion\n\ndeclare global {\n  var __staticRouterHydrationData: HydrationState | undefined;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Routers\n////////////////////////////////////////////////////////////////////////////////\n\nexport function createBrowserRouter(\n  routes: RouteObject[],\n  opts?: {\n    basename?: string;\n    hydrationData?: HydrationState;\n    window?: Window;\n  }\n): RemixRouter {\n  return createRouter({\n    basename: opts?.basename,\n    history: createBrowserHistory({ window: opts?.window }),\n    hydrationData: opts?.hydrationData || parseHydrationData(),\n    routes: enhanceManualRouteObjects(routes),\n  }).initialize();\n}\n\nexport function createHashRouter(\n  routes: RouteObject[],\n  opts?: {\n    basename?: string;\n    hydrationData?: HydrationState;\n    window?: Window;\n  }\n): RemixRouter {\n  return createRouter({\n    basename: opts?.basename,\n    history: createHashHistory({ window: opts?.window }),\n    hydrationData: opts?.hydrationData || parseHydrationData(),\n    routes: enhanceManualRouteObjects(routes),\n  }).initialize();\n}\n\nfunction parseHydrationData(): HydrationState | undefined {\n  let state = window?.__staticRouterHydrationData;\n  if (state && state.errors) {\n    state = {\n      ...state,\n      errors: deserializeErrors(state.errors),\n    };\n  }\n  return state;\n}\n\nfunction deserializeErrors(\n  errors: RemixRouter[\"state\"][\"errors\"]\n): RemixRouter[\"state\"][\"errors\"] {\n  if (!errors) return null;\n  let entries = Object.entries(errors);\n  let serialized: RemixRouter[\"state\"][\"errors\"] = {};\n  for (let [key, val] of entries) {\n    // Hey you!  If you change this, please change the corresponding logic in\n    // serializeErrors in react-router-dom/server.tsx :)\n    if (val && val.__type === \"RouteErrorResponse\") {\n      serialized[key] = new ErrorResponse(\n        val.status,\n        val.statusText,\n        val.data,\n        val.internal === true\n      );\n    } else if (val && val.__type === \"Error\") {\n      let error = new Error(val.message);\n      // Wipe away the client-side stack trace.  Nothing to fill it in with\n      // because we don't serialize SSR stack traces for security reasons\n      error.stack = \"\";\n      serialized[key] = error;\n    } else {\n      serialized[key] = val;\n    }\n  }\n  return serialized;\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Components\n////////////////////////////////////////////////////////////////////////////////\n\nexport interface BrowserRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\nexport function BrowserRouter({\n  basename,\n  children,\n  window,\n}: BrowserRouterProps) {\n  let historyRef = React.useRef<BrowserHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createBrowserHistory({ window, v5Compat: true });\n  }\n\n  let history = historyRef.current;\n  let [state, setState] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n\n  React.useLayoutEffect(() => history.listen(setState), [history]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n    />\n  );\n}\n\nexport interface HashRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\nexport function HashRouter({ basename, children, window }: HashRouterProps) {\n  let historyRef = React.useRef<HashHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createHashHistory({ window, v5Compat: true });\n  }\n\n  let history = historyRef.current;\n  let [state, setState] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n\n  React.useLayoutEffect(() => history.listen(setState), [history]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n    />\n  );\n}\n\nexport interface HistoryRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  history: History;\n}\n\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\nfunction HistoryRouter({ basename, children, history }: HistoryRouterProps) {\n  const [state, setState] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n\n  React.useLayoutEffect(() => history.listen(setState), [history]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n    />\n  );\n}\n\nif (__DEV__) {\n  HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\n\nexport { HistoryRouter as unstable_HistoryRouter };\n\nexport interface LinkProps\n  extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> {\n  reloadDocument?: boolean;\n  replace?: boolean;\n  state?: any;\n  preventScrollReset?: boolean;\n  relative?: RelativeRoutingType;\n  to: To;\n}\n\nconst isBrowser =\n  typeof window !== \"undefined\" &&\n  typeof window.document !== \"undefined\" &&\n  typeof window.document.createElement !== \"undefined\";\n\n/**\n * The public API for rendering a history-aware <a>.\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n  function LinkWithRef(\n    {\n      onClick,\n      relative,\n      reloadDocument,\n      replace,\n      state,\n      target,\n      to,\n      preventScrollReset,\n      ...rest\n    },\n    ref\n  ) {\n    // Rendered into <a href> for absolute URLs\n    let absoluteHref;\n    let isExternal = false;\n\n    if (\n      isBrowser &&\n      typeof to === \"string\" &&\n      /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i.test(to)\n    ) {\n      absoluteHref = to;\n      let currentUrl = new URL(window.location.href);\n      let targetUrl = to.startsWith(\"//\")\n        ? new URL(currentUrl.protocol + to)\n        : new URL(to);\n      if (targetUrl.origin === currentUrl.origin) {\n        // Strip the protocol/origin for same-origin absolute URLs\n        to = targetUrl.pathname + targetUrl.search + targetUrl.hash;\n      } else {\n        isExternal = true;\n      }\n    }\n\n    // Rendered into <a href> for relative URLs\n    let href = useHref(to, { relative });\n\n    let internalOnClick = useLinkClickHandler(to, {\n      replace,\n      state,\n      target,\n      preventScrollReset,\n      relative,\n    });\n    function handleClick(\n      event: React.MouseEvent<HTMLAnchorElement, MouseEvent>\n    ) {\n      if (onClick) onClick(event);\n      if (!event.defaultPrevented) {\n        internalOnClick(event);\n      }\n    }\n\n    return (\n      // eslint-disable-next-line jsx-a11y/anchor-has-content\n      <a\n        {...rest}\n        href={absoluteHref || href}\n        onClick={isExternal || reloadDocument ? onClick : handleClick}\n        ref={ref}\n        target={target}\n      />\n    );\n  }\n);\n\nif (__DEV__) {\n  Link.displayName = \"Link\";\n}\n\nexport interface NavLinkProps\n  extends Omit<LinkProps, \"className\" | \"style\" | \"children\"> {\n  children?:\n    | React.ReactNode\n    | ((props: { isActive: boolean; isPending: boolean }) => React.ReactNode);\n  caseSensitive?: boolean;\n  className?:\n    | string\n    | ((props: {\n        isActive: boolean;\n        isPending: boolean;\n      }) => string | undefined);\n  end?: boolean;\n  style?:\n    | React.CSSProperties\n    | ((props: {\n        isActive: boolean;\n        isPending: boolean;\n      }) => React.CSSProperties | undefined);\n}\n\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\nexport const NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n  function NavLinkWithRef(\n    {\n      \"aria-current\": ariaCurrentProp = \"page\",\n      caseSensitive = false,\n      className: classNameProp = \"\",\n      end = false,\n      style: styleProp,\n      to,\n      children,\n      ...rest\n    },\n    ref\n  ) {\n    let path = useResolvedPath(to, { relative: rest.relative });\n    let location = useLocation();\n    let routerState = React.useContext(DataRouterStateContext);\n    let { navigator } = React.useContext(NavigationContext);\n\n    let toPathname = navigator.encodeLocation\n      ? navigator.encodeLocation(path).pathname\n      : path.pathname;\n    let locationPathname = location.pathname;\n    let nextLocationPathname =\n      routerState && routerState.navigation && routerState.navigation.location\n        ? routerState.navigation.location.pathname\n        : null;\n\n    if (!caseSensitive) {\n      locationPathname = locationPathname.toLowerCase();\n      nextLocationPathname = nextLocationPathname\n        ? nextLocationPathname.toLowerCase()\n        : null;\n      toPathname = toPathname.toLowerCase();\n    }\n\n    let isActive =\n      locationPathname === toPathname ||\n      (!end &&\n        locationPathname.startsWith(toPathname) &&\n        locationPathname.charAt(toPathname.length) === \"/\");\n\n    let isPending =\n      nextLocationPathname != null &&\n      (nextLocationPathname === toPathname ||\n        (!end &&\n          nextLocationPathname.startsWith(toPathname) &&\n          nextLocationPathname.charAt(toPathname.length) === \"/\"));\n\n    let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n\n    let className: string | undefined;\n    if (typeof classNameProp === \"function\") {\n      className = classNameProp({ isActive, isPending });\n    } else {\n      // If the className prop is not a function, we use a default `active`\n      // class for <NavLink />s that are active. In v5 `active` was the default\n      // value for `activeClassName`, but we are removing that API and can still\n      // use the old default behavior for a cleaner upgrade path and keep the\n      // simple styling rules working as they currently do.\n      className = [\n        classNameProp,\n        isActive ? \"active\" : null,\n        isPending ? \"pending\" : null,\n      ]\n        .filter(Boolean)\n        .join(\" \");\n    }\n\n    let style =\n      typeof styleProp === \"function\"\n        ? styleProp({ isActive, isPending })\n        : styleProp;\n\n    return (\n      <Link\n        {...rest}\n        aria-current={ariaCurrent}\n        className={className}\n        ref={ref}\n        style={style}\n        to={to}\n      >\n        {typeof children === \"function\"\n          ? children({ isActive, isPending })\n          : children}\n      </Link>\n    );\n  }\n);\n\nif (__DEV__) {\n  NavLink.displayName = \"NavLink\";\n}\n\nexport interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {\n  /**\n   * The HTTP verb to use when the form is submit. Supports \"get\", \"post\",\n   * \"put\", \"delete\", \"patch\".\n   */\n  method?: FormMethod;\n\n  /**\n   * Normal `<form action>` but supports React Router's relative paths.\n   */\n  action?: string;\n\n  /**\n   * Forces a full document navigation instead of a fetch.\n   */\n  reloadDocument?: boolean;\n\n  /**\n   * Replaces the current entry in the browser history stack when the form\n   * navigates. Use this if you don't want the user to be able to click \"back\"\n   * to the page with the form on it.\n   */\n  replace?: boolean;\n\n  /**\n   * Determines whether the form action is relative to the route hierarchy or\n   * the pathname.  Use this if you want to opt out of navigating the route\n   * hierarchy and want to instead route based on /-delimited URL segments\n   */\n  relative?: RelativeRoutingType;\n\n  /**\n   * Prevent the scroll position from resetting to the top of the viewport on\n   * completion of the navigation when using the <ScrollRestoration> component\n   */\n  preventScrollReset?: boolean;\n\n  /**\n   * A function to call when the form is submitted. If you call\n   * `event.preventDefault()` then this form will not do anything.\n   */\n  onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\nexport const Form = React.forwardRef<HTMLFormElement, FormProps>(\n  (props, ref) => {\n    return <FormImpl {...props} ref={ref} />;\n  }\n);\n\nif (__DEV__) {\n  Form.displayName = \"Form\";\n}\n\ntype HTMLSubmitEvent = React.BaseSyntheticEvent<\n  SubmitEvent,\n  Event,\n  HTMLFormElement\n>;\n\ntype HTMLFormSubmitter = HTMLButtonElement | HTMLInputElement;\n\ninterface FormImplProps extends FormProps {\n  fetcherKey?: string;\n  routeId?: string;\n}\n\nconst FormImpl = React.forwardRef<HTMLFormElement, FormImplProps>(\n  (\n    {\n      reloadDocument,\n      replace,\n      method = defaultMethod,\n      action,\n      onSubmit,\n      fetcherKey,\n      routeId,\n      relative,\n      preventScrollReset,\n      ...props\n    },\n    forwardedRef\n  ) => {\n    let submit = useSubmitImpl(fetcherKey, routeId);\n    let formMethod: FormMethod =\n      method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n    let formAction = useFormAction(action, { relative });\n    let submitHandler: React.FormEventHandler<HTMLFormElement> = (event) => {\n      onSubmit && onSubmit(event);\n      if (event.defaultPrevented) return;\n      event.preventDefault();\n\n      let submitter = (event as unknown as HTMLSubmitEvent).nativeEvent\n        .submitter as HTMLFormSubmitter | null;\n\n      let submitMethod =\n        (submitter?.getAttribute(\"formmethod\") as FormMethod | undefined) ||\n        method;\n\n      submit(submitter || event.currentTarget, {\n        method: submitMethod,\n        replace,\n        relative,\n        preventScrollReset,\n      });\n    };\n\n    return (\n      <form\n        ref={forwardedRef}\n        method={formMethod}\n        action={formAction}\n        onSubmit={reloadDocument ? onSubmit : submitHandler}\n        {...props}\n      />\n    );\n  }\n);\n\nif (__DEV__) {\n  FormImpl.displayName = \"FormImpl\";\n}\n\nexport interface ScrollRestorationProps {\n  getKey?: GetScrollRestorationKeyFunction;\n  storageKey?: string;\n}\n\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */\nexport function ScrollRestoration({\n  getKey,\n  storageKey,\n}: ScrollRestorationProps) {\n  useScrollRestoration({ getKey, storageKey });\n  return null;\n}\n\nif (__DEV__) {\n  ScrollRestoration.displayName = \"ScrollRestoration\";\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\n\nenum DataRouterHook {\n  UseScrollRestoration = \"useScrollRestoration\",\n  UseSubmitImpl = \"useSubmitImpl\",\n  UseFetcher = \"useFetcher\",\n}\n\nenum DataRouterStateHook {\n  UseFetchers = \"useFetchers\",\n  UseScrollRestoration = \"useScrollRestoration\",\n}\n\nfunction getDataRouterConsoleError(\n  hookName: DataRouterHook | DataRouterStateHook\n) {\n  return `${hookName} must be used within a data router.  See https://reactrouter.com/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n  let ctx = React.useContext(DataRouterContext);\n  invariant(ctx, getDataRouterConsoleError(hookName));\n  return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n  let state = React.useContext(DataRouterStateContext);\n  invariant(state, getDataRouterConsoleError(hookName));\n  return state;\n}\n\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\nexport function useLinkClickHandler<E extends Element = HTMLAnchorElement>(\n  to: To,\n  {\n    target,\n    replace: replaceProp,\n    state,\n    preventScrollReset,\n    relative,\n  }: {\n    target?: React.HTMLAttributeAnchorTarget;\n    replace?: boolean;\n    state?: any;\n    preventScrollReset?: boolean;\n    relative?: RelativeRoutingType;\n  } = {}\n): (event: React.MouseEvent<E, MouseEvent>) => void {\n  let navigate = useNavigate();\n  let location = useLocation();\n  let path = useResolvedPath(to, { relative });\n\n  return React.useCallback(\n    (event: React.MouseEvent<E, MouseEvent>) => {\n      if (shouldProcessLinkClick(event, target)) {\n        event.preventDefault();\n\n        // If the URL hasn't changed, a regular <a> will do a replace instead of\n        // a push, so do the same here unless the replace prop is explicitly set\n        let replace =\n          replaceProp !== undefined\n            ? replaceProp\n            : createPath(location) === createPath(path);\n\n        navigate(to, { replace, state, preventScrollReset, relative });\n      }\n    },\n    [\n      location,\n      navigate,\n      path,\n      replaceProp,\n      state,\n      target,\n      to,\n      preventScrollReset,\n      relative,\n    ]\n  );\n}\n\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\nexport function useSearchParams(\n  defaultInit?: URLSearchParamsInit\n): [URLSearchParams, SetURLSearchParams] {\n  warning(\n    typeof URLSearchParams !== \"undefined\",\n    `You cannot use the \\`useSearchParams\\` hook in a browser that does not ` +\n      `support the URLSearchParams API. If you need to support Internet ` +\n      `Explorer 11, we recommend you load a polyfill such as ` +\n      `https://github.com/ungap/url-search-params\\n\\n` +\n      `If you're unsure how to load polyfills, we recommend you check out ` +\n      `https://polyfill.io/v3/ which provides some recommendations about how ` +\n      `to load polyfills only for users that need them, instead of for every ` +\n      `user.`\n  );\n\n  let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n  let hasSetSearchParamsRef = React.useRef(false);\n\n  let location = useLocation();\n  let searchParams = React.useMemo(\n    () =>\n      // Only merge in the defaults if we haven't yet called setSearchParams.\n      // Once we call that we want those to take precedence, otherwise you can't\n      // remove a param with setSearchParams({}) if it has an initial value\n      getSearchParamsForLocation(\n        location.search,\n        hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current\n      ),\n    [location.search]\n  );\n\n  let navigate = useNavigate();\n  let setSearchParams = React.useCallback<SetURLSearchParams>(\n    (nextInit, navigateOptions) => {\n      const newSearchParams = createSearchParams(\n        typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit\n      );\n      hasSetSearchParamsRef.current = true;\n      navigate(\"?\" + newSearchParams, navigateOptions);\n    },\n    [navigate, searchParams]\n  );\n\n  return [searchParams, setSearchParams];\n}\n\ntype SetURLSearchParams = (\n  nextInit?:\n    | URLSearchParamsInit\n    | ((prev: URLSearchParams) => URLSearchParamsInit),\n  navigateOpts?: NavigateOptions\n) => void;\n\ntype SubmitTarget =\n  | HTMLFormElement\n  | HTMLButtonElement\n  | HTMLInputElement\n  | FormData\n  | URLSearchParams\n  | { [name: string]: string }\n  | null;\n\n/**\n * Submits a HTML `<form>` to the server without reloading the page.\n */\nexport interface SubmitFunction {\n  (\n    /**\n     * Specifies the `<form>` to be submitted to the server, a specific\n     * `<button>` or `<input type=\"submit\">` to use to submit the form, or some\n     * arbitrary data to submit.\n     *\n     * Note: When using a `<button>` its `name` and `value` will also be\n     * included in the form data that is submitted.\n     */\n    target: SubmitTarget,\n\n    /**\n     * Options that override the `<form>`'s own attributes. Required when\n     * submitting arbitrary data without a backing `<form>`.\n     */\n    options?: SubmitOptions\n  ): void;\n}\n\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\nexport function useSubmit(): SubmitFunction {\n  return useSubmitImpl();\n}\n\nfunction useSubmitImpl(fetcherKey?: string, routeId?: string): SubmitFunction {\n  let { router } = useDataRouterContext(DataRouterHook.UseSubmitImpl);\n  let defaultAction = useFormAction();\n\n  return React.useCallback(\n    (target, options = {}) => {\n      if (typeof document === \"undefined\") {\n        throw new Error(\n          \"You are calling submit during the server render. \" +\n            \"Try calling submit within a `useEffect` or callback instead.\"\n        );\n      }\n\n      let { method, encType, formData, url } = getFormSubmissionInfo(\n        target,\n        defaultAction,\n        options\n      );\n\n      let href = url.pathname + url.search;\n      let opts = {\n        replace: options.replace,\n        preventScrollReset: options.preventScrollReset,\n        formData,\n        formMethod: method as FormMethod,\n        formEncType: encType as FormEncType,\n      };\n      if (fetcherKey) {\n        invariant(routeId != null, \"No routeId available for useFetcher()\");\n        router.fetch(fetcherKey, routeId, href, opts);\n      } else {\n        router.navigate(href, opts);\n      }\n    },\n    [defaultAction, router, fetcherKey, routeId]\n  );\n}\n\nexport function useFormAction(\n  action?: string,\n  { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n  let { basename } = React.useContext(NavigationContext);\n  let routeContext = React.useContext(RouteContext);\n  invariant(routeContext, \"useFormAction must be used inside a RouteContext\");\n\n  let [match] = routeContext.matches.slice(-1);\n  // Shallow clone path so we can modify it below, otherwise we modify the\n  // object referenced by useMemo inside useResolvedPath\n  let path = { ...useResolvedPath(action ? action : \".\", { relative }) };\n\n  // Previously we set the default action to \".\". The problem with this is that\n  // `useResolvedPath(\".\")` excludes search params and the hash of the resolved\n  // URL. This is the intended behavior of when \".\" is specifically provided as\n  // the form action, but inconsistent w/ browsers when the action is omitted.\n  // https://github.com/remix-run/remix/issues/927\n  let location = useLocation();\n  if (action == null) {\n    // Safe to write to these directly here since if action was undefined, we\n    // would have called useResolvedPath(\".\") which will never include a search\n    // or hash\n    path.search = location.search;\n    path.hash = location.hash;\n\n    // When grabbing search params from the URL, remove the automatically\n    // inserted ?index param so we match the useResolvedPath search behavior\n    // which would not include ?index\n    if (match.route.index) {\n      let params = new URLSearchParams(path.search);\n      params.delete(\"index\");\n      path.search = params.toString() ? `?${params.toString()}` : \"\";\n    }\n  }\n\n  if ((!action || action === \".\") && match.route.index) {\n    path.search = path.search\n      ? path.search.replace(/^\\?/, \"?index&\")\n      : \"?index\";\n  }\n\n  // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the form action.  If this is a root navigation, then just use\n  // the raw basename which allows the basename to have full control over the\n  // presence of a trailing slash on root actions\n  if (basename !== \"/\") {\n    path.pathname =\n      path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n\n  return createPath(path);\n}\n\nfunction createFetcherForm(fetcherKey: string, routeId: string) {\n  let FetcherForm = React.forwardRef<HTMLFormElement, FormProps>(\n    (props, ref) => {\n      return (\n        <FormImpl\n          {...props}\n          ref={ref}\n          fetcherKey={fetcherKey}\n          routeId={routeId}\n        />\n      );\n    }\n  );\n  if (__DEV__) {\n    FetcherForm.displayName = \"fetcher.Form\";\n  }\n  return FetcherForm;\n}\n\nlet fetcherId = 0;\n\nexport type FetcherWithComponents<TData> = Fetcher<TData> & {\n  Form: ReturnType<typeof createFetcherForm>;\n  submit: (\n    target: SubmitTarget,\n    // Fetchers cannot replace/preventScrollReset because they are not\n    // navigation events\n    options?: Omit<SubmitOptions, \"replace\" | \"preventScrollReset\">\n  ) => void;\n  load: (href: string) => void;\n};\n\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\nexport function useFetcher<TData = any>(): FetcherWithComponents<TData> {\n  let { router } = useDataRouterContext(DataRouterHook.UseFetcher);\n\n  let route = React.useContext(RouteContext);\n  invariant(route, `useFetcher must be used inside a RouteContext`);\n\n  let routeId = route.matches[route.matches.length - 1]?.route.id;\n  invariant(\n    routeId != null,\n    `useFetcher can only be used on routes that contain a unique \"id\"`\n  );\n\n  let [fetcherKey] = React.useState(() => String(++fetcherId));\n  let [Form] = React.useState(() => {\n    invariant(routeId, `No routeId available for fetcher.Form()`);\n    return createFetcherForm(fetcherKey, routeId);\n  });\n  let [load] = React.useState(() => (href: string) => {\n    invariant(router, \"No router available for fetcher.load()\");\n    invariant(routeId, \"No routeId available for fetcher.load()\");\n    router.fetch(fetcherKey, routeId, href);\n  });\n  let submit = useSubmitImpl(fetcherKey, routeId);\n\n  let fetcher = router.getFetcher<TData>(fetcherKey);\n\n  let fetcherWithComponents = React.useMemo(\n    () => ({\n      Form,\n      submit,\n      load,\n      ...fetcher,\n    }),\n    [fetcher, Form, submit, load]\n  );\n\n  React.useEffect(() => {\n    // Is this busted when the React team gets real weird and calls effects\n    // twice on mount?  We really just need to garbage collect here when this\n    // fetcher is no longer around.\n    return () => {\n      if (!router) {\n        console.warn(`No fetcher available to clean up from useFetcher()`);\n        return;\n      }\n      router.deleteFetcher(fetcherKey);\n    };\n  }, [router, fetcherKey]);\n\n  return fetcherWithComponents;\n}\n\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\nexport function useFetchers(): Fetcher[] {\n  let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n  return [...state.fetchers.values()];\n}\n\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions: Record<string, number> = {};\n\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\nfunction useScrollRestoration({\n  getKey,\n  storageKey,\n}: {\n  getKey?: GetScrollRestorationKeyFunction;\n  storageKey?: string;\n} = {}) {\n  let { router } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n  let { restoreScrollPosition, preventScrollReset } = useDataRouterState(\n    DataRouterStateHook.UseScrollRestoration\n  );\n  let location = useLocation();\n  let matches = useMatches();\n  let navigation = useNavigation();\n\n  // Trigger manual scroll restoration while we're active\n  React.useEffect(() => {\n    window.history.scrollRestoration = \"manual\";\n    return () => {\n      window.history.scrollRestoration = \"auto\";\n    };\n  }, []);\n\n  // Save positions on pagehide\n  usePageHide(\n    React.useCallback(() => {\n      if (navigation.state === \"idle\") {\n        let key = (getKey ? getKey(location, matches) : null) || location.key;\n        savedScrollPositions[key] = window.scrollY;\n      }\n      sessionStorage.setItem(\n        storageKey || SCROLL_RESTORATION_STORAGE_KEY,\n        JSON.stringify(savedScrollPositions)\n      );\n      window.history.scrollRestoration = \"auto\";\n    }, [storageKey, getKey, navigation.state, location, matches])\n  );\n\n  // Read in any saved scroll locations\n  if (typeof document !== \"undefined\") {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      try {\n        let sessionPositions = sessionStorage.getItem(\n          storageKey || SCROLL_RESTORATION_STORAGE_KEY\n        );\n        if (sessionPositions) {\n          savedScrollPositions = JSON.parse(sessionPositions);\n        }\n      } catch (e) {\n        // no-op, use default empty object\n      }\n    }, [storageKey]);\n\n    // Enable scroll restoration in the router\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      let disableScrollRestoration = router?.enableScrollRestoration(\n        savedScrollPositions,\n        () => window.scrollY,\n        getKey\n      );\n      return () => disableScrollRestoration && disableScrollRestoration();\n    }, [router, getKey]);\n\n    // Restore scrolling when state.restoreScrollPosition changes\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      // Explicit false means don't do anything (used for submissions)\n      if (restoreScrollPosition === false) {\n        return;\n      }\n\n      // been here before, scroll to it\n      if (typeof restoreScrollPosition === \"number\") {\n        window.scrollTo(0, restoreScrollPosition);\n        return;\n      }\n\n      // try to scroll to the hash\n      if (location.hash) {\n        let el = document.getElementById(location.hash.slice(1));\n        if (el) {\n          el.scrollIntoView();\n          return;\n        }\n      }\n\n      // Don't reset if this navigation opted out\n      if (preventScrollReset === true) {\n        return;\n      }\n\n      // otherwise go to the top on new locations\n      window.scrollTo(0, 0);\n    }, [location, restoreScrollPosition, preventScrollReset]);\n  }\n}\n\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nexport function useBeforeUnload(\n  callback: (event: BeforeUnloadEvent) => any,\n  options?: { capture?: boolean }\n): void {\n  let { capture } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? { capture } : undefined;\n    window.addEventListener(\"beforeunload\", callback, opts);\n    return () => {\n      window.removeEventListener(\"beforeunload\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.  This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction usePageHide(\n  callback: (event: PageTransitionEvent) => any,\n  options?: { capture?: boolean }\n): void {\n  let { capture } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? { capture } : undefined;\n    window.addEventListener(\"pagehide\", callback, opts);\n    return () => {\n      window.removeEventListener(\"pagehide\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open.  Use at your own risk.\n */\nfunction usePrompt({ when, message }: { when: boolean; message: string }) {\n  let blocker = useBlocker(when);\n\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\" && !when) {\n      blocker.reset();\n    }\n  }, [blocker, when]);\n\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\") {\n      let proceed = window.confirm(message);\n      if (proceed) {\n        setTimeout(blocker.proceed, 0);\n      } else {\n        blocker.reset();\n      }\n    }\n  }, [blocker, message]);\n}\n\nexport { usePrompt as unstable_usePrompt };\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Utils\n////////////////////////////////////////////////////////////////////////////////\n\nfunction warning(cond: boolean, message: string): void {\n  if (!cond) {\n    // eslint-disable-next-line no-console\n    if (typeof console !== \"undefined\") console.warn(message);\n\n    try {\n      // Welcome to debugging React Router!\n      //\n      // This error is thrown as a convenience so you can more easily\n      // find the source for a warning that appears in the console by\n      // enabling \"pause on exceptions\" in your JavaScript debugger.\n      throw new Error(message);\n      // eslint-disable-next-line no-empty\n    } catch (e) {}\n  }\n}\n//#endregion\n\nexport { useScrollRestoration as UNSAFE_useScrollRestoration };\n"]},"metadata":{},"sourceType":"module","externalDependencies":[]}