()
-
- const {
- visible: infusionModal,
- setVisible: setInfusionModalVisible,
- bindings: infusionModalBindings,
- } = useModal(false)
-
- const filteredInfusions = filterInfusions(infusions, filterYear)
-
- // useEffect(() => {
- // // TODO: Replace this with lodash solution
- // // chunk data in sets of 25
- // if (filteredInfusions) {
- // const chunkedInfusions = chunk(filteredInfusions, 25)
- // setChunkedInfusions(chunkedInfusions)
- // }
- // }, [filteredInfusions])
-
- if (status === FirestoreStatusType.LOADING) {
- return (
- <>
-
-
-
- Loading treatment data
-
- >
- )
- }
-
- if (error) {
- console.error('Error fetching infusions:', error)
- return (
-
- Oops, the database didn’t respond. Refresh the page to try again.
-
- )
- }
-
- if (status === FirestoreStatusType.ERROR && !error) {
- return (
-
- Something went wrong accessing your treatment data. Refresh the page to
- try again.
-
- )
- }
-
- const deleteRow = (uid: string) => {
- deleteInfusion(uid)
- .then(() => {
- setToast({
- text: 'Treatment deleted.',
- type: 'success',
- delay: 5000,
- })
- })
- .catch((error: unknown) =>
- setToast({
- text: `Something went wrong: ${error instanceof Error ? error.message : String(error)}`,
- type: 'error',
- delay: 10000,
- })
- )
- }
-
- function formatInfusionRow(infusion: TreatmentType) {
- const { cause, sites, uid } = infusion
-
- const parsedDate = parseISO(infusion.date)
- const date = format(parsedDate, 'MM/dd/yyyy')
-
- const type = (
-
- {TreatmentTypeEnum[infusion.type]}
-
- )
- const factorBrand = infusion.medication.brand
- const units = infusion.medication.units && `${infusion.medication.units} iu`
-
- const moreMenu = () => {
- const content = (
- <>
-
- {
- setSelectedInfusion(infusion)
- setInfusionModalVisible(true)
- }}
- auto
- >
- Update
-
-
-
-
- infusion.uid && deleteRow(infusion.uid)}
- auto
- type='success-light'
- >
- Delete
-
-
-
- >
- )
-
- return (
- // @ts-expect-error - Popover content prop has a type conflict with HTML content attribute
-
-
-
- )
- }
-
- return {
- uid,
- date,
- type,
- sites,
- cause,
- factorBrand,
- units,
- moreMenu: moreMenu(),
- }
- }
-
- // TODO(michael) add more sorting filters
- // sort by date, most recent at the top
- filteredInfusions.sort((a, b) => b.date.localeCompare(a.date))
-
- const rowData = filteredInfusions.map((infusion) =>
- formatInfusionRow(infusion)
- )
-
- // only shows more menu when the logged in user is viewing their own data
- let isLoggedInUser = false
- if (user) {
- if (!uid) {
- isLoggedInUser = true
- }
-
- // if (uid && uid === user.uid) {
- // isLoggedInUser = true
- // }
- }
-
- return (
- <>
-
-
-
-
-
-
-
-
- {isLoggedInUser && }
-
- {filteredInfusions.length === 0 && (
- <>
-
-
- No treatments found. Add one by clicking ’New Treatment’ above.
-
-
- >
- )}
- {filteredInfusions.length >= 25 && (
- <>
-
-
-
-
-
-
-
-
-
-
-
- >
- )}
-
- {isLoggedInUser && (
-
- )}
- >
- )
-}
-
-const StyledTableWrapper = styled.div`
- overflow-x: scroll;
-`
diff --git a/components/loadingScreen.tsx b/components/loadingScreen.tsx
deleted file mode 100644
index e483c4b..0000000
--- a/components/loadingScreen.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Loading } from '@geist-ui/react'
-import styled from 'styled-components'
-
-const LoadingScreen = () => {
- return (
-
- Loading
-
- )
-}
-
-const StyledLoading = styled.div`
- margin: 0 auto;
- height: 100vh;
-`
-
-export default LoadingScreen
diff --git a/components/logo.tsx b/components/logo.tsx
deleted file mode 100644
index 39cb982..0000000
--- a/components/logo.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { useMediaQuery } from '@geist-ui/react'
-import Image from 'next/image'
-import Link from 'next/link'
-
-export default function Logo(): JSX.Element {
- const isMobile = useMediaQuery('xs', { match: 'down' })
-
- return (
-
- {/** biome-ignore lint/a11y/useValidAnchor: href provided by Link */}
-
-
-
-
- )
-}
diff --git a/components/profilePage.tsx b/components/profilePage.tsx
deleted file mode 100644
index 7c9c0db..0000000
--- a/components/profilePage.tsx
+++ /dev/null
@@ -1,219 +0,0 @@
-import { useEffect, useCallback, useState } from 'react'
-import { useRouter } from 'next/router'
-import {
- Grid,
- Text,
- Spacer,
- Snippet,
- Button,
- useToasts,
- Modal,
- useModal,
-} from '@geist-ui/react'
-
-import EmergencyCard from 'components/emergencyCard'
-import EmergencySnippet from 'components/emergencySnippet'
-import SettingsForm from 'components/settingsForm'
-import { useAuth } from 'lib/auth'
-import { updateUser } from 'lib/db/users'
-import { generateUniqueString, track } from 'lib/helpers'
-import useDbUser from 'lib/hooks/useDbUser'
-
-const ProfilePage = (): JSX.Element => {
- const { user, signout } = useAuth()
- const { person } = useDbUser(user?.uid || '')
- const router = useRouter()
- const [, setToast] = useToasts()
- const { visible, setVisible, bindings } = useModal()
- const [isDeletingAccount, setIsDeletingAccount] = useState(false)
-
- track('Viewed Profile Page')
-
- const handleOnPrintClick = () => {
- track('Clicked Print Button', { page: '/profile' })
- router.push('/emergency/print')
- }
-
- const handleUpdateUserApiKey = useCallback(async () => {
- const newApiKey = await generateUniqueString(20)
- updateUser(user?.uid || '', { apiKey: newApiKey })
- .then(() => {
- setToast({
- text: 'API key updated!',
- type: 'success',
- delay: 5000,
- })
- })
- .catch((error) =>
- setToast({
- text: `Something went wrong: ${error}`,
- type: 'error',
- delay: 10000,
- })
- )
- }, [setToast, user])
-
- // biome-ignore lint/correctness/useExhaustiveDependencies: user is needed here
- useEffect(() => {
- if (person && !person.apiKey) {
- handleUpdateUserApiKey()
- }
- }, [user, person, handleUpdateUserApiKey])
-
- const handleDeleteAccount = async () => {
- if (!user?.token) {
- setToast({
- text: 'Unable to delete account. Please sign in again and retry.',
- type: 'error',
- delay: 8000,
- })
- return
- }
-
- try {
- setIsDeletingAccount(true)
- track('Confirmed Delete Account')
- const response = await fetch('/api/delete-account', {
- method: 'DELETE',
- headers: {
- token: user.token,
- },
- })
-
- if (!response.ok) {
- const errorMessage = await response.text()
- throw new Error(errorMessage || 'Unable to delete account.')
- }
-
- setToast({
- text: 'Your account has been deleted. Thank you for trying Hemolog.',
- type: 'success',
- delay: 8000,
- })
- setVisible(false)
- await signout?.()
- } catch (error: unknown) {
- const errorMessage =
- error instanceof Error
- ? error.message
- : 'Failed to delete account. Please try again.'
- setToast({
- text: errorMessage,
- type: 'error',
- delay: 8000,
- })
- } finally {
- setIsDeletingAccount(false)
- }
- }
-
- return (
-
-
- About you
-
-
-
- API key
-
-
-
-
- Reset key
-
-
-
- Used to access the (limited) Hemolog API. No documenation exists yet
- but you can find more info inside the readme on Github.
-
-
-
-
- In case of emergency
-
- A medical worker can simply type in the URL listed on the card, or
- eaiser scan the QR code with their phone. This gives the worker a
- quick summary of all your info including your 3 most recent logs, and
- emergency contacts. These features aren’t available with Medic Alert.
-
-
-
-
-
- Print your card
-
-
- {/*
-
-
-
-
-
- Print your card
-
-
- */}
-
-
-
- Delete account
-
- Deleting your account removes your profile, infusions, and emergency
- info forever. This action cannot be undone.
-
-
- {
- track('Opened Delete Account Modal')
- setVisible(true)
- }}
- >
- Delete account
-
-
-
- Delete your account?
-
-
- This permanently deletes your Hemolog data and cannot be reversed.
- You will need to create a new account to return.
-
-
- setVisible(false)}>
- Cancel
-
-
- Delete account
-
-
-
- )
-}
-
-export default ProfilePage
diff --git a/components/settingsForm.tsx b/components/settingsForm.tsx
deleted file mode 100644
index 7816f00..0000000
--- a/components/settingsForm.tsx
+++ /dev/null
@@ -1,265 +0,0 @@
-import { useState } from 'react'
-import { useFormik } from 'formik'
-import {
- Input,
- Button,
- Text,
- Spacer,
- useToasts,
- Grid,
- AutoComplete,
-} from '@geist-ui/react'
-
-import { useAuth } from 'lib/auth'
-import useDbUser from 'lib/hooks/useDbUser'
-import { updateUser } from 'lib/db/users'
-import { track } from 'lib/helpers'
-
-const SettingsForm = (): JSX.Element => {
- const { user } = useAuth()
- const [, setToast] = useToasts()
- const { person } = useDbUser(user?.uid || '')
-
- const formik = useFormik({
- initialValues: {
- hemophiliaType: person ? person.hemophiliaType : '',
- severity: person ? person.severity : '',
- factor: person ? person.factor : '',
- medication: person ? person.medication : '',
- monoclonalAntibody: person ? person.monoclonalAntibody : '',
- injectionFrequency: person ? person.injectionFrequency : '',
- // emergencyContacts: [
- // {
- // name: '',
- // phone: '',
- // },
- // ],
- },
- enableReinitialize: true,
- onSubmit: (values) => {
- updateUser(user?.uid || '', values)
- .then(() => {
- setToast({
- text: 'Profile updated!',
- type: 'success',
- delay: 5000,
- })
- })
- .catch((error) => {
- console.error(error)
- setToast({
- text: `Something went wrong: ${error}`,
- type: 'error',
- delay: 10000,
- })
- })
- },
- })
-
- const severityOptions = [
- { label: 'Mild', value: 'Mild' },
- { label: 'Moderate', value: 'Moderate' },
- { label: 'Severe', value: 'Severe' },
- ]
-
- const hemophiliaTypeOptions = [
- { label: 'A', value: 'A' },
- { label: 'B', value: 'B' },
- { label: 'Von Willebrand Disease', value: 'Von Willebrand Disease' },
- ]
-
- const factorOptions = [
- { label: 'Advate', value: 'Advate' },
- { label: 'Adynovate', value: 'Adynovate' },
- { label: 'Afstyla', value: 'Afstyla' },
- { label: 'Alprolix', value: 'Alprolix' },
- { label: 'Benefix', value: 'Benefix' },
- { label: 'Eloctate', value: 'Eloctate' },
- { label: 'Esperoct', value: 'Esperoct' },
- { label: 'Idelvion', value: 'Idelvion' },
- { label: 'Ixinity', value: 'Ixinity' },
- { label: 'Jivi', value: 'Jivi' },
- { label: 'Kogenate FS', value: 'Kogenate FS' },
- { label: 'Kovaltry', value: 'Kovaltry' },
- { label: 'NovoEight', value: 'NovoEight' },
- { label: 'NovoSeven', value: 'NovoSeven' },
- { label: 'NUWIQ', value: 'NUWIQ' },
- { label: 'Rebinyn', value: 'Rebinyn' },
- { label: 'Recombinate', value: 'Recombinate' },
- { label: 'Rixubis', value: 'Rixubis' },
- { label: 'Xyntha', value: 'Xyntha' },
- ]
-
- const monoclonalAntibodyOptions = [{ label: 'Hemlibra', value: 'Hemlibra' }]
-
- const injectionFrequencyOptions = [
- {
- label: 'Weekly',
- value: 'Weekly',
- },
- {
- label: 'Every other week',
- value: 'Every other week',
- },
- {
- label: 'Monthly',
- value: 'Monthly',
- },
- ]
-
- const handleSubmitForm = () => {
- track('Updated Profile', { ...formik.values })
- formik.submitForm()
- }
-
- const [filteredFactorOptions, setFilteredFactorOptions] =
- useState(factorOptions)
-
- interface Option {
- label: string
- value: string
- }
-
- const searchHandler = (
- currentValue: string,
- allOptions: Option[],
- setOptions: (options: Option[]) => void
- ) => {
- if (!currentValue) return setOptions(allOptions)
- const relatedOptions = allOptions.filter((item) =>
- item.value.toLowerCase().startsWith(currentValue.toLowerCase())
- )
- setOptions(relatedOptions)
- }
-
- return (
-
- )
-}
-
-export default SettingsForm
diff --git a/components/statCard.tsx b/components/statCard.tsx
deleted file mode 100644
index 2fd13ab..0000000
--- a/components/statCard.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Card, Text, Loading } from '@geist-ui/react'
-import type { CardTypes } from '@geist-ui/react/dist/utils/prop-types'
-
-interface Props {
- value: string | number
- label: string | React.Component
- loading?: boolean
- type?: CardTypes
- shadow?: boolean
- style?: React.CSSProperties
-}
-
-export default function StatCard(props: Props): JSX.Element {
- const {
- value,
- label,
- loading = false,
- type = 'default',
- shadow = true,
- style,
- } = props
-
- return (
-
- {value}
- {label}
- {loading && }
-
- )
-}
diff --git a/components/staticHeader.tsx b/components/staticHeader.tsx
deleted file mode 100644
index e0ff104..0000000
--- a/components/staticHeader.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Grid, Button } from '@geist-ui/react'
-import styled from 'styled-components'
-import { useRouter } from 'next/router'
-
-import { useAuth } from 'lib/auth'
-import Logo from 'components/logo'
-
-const StaticHeader = (): JSX.Element => {
- const { user, loading } = useAuth()
-
- const router = useRouter()
-
- return (
-
-
-
-
-
-
- router.push(user ? '/home' : '/signin')}
- loading={loading}
- auto
- >
- {user ? 'Dashboard' : 'Register'}
-
-
-
-
- )
-}
-
-export default StaticHeader
-
-const StyledPageHeader = styled.header`
- padding: 24px;
-`
diff --git a/components/stats.tsx b/components/stats.tsx
deleted file mode 100644
index c507c86..0000000
--- a/components/stats.tsx
+++ /dev/null
@@ -1,245 +0,0 @@
-import _ from 'underscore'
-import styled from 'styled-components'
-import { Grid, Note, Card, useModal, Tooltip, Text } from '@geist-ui/react'
-
-import StatCard from 'components/statCard'
-import useInfusions from 'lib/hooks/useInfusions'
-import { FirestoreStatusType } from 'lib/hooks/useFirestoreQuery'
-import { TreatmentTypeEnum } from 'lib/db/infusions'
-import FeedbackModal from 'components/feedbackModal'
-import { filterInfusions } from 'lib/helpers'
-
-// TODO(michael) move types to types file
-type Value = string[]
-
-interface ValueRanges {
- range: string
- majorDimension: string
- values: Value[]
-}
-
-export interface InfusionSheet {
- error?: Error
- spreadsheetId: string
- valueRanges: ValueRanges[]
-}
-
-// TODO(michael) create array of factor brands with associated prices
-// const PHARMACY_ORDERS = 6
-const COST_OF_FACTOR = 1.66
-
-interface StatsProps {
- filterYear: string
-}
-
-export default function Stats(props: StatsProps): JSX.Element {
- const { filterYear } = props
- const { data, status, error } = useInfusions()
-
- const filteredInfusions = filterInfusions(data, filterYear)
-
- // TODO(michael): Remove the feedback modal from this component at some point
- // since we already use it in the footer, maybe figure out a way to share
- // the modal across multiple components my lifting it up into context.
- const {
- visible: feedbackModal,
- setVisible: setFeedbackModalVisible,
- bindings: feedbackModalBindings,
- } = useModal(false)
-
- if (status === FirestoreStatusType.LOADING) {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
- }
-
- if (error) {
- return (
-
- Oops, the database didn’t respond. Refresh the page to try again.
-
- )
- }
-
- if (status === FirestoreStatusType.ERROR && !error) {
- return (
-
- Something went wrong accessing your treatment data. Refresh the page to
- try again.
-
- )
- }
-
- // TODO(michael) there has to be a better way to understand this data without
- // iterating through it so many times. Iterating through it once would be a lot better
- // but doing it on the server would be even better.
-
- // Another idea could be to make all these cards individual components as the logic
- // could get a lot more complicated for some of them.
-
- const numberOfInfusions = filteredInfusions.length
- const affectedAreas = filteredInfusions.map((entry) => entry.sites)
- const causes = filteredInfusions.map((entry) => entry.cause)
- const numberOfBleeds = filteredInfusions.filter(
- (entry) => entry.type === TreatmentTypeEnum.BLEED
- ).length
- const mostAffectedArea = _.chain(affectedAreas)
- .compact()
- .countBy()
- .pairs()
- .max(_.last)
- .head()
- .value()
-
- const biggestCause = _.chain(causes)
- .compact()
- .countBy()
- .pairs()
- .max(_.last)
- .head()
- .value()
-
- const consecutiveProphyInfusions = (): number => {
- let longestStreak = 0
- let currentStreak = 0
-
- for (const entry of filteredInfusions) {
- const isProphy = entry.type === TreatmentTypeEnum.PROPHY
-
- if (isProphy) {
- currentStreak++
- } else {
- currentStreak = 0
- }
-
- if (currentStreak > longestStreak) {
- longestStreak = currentStreak
- }
- }
-
- return longestStreak
- }
-
- const getTotalUnits = () => {
- let units = 0
- for (const entry of filteredInfusions) {
- units += entry.medication.units
- }
-
- return units
- }
-
- const totalUnits = getTotalUnits()
- const estimatedTotalCost = totalUnits * COST_OF_FACTOR
-
- return (
- <>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* I think this is between $1.19 and $1.66 per unit based on this article
- https://www.ashclinicalnews.org/spotlight/feature-articles/high-price-hemophilia/ */}
-
-
-
-
-
-
- Missing something?
-
-
- setFeedbackModalVisible(true)}
- >
- Give feedback
-
-
-
-
-
- {/*
- TODO(michael) could setup a separate collection for this data as well as a
- separate api call
-
- */}
-
-
- >
- )
-}
-
-const StyledButton = styled.button`
- background: none;
- border: none;
- cursor: pointer;
- padding: 0;
- margin: 0;
- color: red;
- font-weight: bold;
-`
diff --git a/components/withAuth.tsx b/components/withAuth.tsx
deleted file mode 100644
index 9fbdfca..0000000
--- a/components/withAuth.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import dynamic from 'next/dynamic'
-import type { ComponentType } from 'react'
-import LoadingScreen from 'components/loadingScreen'
-
-// Dynamically import AuthProvider to avoid loading Firebase on public pages
-const AuthProvider = dynamic(
- () => import('lib/auth').then((mod) => mod.AuthProvider),
- {
- ssr: false,
- loading: () => ,
- }
-)
-
-// HOC that wraps a page component with AuthProvider
-export function withAuth(
- WrappedComponent: ComponentType
-): ComponentType
{
- const WithAuthComponent = (props: P) => {
- return (
-
-
-
- )
- }
-
- // Copy display name for debugging
- const displayName =
- WrappedComponent.displayName || WrappedComponent.name || 'Component'
- WithAuthComponent.displayName = `withAuth(${displayName})`
-
- return WithAuthComponent
-}
-
-// Wrapper component for use with getLayout pattern
-export function AuthWrapper({ children }: { children: React.ReactNode }) {
- return {children}
-}
diff --git a/cypress.config.ts b/cypress.config.ts
index 78d0121..91c2f3d 100644
--- a/cypress.config.ts
+++ b/cypress.config.ts
@@ -2,6 +2,7 @@ import { defineConfig } from 'cypress'
// Populate process.env with values from .env file
import dotenv from 'dotenv'
+
dotenv.config()
export default defineConfig({
diff --git a/cypress/e2e/account.cy.ts b/cypress/e2e/account.cy.ts
index 9b7726c..1e6b33c 100644
--- a/cypress/e2e/account.cy.ts
+++ b/cypress/e2e/account.cy.ts
@@ -1,7 +1,20 @@
describe('Acccounts', () => {
+ const newTreatmentButton = () => cy.contains('button', 'New treatment')
+ const treatmentModalHeading = () => cy.contains('h3', 'Treatment')
+ const toastShouldContain = (message: string) =>
+ cy.contains('[role="status"]', message).should('be.visible')
+
+ const openTreatmentMenuFor = (type: string) => {
+ cy.contains('table tbody tr', type)
+ .first()
+ .within(() => {
+ cy.get('button').last().click()
+ })
+ }
+
it('can create an acccount', () => {
cy.visit('/signin')
- cy.get('button > div').contains('Continue with Test User').click()
+ cy.contains('button', 'Continue with Test User').click()
cy.url().should('include', '/home')
cy.contains('Insights')
cy.contains('Annual overview')
@@ -10,108 +23,86 @@ describe('Acccounts', () => {
it('can update profile', () => {
cy.visit('/home')
- cy.findByRole('button', { name: 'Profile' }).click()
+ cy.findByRole('tab', { name: 'Profile' }).click()
cy.contains('About you')
- cy.get('input[name="hemophiliaType"]').clear().type('A')
- cy.get('input[name="severity"]').clear().type('Severe')
+ cy.get('select[name="hemophiliaType"]').select('A')
+ cy.get('select[name="severity"]').select('Severe')
cy.get('input[name="factor"]').clear().type('8')
cy.get('input[name="medication"]').clear().type('Xyntha')
cy.get('input[name="monoclonalAntibody"]').clear().type('Hemlibra')
- cy.get('input[name="injectionFrequency"]').clear().type('Monthly')
- cy.get('button').contains('Update').click()
+ cy.get('select[name="injectionFrequency"]').select('Monthly')
+ cy.contains('button', 'Update').click()
- cy.contains('#geist-ui-toast .message', 'Profile updated!').should(
- 'be.visible'
- )
+ toastShouldContain('Profile updated!')
})
it('can log a prophy treatment', () => {
cy.visit('/home')
- cy.get('button > div').contains('New treatment').click()
- cy.get('h2').contains('Treatment')
- cy.get('button > div').contains('Prophy').click()
+ newTreatmentButton().click()
+ treatmentModalHeading()
+ cy.contains('button', 'Prophy').click()
cy.get('input[name="brand"]').clear().type('Xyntha')
cy.get('input[name="units"]').clear().type('3000')
cy.get('input[name="lot"]').clear().type('ABC123')
- cy.get('button > div').contains('Log Treatment').click()
+ cy.contains('button', 'Log Treatment').click()
- cy.contains(
- '#geist-ui-toast .message',
- 'Treatment logged! Hope all is well.'
- ).should('be.visible')
+ toastShouldContain('Treatment logged! Hope all is well.')
})
it('can log a bleed treatment', () => {
cy.visit('/home')
- cy.get('button > div').contains('New treatment').click()
- cy.get('h2').contains('Treatment')
- cy.get('button > div').contains('Bleed').click()
+ newTreatmentButton().click()
+ treatmentModalHeading()
+ cy.contains('button', 'Bleed').click()
cy.get('input[name="brand"]').clear().type('Xyntha')
cy.get('input[name="units"]').clear().type('3000')
cy.get('input[name="lot"]').clear().type('ABC123')
- cy.get('button > div').contains('Log Treatment').click()
+ cy.contains('button', 'Log Treatment').click()
- cy.contains(
- '#geist-ui-toast .message',
- 'Treatment logged! Hope all is well.'
- ).should('be.visible')
+ toastShouldContain('Treatment logged! Hope all is well.')
})
it('can update treatment', () => {
cy.visit('/home')
- cy.get('table tr td')
- .contains('PROPHY')
- .parent()
- .parent()
- .siblings()
- .find('div.tooltip')
- .click()
- cy.get('div').contains('Update').click()
- cy.get('h2').contains('Treatment')
- cy.get('button > div').contains('Preventative').click()
+ openTreatmentMenuFor('PROPHY')
+ cy.contains('button', /^Update$/).click()
+ treatmentModalHeading()
+ cy.contains('button', 'Preventative').click()
cy.get('input[name="brand"]').clear().type('Advate')
cy.get('input[name="units"]').clear().type('1999')
cy.get('input[name="lot"]').clear().type('ABC123')
- cy.get('button > div').contains('Update Treatment').click()
+ cy.contains('button', 'Update Treatment').click()
- cy.contains('#geist-ui-toast .message', 'Treatment updated!').should(
- 'be.visible'
- )
+ toastShouldContain('Treatment updated!')
})
it('can delete treatment', () => {
cy.visit('/home')
- cy.get('table tr td')
- .contains('BLEED')
- .parent()
- .parent()
- .siblings()
- .find('div.tooltip')
- .click()
- cy.get('div').contains('Delete').click()
-
- cy.contains('#geist-ui-toast .message', 'Treatment deleted.').should(
- 'be.visible'
- )
+ openTreatmentMenuFor('BLEED')
+ cy.contains('button', /^Delete$/).click()
+
+ toastShouldContain('Treatment deleted')
})
it('can show treatment count card correctly', () => {
cy.visit('/home')
- cy.get('.card').contains('Treatments').parent().find('h3').contains(1)
+ cy.contains('div', /^Treatments$/)
+ .prev()
+ .should('contain', '1')
})
it('can show bleed card correctly', () => {
cy.visit('/home')
- cy.get('.card').contains('Bleeds').parent().find('h3').contains(0)
+ cy.contains('div', /^Bleeds$/)
+ .prev()
+ .should('contain', '0')
})
it('can show prophy card correctly', () => {
cy.visit('/home')
- cy.get('.card')
- .contains('Consecutive prophy treatments')
- .parent()
- .find('h3')
- .contains(0)
+ cy.contains('div', /^Consecutive prophy treatments$/)
+ .prev()
+ .should('contain', '0')
})
})
diff --git a/cypress/e2e/pages.cy.ts b/cypress/e2e/pages.cy.ts
index fb23c0e..822d163 100644
--- a/cypress/e2e/pages.cy.ts
+++ b/cypress/e2e/pages.cy.ts
@@ -9,21 +9,41 @@ describe('Pages render', () => {
it('can visit changelog', () => {
cy.visit('/changelog')
+
+ // Wait for the client to finish hydrating
+ cy.get('body').should('have.attr', 'data-hydrated', 'true')
})
it('can copy emergency link from landing', () => {
cy.visit(`/`)
- cy.get('pre')
- .contains('/emergency/')
+ cy.get('body').should('have.attr', 'data-hydrated', 'true')
+
+ cy.window().then((win) => {
+ if (!win.navigator.clipboard) {
+ Object.defineProperty(win.navigator, 'clipboard', {
+ value: {
+ writeText: () => Promise.resolve(),
+ },
+ writable: true,
+ })
+ }
+
+ cy.stub(win.navigator.clipboard, 'writeText')
+ .as('clipboardWrite')
+ .resolves()
+ })
+
+ cy.contains('code', '/emergency/')
+
.scrollIntoView()
.invoke('text')
.should('include', '/emergency/')
- cy.get('.copy').click()
- cy.contains('#geist-ui-toast .message', 'Copied to clipboard!').should(
- 'be.visible'
- )
+ cy.get('button[title="Copy to clipboard"]').click()
+
+ cy.contains('[role="status"]', 'Link copied!').should('be.visible')
+ cy.get('@clipboardWrite').should('have.been.called')
})
})
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
index 3285e48..2a5026c 100644
--- a/cypress/support/commands.ts
+++ b/cypress/support/commands.ts
@@ -37,5 +37,3 @@
// }
import '@testing-library/cypress/add-commands'
-
-export {}
diff --git a/firebase.json b/firebase.json
index 39139ea..6cbaca3 100644
--- a/firebase.json
+++ b/firebase.json
@@ -1,7 +1,7 @@
{
"firestore": {
- "rules": "firestore.rules",
- "indexes": "firestore.indexes.json"
+ "rules": "firebase/firestore.rules",
+ "indexes": "firebase/firestore.indexes.json"
},
"emulators": {
"auth": {
diff --git a/firebase/firestore.dev.rules b/firebase/firestore.dev.rules
new file mode 100644
index 0000000..646ea72
--- /dev/null
+++ b/firebase/firestore.dev.rules
@@ -0,0 +1,10 @@
+rules_version = '2';
+
+// Development rules - allows all operations for local emulator testing
+service cloud.firestore {
+ match /databases/{database}/documents {
+ match /{document=**} {
+ allow read, write: if true;
+ }
+ }
+}
diff --git a/firestore.indexes.json b/firebase/firestore.indexes.json
similarity index 100%
rename from firestore.indexes.json
rename to firebase/firestore.indexes.json
diff --git a/firestore.rules b/firebase/firestore.prod.rules
similarity index 57%
rename from firestore.rules
rename to firebase/firestore.prod.rules
index deab7bd..1732ce7 100644
--- a/firestore.rules
+++ b/firebase/firestore.prod.rules
@@ -1,15 +1,5 @@
rules_version = '2';
-// TEST MODE
-// service cloud.firestore {
-// match /databases/{database}/documents {
-// match /{document=**} {
-// allow read, write: if
-// request.time < timestamp.date(2020, 12, 19);
-// }
-// }
-// }
-// Auth only write
service cloud.firestore {
match /databases/{database}/documents {
match /infusions/{document=**} {
@@ -17,7 +7,7 @@ service cloud.firestore {
allow write, update, delete: if request.auth != null;
}
match /feedback/{document=**} {
- allow read: if request.auth.uid == '3OHCqKgvsYbMiGfKDavqq7Duveg1';
+ allow read: if request.auth != null && request.auth.uid == '3OHCqKgvsYbMiGfKDavqq7Duveg1';
allow write: if request.auth != null;
}
match /users/{document=**} {
@@ -25,4 +15,4 @@ service cloud.firestore {
allow write, update: if request.auth != null;
}
}
-}
\ No newline at end of file
+}
diff --git a/firebase/firestore.rules b/firebase/firestore.rules
new file mode 100644
index 0000000..646ea72
--- /dev/null
+++ b/firebase/firestore.rules
@@ -0,0 +1,10 @@
+rules_version = '2';
+
+// Development rules - allows all operations for local emulator testing
+service cloud.firestore {
+ match /databases/{database}/documents {
+ match /{document=**} {
+ allow read, write: if true;
+ }
+ }
+}
diff --git a/lib/auth-provider-wrapper.tsx b/lib/auth-provider-wrapper.tsx
deleted file mode 100644
index 1a3a07f..0000000
--- a/lib/auth-provider-wrapper.tsx
+++ /dev/null
@@ -1,2 +0,0 @@
-// Wrapper file for dynamic import compatibility
-export { AuthProvider as default } from './auth'
diff --git a/lib/auth.tsx b/lib/auth.tsx
deleted file mode 100644
index 2a59b65..0000000
--- a/lib/auth.tsx
+++ /dev/null
@@ -1,352 +0,0 @@
-import { useState, useEffect, useContext, createContext } from 'react'
-import cookie from 'js-cookie'
-import {
- signInWithPopup,
- signInWithEmailAndPassword,
- createUserWithEmailAndPassword,
- signOut as firebaseSignOut,
- onIdTokenChanged,
- GoogleAuthProvider,
- type User,
-} from 'firebase/auth'
-
-import { getAuth, firestore, collection, doc, getDoc } from 'lib/firebase'
-import { createUser } from 'lib/db/users'
-import { generateUniqueString } from 'lib/helpers'
-import LoadingScreen from 'components/loadingScreen'
-import type { UserType } from 'lib/types/users'
-import Router from 'next/router'
-
-type ContextProps = {
- user: UserType | null
- loading?: boolean
- signout: () => Promise
- signinWithGoogle: (redirect: string) => Promise
- signinWithTestUser: () => Promise
-}
-
-// Default context for pages without AuthProvider (public pages)
-// loading: false means we're not waiting for auth, user: null means not authenticated
-const authContext = createContext>({
- user: null,
- loading: false,
-})
-
-export function AuthProvider({
- children,
-}: {
- children: React.ReactNode
-}): React.ReactElement {
- const auth = useProvideAuth()
- if (typeof window === 'undefined') {
- return <>{children}>
- }
- return {children}
-}
-
-export const useAuth = () => useContext(authContext)
-
-// Global state to persist auth across page navigations
-let globalUser: UserType | null = null
-let globalLoading = true
-let authListenerInitialized = false
-
-function useProvideAuth() {
- // Initialize with global state to persist across page navigations
- const [user, setUser] = useState(globalUser)
- const [loading, setLoading] = useState(globalLoading)
-
- const handleUser = async (rawUser: User | null) => {
- if (rawUser) {
- const formattedUser = await formatUser(rawUser)
- const db = firestore.instance
-
- if (db) {
- const userDocRef = doc(collection(db, 'users'), formattedUser.uid)
- const dbUserSnap = await getDoc(userDocRef)
-
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- const { ...userWithoutToken } = formattedUser
-
- // TODO(michael) If user already exist then remove alertId
- // so it isn't overwritten when the user is updated on `createUser`
- // and overwrite the alertId created in the formatter.
- // This needs to be cleaned up.
- if (dbUserSnap.exists()) {
- const dbData = dbUserSnap.data()
- formattedUser.alertId = dbData?.alertId
- formattedUser.isAdmin = dbData?.isAdmin
- formattedUser.apiKey = dbData?.apiKey
- formattedUser.medication = dbData?.medication || ''
- formattedUser.monoclonalAntibody = dbData?.monoclonalAntibody || ''
- delete userWithoutToken.alertId
- }
-
- await createUser(formattedUser.uid, userWithoutToken)
- }
-
- // Update both local and global state
- globalUser = formattedUser
- globalLoading = false
- setUser(formattedUser)
- setLoading(false)
-
- cookie.set('hemolog-auth', {
- expires: 1,
- })
-
- return formattedUser
- } else {
- // Update both local and global state
- globalUser = null
- globalLoading = false
- setUser(null)
- setLoading(false)
-
- cookie.remove('hemolog-auth')
-
- return false
- }
- }
-
- const signinWithGoogle = async (redirect: string) => {
- if (process.env.NEXT_PUBLIC_USE_EMULATORS) {
- console.warn(
- 'Google sign-in is disabled when NEXT_PUBLIC_USE_EMULATORS is enabled. Use the Test User button instead.'
- )
- setLoading(false)
- return
- }
-
- setLoading(true)
- const auth = getAuth()
-
- if (!auth) {
- console.error('Firebase auth not available for Google sign-in')
- setLoading(false)
- return
- }
-
- try {
- const provider = new GoogleAuthProvider()
- const result = await signInWithPopup(auth, provider)
- await handleUser(result.user)
-
- if (redirect) {
- Router.push(redirect)
- }
- } catch (error) {
- console.error('Google sign-in error:', error)
- setLoading(false)
- }
- }
-
- const signinWithTestUser = async () => {
- setLoading(true)
-
- if (typeof window === 'undefined') {
- console.error('Error: Cannot sign in on server-side')
- setLoading(false)
- return
- }
-
- const auth = getAuth()
-
- if (!auth) {
- console.error(
- 'Error: Firebase auth not available. Make sure Firebase is initialized and emulator is running.'
- )
- setLoading(false)
- return
- }
-
- const testEmail = 'michael+test@hemolog.com'
- const testPassword = 'test123'
-
- try {
- // Try to sign in directly first (user might already exist)
- const signInResponse = await signInWithEmailAndPassword(
- auth,
- testEmail,
- testPassword
- )
- if (signInResponse.user) {
- await handleUser(signInResponse.user)
- Router.push('/home')
- return
- }
- } catch (signInError: unknown) {
- // If user doesn't exist, create them
- const error =
- signInError && typeof signInError === 'object' && 'code' in signInError
- ? (signInError as { code?: string })
- : null
-
- const isUserNotFound =
- error?.code === 'auth/user-not-found' ||
- error?.code === 'auth/invalid-credential'
-
- if (!isUserNotFound) {
- console.error('Sign in error:', signInError)
- setLoading(false)
- return
- }
-
- // User doesn't exist, create them using Firebase SDK
- try {
- const createResponse = await createUserWithEmailAndPassword(
- auth,
- testEmail,
- testPassword
- )
- if (createResponse.user) {
- await handleUser(createResponse.user)
- Router.push('/home')
- return
- }
- } catch (createError: unknown) {
- // If email already exists (race condition), try signing in again
- const createErr =
- createError &&
- typeof createError === 'object' &&
- 'code' in createError
- ? (createError as { code?: string })
- : null
-
- if (createErr?.code === 'auth/email-already-in-use') {
- try {
- const retrySignIn = await signInWithEmailAndPassword(
- auth,
- testEmail,
- testPassword
- )
- if (retrySignIn.user) {
- await handleUser(retrySignIn.user)
- Router.push('/home')
- return
- }
- } catch (retryError) {
- console.error('Retry sign in error:', retryError)
- }
- } else {
- console.error('Create user error:', createError)
- }
- setLoading(false)
- }
- }
- }
-
- const signout = async () => {
- Router.push('/signin')
- const auth = getAuth()
- if (!auth) {
- await handleUser(null)
- return
- }
- await firebaseSignOut(auth)
- await handleUser(null)
- }
-
- // biome-ignore lint/correctness/useExhaustiveDependencies: handleUser is stable and would cause infinite re-renders
- useEffect(() => {
- // Only initialize auth listener on client-side when Firebase is available
- if (typeof window === 'undefined') {
- setLoading(false)
- return
- }
-
- const auth = getAuth()
-
- if (!auth) {
- globalLoading = false
- setLoading(false)
- return
- }
-
- // If we already have a user from a previous page, sync local state
- if (globalUser && !user) {
- setUser(globalUser)
- setLoading(false)
- return
- }
-
- // Only set up listener once globally to avoid duplicate listeners
- if (authListenerInitialized) {
- // Sync with global state
- setUser(globalUser)
- setLoading(globalLoading)
- return
- }
-
- authListenerInitialized = true
- const unsubscribe = onIdTokenChanged(auth, handleUser)
- return () => {
- unsubscribe()
- authListenerInitialized = false
- }
- }, [])
-
- return {
- user,
- loading,
- signinWithGoogle,
- signinWithTestUser,
- signout,
- }
-}
-
-const formatUser = async (rawUser: User): Promise => {
- let token = ''
- try {
- const idTokenResult = await rawUser.getIdTokenResult()
- token = idTokenResult.token
- } catch {
- // Token retrieval failed, continue without token
- }
-
- const alertId = await generateUniqueString(6)
-
- return {
- alertId,
- email: rawUser.email || '',
- name: rawUser.displayName || '',
- photoUrl: rawUser.photoURL || undefined,
- provider: rawUser.providerData?.[0]?.providerId || 'password',
- token: token || '',
- uid: rawUser.uid,
- }
-}
-
-// NOTE(michael) This takes care of protecting unauthed users
-// from seeing any protected pages. This could be handled better,
-// but this works for now
-export function ProtectRoute({
- children,
-}: {
- children: React.ReactNode
-}): React.ReactElement | null {
- const { user, loading } = useAuth()
- if (typeof window === 'undefined') return null
-
- if (loading && !user) {
- return
- }
-
- const { pathname } = window.location
-
- if (!user) {
- // allow access to signin and emergency pages
- if (pathname === '/signin' || pathname.includes('emergency')) {
- return <>{children}>
- }
-
- // Redirect to signin for all other routes when not authenticated
- if (typeof window !== 'undefined') {
- Router.replace('/signin')
- return
- }
- return null
- }
-
- return <>{children}>
-}
diff --git a/lib/db/feedback.ts b/lib/db/feedback.ts
deleted file mode 100644
index 191f5b8..0000000
--- a/lib/db/feedback.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-import {
- firestore,
- collection,
- doc,
- addDoc,
- deleteDoc,
- updateDoc,
-} from 'lib/firebase'
-import type { AttachedUserType } from 'lib/types/users'
-
-export interface FeedbackType {
- createdAt: string
- message: string
- user: AttachedUserType
-}
-
-// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
-function cleanUndefined(obj: T): Partial {
- return Object.fromEntries(
- Object.entries(obj).filter(([, v]) => v !== undefined)
- ) as Partial
-}
-
-function createFeedback(data: FeedbackType) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve({ id: '' })
- }
-
- return addDoc(collection(db, 'feedback'), cleanUndefined(data))
-}
-
-function deleteFeedback(uid: string) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve()
- }
-
- return deleteDoc(doc(collection(db, 'feedback'), uid))
-}
-
-function updateFeedback(uid: string, newValues: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve()
- }
-
- return updateDoc(
- doc(collection(db, 'feedback'), uid),
- cleanUndefined(newValues)
- )
-}
-
-export { createFeedback, deleteFeedback, updateFeedback }
diff --git a/lib/db/infusions.ts b/lib/db/infusions.ts
deleted file mode 100644
index 1686697..0000000
--- a/lib/db/infusions.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import {
- firestore,
- collection,
- doc,
- addDoc,
- setDoc,
- updateDoc,
-} from 'lib/firebase'
-import type { AttachedUserType } from 'lib/types/users'
-
-export enum TreatmentTypeEnum {
- PROPHY = 'PROPHY',
- BLEED = 'BLEED',
- PREVENTATIVE = 'PREVENTATIVE',
- ANTIBODY = 'ANTIBODY',
-}
-
-export type TreatmentTypeOptions =
- | TreatmentTypeEnum.PROPHY
- | TreatmentTypeEnum.BLEED
- | TreatmentTypeEnum.PREVENTATIVE
- | TreatmentTypeEnum.ANTIBODY
-
-export interface Medication {
- brand: string
- costPerUnit?: number
- lot?: string
- units: number
-}
-
-export interface TreatmentType {
- deletedAt: string | null
- uid?: string
- cause: string
- createdAt: string
- date: string
- medication: Medication
- sites: string
- type: TreatmentTypeOptions
- user: AttachedUserType
-}
-
-// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
-function cleanUndefined(obj: T): Partial {
- return Object.fromEntries(
- Object.entries(obj).filter(([, v]) => v !== undefined)
- ) as Partial
-}
-
-// NOTE(michael) this might be a bad way of adding the doc id.
-// Probably worth searching for another solution.
-async function createInfusion(data: TreatmentType) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- const cleanData = cleanUndefined(data)
- const infusionsRef = collection(db, 'infusions')
- const docRef = await addDoc(infusionsRef, cleanData)
- await setDoc(docRef, { uid: docRef.id, ...cleanData }, { merge: true })
-}
-
-function deleteInfusion(uid: string) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return Promise.resolve()
- }
-
- const infusionDocRef = doc(collection(db, 'infusions'), uid)
- return setDoc(
- infusionDocRef,
- { deletedAt: new Date().toISOString() },
- { merge: true }
- )
-}
-
-async function updateInfusion(uid: string, newValues: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- const cleanValues = cleanUndefined(newValues)
- const infusionDocRef = doc(collection(db, 'infusions'), uid)
- return updateDoc(infusionDocRef, cleanValues)
-}
-
-export { createInfusion, deleteInfusion, updateInfusion }
diff --git a/lib/db/users.ts b/lib/db/users.ts
deleted file mode 100644
index c05c016..0000000
--- a/lib/db/users.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import {
- firestore,
- collection,
- doc,
- setDoc,
- updateDoc,
- deleteDoc,
- query,
- where,
- getDocs,
- writeBatch,
-} from 'lib/firebase'
-import type { UserType } from 'lib/types/users'
-
-async function createUser(uid: string, data: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- try {
- // Filter out undefined values - Firestore doesn't accept them
- const cleanData = Object.fromEntries(
- Object.entries({ uid, ...data }).filter(([, v]) => v !== undefined)
- )
- const userDocRef = doc(collection(db, 'users'), uid)
- await setDoc(userDocRef, cleanData, { merge: true })
- } catch (error) {
- console.error(error)
- }
-}
-
-async function deleteUser(uid: string) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- const userDocRef = doc(collection(db, 'users'), uid)
- await deleteDoc(userDocRef)
-
- const infusionsQuery = query(
- collection(db, 'infusions'),
- where('user.uid', '==', uid)
- )
- const snapshot = await getDocs(infusionsQuery)
-
- const batch = writeBatch(db)
- snapshot.forEach((docSnap) => {
- batch.delete(docSnap.ref)
- })
-
- return batch.commit()
-}
-
-async function updateUser(uid: string, newValues: Partial) {
- const db = firestore.instance
- if (!db) {
- console.error('Firestore not available')
- return
- }
-
- // Filter out undefined values - Firestore doesn't accept them
- const cleanValues = Object.fromEntries(
- Object.entries(newValues).filter(([, v]) => v !== undefined)
- )
- const userDocRef = doc(collection(db, 'users'), uid)
- return updateDoc(userDocRef, cleanValues)
-}
-
-export { createUser, deleteUser, updateUser }
diff --git a/lib/fetcher.ts b/lib/fetcher.ts
deleted file mode 100644
index cd8a565..0000000
--- a/lib/fetcher.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import fetch from 'isomorphic-unfetch'
-
-const fetcher = async (
- input: RequestInfo,
- token: string
-): Promise => {
- const res = await fetch(input, {
- method: 'GET',
- headers: new Headers({ 'Content-Type': 'application/json', token }),
- credentials: 'same-origin',
- })
- return res.json()
-}
-
-export default fetcher
diff --git a/lib/firebase.ts b/lib/firebase.ts
deleted file mode 100644
index 846a402..0000000
--- a/lib/firebase.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-// firebase.ts
-// Initializes firebase across app for auth and firestore using modular v9+ API
-
-import { initializeApp, getApps, type FirebaseApp } from 'firebase/app'
-import {
- getFirestore,
- connectFirestoreEmulator,
- type Firestore,
-} from 'firebase/firestore'
-import {
- getAuth as getFirebaseAuth,
- connectAuthEmulator,
- type Auth,
-} from 'firebase/auth'
-
-const firebaseConfig = {
- apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY || 'development',
- authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || 'localhost',
- projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || 'hemolog',
-}
-
-// Singleton instances
-let firebaseApp: FirebaseApp | null = null
-let firestoreInstance: Firestore | null = null
-let authInstance: Auth | null = null
-let firestoreEmulatorConnected = false
-let authEmulatorConnected = false
-
-// Initialize Firebase app (only on client-side)
-function getApp(): FirebaseApp | null {
- if (typeof window === 'undefined') {
- return null
- }
-
- if (!firebaseApp) {
- const apps = getApps()
- if (apps.length === 0) {
- firebaseApp = initializeApp(firebaseConfig)
- } else {
- firebaseApp = apps[0]
- }
- }
-
- return firebaseApp
-}
-
-// Get Firestore instance
-function getFirestoreInstance(): Firestore | null {
- if (typeof window === 'undefined') {
- return null
- }
-
- const app = getApp()
- if (!app) {
- return null
- }
-
- if (!firestoreInstance) {
- firestoreInstance = getFirestore(app)
-
- // Connect to emulator if developing locally
- if (process.env.NEXT_PUBLIC_USE_EMULATORS && !firestoreEmulatorConnected) {
- try {
- connectFirestoreEmulator(firestoreInstance, 'localhost', 8082)
- firestoreEmulatorConnected = true
- } catch {
- // Emulator already connected, ignore
- }
- }
- }
-
- return firestoreInstance
-}
-
-// Get Auth instance
-export function getAuth(): Auth | null {
- if (typeof window === 'undefined') {
- return null
- }
-
- const app = getApp()
- if (!app) {
- return null
- }
-
- if (!authInstance) {
- authInstance = getFirebaseAuth(app)
-
- // Connect to emulator if developing locally
- if (process.env.NEXT_PUBLIC_USE_EMULATORS && !authEmulatorConnected) {
- try {
- connectAuthEmulator(authInstance, 'http://localhost:9099', {
- disableWarnings: true,
- })
- authEmulatorConnected = true
- } catch {
- // Emulator already connected, ignore
- }
- }
- }
-
- return authInstance
-}
-
-// Export firestore getter - components should use this
-export const firestore = {
- get instance(): Firestore | null {
- return getFirestoreInstance()
- },
-}
-
-// Re-export only the Firestore functions we actually use
-export {
- collection,
- doc,
- getDoc,
- getDocs,
- setDoc,
- updateDoc,
- deleteDoc,
- addDoc,
- query,
- where,
- limit,
- onSnapshot,
- writeBatch,
-} from 'firebase/firestore'
diff --git a/lib/helpers.ts b/lib/helpers.ts
deleted file mode 100644
index cb02def..0000000
--- a/lib/helpers.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { customAlphabet } from 'nanoid/async'
-import { getYear } from 'date-fns'
-import type { TreatmentType } from 'lib/db/infusions'
-
-async function generateUniqueString(length = 6) {
- // removed 'i' and 'l' for clarity when reading the id on different mediums i.e. (paper, url)
- const alphabet = '0123456789ABCDEFGHJKMNOPQRSTUVWXYZabcdefghjkmnopqrstuvwxyz'
- const nanoid = customAlphabet(alphabet, length)
- const uniqueString = await nanoid()
-
- return uniqueString
-}
-
-const filterInfusions = (data: TreatmentType[], filterYear: string) =>
- data && filterYear !== 'All time'
- ? data.filter((d) => {
- const [year, month, day] = d.date.split('-').map(Number)
- return (
- getYear(new Date(year, month - 1, day)) ===
- Number.parseInt(filterYear, 10)
- )
- })
- : data
-
-export { generateUniqueString, filterInfusions }
-
-/**
- * Track an event using the onedollarstats.com client.
- * Internally uses category "Event".
- * @param action - The event action (e.g., "Logged Infusion")
- * @param properties - Optional event properties
- */
-export const track = (
- action: string,
- properties: Record = {}
-): void => {
- if (typeof window !== 'undefined' && window.stonks) {
- window.stonks.event('Event', action, properties)
- }
-}
diff --git a/lib/hooks/useDbUser.ts b/lib/hooks/useDbUser.ts
deleted file mode 100644
index c9de79c..0000000
--- a/lib/hooks/useDbUser.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useMemo } from 'react'
-import { firestore, collection, query, where } from 'lib/firebase'
-import useFirestoreQuery, {
- type FirestoreStatusType,
-} from 'lib/hooks/useFirestoreQuery'
-import type { Person } from 'lib/types/person'
-
-// TODO(michaelwschultz): move FirestoreStatusTypes to a more general place
-type FirestoreStatusTypes = FirestoreStatusType
-
-interface FirestoreUserResponse {
- person: Person | null
- status: FirestoreStatusTypes
- error: Error | null
-}
-
-export default function useDbUser(
- uid: string | string[]
-): FirestoreUserResponse {
- // Normalize uid to string
- const normalizedUid = Array.isArray(uid) ? uid[0] : uid
-
- // Memoize the query to prevent unnecessary re-subscriptions
- const firestoreQuery = useMemo(() => {
- const db = firestore.instance
- if (!db || !normalizedUid) {
- return null
- }
-
- return query(collection(db, 'users'), where('uid', '==', normalizedUid))
- }, [normalizedUid])
-
- const { data, status, error } = useFirestoreQuery(firestoreQuery)
-
- let person: Person | null = null
- if (data && Array.isArray(data) && data.length > 0) {
- person = data[0] as Person
- }
-
- return {
- person,
- status,
- error: error ?? null,
- }
-}
diff --git a/lib/hooks/useEmergencyUser.ts b/lib/hooks/useEmergencyUser.ts
deleted file mode 100644
index 460f794..0000000
--- a/lib/hooks/useEmergencyUser.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { useMemo } from 'react'
-import {
- firestore,
- collection,
- query,
- where,
- limit as firestoreLimit,
-} from 'lib/firebase'
-import useFirestoreQuery, {
- type FirestoreStatusType,
-} from 'lib/hooks/useFirestoreQuery'
-import type { Person } from 'lib/types/person'
-
-// TODO move FirestoreStatusTypes to a more general place
-type FirestoreStatusTypes = FirestoreStatusType
-
-interface FirestoreUserResponse {
- person: Person | null
- status: FirestoreStatusTypes
- error: Error | null
-}
-
-export default function useEmergencyUser(
- alertId?: string | string[]
-): FirestoreUserResponse {
- // Normalize alertId to string
- const normalizedAlertId = Array.isArray(alertId) ? alertId[0] : alertId
-
- // Memoize the query to prevent unnecessary re-subscriptions
- const firestoreQuery = useMemo(() => {
- const db = firestore.instance
- if (!db) {
- return null
- }
-
- return query(
- collection(db, 'users'),
- where('alertId', '==', normalizedAlertId || ''),
- firestoreLimit(1)
- )
- }, [normalizedAlertId])
-
- const { data, status, error } = useFirestoreQuery(firestoreQuery)
-
- let person: Person | undefined
- if (data && Array.isArray(data) && data.length > 0) {
- person = data[0] as Person
- }
-
- return {
- person: person ?? null,
- status,
- error: error ?? null,
- }
-}
diff --git a/lib/hooks/useFirestoreQuery.ts b/lib/hooks/useFirestoreQuery.ts
deleted file mode 100644
index 6cacb3b..0000000
--- a/lib/hooks/useFirestoreQuery.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-// Reducer for hook state and actions
-import { useReducer, useEffect, useRef } from 'react'
-import {
- onSnapshot,
- type Query,
- type DocumentReference,
- type QuerySnapshot,
- type DocumentSnapshot,
- type DocumentData,
-} from 'firebase/firestore'
-
-export enum FirestoreStatusType {
- IDLE = 'idle',
- LOADING = 'loading',
- SUCCESS = 'success',
- ERROR = 'error',
-}
-
-interface Action {
- type: FirestoreStatusType
- payload?: T
-}
-
-interface State {
- status: FirestoreStatusType
- data: T | undefined
- error: Error | undefined
-}
-
-const reducer = (_state: State, action: Action): State => {
- switch (action.type) {
- case FirestoreStatusType.IDLE:
- return {
- status: FirestoreStatusType.IDLE,
- data: undefined,
- error: undefined,
- }
- case FirestoreStatusType.LOADING:
- return {
- status: FirestoreStatusType.LOADING,
- data: undefined,
- error: undefined,
- }
- case FirestoreStatusType.SUCCESS:
- return {
- status: FirestoreStatusType.SUCCESS,
- data: action.payload,
- error: undefined,
- }
- case FirestoreStatusType.ERROR:
- return {
- status: FirestoreStatusType.ERROR,
- data: undefined,
- error: action.payload as Error | undefined,
- }
- default:
- throw new Error('invalid action')
- }
-}
-
-type FirestoreQueryType =
- | Query
- | DocumentReference
-
-// Hook
-export default function useFirestoreQuery(
- query: FirestoreQueryType | null | undefined
-) {
- // Our initial state
- // Start with an "idle" status if query is falsy, as that means hook consumer is
- // waiting on required data before creating the query object.
- const initialState: State = {
- status: query ? FirestoreStatusType.LOADING : FirestoreStatusType.IDLE,
- data: undefined,
- error: undefined,
- }
-
- // Setup our state and actions
- const [state, dispatch] = useReducer(reducer, initialState)
-
- // Track the previous query to avoid re-subscribing unnecessarily
- const prevQueryRef = useRef(null)
-
- useEffect(() => {
- // Return early if query is falsy and reset to "idle" status
- if (!query) {
- dispatch({ type: FirestoreStatusType.IDLE })
- return
- }
-
- // Check if query changed (simple reference equality)
- // For v9, we rely on the consumer to memoize their queries
- if (prevQueryRef.current === query) {
- return
- }
- prevQueryRef.current = query
-
- dispatch({ type: FirestoreStatusType.LOADING })
-
- // Subscribe to query with onSnapshot
- // Handle both Query and DocumentReference
- const isDocRef = 'type' in query && query.type === 'document'
-
- if (isDocRef) {
- // Document reference
- const unsubscribe = onSnapshot(
- query as DocumentReference,
- (docSnap: DocumentSnapshot) => {
- const data = docSnap.exists()
- ? { id: docSnap.id, ...docSnap.data() }
- : null
- dispatch({ type: FirestoreStatusType.SUCCESS, payload: data as T })
- },
- (error: Error) => {
- dispatch({
- type: FirestoreStatusType.ERROR,
- payload: error as T & Error,
- })
- }
- )
- return () => unsubscribe()
- } else {
- // Query
- const unsubscribe = onSnapshot(
- query as Query,
- (snapshot: QuerySnapshot) => {
- const data = snapshot.docs.map((doc) => ({
- id: doc.id,
- ...doc.data(),
- }))
- dispatch({ type: FirestoreStatusType.SUCCESS, payload: data as T })
- },
- (error: Error) => {
- dispatch({
- type: FirestoreStatusType.ERROR,
- payload: error as T & Error,
- })
- }
- )
- return () => unsubscribe()
- }
- }, [query])
-
- return state
-}
diff --git a/lib/hooks/useInfusions.ts b/lib/hooks/useInfusions.ts
deleted file mode 100644
index b046f8a..0000000
--- a/lib/hooks/useInfusions.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { useMemo } from 'react'
-import { firestore, collection, query, where } from 'lib/firebase'
-import { useAuth } from 'lib/auth'
-import { compareDesc } from 'date-fns'
-
-import useFirestoreQuery, {
- type FirestoreStatusType,
-} from 'lib/hooks/useFirestoreQuery'
-import type { TreatmentType } from 'lib/db/infusions'
-
-type FirestoreStatusTypes = FirestoreStatusType
-
-interface InfusionResponse {
- data: TreatmentType[]
- status: FirestoreStatusTypes
- error: Error | null
-}
-
-export default function useInfusions(
- limit?: number,
- uid?: string
-): InfusionResponse {
- const { user } = useAuth()
- const userUid = user ? user.uid : uid
-
- // Memoize the query to prevent unnecessary re-subscriptions
- const firestoreQuery = useMemo(() => {
- const db = firestore.instance
- if (!db || !userUid) {
- return null
- }
-
- return query(
- collection(db, 'infusions'),
- where('user.uid', '==', userUid),
- where('deletedAt', '==', null)
- )
- }, [userUid])
-
- const {
- data: unsortedData,
- status,
- error,
- } = useFirestoreQuery(firestoreQuery)
-
- // NOTE(Michael) sorts infusions by date (newest to oldest)
- const data: TreatmentType[] = useMemo(() => {
- const arr: TreatmentType[] = Array.isArray(unsortedData) ? unsortedData : []
-
- if (arr.length > 0) {
- const sorted = [...arr].sort((a: TreatmentType, b: TreatmentType) =>
- compareDesc(new Date(a.date), new Date(b.date))
- )
-
- if (limit) {
- return sorted.slice(0, limit)
- }
- return sorted
- }
-
- return arr
- }, [unsortedData, limit])
-
- return {
- data,
- status,
- error: error ?? null,
- }
-}
diff --git a/lib/theme.ts b/lib/theme.ts
deleted file mode 100644
index 208f6a3..0000000
--- a/lib/theme.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const theme = {
- colors: {
- text: 'white',
- primary: 'salmon',
- },
-}
diff --git a/next-env.d.ts b/next-env.d.ts
index 4f11a03..c4b7818 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,5 +1,6 @@
///
///
+import "./.next/dev/types/routes.d.ts";
// NOTE: This file should not be edited
-// see https://nextjs.org/docs/basic-features/typescript for more information.
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.js b/next.config.js
index 4b60420..3888717 100644
--- a/next.config.js
+++ b/next.config.js
@@ -15,6 +15,11 @@ const nextConfig = {
hostname: 'lh3.googleusercontent.com',
pathname: '/**', // Allow all paths on this hostname
},
+ {
+ protocol: 'https',
+ hostname: 'fonts.gstatic.com',
+ pathname: '/**', // Allow all paths on this hostname
+ },
{
protocol: 'https',
hostname: 'assets.onedollarstats.com',
@@ -67,12 +72,12 @@ const nextConfig = {
// },
// Production optimizations
- ...(process.env.NODE_ENV === 'production' && {
- // Enable standalone output for better deployment
- output: 'standalone',
- // Compress responses
- compress: true,
- }),
+ // ...(process.env.NODE_ENV === 'production' && {
+ // // // Enable standalone output for better deployment
+ // // output: 'standalone',
+ // // // Compress responses
+ // compress: true,
+ // }),
}
export default withBundleAnalyzer(nextConfig)
diff --git a/package.json b/package.json
index ab991a4..ecb76c3 100644
--- a/package.json
+++ b/package.json
@@ -1,57 +1,63 @@
{
"name": "hemolog",
- "version": "2.9.0",
+ "version": "2.9.5",
"type": "module",
- "packageManager": "pnpm@10.13.1",
+ "packageManager": "pnpm@10.28.0",
"scripts": {
"build": "pnpm run lint:fix; next build",
+ "build:prod": "pnpm run rules:prod && pnpm run lint:fix && next build",
"dev": "next dev",
"firebase": "firebase emulators:start",
+ "firebase:dev": "pnpm run rules:dev && firebase emulators:start",
+ "rules:dev": "./src/scripts/switch-rules.sh dev",
+ "rules:prod": "./src/scripts/switch-rules.sh prod",
"lint": "biome check",
"lint:fix": "biome check --write",
"start": "next start",
"prepare": "husky install",
"cy:open": "cypress open",
- "cy:run": "cypress run"
+ "cy:run": "cypress run",
+ "seed": "NEXT_PUBLIC_USE_EMULATORS=true npx tsx src/lib/seed.ts"
},
"engines": {
"node": "22.21.x"
},
"dependencies": {
- "@geist-ui/react": "2.2.5",
- "@geist-ui/react-icons": "^1.0.1",
+ "@silk-hq/components": "^0.10.0",
+ "@tanstack/react-query": "^5.62.0",
+ "@tanstack/react-table": "^8.21.3",
"date-fns": "^2.30.0",
"firebase": "^12.7.0",
"firebase-admin": "^12.7.0",
"formik": "^2.4.9",
- "isomorphic-unfetch": "^3.1.0",
"js-cookie": "^2.2.1",
- "nanoid": "^3.3.11",
- "next": "^12.3.7",
- "react": "^17.0.2",
- "react-dom": "^17.0.2",
+ "next": "^16.1.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
"react-qr-code": "^2.0.18",
- "react-vis": "^1.12.1",
- "styled-components": "^6.1.19",
- "swr": "^1.3.0",
+ "recharts": "^3.6.0",
"underscore": "^1.13.7"
},
"devDependencies": {
- "@biomejs/biome": "2.3.5",
+ "@biomejs/biome": "2.3.12",
"@next/bundle-analyzer": "^16.1.1",
- "@testing-library/cypress": "^8.0.7",
+ "@tabler/icons-react": "^3.36.0",
+ "@tailwindcss/postcss": "^4.1.18",
+ "@testing-library/cypress": "^10.1.0",
"@types/js-cookie": "^2.2.7",
- "@types/node": "^20.19.24",
- "@types/react": "^17.0.89",
- "@types/react-vis": "^1.11.15",
- "@types/styled-components": "^5.1.35",
+ "@types/node": "^22.19.3",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
"@types/underscore": "^1.13.0",
- "babel-plugin-styled-components": "^1.13.3",
- "cypress": "^10.11.0",
+ "autoprefixer": "^10.4.23",
+ "cypress": "^15.8.1",
"dotenv": "^17.2.3",
- "firebase-tools": "^9.23.3",
+ "firebase-tools": "^15.1.0",
"husky": "^7.0.4",
"lint-staged": "^12.5.0",
+ "nanoid": "^5.0.9",
+ "react-hot-toast": "^2.6.0",
+ "tailwindcss": "^4.0.0",
"typescript": "^5.9.3"
},
"lint-staged": {
diff --git a/pages/_app.tsx b/pages/_app.tsx
deleted file mode 100644
index f4fc1d9..0000000
--- a/pages/_app.tsx
+++ /dev/null
@@ -1,130 +0,0 @@
-import { useState } from 'react'
-import Head from 'next/head'
-import type { AppProps } from 'next/app'
-import { GeistProvider, CssBaseline, Themes } from '@geist-ui/react'
-import { createGlobalStyle, ThemeProvider } from 'styled-components'
-import { theme } from 'lib/theme'
-
-const hemologPalette = {
- success: '#FF062C',
- successLight: '#FF398F',
- successDark: '#a3051d',
- warning: '#0070F3',
- warningLight: '#3291FF',
- warningDark: '#0761D1',
- error: '#48BB78',
- errorLight: '#48BB78',
- errorDark: '#48BB78',
- link: '#FF062C',
-}
-
-const hemologLight = Themes.createFromLight({
- type: 'hemologLight',
- palette: hemologPalette,
-})
-
-export default function App({ Component, pageProps }: AppProps): JSX.Element {
- const description =
- 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.'
-
- const [themeType, setThemeType] = useState('hemologLight')
- const switchThemes = () => {
- setThemeType((last) => (last === 'dark' ? 'hemologLight' : 'dark'))
- }
-
- return (
- <>
-
-
- Hemolog
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* */}
-
-
-
-
-
- {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */}
- {/* @ts-ignore */}
-
-
-
- >
- )
-}
-
-const GlobalStyle = createGlobalStyle`
- /* targets the empty div applied by nextjs so the sidebar follows the height of the page */
-
- html, body {
- height: 100%;
- }
-
- /* targets Nextjs empty div issue */
- /* TODO(michael): remove scrollbar on mobile */
- body > div:first-child {
- overflow: -moz-scrollbars-vertical;
- overflow-y: scroll;
- height: inherit;
- }
-
- a {
- font-weight: 600;
- }
-
- // overrides dumb geist-ui cssBaseline rules for unordered lists
- li:before {
- content: "" !important;
- }
-
- .ellipsis {
- display: block;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
- }
-`
diff --git a/pages/_document.tsx b/pages/_document.tsx
deleted file mode 100644
index 88b8425..0000000
--- a/pages/_document.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import Document, {
- type DocumentContext,
- Html,
- Head,
- Main,
- NextScript,
-} from 'next/document'
-import { ServerStyleSheet } from 'styled-components'
-import { CssBaseline } from '@geist-ui/react'
-
-export default class MyDocument extends Document {
- static async getInitialProps(ctx: DocumentContext) {
- const sheet = new ServerStyleSheet()
- const originalRenderPage = ctx.renderPage
- try {
- ctx.renderPage = () =>
- originalRenderPage({
- enhanceApp: (App) => (props) =>
- sheet.collectStyles( ),
- })
- const initialProps = await Document.getInitialProps(ctx)
- const styles = CssBaseline.flush()
-
- return {
- ...initialProps,
- styles: (
- <>
- {initialProps.styles}
- {styles}
- {sheet.getStyleElement()}
- >
- ),
- }
- } finally {
- sheet.seal()
- }
- }
-
- render() {
- const googleRichResultsSchema = {
- '@context': 'https://schema.org',
- '@type': 'Organization',
- url: 'https://hemolog.com',
- logo: 'https://hemolog.com/images/hemolog-logo.png',
- }
-
- return (
-
-
-
-
- {/* react-vis CSS is loaded dynamically when Chart component is used */}
-
-
-
-
-
-
- )
- }
-}
diff --git a/pages/about.tsx b/pages/about.tsx
deleted file mode 100644
index 1a429c0..0000000
--- a/pages/about.tsx
+++ /dev/null
@@ -1,143 +0,0 @@
-import Head from 'next/head'
-import NextLink from 'next/link'
-import {
- Text,
- Divider,
- Display,
- Image,
- Spacer,
- Grid,
- Link,
- Note,
-} from '@geist-ui/react'
-import styled from 'styled-components'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-
-const About = (): JSX.Element => {
- return (
- <>
-
- Hemolog - About
-
-
-
-
- The story so far
- More than you would ever want to know about Hemolog
-
-
-
-
-
-
- Let’s face it, there are some exciting developments in the world of
- Hemophilia research. Honestly, it’s not just research
- anymore. Clinical trials are happening now across the globe. Gene
- threrapy is definitely going to change things for the better, it’s
- just a matter of when it’s available to all of us.
-
-
-
- That being said, it’s still important to keep track of your
- treatments. Maybe even more now than ever. If getting on a trial is
- something you’re interested in, knowing how many bleeds you were
- having before is really important.
-
-
- Trial or not, keeping track of your treatment habits can be hard and
- the tools we have aren’t great. Hemolog is simple. You track your
- treatments and Hemolog gives you instant feedback.
-
-
- Insights are something that I always wanted to be a part of Hemolog
- and now they’re finally here.
-
-
-
-
-
-
-
- These insights are calculated as you log your treatments. Filter by
- year for a comprehensive view into your treatment history. I’ve
- chosen a few insights that are interesting to me. If you have
- thoughts on what you would like to see, just let me know.
-
-
-
-
-
- Development is ongoing. Check out the{' '}
-
- development blog
- {' '}
- for updates and changes.
-
-
-
-
-
-
-
- Now that Hemolog is back, I hope you enjoy using it as much as I
- have. It’s up to all of us to keep each other accountable. You
- can{' '}
-
-
- view my emergency page
-
- {' '}
- at any time to verify I’ve been keeping up with my prophy
- regimen.
-
-
- — Michael Schultz
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default About
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-`
diff --git a/pages/api/alert-lightstrip.ts b/pages/api/alert-lightstrip.ts
deleted file mode 100644
index adaae8c..0000000
--- a/pages/api/alert-lightstrip.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-// NOTE(michael): this endpoint isn't used anywhere and was just an
-// exploration of the HUE api.
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
-
-const alertLights = (_req: NextApiRequest, res: NextApiResponse) => {
- return fetch(`${REQUEST_URL}/state`, {
- method: 'PUT',
- body: JSON.stringify({ on: true, hue: 0 }),
- })
- .then((resp) => resp.json())
- .then((data) => {
- res.json(data)
- return
- })
-}
-
-export default alertLights
diff --git a/pages/api/delete-account.ts b/pages/api/delete-account.ts
deleted file mode 100644
index 4baa5da..0000000
--- a/pages/api/delete-account.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-import { auth } from 'lib/firebase-admin'
-import { deleteUserAndData } from 'lib/admin-db/users'
-
-const deleteAccount = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'DELETE') {
- return res.status(405).send('Requires DELETE method.')
- }
-
- try {
- const token = req.headers.token
-
- if (!token || typeof token !== 'string') {
- throw new Error('Access denied. Missing valid token.')
- }
-
- const { uid } = await auth.verifyIdToken(token)
-
- if (!uid) {
- throw new Error('Access denied. Invalid token.')
- }
-
- await deleteUserAndData(uid)
-
- return res.status(200).json({ success: true })
- } catch (error: unknown) {
- const errorMessage =
- error instanceof Error ? error.message : 'Unable to delete account.'
- return res.status(500).send(errorMessage)
- }
-}
-
-export default deleteAccount
diff --git a/pages/api/flip-lightstrip.ts b/pages/api/flip-lightstrip.ts
deleted file mode 100644
index 42ee345..0000000
--- a/pages/api/flip-lightstrip.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-// NOTE(michael): this endpoint isn't used anywhere and was just an
-// exploration of the HUE api.
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
-
-const flipLights = async (req: NextApiRequest, res: NextApiResponse) => {
- const { query } = req
- let on: boolean | undefined
-
- // biome-ignore lint/suspicious/noImplicitAnyLet: not important
- let currentState
-
- // NOTE(michael) this is only needed if I want to accept a query param
- if (query.on) {
- switch (query.on) {
- case 'false': {
- on = false
- break
- }
- case 'true': {
- on = true
- break
- }
- case 'default': {
- on = true
- break
- }
- }
- } else {
- return fetch(REQUEST_URL, {
- method: 'GET',
- })
- .then((resp) => resp.json())
- .then((data) => {
- currentState = data.state.on
- // toggle light state
- on = !currentState
-
- return fetch(`${REQUEST_URL}/state`, {
- method: 'PUT',
- body: JSON.stringify({ on: on }),
- })
- .then((resp) => resp.json())
- .then((data) => {
- res.json(data)
- return
- })
- })
- }
-
- return fetch(`${REQUEST_URL}/state`, {
- method: 'PUT',
- body: JSON.stringify({ on: on }),
- })
- .then((resp) => resp.json())
- .then((data) => {
- res.json(data)
- return
- })
-}
-
-export default flipLights
diff --git a/pages/api/log-treatment.ts b/pages/api/log-treatment.ts
deleted file mode 100644
index e2f33f6..0000000
--- a/pages/api/log-treatment.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import {
- getRecentUserInfusionsByApiKey,
- postInfusionByApiKey,
-} from 'lib/admin-db/infusions'
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const logTreatment = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'POST') {
- return res.status(405).send('Requires POST method.')
- }
-
- try {
- const { apikey } = req.query
- if (!apikey) {
- throw { message: 'Access denied. Missing api key.' }
- }
-
- if (!req.body) {
- throw { message: 'Missing infusion data.' }
- }
-
- const { infusions, error } = await getRecentUserInfusionsByApiKey(
- apikey as string
- )
-
- if (error) throw error
-
- const mostRecentInfusion =
- infusions && infusions.length > 0 ? infusions[0] : null
-
- try {
- const { infusion, error } = await postInfusionByApiKey(
- apikey as string,
- mostRecentInfusion,
- req.body
- )
- if (error) throw error
- return res.status(200).json(infusion)
- } catch (error: unknown) {
- const errorMessage =
- error &&
- typeof error === 'object' &&
- 'message' in error &&
- typeof error.message === 'string'
- ? error.message
- : 'An error occurred'
- return res.status(500).send(errorMessage)
- }
- } catch (error: unknown) {
- const errorMessage =
- error &&
- typeof error === 'object' &&
- 'message' in error &&
- typeof error.message === 'string'
- ? error.message
- : 'An error occurred'
- return res.status(500).send(errorMessage)
- }
-}
-
-export default logTreatment
diff --git a/pages/api/recent-treatments.ts b/pages/api/recent-treatments.ts
deleted file mode 100644
index ff59ae0..0000000
--- a/pages/api/recent-treatments.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { getRecentUserInfusionsByApiKey } from 'lib/admin-db/infusions'
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const recentTreatments = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'GET') {
- return res.status(405).send('Requires GET method.')
- }
- try {
- const { apikey, alertid } = req.query
- if (!apikey && !alertid) {
- throw { message: 'Access denied. Missing api key.' }
- }
-
- const { infusions, error } = await getRecentUserInfusionsByApiKey(
- apikey as string,
- alertid as string
- )
-
- if (error) {
- throw error
- }
-
- return res.status(200).json(infusions)
- } catch (error: unknown) {
- const errorMessage =
- error &&
- typeof error === 'object' &&
- 'message' in error &&
- typeof error.message === 'string'
- ? error.message
- : 'An error occurred'
- return res.status(500).send(errorMessage)
- }
-}
-
-export default recentTreatments
diff --git a/pages/api/treatments.ts b/pages/api/treatments.ts
deleted file mode 100644
index f072c93..0000000
--- a/pages/api/treatments.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { getAllInfusionsByApiKey } from 'lib/admin-db/infusions'
-import type { NextApiRequest, NextApiResponse } from 'next'
-
-const treatments = async (req: NextApiRequest, res: NextApiResponse) => {
- if (req.method !== 'GET') {
- return res.status(405).send('Requires GET method.')
- }
- try {
- const { apikey } = req.query
- if (!apikey) {
- throw { message: 'Access denied. Missing api key.' }
- }
-
- const { infusions, error } = await getAllInfusionsByApiKey(apikey as string)
-
- if (error) {
- throw error
- }
-
- return res.status(200).json(infusions)
- } catch (error: unknown) {
- const errorMessage =
- error &&
- typeof error === 'object' &&
- 'message' in error &&
- typeof error.message === 'string'
- ? error.message
- : 'An error occurred'
- return res.status(500).send(errorMessage)
- }
-}
-
-export default treatments
diff --git a/pages/changelog/hello-world-again.tsx b/pages/changelog/hello-world-again.tsx
deleted file mode 100644
index 462a1d7..0000000
--- a/pages/changelog/hello-world-again.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-import Head from 'next/head'
-import { Text, Divider, Display, Image, Spacer } from '@geist-ui/react'
-import styled from 'styled-components'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'Hello world... again',
- image: ['https://hemolog.com/images/insights-example.png'],
- datePublished: '2020-02-05T08:00:00+08:00',
- dateModified: '2020-02-05T09:20:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
- Changelog
-
- Development blog about new features, fixes, and updates to Hemolog
-
-
-
-
- Hello world...again
- Hemolog is back and better than ever
-
-
- Update #1
-
- Hemolog is back! After 8 years, I’ve built a reincarnation of
- the old iPhone app Hemolog. This time around, it does a bit more
- than just storing your treatment logs. In this incarnation,
- Hemolog is now a web app and helps you understand your logs by
- giving showing you stats.
-
-
- The original Hemolog was built with the help of a contract
- developer. This time around I’ve designed and built everything
- from the ground up with the purpose of being the best place to
- store your infusion data and learn from it.
-
-
-
-
-
-
-
- These insights are calculated as you add more data. Filters will
- allow you to choose different time frames for viewing your data
- down the road giving you the best most comprehensive view into
- your treatment history ever. I’ve chosen a few insights that are
- interesting for me. If you have thoughts on what you would like
- to see just let me know.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-`
-
-const StyledChangelogContent = styled.div`
- max-width: 480pt;
- margin: 0 auto;
-`
-
-const StyledPost = styled.article`
- padding-bottom: 64px;
-`
diff --git a/pages/changelog/index.tsx b/pages/changelog/index.tsx
deleted file mode 100644
index ee56e9b..0000000
--- a/pages/changelog/index.tsx
+++ /dev/null
@@ -1,209 +0,0 @@
-import Head from 'next/head'
-import { Text, Divider, Image, Spacer, Link, useTheme } from '@geist-ui/react'
-import styled from 'styled-components'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const theme = useTheme()
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
- Changelog
-
- Development blog about new features, fixes, and updates to Hemolog
-
-
-
-
-
- Log treatments at the speed of light
-
- A brand new way to log treatments, directly from your keyboard.
- Now available on Mac and Windows (beta) via{' '}
- Raycast .
-
-
- Update #4
-
- One of my favorite tools to use on my Mac is{' '}
- Raycast . It’s a productivity
- tool that lets you quickly launch apps, search the web, and run
- commands all from your keyboard.
-
-
-
- Continue reading
-
-
-
-
-
-
-
-
-
-
- A brand new treatment type
-
- It’s finally here. Monoclonal antibodies officially can treat
- hemophilia, giving us a new method of getting our medicine in
- our body and a whole lot more.
-
-
- Update #3
-
- I never thought I’d say this, but I no longer simply{' '}
- infuse to treat bleeds. I also inject .
-
-
- That might not sound like a huge difference off the bat, but I
- can assure you it is. Having to find a vein all the time is now
- a thing of the past, finally we can inject subcutaneously under
- the skin, like so many other people. I’m so excited for what
- this means for people with bad or damage veins and kids! It’s
- just lessens the burden so much.
-
-
-
- Continue reading
-
-
-
-
-
-
-
-
-
-
- Mobile enhancements
-
- Looks great on your desktop and mobile devices!
-
-
- Update #2
-
- I designed Hemolog to be used anywhere. That meant building a
- web app verses an iPhone, Android, or some hybrid app.
-
-
-
- Continue reading
-
-
-
-
-
-
-
-
-
- Hello world...again
- Hemolog is back and better than ever
-
-
- Update #1
-
- Hemolog is back! After 8 years, I’ve built a reincarnation of
- the old iPhone app Hemolog. This time around, it does a bit more
- than just storing your treatment logs. In this incarnation,
- Hemolog is now a web app and helps you understand your logs by
- giving showing you stats.
-
-
- The original Hemolog was built with the help of a contract
- developer. This time around I’ve designed and built everything
- from the ground up with the purpose of being the best place to
- store your infusion data and learn from it.
-
-
-
-
- Continue reading
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-`
-
-const StyledChangelogContent = styled.div`
- max-width: 480pt;
- margin: 0 auto;
-`
-
-const StyledPost = styled.section`
- padding-bottom: 64px;
-`
-const StyledRow = styled.div`
- display: flex;
- justify-content: 'space-between';
-
- a.link {
- display: block;
- width: 100%;
- }
-`
diff --git a/pages/changelog/mobile-enhancements.tsx b/pages/changelog/mobile-enhancements.tsx
deleted file mode 100644
index 1b41687..0000000
--- a/pages/changelog/mobile-enhancements.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-import Head from 'next/head'
-import {
- Text,
- Divider,
- Display,
- Image,
- Spacer,
- Link,
- Note,
-} from '@geist-ui/react'
-import Share from '@geist-ui/react-icons/share'
-import ChevronLeft from '@geist-ui/react-icons/chevronLeft'
-import styled from 'styled-components'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'Mobile enhancements',
- image: ['https://hemolog.com/images/changelog/iphone-hemolog-light.png'],
- datePublished: '2020-02-05T08:00:00+08:00',
- dateModified: '2020-02-05T09:20:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
- Changelog
-
-
-
- Back to list of updates
-
-
-
-
-
-
- Mobile enhancements
-
- Looks great on your desktop and mobile devices!
-
-
- Update #2
-
- I designed Hemolog to be used anywhere. That meant building a
- web app verses an iPhone, Android, or some hybrid app.
-
-
- The original Hemolog was built with the help of a contract
- developer. This time around I’ve designed and built everything
- from the ground up with the purpose of being the best place to
- store your infusion data and learn from it.
-
-
-
-
-
- Visit Hemolog.com using Safari on your iPhone and click the{' '}
- icon, then scroll down to ’Add to Home
- Screen’ to create an app icon.
-
-
-
-
-
-
- 😎
- {' '}
-
- Sneak peak of what’s coming next
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-`
-
-const StyledChangelogContent = styled.div`
- max-width: 480pt;
- margin: 0 auto;
-`
-
-const StyledPost = styled.article`
- padding-bottom: 64px;
-`
-
-const StyledRow = styled.span`
- display: flex;
- align-items: center;
-`
diff --git a/pages/changelog/monoclonal-antibodies.tsx b/pages/changelog/monoclonal-antibodies.tsx
deleted file mode 100644
index 00fdfb3..0000000
--- a/pages/changelog/monoclonal-antibodies.tsx
+++ /dev/null
@@ -1,140 +0,0 @@
-import Head from 'next/head'
-import { Text, Divider, Spacer, Link } from '@geist-ui/react'
-
-import ChevronLeft from '@geist-ui/react-icons/chevronLeft'
-import styled from 'styled-components'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'A brand new treatment type',
- image: ['https://hemolog.com/images/changelog/iphone-hemolog-light.png'],
- datePublished: '2022-04-04T07:09:00+08:00',
- dateModified: '2022-04-04T07:09:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
- Changelog
-
-
-
- Back to list of updates
-
-
-
-
-
-
- A brand new treatment type
-
- It’s finally here. Monoclonal antibodies officially can treat
- hemophilia, giving us a new method of getting our medicine in
- our body and a whole lot more.
-
-
- Update #3
-
- I never thought I’d say this, but I no longer simply{' '}
- infuse to treat bleeds. I also inject .
-
-
- That might not sound like a huge difference off the bat, but I
- can assure you it is. Having to find a vein all the time is now
- a thing of the past, finally we can inject subcutaneously under
- the skin, like so many other people. I’m so excited for what
- this means for people with bad or damage veins and kids! It’s
- just lessens the burden so much.
-
-
- I’m now using a drug called{' '}
- Hemlibra which is one of
- these new{' '}
-
- monoclonal antibodies
-
- , I needed to add a completely new category to Hemolog. This
- wasn’t as easy as just adding a new medication. The first thing
- you’ll notice is that I decided to rename infusions {' '}
- across the site to treatments . This means we can now
- specify between infusions and injections when logging a
- treatment.
-
-
- Once more drugs are on the market I’ll update the list of
- medications available, but for now feel free to add your own
- manually. To update this, visit your{' '}
- profile page .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-`
-
-const StyledChangelogContent = styled.div`
- max-width: 480pt;
- margin: 0 auto;
-`
-
-const StyledPost = styled.article`
- padding-bottom: 64px;
-`
-
-const StyledRow = styled.span`
- display: flex;
- align-items: center;
-`
diff --git a/pages/changelog/raycast-extension.tsx b/pages/changelog/raycast-extension.tsx
deleted file mode 100644
index 4bd9e95..0000000
--- a/pages/changelog/raycast-extension.tsx
+++ /dev/null
@@ -1,156 +0,0 @@
-import Head from 'next/head'
-import { Text, Divider, Spacer, Link, Image } from '@geist-ui/react'
-
-import ChevronLeft from '@geist-ui/react-icons/chevronLeft'
-import styled from 'styled-components'
-
-import StaticHeader from 'components/staticHeader'
-import Footer from 'components/footer'
-import BlogFooter from 'components/blog/blogFooter'
-import PostFooter from 'components/blog/postFooter'
-
-const Changelog = (): JSX.Element => {
- const articleRichResults = {
- '@context': 'https://schema.org',
- '@type': 'NewsArticle',
- headline: 'Log treatments at the speed of light',
- image: ['https://hemolog.com/images/changelog/raycast.png'],
- datePublished: '2025-09-22T06:09:00+08:00',
- dateModified: '2025-09-22T06:09:00+08:00',
- }
-
- return (
- <>
-
- Hemolog - Changelog
-
-
-
-
-
-
- Changelog
-
-
-
- Back to list of updates
-
-
-
-
-
-
- Log treatments at the speed of light
-
- A brand new way to log treatments, directly from your keyboard.
- Now available on Mac and Windows (beta) via{' '}
- Raycast .
-
-
- Update #4
-
- One of my favorite tools to use on my Mac is{' '}
- Raycast . It’s a productivity
- tool that lets you quickly launch apps, search the web, and run
- commands all from your keyboard.
-
-
- Raycast has an{' '}
- extensions {' '}
- ecosystem that lets you extend its functionality. I decided to
- build an extension for Hemolog that lets you log treatments
- directly from Raycast. It’s super quick and easy to use, and
- it’s available for free on the Raycast Store.
-
-
-
- To get started, you’ll need to install{' '}
- Raycast on your Mac or Windows
- PC! (the Windows app is currently in beta).
-
-
-
-
-
- Once you have Raycast installed, you can install the Hemolog
- extension from the{' '}
-
- Raycast Store
-
- . After that, you’ll need to connect your Hemolog account to the
- extension. It’s as easy as logging into your hemolog account and
- visiting your{' '}
- profile page . Here
- you’ll find your API key . Launch the Hemolog extension in
- Raycast and you’ll be prompted to enter your API key .
- Paste it in, and you’re all set!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-export default Changelog
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-`
-
-const StyledChangelogContent = styled.div`
- max-width: 480pt;
- margin: 0 auto;
-`
-
-const StyledPost = styled.article`
- padding-bottom: 64px;
-`
-
-const StyledRow = styled.span`
- display: flex;
- align-items: center;
-`
diff --git a/pages/emergency/[alertId].tsx b/pages/emergency/[alertId].tsx
deleted file mode 100644
index 6f3ad43..0000000
--- a/pages/emergency/[alertId].tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-import { useRouter } from 'next/router'
-import Head from 'next/head'
-import NextLink from 'next/link'
-import styled from 'styled-components'
-
-import useEmergencyUser from 'lib/hooks/useEmergencyUser'
-import { FirestoreStatusType } from 'lib/hooks/useFirestoreQuery'
-import { Loading, Note, Text, Grid, Link } from '@geist-ui/react'
-import EmergencyInfo from 'components/emergencyInfo'
-import Footer from 'components/footer'
-
-const Emergency = (): JSX.Element => {
- const router = useRouter()
- const { alertId } = router.query
- let isExample = false
-
- if (alertId === 'example') {
- isExample = true
- }
-
- const { person, status, error } = useEmergencyUser(
- isExample ? 'mike29' : alertId
- )
-
- return (
- <>
-
- Emergency - from Hemolog
-
-
-
-
- Emergency Info
-
-
-
- Hemolog.com
-
-
-
-
-
-
- This page shows the most recent medical logs for someone with
- hemophilia.
- This data is self reported and may not be up-to-date.
-
-
-
- If someone has been in an accident, please call{' '}
- 911 immediately.
-
-
-
-
- {status === FirestoreStatusType.LOADING && (
- Loading emergency info
- )}
-
- {error && (
-
- Something went wrong. This could mean that this person no longer
- has a Hemolog account or the app is broken.
-
- )}
-
- {!person && status !== FirestoreStatusType.LOADING && (
-
- Nothing could be found at this address. Please make sure the URL
- matches the link provided on the Hemolog Emergency Card.
-
- )}
-
- {person && }
-
-
-
- >
- )
-}
-
-export default Emergency
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 0 24px;
-`
diff --git a/pages/emergency/print.tsx b/pages/emergency/print.tsx
deleted file mode 100644
index 4a7c8da..0000000
--- a/pages/emergency/print.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import Head from 'next/head'
-import { Page, Text, Grid } from '@geist-ui/react'
-import styled from 'styled-components'
-
-import Logo from 'components/logo'
-import EmergencyCard from 'components/emergencyCard'
-
-export default function Print(): JSX.Element {
- // TODO(michael) Could improve this by determining the user on the server side
- // and redirecting before hitting this page. Similar to how Lee Robinson explains
- // it here https://www.youtube.com/watch?v=NSR_Y_rm_zU
-
- return (
-
-
- Hemolog - Print
-
-
-
-
-
-
-
-
-
- Print and cut your emergency card
-
-
- To print, go to File {'>'} Print , or hit Control + P {' '}
- (Command on Mac).
-
-
- Keep the card in your wallet or in your car.
-
-
-
-
-
-
-
-
- )
-}
-
-const StyledForPrint = styled.div`
- @media print {
- header,
- .hide-from-printer {
- display: none !important;
- }
- }
-
- .emergency-card {
- box-shadow: none !important;
- }
-
- @media print {
- color-adjust: exact !important;
- print-color-adjust: exact !important;
- -webkit-print-color-adjust: exact !important;
- }
-`
-
-const StyledCutOut = styled.div`
- display: inline-block;
- padding: 2px;
- border: 2px dashed rgba(0, 0, 0, 0.5);
- border-radius: 20px;
-`
diff --git a/pages/home.tsx b/pages/home.tsx
deleted file mode 100644
index 904cf41..0000000
--- a/pages/home.tsx
+++ /dev/null
@@ -1,137 +0,0 @@
-import { useEffect } from 'react'
-import Head from 'next/head'
-import { useRouter } from 'next/router'
-import { Tabs } from '@geist-ui/react'
-import styled from 'styled-components'
-
-import Header from 'components/header'
-import Footer from 'components/footer'
-import { withAuth } from 'components/withAuth'
-import { useAuth, ProtectRoute } from 'lib/auth'
-import HomePage from 'components/homePage'
-import ProfilePage from 'components/profilePage'
-import FeedbackPage from 'components/feedbackPage'
-import { track } from 'lib/helpers'
-
-export async function getStaticProps() {
- return {
- props: {
- version: process.env.npm_package_version,
- },
- }
-}
-
-const Home = (props: { version: string }): JSX.Element => {
- // TODO(michael) add welcome message by checking to see if this is the users
- // first time logging in. Still not sure how to accomplish this.
- //
- // const [toasts, setToast] = useToasts()
-
- // // displays welcome message on first login
- // useEffect(() => {
- // if (user && !toasts.length) {
- // setToast({
- // text: '👋 Welcome to Hemolog 2!',
- // delay: 12000,
- // type: 'success',
- // actions: [
- // {
- // name: 'thanks',
- // passive: true,
- // handler: (_event, cancel) => cancel(),
- // },
- // ],
- // })
- // }
- // }, [user])
-
- // TODO(michael): Could improve this by determining the user on the server side
- // and redirecting before hitting this page. Similar to how Lee Robinson explains
- // it here https://www.youtube.com/watch?v=NSR_Y_rm_zU
-
- const { user } = useAuth()
- const router = useRouter()
- const { version } = props
-
- useEffect(() => {
- if (user) {
- track('Logged In', {
- uid: user.uid,
- email: user.email,
- appVersion: version,
- })
- }
- }, [user, version])
-
- return (
-
-
- Hemolog
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/*
- */}
-
- {user?.isAdmin && (
-
-
-
-
-
- )}
-
-
-
-
-
- )
-}
-
-export default withAuth(Home)
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageHeader = styled.header`
- padding: 24px;
-`
-
-const StyledPageContent = styled.main`
- padding: 0 24px;
-`
-
-const StyledPageSection = styled.section`
- padding: 40px 0 0 0;
-`
diff --git a/pages/index.tsx b/pages/index.tsx
deleted file mode 100644
index d6be3d8..0000000
--- a/pages/index.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import Head from 'next/head'
-import NextLink from 'next/link'
-import Image from 'next/image'
-import { Text, Spacer, Grid } from '@geist-ui/react'
-import styled from 'styled-components'
-
-import Footer from 'components/footer'
-import StaticHeader from 'components/staticHeader'
-import DescriptionCards from 'components/descriptionCards'
-
-export default function Landing(): JSX.Element {
- return (
- <>
-
- Hemolog
-
-
-
-
-
-
-
-
-
- TREATMENT INSIGHTS
- THAT MATTER
-
- The last treatment log you’ll ever need.
-
-
-
- Log your treatments and get fantastic insights that help you
- change your habits.
-
- Sign up for free and start using the newest version of Hemolog
- today!
-
-
-
-
- Learn more about the Hemolog story...
-
-
-
-
-
-
-
-
-
-
-
-
- >
- )
-}
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-
- @media (max-width: 768px) {
- h1 {
- font-size: 50px !important;
- line-height: 50px !important;
- }
- }
-`
-
-const StyledImage = styled.div`
- position: absolute;
- right: 0;
- width: 50%;
-`
diff --git a/pages/signin.tsx b/pages/signin.tsx
deleted file mode 100644
index 056cb02..0000000
--- a/pages/signin.tsx
+++ /dev/null
@@ -1,122 +0,0 @@
-import Head from 'next/head'
-import {
- Text,
- Fieldset,
- Grid,
- Spacer,
- Link,
- Button,
- Note,
- Tag,
-} from '@geist-ui/react'
-import styled from 'styled-components'
-
-import Logo from 'components/logo'
-import Footer from 'components/footer'
-import { withAuth } from 'components/withAuth'
-import { useAuth } from 'lib/auth'
-
-export async function getStaticProps() {
- return {
- props: {
- version: process.env.npm_package_version,
- },
- }
-}
-
-const Signin = (pageProps: { version: string }) => {
- const { version } = pageProps
- const auth = useAuth()
-
- return (
- <>
-
- Hemolog - Sign in
-
-
-
-
-
-
- v{version}
-
-
-
-
-
- Hemolog is currently in development. Data integrety is not
- guaranteed. Hemolog is{' '}
-
- not
- {' '}
- HIPAA compliant... yada yada yada.
-
-
-
-
- Register or sign in
-
- Signing in will create an account if you don’t have one yet.
- Don’t worry, Hemolog will always be free .
-
-
-
- {!process.env.NEXT_PUBLIC_USE_EMULATORS && (
- auth.signinWithGoogle?.('/home')}
- loading={auth.loading}
- type='success-light'
- scale={3 / 4}
- >
- Continue with Google
-
- )}
- {process.env.NEXT_PUBLIC_USE_EMULATORS && (
- auth.signinWithTestUser?.()}
- loading={auth.loading}
- type='success-light'
- scale={3 / 4}
- >
- Continue with Test User
-
- )}
-
-
-
-
- {/*
-
- */}
-
-
-
- >
- )
-}
-
-export default withAuth(Signin)
-
-const StyledPage = styled.div`
- height: 100%;
- display: flex;
- flex-direction: column;
- max-width: 850pt;
- width: 100%;
- margin: 0 auto;
-
- main {
- flex: 1 0 auto;
- }
- footer {
- flex-shrink: 0;
- }
-`
-
-const StyledPageHeader = styled.header`
- padding: 24px;
-`
-
-const StyledPageContent = styled.main`
- padding: 40px 24px 0 24px;
-`
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 93a6380..19f6502 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,12 +8,15 @@ importers:
.:
dependencies:
- '@geist-ui/react':
- specifier: 2.2.5
- version: 2.2.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
- '@geist-ui/react-icons':
- specifier: ^1.0.1
- version: 1.0.1(@geist-ui/react@2.2.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react@17.0.2)
+ '@silk-hq/components':
+ specifier: ^0.10.0
+ version: 0.10.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ '@tanstack/react-query':
+ specifier: ^5.62.0
+ version: 5.90.14(react@19.2.3)
+ '@tanstack/react-table':
+ specifier: ^8.21.3
+ version: 8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
date-fns:
specifier: ^2.30.0
version: 2.30.0
@@ -25,193 +28,170 @@ importers:
version: 12.7.0(encoding@0.1.13)
formik:
specifier: ^2.4.9
- version: 2.4.9(@types/react@17.0.89)(react@17.0.2)
- isomorphic-unfetch:
- specifier: ^3.1.0
- version: 3.1.0(encoding@0.1.13)
+ version: 2.4.9(@types/react@19.2.8)(react@19.2.3)
js-cookie:
specifier: ^2.2.1
version: 2.2.1
- nanoid:
- specifier: ^3.3.11
- version: 3.3.11
next:
- specifier: ^12.3.7
- version: 12.3.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
+ specifier: ^16.1.1
+ version: 16.1.1(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react:
- specifier: ^17.0.2
- version: 17.0.2
+ specifier: ^19.2.3
+ version: 19.2.3
react-dom:
- specifier: ^17.0.2
- version: 17.0.2(react@17.0.2)
+ specifier: ^19.2.3
+ version: 19.2.3(react@19.2.3)
react-qr-code:
specifier: ^2.0.18
- version: 2.0.18(react@17.0.2)
- react-vis:
- specifier: ^1.12.1
- version: 1.12.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
- styled-components:
- specifier: ^6.1.19
- version: 6.1.19(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
- swr:
- specifier: ^1.3.0
- version: 1.3.0(react@17.0.2)
+ version: 2.0.18(react@19.2.3)
+ recharts:
+ specifier: ^3.6.0
+ version: 3.6.0(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react-is@17.0.2)(react@19.2.3)(redux@5.0.1)
underscore:
specifier: ^1.13.7
version: 1.13.7
devDependencies:
'@biomejs/biome':
- specifier: 2.3.5
- version: 2.3.5
+ specifier: 2.3.12
+ version: 2.3.12
'@next/bundle-analyzer':
specifier: ^16.1.1
version: 16.1.1
+ '@tabler/icons-react':
+ specifier: ^3.36.0
+ version: 3.36.0(react@19.2.3)
+ '@tailwindcss/postcss':
+ specifier: ^4.1.18
+ version: 4.1.18
'@testing-library/cypress':
- specifier: ^8.0.7
- version: 8.0.7(cypress@10.11.0)
+ specifier: ^10.1.0
+ version: 10.1.0(cypress@15.8.1)
'@types/js-cookie':
specifier: ^2.2.7
version: 2.2.7
'@types/node':
- specifier: ^20.19.24
- version: 20.19.24
+ specifier: ^22.19.3
+ version: 22.19.3
'@types/react':
- specifier: ^17.0.89
- version: 17.0.89
- '@types/react-vis':
- specifier: ^1.11.15
- version: 1.11.15
- '@types/styled-components':
- specifier: ^5.1.35
- version: 5.1.35
+ specifier: ^19.0.0
+ version: 19.2.8
+ '@types/react-dom':
+ specifier: ^19.0.0
+ version: 19.2.3(@types/react@19.2.8)
'@types/underscore':
specifier: ^1.13.0
version: 1.13.0
- babel-plugin-styled-components:
- specifier: ^1.13.3
- version: 1.13.3(styled-components@6.1.19(react-dom@17.0.2(react@17.0.2))(react@17.0.2))
+ autoprefixer:
+ specifier: ^10.4.23
+ version: 10.4.23(postcss@8.5.6)
cypress:
- specifier: ^10.11.0
- version: 10.11.0
+ specifier: ^15.8.1
+ version: 15.8.1
dotenv:
specifier: ^17.2.3
version: 17.2.3
firebase-tools:
- specifier: ^9.23.3
- version: 9.23.3(encoding@0.1.13)
+ specifier: ^15.1.0
+ version: 15.1.0(@types/node@22.19.3)(encoding@0.1.13)(hono@4.11.3)(typescript@5.9.3)
husky:
specifier: ^7.0.4
version: 7.0.4
lint-staged:
specifier: ^12.5.0
version: 12.5.0(enquirer@2.4.1)
+ nanoid:
+ specifier: ^5.0.9
+ version: 5.1.6
+ react-hot-toast:
+ specifier: ^2.6.0
+ version: 2.6.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ tailwindcss:
+ specifier: ^4.0.0
+ version: 4.0.0
typescript:
specifier: ^5.9.3
version: 5.9.3
packages:
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
'@apidevtools/json-schema-ref-parser@9.1.2':
resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==}
- '@babel/code-frame@7.27.1':
- resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/generator@7.28.5':
- resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-annotate-as-pure@7.27.3':
- resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
- engines: {node: '>=6.9.0'}
+ '@apphosting/build@0.1.7':
+ resolution: {integrity: sha512-zNgQGiAWDOj6c+4ylv5ej3nLGXzMAVmzCGMqlbSarHe4bvBmZ2C5GfBRdJksedP7C9pqlwTWpxU5+GSzhJ+nKA==}
+ hasBin: true
- '@babel/helper-globals@7.28.0':
- resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
- engines: {node: '>=6.9.0'}
+ '@apphosting/common@0.0.8':
+ resolution: {integrity: sha512-RJu5gXs2HYV7+anxpVPpp04oXeuHbV3qn402AdXVlnuYM/uWo7aceqmngpfp6Bi376UzRqGjfpdwFHxuwsEGXQ==}
- '@babel/helper-module-imports@7.27.1':
- resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
- engines: {node: '>=6.9.0'}
+ '@apphosting/common@0.0.9':
+ resolution: {integrity: sha512-ZbPZDcVhEN+8m0sf90PmQN4xWaKmmySnBSKKPaIOD0JvcDsRr509WenFEFlojP++VSxwFZDGG/TYsHs1FMMqpw==}
- '@babel/helper-string-parser@7.27.1':
- resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.28.5':
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.28.5':
- resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
'@babel/runtime@7.28.4':
resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'}
- '@babel/template@7.27.2':
- resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/traverse@7.28.5':
- resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/types@7.28.5':
- resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
- engines: {node: '>=6.9.0'}
-
- '@biomejs/biome@2.3.5':
- resolution: {integrity: sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg==}
+ '@biomejs/biome@2.3.12':
+ resolution: {integrity: sha512-AR7h4aSlAvXj7TAajW/V12BOw2EiS0AqZWV5dGozf4nlLoUF/ifvD0+YgKSskT0ylA6dY1A8AwgP8kZ6yaCQnA==}
engines: {node: '>=14.21.3'}
hasBin: true
- '@biomejs/cli-darwin-arm64@2.3.5':
- resolution: {integrity: sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw==}
+ '@biomejs/cli-darwin-arm64@2.3.12':
+ resolution: {integrity: sha512-cO6fn+KiMBemva6EARDLQBxeyvLzgidaFRJi8G7OeRqz54kWK0E+uSjgFaiHlc3DZYoa0+1UFE8mDxozpc9ieg==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [darwin]
- '@biomejs/cli-darwin-x64@2.3.5':
- resolution: {integrity: sha512-qpT8XDqeUlzrOW8zb4k3tjhT7rmvVRumhi2657I2aGcY4B+Ft5fNwDdZGACzn8zj7/K1fdWjgwYE3i2mSZ+vOA==}
+ '@biomejs/cli-darwin-x64@2.3.12':
+ resolution: {integrity: sha512-/fiF/qmudKwSdvmSrSe/gOTkW77mHHkH8Iy7YC2rmpLuk27kbaUOPa7kPiH5l+3lJzTUfU/t6x1OuIq/7SGtxg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [darwin]
- '@biomejs/cli-linux-arm64-musl@2.3.5':
- resolution: {integrity: sha512-eGUG7+hcLgGnMNl1KHVZUYxahYAhC462jF/wQolqu4qso2MSk32Q+QrpN7eN4jAHAg7FUMIo897muIhK4hXhqg==}
+ '@biomejs/cli-linux-arm64-musl@2.3.12':
+ resolution: {integrity: sha512-aqkeSf7IH+wkzFpKeDVPSXy9uDjxtLpYA6yzkYsY+tVjwFFirSuajHDI3ul8en90XNs1NA0n8kgBrjwRi5JeyA==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-arm64@2.3.5':
- resolution: {integrity: sha512-u/pybjTBPGBHB66ku4pK1gj+Dxgx7/+Z0jAriZISPX1ocTO8aHh8x8e7Kb1rB4Ms0nA/SzjtNOVJ4exVavQBCw==}
+ '@biomejs/cli-linux-arm64@2.3.12':
+ resolution: {integrity: sha512-nbOsuQROa3DLla5vvsTZg+T5WVPGi9/vYxETm9BOuLHBJN3oWQIg3MIkE2OfL18df1ZtNkqXkH6Yg9mdTPem7A==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
- '@biomejs/cli-linux-x64-musl@2.3.5':
- resolution: {integrity: sha512-awVuycTPpVTH/+WDVnEEYSf6nbCBHf/4wB3lquwT7puhNg8R4XvonWNZzUsfHZrCkjkLhFH/vCZK5jHatD9FEg==}
+ '@biomejs/cli-linux-x64-musl@2.3.12':
+ resolution: {integrity: sha512-kVGWtupRRsOjvw47YFkk5mLiAdpCPMWBo1jOwAzh+juDpUb2sWarIp+iq+CPL1Wt0LLZnYtP7hH5kD6fskcxmg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-linux-x64@2.3.5':
- resolution: {integrity: sha512-XrIVi9YAW6ye0CGQ+yax0gLfx+BFOtKaNX74n+xHWla6Cl6huUmcKNO7HPx7BiKnJUzrxXY1qYlm7xMvi08X4g==}
+ '@biomejs/cli-linux-x64@2.3.12':
+ resolution: {integrity: sha512-CQtqrJ+qEEI8tgRSTjjzk6wJAwfH3wQlkIGsM5dlecfRZaoT+XCms/mf7G4kWNexrke6mnkRzNy6w8ebV177ow==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
- '@biomejs/cli-win32-arm64@2.3.5':
- resolution: {integrity: sha512-DlBiMlBZZ9eIq4H7RimDSGsYcOtfOIfZOaI5CqsWiSlbTfqbPVfWtCf92wNzx8GNMbu1s7/g3ZZESr6+GwM/SA==}
+ '@biomejs/cli-win32-arm64@2.3.12':
+ resolution: {integrity: sha512-Re4I7UnOoyE4kHMqpgtG6UvSBGBbbtvsOvBROgCCoH7EgANN6plSQhvo2W7OCITvTp7gD6oZOyZy72lUdXjqZg==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [win32]
- '@biomejs/cli-win32-x64@2.3.5':
- resolution: {integrity: sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ==}
+ '@biomejs/cli-win32-x64@2.3.12':
+ resolution: {integrity: sha512-qqGVWqNNek0KikwPZlOIoxtXgsNGsX+rgdEzgw82Re8nF02W+E2WokaQhpF5TdBh/D/RQ3TLppH+otp6ztN0lw==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [win32]
@@ -224,8 +204,12 @@ packages:
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
engines: {node: '>=0.1.90'}
- '@cypress/request@2.88.12':
- resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==}
+ '@cspotcode/source-map-support@0.8.1':
+ resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+ engines: {node: '>=12'}
+
+ '@cypress/request@3.0.9':
+ resolution: {integrity: sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==}
engines: {node: '>= 6'}
'@cypress/xvfb@1.2.4':
@@ -238,14 +222,19 @@ packages:
resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
engines: {node: '>=10.0.0'}
- '@emotion/is-prop-valid@1.2.2':
- resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==}
+ '@electric-sql/pglite-tools@0.2.19':
+ resolution: {integrity: sha512-Ls4ZcSymnFRlEHtDyO3k9qPXLg7awfRAE3YnXk4WLsint17JBsU4UEX8le9YE8SgPkWNnQC898SqbFGGU/5JUA==}
+ peerDependencies:
+ '@electric-sql/pglite': 0.3.14
+
+ '@electric-sql/pglite@0.2.17':
+ resolution: {integrity: sha512-qEpKRT2oUaWDH6tjRxLHjdzMqRUGYDnGZlKrnL4dJ77JVMcP2Hpo3NYnOSPKdZdeec57B6QPprCUFg0picx5Pw==}
- '@emotion/memoize@0.8.1':
- resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
+ '@electric-sql/pglite@0.3.14':
+ resolution: {integrity: sha512-3DB258dhqdsArOI1fIt7cb9RpUOgcDg5hXWVgVHAeqVQ/qxtFy605QKs4gx6mFq3jWsSPqDN8TgSEsqC3OfV9Q==}
- '@emotion/unitless@0.8.1':
- resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+ '@emnapi/runtime@1.7.1':
+ resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
'@fastify/busboy@3.2.0':
resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==}
@@ -487,71 +476,62 @@ packages:
'@firebase/webchannel-wrapper@1.0.5':
resolution: {integrity: sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==}
- '@geist-ui/react-icons@1.0.1':
- resolution: {integrity: sha512-/phre1NwXT0Mrxcq3yb+KksJ16/ykptgxI7+jh5pmDZfxnIMPlBWFBGDK0yw96oi752Wuo24X6+tkWjVe/g5Bg==}
- peerDependencies:
- '@geist-ui/react': '>=1.0.0'
- react: '>=16.13.0'
-
- '@geist-ui/react@2.2.5':
- resolution: {integrity: sha512-yPBAweYVh5HXXJ6W5ont/z6UObbfsjesg0/KTfcJzc64/zjGgp+wv2zLIdReGOTAj2R4XWoNSirNGGbQnwFe6w==}
- peerDependencies:
- react: '>=16.9.0'
- react-dom: '>=16.9.0'
+ '@google-cloud/cloud-sql-connector@1.8.5':
+ resolution: {integrity: sha512-CXOGLf/BUhZu5SoWKN8YqzcVQh8NSJi8bbeU06lZCh8f7aiNRfEmG8mG9hQcrl14u/WCq40fkqwQjADJvcO+Tw==}
+ engines: {node: '>=18'}
'@google-cloud/firestore@7.11.6':
resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==}
engines: {node: '>=14.0.0'}
- '@google-cloud/paginator@3.0.7':
- resolution: {integrity: sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==}
- engines: {node: '>=10'}
-
'@google-cloud/paginator@5.0.2':
resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==}
engines: {node: '>=14.0.0'}
- '@google-cloud/precise-date@2.0.4':
- resolution: {integrity: sha512-nOB+mZdevI/1Si0QAfxWfzzIqFdc7wrO+DYePFvgbOoMtvX+XfFTINNt7e9Zg66AbDbWCPRnikU+6f5LTm9Wyg==}
- engines: {node: '>=10.4.0'}
+ '@google-cloud/paginator@6.0.0':
+ resolution: {integrity: sha512-g5nmMnzC+94kBxOKkLGpK1ikvolTFCC3s2qtE4F+1EuArcJ7HHC23RDQVt3Ra3CqpUYZ+oXNKZ8n5Cn5yug8DA==}
+ engines: {node: '>=18'}
- '@google-cloud/projectify@2.1.1':
- resolution: {integrity: sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==}
- engines: {node: '>=10'}
+ '@google-cloud/precise-date@5.0.0':
+ resolution: {integrity: sha512-9h0Gvw92EvPdE8AK8AgZPbMnH5ftDyPtKm7/KUfcJVaPEPjwGDsJd1QV0H8esBDV4II41R/2lDWH1epBqIoKUw==}
+ engines: {node: '>=18'}
'@google-cloud/projectify@4.0.0':
resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==}
engines: {node: '>=14.0.0'}
+ '@google-cloud/projectify@5.0.0':
+ resolution: {integrity: sha512-XXQLaIcLrOAMWvRrzz+mlUGtN6vlVNja3XQbMqRi/V7XJTAVwib3VcKd7oRwyZPkp7rBVlHGcaqdyGRrcnkhlA==}
+ engines: {node: '>=18'}
+
'@google-cloud/promisify@2.0.4':
resolution: {integrity: sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==}
engines: {node: '>=10'}
- '@google-cloud/pubsub@2.19.4':
- resolution: {integrity: sha512-+aZxq6N5XGarQS3xGXjKSRFy4TB+3PMpI0CBmSrcC59g3TB5nmwps3pv/KkdLa0Cd+CPHDdfrEW1uSrGBMLICw==}
- engines: {node: '>=10'}
+ '@google-cloud/promisify@5.0.0':
+ resolution: {integrity: sha512-N8qS6dlORGHwk7WjGXKOSsLjIjNINCPicsOX6gyyLiYk7mq3MtII96NZ9N2ahwA2vnkLmZODOIH9rlNniYWvCQ==}
+ engines: {node: '>=18'}
+
+ '@google-cloud/pubsub@5.2.0':
+ resolution: {integrity: sha512-YNSRBo85mgPQ9QuuzAHjmLwngIwmy2RjAUAoPl2mOL2+bCM0cAVZswPb8ylcsWJP7PgDJlck+ybv0MwJ9AM0sg==}
+ engines: {node: '>=18'}
'@google-cloud/storage@7.18.0':
resolution: {integrity: sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==}
engines: {node: '>=14'}
+ '@googleapis/sqladmin@31.1.0':
+ resolution: {integrity: sha512-k4lXSFCFuZmWtYuW/OH/PcHimZP5P/uDLK0+ACbgoZFB8qmlgcyF0531aJt6JHIdBwCRlHXZlMW4LDC5Gqra5w==}
+ engines: {node: '>=12.0.0'}
+
'@grpc/grpc-js@1.14.1':
resolution: {integrity: sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==}
engines: {node: '>=12.10.0'}
- '@grpc/grpc-js@1.6.12':
- resolution: {integrity: sha512-JmvQ03OTSpVd9JTlj/K3IWHSz4Gk/JMLUTtW7Zb0KvO1LcOYGATh5cNuRYzCAeDR3O8wq+q8FZe97eO9MBrkUw==}
- engines: {node: ^8.13.0 || >=10.10.0}
-
'@grpc/grpc-js@1.9.15':
resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==}
engines: {node: ^8.13.0 || >=10.10.0}
- '@grpc/proto-loader@0.6.9':
- resolution: {integrity: sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg==}
- engines: {node: '>=6'}
- hasBin: true
-
'@grpc/proto-loader@0.7.15':
resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==}
engines: {node: '>=6'}
@@ -562,6 +542,291 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ '@hono/node-server@1.19.7':
+ resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==}
+ engines: {node: '>=18.14.1'}
+ peerDependencies:
+ hono: ^4
+
+ '@img/colour@1.0.0':
+ resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@inquirer/ansi@1.0.2':
+ resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/checkbox@4.3.2':
+ resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/confirm@5.1.21':
+ resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/core@10.3.2':
+ resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/editor@4.2.23':
+ resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/expand@4.0.23':
+ resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/external-editor@1.0.3':
+ resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/figures@1.0.15':
+ resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==}
+ engines: {node: '>=18'}
+
+ '@inquirer/input@4.3.1':
+ resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/number@3.0.23':
+ resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/password@4.0.23':
+ resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/prompts@7.10.1':
+ resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/rawlist@4.1.11':
+ resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/search@3.2.2':
+ resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/select@4.4.2':
+ resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/type@3.0.10':
+ resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@isaacs/balanced-match@4.0.1':
+ resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
+ engines: {node: 20 || >=22}
+
+ '@isaacs/brace-expansion@5.0.0':
+ resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
+ engines: {node: 20 || >=22}
+
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
@@ -573,6 +838,9 @@ packages:
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -583,116 +851,125 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+ '@jridgewell/trace-mapping@0.3.9':
+ resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+
'@js-sdsl/ordered-map@4.4.2':
resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==}
'@jsdevtools/ono@7.1.3':
resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
+ '@modelcontextprotocol/sdk@1.25.1':
+ resolution: {integrity: sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@cfworker/json-schema': ^4.1.1
+ zod: ^3.25 || ^4.0
+ peerDependenciesMeta:
+ '@cfworker/json-schema':
+ optional: true
+
'@next/bundle-analyzer@16.1.1':
resolution: {integrity: sha512-aNJy301GGH8k36rDgrYdnyYEdjRQg6csMi1njzqHo+3qyZvOOWMHSv+p7SztNTzP5RU2KRwX0pPwYBtDcE+vVA==}
- '@next/env@12.3.7':
- resolution: {integrity: sha512-gCw4sTeHoNr0EUO+Nk9Ll21OzF3PnmM0GlHaKgsY2AWQSqQlMgECvB0YI4k21M9iGy+tQ5RMyXQuoIMpzhtxww==}
-
- '@next/swc-android-arm-eabi@12.3.4':
- resolution: {integrity: sha512-cM42Cw6V4Bz/2+j/xIzO8nK/Q3Ly+VSlZJTa1vHzsocJRYz8KT6MrreXaci2++SIZCF1rVRCDgAg5PpqRibdIA==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [android]
-
- '@next/swc-android-arm64@12.3.4':
- resolution: {integrity: sha512-5jf0dTBjL+rabWjGj3eghpLUxCukRhBcEJgwLedewEA/LJk2HyqCvGIwj5rH+iwmq1llCWbOky2dO3pVljrapg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [android]
+ '@next/env@16.1.1':
+ resolution: {integrity: sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==}
- '@next/swc-darwin-arm64@12.3.4':
- resolution: {integrity: sha512-DqsSTd3FRjQUR6ao0E1e2OlOcrF5br+uegcEGPVonKYJpcr0MJrtYmPxd4v5T6UCJZ+XzydF7eQo5wdGvSZAyA==}
+ '@next/swc-darwin-arm64@16.1.1':
+ resolution: {integrity: sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@12.3.4':
- resolution: {integrity: sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ==}
+ '@next/swc-darwin-x64@16.1.1':
+ resolution: {integrity: sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-freebsd-x64@12.3.4':
- resolution: {integrity: sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [freebsd]
-
- '@next/swc-linux-arm-gnueabihf@12.3.4':
- resolution: {integrity: sha512-3zqD3pO+z5CZyxtKDTnOJ2XgFFRUBciOox6EWkoZvJfc9zcidNAQxuwonUeNts6Xbm8Wtm5YGIRC0x+12YH7kw==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [linux]
-
- '@next/swc-linux-arm64-gnu@12.3.4':
- resolution: {integrity: sha512-kiX0vgJGMZVv+oo1QuObaYulXNvdH/IINmvdZnVzMO/jic/B8EEIGlZ8Bgvw8LCjH3zNVPO3mGrdMvnEEPEhKA==}
+ '@next/swc-linux-arm64-gnu@16.1.1':
+ resolution: {integrity: sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@12.3.4':
- resolution: {integrity: sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ==}
+ '@next/swc-linux-arm64-musl@16.1.1':
+ resolution: {integrity: sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@12.3.4':
- resolution: {integrity: sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag==}
+ '@next/swc-linux-x64-gnu@16.1.1':
+ resolution: {integrity: sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@12.3.4':
- resolution: {integrity: sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg==}
+ '@next/swc-linux-x64-musl@16.1.1':
+ resolution: {integrity: sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@12.3.4':
- resolution: {integrity: sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ==}
+ '@next/swc-win32-arm64-msvc@16.1.1':
+ resolution: {integrity: sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-ia32-msvc@12.3.4':
- resolution: {integrity: sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ==}
- engines: {node: '>= 10'}
- cpu: [ia32]
- os: [win32]
-
- '@next/swc-win32-x64-msvc@12.3.4':
- resolution: {integrity: sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg==}
+ '@next/swc-win32-x64-msvc@16.1.1':
+ resolution: {integrity: sha512-Ncwbw2WJ57Al5OX0k4chM68DKhEPlrXBaSXDCi2kPi5f4d8b3ejr3RRJGfKBLrn2YJL5ezNS7w2TZLHSti8CMw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@npmcli/agent@3.0.0':
- resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/agent@4.0.0':
+ resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- '@npmcli/fs@4.0.0':
- resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ '@npmcli/fs@5.0.0':
+ resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ '@npmcli/promise-spawn@3.0.0':
+ resolution: {integrity: sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
'@opentelemetry/api@1.9.0':
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
engines: {node: '>=8.0.0'}
- '@opentelemetry/semantic-conventions@1.38.0':
- resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==}
+ '@opentelemetry/core@1.30.1':
+ resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@opentelemetry/api': '>=1.0.0 <1.10.0'
+
+ '@opentelemetry/semantic-conventions@1.28.0':
+ resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==}
+ engines: {node: '>=14'}
+
+ '@opentelemetry/semantic-conventions@1.34.0':
+ resolution: {integrity: sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==}
engines: {node: '>=14'}
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
+ '@pnpm/config.env-replace@1.1.0':
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/network.ca-file@1.0.2':
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+
+ '@pnpm/npm-conf@2.3.1':
+ resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==}
+ engines: {node: '>=12'}
+
'@polka/url@1.0.0-next.29':
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
@@ -726,40 +1003,182 @@ packages:
'@protobufjs/utf8@1.1.0':
resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
- '@sindresorhus/is@0.14.0':
- resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
- engines: {node: '>=6'}
-
- '@so-ric/colorspace@1.1.6':
- resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
-
- '@swc/helpers@0.4.11':
- resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==}
+ '@reduxjs/toolkit@2.11.2':
+ resolution: {integrity: sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==}
+ peerDependencies:
+ react: ^16.9.0 || ^17.0.0 || ^18 || ^19
+ react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-redux:
+ optional: true
- '@szmarczak/http-timer@1.1.2':
- resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
- engines: {node: '>=6'}
+ '@silk-hq/components@0.10.0':
+ resolution: {integrity: sha512-hWObGDISQSmUpDkUHsDakxR4uKLh013kzrNdmRGQPA+waoXOpTBNmtQV/cQI0Do0I5JHxEqiOoMu0ey9bdkRzQ==}
+ peerDependencies:
+ react: ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- '@testing-library/cypress@8.0.7':
- resolution: {integrity: sha512-3HTV725rOS+YHve/gD9coZp/UcPK5xhr4H0GMnq/ni6USdtzVtSOG9WBFtd8rYnrXk8rrGD+0toRFYouJNIG0Q==}
- engines: {node: '>=12', npm: '>=6'}
+ '@sindresorhus/is@4.6.0':
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+
+ '@so-ric/colorspace@1.1.6':
+ resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==}
+
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@standard-schema/utils@0.3.0':
+ resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@tabler/icons-react@3.36.0':
+ resolution: {integrity: sha512-sSZ00bEjTdTTskVFykq294RJq+9cFatwy4uYa78HcYBCXU1kSD1DIp5yoFsQXmybkIOKCjp18OnhAYk553UIfQ==}
+ peerDependencies:
+ react: '>= 16'
+
+ '@tabler/icons@3.36.0':
+ resolution: {integrity: sha512-z9OfTEG6QbaQWM9KBOxxUdpgvMUn0atageXyiaSc2gmYm51ORO8Ua7eUcjlks+Dc0YMK4rrodAFdK9SfjJ4ZcA==}
+
+ '@tailwindcss/node@4.1.18':
+ resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==}
+
+ '@tailwindcss/oxide-android-arm64@4.1.18':
+ resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.18':
+ resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.1.18':
+ resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.18':
+ resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
+ resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
+ resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
+ resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
+ resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.18':
+ resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.18':
+ resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
+ resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.18':
+ resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.1.18':
+ resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==}
+ engines: {node: '>= 10'}
+
+ '@tailwindcss/postcss@4.1.18':
+ resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==}
+
+ '@tanstack/query-core@5.90.14':
+ resolution: {integrity: sha512-/6di2yNI+YxpVrH9Ig74Q+puKnkCE+D0LGyagJEGndJHJc6ahkcc/UqirHKy8zCYE/N9KLggxcQvzYCsUBWgdw==}
+
+ '@tanstack/react-query@5.90.14':
+ resolution: {integrity: sha512-JAMuULej09hrZ14W9+mxoRZ44rR2BuZfCd6oKTQVNfynQxCN3muH3jh3W46gqZNw5ZqY0ZVaS43Imb3dMr6tgw==}
peerDependencies:
- cypress: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
+ react: ^18 || ^19
- '@testing-library/dom@8.20.1':
- resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==}
+ '@tanstack/react-table@8.21.3':
+ resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==}
engines: {node: '>=12'}
+ peerDependencies:
+ react: '>=16.8'
+ react-dom: '>=16.8'
- '@tootallnate/once@1.1.2':
- resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==}
- engines: {node: '>= 6'}
+ '@tanstack/table-core@8.21.3':
+ resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
+ engines: {node: '>=12'}
+
+ '@testing-library/cypress@10.1.0':
+ resolution: {integrity: sha512-tNkNtYRqPQh71xXKuMizr146zlellawUfDth7A/urYU4J66g0VGZ063YsS0gqS79Z58u1G/uo9UxN05qvKXMag==}
+ engines: {node: '>=12', npm: '>=6'}
+ peerDependencies:
+ cypress: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
+
+ '@testing-library/dom@10.4.1':
+ resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
+ engines: {node: '>=18'}
'@tootallnate/once@2.0.0':
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
- '@types/archiver@5.3.4':
- resolution: {integrity: sha512-Lj7fLBIMwYFgViVVZHEdExZC3lVYsl+QL0VmdNdIzGZH544jHveYWij6qdnBgJQDnR7pMKliN9z2cPZFEbhyPw==}
+ '@tootallnate/quickjs-emscripten@0.23.0':
+ resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
+
+ '@tsconfig/node10@1.0.12':
+ resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==}
+
+ '@tsconfig/node12@1.0.11':
+ resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+ '@tsconfig/node14@1.0.3':
+ resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+ '@tsconfig/node16@1.0.4':
+ resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
@@ -773,8 +1192,32 @@ packages:
'@types/connect@3.4.38':
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
- '@types/duplexify@3.6.5':
- resolution: {integrity: sha512-fB56ACzlW91UdZ5F3VXplVMDngO8QaX5Y2mjvADtN01TT2TMy4WjF0Lg+tFDvt4uMBeTe4SgaD+qCrA7dL5/tA==}
+ '@types/d3-array@3.2.2':
+ resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
+
+ '@types/d3-color@3.1.3':
+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
+
+ '@types/d3-ease@3.0.2':
+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
+
+ '@types/d3-interpolate@3.0.4':
+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
+
+ '@types/d3-path@3.1.1':
+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
+
+ '@types/d3-scale@4.0.9':
+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
+
+ '@types/d3-shape@3.1.7':
+ resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
+
+ '@types/d3-time@3.0.4':
+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
+
+ '@types/d3-timer@3.0.2':
+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
'@types/express-serve-static-core@4.19.7':
resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==}
@@ -799,9 +1242,6 @@ packages:
'@types/jsonwebtoken@9.0.10':
resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==}
- '@types/keyv@3.1.4':
- resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
-
'@types/long@4.0.2':
resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
@@ -811,42 +1251,29 @@ packages:
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
- '@types/node@14.18.63':
- resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==}
-
'@types/node@20.19.24':
resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==}
'@types/node@22.19.3':
resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==}
- '@types/prop-types@15.7.15':
- resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
-
'@types/qs@6.14.0':
resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
'@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
- '@types/react-vis@1.11.15':
- resolution: {integrity: sha512-0feNthHy/GnkCRPagPKkAnZmKQY1rI+OelD/ASdI7z+PMCfcmPLTi7nLrduIojxGAOWBiIgyH3YX1Ix7GWpAag==}
-
- '@types/react@17.0.89':
- resolution: {integrity: sha512-I98SaDCar5lvEYl80ClRIUztH/hyWHR+I2f+5yTVp/MQ205HgYkA2b5mVdry/+nsEIrf8I65KA5V/PASx68MsQ==}
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
+ peerDependencies:
+ '@types/react': ^19.2.0
- '@types/readdir-glob@1.1.5':
- resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==}
+ '@types/react@19.2.8':
+ resolution: {integrity: sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==}
'@types/request@2.48.13':
resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==}
- '@types/responselike@1.0.3':
- resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
-
- '@types/scheduler@0.16.8':
- resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
-
'@types/send@0.17.6':
resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==}
@@ -862,11 +1289,8 @@ packages:
'@types/sizzle@2.3.10':
resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==}
- '@types/styled-components@5.1.35':
- resolution: {integrity: sha512-JeYII52nSFGXGaw/5Odf0TBUhT3024HduBewrZCQBoUFKBw8V6x1dbnZCpgJuzmiokWAlVo3kkS3k3jrEK1NyA==}
-
- '@types/stylis@4.2.5':
- resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==}
+ '@types/tmp@0.2.6':
+ resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==}
'@types/tough-cookie@4.0.5':
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
@@ -877,16 +1301,15 @@ packages:
'@types/underscore@1.13.0':
resolution: {integrity: sha512-L6LBgy1f0EFQZ+7uSA57+n2g/s4Qs5r06Vwrwn0/nuK1de+adz00NWaztRQ30aEqw5qOaWbPI8u2cGQ52lj6VA==}
+ '@types/use-sync-external-store@0.0.6':
+ resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
+
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
- JSONStream@1.3.5:
- resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
- hasBin: true
-
- abbrev@3.0.1:
- resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ abbrev@4.0.0:
+ resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
+ engines: {node: ^20.17.0 || >=22.9.0}
abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
@@ -896,6 +1319,10 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
+ accepts@2.0.0:
+ resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
+ engines: {node: '>= 0.6'}
+
acorn-walk@8.3.4:
resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
engines: {node: '>=0.4.0'}
@@ -917,8 +1344,24 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
- ajv@6.12.6:
- resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
ansi-align@3.0.1:
resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
@@ -927,25 +1370,13 @@ packages:
resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
engines: {node: '>=6'}
- ansi-escapes@3.2.0:
- resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==}
- engines: {node: '>=4'}
-
ansi-escapes@4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
- ansi-regex@2.1.1:
- resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
- engines: {node: '>=0.10.0'}
-
- ansi-regex@3.0.1:
- resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==}
- engines: {node: '>=4'}
-
- ansi-regex@4.1.1:
- resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
- engines: {node: '>=6'}
+ ansi-escapes@7.2.0:
+ resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==}
+ engines: {node: '>=18'}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
@@ -955,14 +1386,6 @@ packages:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'}
- ansi-styles@2.2.1:
- resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
- engines: {node: '>=0.10.0'}
-
- ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
-
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -975,8 +1398,8 @@ packages:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
- ansicolors@0.3.2:
- resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
@@ -985,17 +1408,16 @@ packages:
arch@2.2.0:
resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==}
- archiver-utils@2.1.0:
- resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==}
- engines: {node: '>= 6'}
+ archiver-utils@5.0.2:
+ resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==}
+ engines: {node: '>= 14'}
- archiver-utils@3.0.4:
- resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==}
- engines: {node: '>= 10'}
+ archiver@7.0.1:
+ resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==}
+ engines: {node: '>= 14'}
- archiver@5.3.2:
- resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==}
- engines: {node: '>= 10'}
+ arg@4.1.3:
+ resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
@@ -1003,26 +1425,16 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- aria-query@5.1.3:
- resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
-
- array-buffer-byte-length@1.0.2:
- resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
- engines: {node: '>= 0.4'}
+ aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
- array-flatten@3.0.0:
- resolution: {integrity: sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==}
-
arrify@2.0.1:
resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==}
engines: {node: '>=8'}
- as-array@1.0.0:
- resolution: {integrity: sha512-yTEVeqmnVlLJV0j8IAz/mcMGbr88+yX9SqTxyFc1HJwmW8Zy347jEmWFIg34MRqCUS8CXRKy8a8B/9BaoYDW2w==}
-
as-array@2.0.0:
resolution: {integrity: sha512-1Sd1LrodN0XYxYeZcN1J4xYZvmvTwD5tDWaPUGPIzH1mFsmzsPnVtd2exWhecMjtZk/wYWjNZJiD3b1SLCeJqg==}
@@ -1041,12 +1453,12 @@ packages:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
+ async-lock@1.4.1:
+ resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==}
+
async-retry@1.3.3:
resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==}
- async@1.5.2:
- resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==}
-
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
@@ -1057,9 +1469,12 @@ packages:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
- available-typed-arrays@1.0.7:
- resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
- engines: {node: '>= 0.4'}
+ autoprefixer@10.4.23:
+ resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
aws-sign2@0.7.0:
resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
@@ -1067,20 +1482,32 @@ packages:
aws4@1.13.2:
resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==}
- babel-plugin-styled-components@1.13.3:
- resolution: {integrity: sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==}
+ b4a@1.7.3:
+ resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==}
peerDependencies:
- styled-components: '>= 2'
-
- babel-plugin-syntax-jsx@6.18.0:
- resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==}
+ react-native-b4a: '*'
+ peerDependenciesMeta:
+ react-native-b4a:
+ optional: true
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ bare-events@2.8.2:
+ resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==}
+ peerDependencies:
+ bare-abort-controller: '*'
+ peerDependenciesMeta:
+ bare-abort-controller:
+ optional: true
+
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ baseline-browser-mapping@2.9.11:
+ resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
+ hasBin: true
+
basic-auth-connect@1.1.0:
resolution: {integrity: sha512-rKcWjfiRZ3p5WS9e5q6msXa07s6DaFAMXoyowV+mb2xQG+oYdw2QEUyKi0Xp95JvXzShlM+oGy5QuqSK6TfC1Q==}
@@ -1088,13 +1515,13 @@ packages:
resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
engines: {node: '>= 0.8'}
+ basic-ftp@5.1.0:
+ resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==}
+ engines: {node: '>=10.0.0'}
+
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
- big-integer@1.6.52:
- resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
- engines: {node: '>=0.6'}
-
bignumber.js@9.3.1:
resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==}
@@ -1102,31 +1529,22 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
- binary@0.3.0:
- resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==}
-
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
- blakejs@1.2.1:
- resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==}
-
blob-util@2.0.2:
resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
- bluebird@3.4.7:
- resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==}
-
bluebird@3.7.2:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
- body-parser@1.20.3:
- resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ body-parser@1.20.4:
+ resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
- boxen@4.2.0:
- resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==}
- engines: {node: '>=8'}
+ body-parser@2.2.1:
+ resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==}
+ engines: {node: '>=18'}
boxen@5.1.2:
resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
@@ -1142,34 +1560,34 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+ browserslist@4.28.1:
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ buffer-crc32@1.0.0:
+ resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
+ engines: {node: '>=8.0.0'}
+
buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
- buffer-indexof-polyfill@1.0.2:
- resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==}
- engines: {node: '>=0.10'}
-
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
- buffers@0.1.1:
- resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==}
- engines: {node: '>=0.2.0'}
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
bytes@3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
engines: {node: '>= 0.8'}
- cacache@19.0.1:
- resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- cacheable-request@6.1.0:
- resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
- engines: {node: '>=8'}
+ cacache@20.0.3:
+ resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
cachedir@2.4.0:
resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
@@ -1179,10 +1597,6 @@ packages:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
- call-bind@1.0.8:
- resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
- engines: {node: '>= 0.4'}
-
call-bound@1.0.4:
resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
engines: {node: '>= 0.4'}
@@ -1190,60 +1604,35 @@ packages:
call-me-maybe@1.0.2:
resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
- camelcase@5.3.1:
- resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
- engines: {node: '>=6'}
-
camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
- camelize@1.0.1:
- resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
-
- caniuse-lite@1.0.30001754:
- resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==}
-
- cardinal@2.1.1:
- resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==}
- hasBin: true
+ caniuse-lite@1.0.30001761:
+ resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
caseless@0.12.0:
resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
- chainsaw@0.1.0:
- resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==}
-
- chalk@1.1.3:
- resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
- engines: {node: '>=0.10.0'}
-
- chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
-
- chalk@3.0.0:
- resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
- engines: {node: '>=8'}
-
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
- chardet@0.7.0:
- resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ chalk@5.6.2:
+ resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
- check-more-types@2.24.0:
- resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
- engines: {node: '>= 0.8.0'}
+ char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+
+ chardet@2.1.1:
+ resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
- chownr@1.1.4:
- resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
-
chownr@3.0.0:
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
engines: {node: '>=18'}
@@ -1251,8 +1640,8 @@ packages:
ci-info@2.0.0:
resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
- ci-info@3.9.0:
- resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ ci-info@4.3.1:
+ resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==}
engines: {node: '>=8'}
cjson@0.3.3:
@@ -1267,29 +1656,27 @@ packages:
resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
engines: {node: '>=6'}
- cli-color@1.4.0:
- resolution: {integrity: sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==}
-
- cli-cursor@2.1.0:
- resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==}
- engines: {node: '>=4'}
-
cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
+ cli-highlight@2.1.11:
+ resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==}
+ engines: {node: '>=8.0.0', npm: '>=5.0.0'}
+ hasBin: true
+
cli-spinners@2.9.2:
resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
engines: {node: '>=6'}
+ cli-table3@0.6.1:
+ resolution: {integrity: sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==}
+ engines: {node: 10.* || >= 12.*}
+
cli-table3@0.6.5:
resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
engines: {node: 10.* || >= 12.*}
- cli-table@0.3.11:
- resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==}
- engines: {node: '>= 0.2.0'}
-
cli-truncate@2.1.0:
resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
engines: {node: '>=8'}
@@ -1298,8 +1685,12 @@ packages:
resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- cli-width@2.2.1:
- resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
cliui@7.0.4:
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
@@ -1308,61 +1699,67 @@ packages:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
- clone-response@1.0.3:
- resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
-
clone@1.0.4:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
- color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
- color-convert@3.1.2:
- resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==}
+ color-convert@3.1.3:
+ resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==}
engines: {node: '>=14.6'}
- color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- color-name@2.0.2:
- resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==}
+ color-name@2.1.0:
+ resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==}
engines: {node: '>=12.20'}
- color-string@2.1.2:
- resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==}
+ color-string@2.1.4:
+ resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==}
engines: {node: '>=18'}
- color@5.0.2:
- resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==}
+ color@5.0.3:
+ resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==}
engines: {node: '>=18'}
colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
- colors@1.0.3:
- resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==}
+ colors@1.4.0:
+ resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==}
engines: {node: '>=0.1.90'}
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
- commander@4.1.1:
- resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
- engines: {node: '>= 6'}
+ commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
commander@5.1.0:
resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
engines: {node: '>= 6'}
+ commander@6.2.1:
+ resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
+ engines: {node: '>= 6'}
+
commander@7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'}
@@ -1375,12 +1772,9 @@ packages:
resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
engines: {node: '>=4.0.0'}
- compare-semver@1.1.0:
- resolution: {integrity: sha512-AENcdfhxsMCzzl+QRdOwMQeA8tZBEEacAmA4pGPoyco27G9sIaM98WNYkcToC9O0wIx1vE+1ErmaM4t0/fXhMw==}
-
- compress-commons@4.1.2:
- resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==}
- engines: {node: '>= 10'}
+ compress-commons@6.0.2:
+ resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==}
+ engines: {node: '>= 14'}
compressible@2.0.18:
resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
@@ -1393,6 +1787,9 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
configstore@5.0.1:
resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
engines: {node: '>=8'}
@@ -1405,23 +1802,28 @@ packages:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
+ content-disposition@1.0.1:
+ resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==}
+ engines: {node: '>=18'}
+
content-type@1.0.5:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
- cookie-signature@1.0.6:
- resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+ cookie-signature@1.0.7:
+ resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==}
+
+ cookie-signature@1.2.2:
+ resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
+ engines: {node: '>=6.6.0'}
- cookie@0.7.1:
- resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
core-util-is@1.0.2:
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
- core-util-is@1.0.3:
- resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
-
cors@2.8.5:
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
engines: {node: '>= 0.10'}
@@ -1431,18 +1833,17 @@ packages:
engines: {node: '>=0.8'}
hasBin: true
- crc32-stream@4.0.3:
- resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==}
- engines: {node: '>= 10'}
+ crc32-stream@6.0.0:
+ resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==}
+ engines: {node: '>= 14'}
- cross-env@5.2.1:
- resolution: {integrity: sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==}
- engines: {node: '>=4.0'}
- hasBin: true
+ create-require@1.1.1:
+ resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
- cross-spawn@6.0.6:
- resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==}
- engines: {node: '>=4.8'}
+ cross-env@7.0.3:
+ resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
+ engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+ hasBin: true
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
@@ -1452,80 +1853,48 @@ packages:
resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
engines: {node: '>=8'}
- css-color-keywords@1.0.0:
- resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
- engines: {node: '>=4'}
-
- css-to-react-native@3.2.0:
- resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
-
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
- csv-streamify@3.0.4:
- resolution: {integrity: sha512-IQkxN0zu0gym8/5CHrSyReeRewbw+aRDrMrGI5WmIY/LmEcNpAcPOyETBHREKgsWHeEQWEihiBmx5EcKAsKWZw==}
- engines: {node: '>=0.12.0'}
- hasBin: true
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
- cypress@10.11.0:
- resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==}
- engines: {node: '>=12.0.0'}
- hasBin: true
+ csv-parse@5.6.0:
+ resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==}
- d3-array@2.12.1:
- resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
+ cypress@15.8.1:
+ resolution: {integrity: sha512-ogc62stTQGh1395ipKxfCE5hQuSApTzeH5e0d9U6m7wYO9HQeCpgnkYtBtd0MbkN2Fnch5Od2mX9u4hoTlrH4Q==}
+ engines: {node: ^20.1.0 || ^22.0.0 || >=24.0.0}
+ hasBin: true
d3-array@3.2.4:
resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
engines: {node: '>=12'}
- d3-collection@1.0.7:
- resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==}
-
d3-color@3.1.0:
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
engines: {node: '>=12'}
- d3-contour@4.0.2:
- resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
+ d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
engines: {node: '>=12'}
d3-format@3.1.0:
resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
engines: {node: '>=12'}
- d3-geo@3.1.1:
- resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
- engines: {node: '>=12'}
-
- d3-hexbin@0.2.2:
- resolution: {integrity: sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==}
-
- d3-hierarchy@3.1.2:
- resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
- engines: {node: '>=12'}
-
d3-interpolate@3.0.1:
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
engines: {node: '>=12'}
- d3-path@1.0.9:
- resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
-
d3-path@3.1.0:
resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
engines: {node: '>=12'}
- d3-sankey@0.12.3:
- resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
-
d3-scale@4.0.2:
resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
engines: {node: '>=12'}
- d3-shape@1.3.7:
- resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
-
d3-shape@3.2.0:
resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
engines: {node: '>=12'}
@@ -1538,20 +1907,21 @@ packages:
resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
engines: {node: '>=12'}
- d3-voronoi@1.1.4:
- resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==}
-
- d@1.0.2:
- resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==}
- engines: {node: '>=0.12'}
+ d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
dashdash@1.14.1:
resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
engines: {node: '>=0.10'}
- data-uri-to-buffer@3.0.1:
- resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==}
- engines: {node: '>= 6'}
+ data-uri-to-buffer@4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+
+ data-uri-to-buffer@6.0.2:
+ resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==}
+ engines: {node: '>= 14'}
date-fns@2.30.0:
resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
@@ -1597,17 +1967,11 @@ packages:
supports-color:
optional: true
- decompress-response@3.3.0:
- resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
- engines: {node: '>=4'}
-
- deep-equal@1.1.2:
- resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
- engines: {node: '>= 0.4'}
+ decimal.js-light@2.5.1:
+ resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
- deep-equal@2.2.3:
- resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
- engines: {node: '>= 0.4'}
+ deep-equal-in-any-order@2.1.0:
+ resolution: {integrity: sha512-9FklcFjcehm1yBWiOYtmazJOiMbT+v81Kq6nThIuXbWLWIZMX3ZI+QoLf7wCi0T8XzTAXf6XqEdEyVrjZkhbGA==}
deep-extend@0.6.0:
resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
@@ -1626,20 +1990,9 @@ packages:
defaults@1.0.4:
resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
- defer-to-connect@1.1.3:
- resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
-
- define-data-property@1.1.4:
- resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
- engines: {node: '>= 0.4'}
-
- define-properties@1.2.1:
- resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
- engines: {node: '>= 0.4'}
-
- degenerator@3.0.4:
- resolution: {integrity: sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==}
- engines: {node: '>= 6'}
+ degenerator@5.0.1:
+ resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==}
+ engines: {node: '>= 14'}
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
@@ -1649,15 +2002,27 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
destroy@1.2.0:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
- dom-accessibility-api@0.5.16:
- resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
- dom-walk@0.1.2:
- resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
+ diff@4.0.2:
+ resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+ engines: {node: '>=0.3.1'}
+
+ discontinuous-range@1.0.0:
+ resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==}
+
+ dom-accessibility-api@0.5.16:
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
dot-prop@5.3.0:
resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
@@ -1667,20 +2032,10 @@ packages:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
- dotenv@6.2.0:
- resolution: {integrity: sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==}
- engines: {node: '>=6'}
-
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
- duplexer2@0.1.4:
- resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==}
-
- duplexer3@0.1.5:
- resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
-
duplexer@0.1.2:
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
@@ -1699,12 +2054,18 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ electron-to-chromium@1.5.267:
+ resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
+
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ emojilib@2.4.0:
+ resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==}
+
enabled@2.0.0:
resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
@@ -1722,6 +2083,10 @@ packages:
end-of-stream@1.4.5:
resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+ enhanced-resolve@5.18.4:
+ resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==}
+ engines: {node: '>=10.13.0'}
+
enquirer@2.4.1:
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
engines: {node: '>=8.6'}
@@ -1730,6 +2095,10 @@ packages:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
+ environment@1.1.0:
+ resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+ engines: {node: '>=18'}
+
err-code@2.0.3:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
@@ -1741,9 +2110,6 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-get-iterator@1.1.3:
- resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
-
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
@@ -1752,19 +2118,8 @@ packages:
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
engines: {node: '>= 0.4'}
- es5-ext@0.10.64:
- resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==}
- engines: {node: '>=0.10'}
-
- es6-iterator@2.0.3:
- resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
-
- es6-symbol@3.1.4:
- resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
- engines: {node: '>=0.12'}
-
- es6-weak-map@2.0.3:
- resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==}
+ es-toolkit@1.43.0:
+ resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==}
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
@@ -1785,22 +2140,18 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- escodegen@1.14.3:
- resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==}
- engines: {node: '>=4.0'}
+ escodegen@2.1.0:
+ resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
+ engines: {node: '>=6.0'}
hasBin: true
- esniff@2.0.1:
- resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
- engines: {node: '>=0.10'}
-
esprima@4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
hasBin: true
- estraverse@4.3.0:
- resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
esutils@2.0.3:
@@ -1811,9 +2162,6 @@ packages:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
- event-emitter@0.3.5:
- resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
-
event-target-shim@5.0.1:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'}
@@ -1821,9 +2169,27 @@ packages:
eventemitter2@6.4.7:
resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==}
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
events-listener@1.1.0:
resolution: {integrity: sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g==}
+ events-universal@1.0.1:
+ resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ eventsource-parser@3.0.6:
+ resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==}
+ engines: {node: '>=18.0.0'}
+
+ eventsource@3.0.7:
+ resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
+ engines: {node: '>=18.0.0'}
+
execa@4.1.0:
resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
engines: {node: '>=10'}
@@ -1836,34 +2202,34 @@ packages:
resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
engines: {node: '>=4'}
- exegesis-express@2.0.1:
- resolution: {integrity: sha512-8ORl1YRygYGPdR+zcClMqzaU+JQuvdNIw/s0RNwYluxNecEHkDEcXFmO6A5T79p7e48KI8iXJYt6KIn4Z9z4bg==}
- engines: {node: '>=6.0.0', npm: '>5.0.0'}
-
- exegesis@2.5.7:
- resolution: {integrity: sha512-Y0gEY3hgoLa80aMUm8rhhlIW3/KWo4uqN5hKJqok2GLh3maZjRLRC+p0gj33Jw3upAOKOXeRgScT5rtRoMyxwQ==}
+ exegesis-express@4.0.0:
+ resolution: {integrity: sha512-V2hqwTtYRj0bj43K4MCtm0caD97YWkqOUHFMRCBW5L1x9IjyqOEc7Xa4oQjjiFbeFOSQzzwPV+BzXsQjSz08fw==}
engines: {node: '>=6.0.0', npm: '>5.0.0'}
- exit-code@1.0.2:
- resolution: {integrity: sha512-U80QYrKun5np62yRqG6geNRP5TZKU2HF73Bb6IE3XjDHXKlserAdP14tIaP3W9J6ezv84DwbpbRTAtu4FsKcgw==}
+ exegesis@4.3.0:
+ resolution: {integrity: sha512-V90IJQ4XYO1SfH5qdJTOijXkQTF3hSpSHHqlf7MstUMDKP22iAvi63gweFLtPZ4Gj3Wnh8RgJX5TGu0WiwTyDQ==}
+ engines: {node: '>=10.0.0', npm: '>5.0.0'}
exponential-backoff@3.1.3:
resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
- express@4.21.2:
- resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+ express-rate-limit@7.5.1:
+ resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ express: '>= 4.11'
+
+ express@4.22.1:
+ resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==}
engines: {node: '>= 0.10.0'}
- ext@1.7.0:
- resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
+ express@5.2.1:
+ resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
+ engines: {node: '>= 18'}
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- external-editor@3.1.0:
- resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
- engines: {node: '>=4'}
-
extract-zip@2.0.1:
resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
engines: {node: '>= 10.17.0'}
@@ -1880,17 +2246,11 @@ packages:
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
- fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-
- fast-levenshtein@2.0.6:
- resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ fast-fifo@1.3.2:
+ resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
- fast-text-encoding@1.0.6:
- resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==}
-
- fast-url-parser@1.1.3:
- resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==}
+ fast-uri@3.1.0:
+ resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
fast-xml-parser@4.5.3:
resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
@@ -1915,18 +2275,14 @@ packages:
fecha@4.2.3:
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
- figures@2.0.0:
- resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==}
- engines: {node: '>=4'}
+ fetch-blob@3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
figures@3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
- file-uri-to-path@2.0.0:
- resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==}
- engines: {node: '>= 6'}
-
filesize@6.4.0:
resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==}
engines: {node: '>= 0.4.0'}
@@ -1939,32 +2295,29 @@ packages:
resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
engines: {node: '>= 0.8'}
- finalhandler@1.3.1:
- resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ finalhandler@1.3.2:
+ resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==}
engines: {node: '>= 0.8'}
+ finalhandler@2.1.1:
+ resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
+ engines: {node: '>= 18.0.0'}
+
firebase-admin@12.7.0:
resolution: {integrity: sha512-raFIrOyTqREbyXsNkSHyciQLfv8AUZazehPaQS1lZBSCDYW74FYXU0nQZa3qHI4K+hawohlDbywZ4+qce9YNxA==}
engines: {node: '>=14'}
- firebase-tools@9.23.3:
- resolution: {integrity: sha512-J1S/T96rL3vKObDtTuBkop9JtW3vYnfwyU83NopiuOy9oPBRxFkitgzk034qGrpGyZvDA6Do6ZHI50taB3hrEg==}
- engines: {node: '>= 10.13'}
+ firebase-tools@15.1.0:
+ resolution: {integrity: sha512-sVDiFTXiRd2tszJzttb6e5yzhJdljIVm8Q0Atg6MyHMirJrvrOJzxPis9MAg/R6RrfLo/+oYgx83suZfAAimPw==}
+ engines: {node: '>=20.0.0 || >=22.0.0 || >=24.0.0'}
hasBin: true
firebase@12.7.0:
resolution: {integrity: sha512-ZBZg9jFo8uH4Emd7caOqtalKJfDGHnHQSrCPiqRAdTFQd0wL3ERilUBfhnhBLnlernugkN/o7nJa0p+sE71Izg==}
- flat-arguments@1.0.2:
- resolution: {integrity: sha512-ZIkB09bqQdKP9buPOiZcS/4HK3q992C5q62qAE72d0xWAXfaSbP840BZYUBgHRkzdx6jYRIpKT4ur+Nay/JRlg==}
-
fn.name@1.1.0:
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
- for-each@0.3.5:
- resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
- engines: {node: '>= 0.4'}
-
foreground-child@3.3.1:
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
engines: {node: '>=14'}
@@ -1972,14 +2325,18 @@ packages:
forever-agent@0.6.1:
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
- form-data@2.3.3:
- resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
- engines: {node: '>= 0.12'}
-
form-data@2.5.5:
resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==}
engines: {node: '>= 0.12'}
+ form-data@4.0.5:
+ resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
+ engines: {node: '>= 6'}
+
+ formdata-polyfill@4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+
formik@2.4.9:
resolution: {integrity: sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og==}
peerDependencies:
@@ -1989,73 +2346,60 @@ packages:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
+ fraction.js@5.3.4:
+ resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
+
fresh@0.5.2:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
- fs-constants@1.0.0:
- resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
-
- fs-extra@5.0.0:
- resolution: {integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==}
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
- fs-extra@8.1.0:
- resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
- engines: {node: '>=6 <7 || >=8'}
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
fs-extra@9.1.0:
resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
engines: {node: '>=10'}
- fs-minipass@1.2.7:
- resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==}
-
fs-minipass@3.0.3:
resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
- fstream@1.0.12:
- resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==}
- engines: {node: '>=0.6'}
- deprecated: This package is no longer supported.
-
- ftp@0.3.10:
- resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==}
- engines: {node: '>=0.8.0'}
-
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
functional-red-black-tree@1.0.1:
resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
- functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-
- gaxios@4.3.3:
- resolution: {integrity: sha512-gSaYYIO1Y3wUtdfHmjDUZ8LWaxJQpiavzbF5Kq53akSzvmVg0RfyOcFDbO1KJ/KCGRFz2qG+lS81F0nkr7cRJA==}
- engines: {node: '>=10'}
+ fuzzy@0.1.3:
+ resolution: {integrity: sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==}
+ engines: {node: '>= 0.6.0'}
gaxios@6.7.1:
resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==}
engines: {node: '>=14'}
- gcp-metadata@4.3.1:
- resolution: {integrity: sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==}
- engines: {node: '>=10'}
+ gaxios@7.1.3:
+ resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==}
+ engines: {node: '>=18'}
gcp-metadata@6.1.1:
resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==}
engines: {node: '>=14'}
+ gcp-metadata@8.1.2:
+ resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==}
+ engines: {node: '>=18'}
+
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -2068,10 +2412,6 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
- get-stream@4.1.0:
- resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
- engines: {node: '>=6'}
-
get-stream@5.2.0:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
@@ -2080,12 +2420,9 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
- get-uri@3.0.2:
- resolution: {integrity: sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==}
- engines: {node: '>= 6'}
-
- getos@3.2.1:
- resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
+ get-uri@6.0.5:
+ resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==}
+ engines: {node: '>= 14'}
getpass@0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
@@ -2100,111 +2437,77 @@ packages:
glob-slasher@1.0.1:
resolution: {integrity: sha512-5MUzqFiycIKLMD1B0dYOE4hGgLLUZUNGGYO4BExdwT32wUwW3DBOE7lMQars7vB1q43Fb3Tyt+HmgLKsJhDYdg==}
- glob@10.4.5:
- resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ glob@10.5.0:
+ resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
hasBin: true
- glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- global-dirs@2.1.0:
- resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==}
- engines: {node: '>=8'}
+ glob@13.0.0:
+ resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==}
+ engines: {node: 20 || >=22}
global-dirs@3.0.1:
resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
engines: {node: '>=10'}
- global@4.4.0:
- resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
-
- google-auth-library@6.1.6:
- resolution: {integrity: sha512-Q+ZjUEvLQj/lrVHF/IQwRo6p3s8Nc44Zk/DALsN+ac3T4HY/g/3rrufkgtl+nZ1TW7DNAw5cTChdVp4apUXVgQ==}
- engines: {node: '>=10'}
+ goober@2.1.18:
+ resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==}
+ peerDependencies:
+ csstype: ^3.0.10
- google-auth-library@7.14.1:
- resolution: {integrity: sha512-5Rk7iLNDFhFeBYc3s8l1CqzbEBcdhwR193RlD4vSNFajIcINKI8W8P0JLmBpwymHqqWbX34pJDQu39cSy/6RsA==}
- engines: {node: '>=10'}
+ google-auth-library@10.5.0:
+ resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==}
+ engines: {node: '>=18'}
google-auth-library@9.15.1:
resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==}
engines: {node: '>=14'}
- google-gax@2.30.3:
- resolution: {integrity: sha512-Zsd6hbJBMvAcJS3cYpAsmupvfsxygFR2meUZJcGeR7iUqYHCR/1Hf2aQNB9srrlXQMm91pNiUvW0Kz6Qld8QkA==}
- engines: {node: '>=10'}
- hasBin: true
-
google-gax@4.6.1:
resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==}
engines: {node: '>=14'}
+ google-gax@5.0.6:
+ resolution: {integrity: sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==}
+ engines: {node: '>=18'}
+
google-logging-utils@0.0.2:
resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==}
engines: {node: '>=14'}
- google-p12-pem@3.1.4:
- resolution: {integrity: sha512-HHuHmkLgwjdmVRngf5+gSmpkyaRI6QmOg77J8tkNBHhNEI62sGHyw4/+UkgyZEI7h84NbWprXDJ+sa3xOYFvTg==}
- engines: {node: '>=10'}
- deprecated: Package is no longer maintained
- hasBin: true
+ google-logging-utils@1.1.3:
+ resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==}
+ engines: {node: '>=14'}
+
+ googleapis-common@8.0.2-rc.0:
+ resolution: {integrity: sha512-JTcxRvmFa9Ec1uyfMEimEMeeKq1sHNZX3vn2qmoUMtnvixXXvcqTcbDZvEZXkEWpGlPlOf4joyep6/qs0BrLyg==}
+ engines: {node: '>=18.0.0'}
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
- got@9.6.0:
- resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==}
- engines: {node: '>=8.6'}
+ graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- gtoken@5.3.2:
- resolution: {integrity: sha512-gkvEKREW7dXWF8NV8pVrKfW7WqReAmjjkMBh6lNCCGOM4ucS0r0YyXXl0r/9Yj8wcW/32ISkfc8h5mPTDbtifQ==}
- engines: {node: '>=10'}
-
gtoken@7.1.0:
resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==}
engines: {node: '>=14.0.0'}
+ gtoken@8.0.0:
+ resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==}
+ engines: {node: '>=18'}
+
gzip-size@6.0.0:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
engines: {node: '>=10'}
- har-schema@2.0.0:
- resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
- engines: {node: '>=4'}
-
- har-validator@5.1.5:
- resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
- engines: {node: '>=6'}
- deprecated: this library is no longer supported
-
- has-ansi@2.0.0:
- resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
- engines: {node: '>=0.10.0'}
-
- has-bigints@1.1.0:
- resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
- engines: {node: '>= 0.4'}
-
- has-flag@2.0.0:
- resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==}
- engines: {node: '>=0.10.0'}
-
- has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
-
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
- has-property-descriptors@1.0.2:
- resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
-
has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
@@ -2217,15 +2520,31 @@ packages:
resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
engines: {node: '>=8'}
+ hasha@5.2.2:
+ resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==}
+ engines: {node: '>=8'}
+
hasown@2.0.2:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ heap-js@2.7.1:
+ resolution: {integrity: sha512-EQfezRg0NCZGNlhlDR3Evrw1FVL2G3LhU7EgPoxufQKruNBSYA8MiRPHeWbU+36o+Fhel0wMwM+sLEiBAlNLJA==}
+ engines: {node: '>=10.0.0'}
+
+ highlight.js@10.7.3:
+ resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
+
hoist-non-react-statics@3.3.2:
resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
- home-dir@1.0.0:
- resolution: {integrity: sha512-PPAP0BMY72XQ0sYwFow8EgHwUYfptkZusnZEGHkBjdKRXIYcVFsbEViqU4k8VrJWf0m7wMr9gscQX9klJYh7zg==}
+ hono@4.11.3:
+ resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==}
+ engines: {node: '>=16.9.0'}
+
+ hosted-git-info@7.0.2:
+ resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
+ engines: {node: ^16.14.0 || >=18.0.0}
html-entities@2.6.0:
resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==}
@@ -2236,17 +2555,13 @@ packages:
http-cache-semantics@4.2.0:
resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
- http-errors@2.0.0:
- resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
engines: {node: '>= 0.8'}
http-parser-js@0.5.10:
resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==}
- http-proxy-agent@4.0.1:
- resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==}
- engines: {node: '>= 6'}
-
http-proxy-agent@5.0.0:
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
engines: {node: '>= 6'}
@@ -2255,12 +2570,8 @@ packages:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
- http-signature@1.2.0:
- resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
- engines: {node: '>=0.8', npm: '>=1.3.7'}
-
- http-signature@1.3.6:
- resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==}
+ http-signature@1.4.0:
+ resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==}
engines: {node: '>=0.10'}
https-proxy-agent@5.0.1:
@@ -2292,12 +2603,26 @@ packages:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
+ iconv-lite@0.7.1:
+ resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==}
+ engines: {node: '>=0.10.0'}
+
idb@7.1.1:
resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ immer@10.2.0:
+ resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==}
+
+ immer@11.1.0:
+ resolution: {integrity: sha512-dlzb07f5LDY+tzs+iLCSXV2yuhaYfezqyZQc+n6baLECWkOMEWxkECAOnXL0ba7lsA25fM9b2jtzpu/uxo1a7g==}
+
import-lazy@2.1.0:
resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==}
engines: {node: '>=4'}
@@ -2310,16 +2635,12 @@ packages:
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
engines: {node: '>=8'}
- inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+ infer-owner@1.0.4:
+ resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- ini@1.3.7:
- resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==}
-
ini@1.3.8:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
@@ -2327,21 +2648,10 @@ packages:
resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
engines: {node: '>=10'}
- inquirer@6.3.1:
- resolution: {integrity: sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==}
- engines: {node: '>=6.0.0'}
-
install-artifact-from-github@1.4.0:
resolution: {integrity: sha512-+y6WywKZREw5rq7U2jvr2nmZpT7cbWbQQ0N/qfcseYnzHFz2cZz1Et52oY+XttYuYeTkI8Y+R2JNWj68MpQFSg==}
hasBin: true
- internal-slot@1.1.0:
- resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
- engines: {node: '>= 0.4'}
-
- internmap@1.0.1:
- resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
-
internmap@2.0.3:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
@@ -2354,57 +2664,25 @@ packages:
resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==}
engines: {node: '>=8'}
- ip@1.1.9:
- resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==}
-
ipaddr.js@1.9.1:
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
engines: {node: '>= 0.10'}
- is-arguments@1.2.0:
- resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
- engines: {node: '>= 0.4'}
-
- is-array-buffer@3.0.5:
- resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
- engines: {node: '>= 0.4'}
-
- is-bigint@1.1.0:
- resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
- engines: {node: '>= 0.4'}
-
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
- is-boolean-object@1.2.2:
- resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
- engines: {node: '>= 0.4'}
-
- is-callable@1.2.7:
- resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
- engines: {node: '>= 0.4'}
+ is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
is-ci@2.0.0:
resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
hasBin: true
- is-ci@3.0.1:
- resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
- hasBin: true
-
- is-date-object@1.1.0:
- resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
- engines: {node: '>= 0.4'}
-
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
- is-fullwidth-code-point@2.0.0:
- resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
- engines: {node: '>=4'}
-
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
@@ -2417,29 +2695,21 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
- is-installed-globally@0.3.2:
- resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==}
- engines: {node: '>=8'}
-
is-installed-globally@0.4.0:
resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
engines: {node: '>=10'}
- is-map@2.0.3:
- resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
- engines: {node: '>= 0.4'}
-
- is-npm@4.0.0:
- resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==}
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
engines: {node: '>=8'}
is-npm@5.0.0:
resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==}
engines: {node: '>=10'}
- is-number-object@1.1.1:
- resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
- engines: {node: '>= 0.4'}
+ is-number@2.1.0:
+ resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==}
+ engines: {node: '>=0.10.0'}
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
@@ -2457,20 +2727,8 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
- is-promise@2.2.2:
- resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
-
- is-regex@1.2.1:
- resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
- engines: {node: '>= 0.4'}
-
- is-set@2.0.3:
- resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
- engines: {node: '>= 0.4'}
-
- is-shared-array-buffer@1.0.4:
- resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
- engines: {node: '>= 0.4'}
+ is-promise@4.0.0:
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
is-stream-ended@0.1.4:
resolution: {integrity: sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==}
@@ -2479,14 +2737,6 @@ packages:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
- is-string@1.1.1:
- resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
- engines: {node: '>= 0.4'}
-
- is-symbol@1.1.1:
- resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
- engines: {node: '>= 0.4'}
-
is-typedarray@1.0.0:
resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
@@ -2497,14 +2747,6 @@ packages:
is-url@1.2.4:
resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
- is-weakmap@2.0.2:
- resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
- engines: {node: '>= 0.4'}
-
- is-weakset@2.0.4:
- resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
- engines: {node: '>= 0.4'}
-
is-wsl@1.1.0:
resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==}
engines: {node: '>=4'}
@@ -2522,9 +2764,6 @@ packages:
isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
- isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -2532,8 +2771,8 @@ packages:
resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
engines: {node: '>=16'}
- isomorphic-unfetch@3.1.0:
- resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==}
+ isomorphic-fetch@3.0.0:
+ resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==}
isstream@0.1.2:
resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
@@ -2541,6 +2780,10 @@ packages:
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+ jiti@2.6.1:
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+ hasBin: true
+
jju@1.4.0:
resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
@@ -2550,81 +2793,58 @@ packages:
jose@4.15.9:
resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
+ jose@6.1.3:
+ resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==}
+
js-cookie@2.2.1:
resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
- js-yaml@3.14.1:
- resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ js-yaml@3.14.2:
+ resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
hasBin: true
- js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
jsbn@0.1.1:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
- jsesc@3.1.0:
- resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
- engines: {node: '>=6'}
- hasBin: true
-
json-bigint@1.0.0:
resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
- json-buffer@3.0.0:
- resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
-
json-parse-helpfulerror@1.0.3:
resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==}
- json-ptr@2.2.0:
- resolution: {integrity: sha512-w9f6/zhz4kykltXMG7MLJWMajxiPj0q+uzQPR1cggNAE/sXoq/C5vjUb/7QNcC3rJsVIIKy37ALTXy1O+3c8QQ==}
-
- json-schema-traverse@0.4.1:
- resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ json-ptr@3.1.1:
+ resolution: {integrity: sha512-SiSJQ805W1sDUCD1+/t1/1BIrveq2Fe9HJqENxZmMCILmrPI7WhS/pePpIOx85v6/H2z1Vy7AI08GV2TzfXocg==}
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ json-schema-typed@8.0.2:
+ resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
+
json-schema@0.4.0:
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
json-stringify-safe@5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
- jsonfile@4.0.0:
- resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
-
jsonfile@6.2.0:
resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
- jsonparse@1.3.1:
- resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
- engines: {'0': node >= 0.2.0}
-
- jsonwebtoken@8.5.1:
- resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==}
- engines: {node: '>=4', npm: '>=1.4.28'}
-
jsonwebtoken@9.0.3:
resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==}
engines: {node: '>=12', npm: '>=6'}
- jsprim@1.4.2:
- resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
- engines: {node: '>=0.6.0'}
-
jsprim@2.0.2:
resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
engines: {'0': node >=0.6.0}
- jwa@1.4.2:
- resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
-
jwa@2.0.1:
resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==}
@@ -2632,29 +2852,16 @@ packages:
resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==}
engines: {node: '>=14'}
- jws@3.2.2:
- resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
-
- jws@4.0.0:
- resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
-
jws@4.0.1:
resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==}
- keyv@3.1.0:
- resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
+ kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
kuler@2.0.0:
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
- latest-version@5.1.0:
- resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
- engines: {node: '>=8'}
-
- lazy-ass@1.6.0:
- resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
- engines: {node: '> 0.8'}
-
lazystream@1.0.1:
resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
engines: {node: '>= 0.6.3'}
@@ -2663,9 +2870,81 @@ packages:
resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
engines: {node: '>=6'}
- levn@0.3.0:
- resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
- engines: {node: '>= 0.8.0'}
+ libsodium-wrappers@0.7.15:
+ resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==}
+
+ libsodium@0.7.15:
+ resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==}
+
+ lightningcss-android-arm64@1.30.2:
+ resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.30.2:
+ resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.30.2:
+ resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.30.2:
+ resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.30.2:
+ resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.30.2:
+ resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.30.2:
+ resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.30.2:
+ resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.30.2:
+ resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.30.2:
+ resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.30.2:
+ resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.30.2:
+ resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
+ engines: {node: '>= 12.0.0'}
lilconfig@2.0.5:
resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==}
@@ -2679,9 +2958,6 @@ packages:
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
hasBin: true
- listenercount@1.0.1:
- resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==}
-
listr2@3.14.0:
resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
engines: {node: '>=10.0.0'}
@@ -2703,39 +2979,18 @@ packages:
lodash-es@4.17.21:
resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
- lodash._isnative@2.4.1:
- resolution: {integrity: sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==}
-
lodash._objecttypes@2.4.1:
resolution: {integrity: sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==}
- lodash._shimkeys@2.4.1:
- resolution: {integrity: sha512-lBrglYxLD/6KAJ8IEa5Lg+YHgNAL7FyKqXg4XOUI+Du/vtniLs1ZqS+yHNKPkK54waAgkdUnDOYaWf+rv4B+AA==}
-
lodash.camelcase@4.3.0:
resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
- lodash.defaults@4.2.0:
- resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
-
- lodash.difference@4.5.0:
- resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
-
- lodash.flatten@4.4.0:
- resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
-
lodash.includes@4.3.0:
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
- lodash.isarguments@2.4.1:
- resolution: {integrity: sha512-CyMQjsJqDgXL8M2xYAP6V2dlVXli8IhWXLsk19uXxiL9/qISjzQXyWtxsumR2q4CnR9FjCnxpuIO1d9KSKBcyA==}
-
- lodash.isarguments@3.1.0:
- resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
-
lodash.isboolean@3.0.3:
resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
@@ -2748,17 +3003,14 @@ packages:
lodash.isobject@2.4.1:
resolution: {integrity: sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==}
- lodash.isobject@3.0.2:
- resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==}
-
lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
lodash.isstring@4.0.1:
resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
- lodash.keys@2.4.1:
- resolution: {integrity: sha512-ZpJhwvUXHSNL5wYd1RM6CUa2ZuqorG9ngoJ9Ix5Cce+uX7I5O/E06FCJdhSZ33b5dVyeQDnIlWH7B2s5uByZ7g==}
+ lodash.mapvalues@4.6.0:
+ resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==}
lodash.once@4.1.1:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
@@ -2766,19 +3018,9 @@ packages:
lodash.snakecase@4.1.1:
resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
- lodash.union@4.6.0:
- resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
-
- lodash.values@2.4.1:
- resolution: {integrity: sha512-fQwubKvj2Nox2gy6YnjFm8C1I6MIlzKUtBB+Pj7JGtloGqDDL5CPRr4DUUFWPwXWwAl2k3f4C3Aw8H1qAPB9ww==}
-
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
- log-symbols@2.2.0:
- resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==}
- engines: {node: '>=4'}
-
log-symbols@4.1.0:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
@@ -2791,9 +3033,6 @@ packages:
resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
engines: {node: '>= 12.0.0'}
- long@4.0.0:
- resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==}
-
long@5.3.2:
resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
@@ -2801,50 +3040,54 @@ packages:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
- lowercase-keys@1.0.1:
- resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
- engines: {node: '>=0.10.0'}
-
- lowercase-keys@2.0.0:
- resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
- engines: {node: '>=8'}
-
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ lru-cache@11.2.4:
+ resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==}
+ engines: {node: 20 || >=22}
lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
+ lru-cache@7.18.3:
+ resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
+ engines: {node: '>=12'}
+
lru-memoizer@2.3.0:
resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==}
- lru-queue@0.1.0:
- resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==}
+ lsofi@1.0.0:
+ resolution: {integrity: sha512-MKr9vM1MSm+TSKfI05IYxpKV1NCxpJaBLnELyIf784zYJ5KV9lGCE1EvpA2DtXDNM3fCuFeCwXUzim/fyQRi+A==}
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
make-dir@3.1.0:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
engines: {node: '>=8'}
- make-fetch-happen@14.0.3:
- resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
- marked-terminal@3.3.0:
- resolution: {integrity: sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A==}
+ make-fetch-happen@15.0.3:
+ resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
+
+ marked-terminal@7.3.0:
+ resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==}
+ engines: {node: '>=16.0.0'}
peerDependencies:
- marked: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0
+ marked: '>=1 <16'
- marked@0.7.0:
- resolution: {integrity: sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==}
- engines: {node: '>=0.10.0'}
+ marked@13.0.3:
+ resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==}
+ engines: {node: '>= 18'}
hasBin: true
math-intrinsics@1.1.0:
@@ -2855,13 +3098,17 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
- memoizee@0.4.17:
- resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==}
- engines: {node: '>=0.12'}
+ media-typer@1.1.0:
+ resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
+ engines: {node: '>= 0.8'}
merge-descriptors@1.0.3:
resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+ merge-descriptors@2.0.0:
+ resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
+ engines: {node: '>=18'}
+
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -2885,6 +3132,10 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
+ mime-types@3.0.2:
+ resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+ engines: {node: '>=18'}
+
mime@1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
@@ -2900,20 +3151,13 @@ packages:
engines: {node: '>=10.0.0'}
hasBin: true
- mimic-fn@1.2.0:
- resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==}
- engines: {node: '>=4'}
-
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
- mimic-response@1.0.1:
- resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
- engines: {node: '>=4'}
-
- min-document@2.19.2:
- resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==}
+ minimatch@10.1.1:
+ resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
+ engines: {node: 20 || >=22}
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -2922,6 +3166,10 @@ packages:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
engines: {node: '>=10'}
+ minimatch@6.2.0:
+ resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==}
+ engines: {node: '>=10'}
+
minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -2933,9 +3181,9 @@ packages:
resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==}
engines: {node: '>=16 || 14 >=14.17'}
- minipass-fetch@4.0.1:
- resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ minipass-fetch@5.0.0:
+ resolution: {integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==}
+ engines: {node: ^20.17.0 || >=22.9.0}
minipass-flush@1.0.5:
resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==}
@@ -2949,9 +3197,6 @@ packages:
resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==}
engines: {node: '>=8'}
- minipass@2.9.0:
- resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==}
-
minipass@3.3.6:
resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
engines: {node: '>=8'}
@@ -2960,16 +3205,12 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- minizlib@1.3.3:
- resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==}
-
minizlib@3.1.0:
resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
engines: {node: '>= 18'}
- mkdirp@0.5.6:
- resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
- hasBin: true
+ moo@0.5.2:
+ resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==}
morgan@1.10.1:
resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==}
@@ -2988,19 +3229,29 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- mute-stream@0.0.7:
- resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==}
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
- nan@2.23.1:
- resolution: {integrity: sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==}
+ nan@2.24.0:
+ resolution: {integrity: sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==}
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nash@3.0.0:
- resolution: {integrity: sha512-M5SahEycXUmko3zOvsBkF6p94CWLhnyy9hfpQ9Qzp+rQkQ8D1OaTlfTl1OBWktq9Fak3oDXKU+ev7tiMaMu+1w==}
+ nanoid@5.1.6:
+ resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+
+ nearley@2.20.1:
+ resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
+ hasBin: true
negotiator@0.6.3:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
@@ -3018,32 +3269,35 @@ packages:
resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
engines: {node: '>= 0.4.0'}
- next-tick@1.1.0:
- resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
-
- next@12.3.7:
- resolution: {integrity: sha512-3PDn+u77s5WpbkUrslBP6SKLMeUj9cSx251LOt+yP9fgnqXV/ydny81xQsclz9R6RzCLONMCtwK2RvDdLa/mJQ==}
- engines: {node: '>=12.22.0'}
+ next@16.1.1:
+ resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==}
+ engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
- fibers: '>= 3.1.0'
- node-sass: ^6.0.0 || ^7.0.0
- react: ^17.0.2 || ^18.0.0-0
- react-dom: ^17.0.2 || ^18.0.0-0
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
sass: ^1.3.0
peerDependenciesMeta:
- fibers:
+ '@opentelemetry/api':
optional: true
- node-sass:
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
optional: true
sass:
optional: true
- nice-try@1.0.5:
- resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
+ node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ deprecated: Use your platform's native DOMException instead
- node-emoji@1.11.0:
- resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
+ node-emoji@2.2.0:
+ resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==}
+ engines: {node: '>=18'}
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
@@ -3054,35 +3308,51 @@ packages:
encoding:
optional: true
+ node-fetch@3.3.2:
+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
node-forge@1.3.1:
resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
engines: {node: '>= 6.13.0'}
- node-gyp@11.5.0:
- resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ node-gyp@12.1.0:
+ resolution: {integrity: sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==}
+ engines: {node: ^20.17.0 || >=22.9.0}
hasBin: true
- nopt@8.1.0:
- resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
+ nopt@9.0.0:
+ resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
hasBin: true
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
- normalize-url@4.5.1:
- resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
- engines: {node: '>=8'}
+ npm-install-checks@6.3.0:
+ resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-normalize-package-bin@3.0.1:
+ resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ npm-package-arg@11.0.3:
+ resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
+ npm-pick-manifest@9.1.0:
+ resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==}
+ engines: {node: ^16.14.0 || >=18.0.0}
npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
- oauth-sign@0.9.0:
- resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
-
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -3095,18 +3365,6 @@ packages:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
- object-is@1.1.6:
- resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
- engines: {node: '>= 0.4'}
-
- object-keys@1.1.1:
- resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
- engines: {node: '>= 0.4'}
-
- object.assign@4.1.7:
- resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
- engines: {node: '>= 0.4'}
-
on-finished@2.3.0:
resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
engines: {node: '>= 0.8'}
@@ -3125,10 +3383,6 @@ packages:
one-time@1.0.0:
resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
- onetime@2.0.1:
- resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==}
- engines: {node: '>=4'}
-
onetime@5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
@@ -3137,32 +3391,20 @@ packages:
resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==}
engines: {node: '>=8'}
- openapi3-ts@2.0.2:
- resolution: {integrity: sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==}
+ openapi3-ts@3.2.0:
+ resolution: {integrity: sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg==}
opener@1.5.2:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
- optionator@0.8.3:
- resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
- engines: {node: '>= 0.8.0'}
-
- ora@3.4.0:
- resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==}
- engines: {node: '>=6'}
-
- os-tmpdir@1.0.2:
- resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
- engines: {node: '>=0.10.0'}
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
ospath@1.2.2:
resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==}
- p-cancelable@1.1.0:
- resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
- engines: {node: '>=6'}
-
p-defer@3.0.0:
resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==}
engines: {node: '>=8'}
@@ -3179,33 +3421,34 @@ packages:
resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
engines: {node: '>=18'}
- pac-proxy-agent@5.0.0:
- resolution: {integrity: sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==}
- engines: {node: '>= 8'}
+ p-throttle@7.0.0:
+ resolution: {integrity: sha512-aio0v+S0QVkH1O+9x4dHtD4dgCExACcL+3EtNaGqC01GBudS9ijMuUsmN8OVScyV4OOp0jqdLShZFuSlbL/AsA==}
+ engines: {node: '>=18'}
- pac-resolver@5.0.1:
- resolution: {integrity: sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==}
- engines: {node: '>= 8'}
+ pac-proxy-agent@7.2.0:
+ resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==}
+ engines: {node: '>= 14'}
+
+ pac-resolver@7.0.1:
+ resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==}
+ engines: {node: '>= 14'}
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
- package-json@6.5.0:
- resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
- engines: {node: '>=8'}
+ parse5-htmlparser2-tree-adapter@6.0.1:
+ resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==}
+
+ parse5@5.1.1:
+ resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==}
+
+ parse5@6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
- path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
- path-key@2.0.1:
- resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==}
- engines: {node: '>=4'}
-
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@@ -3214,24 +3457,62 @@ packages:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'}
+ path-scurry@2.0.1:
+ resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==}
+ engines: {node: 20 || >=22}
+
path-to-regexp@0.1.12:
resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
- path-to-regexp@0.1.7:
- resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
-
path-to-regexp@1.9.0:
resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==}
+ path-to-regexp@8.3.0:
+ resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
+
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
- performance-now@0.2.0:
- resolution: {integrity: sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==}
-
performance-now@2.1.0:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+ pg-cloudflare@1.2.7:
+ resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==}
+
+ pg-connection-string@2.9.1:
+ resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==}
+
+ pg-gateway@0.3.0-beta.4:
+ resolution: {integrity: sha512-CTjsM7Z+0Nx2/dyZ6r8zRsc3f9FScoD5UAOlfUx1Fdv/JOIWvRbF7gou6l6vP+uypXQVoYPgw8xZDXgMGvBa4Q==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-pool@3.10.1:
+ resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.10.3:
+ resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg@8.16.3:
+ resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -3252,33 +3533,41 @@ packages:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
+ pkce-challenge@5.0.1:
+ resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
+ engines: {node: '>=16.20.0'}
+
portfinder@1.0.38:
resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==}
engines: {node: '>= 10.12'}
- possible-typed-array-names@1.1.0:
- resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
- engines: {node: '>= 0.4'}
-
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.4.14:
- resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.4.49:
- resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
- prelude-ls@1.1.2:
- resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
- engines: {node: '>= 0.8.0'}
-
- prepend-http@2.0.0:
- resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
engines: {node: '>=4'}
+ postgres-bytea@1.0.1:
+ resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
pretty-bytes@5.6.0:
resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
engines: {node: '>=6'}
@@ -3287,12 +3576,13 @@ packages:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
- proc-log@5.0.0:
- resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ proc-log@4.2.0:
+ resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- process-nextick-args@1.0.7:
- resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==}
+ proc-log@6.1.0:
+ resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==}
+ engines: {node: ^20.17.0 || >=22.9.0}
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
@@ -3305,8 +3595,8 @@ packages:
resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
engines: {node: '>=0.4.0'}
- promise-breaker@5.0.0:
- resolution: {integrity: sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA==}
+ promise-breaker@6.0.0:
+ resolution: {integrity: sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA==}
promise-retry@2.0.1:
resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
@@ -3315,16 +3605,16 @@ packages:
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
- proto3-json-serializer@0.1.9:
- resolution: {integrity: sha512-A60IisqvnuI45qNRygJjrnNjX2TMdQGMY+57tR3nul3ZgO2zXkR9OGR8AXxJhkqx84g0FTnrfi3D5fWMSdANdQ==}
+ proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
proto3-json-serializer@2.0.2:
resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==}
engines: {node: '>=14.0.0'}
- protobufjs@6.11.2:
- resolution: {integrity: sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==}
- hasBin: true
+ proto3-json-serializer@3.0.4:
+ resolution: {integrity: sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==}
+ engines: {node: '>=18'}
protobufjs@7.5.4:
resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
@@ -3334,9 +3624,9 @@ packages:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'}
- proxy-agent@5.0.0:
- resolution: {integrity: sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==}
- engines: {node: '>= 8'}
+ proxy-agent@6.5.0:
+ resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==}
+ engines: {node: '>= 14'}
proxy-from-env@1.0.0:
resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==}
@@ -3344,19 +3634,9 @@ packages:
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
- psl@1.15.0:
- resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
-
pump@3.0.3:
resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
- punycode@1.4.1:
- resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
-
- punycode@2.3.1:
- resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
- engines: {node: '>=6'}
-
pupa@2.1.1:
resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
engines: {node: '>=8'}
@@ -3364,84 +3644,78 @@ packages:
qr.js@0.0.0:
resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==}
- qs@6.10.4:
- resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==}
- engines: {node: '>=0.6'}
-
- qs@6.13.0:
- resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
- engines: {node: '>=0.6'}
-
qs@6.14.0:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
- qs@6.5.3:
- resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
- engines: {node: '>=0.6'}
-
- querystringify@2.2.0:
- resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+ railroad-diagrams@1.0.0:
+ resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==}
- raf@3.4.1:
- resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==}
+ randexp@0.4.6:
+ resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==}
+ engines: {node: '>=0.12'}
range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
- raw-body@2.5.2:
- resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ raw-body@2.5.3:
+ resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==}
engines: {node: '>= 0.8'}
+ raw-body@3.0.2:
+ resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
+ engines: {node: '>= 0.10'}
+
rc@1.2.8:
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
hasBin: true
- re2@1.22.3:
- resolution: {integrity: sha512-002aE82U91DiaUA16U6vbiJusvPXn1OWiQukOxJkVUTXbzrSuQbFNHYKcGw8QK/uifRCfjl2Hd/vXYDanKkmaQ==}
+ re2@1.23.0:
+ resolution: {integrity: sha512-mT7+/Lz+Akjm/C/X6PiaHihcJL92TNNXai/C4c/dfBbhtwMm1uKEEoA2Lz/FF6aBFfQzg5mAyv4BGjM4q44QwQ==}
- react-dom@17.0.2:
- resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==}
+ react-dom@19.2.3:
+ resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
peerDependencies:
- react: 17.0.2
+ react: ^19.2.3
react-fast-compare@2.0.4:
resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==}
+ react-hot-toast@2.6.0:
+ resolution: {integrity: sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=16'
+ react-dom: '>=16'
+
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
- react-motion@0.5.2:
- resolution: {integrity: sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==}
- peerDependencies:
- react: ^0.14.9 || ^15.3.0 || ^16.0.0
-
react-qr-code@2.0.18:
resolution: {integrity: sha512-v1Jqz7urLMhkO6jkgJuBYhnqvXagzceg3qJUWayuCK/c6LTIonpWbwxR1f1APGd4xrW/QcQEovNrAojbUz65Tg==}
peerDependencies:
react: '*'
- react-vis@1.12.1:
- resolution: {integrity: sha512-vH7ihTPlBD6wBuzwPoipheyJnx46kKKMXnVqdk4mv5vq+bJVC6JRYdRZSofa2030+kko99rSq/idnYnNWGr6zA==}
- engines: {node: '>=14.18.0', npm: '>=6.13.0'}
+ react-redux@9.2.0:
+ resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==}
peerDependencies:
- react: ^16.8.3
- react-dom: ^16.8.3
+ '@types/react': ^18.2.25 || ^19
+ react: ^18.0 || ^19
+ redux: ^5.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ redux:
+ optional: true
- react@17.0.2:
- resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==}
+ react@19.2.3:
+ resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
engines: {node: '>=0.10.0'}
- readable-stream@1.1.14:
- resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
-
- readable-stream@2.0.6:
- resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==}
-
readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
@@ -3449,6 +3723,10 @@ packages:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
+ readable-stream@4.7.0:
+ resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
readdir-glob@1.1.3:
resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
@@ -3456,16 +3734,25 @@ packages:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
- redeyed@2.1.1:
- resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==}
+ recharts@3.6.0:
+ resolution: {integrity: sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- regexp.prototype.flags@1.5.4:
- resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
- engines: {node: '>= 0.4'}
+ redux-thunk@3.1.0:
+ resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==}
+ peerDependencies:
+ redux: ^5.0.0
- registry-auth-token@4.2.2:
- resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==}
- engines: {node: '>=6.0.0'}
+ redux@5.0.1:
+ resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
+
+ registry-auth-token@5.1.0:
+ resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==}
+ engines: {node: '>=14'}
registry-url@5.1.0:
resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
@@ -3474,37 +3761,33 @@ packages:
request-progress@3.0.0:
resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==}
- request@2.88.2:
- resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
- engines: {node: '>= 6'}
- deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
-
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
- requires-port@1.0.0:
- resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
-
- responselike@1.0.2:
- resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
- restore-cursor@2.0.0:
- resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==}
- engines: {node: '>=4'}
+ reselect@5.1.1:
+ resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
restore-cursor@3.1.0:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
- retry-request@4.2.2:
- resolution: {integrity: sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==}
- engines: {node: '>=8.10.0'}
+ ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
retry-request@7.0.2:
resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==}
engines: {node: '>=14'}
+ retry-request@8.0.2:
+ resolution: {integrity: sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==}
+ engines: {node: '>=18'}
+
retry@0.12.0:
resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
engines: {node: '>= 4'}
@@ -3516,31 +3799,13 @@ packages:
rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
- rimraf@2.7.1:
- resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
- deprecated: Rimraf versions prior to v4 are no longer supported
+ rimraf@5.0.10:
+ resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==}
hasBin: true
- rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- deprecated: Rimraf versions prior to v4 are no longer supported
- hasBin: true
-
- router@1.3.8:
- resolution: {integrity: sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==}
- engines: {node: '>= 0.8'}
-
- rsvp@4.8.5:
- resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==}
- engines: {node: 6.* || >= 7.*}
-
- run-async@2.4.1:
- resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
- engines: {node: '>=0.12.0'}
-
- rxjs@6.6.7:
- resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
- engines: {npm: '>=2.0.0'}
+ router@2.2.0:
+ resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
+ engines: {node: '>= 18'}
rxjs@7.8.2:
resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
@@ -3551,10 +3816,6 @@ packages:
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
- safe-regex-test@1.1.0:
- resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
- engines: {node: '>= 0.4'}
-
safe-stable-stringify@2.5.0:
resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
engines: {node: '>=10'}
@@ -3562,17 +3823,13 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- scheduler@0.20.2:
- resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==}
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
semver-diff@3.1.1:
resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
engines: {node: '>=8'}
- semver@5.7.2:
- resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
- hasBin: true
-
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -3582,43 +3839,33 @@ packages:
engines: {node: '>=10'}
hasBin: true
- send@0.19.0:
- resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ send@0.19.2:
+ resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
engines: {node: '>= 0.8.0'}
- serve-static@1.16.2:
- resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
- engines: {node: '>= 0.8.0'}
-
- set-function-length@1.2.2:
- resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
- engines: {node: '>= 0.4'}
+ send@1.2.1:
+ resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
+ engines: {node: '>= 18'}
- set-function-name@2.0.2:
- resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
- engines: {node: '>= 0.4'}
+ serve-static@1.16.3:
+ resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==}
+ engines: {node: '>= 0.8.0'}
- setimmediate@1.0.5:
- resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+ serve-static@2.2.1:
+ resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
+ engines: {node: '>= 18'}
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
- shallowequal@1.1.0:
- resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
-
- shebang-command@1.2.0:
- resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
- engines: {node: '>=0.10.0'}
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
- shebang-regex@1.0.0:
- resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
- engines: {node: '>=0.10.0'}
-
shebang-regex@3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
@@ -3650,6 +3897,10 @@ packages:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
engines: {node: '>= 10'}
+ skin-tone@2.0.0:
+ resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==}
+ engines: {node: '>=8'}
+
slice-ansi@3.0.0:
resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
engines: {node: '>=8'}
@@ -3666,10 +3917,6 @@ packages:
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
- socks-proxy-agent@5.0.1:
- resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==}
- engines: {node: '>= 6'}
-
socks-proxy-agent@8.0.5:
resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==}
engines: {node: '>= 14'}
@@ -3678,6 +3925,9 @@ packages:
resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==}
engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
+ sort-any@2.0.0:
+ resolution: {integrity: sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA==}
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -3686,17 +3936,25 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ sql-formatter@15.6.12:
+ resolution: {integrity: sha512-mkpF+RG402P66VMsnQkWewTRzDBWfu9iLbOfxaW/nAKOS/2A9MheQmcU5cmX0D0At9azrorZwpvcBRNNBozACQ==}
+ hasBin: true
+
sshpk@1.18.0:
resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==}
engines: {node: '>=0.10.0'}
hasBin: true
- ssri@12.0.0:
- resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ ssri@13.0.0:
+ resolution: {integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==}
+ engines: {node: ^20.17.0 || >=22.9.0}
stack-trace@0.0.10:
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
@@ -3705,32 +3963,29 @@ packages:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
- statuses@2.0.1:
- resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
engines: {node: '>= 0.8'}
- stop-iteration-iterator@1.1.0:
- resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
- engines: {node: '>= 0.4'}
+ stream-chain@2.2.5:
+ resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==}
stream-events@1.0.5:
resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==}
+ stream-json@1.9.1:
+ resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==}
+
stream-shift@1.0.3:
resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==}
+ streamx@2.23.0:
+ resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==}
+
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
- string-length@1.0.1:
- resolution: {integrity: sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw==}
- engines: {node: '>=0.10.0'}
-
- string-width@2.1.1:
- resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==}
- engines: {node: '>=4'}
-
string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -3739,27 +3994,12 @@ packages:
resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
engines: {node: '>=12'}
- string_decoder@0.10.31:
- resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
-
string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
- strip-ansi@3.0.1:
- resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
- engines: {node: '>=0.10.0'}
-
- strip-ansi@4.0.0:
- resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==}
- engines: {node: '>=4'}
-
- strip-ansi@5.2.0:
- resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
- engines: {node: '>=6'}
-
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -3782,42 +4022,24 @@ packages:
stubs@3.0.0:
resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==}
- styled-components@6.1.19:
- resolution: {integrity: sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==}
- engines: {node: '>= 16'}
- peerDependencies:
- react: '>= 16.8.0'
- react-dom: '>= 16.8.0'
-
- styled-jsx@5.0.7:
- resolution: {integrity: sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==}
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
engines: {node: '>= 12.0.0'}
peerDependencies:
'@babel/core': '*'
babel-plugin-macros: '*'
- react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
peerDependenciesMeta:
'@babel/core':
optional: true
babel-plugin-macros:
optional: true
- stylis@4.3.2:
- resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==}
-
- superstatic@7.1.0:
- resolution: {integrity: sha512-yBU8iw07nM3Bu4jFc8lnKwLey0cj61OaGmFJZcYC2X+kEpXVmXzERJ3OTAHZAESe1OTeNIuWadt81U5IULGGAA==}
- engines: {node: '>= 8.6.0'}
+ superstatic@10.0.0:
+ resolution: {integrity: sha512-4xIenBdrIIYuqXrIVx/lejyCh4EJwEMPCwfk9VGFfRlhZcdvzTd3oVOUILrAGfC4pFUWixzPgaOVzAEZgeYI3w==}
+ engines: {node: 20 || 22 || 24}
hasBin: true
- supports-color@2.0.0:
- resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
- engines: {node: '>=0.8.0'}
-
- supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
-
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -3830,22 +4052,28 @@ packages:
resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==}
engines: {node: '>=12'}
- supports-hyperlinks@1.0.1:
- resolution: {integrity: sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==}
- engines: {node: '>=4'}
+ supports-hyperlinks@3.2.0:
+ resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
+ engines: {node: '>=14.18'}
- swr@1.3.0:
- resolution: {integrity: sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==}
- peerDependencies:
- react: ^16.11.0 || ^17.0.0 || ^18.0.0
+ systeminformation@5.28.3:
+ resolution: {integrity: sha512-crbaZrBH3TpTbqc0PKFqnUFHdAJOxV9UhF3KCGSrf+YP+SkoMHmxU2Nr9yIG2xgCr4645Z9Ec4GHQQQ7kGX/HA==}
+ engines: {node: '>=8.0.0'}
+ os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
+ hasBin: true
+
+ tailwindcss@4.0.0:
+ resolution: {integrity: sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ==}
+
+ tailwindcss@4.1.18:
+ resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==}
- tar-stream@2.2.0:
- resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+ tapable@2.3.0:
+ resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'}
- tar@4.4.19:
- resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==}
- engines: {node: '>=4.5'}
+ tar-stream@3.1.7:
+ resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
tar@7.5.2:
resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==}
@@ -3854,29 +4082,38 @@ packages:
tcp-port-used@1.0.2:
resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==}
+ teeny-request@10.1.0:
+ resolution: {integrity: sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==}
+ engines: {node: '>=18'}
+
teeny-request@9.0.0:
resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==}
engines: {node: '>=14'}
- term-size@2.2.1:
- resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
- engines: {node: '>=8'}
+ text-decoder@1.2.3:
+ resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==}
text-hex@1.0.0:
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
throttleit@1.0.1:
resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==}
- through2@2.0.1:
- resolution: {integrity: sha512-/vp02SIbpmVHapNMjox4hDBzykPdAOmH5y3INcKaxGfpEPSCMqzdWXyGfqPYyxoBLo1JpxBrlh3Z9esv0vWUYw==}
+ through2@2.0.5:
+ resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
through@2.3.8:
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
- timers-ext@0.1.8:
- resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==}
- engines: {node: '>=0.12'}
+ tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
tiny-warning@1.0.3:
resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
@@ -3885,18 +4122,17 @@ packages:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
- tmp@0.0.33:
- resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
- engines: {node: '>=0.6.0'}
+ tldts-core@6.1.86:
+ resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
+
+ tldts@6.1.86:
+ resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
+ hasBin: true
tmp@0.2.5:
resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
- to-readable-stream@1.0.0:
- resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
- engines: {node: '>=6'}
-
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -3909,13 +4145,9 @@ packages:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
- tough-cookie@2.5.0:
- resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
- engines: {node: '>=0.8'}
-
- tough-cookie@4.1.4:
- resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
- engines: {node: '>=6'}
+ tough-cookie@5.1.2:
+ resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
+ engines: {node: '>=16'}
toxic@1.0.1:
resolution: {integrity: sha512-WI3rIGdcaKULYg7KVoB0zcjikqvcYYvcuT6D89bFPz2rVR0Rl0PK6x8/X62rtdLtBKIE985NzVf/auTtGegIIg==}
@@ -3923,18 +4155,27 @@ packages:
tr46@0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
- traverse@0.3.9:
- resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==}
+ tree-kill@1.2.2:
+ resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+ hasBin: true
triple-beam@1.4.1:
resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
engines: {node: '>= 14.0.0'}
- tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-
- tslib@2.6.2:
- resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+ ts-node@10.9.2:
+ resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+ hasBin: true
+ peerDependencies:
+ '@swc/core': '>=1.2.50'
+ '@swc/wasm': '>=1.2.50'
+ '@types/node': '*'
+ typescript: '>=2.7'
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ '@swc/wasm':
+ optional: true
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -3949,17 +4190,6 @@ packages:
tweetnacl@0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
- tweetnacl@1.0.3:
- resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==}
-
- tweetsodium@0.0.5:
- resolution: {integrity: sha512-T3aXZtx7KqQbutTtBfn+P5By3HdBuB1eCoGviIrRJV2sXeToxv2X2cv5RvYqgG26PSnN5m3fYixds22Gkfd11w==}
- deprecated: 'tweetsodium is deprecated and unmaintained. Please consider using libsodium.js, maintained by the same author as libsodium: https://github.com/jedisct1/libsodium.js'
-
- type-check@0.3.2:
- resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
- engines: {node: '>= 0.8.0'}
-
type-fest@0.20.2:
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
engines: {node: '>=10'}
@@ -3976,8 +4206,9 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
- type@2.7.3:
- resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==}
+ type-is@2.0.1:
+ resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
+ engines: {node: '>= 0.6'}
typedarray-to-buffer@3.1.5:
resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
@@ -3993,31 +4224,25 @@ packages:
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
- unfetch@4.2.0:
- resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==}
+ unicode-emoji-modifier-base@1.0.0:
+ resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==}
+ engines: {node: '>=4'}
- unique-filename@4.0.0:
- resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ unique-filename@5.0.0:
+ resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
- unique-slug@5.0.0:
- resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ unique-slug@6.0.0:
+ resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
unique-string@2.0.0:
resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
engines: {node: '>=8'}
- universal-analytics@0.4.23:
- resolution: {integrity: sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==}
-
- universalify@0.1.2:
- resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
- engines: {node: '>= 4.0.0'}
-
- universalify@0.2.0:
- resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
- engines: {node: '>= 4.0.0'}
+ universal-analytics@0.5.3:
+ resolution: {integrity: sha512-HXSMyIcf2XTvwZ6ZZQLfxfViRm/yTGoRgDeTbojtq6rezeyKB0sTBcKH2fhddnteAHRcHiKgr/ACpbgjGOC6RQ==}
+ engines: {node: '>=12.18.2'}
universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
@@ -4031,34 +4256,26 @@ packages:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
- unzipper@0.10.14:
- resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==}
-
- update-notifier@4.1.3:
- resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==}
- engines: {node: '>=8'}
-
- update-notifier@5.1.0:
- resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==}
- engines: {node: '>=10'}
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
- uri-js@4.4.1:
- resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ update-notifier-cjs@5.1.7:
+ resolution: {integrity: sha512-eZWTh8F+VCEoC4UIh0pKmh8h4izj65VvLhCpJpVefUxdYe0fU3GBrC4Sbh1AoWA/miNPAb6UVlp2fUQNsfp+3g==}
+ engines: {node: '>=14'}
url-join@0.0.1:
resolution: {integrity: sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw==}
- url-parse-lax@3.0.0:
- resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
- engines: {node: '>=4'}
-
- url-parse@1.5.10:
- resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+ url-template@2.0.8:
+ resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==}
- use-sync-external-store@1.2.0:
- resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -4071,11 +4288,6 @@ packages:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
hasBin: true
- uuid@3.4.0:
- resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
- deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
- hasBin: true
-
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -4084,9 +4296,16 @@ packages:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
+ v8-compile-cache-lib@3.0.1:
+ resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
valid-url@1.0.9:
resolution: {integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==}
+ validate-npm-package-name@5.0.1:
+ resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
@@ -4095,14 +4314,16 @@ packages:
resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
engines: {'0': node >=0.6.0}
- vm2@3.10.0:
- resolution: {integrity: sha512-3ggF4Bs0cw4M7Rxn19/Cv3nJi04xrgHwt4uLto+zkcZocaKwP/nKP9wPx6ggN2X0DSXxOOIc63BV1jvES19wXQ==}
- engines: {node: '>=6.0'}
- hasBin: true
+ victory-vendor@37.3.6:
+ resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==}
wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+
web-vitals@4.2.4:
resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==}
@@ -4122,33 +4343,20 @@ packages:
resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
engines: {node: '>=0.8.0'}
+ whatwg-fetch@3.6.20:
+ resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
+
whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
- which-boxed-primitive@1.1.1:
- resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
- engines: {node: '>= 0.4'}
-
- which-collection@1.0.2:
- resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
- engines: {node: '>= 0.4'}
-
- which-typed-array@1.1.19:
- resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
- engines: {node: '>= 0.4'}
-
- which@1.3.1:
- resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
- hasBin: true
-
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
hasBin: true
- which@5.0.0:
- resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ which@6.0.0:
+ resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==}
+ engines: {node: ^20.17.0 || >=22.9.0}
hasBin: true
widest-line@3.1.0:
@@ -4159,14 +4367,10 @@ packages:
resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
engines: {node: '>= 12.0.0'}
- winston@3.18.3:
- resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==}
+ winston@3.19.0:
+ resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==}
engines: {node: '>= 12.0.0'}
- word-wrap@1.2.5:
- resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
- engines: {node: '>=0.10.0'}
-
wrap-ansi@6.2.0:
resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
engines: {node: '>=8'}
@@ -4201,9 +4405,6 @@ packages:
resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
engines: {node: '>=8'}
- xregexp@2.0.0:
- resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==}
-
xtend@4.0.2:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
@@ -4212,9 +4413,6 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-
yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
@@ -4226,6 +4424,11 @@ packages:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
+ yaml@2.8.2:
+ resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
yargs-parser@20.2.9:
resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
engines: {node: '>=10'}
@@ -4245,116 +4448,102 @@ packages:
yauzl@2.10.0:
resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+ yn@3.1.1:
+ resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+ engines: {node: '>=6'}
+
yocto-queue@0.1.0:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- zip-stream@4.1.1:
- resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
- engines: {node: '>= 10'}
+ yoctocolors-cjs@2.1.3:
+ resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
+ engines: {node: '>=18'}
+
+ zip-stream@6.0.1:
+ resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==}
+ engines: {node: '>= 14'}
+
+ zod-to-json-schema@3.25.1:
+ resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==}
+ peerDependencies:
+ zod: ^3.25 || ^4
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
snapshots:
+ '@alloc/quick-lru@5.2.0': {}
+
'@apidevtools/json-schema-ref-parser@9.1.2':
dependencies:
'@jsdevtools/ono': 7.1.3
'@types/json-schema': 7.0.15
call-me-maybe: 1.0.2
- js-yaml: 4.1.0
-
- '@babel/code-frame@7.27.1':
- dependencies:
- '@babel/helper-validator-identifier': 7.28.5
- js-tokens: 4.0.0
- picocolors: 1.1.1
+ js-yaml: 4.1.1
- '@babel/generator@7.28.5':
+ '@apphosting/build@0.1.7(@types/node@22.19.3)(typescript@5.9.3)':
dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
- jsesc: 3.1.0
+ '@apphosting/common': 0.0.9
+ '@npmcli/promise-spawn': 3.0.0
+ colorette: 2.0.20
+ commander: 11.1.0
+ npm-pick-manifest: 9.1.0
+ ts-node: 10.9.2(@types/node@22.19.3)(typescript@5.9.3)
+ transitivePeerDependencies:
+ - '@swc/core'
+ - '@swc/wasm'
+ - '@types/node'
+ - typescript
- '@babel/helper-annotate-as-pure@7.27.3':
- dependencies:
- '@babel/types': 7.28.5
+ '@apphosting/common@0.0.8': {}
- '@babel/helper-globals@7.28.0': {}
+ '@apphosting/common@0.0.9': {}
- '@babel/helper-module-imports@7.27.1':
+ '@babel/code-frame@7.27.1':
dependencies:
- '@babel/traverse': 7.28.5
- '@babel/types': 7.28.5
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-string-parser@7.27.1': {}
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
'@babel/helper-validator-identifier@7.28.5': {}
- '@babel/parser@7.28.5':
- dependencies:
- '@babel/types': 7.28.5
-
'@babel/runtime@7.28.4': {}
- '@babel/template@7.27.2':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
-
- '@babel/traverse@7.28.5':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.5
- '@babel/helper-globals': 7.28.0
- '@babel/parser': 7.28.5
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
-
- '@babel/types@7.28.5':
- dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.28.5
-
- '@biomejs/biome@2.3.5':
+ '@biomejs/biome@2.3.12':
optionalDependencies:
- '@biomejs/cli-darwin-arm64': 2.3.5
- '@biomejs/cli-darwin-x64': 2.3.5
- '@biomejs/cli-linux-arm64': 2.3.5
- '@biomejs/cli-linux-arm64-musl': 2.3.5
- '@biomejs/cli-linux-x64': 2.3.5
- '@biomejs/cli-linux-x64-musl': 2.3.5
- '@biomejs/cli-win32-arm64': 2.3.5
- '@biomejs/cli-win32-x64': 2.3.5
-
- '@biomejs/cli-darwin-arm64@2.3.5':
+ '@biomejs/cli-darwin-arm64': 2.3.12
+ '@biomejs/cli-darwin-x64': 2.3.12
+ '@biomejs/cli-linux-arm64': 2.3.12
+ '@biomejs/cli-linux-arm64-musl': 2.3.12
+ '@biomejs/cli-linux-x64': 2.3.12
+ '@biomejs/cli-linux-x64-musl': 2.3.12
+ '@biomejs/cli-win32-arm64': 2.3.12
+ '@biomejs/cli-win32-x64': 2.3.12
+
+ '@biomejs/cli-darwin-arm64@2.3.12':
optional: true
- '@biomejs/cli-darwin-x64@2.3.5':
+ '@biomejs/cli-darwin-x64@2.3.12':
optional: true
- '@biomejs/cli-linux-arm64-musl@2.3.5':
+ '@biomejs/cli-linux-arm64-musl@2.3.12':
optional: true
- '@biomejs/cli-linux-arm64@2.3.5':
+ '@biomejs/cli-linux-arm64@2.3.12':
optional: true
- '@biomejs/cli-linux-x64-musl@2.3.5':
+ '@biomejs/cli-linux-x64-musl@2.3.12':
optional: true
- '@biomejs/cli-linux-x64@2.3.5':
+ '@biomejs/cli-linux-x64@2.3.12':
optional: true
- '@biomejs/cli-win32-arm64@2.3.5':
+ '@biomejs/cli-win32-arm64@2.3.12':
optional: true
- '@biomejs/cli-win32-x64@2.3.5':
+ '@biomejs/cli-win32-x64@2.3.12':
optional: true
'@colors/colors@1.5.0':
@@ -4362,7 +4551,11 @@ snapshots:
'@colors/colors@1.6.0': {}
- '@cypress/request@2.88.12':
+ '@cspotcode/source-map-support@0.8.1':
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.9
+
+ '@cypress/request@3.0.9':
dependencies:
aws-sign2: 0.7.0
aws4: 1.13.2
@@ -4370,16 +4563,16 @@ snapshots:
combined-stream: 1.0.8
extend: 3.0.2
forever-agent: 0.6.1
- form-data: 2.3.3
- http-signature: 1.3.6
+ form-data: 4.0.5
+ http-signature: 1.4.0
is-typedarray: 1.0.0
isstream: 0.1.2
json-stringify-safe: 5.0.1
mime-types: 2.1.35
performance-now: 2.1.0
- qs: 6.10.4
+ qs: 6.14.0
safe-buffer: 5.2.1
- tough-cookie: 4.1.4
+ tough-cookie: 5.1.2
tunnel-agent: 0.6.0
uuid: 8.3.2
@@ -4398,13 +4591,18 @@ snapshots:
'@discoveryjs/json-ext@0.5.7': {}
- '@emotion/is-prop-valid@1.2.2':
+ '@electric-sql/pglite-tools@0.2.19(@electric-sql/pglite@0.3.14)':
dependencies:
- '@emotion/memoize': 0.8.1
+ '@electric-sql/pglite': 0.3.14
- '@emotion/memoize@0.8.1': {}
+ '@electric-sql/pglite@0.2.17': {}
- '@emotion/unitless@0.8.1': {}
+ '@electric-sql/pglite@0.3.14': {}
+
+ '@emnapi/runtime@1.7.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
'@fastify/busboy@3.2.0': {}
@@ -4769,16 +4967,14 @@ snapshots:
'@firebase/webchannel-wrapper@1.0.5': {}
- '@geist-ui/react-icons@1.0.1(@geist-ui/react@2.2.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react@17.0.2)':
- dependencies:
- '@geist-ui/react': 2.2.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
- react: 17.0.2
-
- '@geist-ui/react@2.2.5(react-dom@17.0.2(react@17.0.2))(react@17.0.2)':
+ '@google-cloud/cloud-sql-connector@1.8.5':
dependencies:
- '@babel/runtime': 7.28.4
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
+ '@googleapis/sqladmin': 31.1.0
+ gaxios: 7.1.3
+ google-auth-library: 10.5.0
+ p-throttle: 7.0.0
+ transitivePeerDependencies:
+ - supports-color
'@google-cloud/firestore@7.11.6(encoding@0.1.13)':
dependencies:
@@ -4792,45 +4988,46 @@ snapshots:
- supports-color
optional: true
- '@google-cloud/paginator@3.0.7':
- dependencies:
- arrify: 2.0.1
- extend: 3.0.2
-
'@google-cloud/paginator@5.0.2':
dependencies:
arrify: 2.0.1
extend: 3.0.2
optional: true
- '@google-cloud/precise-date@2.0.4': {}
+ '@google-cloud/paginator@6.0.0':
+ dependencies:
+ extend: 3.0.2
- '@google-cloud/projectify@2.1.1': {}
+ '@google-cloud/precise-date@5.0.0': {}
'@google-cloud/projectify@4.0.0':
optional: true
- '@google-cloud/promisify@2.0.4': {}
+ '@google-cloud/projectify@5.0.0': {}
+
+ '@google-cloud/promisify@2.0.4':
+ optional: true
+
+ '@google-cloud/promisify@5.0.0': {}
- '@google-cloud/pubsub@2.19.4(encoding@0.1.13)':
+ '@google-cloud/pubsub@5.2.0':
dependencies:
- '@google-cloud/paginator': 3.0.7
- '@google-cloud/precise-date': 2.0.4
- '@google-cloud/projectify': 2.1.1
- '@google-cloud/promisify': 2.0.4
+ '@google-cloud/paginator': 6.0.0
+ '@google-cloud/precise-date': 5.0.0
+ '@google-cloud/projectify': 5.0.0
+ '@google-cloud/promisify': 5.0.0
'@opentelemetry/api': 1.9.0
- '@opentelemetry/semantic-conventions': 1.38.0
- '@types/duplexify': 3.6.5
- '@types/long': 4.0.2
+ '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0)
+ '@opentelemetry/semantic-conventions': 1.34.0
arrify: 2.0.1
extend: 3.0.2
- google-auth-library: 7.14.1(encoding@0.1.13)
- google-gax: 2.30.3(encoding@0.1.13)
+ google-auth-library: 10.5.0
+ google-gax: 5.0.6
+ heap-js: 2.7.1
is-stream-ended: 0.1.4
lodash.snakecase: 4.1.1
p-defer: 3.0.0
transitivePeerDependencies:
- - encoding
- supports-color
'@google-cloud/storage@7.18.0(encoding@0.1.13)':
@@ -4855,30 +5052,22 @@ snapshots:
- supports-color
optional: true
+ '@googleapis/sqladmin@31.1.0':
+ dependencies:
+ googleapis-common: 8.0.2-rc.0
+ transitivePeerDependencies:
+ - supports-color
+
'@grpc/grpc-js@1.14.1':
dependencies:
'@grpc/proto-loader': 0.8.0
'@js-sdsl/ordered-map': 4.4.2
- optional: true
-
- '@grpc/grpc-js@1.6.12':
- dependencies:
- '@grpc/proto-loader': 0.7.15
- '@types/node': 20.19.24
'@grpc/grpc-js@1.9.15':
dependencies:
'@grpc/proto-loader': 0.7.15
'@types/node': 20.19.24
- '@grpc/proto-loader@0.6.9':
- dependencies:
- '@types/long': 4.0.2
- lodash.camelcase: 4.3.0
- long: 4.0.0
- protobufjs: 6.11.2
- yargs: 16.2.0
-
'@grpc/proto-loader@0.7.15':
dependencies:
lodash.camelcase: 4.3.0
@@ -4892,201 +5081,603 @@ snapshots:
long: 5.3.2
protobufjs: 7.5.4
yargs: 17.7.2
- optional: true
- '@isaacs/cliui@8.0.2':
+ '@hono/node-server@1.19.7(hono@4.11.3)':
dependencies:
- string-width: 5.1.2
- string-width-cjs: string-width@4.2.3
- strip-ansi: 7.1.2
- strip-ansi-cjs: strip-ansi@6.0.1
- wrap-ansi: 8.1.0
- wrap-ansi-cjs: wrap-ansi@7.0.0
- optional: true
+ hono: 4.11.3
- '@isaacs/fs-minipass@4.0.1':
- dependencies:
- minipass: 7.1.2
+ '@img/colour@1.0.0':
optional: true
- '@jridgewell/gen-mapping@0.3.13':
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/sourcemap-codec@1.5.5': {}
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
- '@jridgewell/trace-mapping@0.3.31':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.5
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
- '@js-sdsl/ordered-map@4.4.2':
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
optional: true
- '@jsdevtools/ono@7.1.3': {}
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
- '@next/bundle-analyzer@16.1.1':
- dependencies:
- webpack-bundle-analyzer: 4.10.1
- transitivePeerDependencies:
- - bufferutil
- - utf-8-validate
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
- '@next/env@12.3.7': {}
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
- '@next/swc-android-arm-eabi@12.3.4':
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
optional: true
- '@next/swc-android-arm64@12.3.4':
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
optional: true
- '@next/swc-darwin-arm64@12.3.4':
+ '@img/sharp-libvips-linux-s390x@1.2.4':
optional: true
- '@next/swc-darwin-x64@12.3.4':
+ '@img/sharp-libvips-linux-x64@1.2.4':
optional: true
- '@next/swc-freebsd-x64@12.3.4':
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
optional: true
- '@next/swc-linux-arm-gnueabihf@12.3.4':
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
optional: true
- '@next/swc-linux-arm64-gnu@12.3.4':
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
optional: true
- '@next/swc-linux-arm64-musl@12.3.4':
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
optional: true
- '@next/swc-linux-x64-gnu@12.3.4':
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
optional: true
- '@next/swc-linux-x64-musl@12.3.4':
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
optional: true
- '@next/swc-win32-arm64-msvc@12.3.4':
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
optional: true
- '@next/swc-win32-ia32-msvc@12.3.4':
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
optional: true
- '@next/swc-win32-x64-msvc@12.3.4':
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
optional: true
- '@npmcli/agent@3.0.0':
- dependencies:
- agent-base: 7.1.4
- http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6
- lru-cache: 10.4.3
- socks-proxy-agent: 8.0.5
- transitivePeerDependencies:
- - supports-color
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
optional: true
- '@npmcli/fs@4.0.0':
+ '@img/sharp-wasm32@0.34.5':
dependencies:
- semver: 7.7.3
+ '@emnapi/runtime': 1.7.1
optional: true
- '@opentelemetry/api@1.9.0': {}
-
- '@opentelemetry/semantic-conventions@1.38.0': {}
-
- '@pkgjs/parseargs@0.11.0':
+ '@img/sharp-win32-arm64@0.34.5':
optional: true
- '@polka/url@1.0.0-next.29': {}
-
- '@protobufjs/aspromise@1.1.2': {}
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
- '@protobufjs/base64@1.1.2': {}
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
- '@protobufjs/codegen@2.0.4': {}
+ '@inquirer/ansi@1.0.2': {}
- '@protobufjs/eventemitter@1.1.0': {}
+ '@inquirer/checkbox@4.3.2(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@protobufjs/fetch@1.1.0':
+ '@inquirer/confirm@5.1.21(@types/node@22.19.3)':
dependencies:
- '@protobufjs/aspromise': 1.1.2
- '@protobufjs/inquire': 1.1.0
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@protobufjs/float@1.0.2': {}
+ '@inquirer/core@10.3.2(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@protobufjs/inquire@1.1.0': {}
+ '@inquirer/editor@4.2.23(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/external-editor': 1.0.3(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@protobufjs/path@1.1.2': {}
+ '@inquirer/expand@4.0.23(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@protobufjs/pool@1.1.0': {}
+ '@inquirer/external-editor@1.0.3(@types/node@22.19.3)':
+ dependencies:
+ chardet: 2.1.1
+ iconv-lite: 0.7.1
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@protobufjs/utf8@1.1.0': {}
+ '@inquirer/figures@1.0.15': {}
- '@sindresorhus/is@0.14.0': {}
+ '@inquirer/input@4.3.1(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@so-ric/colorspace@1.1.6':
+ '@inquirer/number@3.0.23(@types/node@22.19.3)':
dependencies:
- color: 5.0.2
- text-hex: 1.0.0
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@swc/helpers@0.4.11':
+ '@inquirer/password@4.0.23(@types/node@22.19.3)':
dependencies:
- tslib: 2.8.1
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
+
+ '@inquirer/prompts@7.10.1(@types/node@22.19.3)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.2(@types/node@22.19.3)
+ '@inquirer/confirm': 5.1.21(@types/node@22.19.3)
+ '@inquirer/editor': 4.2.23(@types/node@22.19.3)
+ '@inquirer/expand': 4.0.23(@types/node@22.19.3)
+ '@inquirer/input': 4.3.1(@types/node@22.19.3)
+ '@inquirer/number': 3.0.23(@types/node@22.19.3)
+ '@inquirer/password': 4.0.23(@types/node@22.19.3)
+ '@inquirer/rawlist': 4.1.11(@types/node@22.19.3)
+ '@inquirer/search': 3.2.2(@types/node@22.19.3)
+ '@inquirer/select': 4.4.2(@types/node@22.19.3)
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@szmarczak/http-timer@1.1.2':
+ '@inquirer/rawlist@4.1.11(@types/node@22.19.3)':
dependencies:
- defer-to-connect: 1.1.3
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@testing-library/cypress@8.0.7(cypress@10.11.0)':
+ '@inquirer/search@3.2.2(@types/node@22.19.3)':
dependencies:
- '@babel/runtime': 7.28.4
- '@testing-library/dom': 8.20.1
- cypress: 10.11.0
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@testing-library/dom@8.20.1':
+ '@inquirer/select@4.4.2(@types/node@22.19.3)':
dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/runtime': 7.28.4
- '@types/aria-query': 5.0.4
- aria-query: 5.1.3
- chalk: 4.1.2
- dom-accessibility-api: 0.5.16
- lz-string: 1.5.0
- pretty-format: 27.5.1
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@22.19.3)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@22.19.3)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@tootallnate/once@1.1.2': {}
+ '@inquirer/type@3.0.10(@types/node@22.19.3)':
+ optionalDependencies:
+ '@types/node': 22.19.3
- '@tootallnate/once@2.0.0':
+ '@isaacs/balanced-match@4.0.1':
optional: true
- '@types/archiver@5.3.4':
+ '@isaacs/brace-expansion@5.0.0':
dependencies:
- '@types/readdir-glob': 1.1.5
-
- '@types/aria-query@5.0.4': {}
+ '@isaacs/balanced-match': 4.0.1
+ optional: true
- '@types/body-parser@1.19.6':
+ '@isaacs/cliui@8.0.2':
dependencies:
- '@types/connect': 3.4.38
- '@types/node': 20.19.24
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.2
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
- '@types/caseless@0.12.5':
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.2
optional: true
- '@types/connect@3.4.38':
+ '@jridgewell/gen-mapping@0.3.13':
dependencies:
- '@types/node': 20.19.24
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
- '@types/duplexify@3.6.5':
+ '@jridgewell/remapping@2.3.5':
dependencies:
- '@types/node': 20.19.24
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
- '@types/express-serve-static-core@4.19.7':
- dependencies:
- '@types/node': 20.19.24
- '@types/qs': 6.14.0
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@jridgewell/trace-mapping@0.3.9':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@js-sdsl/ordered-map@4.4.2': {}
+
+ '@jsdevtools/ono@7.1.3': {}
+
+ '@modelcontextprotocol/sdk@1.25.1(hono@4.11.3)(zod@3.25.76)':
+ dependencies:
+ '@hono/node-server': 1.19.7(hono@4.11.3)
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ content-type: 1.0.5
+ cors: 2.8.5
+ cross-spawn: 7.0.6
+ eventsource: 3.0.7
+ eventsource-parser: 3.0.6
+ express: 5.2.1
+ express-rate-limit: 7.5.1(express@5.2.1)
+ jose: 6.1.3
+ json-schema-typed: 8.0.2
+ pkce-challenge: 5.0.1
+ raw-body: 3.0.2
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.1(zod@3.25.76)
+ transitivePeerDependencies:
+ - hono
+ - supports-color
+
+ '@next/bundle-analyzer@16.1.1':
+ dependencies:
+ webpack-bundle-analyzer: 4.10.1
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ '@next/env@16.1.1': {}
+
+ '@next/swc-darwin-arm64@16.1.1':
+ optional: true
+
+ '@next/swc-darwin-x64@16.1.1':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@16.1.1':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@16.1.1':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@16.1.1':
+ optional: true
+
+ '@next/swc-linux-x64-musl@16.1.1':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@16.1.1':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@16.1.1':
+ optional: true
+
+ '@npmcli/agent@4.0.0':
+ dependencies:
+ agent-base: 7.1.4
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ lru-cache: 11.2.4
+ socks-proxy-agent: 8.0.5
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
+ '@npmcli/fs@5.0.0':
+ dependencies:
+ semver: 7.7.3
+ optional: true
+
+ '@npmcli/promise-spawn@3.0.0':
+ dependencies:
+ infer-owner: 1.0.4
+
+ '@opentelemetry/api@1.9.0': {}
+
+ '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)':
+ dependencies:
+ '@opentelemetry/api': 1.9.0
+ '@opentelemetry/semantic-conventions': 1.28.0
+
+ '@opentelemetry/semantic-conventions@1.28.0': {}
+
+ '@opentelemetry/semantic-conventions@1.34.0': {}
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@pnpm/config.env-replace@1.1.0': {}
+
+ '@pnpm/network.ca-file@1.0.2':
+ dependencies:
+ graceful-fs: 4.2.10
+
+ '@pnpm/npm-conf@2.3.1':
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+
+ '@polka/url@1.0.0-next.29': {}
+
+ '@protobufjs/aspromise@1.1.2': {}
+
+ '@protobufjs/base64@1.1.2': {}
+
+ '@protobufjs/codegen@2.0.4': {}
+
+ '@protobufjs/eventemitter@1.1.0': {}
+
+ '@protobufjs/fetch@1.1.0':
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/inquire': 1.1.0
+
+ '@protobufjs/float@1.0.2': {}
+
+ '@protobufjs/inquire@1.1.0': {}
+
+ '@protobufjs/path@1.1.2': {}
+
+ '@protobufjs/pool@1.1.0': {}
+
+ '@protobufjs/utf8@1.1.0': {}
+
+ '@reduxjs/toolkit@2.11.2(react-redux@9.2.0(@types/react@19.2.8)(react@19.2.3)(redux@5.0.1))(react@19.2.3)':
+ dependencies:
+ '@standard-schema/spec': 1.1.0
+ '@standard-schema/utils': 0.3.0
+ immer: 11.1.0
+ redux: 5.0.1
+ redux-thunk: 3.1.0(redux@5.0.1)
+ reselect: 5.1.1
+ optionalDependencies:
+ react: 19.2.3
+ react-redux: 9.2.0(@types/react@19.2.8)(react@19.2.3)(redux@5.0.1)
+
+ '@silk-hq/components@0.10.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@sindresorhus/is@4.6.0': {}
+
+ '@so-ric/colorspace@1.1.6':
+ dependencies:
+ color: 5.0.3
+ text-hex: 1.0.0
+
+ '@standard-schema/spec@1.1.0': {}
+
+ '@standard-schema/utils@0.3.0': {}
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tabler/icons-react@3.36.0(react@19.2.3)':
+ dependencies:
+ '@tabler/icons': 3.36.0
+ react: 19.2.3
+
+ '@tabler/icons@3.36.0': {}
+
+ '@tailwindcss/node@4.1.18':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.18.4
+ jiti: 2.6.1
+ lightningcss: 1.30.2
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.1.18
+
+ '@tailwindcss/oxide-android-arm64@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-wasm32-wasi@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.1.18':
+ optional: true
+
+ '@tailwindcss/oxide@4.1.18':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.1.18
+ '@tailwindcss/oxide-darwin-arm64': 4.1.18
+ '@tailwindcss/oxide-darwin-x64': 4.1.18
+ '@tailwindcss/oxide-freebsd-x64': 4.1.18
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18
+ '@tailwindcss/oxide-linux-arm64-musl': 4.1.18
+ '@tailwindcss/oxide-linux-x64-gnu': 4.1.18
+ '@tailwindcss/oxide-linux-x64-musl': 4.1.18
+ '@tailwindcss/oxide-wasm32-wasi': 4.1.18
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
+ '@tailwindcss/oxide-win32-x64-msvc': 4.1.18
+
+ '@tailwindcss/postcss@4.1.18':
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ '@tailwindcss/node': 4.1.18
+ '@tailwindcss/oxide': 4.1.18
+ postcss: 8.5.6
+ tailwindcss: 4.1.18
+
+ '@tanstack/query-core@5.90.14': {}
+
+ '@tanstack/react-query@5.90.14(react@19.2.3)':
+ dependencies:
+ '@tanstack/query-core': 5.90.14
+ react: 19.2.3
+
+ '@tanstack/react-table@8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ dependencies:
+ '@tanstack/table-core': 8.21.3
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
+ '@tanstack/table-core@8.21.3': {}
+
+ '@testing-library/cypress@10.1.0(cypress@15.8.1)':
+ dependencies:
+ '@babel/runtime': 7.28.4
+ '@testing-library/dom': 10.4.1
+ cypress: 15.8.1
+
+ '@testing-library/dom@10.4.1':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/runtime': 7.28.4
+ '@types/aria-query': 5.0.4
+ aria-query: 5.3.0
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ picocolors: 1.1.1
+ pretty-format: 27.5.1
+
+ '@tootallnate/once@2.0.0': {}
+
+ '@tootallnate/quickjs-emscripten@0.23.0': {}
+
+ '@tsconfig/node10@1.0.12': {}
+
+ '@tsconfig/node12@1.0.11': {}
+
+ '@tsconfig/node14@1.0.3': {}
+
+ '@tsconfig/node16@1.0.4': {}
+
+ '@types/aria-query@5.0.4': {}
+
+ '@types/body-parser@1.19.6':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 20.19.24
+
+ '@types/caseless@0.12.5':
+ optional: true
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 20.19.24
+
+ '@types/d3-array@3.2.2': {}
+
+ '@types/d3-color@3.1.3': {}
+
+ '@types/d3-ease@3.0.2': {}
+
+ '@types/d3-interpolate@3.0.4':
+ dependencies:
+ '@types/d3-color': 3.1.3
+
+ '@types/d3-path@3.1.1': {}
+
+ '@types/d3-scale@4.0.9':
+ dependencies:
+ '@types/d3-time': 3.0.4
+
+ '@types/d3-shape@3.1.7':
+ dependencies:
+ '@types/d3-path': 3.1.1
+
+ '@types/d3-time@3.0.4': {}
+
+ '@types/d3-timer@3.0.2': {}
+
+ '@types/express-serve-static-core@4.19.7':
+ dependencies:
+ '@types/node': 20.19.24
+ '@types/qs': 6.14.0
'@types/range-parser': 1.2.7
'@types/send': 1.2.1
@@ -5097,9 +5688,9 @@ snapshots:
'@types/qs': 6.14.0
'@types/serve-static': 1.15.10
- '@types/hoist-non-react-statics@3.3.7(@types/react@17.0.89)':
+ '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.8)':
dependencies:
- '@types/react': 17.0.89
+ '@types/react': 19.2.8
hoist-non-react-statics: 3.3.2
'@types/http-errors@2.0.5': {}
@@ -5113,18 +5704,13 @@ snapshots:
'@types/ms': 2.1.0
'@types/node': 20.19.24
- '@types/keyv@3.1.4':
- dependencies:
- '@types/node': 20.19.24
-
- '@types/long@4.0.2': {}
+ '@types/long@4.0.2':
+ optional: true
'@types/mime@1.3.5': {}
'@types/ms@2.1.0': {}
- '@types/node@14.18.63': {}
-
'@types/node@20.19.24':
dependencies:
undici-types: 6.21.0
@@ -5133,25 +5719,17 @@ snapshots:
dependencies:
undici-types: 6.21.0
- '@types/prop-types@15.7.15': {}
-
'@types/qs@6.14.0': {}
'@types/range-parser@1.2.7': {}
- '@types/react-vis@1.11.15':
+ '@types/react-dom@19.2.3(@types/react@19.2.8)':
dependencies:
- '@types/react': 17.0.89
+ '@types/react': 19.2.8
- '@types/react@17.0.89':
+ '@types/react@19.2.8':
dependencies:
- '@types/prop-types': 15.7.15
- '@types/scheduler': 0.16.8
- csstype: 3.1.3
-
- '@types/readdir-glob@1.1.5':
- dependencies:
- '@types/node': 20.19.24
+ csstype: 3.2.3
'@types/request@2.48.13':
dependencies:
@@ -5161,12 +5739,6 @@ snapshots:
form-data: 2.5.5
optional: true
- '@types/responselike@1.0.3':
- dependencies:
- '@types/node': 20.19.24
-
- '@types/scheduler@0.16.8': {}
-
'@types/send@0.17.6':
dependencies:
'@types/mime': 1.3.5
@@ -5186,13 +5758,7 @@ snapshots:
'@types/sizzle@2.3.10': {}
- '@types/styled-components@5.1.35':
- dependencies:
- '@types/hoist-non-react-statics': 3.3.7(@types/react@17.0.89)
- '@types/react': 17.0.89
- csstype: 3.1.3
-
- '@types/stylis@4.2.5': {}
+ '@types/tmp@0.2.6': {}
'@types/tough-cookie@4.0.5':
optional: true
@@ -5201,17 +5767,14 @@ snapshots:
'@types/underscore@1.13.0': {}
+ '@types/use-sync-external-store@0.0.6': {}
+
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 20.19.24
+ '@types/node': 22.19.3
optional: true
- JSONStream@1.3.5:
- dependencies:
- jsonparse: 1.3.1
- through: 2.3.8
-
- abbrev@3.0.1:
+ abbrev@4.0.0:
optional: true
abort-controller@3.0.0:
@@ -5223,6 +5786,11 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
+ accepts@2.0.0:
+ dependencies:
+ mime-types: 3.0.2
+ negotiator: 1.0.0
+
acorn-walk@8.3.4:
dependencies:
acorn: 8.15.0
@@ -5235,20 +5803,27 @@ snapshots:
transitivePeerDependencies:
- supports-color
- agent-base@7.1.4:
- optional: true
+ agent-base@7.1.4: {}
aggregate-error@3.1.0:
dependencies:
clean-stack: 2.2.0
indent-string: 4.0.0
- ajv@6.12.6:
+ ajv-formats@2.1.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv-formats@3.0.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
+ ajv@8.17.1:
dependencies:
fast-deep-equal: 3.1.3
- fast-json-stable-stringify: 2.1.0
- json-schema-traverse: 0.4.1
- uri-js: 4.4.1
+ fast-uri: 3.1.0
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
ansi-align@3.0.1:
dependencies:
@@ -5256,28 +5831,18 @@ snapshots:
ansi-colors@4.1.3: {}
- ansi-escapes@3.2.0: {}
-
ansi-escapes@4.3.2:
dependencies:
type-fest: 0.21.3
- ansi-regex@2.1.1: {}
-
- ansi-regex@3.0.1: {}
-
- ansi-regex@4.1.1: {}
+ ansi-escapes@7.2.0:
+ dependencies:
+ environment: 1.1.0
ansi-regex@5.0.1: {}
ansi-regex@6.2.2: {}
- ansi-styles@2.2.1: {}
-
- ansi-styles@3.2.1:
- dependencies:
- color-convert: 1.9.3
-
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
@@ -5286,7 +5851,7 @@ snapshots:
ansi-styles@6.2.3: {}
- ansicolors@0.3.2: {}
+ any-promise@1.3.0: {}
anymatch@3.1.3:
dependencies:
@@ -5295,41 +5860,30 @@ snapshots:
arch@2.2.0: {}
- archiver-utils@2.1.0:
- dependencies:
- glob: 7.2.3
- graceful-fs: 4.2.11
- lazystream: 1.0.1
- lodash.defaults: 4.2.0
- lodash.difference: 4.5.0
- lodash.flatten: 4.4.0
- lodash.isplainobject: 4.0.6
- lodash.union: 4.6.0
- normalize-path: 3.0.0
- readable-stream: 2.3.8
-
- archiver-utils@3.0.4:
+ archiver-utils@5.0.2:
dependencies:
- glob: 7.2.3
+ glob: 10.5.0
graceful-fs: 4.2.11
+ is-stream: 2.0.1
lazystream: 1.0.1
- lodash.defaults: 4.2.0
- lodash.difference: 4.5.0
- lodash.flatten: 4.4.0
- lodash.isplainobject: 4.0.6
- lodash.union: 4.6.0
+ lodash: 4.17.21
normalize-path: 3.0.0
- readable-stream: 3.6.2
+ readable-stream: 4.7.0
- archiver@5.3.2:
+ archiver@7.0.1:
dependencies:
- archiver-utils: 2.1.0
+ archiver-utils: 5.0.2
async: 3.2.6
- buffer-crc32: 0.2.13
- readable-stream: 3.6.2
+ buffer-crc32: 1.0.0
+ readable-stream: 4.7.0
readdir-glob: 1.1.3
- tar-stream: 2.2.0
- zip-stream: 4.1.1
+ tar-stream: 3.1.7
+ zip-stream: 6.0.1
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
+
+ arg@4.1.3: {}
argparse@1.0.10:
dependencies:
@@ -5337,27 +5891,14 @@ snapshots:
argparse@2.0.1: {}
- aria-query@5.1.3:
- dependencies:
- deep-equal: 2.2.3
-
- array-buffer-byte-length@1.0.2:
+ aria-query@5.3.0:
dependencies:
- call-bound: 1.0.4
- is-array-buffer: 3.0.5
+ dequal: 2.0.3
array-flatten@1.1.1: {}
- array-flatten@3.0.0: {}
-
arrify@2.0.1: {}
- as-array@1.0.0:
- dependencies:
- lodash.isarguments: 2.4.1
- lodash.isobject: 2.4.1
- lodash.values: 2.4.1
-
as-array@2.0.0: {}
asn1@0.2.6:
@@ -5372,43 +5913,42 @@ snapshots:
astral-regex@2.0.0: {}
+ async-lock@1.4.1: {}
+
async-retry@1.3.3:
dependencies:
retry: 0.13.1
optional: true
- async@1.5.2: {}
-
async@3.2.6: {}
asynckit@0.4.0: {}
at-least-node@1.0.0: {}
- available-typed-arrays@1.0.7:
+ autoprefixer@10.4.23(postcss@8.5.6):
dependencies:
- possible-typed-array-names: 1.1.0
+ browserslist: 4.28.1
+ caniuse-lite: 1.0.30001761
+ fraction.js: 5.3.4
+ picocolors: 1.1.1
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
aws-sign2@0.7.0: {}
aws4@1.13.2: {}
- babel-plugin-styled-components@1.13.3(styled-components@6.1.19(react-dom@17.0.2(react@17.0.2))(react@17.0.2)):
- dependencies:
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-module-imports': 7.27.1
- babel-plugin-syntax-jsx: 6.18.0
- lodash: 4.17.21
- styled-components: 6.1.19(react-dom@17.0.2(react@17.0.2))(react@17.0.2)
- transitivePeerDependencies:
- - supports-color
-
- babel-plugin-syntax-jsx@6.18.0: {}
+ b4a@1.7.3: {}
balanced-match@1.0.2: {}
+ bare-events@2.8.2: {}
+
base64-js@1.5.1: {}
+ baseline-browser-mapping@2.9.11: {}
+
basic-auth-connect@1.1.0:
dependencies:
tsscmp: 1.0.6
@@ -5417,62 +5957,56 @@ snapshots:
dependencies:
safe-buffer: 5.1.2
+ basic-ftp@5.1.0: {}
+
bcrypt-pbkdf@1.0.2:
dependencies:
tweetnacl: 0.14.5
- big-integer@1.6.52: {}
-
bignumber.js@9.3.1: {}
binary-extensions@2.3.0: {}
- binary@0.3.0:
- dependencies:
- buffers: 0.1.1
- chainsaw: 0.1.0
-
bl@4.1.0:
dependencies:
buffer: 5.7.1
inherits: 2.0.4
readable-stream: 3.6.2
- blakejs@1.2.1: {}
-
blob-util@2.0.2: {}
- bluebird@3.4.7: {}
-
bluebird@3.7.2: {}
- body-parser@1.20.3:
+ body-parser@1.20.4:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
debug: 2.6.9
depd: 2.0.0
destroy: 1.2.0
- http-errors: 2.0.0
+ http-errors: 2.0.1
iconv-lite: 0.4.24
on-finished: 2.4.1
- qs: 6.13.0
- raw-body: 2.5.2
+ qs: 6.14.0
+ raw-body: 2.5.3
type-is: 1.6.18
unpipe: 1.0.0
transitivePeerDependencies:
- supports-color
- boxen@4.2.0:
+ body-parser@2.2.1:
dependencies:
- ansi-align: 3.0.1
- camelcase: 5.3.1
- chalk: 3.0.0
- cli-boxes: 2.2.1
- string-width: 4.2.3
- term-size: 2.2.1
- type-fest: 0.8.1
- widest-line: 3.1.0
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 4.4.3
+ http-errors: 2.0.1
+ iconv-lite: 0.7.1
+ on-finished: 2.4.1
+ qs: 6.14.0
+ raw-body: 3.0.2
+ type-is: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
boxen@5.1.2:
dependencies:
@@ -5498,47 +6032,47 @@ snapshots:
dependencies:
fill-range: 7.1.1
+ browserslist@4.28.1:
+ dependencies:
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001761
+ electron-to-chromium: 1.5.267
+ node-releases: 2.0.27
+ update-browserslist-db: 1.2.3(browserslist@4.28.1)
+
buffer-crc32@0.2.13: {}
- buffer-equal-constant-time@1.0.1: {}
+ buffer-crc32@1.0.0: {}
- buffer-indexof-polyfill@1.0.2: {}
+ buffer-equal-constant-time@1.0.1: {}
buffer@5.7.1:
dependencies:
base64-js: 1.5.1
ieee754: 1.2.1
- buffers@0.1.1: {}
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
bytes@3.1.2: {}
- cacache@19.0.1:
+ cacache@20.0.3:
dependencies:
- '@npmcli/fs': 4.0.0
+ '@npmcli/fs': 5.0.0
fs-minipass: 3.0.3
- glob: 10.4.5
- lru-cache: 10.4.3
+ glob: 13.0.0
+ lru-cache: 11.2.4
minipass: 7.1.2
minipass-collect: 2.0.1
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
p-map: 7.0.4
- ssri: 12.0.0
- tar: 7.5.2
- unique-filename: 4.0.0
+ ssri: 13.0.0
+ unique-filename: 5.0.0
optional: true
- cacheable-request@6.1.0:
- dependencies:
- clone-response: 1.0.3
- get-stream: 5.2.0
- http-cache-semantics: 4.2.0
- keyv: 3.1.0
- lowercase-keys: 2.0.0
- normalize-url: 4.5.1
- responselike: 1.0.2
-
cachedir@2.4.0: {}
call-bind-apply-helpers@1.0.2:
@@ -5546,13 +6080,6 @@ snapshots:
es-errors: 1.3.0
function-bind: 1.1.2
- call-bind@1.0.8:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- get-intrinsic: 1.3.0
- set-function-length: 1.2.2
-
call-bound@1.0.4:
dependencies:
call-bind-apply-helpers: 1.0.2
@@ -5560,52 +6087,22 @@ snapshots:
call-me-maybe@1.0.2: {}
- camelcase@5.3.1: {}
-
camelcase@6.3.0: {}
- camelize@1.0.1: {}
-
- caniuse-lite@1.0.30001754: {}
-
- cardinal@2.1.1:
- dependencies:
- ansicolors: 0.3.2
- redeyed: 2.1.1
+ caniuse-lite@1.0.30001761: {}
caseless@0.12.0: {}
- chainsaw@0.1.0:
- dependencies:
- traverse: 0.3.9
-
- chalk@1.1.3:
- dependencies:
- ansi-styles: 2.2.1
- escape-string-regexp: 1.0.5
- has-ansi: 2.0.0
- strip-ansi: 3.0.1
- supports-color: 2.0.0
-
- chalk@2.4.2:
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
-
- chalk@3.0.0:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
- chardet@0.7.0: {}
+ chalk@5.6.2: {}
+
+ char-regex@1.0.2: {}
- check-more-types@2.24.0: {}
+ chardet@2.1.1: {}
chokidar@3.6.0:
dependencies:
@@ -5619,14 +6116,12 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
- chownr@1.1.4: {}
-
chownr@3.0.0:
optional: true
ci-info@2.0.0: {}
- ci-info@3.9.0: {}
+ ci-info@4.3.1: {}
cjson@0.3.3:
dependencies:
@@ -5636,34 +6131,32 @@ snapshots:
cli-boxes@2.2.1: {}
- cli-color@1.4.0:
- dependencies:
- ansi-regex: 2.1.1
- d: 1.0.2
- es5-ext: 0.10.64
- es6-iterator: 2.0.3
- memoizee: 0.4.17
- timers-ext: 0.1.8
-
- cli-cursor@2.1.0:
- dependencies:
- restore-cursor: 2.0.0
-
cli-cursor@3.1.0:
dependencies:
restore-cursor: 3.1.0
+ cli-highlight@2.1.11:
+ dependencies:
+ chalk: 4.1.2
+ highlight.js: 10.7.3
+ mz: 2.7.0
+ parse5: 5.1.1
+ parse5-htmlparser2-tree-adapter: 6.0.1
+ yargs: 16.2.0
+
cli-spinners@2.9.2: {}
- cli-table3@0.6.5:
+ cli-table3@0.6.1:
dependencies:
string-width: 4.2.3
optionalDependencies:
- '@colors/colors': 1.5.0
+ colors: 1.4.0
- cli-table@0.3.11:
+ cli-table3@0.6.5:
dependencies:
- colors: 1.0.3
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
cli-truncate@2.1.0:
dependencies:
@@ -5675,7 +6168,9 @@ snapshots:
slice-ansi: 5.0.0
string-width: 5.1.2
- cli-width@2.2.1: {}
+ cli-width@4.1.0: {}
+
+ client-only@0.0.1: {}
cliui@7.0.4:
dependencies:
@@ -5689,71 +6184,67 @@ snapshots:
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
- clone-response@1.0.3:
- dependencies:
- mimic-response: 1.0.1
-
clone@1.0.4: {}
- color-convert@1.9.3:
- dependencies:
- color-name: 1.1.3
+ clsx@2.1.1: {}
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- color-convert@3.1.2:
+ color-convert@3.1.3:
dependencies:
- color-name: 2.0.2
-
- color-name@1.1.3: {}
+ color-name: 2.1.0
color-name@1.1.4: {}
- color-name@2.0.2: {}
+ color-name@2.1.0: {}
- color-string@2.1.2:
+ color-string@2.1.4:
dependencies:
- color-name: 2.0.2
+ color-name: 2.1.0
- color@5.0.2:
+ color@5.0.3:
dependencies:
- color-convert: 3.1.2
- color-string: 2.1.2
+ color-convert: 3.1.3
+ color-string: 2.1.4
colorette@2.0.20: {}
- colors@1.0.3: {}
+ colors@1.4.0:
+ optional: true
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
- commander@4.1.1: {}
+ commander@10.0.1: {}
+
+ commander@11.1.0: {}
+
+ commander@2.20.3: {}
commander@5.1.0: {}
+ commander@6.2.1: {}
+
commander@7.2.0: {}
commander@9.5.0: {}
common-tags@1.8.2: {}
- compare-semver@1.1.0:
- dependencies:
- semver: 5.7.2
-
- compress-commons@4.1.2:
+ compress-commons@6.0.2:
dependencies:
- buffer-crc32: 0.2.13
- crc32-stream: 4.0.3
+ crc-32: 1.2.2
+ crc32-stream: 6.0.0
+ is-stream: 2.0.1
normalize-path: 3.0.0
- readable-stream: 3.6.2
+ readable-stream: 4.7.0
compressible@2.0.18:
dependencies:
- mime-db: 1.54.0
+ mime-db: 1.52.0
compression@1.8.1:
dependencies:
@@ -5769,6 +6260,11 @@ snapshots:
concat-map@0.0.1: {}
+ config-chain@1.1.13:
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+
configstore@5.0.1:
dependencies:
dot-prop: 5.3.0
@@ -5791,15 +6287,17 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
+ content-disposition@1.0.1: {}
+
content-type@1.0.5: {}
- cookie-signature@1.0.6: {}
+ cookie-signature@1.0.7: {}
- cookie@0.7.1: {}
+ cookie-signature@1.2.2: {}
- core-util-is@1.0.2: {}
+ cookie@0.7.2: {}
- core-util-is@1.0.3: {}
+ core-util-is@1.0.2: {}
cors@2.8.5:
dependencies:
@@ -5808,22 +6306,16 @@ snapshots:
crc-32@1.2.2: {}
- crc32-stream@4.0.3:
+ crc32-stream@6.0.0:
dependencies:
crc-32: 1.2.2
- readable-stream: 3.6.2
+ readable-stream: 4.7.0
- cross-env@5.2.1:
- dependencies:
- cross-spawn: 6.0.6
+ create-require@1.1.1: {}
- cross-spawn@6.0.6:
+ cross-env@7.0.3:
dependencies:
- nice-try: 1.0.5
- path-key: 2.0.1
- semver: 5.7.2
- shebang-command: 1.2.0
- which: 1.3.1
+ cross-spawn: 7.0.6
cross-spawn@7.0.6:
dependencies:
@@ -5833,37 +6325,29 @@ snapshots:
crypto-random-string@2.0.0: {}
- css-color-keywords@1.0.0: {}
-
- css-to-react-native@3.2.0:
- dependencies:
- camelize: 1.0.1
- css-color-keywords: 1.0.0
- postcss-value-parser: 4.2.0
-
csstype@3.1.3: {}
- csv-streamify@3.0.4:
- dependencies:
- through2: 2.0.1
+ csstype@3.2.3: {}
- cypress@10.11.0:
+ csv-parse@5.6.0: {}
+
+ cypress@15.8.1:
dependencies:
- '@cypress/request': 2.88.12
+ '@cypress/request': 3.0.9
'@cypress/xvfb': 1.2.4(supports-color@8.1.1)
- '@types/node': 14.18.63
'@types/sinonjs__fake-timers': 8.1.1
'@types/sizzle': 2.3.10
+ '@types/tmp': 0.2.6
arch: 2.2.0
blob-util: 2.0.2
bluebird: 3.7.2
buffer: 5.7.1
cachedir: 2.4.0
chalk: 4.1.2
- check-more-types: 2.24.0
+ ci-info: 4.3.1
cli-cursor: 3.1.0
- cli-table3: 0.6.5
- commander: 5.1.0
+ cli-table3: 0.6.1
+ commander: 6.2.1
common-tags: 1.8.2
dayjs: 1.11.19
debug: 4.4.3(supports-color@8.1.1)
@@ -5874,63 +6358,40 @@ snapshots:
extract-zip: 2.0.1(supports-color@8.1.1)
figures: 3.2.0
fs-extra: 9.1.0
- getos: 3.2.1
- is-ci: 3.0.1
+ hasha: 5.2.2
is-installed-globally: 0.4.0
- lazy-ass: 1.6.0
listr2: 3.14.0(enquirer@2.4.1)
lodash: 4.17.21
log-symbols: 4.1.0
minimist: 1.2.8
ospath: 1.2.2
pretty-bytes: 5.6.0
+ process: 0.11.10
proxy-from-env: 1.0.0
request-progress: 3.0.0
- semver: 7.7.3
supports-color: 8.1.1
+ systeminformation: 5.28.3
tmp: 0.2.5
+ tree-kill: 1.2.2
untildify: 4.0.0
yauzl: 2.10.0
- d3-array@2.12.1:
- dependencies:
- internmap: 1.0.1
-
d3-array@3.2.4:
dependencies:
internmap: 2.0.3
- d3-collection@1.0.7: {}
-
d3-color@3.1.0: {}
- d3-contour@4.0.2:
- dependencies:
- d3-array: 3.2.4
+ d3-ease@3.0.1: {}
d3-format@3.1.0: {}
- d3-geo@3.1.1:
- dependencies:
- d3-array: 3.2.4
-
- d3-hexbin@0.2.2: {}
-
- d3-hierarchy@3.1.2: {}
-
d3-interpolate@3.0.1:
dependencies:
d3-color: 3.1.0
- d3-path@1.0.9: {}
-
d3-path@3.1.0: {}
- d3-sankey@0.12.3:
- dependencies:
- d3-array: 2.12.1
- d3-shape: 1.3.7
-
d3-scale@4.0.2:
dependencies:
d3-array: 3.2.4
@@ -5939,10 +6400,6 @@ snapshots:
d3-time: 3.1.0
d3-time-format: 4.1.0
- d3-shape@1.3.7:
- dependencies:
- d3-path: 1.0.9
-
d3-shape@3.2.0:
dependencies:
d3-path: 3.1.0
@@ -5955,18 +6412,15 @@ snapshots:
dependencies:
d3-array: 3.2.4
- d3-voronoi@1.1.4: {}
-
- d@1.0.2:
- dependencies:
- es5-ext: 0.10.64
- type: 2.7.3
+ d3-timer@3.0.1: {}
dashdash@1.14.1:
dependencies:
assert-plus: 1.0.0
- data-uri-to-buffer@3.0.1: {}
+ data-uri-to-buffer@4.0.1: {}
+
+ data-uri-to-buffer@6.0.2: {}
date-fns@2.30.0:
dependencies:
@@ -6006,39 +6460,12 @@ snapshots:
optionalDependencies:
supports-color: 9.4.0
- decompress-response@3.3.0:
- dependencies:
- mimic-response: 1.0.1
-
- deep-equal@1.1.2:
- dependencies:
- is-arguments: 1.2.0
- is-date-object: 1.1.0
- is-regex: 1.2.1
- object-is: 1.1.6
- object-keys: 1.1.1
- regexp.prototype.flags: 1.5.4
+ decimal.js-light@2.5.1: {}
- deep-equal@2.2.3:
+ deep-equal-in-any-order@2.1.0:
dependencies:
- array-buffer-byte-length: 1.0.2
- call-bind: 1.0.8
- es-get-iterator: 1.1.3
- get-intrinsic: 1.3.0
- is-arguments: 1.2.0
- is-array-buffer: 3.0.5
- is-date-object: 1.1.0
- is-regex: 1.2.1
- is-shared-array-buffer: 1.0.4
- isarray: 2.0.5
- object-is: 1.1.6
- object-keys: 1.1.1
- object.assign: 4.1.7
- regexp.prototype.flags: 1.5.4
- side-channel: 1.1.0
- which-boxed-primitive: 1.1.1
- which-collection: 1.0.2
- which-typed-array: 1.1.19
+ lodash.mapvalues: 4.6.0
+ sort-any: 2.0.0
deep-extend@0.6.0: {}
@@ -6052,36 +6479,27 @@ snapshots:
dependencies:
clone: 1.0.4
- defer-to-connect@1.1.3: {}
-
- define-data-property@1.1.4:
- dependencies:
- es-define-property: 1.0.1
- es-errors: 1.3.0
- gopd: 1.2.0
-
- define-properties@1.2.1:
- dependencies:
- define-data-property: 1.1.4
- has-property-descriptors: 1.0.2
- object-keys: 1.1.1
-
- degenerator@3.0.4:
+ degenerator@5.0.1:
dependencies:
ast-types: 0.13.4
- escodegen: 1.14.3
+ escodegen: 2.1.0
esprima: 4.0.1
- vm2: 3.10.0
delayed-stream@1.0.0: {}
depd@2.0.0: {}
+ dequal@2.0.3: {}
+
destroy@1.2.0: {}
- dom-accessibility-api@0.5.16: {}
+ detect-libc@2.1.2: {}
+
+ diff@4.0.2: {}
+
+ discontinuous-range@1.0.0: {}
- dom-walk@0.1.2: {}
+ dom-accessibility-api@0.5.16: {}
dot-prop@5.3.0:
dependencies:
@@ -6089,20 +6507,12 @@ snapshots:
dotenv@17.2.3: {}
- dotenv@6.2.0: {}
-
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
es-errors: 1.3.0
gopd: 1.2.0
- duplexer2@0.1.4:
- dependencies:
- readable-stream: 2.3.8
-
- duplexer3@0.1.5: {}
-
duplexer@0.1.2: {}
duplexify@4.1.3:
@@ -6125,10 +6535,14 @@ snapshots:
ee-first@1.1.1: {}
+ electron-to-chromium@1.5.267: {}
+
emoji-regex@8.0.0: {}
emoji-regex@9.2.2: {}
+ emojilib@2.4.0: {}
+
enabled@2.0.0: {}
encodeurl@1.0.2: {}
@@ -6144,6 +6558,11 @@ snapshots:
dependencies:
once: 1.4.0
+ enhanced-resolve@5.18.4:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.0
+
enquirer@2.4.1:
dependencies:
ansi-colors: 4.1.3
@@ -6152,6 +6571,8 @@ snapshots:
env-paths@2.2.1:
optional: true
+ environment@1.1.0: {}
+
err-code@2.0.3:
optional: true
@@ -6159,18 +6580,6 @@ snapshots:
es-errors@1.3.0: {}
- es-get-iterator@1.1.3:
- dependencies:
- call-bind: 1.0.8
- get-intrinsic: 1.3.0
- has-symbols: 1.1.0
- is-arguments: 1.2.0
- is-map: 2.0.3
- is-set: 2.0.3
- is-string: 1.1.1
- isarray: 2.0.5
- stop-iteration-iterator: 1.1.0
-
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
@@ -6181,32 +6590,8 @@ snapshots:
get-intrinsic: 1.3.0
has-tostringtag: 1.0.2
hasown: 2.0.2
- optional: true
- es5-ext@0.10.64:
- dependencies:
- es6-iterator: 2.0.3
- es6-symbol: 3.1.4
- esniff: 2.0.1
- next-tick: 1.1.0
-
- es6-iterator@2.0.3:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- es6-symbol: 3.1.4
-
- es6-symbol@3.1.4:
- dependencies:
- d: 1.0.2
- ext: 1.7.0
-
- es6-weak-map@2.0.3:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- es6-iterator: 2.0.3
- es6-symbol: 3.1.4
+ es-toolkit@1.43.0: {}
escalade@3.2.0: {}
@@ -6218,41 +6603,44 @@ snapshots:
escape-string-regexp@4.0.0: {}
- escodegen@1.14.3:
+ escodegen@2.1.0:
dependencies:
esprima: 4.0.1
- estraverse: 4.3.0
+ estraverse: 5.3.0
esutils: 2.0.3
- optionator: 0.8.3
optionalDependencies:
source-map: 0.6.1
- esniff@2.0.1:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- event-emitter: 0.3.5
- type: 2.7.3
-
esprima@4.0.1: {}
- estraverse@4.3.0: {}
+ estraverse@5.3.0: {}
esutils@2.0.3: {}
etag@1.8.1: {}
- event-emitter@0.3.5:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
-
event-target-shim@5.0.1: {}
eventemitter2@6.4.7: {}
+ eventemitter3@5.0.1: {}
+
events-listener@1.1.0: {}
+ events-universal@1.0.1:
+ dependencies:
+ bare-events: 2.8.2
+ transitivePeerDependencies:
+ - bare-abort-controller
+
+ events@3.3.0: {}
+
+ eventsource-parser@3.0.6: {}
+
+ eventsource@3.0.7:
+ dependencies:
+ eventsource-parser: 3.0.6
+
execa@4.1.0:
dependencies:
cross-spawn: 7.0.6
@@ -6281,86 +6669,111 @@ snapshots:
dependencies:
pify: 2.3.0
- exegesis-express@2.0.1:
+ exegesis-express@4.0.0:
dependencies:
- exegesis: 2.5.7
+ exegesis: 4.3.0
transitivePeerDependencies:
- supports-color
- exegesis@2.5.7:
+ exegesis@4.3.0:
dependencies:
'@apidevtools/json-schema-ref-parser': 9.1.2
- ajv: 6.12.6
- body-parser: 1.20.3
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ body-parser: 1.20.4
content-type: 1.0.5
deep-freeze: 0.0.1
events-listener: 1.1.0
- glob: 7.2.3
- json-ptr: 2.2.0
+ glob: 10.5.0
+ json-ptr: 3.1.1
json-schema-traverse: 1.0.0
lodash: 4.17.21
- openapi3-ts: 2.0.2
- promise-breaker: 5.0.0
- pump: 3.0.3
+ openapi3-ts: 3.2.0
+ promise-breaker: 6.0.0
qs: 6.14.0
- raw-body: 2.5.2
+ raw-body: 2.5.3
semver: 7.7.3
transitivePeerDependencies:
- supports-color
- exit-code@1.0.2: {}
-
exponential-backoff@3.1.3:
optional: true
- express@4.21.2:
+ express-rate-limit@7.5.1(express@5.2.1):
+ dependencies:
+ express: 5.2.1
+
+ express@4.22.1:
dependencies:
accepts: 1.3.8
array-flatten: 1.1.1
- body-parser: 1.20.3
+ body-parser: 1.20.4
content-disposition: 0.5.4
content-type: 1.0.5
- cookie: 0.7.1
- cookie-signature: 1.0.6
+ cookie: 0.7.2
+ cookie-signature: 1.0.7
debug: 2.6.9
depd: 2.0.0
encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
- finalhandler: 1.3.1
+ finalhandler: 1.3.2
fresh: 0.5.2
- http-errors: 2.0.0
+ http-errors: 2.0.1
merge-descriptors: 1.0.3
methods: 1.1.2
on-finished: 2.4.1
parseurl: 1.3.3
path-to-regexp: 0.1.12
proxy-addr: 2.0.7
- qs: 6.13.0
+ qs: 6.14.0
range-parser: 1.2.1
safe-buffer: 5.2.1
- send: 0.19.0
- serve-static: 1.16.2
+ send: 0.19.2
+ serve-static: 1.16.3
setprototypeof: 1.2.0
- statuses: 2.0.1
+ statuses: 2.0.2
type-is: 1.6.18
utils-merge: 1.0.1
vary: 1.1.2
transitivePeerDependencies:
- supports-color
- ext@1.7.0:
+ express@5.2.1:
dependencies:
- type: 2.7.3
+ accepts: 2.0.0
+ body-parser: 2.2.1
+ content-disposition: 1.0.1
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.2.2
+ debug: 4.4.3
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 2.1.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ merge-descriptors: 2.0.0
+ mime-types: 3.0.2
+ on-finished: 2.4.1
+ once: 1.4.0
+ parseurl: 1.3.3
+ proxy-addr: 2.0.7
+ qs: 6.14.0
+ range-parser: 1.2.1
+ router: 2.2.0
+ send: 1.2.1
+ serve-static: 2.2.1
+ statuses: 2.0.2
+ type-is: 2.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
extend@3.0.2: {}
- external-editor@3.1.0:
- dependencies:
- chardet: 0.7.0
- iconv-lite: 0.4.24
- tmp: 0.0.33
-
extract-zip@2.0.1(supports-color@8.1.1):
dependencies:
debug: 4.4.3(supports-color@8.1.1)
@@ -6377,15 +6790,9 @@ snapshots:
fast-deep-equal@3.1.3: {}
- fast-json-stable-stringify@2.1.0: {}
-
- fast-levenshtein@2.0.6: {}
+ fast-fifo@1.3.2: {}
- fast-text-encoding@1.0.6: {}
-
- fast-url-parser@1.1.3:
- dependencies:
- punycode: 1.4.1
+ fast-uri@3.1.0: {}
fast-xml-parser@4.5.3:
dependencies:
@@ -6407,16 +6814,15 @@ snapshots:
fecha@4.2.3: {}
- figures@2.0.0:
+ fetch-blob@3.2.0:
dependencies:
- escape-string-regexp: 1.0.5
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
figures@3.2.0:
dependencies:
escape-string-regexp: 1.0.5
- file-uri-to-path@2.0.0: {}
-
filesize@6.4.0: {}
fill-range@7.1.1:
@@ -6435,18 +6841,29 @@ snapshots:
transitivePeerDependencies:
- supports-color
- finalhandler@1.3.1:
+ finalhandler@1.3.2:
dependencies:
debug: 2.6.9
encodeurl: 2.0.0
escape-html: 1.0.3
on-finished: 2.4.1
parseurl: 1.3.3
- statuses: 2.0.1
+ statuses: 2.0.2
unpipe: 1.0.0
transitivePeerDependencies:
- supports-color
+ finalhandler@2.1.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
firebase-admin@12.7.0(encoding@0.1.13):
dependencies:
'@fastify/busboy': 3.2.0
@@ -6465,70 +6882,96 @@ snapshots:
- encoding
- supports-color
- firebase-tools@9.23.3(encoding@0.1.13):
+ firebase-tools@15.1.0(@types/node@22.19.3)(encoding@0.1.13)(hono@4.11.3)(typescript@5.9.3):
dependencies:
- '@google-cloud/pubsub': 2.19.4(encoding@0.1.13)
- '@types/archiver': 5.3.4
- JSONStream: 1.3.5
+ '@apphosting/build': 0.1.7(@types/node@22.19.3)(typescript@5.9.3)
+ '@apphosting/common': 0.0.8
+ '@electric-sql/pglite': 0.3.14
+ '@electric-sql/pglite-tools': 0.2.19(@electric-sql/pglite@0.3.14)
+ '@google-cloud/cloud-sql-connector': 1.8.5
+ '@google-cloud/pubsub': 5.2.0
+ '@inquirer/prompts': 7.10.1(@types/node@22.19.3)
+ '@modelcontextprotocol/sdk': 1.25.1(hono@4.11.3)(zod@3.25.76)
abort-controller: 3.0.0
- ajv: 6.12.6
- archiver: 5.3.2
- body-parser: 1.20.3
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ archiver: 7.0.1
+ async-lock: 1.4.1
+ body-parser: 1.20.4
chokidar: 3.6.0
cjson: 0.3.3
- cli-color: 1.4.0
- cli-table: 0.3.11
- commander: 4.1.1
+ cli-table3: 0.6.5
+ colorette: 2.0.20
+ commander: 5.1.0
configstore: 5.0.1
cors: 2.8.5
- cross-env: 5.2.1
+ cross-env: 7.0.3
cross-spawn: 7.0.6
- csv-streamify: 3.0.4
- dotenv: 6.2.0
- exegesis: 2.5.7
- exegesis-express: 2.0.1
- exit-code: 1.0.2
- express: 4.21.2
+ csv-parse: 5.6.0
+ deep-equal-in-any-order: 2.1.0
+ exegesis: 4.3.0
+ exegesis-express: 4.0.0
+ express: 4.22.1
filesize: 6.4.0
- fs-extra: 5.0.0
- glob: 7.2.3
- google-auth-library: 6.1.6(encoding@0.1.13)
- inquirer: 6.3.1
- js-yaml: 3.14.1
- jsonwebtoken: 8.5.1
+ form-data: 4.0.5
+ fs-extra: 10.1.0
+ fuzzy: 0.1.3
+ gaxios: 6.7.1(encoding@0.1.13)
+ glob: 10.5.0
+ google-auth-library: 9.15.1(encoding@0.1.13)
+ ignore: 7.0.5
+ js-yaml: 3.14.2
+ jsonwebtoken: 9.0.3
leven: 3.1.0
+ libsodium-wrappers: 0.7.15
lodash: 4.17.21
- marked: 0.7.0
- marked-terminal: 3.3.0(marked@0.7.0)
+ lsofi: 1.0.0
+ marked: 13.0.3
+ marked-terminal: 7.3.0(marked@13.0.3)
mime: 2.6.0
minimatch: 3.1.2
morgan: 1.10.1
node-fetch: 2.7.0(encoding@0.1.13)
open: 6.4.0
- ora: 3.4.0
+ ora: 5.4.1
+ p-limit: 3.1.0
+ pg: 8.16.3
+ pg-gateway: 0.3.0-beta.4
+ pglite-2: '@electric-sql/pglite@0.2.17'
portfinder: 1.0.38
progress: 2.0.3
- proxy-agent: 5.0.0
- request: 2.88.2
- rimraf: 3.0.2
- semver: 5.7.2
- superstatic: 7.1.0
- tar: 4.4.19
+ proxy-agent: 6.5.0
+ retry: 0.13.1
+ semver: 7.7.3
+ sql-formatter: 15.6.12
+ stream-chain: 2.2.5
+ stream-json: 1.9.1
+ superstatic: 10.0.0(encoding@0.1.13)
tcp-port-used: 1.0.2
- tmp: 0.0.33
+ tmp: 0.2.5
triple-beam: 1.4.1
- tweetsodium: 0.0.5
- universal-analytics: 0.4.23
- unzipper: 0.10.14
- update-notifier: 5.1.0
+ universal-analytics: 0.5.3
+ update-notifier-cjs: 5.1.7(encoding@0.1.13)
uuid: 8.3.2
- winston: 3.18.3
+ winston: 3.19.0
winston-transport: 4.9.0
ws: 7.5.10
+ yaml: 2.8.2
+ zod: 3.25.76
+ zod-to-json-schema: 3.25.1(zod@3.25.76)
transitivePeerDependencies:
+ - '@cfworker/json-schema'
+ - '@swc/core'
+ - '@swc/wasm'
+ - '@types/node'
+ - bare-abort-controller
- bufferutil
- encoding
+ - hono
+ - pg-native
+ - react-native-b4a
- supports-color
+ - typescript
- utf-8-validate
firebase@12.7.0:
@@ -6564,51 +7007,45 @@ snapshots:
transitivePeerDependencies:
- '@react-native-async-storage/async-storage'
- flat-arguments@1.0.2:
- dependencies:
- array-flatten: 1.1.1
- as-array: 1.0.0
- lodash.isarguments: 3.1.0
- lodash.isobject: 3.0.2
-
fn.name@1.1.0: {}
- for-each@0.3.5:
- dependencies:
- is-callable: 1.2.7
-
foreground-child@3.3.1:
dependencies:
cross-spawn: 7.0.6
signal-exit: 4.1.0
- optional: true
forever-agent@0.6.1: {}
- form-data@2.3.3:
+ form-data@2.5.5:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
mime-types: 2.1.35
+ safe-buffer: 5.2.1
+ optional: true
- form-data@2.5.5:
+ form-data@4.0.5:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
es-set-tostringtag: 2.1.0
hasown: 2.0.2
mime-types: 2.1.35
- safe-buffer: 5.2.1
- optional: true
- formik@2.4.9(@types/react@17.0.89)(react@17.0.2):
+ formdata-polyfill@4.0.10:
dependencies:
- '@types/hoist-non-react-statics': 3.3.7(@types/react@17.0.89)
+ fetch-blob: 3.2.0
+
+ formik@2.4.9(@types/react@19.2.8)(react@19.2.3):
+ dependencies:
+ '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.8)
deepmerge: 2.2.1
hoist-non-react-statics: 3.3.2
lodash: 4.17.21
lodash-es: 4.17.21
- react: 17.0.2
+ react: 19.2.3
react-fast-compare: 2.0.4
tiny-warning: 1.0.3
tslib: 2.8.1
@@ -6617,21 +7054,17 @@ snapshots:
forwarded@0.2.0: {}
- fresh@0.5.2: {}
+ fraction.js@5.3.4: {}
- fs-constants@1.0.0: {}
+ fresh@0.5.2: {}
- fs-extra@5.0.0:
- dependencies:
- graceful-fs: 4.2.11
- jsonfile: 4.0.0
- universalify: 0.1.2
+ fresh@2.0.0: {}
- fs-extra@8.1.0:
+ fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
- jsonfile: 4.0.0
- universalify: 0.1.2
+ jsonfile: 6.2.0
+ universalify: 2.0.1
fs-extra@9.1.0:
dependencies:
@@ -6640,79 +7073,57 @@ snapshots:
jsonfile: 6.2.0
universalify: 2.0.1
- fs-minipass@1.2.7:
- dependencies:
- minipass: 2.9.0
-
fs-minipass@3.0.3:
dependencies:
minipass: 7.1.2
optional: true
- fs.realpath@1.0.0: {}
-
fsevents@2.3.3:
optional: true
- fstream@1.0.12:
- dependencies:
- graceful-fs: 4.2.11
- inherits: 2.0.4
- mkdirp: 0.5.6
- rimraf: 2.7.1
-
- ftp@0.3.10:
- dependencies:
- readable-stream: 1.1.14
- xregexp: 2.0.0
-
function-bind@1.1.2: {}
functional-red-black-tree@1.0.1:
optional: true
- functions-have-names@1.2.3: {}
+ fuzzy@0.1.3: {}
- gaxios@4.3.3(encoding@0.1.13):
+ gaxios@6.7.1(encoding@0.1.13):
dependencies:
- abort-controller: 3.0.0
extend: 3.0.2
- https-proxy-agent: 5.0.1
+ https-proxy-agent: 7.0.6
is-stream: 2.0.1
node-fetch: 2.7.0(encoding@0.1.13)
+ uuid: 9.0.1
transitivePeerDependencies:
- encoding
- supports-color
- gaxios@6.7.1(encoding@0.1.13):
+ gaxios@7.1.3:
dependencies:
extend: 3.0.2
https-proxy-agent: 7.0.6
- is-stream: 2.0.1
- node-fetch: 2.7.0(encoding@0.1.13)
- uuid: 9.0.1
+ node-fetch: 3.3.2
+ rimraf: 5.0.10
transitivePeerDependencies:
- - encoding
- supports-color
- optional: true
- gcp-metadata@4.3.1(encoding@0.1.13):
+ gcp-metadata@6.1.1(encoding@0.1.13):
dependencies:
- gaxios: 4.3.3(encoding@0.1.13)
+ gaxios: 6.7.1(encoding@0.1.13)
+ google-logging-utils: 0.0.2
json-bigint: 1.0.0
transitivePeerDependencies:
- encoding
- supports-color
- gcp-metadata@6.1.1(encoding@0.1.13):
+ gcp-metadata@8.1.2:
dependencies:
- gaxios: 6.7.1(encoding@0.1.13)
- google-logging-utils: 0.0.2
+ gaxios: 7.1.3
+ google-logging-utils: 1.1.3
json-bigint: 1.0.0
transitivePeerDependencies:
- - encoding
- supports-color
- optional: true
get-caller-file@2.0.5: {}
@@ -6734,31 +7145,20 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
- get-stream@4.1.0:
- dependencies:
- pump: 3.0.3
-
get-stream@5.2.0:
dependencies:
pump: 3.0.3
get-stream@6.0.1: {}
- get-uri@3.0.2:
+ get-uri@6.0.5:
dependencies:
- '@tootallnate/once': 1.1.2
- data-uri-to-buffer: 3.0.1
+ basic-ftp: 5.1.0
+ data-uri-to-buffer: 6.0.2
debug: 4.4.3
- file-uri-to-path: 2.0.0
- fs-extra: 8.1.0
- ftp: 0.3.10
transitivePeerDependencies:
- supports-color
- getos@3.2.1:
- dependencies:
- async: 3.2.6
-
getpass@0.1.7:
dependencies:
assert-plus: 1.0.0
@@ -6775,7 +7175,7 @@ snapshots:
lodash.isobject: 2.4.1
toxic: 1.0.1
- glob@10.4.5:
+ glob@10.5.0:
dependencies:
foreground-child: 3.3.1
jackspeak: 3.4.3
@@ -6783,58 +7183,32 @@ snapshots:
minipass: 7.1.2
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
- optional: true
-
- glob@7.2.3:
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
- global-dirs@2.1.0:
+ glob@13.0.0:
dependencies:
- ini: 1.3.7
+ minimatch: 10.1.1
+ minipass: 7.1.2
+ path-scurry: 2.0.1
+ optional: true
global-dirs@3.0.1:
dependencies:
ini: 2.0.0
- global@4.4.0:
- dependencies:
- min-document: 2.19.2
- process: 0.11.10
-
- google-auth-library@6.1.6(encoding@0.1.13):
+ goober@2.1.18(csstype@3.1.3):
dependencies:
- arrify: 2.0.1
- base64-js: 1.5.1
- ecdsa-sig-formatter: 1.0.11
- fast-text-encoding: 1.0.6
- gaxios: 4.3.3(encoding@0.1.13)
- gcp-metadata: 4.3.1(encoding@0.1.13)
- gtoken: 5.3.2(encoding@0.1.13)
- jws: 4.0.0
- lru-cache: 6.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
+ csstype: 3.1.3
- google-auth-library@7.14.1(encoding@0.1.13):
+ google-auth-library@10.5.0:
dependencies:
- arrify: 2.0.1
base64-js: 1.5.1
ecdsa-sig-formatter: 1.0.11
- fast-text-encoding: 1.0.6
- gaxios: 4.3.3(encoding@0.1.13)
- gcp-metadata: 4.3.1(encoding@0.1.13)
- gtoken: 5.3.2(encoding@0.1.13)
- jws: 4.0.0
- lru-cache: 6.0.0
+ gaxios: 7.1.3
+ gcp-metadata: 8.1.2
+ google-logging-utils: 1.1.3
+ gtoken: 8.0.0
+ jws: 4.0.1
transitivePeerDependencies:
- - encoding
- supports-color
google-auth-library@9.15.1(encoding@0.1.13):
@@ -6844,27 +7218,7 @@ snapshots:
gaxios: 6.7.1(encoding@0.1.13)
gcp-metadata: 6.1.1(encoding@0.1.13)
gtoken: 7.1.0(encoding@0.1.13)
- jws: 4.0.0
- transitivePeerDependencies:
- - encoding
- - supports-color
- optional: true
-
- google-gax@2.30.3(encoding@0.1.13):
- dependencies:
- '@grpc/grpc-js': 1.6.12
- '@grpc/proto-loader': 0.6.9
- '@types/long': 4.0.2
- abort-controller: 3.0.0
- duplexify: 4.1.3
- fast-text-encoding: 1.0.6
- google-auth-library: 7.14.1(encoding@0.1.13)
- is-stream-ended: 0.1.4
- node-fetch: 2.7.0(encoding@0.1.13)
- object-hash: 3.0.0
- proto3-json-serializer: 0.1.9
- protobufjs: 6.11.2
- retry-request: 4.2.2
+ jws: 4.0.1
transitivePeerDependencies:
- encoding
- supports-color
@@ -6888,78 +7242,63 @@ snapshots:
- supports-color
optional: true
- google-logging-utils@0.0.2:
- optional: true
+ google-gax@5.0.6:
+ dependencies:
+ '@grpc/grpc-js': 1.14.1
+ '@grpc/proto-loader': 0.8.0
+ duplexify: 4.1.3
+ google-auth-library: 10.5.0
+ google-logging-utils: 1.1.3
+ node-fetch: 3.3.2
+ object-hash: 3.0.0
+ proto3-json-serializer: 3.0.4
+ protobufjs: 7.5.4
+ retry-request: 8.0.2
+ rimraf: 5.0.10
+ transitivePeerDependencies:
+ - supports-color
- google-p12-pem@3.1.4:
+ google-logging-utils@0.0.2: {}
+
+ google-logging-utils@1.1.3: {}
+
+ googleapis-common@8.0.2-rc.0:
dependencies:
- node-forge: 1.3.1
+ extend: 3.0.2
+ gaxios: 7.1.3
+ google-auth-library: 10.5.0
+ qs: 6.14.0
+ url-template: 2.0.8
+ transitivePeerDependencies:
+ - supports-color
gopd@1.2.0: {}
- got@9.6.0:
- dependencies:
- '@sindresorhus/is': 0.14.0
- '@szmarczak/http-timer': 1.1.2
- '@types/keyv': 3.1.4
- '@types/responselike': 1.0.3
- cacheable-request: 6.1.0
- decompress-response: 3.3.0
- duplexer3: 0.1.5
- get-stream: 4.1.0
- lowercase-keys: 1.0.1
- mimic-response: 1.0.1
- p-cancelable: 1.1.0
- to-readable-stream: 1.0.0
- url-parse-lax: 3.0.0
+ graceful-fs@4.2.10: {}
graceful-fs@4.2.11: {}
- gtoken@5.3.2(encoding@0.1.13):
+ gtoken@7.1.0(encoding@0.1.13):
dependencies:
- gaxios: 4.3.3(encoding@0.1.13)
- google-p12-pem: 3.1.4
- jws: 4.0.0
+ gaxios: 6.7.1(encoding@0.1.13)
+ jws: 4.0.1
transitivePeerDependencies:
- encoding
- supports-color
- gtoken@7.1.0(encoding@0.1.13):
+ gtoken@8.0.0:
dependencies:
- gaxios: 6.7.1(encoding@0.1.13)
- jws: 4.0.0
+ gaxios: 7.1.3
+ jws: 4.0.1
transitivePeerDependencies:
- - encoding
- supports-color
- optional: true
gzip-size@6.0.0:
dependencies:
duplexer: 0.1.2
- har-schema@2.0.0: {}
-
- har-validator@5.1.5:
- dependencies:
- ajv: 6.12.6
- har-schema: 2.0.0
-
- has-ansi@2.0.0:
- dependencies:
- ansi-regex: 2.1.1
-
- has-bigints@1.1.0: {}
-
- has-flag@2.0.0: {}
-
- has-flag@3.0.0: {}
-
has-flag@4.0.0: {}
- has-property-descriptors@1.0.2:
- dependencies:
- es-define-property: 1.0.1
-
has-symbols@1.1.0: {}
has-tostringtag@1.0.2:
@@ -6968,41 +7307,47 @@ snapshots:
has-yarn@2.1.0: {}
+ hasha@5.2.2:
+ dependencies:
+ is-stream: 2.0.1
+ type-fest: 0.8.1
+
hasown@2.0.2:
dependencies:
function-bind: 1.1.2
+ heap-js@2.7.1: {}
+
+ highlight.js@10.7.3: {}
+
hoist-non-react-statics@3.3.2:
dependencies:
react-is: 16.13.1
- home-dir@1.0.0: {}
+ hono@4.11.3: {}
+
+ hosted-git-info@7.0.2:
+ dependencies:
+ lru-cache: 10.4.3
html-entities@2.6.0:
optional: true
html-escaper@2.0.2: {}
- http-cache-semantics@4.2.0: {}
+ http-cache-semantics@4.2.0:
+ optional: true
- http-errors@2.0.0:
+ http-errors@2.0.1:
dependencies:
depd: 2.0.0
inherits: 2.0.4
setprototypeof: 1.2.0
- statuses: 2.0.1
+ statuses: 2.0.2
toidentifier: 1.0.1
http-parser-js@0.5.10: {}
- http-proxy-agent@4.0.1:
- dependencies:
- '@tootallnate/once': 1.1.2
- agent-base: 6.0.2
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
-
http-proxy-agent@5.0.0:
dependencies:
'@tootallnate/once': 2.0.0
@@ -7010,7 +7355,6 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- optional: true
http-proxy-agent@7.0.2:
dependencies:
@@ -7018,15 +7362,8 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- optional: true
-
- http-signature@1.2.0:
- dependencies:
- assert-plus: 1.0.0
- jsprim: 1.4.2
- sshpk: 1.18.0
- http-signature@1.3.6:
+ http-signature@1.4.0:
dependencies:
assert-plus: 1.0.0
jsprim: 2.0.2
@@ -7045,7 +7382,6 @@ snapshots:
debug: 4.4.3
transitivePeerDependencies:
- supports-color
- optional: true
human-signals@1.1.1: {}
@@ -7062,109 +7398,57 @@ snapshots:
safer-buffer: 2.1.2
optional: true
+ iconv-lite@0.7.1:
+ dependencies:
+ safer-buffer: 2.1.2
+
idb@7.1.1: {}
ieee754@1.2.1: {}
+ ignore@7.0.5: {}
+
+ immer@10.2.0: {}
+
+ immer@11.1.0: {}
+
import-lazy@2.1.0: {}
imurmurhash@0.1.4: {}
indent-string@4.0.0: {}
- inflight@1.0.6:
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
+ infer-owner@1.0.4: {}
inherits@2.0.4: {}
- ini@1.3.7: {}
-
ini@1.3.8: {}
ini@2.0.0: {}
- inquirer@6.3.1:
- dependencies:
- ansi-escapes: 3.2.0
- chalk: 2.4.2
- cli-cursor: 2.1.0
- cli-width: 2.2.1
- external-editor: 3.1.0
- figures: 2.0.0
- lodash: 4.17.21
- mute-stream: 0.0.7
- run-async: 2.4.1
- rxjs: 6.6.7
- string-width: 2.1.1
- strip-ansi: 5.2.0
- through: 2.3.8
-
install-artifact-from-github@1.4.0:
optional: true
- internal-slot@1.1.0:
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.2
- side-channel: 1.1.0
-
- internmap@1.0.1: {}
-
internmap@2.0.3: {}
ip-address@10.1.0: {}
ip-regex@4.3.0: {}
- ip@1.1.9: {}
-
ipaddr.js@1.9.1: {}
- is-arguments@1.2.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-array-buffer@3.0.5:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
- is-bigint@1.1.0:
- dependencies:
- has-bigints: 1.1.0
-
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
- is-boolean-object@1.2.2:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-callable@1.2.7: {}
+ is-buffer@1.1.6: {}
is-ci@2.0.0:
dependencies:
ci-info: 2.0.0
- is-ci@3.0.1:
- dependencies:
- ci-info: 3.9.0
-
- is-date-object@1.1.0:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
is-extglob@2.1.1: {}
- is-fullwidth-code-point@2.0.0: {}
-
is-fullwidth-code-point@3.0.0: {}
is-fullwidth-code-point@4.0.0: {}
@@ -7173,26 +7457,18 @@ snapshots:
dependencies:
is-extglob: 2.1.1
- is-installed-globally@0.3.2:
- dependencies:
- global-dirs: 2.1.0
- is-path-inside: 3.0.3
-
is-installed-globally@0.4.0:
dependencies:
global-dirs: 3.0.1
is-path-inside: 3.0.3
- is-map@2.0.3: {}
-
- is-npm@4.0.0: {}
+ is-interactive@1.0.0: {}
is-npm@5.0.0: {}
- is-number-object@1.1.1:
+ is-number@2.1.0:
dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
+ kind-of: 3.2.2
is-number@7.0.0: {}
@@ -7202,49 +7478,18 @@ snapshots:
is-plain-object@5.0.0: {}
- is-promise@2.2.2: {}
-
- is-regex@1.2.1:
- dependencies:
- call-bound: 1.0.4
- gopd: 1.2.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
-
- is-set@2.0.3: {}
-
- is-shared-array-buffer@1.0.4:
- dependencies:
- call-bound: 1.0.4
+ is-promise@4.0.0: {}
is-stream-ended@0.1.4: {}
is-stream@2.0.1: {}
- is-string@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-tostringtag: 1.0.2
-
- is-symbol@1.1.1:
- dependencies:
- call-bound: 1.0.4
- has-symbols: 1.1.0
- safe-regex-test: 1.1.0
-
is-typedarray@1.0.0: {}
is-unicode-supported@0.1.0: {}
is-url@1.2.4: {}
- is-weakmap@2.0.2: {}
-
- is-weakset@2.0.4:
- dependencies:
- call-bound: 1.0.4
- get-intrinsic: 1.3.0
-
is-wsl@1.1.0: {}
is-yarn-global@0.3.0: {}
@@ -7259,17 +7504,15 @@ snapshots:
isarray@1.0.0: {}
- isarray@2.0.5: {}
-
isexe@2.0.0: {}
isexe@3.1.1:
optional: true
- isomorphic-unfetch@3.1.0(encoding@0.1.13):
+ isomorphic-fetch@3.0.0(encoding@0.1.13):
dependencies:
node-fetch: 2.7.0(encoding@0.1.13)
- unfetch: 4.2.0
+ whatwg-fetch: 3.6.20
transitivePeerDependencies:
- encoding
@@ -7280,7 +7523,8 @@ snapshots:
'@isaacs/cliui': 8.0.2
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
- optional: true
+
+ jiti@2.6.1: {}
jju@1.4.0: {}
@@ -7292,69 +7536,46 @@ snapshots:
jose@4.15.9: {}
+ jose@6.1.3: {}
+
js-cookie@2.2.1: {}
js-tokens@4.0.0: {}
- js-yaml@3.14.1:
+ js-yaml@3.14.2:
dependencies:
argparse: 1.0.10
esprima: 4.0.1
- js-yaml@4.1.0:
+ js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
jsbn@0.1.1: {}
- jsesc@3.1.0: {}
-
json-bigint@1.0.0:
dependencies:
bignumber.js: 9.3.1
- json-buffer@3.0.0: {}
-
json-parse-helpfulerror@1.0.3:
dependencies:
jju: 1.4.0
- json-ptr@2.2.0:
- dependencies:
- tslib: 2.8.1
-
- json-schema-traverse@0.4.1: {}
+ json-ptr@3.1.1: {}
json-schema-traverse@1.0.0: {}
- json-schema@0.4.0: {}
-
- json-stringify-safe@5.0.1: {}
-
- jsonfile@4.0.0:
- optionalDependencies:
- graceful-fs: 4.2.11
-
- jsonfile@6.2.0:
- dependencies:
- universalify: 2.0.1
- optionalDependencies:
- graceful-fs: 4.2.11
+ json-schema-typed@8.0.2: {}
- jsonparse@1.3.1: {}
+ json-schema@0.4.0: {}
- jsonwebtoken@8.5.1:
- dependencies:
- jws: 3.2.2
- lodash.includes: 4.3.0
- lodash.isboolean: 3.0.3
- lodash.isinteger: 4.0.4
- lodash.isnumber: 3.0.3
- lodash.isplainobject: 4.0.6
- lodash.isstring: 4.0.1
- lodash.once: 4.1.1
- ms: 2.1.3
- semver: 5.7.2
+ json-stringify-safe@5.0.1: {}
+
+ jsonfile@6.2.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
jsonwebtoken@9.0.3:
dependencies:
@@ -7369,13 +7590,6 @@ snapshots:
ms: 2.1.3
semver: 7.7.3
- jsprim@1.4.2:
- dependencies:
- assert-plus: 1.0.0
- extsprintf: 1.3.0
- json-schema: 0.4.0
- verror: 1.10.0
-
jsprim@2.0.2:
dependencies:
assert-plus: 1.0.0
@@ -7383,12 +7597,6 @@ snapshots:
json-schema: 0.4.0
verror: 1.10.0
- jwa@1.4.2:
- dependencies:
- buffer-equal-constant-time: 1.0.1
- ecdsa-sig-formatter: 1.0.11
- safe-buffer: 5.2.1
-
jwa@2.0.1:
dependencies:
buffer-equal-constant-time: 1.0.1
@@ -7406,43 +7614,77 @@ snapshots:
transitivePeerDependencies:
- supports-color
- jws@3.2.2:
- dependencies:
- jwa: 1.4.2
- safe-buffer: 5.2.1
-
- jws@4.0.0:
- dependencies:
- jwa: 2.0.1
- safe-buffer: 5.2.1
-
jws@4.0.1:
dependencies:
jwa: 2.0.1
safe-buffer: 5.2.1
- keyv@3.1.0:
+ kind-of@3.2.2:
dependencies:
- json-buffer: 3.0.0
+ is-buffer: 1.1.6
kuler@2.0.0: {}
- latest-version@5.1.0:
- dependencies:
- package-json: 6.5.0
-
- lazy-ass@1.6.0: {}
-
lazystream@1.0.1:
dependencies:
readable-stream: 2.3.8
leven@3.1.0: {}
- levn@0.3.0:
+ libsodium-wrappers@0.7.15:
+ dependencies:
+ libsodium: 0.7.15
+
+ libsodium@0.7.15: {}
+
+ lightningcss-android-arm64@1.30.2:
+ optional: true
+
+ lightningcss-darwin-arm64@1.30.2:
+ optional: true
+
+ lightningcss-darwin-x64@1.30.2:
+ optional: true
+
+ lightningcss-freebsd-x64@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.30.2:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.30.2:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.30.2:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.30.2:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.30.2:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.30.2:
+ optional: true
+
+ lightningcss@1.30.2:
dependencies:
- prelude-ls: 1.1.2
- type-check: 0.3.2
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.30.2
+ lightningcss-darwin-arm64: 1.30.2
+ lightningcss-darwin-x64: 1.30.2
+ lightningcss-freebsd-x64: 1.30.2
+ lightningcss-linux-arm-gnueabihf: 1.30.2
+ lightningcss-linux-arm64-gnu: 1.30.2
+ lightningcss-linux-arm64-musl: 1.30.2
+ lightningcss-linux-x64-gnu: 1.30.2
+ lightningcss-linux-x64-musl: 1.30.2
+ lightningcss-win32-arm64-msvc: 1.30.2
+ lightningcss-win32-x64-msvc: 1.30.2
lilconfig@2.0.5: {}
@@ -7467,8 +7709,6 @@ snapshots:
transitivePeerDependencies:
- enquirer
- listenercount@1.0.1: {}
-
listr2@3.14.0(enquirer@2.4.1):
dependencies:
cli-truncate: 2.1.0
@@ -7497,30 +7737,14 @@ snapshots:
lodash-es@4.17.21: {}
- lodash._isnative@2.4.1: {}
-
lodash._objecttypes@2.4.1: {}
- lodash._shimkeys@2.4.1:
- dependencies:
- lodash._objecttypes: 2.4.1
-
lodash.camelcase@4.3.0: {}
lodash.clonedeep@4.5.0: {}
- lodash.defaults@4.2.0: {}
-
- lodash.difference@4.5.0: {}
-
- lodash.flatten@4.4.0: {}
-
lodash.includes@4.3.0: {}
- lodash.isarguments@2.4.1: {}
-
- lodash.isarguments@3.1.0: {}
-
lodash.isboolean@3.0.3: {}
lodash.isinteger@4.0.4: {}
@@ -7531,34 +7755,18 @@ snapshots:
dependencies:
lodash._objecttypes: 2.4.1
- lodash.isobject@3.0.2: {}
-
lodash.isplainobject@4.0.6: {}
lodash.isstring@4.0.1: {}
- lodash.keys@2.4.1:
- dependencies:
- lodash._isnative: 2.4.1
- lodash._shimkeys: 2.4.1
- lodash.isobject: 2.4.1
+ lodash.mapvalues@4.6.0: {}
lodash.once@4.1.1: {}
lodash.snakecase@4.1.1: {}
- lodash.union@4.6.0: {}
-
- lodash.values@2.4.1:
- dependencies:
- lodash.keys: 2.4.1
-
lodash@4.17.21: {}
- log-symbols@2.2.0:
- dependencies:
- chalk: 2.4.2
-
log-symbols@4.1.0:
dependencies:
chalk: 4.1.2
@@ -7580,90 +7788,85 @@ snapshots:
safe-stable-stringify: 2.5.0
triple-beam: 1.4.1
- long@4.0.0: {}
-
long@5.3.2: {}
loose-envify@1.4.0:
dependencies:
js-tokens: 4.0.0
- lowercase-keys@1.0.1: {}
-
- lowercase-keys@2.0.0: {}
+ lru-cache@10.4.3: {}
- lru-cache@10.4.3:
+ lru-cache@11.2.4:
optional: true
- lru-cache@5.1.1:
- dependencies:
- yallist: 3.1.1
-
lru-cache@6.0.0:
dependencies:
yallist: 4.0.0
+ lru-cache@7.18.3: {}
+
lru-memoizer@2.3.0:
dependencies:
lodash.clonedeep: 4.5.0
lru-cache: 6.0.0
- lru-queue@0.1.0:
+ lsofi@1.0.0:
dependencies:
- es5-ext: 0.10.64
+ is-number: 2.1.0
+ through2: 2.0.5
lz-string@1.5.0: {}
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
make-dir@3.1.0:
dependencies:
semver: 6.3.1
- make-fetch-happen@14.0.3:
+ make-error@1.3.6: {}
+
+ make-fetch-happen@15.0.3:
dependencies:
- '@npmcli/agent': 3.0.0
- cacache: 19.0.1
+ '@npmcli/agent': 4.0.0
+ cacache: 20.0.3
http-cache-semantics: 4.2.0
minipass: 7.1.2
- minipass-fetch: 4.0.1
+ minipass-fetch: 5.0.0
minipass-flush: 1.0.5
minipass-pipeline: 1.2.4
negotiator: 1.0.0
- proc-log: 5.0.0
+ proc-log: 6.1.0
promise-retry: 2.0.1
- ssri: 12.0.0
+ ssri: 13.0.0
transitivePeerDependencies:
- supports-color
optional: true
- marked-terminal@3.3.0(marked@0.7.0):
+ marked-terminal@7.3.0(marked@13.0.3):
dependencies:
- ansi-escapes: 3.2.0
- cardinal: 2.1.1
- chalk: 2.4.2
- cli-table: 0.3.11
- marked: 0.7.0
- node-emoji: 1.11.0
- supports-hyperlinks: 1.0.1
+ ansi-escapes: 7.2.0
+ ansi-regex: 6.2.2
+ chalk: 5.6.2
+ cli-highlight: 2.1.11
+ cli-table3: 0.6.5
+ marked: 13.0.3
+ node-emoji: 2.2.0
+ supports-hyperlinks: 3.2.0
- marked@0.7.0: {}
+ marked@13.0.3: {}
math-intrinsics@1.1.0: {}
media-typer@0.3.0: {}
- memoizee@0.4.17:
- dependencies:
- d: 1.0.2
- es5-ext: 0.10.64
- es6-weak-map: 2.0.3
- event-emitter: 0.3.5
- is-promise: 2.2.2
- lru-queue: 0.1.0
- next-tick: 1.1.0
- timers-ext: 0.1.8
+ media-typer@1.1.0: {}
merge-descriptors@1.0.3: {}
+ merge-descriptors@2.0.0: {}
+
merge-stream@2.0.0: {}
methods@1.1.2: {}
@@ -7681,6 +7884,10 @@ snapshots:
dependencies:
mime-db: 1.52.0
+ mime-types@3.0.2:
+ dependencies:
+ mime-db: 1.54.0
+
mime@1.6.0: {}
mime@2.6.0: {}
@@ -7688,15 +7895,12 @@ snapshots:
mime@3.0.0:
optional: true
- mimic-fn@1.2.0: {}
-
mimic-fn@2.1.0: {}
- mimic-response@1.0.1: {}
-
- min-document@2.19.2:
+ minimatch@10.1.1:
dependencies:
- dom-walk: 0.1.2
+ '@isaacs/brace-expansion': 5.0.0
+ optional: true
minimatch@3.1.2:
dependencies:
@@ -7706,10 +7910,13 @@ snapshots:
dependencies:
brace-expansion: 2.0.2
+ minimatch@6.2.0:
+ dependencies:
+ brace-expansion: 2.0.2
+
minimatch@9.0.5:
dependencies:
brace-expansion: 2.0.2
- optional: true
minimist@1.2.8: {}
@@ -7718,7 +7925,7 @@ snapshots:
minipass: 7.1.2
optional: true
- minipass-fetch@4.0.1:
+ minipass-fetch@5.0.0:
dependencies:
minipass: 7.1.2
minipass-sized: 1.0.3
@@ -7742,31 +7949,19 @@ snapshots:
minipass: 3.3.6
optional: true
- minipass@2.9.0:
- dependencies:
- safe-buffer: 5.2.1
- yallist: 3.1.1
-
minipass@3.3.6:
dependencies:
yallist: 4.0.0
optional: true
- minipass@7.1.2:
- optional: true
-
- minizlib@1.3.3:
- dependencies:
- minipass: 2.9.0
+ minipass@7.1.2: {}
minizlib@3.1.0:
dependencies:
minipass: 7.1.2
optional: true
- mkdirp@0.5.6:
- dependencies:
- minimist: 1.2.8
+ moo@0.5.2: {}
morgan@1.10.1:
dependencies:
@@ -7786,64 +7981,69 @@ snapshots:
ms@2.1.3: {}
- mute-stream@0.0.7: {}
+ mute-stream@2.0.0: {}
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
- nan@2.23.1:
+ nan@2.24.0:
optional: true
nanoid@3.3.11: {}
- nash@3.0.0:
+ nanoid@5.1.6: {}
+
+ nearley@2.20.1:
dependencies:
- async: 1.5.2
- flat-arguments: 1.0.2
- lodash: 4.17.21
- minimist: 1.2.8
+ commander: 2.20.3
+ moo: 0.5.2
+ railroad-diagrams: 1.0.0
+ randexp: 0.4.6
negotiator@0.6.3: {}
negotiator@0.6.4: {}
- negotiator@1.0.0:
- optional: true
+ negotiator@1.0.0: {}
netmask@2.0.2: {}
- next-tick@1.1.0: {}
-
- next@12.3.7(react-dom@17.0.2(react@17.0.2))(react@17.0.2):
+ next@16.1.1(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies:
- '@next/env': 12.3.7
- '@swc/helpers': 0.4.11
- caniuse-lite: 1.0.30001754
- postcss: 8.4.14
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
- styled-jsx: 5.0.7(react@17.0.2)
- use-sync-external-store: 1.2.0(react@17.0.2)
+ '@next/env': 16.1.1
+ '@swc/helpers': 0.5.15
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001761
+ postcss: 8.4.31
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ styled-jsx: 5.1.6(react@19.2.3)
optionalDependencies:
- '@next/swc-android-arm-eabi': 12.3.4
- '@next/swc-android-arm64': 12.3.4
- '@next/swc-darwin-arm64': 12.3.4
- '@next/swc-darwin-x64': 12.3.4
- '@next/swc-freebsd-x64': 12.3.4
- '@next/swc-linux-arm-gnueabihf': 12.3.4
- '@next/swc-linux-arm64-gnu': 12.3.4
- '@next/swc-linux-arm64-musl': 12.3.4
- '@next/swc-linux-x64-gnu': 12.3.4
- '@next/swc-linux-x64-musl': 12.3.4
- '@next/swc-win32-arm64-msvc': 12.3.4
- '@next/swc-win32-ia32-msvc': 12.3.4
- '@next/swc-win32-x64-msvc': 12.3.4
+ '@next/swc-darwin-arm64': 16.1.1
+ '@next/swc-darwin-x64': 16.1.1
+ '@next/swc-linux-arm64-gnu': 16.1.1
+ '@next/swc-linux-arm64-musl': 16.1.1
+ '@next/swc-linux-x64-gnu': 16.1.1
+ '@next/swc-linux-x64-musl': 16.1.1
+ '@next/swc-win32-arm64-msvc': 16.1.1
+ '@next/swc-win32-x64-msvc': 16.1.1
+ '@opentelemetry/api': 1.9.0
+ sharp: 0.34.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
- nice-try@1.0.5: {}
+ node-domexception@1.0.0: {}
- node-emoji@1.11.0:
+ node-emoji@2.2.0:
dependencies:
- lodash: 4.17.21
+ '@sindresorhus/is': 4.6.0
+ char-regex: 1.0.2
+ emojilib: 2.4.0
+ skin-tone: 2.0.0
node-fetch@2.7.0(encoding@0.1.13):
dependencies:
@@ -7851,61 +8051,69 @@ snapshots:
optionalDependencies:
encoding: 0.1.13
+ node-fetch@3.3.2:
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+
node-forge@1.3.1: {}
- node-gyp@11.5.0:
+ node-gyp@12.1.0:
dependencies:
env-paths: 2.2.1
exponential-backoff: 3.1.3
graceful-fs: 4.2.11
- make-fetch-happen: 14.0.3
- nopt: 8.1.0
- proc-log: 5.0.0
+ make-fetch-happen: 15.0.3
+ nopt: 9.0.0
+ proc-log: 6.1.0
semver: 7.7.3
tar: 7.5.2
tinyglobby: 0.2.15
- which: 5.0.0
+ which: 6.0.0
transitivePeerDependencies:
- supports-color
optional: true
- nopt@8.1.0:
+ node-releases@2.0.27: {}
+
+ nopt@9.0.0:
dependencies:
- abbrev: 3.0.1
+ abbrev: 4.0.0
optional: true
normalize-path@3.0.0: {}
- normalize-url@4.5.1: {}
+ npm-install-checks@6.3.0:
+ dependencies:
+ semver: 7.7.3
+
+ npm-normalize-package-bin@3.0.1: {}
+
+ npm-package-arg@11.0.3:
+ dependencies:
+ hosted-git-info: 7.0.2
+ proc-log: 4.2.0
+ semver: 7.7.3
+ validate-npm-package-name: 5.0.1
+
+ npm-pick-manifest@9.1.0:
+ dependencies:
+ npm-install-checks: 6.3.0
+ npm-normalize-package-bin: 3.0.1
+ npm-package-arg: 11.0.3
+ semver: 7.7.3
npm-run-path@4.0.1:
dependencies:
path-key: 3.1.1
- oauth-sign@0.9.0: {}
-
object-assign@4.1.1: {}
object-hash@3.0.0: {}
object-inspect@1.13.4: {}
- object-is@1.1.6:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
-
- object-keys@1.1.1: {}
-
- object.assign@4.1.7:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.4
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
- has-symbols: 1.1.0
- object-keys: 1.1.1
-
on-finished@2.3.0:
dependencies:
ee-first: 1.1.1
@@ -7924,10 +8132,6 @@ snapshots:
dependencies:
fn.name: 1.1.0
- onetime@2.0.1:
- dependencies:
- mimic-fn: 1.2.0
-
onetime@5.1.2:
dependencies:
mimic-fn: 2.1.0
@@ -7936,42 +8140,31 @@ snapshots:
dependencies:
is-wsl: 1.1.0
- openapi3-ts@2.0.2:
+ openapi3-ts@3.2.0:
dependencies:
- yaml: 1.10.2
+ yaml: 2.8.2
opener@1.5.2: {}
- optionator@0.8.3:
+ ora@5.4.1:
dependencies:
- deep-is: 0.1.4
- fast-levenshtein: 2.0.6
- levn: 0.3.0
- prelude-ls: 1.1.2
- type-check: 0.3.2
- word-wrap: 1.2.5
-
- ora@3.4.0:
- dependencies:
- chalk: 2.4.2
- cli-cursor: 2.1.0
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
cli-spinners: 2.9.2
- log-symbols: 2.2.0
- strip-ansi: 5.2.0
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
wcwidth: 1.0.1
- os-tmpdir@1.0.2: {}
-
ospath@1.2.2: {}
- p-cancelable@1.1.0: {}
-
p-defer@3.0.0: {}
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
- optional: true
p-map@4.0.0:
dependencies:
@@ -7980,41 +8173,37 @@ snapshots:
p-map@7.0.4:
optional: true
- pac-proxy-agent@5.0.0:
+ p-throttle@7.0.0: {}
+
+ pac-proxy-agent@7.2.0:
dependencies:
- '@tootallnate/once': 1.1.2
- agent-base: 6.0.2
+ '@tootallnate/quickjs-emscripten': 0.23.0
+ agent-base: 7.1.4
debug: 4.4.3
- get-uri: 3.0.2
- http-proxy-agent: 4.0.1
- https-proxy-agent: 5.0.1
- pac-resolver: 5.0.1
- raw-body: 2.5.2
- socks-proxy-agent: 5.0.1
+ get-uri: 6.0.5
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ pac-resolver: 7.0.1
+ socks-proxy-agent: 8.0.5
transitivePeerDependencies:
- supports-color
- pac-resolver@5.0.1:
+ pac-resolver@7.0.1:
dependencies:
- degenerator: 3.0.4
- ip: 1.1.9
+ degenerator: 5.0.1
netmask: 2.0.2
- package-json-from-dist@1.0.1:
- optional: true
+ package-json-from-dist@1.0.1: {}
- package-json@6.5.0:
+ parse5-htmlparser2-tree-adapter@6.0.1:
dependencies:
- got: 9.6.0
- registry-auth-token: 4.2.2
- registry-url: 5.1.0
- semver: 6.3.1
+ parse5: 6.0.1
- parseurl@1.3.3: {}
+ parse5@5.1.1: {}
- path-is-absolute@1.0.1: {}
+ parse5@6.0.1: {}
- path-key@2.0.1: {}
+ parseurl@1.3.3: {}
path-key@3.1.1: {}
@@ -8022,22 +8211,62 @@ snapshots:
dependencies:
lru-cache: 10.4.3
minipass: 7.1.2
+
+ path-scurry@2.0.1:
+ dependencies:
+ lru-cache: 11.2.4
+ minipass: 7.1.2
optional: true
path-to-regexp@0.1.12: {}
- path-to-regexp@0.1.7: {}
-
path-to-regexp@1.9.0:
dependencies:
isarray: 0.0.1
- pend@1.2.0: {}
+ path-to-regexp@8.3.0: {}
- performance-now@0.2.0: {}
+ pend@1.2.0: {}
performance-now@2.1.0: {}
+ pg-cloudflare@1.2.7:
+ optional: true
+
+ pg-connection-string@2.9.1: {}
+
+ pg-gateway@0.3.0-beta.4: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-pool@3.10.1(pg@8.16.3):
+ dependencies:
+ pg: 8.16.3
+
+ pg-protocol@1.10.3: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.1
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ pg@8.16.3:
+ dependencies:
+ pg-connection-string: 2.9.1
+ pg-pool: 3.10.1(pg@8.16.3)
+ pg-protocol: 1.10.3
+ pg-types: 2.2.0
+ pgpass: 1.0.5
+ optionalDependencies:
+ pg-cloudflare: 1.2.7
+
+ pgpass@1.0.5:
+ dependencies:
+ split2: 4.2.0
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -8049,6 +8278,8 @@ snapshots:
pify@2.3.0: {}
+ pkce-challenge@5.0.1: {}
+
portfinder@1.0.38:
dependencies:
async: 3.2.6
@@ -8056,25 +8287,29 @@ snapshots:
transitivePeerDependencies:
- supports-color
- possible-typed-array-names@1.1.0: {}
-
postcss-value-parser@4.2.0: {}
- postcss@8.4.14:
+ postcss@8.4.31:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
- postcss@8.4.49:
+ postcss@8.5.6:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
- prelude-ls@1.1.2: {}
+ postgres-array@2.0.0: {}
- prepend-http@2.0.0: {}
+ postgres-bytea@1.0.1: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
pretty-bytes@5.6.0: {}
@@ -8084,10 +8319,10 @@ snapshots:
ansi-styles: 5.2.0
react-is: 17.0.2
- proc-log@5.0.0:
- optional: true
+ proc-log@4.2.0: {}
- process-nextick-args@1.0.7: {}
+ proc-log@6.1.0:
+ optional: true
process-nextick-args@2.0.1: {}
@@ -8095,7 +8330,7 @@ snapshots:
progress@2.0.3: {}
- promise-breaker@5.0.0: {}
+ promise-breaker@6.0.0: {}
promise-retry@2.0.1:
dependencies:
@@ -8109,30 +8344,16 @@ snapshots:
object-assign: 4.1.1
react-is: 16.13.1
- proto3-json-serializer@0.1.9:
- dependencies:
- protobufjs: 6.11.2
+ proto-list@1.2.4: {}
proto3-json-serializer@2.0.2:
dependencies:
protobufjs: 7.5.4
optional: true
- protobufjs@6.11.2:
+ proto3-json-serializer@3.0.4:
dependencies:
- '@protobufjs/aspromise': 1.1.2
- '@protobufjs/base64': 1.1.2
- '@protobufjs/codegen': 2.0.4
- '@protobufjs/eventemitter': 1.1.0
- '@protobufjs/fetch': 1.1.0
- '@protobufjs/float': 1.0.2
- '@protobufjs/inquire': 1.1.0
- '@protobufjs/path': 1.1.2
- '@protobufjs/pool': 1.1.0
- '@protobufjs/utf8': 1.1.0
- '@types/long': 4.0.2
- '@types/node': 20.19.24
- long: 4.0.0
+ protobufjs: 7.5.4
protobufjs@7.5.4:
dependencies:
@@ -8154,16 +8375,16 @@ snapshots:
forwarded: 0.2.0
ipaddr.js: 1.9.1
- proxy-agent@5.0.0:
+ proxy-agent@6.5.0:
dependencies:
- agent-base: 6.0.2
+ agent-base: 7.1.4
debug: 4.4.3
- http-proxy-agent: 4.0.1
- https-proxy-agent: 5.0.1
- lru-cache: 5.1.1
- pac-proxy-agent: 5.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ lru-cache: 7.18.3
+ pac-proxy-agent: 7.2.0
proxy-from-env: 1.1.0
- socks-proxy-agent: 5.0.1
+ socks-proxy-agent: 8.0.5
transitivePeerDependencies:
- supports-color
@@ -8171,54 +8392,44 @@ snapshots:
proxy-from-env@1.1.0: {}
- psl@1.15.0:
- dependencies:
- punycode: 2.3.1
-
pump@3.0.3:
dependencies:
end-of-stream: 1.4.5
once: 1.4.0
- punycode@1.4.1: {}
-
- punycode@2.3.1: {}
-
pupa@2.1.1:
dependencies:
escape-goat: 2.1.1
qr.js@0.0.0: {}
- qs@6.10.4:
- dependencies:
- side-channel: 1.1.0
-
- qs@6.13.0:
- dependencies:
- side-channel: 1.1.0
-
qs@6.14.0:
dependencies:
side-channel: 1.1.0
- qs@6.5.3: {}
+ railroad-diagrams@1.0.0: {}
- querystringify@2.2.0: {}
-
- raf@3.4.1:
+ randexp@0.4.6:
dependencies:
- performance-now: 2.1.0
+ discontinuous-range: 1.0.0
+ ret: 0.1.15
range-parser@1.2.1: {}
- raw-body@2.5.2:
+ raw-body@2.5.3:
dependencies:
bytes: 3.1.2
- http-errors: 2.0.0
+ http-errors: 2.0.1
iconv-lite: 0.4.24
unpipe: 1.0.0
+ raw-body@3.0.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.1
+ iconv-lite: 0.7.1
+ unpipe: 1.0.0
+
rc@1.2.8:
dependencies:
deep-extend: 0.6.0
@@ -8226,87 +8437,53 @@ snapshots:
minimist: 1.2.8
strip-json-comments: 2.0.1
- re2@1.22.3:
+ re2@1.23.0:
dependencies:
install-artifact-from-github: 1.4.0
- nan: 2.23.1
- node-gyp: 11.5.0
+ nan: 2.24.0
+ node-gyp: 12.1.0
transitivePeerDependencies:
- supports-color
optional: true
- react-dom@17.0.2(react@17.0.2):
+ react-dom@19.2.3(react@19.2.3):
dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
- react: 17.0.2
- scheduler: 0.20.2
+ react: 19.2.3
+ scheduler: 0.27.0
react-fast-compare@2.0.4: {}
+ react-hot-toast@2.6.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ dependencies:
+ csstype: 3.1.3
+ goober: 2.1.18(csstype@3.1.3)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+
react-is@16.13.1: {}
react-is@17.0.2: {}
- react-motion@0.5.2(react@17.0.2):
- dependencies:
- performance-now: 0.2.0
- prop-types: 15.8.1
- raf: 3.4.1
- react: 17.0.2
-
- react-qr-code@2.0.18(react@17.0.2):
- dependencies:
- prop-types: 15.8.1
- qr.js: 0.0.0
- react: 17.0.2
-
- react-vis@1.12.1(react-dom@17.0.2(react@17.0.2))(react@17.0.2):
+ react-qr-code@2.0.18(react@19.2.3):
dependencies:
- d3-array: 3.2.4
- d3-collection: 1.0.7
- d3-color: 3.1.0
- d3-contour: 4.0.2
- d3-format: 3.1.0
- d3-geo: 3.1.1
- d3-hexbin: 0.2.2
- d3-hierarchy: 3.1.2
- d3-interpolate: 3.0.1
- d3-sankey: 0.12.3
- d3-scale: 4.0.2
- d3-shape: 3.2.0
- d3-voronoi: 1.1.4
- deep-equal: 1.1.2
- global: 4.4.0
prop-types: 15.8.1
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
- react-motion: 0.5.2(react@17.0.2)
-
- react@17.0.2:
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
-
- readable-stream@1.1.14:
- dependencies:
- core-util-is: 1.0.3
- inherits: 2.0.4
- isarray: 0.0.1
- string_decoder: 0.10.31
+ qr.js: 0.0.0
+ react: 19.2.3
- readable-stream@2.0.6:
+ react-redux@9.2.0(@types/react@19.2.8)(react@19.2.3)(redux@5.0.1):
dependencies:
- core-util-is: 1.0.3
- inherits: 2.0.4
- isarray: 1.0.0
- process-nextick-args: 1.0.7
- string_decoder: 0.10.31
- util-deprecate: 1.0.2
+ '@types/use-sync-external-store': 0.0.6
+ react: 19.2.3
+ use-sync-external-store: 1.6.0(react@19.2.3)
+ optionalDependencies:
+ '@types/react': 19.2.8
+ redux: 5.0.1
+
+ react@19.2.3: {}
readable-stream@2.3.8:
dependencies:
- core-util-is: 1.0.3
+ core-util-is: 1.0.2
inherits: 2.0.4
isarray: 1.0.0
process-nextick-args: 2.0.1
@@ -8320,6 +8497,14 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
+ readable-stream@4.7.0:
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+
readdir-glob@1.1.3:
dependencies:
minimatch: 5.1.6
@@ -8328,22 +8513,35 @@ snapshots:
dependencies:
picomatch: 2.3.1
- redeyed@2.1.1:
+ recharts@3.6.0(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react-is@17.0.2)(react@19.2.3)(redux@5.0.1):
dependencies:
- esprima: 4.0.1
+ '@reduxjs/toolkit': 2.11.2(react-redux@9.2.0(@types/react@19.2.8)(react@19.2.3)(redux@5.0.1))(react@19.2.3)
+ clsx: 2.1.1
+ decimal.js-light: 2.5.1
+ es-toolkit: 1.43.0
+ eventemitter3: 5.0.1
+ immer: 10.2.0
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ react-is: 17.0.2
+ react-redux: 9.2.0(@types/react@19.2.8)(react@19.2.3)(redux@5.0.1)
+ reselect: 5.1.1
+ tiny-invariant: 1.3.3
+ use-sync-external-store: 1.6.0(react@19.2.3)
+ victory-vendor: 37.3.6
+ transitivePeerDependencies:
+ - '@types/react'
+ - redux
- regexp.prototype.flags@1.5.4:
+ redux-thunk@3.1.0(redux@5.0.1):
dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-errors: 1.3.0
- get-proto: 1.0.1
- gopd: 1.2.0
- set-function-name: 2.0.2
+ redux: 5.0.1
+
+ redux@5.0.1: {}
- registry-auth-token@4.2.2:
+ registry-auth-token@5.1.0:
dependencies:
- rc: 1.2.8
+ '@pnpm/npm-conf': 2.3.1
registry-url@5.1.0:
dependencies:
@@ -8353,53 +8551,18 @@ snapshots:
dependencies:
throttleit: 1.0.1
- request@2.88.2:
- dependencies:
- aws-sign2: 0.7.0
- aws4: 1.13.2
- caseless: 0.12.0
- combined-stream: 1.0.8
- extend: 3.0.2
- forever-agent: 0.6.1
- form-data: 2.3.3
- har-validator: 5.1.5
- http-signature: 1.2.0
- is-typedarray: 1.0.0
- isstream: 0.1.2
- json-stringify-safe: 5.0.1
- mime-types: 2.1.35
- oauth-sign: 0.9.0
- performance-now: 2.1.0
- qs: 6.5.3
- safe-buffer: 5.2.1
- tough-cookie: 2.5.0
- tunnel-agent: 0.6.0
- uuid: 3.4.0
-
require-directory@2.1.1: {}
- requires-port@1.0.0: {}
+ require-from-string@2.0.2: {}
- responselike@1.0.2:
- dependencies:
- lowercase-keys: 1.0.1
-
- restore-cursor@2.0.0:
- dependencies:
- onetime: 2.0.1
- signal-exit: 3.0.7
+ reselect@5.1.1: {}
restore-cursor@3.1.0:
dependencies:
onetime: 5.1.2
signal-exit: 3.0.7
- retry-request@4.2.2:
- dependencies:
- debug: 4.4.3
- extend: 3.0.2
- transitivePeerDependencies:
- - supports-color
+ ret@0.1.15: {}
retry-request@7.0.2(encoding@0.1.13):
dependencies:
@@ -8411,42 +8574,34 @@ snapshots:
- supports-color
optional: true
+ retry-request@8.0.2:
+ dependencies:
+ extend: 3.0.2
+ teeny-request: 10.1.0
+ transitivePeerDependencies:
+ - supports-color
+
retry@0.12.0:
optional: true
- retry@0.13.1:
- optional: true
+ retry@0.13.1: {}
rfdc@1.4.1: {}
- rimraf@2.7.1:
+ rimraf@5.0.10:
dependencies:
- glob: 7.2.3
+ glob: 10.5.0
- rimraf@3.0.2:
+ router@2.2.0:
dependencies:
- glob: 7.2.3
-
- router@1.3.8:
- dependencies:
- array-flatten: 3.0.0
- debug: 2.6.9
- methods: 1.1.2
+ debug: 4.4.3
+ depd: 2.0.0
+ is-promise: 4.0.0
parseurl: 1.3.3
- path-to-regexp: 0.1.7
- setprototypeof: 1.2.0
- utils-merge: 1.0.1
+ path-to-regexp: 8.3.0
transitivePeerDependencies:
- supports-color
- rsvp@4.8.5: {}
-
- run-async@2.4.1: {}
-
- rxjs@6.6.7:
- dependencies:
- tslib: 1.14.1
-
rxjs@7.8.2:
dependencies:
tslib: 2.8.1
@@ -8455,90 +8610,110 @@ snapshots:
safe-buffer@5.2.1: {}
- safe-regex-test@1.1.0:
- dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- is-regex: 1.2.1
-
safe-stable-stringify@2.5.0: {}
safer-buffer@2.1.2: {}
- scheduler@0.20.2:
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
+ scheduler@0.27.0: {}
semver-diff@3.1.1:
dependencies:
semver: 6.3.1
- semver@5.7.2: {}
-
semver@6.3.1: {}
semver@7.7.3: {}
- send@0.19.0:
+ send@0.19.2:
dependencies:
debug: 2.6.9
depd: 2.0.0
destroy: 1.2.0
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
fresh: 0.5.2
- http-errors: 2.0.0
+ http-errors: 2.0.1
mime: 1.6.0
ms: 2.1.3
on-finished: 2.4.1
range-parser: 1.2.1
- statuses: 2.0.1
+ statuses: 2.0.2
transitivePeerDependencies:
- supports-color
- serve-static@1.16.2:
+ send@1.2.1:
dependencies:
+ debug: 4.4.3
encodeurl: 2.0.0
escape-html: 1.0.3
- parseurl: 1.3.3
- send: 0.19.0
+ etag: 1.8.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ mime-types: 3.0.2
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.2
transitivePeerDependencies:
- supports-color
- set-function-length@1.2.2:
+ serve-static@1.16.3:
dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- function-bind: 1.1.2
- get-intrinsic: 1.3.0
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.2
+ transitivePeerDependencies:
+ - supports-color
- set-function-name@2.0.2:
+ serve-static@2.2.1:
dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.2
-
- setimmediate@1.0.5: {}
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
setprototypeof@1.2.0: {}
- shallowequal@1.1.0: {}
-
- shebang-command@1.2.0:
+ sharp@0.34.5:
dependencies:
- shebang-regex: 1.0.0
+ '@img/colour': 1.0.0
+ detect-libc: 2.1.2
+ semver: 7.7.3
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ optional: true
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
- shebang-regex@1.0.0: {}
-
shebang-regex@3.0.0: {}
side-channel-list@1.0.0:
@@ -8571,8 +8746,7 @@ snapshots:
signal-exit@3.0.7: {}
- signal-exit@4.1.0:
- optional: true
+ signal-exit@4.1.0: {}
sirv@2.0.4:
dependencies:
@@ -8580,6 +8754,10 @@ snapshots:
mrmime: 2.0.1
totalist: 3.0.1
+ skin-tone@2.0.0:
+ dependencies:
+ unicode-emoji-modifier-base: 1.0.0
+
slice-ansi@3.0.0:
dependencies:
ansi-styles: 4.3.0
@@ -8599,14 +8777,6 @@ snapshots:
smart-buffer@4.2.0: {}
- socks-proxy-agent@5.0.1:
- dependencies:
- agent-base: 6.0.2
- debug: 4.4.3
- socks: 2.8.7
- transitivePeerDependencies:
- - supports-color
-
socks-proxy-agent@8.0.5:
dependencies:
agent-base: 7.1.4
@@ -8614,20 +8784,30 @@ snapshots:
socks: 2.8.7
transitivePeerDependencies:
- supports-color
- optional: true
socks@2.8.7:
dependencies:
ip-address: 10.1.0
smart-buffer: 4.2.0
+ sort-any@2.0.0:
+ dependencies:
+ lodash: 4.17.21
+
source-map-js@1.2.1: {}
source-map@0.6.1:
optional: true
+ split2@4.2.0: {}
+
sprintf-js@1.0.3: {}
+ sql-formatter@15.6.12:
+ dependencies:
+ argparse: 2.0.1
+ nearley: 2.20.1
+
sshpk@1.18.0:
dependencies:
asn1: 0.2.6
@@ -8640,7 +8820,7 @@ snapshots:
safer-buffer: 2.1.2
tweetnacl: 0.14.5
- ssri@12.0.0:
+ ssri@13.0.0:
dependencies:
minipass: 7.1.2
optional: true
@@ -8649,30 +8829,30 @@ snapshots:
statuses@1.5.0: {}
- statuses@2.0.1: {}
+ statuses@2.0.2: {}
- stop-iteration-iterator@1.1.0:
- dependencies:
- es-errors: 1.3.0
- internal-slot: 1.1.0
+ stream-chain@2.2.5: {}
stream-events@1.0.5:
dependencies:
stubs: 3.0.0
- optional: true
- stream-shift@1.0.3: {}
+ stream-json@1.9.1:
+ dependencies:
+ stream-chain: 2.2.5
- string-argv@0.3.2: {}
+ stream-shift@1.0.3: {}
- string-length@1.0.1:
+ streamx@2.23.0:
dependencies:
- strip-ansi: 3.0.1
+ events-universal: 1.0.1
+ fast-fifo: 1.3.2
+ text-decoder: 1.2.3
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
- string-width@2.1.1:
- dependencies:
- is-fullwidth-code-point: 2.0.0
- strip-ansi: 4.0.0
+ string-argv@0.3.2: {}
string-width@4.2.3:
dependencies:
@@ -8686,8 +8866,6 @@ snapshots:
emoji-regex: 9.2.2
strip-ansi: 7.1.2
- string_decoder@0.10.31: {}
-
string_decoder@1.1.1:
dependencies:
safe-buffer: 5.1.2
@@ -8696,18 +8874,6 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
- strip-ansi@3.0.1:
- dependencies:
- ansi-regex: 2.1.1
-
- strip-ansi@4.0.0:
- dependencies:
- ansi-regex: 3.0.1
-
- strip-ansi@5.2.0:
- dependencies:
- ansi-regex: 4.1.1
-
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -8723,66 +8889,38 @@ snapshots:
strnum@1.1.2:
optional: true
- stubs@3.0.0:
- optional: true
-
- styled-components@6.1.19(react-dom@17.0.2(react@17.0.2))(react@17.0.2):
- dependencies:
- '@emotion/is-prop-valid': 1.2.2
- '@emotion/unitless': 0.8.1
- '@types/stylis': 4.2.5
- css-to-react-native: 3.2.0
- csstype: 3.1.3
- postcss: 8.4.49
- react: 17.0.2
- react-dom: 17.0.2(react@17.0.2)
- shallowequal: 1.1.0
- stylis: 4.3.2
- tslib: 2.6.2
+ stubs@3.0.0: {}
- styled-jsx@5.0.7(react@17.0.2):
+ styled-jsx@5.1.6(react@19.2.3):
dependencies:
- react: 17.0.2
+ client-only: 0.0.1
+ react: 19.2.3
- stylis@4.3.2: {}
-
- superstatic@7.1.0:
+ superstatic@10.0.0(encoding@0.1.13):
dependencies:
basic-auth-connect: 1.1.0
- chalk: 1.1.3
- compare-semver: 1.1.0
+ commander: 10.0.1
compression: 1.8.1
connect: 3.7.0
destroy: 1.2.0
- fast-url-parser: 1.1.3
- fs-extra: 8.1.0
glob-slasher: 1.0.1
- home-dir: 1.0.0
is-url: 1.2.4
join-path: 1.1.1
lodash: 4.17.21
mime-types: 2.1.35
- minimatch: 3.1.2
+ minimatch: 6.2.0
morgan: 1.10.1
- nash: 3.0.0
on-finished: 2.4.1
on-headers: 1.1.0
path-to-regexp: 1.9.0
- router: 1.3.8
- rsvp: 4.8.5
- string-length: 1.0.1
- update-notifier: 4.1.3
+ router: 2.2.0
+ update-notifier-cjs: 5.1.7(encoding@0.1.13)
optionalDependencies:
- re2: 1.22.3
+ re2: 1.23.0
transitivePeerDependencies:
+ - encoding
- supports-color
- supports-color@2.0.0: {}
-
- supports-color@5.5.0:
- dependencies:
- has-flag: 3.0.0
-
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -8793,32 +8931,27 @@ snapshots:
supports-color@9.4.0: {}
- supports-hyperlinks@1.0.1:
+ supports-hyperlinks@3.2.0:
dependencies:
- has-flag: 2.0.0
- supports-color: 5.5.0
+ has-flag: 4.0.0
+ supports-color: 7.2.0
- swr@1.3.0(react@17.0.2):
- dependencies:
- react: 17.0.2
+ systeminformation@5.28.3: {}
- tar-stream@2.2.0:
- dependencies:
- bl: 4.1.0
- end-of-stream: 1.4.5
- fs-constants: 1.0.0
- inherits: 2.0.4
- readable-stream: 3.6.2
+ tailwindcss@4.0.0: {}
- tar@4.4.19:
+ tailwindcss@4.1.18: {}
+
+ tapable@2.3.0: {}
+
+ tar-stream@3.1.7:
dependencies:
- chownr: 1.1.4
- fs-minipass: 1.2.7
- minipass: 2.9.0
- minizlib: 1.3.3
- mkdirp: 0.5.6
- safe-buffer: 5.2.1
- yallist: 3.1.1
+ b4a: 1.7.3
+ fast-fifo: 1.3.2
+ streamx: 2.23.0
+ transitivePeerDependencies:
+ - bare-abort-controller
+ - react-native-b4a
tar@7.5.2:
dependencies:
@@ -8836,6 +8969,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ teeny-request@10.1.0:
+ dependencies:
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ node-fetch: 3.3.2
+ stream-events: 1.0.5
+ transitivePeerDependencies:
+ - supports-color
+
teeny-request@9.0.0(encoding@0.1.13):
dependencies:
http-proxy-agent: 5.0.0
@@ -8848,23 +8990,32 @@ snapshots:
- supports-color
optional: true
- term-size@2.2.1: {}
+ text-decoder@1.2.3:
+ dependencies:
+ b4a: 1.7.3
+ transitivePeerDependencies:
+ - react-native-b4a
text-hex@1.0.0: {}
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
throttleit@1.0.1: {}
- through2@2.0.1:
+ through2@2.0.5:
dependencies:
- readable-stream: 2.0.6
+ readable-stream: 2.3.8
xtend: 4.0.2
through@2.3.8: {}
- timers-ext@0.1.8:
- dependencies:
- es5-ext: 0.10.64
- next-tick: 1.1.0
+ tiny-invariant@1.3.3: {}
tiny-warning@1.0.3: {}
@@ -8874,14 +9025,14 @@ snapshots:
picomatch: 4.0.3
optional: true
- tmp@0.0.33:
+ tldts-core@6.1.86: {}
+
+ tldts@6.1.86:
dependencies:
- os-tmpdir: 1.0.2
+ tldts-core: 6.1.86
tmp@0.2.5: {}
- to-readable-stream@1.0.0: {}
-
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
@@ -8890,17 +9041,9 @@ snapshots:
totalist@3.0.1: {}
- tough-cookie@2.5.0:
- dependencies:
- psl: 1.15.0
- punycode: 2.3.1
-
- tough-cookie@4.1.4:
+ tough-cookie@5.1.2:
dependencies:
- psl: 1.15.0
- punycode: 2.3.1
- universalify: 0.2.0
- url-parse: 1.5.10
+ tldts: 6.1.86
toxic@1.0.1:
dependencies:
@@ -8908,13 +9051,27 @@ snapshots:
tr46@0.0.3: {}
- traverse@0.3.9: {}
+ tree-kill@1.2.2: {}
triple-beam@1.4.1: {}
- tslib@1.14.1: {}
-
- tslib@2.6.2: {}
+ ts-node@10.9.2(@types/node@22.19.3)(typescript@5.9.3):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.12
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 22.19.3
+ acorn: 8.15.0
+ acorn-walk: 8.3.4
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.9.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
tslib@2.8.1: {}
@@ -8926,17 +9083,6 @@ snapshots:
tweetnacl@0.14.5: {}
- tweetnacl@1.0.3: {}
-
- tweetsodium@0.0.5:
- dependencies:
- blakejs: 1.2.1
- tweetnacl: 1.0.3
-
- type-check@0.3.2:
- dependencies:
- prelude-ls: 1.1.2
-
type-fest@0.20.2: {}
type-fest@0.21.3: {}
@@ -8948,7 +9094,11 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
- type@2.7.3: {}
+ type-is@2.0.1:
+ dependencies:
+ content-type: 1.0.5
+ media-typer: 1.1.0
+ mime-types: 3.0.2
typedarray-to-buffer@3.1.5:
dependencies:
@@ -8960,14 +9110,14 @@ snapshots:
undici-types@6.21.0: {}
- unfetch@4.2.0: {}
+ unicode-emoji-modifier-base@1.0.0: {}
- unique-filename@4.0.0:
+ unique-filename@5.0.0:
dependencies:
- unique-slug: 5.0.0
+ unique-slug: 6.0.0
optional: true
- unique-slug@5.0.0:
+ unique-slug@6.0.0:
dependencies:
imurmurhash: 0.1.4
optional: true
@@ -8976,54 +9126,26 @@ snapshots:
dependencies:
crypto-random-string: 2.0.0
- universal-analytics@0.4.23:
+ universal-analytics@0.5.3:
dependencies:
debug: 4.4.3
- request: 2.88.2
- uuid: 3.4.0
+ uuid: 8.3.2
transitivePeerDependencies:
- supports-color
- universalify@0.1.2: {}
-
- universalify@0.2.0: {}
-
universalify@2.0.1: {}
unpipe@1.0.0: {}
untildify@4.0.0: {}
- unzipper@0.10.14:
- dependencies:
- big-integer: 1.6.52
- binary: 0.3.0
- bluebird: 3.4.7
- buffer-indexof-polyfill: 1.0.2
- duplexer2: 0.1.4
- fstream: 1.0.12
- graceful-fs: 4.2.11
- listenercount: 1.0.1
- readable-stream: 2.3.8
- setimmediate: 1.0.5
-
- update-notifier@4.1.3:
+ update-browserslist-db@1.2.3(browserslist@4.28.1):
dependencies:
- boxen: 4.2.0
- chalk: 3.0.0
- configstore: 5.0.1
- has-yarn: 2.1.0
- import-lazy: 2.1.0
- is-ci: 2.0.0
- is-installed-globally: 0.3.2
- is-npm: 4.0.0
- is-yarn-global: 0.3.0
- latest-version: 5.1.0
- pupa: 2.1.1
- semver-diff: 3.1.1
- xdg-basedir: 4.0.0
+ browserslist: 4.28.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
- update-notifier@5.1.0:
+ update-notifier-cjs@5.1.7(encoding@0.1.13):
dependencies:
boxen: 5.1.2
chalk: 4.1.2
@@ -9034,30 +9156,23 @@ snapshots:
is-installed-globally: 0.4.0
is-npm: 5.0.0
is-yarn-global: 0.3.0
- latest-version: 5.1.0
+ isomorphic-fetch: 3.0.0(encoding@0.1.13)
pupa: 2.1.1
+ registry-auth-token: 5.1.0
+ registry-url: 5.1.0
semver: 7.7.3
semver-diff: 3.1.1
xdg-basedir: 4.0.0
-
- uri-js@4.4.1:
- dependencies:
- punycode: 2.3.1
+ transitivePeerDependencies:
+ - encoding
url-join@0.0.1: {}
- url-parse-lax@3.0.0:
- dependencies:
- prepend-http: 2.0.0
-
- url-parse@1.5.10:
- dependencies:
- querystringify: 2.2.0
- requires-port: 1.0.0
+ url-template@2.0.8: {}
- use-sync-external-store@1.2.0(react@17.0.2):
+ use-sync-external-store@1.6.0(react@19.2.3):
dependencies:
- react: 17.0.2
+ react: 19.2.3
util-deprecate@1.0.2: {}
@@ -9065,15 +9180,16 @@ snapshots:
uuid@10.0.0: {}
- uuid@3.4.0: {}
-
uuid@8.3.2: {}
- uuid@9.0.1:
- optional: true
+ uuid@9.0.1: {}
+
+ v8-compile-cache-lib@3.0.1: {}
valid-url@1.0.9: {}
+ validate-npm-package-name@5.0.1: {}
+
vary@1.1.2: {}
verror@1.10.0:
@@ -9082,15 +9198,29 @@ snapshots:
core-util-is: 1.0.2
extsprintf: 1.3.0
- vm2@3.10.0:
+ victory-vendor@37.3.6:
dependencies:
- acorn: 8.15.0
- acorn-walk: 8.3.4
+ '@types/d3-array': 3.2.2
+ '@types/d3-ease': 3.0.2
+ '@types/d3-interpolate': 3.0.4
+ '@types/d3-scale': 4.0.9
+ '@types/d3-shape': 3.1.7
+ '@types/d3-time': 3.0.4
+ '@types/d3-timer': 3.0.2
+ d3-array: 3.2.4
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-scale: 4.0.2
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-timer: 3.0.1
wcwidth@1.0.1:
dependencies:
defaults: 1.0.4
+ web-streams-polyfill@3.3.3: {}
+
web-vitals@4.2.4: {}
webidl-conversions@3.0.1: {}
@@ -9122,45 +9252,18 @@ snapshots:
websocket-extensions@0.1.4: {}
+ whatwg-fetch@3.6.20: {}
+
whatwg-url@5.0.0:
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
- which-boxed-primitive@1.1.1:
- dependencies:
- is-bigint: 1.1.0
- is-boolean-object: 1.2.2
- is-number-object: 1.1.1
- is-string: 1.1.1
- is-symbol: 1.1.1
-
- which-collection@1.0.2:
- dependencies:
- is-map: 2.0.3
- is-set: 2.0.3
- is-weakmap: 2.0.2
- is-weakset: 2.0.4
-
- which-typed-array@1.1.19:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- call-bound: 1.0.4
- for-each: 0.3.5
- get-proto: 1.0.1
- gopd: 1.2.0
- has-tostringtag: 1.0.2
-
- which@1.3.1:
- dependencies:
- isexe: 2.0.0
-
which@2.0.2:
dependencies:
isexe: 2.0.0
- which@5.0.0:
+ which@6.0.0:
dependencies:
isexe: 3.1.1
optional: true
@@ -9175,7 +9278,7 @@ snapshots:
readable-stream: 3.6.2
triple-beam: 1.4.1
- winston@3.18.3:
+ winston@3.19.0:
dependencies:
'@colors/colors': 1.6.0
'@dabh/diagnostics': 2.0.8
@@ -9189,8 +9292,6 @@ snapshots:
triple-beam: 1.4.1
winston-transport: 4.9.0
- word-wrap@1.2.5: {}
-
wrap-ansi@6.2.0:
dependencies:
ansi-styles: 4.3.0
@@ -9208,7 +9309,6 @@ snapshots:
ansi-styles: 6.2.3
string-width: 5.1.2
strip-ansi: 7.1.2
- optional: true
wrappy@1.0.2: {}
@@ -9223,14 +9323,10 @@ snapshots:
xdg-basedir@4.0.0: {}
- xregexp@2.0.0: {}
-
xtend@4.0.2: {}
y18n@5.0.8: {}
- yallist@3.1.1: {}
-
yallist@4.0.0: {}
yallist@5.0.0:
@@ -9238,6 +9334,8 @@ snapshots:
yaml@1.10.2: {}
+ yaml@2.8.2: {}
+
yargs-parser@20.2.9: {}
yargs-parser@21.1.1: {}
@@ -9267,11 +9365,20 @@ snapshots:
buffer-crc32: 0.2.13
fd-slicer: 1.1.0
- yocto-queue@0.1.0:
- optional: true
+ yn@3.1.1: {}
+
+ yocto-queue@0.1.0: {}
+
+ yoctocolors-cjs@2.1.3: {}
- zip-stream@4.1.1:
+ zip-stream@6.0.1:
dependencies:
- archiver-utils: 3.0.4
- compress-commons: 4.1.2
- readable-stream: 3.6.2
+ archiver-utils: 5.0.2
+ compress-commons: 6.0.2
+ readable-stream: 4.7.0
+
+ zod-to-json-schema@3.25.1(zod@3.25.76):
+ dependencies:
+ zod: 3.25.76
+
+ zod@3.25.76: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 7663875..5c8074e 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,4 +1,5 @@
-packages:
+packages: null
+
onlyBuiltDependencies:
- '@firebase/util'
- core-js
@@ -6,3 +7,4 @@ onlyBuiltDependencies:
- es5-ext
- protobufjs
- re2
+ - sharp
diff --git a/postcss.config.cjs b/postcss.config.cjs
new file mode 100644
index 0000000..668a5b9
--- /dev/null
+++ b/postcss.config.cjs
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ '@tailwindcss/postcss': {},
+ autoprefixer: {},
+ },
+}
diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..3f964ce
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,28 @@
+{
+ "name": "Hemolog 2",
+ "short_name": "Hemolog",
+ "description": "Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#ffffff",
+ "theme_color": "#ffffff",
+ "orientation": "portrait-primary",
+ "icons": [
+ {
+ "src": "/images/favicon-16x16.png",
+ "sizes": "16x16",
+ "type": "image/png"
+ },
+ {
+ "src": "/images/favicon-32x32.png",
+ "sizes": "32x32",
+ "type": "image/png"
+ },
+ {
+ "src": "/images/apple-touch-icon.png",
+ "sizes": "180x180",
+ "type": "image/png"
+ }
+ ]
+}
+
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
new file mode 100644
index 0000000..4d5b7a7
--- /dev/null
+++ b/src/app/about/page.tsx
@@ -0,0 +1,123 @@
+import Image from 'next/image'
+import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
+
+const About = (): JSX.Element => {
+ return (
+
+
+
+
+
The story so far
+
+ More than you would ever want to know about Hemolog
+
+
+
+
+
+
+
+
+
+ Let's face it, there are some exciting developments in the world
+ of Hemophilia research. Honestly, it's not just research
+ anymore. Clinical trials are happening now across the globe. Gene
+ therapy is definitely going to change things for the better, it's
+ just a matter of when it's available to all of us.
+
+
+
+ That being said, it's still important to keep track of your
+ treatments. Maybe even more now than ever. If getting on a trial
+ is something you're interested in, knowing how many bleeds you
+ were having before is really important.
+
+
+
+ Trial or not, keeping track of your treatment habits can be hard
+ and the tools we have aren't great. Hemolog is simple. You track
+ your treatments and Hemolog gives you instant feedback.
+
+
+
+ Insights are something that I always wanted to be a part of
+ Hemolog and now they're finally here.
+
+
+
+
+
+
+ High level insights that help you understand your habits
+
+
+
+
+ These insights are calculated as you log your treatments. Filter by
+ year for a comprehensive view into your treatment history. I've
+ chosen a few insights that are interesting to me. If you have
+ thoughts on what you would like to see, just let me know.
+
+
+
+
Note
+
+ Development is ongoing. Check out the{' '}
+
+ development blog
+ {' '}
+ for updates and changes.
+
+
+
+
+
+
+ Now that Hemolog is back, I hope you enjoy using it as much as I
+ have. It's up to all of us to keep each other accountable. You
+ can{' '}
+
+ view my emergency page
+ {' '}
+ at any time to verify I've been keeping up with my prophy
+ regimen.
+
+
— Michael Schultz
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default About
diff --git a/src/app/api/alert-lightstrip/route.ts b/src/app/api/alert-lightstrip/route.ts
new file mode 100644
index 0000000..06bce00
--- /dev/null
+++ b/src/app/api/alert-lightstrip/route.ts
@@ -0,0 +1,15 @@
+// NOTE(michael): this endpoint isn't used anywhere and was just an
+// exploration of the HUE api.
+import type { NextRequest } from 'next/server'
+
+const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
+
+export async function PUT(_request: NextRequest) {
+ const response = await fetch(`${REQUEST_URL}/state`, {
+ method: 'PUT',
+ body: JSON.stringify({ on: true, hue: 0 }),
+ })
+
+ const result = await response.json()
+ return Response.json(result)
+}
diff --git a/src/app/api/delete-account/route.ts b/src/app/api/delete-account/route.ts
new file mode 100644
index 0000000..bc9a031
--- /dev/null
+++ b/src/app/api/delete-account/route.ts
@@ -0,0 +1,27 @@
+import type { NextRequest } from 'next/server'
+import { deleteUserAndData } from '@/lib/admin-db/users'
+import { auth } from '@/lib/firebase-admin'
+
+export async function DELETE(request: NextRequest) {
+ try {
+ const token = request.headers.get('token')
+
+ if (!token) {
+ throw new Error('Access denied. Missing valid token.')
+ }
+
+ const { uid } = await auth.verifyIdToken(token)
+
+ if (!uid) {
+ throw new Error('Access denied. Invalid token.')
+ }
+
+ await deleteUserAndData(uid)
+
+ return Response.json({ success: true })
+ } catch (error: unknown) {
+ const errorMessage =
+ error instanceof Error ? error.message : 'Unable to delete account.'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+}
diff --git a/pages/api/feedback.ts b/src/app/api/feedback/route.ts
similarity index 52%
rename from pages/api/feedback.ts
rename to src/app/api/feedback/route.ts
index 23ce7f3..f22e386 100644
--- a/pages/api/feedback.ts
+++ b/src/app/api/feedback/route.ts
@@ -1,14 +1,16 @@
-import { auth } from 'lib/firebase-admin'
-import { getAllFeedback } from 'lib/admin-db/feedback'
-import type { NextApiRequest, NextApiResponse } from 'next'
+import type { NextRequest } from 'next/server'
+import { getAllFeedback } from '@/lib/admin-db/feedback'
+import { auth } from '@/lib/firebase-admin'
-const feedback = async (req: NextApiRequest, res: NextApiResponse) => {
+export async function GET(request: NextRequest) {
try {
- if (!req.headers.token) {
+ const token = request.headers.get('token')
+
+ if (!token) {
throw { message: 'Access denied. Missing valid token.' }
}
- const { uid } = await auth.verifyIdToken(req.headers.token as string)
+ const { uid } = await auth.verifyIdToken(token)
if (!uid) {
throw {
message: `Invalid token`,
@@ -21,7 +23,7 @@ const feedback = async (req: NextApiRequest, res: NextApiResponse) => {
throw error
}
- return res.status(200).json(feedback)
+ return Response.json(feedback)
} catch (error: unknown) {
const errorMessage =
error &&
@@ -30,8 +32,6 @@ const feedback = async (req: NextApiRequest, res: NextApiResponse) => {
typeof error.message === 'string'
? error.message
: 'An error occurred'
- return res.status(500).send(errorMessage)
+ return Response.json({ error: errorMessage }, { status: 500 })
}
}
-
-export default feedback
diff --git a/src/app/api/flip-lightstrip/route.ts b/src/app/api/flip-lightstrip/route.ts
new file mode 100644
index 0000000..0ffacd1
--- /dev/null
+++ b/src/app/api/flip-lightstrip/route.ts
@@ -0,0 +1,45 @@
+// NOTE(michael): this endpoint isn't used anywhere and was just an
+// exploration of the HUE api.
+import type { NextRequest } from 'next/server'
+
+const REQUEST_URL = `${process.env.HUE_BRIDGE_URL}/lights/3`
+
+export async function PUT(request: NextRequest) {
+ const { searchParams } = new URL(request.url)
+ const onParam = searchParams.get('on')
+ let on: boolean | undefined
+
+ if (onParam) {
+ switch (onParam) {
+ case 'false': {
+ on = false
+ break
+ }
+ case 'true': {
+ on = true
+ break
+ }
+ case 'default': {
+ on = true
+ break
+ }
+ }
+ } else {
+ // Get current state and toggle
+ const stateResponse = await fetch(REQUEST_URL, {
+ method: 'GET',
+ })
+ const data = await stateResponse.json()
+ const currentState = data.state.on
+ // toggle light state
+ on = !currentState
+ }
+
+ const response = await fetch(`${REQUEST_URL}/state`, {
+ method: 'PUT',
+ body: JSON.stringify({ on: on }),
+ })
+
+ const result = await response.json()
+ return Response.json(result)
+}
diff --git a/src/app/api/log-treatment/route.ts b/src/app/api/log-treatment/route.ts
new file mode 100644
index 0000000..9078d7d
--- /dev/null
+++ b/src/app/api/log-treatment/route.ts
@@ -0,0 +1,57 @@
+import type { NextRequest } from 'next/server'
+import {
+ getRecentUserTreatmentsByApiKey,
+ postTreatmentByApiKey,
+} from '@/lib/admin-db/treatments'
+
+export async function POST(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const apikey = searchParams.get('apikey')
+
+ if (!apikey) {
+ throw { message: 'Access denied. Missing api key.' }
+ }
+
+ const body = await request.json()
+
+ if (!body) {
+ throw { message: 'Missing treatment data.' }
+ }
+
+ const { treatments, error } = await getRecentUserTreatmentsByApiKey(apikey)
+
+ if (error) throw error
+
+ const mostRecentTreatment =
+ treatments && treatments.length > 0 ? treatments[0] : null
+
+ try {
+ const { treatment, error } = await postTreatmentByApiKey(
+ apikey,
+ mostRecentTreatment,
+ body
+ )
+ if (error) throw error
+ return Response.json(treatment)
+ } catch (error: unknown) {
+ const errorMessage =
+ error &&
+ typeof error === 'object' &&
+ 'message' in error &&
+ typeof error.message === 'string'
+ ? error.message
+ : 'An error occurred'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+ } catch (error: unknown) {
+ const errorMessage =
+ error &&
+ typeof error === 'object' &&
+ 'message' in error &&
+ typeof error.message === 'string'
+ ? error.message
+ : 'An error occurred'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+}
diff --git a/src/app/api/recent-treatments/route.ts b/src/app/api/recent-treatments/route.ts
new file mode 100644
index 0000000..9d75c45
--- /dev/null
+++ b/src/app/api/recent-treatments/route.ts
@@ -0,0 +1,34 @@
+import type { NextRequest } from 'next/server'
+import { getRecentUserTreatmentsByApiKey } from '@/lib/admin-db/treatments'
+
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const apikey = searchParams.get('apikey')
+ const alertid = searchParams.get('alertid')
+
+ if (!apikey && !alertid) {
+ throw { message: 'Access denied. Missing api key.' }
+ }
+
+ const { treatments, error } = await getRecentUserTreatmentsByApiKey(
+ apikey || undefined,
+ alertid || undefined
+ )
+
+ if (error) {
+ throw error
+ }
+
+ return Response.json(treatments)
+ } catch (error: unknown) {
+ const errorMessage =
+ error &&
+ typeof error === 'object' &&
+ 'message' in error &&
+ typeof error.message === 'string'
+ ? error.message
+ : 'An error occurred'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+}
diff --git a/src/app/api/treatments/route.ts b/src/app/api/treatments/route.ts
new file mode 100644
index 0000000..e3a5431
--- /dev/null
+++ b/src/app/api/treatments/route.ts
@@ -0,0 +1,30 @@
+import type { NextRequest } from 'next/server'
+import { getAllTreatmentsByApiKey } from '@/lib/admin-db/treatments'
+
+export async function GET(request: NextRequest) {
+ try {
+ const { searchParams } = new URL(request.url)
+ const apikey = searchParams.get('apikey')
+
+ if (!apikey) {
+ throw { message: 'Access denied. Missing api key.' }
+ }
+
+ const { treatments, error } = await getAllTreatmentsByApiKey(apikey)
+
+ if (error) {
+ throw error
+ }
+
+ return Response.json(treatments)
+ } catch (error: unknown) {
+ const errorMessage =
+ error &&
+ typeof error === 'object' &&
+ 'message' in error &&
+ typeof error.message === 'string'
+ ? error.message
+ : 'An error occurred'
+ return Response.json({ error: errorMessage }, { status: 500 })
+ }
+}
diff --git a/src/app/changelog/[slug]/page.tsx b/src/app/changelog/[slug]/page.tsx
new file mode 100644
index 0000000..50c1721
--- /dev/null
+++ b/src/app/changelog/[slug]/page.tsx
@@ -0,0 +1,196 @@
+import { notFound } from 'next/navigation'
+import BlogFooter from '@/components/blog/blogFooter'
+import PostFooter from '@/components/blog/postFooter'
+import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
+
+interface PageProps {
+ params: Promise<{
+ slug: string
+ }>
+}
+
+const ChangelogPost = async ({ params }: PageProps): Promise => {
+ const { slug } = await params
+
+ // For now, redirect to 404 for unknown slugs
+ // In a real implementation, you would fetch content based on slug
+ if (
+ ![
+ 'hello-world-again',
+ 'mobile-enhancements',
+ 'monoclonal-antibodies',
+ 'raycast-extension',
+ ].includes(slug)
+ ) {
+ notFound()
+ }
+
+ const postData = getPostData(slug)
+
+ return (
+
+
+
+
+
Changelog
+
+ Development blog about new features, fixes, and updates to Hemolog
+
+
+
+
+ {postData.title}
+
+ {postData.subtitle}
+
+
+
+
+
+ {postData.updateLabel}
+
+
+
+ {postData.content}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+function getPostData(slug: string) {
+ const posts = {
+ 'hello-world-again': {
+ title: 'Hello world...again',
+ subtitle: 'Hemolog is back and better than ever',
+ updateLabel: 'Update #1',
+ postId: 'post-1',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'Hello world... again',
+ image: ['https://hemolog.com/images/insights-example.png'],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ Hemolog is back! After 8 years, I've built a reincarnation of the
+ old iPhone app Hemolog. This time around, it does a bit more than
+ just storing your treatment logs. In this incarnation, Hemolog is
+ now a web app and helps you understand your logs by showing you
+ stats.
+
+
+ The original Hemolog was built with the help of a contract
+ developer. This time around I've designed and built everything from
+ the ground up with the purpose of being the best place to store your
+ treatment data and learn from it.
+
+ >
+ ),
+ },
+ 'mobile-enhancements': {
+ title: 'Mobile enhancements',
+ subtitle: 'Looks great on your desktop and mobile devices!',
+ updateLabel: 'Update #2',
+ postId: 'post-2',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'Mobile enhancements',
+ image: [
+ 'https://hemolog.com/images/changelog/iphone-hemolog-light.png',
+ ],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ I designed Hemolog to be used anywhere. That meant building a web
+ app verses an iPhone, Android, or some hybrid app.
+
+ >
+ ),
+ },
+ 'monoclonal-antibodies': {
+ title: 'A brand new treatment type',
+ subtitle:
+ "It's finally here. Monoclonal antibodies officially can treat hemophilia, giving us a new method of getting our medicine in our body and a whole lot more.",
+ updateLabel: 'Update #3',
+ postId: 'post-3',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'A brand new treatment type',
+ image: ['https://hemolog.com/images/changelog/about-you.png'],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ I never thought I'd say this, but I no longer simply{' '}
+ infuse to treat bleeds. I also{' '}
+ inject .
+
+
+ That might not sound like a huge difference off the bat, but I can
+ assure you it is. Having to find a vein all the time is now a thing
+ of the past, finally we can inject subcutaneously under the skin,
+ like so many other people. I'm so excited for what this means for
+ people with bad or damage veins and kids! It's just lessens the
+ burden so much.
+
+ >
+ ),
+ },
+ 'raycast-extension': {
+ title: 'Log treatments at the speed of light',
+ subtitle:
+ 'A brand new way to log treatments, directly from your keyboard. Now available on Mac and Windows (beta) via Raycast.',
+ updateLabel: 'Update #4',
+ postId: 'post-4',
+ richResults: {
+ '@context': 'https://schema.org',
+ '@type': 'NewsArticle',
+ headline: 'Log treatments at the speed of light',
+ image: ['https://hemolog.com/images/changelog/log-treatment.png'],
+ datePublished: '2020-02-05T08:00:00+08:00',
+ dateModified: '2020-02-05T09:20:00+08:00',
+ },
+ content: (
+ <>
+
+ One of my favorite tools to use on my Mac is{' '}
+
+ Raycast
+
+ . It's a productivity tool that lets you quickly launch apps, search
+ the web, and run commands all from your keyboard.
+
+ >
+ ),
+ },
+ }
+
+ return posts[slug as keyof typeof posts] || posts['hello-world-again']
+}
+
+export default ChangelogPost
diff --git a/src/app/changelog/page.tsx b/src/app/changelog/page.tsx
new file mode 100644
index 0000000..89154bd
--- /dev/null
+++ b/src/app/changelog/page.tsx
@@ -0,0 +1,225 @@
+'use client'
+
+import Image from 'next/image'
+import BlogFooter from '@/components/blog/blogFooter'
+import PostFooter from '@/components/blog/postFooter'
+import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
+
+const Changelog = (): JSX.Element => {
+ return (
+
+
+
+
+
Changelog
+
+ Development blog about new features, fixes, and updates to Hemolog
+
+
+
+
+
+
+ Log treatments at the speed of light
+
+
+ A brand new way to log treatments, directly from your keyboard.
+ Now available on Mac and Windows (beta) via{' '}
+
+ Raycast
+
+ .
+
+
+
+
+ Update #4
+
+
+
+ One of my favorite tools to use on my Mac is{' '}
+
+ Raycast
+
+ . It's a productivity tool that lets you quickly launch apps,
+ search the web, and run commands all from your keyboard.
+
+
+
+
+
+
+
+
+
+ A brand new treatment type
+
+
+ It's finally here. Monoclonal antibodies officially can treat
+ hemophilia, giving us a new method of getting our medicine in our
+ body and a whole lot more.
+
+
+
+
+ Update #3
+
+
+
+ I never thought I'd say this, but I no longer simply{' '}
+ infuse to treat bleeds. I also{' '}
+ inject .
+
+
+ That might not sound like a huge difference off the bat, but I can
+ assure you it is. Having to find a vein all the time is now a
+ thing of the past, finally we can inject subcutaneously under the
+ skin, like so many other people. I'm so excited for what this
+ means for people with bad or damage veins and kids! It's just
+ lessens the burden so much.
+
+
+
+
+
+
+
+
+ Mobile enhancements
+
+ Looks great on your desktop and mobile devices!
+
+
+
+
+ Update #2
+
+
+
+ I designed Hemolog to be used anywhere. That meant building a web
+ app verses an iPhone, Android, or some hybrid app.
+
+
+
+
+
+
+
+ Hello world...again
+
+ Hemolog is back and better than ever
+
+
+
+
+
+ Update #1
+
+
+
+ Hemolog is back! After 8 years, I've built a reincarnation of the
+ old iPhone app Hemolog. This time around, it does a bit more than
+ just storing your treatment logs. In this incarnation, Hemolog is
+ now a web app and helps you understand your logs by giving showing
+ you stats.
+
+
+ The original Hemolog was built with the help of a contract
+ developer. This time around I've designed and built everything
+ from the ground up with the purpose of being the best place to
+ store your treatment data and learn from it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Changelog
diff --git a/src/app/emergency/[alertId]/page.tsx b/src/app/emergency/[alertId]/page.tsx
new file mode 100644
index 0000000..a4edec3
--- /dev/null
+++ b/src/app/emergency/[alertId]/page.tsx
@@ -0,0 +1,103 @@
+'use client'
+
+import Link from 'next/link'
+import { useParams } from 'next/navigation'
+import { useEffect, useState } from 'react'
+import EmergencyInfo from '@/components/emergency/emergencyInfo'
+import Footer from '@/components/shared/footer'
+import { useEmergencyUserQuery } from '@/lib/hooks/useEmergencyUserQuery'
+
+const Emergency = (): JSX.Element => {
+ const [mounted, setMounted] = useState(false)
+ const params = useParams()
+ const alertId = params.alertId as string
+ let isExample = false
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ if (alertId === 'example') {
+ isExample = true
+ }
+
+ const { person, isLoading, isError, error } = useEmergencyUserQuery(
+ isExample ? 'mike29' : alertId
+ )
+
+ // During SSR and initial hydration, show loading state to prevent mismatch
+ const displayLoading = !mounted || isLoading
+
+ return (
+
+ {/* Header */}
+
+ Emergency Info
+
+ Hemolog.com
+
+
+
+ {/* Disclaimer and Important Note */}
+
+
+ This page shows the most recent medical logs for someone with
+ hemophilia.
+ This data is self reported and may not be up-to-date.
+
+
+
+
Important
+
+ If someone has been in an accident, please call{' '}
+
+ 911
+ {' '}
+ immediately.
+
+
+
+
+ {/* Main Content */}
+
+ {displayLoading && (
+
+
+
Loading emergency info
+
+ )}
+
+ {mounted && (isError || error) && (
+
+
Error
+
+ Something went wrong. This could mean that this person no longer
+ has a Hemolog account or the app is broken.
+
+
+ )}
+
+ {mounted && !person && !displayLoading && !isError && (
+
+
Try again
+
+ Nothing could be found at this address. Please make sure the URL
+ matches the link provided on the Hemolog Emergency Card.
+
+
+ )}
+
+ {mounted && person && }
+
+
+
+ )
+}
+
+export default Emergency
diff --git a/src/app/emergency/print/page.tsx b/src/app/emergency/print/page.tsx
new file mode 100644
index 0000000..903b70a
--- /dev/null
+++ b/src/app/emergency/print/page.tsx
@@ -0,0 +1,55 @@
+'use client'
+
+import EmergencyCard from '@/components/home/emergencyCard'
+import Logo from '@/components/shared/logo'
+
+export default function Print(): JSX.Element {
+ // TODO(michael) Could improve this by determining the user on the server side
+ // and redirecting before hitting this page. Similar to how Lee Robinson explains
+ // it here https://www.youtube.com/watch?v=NSR_Y_rm_zU
+
+ return (
+
+
+
+
+
+
+
+
+
+ Print and cut your emergency card
+
+
+ To print, go to File {'>'} Print , or hit Control + P {' '}
+ (Command on Mac).
+
+
+ Keep the card in your wallet or in your car.
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/globals.css b/src/app/globals.css
new file mode 100644
index 0000000..34bdee7
--- /dev/null
+++ b/src/app/globals.css
@@ -0,0 +1,74 @@
+@import "@silk-hq/components/layered-styles";
+/* @import "@silk-hq/components/unlayered-styles" layer(silk); */
+
+@import "tailwindcss";
+
+@theme {
+ --color-primary-50: #fef2f2;
+ --color-primary-100: #fee2e2;
+ --color-primary-200: #fecaca;
+ --color-primary-300: #fca5a5;
+ --color-primary-400: #f87171;
+ --color-primary-500: #ff062c;
+ --color-primary-600: #dc2626;
+ --color-primary-700: #a3051d;
+ --color-primary-800: #991b1b;
+ --color-primary-900: #7f1d1d;
+ --color-primary-950: #450a0a;
+
+ --color-success-50: #f0fdf4;
+ --color-success-100: #dcfce7;
+ --color-success-200: #bbf7d0;
+ --color-success-300: #86efac;
+ --color-success-400: #4ade80;
+ --color-success-500: #48bb78;
+ --color-success-600: #16a34a;
+ --color-success-700: #15803d;
+ --color-success-800: #166534;
+ --color-success-900: #14532d;
+ --color-success-950: #052e16;
+
+ --color-warning-50: #fffbeb;
+ --color-warning-100: #fef3c7;
+ --color-warning-200: #fde68a;
+ --color-warning-300: #fcd34d;
+ --color-warning-400: #fbbf24;
+ --color-warning-500: #0070f3;
+ --color-warning-600: #d97706;
+ --color-warning-700: #0761d1;
+ --color-warning-800: #92400e;
+ --color-warning-900: #78350f;
+ --color-warning-950: #451a03;
+
+ --color-error-50: #fef2f2;
+ --color-error-100: #fee2e2;
+ --color-error-200: #fecaca;
+ --color-error-300: #fca5a5;
+ --color-error-400: #f87171;
+ --color-error-500: #48bb78;
+ --color-error-600: #dc2626;
+ --color-error-700: #b91c1c;
+ --color-error-800: #991b1b;
+ --color-error-900: #7f1d1d;
+ --color-error-950: #450a0a;
+
+ --color-link: #ff062c;
+
+ --font-family-sans:
+ system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
+ "Helvetica Neue", Arial, "Noto Sans", sans-serif;
+ --font-family-mono:
+ "SF Mono", Monaco, Inconsolata, "Roboto Mono", "Source Code Pro",
+ "Droid Sans Mono", "Liberation Mono", Menlo, Courier, monospace;
+
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --shadow-lg:
+ 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --shadow-xl:
+ 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);
+ --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
+ --shadow-none: 0 0 #0000;
+}
diff --git a/src/app/head.tsx b/src/app/head.tsx
new file mode 100644
index 0000000..3ac37f6
--- /dev/null
+++ b/src/app/head.tsx
@@ -0,0 +1,17 @@
+const googleRichResultsSchema = {
+ '@context': 'https://schema.org',
+ '@type': 'Organization',
+ url: 'https://hemolog.com',
+ logo: 'https://hemolog.com/images/hemolog-logo.png',
+}
+
+export default function Head(): JSX.Element {
+ return (
+
+ )
+}
diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx
new file mode 100644
index 0000000..d73d8db
--- /dev/null
+++ b/src/app/home/page.tsx
@@ -0,0 +1,98 @@
+'use client'
+
+import { usePathname } from 'next/navigation'
+import { useEffect } from 'react'
+import FeedbackPage from '@/components/home/feedbackPage'
+
+import Header from '@/components/home/header'
+import HomePage from '@/components/home/homePage'
+import ProfilePage from '@/components/home/profilePage'
+import { Tabs, TabsItem } from '@/components/home/Tabs'
+import Footer from '@/components/shared/footer'
+import { withAuth } from '@/components/shared/withAuth'
+import { ProtectRoute, useAuth } from '@/lib/auth'
+import { track } from '@/lib/helpers'
+
+const Home = (): JSX.Element => {
+ // TODO(michael) add welcome message by checking to see if this is the users
+ // first time logging in. Still not sure how to accomplish this.
+ //
+ // const [toasts, setToast] = useToasts()
+
+ // // displays welcome message on first login
+ // useEffect(() => {
+ // if (user && !toasts.length) {
+ // setToast({
+ // text: '👋 Welcome to Hemolog 2!',
+ // delay: 12000,
+ // type: 'success',
+ // actions: [
+ // {
+ // name: 'thanks',
+ // passive: true,
+ // handler: (_event, cancel) => cancel(),
+ // },
+ // ],
+ // })
+ // }
+ // }, [user])
+
+ // TODO(michael): Could improve this by determining the user on the server side
+ // and redirecting before hitting this page. Similar to how Lee Robinson explains
+ // it here https://www.youtube.com/watch?v=NSR_Y_rm_zU
+
+ const { user } = useAuth()
+ const pathname = usePathname()
+ const version = process.env.npm_package_version
+
+ useEffect(() => {
+ if (user) {
+ track('Logged In', {
+ uid: user.uid,
+ email: user.email,
+ appVersion: version,
+ })
+ }
+ }, [user, version])
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+ */}
+
+ {user?.isAdmin && (
+
+
+
+ )}
+
+
+
+
+
+ )
+}
+
+export default withAuth(Home)
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..3882bef
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,75 @@
+'use client'
+
+import { Nanum_Pen_Script } from 'next/font/google'
+import { Providers } from './providers'
+import './globals.css'
+
+const nanumPenScript = Nanum_Pen_Script({
+ weight: '400',
+ subsets: ['latin'],
+ display: 'swap',
+ variable: '--font-nanum-pen-script',
+})
+
+// export const metadata: Metadata = {
+// title: 'Hemolog',
+// description:
+// 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.',
+// openGraph: {
+// url: 'https://hemolog.com',
+// type: 'website',
+// title: 'Hemolog 2',
+// description:
+// 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.',
+// images: [
+// {
+// url: 'https://hemolog.com/images/og-image.png',
+// },
+// ],
+// },
+// twitter: {
+// card: 'summary_large_image',
+// title: 'Hemolog 2',
+// description:
+// 'Back and better than ever! Hemolog 2 provides real-time insights on your hemophilia treatment regimen for free.',
+// images: [
+// {
+// url: 'https://hemolog.com/images/og-image.png',
+// },
+// ],
+// },
+// icons: {
+// apple: '/images/apple-touch-icon.png',
+// icon: [
+// {
+// url: '/images/favicon-32x32.png',
+// sizes: '32x32',
+// type: 'image/png',
+// },
+// {
+// url: '/images/favicon-16x16.png',
+// sizes: '16x16',
+// type: 'image/png',
+// },
+// ],
+// },
+// manifest: '/manifest.json',
+// other: {
+// 'mobile-web-app-capable': 'yes',
+// 'apple-mobile-web-app-capable': 'yes',
+// },
+// }
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode
+}) {
+ return (
+
+
+ {children}
+
+
+ )
+}
diff --git a/pages/404.tsx b/src/app/not-found.tsx
similarity index 66%
rename from pages/404.tsx
rename to src/app/not-found.tsx
index d03fd74..5056c81 100644
--- a/pages/404.tsx
+++ b/src/app/not-found.tsx
@@ -1,8 +1,10 @@
+'use client'
+
+import { useRouter } from 'next/navigation'
import { useEffect } from 'react'
-import { useRouter } from 'next/router'
-import { withAuth } from 'components/withAuth'
-import { useAuth } from 'lib/auth'
-import LoadingScreen from 'components/loadingScreen'
+import LoadingScreen from '@/components/shared/loadingScreen'
+import { withAuth } from '@/components/shared/withAuth'
+import { useAuth } from '@/lib/auth'
function Custom404(): JSX.Element {
const router = useRouter()
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..168281a
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,57 @@
+import Image from 'next/image'
+import Link from 'next/link'
+import DescriptionCards from '@/components/landing/descriptionCards'
+import Footer from '@/components/shared/footer'
+import StaticHeader from '@/components/shared/staticHeader'
+
+export default function Landing(): JSX.Element {
+ return (
+
+
+
+ {/* Background illustration */}
+
+
+
+
+ {/* Content */}
+
+
+ TREATMENT INSIGHTS
+ THAT MATTER
+
+
+ The last treatment log you'll ever need.
+
+
+
+
+ Log your treatments and get fantastic insights that help you
+ change your habits.
+
+ Sign up for free and start using the newest version of Hemolog
+ today!
+
+
+
+ Learn more about the Hemolog story...
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/app/providers.tsx b/src/app/providers.tsx
new file mode 100644
index 0000000..73de5a5
--- /dev/null
+++ b/src/app/providers.tsx
@@ -0,0 +1,61 @@
+'use client'
+
+import React, { useEffect } from 'react'
+import { Toaster } from 'react-hot-toast'
+import { AuthProvider } from '@/lib/auth'
+import { ThemeProvider } from '@/lib/contexts/ThemeContext'
+import { QueryProvider } from '@/lib/providers/query-provider'
+import { SheetProvider } from '@/lib/providers/sheet-provider'
+
+class AgentErrorBoundary extends React.Component<
+ { children: React.ReactNode },
+ { hasError: boolean }
+> {
+ state = { hasError: false }
+
+ static getDerivedStateFromError() {
+ return { hasError: true }
+ }
+
+ componentDidCatch(_error: unknown) {
+ // Error logged by React error boundary
+ }
+
+ render() {
+ if (this.state.hasError) {
+ return (
+
+
+ Something went wrong
+
+
Refresh the page to recover.
+
+ )
+ }
+ return this.props.children
+ }
+}
+
+export function Providers({ children }: { children: React.ReactNode }) {
+ useEffect(() => {
+ document.body.setAttribute('data-hydrated', 'true')
+ }, [])
+
+ return (
+
+
+
+
+
+ {children}
+
+
+
+
+ )
+}
diff --git a/src/app/signin/page.tsx b/src/app/signin/page.tsx
new file mode 100644
index 0000000..25e595f
--- /dev/null
+++ b/src/app/signin/page.tsx
@@ -0,0 +1,104 @@
+'use client'
+
+import { useRouter } from 'next/navigation'
+import { useEffect } from 'react'
+import Footer from '@/components/shared/footer'
+import LoadingScreen from '@/components/shared/loadingScreen'
+import Logo from '@/components/shared/logo'
+import { withAuth } from '@/components/shared/withAuth'
+import { useAuth } from '@/lib/auth'
+
+const Signin = () => {
+ const auth = useAuth()
+ const router = useRouter()
+ const version = process.env.npm_package_version
+
+ // Redirect authenticated users to home
+ useEffect(() => {
+ if (auth.user && !auth.loading) {
+ router.replace('/home')
+ }
+ }, [auth.user, auth.loading, router])
+
+ // Show loading while checking auth state or redirecting
+ if (auth.loading || auth.user) {
+ return
+ }
+
+ return (
+
+
+
+
+
+
Important
+
+ Hemolog is currently in development. Data integrity is not
+ guaranteed. Hemolog is{' '}
+
+ not
+ {' '}
+ HIPAA compliant... yada yada yada.
+
+
+
+
+
+
Register or sign in
+
+ Signing in will create an account if you don't have one yet. Don't
+ worry, Hemolog will always be free .
+
+
+
+ {!process.env.NEXT_PUBLIC_USE_EMULATORS && (
+
auth.signinWithGoogle?.('/home')}
+ disabled={auth.loading}
+ className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2'
+ >
+ {auth.loading && (
+
+ )}
+ Continue with Google
+
+ )}
+ {process.env.NEXT_PUBLIC_USE_EMULATORS && (
+
auth.signinWithTestUser?.()}
+ disabled={auth.loading}
+ className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2'
+ >
+ {auth.loading && (
+
+ )}
+ Continue with Test User
+
+ )}
+
+
+
+
+ {/*
+
+
*/}
+
+
+
+
+ )
+}
+
+export default withAuth(Signin)
diff --git a/src/components/blog/blogFooter.tsx b/src/components/blog/blogFooter.tsx
new file mode 100644
index 0000000..0978948
--- /dev/null
+++ b/src/components/blog/blogFooter.tsx
@@ -0,0 +1,61 @@
+'use client'
+
+import Image from 'next/image'
+import { useRouter } from 'next/navigation'
+import { useEffect, useState } from 'react'
+
+import { useAuth } from '@/lib/auth'
+
+export default function BlogFooter(): JSX.Element {
+ const { user, loading } = useAuth()
+ const router = useRouter()
+ const [mounted, setMounted] = useState(false)
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ // Use consistent state during SSR and initial hydration
+ const isLoading = !mounted || loading
+ const showUserContent = mounted && !loading && user
+
+ return (
+
+
+
+ Designed and developed by Michael Schultz in Oakland, California.
+
+ {showUserContent ? (
+
+ Thanks for being part of the Hemolog community!
+
+ ) : (
+ <>
+
Start using Hemolog for free.
+
router.push('/signin')}
+ disabled={isLoading}
+ className='px-4 py-2 bg-green-100 hover:bg-green-200 disabled:opacity-50 disabled:cursor-not-allowed text-green-800 rounded-lg font-medium transition-colors flex items-center gap-2 w-fit'
+ >
+ {isLoading && (
+
+ )}
+ Register
+
+ >
+ )}
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/blog/postFooter.tsx b/src/components/blog/postFooter.tsx
new file mode 100644
index 0000000..f7806dd
--- /dev/null
+++ b/src/components/blog/postFooter.tsx
@@ -0,0 +1,53 @@
+'use client'
+
+import { IconShare } from '@tabler/icons-react'
+import toast from 'react-hot-toast'
+import { CONFIG } from '@/lib/helpers'
+
+export default function PostFooter({ postId }: { postId: string }) {
+ const handleCopy = async (postId: string) => {
+ try {
+ await navigator.clipboard.writeText(
+ `https://hemolog.com/changelog#${postId}`
+ )
+ toast.success('Link copied!')
+ } catch (err) {
+ console.error('Failed to copy link:', err)
+ toast.error('Failed to copy link')
+ }
+ }
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ handleCopy(postId)}
+ />
+
+
+
+
+ >
+ )
+}
diff --git a/src/components/emergency/emergencyInfo.tsx b/src/components/emergency/emergencyInfo.tsx
new file mode 100644
index 0000000..f991d80
--- /dev/null
+++ b/src/components/emergency/emergencyInfo.tsx
@@ -0,0 +1,140 @@
+import React from 'react'
+import TreatmentTable from '@/components/home/treatmentTable'
+import { useAuth } from '@/lib/auth'
+import type { Person } from '@/lib/types/person'
+
+interface Props {
+ person: Person
+}
+
+export default function EmergencyInfo(props: Props): JSX.Element {
+ const { person } = props
+ const { user } = useAuth()
+ const [smallerThanSmall, setSmallerThanSmall] = React.useState(false)
+
+ React.useEffect(() => {
+ const checkMobile = () => {
+ setSmallerThanSmall(window.innerWidth < 640) // Tailwind's sm breakpoint
+ }
+
+ checkMobile()
+ window.addEventListener('resize', checkMobile)
+ return () => window.removeEventListener('resize', checkMobile)
+ }, [])
+
+ if (person) {
+ return (
+ <>
+
+ {person.photoUrl ? (
+
+ ) : (
+
+ {person.name?.charAt(0) || '?'}
+
+ )}
+
+
+
{person.name}
+
+ {person.severity} Hemophilia {person.hemophiliaType}, treat with
+ factor {person.factor}
+
+
+
+
+
+
+
Most recent treatments
+
+ {smallerThanSmall && 'Swipe →'}
+
+
+ {person.uid ? (
+
+ ) : (
+
+
Warning
+
+ User ID is missing. Treatment data cannot be loaded.
+
+
+ )}
+
+
+
Note
+
+ Pay attention to the date on each of these logs. We're only showing
+ you the 3 most recent logs. If
+ you want to see more,{' '}
+ {person.name?.split(' ')[0]} will
+ have to give you permission.
+
+
+
+
+
+ {user && (
+ <>
+
+ Emergency contacts (coming soon)
+
+
+ Soon you'll be able to add these from your settings page.
+
+ >
+ )}
+
+ {/* NOTE(michael) remember when you implement this that you remember
+ to update the example logic on /emergency/alertId as to not
+ leak my actual emergency contact's info */}
+
+ {/*
+
+
+
+ Jenifer Schultz
+ (location.href = 'tel:555-555-5555')}
+ >
+ Call
+
+
+ 555-555-5555
+
+
+
+
+
+ Mike Schultz
+ (location.href = 'tel:555-555-5555')}
+ >
+ Call
+
+
+ 555-555-5555
+
+
+ */}
+ >
+ )
+ }
+
+ return (
+
+
Error
+
+ This person's information could not be found.
+
+
+ )
+}
diff --git a/src/components/home/Tabs.tsx b/src/components/home/Tabs.tsx
new file mode 100644
index 0000000..697c6ae
--- /dev/null
+++ b/src/components/home/Tabs.tsx
@@ -0,0 +1,108 @@
+import React, { useState } from 'react'
+
+export interface TabsProps {
+ initialValue?: string
+ value?: string
+ onChange?: (value: string) => void
+ children: React.ReactNode
+ className?: string
+}
+
+export interface TabsItemProps {
+ label: string
+ value: string
+ children: React.ReactNode
+}
+
+export function TabsItem({ children }: TabsItemProps): JSX.Element {
+ return <>{children}>
+}
+
+export function Tabs({
+ initialValue,
+ value,
+ onChange,
+ children,
+ className = '',
+}: TabsProps): JSX.Element {
+ const [activeTab, setActiveTab] = useState(initialValue || '')
+
+ const currentValue = value !== undefined ? value : activeTab
+
+ const handleTabChange = (newValue: string): void => {
+ if (value === undefined) {
+ setActiveTab(newValue)
+ }
+ if (onChange) {
+ onChange(newValue)
+ }
+ }
+
+ const tabItems: {
+ label: string
+ value: string
+ children: React.ReactNode
+ }[] = []
+
+ React.Children.forEach(children, (child) => {
+ if (React.isValidElement(child) && child.type === TabsItem) {
+ const {
+ label,
+ value: tabValue,
+ children: tabChildren,
+ } = child.props as TabsItemProps
+ tabItems.push({ label, value: tabValue, children: tabChildren })
+ }
+ })
+
+ const activeTabContent = tabItems.find(
+ (item) => item.value === currentValue
+ )?.children
+
+ return (
+ <>
+
+
+ {tabItems.map((item) => {
+ const isActive = item.value === currentValue
+
+ return (
+ handleTabChange(item.value)}
+ className={`
+ whitespace-nowrap py-2 px-1 border-b-2 font-medium text-sm transition-colors cursor-pointer
+ ${
+ isActive
+ ? 'border-primary-500 text-primary-600 dark:text-primary-400'
+ : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300'
+ }
+ `}
+ role='tab'
+ aria-selected={isActive}
+ type='button'
+ >
+ {item.label}
+
+ )
+ })}
+
+
+ {activeTabContent}
+ >
+ )
+}
+
+export interface TabsContentProps {
+ children: React.ReactNode
+ className?: string
+}
+
+export function TabsContent({
+ children,
+ className = '',
+}: TabsContentProps): JSX.Element {
+ return {children}
+}
diff --git a/src/components/home/actionMenu.tsx b/src/components/home/actionMenu.tsx
new file mode 100644
index 0000000..6270176
--- /dev/null
+++ b/src/components/home/actionMenu.tsx
@@ -0,0 +1,127 @@
+'use client'
+
+import { IconDots } from '@tabler/icons-react'
+import { useEffect, useRef, useState } from 'react'
+import { createPortal } from 'react-dom'
+import type { TreatmentType } from '@/lib/db/treatments'
+
+interface ActionMenuProps {
+ treatment: TreatmentType
+ onEdit: (treatment: TreatmentType) => void
+ onDelete: (uid: string) => void
+}
+
+export default function ActionMenu({
+ treatment,
+ onEdit,
+ onDelete,
+}: ActionMenuProps) {
+ const [isOpen, setIsOpen] = useState(false)
+ const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 })
+ const buttonRef = useRef(null)
+ const menuRef = useRef(null)
+ const [mounted, setMounted] = useState(false)
+
+ // Track if component is mounted (for portal)
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ // Calculate menu position when opening
+ useEffect(() => {
+ if (isOpen && buttonRef.current) {
+ const rect = buttonRef.current.getBoundingClientRect()
+ setMenuPosition({
+ top: rect.bottom + 4,
+ left: rect.right - 128, // 128px = w-32 menu width
+ })
+ }
+ }, [isOpen])
+
+ // Close menu when clicking outside
+ useEffect(() => {
+ if (!isOpen) return
+
+ const handleClickOutside = (e: MouseEvent) => {
+ const target = e.target as Node
+ if (
+ menuRef.current &&
+ !menuRef.current.contains(target) &&
+ buttonRef.current &&
+ !buttonRef.current.contains(target)
+ ) {
+ setIsOpen(false)
+ }
+ }
+
+ // Close on scroll to prevent menu from floating away
+ const handleScroll = () => setIsOpen(false)
+
+ document.addEventListener('mousedown', handleClickOutside)
+ window.addEventListener('scroll', handleScroll, true)
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside)
+ window.removeEventListener('scroll', handleScroll, true)
+ }
+ }, [isOpen])
+
+ const handleEdit = () => {
+ setIsOpen(false)
+ // Trigger edit immediately; click handlers will stop propagation.
+ onEdit(treatment)
+ }
+
+ const handleDelete = () => {
+ setIsOpen(false)
+ if (treatment.uid) {
+ onDelete(treatment.uid)
+ }
+ }
+
+ const menu =
+ isOpen && mounted ? (
+
+ {
+ e.preventDefault()
+ e.stopPropagation()
+ handleEdit()
+ }}
+ >
+ Update
+
+ {
+ e.preventDefault()
+ e.stopPropagation()
+ handleDelete()
+ }}
+ >
+ Delete
+
+
+ ) : null
+
+ return (
+ <>
+ setIsOpen(!isOpen)}
+ >
+
+
+
+ {menu && createPortal(menu, document.body)}
+ >
+ )
+}
diff --git a/src/components/home/chart.tsx b/src/components/home/chart.tsx
new file mode 100644
index 0000000..2c2aac0
--- /dev/null
+++ b/src/components/home/chart.tsx
@@ -0,0 +1,122 @@
+import {
+ Bar,
+ BarChart,
+ CartesianGrid,
+ ResponsiveContainer,
+ XAxis,
+ YAxis,
+} from 'recharts'
+import { TreatmentTypeEnum } from '@/lib/db/treatments'
+import { filterTreatments } from '@/lib/helpers'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
+
+type ChartDataEntry = {
+ month: string
+ bleed: number
+ preventative: number
+ prophy: number
+ antibody: number
+}
+
+interface ChartProps {
+ filterYear: string
+}
+
+export default function Chart(props: ChartProps): JSX.Element | null {
+ const { filterYear } = props
+ const { data } = useTreatmentsQuery()
+
+ if (!data) {
+ return null
+ }
+
+ const filteredTreatments = filterTreatments(data, filterYear)
+
+ const bleeds = filteredTreatments
+ .filter((entry) => entry.type === TreatmentTypeEnum.BLEED)
+ .map((bleed) => bleed.date)
+
+ const preventative = filteredTreatments
+ .filter((entry) => entry.type === TreatmentTypeEnum.PREVENTATIVE)
+ .map((preventitive) => preventitive.date)
+
+ const prophy = filteredTreatments
+ .filter((entry) => entry.type === TreatmentTypeEnum.PROPHY)
+ .map((prophy) => prophy.date)
+
+ const antibody = filteredTreatments
+ .filter((entry) => entry.type === TreatmentTypeEnum.ANTIBODY)
+ .map((antibody) => antibody.date)
+
+ const monthNames = [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ]
+
+ // Initialize chart data with all months
+ const chartData: ChartDataEntry[] = monthNames.map((month) => ({
+ month,
+ bleed: 0,
+ preventative: 0,
+ prophy: 0,
+ antibody: 0,
+ }))
+
+ // Distribute treatments into months
+ type NumericChartKeys = 'bleed' | 'preventative' | 'prophy' | 'antibody'
+ const distributeTreatments = (
+ treatments: string[],
+ type: NumericChartKeys
+ ) => {
+ for (const treatment of treatments) {
+ // Extract month from YYYY-MM-DD format (zero-based index)
+ const monthIndex = Number.parseInt(treatment.split('-')[1], 10) - 1
+ if (monthIndex >= 0 && monthIndex < 12) {
+ chartData[monthIndex][type] = chartData[monthIndex][type] + 1
+ }
+ }
+ }
+
+ distributeTreatments(bleeds, 'bleed')
+ distributeTreatments(preventative, 'preventative')
+ distributeTreatments(prophy, 'prophy')
+ distributeTreatments(antibody, 'antibody')
+
+ // Calculate max Y value for proper scaling
+ const maxY = Math.max(
+ ...chartData.map(
+ (entry) =>
+ entry.bleed + entry.preventative + entry.prophy + entry.antibody
+ ),
+ 1
+ )
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/home/emergencyCard.tsx b/src/components/home/emergencyCard.tsx
new file mode 100644
index 0000000..bce2124
--- /dev/null
+++ b/src/components/home/emergencyCard.tsx
@@ -0,0 +1,140 @@
+'use client'
+import Link from 'next/link'
+import React from 'react'
+import QRCode from 'react-qr-code'
+
+import { useAuth } from '@/lib/auth'
+import { useUserQuery } from '@/lib/hooks/useUserQuery'
+
+interface Props {
+ forPrint?: boolean
+}
+
+export default function EmergencyCard({ forPrint }: Props): JSX.Element {
+ const { user } = useAuth()
+ const { person } = useUserQuery(user?.uid)
+
+ // Check if we're on mobile - use a simple approach for now
+ const [isMobile, setIsMobile] = React.useState(false)
+
+ React.useEffect(() => {
+ const checkMobile = () => {
+ setIsMobile(window.innerWidth < 640) // Tailwind's sm breakpoint
+ }
+
+ checkMobile()
+ window.addEventListener('resize', checkMobile)
+ return () => window.removeEventListener('resize', checkMobile)
+ }, [])
+
+ if (isMobile) {
+ forPrint = true
+ }
+
+ const alertUrl = `hemolog.com/emergency/${person?.alertId}`
+
+ return (
+
+
+
+
+
+ Bleeding disorder
+
+
+ Emergency
+
+
+
+ {user?.photoUrl && (
+
+
+
+ )}
+
+
+
+
+
+
+ {person ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {person ? (
+
+
+ {person?.name}
+
+
+ {person?.severity} Hemophilia {person?.hemophiliaType}
+
+ {person?.factor && (
+
+ Treat with factor {person.factor}
+
+ )}
+
+
+ Scan or visit for treatment history
+
+
+
+
{alertUrl}
+
+
+ Visit your page to preview what others will see.
+
+
+
+
+ ) : (
+
+ )}
+
+
+
+ )
+}
diff --git a/src/components/home/feedbackModal.tsx b/src/components/home/feedbackModal.tsx
new file mode 100644
index 0000000..a4e2287
--- /dev/null
+++ b/src/components/home/feedbackModal.tsx
@@ -0,0 +1,142 @@
+import { Sheet } from '@silk-hq/components'
+import { useFormik } from 'formik'
+import toast from 'react-hot-toast'
+
+import { useAuth } from '@/lib/auth'
+import { createFeedback, type FeedbackType } from '@/lib/db/feedback'
+import type { AttachedUserType } from '@/lib/types/users'
+
+interface FeedbackValues {
+ message: string
+}
+
+interface FeedbackModalProps {
+ visible: boolean
+ setVisible: (flag: boolean) => void
+ bindings: Record
+}
+
+export default function FeedbackModal(
+ props: FeedbackModalProps
+): JSX.Element | null {
+ const { visible, setVisible } = props
+ const { user } = useAuth()
+
+ const handleCreateFeedback = async (feedback: FeedbackValues) => {
+ const feedbackUser: AttachedUserType = {
+ email: user?.email || '',
+ name: user?.name || '',
+ photoUrl: user?.photoUrl || '',
+ uid: user?.uid || '',
+ }
+
+ const feedbackPayload: FeedbackType = {
+ ...feedback,
+ createdAt: new Date().toISOString(),
+ user: feedbackUser,
+ }
+
+ createFeedback(feedbackPayload)
+ .then(() => {
+ toast.success("Feedback submitted! We'll respond soon via email.")
+ closeModal()
+ })
+ .catch((error: unknown) =>
+ toast.error(
+ `Something went wrong: ${error instanceof Error ? error.message : String(error)}`
+ )
+ )
+ }
+
+ const closeModal = () => {
+ setVisible(false)
+ formik.resetForm()
+ }
+
+ const formik = useFormik({
+ initialValues: {
+ message: '',
+ },
+ onSubmit: async (values) => {
+ await handleCreateFeedback(values)
+ },
+ })
+
+ if (!visible) {
+ return null
+ }
+
+ return (
+
+
+
+
+
Feedback
+
Hemolog.com
+
+
+
+ If you've run into a bug or have an idea for how Hemolog could
+ work better for you, let me know.
+
+
+
+
+
+
+
+
closeModal()}
+ className='px-4 py-2 text-gray-600 hover:text-gray-800 transition-colors'
+ >
+ Cancel
+
+
+ {formik.isSubmitting && (
+
+ )}
+ Send feedback
+
+
+
+
+
+ )
+}
diff --git a/src/components/home/feedbackPage.tsx b/src/components/home/feedbackPage.tsx
new file mode 100644
index 0000000..9e18291
--- /dev/null
+++ b/src/components/home/feedbackPage.tsx
@@ -0,0 +1,86 @@
+'use client'
+
+import { useQuery } from '@tanstack/react-query'
+import { format } from 'date-fns'
+import LoadingScreen from '@/components/shared/loadingScreen'
+import { useAuth } from '@/lib/auth'
+import type { FeedbackType } from '@/lib/db/feedback'
+
+const handleReplyClick = (email: string) => {
+ window.location.assign(
+ `mailto:${email}?subject=Thanks for your feedback on Hemolog!`
+ )
+}
+
+async function fetchFeedback(token: string): Promise {
+ const response = await fetch('/api/feedback', {
+ headers: { token },
+ })
+ if (!response.ok) {
+ throw new Error('Failed to fetch feedback')
+ }
+ return response.json()
+}
+
+const FeedbackPage = () => {
+ const { user } = useAuth()
+ const { data, isLoading, isError } = useQuery({
+ queryKey: ['feedback'],
+ queryFn: () => fetchFeedback(user?.token || ''),
+ enabled: !!user?.isAdmin && !!user?.token,
+ })
+
+ if (isError) {
+ console.error({ message: 'Feedback API failed' })
+ return No data found
+ }
+
+ if (isLoading || !data) {
+ return
+ }
+
+ return (
+
+ {data.map((feedback, index) => (
+
+
{feedback?.user?.name}
+
{feedback?.message}
+
+
+
+ {feedback?.user?.photoUrl ? (
+
+ ) : (
+
+ {feedback?.user?.name?.charAt(0) || '?'}
+
+ )}
+
+ {format(new Date(feedback?.createdAt), 'PPp')}
+
+
+
handleReplyClick(feedback?.user?.email || '')}
+ className='px-3 py-1.5 bg-gray-100 hover:bg-gray-200 text-gray-700 rounded text-sm font-medium transition-colors'
+ >
+ Reply
+
+
+
+ ))}
+
+ )
+}
+
+export default FeedbackPage
diff --git a/src/components/home/header.tsx b/src/components/home/header.tsx
new file mode 100644
index 0000000..7c047ba
--- /dev/null
+++ b/src/components/home/header.tsx
@@ -0,0 +1,117 @@
+'use client'
+
+import React from 'react'
+import Logo from '@/components/shared/logo'
+import { useAuth } from '@/lib/auth'
+import { useTreatmentSheet } from '@/lib/hooks/useTreatmentSheet'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
+
+interface Props {
+ version?: string
+}
+
+const Header = (props: Props): JSX.Element | null => {
+ const { version } = props
+ const { user, signout } = useAuth()
+ const { data: treatments } = useTreatmentsQuery()
+ const { openTreatmentSheet } = useTreatmentSheet()
+
+ const [dropdownOpen, setDropdownOpen] = React.useState(false)
+
+ const handleOpenSheet = () => {
+ openTreatmentSheet({
+ mode: 'create',
+ previousTreatment: treatments?.[0],
+ })
+ }
+
+ // Close dropdown when clicking outside
+ React.useEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ const target = event.target as Element
+ if (!target.closest('.dropdown-container')) {
+ setDropdownOpen(false)
+ }
+ }
+
+ if (dropdownOpen) {
+ document.addEventListener('mousedown', handleClickOutside)
+ return () => document.removeEventListener('mousedown', handleClickOutside)
+ }
+ }, [dropdownOpen])
+
+ if (user) {
+ const avatarInitial = user.name?.charAt(0) || user.email?.charAt(0) || '?'
+
+ return (
+ <>
+
+
+
+
+ New treatment
+
+
+
setDropdownOpen(!dropdownOpen)}
+ className='flex items-center justify-center w-8 h-8 rounded-full bg-gray-200 hover:bg-gray-300 transition-colors'
+ >
+ {user.photoUrl ? (
+
+ ) : (
+
+ {avatarInitial}
+
+ )}
+
+ {dropdownOpen && (
+
+
+
+ Hemolog v{version}
+
+
+ Latest updates
+
+
+
{
+ void signout?.()
+ setDropdownOpen(false)
+ }}
+ className='block w-full text-left px-4 py-2 text-sm text-red-600 hover:bg-gray-50'
+ >
+ Sign out
+
+
+ )}
+
+
+
+
+
+ >
+ )
+ }
+
+ return null
+}
+
+export default Header
diff --git a/src/components/home/homePage.tsx b/src/components/home/homePage.tsx
new file mode 100644
index 0000000..e5969ac
--- /dev/null
+++ b/src/components/home/homePage.tsx
@@ -0,0 +1,143 @@
+'use client'
+
+import { IconFilter } from '@tabler/icons-react'
+import { getYear } from 'date-fns'
+import dynamic from 'next/dynamic'
+import React, { useState } from 'react'
+import Stats from '@/components/home/stats'
+import TreatmentTable from '@/components/home/treatmentTable'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
+
+// Lazy load Chart component (includes recharts) - only loads when needed
+const Chart = dynamic(() => import('@/components/home/chart'), {
+ ssr: false,
+})
+
+const HomePage = (): JSX.Element => {
+ const [smallerThanSmall, setSmallerThanSmall] = useState(false)
+
+ React.useEffect(() => {
+ const checkMobile = () => {
+ setSmallerThanSmall(window.innerWidth < 640) // Tailwind's sm breakpoint
+ }
+
+ checkMobile()
+ window.addEventListener('resize', checkMobile)
+ return () => window.removeEventListener('resize', checkMobile)
+ }, [])
+
+ const { data } = useTreatmentsQuery()
+
+ const treatmentYears = data
+ ? data
+ .filter((d) => d?.date)
+ .map((d) => getYear(new Date(d.date)))
+ .filter((item, index, arr) => arr.indexOf(item) === index)
+ .sort((a, b) => b - a)
+ : []
+
+ // TODO(michaelwschultz): enable once Firebase caching is removed
+ // const { user } = useAuth()
+ // const { person } = useDbUser(user?.uid || '')
+
+ // const [showWelcome, setShowWelcome] = useState(false)
+
+ // useEffect(() => {
+ // if (person) {
+ // if (
+ // person.factor &&
+ // person.hemophiliaType &&
+ // person.medication &&
+ // person.severity
+ // ) {
+ // return setShowWelcome(false)
+ // }
+ // return setShowWelcome(true)
+ // }
+ // }, [person])
+
+ // const welcomeHero = () => {
+ // return (
+ //
+ // Getting started with Hemolog
+ //
+ // Fill in how you're affected to get the most accurate stats and a
+ // custom alert card. You can update these at anytime using the profile
+ // tab. If you're medication or type of hemophilia doesn't show up in the
+ // list, feel free to write it in.
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ // )
+ // }
+
+ const ALL_TIME = 'All time'
+ const THIS_YEAR = new Date().getFullYear().toString()
+ const [filterYear, setFilterYear] = useState(THIS_YEAR)
+
+ return (
+ <>
+ {/* TODO(michaelwschultz): enable once firebase caching is removed */}
+ {/* {showWelcome && (
+ <>
+ {welcomeHero()}
+
+ >
+ )} */}
+
+
+
Insights
+
+
+ setFilterYear(e.target.value)}
+ >
+ {ALL_TIME}
+ {!treatmentYears.includes(Number.parseInt(THIS_YEAR, 10)) && (
+
+ {THIS_YEAR}
+
+ )}
+ {treatmentYears.map((year) => (
+
+ {year}
+
+ ))}
+
+
+
+
+
+
+ Annual overview ({filterYear})
+
+ Treatments are stacked by type (bleed, preventative, or prophy)
+
+
+
+
+
+
Treatments
+
+ {smallerThanSmall && 'Swipe →'}
+
+
+
+ >
+ )
+}
+
+export default HomePage
diff --git a/src/components/home/profilePage.tsx b/src/components/home/profilePage.tsx
new file mode 100644
index 0000000..f7cb95b
--- /dev/null
+++ b/src/components/home/profilePage.tsx
@@ -0,0 +1,184 @@
+'use client'
+
+import { useRouter } from 'next/navigation'
+import { useCallback, useEffect, useState } from 'react'
+import toast from 'react-hot-toast'
+import EmergencyCard from '@/components/home/emergencyCard'
+import SettingsForm from '@/components/home/settingsForm'
+import EmergencySnippet from '@/components/shared/emergencySnippet'
+import { useAuth } from '@/lib/auth'
+import { generateUniqueString, track } from '@/lib/helpers'
+import { useUserMutations } from '@/lib/hooks/useUserMutations'
+import { useUserQuery } from '@/lib/hooks/useUserQuery'
+
+const ProfilePage = (): JSX.Element => {
+ const { user, signout } = useAuth()
+ const { person } = useUserQuery(user?.uid)
+ const { updateUser } = useUserMutations()
+ const router = useRouter()
+ const [deleteModalVisible, setDeleteModalVisible] = useState(false)
+ const [isDeletingAccount, setIsDeletingAccount] = useState(false)
+
+ useEffect(() => {
+ track('Viewed Profile Page', {})
+ }, [])
+
+ const handleOnPrintClick = () => {
+ track('Clicked Print Button', { page: '/profile' })
+ router.push('/emergency/print')
+ }
+
+ const handleUpdateUserApiKey = useCallback(async () => {
+ if (!user?.uid) return
+ const newApiKey = await generateUniqueString(20)
+ updateUser({ uid: user.uid, userData: { apiKey: newApiKey } })
+ }, [user?.uid, updateUser])
+
+ // Only create API key once when person is loaded and doesn't have one
+ useEffect(() => {
+ if (person && !person.apiKey && user?.uid) {
+ handleUpdateUserApiKey()
+ }
+ }, [person, person?.apiKey, user?.uid, handleUpdateUserApiKey])
+
+ const handleDeleteAccount = async () => {
+ if (!user?.token) {
+ toast.error('Unable to delete account. Please sign in again and retry.')
+ return
+ }
+
+ try {
+ setIsDeletingAccount(true)
+ track('Confirmed Delete Account', {})
+ const response = await fetch('/api/delete-account', {
+ method: 'DELETE',
+ headers: {
+ token: user.token,
+ },
+ })
+
+ if (!response.ok) {
+ const errorMessage = await response.text()
+ throw new Error(errorMessage || 'Unable to delete account.')
+ }
+
+ toast.success(
+ 'Your account has been deleted. Thank you for trying Hemolog.'
+ )
+ setDeleteModalVisible(false)
+ await signout?.()
+ } catch (error: unknown) {
+ const errorMessage =
+ error instanceof Error
+ ? error.message
+ : 'Failed to delete account. Please try again.'
+ toast.error(errorMessage)
+ } finally {
+ setIsDeletingAccount(false)
+ }
+ }
+
+ return (
+
+
+
About you
+
+
+
+
API key
+
+
+ {person?.apiKey || ' '}
+
+
+ Reset key
+
+
+
+ Used to access the (limited) Hemolog API. No documentation exists yet
+ but you can find more info inside the readme on Github.
+
+
+
+
+
In case of emergency
+
+ A medical worker can simply type in the URL listed on the card, or
+ easier scan the QR code with their phone. This gives the worker a
+ quick summary of all your info including your 3 most recent logs, and
+ emergency contacts. These features aren't available with Medic Alert.
+
+
+
+
+
+
+ Print your card
+
+
+
+
+
+
+
Delete account
+
+ Deleting your account removes your profile, treatments, and emergency
+ info forever. This action cannot be undone.
+
+
+
{
+ track('Opened Delete Account Modal', {})
+ setDeleteModalVisible(true)
+ }}
+ className='px-4 py-2 bg-red-600 hover:bg-red-700 text-white rounded-lg font-medium transition-colors w-fit'
+ >
+ Delete account
+
+
+
+ {deleteModalVisible && (
+
+
+
Delete your account?
+
+ This permanently deletes your Hemolog data and cannot be reversed.
+ You will need to create a new account to return.
+
+
+
setDeleteModalVisible(false)}
+ className='px-4 py-2 text-gray-600 hover:text-gray-800 transition-colors'
+ >
+ Cancel
+
+
+ {isDeletingAccount && (
+
+ )}
+ Delete account
+
+
+
+
+ )}
+
+ )
+}
+
+export default ProfilePage
diff --git a/src/components/home/settingsForm.tsx b/src/components/home/settingsForm.tsx
new file mode 100644
index 0000000..c062029
--- /dev/null
+++ b/src/components/home/settingsForm.tsx
@@ -0,0 +1,308 @@
+import { useFormik } from 'formik'
+import { useState } from 'react'
+
+import { useAuth } from '@/lib/auth'
+import { track } from '@/lib/helpers'
+import { useUserMutations } from '@/lib/hooks/useUserMutations'
+import { useUserQuery } from '@/lib/hooks/useUserQuery'
+
+const SettingsForm = (): JSX.Element => {
+ const { user } = useAuth()
+ const { person } = useUserQuery(user?.uid)
+ const { updateUser } = useUserMutations()
+
+ const formik = useFormik({
+ initialValues: {
+ hemophiliaType: person?.hemophiliaType ?? '',
+ severity: person?.severity ?? '',
+ factor: person?.factor ? person.factor.toString() : '',
+ medication: person?.medication ?? '',
+ monoclonalAntibody: person?.monoclonalAntibody ?? '',
+ injectionFrequency: person?.injectionFrequency ?? '',
+ // emergencyContacts: [
+ // {
+ // name: '',
+ // phone: '',
+ // },
+ // ],
+ },
+ enableReinitialize: true,
+ onSubmit: (values) => {
+ if (user?.uid) {
+ updateUser({ uid: user.uid, userData: values })
+ }
+ },
+ })
+
+ const severityOptions = [
+ { label: 'Mild', value: 'Mild' },
+ { label: 'Moderate', value: 'Moderate' },
+ { label: 'Severe', value: 'Severe' },
+ ]
+
+ const hemophiliaTypeOptions = [
+ { label: 'A', value: 'A' },
+ { label: 'B', value: 'B' },
+ { label: 'Von Willebrand Disease', value: 'Von Willebrand Disease' },
+ ]
+
+ const factorOptions = [
+ { label: 'Advate', value: 'Advate' },
+ { label: 'Adynovate', value: 'Adynovate' },
+ { label: 'Afstyla', value: 'Afstyla' },
+ { label: 'Alprolix', value: 'Alprolix' },
+ { label: 'Benefix', value: 'Benefix' },
+ { label: 'Eloctate', value: 'Eloctate' },
+ { label: 'Esperoct', value: 'Esperoct' },
+ { label: 'Idelvion', value: 'Idelvion' },
+ { label: 'Ixinity', value: 'Ixinity' },
+ { label: 'Jivi', value: 'Jivi' },
+ { label: 'Kogenate FS', value: 'Kogenate FS' },
+ { label: 'Kovaltry', value: 'Kovaltry' },
+ { label: 'NovoEight', value: 'NovoEight' },
+ { label: 'NovoSeven', value: 'NovoSeven' },
+ { label: 'NUWIQ', value: 'NUWIQ' },
+ { label: 'Rebinyn', value: 'Rebinyn' },
+ { label: 'Recombinate', value: 'Recombinate' },
+ { label: 'Rixubis', value: 'Rixubis' },
+ { label: 'Xyntha', value: 'Xyntha' },
+ ]
+
+ const monoclonalAntibodyOptions = [{ label: 'Hemlibra', value: 'Hemlibra' }]
+
+ const injectionFrequencyOptions = [
+ {
+ label: 'Weekly',
+ value: 'Weekly',
+ },
+ {
+ label: 'Every other week',
+ value: 'Every other week',
+ },
+ {
+ label: 'Monthly',
+ value: 'Monthly',
+ },
+ ]
+
+ const handleSubmitForm = () => {
+ track('Updated Profile', { ...formik.values })
+ formik.submitForm()
+ }
+
+ const [filteredFactorOptions, setFilteredFactorOptions] =
+ useState(factorOptions)
+
+ interface Option {
+ label: string
+ value: string
+ }
+
+ const searchHandler = (
+ currentValue: string,
+ allOptions: Option[],
+ setOptions: (options: Option[]) => void
+ ) => {
+ if (!currentValue) return setOptions(allOptions)
+ const relatedOptions = allOptions.filter((item) =>
+ item.value.toLowerCase().startsWith(currentValue.toLowerCase())
+ )
+ setOptions(relatedOptions)
+ }
+
+ return (
+
+
+
+
+ Type of hemophilia
+
+
+ formik.setFieldValue('hemophiliaType', e.target.value)
+ }
+ >
+ Select type
+ {hemophiliaTypeOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+
+ Severity
+
+ formik.setFieldValue('severity', e.target.value)}
+ >
+ Select severity
+ {severityOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+
+ Factor number
+
+
+
+
+
+
+ Factor
+
+ {
+ formik.setFieldValue('medication', e.target.value)
+ searchHandler(
+ e.target.value,
+ factorOptions,
+ setFilteredFactorOptions
+ )
+ }}
+ list='factor-options'
+ />
+
+ {filteredFactorOptions.map((option) => (
+
+ ))}
+
+
+
+
+
+ Monoclonal antibody
+
+
+ formik.setFieldValue('monoclonalAntibody', e.target.value)
+ }
+ list='antibody-options'
+ />
+
+ {monoclonalAntibodyOptions.map((option) => (
+
+ ))}
+
+
+
+
+
+ Injection frequency
+
+
+ formik.setFieldValue('injectionFrequency', e.target.value)
+ }
+ >
+ Select frequency
+ {injectionFrequencyOptions.map((option) => (
+
+ {option.label}
+
+ ))}
+
+
+
+
+ {/* Emergency contacts section - commented out in original */}
+ {/*
+
+
Emergency contacts
+
+ Contact name
+
+
+
+ Contact phone number
+
+
+
+ */}
+
+
+
+ {formik.isSubmitting && (
+
+ )}
+ Update
+
+
+
+ )
+}
+
+export default SettingsForm
diff --git a/src/components/home/sheetWithKeyboard/SheetWithKeyboard.css b/src/components/home/sheetWithKeyboard/SheetWithKeyboard.css
new file mode 100644
index 0000000..6e3a465
--- /dev/null
+++ b/src/components/home/sheetWithKeyboard/SheetWithKeyboard.css
@@ -0,0 +1,53 @@
+/** biome-ignore-all lint/complexity/noImportantStyles: this is a valid use case */
+/** biome-ignore-all lint/suspicious/noDuplicateProperties: this is a valid use case*/
+.SheetWithKeyboard-view {
+ --sheetWithKeyboard-radius: 24px;
+
+ /* SELF-LAYOUT */
+ z-index: 1;
+ top: 0;
+ bottom: initial;
+ /* Adding 60px to make it fully visible below iOS Safari's
+ bottom UI */
+ height: calc(var(--silk-100-lvh-dvh-pct) + 60px);
+}
+
+.SheetWithKeyboard-backdrop {
+ /* Ensure backdrop can receive outside clicks to dismiss */
+ position: fixed !important;
+ inset: 0 !important;
+ z-index: 0 !important;
+}
+
+@media (min-width: 800px) {
+ .SheetWithKeyboard-view {
+ /* SELF-LAYOUT */
+ height: 100%;
+ }
+}
+
+.SheetWithKeyboard-content {
+ /* SELF-LAYOUT */
+ box-sizing: border-box;
+ height: calc(100% - max(env(safe-area-inset-top), 6px));
+
+ /* APPEARANCE */
+ border-radius: var(--sheetWithKeyboard-radius) var(--sheetWithKeyboard-radius)
+ 0 0;
+ overflow: clip;
+ overflow: hidden;
+ background-color: white;
+}
+@media (min-width: 800px) {
+ .SheetWithKeyboard-content {
+ /* SELF-LAYOUT */
+ width: calc(800px - 1.25rem);
+ height: calc(100% - 2rem * 2);
+
+ /* APPEARANCE */
+ box-shadow:
+ 0 10px 15px -3px rgb(0 0 0 / 0.1),
+ 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ border-radius: var(--sheetWithKeyboard-radius);
+ }
+}
diff --git a/src/components/home/sheetWithKeyboard/sheetWithKeyboard.tsx b/src/components/home/sheetWithKeyboard/sheetWithKeyboard.tsx
new file mode 100644
index 0000000..0e54f4a
--- /dev/null
+++ b/src/components/home/sheetWithKeyboard/sheetWithKeyboard.tsx
@@ -0,0 +1,156 @@
+'use client'
+import {
+ Sheet,
+ type SheetViewProps,
+ useClientMediaQuery,
+} from '@silk-hq/components'
+import React, { useCallback, useRef } from 'react'
+import './SheetWithKeyboard.css'
+
+// ================================================================================================
+// Root
+// ================================================================================================
+
+type SheetRootProps = React.ComponentPropsWithoutRef
+type SheetWithKeyboardRootProps = Omit & {
+ license?: SheetRootProps['license']
+}
+
+const SheetWithKeyboardRoot = React.forwardRef<
+ React.ElementRef,
+ SheetWithKeyboardRootProps
+>(({ children, ...restProps }, ref) => {
+ return (
+
+ {children}
+
+ )
+})
+SheetWithKeyboardRoot.displayName = 'SheetWithKeyboard.Root'
+
+// ================================================================================================
+// View
+// ================================================================================================
+
+const SheetWithKeyboardView = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ children, className, onTravel, ...restProps }, ref) => {
+ const viewRef = useRef(null)
+ const largeViewport = useClientMediaQuery('(min-width: 800px)')
+ const contentPlacement = largeViewport ? 'center' : 'bottom'
+ const tracks: SheetViewProps['tracks'] = largeViewport
+ ? ['top', 'bottom']
+ : 'bottom'
+
+ //
+
+ const travelHandler = useCallback>(
+ ({ progress, ...rest }) => {
+ if (!viewRef.current) return onTravel?.({ progress, ...rest })
+
+ // Dismiss the on-screen keyboard as soon as travel
+ // occurs by focusing the view element.
+ if (progress < 0.999) {
+ viewRef.current.focus()
+ }
+ onTravel?.({ progress, ...rest })
+ },
+ [onTravel]
+ )
+
+ //
+
+ const setRefs = useCallback(
+ (node: HTMLElement | null) => {
+ // Assign node to viewRef.current (mutable), do not overwrite viewRef object
+ ;(viewRef as { current: HTMLElement | null }).current = node
+
+ if (typeof ref === 'function') {
+ ref(node)
+ } else if (ref) {
+ ref.current = node
+ }
+ },
+ [ref]
+ )
+
+ return (
+
+ {children}
+
+ )
+})
+SheetWithKeyboardView.displayName = 'SheetWithKeyboard.View'
+
+// ================================================================================================
+// Backdrop
+// ================================================================================================
+
+const SheetWithKeyboardBackdrop = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...restProps }, ref) => {
+ return (
+
+ )
+})
+SheetWithKeyboardBackdrop.displayName = 'SheetWithKeyboard.Backdrop'
+
+// ================================================================================================
+// Content
+// ================================================================================================
+
+const SheetWithKeyboardContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ children, className, ...restProps }, ref) => {
+ return (
+
+ {children}
+
+ )
+})
+SheetWithKeyboardContent.displayName = 'SheetWithKeyboard.Content'
+
+// ================================================================================================
+// Unchanged Components
+// ================================================================================================
+
+const SheetWithKeyboardPortal = Sheet.Portal
+const SheetWithKeyboardTrigger = Sheet.Trigger
+const SheetWithKeyboardHandle = Sheet.Handle
+const SheetWithKeyboardOutlet = Sheet.Outlet
+const SheetWithKeyboardTitle = Sheet.Title
+const SheetWithKeyboardDescription = Sheet.Description
+
+export const SheetWithKeyboard = {
+ Root: SheetWithKeyboardRoot,
+ Portal: SheetWithKeyboardPortal,
+ View: SheetWithKeyboardView,
+ Backdrop: SheetWithKeyboardBackdrop,
+ Content: SheetWithKeyboardContent,
+ Trigger: SheetWithKeyboardTrigger,
+ Handle: SheetWithKeyboardHandle,
+ Outlet: SheetWithKeyboardOutlet,
+ Title: SheetWithKeyboardTitle,
+ Description: SheetWithKeyboardDescription,
+}
diff --git a/src/components/home/sheetWithKeyboard/treatmentSheetWithKeyboard.css b/src/components/home/sheetWithKeyboard/treatmentSheetWithKeyboard.css
new file mode 100644
index 0000000..901162d
--- /dev/null
+++ b/src/components/home/sheetWithKeyboard/treatmentSheetWithKeyboard.css
@@ -0,0 +1,105 @@
+/* TreatmentSheet styles */
+
+.TreatmentSheet-content {
+ /* INNER-LAYOUT */
+ container-type: size;
+ display: grid;
+ grid-template-rows: min-content 1fr;
+}
+
+.TreatmentSheet-header {
+ /* SELF-LAYOUT */
+ height: 57px;
+
+ /* APPEARANCE */
+ border-bottom: 1px solid rgb(229, 231, 235);
+
+ /* INNER-LAYOUT */
+ position: relative;
+ padding-inline: 1.25rem;
+ display: grid;
+ grid-template-columns: 80px 1fr 80px;
+ align-items: center;
+ gap: 0.75rem;
+}
+@media (min-width: 800px) {
+ .TreatmentSheet-header {
+ /* SELF-LAYOUT */
+ height: 53px;
+ }
+}
+
+.TreatmentSheet-cancelButton {
+ /* SELF-LAYOUT */
+ justify-self: start;
+
+ /* APPEARANCE */
+ border-radius: 6px;
+ outline-offset: 5px;
+ border: none;
+ appearance: none;
+ background-color: transparent;
+
+ /* INTERACTIVITY */
+ cursor: pointer;
+
+ /* INNER-LAYOUT */
+ padding: 0;
+
+ /* TEXT */
+ font-size: 17.25px;
+ font-weight: 500;
+ color: rgb(52, 159, 13);
+}
+
+.TreatmentSheet-title {
+ /* SELF-LAYOUT */
+ margin: 0;
+ justify-self: center;
+
+ /* TEXT */
+ font-size: 17.25px;
+ font-weight: 620;
+ color: rgb(31, 41, 55);
+}
+
+.TreatmentSheet-saveButton {
+ /* SELF-LAYOUT */
+ justify-self: end;
+
+ /* APPEARANCE */
+ border-radius: 6px;
+ outline-offset: 5px;
+ border: none;
+ appearance: none;
+ background-color: transparent;
+
+ /* INTERACTIVITY */
+ cursor: pointer;
+
+ /* INNER-LAYOUT */
+ padding: 0;
+
+ /* TEXT */
+ font-size: 17.25px;
+ font-weight: 600;
+ color: rgb(52, 159, 13);
+}
+
+.TreatmentSheet-scrollView {
+ /* SELF-LAYOUT */
+ min-height: 0;
+
+ /* APPEARANCE */
+ overflow: clip;
+ overflow: hidden;
+ border-radius: 0 0 var(--sheetWithKeyboard-radius)
+ var(--sheetWithKeyboard-radius);
+ background-color: white;
+}
+
+.TreatmentSheet-scrollContent {
+ /* INNER-LAYOUT */
+ display: grid;
+ align-content: start;
+}
diff --git a/src/components/home/statCard.tsx b/src/components/home/statCard.tsx
new file mode 100644
index 0000000..23e4892
--- /dev/null
+++ b/src/components/home/statCard.tsx
@@ -0,0 +1,43 @@
+interface Props {
+ value: string | number
+ label: React.ReactNode
+ loading?: boolean
+ type?: 'default' | 'success' | 'warning' | 'error'
+ shadow?: boolean
+ style?: React.CSSProperties
+}
+
+export default function StatCard(props: Props): JSX.Element {
+ const {
+ value,
+ label,
+ loading = false,
+ type = 'default',
+ shadow = true,
+ style,
+ } = props
+
+ const typeClasses = {
+ default: 'bg-white',
+ success: 'bg-success-50 border-success-200',
+ warning: 'bg-warning-50 border-warning-200',
+ error: 'bg-error-50 border-error-200',
+ }
+
+ return (
+
+
{value}
+
{label}
+ {loading && (
+
+ )}
+
+ )
+}
diff --git a/src/components/home/stats.tsx b/src/components/home/stats.tsx
new file mode 100644
index 0000000..b69b84b
--- /dev/null
+++ b/src/components/home/stats.tsx
@@ -0,0 +1,204 @@
+import { useState } from 'react'
+import _ from 'underscore'
+import FeedbackModal from '@/components/home/feedbackModal'
+import StatCard from '@/components/home/statCard'
+import { TreatmentTypeEnum } from '@/lib/db/treatments'
+import { filterTreatments } from '@/lib/helpers'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
+
+// TODO(michael) move types to types file
+type Value = string[]
+
+interface ValueRanges {
+ range: string
+ majorDimension: string
+ values: Value[]
+}
+
+export interface TreatmentSheet {
+ error?: Error
+ spreadsheetId: string
+ valueRanges: ValueRanges[]
+}
+
+// TODO(michael) create array of factor brands with associated prices
+// const PHARMACY_ORDERS = 6
+const COST_OF_FACTOR = 1.66
+
+interface StatsProps {
+ filterYear: string
+}
+
+export default function Stats(props: StatsProps): JSX.Element {
+ const { filterYear } = props
+ const { data, isLoading, isError, error } = useTreatmentsQuery()
+
+ const filteredTreatments = filterTreatments(data, filterYear)
+
+ // TODO(michael): Remove the feedback modal from this component at some point
+ // since we already use it in the footer, maybe figure out a way to share
+ // the modal across multiple components my lifting it up into context.
+ const [feedbackModal, setFeedbackModal] = useState(false)
+
+ if (isLoading) {
+ return (
+
+
+
+
+
+
+
+
+
+
+ )
+ }
+
+ if (isError || error) {
+ return (
+
+
Error
+
+ Oops, the database didn't respond. Refresh the page to try again.
+
+
+ )
+ }
+
+ // TODO(michael) there has to be a better way to understand this data without
+ // iterating through it so many times. Iterating through it once would be a lot better
+ // but doing it on the server would be even better.
+
+ // Another idea could be to make all these cards individual components as the logic
+ // could get a lot more complicated for some of them.
+
+ const numberOfTreatments = filteredTreatments.length
+ const affectedAreas = filteredTreatments.map((entry) => entry.sites)
+ const causes = filteredTreatments.map((entry) => entry.cause)
+ const numberOfBleeds = filteredTreatments.filter(
+ (entry) => entry.type === TreatmentTypeEnum.BLEED
+ ).length
+ let mostAffectedArea: unknown
+ let biggestCause: unknown
+ try {
+ mostAffectedArea = _.chain(affectedAreas)
+ .compact()
+ .countBy()
+ .pairs()
+ .max(_.last)
+ .head()
+ .value()
+ } catch (err) {
+ if (err instanceof Error) {
+ throw err
+ }
+ throw new Error('Unknown error calculating most affected area')
+ }
+
+ try {
+ biggestCause = _.chain(causes)
+ .compact()
+ .countBy()
+ .pairs()
+ .max(_.last)
+ .head()
+ .value()
+ } catch (err) {
+ if (err instanceof Error) {
+ throw err
+ }
+ throw new Error('Unknown error calculating biggest cause')
+ }
+
+ const consecutiveProphyTreatments = (): number => {
+ let longestStreak = 0
+ let currentStreak = 0
+
+ for (const entry of filteredTreatments) {
+ const isProphy = entry.type === TreatmentTypeEnum.PROPHY
+
+ if (isProphy) {
+ currentStreak++
+ } else {
+ currentStreak = 0
+ }
+
+ if (currentStreak > longestStreak) {
+ longestStreak = currentStreak
+ }
+ }
+
+ return longestStreak
+ }
+
+ const getTotalUnits = () => {
+ let units = 0
+ for (const entry of filteredTreatments) {
+ units += entry.medication.units
+ }
+
+ return units
+ }
+
+ const totalUnits = getTotalUnits()
+ const estimatedTotalCost = totalUnits * COST_OF_FACTOR
+
+ return (
+ <>
+
+
+
+
+
+
+
+ {/* I think this is between $1.19 and $1.66 per unit based on this article
+ https://www.ashclinicalnews.org/spotlight/feature-articles/high-price-hemophilia/ */}
+
+
+
Missing something?
+
+ setFeedbackModal(true)}
+ className='bg-transparent border-none cursor-pointer p-0 m-0 text-red-500 font-bold'
+ >
+ Give feedback
+
+
+
+ {/*
+ TODO(michael) could setup a separate collection for this data as well as a
+ separate api call
+
+
*/}
+
+
+ >
+ )
+}
diff --git a/src/components/home/treatmentModalContent.tsx b/src/components/home/treatmentModalContent.tsx
new file mode 100644
index 0000000..232a0f7
--- /dev/null
+++ b/src/components/home/treatmentModalContent.tsx
@@ -0,0 +1,513 @@
+import { format } from 'date-fns'
+import { useFormik } from 'formik'
+import {
+ forwardRef,
+ useCallback,
+ useEffect,
+ useId,
+ useImperativeHandle,
+ useRef,
+ useState,
+} from 'react'
+import toast from 'react-hot-toast'
+import { useAuth } from '@/lib/auth'
+import {
+ type TreatmentType,
+ TreatmentTypeEnum,
+ type TreatmentTypeOptions,
+} from '@/lib/db/treatments'
+import { track } from '@/lib/helpers'
+import { useTreatmentMutations } from '@/lib/hooks/useTreatmentMutations'
+import type { AttachedUserType } from '@/lib/types/users'
+
+interface TreatmentValues {
+ brand: string
+ cause: string
+ date: string
+ lot?: string
+ sites: string
+ type: TreatmentTypeOptions
+ units: string
+ uid?: string | null
+}
+
+interface TreatmentModalProps {
+ treatment?: TreatmentType
+ // Previous treatment for prefilling form when creating new treatments
+ previousTreatment?: TreatmentType
+ // Callback when treatment is successfully created/updated
+ onSuccess?: () => void
+}
+
+// Helper function to compute initial values - called once when modal mounts
+function getInitialValues(
+ treatment: TreatmentType | undefined,
+ previousTreatment: TreatmentType | undefined,
+ monoclonalAntibody: string | undefined
+) {
+ const displayTreatment = treatment || previousTreatment
+ const isAntibody = displayTreatment?.type === TreatmentTypeEnum.ANTIBODY
+
+ return {
+ brand: displayTreatment
+ ? isAntibody
+ ? monoclonalAntibody || ''
+ : displayTreatment.medication.brand
+ : '',
+ cause: displayTreatment ? (isAntibody ? '' : displayTreatment.cause) : '',
+ date: treatment
+ ? displayTreatment?.date || format(new Date(), 'yyyy-MM-dd')
+ : format(new Date(), 'yyyy-MM-dd'),
+ lot: displayTreatment
+ ? isAntibody
+ ? ''
+ : displayTreatment.medication.lot || ''
+ : '',
+ sites: displayTreatment ? (isAntibody ? '' : displayTreatment.sites) : '',
+ type: displayTreatment
+ ? displayTreatment.type
+ : (TreatmentTypeEnum.PROPHY as TreatmentTypeOptions),
+ units: displayTreatment
+ ? isAntibody
+ ? '0'
+ : displayTreatment.medication.units.toString()
+ : '',
+ uid: displayTreatment?.uid || null,
+ }
+}
+
+export default forwardRef<{ handleSubmit: () => void }, TreatmentModalProps>(
+ function TreatmentModalContent(props, ref) {
+ const { treatment, previousTreatment, onSuccess } = props
+
+ const { user } = useAuth()
+
+ // Generate all IDs unconditionally at the top level
+ const dateId = useId()
+ const brandId = useId()
+ const unitsId = useId()
+ const lotId = useId()
+ const sitesId = useId()
+ const causeId = useId()
+
+ // Debug: Track render count to detect infinite loops
+ const renderCountRef = useRef(0)
+
+ // Track if we've already submitted to prevent double-submission
+ const hasSubmittedRef = useRef(false)
+
+ // Reset counter and submission flag on mount
+ useEffect(() => {
+ renderCountRef.current = 0
+ hasSubmittedRef.current = false
+ console.log('TreatmentModalContent mounted', {
+ treatment: treatment?.uid,
+ previousTreatment: previousTreatment?.uid,
+ })
+ return () => {
+ console.log('TreatmentModalContent unmounting')
+ // Reset on unmount too, just in case
+ hasSubmittedRef.current = false
+ }
+ }, [previousTreatment?.uid, treatment?.uid])
+
+ renderCountRef.current += 1
+ if (renderCountRef.current > 10) {
+ console.error('TreatmentModalContent render loop detected!', {
+ renderCount: renderCountRef.current,
+ treatment: treatment?.uid,
+ previousTreatment: previousTreatment?.uid,
+ })
+ throw new Error('Infinite render loop detected in TreatmentModalContent')
+ }
+
+ // Stable reference to onSuccess to avoid closure issues
+ const onSuccessRef = useRef(onSuccess)
+ onSuccessRef.current = onSuccess
+
+ // Use the mutations hook without callbacks - we'll handle success manually
+ const mutations = useTreatmentMutations()
+
+ // Store mutations in ref to ensure handlers don't recreate when mutations object changes
+ const mutationsRef = useRef(mutations)
+ mutationsRef.current = mutations
+
+ const [initialValues] = useState(() => {
+ const values = getInitialValues(
+ treatment,
+ previousTreatment,
+ user?.monoclonalAntibody
+ )
+ console.log('TreatmentModalContent: Initial values calculated on mount', {
+ treatmentUid: treatment?.uid,
+ previousTreatmentUid: previousTreatment?.uid,
+ })
+ return values
+ })
+
+ // Store user in ref to avoid recreating handlers when user changes
+ const userRef = useRef(user)
+ userRef.current = user
+
+ // Memoize handlers to prevent recreation on every render
+ // Use refs to access mutations and user to keep handlers stable
+ const handleCreateTreatment = useCallback(
+ (treatmentValues: TreatmentValues) => {
+ const treatmentUser: AttachedUserType = {
+ email: userRef.current?.email || '',
+ name: userRef.current?.name || '',
+ photoUrl: userRef.current?.photoUrl || '',
+ uid: userRef.current?.uid || '',
+ }
+
+ // TODO:(michael) should probably move to toLocaleString()
+ const { date, brand, lot, units, cause, sites, type } = treatmentValues
+
+ // For antibody treatments, use monoclonal antibody from profile and clear cause/sites
+ const isAntibody = type === TreatmentTypeEnum.ANTIBODY
+ const medicationBrand = isAntibody
+ ? userRef.current?.monoclonalAntibody || ''
+ : brand
+
+ const payload: TreatmentType = {
+ cause: isAntibody ? '' : cause,
+ createdAt: new Date().toISOString(),
+ deletedAt: null,
+ date,
+ medication: {
+ brand: medicationBrand,
+ lot: isAntibody ? undefined : lot,
+ units: isAntibody ? 0 : units ? parseInt(units, 10) : 0,
+ },
+ sites: isAntibody ? '' : sites,
+ type,
+ user: treatmentUser,
+ }
+
+ mutationsRef.current.createTreatment(payload)
+ // Close immediately - mutation runs in background
+ onSuccessRef.current?.()
+ },
+ [] // Empty deps - use refs for all dependencies
+ )
+
+ const handleUpdateTreatment = useCallback(
+ (treatmentValues: TreatmentValues) => {
+ const treatmentUser: AttachedUserType = {
+ email: userRef.current?.email || '',
+ name: userRef.current?.name || '',
+ photoUrl: userRef.current?.photoUrl || '',
+ uid: userRef.current?.uid || '',
+ }
+
+ const { uid, date, brand, lot, units, cause, sites, type } =
+ treatmentValues
+
+ // For antibody treatments, use monoclonal antibody from profile and clear cause/sites
+ const isAntibody = type === TreatmentTypeEnum.ANTIBODY
+ const medicationBrand = isAntibody
+ ? userRef.current?.monoclonalAntibody || ''
+ : brand
+
+ const payload: TreatmentType = {
+ cause: isAntibody ? '' : cause,
+ createdAt: new Date().toISOString(),
+ deletedAt: null,
+ date,
+ medication: {
+ brand: medicationBrand,
+ lot: isAntibody ? undefined : lot,
+ units: isAntibody ? 0 : units ? parseInt(units, 10) : 0,
+ },
+ sites: isAntibody ? '' : sites,
+ type,
+ user: treatmentUser,
+ }
+
+ if (uid) {
+ mutationsRef.current.updateTreatment({
+ uid,
+ userUid: userRef.current?.uid || '',
+ data: payload,
+ })
+ // Close immediately - mutation runs in background
+ onSuccessRef.current?.()
+ } else {
+ toast.error('Treatment database entry not found')
+ hasSubmittedRef.current = false // Allow retry
+ }
+ },
+ [] // Empty deps - use refs for all dependencies
+ )
+
+ // Store treatment and handlers in refs to stabilize onSubmit
+ const treatmentRef = useRef(treatment)
+ treatmentRef.current = treatment
+
+ const handleCreateTreatmentRef = useRef(handleCreateTreatment)
+ handleCreateTreatmentRef.current = handleCreateTreatment
+
+ const handleUpdateTreatmentRef = useRef(handleUpdateTreatment)
+ handleUpdateTreatmentRef.current = handleUpdateTreatment
+
+ // TODO(michael) Add formik validation
+ // Memoize onSubmit with empty deps - use refs for all dependencies
+ const onSubmit = useCallback((values: TreatmentValues) => {
+ console.log('onSubmit called', {
+ hasSubmitted: hasSubmittedRef.current,
+ treatmentUid: treatmentRef.current?.uid,
+ })
+ if (hasSubmittedRef.current) {
+ console.warn('onSubmit: Already submitted, ignoring')
+ return
+ }
+ hasSubmittedRef.current = true
+
+ if (treatmentRef.current) {
+ handleUpdateTreatmentRef.current(values)
+ } else {
+ handleCreateTreatmentRef.current(values)
+ }
+ }, []) // Empty deps - use refs for all dependencies
+
+ const formik = useFormik({
+ initialValues,
+ enableReinitialize: false, // Prevent formik from resetting on prop changes
+ onSubmit,
+ })
+
+ // Define handleSubmit with useCallback to stabilize the reference
+ // Use ref to access formik to avoid dependency on formik object
+ const formikRef = useRef(formik)
+ formikRef.current = formik
+
+ const handleSubmit = useCallback(() => {
+ console.log('handleSubmit called', {
+ hasSubmitted: hasSubmittedRef.current,
+ formikValues: formikRef.current.values,
+ })
+ track('Logged Treatment', {
+ type: formikRef.current.values.type,
+ })
+ formikRef.current.submitForm()
+ }, [])
+
+ useImperativeHandle(ref, () => ({ handleSubmit }), [handleSubmit])
+
+ return (
+
+
+ {/* Treatment Type Buttons */}
+
+ {
+ formik.setFieldValue('type', TreatmentTypeEnum.PROPHY)
+ // Clear antibody-specific fields when switching away from antibody
+ if (formik.values.type === TreatmentTypeEnum.ANTIBODY) {
+ formik.setFieldValue('brand', '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ }
+ }}
+ className={`px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
+ formik.values.type === TreatmentTypeEnum.PROPHY
+ ? 'bg-yellow-100 text-yellow-800 border border-yellow-300'
+ : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
+ }`}
+ >
+ Prophy
+
+ {
+ formik.setFieldValue('type', TreatmentTypeEnum.BLEED)
+ // Clear antibody-specific fields when switching away from antibody
+ if (formik.values.type === TreatmentTypeEnum.ANTIBODY) {
+ formik.setFieldValue('brand', '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ }
+ }}
+ className={`px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
+ formik.values.type === TreatmentTypeEnum.BLEED
+ ? 'bg-green-100 text-green-800 border border-green-300'
+ : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
+ }`}
+ >
+ Bleed
+
+ {
+ formik.setFieldValue('type', TreatmentTypeEnum.PREVENTATIVE)
+ // Clear antibody-specific fields when switching away from antibody
+ if (formik.values.type === TreatmentTypeEnum.ANTIBODY) {
+ formik.setFieldValue('brand', '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ }
+ }}
+ className={`px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
+ formik.values.type === TreatmentTypeEnum.PREVENTATIVE
+ ? 'bg-red-100 text-red-800 border border-red-300'
+ : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
+ }`}
+ >
+ Preventative
+
+
+
+ {user?.monoclonalAntibody && (
+ {
+ formik.setFieldValue('type', TreatmentTypeEnum.ANTIBODY)
+ // Set brand to monoclonal antibody and clear cause/sites when switching to antibody
+ formik.setFieldValue('brand', user?.monoclonalAntibody || '')
+ formik.setFieldValue('cause', '')
+ formik.setFieldValue('sites', '')
+ formik.setFieldValue('units', '0')
+ formik.setFieldValue('lot', '')
+ }}
+ className={`w-full px-3 py-2 rounded-lg text-sm font-medium transition-colors ${
+ formik.values.type === TreatmentTypeEnum.ANTIBODY
+ ? 'bg-blue-100 text-blue-800 border border-blue-300'
+ : 'bg-gray-100 text-gray-700 hover:bg-gray-200'
+ }`}
+ >
+ Monoclonal antibody
+
+ )}
+
+ {/* Date Input */}
+
+
+ Date
+
+
+
+
+ {/* Medication Input */}
+
+
+ Medication
+
+
+
+
+ {formik.values.type !== TreatmentTypeEnum.ANTIBODY && (
+ <>
+ {/* Units Input */}
+
+
+ Units
+
+
+
+
+ units
+
+
+
+
+ {/* Lot Number Input */}
+
+
+ Lot Number
+
+
+
+
+ {/* Affected Areas Input */}
+
+
+ Affected Areas
+
+
+
+
+ {/* Cause Input */}
+
+
+ Cause of Bleed
+
+
+
+ >
+ )}
+
+
+ )
+ }
+)
diff --git a/src/components/home/treatmentTable.tsx b/src/components/home/treatmentTable.tsx
new file mode 100644
index 0000000..dd0e0ad
--- /dev/null
+++ b/src/components/home/treatmentTable.tsx
@@ -0,0 +1,348 @@
+'use client'
+
+import { IconChevronDown, IconChevronUp } from '@tabler/icons-react'
+import {
+ type ColumnDef,
+ flexRender,
+ getCoreRowModel,
+ getPaginationRowModel,
+ getSortedRowModel,
+ type Row,
+ type SortingState,
+ useReactTable,
+} from '@tanstack/react-table'
+import { format, parseISO } from 'date-fns'
+import { useMemo, useState } from 'react'
+import toast from 'react-hot-toast'
+import { useAuth } from '@/lib/auth'
+import { type TreatmentType, TreatmentTypeEnum } from '@/lib/db/treatments'
+import { filterTreatments } from '@/lib/helpers'
+import { useTreatmentMutations } from '@/lib/hooks/useTreatmentMutations'
+import { useTreatmentSheet } from '@/lib/hooks/useTreatmentSheet'
+import { useTreatmentsQuery } from '@/lib/hooks/useTreatmentsQuery'
+import ActionMenu from './actionMenu'
+
+interface TreatmentTableProps {
+ limit?: number
+ uid?: string
+ filterYear: string
+}
+
+export default function TreatmentTable(
+ props: TreatmentTableProps
+): JSX.Element {
+ const { limit, uid, filterYear } = props
+ const {
+ data: treatments,
+ isLoading,
+ isError,
+ error,
+ } = useTreatmentsQuery({ limit, uid })
+
+ const { user } = useAuth()
+ const { deleteTreatment } = useTreatmentMutations()
+ const { openTreatmentSheet } = useTreatmentSheet()
+ const [sorting, setSorting] = useState([
+ { id: 'date', desc: true },
+ ])
+
+ const filteredTreatments = filterTreatments(treatments, filterYear)
+
+ // Determine if user can edit/delete treatments
+ const isLoggedInUser = user && (!uid || uid === user.uid)
+
+ // Delete function - React 19 compiler handles memoization automatically
+ const deleteRow = (treatmentUid: string) => {
+ deleteTreatment({ uid: treatmentUid, userUid: user?.uid || '' })
+ }
+
+ // Edit function - React 19 compiler handles memoization automatically
+ const editRow = (treatment: TreatmentType) => {
+ // Prevent editing treatments without a uid (shouldn't happen, but safety check)
+ if (!treatment.uid) {
+ toast.error('Cannot edit treatment: missing database ID')
+ return
+ }
+ openTreatmentSheet({
+ mode: 'edit',
+ treatment,
+ previousTreatment: treatments?.[0],
+ })
+ }
+
+ // Column definitions - React 19 compiler handles memoization automatically
+ // biome-ignore lint/correctness/useExhaustiveDependencies: will cause infinite loop
+ const columns: ColumnDef[] = useMemo(() => {
+ const baseColumns: ColumnDef[] = [
+ {
+ accessorKey: 'date',
+ header: 'Date',
+ cell: ({ getValue }) => {
+ const dateString = getValue() as string
+ try {
+ const parsedDate = parseISO(dateString)
+ return format(parsedDate, 'MM/dd/yyyy')
+ } catch (error: unknown) {
+ if (error instanceof Error) {
+ toast.error(error.message)
+ } else {
+ toast.error('Error parsing date')
+ }
+ }
+ },
+ sortingFn: (rowA: Row, rowB: Row) => {
+ try {
+ const dateA = parseISO(rowA.getValue('date') as string)
+ const dateB = parseISO(rowB.getValue('date') as string)
+ return dateA.getTime() - dateB.getTime()
+ } catch (error: unknown) {
+ if (error instanceof Error) {
+ toast.error(error.message)
+ } else {
+ toast.error('Error sorting dates')
+ }
+ return 0 // Return 0 to indicate equal when parsing fails
+ }
+ },
+ },
+ {
+ accessorKey: 'type',
+ header: 'Reason',
+ cell: ({ getValue }) => {
+ const type = getValue() as TreatmentTypeEnum
+ const badgeStyles = {
+ [TreatmentTypeEnum.BLEED]: 'bg-red-100 text-red-800',
+ [TreatmentTypeEnum.PROPHY]: 'bg-yellow-100 text-yellow-800',
+ [TreatmentTypeEnum.PREVENTATIVE]: 'bg-orange-100 text-orange-800',
+ [TreatmentTypeEnum.ANTIBODY]: 'bg-gray-100 text-gray-800',
+ }
+
+ return (
+
+ {TreatmentTypeEnum[type]}
+
+ )
+ },
+ },
+ {
+ accessorKey: 'sites',
+ header: 'Bleed sites',
+ },
+ {
+ accessorKey: 'cause',
+ header: 'Cause',
+ },
+ {
+ accessorKey: 'medication.brand',
+ header: 'Medication',
+ cell: ({ row }) => row.original.medication.brand,
+ },
+ {
+ accessorKey: 'medication.units',
+ header: 'Amount',
+ cell: ({ getValue }) => {
+ const units = getValue() as number
+ return units ? `${units} iu` : ''
+ },
+ },
+ ]
+
+ if (isLoggedInUser) {
+ baseColumns.push({
+ id: 'actions',
+ header: '',
+ cell: ({ row }) => {
+ const treatment = row.original
+ return (
+
+ )
+ },
+ })
+ }
+
+ return baseColumns
+ }, [isLoggedInUser])
+
+ const table = useReactTable({
+ data: filteredTreatments,
+ columns,
+ state: {
+ sorting,
+ },
+ onSortingChange: setSorting,
+ getCoreRowModel: getCoreRowModel(),
+ getSortedRowModel: getSortedRowModel(),
+ getPaginationRowModel: getPaginationRowModel(),
+ initialState: {
+ pagination: {
+ pageSize: 25,
+ },
+ },
+ })
+
+ // Handle case where uid is not available
+ if (!uid && !user?.uid) {
+ return (
+
+
+ No treatment data available
+
+
+ User information is not available to load treatments.
+
+
+ )
+ }
+
+ if (isLoading) {
+ return (
+
+
+
+
+
Loading treatment data
+
+
+ )
+ }
+
+ if (isError || error) {
+ console.error('Error fetching treatments:', error)
+ return (
+
+
Error
+
+ Oops, the database didn't respond. Refresh the page to try again.
+
+
+ )
+ }
+
+ // Show empty state if query completed successfully but no treatments found
+ if (!treatments || treatments.length === 0) {
+ const emptyMessage = isLoggedInUser
+ ? "You haven't logged any treatments yet. Add one by clicking 'New Treatment' above."
+ : 'This person has not logged any treatments yet.'
+
+ return (
+
+
+ No treatment data available
+
+
{emptyMessage}
+
+ )
+ }
+
+ return (
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => (
+
+
+ {flexRender(
+ header.column.columnDef.header,
+ header.getContext()
+ )}
+ {header.column.getIsSorted() === 'asc' && (
+
+ )}
+ {header.column.getIsSorted() === 'desc' && (
+
+ )}
+
+
+ ))}
+
+ ))}
+
+
+ {table.getRowModel().rows.length === 0 ? (
+
+
+
+
+ No treatments found
+
+
+ {isLoggedInUser
+ ? "Add one by clicking 'New Treatment' above."
+ : 'This person has not logged any treatments yet.'}
+
+
+
+
+ ) : (
+ table.getRowModel().rows.map((row) => (
+
+ {row.getVisibleCells().map((cell) => (
+
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
+
+ ))}
+
+ ))
+ )}
+
+
+
+ {/* Pagination */}
+ {filteredTreatments.length > 25 && (
+
+
+ table.previousPage()}
+ disabled={!table.getCanPreviousPage()}
+ >
+ Previous
+
+
+ Page {table.getState().pagination.pageIndex + 1} of{' '}
+ {table.getPageCount()}
+
+ table.nextPage()}
+ disabled={!table.getCanNextPage()}
+ >
+ Next
+
+
+
+ Showing {table.getRowModel().rows.length} of{' '}
+ {filteredTreatments.length} treatments
+
+
+ )}
+
+ )
+}
diff --git a/src/components/landing/descriptionCards.tsx b/src/components/landing/descriptionCards.tsx
new file mode 100644
index 0000000..338318d
--- /dev/null
+++ b/src/components/landing/descriptionCards.tsx
@@ -0,0 +1,67 @@
+import Image from 'next/image'
+
+export default function DescrtipionCards(): JSX.Element {
+ return (
+
+
+
+
Free forever
+
+ No sponsorships, pharma companies, or ads.
+
+
+
+
+
+
Didn't Hemolog die?
+
+ Yep, but it's back. Just wait till you see what this reincarnation can
+ do!
+
+
+
+
+
+
Safe and secure
+
+ Your data is stored in Firebase, a trusted database owned by Google.
+
+
+
+
+
+
Open source
+
+ Check out the code on{' '}
+
+ Github
+
+ .
+
+
+
+ )
+}
diff --git a/src/components/shared/emergencySnippet.tsx b/src/components/shared/emergencySnippet.tsx
new file mode 100644
index 0000000..7fd0520
--- /dev/null
+++ b/src/components/shared/emergencySnippet.tsx
@@ -0,0 +1,50 @@
+import { IconCopy } from '@tabler/icons-react'
+import type React from 'react'
+import { useEffect, useState } from 'react'
+import toast from 'react-hot-toast'
+
+interface Props {
+ alertId: string
+ style?: React.CSSProperties
+}
+
+export default function EmergencySnippet(props: Props): JSX.Element {
+ const { alertId = 'example', style } = props
+ const [domain, setDomain] = useState('hemolog.com')
+
+ useEffect(() => {
+ // Use actual hostname on client to avoid hydration mismatch
+ setDomain(window.location.host)
+ }, [])
+
+ const url = `${domain}/emergency/${alertId}`
+
+ const copyToClipboard = async () => {
+ try {
+ await navigator.clipboard.writeText(url)
+ toast.success('Link copied!')
+ } catch (err) {
+ console.error('Failed to copy: ', err)
+ toast.error('Failed to copy link')
+ }
+ }
+
+ return (
+
+
+ {url}
+
+
+
+
+
+ )
+}
diff --git a/src/components/shared/footer.tsx b/src/components/shared/footer.tsx
new file mode 100644
index 0000000..bebea68
--- /dev/null
+++ b/src/components/shared/footer.tsx
@@ -0,0 +1,82 @@
+'use client'
+
+// All Geist UI components have been migrated to Tailwind
+
+import { useEffect, useState } from 'react'
+import EmergencySnippet from '@/components/shared/emergencySnippet'
+import { useAuth } from '@/lib/auth'
+import { CONFIG } from '@/lib/helpers'
+
+export default function Footer(): JSX.Element {
+ const { user, loading } = useAuth()
+ const [mounted, setMounted] = useState(false)
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ // Use a consistent default during SSR and initial hydration to avoid mismatch
+ const alertId = () => {
+ if (!mounted || loading) {
+ return 'example'
+ }
+ if (user?.alertId) {
+ return user.alertId
+ }
+ return 'example'
+ }
+
+ return (
+
+ )
+}
diff --git a/src/components/shared/loadingScreen.tsx b/src/components/shared/loadingScreen.tsx
new file mode 100644
index 0000000..c7edbe7
--- /dev/null
+++ b/src/components/shared/loadingScreen.tsx
@@ -0,0 +1,10 @@
+const LoadingScreen = () => {
+ return (
+
+ )
+}
+
+export default LoadingScreen
diff --git a/src/components/shared/logo.tsx b/src/components/shared/logo.tsx
new file mode 100644
index 0000000..5971623
--- /dev/null
+++ b/src/components/shared/logo.tsx
@@ -0,0 +1,19 @@
+import Image from 'next/image'
+import Link from 'next/link'
+
+export default function Logo() {
+ return (
+
+
+
+ )
+}
diff --git a/src/components/shared/staticHeader.tsx b/src/components/shared/staticHeader.tsx
new file mode 100644
index 0000000..7d3ecb0
--- /dev/null
+++ b/src/components/shared/staticHeader.tsx
@@ -0,0 +1,46 @@
+'use client'
+
+import { useRouter } from 'next/navigation'
+import { useEffect, useState } from 'react'
+import Logo from '@/components/shared/logo'
+import { useAuth } from '@/lib/auth'
+
+const StaticHeader = (): JSX.Element => {
+ const { user, loading } = useAuth()
+ const router = useRouter()
+ const [mounted, setMounted] = useState(false)
+
+ useEffect(() => {
+ setMounted(true)
+ }, [])
+
+ // Use consistent "Loading..." state during SSR and initial hydration
+ const isLoading = !mounted || loading
+
+ return (
+
+
+
+
router.push(user ? '/home' : '/signin')}
+ disabled={isLoading}
+ >
+ {isLoading ? (
+
+ ) : user ? (
+ 'Dashboard'
+ ) : (
+ 'Register'
+ )}
+
+
+
+ )
+}
+
+export default StaticHeader
diff --git a/src/components/shared/withAuth.tsx b/src/components/shared/withAuth.tsx
new file mode 100644
index 0000000..a953928
--- /dev/null
+++ b/src/components/shared/withAuth.tsx
@@ -0,0 +1,22 @@
+'use client'
+
+import type { ComponentType } from 'react'
+
+// HOC that marks a page as needing auth
+// Note: AuthProvider is now provided at the root layout level via Providers
+// This HOC is kept for backward compatibility and can be used for additional auth logic
+export function withAuth(
+ WrappedComponent: ComponentType
+): ComponentType
{
+ const WithAuthComponent = (props: P) => {
+ // Simply render the wrapped component - AuthProvider is already at root level
+ return
+ }
+
+ // Copy display name for debugging
+ const displayName =
+ WrappedComponent.displayName || WrappedComponent.name || 'Component'
+ WithAuthComponent.displayName = `withAuth(${displayName})`
+
+ return WithAuthComponent
+}
diff --git a/global.d.ts b/src/global.d.ts
similarity index 100%
rename from global.d.ts
rename to src/global.d.ts
diff --git a/lib/admin-db/feedback.ts b/src/lib/admin-db/feedback.ts
similarity index 91%
rename from lib/admin-db/feedback.ts
rename to src/lib/admin-db/feedback.ts
index 8387d16..cca874a 100644
--- a/lib/admin-db/feedback.ts
+++ b/src/lib/admin-db/feedback.ts
@@ -1,6 +1,6 @@
-import { adminFirestore } from 'lib/firebase-admin'
import { compareAsc, compareDesc, parseISO } from 'date-fns'
-import type { FeedbackType } from 'lib/db/feedback'
+import type { FeedbackType } from '@/lib/db/feedback'
+import { adminFirestore } from '@/lib/firebase-admin'
async function getAllFeedback() {
try {
diff --git a/lib/admin-db/infusions.ts b/src/lib/admin-db/treatments.ts
similarity index 57%
rename from lib/admin-db/infusions.ts
rename to src/lib/admin-db/treatments.ts
index aeff44b..921b12d 100644
--- a/lib/admin-db/infusions.ts
+++ b/src/lib/admin-db/treatments.ts
@@ -1,44 +1,43 @@
-import { adminFirestore } from 'lib/firebase-admin'
import { compareDesc, parseISO } from 'date-fns'
+import { adminFirestore } from '@/lib/firebase-admin'
+import type { AttachedUserType } from '@/lib/types/users'
+import { type TreatmentType, TreatmentTypeEnum } from '../db/treatments'
-import { TreatmentTypeEnum, type TreatmentType } from '../db/infusions'
-import type { AttachedUserType } from 'lib/types/users'
-
-async function getAllInfusions() {
+async function getAllTreatments() {
const snapshot = await adminFirestore.collection('infusions').get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
snapshot.forEach((doc) => {
- infusions.push({ id: doc.id, ...doc.data() } as TreatmentType & {
+ treatments.push({ id: doc.id, ...doc.data() } as TreatmentType & {
id: string
})
})
- return { infusions }
+ return { treatments }
}
-async function getInfusion(infusionId: string) {
+async function getTreatment(treatmentId: string) {
const snapshot = await adminFirestore
.collection('infusions')
- .where('uid', '==', infusionId)
+ .where('uid', '==', treatmentId)
.get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
snapshot.forEach((doc) => {
- infusions.push({ id: doc.id, ...doc.data() } as TreatmentType & {
+ treatments.push({ id: doc.id, ...doc.data() } as TreatmentType & {
id: string
})
})
- infusions.sort((a: TreatmentType, b: TreatmentType) =>
+ treatments.sort((a: TreatmentType, b: TreatmentType) =>
compareDesc(parseISO(a.createdAt), parseISO(b.createdAt))
)
- return { infusions }
+ return { treatments }
}
-async function getAllInfusionsByApiKey(apiKey: string) {
+async function getAllTreatmentsByApiKey(apiKey: string) {
try {
const userSnapshot = await adminFirestore
.collection('users')
@@ -60,21 +59,21 @@ async function getAllInfusionsByApiKey(apiKey: string) {
.orderBy('date', 'desc')
.get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
snapshot.forEach((doc) => {
- infusions.push({ id: doc.id, ...doc.data() } as TreatmentType & {
+ treatments.push({ id: doc.id, ...doc.data() } as TreatmentType & {
id: string
})
})
- return { infusions }
+ return { treatments }
} catch (error) {
return { error }
}
}
-async function getRecentUserInfusionsByApiKey(
+async function getRecentUserTreatmentsByApiKey(
apiKey?: string,
alertId?: string
) {
@@ -96,37 +95,37 @@ async function getRecentUserInfusionsByApiKey(
.collection('infusions')
.where('user.uid', '==', user.uid)
.where('deletedAt', '==', null)
- // TODO: Need to add a timestamp value to each infusion and replace createdAt
+ // TODO: Need to add a timestamp value to each treatment and replace createdAt
// .orderBy('timestamp', 'asc')
// .limitToLast(3)
.get()
- const infusions: TreatmentType[] = []
+ const treatments: TreatmentType[] = []
// TODO: Find out why I was adding an id here.
// The doc.id should already be available as the uid.
// Removing for now.
snapshot.forEach((doc) => {
- // infusions.push({ id: doc.id, ...doc.data() })
- infusions.push(doc.data() as TreatmentType)
+ // treatments.push({ id: doc.id, ...doc.data() })
+ treatments.push(doc.data() as TreatmentType)
})
// TODO: remove this hack after fixing the orderBy issue above
- infusions.sort((a: TreatmentType, b: TreatmentType) =>
+ treatments.sort((a: TreatmentType, b: TreatmentType) =>
compareDesc(parseISO(a.createdAt), parseISO(b.createdAt))
)
- infusions.length = 3
+ treatments.length = 3
- return { infusions }
+ return { treatments }
} catch (error) {
return { error }
}
}
-async function postInfusionByApiKey(
+async function postTreatmentByApiKey(
apiKey: string,
- lastInfusion: TreatmentType | null,
- newInfusion: Partial
+ lastTreatment: TreatmentType | null,
+ newTreatment: Partial
) {
try {
const userSnapshot = await adminFirestore
@@ -150,42 +149,42 @@ async function postInfusionByApiKey(
}
const now = new Date().toISOString()
- const baseInfusion: TreatmentType = lastInfusion
- ? { ...lastInfusion }
+ const baseTreatment: TreatmentType = lastTreatment
+ ? { ...lastTreatment }
: {
cause: '',
createdAt: now,
- date: newInfusion.date || now.slice(0, 10),
+ date: newTreatment.date || now.slice(0, 10),
deletedAt: null,
medication: {
- brand: newInfusion.medication?.brand || '',
- costPerUnit: newInfusion.medication?.costPerUnit,
- lot: newInfusion.medication?.lot,
- units: newInfusion.medication?.units || 0,
+ brand: newTreatment.medication?.brand || '',
+ costPerUnit: newTreatment.medication?.costPerUnit,
+ lot: newTreatment.medication?.lot,
+ units: newTreatment.medication?.units || 0,
},
sites: '',
- type: newInfusion.type || TreatmentTypeEnum.PROPHY,
- user: (newInfusion.user as AttachedUserType) || baseUser,
+ type: newTreatment.type || TreatmentTypeEnum.PROPHY,
+ user: (newTreatment.user as AttachedUserType) || baseUser,
}
const sanitizedBase = {
- ...baseInfusion,
+ ...baseTreatment,
createdAt: now,
- cause: baseInfusion.cause || '',
- sites: baseInfusion.sites || '',
+ cause: baseTreatment.cause || '',
+ sites: baseTreatment.sites || '',
deletedAt: null,
- user: baseInfusion.user || baseUser,
+ user: baseTreatment.user || baseUser,
}
delete (sanitizedBase as Partial).uid
- const infusion: TreatmentType = {
+ const treatment: TreatmentType = {
...sanitizedBase,
- ...newInfusion,
- user: (newInfusion.user as AttachedUserType) || sanitizedBase.user,
+ ...newTreatment,
+ user: (newTreatment.user as AttachedUserType) || sanitizedBase.user,
medication: {
...sanitizedBase.medication,
- ...(newInfusion.medication || {}),
+ ...(newTreatment.medication || {}),
},
createdAt: now,
deletedAt: null,
@@ -193,21 +192,21 @@ async function postInfusionByApiKey(
await adminFirestore
.collection('infusions')
- .add(infusion)
+ .add(treatment)
.then((docRef) => {
- docRef.set({ uid: docRef.id, ...infusion })
+ docRef.set({ uid: docRef.id, ...treatment })
})
- return { infusion: { message: 'Success' } }
+ return { treatment: { message: 'Success' } }
} catch (error) {
return { error }
}
}
export {
- getAllInfusions,
- getAllInfusionsByApiKey,
- getInfusion,
- getRecentUserInfusionsByApiKey,
- postInfusionByApiKey,
+ getAllTreatments,
+ getAllTreatmentsByApiKey,
+ getTreatment,
+ getRecentUserTreatmentsByApiKey,
+ postTreatmentByApiKey,
}
diff --git a/lib/admin-db/users.ts b/src/lib/admin-db/users.ts
similarity index 91%
rename from lib/admin-db/users.ts
rename to src/lib/admin-db/users.ts
index 8e4e07e..240e96a 100644
--- a/lib/admin-db/users.ts
+++ b/src/lib/admin-db/users.ts
@@ -1,4 +1,4 @@
-import { auth, adminFirestore } from 'lib/firebase-admin'
+import { adminFirestore, auth } from '@/lib/firebase-admin'
const BATCH_LIMIT = 400
@@ -49,13 +49,13 @@ async function deleteUserAndData(uid: string) {
// Auth user deleted (or didn't exist), now safe to delete Firestore data
const userDocRef = adminFirestore.collection('users').doc(uid)
- const infusionSnapshot = await adminFirestore
+ const treatmentSnapshot = await adminFirestore
.collection('infusions')
.where('user.uid', '==', uid)
.get()
const docRefs: FirebaseFirestore.DocumentReference[] = [userDocRef]
- infusionSnapshot.forEach((docSnapshot) => {
+ treatmentSnapshot.forEach((docSnapshot) => {
docRefs.push(docSnapshot.ref)
})
diff --git a/src/lib/auth.tsx b/src/lib/auth.tsx
new file mode 100644
index 0000000..26a3f79
--- /dev/null
+++ b/src/lib/auth.tsx
@@ -0,0 +1,453 @@
+'use client'
+
+import {
+ createUserWithEmailAndPassword,
+ signOut as firebaseSignOut,
+ GoogleAuthProvider,
+ onIdTokenChanged,
+ signInWithEmailAndPassword,
+ signInWithPopup,
+ type User,
+} from 'firebase/auth'
+import cookie from 'js-cookie'
+import { usePathname, useRouter } from 'next/navigation'
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useState,
+} from 'react'
+import LoadingScreen from '@/components/shared/loadingScreen'
+import { createUser, fetchUserByUid } from '@/lib/db/users'
+import { getAuth } from '@/lib/firebase'
+import { generateUniqueString } from '@/lib/helpers'
+import type { UserType } from '@/lib/types/users'
+
+type ContextProps = {
+ user: UserType | null
+ loading?: boolean
+ signout: () => Promise
+ signinWithGoogle: (redirect: string) => Promise
+ signinWithTestUser: () => Promise
+}
+
+const authContext = createContext>({
+ user: null,
+ loading: true, // Start with true to wait for auth state
+})
+
+export function AuthProvider({
+ children,
+}: {
+ children: React.ReactNode
+}): React.ReactElement {
+ const auth = useProvideAuth()
+ // Always provide the context with consistent initial values
+ // This ensures server and client render the same initial state
+ return {children}
+}
+
+export const useAuth = () => useContext(authContext)
+
+let globalUser: UserType | null = null
+let globalLoading = true // Start with true to wait for auth state to be determined
+let authListenerInitialized = false
+
+function useProvideAuth() {
+ const [user, setUser] = useState(globalUser)
+ const [loading, setLoading] = useState(globalLoading)
+ const [pendingRedirect, setPendingRedirect] = useState(null)
+ const router = useRouter()
+
+ // Handle pending redirects after user state is set
+ useEffect(() => {
+ if (pendingRedirect && user && !loading) {
+ router.push(pendingRedirect)
+ setPendingRedirect(null)
+ }
+ }, [user, loading, pendingRedirect, router])
+
+ const handleUser = useCallback(async (rawUser: User | null) => {
+ if (rawUser) {
+ let formattedUser: UserType
+ try {
+ formattedUser = await formatUser(rawUser)
+ } catch (error) {
+ console.error('Error formatting user:', error)
+ // If formatting fails, still set loading to false to unblock UI
+ globalLoading = false
+ setLoading(false)
+ return false
+ }
+
+ try {
+ // Fetch user data from Firestore using Firestore Lite with timeout
+ const dbUser = await withTimeout(
+ fetchUserByUid(formattedUser.uid),
+ 5000
+ )
+
+ const { ...userWithoutToken } = formattedUser
+
+ if (dbUser) {
+ formattedUser.alertId = dbUser.alertId
+ formattedUser.isAdmin = (dbUser as unknown as UserType).isAdmin
+ formattedUser.apiKey = dbUser.apiKey
+ formattedUser.medication = dbUser.medication || ''
+ formattedUser.monoclonalAntibody = dbUser.monoclonalAntibody || ''
+ delete userWithoutToken.alertId
+ // Only update if document exists but might be missing fields
+ // Don't update on every auth token change to prevent loops
+ } else {
+ // Only create user document if it doesn't exist
+ await createUser(formattedUser.uid, userWithoutToken)
+ }
+ } catch (error) {
+ // Handle offline/connection/timeout errors gracefully
+ // These errors are expected when emulator isn't running, connection is temporarily unavailable,
+ // or operations take too long on page refresh
+ const errorMessage =
+ error instanceof Error ? error.message : String(error)
+ const isExpectedError =
+ errorMessage.includes('offline') ||
+ errorMessage.includes('unavailable') ||
+ errorMessage.includes('Failed to get document') ||
+ errorMessage.includes('Could not reach Cloud Firestore backend') ||
+ errorMessage.includes('Firestore not available') ||
+ errorMessage.includes('timed out')
+
+ if (isExpectedError) {
+ // Don't log these errors - they're expected in development when emulator isn't running
+ // or when connection is temporarily unavailable
+ console.warn('Firestore operation skipped:', errorMessage)
+ } else {
+ // Only log unexpected errors
+ console.error('Error handling user Firestore operations:', error)
+ }
+ // Continue even if Firestore operations fail - user can still sign in
+ // The user document will be created on next sign-in attempt or when connection is restored
+ }
+
+ globalUser = formattedUser
+ globalLoading = false
+ setUser(formattedUser)
+ setLoading(false)
+
+ cookie.set('hemolog-auth', {
+ expires: 1,
+ })
+
+ return formattedUser
+ } else {
+ globalUser = null
+ globalLoading = false
+ setUser(null)
+ setLoading(false)
+
+ cookie.remove('hemolog-auth')
+
+ return false
+ }
+ }, [])
+
+ const signinWithGoogle = async (redirect: string) => {
+ if (process.env.NEXT_PUBLIC_USE_EMULATORS) {
+ console.warn(
+ 'Google sign-in is disabled when NEXT_PUBLIC_USE_EMULATORS is enabled. Use the Test User button instead.'
+ )
+ setLoading(false)
+ return
+ }
+
+ setLoading(true)
+ const auth = getAuth()
+
+ if (!auth) {
+ console.error('Firebase auth not available for Google sign-in')
+ setLoading(false)
+ return
+ }
+
+ try {
+ const provider = new GoogleAuthProvider()
+ const result = await signInWithPopup(auth, provider)
+ await handleUser(result.user)
+
+ if (redirect) {
+ router.push(redirect)
+ }
+ } catch (error) {
+ console.error('Google sign-in error:', error)
+ setLoading(false)
+ }
+ }
+
+ const signinWithTestUser = async () => {
+ setLoading(true)
+
+ if (typeof window === 'undefined') {
+ console.error('Error: Cannot sign in on server-side')
+ setLoading(false)
+ return
+ }
+
+ const auth = getAuth()
+
+ if (!auth) {
+ console.error(
+ 'Error: Firebase auth not available. Make sure Firebase is initialized and emulator is running.'
+ )
+ setLoading(false)
+ return
+ }
+
+ const testEmail = 'michael+test@hemolog.com'
+ const testPassword = 'test123'
+
+ try {
+ const signInResponse = await signInWithEmailAndPassword(
+ auth,
+ testEmail,
+ testPassword
+ )
+ if (signInResponse.user) {
+ await handleUser(signInResponse.user)
+ // Set pending redirect - will navigate after state is updated
+ setPendingRedirect('/home')
+ return
+ }
+ } catch (signInError: unknown) {
+ const error =
+ signInError && typeof signInError === 'object' && 'code' in signInError
+ ? (signInError as { code?: string })
+ : null
+
+ const isUserNotFound =
+ error?.code === 'auth/user-not-found' ||
+ error?.code === 'auth/invalid-credential'
+
+ if (!isUserNotFound) {
+ console.error('Sign in error:', signInError)
+ setLoading(false)
+ return
+ }
+
+ try {
+ const createResponse = await createUserWithEmailAndPassword(
+ auth,
+ testEmail,
+ testPassword
+ )
+ if (createResponse.user) {
+ await handleUser(createResponse.user)
+ // Set pending redirect - will navigate after state is updated
+ setPendingRedirect('/home')
+ return
+ }
+ } catch (createError: unknown) {
+ const createErr =
+ createError &&
+ typeof createError === 'object' &&
+ 'code' in createError
+ ? (createError as { code?: string })
+ : null
+
+ if (createErr?.code === 'auth/email-already-in-use') {
+ try {
+ const retrySignIn = await signInWithEmailAndPassword(
+ auth,
+ testEmail,
+ testPassword
+ )
+ if (retrySignIn.user) {
+ await handleUser(retrySignIn.user)
+ // Set pending redirect - will navigate after state is updated
+ setPendingRedirect('/home')
+ return
+ }
+ } catch (retryError) {
+ console.error('Retry sign in error:', retryError)
+ }
+ } else {
+ console.error('Create user error:', createError)
+ }
+ setLoading(false)
+ }
+ }
+ }
+
+ const signout = async () => {
+ router.push('/signin')
+ const auth = getAuth()
+ if (!auth) {
+ await handleUser(null)
+ return
+ }
+ await firebaseSignOut(auth)
+ await handleUser(null)
+ }
+
+ // biome-ignore lint/correctness/useExhaustiveDependencies: Will cause infinite loop
+ useEffect(() => {
+ if (typeof window === 'undefined') {
+ // On server, keep loading true (will be set to false on client)
+ return
+ }
+
+ const auth = getAuth()
+
+ if (!auth) {
+ globalLoading = false
+ setLoading(false)
+ return
+ }
+
+ if (globalUser && !user) {
+ setUser(globalUser)
+ setLoading(false)
+ return
+ }
+
+ if (authListenerInitialized) {
+ // Sync state with global state if it changed
+ // Use functional updates to avoid needing user in dependencies
+ setUser((currentUser) => {
+ if (currentUser !== globalUser) {
+ return globalUser
+ }
+ return currentUser
+ })
+ setLoading((currentLoading) => {
+ if (currentLoading !== globalLoading) {
+ return globalLoading
+ }
+ return currentLoading
+ })
+ return
+ }
+
+ // Initialize auth listener - it will call handleUser when auth state is determined
+ // This restores the user from Firebase Auth persistence on page refresh
+ // The listener fires immediately with the current user (if any) and then on changes
+ authListenerInitialized = true
+ const unsubscribe = onIdTokenChanged(auth, (firebaseUser) => {
+ // This will be called immediately with current user (or null) and then on changes
+ // Wrap in async IIFE to properly handle errors and prevent unhandled rejections
+ ;(async () => {
+ try {
+ await handleUser(firebaseUser)
+ } catch (error) {
+ console.error('Error in auth state handler:', error)
+ // Ensure loading state is set to false even if handleUser fails
+ globalLoading = false
+ setLoading(false)
+ }
+ })()
+ })
+
+ return () => {
+ unsubscribe()
+ authListenerInitialized = false
+ }
+ }, [handleUser]) // Only depend on handleUser to prevent re-initialization
+
+ return {
+ user,
+ loading,
+ signinWithGoogle,
+ signinWithTestUser,
+ signout,
+ }
+}
+
+// Helper to add timeout to a promise
+function withTimeout(promise: Promise, timeoutMs: number): Promise {
+ return Promise.race([
+ promise,
+ new Promise((_, reject) =>
+ setTimeout(
+ () => reject(new Error(`Operation timed out after ${timeoutMs}ms`)),
+ timeoutMs
+ )
+ ),
+ ])
+}
+
+const formatUser = async (rawUser: User): Promise => {
+ let token = ''
+ try {
+ // Add 5 second timeout to token retrieval to prevent hanging on page refresh
+ const idTokenResult = await withTimeout(rawUser.getIdTokenResult(), 5000)
+ token = idTokenResult.token
+ } catch (error) {
+ // Token retrieval failed or timed out, continue without token
+ console.warn(
+ 'Token retrieval failed:',
+ error instanceof Error ? error.message : 'Unknown error'
+ )
+ }
+
+ const alertId = await generateUniqueString(6)
+
+ return {
+ alertId,
+ email: rawUser.email || '',
+ name: rawUser.displayName || '',
+ photoUrl: rawUser.photoURL || undefined,
+ provider: rawUser.providerData?.[0]?.providerId || 'password',
+ token: token || '',
+ uid: rawUser.uid,
+ }
+}
+
+export function ProtectRoute({
+ children,
+}: {
+ children: React.ReactNode
+}): React.ReactElement | null {
+ const { user, loading } = useAuth()
+ const pathname = usePathname()
+ const router = useRouter()
+ const [isRedirecting, setIsRedirecting] = useState(false)
+
+ // Handle redirect in useEffect to avoid updating Router during render
+ useEffect(() => {
+ // Don't redirect if we're already redirecting or if we're on an allowed page
+ if (
+ isRedirecting ||
+ pathname === '/signin' ||
+ pathname.includes('emergency')
+ ) {
+ return
+ }
+
+ if (!loading && !user) {
+ setIsRedirecting(true)
+ router.replace('/signin')
+ }
+ }, [loading, user, pathname, router, isRedirecting])
+
+ // Reset redirecting flag when user becomes available
+ useEffect(() => {
+ if (user) {
+ setIsRedirecting(false)
+ }
+ }, [user])
+
+ if (loading && !user) {
+ return
+ }
+
+ if (!user) {
+ // Allow access to signin and emergency pages
+ if (pathname === '/signin' || pathname.includes('emergency')) {
+ return <>{children}>
+ }
+
+ // Show loading screen while redirecting
+ return
+ }
+
+ return <>{children}>
+}
diff --git a/src/lib/contexts/ThemeContext.tsx b/src/lib/contexts/ThemeContext.tsx
new file mode 100644
index 0000000..d15d990
--- /dev/null
+++ b/src/lib/contexts/ThemeContext.tsx
@@ -0,0 +1,64 @@
+import type React from 'react'
+import { createContext, useContext, useEffect, useState } from 'react'
+
+export type Theme = 'light' | 'dark'
+
+export interface ThemeContextValue {
+ theme: Theme
+ switchTheme: () => void
+}
+
+export interface ThemeProviderProps {
+ children: React.ReactNode
+}
+
+const ThemeContext = createContext(undefined)
+
+const THEME_STORAGE_KEY = 'hemolog-theme'
+
+export function ThemeProvider({ children }: ThemeProviderProps): JSX.Element {
+ // Always start with 'light' to match server-rendered HTML
+ const [theme, setTheme] = useState('light')
+ const [mounted, setMounted] = useState(false)
+
+ // Load theme from localStorage after mount to avoid hydration mismatch
+ useEffect(() => {
+ setMounted(true)
+ const stored = localStorage.getItem(THEME_STORAGE_KEY)
+ if (stored === 'dark' || stored === 'light') {
+ setTheme(stored)
+ }
+ }, [])
+
+ useEffect(() => {
+ // Only apply theme changes after initial mount to avoid hydration issues
+ if (!mounted) return
+
+ const root = document.documentElement
+ if (theme === 'dark') {
+ root.classList.add('dark')
+ } else {
+ root.classList.remove('dark')
+ }
+ localStorage.setItem(THEME_STORAGE_KEY, theme)
+ }, [theme, mounted])
+
+ const switchTheme = (): void => {
+ setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'))
+ }
+
+ const value: ThemeContextValue = {
+ theme,
+ switchTheme,
+ }
+
+ return {children}
+}
+
+export function useTheme(): ThemeContextValue {
+ const context = useContext(ThemeContext)
+ if (context === undefined) {
+ throw new Error('useTheme must be used within a ThemeProvider')
+ }
+ return context
+}
diff --git a/src/lib/db/feedback.ts b/src/lib/db/feedback.ts
new file mode 100644
index 0000000..da79989
--- /dev/null
+++ b/src/lib/db/feedback.ts
@@ -0,0 +1,32 @@
+import {
+ createDocument,
+ deleteDocument,
+ updateDocument,
+} from '@/lib/firestore-lite'
+import type { AttachedUserType } from '@/lib/types/users'
+
+export interface FeedbackType {
+ uid?: string
+ createdAt: string
+ message: string
+ user: AttachedUserType
+}
+
+// Create a new feedback document
+export async function createFeedback(data: FeedbackType): Promise {
+ const docId = await createDocument('feedback', data)
+ return docId
+}
+
+// Delete a feedback document (hard delete)
+export async function deleteFeedback(uid: string): Promise {
+ await deleteDocument('feedback', uid)
+}
+
+// Update a feedback document
+export async function updateFeedback(
+ uid: string,
+ newValues: Partial
+): Promise {
+ await updateDocument('feedback', uid, newValues)
+}
diff --git a/src/lib/db/treatments.ts b/src/lib/db/treatments.ts
new file mode 100644
index 0000000..f8f61f9
--- /dev/null
+++ b/src/lib/db/treatments.ts
@@ -0,0 +1,71 @@
+import {
+ createDocument,
+ getDocuments,
+ softDeleteDocument,
+ updateDocument,
+ where,
+} from '@/lib/firestore-lite'
+import type { AttachedUserType } from '@/lib/types/users'
+
+export enum TreatmentTypeEnum {
+ PROPHY = 'PROPHY',
+ BLEED = 'BLEED',
+ PREVENTATIVE = 'PREVENTATIVE',
+ ANTIBODY = 'ANTIBODY',
+}
+
+export type TreatmentTypeOptions =
+ | TreatmentTypeEnum.PROPHY
+ | TreatmentTypeEnum.BLEED
+ | TreatmentTypeEnum.PREVENTATIVE
+ | TreatmentTypeEnum.ANTIBODY
+
+export interface Medication {
+ brand: string
+ costPerUnit?: number
+ lot?: string
+ units: number
+}
+
+export interface TreatmentType {
+ deletedAt: string | null
+ uid?: string
+ cause: string
+ createdAt: string
+ date: string
+ medication: Medication
+ sites: string
+ type: TreatmentTypeOptions
+ user: AttachedUserType
+}
+
+// Create a new treatment document
+export async function createTreatment(data: TreatmentType): Promise {
+ const docId = await createDocument('infusions', data)
+ return docId
+}
+
+// Soft delete a treatment (sets deletedAt timestamp)
+export async function deleteTreatment(uid: string): Promise {
+ await softDeleteDocument('infusions', uid)
+}
+
+// Update a treatment document
+export async function updateTreatment(
+ uid: string,
+ newValues: Partial
+): Promise {
+ await updateDocument('infusions', uid, newValues)
+}
+
+// Fetch treatments for a user (used by TanStack Query)
+export async function fetchTreatments(
+ userUid: string
+): Promise {
+ const treatments = await getDocuments(
+ 'infusions',
+ where('user.uid', '==', userUid),
+ where('deletedAt', '==', null)
+ )
+ return treatments
+}
diff --git a/src/lib/db/users.ts b/src/lib/db/users.ts
new file mode 100644
index 0000000..a42fb4c
--- /dev/null
+++ b/src/lib/db/users.ts
@@ -0,0 +1,70 @@
+import {
+ getDocument,
+ getDocuments,
+ limit,
+ setDocument,
+ where,
+} from '@/lib/firestore-lite'
+import type { Person } from '../types/person'
+import type { UserType } from '../types/users'
+
+// Helper to add timeout to a promise
+function withTimeout(promise: Promise, timeoutMs: number): Promise {
+ return Promise.race([
+ promise,
+ new Promise((_, reject) =>
+ setTimeout(
+ () => reject(new Error(`Operation timed out after ${timeoutMs}ms`)),
+ timeoutMs
+ )
+ ),
+ ])
+}
+
+// Create or update a user document
+export async function createUser(
+ uid: string,
+ userData: Partial
+): Promise {
+ // Remove token from userData as it shouldn't be stored in Firestore
+ const { token: _token, ...dataWithoutToken } = userData
+
+ try {
+ // Create or update user document with 10 second timeout
+ await withTimeout(
+ setDocument('users', uid, { uid, ...dataWithoutToken }),
+ 10000 // 10 second timeout
+ )
+
+ console.log('User document created/updated:', uid)
+ } catch (error) {
+ console.error('Error creating/updating user document:', error)
+ throw error
+ }
+}
+
+// Update a user document
+export async function updateUser(
+ uid: string,
+ userData: Partial
+): Promise {
+ await setDocument('users', uid, userData, true)
+}
+
+// Fetch a user by UID (used by TanStack Query)
+export async function fetchUserByUid(uid: string): Promise {
+ const user = await getDocument('users', uid)
+ return user
+}
+
+// Fetch a user by alertId (used for emergency access)
+export async function fetchUserByAlertId(
+ alertId: string
+): Promise {
+ const users = await getDocuments(
+ 'users',
+ where('alertId', '==', alertId),
+ limit(1)
+ )
+ return users.length > 0 ? users[0] : null
+}
diff --git a/lib/firebase-admin.ts b/src/lib/firebase-admin.ts
similarity index 88%
rename from lib/firebase-admin.ts
rename to src/lib/firebase-admin.ts
index 5316f46..01b4840 100644
--- a/lib/firebase-admin.ts
+++ b/src/lib/firebase-admin.ts
@@ -2,9 +2,9 @@
// Initializes firebase with admin privileges and returns both {db} used for accessing Firestore
// and {auth} use to verify logged in people.
-import { initializeApp, getApps, cert, type App } from 'firebase-admin/app'
-import { getFirestore, type Firestore } from 'firebase-admin/firestore'
-import { getAuth, type Auth } from 'firebase-admin/auth'
+import { type App, cert, getApps, initializeApp } from 'firebase-admin/app'
+import { type Auth, getAuth } from 'firebase-admin/auth'
+import { type Firestore, getFirestore } from 'firebase-admin/firestore'
const useEmulators = process.env.NEXT_PUBLIC_USE_EMULATORS === 'true'
diff --git a/src/lib/firebase.ts b/src/lib/firebase.ts
new file mode 100644
index 0000000..4b3c2a1
--- /dev/null
+++ b/src/lib/firebase.ts
@@ -0,0 +1,78 @@
+// firebase.ts
+// Initializes firebase across app for authentication only
+// Firestore operations are now handled by firestore-lite.ts
+
+import { type FirebaseApp, getApps, initializeApp } from 'firebase/app'
+import {
+ type Auth,
+ connectAuthEmulator,
+ getAuth as getFirebaseAuth,
+} from 'firebase/auth'
+
+const firebaseConfig = {
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY || 'development',
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || 'localhost',
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || 'hemolog',
+}
+
+let firebaseApp: FirebaseApp | null = null
+let authInstance: Auth | null = null
+let authEmulatorConnected = false
+
+function getApp(): FirebaseApp | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ if (!firebaseApp) {
+ const apps = getApps()
+ if (apps.length === 0) {
+ firebaseApp = initializeApp(firebaseConfig)
+ } else {
+ firebaseApp = apps[0]
+ }
+ }
+
+ return firebaseApp
+}
+
+export function getAuth(): Auth | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ const app = getApp()
+ if (!app) {
+ return null
+ }
+
+ if (!authInstance) {
+ authInstance = getFirebaseAuth(app)
+
+ // Connect to emulator if developing locally
+ const useEmulators =
+ process.env.NEXT_PUBLIC_USE_EMULATORS === 'true' ||
+ process.env.NEXT_PUBLIC_USE_EMULATORS === '1'
+
+ if (useEmulators && !authEmulatorConnected) {
+ try {
+ connectAuthEmulator(authInstance, 'http://localhost:9099', {
+ disableWarnings: true,
+ })
+ authEmulatorConnected = true
+ } catch (error) {
+ // If emulator is already connected, Firebase throws an error
+ // We can safely ignore it, but log other errors for debugging
+ if (
+ error instanceof Error &&
+ !error.message.includes('already been called')
+ ) {
+ console.warn('Auth emulator connection warning:', error.message)
+ }
+ authEmulatorConnected = true // Mark as connected even if error occurred
+ }
+ }
+ }
+
+ return authInstance
+}
diff --git a/src/lib/firestore-lite.ts b/src/lib/firestore-lite.ts
new file mode 100644
index 0000000..918578e
--- /dev/null
+++ b/src/lib/firestore-lite.ts
@@ -0,0 +1,228 @@
+// firestore-lite.ts
+// Lightweight Firestore client using REST API via firebase/firestore/lite
+// This replaces the full Firestore SDK to reduce bundle size and eliminate WebSocket issues
+
+import { type FirebaseApp, getApps, initializeApp } from 'firebase/app'
+import {
+ addDoc,
+ collection,
+ connectFirestoreEmulator,
+ type DocumentData,
+ deleteDoc,
+ doc,
+ type Firestore,
+ getDoc,
+ getDocs,
+ getFirestore,
+ limit,
+ orderBy,
+ type QueryConstraint,
+ query,
+ setDoc,
+ updateDoc,
+ type WithFieldValue,
+ where,
+} from 'firebase/firestore/lite'
+
+const firebaseConfig = {
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_PUBLIC_API_KEY || 'development',
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || 'localhost',
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || 'hemolog',
+}
+
+let firebaseApp: FirebaseApp | null = null
+let firestoreInstance: Firestore | null = null
+let emulatorConnected = false
+
+function getApp(): FirebaseApp | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ if (!firebaseApp) {
+ const apps = getApps()
+ if (apps.length === 0) {
+ firebaseApp = initializeApp(firebaseConfig)
+ } else {
+ firebaseApp = apps[0]
+ }
+ }
+
+ return firebaseApp
+}
+
+export function getFirestoreLite(): Firestore | null {
+ if (typeof window === 'undefined') {
+ return null
+ }
+
+ const app = getApp()
+ if (!app) {
+ return null
+ }
+
+ if (!firestoreInstance) {
+ firestoreInstance = getFirestore(app)
+
+ // Connect to emulator if in development mode
+ const useEmulators =
+ process.env.NEXT_PUBLIC_USE_EMULATORS === 'true' ||
+ process.env.NEXT_PUBLIC_USE_EMULATORS === '1' ||
+ window.location.hostname === 'localhost'
+
+ if (useEmulators && !emulatorConnected) {
+ try {
+ connectFirestoreEmulator(firestoreInstance, 'localhost', 8082)
+ emulatorConnected = true
+ console.log('✓ Connected to Firestore Lite emulator at localhost:8082')
+ } catch (error) {
+ if (
+ error instanceof Error &&
+ error.message.includes('already been called')
+ ) {
+ emulatorConnected = true
+ } else {
+ console.warn(
+ 'Firestore Lite emulator connection warning:',
+ error instanceof Error ? error.message : String(error)
+ )
+ emulatorConnected = true
+ }
+ }
+ }
+ }
+
+ return firestoreInstance
+}
+
+// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
+function cleanUndefined(obj: T): Partial {
+ return Object.fromEntries(
+ Object.entries(obj).filter(([, v]) => v !== undefined)
+ ) as Partial
+}
+
+// Generic document fetch by ID
+export async function getDocument(
+ collectionName: string,
+ docId: string
+): Promise<(T & { id: string }) | null> {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const docRef = doc(collection(db, collectionName), docId)
+ const docSnap = await getDoc(docRef)
+
+ if (!docSnap.exists()) {
+ return null
+ }
+
+ return { id: docSnap.id, ...docSnap.data() } as T & { id: string }
+}
+
+// Generic collection query
+export async function getDocuments(
+ collectionName: string,
+ ...queryConstraints: QueryConstraint[]
+): Promise<(T & { id: string })[]> {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const collectionRef = collection(db, collectionName)
+ const q = query(collectionRef, ...queryConstraints)
+ const querySnapshot = await getDocs(q)
+
+ return querySnapshot.docs.map((docSnap) => ({
+ id: docSnap.id,
+ ...docSnap.data(),
+ })) as (T & { id: string })[]
+}
+
+// Create a new document with auto-generated ID
+export async function createDocument(
+ collectionName: string,
+ data: WithFieldValue
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const cleanData = cleanUndefined(data as object)
+ const collectionRef = collection(db, collectionName)
+ const docRef = await addDoc(collectionRef, cleanData)
+
+ // Update the document with its own ID (common pattern for this app)
+ await setDoc(docRef, { uid: docRef.id, ...cleanData }, { merge: true })
+
+ return docRef.id
+}
+
+// Create or update a document with a specific ID
+export async function setDocument(
+ collectionName: string,
+ docId: string,
+ data: WithFieldValue,
+ merge = true
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const cleanData = cleanUndefined(data as object)
+ const docRef = doc(collection(db, collectionName), docId)
+ await setDoc(docRef, cleanData, { merge })
+}
+
+// Update specific fields of a document
+export async function updateDocument(
+ collectionName: string,
+ docId: string,
+ data: Partial
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const cleanData = cleanUndefined(data as object)
+ const docRef = doc(collection(db, collectionName), docId)
+ await updateDoc(docRef, cleanData)
+}
+
+// Delete a document (hard delete)
+export async function deleteDocument(
+ collectionName: string,
+ docId: string
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const docRef = doc(collection(db, collectionName), docId)
+ await deleteDoc(docRef)
+}
+
+// Soft delete a document (set deletedAt timestamp)
+export async function softDeleteDocument(
+ collectionName: string,
+ docId: string
+): Promise {
+ const db = getFirestoreLite()
+ if (!db) {
+ throw new Error('Firestore not available')
+ }
+
+ const docRef = doc(collection(db, collectionName), docId)
+ await setDoc(docRef, { deletedAt: new Date().toISOString() }, { merge: true })
+}
+
+// Re-export query helpers for building constraints
+export { collection, doc, query, where, limit, orderBy }
+export type { QueryConstraint, DocumentData }
diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts
new file mode 100644
index 0000000..c14ee09
--- /dev/null
+++ b/src/lib/helpers.ts
@@ -0,0 +1,36 @@
+export const CONFIG = {
+ blueskyUrl: 'https://bsky.app/profile/michaelschultz.com',
+}
+
+export async function generateUniqueString(length: number): Promise {
+ return Math.random()
+ .toString(36)
+ .substring(2, 2 + length)
+}
+
+export function track(event: string, data: Record) {
+ console.log('track', event, data)
+}
+
+import type { TreatmentType } from './db/treatments'
+
+export function filterTreatments(
+ treatments: TreatmentType[] | undefined,
+ filterYear: string
+): TreatmentType[] {
+ if (!treatments) {
+ return []
+ }
+
+ if (filterYear === 'All time') {
+ return treatments
+ }
+
+ return treatments.filter((treatment) => {
+ if (!treatment.date) {
+ return false
+ }
+ const treatmentYear = new Date(treatment.date).getFullYear().toString()
+ return treatmentYear === filterYear
+ })
+}
diff --git a/src/lib/hooks/useEmergencyUserQuery.ts b/src/lib/hooks/useEmergencyUserQuery.ts
new file mode 100644
index 0000000..d17a851
--- /dev/null
+++ b/src/lib/hooks/useEmergencyUserQuery.ts
@@ -0,0 +1,52 @@
+import { useQuery } from '@tanstack/react-query'
+import { fetchUserByAlertId } from '@/lib/db/users'
+import type { Person } from '@/lib/types/person'
+
+// Query key factory for emergency users (by alertId)
+export const emergencyUserKeys = {
+ all: ['users', 'alertId'] as const,
+ detail: (alertId: string) => [...emergencyUserKeys.all, alertId] as const,
+}
+
+interface UseEmergencyUserQueryOptions {
+ enabled?: boolean
+}
+
+interface EmergencyUserQueryResult {
+ person: Person | null
+ isLoading: boolean
+ isError: boolean
+ error: Error | null
+ refetch: () => void
+}
+
+export function useEmergencyUserQuery(
+ alertId: string | string[] | undefined,
+ options: UseEmergencyUserQueryOptions = {}
+): EmergencyUserQueryResult {
+ // Normalize alertId to string
+ const normalizedAlertId = Array.isArray(alertId) ? alertId[0] : alertId
+ const { enabled = true } = options
+
+ const query = useQuery({
+ queryKey: emergencyUserKeys.detail(normalizedAlertId ?? ''),
+ queryFn: async () => {
+ if (!normalizedAlertId) {
+ return null
+ }
+ return fetchUserByAlertId(normalizedAlertId)
+ },
+ enabled: enabled && !!normalizedAlertId,
+ staleTime: 60 * 1000, // 1 minute (emergency data doesn't change often)
+ })
+
+ return {
+ person: query.data ?? null,
+ isLoading: query.isLoading,
+ isError: query.isError,
+ error: query.error,
+ refetch: query.refetch,
+ }
+}
+
+export default useEmergencyUserQuery
diff --git a/src/lib/hooks/useFeedbackMutations.ts b/src/lib/hooks/useFeedbackMutations.ts
new file mode 100644
index 0000000..4822512
--- /dev/null
+++ b/src/lib/hooks/useFeedbackMutations.ts
@@ -0,0 +1,100 @@
+import { useMutation } from '@tanstack/react-query'
+import toast from 'react-hot-toast'
+import {
+ createFeedback,
+ deleteFeedback,
+ type FeedbackType,
+ updateFeedback,
+} from '@/lib/db/feedback'
+
+interface UseFeedbackMutationsOptions {
+ onCreateSuccess?: (docId: string) => void
+ onDeleteSuccess?: () => void
+ onUpdateSuccess?: () => void
+ onError?: (error: Error) => void
+}
+
+export function useFeedbackMutations(
+ options: UseFeedbackMutationsOptions = {}
+) {
+ const { onCreateSuccess, onDeleteSuccess, onUpdateSuccess, onError } = options
+
+ // Create feedback mutation
+ const createMutation = useMutation({
+ mutationFn: async (data: FeedbackType) => {
+ const docId = await createFeedback(data)
+ return docId
+ },
+ onError: (error) => {
+ toast.error(
+ `Failed to submit feedback: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: (docId) => {
+ toast.success('Thank you for your feedback!')
+ onCreateSuccess?.(docId)
+ },
+ })
+
+ // Delete feedback mutation
+ const deleteMutation = useMutation({
+ mutationFn: async (uid: string) => {
+ await deleteFeedback(uid)
+ return uid
+ },
+ onError: (error) => {
+ toast.error(
+ `Failed to delete feedback: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ onDeleteSuccess?.()
+ },
+ })
+
+ // Update feedback mutation
+ const updateMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ data,
+ }: {
+ uid: string
+ data: Partial
+ }) => {
+ await updateFeedback(uid, data)
+ return { uid, data }
+ },
+ onError: (error) => {
+ toast.error(
+ `Failed to update feedback: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ onUpdateSuccess?.()
+ },
+ })
+
+ return {
+ createFeedback: createMutation.mutate,
+ createFeedbackAsync: createMutation.mutateAsync,
+ isCreating: createMutation.isPending,
+
+ deleteFeedback: deleteMutation.mutate,
+ deleteFeedbackAsync: deleteMutation.mutateAsync,
+ isDeleting: deleteMutation.isPending,
+
+ updateFeedback: updateMutation.mutate,
+ updateFeedbackAsync: updateMutation.mutateAsync,
+ isUpdating: updateMutation.isPending,
+
+ isPending:
+ createMutation.isPending ||
+ deleteMutation.isPending ||
+ updateMutation.isPending,
+ }
+}
+
+export default useFeedbackMutations
diff --git a/src/lib/hooks/useTreatmentMutations.ts b/src/lib/hooks/useTreatmentMutations.ts
new file mode 100644
index 0000000..8d9c68a
--- /dev/null
+++ b/src/lib/hooks/useTreatmentMutations.ts
@@ -0,0 +1,197 @@
+import { useMutation, useQueryClient } from '@tanstack/react-query'
+import toast from 'react-hot-toast'
+import {
+ createTreatment,
+ deleteTreatment,
+ type TreatmentType,
+ updateTreatment,
+} from '@/lib/db/treatments'
+import { treatmentKeys } from './useTreatmentsQuery'
+
+interface UseTreatmentMutationsOptions {
+ onCreateSuccess?: (docId: string) => void
+ onUpdateSuccess?: () => void
+ onDeleteSuccess?: () => void
+ onError?: (error: Error) => void
+}
+
+export function useTreatmentMutations(
+ options: UseTreatmentMutationsOptions = {}
+) {
+ const queryClient = useQueryClient()
+ const { onCreateSuccess, onUpdateSuccess, onDeleteSuccess, onError } = options
+
+ // Create treatment mutation with optimistic update
+ const createMutation = useMutation({
+ mutationFn: async (data: TreatmentType) => {
+ const docId = await createTreatment(data)
+ return docId
+ },
+ onMutate: async (newTreatment) => {
+ // Cancel any outgoing refetches
+ await queryClient.cancelQueries({ queryKey: treatmentKeys.all })
+
+ // Snapshot the previous value
+ const userUid = newTreatment.user.uid
+ const previousTreatments = queryClient.getQueryData(
+ treatmentKeys.list(userUid)
+ )
+
+ // Optimistically update with a temporary ID
+ const optimisticTreatment: TreatmentType = {
+ ...newTreatment,
+ uid: `temp-${Date.now()}`,
+ }
+
+ queryClient.setQueryData(
+ treatmentKeys.list(userUid),
+ (old) => (old ? [optimisticTreatment, ...old] : [optimisticTreatment])
+ )
+
+ return { previousTreatments, userUid }
+ },
+ onError: (error, _newTreatment, context) => {
+ // Rollback on error
+ if (context?.previousTreatments !== undefined) {
+ queryClient.setQueryData(
+ treatmentKeys.list(context.userUid),
+ context.previousTreatments
+ )
+ }
+ toast.error(
+ `Failed to create treatment: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: (docId) => {
+ toast.success('Treatment logged! Hope all is well.')
+ onCreateSuccess?.(docId)
+ },
+ onSettled: (_data, _error, variables) => {
+ // Refetch to ensure consistency
+ queryClient.invalidateQueries({
+ queryKey: treatmentKeys.list(variables.user.uid),
+ })
+ },
+ })
+
+ // Update treatment mutation with optimistic update
+ const updateMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ userUid,
+ data,
+ }: {
+ uid: string
+ userUid: string
+ data: Partial
+ }) => {
+ await updateTreatment(uid, data)
+ return { uid, userUid, data }
+ },
+ onMutate: async ({ uid, userUid, data }) => {
+ await queryClient.cancelQueries({ queryKey: treatmentKeys.all })
+
+ const previousTreatments = queryClient.getQueryData(
+ treatmentKeys.list(userUid)
+ )
+
+ // Optimistically update
+ queryClient.setQueryData(
+ treatmentKeys.list(userUid),
+ (old) =>
+ old?.map((treatment) =>
+ treatment.uid === uid ? { ...treatment, ...data } : treatment
+ ) ?? []
+ )
+
+ return { previousTreatments, userUid }
+ },
+ onError: (error, _variables, context) => {
+ if (context?.previousTreatments !== undefined) {
+ queryClient.setQueryData(
+ treatmentKeys.list(context.userUid),
+ context.previousTreatments
+ )
+ }
+ toast.error(
+ `Failed to update treatment: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ toast.success('Treatment updated!')
+ onUpdateSuccess?.()
+ },
+ onSettled: (_data, _error, variables) => {
+ queryClient.invalidateQueries({
+ queryKey: treatmentKeys.list(variables.userUid),
+ })
+ },
+ })
+
+ // Delete treatment mutation with optimistic update (soft delete)
+ const deleteMutation = useMutation({
+ mutationFn: async ({ uid, userUid }: { uid: string; userUid: string }) => {
+ await deleteTreatment(uid)
+ return { uid, userUid }
+ },
+ onMutate: async ({ uid, userUid }) => {
+ await queryClient.cancelQueries({ queryKey: treatmentKeys.all })
+
+ const previousTreatments = queryClient.getQueryData(
+ treatmentKeys.list(userUid)
+ )
+
+ // Optimistically remove from list
+ queryClient.setQueryData(
+ treatmentKeys.list(userUid),
+ (old) => old?.filter((treatment) => treatment.uid !== uid) ?? []
+ )
+
+ return { previousTreatments, userUid }
+ },
+ onError: (error, _variables, context) => {
+ if (context?.previousTreatments !== undefined) {
+ queryClient.setQueryData(
+ treatmentKeys.list(context.userUid),
+ context.previousTreatments
+ )
+ }
+ toast.error(
+ `Failed to delete treatment: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ toast.success('Treatment deleted')
+ onDeleteSuccess?.()
+ },
+ onSettled: (_data, _error, variables) => {
+ queryClient.invalidateQueries({
+ queryKey: treatmentKeys.list(variables.userUid),
+ })
+ },
+ })
+
+ return {
+ createTreatment: createMutation.mutate,
+ createTreatmentAsync: createMutation.mutateAsync,
+ isCreating: createMutation.isPending,
+
+ updateTreatment: updateMutation.mutate,
+ updateTreatmentAsync: updateMutation.mutateAsync,
+ isUpdating: updateMutation.isPending,
+
+ deleteTreatment: deleteMutation.mutate,
+ deleteTreatmentAsync: deleteMutation.mutateAsync,
+ isDeleting: deleteMutation.isPending,
+
+ isPending:
+ createMutation.isPending ||
+ updateMutation.isPending ||
+ deleteMutation.isPending,
+ }
+}
+
+export default useTreatmentMutations
diff --git a/src/lib/hooks/useTreatmentSheet.tsx b/src/lib/hooks/useTreatmentSheet.tsx
new file mode 100644
index 0000000..854baaa
--- /dev/null
+++ b/src/lib/hooks/useTreatmentSheet.tsx
@@ -0,0 +1,52 @@
+'use client'
+
+import { useRef } from 'react'
+import TreatmentModalContent from '@/components/home/treatmentModalContent'
+import type { TreatmentType } from '@/lib/db/treatments'
+import { useSheet } from '@/lib/providers/sheet-provider'
+
+interface TreatmentSheetOptions {
+ mode: 'create' | 'edit'
+ treatment?: TreatmentType
+ previousTreatment?: TreatmentType
+}
+
+export function useTreatmentSheet() {
+ const { open, close, isOpen } = useSheet()
+ const formRef = useRef<{ handleSubmit: () => void }>(null)
+ const sheetKeyRef = useRef(0)
+
+ // React 19 compiler handles memoization automatically
+ const openTreatmentSheet = (options: TreatmentSheetOptions) => {
+ const { mode, treatment, previousTreatment } = options
+ const title = mode === 'edit' ? 'Edit Treatment' : 'Log Treatment'
+
+ // Increment key to force full remount of component
+ sheetKeyRef.current += 1
+
+ open({
+ title,
+ content: (
+ {
+ close()
+ }}
+ />
+ ),
+ onSave: () => {
+ formRef.current?.handleSubmit()
+ },
+ saveLabel: mode === 'edit' ? 'Save' : 'Log Treatment',
+ })
+ }
+
+ return {
+ openTreatmentSheet,
+ closeTreatmentSheet: close,
+ isOpen,
+ }
+}
diff --git a/src/lib/hooks/useTreatmentsQuery.ts b/src/lib/hooks/useTreatmentsQuery.ts
new file mode 100644
index 0000000..deb0a90
--- /dev/null
+++ b/src/lib/hooks/useTreatmentsQuery.ts
@@ -0,0 +1,70 @@
+import { useQuery } from '@tanstack/react-query'
+import { compareDesc } from 'date-fns'
+import { useAuth } from '@/lib/auth'
+import { fetchTreatments, type TreatmentType } from '@/lib/db/treatments'
+
+// Query key factory for treatments
+export const treatmentKeys = {
+ all: ['infusions'] as const,
+ list: (uid: string) => [...treatmentKeys.all, uid] as const,
+}
+
+interface UseTreatmentsQueryOptions {
+ limit?: number
+ uid?: string
+ // Polling interval in ms (default: no polling)
+ refetchInterval?: number
+}
+
+interface TreatmentQueryResult {
+ data: TreatmentType[]
+ isLoading: boolean
+ isError: boolean
+ error: Error | null
+ isFetching: boolean
+ refetch: () => void
+}
+
+export function useTreatmentsQuery(
+ options: UseTreatmentsQueryOptions = {}
+): TreatmentQueryResult {
+ const { limit: maxItems, uid: overrideUid, refetchInterval } = options
+ const { user } = useAuth()
+ const userUid = overrideUid ?? user?.uid
+
+ const query = useQuery({
+ queryKey: treatmentKeys.list(userUid ?? ''),
+ queryFn: async () => {
+ if (!userUid) {
+ return []
+ }
+ return fetchTreatments(userUid)
+ },
+ enabled: !!userUid,
+ refetchInterval,
+ // Keep data fresh
+ staleTime: 10 * 1000, // 10 seconds
+ })
+
+ // Sort treatments by date (newest first) and apply limit
+ // React 19 compiler automatically memoizes these derived values
+ const sortedData = !query.data
+ ? []
+ : [...query.data].sort((a, b) =>
+ compareDesc(new Date(a.date), new Date(b.date))
+ )
+
+ const limitedData = maxItems ? sortedData.slice(0, maxItems) : sortedData
+
+ return {
+ data: limitedData,
+ isLoading: query.isLoading,
+ isError: query.isError,
+ error: query.error,
+ isFetching: query.isFetching,
+ refetch: query.refetch,
+ }
+}
+
+// Hook alias for backward compatibility
+export default useTreatmentsQuery
diff --git a/src/lib/hooks/useUserMutations.ts b/src/lib/hooks/useUserMutations.ts
new file mode 100644
index 0000000..0c4b599
--- /dev/null
+++ b/src/lib/hooks/useUserMutations.ts
@@ -0,0 +1,105 @@
+import { useMutation, useQueryClient } from '@tanstack/react-query'
+import toast from 'react-hot-toast'
+import { createUser, updateUser } from '@/lib/db/users'
+import type { Person } from '@/lib/types/person'
+import type { UserType } from '@/lib/types/users'
+import { userKeys } from './useUserQuery'
+
+interface UseUserMutationsOptions {
+ onCreateSuccess?: () => void
+ onUpdateSuccess?: () => void
+ onError?: (error: Error) => void
+}
+
+export function useUserMutations(options: UseUserMutationsOptions = {}) {
+ const queryClient = useQueryClient()
+ const { onCreateSuccess, onUpdateSuccess, onError } = options
+
+ // Create user mutation
+ const createMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ userData,
+ }: {
+ uid: string
+ userData: Partial
+ }) => {
+ await createUser(uid, userData)
+ return { uid, userData }
+ },
+ onError: (error) => {
+ console.error('Failed to create user:', error)
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: ({ uid }) => {
+ queryClient.invalidateQueries({ queryKey: userKeys.detail(uid) })
+ onCreateSuccess?.()
+ },
+ })
+
+ // Update user mutation with optimistic update
+ const updateMutation = useMutation({
+ mutationFn: async ({
+ uid,
+ userData,
+ }: {
+ uid: string
+ userData: Partial
+ }) => {
+ await updateUser(uid, userData)
+ return { uid, userData }
+ },
+ onMutate: async ({ uid, userData }) => {
+ await queryClient.cancelQueries({ queryKey: userKeys.detail(uid) })
+
+ const previousUser = queryClient.getQueryData(
+ userKeys.detail(uid)
+ )
+
+ // Optimistically update
+ if (previousUser) {
+ queryClient.setQueryData(userKeys.detail(uid), {
+ ...previousUser,
+ ...userData,
+ })
+ }
+
+ return { previousUser, uid }
+ },
+ onError: (error, _variables, context) => {
+ if (context?.previousUser !== undefined) {
+ queryClient.setQueryData(
+ userKeys.detail(context.uid),
+ context.previousUser
+ )
+ }
+ toast.error(
+ `Failed to update profile: ${error instanceof Error ? error.message : String(error)}`
+ )
+ onError?.(error instanceof Error ? error : new Error(String(error)))
+ },
+ onSuccess: () => {
+ toast.success('Profile updated!')
+ onUpdateSuccess?.()
+ },
+ onSettled: (_data, _error, variables) => {
+ queryClient.invalidateQueries({
+ queryKey: userKeys.detail(variables.uid),
+ })
+ },
+ })
+
+ return {
+ createUser: createMutation.mutate,
+ createUserAsync: createMutation.mutateAsync,
+ isCreating: createMutation.isPending,
+
+ updateUser: updateMutation.mutate,
+ updateUserAsync: updateMutation.mutateAsync,
+ isUpdating: updateMutation.isPending,
+
+ isPending: createMutation.isPending || updateMutation.isPending,
+ }
+}
+
+export default useUserMutations
diff --git a/src/lib/hooks/useUserQuery.ts b/src/lib/hooks/useUserQuery.ts
new file mode 100644
index 0000000..3dc3d54
--- /dev/null
+++ b/src/lib/hooks/useUserQuery.ts
@@ -0,0 +1,53 @@
+import { useQuery } from '@tanstack/react-query'
+import { fetchUserByUid } from '@/lib/db/users'
+import type { Person } from '@/lib/types/person'
+
+// Query key factory for users
+export const userKeys = {
+ all: ['users'] as const,
+ detail: (uid: string) => [...userKeys.all, uid] as const,
+}
+
+interface UseUserQueryOptions {
+ enabled?: boolean
+}
+
+interface UserQueryResult {
+ person: Person | null
+ isLoading: boolean
+ isError: boolean
+ error: Error | null
+ refetch: () => void
+}
+
+export function useUserQuery(
+ uid: string | string[] | undefined,
+ options: UseUserQueryOptions = {}
+): UserQueryResult {
+ // Normalize uid to string
+ const normalizedUid = Array.isArray(uid) ? uid[0] : uid
+ const { enabled = true } = options
+
+ const query = useQuery({
+ queryKey: userKeys.detail(normalizedUid ?? ''),
+ queryFn: async () => {
+ if (!normalizedUid) {
+ return null
+ }
+ return fetchUserByUid(normalizedUid)
+ },
+ enabled: enabled && !!normalizedUid,
+ staleTime: 30 * 1000, // 30 seconds
+ })
+
+ return {
+ person: query.data ?? null,
+ isLoading: query.isLoading,
+ isError: query.isError,
+ error: query.error,
+ refetch: query.refetch,
+ }
+}
+
+// Alias for backward compatibility with useDbUser
+export default useUserQuery
diff --git a/src/lib/providers/query-provider.tsx b/src/lib/providers/query-provider.tsx
new file mode 100644
index 0000000..95fc4f6
--- /dev/null
+++ b/src/lib/providers/query-provider.tsx
@@ -0,0 +1,59 @@
+'use client'
+
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
+import { type ReactNode, useState } from 'react'
+
+// Create a stable QueryClient configuration
+function makeQueryClient() {
+ return new QueryClient({
+ defaultOptions: {
+ queries: {
+ // Data is considered fresh for 30 seconds
+ staleTime: 30 * 1000,
+ // Cache data for 5 minutes
+ gcTime: 5 * 60 * 1000,
+ // Retry failed requests up to 2 times
+ retry: 2,
+ // Don't refetch on window focus by default (can enable per-query)
+ refetchOnWindowFocus: false,
+ // Refetch on reconnect
+ refetchOnReconnect: true,
+ },
+ mutations: {
+ // Retry failed mutations once
+ retry: 1,
+ },
+ },
+ })
+}
+
+// Singleton for browser, but create new for each SSR request
+let browserQueryClient: QueryClient | undefined
+
+function getQueryClient() {
+ if (typeof window === 'undefined') {
+ // Server: always make a new query client
+ return makeQueryClient()
+ }
+ // Browser: make a new query client if we don't already have one
+ if (!browserQueryClient) {
+ browserQueryClient = makeQueryClient()
+ }
+ return browserQueryClient
+}
+
+interface QueryProviderProps {
+ children: ReactNode
+}
+
+export function QueryProvider({ children }: QueryProviderProps) {
+ // Use useState to ensure the same client is used across re-renders
+ const [queryClient] = useState(() => getQueryClient())
+
+ return (
+ {children}
+ )
+}
+
+// Export the query client getter for use in mutations that need direct access
+export { getQueryClient }
diff --git a/src/lib/providers/sheet-provider.css b/src/lib/providers/sheet-provider.css
new file mode 100644
index 0000000..d822d03
--- /dev/null
+++ b/src/lib/providers/sheet-provider.css
@@ -0,0 +1,105 @@
+/* SheetProvider styles */
+
+.SheetProvider-content {
+ /* INNER-LAYOUT */
+ container-type: size;
+ display: grid;
+ grid-template-rows: min-content 1fr;
+}
+
+.SheetProvider-header {
+ /* SELF-LAYOUT */
+ height: 57px;
+
+ /* APPEARANCE */
+ border-bottom: 1px solid rgb(229, 231, 235);
+
+ /* INNER-LAYOUT */
+ position: relative;
+ padding-inline: 1.25rem;
+ display: grid;
+ grid-template-columns: 80px 1fr 80px;
+ align-items: center;
+ gap: 0.75rem;
+}
+@media (min-width: 800px) {
+ .SheetProvider-header {
+ /* SELF-LAYOUT */
+ height: 53px;
+ }
+}
+
+.SheetProvider-cancelButton {
+ /* SELF-LAYOUT */
+ justify-self: start;
+
+ /* APPEARANCE */
+ border-radius: 6px;
+ outline-offset: 5px;
+ border: none;
+ appearance: none;
+ background-color: transparent;
+
+ /* INTERACTIVITY */
+ cursor: pointer;
+
+ /* INNER-LAYOUT */
+ padding: 0;
+
+ /* TEXT */
+ font-size: 17.25px;
+ font-weight: 500;
+ color: rgb(52, 159, 13);
+}
+
+.SheetProvider-title {
+ /* SELF-LAYOUT */
+ margin: 0;
+ justify-self: center;
+
+ /* TEXT */
+ font-size: 17.25px;
+ font-weight: 620;
+ color: rgb(31, 41, 55);
+}
+
+.SheetProvider-saveButton {
+ /* SELF-LAYOUT */
+ justify-self: end;
+
+ /* APPEARANCE */
+ border-radius: 6px;
+ outline-offset: 5px;
+ border: none;
+ appearance: none;
+ background-color: transparent;
+
+ /* INTERACTIVITY */
+ cursor: pointer;
+
+ /* INNER-LAYOUT */
+ padding: 0;
+
+ /* TEXT */
+ font-size: 17.25px;
+ font-weight: 600;
+ color: rgb(52, 159, 13);
+}
+
+.SheetProvider-scrollView {
+ /* SELF-LAYOUT */
+ min-height: 0;
+
+ /* APPEARANCE */
+ overflow: clip;
+ overflow: hidden;
+ border-radius: 0 0 var(--sheetWithKeyboard-radius)
+ var(--sheetWithKeyboard-radius);
+ background-color: white;
+}
+
+.SheetProvider-scrollContent {
+ /* INNER-LAYOUT */
+ display: grid;
+ align-content: start;
+}
diff --git a/src/lib/providers/sheet-provider.tsx b/src/lib/providers/sheet-provider.tsx
new file mode 100644
index 0000000..a29d649
--- /dev/null
+++ b/src/lib/providers/sheet-provider.tsx
@@ -0,0 +1,237 @@
+'use client'
+
+import { Scroll, useClientMediaQuery } from '@silk-hq/components'
+import {
+ createContext,
+ type ReactNode,
+ useCallback,
+ useContext,
+ useMemo,
+ useRef,
+ useState,
+} from 'react'
+import { SheetWithKeyboard } from '@/components/home/sheetWithKeyboard/sheetWithKeyboard'
+import '@/components/home/sheetWithKeyboard/SheetWithKeyboard.css'
+import './sheet-provider.css'
+
+// ================================================================================================
+// Types
+// ================================================================================================
+
+interface SheetConfig {
+ content: ReactNode
+ title?: string
+ className?: string
+ onClose?: () => void
+ // Header actions
+ showHeader?: boolean
+ cancelLabel?: string
+ saveLabel?: string
+ onSave?: () => void
+}
+
+interface SheetContextValue {
+ open: (config: SheetConfig) => void
+ close: () => void
+ isOpen: boolean
+}
+
+// ================================================================================================
+// Context
+// ================================================================================================
+
+const SheetContext = createContext(null)
+
+// ================================================================================================
+// Hook
+// ================================================================================================
+
+export function useSheet(): SheetContextValue {
+ const context = useContext(SheetContext)
+ if (!context) {
+ throw new Error('useSheet must be used within a SheetProvider')
+ }
+ return context
+}
+
+// ================================================================================================
+// Provider
+// ================================================================================================
+
+interface SheetProviderProps {
+ children: ReactNode
+}
+
+export function SheetProvider({ children }: SheetProviderProps) {
+ const largeViewport = useClientMediaQuery('(min-width: 800px)')
+
+ // Sheet state
+ const [presented, setPresented] = useState(false)
+ const [shouldRenderPortal, setShouldRenderPortal] = useState(false)
+ const [config, setConfig] = useState(null)
+
+ // Refs for cleanup and state tracking
+ const onCloseRef = useRef<(() => void) | undefined>(undefined)
+ const portalRemovalTimerRef = useRef(null)
+ const presentedRef = useRef(presented)
+ const configRef = useRef(null)
+
+ // Keep refs in sync
+ presentedRef.current = presented
+ configRef.current = config
+
+ // Clear any pending portal removal timer
+ // React 19 compiler handles memoization automatically
+ const clearPortalTimer = () => {
+ if (portalRemovalTimerRef.current) {
+ clearTimeout(portalRemovalTimerRef.current)
+ portalRemovalTimerRef.current = null
+ }
+ }
+
+ // Open sheet with config - kept as useCallback for context stability
+ // biome-ignore lint/correctness/useExhaustiveDependencies: will cause infinite loop
+ const open = useCallback((newConfig: SheetConfig) => {
+ // If there's still a config (sheet closing), wait for it to clear first
+ if (configRef.current) {
+ // Clear immediately and wait a frame for state to update
+ setConfig(null)
+ setShouldRenderPortal(false)
+ requestAnimationFrame(() => {
+ onCloseRef.current = newConfig.onClose
+ setConfig(newConfig)
+ setShouldRenderPortal(true)
+ requestAnimationFrame(() => {
+ setPresented(true)
+ })
+ })
+ return
+ }
+
+ clearPortalTimer()
+ onCloseRef.current = newConfig.onClose
+ setConfig(newConfig)
+ setShouldRenderPortal(true)
+ // Small delay to ensure portal is mounted before presenting
+ requestAnimationFrame(() => {
+ setPresented(true)
+ })
+ }, [])
+
+ // Close sheet - kept as useCallback for context stability
+ const close = useCallback(() => {
+ setPresented(false)
+ }, [])
+
+ // Handle Silk's presented state changes - this is a sync callback
+ // Silk calls this to tell us what its internal state is
+ // Kept as useCallback since it's passed as a prop callback
+ // biome-ignore lint/correctness/useExhaustiveDependencies: will cause infinite loop
+ const handlePresentedChange = useCallback((newPresented: boolean) => {
+ // Only update if value actually changed to prevent loops
+ if (newPresented === presentedRef.current) {
+ return
+ }
+
+ // Sync our state with Silk's internal state
+ setPresented(newPresented)
+
+ // When sheet has fully closed (presented becomes false)
+ if (!newPresented) {
+ // Schedule portal removal after exit animation completes
+ clearPortalTimer()
+ portalRemovalTimerRef.current = setTimeout(() => {
+ setShouldRenderPortal(false)
+ onCloseRef.current?.()
+ setConfig(null)
+ portalRemovalTimerRef.current = null
+ }, 100)
+ }
+ }, [])
+
+ // Handle backdrop click - React 19 compiler handles memoization automatically
+ const handleBackdropClick = () => {
+ close()
+ }
+
+ // Handle save button click - React 19 compiler handles memoization automatically
+ const handleSaveClick = () => {
+ config?.onSave?.()
+ }
+
+ // Context value - memoized to prevent unnecessary re-renders
+ // Note: isOpen uses ref to avoid re-renders when presented changes
+ const contextValue = useMemo(
+ () => ({
+ open,
+ close,
+ get isOpen() {
+ return presentedRef.current
+ },
+ }),
+ [open, close]
+ )
+
+ // Default values for header
+ const showHeader = config?.showHeader ?? true
+ const cancelLabel = config?.cancelLabel ?? 'Cancel'
+ const saveLabel = config?.saveLabel ?? 'Save'
+
+ return (
+
+ {children}
+
+ {shouldRenderPortal && config && (
+
+
+
+
+ {showHeader && (
+
+
+ {cancelLabel}
+
+ {config.title && (
+
+ {config.title}
+
+ )}
+ {config.onSave ? (
+
+ {saveLabel}
+
+ ) : (
+
// Placeholder for grid alignment
+ )}
+
+ )}
+
+
+
+ {config.content}
+
+
+
+
+
+
+ )}
+
+
+ )
+}
diff --git a/src/lib/seed.ts b/src/lib/seed.ts
new file mode 100644
index 0000000..182225f
--- /dev/null
+++ b/src/lib/seed.ts
@@ -0,0 +1,216 @@
+// seed.ts
+// Script to populate Firebase DB with test user data for alertId 'mike29'
+// Run with: NEXT_PUBLIC_USE_EMULATORS=true npx tsx src/lib/seed.ts
+//
+// IMPORTANT: This script only works with Firebase emulators for safety.
+// It will refuse to run if emulators are not enabled.
+
+import {
+ type TreatmentType,
+ TreatmentTypeEnum,
+ type TreatmentTypeOptions,
+} from './db/treatments'
+import { adminFirestore } from './firebase-admin'
+import type { Person } from './types/person'
+import type { AttachedUserType } from './types/users'
+
+// Safety check: Only allow running with emulators
+function checkEmulatorMode() {
+ const useEmulators = process.env.NEXT_PUBLIC_USE_EMULATORS === 'true'
+ const firestoreEmulatorHost = process.env.FIRESTORE_EMULATOR_HOST
+
+ if (!useEmulators) {
+ console.error(
+ '❌ ERROR: This seed script can only run with Firebase emulators enabled.'
+ )
+ console.error('')
+ console.error('To run this script, set NEXT_PUBLIC_USE_EMULATORS=true:')
+ console.error(' NEXT_PUBLIC_USE_EMULATORS=true npx tsx src/lib/seed.ts')
+ console.error('')
+ console.error('Make sure Firebase emulators are running:')
+ console.error(' pnpm firebase:dev')
+ process.exit(1)
+ }
+
+ if (!firestoreEmulatorHost && !process.env.FIREBASE_AUTH_EMULATOR_HOST) {
+ // Set emulator hosts if not already set (for safety)
+ process.env.FIRESTORE_EMULATOR_HOST = 'localhost:8082'
+ process.env.FIREBASE_AUTH_EMULATOR_HOST = 'localhost:9099'
+ console.log('✓ Emulator hosts configured')
+ }
+
+ console.log('✓ Running in emulator mode (safe for local development)')
+ console.log('')
+}
+
+// Helper to filter undefined values from objects (Firestore doesn't accept undefined)
+function cleanUndefined(obj: T): Partial {
+ return Object.fromEntries(
+ Object.entries(obj).filter(([, v]) => v !== undefined)
+ ) as Partial
+}
+
+async function seedTreatments(
+ user: AttachedUserType,
+ medicationBrand: string,
+ count: number = 10
+): Promise {
+ const treatmentTypes: TreatmentTypeOptions[] = [
+ TreatmentTypeEnum.ANTIBODY,
+ TreatmentTypeEnum.PROPHY,
+ TreatmentTypeEnum.BLEED,
+ TreatmentTypeEnum.PREVENTATIVE,
+ ]
+
+ const sites = ['Left arm', 'Right arm', 'Left leg', 'Right leg', 'Stomach']
+ const causes = ['', 'Minor cut', 'Bruise', 'Joint pain', 'Preventive']
+
+ const now = new Date()
+ const treatments: TreatmentType[] = []
+
+ for (let i = 0; i < count; i++) {
+ // Spread treatments over the last 30 days
+ const daysAgo = Math.floor((i / count) * 30)
+ const treatmentDate = new Date(now)
+ treatmentDate.setDate(treatmentDate.getDate() - daysAgo)
+
+ const dateStr = treatmentDate.toISOString().slice(0, 10)
+ const createdAt = treatmentDate.toISOString()
+
+ const type =
+ treatmentTypes[Math.floor(Math.random() * treatmentTypes.length)]
+ const site = sites[Math.floor(Math.random() * sites.length)]
+ const cause = causes[Math.floor(Math.random() * causes.length)]
+
+ // Vary units between 2000-4000
+ const units = Math.floor(Math.random() * 2000) + 2000
+
+ const treatment: TreatmentType = {
+ deletedAt: null,
+ cause,
+ createdAt,
+ date: dateStr,
+ medication: {
+ brand: medicationBrand,
+ units,
+ lot: `LOT${Math.floor(Math.random() * 10000)}`,
+ },
+ sites: site,
+ type,
+ user,
+ }
+
+ treatments.push(treatment)
+ }
+
+ // Sort by date (oldest first) for more realistic ordering
+ treatments.sort((a, b) => a.date.localeCompare(b.date))
+
+ // Create treatments in Firestore
+ for (const treatment of treatments) {
+ const cleanData = cleanUndefined(treatment)
+ const docRef = await adminFirestore.collection('infusions').add(cleanData)
+ await docRef.set({ uid: docRef.id, ...cleanData }, { merge: true })
+ }
+
+ console.log(`✓ Created ${count} treatments for user ${user.name}`)
+}
+
+async function seedUser() {
+ const seedUserData = {
+ name: 'Seed User',
+ hemophiliaType: 'A',
+ severity: 'Moderate',
+ medication: 'Advate',
+ injectionFrequency: 'Every 3 days',
+ factor: 8,
+ }
+
+ // Seed user is separate from test sign-in user
+ // This user is for seeding data only, not for authentication
+ const alertId = 'mike29'
+ const seedEmail = `seed-${alertId}@hemolog.com`
+
+ try {
+ let userUid: string
+ let userDocData: Person
+
+ // Check if user document already exists by alertId
+ const existingUserQuery = await adminFirestore
+ .collection('users')
+ .where('alertId', '==', alertId)
+ .limit(1)
+ .get()
+
+ if (!existingUserQuery.empty) {
+ const existingDoc = existingUserQuery.docs[0]
+ userUid = existingDoc.id
+ userDocData = existingDoc.data() as Person
+ console.log(
+ `✓ Seed user with alertId '${alertId}' already exists with uid: ${userUid}`
+ )
+ console.log('Updating existing seed user document...')
+
+ // Ensure uid field matches document ID for consistency
+ const userData: Partial = {
+ alertId,
+ uid: userUid,
+ ...seedUserData,
+ }
+
+ const cleanData = cleanUndefined(userData)
+ await existingDoc.ref.update(cleanData)
+ // Update userDocData to reflect the updated data
+ userDocData = { ...userDocData, ...cleanData } as Person
+ console.log(`✓ Updated seed user document with alertId '${alertId}'`)
+ } else {
+ // Create new seed user document
+ // Use a consistent UID for the seed user (not tied to Firebase Auth)
+ userUid = `seed-uid-${alertId}`
+
+ const userData: Person = {
+ alertId,
+ uid: userUid,
+ ...seedUserData,
+ }
+
+ const cleanData = cleanUndefined(userData)
+ await adminFirestore.collection('users').doc(userUid).set(cleanData)
+ userDocData = userData
+ console.log(
+ `✓ Created seed user document with alertId '${alertId}' and uid '${userUid}'`
+ )
+ console.log('User data:', JSON.stringify(cleanData, null, 2))
+ }
+
+ // Create AttachedUserType for treatments
+ // Ensure uid matches what's stored in the Person document
+ const attachedUser: AttachedUserType = {
+ uid: userDocData.uid || userUid,
+ name: seedUserData.name,
+ email: seedEmail,
+ photoUrl: userDocData.photoUrl || '',
+ }
+
+ console.log(`Creating treatments with user.uid: ${attachedUser.uid}`)
+ console.log(`Person document uid: ${userDocData.uid}`)
+
+ // Create 10 treatments
+ await seedTreatments(attachedUser, seedUserData.medication, 10)
+ } catch (error) {
+ console.error('Error seeding user:', error)
+ process.exit(1)
+ }
+}
+
+// Run the seed function
+checkEmulatorMode()
+seedUser()
+ .then(() => {
+ console.log('Seed completed successfully')
+ process.exit(0)
+ })
+ .catch((error) => {
+ console.error('Seed failed:', error)
+ process.exit(1)
+ })
diff --git a/lib/types/person.ts b/src/lib/types/person.ts
similarity index 100%
rename from lib/types/person.ts
rename to src/lib/types/person.ts
diff --git a/lib/types/users.ts b/src/lib/types/users.ts
similarity index 72%
rename from lib/types/users.ts
rename to src/lib/types/users.ts
index b1cdabc..1dadacd 100644
--- a/lib/types/users.ts
+++ b/src/lib/types/users.ts
@@ -1,22 +1,21 @@
-export interface AttachedUserType {
+// Placeholder - need to restore from git
+export interface UserType {
+ uid: string
email: string
name: string
+ alertId?: string
+ isAdmin?: boolean
+ apiKey?: string
+ medication?: string
+ monoclonalAntibody?: string
photoUrl?: string
- uid: string
+ provider?: string
+ token?: string
}
-export interface UserType {
- alertId?: string
- displayName?: string
+export interface AttachedUserType {
email: string
- isAdmin?: boolean
name: string
- photoUrl?: string
- medication?: string
- monoclonalAntibody?: string
- injectionFrequency?: string
- provider: string
- token: string
+ photoUrl: string
uid: string
- apiKey?: string
}
diff --git a/src/scripts/switch-rules.sh b/src/scripts/switch-rules.sh
new file mode 100755
index 0000000..1b3639b
--- /dev/null
+++ b/src/scripts/switch-rules.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Script to switch between development and production Firestore rules
+# Get the project root directory (two levels up from this script)
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
+
+if [ "$1" = "dev" ]; then
+ echo "Switching to development rules..."
+ cp "$PROJECT_ROOT/firebase/firestore.dev.rules" "$PROJECT_ROOT/firebase/firestore.rules"
+ echo "✅ Using development rules (allows all operations)"
+elif [ "$1" = "prod" ]; then
+ echo "Switching to production rules..."
+ cp "$PROJECT_ROOT/firebase/firestore.prod.rules" "$PROJECT_ROOT/firebase/firestore.rules"
+ echo "✅ Using production rules (requires authentication)"
+else
+ echo "Usage: $0 [dev|prod]"
+ echo " dev - Use development rules (allows all operations)"
+ echo " prod - Use production rules (requires authentication)"
+ exit 1
+fi
+
+echo "Restart your Firebase emulators for changes to take effect:"
+echo " pnpm run firebase"
+
diff --git a/tsconfig.json b/tsconfig.json
index afa7418..415aaec 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,7 +6,7 @@
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"lib": [
"dom",
"dom.iterable",
@@ -20,13 +20,25 @@
"skipLibCheck": true,
"strict": true,
"target": "es6",
- "incremental": true
+ "incremental": true,
+ "paths": {
+ "@/*": [
+ "./src/*"
+ ]
+ },
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
},
"include": [
"next-env.d.ts",
- "**/*.ts",
- "**/*.tsx",
- "next.config.js"
+ "src/**/*.ts",
+ "src/**/*.tsx",
+ "next.config.js",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
],
"exclude": [
"node_modules",
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
deleted file mode 100644
index 01876d1..0000000
--- a/tsconfig.tsbuildinfo
+++ /dev/null
@@ -1 +0,0 @@
-{"fileNames":["./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.error.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/.pnpm/@types+react@17.0.89/node_modules/@types/react/global.d.ts","./node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts","./node_modules/.pnpm/@types+prop-types@15.7.15/node_modules/@types/prop-types/index.d.ts","./node_modules/.pnpm/@types+scheduler@0.16.8/node_modules/@types/scheduler/tracing.d.ts","./node_modules/.pnpm/@types+react@17.0.89/node_modules/@types/react/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/amp.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/web-globals/events.d.ts","./node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/inspector.generated.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/sea.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@20.19.24/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/get-page-files.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/config.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/config-shared.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/base-http/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/body-streams.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/request-meta.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/router.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/render-result.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/web/next-url.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/web/types.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/build/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/send-payload/revalidate-headers.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/send-payload/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/base-http/node.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/font-utils.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/load-components.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/render.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/base-server.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/next-server.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/next.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/types/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/html-context.d.ts","./node_modules/.pnpm/@next+env@12.3.7/node_modules/@next/env/types/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/client/with-router.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/client/router.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/client/route-loader.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/client/page-loader.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/pages/_app.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/app.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/runtime-config.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/config.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/pages/_document.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/document.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dynamic.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/pages/_error.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/error.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/shared/lib/head.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/head.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/client/image.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/image.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/client/link.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/link.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/router.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/client/script.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/script.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/server.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/types/global.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/index.d.ts","./node_modules/.pnpm/next@12.3.7_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/next/image-types/global.d.ts","./next-env.d.ts","./node_modules/.pnpm/blob-util@2.0.2/node_modules/blob-util/dist/blob-util.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cy-blob-util.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/bluebird/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cy-bluebird.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cy-minimatch.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/chai/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cy-chai.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/common.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/array.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/collection.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/date.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/function.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/lang.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/math.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/number.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/object.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/seq.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/string.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/common/util.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/lodash/index.d.ts","./node_modules/.pnpm/@types+sinonjs__fake-timers@8.1.1/node_modules/@types/sinonjs__fake-timers/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/sinon/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/sinon-chai/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/mocha/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/jquery/JQueryStatic.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/jquery/JQuery.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/jquery/misc.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/jquery/legacy.d.ts","./node_modules/@types/sizzle/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/jquery/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/chai-jquery/index.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cypress-npm-api.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/net-stubbing.d.ts","./node_modules/.pnpm/eventemitter2@6.4.7/node_modules/eventemitter2/eventemitter2.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cypress-eventemitter.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cypress-type-helpers.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cypress.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cypress-global-vars.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/cypress-expect.d.ts","./node_modules/.pnpm/cypress@10.11.0/node_modules/cypress/types/index.d.ts","./node_modules/.pnpm/dotenv@17.2.3/node_modules/dotenv/lib/main.d.ts","./cypress.config.ts","./global.d.ts","./node_modules/.pnpm/isomorphic-unfetch@3.1.0_encoding@0.1.13/node_modules/isomorphic-unfetch/index.d.ts","./lib/fetcher.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/app/credential.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/app/core.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/app/lifecycle.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/app/credential-factory.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/utils/error.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/app/index.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/auth-context.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/metadata.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/call-credentials.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/constants.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/deadline.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/certificate-provider.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/compression-algorithms.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/channel-options.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/uri-parser.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/channel-credentials.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/connectivity-state.d.ts","./node_modules/.pnpm/@js-sdsl+ordered-map@4.4.2/node_modules/@js-sdsl/ordered-map/dist/esm/index.d.ts","./node_modules/.pnpm/protobufjs@7.5.4/node_modules/protobufjs/index.d.ts","./node_modules/.pnpm/protobufjs@7.5.4/node_modules/protobufjs/ext/descriptor/index.d.ts","./node_modules/.pnpm/@grpc+proto-loader@0.8.0/node_modules/@grpc/proto-loader/build/src/util.d.ts","./node_modules/.pnpm/long@5.3.2/node_modules/long/umd/types.d.ts","./node_modules/.pnpm/long@5.3.2/node_modules/long/umd/index.d.ts","./node_modules/.pnpm/@grpc+proto-loader@0.8.0/node_modules/@grpc/proto-loader/build/src/index.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/google/protobuf/Timestamp.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/ChannelRef.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/SubchannelRef.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/ChannelTraceEvent.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/ChannelTrace.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/subchannel-address.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetChannelRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/ChannelConnectivityState.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/ChannelData.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/SocketRef.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/Channel.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetChannelResponse.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetServerRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/ServerRef.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/ServerData.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/Server.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetServerResponse.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetServerSocketsRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetServerSocketsResponse.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetServersRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetServersResponse.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetSocketRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/google/protobuf/Int64Value.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/google/protobuf/Any.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/SocketOption.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/SocketData.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/Address.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/Security.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/Socket.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetSocketResponse.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetSubchannelRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/Subchannel.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetSubchannelResponse.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetTopChannelsRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/GetTopChannelsResponse.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/grpc/channelz/v1/Channelz.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/channelz.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/channel.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/client-interceptors.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/client.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/server-credentials.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/subchannel-call.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/transport.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/xds/data/orca/v3/OrcaLoadReport.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/google/protobuf/Duration.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/xds/service/orca/v3/OrcaLoadReportRequest.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/generated/xds/service/orca/v3/OpenRcaService.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/subchannel.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/subchannel-interface.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/duration.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/service-config.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/load-balancer.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/picker.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/orca.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/server-interceptors.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/server.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/make-client.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/events.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/object-stream.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/server-call.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/call-interface.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/call.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/status-builder.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/admin.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/logging.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/filter.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/resolver.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/backoff-timeout.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/load-balancer-pick-first.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/load-balancer-child-handler.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/filter-stack.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/load-balancer-outlier-detection.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/load-balancing-call.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/resolving-call.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/retrying-call.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/internal-channel.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/experimental.d.ts","./node_modules/.pnpm/@grpc+grpc-js@1.14.1/node_modules/@grpc/grpc-js/build/src/index.d.ts","./node_modules/.pnpm/@grpc+proto-loader@0.7.15/node_modules/@grpc/proto-loader/build/src/util.d.ts","./node_modules/.pnpm/@grpc+proto-loader@0.7.15/node_modules/@grpc/proto-loader/build/src/index.d.ts","./node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/common.d.ts","./node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/interceptor.d.ts","./node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/gaxios.d.ts","./node_modules/.pnpm/gaxios@6.7.1_encoding@0.1.13/node_modules/gaxios/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/transporters.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/credentials.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/crypto/crypto.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/util.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/authclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/loginticket.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/oauth2client.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/idtokenclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/envDetect.d.ts","./node_modules/.pnpm/gtoken@7.1.0_encoding@0.1.13/node_modules/gtoken/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/jwtclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/refreshclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/impersonated.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/baseexternalclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/identitypoolclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/awsrequestsigner.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/awsclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/pluggable-auth-client.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/externalclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/externalAccountAuthorizedUserClient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/googleauth.d.ts","./node_modules/.pnpm/gcp-metadata@6.1.1_encoding@0.1.13/node_modules/gcp-metadata/build/src/gcp-residency.d.ts","./node_modules/.pnpm/gcp-metadata@6.1.1_encoding@0.1.13/node_modules/gcp-metadata/build/src/index.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/computeclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/iam.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/jwtaccess.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/downscopedclient.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/auth/passthrough.d.ts","./node_modules/.pnpm/google-auth-library@9.15.1_encoding@0.1.13/node_modules/google-auth-library/build/src/index.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/status.d.ts","./node_modules/.pnpm/proto3-json-serializer@2.0.2/node_modules/proto3-json-serializer/build/src/types.d.ts","./node_modules/.pnpm/proto3-json-serializer@2.0.2/node_modules/proto3-json-serializer/build/src/toproto3json.d.ts","./node_modules/.pnpm/proto3-json-serializer@2.0.2/node_modules/proto3-json-serializer/build/src/fromproto3json.d.ts","./node_modules/.pnpm/proto3-json-serializer@2.0.2/node_modules/proto3-json-serializer/build/src/index.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/googleError.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/call.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/streamingCalls/streaming.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/apiCaller.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/paginationCalls/pageDescriptor.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/streamingCalls/streamDescriptor.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/normalCalls/normalApiCaller.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/bundlingCalls/bundleApiCaller.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/bundlingCalls/bundleDescriptor.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/descriptor.d.ts","./node_modules/.pnpm/@types+long@4.0.2/node_modules/@types/long/index.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/protos/operations.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/clientInterface.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/routingHeader.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/protos/http.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/protos/iam_service.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/protos/locations.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/pathTemplate.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/iamService.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/locationService.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/util.d.ts","./node_modules/.pnpm/protobufjs@7.5.4/node_modules/protobufjs/minimal.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/warnings.d.ts","./node_modules/.pnpm/event-target-shim@5.0.1/node_modules/event-target-shim/index.d.ts","./node_modules/.pnpm/abort-controller@3.0.0/node_modules/abort-controller/dist/abort-controller.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/streamArrayParser.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/fallbackServiceStub.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/fallback.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/operationsClient.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/longRunningCalls/longRunningApiCaller.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/longRunningCalls/longRunningDescriptor.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/longRunningCalls/longrunning.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/apitypes.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/bundlingCalls/task.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/bundlingCalls/bundleExecutor.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/gax.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/grpc.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/createApiCall.d.ts","./node_modules/.pnpm/google-gax@4.6.1_encoding@0.1.13/node_modules/google-gax/build/src/index.d.ts","./node_modules/.pnpm/@google-cloud+firestore@7.11.6_encoding@0.1.13/node_modules/@google-cloud/firestore/types/protos/firestore_v1beta1_proto_api.d.ts","./node_modules/.pnpm/@google-cloud+firestore@7.11.6_encoding@0.1.13/node_modules/@google-cloud/firestore/types/v1beta1/firestore_client.d.ts","./node_modules/.pnpm/@google-cloud+firestore@7.11.6_encoding@0.1.13/node_modules/@google-cloud/firestore/types/protos/firestore_v1_proto_api.d.ts","./node_modules/.pnpm/@google-cloud+firestore@7.11.6_encoding@0.1.13/node_modules/@google-cloud/firestore/types/v1/firestore_client.d.ts","./node_modules/.pnpm/@google-cloud+firestore@7.11.6_encoding@0.1.13/node_modules/@google-cloud/firestore/types/protos/firestore_admin_v1_proto_api.d.ts","./node_modules/.pnpm/@google-cloud+firestore@7.11.6_encoding@0.1.13/node_modules/@google-cloud/firestore/types/v1/firestore_admin_client.d.ts","./node_modules/.pnpm/@google-cloud+firestore@7.11.6_encoding@0.1.13/node_modules/@google-cloud/firestore/types/firestore.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/firestore/firestore-internal.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/firestore/index.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/token-verifier.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/auth-config.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/user-record.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/identifier.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/user-import-builder.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/action-code-settings-builder.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/base-auth.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/tenant.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/tenant-manager.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/project-config.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/project-config-manager.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/auth.d.ts","./node_modules/.pnpm/firebase-admin@12.7.0_encoding@0.1.13/node_modules/firebase-admin/lib/auth/index.d.ts","./lib/firebase-admin.ts","./node_modules/.pnpm/@firebase+component@0.7.0/node_modules/@firebase/component/dist/src/provider.d.ts","./node_modules/.pnpm/@firebase+component@0.7.0/node_modules/@firebase/component/dist/src/component_container.d.ts","./node_modules/.pnpm/@firebase+component@0.7.0/node_modules/@firebase/component/dist/src/types.d.ts","./node_modules/.pnpm/@firebase+component@0.7.0/node_modules/@firebase/component/dist/src/component.d.ts","./node_modules/.pnpm/@firebase+component@0.7.0/node_modules/@firebase/component/dist/index.d.ts","./node_modules/.pnpm/@firebase+util@1.13.0/node_modules/@firebase/util/dist/util-public.d.ts","./node_modules/.pnpm/@firebase+logger@0.5.0/node_modules/@firebase/logger/dist/src/logger.d.ts","./node_modules/.pnpm/@firebase+logger@0.5.0/node_modules/@firebase/logger/dist/index.d.ts","./node_modules/.pnpm/@firebase+app@0.14.6/node_modules/@firebase/app/dist/app-public.d.ts","./node_modules/.pnpm/firebase@12.7.0/node_modules/firebase/app/dist/app/index.d.ts","./node_modules/.pnpm/@firebase+firestore@4.9.3_@firebase+app@0.14.6/node_modules/@firebase/firestore/dist/index.d.ts","./node_modules/.pnpm/firebase@12.7.0/node_modules/firebase/firestore/dist/firestore/index.d.ts","./node_modules/.pnpm/@firebase+auth@1.12.0_@firebase+app@0.14.6/node_modules/@firebase/auth/dist/auth-public.d.ts","./node_modules/.pnpm/firebase@12.7.0/node_modules/firebase/auth/dist/auth/index.d.ts","./lib/firebase.ts","./node_modules/.pnpm/nanoid@3.3.11/node_modules/nanoid/async/index.d.ts","./node_modules/.pnpm/date-fns@2.30.0/node_modules/date-fns/typings.d.ts","./lib/types/users.ts","./lib/db/infusions.ts","./lib/helpers.ts","./lib/theme.ts","./lib/db/feedback.ts","./lib/admin-db/feedback.ts","./lib/admin-db/infusions.ts","./lib/admin-db/users.ts","./lib/db/users.ts","./lib/hooks/useFirestoreQuery.ts","./lib/types/person.ts","./lib/hooks/useDbUser.ts","./lib/hooks/useEmergencyUser.ts","./node_modules/.pnpm/@types+js-cookie@2.2.7/node_modules/@types/js-cookie/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-scaleable/scaleable-context.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-scaleable/with-scaleable.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-scaleable/utils.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-scaleable/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/auto-complete/auto-complete-item.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/utils/prop-types.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/auto-complete/auto-complete.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/auto-complete/auto-complete-searching.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/auto-complete/auto-complete-empty.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/auto-complete/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/avatar/avatar.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/avatar/avatar-group.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/avatar/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/badge/badge.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/badge/badge-anchor.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/badge/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/breadcrumbs/breadcrumbs.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/link/link.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/breadcrumbs/breadcrumbs-item.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/breadcrumbs/breadcrumbs-separator.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/breadcrumbs/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/button/button.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/button/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/button-dropdown/button-dropdown.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/button-dropdown/button-dropdown-item.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/button-dropdown/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/button-group/button-group.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/button-group/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/capacity/capacity.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/capacity/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/card/card.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/card/card-footer.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/card/card-content.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/card/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/checkbox/checkbox.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/checkbox/checkbox-group.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/checkbox/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/code/code.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/code/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/collapse/collapse.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/collapse/collapse-group.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/collapse/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/description/description.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/description/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/display/display.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/display/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/divider/divider.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/divider/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/dot/dot.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/dot/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/drawer/helper.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/drawer/drawer.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/modal/modal-title.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/modal/modal-subtitle.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/modal/modal-content.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/modal/modal.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/modal/modal-action.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/modal/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/drawer/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/fieldset/fieldset.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/fieldset/fieldset-title.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/fieldset/fieldset-subtitle.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/fieldset/fieldset-footer.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/fieldset/fieldset-group.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/fieldset/fieldset-content.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/fieldset/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/themes/presets/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/geist-provider/geist-provider.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/geist-provider/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/grid/grid-types.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/grid/basic-item.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/grid/grid.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/grid/grid-container.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/grid/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/image/image.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/image/image-browser.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/image/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/input/input-props.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/input/input.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/textarea/textarea.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/textarea/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/input/password.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/input/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/keyboard/keyboard.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/keyboard/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/link/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/loading/loading.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/loading/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/note/note.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/note/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/page/page.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/page/page-header.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/page/page-content.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/page/page-footer.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/page/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/pagination/pagination.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/pagination/pagination-previous.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/pagination/pagination-next.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/pagination/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tooltip/tooltip.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/popover/popover.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/popover/popover-item.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/popover/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/progress/progress.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/progress/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/radio/radio.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/radio/radio-group.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/radio/radio-description.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/radio/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/rating/rating.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/rating/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/select/select.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/select/select-option.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/select/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/slider/slider.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/slider/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/snippet/snippet.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/snippet/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/spacer/spacer.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/spacer/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/spinner/spinner.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/spinner/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/table/table-types.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/table/table-column.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/table/table.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/table/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tabs/tabs.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tabs/tabs-item.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tabs/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tag/tag.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tag/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/text/text.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/text/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/utils/types.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/themes/themes.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/themes/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/toggle/toggle.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/toggle/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tooltip/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tree/tree.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tree/tree-file.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tree/tree-folder.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/tree/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-all-themes/all-themes-context.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-all-themes/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-toasts/use-toast.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-toasts/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/user/user.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/user/user-link.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/user/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-body-scroll/use-body-scroll.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-body-scroll/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-clipboard/use-clipboard.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-clipboard/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-media-query/use-media-query.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-media-query/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-keyboard/use-keyboard.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-keyboard/codes.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-keyboard/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-input/use-input.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-input/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-modal/use-modal.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-modal/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-tabs/use-tabs.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-tabs/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-click-away/use-click-away.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-click-away/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-current-state/use-current-state.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-current-state/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/css-baseline/css-baseline.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/css-baseline/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-theme/theme-context.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/use-theme/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/esm/index.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/sheet/types.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/sheet/Sheet.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/sheet/index.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/models/ComponentStyle.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/models/ThemeProvider.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/utils/createWarnTooManyClasses.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/utils/domElements.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/types.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/constructors/constructWithOptions.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/constructors/styled.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/constants.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/constructors/createGlobalStyle.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/constructors/css.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/models/Keyframes.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/constructors/keyframes.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/utils/hoist.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/hoc/withTheme.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/models/ServerStyleSheet.d.ts","./node_modules/.pnpm/@types+stylis@4.2.5/node_modules/@types/stylis/index.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/models/StyleSheetManager.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/utils/isStyledComponent.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/secretInternals.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/base.d.ts","./node_modules/.pnpm/styled-components@6.1.19_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/styled-components/dist/index.d.ts","./components/loadingScreen.tsx","./lib/auth.tsx","./lib/hooks/useInfusions.ts","./pages/api/alert-lightstrip.ts","./pages/api/delete-account.ts","./pages/api/feedback.ts","./pages/api/flip-lightstrip.ts","./pages/api/log-treatment.ts","./pages/api/recent-treatments.ts","./pages/api/treatments.ts","./node_modules/.pnpm/@types+react-vis@1.11.15/node_modules/@types/react-vis/index.d.ts","./components/chart.tsx","./components/descriptionCards.tsx","./node_modules/.pnpm/react-qr-code@2.0.18_react@17.0.2/node_modules/react-qr-code/types/index.d.ts","./components/emergencyCard.tsx","./node_modules/.pnpm/@geist-ui+react-icons@1.0.1_@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2__react@17.0.2/node_modules/@geist-ui/react-icons/chevronRight.d.ts","./node_modules/.pnpm/@geist-ui+react-icons@1.0.1_@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2__react@17.0.2/node_modules/@geist-ui/react-icons/chevronLeft.d.ts","./node_modules/.pnpm/@geist-ui+react-icons@1.0.1_@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2__react@17.0.2/node_modules/@geist-ui/react-icons/moreHorizontal.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/types.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/Field.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/Formik.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/Form.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/withFormik.d.ts","./node_modules/@types/hoist-non-react-statics/node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/scheduler/tracing.d.ts","./node_modules/@types/hoist-non-react-statics/node_modules/@types/react/index.d.ts","./node_modules/@types/hoist-non-react-statics/index.d.ts","./node_modules/.pnpm/@types+hoist-non-react-statics@3.3.7_@types+react@17.0.89/node_modules/@types/hoist-non-react-statics/index.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/FieldArray.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/utils.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/connect.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/ErrorMessage.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/FormikContext.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/FastField.d.ts","./node_modules/.pnpm/formik@2.4.9_@types+react@17.0.89_react@17.0.2/node_modules/formik/dist/index.d.ts","./components/infusionModal.tsx","./components/infusionTable.tsx","./components/emergencyInfo.tsx","./components/emergencySnippet.tsx","./components/feedbackFishFooter.tsx","./components/feedbackModal.tsx","./node_modules/.pnpm/swr@1.3.0_react@17.0.2/node_modules/swr/dist/constants/revalidate-events.d.ts","./node_modules/.pnpm/swr@1.3.0_react@17.0.2/node_modules/swr/dist/types.d.ts","./node_modules/.pnpm/swr@1.3.0_react@17.0.2/node_modules/swr/dist/utils/config.d.ts","./node_modules/.pnpm/swr@1.3.0_react@17.0.2/node_modules/swr/dist/use-swr.d.ts","./node_modules/.pnpm/swr@1.3.0_react@17.0.2/node_modules/swr/dist/utils/use-swr-config.d.ts","./node_modules/.pnpm/swr@1.3.0_react@17.0.2/node_modules/swr/dist/index.d.ts","./components/feedbackPage.tsx","./components/footer.tsx","./components/logo.tsx","./components/header.tsx","./node_modules/.pnpm/@geist-ui+react-icons@1.0.1_@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2__react@17.0.2/node_modules/@geist-ui/react-icons/filter.d.ts","./node_modules/.pnpm/@types+underscore@1.13.0/node_modules/@types/underscore/index.d.ts","./node_modules/.pnpm/@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2/node_modules/@geist-ui/react/dist/utils/prop-types.d.ts","./components/statCard.tsx","./components/stats.tsx","./components/homePage.tsx","./components/identity.tsx","./components/settingsForm.tsx","./components/profilePage.tsx","./components/staticHeader.tsx","./components/withAuth.tsx","./components/blog/blogFooter.tsx","./node_modules/.pnpm/@geist-ui+react-icons@1.0.1_@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2__react@17.0.2/node_modules/@geist-ui/react-icons/index.d.ts","./components/blog/postFooter.tsx","./lib/auth-provider-wrapper.tsx","./pages/404.tsx","./pages/_app.tsx","./pages/_document.tsx","./pages/about.tsx","./pages/home.tsx","./pages/index.tsx","./pages/signin.tsx","./pages/changelog/hello-world-again.tsx","./pages/changelog/index.tsx","./node_modules/.pnpm/@geist-ui+react-icons@1.0.1_@geist-ui+react@2.2.5_react-dom@17.0.2_react@17.0.2__react@17.0.2__react@17.0.2/node_modules/@geist-ui/react-icons/share.d.ts","./pages/changelog/mobile-enhancements.tsx","./pages/changelog/monoclonal-antibodies.tsx","./pages/changelog/raycast-extension.tsx","./pages/emergency/[alertId].tsx","./pages/emergency/print.tsx","./node_modules/@types/readdir-glob/index.d.ts","./node_modules/@types/archiver/index.d.ts","./node_modules/@types/aria-query/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/caseless/index.d.ts","./node_modules/@types/duplexify/index.d.ts","./node_modules/@types/mime/index.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/json5/index.d.ts","./node_modules/@types/jsonwebtoken/index.d.ts","./node_modules/@types/long/index.d.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/request/node_modules/form-data/index.d.ts","./node_modules/@types/tough-cookie/index.d.ts","./node_modules/@types/request/index.d.ts","./node_modules/@types/scheduler/index.d.ts","./node_modules/@types/semver/classes/semver.d.ts","./node_modules/@types/semver/functions/parse.d.ts","./node_modules/@types/semver/functions/valid.d.ts","./node_modules/@types/semver/functions/clean.d.ts","./node_modules/@types/semver/functions/inc.d.ts","./node_modules/@types/semver/functions/diff.d.ts","./node_modules/@types/semver/functions/major.d.ts","./node_modules/@types/semver/functions/minor.d.ts","./node_modules/@types/semver/functions/patch.d.ts","./node_modules/@types/semver/functions/prerelease.d.ts","./node_modules/@types/semver/functions/compare.d.ts","./node_modules/@types/semver/functions/rcompare.d.ts","./node_modules/@types/semver/functions/compare-loose.d.ts","./node_modules/@types/semver/functions/compare-build.d.ts","./node_modules/@types/semver/functions/sort.d.ts","./node_modules/@types/semver/functions/rsort.d.ts","./node_modules/@types/semver/functions/gt.d.ts","./node_modules/@types/semver/functions/lt.d.ts","./node_modules/@types/semver/functions/eq.d.ts","./node_modules/@types/semver/functions/neq.d.ts","./node_modules/@types/semver/functions/gte.d.ts","./node_modules/@types/semver/functions/lte.d.ts","./node_modules/@types/semver/functions/cmp.d.ts","./node_modules/@types/semver/functions/coerce.d.ts","./node_modules/@types/semver/classes/comparator.d.ts","./node_modules/@types/semver/classes/range.d.ts","./node_modules/@types/semver/functions/satisfies.d.ts","./node_modules/@types/semver/ranges/max-satisfying.d.ts","./node_modules/@types/semver/ranges/min-satisfying.d.ts","./node_modules/@types/semver/ranges/to-comparators.d.ts","./node_modules/@types/semver/ranges/min-version.d.ts","./node_modules/@types/semver/ranges/valid.d.ts","./node_modules/@types/semver/ranges/outside.d.ts","./node_modules/@types/semver/ranges/gtr.d.ts","./node_modules/@types/semver/ranges/ltr.d.ts","./node_modules/@types/semver/ranges/intersects.d.ts","./node_modules/@types/semver/ranges/simplify.d.ts","./node_modules/@types/semver/ranges/subset.d.ts","./node_modules/@types/semver/internals/identifiers.d.ts","./node_modules/@types/semver/index.d.ts","./node_modules/@types/sinonjs__fake-timers/index.d.ts","./node_modules/.pnpm/@types+styled-components@5.1.35/node_modules/@types/styled-components/index.d.ts","./node_modules/@types/stylis/index.d.ts","./node_modules/@types/triple-beam/index.d.ts","./node_modules/@types/yauzl/index.d.ts"],"fileIdsList":[[100,147,265,540,728,754],[100,147,540,728,818],[100,147,540,542,543,755,763],[100,147,262,540,728],[88,100,147,264,540,552,728,752,754,766],[100,147,540,551,728,752,754,791],[100,147,540,728],[100,147,540,541,545,728,754,789],[100,147,319,540,545,728,752,753,754,801],[100,147,540,728,752,754,793],[100,147,540,728,754,790,804],[88,100,147,256,540,728,755,764,791,806,810],[100,147,540,728,752,754],[100,147,540,541,542,543,728,754,755,789],[88,100,147,540,542,543,550,728,752,754,755,768,769,770,790],[100,147,540,728,752],[100,147,262,264,540,728],[88,100,147,265,540,543,549,552,728,754,767,793,813],[88,100,147,540,543,549,552,728,754,789],[100,147,540,728,808],[100,147,265,540,728,752,754,804],[100,147,540,542,543,550,728,752,755,795,807,809],[88,100,147,256,540,753,754],[100,147,306,315,540],[100,147,540],[100,147,523,540,545],[100,147,523,540,541,542],[100,147,523,540],[100,147,540,754],[88,100,147,265,537,538,540,541,543,549,554,753],[100,147,538,540,541],[100,147,318,540],[100,147,325,509,522,540],[100,147,533,535,537,540],[100,147,539,540,542],[88,100,147,538,540,550,551],[88,100,147,535,540],[88,100,147,538,540,542,550,754],[100,147,272,273,540],[100,147,528,529,531,540],[100,147,529,532,540],[100,147,524,525,526,527,540],[100,147,526,540],[100,147,524,526,527,540],[100,147,525,526,527,540],[100,147,525,540],[100,147,529,531,532,540],[100,147,530,540],[88,100,147,540],[88,100,147,540,558],[88,100,147,540,558,559,560],[100,147,540,559,561,562,563],[100,147,540,565,566],[88,100,147,540,558,560],[100,147,540,568,569],[88,100,147,540,572],[100,147,540,571,573,574],[88,100,147,540,560],[100,147,540,578,579],[100,147,540,560,581],[100,147,540,560,576],[100,147,540,583],[100,147,540,560,585,586,587],[100,147,540,589,590],[100,147,540,592],[100,147,540,594,595],[100,147,540,724],[100,147,540,597],[100,147,540,599],[100,147,540,560,601],[100,147,540,603],[88,100,147,540,558,605],[100,147,540,606,607,608,609,612],[100,147,540,614,615,616,617,618,619],[88,100,147,540,621],[100,147,540,622],[88,100,147,540,624],[88,100,147,540,558,624,625],[88,100,147,540,558,625],[100,147,540,624,625,626,627],[88,100,147,540,558,572],[100,147,540,629,630],[100,147,540,564,567,570,575,577,580,582,584,588,591,593,596,598,600,602,604,612,613,620,623,628,631,635,637,639,640,642,644,649,653,657,659,663,665,668,670,672,674,676,680,683,685,687,690,692,693,697,699,701,704,706,708,710,713,715,717,719,721,723,725,727],[100,147,540,632,633,634,635,636],[88,100,147,540,558,632],[88,100,147,540,632],[100,147,540,638],[100,147,540,572],[100,147,540,641],[100,147,540,607,608,609,610,611],[88,100,147,540,558,576],[100,147,540,643],[100,147,540,645,646,647,648],[100,147,540,650,651,652],[100,147,540,655,656],[88,100,147,540,558,560,654],[100,147,540,658],[100,147,540,660,661,662],[100,147,540,664],[100,147,540,666,667],[100,147,540,669],[100,147,540,560,671],[100,147,540,673],[100,147,540,675],[100,147,540,677,678,679],[88,100,147,540,677],[88,100,147,540,558,677,678],[100,147,540,681,682],[100,147,540,684],[100,147,540,686],[100,147,540,634],[100,147,540,621,689],[100,147,540,621,688],[100,147,540,691],[100,147,540,654],[100,147,540,694,695,696],[100,147,540,698],[100,147,540,705],[100,147,540,720],[100,147,540,707],[100,147,540,722],[100,147,540,714],[100,147,540,711,712],[100,147,540,709],[100,147,540,716],[88,100,147,540,612],[100,147,540,555,556,557],[100,147,540,555],[88,100,147,540,555],[100,147,540,718],[100,147,540,726],[100,147,540,700],[100,147,540,702,703],[100,147,502,504,506,540],[100,147,338,343,423,540],[100,147,177,500,505,540],[100,147,177,500,503,540],[100,147,177,500,501,540],[100,147,399,400,540],[100,147,185,540],[100,147,327,540],[100,147,326,327,328,329,330,403,540],[100,147,158,177,326,327,382,401,402,404,540],[100,147,166,185,328,331,333,334,540],[100,147,332,540],[100,147,330,333,335,336,380,403,404,540],[100,147,336,337,348,349,379,540],[100,147,326,327,329,381,383,400,404,540],[100,147,327,328,330,333,335,381,382,400,403,405,540],[100,147,331,334,335,349,384,392,393,395,396,404,407,408,409,410,411,412,413,414,415,419,540],[100,147,327,404,409,540],[100,147,327,404,540],[100,147,343,540],[100,147,367,540],[100,147,345,346,352,353,540],[100,147,343,344,348,351,540],[100,147,343,344,347,540],[100,147,344,345,346,540],[100,147,343,350,355,356,360,361,362,363,364,365,373,374,376,377,378,421,540],[100,147,354,540],[100,147,359,540],[100,147,353,540],[100,147,372,540],[100,147,375,540],[100,147,353,357,358,540],[100,147,343,344,348,540],[100,147,353,369,370,371,540],[100,147,343,344,366,368,540],[100,147,343,387,389,421,540],[100,147,388,540],[100,147,327,328,329,330,332,333,335,336,380,381,382,383,384,394,397,398,399,400,403,404,405,406,407,420,540],[100,147,327,328,330,333,335,336,380,392,396,403,404,410,416,417,418,540],[100,147,333,349,395,404,540],[100,147,333,349,393,394,395,404,420,540],[100,147,333,336,349,395,396,404,540],[100,147,333,336,349,380,392,394,396,404,540],[100,147,326,327,328,329,330,404,410,419,540],[100,147,329,540],[100,147,333,335,383,399,540],[100,147,162,540],[100,147,177,401,540],[100,147,381,387,390,392,396,399,540],[100,147,327,329,392,395,404,540],[100,147,327,329,333,334,349,394,404,409,540],[100,147,326,327,328,329,404,414,419,540],[100,147,158,177,326,327,330,397,398,400,402,404,540],[100,147,162,185,331,421,540],[100,147,162,326,327,330,333,386,397,400,403,404,540],[100,147,177,333,349,380,384,398,400,403,540],[100,147,329,393,540],[100,147,327,329,404,540],[100,147,162,326,329,386,404,540],[100,147,328,336,380,381,391,540],[100,147,327,328,333,334,335,336,349,380,381,385,386,392,540],[100,147,162,326,327,333,334,335,349,380,385,404,540],[100,147,195,338,339,342,343,422,423,540],[100,147,195,338,339,340,342,343,423,540],[100,144,147,540],[100,146,147,540],[147,540],[100,147,152,180,540],[100,147,148,153,158,166,177,188,540],[100,147,148,149,158,166,540],[95,96,97,100,147,540],[100,147,150,189,540],[100,147,151,152,159,167,540],[100,147,152,177,185,540],[100,147,153,155,158,166,540],[100,146,147,154,540],[100,147,155,156,540],[100,147,157,158,540],[100,146,147,158,540],[100,147,158,159,160,177,188,540],[100,147,158,159,160,173,177,180,540],[100,147,155,158,161,166,177,188,540],[100,147,158,159,161,162,166,177,185,188,540],[100,147,161,163,177,185,188,540],[98,99,100,101,102,103,104,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,540],[100,147,158,164,540],[100,147,165,188,193,540],[100,147,155,158,166,177,540],[100,147,167,540],[100,147,168,540],[100,146,147,169,540],[100,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,540],[100,147,171,540],[100,147,172,540],[100,147,158,173,174,540],[100,147,173,175,189,191,540],[100,147,158,177,178,180,540],[100,147,179,180,540],[100,147,177,178,540],[100,147,180,540],[100,147,181,540],[100,144,147,177,182,540],[100,147,158,183,184,540],[100,147,183,184,540],[100,147,152,166,177,185,540],[100,147,186,540],[100,147,166,187,540],[100,147,161,172,188,540],[100,147,152,189,540],[100,147,177,190,540],[100,147,165,191,540],[100,147,192,540],[100,142,147,540],[100,142,147,158,160,169,177,180,188,191,193,540],[100,147,177,194,540],[84,85,86,87,100,147,540],[85,88,100,147,540,782],[100,147,485,540],[100,147,280,304,540],[100,147,275,540],[100,147,277,540],[100,147,280,540],[100,105,147,308,540],[100,147,306,309,310,540],[100,147,276,278,279,281,294,296,297,298,304,305,306,307,310,311,312,313,540],[100,147,299,300,301,302,303,540],[100,147,282,284,285,286,287,288,289,290,291,292,293,294,540],[100,147,282,283,285,286,287,288,289,290,291,292,293,294,540],[100,147,283,284,285,286,287,288,289,290,291,292,293,294,540],[100,147,282,283,284,286,287,288,289,290,291,292,293,294,540],[100,147,282,283,284,285,287,288,289,290,291,292,293,294,540],[100,147,282,283,284,285,286,288,289,290,291,292,293,294,540],[100,147,282,283,284,285,286,287,289,290,291,292,293,294,540],[100,147,282,283,284,285,286,287,288,290,291,292,293,294,540],[100,147,282,283,284,285,286,287,288,289,291,292,293,294,540],[100,147,282,283,284,285,286,287,288,289,290,292,293,294,540],[100,147,282,283,284,285,286,287,288,289,290,291,293,294,540],[100,147,282,283,284,285,286,287,288,289,290,291,292,294,540],[100,147,282,283,284,285,286,287,288,289,290,291,292,293,540],[100,147,280,296,540],[100,147,295,540],[100,147,188,195,540],[100,147,161,195,320,540],[100,147,320,321,322,323,324,540],[100,147,321,540],[100,147,325,516,518,520,540],[100,147,325,510,511,512,513,514,515,540],[100,147,324,325,510,511,512,513,514,515,516,517,518,519,520,521,540],[100,147,519,540],[100,147,511,540],[100,147,510,516,517,540],[100,147,195,325,511,540],[100,147,325,507,540],[100,147,324,325,507,508,540],[100,147,325,540],[100,147,532,540],[100,147,536,540],[100,147,534,540],[88,100,147,540,771,781,782],[88,100,147,540,771,772,781,782],[88,100,147,540,771],[88,100,147,540,771,772],[88,100,147,540,771,782],[100,147,540,771,772,773,774,775,783,784,785,786,787,788],[88,100,147,540,772],[100,147,161,177,188,540],[100,147,161,188,424,425,540],[100,147,424,425,426,540],[100,147,424,540],[100,147,161,449,540],[100,147,158,427,428,429,431,434,540],[100,147,431,432,441,443,540],[100,147,427,540],[100,147,427,428,429,431,432,434,540],[100,147,427,434,540],[100,147,427,428,429,432,434,540],[100,147,427,428,429,432,434,441,540],[100,147,432,441,442,444,445,540],[100,147,177,427,428,429,432,434,435,436,438,439,440,441,446,447,456,540],[100,147,431,432,441,540],[100,147,434,540],[100,147,432,434,435,448,540],[100,147,177,429,434,540],[100,147,177,429,434,435,437,540],[100,147,172,427,428,429,430,432,433,540],[100,147,427,432,434,540],[100,147,432,441,540],[100,147,427,428,429,432,433,434,435,436,438,439,440,441,442,443,444,445,446,448,450,451,452,453,454,455,456,540],[100,147,338,343,423,472,540],[100,147,462,463,464,471,494,497,540],[100,147,177,462,463,493,497,540],[100,147,462,463,465,494,496,497,540],[100,147,468,469,471,497,540],[100,147,470,494,495,540],[100,147,494,540],[100,147,456,471,473,493,497,498,540],[100,147,471,494,497,540],[100,147,465,466,467,470,492,497,540],[100,147,161,338,343,423,456,462,464,471,473,475,476,477,478,479,480,481,482,483,484,488,490,493,494,497,498,540],[100,147,487,489,540],[100,147,338,343,423,462,494,496,540],[100,147,338,343,423,457,461,498,540],[100,147,161,338,343,383,421,423,456,476,497,540],[100,147,448,456,474,477,489,497,498,540],[100,147,338,343,421,423,456,457,461,462,463,464,471,473,474,475,477,478,479,480,481,482,483,484,489,490,493,494,497,498,499,540],[100,147,456,474,478,489,497,498,540],[100,147,462,463,465,492,494,497,540],[100,147,338,343,423,471,490,491,540],[100,147,158,462,463,473,492,494,497,498,540],[100,147,462,463,465,494,540],[100,147,177,448,456,463,471,473,474,489,494,497,498,540],[100,147,177,465,471,494,497,540],[100,147,177,486,540],[100,147,464,465,471,540],[100,147,177,462,494,497,540],[100,147,341,540],[93,100,147,540],[100,147,249,540],[100,147,251,540],[100,147,199,202,238,540],[100,147,204,540],[100,147,197,210,540],[100,147,197,210,211,540],[100,147,197,540],[88,100,147,188,195,540],[88,100,147,210,244,540],[88,100,147,210,540],[100,147,242,246,540],[88,100,147,243,248,540],[100,147,198,540],[88,100,147,239,248,540],[88,100,147,248,540],[100,147,161,195,203,248,540],[100,147,161,195,202,204,540],[100,147,161,177,195,203,204,208,540],[100,147,161,172,188,195,198,199,200,202,203,204,206,208,209,210,213,220,221,223,225,226,227,229,231,238,540],[100,147,161,177,195,540],[100,147,197,199,200,201,238,540],[100,147,202,540],[100,147,172,188,195,199,202,203,204,206,209,219,224,226,228,232,234,235,540],[100,147,161,188,195,202,208,231,540],[100,147,196,238,248,540],[100,147,161,172,188,195,199,202,203,206,208,209,212,213,219,220,221,223,224,225,227,228,231,232,233,248,540],[100,147,161,195,208,234,236,540],[100,147,161,195,540],[88,100,147,161,172,195,198,200,204,208,213,225,226,238,540],[100,147,161,172,188,195,203,207,540],[100,147,230,540],[100,147,195,213,540],[100,147,172,195,198,199,203,206,208,540],[100,147,161,195,213,222,540],[100,147,161,195,203,223,540],[100,147,219,540],[100,147,216,540],[100,147,202,214,215,219,540],[100,147,202,214,215,540],[100,147,202,207,216,217,218,540],[88,100,147,196,225,238,248,540],[88,100,147,172,188,195,198,241,243,245,248,540],[100,147,203,206,210,540],[100,147,172,195,540],[100,147,205,540],[88,100,147,161,172,195,198,238,239,240,246,247,540],[83,88,89,90,91,100,147,238,540],[100,147,253,540],[100,147,255,540],[100,147,257,540],[100,147,259,540],[100,147,261,540],[92,94,100,147,238,250,252,254,256,258,260,262,264,265,267,270,271,540],[100,147,263,540],[100,147,243,540],[100,147,266,540],[100,147,216,217,218,219,268,269,540],[100,147,195,540],[88,92,100,147,161,172,195,198,204,237,248,540],[100,147,338,343,423,458,540],[100,147,458,459,460,540],[100,147,540,733,736,739,740,741,743,745,746,748,749,750],[88,100,147,540,736],[100,147,540,736],[100,147,540,736,742],[88,100,147,540,736,737],[88,100,147,540,736,744],[100,147,540,736,738,751],[100,147,540,731,736],[88,100,147,177,195,540,731],[88,100,147,540,731,736,747],[100,147,540,731],[100,147,540,729,736],[100,147,540,730],[85,88,100,147,540,732,733,734,735],[100,147,540,797,798,799,800],[100,147,540,796],[88,100,147,540,797,798],[100,147,540,797],[100,114,118,147,188,540],[100,114,147,177,188,540],[100,109,147,540],[100,111,114,147,185,188,540],[100,147,166,185,540],[100,109,147,195,540],[100,111,114,147,166,188,540],[100,106,107,110,113,147,158,177,188,540],[100,114,121,147,540],[100,106,112,147,540],[100,114,135,136,147,540],[100,110,114,147,180,188,195,540],[100,135,147,195,540],[100,108,109,147,195,540],[100,114,147,540],[100,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,136,137,138,139,140,141,147,540],[100,114,129,147,540],[100,114,121,122,147,540],[100,112,114,122,123,147,540],[100,113,147,540],[100,106,109,114,147,540],[100,114,118,122,123,147,540],[100,118,147,540],[100,112,114,117,147,188,540],[100,106,111,114,121,147,540],[100,147,177,540],[100,109,114,135,147,193,195,540],[100,147,159,177,194,540,836],[100,147,161,195,540,839],[100,147,177,195,540],[100,147,158,161,195,540,844,845,846],[100,147,540,840,845,847,849],[100,147,540,780],[85,87,100,147,540,776,778],[100,147,158,159,195,540],[100,147,159,161,163,166,177,188,195,540,841,856,857],[100,147,540,860,899],[100,147,540,860,884,899],[100,147,540,899],[100,147,540,860],[100,147,540,860,885,899],[100,147,540,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898],[100,147,540,885,899],[100,147,159,177,195,540,843],[100,147,161,195,540,844,848],[100,147,158,177,195,540],[88,100,147,265,540,753,754,816],[88,100,147,250,260,540,544,728,752],[100,147,254,540,728,752],[100,147,260,264,540,728,752,803,815],[100,147,272,540],[100,147,272,523,540,548],[100,147,272,523,540,546],[100,147,272,540,547],[100,147,260,540,728,752,803,815,817,819],[100,147,260,540,728,752,769,803,815,817,819,830],[100,147,260,540,728,752,769,803,815,817,819],[100,147,260,264,265,540,550,553,728,752,792,803],[100,147,260,540,728,752,767,804],[88,100,147,260,265,540,543,728,752,754,802,803,805,811,814,816],[100,147,260,262,264,540,728,752,765,803,815],[100,147,260,540,728,752,754,803,804,816]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29","impliedFormat":1},{"version":"2d100d34b597b4ca8f3cdaac049dd8607ca3b5622e5b89ce2e088357eaea6dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"803586c75b107c30eb4e0f48796ab4fd825e49ff8947a885fc05b63de01d9e31","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","impliedFormat":1},{"version":"54bd71c625e111b058159fc737c8f9a7170acfdb63cdb9a178558fb70e9fa9e9","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"2cbe0621042e2a68c7cbce5dfed3906a1862a16a7d496010636cdbdb91341c0f","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"2fd4c143eff88dabb57701e6a40e02a4dbc36d5eb1362e7964d32028056a782b","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"27fdb0da0daf3b337c5530c5f266efe046a6ceb606e395b346974e4360c36419","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1dc4bc37e2476766f29718f5006981009e2c7470ddd538d87be731b8bb24280","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"47ab634529c5955b6ad793474ae188fce3e6163e3a3fb5edd7e0e48f14435333","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"0225ecb9ed86bdb7a2c7fd01f1556906902929377b44483dc4b83e03b3ef227d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"f9ab232778f2842ffd6955f88b1049982fa2ecb764d129ee4893cbc290f41977","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"05db535df8bdc30d9116fe754a3473d1b6479afbc14ae8eb18b605c62677d518","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"30a1b56068b3820c91a055425a6af2294f8ef2bb10a59dcda413f6437093620d","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"54be1e9fa1341e79190896d0b79279b681714d79126b7e012777e328385cacb6","impliedFormat":1},{"version":"625e5d5e9e25017d53e65c62ff944d812d48ec1bbaaf7395c8f8cdf6c9218061","impliedFormat":1},{"version":"d9eb71e7c70837921557ecc76865043734dac2cd1bf1d3a7b24879de47befc89","impliedFormat":1},{"version":"39a3fc61a65aee8c90cd81bb2c9b508be6c5cc745cd40eaed95954a07c11bb82","impliedFormat":1},{"version":"254a9b57801e4f45ef7576236e5984e4abd95a03ea06b2018801ae3200e1617e","impliedFormat":1},{"version":"3150ee51540bdf0d4e0ccb05de6f905962dc3505bd28b7385c6924f7d9eeba11","impliedFormat":1},{"version":"2302818e3723d16f85c3d75de67247a1bacc23f5399b8235fde025737a6cc5b8","impliedFormat":1},{"version":"a13e414841a16a10e8637397f2551c52e1025278f4d8d2397824546dc272441b","impliedFormat":1},{"version":"98e00fba67d4b527de2929778f96c7f9453fbbb8c50968ff096dddd29057450b","impliedFormat":1},{"version":"b8d57d43415dc08b757f7bdfa382b596bf3627565dcb11bc325956f351abc813","impliedFormat":1},{"version":"481317b3d14426c2145b2a9a368f27278b20a76115bcc58ac5eb8649791e66b0","impliedFormat":1},{"version":"e5fe42c833993ca99b2e7628fd90bc3c0d30c9447a925d332ab90a53dff5743a","impliedFormat":1},{"version":"e264129e63c4e4c13586d8e166ee80c90a7da663b3d3e2a40f0fcaf89e267685","impliedFormat":1},{"version":"22082ac39501b626f8b4322d6bd6fb0424de438777b141f663286cf8bd048398","impliedFormat":1},{"version":"7efab7f15be1969d9e92bab327ec311d0bf7fc972f793cc8ca25ee95d7b720ad","impliedFormat":1},{"version":"bd53743631e1afc700defefceea03658ce7fa4a5a0a42622daed233b8c8d8473","impliedFormat":1},{"version":"16a510a8408f5a845b3e5dbe17a731b9e6dfdcd416410c36f8afcd8cf60c57a4","impliedFormat":1},{"version":"85cc7ba47f064d73b53d98e5384dad6e88809b8c0ecbf155846203d8736e99bb","impliedFormat":1},{"version":"be5dfb4c5c1bdfb0d853370c0de9a995cb39eef0f277d645a7f43caaea423d18","impliedFormat":1},{"version":"58902668adae2e5eb67efbccb4048afa02308fa684f1a4e4c7d47668ecf58c1b","impliedFormat":1},{"version":"2e14bcdfb0fd8cf0f6397a641018bb3d1409870af299707126302bd264cb3d42","impliedFormat":1},{"version":"11206290b4d52fa4a2ce697aef740ebb4514c58ac73a7c792e5b241b24d03c1b","impliedFormat":1},{"version":"837acd3f64bcd556da76827c292e82ad812170d880a490a7deb3f2de0ffa7c9a","impliedFormat":1},{"version":"2e94503b5076c161c7aac50b99bc5244ffc4cc3c4b699d079ce24b86208ebd18","impliedFormat":1},{"version":"17937316a2f7f362dd6375251a9ce9e4960cfdc0aa7ba6cbd00656f7ab92334b","impliedFormat":1},{"version":"2a878850cefd50fcb86b1164005cc48294edf62fc3bb100301378a448e3d2112","impliedFormat":1},{"version":"4e0528cf15ca199d8b363895c38e4f7b45ccd79d34f84861e8800cbd41eb2d37","impliedFormat":1},{"version":"8e64a4268cab5c9790d4895275ffbe654d75b877601ecb0ffadb66f95132b3bd","impliedFormat":1},{"version":"eaf9ff519bd303bff935b04d60d1269708fd2b5ce41b3d1d8ced373e2c02b76d","impliedFormat":1},{"version":"71cad090e94ca13ef78b9f4275159a76fb950ad33b47ea24f4874d1df5ad3dfa","impliedFormat":1},{"version":"6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","impliedFormat":1},{"version":"f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","impliedFormat":1},{"version":"37ac25883371c238e6c4575498d3517a25433382ed77f5181af60f9fa06eb2c4","impliedFormat":1},{"version":"1d5b8dfb36cd7234b297aeb66435f37ddb7579b1ef5e94a13e195d51b09c92cd","impliedFormat":1},{"version":"7a18dff83add08d87a614e3c28b07e919def3d72928dc846d557be176fc9e3a5","impliedFormat":1},{"version":"ecdfa1a2faf120fe24d456616945fee5c950b55ca60e3936592524b737a0623a","impliedFormat":1},{"version":"90e20fced750a875bb86a6b781a43593647f11bbb979511a4d7051d2d21f90db","impliedFormat":1},{"version":"7d03f9b34192444d1ae3d2dce4f88a126e51fb8e0cb0ce5a92019ff6212dc1ca","impliedFormat":1},{"version":"45f80f549a22887e9f85ad3c6a24a382d1e825c8e7fa72a2d1e7c53e0c4e623f","impliedFormat":1},{"version":"5cab8fa167ee711e4dfcd22ed632c60be36bd49dc6eea8cfdd3613c59d00c43d","impliedFormat":1},{"version":"a5b7d9811cb310f8abaebedbd80023cea0c9b4011984ca0c58a52f25fee67495","affectsGlobalScope":true,"impliedFormat":1},{"version":"22671c0bd8afbe9238285b94a9f6bf447838f290ff054850145989d347099192","impliedFormat":1},{"version":"00357bb70a10782936bbfdf7c87ad632e5c2694b6714224ea0995299db1885ed","impliedFormat":1},{"version":"2766dee26ea113e9b491b7842cb44df57c4d79b17057b42607e09fc174bd411d","impliedFormat":1},{"version":"cb4047ce260c2f4585b2d592d04a1d9a9c2a1ba32679a688523ec314a977989a","impliedFormat":1},{"version":"0511c61c22d677da1b6bab4d3844aead1d7e27028d2f0ed1ed315e0860ed5357","impliedFormat":1},{"version":"b4610d904ab939109aa8bcee6f795de8da780b6b4a4d8ff2ff9d2e3b699f55b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b20e6ed022d1615533cacba5ff84521a86e86e98ef79318415235d64858a0e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"37b859e0b3e9c67252710e6135a3e80daa5ccc5d9eaadd7728ede7ccde2d1263","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7f9c8b05e3a56b80f6a8362b3f084ea887d3f857bc885a5f1dbc03150b981dd","impliedFormat":1},{"version":"1329c41c13694c2d89f4576fc3d0f04e07f311a682bf958bde5b79e6c76c0137","impliedFormat":1},{"version":"f77d46ee52fbe94069be9a6b7d7345144d9b64fceb68c4fd27578ba333b66b6a","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"8303df69e9d100e3df8f2d67ec77348cb6494dc406356fdd9b56e61aa7c3c758","impliedFormat":1},{"version":"8de50542d92f9ac659c30ead0a97e9c107dd3404a3b4fd4bf3504589a026221a","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"7e3327a4bd457a8949d15cc317b76fc394732519b09facac6836a726b58f277e","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"c3a905a7fa93ca648349e934fb19356cf7b40e48d65658de3e0c77d67696fd40","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"c2489c80994d62e5b51370a6f02f537db4c37af5f914fcb5b2755b81f1906cae","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"38f19e920e7f0babb44119ed394e1916a16cf04b17b6724e07e1497cd5ea1445","impliedFormat":1},{"version":"42c686ce08bf5576ed178f4a6a62d1b580d941334fb53bdff7054e0980f2dc75","impliedFormat":1},{"version":"f5daecf7f124d12e92b3f640dabe6fe5f0444bb4d471fc2ee1811a5d8ba17981","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"26a451bf3a5f87ebaaa7694c5b664c3d9cec296f3fa8b797b872aee0f302b3a0","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","impliedFormat":1},{"version":"195aae3bcd7fa56c83e3242a6b613be4e70bbebbeebcf366140200750a7bd05e","impliedFormat":1},{"version":"5b5399e88bf15a6fbf4ac3660ae8c3df467932531f6940a914987faad103072e","impliedFormat":1},{"version":"7a87441a419deeff2165cf497fed7c3600c886cd41e92bce644320b9a01f5c5c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9c00f78ac4e60d1c34d0fb415df6b2fea5f6eea200076dff4d782256a4c2802d","impliedFormat":1},{"version":"79d056984a8964d3917c7587067447d7565d9da696fcf6ecaa5e8437a214f04e","impliedFormat":1},"9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf",{"version":"bc90fb5b7ac9532ac8bbe8181112e58b9df8daa3b85a44c5122323ee4ecbc2bd","impliedFormat":1},{"version":"9261ae542670cb581169afafa421aeeaf0f6ccd6c8f2d97b8a97ee4be9986c3e","impliedFormat":1},{"version":"6247a016129906c76ba4012d2d77773c919ea33a96830b0a8d522a9790fc7efe","impliedFormat":1},{"version":"01e24df7c7f6c1dabd80333bdd4e61f996b70edec78cc8c372cc1de13d67cfa5","impliedFormat":1},{"version":"f4742762590497b770af445215e3a7cf1965664b39257dba4ce2a4317fc949d8","impliedFormat":1},{"version":"ceeda631f23bd41ca5326b665a2f078199e5e190ab29a9a139e10c9564773042","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b43d676651f4548af6a6ebd0e0d4a9d7583a3d478770ef5207a2931988fe4e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"3594c022901a1c8993b0f78a3f534cfb81e7b619ed215348f7f6882f3db02abc","impliedFormat":1},{"version":"438284c7c455a29b9c0e2d1e72abc62ee93d9a163029ffe918a34c5db3b92da2","impliedFormat":1},{"version":"0c75b204aed9cf6ff1c7b4bed87a3ece0d9d6fc857a6350c0c95ed0c38c814e8","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"c9f396e71966bd3a890d8a36a6a497dbf260e9b868158ea7824d4b5421210afe","impliedFormat":1},{"version":"509235563ea2b939e1bbe92aae17e71e6a82ceab8f568b45fb4fce7d72523a32","impliedFormat":1},{"version":"9364c7566b0be2f7b70ff5285eb34686f83ccb01bda529b82d23b2a844653bfb","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"c311349ec71bb69399ffc4092853e7d8a86c1ca39ddb4cd129e775c19d985793","impliedFormat":1},{"version":"3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","impliedFormat":1},{"version":"4908e4c00832b26ce77a629de8501b0e23a903c094f9e79a7fec313a15da796a","impliedFormat":1},{"version":"2630a7cbb597e85d713b7ef47f2946d4280d3d4c02733282770741d40672b1a5","impliedFormat":1},{"version":"0714e2046df66c0e93c3330d30dbc0565b3e8cd3ee302cf99e4ede6220e5fec8","affectsGlobalScope":true,"impliedFormat":1},{"version":"550650516d34048712520ffb1fce4a02f2d837761ee45c7d9868a7a35e7b0343","impliedFormat":1},{"version":"c5e4864ae47a0aec24cdaef2e1b2fa34098f99c66d2adf07f96bcb3599414a3d","impliedFormat":1},{"version":"a1b3f2d5c8492001bef40ffd691ab195562e9e8b886cf9c4ed1246774d674dec","affectsGlobalScope":true,"impliedFormat":1},{"version":"060f0636cb83057f9a758cafc817b7be1e8612c4387dfe3fbadda865958cf8c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"84c8e0dfd0d885abd37c1d213ef0b949dd8ef795291e7e7b1baadbbe4bc0f8a9","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d21da8939908dafa89d693c3e22aabeef28c075b68bb863257e631deef520f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"5261e21f183c6c1c3b65784cdab8c2a912b6f4cd5f8044a1421466a8c894f832","affectsGlobalScope":true,"impliedFormat":1},{"version":"8c4a3355af2c490a8af67c4ec304e970424a15ef648a3c3fbb3ee6634461e2cc","affectsGlobalScope":true,"impliedFormat":1},{"version":"06c5dad693aebbff00bd89fccb92bce6c132a6aa6033bb805560fa101e4fe77b","impliedFormat":1},{"version":"6739393f79c9a48ec82c6faa0d6b25d556daf3b6871fc4e5131f5445a13e7d15","impliedFormat":1},{"version":"66a11cff774f91be73e9c9890fe16bcc4bce171d5d7bd47b19a0d3e396c5f4ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ba7eb9ae7b89904a2638acdab3661cde5ddbfdbb995024686a9424c7163c3a7","affectsGlobalScope":true,"impliedFormat":1},{"version":"793adb3237a0672f4c166a8e7b92901322cd7a64c60e35bb62a462a1542ac881","affectsGlobalScope":true,"impliedFormat":1},{"version":"452234c0b8169349b658a4b5e2b271608879b3914fcc325735ed21b9cb88d58d","impliedFormat":1},{"version":"48e97ffc64175d0ab89b5936cd4603cbfab871fc5cc9ea5c4b163be77633bc0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"326d76935bfa6ffe5b62a6807a59c123629032bd15a806e15103fd255ea0922b","affectsGlobalScope":true,"impliedFormat":1},{"version":"50210163584e7511b110fcc4f1f1befbfac31ad3907ca03200c81421000dfd94","affectsGlobalScope":true,"impliedFormat":1},{"version":"f87409d8f4452ba84cf6c1d395735d5c2c2a5c6aff3aca270bedd0b59558abc7","affectsGlobalScope":true,"impliedFormat":1},{"version":"f612acaec65ab596424c13455d3227184c078f7b07988706aee6b95876b7b830","affectsGlobalScope":true,"impliedFormat":1},{"version":"b64d019a041fecb45196c9f1af80af16c60adaa23efb3cef12e3b765b45d4412","impliedFormat":1},{"version":"674c7eb70201c86688bd9c90664b1147ea6218720b32d7a6c904745af0b27090","impliedFormat":1},"565b30e91b39c0558deea578c3b1d8d3ff05d05f989773680a0b3af1af629369",{"version":"c1e3e8739966af28e3928cd1be38090435458d2337a43f4da908c18fc6725e25","affectsGlobalScope":true},{"version":"e75aea34fc8ed19027ad9e082ebe562594a21d14d520289adc416f846a606ca6","impliedFormat":1},"3108b7aa80bb6966f3a75622373658ae6b2703561359679b414a254f469a5807",{"version":"b0046decbfa95be671046e9ff7d2d0b20f8fd2bccca37adfee0b708d0f43998d","impliedFormat":1},{"version":"c0b267335305e392d3f4129b68616baf48b3161696faa96e186b26d2f6a619d4","impliedFormat":1},{"version":"736ceb42da6acc5ecab4a189df3e8a32af2411acb29836b41127716893b7fc98","impliedFormat":1},{"version":"cd5b42538ceb9d69eaac2a46a79c2e053eacc289f22f2578c0986c3bc90a87f8","impliedFormat":1},{"version":"71d3b44df5c300d7944573523afda6e94d872613f4fe19e0ccc8c6f9ba0bbcf7","impliedFormat":1},{"version":"044a855baf9fac854bfd87ec98dee05c70037ccffe174ae452dc8afca3d6bc30","impliedFormat":1},{"version":"ddc11f385daa285bb0038898cef607ec492c7072e92df84d52df9d05a7092458","impliedFormat":1},{"version":"a22806a27f1b4c5d5616a87a62a3d89ad5b296fac68ae0a897429eb212ea3136","impliedFormat":1},{"version":"7c2c53a02a478ca87cab2342d35702e201775143cebee8b368372a181209decd","impliedFormat":1},{"version":"181694d1f7a579e57c55efb1418904efc513ebce0b08601e94f288674104359e","impliedFormat":1},{"version":"7e9b2581de465503aad53611709c61a3becd372b86c43bf9863f5715a1616fd5","impliedFormat":1},{"version":"d415bfa0853e03226a2342ab7ee3ef0d085e6d94e7dde869fe745ab11a8b3cc6","impliedFormat":1},{"version":"eed0cfbd238f0f9def37d26d793393c8cfb59afe28ecd1a4639a58905abdadf1","impliedFormat":1},{"version":"014705d98454b8d9f5bbf5c7dffa2079d151866d6e12d552e5faa2df8ee2fd5b","impliedFormat":1},{"version":"ab1296040de80ee4c7cfa5c52ff8f3b34a3f19a80ba4c9d3902ee9f98d34b6b5","impliedFormat":1},{"version":"952dc396aaf92bf4061cefdeb1a8619e52a44d7c3c0cc3bad1a1ddc6c2b417e4","impliedFormat":1},{"version":"416eec23b202526964d0f5ebf0ca9e0d8c08e4260bc0946143b66f1a1e17b787","impliedFormat":1},{"version":"bcb14be213a11d4ae3a33bd4af11d57b50a0897c0f7df0fa98cd8ee80a1b4a20","impliedFormat":1},{"version":"116b961153d86b304e788884c4a05630fe98423bcfc14c7a7ea8d542092aac10","impliedFormat":1},{"version":"f17c007d95f666ecf664ff13ca8efc196980597c4ca152a0baaa82b2525e2328","impliedFormat":1},{"version":"02ff761f690163463a4e7594d666e4c73995c4f72746a5967b3477d9ecf62c4e","impliedFormat":1},{"version":"84206a85be8e7e8f9307c1d5c087aedb4d389e05b755234aa8f37cc22f717aaf","impliedFormat":1},{"version":"45b1df23c0a6e5b45cb8fc998bd90fa9a6a79f2931f6bb1bd15cf8f7efd886d0","impliedFormat":1},{"version":"5f318c52eac7a06cd901b55e8e930d2c3dd51b7dbdca01b130e61c3e9b8b4f0a","impliedFormat":1},{"version":"f5b284ceadf71472a8fbf555dbd91079cce0ce7ba54f65dd63d18deec84cd11d","impliedFormat":1},{"version":"11f848107bc2f7535adccd37b55f018a0f18abbf5a1cd276f5776779618c37ed","impliedFormat":1},{"version":"8f47ed340254a8ccdf37035d9cba70f53a4d899804da840b47f4c3b07a7b2063","impliedFormat":1},{"version":"e79e9c45db9751fa7819ee7ba2eadbe8bface0b0f5d4a93c75f65bbb92e2f5c5","impliedFormat":1},{"version":"50b54f6dac82c34e8c12b35eac220ccc178f51e84813179826da0e3e96283af9","impliedFormat":1},{"version":"8acbcc0484e6495472d86da47abe9765541a2ecbaf88f4fecdab40670aeed333","impliedFormat":1},{"version":"6fd6fcadeab3b973ea52c2dbfcc960f23e086ea3bc07aaa0e1c6d0d690f8e776","impliedFormat":1},{"version":"7eed214004cc8d86022792c07075758fe61847c70c6c360235f3960492fd6155","impliedFormat":1},{"version":"a59fdd5525468b9afe1fef2238f5b990c640723bd430c589b4c963d576209be8","impliedFormat":1},{"version":"23c0f554c1fab508370678aca41cf9b1d6a6a00069e499d803d43387067fea9d","impliedFormat":1},{"version":"016f140691ab5fea3357a89c6a254ff8ada91173d22d36921bb8295fe5d828ab","impliedFormat":1},{"version":"ee219b4332439451cbf9ee34584e8a7e67be35d8ed3d1b292769a09483a102ce","impliedFormat":1},{"version":"305c2373ff739ceca5780a204766c76617e74b551f6fc646a358b5f687a77333","impliedFormat":1},{"version":"61c5821b70e113b15f24593e7061e6302635448ae700d813f06560ca5f140727","impliedFormat":1},{"version":"1e127052ae269b7f278b828978b962eb93bbc6134c0bda8b03e3f39df5c3865d","impliedFormat":1},{"version":"716cb84b8b410c52de9e7b310b2125cbc390a7c59e929a5c0a29514345b9ba9f","impliedFormat":1},{"version":"edabf50cfd2310b9af7214ecb821e0af6c43f66d8b5fb297d532f27bba242088","impliedFormat":1},{"version":"1687d528ca6c51a635f9a4022973f472221700464be83810788238a595cb588c","impliedFormat":1},{"version":"32162214c3f25748f784283a3f6059ad3d09d845faccc52b5c2cf521eace6bd6","impliedFormat":1},{"version":"4a13f78f265e7deb260bd0cc9063b9927a39f99f7cc8bb62b0310aa3a1df3efd","impliedFormat":1},{"version":"c04c509a58cc86b654326592aca64d7ceab81a208735c391dd171ca438114ea9","impliedFormat":1},{"version":"74c6a2352b00e41d352cc23e98e8d6313d5631738a5ea734f1c7bff0192b0f47","impliedFormat":1},{"version":"fc94bcfb823846ba8b4c1727520a3d509c9f517d4e803dfb45e6a71b41000eb8","impliedFormat":1},{"version":"0f6f23cdfb415a7c1c1d825a29d7750a4d65908e519ceff44feca8eb7f9a8ca4","impliedFormat":1},{"version":"e4c09f8a818679f80931fae1d0ca3dec192708c510c9f33fe56d71abe8337c59","impliedFormat":1},{"version":"b1cc0dfdc0455283ccf003185dbbc51e2c15299aff343413310eaf45c4572323","impliedFormat":1},{"version":"6efbec437d1022c2fd82055687710f25019fe703528a7033a3fc6fbfc08b1361","impliedFormat":1},{"version":"2a343c23d4be0af3d5b136ad2009a40d6704c901b6b385cc4df355cf6c0acfaa","impliedFormat":1},{"version":"af4beeac0e879b673f8b874e5fe013bdebfb17f0213142e5037ac90aea86d636","impliedFormat":1},{"version":"c620ccd98c18e71d7e39a79bea47b4f4724c3a1f30f78d2cdd03cf707ae64e4d","impliedFormat":1},{"version":"150f375c7f5c01a15d531c961468f1a04a1c21dc4e4a372ca4661700d66cc9c2","impliedFormat":1},{"version":"8aabc7d8676ba6098fc30c95eca03a331df41ac4c08213207a9329998f32d1b0","impliedFormat":1},{"version":"9d8464e1c6b7f30c4121d28b11c112da81c496c65e65948fbc7d5b5f23b50cdc","impliedFormat":1},{"version":"6b88a632af960a4140730527eb670c3d3e6eae0da573f0df2849909d9bb3e5f3","impliedFormat":1},{"version":"ab2f4f2d874d18918f0abb55e5a89a36ab875e01e3e9efa6e19efbd65295800b","impliedFormat":1},{"version":"2212906ab48ae8891080a68a19ba3ab53a4927d360feb34120051aff4ae980ae","impliedFormat":1},{"version":"309ea20e86462f6f0a60ea7b1a35e70443054cd3e067a3b1a7ec9e357b12c4b4","impliedFormat":1},{"version":"61be4fb5600f49c7f2f5ade98f4d348d72493702dd6ba030275c23b970af3290","impliedFormat":1},{"version":"7461653b170e68cbe4be7bffaf2614ec832f31c99e2e49e4001f02c608ea59cb","impliedFormat":1},{"version":"bfb3200df4675c3b0c4a9346c42df10bd0cc28191e5c4bab51cc3b720b7a9e33","impliedFormat":1},{"version":"415d86471331c03ea56dd1f1bc3316090eef24a1b65a129a14579a97dff19539","impliedFormat":1},{"version":"743f84b507c5f9277e37f5e99b4587f03b9ef871625f7b1c10713ddc57733fca","impliedFormat":1},{"version":"75b894c18d2ee4c8b61e1c7dcfd475e51422ff0b8ce166874e7ab3447092ed25","impliedFormat":1},{"version":"22a1be63fb29b28628376bf90a0cb1706a9e10eda46cacfddbf544913c5d0b4d","impliedFormat":1},{"version":"8223f879f70edb086a7f0ef541eb87fa987c006b28f51aaa4a12b51bb82229f9","impliedFormat":1},{"version":"01ef7c7fc81a6064f52f4830b7c29ca0fcc00b1024dd5d12abc01d93e4266914","impliedFormat":1},{"version":"57610357bc1c035d31aac6cceb4d52655b4326c138a7bcf34d2aa71b33ed6157","impliedFormat":1},{"version":"122c203d7674cd08bf6962dafd4286b3319d8267cf6f513d3b42758f20056fa8","impliedFormat":1},{"version":"da242ab9bfe5833acf730ade2f6966aa207ef4d372de8bc6498b723fef422846","impliedFormat":1},{"version":"ac737900a71c3e090585b62b58864a490066dd4d5b3920fea19aeb5895df0407","impliedFormat":1},{"version":"7a888b10a2b8b0f2980f4c8d6f95d8a3dab3cf936b0bbfaf90b8950c619f0152","impliedFormat":1},{"version":"6fd8108448d9a07abbc520d1041e4ef6e696aa8ba00743267bcad319f0502fc6","impliedFormat":1},{"version":"f6bfdca1b0aee97e70167a35b3aba08cac13280ce8d61d5fd629bce8f44261b0","impliedFormat":1},{"version":"a039d5d54c4d608941aaab6a5d8a24786f03ebe1f810feb6026e184f35b41cf8","impliedFormat":1},{"version":"01ea567dd2334d0707a4cebaa7b1dd035473cfe87c77b0e10aed7e35692d51b2","impliedFormat":1},{"version":"5ea29d748e694add73212d6076aac98b15b87fd2fe413df3bf64c93e065b1524","impliedFormat":1},{"version":"94db805ae4e2a5f805e09458ba2c89c572056f920116ee65beba8c15090b8193","impliedFormat":1},{"version":"df4b5e6fe2a91140a1ed2f8f94e01d4c836a069cee23a2d0a83a00cf649f8505","impliedFormat":1},{"version":"5acef0f6a0afa32b582a7ad0a13688466bece4544ef3c8506131bd7342f528fe","impliedFormat":1},{"version":"4dc9b86feaac2ee1eafa02bd550f5851de7ac604fbf661278b14e40443d9d0e4","impliedFormat":1},{"version":"43879c8f3e8a599baeb696ec2319cafb6458ce1b0045cb2d98699f38ccdaa630","impliedFormat":1},{"version":"d85dda762b52fd95ac7456ab33be540ef9e24339370ab3981b8a4c68232259b4","impliedFormat":1},{"version":"fb0d83c2e2dc390a2a0f5c55834a301fe1cbc1021062d75a27059893f307bcc5","impliedFormat":1},{"version":"17aadaec93ee74b8c244050bd3a8c671c2968307fbef3f375483a185a2462681","impliedFormat":1},{"version":"401fa7edce893a618c09a1bbf3828e688057e4e46ffe020113ce9552cb6bc2d0","impliedFormat":1},{"version":"2e2cf6354f64725b2826804843bdffa041ca7600fef3d29b06b9fa04b96bf99f","impliedFormat":1},{"version":"9aedd5430b48e1ef15ca37a53699394be1aedfb75916eaa7d26f78ab8ef2dbed","impliedFormat":1},{"version":"482603b60ae36425005dda60408d32b75c49ef4b2dd037f64c9ccad0ee320a9d","impliedFormat":1},{"version":"d72f9fcc99d533dcc39bbf01d48f11eb58f5356ff20734c55fe7ae2db0d71720","impliedFormat":1},{"version":"c18304517d056cdf57c142f6bd662ff92672e641693b3cf89208a89ebf7a0141","impliedFormat":1},{"version":"37cb02c345b5315b2e47f41cb6c5946b2a4dbcb033cde3988b793730e343925f","impliedFormat":1},{"version":"950472b97087047840647e295474f799c98a3ac092977e01e7c5f669b88a88d5","impliedFormat":1},{"version":"5defecd97ccc564057ed56028d4ff752ce20fe2c55d89a21331e92494d807f04","impliedFormat":1},{"version":"3f61c190904ca6eae98904614cff4a77a7581bffde53b06846018b0377afbfa8","impliedFormat":1},{"version":"b6ce1e776bff7d6914ba88fc0c079d041cd7a011c8f72e7a53e6aa89c6fb88bc","impliedFormat":1},{"version":"37f5e7d5ba458ea6343ce2884b1278ec5a23c972f021db17c5f47d91b26a1f7a","impliedFormat":1},{"version":"f427ac544498d9c749073ed6bdd314cbbd87240ca9e739db1c7fa2cc1f639ea5","impliedFormat":1},{"version":"487b5195e791eaae94ab27b6a591e114f8b6067450b8a1493373290430a30018","impliedFormat":1},{"version":"02ff761f690163463a4e7594d666e4c73995c4f72746a5967b3477d9ecf62c4e","impliedFormat":1},{"version":"84dc97f65f9455619d0721a7e8c9bcafe25d25e4e40d175c09b4a5fa6b012c11","impliedFormat":1},{"version":"005f10cafe0939ae8d6a98e19c4ddf8b59faf3f9ae38dfa5907b82b9a6cb4de9","impliedFormat":1},{"version":"089c056ad8ecb34ee72cb831491ab72c214d8fb7ecf94b96a1b4736ab54397a1","impliedFormat":1},{"version":"e643ef3093cba63af26396ae8dc58dc542c241027749dcdf715f3d3209f79a03","impliedFormat":1},{"version":"f40e6338b8137033a5b4efbe01de45a4399f2c304648eace01d852cd05eb861e","impliedFormat":1},{"version":"89d879fae02696e226dbcb7444d6153158fa264bb646071988f19a2e422b314f","impliedFormat":1},{"version":"57de3f0b1730cf8439c8aa4686f78f38b170a9b55e7a8393ae6f8a524bb3ba5a","impliedFormat":1},{"version":"e933bd300ea4f6c724d222bf2d93a0ae2b1e748baa1db09cb71d67d563794b2d","impliedFormat":1},{"version":"c43d0df83d8bb68ab9e2795cf1ec896ff1b5fab2023c977f3777819bc6b5c880","impliedFormat":1},{"version":"bf810d50332562d1b223a7ce607e5f8dc42714d8a3fa7bf39afe33830e107bf7","impliedFormat":1},{"version":"f025aff69699033567ebb4925578dedb18f63b4aa185f85005451cfd5fc53343","impliedFormat":1},{"version":"3d36c36df6ce6c4c3651a5f804ab07fe1c9bb8ce7d40ef4134038c364b429cb3","impliedFormat":1},{"version":"e9243dd3c92d2c56a2edf96cbce8faf357caf9397b95acaa65e960ad36cb7235","impliedFormat":1},{"version":"a24a9c59b7baecbb85c0ace2c07c9c5b7c2330bb5a2ae5d766f6bbf68f75e727","impliedFormat":1},{"version":"3c264d6a0f6be4f8684cb9e025f32c9b131cca7199c658eea28f0dae1f439124","impliedFormat":1},{"version":"d3cd789b0eebd5cebde1404383fd32c610bec782c74a415aa05ab3593abc35c8","impliedFormat":1},{"version":"8c1babb42f52952a6593b678f4cfb4afea5dc91e5cfaf3ca922cdd2d23b1277a","impliedFormat":1},{"version":"04ebb965333800caba800cabd1e18b02e0e69ab6a6f8948f2d53211df00a193c","impliedFormat":1},{"version":"f8e2be107b3e756e0a1c4f5e195e69dce69d38d0ff5c0b0509933e970c6d915b","impliedFormat":1},{"version":"309e580094520f9675a85c406ab5d1de4735f74a38f36690d569dbc5341f36a8","impliedFormat":1},{"version":"c2fa79fd37e4b0e4040de9d8db1b79accb1f8f63b3458cd0e5dac9d4f9e6f3f1","impliedFormat":1},{"version":"4f0d1a7e2a5a8b85d69f60a7be2a6223827f5fec473ba2142279841a54e8a845","impliedFormat":1},{"version":"ae2fb62b3647083fe8299e95dbfab2063c8301e9a626f42be0f360a57e434797","impliedFormat":1},{"version":"f53d803d9c9c8acdbb82ef5c6b8f224d42be50e9ab8bc09c8a9a942717214f9a","impliedFormat":1},{"version":"d2d70166533a2233aa35977eecea4b08c2f0f2e6e7b56c12a1c613c5ebf2c384","impliedFormat":1},{"version":"1097820fae2d12eb60006de0b5d057105e60d165cf8a6e6125f9876e6335cde7","impliedFormat":1},{"version":"8f62905f50830a638fd1a5ff68d9c8f2c1347ff046908eeb9119d257e8e8ae4a","impliedFormat":1},{"version":"8b4d34279952175f972f1aa62e136248311889148eb40a3e4782b244cece09f3","impliedFormat":1},{"version":"d3c3cc0840704fe524dbe8a812290bfd303e43d3bd43dcaac83ee682d2e15be0","impliedFormat":1},{"version":"71725ba9235f9d2aa02839162b1df2df59fd9dd91c110a54ea02112243d7a4d9","impliedFormat":1},{"version":"80af0c272dcb64518f7768428cdf91d21966a7f24ed0dfc69fad964d4c2ed8c1","impliedFormat":1},{"version":"1dc9702aa16e3ada78c84aa96868a7e5502001c402918b6d85ed25acbe80fd51","impliedFormat":1},{"version":"35f891c1bc36c97469df06316c65a718956515c8b3bdbeb146b468c02493ef13","impliedFormat":1},{"version":"2e9b05d7db853315f44d824e13840e6fdf17d615d13170b5f5cf830442018dcd","impliedFormat":1},{"version":"75efaf7dee18ee6d8f78255e370175a788984656170872fd7c6dfba9ed78e456","impliedFormat":1},{"version":"45801e746ccc061d516dd9b3ada8577176382cbf1fa010921211a697cc362355","impliedFormat":1},{"version":"529f07b003aa6d6916e84a5c503c6dc244280bed1d0e528d49c34fe54960c8dc","impliedFormat":1},{"version":"a4d6781f2d709fe9f1378181deb3f457036c7ebc7968a233f7bc16f343b98ced","impliedFormat":1},{"version":"94d6b9e12ee034b99c3bfff70b5f92df1fbcb1d8ebcb46fd940047fe1bd68db9","impliedFormat":1},{"version":"d0d843664c2251b877ab4d7e67fea4054bad5a33b1f8cce634f0acb4397e4ddb","impliedFormat":1},{"version":"6ae375916cb1ab039b0d8191a1b2a4c5ee7d54ca55523edf9c648751d9bf4f3f","impliedFormat":1},{"version":"cfa00459332e385bd6d999dc1d87adeec5ed7d383bde9f7ebf61159d370e5938","impliedFormat":1},{"version":"5b016a20523753fb55e44223ad7e4f2728a3d6b83771e8f2b52a3212d612f494","impliedFormat":1},{"version":"996e31673fe2d4cbd4708d14dc547f79b694e40d58622c982eb26e15eabd78eb","impliedFormat":1},{"version":"27f91d5df194be07adba9331db4861ebce0250d2401c56d4a56979fa2d8d9685","impliedFormat":1},{"version":"f9a8a74a3277dba5994b7830faa0a72ccbbdde4edc546579ea5f3bfdd833f1c3","impliedFormat":1},{"version":"6396e07ac9d5653e2ea225c491e7d5b548165eddb49e4293dcad42445fdd2b5b","impliedFormat":1},{"version":"4356f53b3bcd48f4253465746ccdb0baa38c6bf929712349bffea5426e59c2f4","impliedFormat":1},{"version":"c07dcc52ff4bf2fe6b9027067089b2696ea8debfab01c5a89567b57c85a8143a","impliedFormat":1},{"version":"0e60e0cbf2283adfd5a15430ae548cd2f662d581b5da6ecd98220203e7067c70","impliedFormat":1},{"version":"01c7b17b4106823329939ac4971770aa720b35749401312a9c6610ba61a689f3","impliedFormat":1},{"version":"53902be908625a56e222e1e005948b242822863c62bbd8fcd1ea047da47ac29e","impliedFormat":1},{"version":"6ff08a01c33e70289d44268bb3954c9f3c71162085b829dc323279fbf3a70b2a","impliedFormat":1},{"version":"35a7696566e4ceabf7bb6e9edf0256c8e8411783565c26511033e2edda9e3911","impliedFormat":1},{"version":"88ab5c0465b89250245fb97b17192adbd7d3ee26b26e29f948a410c4dc554663","impliedFormat":1},{"version":"2368808dcbd42d82a70cccb12a06d6e20022f65e1feaf0251789ee24a85e0e67","impliedFormat":1},{"version":"25f989f57da0150fc531eb60696097517c300e41c48f9a35cf8c39a2884e9e9e","impliedFormat":1},{"version":"801ffcacdae7f0a2486c3ca2cf59022b289519e660a4001acc81cde94080c262","impliedFormat":1},{"version":"eec90c87a90d6f26e36ba3d1048957132682558ef88d0128241b83cee373ede9","impliedFormat":1},{"version":"706623c288a5e8a35eab6317786cc2b8e0e1753f5c3f0d57fe494c1ae269e8a3","impliedFormat":1},{"version":"932cade1c5802123b5831f332ad8a6297f0f7d14d0ee04f5a774408f393e2200","impliedFormat":1},{"version":"95874c2af12afd52e7042a326aef0303f3a6f66733c7f18a88a9c6f3fa78d2ee","impliedFormat":1},{"version":"2859adaa4f2db3d4f0fc37ad86f056045341496b58fba0dbc16a222f9d5d55b1","impliedFormat":1},{"version":"655ed305e8f4cb95d3f578040301a4e4d6ace112b1bd8824cd32bda66c3677d1","impliedFormat":1},{"version":"8511f1d1ea7b35c09639f540810b9e8f29d3c23edbf0c6f2a3f24df9911339a0","impliedFormat":1},{"version":"2ce02eb3ddb9b248ff59ca08c88e0add1942d32d10e38354600d4d3d0e3823f5","impliedFormat":1},{"version":"a8db2bf4766dc9ca09b626483c0c78b8f082f9e664b1aed5775277ca91966a32","impliedFormat":1},{"version":"21489ccc5387a3b7ec72288f35825eef99d1550cb5cf4448655f60788c2dd2bf","impliedFormat":1},{"version":"b97c43cc5c758375c762546242bd2e5dfecea495d11e7ab8670cdf7800a78a55","impliedFormat":1},{"version":"76e8204d6c3f2411c8b0f3e0db34e190880acbc525be4facf882abac3c6e9868","impliedFormat":1},{"version":"ae11c2830121324c7f7b3c2c72f6c96eaeee9bd36217893531f965be93940b01","impliedFormat":1},{"version":"3a8d1eb7be079997217f3343f26d11af23d1e330ae8edaa15d0ee6b3663405bd","impliedFormat":1},{"version":"75191cd4f498eecaa71d357b68f198aabff6e9aeb094783bc2e88224f2440e91","impliedFormat":1},{"version":"68ab7ba45dd13e321f9b4ffa2cc9092c66c8a32eac53f8268ef992c9d83bddae","impliedFormat":1},{"version":"df2f57459fcc94dcfbc999311ce1927d35accdbee5bc79751467f16121ee99b7","impliedFormat":1},{"version":"a0c1105a4dd57d412dceaa7cc2211e9ee7a9102849d69ea6610e690eba6eb24c","impliedFormat":1},{"version":"069953e197846ae2c271627a01f114623b58eac2fd40bc0b49058c7a2cb79d22","impliedFormat":1},{"version":"506b6ed00eaf46798979021e707f4e0a9b5efa39600a0d6fa8d4ba7a96d3331a","impliedFormat":1},{"version":"48d5a3642727e962342b760621baa9b30c05b0c1a327ad1832a53b2f580c62c9","impliedFormat":1},{"version":"655a1702bca6a1c60b932118cf142bcf3d4f246628cbb8a7a1160205f45016e7","impliedFormat":1},{"version":"6dcf9ebaf569318a67670d24958ac49fbb820114ec939c6a019405dd61468f33","impliedFormat":1},{"version":"cec2aaab4a551be0935d6166cb7f098ccfe2172c10e611c9321b3b676a53c496","impliedFormat":1},{"version":"3f08c2595b48fa8b71831fdff3af41bfce96eb48cec81ea6d2d9d9d957cd97fe","impliedFormat":1},{"version":"61dcb5357451ea04ddd06391bbc87ecd9f6b8397d2a386ea40df3b6806141c99","impliedFormat":1},{"version":"f17f889f40110c2dd21e7b8a067af42432a1c34fb16a9e0c8b2c4a3a735a54ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ed7dd53cda73f4ab5f4659981d82e87e63ec4323817e83daf1f263e567a2122","impliedFormat":1},{"version":"eb192dc8f995753b598084dc6393b4b92c9bc625315292a77e988fa92775ac29","impliedFormat":1},{"version":"bfbf4ee614fba4f9d38bf7a7d03a2557a887830787670cebaebfcb656351af18","impliedFormat":1},{"version":"29a8ec1444766f4308d761b988af77a4213af4ad2b5feb80660a8e399b1f34d4","impliedFormat":1},{"version":"8708b827d3d701cdba0df0aff33d386427c8fc2bcb424592ca888eb97593dd59","impliedFormat":1},{"version":"f498700176137091d70ad301386949fb2a45ab279ddadf1550827cc3e0beb647","impliedFormat":1},{"version":"865fe4d7e5122f98cda832d3c307b25b6d892d4114b6d46935b6d8f4093d1a87","impliedFormat":1},{"version":"de81dbb78eb923238b447c33fad012b547939cb1061926aa6ce4b65f785b0f82","impliedFormat":1},{"version":"b6eee8f3f0a26e048701c23986ba2eac78957360fe13141a95c2cf1e8ac05aa8","impliedFormat":1},{"version":"0e22f537eccb5a914ea1bcfd7d66c204b9d1cb1db6d2ac2ef98f29a1c0368cf4","impliedFormat":1},{"version":"bd4d567df759a36b6108b8b9c6e8d60bff197fadf8bb3d0010c6c912b2068f26","impliedFormat":1},{"version":"64d5382d6c93fefe02a62fc5c41f4fbda8097f06b7cada8373cfdfba13d860ed","impliedFormat":1},{"version":"4626aa1293c7335ad2f395bd8958fb356d7d84c5cce4a6ddf9440654560d362d","impliedFormat":1},{"version":"1aa76f0ccc9d4d62a3fee0d0d3e4ff18db7624134a12d769323cef99f85c6c03","impliedFormat":1},{"version":"a313542e702cf47b993d9f12890f934003b10027f4f2d0b42393aa8710db11bc","impliedFormat":1},{"version":"acbf84a03c65aed0493acf7f432b269edc6a8c30ec1c7d538430dba1e7c76d7c","signature":"922cae1cf82bab1e4edcd921027b120f5dd43e33fc696bb2208a07c028ae4099"},{"version":"cdbd35458f506b843f280d695d192968af4b0f27db3d5c0707934d97e96dd88d","impliedFormat":1},{"version":"0d86e751cdf42541f9b0dc579f1fad78ba02c9b57104723187d942c53bd63092","impliedFormat":1},{"version":"dae32a2a0cc5be690082fc59bd4b16ab58fc400d8802dc3073657ff4e825c48a","impliedFormat":1},{"version":"654bbcc8726e2a7a684460eda9c7d25847716587b04a72e0b88e75d828aa3db1","impliedFormat":1},{"version":"5c252941b1299551ad4f3f44ef995ee7a79585aebe2c5318271297496f2611c6","impliedFormat":1},{"version":"ca862092adc2e7df5d8244e202db4a5479bee59299ed6620773040d5e843e780","impliedFormat":1},{"version":"84ab1b8202996d370d7580cd15c85fe5981c9fd8ce4e20019de7203c8e9b594e","impliedFormat":1},{"version":"b7b58b11be801068222c596659957f4defdeec281974feb02a28d9c9ea38cd51","impliedFormat":1},{"version":"27a8d35a2910e71c796d71fb6d570a36dfcaef8cc69bd02e0b14fd143b908e04","impliedFormat":1},{"version":"d488bd13a9d714f30014a5f8a8df1be6b11ae3411efa63ba6643af44749bc153","impliedFormat":1},{"version":"973d9c7b2064204601c4361d2ea007cfd7e0f767cb7138979f79a38cf4125964","impliedFormat":1},{"version":"7656a4096d1d60bdd81b8b1909afdf0aedb36a1d97b05edf71887d023dd59ea9","impliedFormat":1},{"version":"197dd169eff598c8888dd37a3f5c3e45c1759251085119b166c1b37b50ee43b1","impliedFormat":1},{"version":"898f97b7fab287b8dd26c0f8d91fafe17bec2578645a9741ce8242f3c70ae517","impliedFormat":1},{"version":"015ec12a5a1699c7466521ec59f4edb10853579c8aeaf6755e7aae442ed7cf10","signature":"4802d956f33520228bb89c3ad5780a4952555437eb696301b8124c8d45e36bea"},{"version":"6eed88ce45c41746dee34d61027633a63a9ead098bf4fe8005667e1cf655cb02","impliedFormat":99},{"version":"d204bd5d20ca52a553f7ba993dc2a422e9d1fce0b8178ce2bfe55fbd027c11ae","affectsGlobalScope":true,"impliedFormat":1},"d75e2ae4872ca4c960704b14600ba1891c89436119250c5b5273c31bb59d5e24",{"version":"5166d8ba3d2ca6609b3a59130e455a8028626429517b75bf6a1de3ff686eb38e","signature":"bbda3962d4ccb6266d126e3635dc69c7d56325eab4d1f328ec93d50559b1d6c7"},"cba95bccfa8d9f9447a86db966bde6f3acdc92687ef4128f81ddeb2ee73a6ce0","230d68fbb4036fe6da1aa15c82b22dd18fc0c3b04d6bf5fccff4a27b6e68bd2c",{"version":"5f949ab72b423fb15fa2ae232b37abcc357040efc2014da123502e36daac233c","signature":"63ed84124a5befbce76cfe337b44c2be8c00c58ede9ef14e9cc36a196da400fd"},"01cc2b4370f4497af1d3fc6b2f9c1435abdd4229af948fd68a66ad71894e0fb4","245754bfdd40b1be0444b15a2f3a7ff1a24250b71c9bd39e42634f1eb106ee84","27a4191f15cdad54f2ba2f34a67f396e9a911134d9d28e0a5c563fa658ae1355",{"version":"e49373431e662a1f0257ba960855a3ff05c022c2ff629716a6e141be7f508ab1","signature":"edca273b1ed146477b29a8e8db11cb80493f45c055aa2525e7fc4b73c43ac0a1"},{"version":"952ba4bb39dc0a5cb06ccb78f215ae1fdc7e0d45607fd058c0ca6e52764ddae2","signature":"b4b4fe7a49751956909d4a07394acbdc3ee7151d2e27d1435d61a56fa3e24367"},"3ec7c16ed732757d7156c47472d358e9d1136c0960522cac38be5d50db25650d","d3130c12467c4cb62a9d65087c6c99f841376bc7d84496595a4de2d715f2406f","71d1f6a578cd81c3e6d3ee59fc533f2b3d8de437c7e4ef5503b9d9c971fa4b3f",{"version":"b3338366fe1f2c5f978e2ec200f57d35c5bd2c4c90c2191f1e638cfa5621c1f6","impliedFormat":1},{"version":"54a0b73e6c275d847434735b8687241ba422e4b57c8652cd80d6e400b62201bc","impliedFormat":1},{"version":"5aea6989a6113dcf21b03d07887a48903817af92e17eaa64ef0d6d6a91676a50","impliedFormat":1},{"version":"68569e76ed68e0c23b0762d0b1ce53a6330c6dd8e38b77d147c792190bc2479b","impliedFormat":1},{"version":"6251ca7971e0b8280a12b5c2e00a656e95aaf7b9aaa57e7ba1979efd112f53be","impliedFormat":1},{"version":"e78ac008dd7a0374e82de042dce6cc2ff7733db8655c9fc5a8287514fc04878c","impliedFormat":1},{"version":"bcbe023fd45923eea2e81e32e43a1367eb0a79c2bb7497448492c6cba928a29f","impliedFormat":1},{"version":"7cc37e93e9ce58794514df94460dfc275fa591faeb4571583ae0acd601bd8463","impliedFormat":1},{"version":"ea0d9ee322ca943f74e8c886ab58d14159352c9330cf7ef5a147094a5836d20c","impliedFormat":1},{"version":"8910493b6c5078c62b361eec2e8c983e1ccceaff933a28d8b28fdbef436d97a9","impliedFormat":1},{"version":"b6d5179e325048773b85d96d927b6321e90b987cff398315466d07860c50cbd3","impliedFormat":1},{"version":"c707d93ed78a6a1694468e818d344abb434c691cb18b9d76fc2f2750dd15b923","impliedFormat":1},{"version":"353a8744414a4dcfdfdb0b1f512c3cc06790d0ac3125852877743b1724d11606","impliedFormat":1},{"version":"31802c2eb97326822af25e4c430071b6435f2a002e0cfe88ae2820ef5a847bbe","impliedFormat":1},{"version":"d11936bad7d71629c37f8c575c7af2248fa8a39ca9b949d2e28775db008a758e","impliedFormat":1},{"version":"6ab42ecfc62e09057dc3ff1d994181c9907225ed62aae29717bb38ff67d16d26","impliedFormat":1},{"version":"8680ac3e6be5612959708240da98b1bf4d3231c6a0da637c1565d573f506a4e1","impliedFormat":1},{"version":"4703a1d254578b195504d60eabb890c65d453b4dbeb6416cbdf348566be8726a","impliedFormat":1},{"version":"e9a1a210e312f46ad1e949e78241e53c3fd0b4ea4918b2a083020b182fa839a2","impliedFormat":1},{"version":"6ff87b21780aa23a33ec1bcbd6cf21d0a0d5b7b0aa0711eab004cc6eed586f0e","impliedFormat":1},{"version":"3490521fd5ff45bcec0397302571f45526601add74c760d434455e8eb9e279fa","impliedFormat":1},{"version":"102a932b504edb89da93dcc517187676c430c5d8781ac8c881cee62de929bfd8","impliedFormat":1},{"version":"b04f151ad5cd2f5b1124e297b87d1c7251dcb54c266ac8ee7a340ae0676e8418","impliedFormat":1},{"version":"322747a537c20892f21406e6220423dbe9dbf8e6f5fbef1df8423f15cdd8a826","impliedFormat":1},{"version":"7549778745425e964089e66e3fb4ac65a26a68c6e0138b43fc1e07267431b950","impliedFormat":1},{"version":"c2a4e0dc003e5bd572e3d60e681aa5455d44359af42007f9e8926d2da44cf7fe","impliedFormat":1},{"version":"daa57fe9ec8cb23b4f1698f9fb56dfb7816cf076fb0249fd8d07eaff3703b9c5","impliedFormat":1},{"version":"7bd99b34bd52fe235e284bdb40c853f758292f5d3a5b4c134d79c725f64675b9","impliedFormat":1},{"version":"2df0115b6d0319a9e0bda292e2b85bb675c8ddeed261b389ee35421ff91096aa","impliedFormat":1},{"version":"e097e01cbdb08d4acc69798235dc84c7769a32de69c09e59eec21f66be5f9e26","impliedFormat":1},{"version":"0756fae9df961bfe5870f5d04237e27d435c19fcf88ad2fbad5f0338d1613e6a","impliedFormat":1},{"version":"336104ddcf2cad01762cbfb8e4de53f120e86d028e15b56cc93f0645832f5206","impliedFormat":1},{"version":"894b5615c6d9e132d566da4a0a415a75a03084b1e444dce57247e3b14c994ccd","impliedFormat":1},{"version":"fcc6b0b6d33f1b9bdb20eb8538192401b9a34d2e55caf2b1a8d2997ce72caa91","impliedFormat":1},{"version":"edcfa9db110686e3e9f415411711fd8ed5676743ba5fb94f2bae7239ede0694f","impliedFormat":1},{"version":"c7b77287a6adc2b4c12d53e0c1a4f73702a67b44c283668879038fc986058b1f","impliedFormat":1},{"version":"4dcd36a7642675eea43951eb9291198cc363c9bf6e42175bb89686a2638ebd49","impliedFormat":1},{"version":"3a66705652602eef0b11c0f3aef6fbe002f645d2c726f951096a34ba80478456","impliedFormat":1},{"version":"17a2c710e588e7bbcdae1449a6c832acc352ed820c414df36984e6cbf9eb1cbc","impliedFormat":1},{"version":"6e397a5904fb2981bd0a370e0c1fed5b2475818f7abee6d4434104d22a578cb2","impliedFormat":1},{"version":"f7d6480c35f9560bee629cf2eaead55b5d6a98a056e3bc23a0e1791fbff42f40","impliedFormat":1},{"version":"95b07975798242f689dc613e6cf21b8b4ce6486c535b261c327d4815507c0474","impliedFormat":1},{"version":"99b70684074369ac188fc5a73e4ae4af9c42ba88eaf728ae9f665004633a0798","impliedFormat":1},{"version":"ec909740306c82db9420eb6abbd77a43d67f1db0c8e91b0d5dbeb9c5878580eb","impliedFormat":1},{"version":"f0a1f563852fd9513c303a47629ee2e1b3e9c4f6c9a939fea46713943ee9f7b9","impliedFormat":1},{"version":"1c04325db3586bd3c2905aacce3745eec7f8275ea86afa7c3c8a03dcd433e08a","impliedFormat":1},{"version":"bb3645cae5ca08211875d19554e295622c13d66e4669826d9459e7850ac315db","impliedFormat":1},{"version":"888b155cdee3f1ba181985686ab6cedf27422496c7b564a5a8f09ca65a71a3c3","impliedFormat":1},{"version":"fe5ce905378e200cdf1a6c691ac7b836045ed83cd45ec044e161972502ab957a","impliedFormat":1},{"version":"86d78e603812b7334a3c386642703d6eb99cb2aa94977d30d21e65b0cb12a31f","impliedFormat":1},{"version":"09cceef2964fcb0fef501da50b9e13624afe20ecace3fe33421d3235fb6f5597","impliedFormat":1},{"version":"fb89e43879bc2d06d0682a18317f813a501a61b729287a80a616443ae3b39781","impliedFormat":1},{"version":"14fc2d16e4493add082ded98f446fa1628b0f5ae96f8b420f5b1aa10716480d2","impliedFormat":1},{"version":"06fc966f66b957cade31fca0eb1d4f0601f0320eecd12f2536c6f107c5a50b19","impliedFormat":1},{"version":"7ffc147b09d18e329732b04770fb3804d9da67bdc230e6405eff77d6be3d187a","impliedFormat":1},{"version":"0a06936bedcb98e955f6e8c87ce803f2d1c02c96d396df0471e89424617edf83","impliedFormat":1},{"version":"7aadb2b3b024ddbab70899a0833518732d2c43498beb05d2c9ce53eb824bbd1f","impliedFormat":1},{"version":"4d5ce3ffa0c8d79063566a4415174ec1e30f3d7427b410c72b331b342ccbc6d8","impliedFormat":1},{"version":"6290956b1b32ae3d6a568aa7fc21e05c0055d87862232b36c8150d35d009b26a","impliedFormat":1},{"version":"c87afbb9d272be56f9d80ab0b9538ffda377b15aa4092379af5f560f9b812659","impliedFormat":1},{"version":"05dfabee63531105720801494ce71c7b59122c75b32f2709b5a88c9309e7f800","impliedFormat":1},{"version":"daf1c4382f51e469762e014a772df4033c0ece9e660b609501b68d5415bf4e5b","impliedFormat":1},{"version":"045f688162db1778fdf4442bd3e289cb622df6d2a1c6ff57bd6b5f3eed77c5f9","impliedFormat":1},{"version":"1f87d3045dae16ec144c85436d727d4cbfbe98abd919bd2c0714e309e66842b0","impliedFormat":1},{"version":"66bfdf3466c979dab119a632b555d08ab02aa5f468305fe130d13ae87c95c6dc","impliedFormat":1},{"version":"0dcdb02a9e3178009c05cc33d2f4247040b03d8cb7651229882d118047616b79","impliedFormat":1},{"version":"c1723c24943e284216241176fd65c33b58746c02f179cb4459473846d2632045","impliedFormat":1},{"version":"22346b862249f9c5e9156fc1916ce2822fcf7f0c0b1d27103f8a5ab086942135","impliedFormat":1},{"version":"4bc742a196b72744df59680041a0a062ccdcf633c7d75476ab862766a2f9ed1f","impliedFormat":1},{"version":"84ed7d44c2cc7331c7c7cbfac28f0fa521cc473f41d5e1df288731d221a2aa80","impliedFormat":1},{"version":"ef75753f9b0ba1749592d351f1851c71a44309d5284ca2b76d6af6bae1cd7902","impliedFormat":1},{"version":"7d1085cef64fbc00ae1d198afd6bcb0118137a8012881511a468f3c2a5c12997","impliedFormat":1},{"version":"41265c56d31f19b4541f0d8c2c257e2679257c3f2fc72fc2f23435a39118521f","impliedFormat":1},{"version":"d617354a8ad8d3faff75b7c6ef3fb6d3724b34ef5e987e8dc576a411eb3f18bd","impliedFormat":1},{"version":"0538c8885947f8b8ee923a576bd5cecdd80d40c5d589234402457ecdf6241806","impliedFormat":1},{"version":"9541c9157e4803332334baa9748dcb6a2576a0e3a3c6f289c8e84a6a9598da8b","impliedFormat":1},{"version":"77beedbd6281266902c7a1bc97528bcbe8c05dc61c4a3f13fbd3877d5557746e","impliedFormat":1},{"version":"fe01a39ee6ea56bbc9b4fa3f70360941e90523cd40261c21542e413fdcb1df5c","impliedFormat":1},{"version":"252525f6fd0ae3d9a37a53b74c49ce7ba0e38883bd7bb4d47206fa8ca3a7f4db","impliedFormat":1},{"version":"80b3587073b9cd897c7bd41c08495bad69b4e1ad994a3ee714c2ae669ed7a915","impliedFormat":1},{"version":"21e1140b1176e983bd0e5ded7b1acac2949821accdeb6a8ac52806487619d596","impliedFormat":1},{"version":"2ac84a5ad9fc73db73f0ee3e8b3f9b6b5173e73e8af60602d18d2453a43ccfb8","impliedFormat":1},{"version":"242e1da97a1d8c089521517914d17c4eb6f11592a94b1166192655fdaa4c1fa8","impliedFormat":1},{"version":"2b4ea9561c54331a8e32e05a16cd64c22bcc6236dfd02f78d5bbfdff37cb4850","impliedFormat":1},{"version":"1215f121a82ca762ef0a774009b83e164cf592ba6996113c3d7ac76adf678f22","impliedFormat":1},{"version":"b1826275632a55d5798c30996d90a563865868fa4aa43f3dd1e6922e968a78df","impliedFormat":1},{"version":"7d7a773491d977285dd1612ba882bd2d08d138a372c839cbbc7593892887acd6","impliedFormat":1},{"version":"4ea7b44397103a8c96fb72040b9a88c4dea420e45d636ee04c965138090ff6b5","impliedFormat":1},{"version":"c71af1965468a4c84f0bf53744d77b23c2ffe703611f35f49b6be3371f88de38","impliedFormat":1},{"version":"eed3a7536e4e20e922b3087baece6f185bf65a2e8a36d9b00528287825fc3086","impliedFormat":1},{"version":"fc5966e74a0e57325992b42ec50164597525c48264ec9d271add049ebc59ee8c","impliedFormat":1},{"version":"a0dd3d6a432817622b5e66bba93f7deb45724dde8f641475570ef8f6a978c1df","impliedFormat":1},{"version":"c1759dffdd4761c462735716ef92b1c2cf22ab66c33abb79841bb56858bc78a3","impliedFormat":1},{"version":"374a73ef5c9739d309a619eaa3b8b96e476911b0baadf9ccd47713baf8edb03d","impliedFormat":1},{"version":"09fab0aec84bc39e29c9207466f6e84d28823a3e19c89fea010d99a0be54f39b","impliedFormat":1},{"version":"0021d073030e131bfdfec1291a19a7aa099f83c4ffc2e82514346c12338d9a69","impliedFormat":1},{"version":"70b37c50ed945d0096d19cae852be07058d25075be5316c32900a883a84ff574","impliedFormat":1},{"version":"582a10aaa3f6cdfbbbcd71053ae32e0d6047867038c55f8083a5e0a2bf03eb16","impliedFormat":1},{"version":"14319bb3e71325abf50f0cc8e9a8768727f962d3cad2711e90a9b45de80cd9b0","impliedFormat":1},{"version":"370c054cff5fef614b15aa2b31b844ad6ce84e945ffe0505c31f1fd6cfc5d875","impliedFormat":1},{"version":"0a56c48474cac164fce5036d53a74e58bbc3d1ed2e2044c3536ff6494d85d281","impliedFormat":1},{"version":"6637d940fdeeeacdcffb9fc89940fee083514060b24bb4f0b53174695bc3c4c7","impliedFormat":1},{"version":"79fb9d9f0e93cae2b196ce802437dd4626f0f43a829b59077523633257625d06","impliedFormat":1},{"version":"e516b83b36ba93dd223847f75ecab1501d4dcb79903ec151f3b0e2bd85ff1709","impliedFormat":1},{"version":"b9561d9f2a9ef796740347697568feb9934e990ea0f204ca4799097499085224","impliedFormat":1},{"version":"17e7a71d478d73f28f3d42f6a987a6a75d7d66f11414b315f86afe90269084ee","impliedFormat":1},{"version":"b0b5a80e6dd8318194e380632e7fdd375f31c415553096184144193ff49d9deb","impliedFormat":1},{"version":"bd72fab446ef9dbd4f67f431dbcfac008f737dcc9feb26f5028cef30ea07d7b3","impliedFormat":1},{"version":"b84c3d723b2f53131f5f29392e6f682950a5b6067d2eeafe509c3bc4d535491d","impliedFormat":1},{"version":"bb8800e3bd24b17b922f94afc0a0d53b86ffd3807071858cecc67d2ec218e730","impliedFormat":1},{"version":"c424633696169cc0f598bbd0f3efaba39279da0d5bca4077f3d2d06dc7b6d2c6","impliedFormat":1},{"version":"11438e4c05bbb61a67c5a6d3172561e73f3617775073ef166191d42e7d6cc29f","impliedFormat":1},{"version":"17cd1abd445f2c5a5d9af59edc2b32acff37fc2dbd073bf6be6c87b372878b10","impliedFormat":1},{"version":"6cc49e6397f744360e56a4eb80e29278db7fa407af70ce38b14d1b881de11084","impliedFormat":1},{"version":"31d31e7ff583830b48bdd4c5b831c527648b0c4e11d0dff958244726a6ba8d1d","impliedFormat":1},{"version":"bf23d3737619cc93d02d3f2573836e241f144c2deab6555100d51d07065bfea8","impliedFormat":1},{"version":"645ba914df5f7cf4dfe7224fe6fd9e3b03f1a56a4d0892609647b27a4b5c9b2f","impliedFormat":1},{"version":"ad4dac3f8f80776c77dcad99d916fcb6d97f7d5c8b5464d57c5b8fc2838c65aa","impliedFormat":1},{"version":"3be59119328e530eb1cce237f11f894d18df32c56b4acb4da99179e2e9d716da","impliedFormat":1},{"version":"ce25efda83800584fb88f6912e34bc6f19b1b1d5617c8f4d833525cca66e1b7d","impliedFormat":1},{"version":"7a871d46fb9f8e048843805af8641b3e690e3d082d2610458bc5b7f9d05a939e","impliedFormat":1},{"version":"58123d640dfb256a923f9608f9feb812fb15f07e97fa48cbff32db7a3dbb4dcd","impliedFormat":1},{"version":"d0f819702f253906cfabc70537458a0fbc7fcd19d00df1e65f489fb6255b921a","impliedFormat":1},{"version":"154880bf83ae0e6804e8a03fcfb90d43318f136c90489f5cc91ceda18a826c55","impliedFormat":1},{"version":"3afd5d12997658b4fe25eea8a156f28365815cec969f843ac959baeb9e32546b","impliedFormat":1},{"version":"189d978e3bbba92cd41aca6dd5da431f96abba3a661345bb3d0373aa95154f10","impliedFormat":1},{"version":"86c941e36edbbf7f6e9627f204e0243feca7c685b5e87128f51922a18b796b58","impliedFormat":1},{"version":"913afe932d38a7e2739cb82e86ee5fc962c26cbb5d0b12204edcaaa7977f67c7","impliedFormat":1},{"version":"6b6d39ff8b55001b579319af1ab88f7d4b8b7306c1a029730b080dba0f52c91a","impliedFormat":1},{"version":"3df44916781e1265a2f989ce1d27796a8de5502e8b88d974a0486ecdd18f1d52","impliedFormat":1},{"version":"0768c1dc93630ba95a46a13ee8794b3236a73ea4be0f686021ceff54d4169beb","impliedFormat":1},{"version":"f1360f6fc6ab02fa9bdbc8d291b81734114c4124b70e59c2049f1f751023854a","impliedFormat":1},{"version":"772491929987e2f534681895858585e875db3be1c4f478433e6041e7f4256ef8","impliedFormat":1},{"version":"54df5622611f4ef71e4a268878d93d91a2ee6715f6cb0831aafe33e215252765","impliedFormat":1},{"version":"eaa3881551f850db68d9641f16d3adc0643ce64692c0aa5eaefd24c6cf4ef975","impliedFormat":1},{"version":"9e92decaf25e66a93dcd079fde4469f494efb0319e7abef3876d0fb5de324027","impliedFormat":1},{"version":"ae61b732544436a400d158bd484fa37f3c22ca853b75c7609bc38898d8546325","impliedFormat":1},{"version":"94f5d81ed31e208d78efcb962f458a8d78be3a060c3ab8ff00d8dbb376d0e5e6","impliedFormat":1},{"version":"7774693385774989733dc820690a09c5caac6eb567e86e7e27919a28495d869e","impliedFormat":1},{"version":"cb3229ec76c1d5c8a74cf84e77fe11409e9a28299acd92e17868488f80780798","impliedFormat":1},{"version":"195102ba30ea3647c375a33a2a14d94f1d712ab497a8a069ce5a1013b62f200b","impliedFormat":1},{"version":"4af32d5f5cbc92a0f396f02772627a6f55ba3471799dbc90c581ffd618f065a6","impliedFormat":1},{"version":"960e4ea621ddc9838693f659f8780f006b68a7f894f1c07a24b1187b402ded53","impliedFormat":1},{"version":"fcc4f09ce7a1ae59033f74df30c704562437e7dcf85e28added2c1ace6a5d6c0","impliedFormat":1},{"version":"c12e018a40ccdf84e8134f8dfed61e8ab9e1864b7656f7f26b815c8697f3e6ca","impliedFormat":1},{"version":"9d24be7fcf6039c87e2164de44e205c4f2fed3fe157a337a953bd9458dea5881","impliedFormat":1},{"version":"53f32d9db8a969863d390d1b361751daf6b66eae0cce0e22957e04f976399c00","impliedFormat":1},{"version":"bf3b50982b7d09789434eea82dc30972ca5f4f19c37a6d137fc2fa01d686170f","impliedFormat":1},{"version":"1215f3fb5f57314fb864c2e07870d7ac8244dd7ca269914e8c787b873ea467bd","impliedFormat":1},{"version":"fd3f1520d017c5c06096dd6aad1adfeb99d5ff9f35d05b08bfe22f9970e1bb46","impliedFormat":1},{"version":"bcff0dab260bf1d9119f4c0d4c20e84870f3bd922ea11b792f85e4d6f94e9ec4","impliedFormat":1},{"version":"dc00d795a95db780373af8ddc6601948951bac54e46a10e61cea0baadea2c976","impliedFormat":1},{"version":"394cd595b5e8ebb3934d3ce19cac913631a719f9b42d10f7b38bb29e83f627c4","impliedFormat":1},{"version":"6fbe02cdec68b0edd788e57a0297e824d1fc56d55af89083e509df0fcfde10ef","impliedFormat":1},{"version":"cdfaabcc2f9489767a9f575129efd68e0c85e5ca7b6769ba2bfd81dcfbad151e","impliedFormat":1},{"version":"00eee3ed881b83a8c1ae7b4fcb624a74dd71de9f494758a1c957037b07eaced6","impliedFormat":1},{"version":"c7270a2952a8313a31adfcdec3c980d53ee1c59340166894de6dde8275464dc3","impliedFormat":1},{"version":"61208ef33c5096ce07588636d7568705b0778676433ea361d1ff01bfdc0afec4","impliedFormat":1},{"version":"fda8137f3225f7fa12d27b764016824ab093cdac5e37959238bcfc59ba33f46a","impliedFormat":1},{"version":"1b07d8954c7e48f9b238b47470b4f0943913d79a2667d5d72c8e2a9f5bc3f329","impliedFormat":1},{"version":"4e9ae7c50fb44846c6161f2a77a90a447cebddcd634b541a602cfd34eaa30aed","impliedFormat":1},{"version":"68ea5da50372e0311228fab6731c054093088692a11151c7e85d17dd23f1ffc9","impliedFormat":1},{"version":"1b96a676e58c88860b7f8302f2932271a201e067cdae989d0219407e8886dec5","impliedFormat":1},{"version":"cd321ac7b3a76e8c514bce40ad492ca6a3b9a2f94723d79d044de8186724c2d8","impliedFormat":1},{"version":"47d3b1138d1b6dfe1dff8b6c30a12055ef5680a3d2a520cb451c15995096938f","impliedFormat":1},{"version":"17afa353b70a9db8b8f14b0272bc1cafaa2263bdfcdf0ce42894637b7f4d90de","impliedFormat":1},{"version":"0172ed6cc48e81fb983991d504daa70a2909195fde89a79bf1ae036a6c6034dd","impliedFormat":1},{"version":"b7acae0de44722d03c82269a1fe5f76ab4d37bcd3110169d91d3fe4dfcf87fad","impliedFormat":1},{"version":"ce118560164aa66b6832fb55262cafdb4ff2508044fc6419660a21f7fa167653","impliedFormat":1},{"version":"3035baeab756a33c8d99983bc29a75366323fff75d5fb953666a8922698fce34","impliedFormat":1},{"version":"fd5a8a811b714a8bd161b5c5ea99cfec53d6d28581d4b4958f59739b0402e988","impliedFormat":1},{"version":"69a09da369c4fb8903957eb41690c6fabf47893386c86d1c709a98792f04fd10","impliedFormat":1},{"version":"564a1270d27cd8ec33a68c4df7eb9f510f415da6f9c96db95478aa68b8041b10","impliedFormat":1},{"version":"fa3c526d7b5177ec8f63b299a7024c829fa356dad4d10edfa5be9a0c82c43697","impliedFormat":1},{"version":"1beb6509e599a9f3bd93cabe9125fc664553d71fa8002fe183f38cda62a84526","impliedFormat":1},{"version":"796d35ad18e3f2467aaf54b9b3fd6a94c77f8f9df1b41aaefe1c3dab8ce97438","impliedFormat":1},{"version":"40191405914c9e13ed32ed31eca4a74ef06be535b44594eb76b9ba04680d5031","impliedFormat":1},{"version":"e27bbd0b7b7e54b3703765eebb805658672c52752342d8dfaa56820c88fc8333","impliedFormat":1},{"version":"da2472f38d0822ed781c936487b660252404b621b37dd5da33759f13ba86c54e","impliedFormat":1},{"version":"3a02910d744549b39a5d3f47ae69f3d34678496d36e07bd3bf27ee3c8736241c","impliedFormat":1},{"version":"e4e0883cbb3029c517406d2956c0745e44403afd820e89a473485129ad66359b","impliedFormat":1},{"version":"5f4138fcf24316124b815f3ab41a903ef327104836cdcb21dc91f0ca4fe28eb4","impliedFormat":1},{"version":"4fd59922851bbd5b81a3a00d60538d7d6eebf8cb3484ab126c02fd80baf30df3","impliedFormat":1},{"version":"76e70ccd3b742aa3c1ef281b537203232c5b4f920c4dcb06417c8e165f7ea028","impliedFormat":1},{"version":"f53e235ded29e288104880b8efa5a7f57c93ca95dc2315abfbd97e0b96763af7","impliedFormat":1},{"version":"b0e1cfe960f00ad8bdab0c509cf212795f747b17b96b35494760e8d1fae2e885","impliedFormat":1},{"version":"a6c5c2ac61526348cfe38229080a552b7016d614df208b7c3ad2bbd8219c4a95","impliedFormat":1},{"version":"9971dead65b4e7c286ed2ca96d76e47681700005a8485e3b0c72b41f03c7c4b0","impliedFormat":1},{"version":"d870bf94d9274815d95f0d5658825747d3afc24bd010e607392b3f034e695199","impliedFormat":1},{"version":"bbdac91149ba4f40bf869adc0e15fa41815ef212b452948fc8e773ff6ee38808","impliedFormat":1},{"version":"0c2f32cb837a6de3b2bec65646a2e04f0a56cd408749cbddc016ddba732ef1a0","impliedFormat":1},{"version":"ef86116cceeaf8833204f4c55e309c385622614bb052cb1534b2c26e38d466c7","impliedFormat":1},{"version":"16a684817cfa7433281c6cd908240b60c4b8fe95ca108079e2052bafbd86dca9","impliedFormat":1},{"version":"480ffa66827143d60025514f0d979f7bc790024821e5ecc12967ce13a7e3e08a","impliedFormat":1},{"version":"303f2d7549e1ae66106064405824e6ae141e9ff2c05ead507afff445610dbf76","impliedFormat":1},{"version":"1a18fcd7ea90842d336fb814801c837368c8ad16807f167b875b89267f1c2530","impliedFormat":1},{"version":"ed0c5e5f3b30334bbd99a73ee4faa47a799b4e5928114131f7b2d123f3d22ca0","impliedFormat":1},{"version":"6c2ad16b31ef481da774dd641a36f124dbcedeb3653891b9869639fa6f2f4a30","impliedFormat":1},{"version":"ee5e067150f421651188289a1e84f9bdf513da63cc82e8d6998b3d41a3cc39bf","impliedFormat":1},"81c57a91c365ea6eda285a8b5c841a9db5136c90cb37e9d25fb6db0a5dc2eb5d",{"version":"4399dbd9b477010c3ab11f056865f63570f96bf3d4f056ec21d9aa67929dc28c","signature":"2c5055279898f6f41cc6c3795420b0ad2d9b4841597035aefe2d1b37e7b5cf48"},"c9388ade69fd04650f6f713b3a0e5e3b3ed01759b438c5d5bc3f969f81027b99","bb79a6c606d89e4d3d6ec7851c6cbca338b3ebe0eb57d020c8d3849edf686a0d","dd1cc53ea6a4cd70532c5793c76a8752336ddda0b2f234f2c7e0fd0fcaf8a664","c909798590ce83a937c136bf6972c48e5287d1db2a999dfb0cb081690183911d","f9c6fa17b166a6c680f522177efdfc9e96c2c6e000f4b89fec0224371838951d","79b43c54b8963ca15ddfa4695d58f4b1b3611aeccdf064a04689417c16c2e065","0c7936524bb81239ded3e12cd49ef7b11a4c3cebf57ea90b4822662cccc7b02c","4a94e3c06012588b13126a537edd7b6b72f55282ef74fa4aa12f83d04358c9d5",{"version":"a7df4ded26a081de4180a368910c3ee3cc5c0ad293126e22bbdc957023de5b80","impliedFormat":1},"54d7010edc9f3675097b8af8bcbb193df8247c6f519efefdd79a76ca6f385254","986a9d0da4930b05f56b241d9a18372ae7bea245f90aa1419ff0d3ff439b0275",{"version":"744fe9bd85cb1c9333ad3252ca2e5563061b3976cc3b1642e55aee948feef694","impliedFormat":1},"4c8116ff57bcdb01bdc0b919d93c77135268e7868603ca408b03c69a3b957d42",{"version":"1d8b86df6acd2a2992af4f5c46ace22956d5c8d2b9eac1edd6077fce04928807","impliedFormat":1},{"version":"3f857fd6b6155ca34aac011c2e20e275ac6b48d515acb7c99b793a9fe49b675d","impliedFormat":1},{"version":"ff18b21996ec139cef029ef46f166c7bd75db6ca21a2532be5e98060fd196df0","impliedFormat":1},{"version":"0eb4ad89a29d3dd237d5c3314693690555e912f427b724f6422673fe1094ed20","impliedFormat":1},{"version":"7a431818a42aea1edc1b17fb256774c0b8df23f45dcf9d6eb47134297d508d17","impliedFormat":1},{"version":"e0a1c9bb1cb804c38e85d4b9614b9d36cf165b5511a7fc2f50782217fb8937db","impliedFormat":1},{"version":"7cf8571660d7cbe6488592e0140889c1dbb99f3661f88d272d5e3ab4328d4516","impliedFormat":1},{"version":"dba882a3e3f61b7bee346670bb62138f188907b4239d0fb1229ff539d3df22a6","impliedFormat":1},{"version":"3b75495c77f85fef76a898491b2eff2e4eb80a37d798a8ad8b39a578c2303859","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"247a952efd811d780e5630f8cfd76f495196f5fa74f6f0fee39ac8ba4a3c9800","impliedFormat":1},{"version":"b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda","impliedFormat":1},{"version":"176b33f5803f105346d32b420818b117ca432d477a825ce74a56536f20033010","affectsGlobalScope":true,"impliedFormat":1},{"version":"a7ca2a9e61286d74bc37fe64e5dcd7da04607f7f5432f7c651b47b573fc76cef","impliedFormat":1},{"version":"b2d0630483bf337ef9dac326c3334a245aa4946e9f60f12baf7da5be44beafbb","impliedFormat":1},{"version":"09fef63ed6e70e8bbbaf4d161d3cc69acba6c54e65cfa6fbace87be308b47492","impliedFormat":1},{"version":"b803e9235eeb9a25ff002cf0d5054d6753fae8604f192e91c67e2ae5ccf687b0","impliedFormat":1},{"version":"4023023cf3352b9547d108d334d293dae5c721ad2a994d47f2c8da58c048d18a","impliedFormat":1},{"version":"e9513fc98980f4a18287dcb5cd7baebacdf3165e7110ef6472f6c42f05c22a00","impliedFormat":1},{"version":"c53024fb4333f518e8273211f6bde7a7886f76679a3209bfbb74c655c5b5ebb2","impliedFormat":1},{"version":"9c6586c7de027299b0d6ce80f33f2879d3c104052be1ea83a176a1fd7a07aee0","impliedFormat":1},{"version":"7e72c7e8c38f4b575f0590e515397ae3307f7a30b6e5e71f4ed6d06318ea95fd","impliedFormat":1},"9726b4e87a167e6adb06da0d834bb7f493a3249aa01217e2ab729aaad1f997f9","c1e82131b7b5290e7800a5178471cf1c285a0e434d6bc7af028cf7d34434f457","65c6c3fea4e50c2ea46aef042094101635e9b0f99fb7d3082b267c3648e70775","19b6e3e4925131cef8cd864d64c260e96f199872202e141f38e5da88c1069ba6","23c102e08f0520fbd55bb0065522cbfbec43ab12d1d86937aee35b99f3b89ffd","4fe0f05c01a1b9c5a9036f3432c61ed82d97314d7041ba14e771b5027d685382",{"version":"417e6f7a6942cbe58f1fbe2698a6536eb3e494432aa7b79fb9ccb38910531769","impliedFormat":1},{"version":"cfc3b16b6232d95a45c7b2653bac2226af88aaa6ca61a2dfb74e9e849b8b4913","impliedFormat":1},{"version":"b31535ced1ad5abee25063448352c2fd7cdfb48dce94746553cc6321f2e824a5","impliedFormat":1},{"version":"c38c06a8d911667a20170e548c1b7eeea9f51d71222b6dbc3cabb41156731f63","impliedFormat":1},{"version":"fdd339734a8fecc64523859f7b343d9aa112b9dd95912c96c84cee760b82fcbd","impliedFormat":1},{"version":"4e39971f83a72cf1fb8047e1c23f4a26200a347a76f84b316edf2fd618e1fcac","impliedFormat":1},"9b8c531c7fa310d8f27a770ab0486f18499cd8ee1f9a667974b6e75011d66478","8216c9b6e8a495b01666f926ba565bb1cca939f6f99456da2cb9fc417bb16c06","0dab1b33cfecc3014d09664dcd6dfb84a61032bf9f87353425fb73f7afff3074","b99472d8109d929d3c2ca58ea66aae9675461cbc81234c4512caed1bda07c065",{"version":"1249d6151db4cbc74d692d7492c34be51af25f26b0fc7d2cdb959aa0e3a66a77","impliedFormat":1},{"version":"c8eae51f3b442bf9a80050e423cfafee463e20df9f130e8caac4c605d2e0c9bf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bcbe023fd45923eea2e81e32e43a1367eb0a79c2bb7497448492c6cba928a29f","impliedFormat":1},"b8fec977b354d455c6a0897f6d6750a762443d45310f992c4ee0bb424be69768",{"version":"09ffb977270a6158ba8f7bea05871aa573db916d4216796a843b695b197d7647","signature":"cd48a4cd9d86d447ec760a56ae58b39e7ba66dfc9b6e0db59f05cbe60267d5b6"},"058f264c96519babf573c1b282d3d6450be75f5b79222f323f3b7e95535780c9","cd5a2a0084aebe7c3fbb9ef2f3843dd23098d3ad4dadb8bf39aa160a441a69f6","ad68eb4dc2a163dc9af2f4282d605fa29ef361f80972e807e217529e1a86601e","b90b11f658980e7c2addc814b31fd000b844147a93386123558aade53e26da4e","3eb61abf6e01e764b6513916e4430479990e1212dce348bd2d1020d0ca75973d","063594a8e7db4a00a3473ddd45205481ce52c0fb0c86c9f9c87ea484d41e83a1","8f6f9c02e4e68f40f1c2f01b210a37534e1dbe853bd6a87e75dc3a82ac0ad070",{"version":"5c37feacad2a4ce3c622f3d48a9762a352fc14a68d9226b06badc9dc4ad3e861","impliedFormat":1},"f75398031a3687300c0d40ee19d2994de47b6c5d081f6d4da08d5d6c6c2c53cb","b633ac5c264504a8640a5598b9e9c33f1ef10d3b30d6b9792b1ffab1b1804c9a","777a5f7e86e5a2148882fab94ac6d0346e1694f00471e131dd49a545f07e7afa",{"version":"14643cf9aa18c794771207c07866879c872d09c0b8e8aeab4431c1db67d66e71","signature":"d82cc6867af5f5bef20813577ec35ca384cac63121fddc5461a1da7b5520ad6a"},"a6addf023945f32113cebd4836b57fa4f37a11e3b034c4c8704b1aab79612454","aa37eded99dca654eb1d138de1caf58f839bf19686ec48c7696b5b02d839aa84","ead50991d8ed6c436795fcc160ce4ae096b68a9ca7ca828d1009ab03dafd41d9","49ca7b67f135f1f005726f4db58127e0ebe277afc08e2471c46ac36d660e2cde","d3d3f3e7da2e1504b245029a520c157f620a291cff2d8386f9e792cc9b16f79a","0df5e5da6952b7ad3f90a8ea074713c77aeb0f48c5eaf6aabc8283de9b12237f","23f4b8bc5e3fde63bd6084041eeef5095bd232546b923bf5129e2b4d96932e17",{"version":"2700b9c09679600b11a2193ee6e20256dfb1af1ecac3a0d8abd15f21b0b76e89","impliedFormat":1},"534707b5f5ad4cbc9e1cdd2ce0f1dacf8bb2b6ed9497a84e77c353b9b18f0f4e","c429aaacffa3292e5cc5927d94a92e3a1cd3836c4f441056b37b2c137520309f","0d9bb02af4ff677baddd1106dd59b4d09e58cf6b9e076867ab3ff8e74016ad5e","5d47b7f32d45350f4198b04e9f078e524d85ca3b005dd9b59c3611e4bc0f2c0e","005afc6ae9ede6bfe4f97380aebd2bfee4abbbca9841e695f0613e1e0017ad44",{"version":"7bc71d52df9d8e5cc55218d347a91b1758b38341f9cbbac0b80057aa9d93daa6","impliedFormat":1},{"version":"a30ac45f076f441cfd2b8551a54bbcd0d050fc970b8dad15b7d5608da7f804b5","impliedFormat":1},{"version":"ae77d81a5541a8abb938a0efedf9ac4bea36fb3a24cc28cfa11c598863aba571","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"2174e20517788d2a1379fc0aaacd87899a70f9e0197b4295edabfe75c4db03d8","impliedFormat":1},{"version":"f6e4d465828539e051c5c1a40ee835fd954ce5cfc45de8e31ac1561bad5d947b","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"17f0ae35f62a9586cade6c10e5a0d61362257b8e03e661c49ca417e4f3da857d","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"bb4ed283cfb3db7ec1d4bb79c37f5e96d39b340f1f4de995c4b0b836c8d5fa05","impliedFormat":1},{"version":"0e60e0cbf2283adfd5a15430ae548cd2f662d581b5da6ecd98220203e7067c70","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"e91ad231af87f864b3f07cd0e39b1cf6c133988156f087c1c3ccb0a5491c9115","impliedFormat":1},{"version":"03c258e060b7da220973f84b89615e4e9850e9b5d30b3a8e4840b3e3268ae8eb","impliedFormat":1},{"version":"319c37263037e8d9481a3dc7eadf6afa6a5f5c002189ebe28776ac1a62a38e15","impliedFormat":1},{"version":"4ef960df4f672e93b479f88211ed8b5cfa8a598b97aafa3396cacdc3341e3504","impliedFormat":1},{"version":"cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","impliedFormat":1},{"version":"9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","impliedFormat":1},{"version":"550650516d34048712520ffb1fce4a02f2d837761ee45c7d9868a7a35e7b0343","impliedFormat":1},{"version":"0b0d8e14e22ceaffdd4454c4fe9edc744166060c187c0e55d43cf1a8f7c23215","affectsGlobalScope":true,"impliedFormat":1},{"version":"480ffa66827143d60025514f0d979f7bc790024821e5ecc12967ce13a7e3e08a","impliedFormat":1},{"version":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1},{"version":"74d5a87c3616cd5d8691059d531504403aa857e09cbaecb1c64dfb9ace0db185","impliedFormat":1}],"root":[274,316,317,319,523,538,[541,553],[753,762],764,765,767,[790,795],[802,805],[809,817],[819,829],[831,835]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"esModuleInterop":true,"jsx":1,"module":99,"noUnusedParameters":true,"skipLibCheck":true,"strict":true,"target":2},"referencedMap":[[817,1],[819,2],[764,3],[765,4],[767,5],[792,6],[793,7],[794,7],[795,8],[802,9],[803,10],[805,11],[811,12],[812,13],[790,14],[791,15],[753,16],[804,17],[814,18],[813,19],[809,20],[815,21],[810,22],[816,23],[316,24],[317,25],[546,26],[547,27],[548,28],[820,29],[754,30],[545,31],[542,31],[549,31],[319,32],[523,33],[538,34],[543,35],[552,36],[553,36],[550,37],[755,38],[544,25],[551,25],[541,25],[274,39],[532,40],[536,41],[528,42],[527,43],[525,44],[524,45],[526,46],[534,47],[531,48],[530,25],[529,25],[769,49],[768,49],[806,49],[818,49],[770,49],[830,49],[808,25],[563,49],[559,50],[562,50],[561,51],[564,52],[566,50],[565,50],[567,53],[569,49],[568,54],[570,55],[573,56],[574,50],[571,50],[575,57],[579,58],[578,54],[580,59],[581,54],[582,60],[576,54],[577,61],[583,50],[584,62],[587,50],[586,50],[585,54],[588,63],[590,50],[589,54],[591,64],[592,50],[593,65],[595,50],[594,50],[596,66],[724,49],[725,67],[597,50],[598,68],[599,50],[600,69],[601,54],[602,70],[603,54],[604,71],[606,72],[605,25],[613,73],[619,50],[617,50],[618,50],[616,49],[615,49],[614,50],[620,74],[622,75],[623,76],[625,77],[627,78],[624,25],[626,79],[628,80],[630,81],[629,50],[631,82],[728,83],[637,84],[632,58],[633,85],[636,86],[639,87],[638,50],[640,88],[572,50],[642,89],[641,54],[612,90],[611,91],[609,50],[608,50],[607,50],[610,50],[644,92],[643,54],[649,93],[647,50],[648,50],[646,50],[645,50],[653,94],[652,49],[651,49],[650,50],[657,95],[656,50],[655,96],[659,97],[658,54],[663,98],[662,50],[661,50],[660,54],[665,99],[664,54],[668,100],[667,50],[666,54],[670,101],[669,54],[672,102],[671,54],[674,103],[673,50],[676,104],[675,50],[680,105],[678,106],[677,49],[679,107],[683,108],[682,50],[681,50],[685,109],[684,54],[687,110],[686,54],[635,111],[634,54],[690,112],[621,25],[689,113],[692,114],[691,54],[693,115],[654,54],[697,116],[695,49],[696,49],[694,49],[698,75],[699,117],[706,118],[705,49],[721,119],[720,49],[708,120],[707,25],[723,121],[722,49],[715,122],[714,49],[712,25],[713,123],[711,49],[710,124],[709,25],[717,125],[716,126],[558,127],[555,49],[557,128],[556,129],[719,130],[718,49],[727,131],[726,75],[701,132],[700,58],[704,133],[703,49],[702,50],[560,25],[688,25],[507,134],[505,135],[503,135],[501,135],[506,136],[504,137],[502,138],[407,139],[326,140],[411,25],[328,141],[404,142],[405,143],[331,25],[335,144],[333,145],[381,146],[380,147],[382,148],[383,149],[332,25],[336,25],[329,25],[330,25],[393,25],[401,25],[420,150],[414,151],[409,152],[367,153],[388,153],[366,153],[344,153],[370,154],[354,155],[351,25],[352,156],[345,153],[348,157],[347,158],[379,159],[350,153],[355,160],[356,153],[360,161],[361,153],[362,162],[363,153],[364,161],[365,153],[373,163],[374,153],[376,164],[377,153],[378,160],[371,154],[359,165],[358,166],[357,153],[372,167],[369,168],[368,154],[353,153],[375,155],[346,153],[387,153],[390,169],[389,170],[421,171],[419,172],[413,173],[415,174],[412,175],[395,176],[416,177],[408,178],[400,179],[327,180],[402,181],[397,182],[396,183],[410,184],[417,185],[418,177],[403,186],[384,187],[398,188],[399,189],[394,190],[406,191],[349,25],[385,192],[392,193],[391,194],[386,195],[334,25],[423,196],[422,135],[343,197],[340,135],[337,25],[240,25],[782,49],[554,25],[472,25],[144,198],[145,198],[146,199],[100,200],[147,201],[148,202],[149,203],[95,25],[98,204],[96,25],[97,25],[150,205],[151,206],[152,207],[153,208],[154,209],[155,210],[156,210],[157,211],[158,212],[159,213],[160,214],[101,25],[99,25],[161,215],[162,216],[163,217],[195,218],[164,219],[165,220],[166,221],[167,222],[168,223],[169,224],[170,225],[171,226],[172,227],[173,228],[174,228],[175,229],[176,25],[177,230],[179,231],[178,232],[180,233],[181,234],[182,235],[183,236],[184,237],[185,238],[186,239],[187,240],[188,241],[189,242],[190,243],[191,244],[192,245],[102,25],[103,25],[104,25],[143,246],[193,247],[194,248],[86,25],[763,49],[84,25],[88,249],[87,25],[295,25],[901,250],[747,25],[807,25],[486,251],[275,25],[105,25],[85,25],[277,25],[305,252],[280,25],[276,253],[278,254],[281,255],[279,25],[309,256],[313,25],[312,25],[306,25],[310,25],[311,257],[314,258],[300,25],[299,25],[304,259],[302,25],[301,25],[283,260],[284,261],[282,262],[285,263],[286,264],[287,265],[288,266],[289,267],[290,268],[291,269],[292,270],[293,271],[294,272],[298,25],[307,25],[297,273],[296,274],[540,25],[315,275],[485,25],[308,25],[321,276],[323,276],[320,25],[325,277],[322,278],[515,25],[511,25],[521,279],[516,280],[513,25],[522,281],[520,282],[519,283],[518,284],[517,283],[510,25],[514,285],[512,25],[508,286],[509,287],[324,288],[533,289],[537,290],[535,291],[786,292],[788,293],[772,294],[783,292],[774,49],[773,295],[787,294],[785,296],[789,297],[771,298],[784,49],[775,294],[424,299],[426,300],[427,301],[425,302],[449,25],[450,303],[432,304],[444,305],[443,306],[441,307],[451,308],[429,25],[454,309],[436,25],[447,310],[446,311],[448,312],[452,25],[442,313],[435,314],[440,315],[453,316],[438,317],[433,25],[434,318],[455,319],[445,320],[439,316],[430,25],[456,321],[428,306],[431,25],[476,135],[477,322],[478,322],[473,322],[465,323],[494,324],[469,325],[470,326],[496,327],[495,328],[463,328],[474,329],[499,330],[471,331],[489,332],[488,333],[497,334],[462,335],[498,336],[480,337],[500,338],[481,339],[491,340],[492,341],[493,342],[468,343],[490,344],[466,345],[479,25],[475,25],[457,25],[487,346],[467,347],[464,348],[482,25],[484,25],[437,306],[318,25],[342,349],[341,25],[539,25],[94,350],[250,351],[252,352],[210,353],[220,354],[211,355],[212,356],[221,357],[201,357],[261,49],[263,358],[245,359],[244,360],[243,361],[266,49],[242,362],[269,25],[197,25],[199,363],[249,362],[253,364],[257,365],[204,366],[203,367],[224,368],[232,369],[207,370],[202,371],[198,372],[236,373],[235,372],[225,25],[196,25],[233,374],[226,375],[234,376],[237,377],[213,378],[227,379],[208,380],[231,381],[230,382],[209,383],[223,384],[222,385],[214,372],[215,386],[217,387],[216,388],[218,389],[268,25],[219,390],[93,25],[247,25],[255,49],[259,49],[239,391],[200,25],[241,25],[246,392],[229,393],[228,394],[206,395],[205,25],[251,25],[248,396],[83,25],[92,397],[89,49],[90,25],[91,25],[254,398],[256,399],[258,400],[260,401],[273,402],[262,402],[272,403],[264,404],[265,405],[267,406],[270,407],[271,408],[238,409],[460,410],[461,411],[459,410],[458,408],[339,135],[338,25],[483,135],[766,49],[751,412],[739,25],[737,413],[740,413],[741,414],[743,415],[738,416],[745,417],[752,418],[732,419],[742,419],[746,420],[748,421],[733,49],[750,422],[730,423],[731,424],[729,414],[736,425],[734,25],[735,25],[744,413],[749,414],[796,25],[801,426],[797,427],[799,428],[798,429],[800,429],[81,25],[82,25],[13,25],[14,25],[16,25],[15,25],[2,25],[17,25],[18,25],[19,25],[20,25],[21,25],[22,25],[23,25],[24,25],[3,25],[25,25],[26,25],[4,25],[27,25],[31,25],[28,25],[29,25],[30,25],[32,25],[33,25],[34,25],[5,25],[35,25],[36,25],[37,25],[38,25],[6,25],[42,25],[39,25],[40,25],[41,25],[43,25],[7,25],[44,25],[49,25],[50,25],[45,25],[46,25],[47,25],[48,25],[8,25],[54,25],[51,25],[52,25],[53,25],[55,25],[9,25],[56,25],[57,25],[58,25],[60,25],[59,25],[61,25],[62,25],[10,25],[63,25],[64,25],[65,25],[11,25],[66,25],[67,25],[68,25],[69,25],[70,25],[1,25],[71,25],[72,25],[12,25],[76,25],[74,25],[79,25],[78,25],[73,25],[77,25],[75,25],[80,25],[121,430],[131,431],[120,430],[141,432],[112,433],[111,434],[140,408],[134,435],[139,436],[114,437],[128,438],[113,439],[137,440],[109,441],[108,408],[138,442],[110,443],[115,444],[116,25],[119,444],[106,25],[142,445],[132,446],[123,447],[124,448],[126,449],[122,450],[125,451],[135,408],[117,452],[118,453],[127,454],[107,455],[130,446],[129,444],[133,25],[136,456],[837,457],[838,25],[840,458],[841,25],[839,378],[842,459],[847,460],[850,461],[781,462],[776,25],[780,463],[848,25],[851,25],[852,25],[853,408],[854,25],[843,25],[855,25],[778,25],[845,25],[846,25],[836,464],[858,465],[856,370],[859,25],[779,25],[884,466],[885,467],[860,468],[863,468],[882,466],[883,466],[873,466],[872,469],[870,466],[865,466],[878,466],[876,466],[880,466],[864,466],[877,466],[881,466],[866,466],[867,466],[879,466],[861,466],[868,466],[869,466],[871,466],[875,466],[886,470],[874,466],[862,466],[899,471],[898,25],[893,470],[895,472],[894,470],[887,470],[888,470],[890,470],[892,470],[896,472],[897,472],[889,472],[891,472],[844,473],[849,474],[900,25],[303,25],[902,25],[857,25],[903,25],[904,475],[777,25],[821,476],[822,477],[823,478],[824,479],[756,480],[757,481],[758,482],[759,480],[760,483],[761,483],[762,483],[828,484],[829,484],[831,485],[832,486],[833,486],[834,487],[835,488],[825,489],[826,490],[827,491]],"affectedFilesPendingEmit":[817,819,764,765,767,792,793,794,795,802,803,805,811,812,790,791,753,804,814,813,809,815,810,816,316,546,547,548,820,754,545,542,549,319,523,538,543,552,553,550,755,544,551,541,821,822,823,824,756,757,758,759,760,761,762,828,829,831,832,833,834,835,825,826,827],"version":"5.9.3"}
\ No newline at end of file