shelflife-react-hooks 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/index.cjs.js +1374 -0
  2. package/dist/index.cjs.js.map +1 -0
  3. package/dist/index.d.cts +339 -0
  4. package/dist/index.d.ts +339 -0
  5. package/dist/index.esm.js +1376 -0
  6. package/dist/index.esm.js.map +1 -0
  7. package/package.json +33 -0
  8. package/src/context/AuthContext.tsx +109 -0
  9. package/src/context/InviteContext.tsx +74 -0
  10. package/src/context/ProductContext.tsx +126 -0
  11. package/src/context/RunningLowContext.tsx +100 -0
  12. package/src/context/StorageContext.tsx +104 -0
  13. package/src/context/StorageItemContext.tsx +136 -0
  14. package/src/context/StorageMemberContext.tsx +84 -0
  15. package/src/context/UserContext.tsx +109 -0
  16. package/src/context/__tests__/contexts.test.tsx +354 -0
  17. package/src/context/api/authApi.ts +141 -0
  18. package/src/context/api/inviteApi.ts +65 -0
  19. package/src/context/api/productApi.ts +204 -0
  20. package/src/context/api/requestState.ts +25 -0
  21. package/src/context/api/runningLowApi.ts +130 -0
  22. package/src/context/api/storageApi.ts +147 -0
  23. package/src/context/api/storageItemApi.ts +187 -0
  24. package/src/context/api/storageMemberApi.ts +78 -0
  25. package/src/context/api/userApi.ts +155 -0
  26. package/src/context/http.ts +22 -0
  27. package/src/index.ts +17 -0
  28. package/src/type/auth.ts +62 -0
  29. package/src/type/base.ts +22 -0
  30. package/src/type/models.ts +48 -0
  31. package/src/type/product.ts +29 -0
  32. package/src/type/requests.ts +49 -0
  33. package/src/type/runninglow.ts +23 -0
  34. package/src/type/storage.ts +70 -0
  35. package/src/type/user.ts +23 -0
  36. package/tsconfig.json +46 -0
  37. package/tsup.config.ts +11 -0
  38. package/vitest.config.ts +8 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/context/AuthContext.tsx","../src/context/http.ts","../src/context/api/requestState.ts","../src/context/api/authApi.ts","../src/context/InviteContext.tsx","../src/context/api/inviteApi.ts","../src/context/ProductContext.tsx","../src/context/api/productApi.ts","../src/context/RunningLowContext.tsx","../src/context/api/runningLowApi.ts","../src/context/StorageContext.tsx","../src/context/api/storageApi.ts","../src/context/StorageItemContext.tsx","../src/context/api/storageItemApi.ts","../src/context/StorageMemberContext.tsx","../src/context/api/storageMemberApi.ts","../src/context/UserContext.tsx","../src/context/api/userApi.ts"],"sourcesContent":["export * from './type/auth.js';\nexport * from './type/base.js';\nexport * from './type/models.js';\nexport * from './type/product.js';\nexport * from './type/runninglow.js';\nexport * from './type/requests.js';\nexport * from './type/storage.js';\nexport * from './type/user.js';\nexport * from './context/AuthContext.js';\nexport * from './context/http.js';\nexport * from './context/InviteContext.js';\nexport * from './context/ProductContext.js';\nexport * from './context/RunningLowContext.js';\nexport * from './context/StorageContext.js';\nexport * from './context/StorageItemContext.js';\nexport * from './context/StorageMemberContext.js';\nexport * from './context/UserContext.js';","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type {\n ChangePasswordRequest,\n LoginRequest,\n SignupRequest,\n User\n} from '../type/auth.js';\nimport {\n changePasswordRequest,\n getMeRequest,\n loginRequest,\n logoutRequest,\n signupRequest\n} from './api/authApi.js';\n\nexport type AuthContextValue = {\n token: string | null;\n user: User | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n login: (dto: LoginRequest) => Promise<void>;\n signup: (dto: SignupRequest) => Promise<User>;\n changePassword: (dto: ChangePasswordRequest) => Promise<void>;\n getMe: () => Promise<User | null>;\n logout: () => Promise<void>;\n getToken: () => string | null;\n};\n\ntype AuthProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n initialToken?: string | null;\n};\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\nexport const AuthProvider = ({ baseUrl, children, initialToken = null }: AuthProviderProps) => {\n const [token, setToken] = useState<string | null>(initialToken);\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const getToken = useCallback(() => token, [token]);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setToken,\n setUser,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const login = useCallback((dto: LoginRequest) => loginRequest(apiConfig, dto), [apiConfig]);\n const signup = useCallback((dto: SignupRequest) => signupRequest(apiConfig, dto), [apiConfig]);\n const changePassword = useCallback(\n (dto: ChangePasswordRequest) => changePasswordRequest(apiConfig, dto),\n [apiConfig]\n );\n const getMe = useCallback(() => getMeRequest(apiConfig), [apiConfig]);\n const logout = useCallback(() => logoutRequest(apiConfig), [apiConfig]);\n\n const value = useMemo<AuthContextValue>(() => ({\n token,\n user,\n isLoading,\n isError,\n error,\n login,\n signup,\n changePassword,\n getMe,\n logout,\n getToken\n }), [\n changePassword,\n error,\n getMe,\n getToken,\n isError,\n isLoading,\n login,\n logout,\n signup,\n token,\n user\n ]);\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n};\n\nexport const useAuth = (): AuthContextValue => {\n const context = useContext(AuthContext);\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return context;\n};\n","export const normalizeBaseUrl = (baseUrl: string): string => baseUrl.replace(/\\/+$/, '');\n\nexport const buildAuthHeaders = (token: string | null): HeadersInit => {\n if (!token) {\n return {};\n }\n\n return {\n Authorization: `Bearer ${token}`\n };\n};\n\nexport const readJson = async <T,>(response: Response): Promise<T | null> => {\n const contentType = response.headers.get('content-type');\n if (!contentType || !contentType.includes('application/json')) {\n return null;\n }\n\n return (await response.json()) as T;\n};\n\nexport const readArrayBuffer = async (response: Response): Promise<ArrayBuffer> => response.arrayBuffer();\n","export type RequestStateHandlers = {\n setIsLoading: (value: boolean) => void;\n setIsError: (value: boolean) => void;\n setError: (error: Error | null) => void;\n};\n\nexport const runWithRequestState = async <T>(\n handlers: RequestStateHandlers,\n request: () => Promise<T>\n): Promise<T> => {\n handlers.setIsLoading(true);\n handlers.setIsError(false);\n handlers.setError(null);\n\n try {\n return await request();\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Unknown error');\n handlers.setIsError(true);\n handlers.setError(error);\n throw error;\n } finally {\n handlers.setIsLoading(false);\n }\n};\n","import type {\n ChangePasswordRequest,\n LoginRequest,\n LoginResponse,\n SignupRequest,\n User\n} from '../../type/auth.js';\nimport type { ErrorResponse } from '../../type/base.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype AuthApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setToken: (token: string | null) => void;\n setUser: (user: User | null) => void;\n};\n\nexport const loginRequest = async (\n config: AuthApiConfig,\n dto: LoginRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Login failed');\n }\n\n const payload = await readJson<LoginResponse>(response);\n if (!payload || !('token' in payload)) {\n throw new Error('Login response missing token');\n }\n\n config.setToken(payload.token);\n\n const meResponse = await fetch(`${normalizedBaseUrl}/api/auth/me`, {\n headers: buildAuthHeaders(payload.token)\n });\n\n if (meResponse.ok) {\n const mePayload = await readJson<User>(meResponse);\n if (mePayload) {\n config.setUser(mePayload);\n }\n }\n});\n\nexport const signupRequest = async (\n config: AuthApiConfig,\n dto: SignupRequest\n): Promise<User> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/signup`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Signup failed');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('Signup response missing user');\n }\n\n config.setUser(payload);\n return payload;\n});\n\nexport const changePasswordRequest = async (\n config: AuthApiConfig,\n dto: ChangePasswordRequest\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/password/change`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n const error = await readJson<ErrorResponse>(response);\n throw new Error(error?.error ?? 'Change password failed');\n }\n});\n\nexport const getMeRequest = async (config: AuthApiConfig): Promise<User | null> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/auth/me`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n config.setUser(null);\n return null;\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n config.setUser(null);\n return null;\n }\n\n config.setUser(payload);\n return payload;\n }\n);\n\nexport const logoutRequest = async (config: AuthApiConfig): Promise<void> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n if (config.token) {\n await fetch(`${normalizedBaseUrl}/api/auth/logout`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token)\n });\n }\n\n config.setToken(null);\n config.setUser(null);\n }\n);\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { StorageMember } from '../type/models.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n acceptInviteRequest,\n declineInviteRequest,\n fetchInvitesRequest\n} from './api/inviteApi.js';\n\ntype InviteContextValue = {\n invites: StorageMember[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchInvites: () => Promise<StorageMember[]>;\n acceptInvite: (id: number) => Promise<void>;\n declineInvite: (id: number) => Promise<void>;\n};\n\ntype InviteProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst InviteContext = createContext<InviteContextValue | undefined>(undefined);\n\nexport const InviteProvider = ({ baseUrl, children }: InviteProviderProps) => {\n const { token } = useAuth();\n const [invites, setInvites] = useState<StorageMember[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setInvites,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchInvites = useCallback(() => fetchInvitesRequest(apiConfig), [apiConfig]);\n const acceptInvite = useCallback((id: number) => acceptInviteRequest(apiConfig, id), [apiConfig]);\n const declineInvite = useCallback((id: number) => declineInviteRequest(apiConfig, id), [apiConfig]);\n\n const value = useMemo<InviteContextValue>(() => ({\n invites,\n isLoading,\n isError,\n error,\n fetchInvites,\n acceptInvite,\n declineInvite\n }), [acceptInvite, declineInvite, error, fetchInvites, isError, isLoading, invites]);\n\n return <InviteContext.Provider value={value}>{children}</InviteContext.Provider>;\n};\n\nexport const useInvites = (): InviteContextValue => {\n const context = useContext(InviteContext);\n if (!context) {\n throw new Error('useInvites must be used within an InviteProvider');\n }\n\n return context;\n};\n","import type { StorageMember } from '../../type/models.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype InviteApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setInvites: (value: StorageMember[] | ((items: StorageMember[]) => StorageMember[])) => void;\n};\n\nexport const fetchInvitesRequest = async (config: InviteApiConfig): Promise<StorageMember[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch invites');\n }\n\n const payload = await readJson<StorageMember[]>(response);\n if (payload) {\n config.setInvites(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const acceptInviteRequest = async (\n config: InviteApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites/${id}`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to accept invite');\n }\n\n config.setInvites((previous) => previous.filter((invite) => invite.id !== id));\n});\n\nexport const declineInviteRequest = async (\n config: InviteApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/invites/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to decline invite');\n }\n\n config.setInvites((previous) => previous.filter((invite) => invite.id !== id));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { Product } from '../type/models.js';\nimport type { CreateProductRequest, UpdateProductRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n createProductRequest,\n deleteProductRequest,\n fetchProductRequest,\n fetchProductsRequest,\n getProductIconRequest,\n updateProductRequest,\n uploadProductIconRequest\n} from './api/productApi.js';\n\ntype ProductQuery = {\n barcode?: string;\n name?: string;\n category?: string;\n};\n\ntype ProductContextValue = {\n products: Product[];\n product: Product | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchProducts: (query?: ProductQuery) => Promise<Product[]>;\n fetchProduct: (id: number) => Promise<Product | null>;\n createProduct: (dto: CreateProductRequest) => Promise<Product>;\n updateProduct: (id: number, dto: UpdateProductRequest) => Promise<Product>;\n deleteProduct: (id: number) => Promise<void>;\n getProductIcon: (id: number) => Promise<ArrayBuffer>;\n uploadProductIcon: (id: number, file: Blob) => Promise<void>;\n};\n\ntype ProductProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst ProductContext = createContext<ProductContextValue | undefined>(undefined);\n\nexport const ProductProvider = ({ baseUrl, children }: ProductProviderProps) => {\n const { token } = useAuth();\n const [products, setProducts] = useState<Product[]>([]);\n const [product, setProduct] = useState<Product | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setProducts,\n setProduct,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchProducts = useCallback(\n (query?: ProductQuery) => fetchProductsRequest(apiConfig, query),\n [apiConfig]\n );\n const fetchProduct = useCallback((id: number) => fetchProductRequest(apiConfig, id), [apiConfig]);\n const createProduct = useCallback(\n (dto: CreateProductRequest) => createProductRequest(apiConfig, dto),\n [apiConfig]\n );\n const updateProduct = useCallback(\n (id: number, dto: UpdateProductRequest) => updateProductRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteProduct = useCallback((id: number) => deleteProductRequest(apiConfig, id), [apiConfig]);\n const getProductIcon = useCallback((id: number) => getProductIconRequest(apiConfig, id), [apiConfig]);\n const uploadProductIcon = useCallback(\n (id: number, file: Blob) => uploadProductIconRequest(apiConfig, id, file),\n [apiConfig]\n );\n\n const value = useMemo<ProductContextValue>(() => ({\n products,\n product,\n isLoading,\n isError,\n error,\n fetchProducts,\n fetchProduct,\n createProduct,\n updateProduct,\n deleteProduct,\n getProductIcon,\n uploadProductIcon\n }), [\n createProduct,\n deleteProduct,\n error,\n fetchProduct,\n fetchProducts,\n getProductIcon,\n isError,\n isLoading,\n product,\n products,\n updateProduct,\n uploadProductIcon\n ]);\n\n return <ProductContext.Provider value={value}>{children}</ProductContext.Provider>;\n};\n\nexport const useProducts = (): ProductContextValue => {\n const context = useContext(ProductContext);\n if (!context) {\n throw new Error('useProducts must be used within a ProductProvider');\n }\n\n return context;\n};\n","import type { Product } from '../../type/models.js';\nimport type { CreateProductRequest, UpdateProductRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype ProductQuery = {\n barcode?: string;\n name?: string;\n category?: string;\n};\n\ntype ProductApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setProducts: (value: Product[] | ((items: Product[]) => Product[])) => void;\n setProduct: (value: Product | null | ((prev: Product | null) => Product | null)) => void;\n};\n\nconst updateById = (items: Product[], updated: Product): Product[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchProductsRequest = async (\n config: ProductApiConfig,\n query?: ProductQuery\n): Promise<Product[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const params = new URLSearchParams();\n if (query?.barcode) {\n params.set('barcode', query.barcode);\n }\n if (query?.name) {\n params.set('name', query.name);\n }\n if (query?.category) {\n params.set('category', query.category);\n }\n\n const url = params.toString()\n ? `${normalizedBaseUrl}/api/products?${params.toString()}`\n : `${normalizedBaseUrl}/api/products`;\n\n const response = await fetch(url, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch products');\n }\n\n const payload = await readJson<Product[]>(response);\n if (payload) {\n config.setProducts(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<Product | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setProduct(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Product response missing data');\n }\n\n config.setProduct(payload);\n config.setProducts((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createProductRequest = async (\n config: ProductApiConfig,\n dto: CreateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Create product response missing data');\n }\n\n config.setProducts((previous) => [payload, ...previous]);\n config.setProduct(payload);\n return payload;\n});\n\nexport const updateProductRequest = async (\n config: ProductApiConfig,\n id: number,\n dto: UpdateProductRequest\n): Promise<Product> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update product');\n }\n\n const payload = await readJson<Product>(response);\n if (!payload) {\n throw new Error('Update product response missing data');\n }\n\n config.setProducts((previous) => updateById(previous, payload));\n config.setProduct(payload);\n return payload;\n});\n\nexport const deleteProductRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete product');\n }\n\n config.setProducts((previous) => previous.filter((item) => item.id !== id));\n config.setProduct((current) => (current?.id === id ? null : current));\n});\n\nexport const getProductIconRequest = async (\n config: ProductApiConfig,\n id: number\n): Promise<ArrayBuffer> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch product icon');\n }\n\n return readArrayBuffer(response);\n});\n\nexport const uploadProductIconRequest = async (\n config: ProductApiConfig,\n id: number,\n file: Blob\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const formData = new FormData();\n formData.append('pfp', file);\n\n const response = await fetch(`${normalizedBaseUrl}/api/products/${id}/icon`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token),\n body: formData\n });\n\n if (!response.ok) {\n throw new Error('Failed to upload product icon');\n }\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowSetting } from '../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n createSettingRequest,\n deleteSettingRequest,\n editSettingRequest,\n fetchSettingsRequest\n} from './api/runningLowApi.js';\n\ntype RunningLowContextValue = {\n settings: RunningLowSetting[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchSettings: (storageId: number) => Promise<RunningLowSetting[]>;\n createSetting: (storageId: number, dto: CreateSettingRequest) => Promise<RunningLowSetting>;\n editSetting: (storageId: number, id: number, dto: EditSettingRequest) => Promise<RunningLowSetting>;\n deleteSetting: (storageId: number, id: number) => Promise<void>;\n};\n\ntype RunningLowProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst RunningLowContext = createContext<RunningLowContextValue | undefined>(undefined);\n\nexport const RunningLowProvider = ({ baseUrl, children }: RunningLowProviderProps) => {\n const { token } = useAuth();\n const [settings, setSettings] = useState<RunningLowSetting[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setSettings,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchSettings = useCallback(\n (storageId: number) => fetchSettingsRequest(apiConfig, storageId),\n [apiConfig]\n );\n const createSetting = useCallback(\n (storageId: number, dto: CreateSettingRequest) => createSettingRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editSetting = useCallback(\n (storageId: number, id: number, dto: EditSettingRequest) => editSettingRequest(apiConfig, storageId, id, dto),\n [apiConfig]\n );\n const deleteSetting = useCallback(\n (storageId: number, id: number) => deleteSettingRequest(apiConfig, storageId, id),\n [apiConfig]\n );\n\n const value = useMemo<RunningLowContextValue>(() => ({\n settings,\n isLoading,\n isError,\n error,\n fetchSettings,\n createSetting,\n editSetting,\n deleteSetting\n }), [\n createSetting,\n deleteSetting,\n editSetting,\n error,\n fetchSettings,\n isError,\n isLoading,\n settings\n ]);\n\n return <RunningLowContext.Provider value={value}>{children}</RunningLowContext.Provider>;\n};\n\nexport const useRunningLow = (): RunningLowContextValue => {\n const context = useContext(RunningLowContext);\n if (!context) {\n throw new Error('useRunningLow must be used within a RunningLowProvider');\n }\n\n return context;\n};\n","import type { RunningLowSetting } from '../../type/models.js';\nimport type { CreateSettingRequest, EditSettingRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype RunningLowApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setSettings: (value: RunningLowSetting[] | ((items: RunningLowSetting[]) => RunningLowSetting[])) => void;\n};\n\nconst updateById = (items: RunningLowSetting[], updated: RunningLowSetting): RunningLowSetting[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchSettingsRequest = async (\n config: RunningLowApiConfig,\n storageId: number\n): Promise<RunningLowSetting[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low settings');\n }\n\n const payload = await readJson<RunningLowSetting[]>(response);\n if (payload) {\n config.setSettings(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const createSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n dto: CreateSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings`,\n {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to create running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Create running low response missing data');\n }\n\n config.setSettings((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number,\n dto: EditSettingRequest\n): Promise<RunningLowSetting> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'PUT',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to edit running low setting');\n }\n\n const payload = await readJson<RunningLowSetting>(response);\n if (!payload) {\n throw new Error('Edit running low response missing data');\n }\n\n config.setSettings((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteSettingRequest = async (\n config: RunningLowApiConfig,\n storageId: number,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(\n `${normalizedBaseUrl}/api/storages/${storageId}/runninglowsettings/${id}`,\n {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n }\n );\n\n if (!response.ok) {\n throw new Error('Failed to delete running low setting');\n }\n\n config.setSettings((previous) => previous.filter((item) => item.id !== id));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { Storage } from '../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n changeStorageNameRequest,\n createStorageRequest,\n deleteStorageRequest,\n fetchStorageRequest,\n fetchStoragesRequest\n} from './api/storageApi.js';\n\ntype StorageContextValue = {\n storages: Storage[];\n storage: Storage | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchStorages: () => Promise<Storage[]>;\n fetchStorage: (id: number) => Promise<Storage | null>;\n createStorage: (dto: CreateStorageRequest) => Promise<Storage>;\n changeStorageName: (id: number, dto: ChangeStorageNameRequest) => Promise<Storage>;\n deleteStorage: (id: number) => Promise<void>;\n};\n\ntype StorageProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageContext = createContext<StorageContextValue | undefined>(undefined);\n\nexport const StorageProvider = ({ baseUrl, children }: StorageProviderProps) => {\n const { token } = useAuth();\n const [storages, setStorages] = useState<Storage[]>([]);\n const [storage, setStorage] = useState<Storage | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setStorages,\n setStorage,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchStorages = useCallback(() => fetchStoragesRequest(apiConfig), [apiConfig]);\n const fetchStorage = useCallback((id: number) => fetchStorageRequest(apiConfig, id), [apiConfig]);\n const createStorage = useCallback(\n (dto: CreateStorageRequest) => createStorageRequest(apiConfig, dto),\n [apiConfig]\n );\n const changeStorageName = useCallback(\n (id: number, dto: ChangeStorageNameRequest) => changeStorageNameRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteStorage = useCallback((id: number) => deleteStorageRequest(apiConfig, id), [apiConfig]);\n\n const value = useMemo<StorageContextValue>(() => ({\n storages,\n storage,\n isLoading,\n isError,\n error,\n fetchStorages,\n fetchStorage,\n createStorage,\n changeStorageName,\n deleteStorage\n }), [\n changeStorageName,\n createStorage,\n deleteStorage,\n error,\n fetchStorage,\n fetchStorages,\n isError,\n isLoading,\n storage,\n storages\n ]);\n\n return <StorageContext.Provider value={value}>{children}</StorageContext.Provider>;\n};\n\nexport const useStorages = (): StorageContextValue => {\n const context = useContext(StorageContext);\n if (!context) {\n throw new Error('useStorages must be used within a StorageProvider');\n }\n\n return context;\n};\n","import type { Storage } from '../../type/models.js';\nimport type { ChangeStorageNameRequest, CreateStorageRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setStorages: (value: Storage[] | ((items: Storage[]) => Storage[])) => void;\n setStorage: (value: Storage | null | ((prev: Storage | null) => Storage | null)) => void;\n};\n\nconst updateById = (items: Storage[], updated: Storage): Storage[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchStoragesRequest = async (config: StorageApiConfig): Promise<Storage[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storages');\n }\n\n const payload = await readJson<Storage[]>(response);\n if (payload) {\n config.setStorages(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<Storage | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setStorage(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Storage response missing data');\n }\n\n config.setStorage(payload);\n config.setStorages((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const createStorageRequest = async (\n config: StorageApiConfig,\n dto: CreateStorageRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to create storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Create storage response missing data');\n }\n\n config.setStorages((previous) => [payload, ...previous]);\n config.setStorage(payload);\n return payload;\n});\n\nexport const changeStorageNameRequest = async (\n config: StorageApiConfig,\n id: number,\n dto: ChangeStorageNameRequest\n): Promise<Storage> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update storage');\n }\n\n const payload = await readJson<Storage>(response);\n if (!payload) {\n throw new Error('Update storage response missing data');\n }\n\n config.setStorages((previous) => updateById(previous, payload));\n config.setStorage(payload);\n return payload;\n});\n\nexport const deleteStorageRequest = async (\n config: StorageApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage');\n }\n\n config.setStorages((previous) => previous.filter((item) => item.id !== id));\n config.setStorage((current) => (current?.id === id ? null : current));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { RunningLowNotification, StorageItem } from '../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n addItemRequest,\n deleteItemRequest,\n editItemRequest,\n fetchAboutToExpireRequest,\n fetchExpiredRequest,\n fetchItemsRequest,\n fetchRunningLowRequest\n} from './api/storageItemApi.js';\n\ntype StorageItemContextValue = {\n items: StorageItem[];\n expiredItems: StorageItem[];\n aboutToExpireItems: StorageItem[];\n runningLow: RunningLowNotification[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchItems: (storageId: number) => Promise<StorageItem[]>;\n addItem: (storageId: number, dto: AddItemRequest) => Promise<StorageItem>;\n editItem: (storageId: number, itemId: number, dto: EditItemRequest) => Promise<StorageItem>;\n deleteItem: (storageId: number, itemId: number) => Promise<void>;\n fetchExpired: (storageId: number) => Promise<StorageItem[]>;\n fetchAboutToExpire: (storageId: number) => Promise<StorageItem[]>;\n fetchRunningLow: (storageId: number) => Promise<RunningLowNotification[]>;\n};\n\ntype StorageItemProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageItemContext = createContext<StorageItemContextValue | undefined>(undefined);\n\nexport const StorageItemProvider = ({ baseUrl, children }: StorageItemProviderProps) => {\n const { token } = useAuth();\n const [items, setItems] = useState<StorageItem[]>([]);\n const [expiredItems, setExpiredItems] = useState<StorageItem[]>([]);\n const [aboutToExpireItems, setAboutToExpireItems] = useState<StorageItem[]>([]);\n const [runningLow, setRunningLow] = useState<RunningLowNotification[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setItems,\n setExpiredItems,\n setAboutToExpireItems,\n setRunningLow,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchItems = useCallback((storageId: number) => fetchItemsRequest(apiConfig, storageId), [apiConfig]);\n const addItem = useCallback(\n (storageId: number, dto: AddItemRequest) => addItemRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const editItem = useCallback(\n (storageId: number, itemId: number, dto: EditItemRequest) => editItemRequest(apiConfig, storageId, itemId, dto),\n [apiConfig]\n );\n const deleteItem = useCallback(\n (storageId: number, itemId: number) => deleteItemRequest(apiConfig, storageId, itemId),\n [apiConfig]\n );\n const fetchExpired = useCallback(\n (storageId: number) => fetchExpiredRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchAboutToExpire = useCallback(\n (storageId: number) => fetchAboutToExpireRequest(apiConfig, storageId),\n [apiConfig]\n );\n const fetchRunningLow = useCallback(\n (storageId: number) => fetchRunningLowRequest(apiConfig, storageId),\n [apiConfig]\n );\n\n const value = useMemo<StorageItemContextValue>(() => ({\n items,\n expiredItems,\n aboutToExpireItems,\n runningLow,\n isLoading,\n isError,\n error,\n fetchItems,\n addItem,\n editItem,\n deleteItem,\n fetchExpired,\n fetchAboutToExpire,\n fetchRunningLow\n }), [\n aboutToExpireItems,\n addItem,\n deleteItem,\n editItem,\n error,\n expiredItems,\n fetchAboutToExpire,\n fetchExpired,\n fetchItems,\n fetchRunningLow,\n isError,\n isLoading,\n items,\n runningLow\n ]);\n\n return <StorageItemContext.Provider value={value}>{children}</StorageItemContext.Provider>;\n};\n\nexport const useStorageItems = (): StorageItemContextValue => {\n const context = useContext(StorageItemContext);\n if (!context) {\n throw new Error('useStorageItems must be used within a StorageItemProvider');\n }\n\n return context;\n};\n","import type { RunningLowNotification, StorageItem } from '../../type/models.js';\nimport type { AddItemRequest, EditItemRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageItemApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setItems: (value: StorageItem[] | ((items: StorageItem[]) => StorageItem[])) => void;\n setExpiredItems: (value: StorageItem[]) => void;\n setAboutToExpireItems: (value: StorageItem[]) => void;\n setRunningLow: (value: RunningLowNotification[]) => void;\n};\n\nconst updateById = (items: StorageItem[], updated: StorageItem): StorageItem[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchItemsRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const addItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n dto: AddItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to add storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Add item response missing data');\n }\n\n config.setItems((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const editItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number,\n dto: EditItemRequest\n): Promise<StorageItem> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to edit storage item');\n }\n\n const payload = await readJson<StorageItem>(response);\n if (!payload) {\n throw new Error('Edit item response missing data');\n }\n\n config.setItems((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const deleteItemRequest = async (\n config: StorageItemApiConfig,\n storageId: number,\n itemId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/items/${itemId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete storage item');\n }\n\n config.setItems((previous) => previous.filter((item) => item.id !== itemId));\n});\n\nexport const fetchExpiredRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/expired`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch expired items');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setExpiredItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchAboutToExpireRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<StorageItem[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/abouttoexpire`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch items about to expire');\n }\n\n const payload = await readJson<StorageItem[]>(response);\n if (payload) {\n config.setAboutToExpireItems(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const fetchRunningLowRequest = async (\n config: StorageItemApiConfig,\n storageId: number\n): Promise<RunningLowNotification[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/runninglow`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch running low items');\n }\n\n const payload = await readJson<RunningLowNotification[]>(response);\n if (payload) {\n config.setRunningLow(payload);\n return payload;\n }\n\n return [];\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { StorageMember } from '../type/models.js';\nimport type { InviteMemberRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n fetchMembersRequest,\n inviteMemberRequest,\n removeMemberRequest\n} from './api/storageMemberApi.js';\n\ntype StorageMemberContextValue = {\n members: StorageMember[];\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchMembers: (storageId: number) => Promise<StorageMember[]>;\n inviteMember: (storageId: number, dto: InviteMemberRequest) => Promise<StorageMember>;\n removeMember: (storageId: number, userId: number) => Promise<void>;\n};\n\ntype StorageMemberProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst StorageMemberContext = createContext<StorageMemberContextValue | undefined>(undefined);\n\nexport const StorageMemberProvider = ({ baseUrl, children }: StorageMemberProviderProps) => {\n const { token } = useAuth();\n const [members, setMembers] = useState<StorageMember[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setMembers,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchMembers = useCallback(\n (storageId: number) => fetchMembersRequest(apiConfig, storageId),\n [apiConfig]\n );\n const inviteMember = useCallback(\n (storageId: number, dto: InviteMemberRequest) => inviteMemberRequest(apiConfig, storageId, dto),\n [apiConfig]\n );\n const removeMember = useCallback(\n (storageId: number, userId: number) => removeMemberRequest(apiConfig, storageId, userId),\n [apiConfig]\n );\n\n const value = useMemo<StorageMemberContextValue>(() => ({\n members,\n isLoading,\n isError,\n error,\n fetchMembers,\n inviteMember,\n removeMember\n }), [error, fetchMembers, inviteMember, isError, isLoading, members, removeMember]);\n\n return <StorageMemberContext.Provider value={value}>{children}</StorageMemberContext.Provider>;\n};\n\nexport const useStorageMembers = (): StorageMemberContextValue => {\n const context = useContext(StorageMemberContext);\n if (!context) {\n throw new Error('useStorageMembers must be used within a StorageMemberProvider');\n }\n\n return context;\n};\n","import type { StorageMember } from '../../type/models.js';\nimport type { InviteMemberRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype StorageMemberApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setMembers: (value: StorageMember[] | ((items: StorageMember[]) => StorageMember[])) => void;\n};\n\nexport const fetchMembersRequest = async (\n config: StorageMemberApiConfig,\n storageId: number\n): Promise<StorageMember[]> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch storage members');\n }\n\n const payload = await readJson<StorageMember[]>(response);\n if (payload) {\n config.setMembers(payload);\n return payload;\n }\n\n return [];\n});\n\nexport const inviteMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n dto: InviteMemberRequest\n): Promise<StorageMember> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members`, {\n method: 'POST',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to invite member');\n }\n\n const payload = await readJson<StorageMember>(response);\n if (!payload) {\n throw new Error('Invite member response missing data');\n }\n\n config.setMembers((previous) => [payload, ...previous]);\n return payload;\n});\n\nexport const removeMemberRequest = async (\n config: StorageMemberApiConfig,\n storageId: number,\n userId: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/storages/${storageId}/members/${userId}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to remove member');\n }\n\n config.setMembers((previous) => previous.filter((member) => member.user.id !== userId));\n});\n","import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState\n} from 'react';\n\nimport type { User } from '../type/models.js';\nimport type { ChangeUserDataRequest } from '../type/requests.js';\nimport { useAuth } from './AuthContext.js';\nimport {\n deleteUserRequest,\n fetchUserRequest,\n fetchUsersRequest,\n getUserPfpRequest,\n updateUserRequest,\n uploadUserPfpRequest\n} from './api/userApi.js';\n\ntype UserContextValue = {\n users: User[];\n user: User | null;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n fetchUsers: () => Promise<User[]>;\n fetchUser: (id: number) => Promise<User | null>;\n updateUser: (id: number, dto: ChangeUserDataRequest) => Promise<User>;\n deleteUser: (id: number) => Promise<void>;\n getUserPfp: (id: number) => Promise<ArrayBuffer>;\n uploadUserPfp: (id: number, file: Blob) => Promise<void>;\n};\n\ntype UserProviderProps = {\n baseUrl: string;\n children: React.ReactNode;\n};\n\nconst UserContext = createContext<UserContextValue | undefined>(undefined);\n\nexport const UserProvider = ({ baseUrl, children }: UserProviderProps) => {\n const { token } = useAuth();\n const [users, setUsers] = useState<User[]>([]);\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isError, setIsError] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const apiConfig = useMemo(() => ({\n baseUrl,\n token,\n setUsers,\n setUser,\n setIsLoading,\n setIsError,\n setError\n }), [baseUrl, token]);\n\n const fetchUsers = useCallback(() => fetchUsersRequest(apiConfig), [apiConfig]);\n const fetchUser = useCallback((id: number) => fetchUserRequest(apiConfig, id), [apiConfig]);\n const updateUser = useCallback(\n (id: number, dto: ChangeUserDataRequest) => updateUserRequest(apiConfig, id, dto),\n [apiConfig]\n );\n const deleteUser = useCallback((id: number) => deleteUserRequest(apiConfig, id), [apiConfig]);\n const getUserPfp = useCallback((id: number) => getUserPfpRequest(apiConfig, id), [apiConfig]);\n const uploadUserPfp = useCallback(\n (id: number, file: Blob) => uploadUserPfpRequest(apiConfig, id, file),\n [apiConfig]\n );\n\n const value = useMemo<UserContextValue>(() => ({\n users,\n user,\n isLoading,\n isError,\n error,\n fetchUsers,\n fetchUser,\n updateUser,\n deleteUser,\n getUserPfp,\n uploadUserPfp\n }), [\n deleteUser,\n error,\n fetchUser,\n fetchUsers,\n getUserPfp,\n isError,\n isLoading,\n updateUser,\n uploadUserPfp,\n user,\n users\n ]);\n\n return <UserContext.Provider value={value}>{children}</UserContext.Provider>;\n};\n\nexport const useUsers = (): UserContextValue => {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error('useUsers must be used within a UserProvider');\n }\n\n return context;\n};\n","import type { User } from '../../type/models.js';\nimport type { ChangeUserDataRequest } from '../../type/requests.js';\nimport { buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson } from '../http.js';\nimport { runWithRequestState, type RequestStateHandlers } from './requestState.js';\n\ntype UserApiConfig = RequestStateHandlers & {\n baseUrl: string;\n token: string | null;\n setUsers: (value: User[] | ((items: User[]) => User[])) => void;\n setUser: (value: User | null | ((prev: User | null) => User | null)) => void;\n};\n\nconst updateById = (items: User[], updated: User): User[] => {\n const index = items.findIndex((item) => item.id === updated.id);\n if (index === -1) {\n return [updated, ...items];\n }\n\n const next = [...items];\n next[index] = updated;\n return next;\n};\n\nexport const fetchUsersRequest = async (config: UserApiConfig): Promise<User[]> => runWithRequestState(\n config,\n async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch users');\n }\n\n const payload = await readJson<User[]>(response);\n if (payload) {\n config.setUsers(payload);\n return payload;\n }\n\n return [];\n }\n);\n\nexport const fetchUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<User | null> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (response.status === 404) {\n config.setUser(null);\n return null;\n }\n\n if (!response.ok) {\n throw new Error('Failed to fetch user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('User response missing data');\n }\n\n config.setUser(payload);\n config.setUsers((previous) => updateById(previous, payload));\n return payload;\n});\n\nexport const updateUserRequest = async (\n config: UserApiConfig,\n id: number,\n dto: ChangeUserDataRequest\n): Promise<User> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'PATCH',\n headers: {\n ...buildAuthHeaders(config.token),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(dto)\n });\n\n if (!response.ok) {\n throw new Error('Failed to update user');\n }\n\n const payload = await readJson<User>(response);\n if (!payload) {\n throw new Error('Update user response missing data');\n }\n\n config.setUsers((previous) => updateById(previous, payload));\n config.setUser(payload);\n return payload;\n});\n\nexport const deleteUserRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}`, {\n method: 'DELETE',\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to delete user');\n }\n\n config.setUsers((previous) => previous.filter((item) => item.id !== id));\n config.setUser((current) => (current?.id === id ? null : current));\n});\n\nexport const getUserPfpRequest = async (\n config: UserApiConfig,\n id: number\n): Promise<ArrayBuffer> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}/pfp`, {\n headers: buildAuthHeaders(config.token)\n });\n\n if (!response.ok) {\n throw new Error('Failed to fetch user pfp');\n }\n\n return readArrayBuffer(response);\n});\n\nexport const uploadUserPfpRequest = async (\n config: UserApiConfig,\n id: number,\n file: Blob\n): Promise<void> => runWithRequestState(config, async () => {\n const normalizedBaseUrl = normalizeBaseUrl(config.baseUrl);\n const formData = new FormData();\n formData.append('pfp', file);\n\n const response = await fetch(`${normalizedBaseUrl}/api/users/${id}/pfp`, {\n method: 'POST',\n headers: buildAuthHeaders(config.token),\n body: formData\n });\n\n if (!response.ok) {\n throw new Error('Failed to upload user pfp');\n }\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAMO;;;ACNA,IAAM,mBAAmB,CAAC,YAA4B,QAAQ,QAAQ,QAAQ,EAAE;AAEhF,IAAM,mBAAmB,CAAC,UAAsC;AACnE,MAAI,CAAC,OAAO;AACR,WAAO,CAAC;AAAA,EACZ;AAEA,SAAO;AAAA,IACH,eAAe,UAAU,KAAK;AAAA,EAClC;AACJ;AAEO,IAAM,WAAW,OAAW,aAA0C;AACzE,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,MAAI,CAAC,eAAe,CAAC,YAAY,SAAS,kBAAkB,GAAG;AAC3D,WAAO;AAAA,EACX;AAEA,SAAQ,MAAM,SAAS,KAAK;AAChC;AAEO,IAAM,kBAAkB,OAAO,aAA6C,SAAS,YAAY;;;ACfjG,IAAM,sBAAsB,OAC/B,UACA,YACa;AACb,WAAS,aAAa,IAAI;AAC1B,WAAS,WAAW,KAAK;AACzB,WAAS,SAAS,IAAI;AAEtB,MAAI;AACA,WAAO,MAAM,QAAQ;AAAA,EACzB,SAAS,KAAK;AACV,UAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,eAAe;AACpE,aAAS,WAAW,IAAI;AACxB,aAAS,SAAS,KAAK;AACvB,UAAM;AAAA,EACV,UAAE;AACE,aAAS,aAAa,KAAK;AAAA,EAC/B;AACJ;;;ACNO,IAAM,eAAe,OACxB,QACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,mBAAmB;AAAA,IAChE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,QAAQ,MAAM,SAAwB,QAAQ;AACpD,UAAM,IAAI,MAAM,OAAO,SAAS,cAAc;AAAA,EAClD;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,CAAC,WAAW,EAAE,WAAW,UAAU;AACnC,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAClD;AAEA,SAAO,SAAS,QAAQ,KAAK;AAE7B,QAAM,aAAa,MAAM,MAAM,GAAG,iBAAiB,gBAAgB;AAAA,IAC/D,SAAS,iBAAiB,QAAQ,KAAK;AAAA,EAC3C,CAAC;AAED,MAAI,WAAW,IAAI;AACf,UAAM,YAAY,MAAM,SAAe,UAAU;AACjD,QAAI,WAAW;AACX,aAAO,QAAQ,SAAS;AAAA,IAC5B;AAAA,EACJ;AACJ,CAAC;AAEM,IAAM,gBAAgB,OACzB,QACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,oBAAoB;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,QAAQ,MAAM,SAAwB,QAAQ;AACpD,UAAM,IAAI,MAAM,OAAO,SAAS,eAAe;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAClD;AAEA,SAAO,QAAQ,OAAO;AACtB,SAAO;AACX,CAAC;AAEM,IAAM,wBAAwB,OACjC,QACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,6BAA6B;AAAA,IAC1E,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,QAAQ,MAAM,SAAwB,QAAQ;AACpD,UAAM,IAAI,MAAM,OAAO,SAAS,wBAAwB;AAAA,EAC5D;AACJ,CAAC;AAEM,IAAM,eAAe,OAAO,WAAgD;AAAA,EAC/E;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,gBAAgB;AAAA,MAC7D,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,aAAO,QAAQ,IAAI;AACnB,aAAO;AAAA,IACX;AAEA,UAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,QAAI,CAAC,SAAS;AACV,aAAO,QAAQ,IAAI;AACnB,aAAO;AAAA,IACX;AAEA,WAAO,QAAQ,OAAO;AACtB,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,gBAAgB,OAAO,WAAyC;AAAA,EACzE;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAI,OAAO,OAAO;AACd,YAAM,MAAM,GAAG,iBAAiB,oBAAoB;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,MAC1C,CAAC;AAAA,IACL;AAEA,WAAO,SAAS,IAAI;AACpB,WAAO,QAAQ,IAAI;AAAA,EACvB;AACJ;;;AH1CW;AAxDX,IAAM,kBAAc,4BAA4C,MAAS;AAElE,IAAM,eAAe,CAAC,EAAE,SAAS,UAAU,eAAe,KAAK,MAAyB;AAC3F,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,YAAY;AAC9D,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAsB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAuB,IAAI;AAErD,QAAM,eAAW,0BAAY,MAAM,OAAO,CAAC,KAAK,CAAC;AAEjD,QAAM,gBAAY,sBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,YAAQ,0BAAY,CAAC,QAAsB,aAAa,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;AAC1F,QAAM,aAAS,0BAAY,CAAC,QAAuB,cAAc,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC;AAC7F,QAAM,qBAAiB;AAAA,IACnB,CAAC,QAA+B,sBAAsB,WAAW,GAAG;AAAA,IACpE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,YAAQ,0BAAY,MAAM,aAAa,SAAS,GAAG,CAAC,SAAS,CAAC;AACpE,QAAM,aAAS,0BAAY,MAAM,cAAc,SAAS,GAAG,CAAC,SAAS,CAAC;AAEtE,QAAM,YAAQ,sBAA0B,OAAO;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,4CAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACzD;AAEO,IAAM,UAAU,MAAwB;AAC3C,QAAM,cAAU,yBAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AAEA,SAAO;AACX;;;AI5GA,IAAAA,gBAMO;;;ACIA,IAAM,sBAAsB,OAAO,WAAsD;AAAA,EAC5F;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,yBAAyB;AAAA,MACtE,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC7C;AAEA,UAAM,UAAU,MAAM,SAA0B,QAAQ;AACxD,QAAI,SAAS;AACT,aAAO,WAAW,OAAO;AACzB,aAAO;AAAA,IACX;AAEA,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,IAAM,sBAAsB,OAC/B,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,yBAAyB,EAAE,IAAI;AAAA,IAC5E,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,SAAO,WAAW,CAAC,aAAa,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,EAAE,CAAC;AACjF,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,yBAAyB,EAAE,IAAI;AAAA,IAC5E,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,WAAW,CAAC,aAAa,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,EAAE,CAAC;AACjF,CAAC;;;ADDU,IAAAC,sBAAA;AAhCX,IAAM,oBAAgB,6BAA8C,MAAS;AAEtE,IAAM,iBAAiB,CAAC,EAAE,SAAS,SAAS,MAA2B;AAC1E,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA0B,CAAC,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,mBAAe,2BAAY,MAAM,oBAAoB,SAAS,GAAG,CAAC,SAAS,CAAC;AAClF,QAAM,mBAAe,2BAAY,CAAC,OAAe,oBAAoB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAChG,QAAM,oBAAgB,2BAAY,CAAC,OAAe,qBAAqB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAElG,QAAM,YAAQ,uBAA4B,OAAO;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,cAAc,eAAe,OAAO,cAAc,SAAS,WAAW,OAAO,CAAC;AAEnF,SAAO,6CAAC,cAAc,UAAd,EAAuB,OAAe,UAAS;AAC3D;AAEO,IAAM,aAAa,MAA0B;AAChD,QAAM,cAAU,0BAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACtE;AAEA,SAAO;AACX;;;AEzEA,IAAAC,gBAMO;;;ACYP,IAAM,aAAa,CAAC,OAAkB,YAAgC;AAClE,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,uBAAuB,OAChC,QACA,UACqB,oBAAoB,QAAQ,YAAY;AAC7D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,OAAO,SAAS;AAChB,WAAO,IAAI,WAAW,MAAM,OAAO;AAAA,EACvC;AACA,MAAI,OAAO,MAAM;AACb,WAAO,IAAI,QAAQ,MAAM,IAAI;AAAA,EACjC;AACA,MAAI,OAAO,UAAU;AACjB,WAAO,IAAI,YAAY,MAAM,QAAQ;AAAA,EACzC;AAEA,QAAM,MAAM,OAAO,SAAS,IACtB,GAAG,iBAAiB,iBAAiB,OAAO,SAAS,CAAC,KACtD,GAAG,iBAAiB;AAE1B,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAC9B,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAoB,QAAQ;AAClD,MAAI,SAAS;AACT,WAAO,YAAY,OAAO;AAC1B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,OAC0B,oBAAoB,QAAQ,YAAY;AAClE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AACzB,WAAO,WAAW,IAAI;AACtB,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,SAAO,WAAW,OAAO;AACzB,SAAO,YAAY,CAAC,aAAa,WAAW,UAAU,OAAO,CAAC;AAC9D,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB;AAAA,IAC9D,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACvD,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,IACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,WAAW,UAAU,OAAO,CAAC;AAC9D,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,YAAY,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAC1E,SAAO,WAAW,CAAC,YAAa,SAAS,OAAO,KAAK,OAAO,OAAQ;AACxE,CAAC;AAEM,IAAM,wBAAwB,OACjC,QACA,OACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,SAAS;AAAA,IACzE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAClD;AAEA,SAAO,gBAAgB,QAAQ;AACnC,CAAC;AAEM,IAAM,2BAA2B,OACpC,QACA,IACA,SACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,OAAO,IAAI;AAE3B,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,SAAS;AAAA,IACzE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,IACtC,MAAM;AAAA,EACV,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AACJ,CAAC;;;ADxFU,IAAAC,sBAAA;AApEX,IAAM,qBAAiB,6BAA+C,MAAS;AAExE,IAAM,kBAAkB,CAAC,EAAE,SAAS,SAAS,MAA4B;AAC5E,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAoB,CAAC,CAAC;AACtD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAyB,IAAI;AAC3D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,oBAAgB;AAAA,IAClB,CAAC,UAAyB,qBAAqB,WAAW,KAAK;AAAA,IAC/D,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe,2BAAY,CAAC,OAAe,oBAAoB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAChG,QAAM,oBAAgB;AAAA,IAClB,CAAC,QAA8B,qBAAqB,WAAW,GAAG;AAAA,IAClE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB;AAAA,IAClB,CAAC,IAAY,QAA8B,qBAAqB,WAAW,IAAI,GAAG;AAAA,IAClF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB,2BAAY,CAAC,OAAe,qBAAqB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAClG,QAAM,qBAAiB,2BAAY,CAAC,OAAe,sBAAsB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AACpG,QAAM,wBAAoB;AAAA,IACtB,CAAC,IAAY,SAAe,yBAAyB,WAAW,IAAI,IAAI;AAAA,IACxE,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAA6B,OAAO;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC5D;AAEO,IAAM,cAAc,MAA2B;AAClD,QAAM,cAAU,0BAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AAEA,SAAO;AACX;;;AE7HA,IAAAC,gBAMO;;;ACKP,IAAMC,cAAa,CAAC,OAA4B,YAAoD;AAChG,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,uBAAuB,OAChC,QACA,cAC+B,oBAAoB,QAAQ,YAAY;AACvE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS;AAAA,IAC9C;AAAA,MACI,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,QAAM,UAAU,MAAM,SAA8B,QAAQ;AAC5D,MAAI,SAAS;AACT,WAAO,YAAY,OAAO;AAC1B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,WACA,QAC6B,oBAAoB,QAAQ,YAAY;AACrE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS;AAAA,IAC9C;AAAA,MACI,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,QAChC,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,GAAG;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,QAAM,UAAU,MAAM,SAA4B,QAAQ;AAC1D,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC9D;AAEA,SAAO,YAAY,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACvD,SAAO;AACX,CAAC;AAEM,IAAM,qBAAqB,OAC9B,QACA,WACA,IACA,QAC6B,oBAAoB,QAAQ,YAAY;AACrE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS,uBAAuB,EAAE;AAAA,IACvE;AAAA,MACI,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,QAChC,gBAAgB;AAAA,MACpB;AAAA,MACA,MAAM,KAAK,UAAU,GAAG;AAAA,IAC5B;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACxD;AAEA,QAAM,UAAU,MAAM,SAA4B,QAAQ;AAC1D,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AAEA,SAAO,YAAY,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC9D,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,WACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM;AAAA,IACnB,GAAG,iBAAiB,iBAAiB,SAAS,uBAAuB,EAAE;AAAA,IACvE;AAAA,MACI,QAAQ;AAAA,MACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C;AAAA,EACJ;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAC9E,CAAC;;;ADxCU,IAAAC,sBAAA;AAvDX,IAAM,wBAAoB,6BAAkD,MAAS;AAE9E,IAAM,qBAAqB,CAAC,EAAE,SAAS,SAAS,MAA+B;AAClF,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,UAAU,WAAW,QAAI,wBAA8B,CAAC,CAAC;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,oBAAgB;AAAA,IAClB,CAAC,cAAsB,qBAAqB,WAAW,SAAS;AAAA,IAChE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB;AAAA,IAClB,CAAC,WAAmB,QAA8B,qBAAqB,WAAW,WAAW,GAAG;AAAA,IAChG,CAAC,SAAS;AAAA,EACd;AACA,QAAM,kBAAc;AAAA,IAChB,CAAC,WAAmB,IAAY,QAA4B,mBAAmB,WAAW,WAAW,IAAI,GAAG;AAAA,IAC5G,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB;AAAA,IAClB,CAAC,WAAmB,OAAe,qBAAqB,WAAW,WAAW,EAAE;AAAA,IAChF,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAAgC,OAAO;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,kBAAkB,UAAlB,EAA2B,OAAe,UAAS;AAC/D;AAEO,IAAM,gBAAgB,MAA8B;AACvD,QAAM,cAAU,0BAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC5E;AAEA,SAAO;AACX;;;AEnGA,IAAAC,gBAMO;;;ACMP,IAAMC,cAAa,CAAC,OAAkB,YAAgC;AAClE,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,uBAAuB,OAAO,WAAiD;AAAA,EACxF;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB;AAAA,MAC9D,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC9C;AAEA,UAAM,UAAU,MAAM,SAAoB,QAAQ;AAClD,QAAI,SAAS;AACT,aAAO,YAAY,OAAO;AAC1B,aAAO;AAAA,IACX;AAEA,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,IAAM,sBAAsB,OAC/B,QACA,OAC0B,oBAAoB,QAAQ,YAAY;AAClE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AACzB,WAAO,WAAW,IAAI;AACtB,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,SAAO,WAAW,OAAO;AACzB,SAAO,YAAY,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC9D,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB;AAAA,IAC9D,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACvD,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,2BAA2B,OACpC,QACA,IACA,QACmB,oBAAoB,QAAQ,YAAY;AAC3D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,QAAM,UAAU,MAAM,SAAkB,QAAQ;AAChD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAEA,SAAO,YAAY,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC9D,SAAO,WAAW,OAAO;AACzB,SAAO;AACX,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,EAAE,IAAI;AAAA,IACpE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,YAAY,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AAC1E,SAAO,WAAW,CAAC,YAAa,SAAS,OAAO,KAAK,OAAO,OAAQ;AACxE,CAAC;;;ADrDU,IAAAC,sBAAA;AAxDX,IAAM,qBAAiB,6BAA+C,MAAS;AAExE,IAAM,kBAAkB,CAAC,EAAE,SAAS,SAAS,MAA4B;AAC5E,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAoB,CAAC,CAAC;AACtD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAyB,IAAI;AAC3D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,oBAAgB,2BAAY,MAAM,qBAAqB,SAAS,GAAG,CAAC,SAAS,CAAC;AACpF,QAAM,mBAAe,2BAAY,CAAC,OAAe,oBAAoB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAChG,QAAM,oBAAgB;AAAA,IAClB,CAAC,QAA8B,qBAAqB,WAAW,GAAG;AAAA,IAClE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,wBAAoB;AAAA,IACtB,CAAC,IAAY,QAAkC,yBAAyB,WAAW,IAAI,GAAG;AAAA,IAC1F,CAAC,SAAS;AAAA,EACd;AACA,QAAM,oBAAgB,2BAAY,CAAC,OAAe,qBAAqB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAElG,QAAM,YAAQ,uBAA6B,OAAO;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC5D;AAEO,IAAM,cAAc,MAA2B;AAClD,QAAM,cAAU,0BAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AAEA,SAAO;AACX;;;AEvGA,IAAAC,gBAMO;;;ACQP,IAAMC,cAAa,CAAC,OAAsB,YAAwC;AAC9E,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,oBAAoB,OAC7B,QACA,cACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU;AAAA,IACjF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,SAAS;AACT,WAAO,SAAS,OAAO;AACvB,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,iBAAiB,OAC1B,QACA,WACA,QACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU;AAAA,IACjF,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAChD;AAEA,QAAM,UAAU,MAAM,SAAsB,QAAQ;AACpD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,gCAAgC;AAAA,EACpD;AAEA,SAAO,SAAS,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACpD,SAAO;AACX,CAAC;AAEM,IAAM,kBAAkB,OAC3B,QACA,WACA,QACA,QACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU,MAAM,IAAI;AAAA,IAC3F,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,6BAA6B;AAAA,EACjD;AAEA,QAAM,UAAU,MAAM,SAAsB,QAAQ;AACpD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACrD;AAEA,SAAO,SAAS,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC3D,SAAO;AACX,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,WACA,WACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,UAAU,MAAM,IAAI;AAAA,IAC3F,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,SAAO,SAAS,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,MAAM,CAAC;AAC/E,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,cACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY;AAAA,IACnF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,SAAS;AACT,WAAO,gBAAgB,OAAO;AAC9B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,4BAA4B,OACrC,QACA,cACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,kBAAkB;AAAA,IACzF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,uCAAuC;AAAA,EAC3D;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,SAAS;AACT,WAAO,sBAAsB,OAAO;AACpC,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,yBAAyB,OAClC,QACA,cACoC,oBAAoB,QAAQ,YAAY;AAC5E,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,eAAe;AAAA,IACtF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACvD;AAEA,QAAM,UAAU,MAAM,SAAmC,QAAQ;AACjE,MAAI,SAAS;AACT,WAAO,cAAc,OAAO;AAC5B,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;;;AD7DU,IAAAC,sBAAA;AAlFX,IAAM,yBAAqB,6BAAmD,MAAS;AAEhF,IAAM,sBAAsB,CAAC,EAAE,SAAS,SAAS,MAAgC;AACpF,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,CAAC,CAAC;AACpD,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAwB,CAAC,CAAC;AAClE,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAwB,CAAC,CAAC;AAC9E,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAmC,CAAC,CAAC;AACzE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,iBAAa,2BAAY,CAAC,cAAsB,kBAAkB,WAAW,SAAS,GAAG,CAAC,SAAS,CAAC;AAC1G,QAAM,cAAU;AAAA,IACZ,CAAC,WAAmB,QAAwB,eAAe,WAAW,WAAW,GAAG;AAAA,IACpF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,eAAW;AAAA,IACb,CAAC,WAAmB,QAAgB,QAAyB,gBAAgB,WAAW,WAAW,QAAQ,GAAG;AAAA,IAC9G,CAAC,SAAS;AAAA,EACd;AACA,QAAM,iBAAa;AAAA,IACf,CAAC,WAAmB,WAAmB,kBAAkB,WAAW,WAAW,MAAM;AAAA,IACrF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe;AAAA,IACjB,CAAC,cAAsB,oBAAoB,WAAW,SAAS;AAAA,IAC/D,CAAC,SAAS;AAAA,EACd;AACA,QAAM,yBAAqB;AAAA,IACvB,CAAC,cAAsB,0BAA0B,WAAW,SAAS;AAAA,IACrE,CAAC,SAAS;AAAA,EACd;AACA,QAAM,sBAAkB;AAAA,IACpB,CAAC,cAAsB,uBAAuB,WAAW,SAAS;AAAA,IAClE,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAAiC,OAAO;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,mBAAmB,UAAnB,EAA4B,OAAe,UAAS;AAChE;AAEO,IAAM,kBAAkB,MAA+B;AAC1D,QAAM,cAAU,0BAAW,kBAAkB;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC/E;AAEA,SAAO;AACX;;;AEvIA,IAAAC,gBAMO;;;ACKA,IAAM,sBAAsB,OAC/B,QACA,cAC2B,oBAAoB,QAAQ,YAAY;AACnE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY;AAAA,IACnF,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACrD;AAEA,QAAM,UAAU,MAAM,SAA0B,QAAQ;AACxD,MAAI,SAAS;AACT,WAAO,WAAW,OAAO;AACzB,WAAO;AAAA,EACX;AAEA,SAAO,CAAC;AACZ,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,WACA,QACyB,oBAAoB,QAAQ,YAAY;AACjE,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY;AAAA,IACnF,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,QAAM,UAAU,MAAM,SAAwB,QAAQ;AACtD,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAEA,SAAO,WAAW,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAC;AACtD,SAAO;AACX,CAAC;AAEM,IAAM,sBAAsB,OAC/B,QACA,WACA,WACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,iBAAiB,SAAS,YAAY,MAAM,IAAI;AAAA,IAC7F,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAEA,SAAO,WAAW,CAAC,aAAa,SAAS,OAAO,CAAC,WAAW,OAAO,KAAK,OAAO,MAAM,CAAC;AAC1F,CAAC;;;ADJU,IAAAC,sBAAA;AAzCX,IAAM,2BAAuB,6BAAqD,MAAS;AAEpF,IAAM,wBAAwB,CAAC,EAAE,SAAS,SAAS,MAAkC;AACxF,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA0B,CAAC,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,mBAAe;AAAA,IACjB,CAAC,cAAsB,oBAAoB,WAAW,SAAS;AAAA,IAC/D,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe;AAAA,IACjB,CAAC,WAAmB,QAA6B,oBAAoB,WAAW,WAAW,GAAG;AAAA,IAC9F,CAAC,SAAS;AAAA,EACd;AACA,QAAM,mBAAe;AAAA,IACjB,CAAC,WAAmB,WAAmB,oBAAoB,WAAW,WAAW,MAAM;AAAA,IACvF,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAAmC,OAAO;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,OAAO,cAAc,cAAc,SAAS,WAAW,SAAS,YAAY,CAAC;AAElF,SAAO,6CAAC,qBAAqB,UAArB,EAA8B,OAAe,UAAS;AAClE;AAEO,IAAM,oBAAoB,MAAiC;AAC9D,QAAM,cAAU,0BAAW,oBAAoB;AAC/C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACnF;AAEA,SAAO;AACX;;;AEnFA,IAAAC,gBAMO;;;ACMP,IAAMC,cAAa,CAAC,OAAe,YAA0B;AACzD,QAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE;AAC9D,MAAI,UAAU,IAAI;AACd,WAAO,CAAC,SAAS,GAAG,KAAK;AAAA,EAC7B;AAEA,QAAM,OAAO,CAAC,GAAG,KAAK;AACtB,OAAK,KAAK,IAAI;AACd,SAAO;AACX;AAEO,IAAM,oBAAoB,OAAO,WAA2C;AAAA,EAC/E;AAAA,EACA,YAAY;AACR,UAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc;AAAA,MAC3D,SAAS,iBAAiB,OAAO,KAAK;AAAA,IAC1C,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,uBAAuB;AAAA,IAC3C;AAEA,UAAM,UAAU,MAAM,SAAiB,QAAQ;AAC/C,QAAI,SAAS;AACT,aAAO,SAAS,OAAO;AACvB,aAAO;AAAA,IACX;AAEA,WAAO,CAAC;AAAA,EACZ;AACJ;AAEO,IAAM,mBAAmB,OAC5B,QACA,OACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,IAAI;AAAA,IACjE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AACzB,WAAO,QAAQ,IAAI;AACnB,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,sBAAsB;AAAA,EAC1C;AAEA,QAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAChD;AAEA,SAAO,QAAQ,OAAO;AACtB,SAAO,SAAS,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC3D,SAAO;AACX,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,IACA,QACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,IAAI;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,GAAG,iBAAiB,OAAO,KAAK;AAAA,MAChC,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC5B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,uBAAuB;AAAA,EAC3C;AAEA,QAAM,UAAU,MAAM,SAAe,QAAQ;AAC7C,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACvD;AAEA,SAAO,SAAS,CAAC,aAAaA,YAAW,UAAU,OAAO,CAAC;AAC3D,SAAO,QAAQ,OAAO;AACtB,SAAO;AACX,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,OACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,IAAI;AAAA,IACjE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,uBAAuB;AAAA,EAC3C;AAEA,SAAO,SAAS,CAAC,aAAa,SAAS,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;AACvE,SAAO,QAAQ,CAAC,YAAa,SAAS,OAAO,KAAK,OAAO,OAAQ;AACrE,CAAC;AAEM,IAAM,oBAAoB,OAC7B,QACA,OACuB,oBAAoB,QAAQ,YAAY;AAC/D,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,QAAQ;AAAA,IACrE,SAAS,iBAAiB,OAAO,KAAK;AAAA,EAC1C,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AAEA,SAAO,gBAAgB,QAAQ;AACnC,CAAC;AAEM,IAAM,uBAAuB,OAChC,QACA,IACA,SACgB,oBAAoB,QAAQ,YAAY;AACxD,QAAM,oBAAoB,iBAAiB,OAAO,OAAO;AACzD,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,OAAO,IAAI;AAE3B,QAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,cAAc,EAAE,QAAQ;AAAA,IACrE,QAAQ;AAAA,IACR,SAAS,iBAAiB,OAAO,KAAK;AAAA,IACtC,MAAM;AAAA,EACV,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACd,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC/C;AACJ,CAAC;;;ADxDU,IAAAC,sBAAA;AA3DX,IAAM,kBAAc,6BAA4C,MAAS;AAElE,IAAM,eAAe,CAAC,EAAE,SAAS,SAAS,MAAyB;AACtE,QAAM,EAAE,MAAM,IAAI,QAAQ;AAC1B,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAiB,CAAC,CAAC;AAC7C,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAsB,IAAI;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,gBAAY,uBAAQ,OAAO;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI,CAAC,SAAS,KAAK,CAAC;AAEpB,QAAM,iBAAa,2BAAY,MAAM,kBAAkB,SAAS,GAAG,CAAC,SAAS,CAAC;AAC9E,QAAM,gBAAY,2BAAY,CAAC,OAAe,iBAAiB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAC1F,QAAM,iBAAa;AAAA,IACf,CAAC,IAAY,QAA+B,kBAAkB,WAAW,IAAI,GAAG;AAAA,IAChF,CAAC,SAAS;AAAA,EACd;AACA,QAAM,iBAAa,2BAAY,CAAC,OAAe,kBAAkB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAC5F,QAAM,iBAAa,2BAAY,CAAC,OAAe,kBAAkB,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC;AAC5F,QAAM,oBAAgB;AAAA,IAClB,CAAC,IAAY,SAAe,qBAAqB,WAAW,IAAI,IAAI;AAAA,IACpE,CAAC,SAAS;AAAA,EACd;AAEA,QAAM,YAAQ,uBAA0B,OAAO;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAED,SAAO,6CAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACzD;AAEO,IAAM,WAAW,MAAwB;AAC5C,QAAM,cAAU,0BAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AAEA,SAAO;AACX;","names":["import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","updateById","import_jsx_runtime","import_react","import_jsx_runtime","import_react","updateById","import_jsx_runtime"]}
@@ -0,0 +1,339 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+
4
+ type BaseErrorResponse = {
5
+ success: false;
6
+ message: string;
7
+ };
8
+ type EmptyResponse = Record<string, never>;
9
+ type ErrorResponse = {
10
+ error: string;
11
+ };
12
+ type FieldErrorMap = Record<string, string>;
13
+ type ImageResponse = ArrayBuffer;
14
+
15
+ type User = {
16
+ id: number;
17
+ username: string;
18
+ admin: boolean;
19
+ };
20
+ type Storage = {
21
+ id: number;
22
+ name: string;
23
+ owner: User;
24
+ };
25
+ type Product = {
26
+ id: number;
27
+ ownerId: number;
28
+ name: string;
29
+ category: string;
30
+ expirationDaysDelta: number;
31
+ barcode: string | null;
32
+ };
33
+ type StorageItem = {
34
+ id: number;
35
+ product: Product;
36
+ expiresAt: string;
37
+ createdAt: string;
38
+ };
39
+ type StorageMember = {
40
+ id: number;
41
+ storage: Storage;
42
+ user: User;
43
+ accepted: boolean;
44
+ };
45
+ type RunningLowSetting = {
46
+ id: number;
47
+ storage: Storage;
48
+ product: Product;
49
+ runningLow: number;
50
+ };
51
+ type RunningLowNotification = {
52
+ storage: Storage;
53
+ product: Product;
54
+ runningLowAt: number;
55
+ amount: number;
56
+ };
57
+
58
+ type LoginRequest = {
59
+ email: string;
60
+ password: string;
61
+ };
62
+ type LoginSuccessResponse = {
63
+ token: string;
64
+ };
65
+ type LoginErrorResponse = ErrorResponse;
66
+ type LoginResponse = LoginSuccessResponse | LoginErrorResponse;
67
+ type SignupRequest = {
68
+ email: string;
69
+ username: string;
70
+ password: string;
71
+ passwordRepeat: string;
72
+ };
73
+ type ChangePasswordRequest = {
74
+ oldPassword: string;
75
+ newPassword: string;
76
+ newPasswordRepeat: string;
77
+ };
78
+ type SignupError = FieldErrorMap;
79
+ type SignupResponse = User | SignupError | EmptyResponse;
80
+ type LogoutErrorResponse = ErrorResponse;
81
+ type LogoutResponse = EmptyResponse | LogoutErrorResponse;
82
+ type ChangePasswordErrorResponse = {
83
+ oldPassword?: string;
84
+ newPasswordRepeat?: string;
85
+ };
86
+ type ChangePasswordResponse = EmptyResponse | ChangePasswordErrorResponse;
87
+ type GetMeResponse = User;
88
+
89
+ type ProductListResponse = Product[];
90
+ type ProductResponse = Product | EmptyResponse;
91
+ type ProductIconResponse = ImageResponse;
92
+ type ProductUploadIconError = ErrorResponse | {
93
+ pfp: string;
94
+ };
95
+ type ProductUploadIconResponse = EmptyResponse | ProductUploadIconError;
96
+ type ProductCreateResponse = Product | FieldErrorMap | EmptyResponse;
97
+ type ProductUpdateResponse = Product | FieldErrorMap | EmptyResponse;
98
+ type ProductDeleteResponse = EmptyResponse;
99
+
100
+ type RunningLowSettingListResponse = RunningLowSetting[];
101
+ type RunningLowSettingResponse = RunningLowSetting | EmptyResponse;
102
+ type RunningLowCreateResponse = RunningLowSetting | FieldErrorMap | EmptyResponse;
103
+ type RunningLowEditResponse = RunningLowSetting | FieldErrorMap | EmptyResponse;
104
+ type RunningLowDeleteResponse = EmptyResponse;
105
+ type RunningLowNotificationListResponse = RunningLowNotification[];
106
+
107
+ type CreateProductRequest = {
108
+ name: string;
109
+ category: string;
110
+ barcode?: string;
111
+ expirationDaysDelta: number;
112
+ };
113
+ type UpdateProductRequest = {
114
+ name?: string;
115
+ category?: string;
116
+ barcode?: string;
117
+ expirationDaysDelta?: number;
118
+ };
119
+ type CreateSettingRequest = {
120
+ productId: number;
121
+ runningLow: number;
122
+ };
123
+ type EditSettingRequest = {
124
+ runningLow: number;
125
+ };
126
+ type AddItemRequest = {
127
+ productId: number;
128
+ expiresAt: string;
129
+ };
130
+ type EditItemRequest = {
131
+ expiresAt?: string;
132
+ };
133
+ type CreateStorageRequest = {
134
+ name: string;
135
+ };
136
+ type ChangeStorageNameRequest = {
137
+ name: string;
138
+ };
139
+ type InviteMemberRequest = {
140
+ email: string;
141
+ };
142
+ type ChangeUserDataRequest = {
143
+ email?: string;
144
+ username?: string;
145
+ isAdmin?: boolean;
146
+ };
147
+
148
+ type StorageListResponse = Storage[];
149
+ type StorageResponse = Storage | EmptyResponse;
150
+ type StorageCreateResponse = Storage | FieldErrorMap | EmptyResponse;
151
+ type StorageChangeNameResponse = Storage | FieldErrorMap | EmptyResponse;
152
+ type StorageDeleteResponse = EmptyResponse;
153
+ type StorageItemListResponse = StorageItem[];
154
+ type StorageItemResponse = StorageItem | EmptyResponse;
155
+ type StorageItemAddResponse = StorageItem | FieldErrorMap | EmptyResponse;
156
+ type StorageItemEditResponse = StorageItem | FieldErrorMap | EmptyResponse;
157
+ type StorageItemDeleteResponse = EmptyResponse;
158
+ type StorageExpiredItemsResponse = StorageItem[];
159
+ type StorageAboutToExpireItemsResponse = StorageItem[];
160
+ type StorageRunningLowResponse = RunningLowNotification[];
161
+ type StorageMemberListResponse = StorageMember[];
162
+ type StorageMemberResponse = StorageMember | EmptyResponse;
163
+ type StorageMemberInviteResponse = StorageMember | FieldErrorMap | EmptyResponse;
164
+ type StorageMemberDeleteResponse = EmptyResponse | FieldErrorMap;
165
+ type InviteListResponse = StorageMember[];
166
+ type InviteAcceptResponse = EmptyResponse;
167
+ type InviteDeclineResponse = EmptyResponse;
168
+
169
+ type UserListResponse = User[];
170
+ type UserResponse = User | EmptyResponse;
171
+ type UserPfpResponse = ImageResponse;
172
+ type UserUploadPfpResponse = EmptyResponse | FieldErrorMap | string;
173
+ type UserDeleteResponse = EmptyResponse;
174
+ type UserUpdateResponse = User | FieldErrorMap | EmptyResponse;
175
+
176
+ type AuthContextValue = {
177
+ token: string | null;
178
+ user: User | null;
179
+ isLoading: boolean;
180
+ isError: boolean;
181
+ error: Error | null;
182
+ login: (dto: LoginRequest) => Promise<void>;
183
+ signup: (dto: SignupRequest) => Promise<User>;
184
+ changePassword: (dto: ChangePasswordRequest) => Promise<void>;
185
+ getMe: () => Promise<User | null>;
186
+ logout: () => Promise<void>;
187
+ getToken: () => string | null;
188
+ };
189
+ type AuthProviderProps = {
190
+ baseUrl: string;
191
+ children: React.ReactNode;
192
+ initialToken?: string | null;
193
+ };
194
+ declare const AuthProvider: ({ baseUrl, children, initialToken }: AuthProviderProps) => react_jsx_runtime.JSX.Element;
195
+ declare const useAuth: () => AuthContextValue;
196
+
197
+ declare const normalizeBaseUrl: (baseUrl: string) => string;
198
+ declare const buildAuthHeaders: (token: string | null) => HeadersInit;
199
+ declare const readJson: <T>(response: Response) => Promise<T | null>;
200
+ declare const readArrayBuffer: (response: Response) => Promise<ArrayBuffer>;
201
+
202
+ type InviteContextValue = {
203
+ invites: StorageMember[];
204
+ isLoading: boolean;
205
+ isError: boolean;
206
+ error: Error | null;
207
+ fetchInvites: () => Promise<StorageMember[]>;
208
+ acceptInvite: (id: number) => Promise<void>;
209
+ declineInvite: (id: number) => Promise<void>;
210
+ };
211
+ type InviteProviderProps = {
212
+ baseUrl: string;
213
+ children: React.ReactNode;
214
+ };
215
+ declare const InviteProvider: ({ baseUrl, children }: InviteProviderProps) => react_jsx_runtime.JSX.Element;
216
+ declare const useInvites: () => InviteContextValue;
217
+
218
+ type ProductQuery = {
219
+ barcode?: string;
220
+ name?: string;
221
+ category?: string;
222
+ };
223
+ type ProductContextValue = {
224
+ products: Product[];
225
+ product: Product | null;
226
+ isLoading: boolean;
227
+ isError: boolean;
228
+ error: Error | null;
229
+ fetchProducts: (query?: ProductQuery) => Promise<Product[]>;
230
+ fetchProduct: (id: number) => Promise<Product | null>;
231
+ createProduct: (dto: CreateProductRequest) => Promise<Product>;
232
+ updateProduct: (id: number, dto: UpdateProductRequest) => Promise<Product>;
233
+ deleteProduct: (id: number) => Promise<void>;
234
+ getProductIcon: (id: number) => Promise<ArrayBuffer>;
235
+ uploadProductIcon: (id: number, file: Blob) => Promise<void>;
236
+ };
237
+ type ProductProviderProps = {
238
+ baseUrl: string;
239
+ children: React.ReactNode;
240
+ };
241
+ declare const ProductProvider: ({ baseUrl, children }: ProductProviderProps) => react_jsx_runtime.JSX.Element;
242
+ declare const useProducts: () => ProductContextValue;
243
+
244
+ type RunningLowContextValue = {
245
+ settings: RunningLowSetting[];
246
+ isLoading: boolean;
247
+ isError: boolean;
248
+ error: Error | null;
249
+ fetchSettings: (storageId: number) => Promise<RunningLowSetting[]>;
250
+ createSetting: (storageId: number, dto: CreateSettingRequest) => Promise<RunningLowSetting>;
251
+ editSetting: (storageId: number, id: number, dto: EditSettingRequest) => Promise<RunningLowSetting>;
252
+ deleteSetting: (storageId: number, id: number) => Promise<void>;
253
+ };
254
+ type RunningLowProviderProps = {
255
+ baseUrl: string;
256
+ children: React.ReactNode;
257
+ };
258
+ declare const RunningLowProvider: ({ baseUrl, children }: RunningLowProviderProps) => react_jsx_runtime.JSX.Element;
259
+ declare const useRunningLow: () => RunningLowContextValue;
260
+
261
+ type StorageContextValue = {
262
+ storages: Storage[];
263
+ storage: Storage | null;
264
+ isLoading: boolean;
265
+ isError: boolean;
266
+ error: Error | null;
267
+ fetchStorages: () => Promise<Storage[]>;
268
+ fetchStorage: (id: number) => Promise<Storage | null>;
269
+ createStorage: (dto: CreateStorageRequest) => Promise<Storage>;
270
+ changeStorageName: (id: number, dto: ChangeStorageNameRequest) => Promise<Storage>;
271
+ deleteStorage: (id: number) => Promise<void>;
272
+ };
273
+ type StorageProviderProps = {
274
+ baseUrl: string;
275
+ children: React.ReactNode;
276
+ };
277
+ declare const StorageProvider: ({ baseUrl, children }: StorageProviderProps) => react_jsx_runtime.JSX.Element;
278
+ declare const useStorages: () => StorageContextValue;
279
+
280
+ type StorageItemContextValue = {
281
+ items: StorageItem[];
282
+ expiredItems: StorageItem[];
283
+ aboutToExpireItems: StorageItem[];
284
+ runningLow: RunningLowNotification[];
285
+ isLoading: boolean;
286
+ isError: boolean;
287
+ error: Error | null;
288
+ fetchItems: (storageId: number) => Promise<StorageItem[]>;
289
+ addItem: (storageId: number, dto: AddItemRequest) => Promise<StorageItem>;
290
+ editItem: (storageId: number, itemId: number, dto: EditItemRequest) => Promise<StorageItem>;
291
+ deleteItem: (storageId: number, itemId: number) => Promise<void>;
292
+ fetchExpired: (storageId: number) => Promise<StorageItem[]>;
293
+ fetchAboutToExpire: (storageId: number) => Promise<StorageItem[]>;
294
+ fetchRunningLow: (storageId: number) => Promise<RunningLowNotification[]>;
295
+ };
296
+ type StorageItemProviderProps = {
297
+ baseUrl: string;
298
+ children: React.ReactNode;
299
+ };
300
+ declare const StorageItemProvider: ({ baseUrl, children }: StorageItemProviderProps) => react_jsx_runtime.JSX.Element;
301
+ declare const useStorageItems: () => StorageItemContextValue;
302
+
303
+ type StorageMemberContextValue = {
304
+ members: StorageMember[];
305
+ isLoading: boolean;
306
+ isError: boolean;
307
+ error: Error | null;
308
+ fetchMembers: (storageId: number) => Promise<StorageMember[]>;
309
+ inviteMember: (storageId: number, dto: InviteMemberRequest) => Promise<StorageMember>;
310
+ removeMember: (storageId: number, userId: number) => Promise<void>;
311
+ };
312
+ type StorageMemberProviderProps = {
313
+ baseUrl: string;
314
+ children: React.ReactNode;
315
+ };
316
+ declare const StorageMemberProvider: ({ baseUrl, children }: StorageMemberProviderProps) => react_jsx_runtime.JSX.Element;
317
+ declare const useStorageMembers: () => StorageMemberContextValue;
318
+
319
+ type UserContextValue = {
320
+ users: User[];
321
+ user: User | null;
322
+ isLoading: boolean;
323
+ isError: boolean;
324
+ error: Error | null;
325
+ fetchUsers: () => Promise<User[]>;
326
+ fetchUser: (id: number) => Promise<User | null>;
327
+ updateUser: (id: number, dto: ChangeUserDataRequest) => Promise<User>;
328
+ deleteUser: (id: number) => Promise<void>;
329
+ getUserPfp: (id: number) => Promise<ArrayBuffer>;
330
+ uploadUserPfp: (id: number, file: Blob) => Promise<void>;
331
+ };
332
+ type UserProviderProps = {
333
+ baseUrl: string;
334
+ children: React.ReactNode;
335
+ };
336
+ declare const UserProvider: ({ baseUrl, children }: UserProviderProps) => react_jsx_runtime.JSX.Element;
337
+ declare const useUsers: () => UserContextValue;
338
+
339
+ export { type AddItemRequest, type AuthContextValue, AuthProvider, type BaseErrorResponse, type ChangePasswordErrorResponse, type ChangePasswordRequest, type ChangePasswordResponse, type ChangeStorageNameRequest, type ChangeUserDataRequest, type CreateProductRequest, type CreateSettingRequest, type CreateStorageRequest, type EditItemRequest, type EditSettingRequest, type EmptyResponse, type ErrorResponse, type FieldErrorMap, type GetMeResponse, type ImageResponse, type InviteAcceptResponse, type InviteDeclineResponse, type InviteListResponse, type InviteMemberRequest, InviteProvider, type LoginErrorResponse, type LoginRequest, type LoginResponse, type LoginSuccessResponse, type LogoutErrorResponse, type LogoutResponse, type Product, type ProductCreateResponse, type ProductDeleteResponse, type ProductIconResponse, type ProductListResponse, ProductProvider, type ProductResponse, type ProductUpdateResponse, type ProductUploadIconError, type ProductUploadIconResponse, type RunningLowCreateResponse, type RunningLowDeleteResponse, type RunningLowEditResponse, type RunningLowNotification, type RunningLowNotificationListResponse, RunningLowProvider, type RunningLowSetting, type RunningLowSettingListResponse, type RunningLowSettingResponse, type SignupError, type SignupRequest, type SignupResponse, type Storage, type StorageAboutToExpireItemsResponse, type StorageChangeNameResponse, type StorageCreateResponse, type StorageDeleteResponse, type StorageExpiredItemsResponse, type StorageItem, type StorageItemAddResponse, type StorageItemDeleteResponse, type StorageItemEditResponse, type StorageItemListResponse, StorageItemProvider, type StorageItemResponse, type StorageListResponse, type StorageMember, type StorageMemberDeleteResponse, type StorageMemberInviteResponse, type StorageMemberListResponse, StorageMemberProvider, type StorageMemberResponse, StorageProvider, type StorageResponse, type StorageRunningLowResponse, type UpdateProductRequest, type User, type UserDeleteResponse, type UserListResponse, type UserPfpResponse, UserProvider, type UserResponse, type UserUpdateResponse, type UserUploadPfpResponse, buildAuthHeaders, normalizeBaseUrl, readArrayBuffer, readJson, useAuth, useInvites, useProducts, useRunningLow, useStorageItems, useStorageMembers, useStorages, useUsers };