yle:"italic"}},t),r?x.createElement("pre",{style:i},r):null,null)}const kD=x.createElement(SD,null);class PD extends x.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error!==void 0?t.error:r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error!==void 0?x.createElement(si.Provider,{value:this.props.routeContext},x.createElement(mO.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function ED(e){let{routeContext:t,match:r,children:n}=e,i=x.useContext(xf);return i&&i.static&&i.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=r.route.id),x.createElement(si.Provider,{value:t},n)}function OD(e,t,r,n){var i;if(t===void 0&&(t=[]),r===void 0&&(r=null),n===void 0&&(n=null),e==null){var a;if(!r)return null;if(r.errors)e=r.matches;else if((a=n)!=null&&a.v7_partialHydration&&t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let s=e,u=(i=r)==null?void 0:i.errors;if(u!=null){let h=s.findIndex(p=>p.route.id&&(u==null?void 0:u[p.route.id])!==void 0);h>=0||it(!1),s=s.slice(0,Math.min(s.length,h+1))}let c=!1,d=-1;if(r&&n&&n.v7_partialHydration)for(let h=0;h<s.length;h++){let p=s[h];if((p.route.HydrateFallback||p.route.hydrateFallbackElement)&&(d=h),p.route.id){let{loaderData:m,errors:g}=r,b=p.route.loader&&m[p.route.id]===void 0&&(!g||g[p.route.id]===void 0);if(p.route.lazy||b){c=!0,d>=0?s=s.slice(0,d+1):s=[s[0]];break}}}return s.reduceRight((h,p,m)=>{let g,b=!1,w=null,S=null;r&&(g=u&&p.route.id?u[p.route.id]:void 0,w=p.route.errorElement||kD,c&&(d<0&&m===0?(ID("route-fallback"),b=!0,S=null):d===m&&(b=!0,S=p.route.hydrateFallbackElement||null)));let k=t.concat(s.slice(0,m+1)),A=()=>{let P;return g?P=w:b?P=S:p.route.Component?P=x.createElement(p.route.Component,null):p.route.element?P=p.route.element:P=h,x.createElement(ED,{match:p,routeContext:{outlet:h,matches:k,isDataRoute:r!=null},children:P})};return r&&(p.route.ErrorBoundary||p.route.errorElement||m===0)?x.createElement(PD,{location:r.location,revalidation:r.revalidation,component:w,error:g,children:A(),routeContext:{outlet:null,matches:k,isDataRoute:!0}}):A()},null)}var yO=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(yO||{}),wO=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(wO||{});function AD(e){let t=x.useContext(xf);return t||it(!1),t}function CD(e){let t=x.useContext(vO);return t||it(!1),t}function jD(e){let t=x.useContext(si);return t||it(!1),t}function bO(e){let t=jD(),r=t.matches[t.matches.length-1];return r.route.id||it(!1),r.route.id}function TD(){var e;let t=x.useContext(mO),r=CD(),n=bO();return t!==void 0?t:(e=r.errors)==null?void 0:e[n]}function ND(){let{router:e}=AD(yO.UseNavigateStable),t=bO(wO.UseNavigateStable),r=x.useRef(!1);return gO(()=>{r.current=!0}),x.useCallback(function(i,a){a===void 0&&(a={}),r.current&&(typeof i=="number"?e.navigate(i):e.navigate(i,Ml({fromRouteId:t},a)))},[e,t])}const g1={};function ID(e,t,r){g1[e]||(g1[e]=!0)}function RD(e,t){e==null||e.v7_startTransition,e==null||e.v7_relativeSplatPath}function Py(e){let{to:t,replace:r,state:n,relative:i}=e;ds()||it(!1);let{future:a,static:s}=x.useContext(oi),{matches:u}=x.useContext(si),{pathname:c}=Ha(),d=ky(),h=Sy(t,_y(u,a.v7_relativeSplatPath),c,i==="path"),p=JSON.stringify(h);return x.useEffect(()=>d(JSON.parse(p),{replace:r,state:n,relative:i}),[d,p,i,r,n]),null}function xO(e){return bD(e.context)}function en(e){it(!1)}function DD(e){let{basename:t="/",children:r=null,location:n,navigationType:i=Wi.Pop,navigator:a,static:s=!1,future:u}=e;ds()&&it(!1);let c=t.replace(/^\/*/,"/"),d=x.useMemo(()=>({basename:c,navigator:a,static:s,future:Ml({v7_relativeSplatPath:!1},u)}),[c,u,a,s]);typeof n=="string"&&(n=qa(n));let{pathname:h="/",search:p="",hash:m="",state:g=null,key:b="default"}=n,w=x.useMemo(()=>{let S=Zo(h,c);return S==null?null:{location:{pathname:S,search:p,hash:m,state:g,key:b},navigationType:i}},[c,h,p,m,g,b,i]);return w==null?null:x.createElement(oi.Provider,{value:d},x.createElement(_f.Provider,{children:r,value:w}))}function MD(e){let{children:t,location:r}=e;return xD(sg(t),r)}new Promise(()=>{});function sg(e,t){t===void 0&&(t=[]);let r=[];return x.Children.forEach(e,(n,i)=>{if(!x.isValidElement(n))return;let a=[...t,i];if(n.type===x.Fragment){r.push.apply(r,sg(n.props.children,a));return}n.type!==en&&it(!1),!n.props.index||!n.props.children||it(!1);let s={id:n.props.id||a.join("-"),caseSensitive:n.props.caseSensitive,element:n.props.element,Component:n.props.Component,index:n.props.index,path:n.props.path,loader:n.props.loader,action:n.props.action,errorElement:n.props.errorElement,ErrorBoundary:n.props.ErrorBoundary,hasErrorBoundary:n.props.ErrorBoundary!=null||n.props.errorElement!=null,shouldRevalidate:n.props.shouldRevalidate,handle:n.props.handle,lazy:n.props.lazy};n.props.children&&(s.children=sg(n.props.children,a)),r.push(s)}),r}/**
 * React Router DOM v6.30.2
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */function vd(){return vd=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},vd.apply(this,arguments)}function _O(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,a;for(a=0;a<n.length;a++)i=n[a],!(t.indexOf(i)>=0)&&(r[i]=e[i]);return r}function $D(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function LD(e,t){return e.button===0&&(!t||t==="_self")&&!$D(e)}const zD=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],UD=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],BD="6";try{window.__reactRouterVersion=BD}catch{}const FD=x.createContext({isTransitioning:!1}),WD="startTransition",y1=uO[WD];function qD(e){let{basename:t,children:r,future:n,window:i}=e,a=x.useRef();a.current==null&&(a.current=HR({window:i,v5Compat:!0}));let s=a.current,[u,c]=x.useState({action:s.action,location:s.location}),{v7_startTransition:d}=n||{},h=x.useCallback(p=>{d&&y1?y1(()=>c(p)):c(p)},[c,d]);return x.useLayoutEffect(()=>s.listen(h),[s,h]),x.useEffect(()=>RD(n),[n]),x.createElement(DD,{basename:t,children:r,location:u.location,navigationType:u.action,navigator:s,future:n})}const HD=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",KD=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,SO=x.forwardRef(function(t,r){let{onClick:n,relative:i,reloadDocument:a,replace:s,state:u,target:c,to:d,preventScrollReset:h,viewTransition:p}=t,m=_O(t,zD),{basename:g}=x.useContext(oi),b,w=!1;if(typeof d=="string"&&KD.test(d)&&(b=d,HD))try{let P=new URL(window.location.href),C=d.startsWith("//")?new URL(P.protocol+d):new URL(d),N=Zo(C.pathname,g);C.origin===P.origin&&N!=null?d=N+C.search+C.hash:w=!0}catch{}let S=gD(d,{relative:i}),k=GD(d,{replace:s,state:u,target:c,preventScrollReset:h,relative:i,viewTransition:p});function A(P){n&&n(P),P.defaultPrevented||k(P)}return x.createElement("a",vd({},m,{href:b||S,onClick:w||a?n:A,ref:r,target:c}))}),w1=x.forwardRef(function(t,r){let{"aria-current":n="page",caseSensitive:i=!1,className:a="",end:s=!1,style:u,to:c,viewTransition:d,children:h}=t,p=_O(t,UD),m=Sf(c,{relative:p.relative}),g=Ha(),b=x.useContext(vO),{navigator:w,basename:S}=x.useContext(oi),k=b!=null&&YD(m)&&d===!0,A=w.encodeLocation?w.encodeLocation(m).pathname:m.pathname,P=g.pathname,C=b&&b.navigation&&b.navigation.location?b.navigation.location.pathname:null;i||(P=P.toLowerCase(),C=C?C.toLowerCase():null,A=A.toLowerCase()),C&&S&&(C=Zo(C,S)||C);const N=A!=="/"&&A.endsWith("/")?A.length-1:A.length;let j=P===A||!s&&P.startsWith(A)&&P.charAt(N)==="/",M=C!=null&&(C===A||!s&&C.startsWith(A)&&C.charAt(A.length)==="/"),F={isActive:j,isPending:M,isTransitioning:k},W=j?n:void 0,H;typeof a=="function"?H=a(F):H=[a,j?"active":null,M?"pending":null,k?"transitioning":null].filter(Boolean).join(" ");let Y=typeof u=="function"?u(F):u;return x.createElement(SO,vd({},p,{"aria-current":W,className:H,ref:r,style:Y,to:c,viewTransition:d}),typeof h=="function"?h(F):h)});var lg;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(lg||(lg={}));var b1;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(b1||(b1={}));function VD(e){let t=x.useContext(xf);return t||it(!1),t}function GD(e,t){let{target:r,replace:n,state:i,preventScrollReset:a,relative:s,viewTransition:u}=t===void 0?{}:t,c=ky(),d=Ha(),h=Sf(e,{relative:s});return x.useCallback(p=>{if(LD(p,r)){p.preventDefault();let m=n!==void 0?n:pd(d)===pd(h);c(e,{replace:m,state:i,preventScrollReset:a,relative:s,viewTransition:u})}},[d,c,h,n,i,r,e,a,s,u])}function YD(e,t){t===void 0&&(t={});let r=x.useContext(FD);r==null&&it(!1);let{basename:n}=VD(lg.useViewTransitionState),i=Sf(e,{relative:t.relative});if(!r.isTransitioning)return!1;let a=Zo(r.currentLocation.pathname,n)||r.currentLocation.pathname,s=Zo(r.nextLocation.pathname,n)||r.nextLocation.pathname;return og(i.pathname,s)!=null||og(i.pathname,a)!=null}class XD extends x.Component{constructor(){super(...arguments);sl(this,"state",{hasError:!1})}static getDerivedStateFromError(r){return{hasError:!0,message:r.message}}componentDidCatch(r,n){console.error(r,n)}render(){return this.state.hasError?O.jsxs("div",{className:"panel m-6 p-6",children:[O.jsx("h1",{className:"text-lg font-bold text-rose-700",children:"CoĹ› poszĹ‚o nie tak."}),O.jsx("p",{className:"mt-2 text-sm text-slate-600",children:"OdĹ›wieĹĽ stronÄ™ albo sprĂłbuj ponownie za chwilÄ™."}),this.state.message&&O.jsx("p",{className:"mt-3 text-xs text-slate-500",children:this.state.message})]}):this.props.children}}const ug=({className:e=""})=>O.jsx("div",{className:`animate-pulse rounded-md bg-slate-100 ${e}`});function kf(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(r[n[i]]=e[n[i]]);return r}function JD(e,t,r,n){function i(a){return a instanceof r?a:new r(function(s){s(a)})}return new(r||(r=Promise))(function(a,s){function u(h){try{d(n.next(h))}catch(p){s(p)}}function c(h){try{d(n.throw(h))}catch(p){s(p)}}function d(h){h.done?a(h.value):i(h.value).then(u,c)}d((n=n.apply(e,t||[])).next())})}const QD=e=>e?(...t)=>e(...t):(...t)=>fetch(...t);class Ey extends Error{constructor(t,r="FunctionsError",n){super(t),this.name=r,this.context=n}toJSON(){return{name:this.name,message:this.message,context:this.context}}}class ZD extends Ey{constructor(t){super("Failed to send a request to the Edge Function","FunctionsFetchError",t)}}class x1 extends Ey{constructor(t){super("Relay Error invoking the Edge Function","FunctionsRelayError",t)}}class _1 extends Ey{constructor(t){super("Edge Function returned a non-2xx status code","FunctionsHttpError",t)}}var cg;(function(e){e.Any="any",e.ApNortheast1="ap-northeast-1",e.ApNortheast2="ap-northeast-2",e.ApSouth1="ap-south-1",e.ApSoutheast1="ap-southeast-1",e.ApSoutheast2="ap-southeast-2",e.CaCentral1="ca-central-1",e.EuCentral1="eu-central-1",e.EuWest1="eu-west-1",e.EuWest2="eu-west-2",e.EuWest3="eu-west-3",e.SaEast1="sa-east-1",e.UsEast1="us-east-1",e.UsWest1="us-west-1",e.UsWest2="us-west-2"})(cg||(cg={}));class eM{constructor(t,{headers:r={},customFetch:n,region:i=cg.Any}={}){this.url=t,this.headers=r,this.region=i,this.fetch=QD(n)}setAuth(t){this.headers.Authorization=`Bearer ${t}`}invoke(t){return JD(this,arguments,void 0,function*(r,n={}){var i;let a,s;try{const{headers:u,method:c,body:d,signal:h,timeout:p}=n;let m={},{region:g}=n;g||(g=this.region);const b=new URL(`${this.url}/${r}`);g&&g!=="any"&&(m["x-region"]=g,b.searchParams.set("forceFunctionRegion",g));let w;d&&(u&&!Object.prototype.hasOwnProperty.call(u,"Content-Type")||!u)?typeof Blob<"u"&&d instanceof Blob||d instanceof ArrayBuffer?(m["Content-Type"]="application/octet-stream",w=d):typeof d=="string"?(m["Content-Type"]="text/plain",w=d):typeof FormData<"u"&&d instanceof FormData?w=d:(m["Content-Type"]="application/json",w=JSON.stringify(d)):d&&typeof d!="string"&&!(typeof Blob<"u"&&d instanceof Blob)&&!(d instanceof ArrayBuffer)&&!(typeof FormData<"u"&&d instanceof FormData)?w=JSON.stringify(d):w=d;let S=h;p&&(s=new AbortController,a=setTimeout(()=>s.abort(),p),h?(S=s.signal,h.addEventListener("abort",()=>s.abort())):S=s.signal);const k=yield this.fetch(b.toString(),{method:c||"POST",headers:Object.assign(Object.assign(Object.assign({},m),this.headers),u),body:w,signal:S}).catch(N=>{throw new ZD(N)}),A=k.headers.get("x-relay-error");if(A&&A==="true")throw new x1(k);if(!k.ok)throw new _1(k);let P=((i=k.headers.get("Content-Type"))!==null&&i!==void 0?i:"text/plain").split(";")[0].trim(),C;return P==="application/json"?C=yield k.json():P==="application/octet-stream"||P==="application/pdf"?C=yield k.blob():P==="text/event-stream"?C=k:P==="multipart/form-data"?C=yield k.formData():C=yield k.text(),{data:C,error:null,response:k}}catch(u){return{data:null,error:u,response:u instanceof _1||u instanceof x1?u.context:void 0}}finally{a&&clearTimeout(a)}})}}const kO=3,S1=e=>Math.min(1e3*2**e,3e4),tM=[520,503],PO=["GET","HEAD","OPTIONS"];var rM=class extends Error{constructor(e){super(e.message),this.name="PostgrestError",this.details=e.details,this.hint=e.hint,this.code=e.code}toJSON(){return{name:this.name,message:this.message,details:this.details,hint:this.hint,code:this.code}}};function k1(e,t){return new Promise(r=>{if(t!=null&&t.aborted){r();return}const n=setTimeout(()=>{t==null||t.removeEventListener("abort",i),r()},e);function i(){clearTimeout(n),r()}t==null||t.addEventListener("abort",i)})}function nM(e,t,r,n){return!(!n||r>=kO||!PO.includes(e)||!tM.includes(t))}var iM=class{constructor(e){var t,r,n,i,a;this.shouldThrowOnError=!1,this.retryEnabled=!0,this.method=e.method,this.url=e.url,this.headers=new Headers(e.headers),this.schema=e.schema,this.body=e.body,this.shouldThrowOnError=(t=e.shouldThrowOnError)!==null&&t!==void 0?t:!1,this.signal=e.signal,this.isMaybeSingle=(r=e.isMaybeSingle)!==null&&r!==void 0?r:!1,this.shouldStripNulls=(n=e.shouldStripNulls)!==null&&n!==void 0?n:!1,this.urlLengthLimit=(i=e.urlLengthLimit)!==null&&i!==void 0?i:8e3,this.retryEnabled=(a=e.retry)!==null&&a!==void 0?a:!0,e.fetch?this.fetch=e.fetch:this.fetch=fetch}throwOnError(){return this.shouldThrowOnError=!0,this}stripNulls(){if(this.headers.get("Accept")==="text/csv")throw new Error("stripNulls() cannot be used with csv()");return this.shouldStripNulls=!0,this}setHeader(e,t){return this.headers=new Headers(this.headers),this.headers.set(e,t),this}retry(e){return this.retryEnabled=e,this}then(e,t){var r=this;if(this.schema===void 0||(["GET","HEAD"].includes(this.method)?this.headers.set("Accept-Profile",this.schema):this.headers.set("Content-Profile",this.schema)),this.method!=="GET"&&this.method!=="HEAD"&&this.headers.set("Content-Type","application/json"),this.shouldStripNulls){const s=this.headers.get("Accept");s==="application/vnd.pgrst.object+json"?this.headers.set("Accept","application/vnd.pgrst.object+json;nulls=stripped"):(!s||s==="application/json")&&this.headers.set("Accept","application/vnd.pgrst.array+json;nulls=stripped")}const n=this.fetch;let a=(async()=>{let s=0;for(;;){const d=new Headers(r.headers);s>0&&d.set("X-Retry-Count",String(s));let h;try{h=await n(r.url.toString(),{method:r.method,headers:d,body:JSON.stringify(r.body,(p,m)=>typeof m=="bigint"?m.toString():m),signal:r.signal})}catch(p){if((p==null?void 0:p.name)==="AbortError"||(p==null?void 0:p.code)==="ABORT_ERR"||!PO.includes(r.method))throw p;if(r.retryEnabled&&s<kO){const m=S1(s);s++,await k1(m,r.signal);continue}throw p}if(nM(r.method,h.status,s,r.retryEnabled)){var u,c;const p=(u=(c=h.headers)===null||c===void 0?void 0:c.get("Retry-After"))!==null&&u!==void 0?u:null,m=p!==null?Math.max(0,parseInt(p,10)||0)*1e3:S1(s);await h.text(),s++,await k1(m,r.signal);continue}return await r.processResponse(h)}})();return this.shouldThrowOnError||(a=a.catch(s=>{var u;let c="",d="",h="";const p=s==null?void 0:s.cause;if(p){var m,g,b,w;const A=(m=p==null?void 0:p.message)!==null&&m!==void 0?m:"",P=(g=p==null?void 0:p.code)!==null&&g!==void 0?g:"";c=`${(b=s==null?void 0:s.name)!==null&&b!==void 0?b:"FetchError"}: ${s==null?void 0:s.message}`,c+=`

Caused by: ${(w=p==null?void 0:p.name)!==null&&w!==void 0?w:"Error"}: ${A}`,P&&(c+=` (${P})`),p!=null&&p.stack&&(c+=`
${p.stack}`)}else{var S;c=(S=s==null?void 0:s.stack)!==null&&S!==void 0?S:""}const k=this.url.toString().length;return(s==null?void 0:s.name)==="AbortError"||(s==null?void 0:s.code)==="ABORT_ERR"?(h="",d="Request was aborted (timeout or manual cancellation)",k>this.urlLengthLimit&&(d+=`. Note: Your request URL is ${k} characters, which may exceed server limits. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [many IDs])), consider using an RPC function to pass values server-side.`)):((p==null?void 0:p.name)==="HeadersOverflowError"||(p==null?void 0:p.code)==="UND_ERR_HEADERS_OVERFLOW")&&(h="",d="HTTP headers exceeded server limits (typically 16KB)",k>this.urlLengthLimit&&(d+=`. Your request URL is ${k} characters. If selecting many fields, consider using views. If filtering with large arrays (e.g., .in('id', [200+ IDs])), consider using an RPC function instead.`)),{success:!1,error:{message:`${(u=s==null?void 0:s.name)!==null&&u!==void 0?u:"FetchError"}: ${s==null?void 0:s.message}`,details:c,hint:d,code:h},data:null,count:null,status:0,statusText:""}})),a.then(e,t)}async processResponse(e){var t=this;let r=null,n=null,i=null,a=e.status,s=e.statusText;if(e.ok){var u,c;if(t.method!=="HEAD"){var d;const m=await e.text();m===""||(t.headers.get("Accept")==="text/csv"||t.headers.get("Accept")&&(!((d=t.headers.get("Accept"))===null||d===void 0)&&d.includes("application/vnd.pgrst.plan+text"))?n=m:n=JSON.parse(m))}const h=(u=t.headers.get("Prefer"))===null||u===void 0?void 0:u.match(/count=(exact|planned|estimated)/),p=(c=e.headers.get("content-range"))===null||c===void 0?void 0:c.split("/");h&&p&&p.length>1&&(i=parseInt(p[1])),t.isMaybeSingle&&Array.isArray(n)&&(n.length>1?(r={code:"PGRST116",details:`Results contain ${n.length} rows, application/vnd.pgrst.object+json requires 1 row`,hint:null,message:"JSON object requested, multiple (or no) rows returned"},n=null,i=null,a=406,s="Not Acceptable"):n.length===1?n=n[0]:n=null)}else{const h=await e.text();try{r=JSON.parse(h),Array.isArray(r)&&e.status===404&&(n=[],r=null,a=200,s="OK")}catch{e.status===404&&h===""?(a=204,s="No Content"):r={message:h}}if(r&&t.shouldThrowOnError)throw new rM(r)}return{success:r===null,error:r,data:n,count:i,status:a,statusText:s}}returns(){return this}overrideTypes(){return this}},aM=class extends iM{select(e){let t=!1;const r=(e??"*").split("").map(n=>/\s/.test(n)&&!t?"":(n==='"'&&(t=!t),n)).join("");return this.url.searchParams.set("select",r),this.headers.append("Prefer","return=representation"),this}order(e,{ascending:t=!0,nullsFirst:r,foreignTable:n,referencedTable:i=n}={}){const a=i?`${i}.order`:"order",s=this.url.searchParams.get(a);return this.url.searchParams.set(a,`${s?`${s},`:""}${e}.${t?"asc":"desc"}${r===void 0?"":r?".nullsfirst":".nullslast"}`),this}limit(e,{foreignTable:t,referencedTable:r=t}={}){const n=typeof r>"u"?"limit":`${r}.limit`;return this.url.searchParams.set(n,`${e}`),this}range(e,t,{foreignTable:r,referencedTable:n=r}={}){const i=typeof n>"u"?"offset":`${n}.offset`,a=typeof n>"u"?"limit":`${n}.limit`;return this.url.searchParams.set(i,`${e}`),this.url.searchParams.set(a,`${t-e+1}`),this}abortSignal(e){return this.signal=e,this}single(){return this.headers.set("Accept","application/vnd.pgrst.object+json"),this}maybeSingle(){return this.isMaybeSingle=!0,this}csv(){return this.headers.set("Accept","text/csv"),this}geojson(){return this.headers.set("Accept","application/geo+json"),this}explain({analyze:e=!1,verbose:t=!1,settings:r=!1,buffers:n=!1,wal:i=!1,format:a="text"}={}){var s;const u=[e?"analyze":null,t?"verbose":null,r?"settings":null,n?"buffers":null,i?"wal":null].filter(Boolean).join("|"),c=(s=this.headers.get("Accept"))!==null&&s!==void 0?s:"application/json";return this.headers.set("Accept",`application/vnd.pgrst.plan+${a}; for="${c}"; options=${u};`),a==="json"?this:this}rollback(){return this.headers.append("Prefer","tx=rollback"),this}returns(){return this}maxAffected(e){return this.headers.append("Prefer","handling=strict"),this.headers.append("Prefer",`max-affected=${e}`),this}};const P1=new RegExp("[,()]");var zo=class extends aM{eq(e,t){return this.url.searchParams.append(e,`eq.${t}`),this}neq(e,t){return this.url.searchParams.append(e,`neq.${t}`),this}gt(e,t){return this.url.searchParams.append(e,`gt.${t}`),this}gte(e,t){return this.url.searchParams.append(e,`gte.${t}`),this}lt(e,t){return this.url.searchParams.append(e,`lt.${t}`),this}lte(e,t){return this.url.searchParams.append(e,`lte.${t}`),this}like(e,t){return this.url.searchParams.append(e,`like.${t}`),this}likeAllOf(e,t){return this.url.searchParams.append(e,`like(all).{${t.join(",")}}`),this}likeAnyOf(e,t){return this.url.searchParams.append(e,`like(any).{${t.join(",")}}`),this}ilike(e,t){return this.url.searchParams.append(e,`ilik