alouette
Version:
A modern, customizable design system built on top of NativeWind v5 with configurable defaults
1 lines • 278 kB
Source Map (JSON)
{"version":3,"file":"index-node22.cjs","sources":["../src/core/NativeThemeVariablesContext.ts","../src/core/ThemeContext.ts","../src/ui/containers/ScopedTheme.tsx","../src/core/AlouetteProvider.tsx","../src/core/AlouetteDecorator.tsx","../src/ui/primitives/View.tsx","../src/ui/containers/AccentScope.tsx","../src/ui/primitives/Text.tsx","../src/ui/primitives/ScrollView.tsx","../src/ui/primitives/FlatList.tsx","../src/ui/primitives/SectionList.tsx","../src/ui/stacks/stacks.tsx","../src/ui/stacks/Separator.tsx","../src/ui/containers/Box.tsx","../src/ui/containers/Surface.tsx","../src/ui/styled.tsx","../src/ui/story-components/StoryTitle.tsx","../src/ui/story-components/Story.tsx","../src/ui/story-components/StoryContainer.tsx","../src/ui/story-components/StoryDecorator.tsx","../src/ui/story-components/StoryGrid.tsx","../src/ui/containers/StableAccentScope.tsx","../src/ui/containers/PortalAccentScope.tsx","../src/ui/containers/Presence.tsx","../src/animationDurationsMs.ts","../src/core/useScrollEndState.ts","../src/core/useColorToken.ts","../src/expo/ExternalLink.tsx","../src/expo/ExternalLink.shared.ts","../src/ui/primitives/Icon.tsx","../src/ui/feedback/RingCircle.tsx","../src/ui/feedback/useSimulatedProgress.ts","../src/ui/feedback/CircularProgress.tsx","../src/ui/actions/PressableBox.tsx","../src/ui/actions/Button.tsx","../src/ui/actions/IconButton.tsx","../src/ui/containers/Modal.tsx","../src/ui/feedback/Message.tsx","../src/ui/actions/CollapsibleErrorMessage.tsx","../src/ui/actions/usePressAsync.ts","../src/ui/containers/AlertDialog.tsx","../src/ui/actions/ExternalLinkText.tsx","../src/ui/actions/ActionButton.tsx","../src/ui/inputs/InputText.tsx","../src/ui/inputs/TextArea.tsx","../src/ui/inputs/Switch.tsx","../src/core/useControllableValue.ts","../src/ui/inputs/Select.shared.tsx","../src/ui/inputs/Select.tsx","../src/ui/selection/SelectionContext.tsx","../src/ui/inputs/RadioContext.tsx","../src/ui/inputs/RadioGroup.tsx","../src/ui/containers/DefaultAccentScope.tsx","../src/ui/selection/RadioIndicator.tsx","../src/ui/inputs/Radio.tsx","../src/ui/selection/SegmentedBar.tsx","../src/ui/inputs/RadioButtonGroup.tsx","../src/ui/selection/SegmentedItem.tsx","../src/ui/inputs/RadioButton.tsx","../src/ui/inputs/RadioCardGroup.tsx","../src/ui/inputs/RadioCard.tsx","../src/ui/navigation/NavBarContext.tsx","../src/ui/navigation/NavBar.tsx","../src/ui/navigation/NavBarItem.tsx","../src/ui/navigation/TabsContext.tsx","../src/ui/navigation/Tabs.tsx","../src/ui/navigation/Tab.tsx","../src/ui/forms/FormItem.tsx","../src/ui/forms/Form.tsx","../src/ui/forms/FormField.tsx","../src/ui/forms/FormFieldArray.tsx","../src/ui/forms/FormSubmitButton.tsx","../src/ui/forms/SimpleVForm.tsx","../src/ui/data/EditableItem.tsx","../src/ui/forms/FormEditableItem.tsx","../src/ui/data/Badge.tsx","../src/ui/data/Bullet.tsx","../src/ui/feedback/ConnectionState.tsx","../src/ui/feedback/LinearProgress.tsx","../src/ui/actions/PressableListItem.tsx","../src/ui/layout/GradientBackground.tsx","../src/ui/layout/GradientScrollView.tsx","../src/config/Breakpoints.ts","../src/windowSize/useCurrentBreakpointName.ts","../src/windowSize/SwitchBreakpoints.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { AlouetteTheme } from \"./AlouetteConfig\";\n\n/**\n * Resolved CSS-variable map for every theme — the JS mirror of the palette CSS,\n * consumed by `ScopedTheme` (feeds NativeWind's `VariableContextProvider`). This is the shape of `generateTheme(...).themeVariables`.\n */\nexport type ThemeVariablesMap = Record<\n AlouetteTheme,\n Record<`--${string}`, string>\n>;\n\n/**\n * Holds the active {@link ThemeVariablesMap}. Defaults to the bundled default\n * palette (`themeVariables`) so `ScopedTheme` works with no provider. A\n * BYO-palette app overrides it via `<AlouetteProvider themeVariables={...}>`\n * with its own `generateTheme(...).themeVariables`, keeping JS token reads in\n * sync with its palette CSS.\n */\nexport const NativeThemeVariablesContext = createContext<ThemeVariablesMap>(\n null as unknown as ThemeVariablesMap,\n);\n\nexport function useNativeThemeVariables(): ThemeVariablesMap {\n return useContext(NativeThemeVariablesContext);\n}\n","import { createContext, useContext } from \"react\";\nimport type { AlouetteModeTheme, AlouetteTheme } from \"./AlouetteConfig\";\n\n/**\n * Tracks the currently applied theme name (e.g. \"dark_brand\") so native reads\n * and accent composition (`AccentScope`) know which theme\n * is active. Set by `ScopedTheme` alongside NativeWind's variable context.\n *\n * Defaults to \"light\", matching the light defaults in the global `@theme` block.\n */\nexport const ThemeContext = createContext<AlouetteTheme>(\"light\");\n\nexport function useCurrentTheme(): AlouetteTheme {\n return useContext(ThemeContext);\n}\n\nexport function useCurrentMode(): AlouetteModeTheme {\n return useContext(ThemeContext).startsWith(\"dark\") ? \"dark\" : \"light\";\n}\n","import { VariableContextProvider } from \"nativewind\";\nimport type { ReactNode } from \"react\";\nimport { useContext } from \"react\";\nimport type { AlouetteTheme } from \"../../core/AlouetteConfig\";\nimport { NativeThemeVariablesContext } from \"../../core/NativeThemeVariablesContext\";\nimport { ThemeContext } from \"../../core/ThemeContext\";\n\nexport interface ScopedThemeProps {\n /** Full theme name, e.g. \"light\", \"dark\", \"light_brand\", \"dark_danger\". */\n theme: AlouetteTheme;\n children?: ReactNode;\n}\n\n/**\n * Applies a theme to its subtree by pushing the theme's resolved CSS variables\n * through NativeWind's `VariableContextProvider` (context only, layout-neutral).\n * The web build applies the theme as a className instead — see\n * `ScopedTheme.web.tsx`. It also records the active theme name in `ThemeContext`\n * so `AccentScope` can read it.\n */\nexport function ScopedTheme({ theme, children }: ScopedThemeProps): ReactNode {\n const themeVariables = useContext(NativeThemeVariablesContext);\n return (\n <ThemeContext.Provider value={theme}>\n <VariableContextProvider value={themeVariables[theme]}>\n {children}\n </VariableContextProvider>\n </ThemeContext.Provider>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useColorScheme } from \"react-native\";\nimport { ScopedTheme } from \"../ui/containers/ScopedTheme\";\nimport type { ThemeVariablesMap } from \"./NativeThemeVariablesContext\";\nimport { NativeThemeVariablesContext } from \"./NativeThemeVariablesContext\";\n\nexport interface AlouetteProviderProps {\n children: ReactNode;\n /**\n * The resolved theme-variable map JS token reads use. Defaults to the bundled\n * default palette. A BYO-palette app passes its own\n * `generateTheme(...).themeVariables` (from `alouette/theme-generator`) here so\n * JS reads match its palette CSS.\n */\n themeVariables: ThemeVariablesMap;\n}\n\nexport function AlouetteProvider({\n children,\n themeVariables,\n}: AlouetteProviderProps): ReactNode {\n // Apply the OS light/dark scheme as the root theme so base tokens resolve\n // correctly app-wide. Subtrees can override via ScopedTheme / AccentScope.\n const colorScheme = useColorScheme();\n return (\n <NativeThemeVariablesContext.Provider value={themeVariables}>\n <ScopedTheme theme={colorScheme === \"dark\" ? \"dark\" : \"light\"}>\n {children}\n </ScopedTheme>\n </NativeThemeVariablesContext.Provider>\n );\n}\n","/* eslint-disable react/destructuring-assignment */\nimport type { Decorator } from \"@storybook/react-vite\";\nimport { ScopedTheme } from \"../ui/containers/ScopedTheme\";\nimport { AlouetteProvider } from \"./AlouetteProvider\";\nimport { SafeAreaProvider } from \"./SafeAreaProvider\";\n\n// eslint-disable-next-line react/function-component-definition -- not a component\nexport const AlouetteDecorator: Decorator = (storyFn, context) => {\n const theme: \"dark\" | \"light\" =\n context.globals.mode === \"dark\" ? \"dark\" : \"light\";\n\n // The `colorFormat` toolbar global (web storybook only) previews the wide-gamut\n // palette. It defaults to sRGB so what is reviewed matches what native renders.\n const themeVariables = context.parameters.alouette?.themeVariables;\n\n if (!themeVariables) {\n throw new Error(\n 'AlouetteDecorator: missing \"themeVariables\" in parameters.alouette',\n );\n }\n\n return (\n <SafeAreaProvider>\n <AlouetteProvider themeVariables={themeVariables}>\n <ScopedTheme theme={theme}>{storyFn(context)}</ScopedTheme>\n </AlouetteProvider>\n </SafeAreaProvider>\n );\n};\n","import { forwardRef } from \"react\";\nimport { View as RNView, type ViewProps as RNViewProps } from \"react-native\";\n\nexport type ViewProps = RNViewProps;\n\nexport const View = forwardRef<RNView, ViewProps>((props, ref) => {\n return <RNView ref={ref} {...props} />;\n});\n","import type { ReactNode } from \"react\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { useCurrentMode } from \"../../core/ThemeContext\";\nimport { ScopedTheme } from \"./ScopedTheme\";\n\nexport interface AccentScopeProps {\n mode?: \"dark\" | \"light\";\n accent?: Accent;\n children?: ReactNode;\n}\n\nexport function AccentScope({\n mode: forcedMode,\n accent,\n children,\n}: AccentScopeProps): ReactNode {\n const currentMode = useCurrentMode();\n if (!accent) {\n return children;\n }\n // ScopedTheme applies the accent theme's *resolved* variables (base mode + accent),\n // so a single scope works at any depth — no need to pre-apply the base mode.\n const mode = forcedMode ?? currentMode;\n return <ScopedTheme theme={`${mode}_${accent}`}>{children}</ScopedTheme>;\n}\n","import { forwardRef } from \"react\";\nimport { Text as RNText, type TextProps as RNTextProps } from \"react-native\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-family\": [\n \"font-body\",\n \"font-body-bold\",\n \"font-body-extrabold\",\n \"font-heading\",\n \"font-heading-bold\",\n \"font-heading-extrabold\",\n \"font-mono\",\n \"font-mono-bold\",\n \"font-mono-extrabold\",\n ],\n },\n },\n});\n\nexport interface TextProps extends RNTextProps {\n accent?: Accent;\n}\n\nexport const Text = forwardRef<RNText, TextProps>(\n ({ className, accent, ...props }, ref) => {\n return (\n <AccentScope accent={accent}>\n <RNText\n ref={ref}\n className={twMerge(\"font-body text-sharp\", className)}\n {...props}\n />\n </AccentScope>\n );\n },\n);\n\nexport type ParagraphProps = TextProps;\n\nexport const Paragraph = forwardRef<RNText, ParagraphProps>(\n ({ className, ...props }, ref) => {\n return (\n <Text\n ref={ref}\n role=\"paragraph\"\n className={`select-auto ${className ?? \"\"}`}\n {...props}\n />\n );\n },\n);\n","import { styled } from \"nativewind\";\nimport type { ComponentType } from \"react\";\nimport {\n ScrollView as RNScrollView,\n type ScrollViewProps as RNScrollViewProps,\n type StyleProp,\n type ViewStyle,\n} from \"react-native\";\n\nexport type ScrollViewProps = RNScrollViewProps;\n\ninterface StyledScrollViewProps {\n style?: StyleProp<ViewStyle>;\n contentContainerStyle?: StyleProp<ViewStyle>;\n}\n\nexport const ScrollView = styled(\n RNScrollView as unknown as ComponentType<StyledScrollViewProps>,\n {\n className: \"style\",\n contentContainerClassName: \"contentContainerStyle\",\n },\n) as ComponentType<ScrollViewProps>;\n","import { styled } from \"nativewind\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport {\n FlatList as RNFlatList,\n type FlatListProps as RNFlatListProps,\n type StyleProp,\n type ViewStyle,\n} from \"react-native\";\n\nexport type FlatListProps<ItemT> = RNFlatListProps<ItemT>;\n\ninterface StyledFlatListProps {\n style?: StyleProp<ViewStyle>;\n contentContainerStyle?: StyleProp<ViewStyle>;\n columnWrapperStyle?: StyleProp<ViewStyle>;\n}\n\nexport const FlatList = styled(\n RNFlatList as unknown as ComponentType<StyledFlatListProps>,\n {\n className: \"style\",\n contentContainerClassName: \"contentContainerStyle\",\n columnWrapperClassName: \"columnWrapperStyle\",\n },\n) as <ItemT>(props: FlatListProps<ItemT>) => ReactNode;\n","import { styled } from \"nativewind\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport {\n SectionList as RNSectionList,\n type SectionListProps as RNSectionListProps,\n type StyleProp,\n type ViewStyle,\n} from \"react-native\";\n\ntype DefaultSectionT = Record<string, unknown>;\n\nexport type SectionListProps<\n ItemT,\n SectionT = DefaultSectionT,\n> = RNSectionListProps<ItemT, SectionT>;\n\ninterface StyledSectionListProps {\n style?: StyleProp<ViewStyle>;\n contentContainerStyle?: StyleProp<ViewStyle>;\n}\n\nexport const SectionList = styled(\n RNSectionList as unknown as ComponentType<StyledSectionListProps>,\n {\n className: \"style\",\n contentContainerClassName: \"contentContainerStyle\",\n },\n) as <ItemT, SectionT = DefaultSectionT>(\n props: SectionListProps<ItemT, SectionT>,\n) => ReactNode;\n","import { forwardRef } from \"react\";\nimport { View as RNView, type ViewProps as RNViewProps } from \"react-native\";\n\nexport type StackProps = RNViewProps;\n\nexport const Stack = forwardRef<RNView, StackProps>(\n ({ className, ...props }, ref) => {\n return (\n <RNView\n ref={ref}\n className={`flex-row flex-wrap ${className ?? \"\"}`}\n {...props}\n />\n );\n },\n);\n\nexport type HStackProps = RNViewProps;\n\nexport const HStack = forwardRef<RNView, HStackProps>(\n ({ className, ...props }, ref) => {\n return (\n <RNView ref={ref} className={`flex-row ${className ?? \"\"}`} {...props} />\n );\n },\n);\n\nexport type VStackProps = RNViewProps;\n\nexport const VStack = forwardRef<RNView, VStackProps>(\n ({ className, ...props }, ref) => {\n return (\n <RNView ref={ref} className={`flex-col ${className ?? \"\"}`} {...props} />\n );\n },\n);\n","import { forwardRef } from \"react\";\nimport { View as RNView, type ViewProps as RNViewProps } from \"react-native\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\n\nconst separatorVariants = tv({\n base: \"border-border-sharp\",\n variants: {\n vertical: {\n true: \"self-stretch border-r w-px\",\n false: \"self-stretch border-b h-px\",\n },\n },\n defaultVariants: {\n vertical: false,\n },\n});\n\ntype SeparatorVariantProps = VariantProps<typeof separatorVariants>;\n\nexport interface SeparatorProps extends RNViewProps, SeparatorVariantProps {}\n\nexport const Separator = forwardRef<RNView, SeparatorProps>(\n ({ className, vertical, ...props }, ref) => {\n return (\n <RNView\n ref={ref}\n className={separatorVariants({ vertical, className })}\n {...props}\n />\n );\n },\n);\n","import type { ReactElement } from \"react\";\nimport { Children, cloneElement, forwardRef } from \"react\";\nimport {\n Pressable,\n type PressableProps,\n View as RNView,\n type ViewProps as RNViewProps,\n} from \"react-native\";\nimport type { VariantProps } from \"tailwind-variants\";\nimport { tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { useSafeAreaInsets } from \"../../core/useSafeAreaInsets\";\nimport { AccentScope } from \"./AccentScope\";\n// Allow Box to shrink when used inside HStack/VStack (matches the original\n// BoxFrame default). overflow is intentionally left off so multi-layer\n// box-shadows are not clipped.\nexport const boxBaseClasses = \"shrink\";\n\nexport interface BoxProps extends RNViewProps {\n accent?: Accent;\n}\n\nexport const Box = forwardRef<RNView, BoxProps>(\n ({ className, accent, ...props }, ref) => {\n return (\n <AccentScope accent={accent}>\n <RNView\n ref={ref}\n className={`${boxBaseClasses} ${className ?? \"\"}`}\n {...props}\n />\n </AccentScope>\n );\n },\n);\n\nexport const interactiveBoxVariants = tv({\n base: [\n boxBaseClasses,\n \"cursor-pointer\",\n \"transition-[transform,background-color,border-color] duration-fast ease-in\",\n \"disabled:cursor-not-allowed disabled:opacity-70 aria-disabled:cursor-not-allowed aria-disabled:opacity-70\",\n \"active:scale-[0.975]\",\n ].join(\" \"),\n variants: {\n withFocusVisibleOutline: {\n true: \"focus-visible:outline-2 focus-visible:outline-offset-2\",\n },\n },\n});\n\nexport interface InteractiveBoxProps\n extends VariantProps<typeof interactiveBoxVariants>, PressableProps {}\n\nexport const InteractiveBox = forwardRef<RNView, InteractiveBoxProps>(\n ({ withFocusVisibleOutline, className, ...rest }, ref) => (\n <Pressable\n ref={ref}\n // override default behavior of Pressable which sets pointerEvents to \"none\" on disabled state. However this prevents cursor to display as\n pointerEvents=\"auto\"\n {...rest}\n className={interactiveBoxVariants({ withFocusVisibleOutline, className })}\n />\n ),\n);\n\nexport const InteractiveBoxHitSlop = forwardRef<RNView, InteractiveBoxProps>(\n ({ withFocusVisibleOutline, children, className, ...rest }, ref) => {\n const child = Children.only(children) as ReactElement<RNViewProps>;\n return (\n <Pressable\n ref={ref}\n // override default behavior of Pressable which sets pointerEvents to \"none\" on disabled state. However this prevents cursor to display as\n pointerEvents=\"auto\"\n className={`flex-center ${className ?? \"\"}`}\n {...rest}\n >\n {cloneElement(child, {\n className: interactiveBoxVariants({\n withFocusVisibleOutline,\n className: child.props.className,\n }),\n })}\n </Pressable>\n );\n },\n);\n\nexport type SafeAreaBoxProps = Omit<BoxProps, \"style\">;\n\nexport const SafeAreaBox = forwardRef<RNView, SafeAreaBoxProps>(\n (props, ref) => {\n const insets = useSafeAreaInsets();\n return (\n <Box\n ref={ref}\n style={{\n paddingTop: insets.top,\n paddingBottom: insets.bottom,\n paddingLeft: insets.left,\n paddingRight: insets.right,\n }}\n {...props}\n />\n );\n },\n);\n","import { forwardRef } from \"react\";\nimport type { View as RNView } from \"react-native\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"./AccentScope\";\nimport { Box, type BoxProps } from \"./Box\";\n\nconst surfaceVariants = tv({\n // overflow-hidden so the multi-layer shadow respects the rounded corners.\n base: \"overflow-hidden transition-background duration-fast\",\n variants: {\n size: {\n xxs: \"p-xs rounded-xs\",\n xs: \"p-sm rounded-xs\",\n sm: \"p-m rounded-sm\",\n md: \"p-xl rounded-sm\",\n lg: \"p-xxl rounded-md\",\n },\n variant: {\n surface: \"bg-surface\",\n highlight: \"bg-highlight\",\n \"highlight-accent\": \"bg-highlight-accent\",\n lowered: \"bg-lowered\",\n translucent: \"bg-translucent\",\n },\n shadow: {\n none: \"shadow-none\",\n s: \"shadow-s\",\n m: \"shadow-m\",\n l: \"shadow-l\",\n lowered: \"shadow-lowered\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"surface\",\n },\n});\n\ntype SurfaceVariantProps = VariantProps<typeof surfaceVariants>;\n\nexport interface SurfaceProps extends BoxProps, SurfaceVariantProps {\n accent?: Accent;\n}\n\nexport const Surface = forwardRef<RNView, SurfaceProps>(\n ({ className, size, variant, shadow, accent, ...props }, ref) => {\n // shadow defaults to \"s\", or \"lowered\" when variant=\"lowered\".\n const resolvedShadow = shadow ?? (variant === \"lowered\" ? \"lowered\" : \"s\");\n return (\n <AccentScope accent={accent}>\n <Box\n ref={ref}\n className={surfaceVariants({\n size,\n variant,\n shadow: resolvedShadow,\n className,\n })}\n {...props}\n />\n </AccentScope>\n );\n },\n);\n","import type { ComponentType } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function styled<P extends { className?: string }>(\n Component: ComponentType<P>,\n defaultClassName: string,\n): ComponentType<P> {\n function StyledComponent({ className, ...props }: P) {\n return (\n <Component\n className={twMerge(defaultClassName, className)}\n {...(props as P)}\n />\n );\n }\n StyledComponent.displayName = `Styled(${Component.displayName ?? Component.name ?? \"Component\"})`;\n StyledComponent.__isStyledComponent = true;\n return StyledComponent;\n}\n","import { forwardRef } from \"react\";\nimport type { Text as RNText } from \"react-native\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport { Text, type TextProps } from \"../primitives/Text\";\n\nconst storyTitleVariants = tv({\n base: \"font-heading-extrabold text-sharp\",\n variants: {\n level: {\n 1: \"text-4xl mb-xl\",\n 2: \"text-3xl mb-xl\",\n 3: \"text-2xl mb-m\",\n 4: \"text-xl mb-m\",\n },\n },\n defaultVariants: {\n level: 1,\n },\n});\n\ntype StoryTitleVariantProps = VariantProps<typeof storyTitleVariants>;\n\nexport interface StoryTitleProps extends TextProps, StoryTitleVariantProps {}\n\nexport const StoryTitle = forwardRef<RNText, StoryTitleProps>(\n ({ className, level, ...props }, ref) => {\n return (\n <Text\n ref={ref}\n className={storyTitleVariants({ level, className })}\n {...props}\n />\n );\n },\n);\n","import { Fragment, type ReactNode } from \"react\";\nimport { Platform } from \"react-native\";\nimport type { Accent, AlouetteModeTheme } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { ScopedTheme } from \"../containers/ScopedTheme\";\nimport { Surface } from \"../containers/Surface\";\nimport { ScrollView } from \"../primitives/ScrollView\";\nimport { View } from \"../primitives/View\";\nimport { VStack } from \"../stacks/stacks\";\nimport { styled } from \"../styled\";\nimport { StoryTitle } from \"./StoryTitle\";\n\nexport interface StorySectionProps {\n title: ReactNode;\n children: ReactNode;\n level?: 1 | 2;\n modeTheme?: AlouetteModeTheme;\n accent?: Accent;\n withSurface?: boolean;\n}\n\nconst InternalStorySection = styled(View, \"-mx-l px-l\");\n\nfunction StorySection({\n title,\n children,\n level = 1,\n modeTheme,\n accent,\n withSurface = false,\n}: StorySectionProps): ReactNode {\n const content = (\n <InternalStorySection className=\"pb-xl bg-screen\">\n {withSurface ? (\n <Surface>\n <StoryTitle level={(level + 1) as 2 | 3}>{title}</StoryTitle>\n <VStack className=\"gap-m\">{children}</VStack>\n </Surface>\n ) : (\n <>\n <StoryTitle level={(level + 1) as 2 | 3}>{title}</StoryTitle>\n <VStack className=\"gap-m\">{children}</VStack>\n </>\n )}\n </InternalStorySection>\n );\n\n if (modeTheme) {\n return <ScopedTheme theme={modeTheme}>{content}</ScopedTheme>;\n }\n if (accent) {\n return <AccentScope accent={accent}>{content}</AccentScope>;\n }\n return content;\n}\n\nfunction StorySubSection({\n title,\n children,\n modeTheme,\n accent,\n withSurface = false,\n}: StorySectionProps): ReactNode {\n const content = (\n <InternalStorySection className=\"mb-m\">\n {withSurface ? (\n <Surface>\n <StoryTitle level={3}>{title}</StoryTitle>\n <VStack className=\"gap-m\">{children}</VStack>\n </Surface>\n ) : (\n <>\n <StoryTitle level={3}>{title}</StoryTitle>\n <VStack className=\"gap-m\">{children}</VStack>\n </>\n )}\n </InternalStorySection>\n );\n if (modeTheme) {\n return <ScopedTheme theme={modeTheme}>{content}</ScopedTheme>;\n }\n if (accent) {\n return <AccentScope accent={accent}>{content}</AccentScope>;\n }\n return content;\n}\n\n// const SimpleWebScrollView = styled(View, \"h-full overflow-auto\");\n\nconst ScrollWrapper = Platform.OS === \"web\" ? Fragment : ScrollView;\n\nexport interface StoryProps {\n documentation?: NonNullable<ReactNode>;\n children?: NonNullable<ReactNode>;\n noDarkMode?: boolean;\n}\n\nexport function Story({\n documentation,\n children,\n noDarkMode,\n}: StoryProps): ReactNode {\n return (\n <ScrollWrapper>\n {documentation && (\n <Surface accent=\"info\" className=\"mb-xxl\">\n {documentation}\n </Surface>\n )}\n {([\"light\", ...(noDarkMode ? [] : [\"dark\"])] as (\"dark\" | \"light\")[]).map(\n (mode) => (\n <ScopedTheme key={mode} theme={mode}>\n <View className=\"bg-screen p-l\">{children}</View>\n </ScopedTheme>\n ),\n )}\n </ScrollWrapper>\n );\n}\n\nStory.Section = StorySection;\nStory.SubSection = StorySubSection;\n\nexport const accents: Accent[] = [\n \"brand\",\n \"danger\",\n \"info\",\n \"success\",\n \"warning\",\n];\n","import type { ReactNode } from \"react\";\nimport { ScopedTheme } from \"../containers/ScopedTheme\";\nimport { ScrollView } from \"../primitives/ScrollView\";\nimport { StoryTitle } from \"./StoryTitle\";\n\nexport interface StoryContainerProps {\n title: ReactNode;\n children: NonNullable<ReactNode>;\n}\n\nexport function StoryContainer({\n title,\n children,\n}: StoryContainerProps): ReactNode {\n return (\n <ScopedTheme theme=\"light\">\n <ScrollView className=\"bg-white p-3xl\">\n <StoryTitle level={1}>{title}</StoryTitle>\n {children}\n </ScrollView>\n </ScopedTheme>\n );\n}\n","import type { Decorator } from \"@storybook/react-vite\";\nimport { StoryContainer } from \"./StoryContainer\";\n\n// eslint-disable-next-line react/function-component-definition -- not a component, it's a decorator for storybook.\nexport const StoryDecorator: Decorator = (storyFn, { name, parameters }) => {\n if (parameters?.container === false) return storyFn();\n return <StoryContainer title={name}>{storyFn()}</StoryContainer>;\n};\n","import { Children, type ReactNode } from \"react\";\nimport { Platform } from \"react-native\";\nimport { tv } from \"tailwind-variants\";\nimport { View } from \"../primitives/View\";\nimport { VStack } from \"../stacks/stacks\";\nimport { StoryTitle } from \"./StoryTitle\";\n\nconst rowVariants = tv(\n {\n base: \"flex-col\",\n variants: {\n breakpoint: {\n small: \"sm:flex-row sm:mb-xl\",\n medium: \"md:flex-row md:mb-xl\",\n },\n flexWrap: { true: \"\" },\n },\n compoundVariants: [\n { breakpoint: \"small\", flexWrap: true, class: \"sm:flex-wrap sm:gap-m\" },\n { breakpoint: \"medium\", flexWrap: true, class: \"md:flex-wrap md:gap-m\" },\n ],\n },\n { twMerge: false },\n);\n\nconst itemVariants = tv(\n {\n base: \"pt-m pb-xl\",\n variants: {\n breakpoint: {\n small: \"sm:pt-0 sm:pb-0 sm:my-xxs shrink\",\n medium: \"md:pt-0 md:pb-0 md:my-xxs shrink\",\n },\n flexWrap: {\n true: \"\",\n false: \"\",\n },\n loose: {\n true: \"\",\n false: \"grow\",\n },\n },\n compoundVariants: [\n { breakpoint: \"small\", flexWrap: false, class: \"sm:basis-0\" },\n { breakpoint: \"medium\", flexWrap: false, class: \"md:basis-0\" },\n ],\n defaultVariants: {\n flexWrap: false,\n },\n },\n { twMerge: false },\n);\n\nexport interface StoryGridRowProps {\n children: NonNullable<ReactNode>;\n breakpoint?: \"medium\" | \"small\";\n flexWrap?: boolean;\n loose?: boolean;\n}\n\nfunction StoryGridRow({\n children,\n breakpoint = \"small\",\n flexWrap,\n loose,\n}: StoryGridRowProps): ReactNode {\n return (\n <View className={rowVariants({ breakpoint, flexWrap })}>\n {Children.map(children, (child) => (\n <View className={itemVariants({ breakpoint, flexWrap, loose })}>\n {child}\n </View>\n ))}\n </View>\n );\n}\n\nexport interface StoryGridColProps {\n children: NonNullable<ReactNode>;\n title?: string;\n platform?: \"all\" | \"native\" | \"web\";\n}\n\nfunction StoryGridCol({\n title,\n children,\n platform = \"all\",\n}: StoryGridColProps): ReactNode {\n const isNative = Platform.OS === \"ios\" || Platform.OS === \"android\";\n\n if (Platform.OS === \"web\" && platform === \"native\") {\n return null;\n }\n if (isNative && platform === \"web\") {\n return null;\n }\n\n return title ? (\n <VStack>\n <StoryTitle level={4} numberOfLines={1}>\n {title}\n </StoryTitle>\n {children}\n </VStack>\n ) : (\n children\n );\n}\n\nexport const StoryGrid = {\n Row: StoryGridRow,\n Col: StoryGridCol,\n};\n","import type { ReactNode } from \"react\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { useCurrentMode, useCurrentTheme } from \"../../core/ThemeContext\";\nimport { ScopedTheme } from \"./ScopedTheme\";\n\nexport interface StableAccentScopeProps {\n mode?: \"dark\" | \"light\";\n accent?: Accent;\n children?: ReactNode;\n}\n\n/**\n * Like AccentScope, but always keeps a ScopedTheme mounted — when `accent` is\n * unset it re-applies the inherited theme instead of dropping the wrapper.\n * Toggling `accent` (e.g. on hover) therefore only changes the theme prop, so\n * the subtree — and any focused input inside it — is never remounted. Prefer\n * AccentScope when the accent is fixed; reach for this only when it toggles.\n */\nexport function StableAccentScope({\n mode: forcedMode,\n accent,\n children,\n}: StableAccentScopeProps): ReactNode {\n const currentTheme = useCurrentTheme();\n const currentMode = useCurrentMode();\n return (\n <ScopedTheme\n theme={accent ? `${forcedMode ?? currentMode}_${accent}` : currentTheme}\n >\n {children}\n </ScopedTheme>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { StableAccentScope } from \"./StableAccentScope\";\n\nexport interface PortalAccentScopeProps {\n accent?: Accent;\n children?: ReactNode;\n}\n\n/**\n * Theme scope for content rendered through a portal (Modal). Native has no\n * portal — `ScopedTheme` pushes the theme's fully merged variables through\n * context, which crosses the React tree wherever the host renders it — so a\n * single `StableAccentScope` is enough. The web build re-applies the base mode\n * first, see `PortalAccentScope.web.tsx`.\n */\nexport function PortalAccentScope({\n accent,\n children,\n}: PortalAccentScopeProps): ReactNode {\n return <StableAccentScope accent={accent}>{children}</StableAccentScope>;\n}\n","import {\n Children,\n type Key,\n type ReactElement,\n type ReactNode,\n cloneElement,\n isValidElement,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { View } from \"../primitives/View\";\n\nexport interface PresenceBaseProps {\n /**\n * Identity of the current child. When it changes, the previous child is kept\n * mounted (with `exitClassName`) for `exitDurationMs` so it can animate out\n * while the new child animates in — an AnimatePresence-style swap done with\n * pure CSS animations, no animation library.\n */\n activeKey: Key;\n /** How long to keep the exiting child mounted — match the exit animation. */\n exitDurationMs: number;\n /** Animation class applied to the entering (current) child. */\n enterClassName?: string;\n /** Animation class applied to the exiting (previous) child. */\n exitClassName?: string;\n /** Class applied to every item (e.g. `absolute inset-0` to overlap). */\n className?: string;\n}\n\ninterface Snapshot {\n key: Key;\n node: ReactNode;\n}\n\nfunction joinClasses(...classes: (string | undefined)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n/**\n * Shared keyed-swap logic. Keeps the previously rendered child as a snapshot\n * after `activeKey` changes so an exit animation can play, then removes it once\n * `exitDurationMs` has elapsed. The entering child is keyed by `activeKey`, so\n * it remounts on each change and replays its enter animation.\n *\n * Assumes one child whose content is derived from `activeKey` (the common\n * keyed-swap case). Updates to the active child between key changes are shown\n * live but not snapshotted for the next exit.\n */\nfunction usePresence(\n activeKey: Key,\n exitDurationMs: number,\n children: ReactNode,\n): Snapshot[] {\n const [exiting, setExiting] = useState<Snapshot[]>([]);\n const previousRef = useRef<Snapshot>({ key: activeKey, node: children });\n const childrenRef = useRef<ReactNode>(children);\n childrenRef.current = children;\n const timersRef = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n useEffect(\n () => () => {\n timersRef.current.forEach(clearTimeout);\n },\n [],\n );\n\n useEffect(() => {\n const previous = previousRef.current;\n if (previous.key === activeKey) {\n return;\n }\n previousRef.current = { key: activeKey, node: childrenRef.current };\n setExiting((list) => [...list, previous]);\n const timer = setTimeout(() => {\n setExiting((list) => list.filter((item) => item !== previous));\n timersRef.current = timersRef.current.filter((t) => t !== timer);\n }, exitDurationMs);\n timersRef.current.push(timer);\n }, [activeKey, exitDurationMs]);\n\n return exiting;\n}\n\ninterface PresenceItem {\n key: Key;\n node: ReactNode;\n}\n\nfunction toItems(children: ReactNode): PresenceItem[] {\n return Children.toArray(children)\n .filter(isValidElement)\n .map((child) => ({ key: child.key as Key, node: child }));\n}\n\n/**\n * Order-preserving merge of the previously rendered key order with the current\n * live keys (the react-transition-group algorithm). Removed keys stay in their\n * old positions, so an exiting item animates out in place instead of jumping to\n * the end of the list.\n */\nfunction mergeKeys(previous: Key[], next: Key[]): Key[] {\n const nextSet = new Set(next);\n const pendingByNext = new Map<Key, Key[]>();\n let pending: Key[] = [];\n\n for (const key of previous) {\n if (nextSet.has(key)) {\n if (pending.length > 0) {\n pendingByNext.set(key, pending);\n pending = [];\n }\n } else {\n pending.push(key);\n }\n }\n\n const result: Key[] = [];\n for (const key of next) {\n const before = pendingByNext.get(key);\n if (before) {\n result.push(...before);\n }\n result.push(key);\n }\n result.push(...pending);\n return result;\n}\n\ninterface RenderedItem extends PresenceItem {\n exiting: boolean;\n}\n\n/**\n * Diffs a list of keyed children across renders. New keys are returned with\n * `exiting: false` (mounted fresh, so their enter animation plays); removed keys\n * are kept with `exiting: true` for `exitDurationMs` so they can animate out,\n * then dropped. Order is preserved via {@link mergeKeys}.\n */\nfunction usePresenceList(\n children: ReactNode,\n exitDurationMs: number,\n): RenderedItem[] {\n const items = toItems(children);\n const liveKeys = items.map((item) => item.key);\n const signature = liveKeys.join(\"\u0000\");\n\n const nodesRef = useRef<Map<Key, ReactNode>>(new Map());\n for (const item of items) {\n nodesRef.current.set(item.key, item.node);\n }\n const liveKeysRef = useRef(liveKeys);\n liveKeysRef.current = liveKeys;\n\n const [order, setOrder] = useState<Key[]>(liveKeys);\n const orderRef = useRef(order);\n orderRef.current = order;\n const timersRef = useRef<Map<Key, ReturnType<typeof setTimeout>>>(new Map());\n\n useEffect(\n () => () => {\n timersRef.current.forEach(clearTimeout);\n },\n [],\n );\n\n useEffect(() => {\n const live = new Set(liveKeysRef.current);\n const newOrder = mergeKeys(orderRef.current, liveKeysRef.current);\n\n // A key that came back before its timer fired cancels its pending exit.\n for (const key of liveKeysRef.current) {\n const timer = timersRef.current.get(key);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(key);\n }\n }\n // A key that's gone animates out, then is dropped once the timer fires.\n for (const key of newOrder) {\n if (!live.has(key) && !timersRef.current.has(key)) {\n const timer = setTimeout(() => {\n timersRef.current.delete(key);\n nodesRef.current.delete(key);\n setOrder((current) => current.filter((k) => k !== key));\n }, exitDurationMs);\n timersRef.current.set(key, timer);\n }\n }\n setOrder(newOrder);\n }, [signature, exitDurationMs]);\n\n const live = new Set(liveKeys);\n return order.map((key) => ({\n key,\n node: nodesRef.current.get(key),\n exiting: !live.has(key),\n }));\n}\n\nexport interface PresenceListProps {\n /** How long to keep a removed child mounted — match the exit animation. */\n exitDurationMs: number;\n /** Animation class applied to entering children. */\n enterClassName?: string;\n /** Animation class applied to exiting children. */\n exitClassName?: string;\n /** Class applied to every item's wrapper `<View>`. */\n className?: string;\n /**\n * A list of keyed elements — each child must have a stable `key`. Adding a key\n * animates that item in while the others stay put; removing a key animates only\n * that item out.\n */\n children: ReactNode;\n}\n\n/**\n * Keyed-list presence (AnimatePresence-style). Renders a list of keyed children,\n * each wrapped in its own `<View>`, and animates individual add/remove: added\n * keys mount with `enterClassName`, removed keys stay mounted with `exitClassName`\n * for `exitDurationMs` before unmounting. For swapping a single child, use\n * {@link PresenceOne}.\n */\nexport function PresenceList({\n exitDurationMs,\n enterClassName,\n exitClassName,\n className,\n children,\n}: PresenceListProps): ReactNode {\n const items = usePresenceList(children, exitDurationMs);\n\n return (\n <>\n {items.map((item) => (\n <View\n key={item.key}\n className={joinClasses(\n className,\n item.exiting ? exitClassName : enterClassName,\n )}\n >\n {item.node}\n </View>\n ))}\n </>\n );\n}\n\ntype StyledElement = ReactElement<{ className?: string }>;\n\nexport interface PresenceOneProps extends PresenceBaseProps {\n /**\n * A single element that accepts and forwards `className` to its root view.\n * The `className` + enter/exit animation classes are merged onto it directly,\n * so no extra wrapper `<View>` is added to the tree.\n */\n children: StyledElement;\n}\n\n/**\n * Keyed-swap presence that merges the animation classes onto the child element\n * itself via `cloneElement` — no wrapper `<View>`. Requires a single element\n * that forwards `className`; for anything else use {@link PresenceList}.\n */\nexport function PresenceOne({\n activeKey,\n exitDurationMs,\n enterClassName,\n exitClassName,\n className,\n children,\n}: PresenceOneProps): ReactNode {\n const exiting = usePresence(activeKey, exitDurationMs, children);\n\n return (\n <>\n {exiting.map((item) => {\n const node = item.node as StyledElement;\n return cloneElement(node, {\n key: item.key,\n className: joinClasses(\n node.props.className,\n className,\n exitClassName,\n ),\n });\n })}\n {cloneElement(children, {\n key: activeKey,\n className: joinClasses(\n children.props.className,\n className,\n enterClassName,\n ),\n })}\n </>\n );\n}\n","/* Generated by scripts/build-css.ts. DO NOT EDIT. */\n\n/**\n * Duration (in ms) of each generic motion, mirroring the `--animate-*` CSS\n * tokens. Pass the matching value as `exitDurationMs` to {@link PresenceOne} /\n * {@link PresenceList} so the exit timer matches the CSS animation.\n */\nexport const animationDurationsMs = {\n \"slide\": 600,\n \"collapse\": 800,\n \"progress\": 600,\n \"fade\": 300,\n \"fast\": 200\n} as const;\n","import { useRef, useState } from \"react\";\nimport type { ScrollViewProps } from \"react-native\";\n\nexport interface ScrollEndState {\n isScrolledToEnd: boolean;\n scrollViewProps: Required<\n Pick<\n ScrollViewProps,\n \"onContentSizeChange\" | \"onLayout\" | \"onScroll\" | \"scrollEventThrottle\"\n >\n >;\n}\n\n// Sub-pixel layout rounding makes an exact equality unreliable.\nconst scrollEndToleranceInPx = 1;\n\n// Tracks whether a ScrollView is scrolled to its end — true as well when the\n// content fits, since there is then nothing hidden below the fold. Spread the\n// returned props on the ScrollView: onScroll alone never fires for content that\n// doesn't overflow, so layout and content size feed the initial state.\nexport function useScrollEndState(): ScrollEndState {\n const [isScrolledToEnd, setIsScrolledToEnd] = useState(true);\n const viewportHeightRef = useRef(0);\n const contentHeightRef = useRef(0);\n const scrollOffsetRef = useRef(0);\n\n const updateIsScrolledToEnd = (): void => {\n setIsScrolledToEnd(\n contentHeightRef.current - scrollOffsetRef.current <=\n viewportHeightRef.current + scrollEndToleranceInPx,\n );\n };\n\n return {\n isScrolledToEnd,\n scrollViewProps: {\n scrollEventThrottle: 16,\n onLayout: (event) => {\n viewportHeightRef.current = event.nativeEvent.layout.height;\n updateIsScrolledToEnd();\n },\n onContentSizeChange: (_width, height) => {\n contentHeightRef.current = height;\n updateIsScrolledToEnd();\n },\n onScroll: (event) => {\n const { contentOffset, contentSize, layoutMeasurement } =\n event.nativeEvent;\n scrollOffsetRef.current = contentOffset.y;\n contentHeightRef.current = contentSize.height;\n viewportHeightRef.current = layoutMeasurement.height;\n updateIsScrolledToEnd();\n },\n },\n };\n}\n","import { useUnstableNativeVariable as useNativeVariable } from \"nativewind\";\n\nexport const useColorVariable = useNativeVariable as (\n variableName: string,\n) => string | undefined;\n\nexport type ColorClassName =\n | string // keeping string to allow tailwind-variants usage\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n | \"text-accent\"\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n | \"text-disabled-muted\"\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n | \"text-disabled\"\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n | \"text-muted\"\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n | \"text-on-accent-muted\"\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n | \"text-on-accent\"\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n | \"text-sharp\";\n/**\n * Resolves a `text-*` Tailwind className (e.g. `\"text-accent\"`) to its\n * concrete `--color-*` token value for the active theme. For native SVG\n * props (`color`, `stroke`, `fill`) that can't take a className directly and\n * so can't rely on CSS `currentColor` the way web SVG can.\n */\nexport function useColorToken(className: ColorClassName): string | undefined {\n const token = className\n .split(/\\s+/)\n .find((part) => part.startsWith(\"text-\"))\n ?.slice(\"text-\".length);\n return useColorVariable(`--color-${token ?? \"sharp\"}`);\n}\n","import * as WebBrowser from \"expo-web-browser\";\nimport { WebBrowserPresentationStyle } from \"expo-web-browser\";\nimport type { ComponentProps, FunctionComponent, ReactNode } from \"react\";\nimport { Linking } from \"react-native\";\nimport type { GestureResponderEvent } from \"react-native\";\nimport { useColorVariable } from \"../core/useColorToken\";\nimport type { ExternalOpenLinkBehavior } from \"./ExternalLink.shared\";\n\nexport interface ExternalLinkRequiredComponentProps {\n onPress?: (event: GestureResponderEvent) => Promise<void> | void;\n}\n\nconst useOpenExternalLink = () => {\n const textSharp = useColorVariable(\"text-sharp\");\n const bgSurface = useColorVariable(\"bg-surface\");\n\n return async (href: string, openLinkBehavior: ExternalOpenLinkBehavior) => {\n switch (openLinkBehavior.native) {\n case \"webBrowser\": {\n return WebBrowser.openBrowserAsync(href, {\n controlsColor: textSharp,\n dismissButtonStyle: \"close\",\n presentationStyle: WebBrowserPresentationStyle.PAGE_SHEET,\n toolbarColor: bgSurface,\n secondaryToolbarColor: bgSurface,\n readerMode: false,\n enableBarCollapsing: false,\n showTitle: true,\n enableDefaultShareMenuItem: true,\n });\n }\n case \"linking\": {\n return Linking.openURL(href);\n }\n default: {\n throw new Error(\n `Unsupported openLinkBehavior.native: ${openLinkBehavior.native as string}`,\n );\n }\n }\n };\n};\n\nexport interface ExternalLinkProps<C extends FunctionComponent<any>> {\n as: C;\n href: string;\n onPress?: (event: GestureResponderEvent) => void;\n openLinkBehavior: ExternalOpenLinkBehavior;\n}\n\ntype ExternalLinkSpreadProps<C extends FunctionComponent<any>> = Omit<\n ComponentProps<C>,\n keyof ExternalLinkProps<C>\n>;\n\nexport function ExternalLink<C extends FunctionComponent<any>>({\n as: C,\n href,\n openLinkBehavior,\n onPress,\n ...props\n}: ExternalLinkProps<C> & ExternalLinkSpreadProps<C>): ReactNode {\n const openExternalLink = useOpenExternalLink();\n const handlePress: ExternalLinkRequiredComponentProps[\"onPress\"] = (e) => {\n if (onPress) {\n onPress(e);\n if (e?.defaultPrevented) return;\n }\n\n if (!href) return;\n\n return openExternalLink(href, openLinkBehavior);\n };\n\n return <C {...(props as any)} onPress={handlePress} />;\n}\n","export interface ExternalOpenLinkBehavior {\n native: \"linking\" | \"webBrowser\";\n web: \"targetBlank\" | \"targetSelf\";\n}\n\n/** In-app themed browser sheet on native, new tab on web. */\nexport const defaultExternalOpenLinkBehavior: ExternalOpenLinkBehavior = {\n native: \"webBrowser\",\n web: \"targetBlank\",\n};\n","import {\n type ReactElement,\n type ReactNode,\n type SVGProps,\n cloneElement,\n} from \"react\";\nimport type { ColorClassName } from \"../../core/useColorToken\";\nimport { useColorToken } from \"../../core/useColorToken\";\n\nexport type SVGIconElement = ReactElement<SVGProps<SVGSVGElement>>;\n\nexport interface IconProps {\n icon: SVGIconElement;\n /** Square size in px. Defaults to 20. */\n size?: number;\n /**\n * Text-color className driving the icon tint, e.g. `text-sharp`,\n * `text-muted`, `text-accent`, `text-on-accent`, `text-disabled-muted`.\n * Defaults to `text-sharp`.\n */\n className?: ColorClassName;\n}\n\nexport function Icon({\n icon,\n size = 20,\n className = \"text-sharp\",\n}: IconProps): ReactNode {\n // RN SVG needs a concrete color, not a className. Resolve the text-* color\n // class to its --color-* token value via the active theme.\n const color = useColorToken(className);\n return cloneElement(icon, {\n color,\n width: size,\n height: size,\n });\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport Animated, {\n Easing,\n useAnimatedProps,\n useSharedValue,\n withTiming,\n} from \"react-native-reanimated\";\nimport { Circle, Svg } from \"react-native-svg\";\nimport { animationDurationsMs } from \"../../animationDurationsMs\";\n\nexport interface RingCircleProps {\n center: number;\n radius: number;\n strokeWidth: number;\n strokeDasharray?: number;\n strokeDashoffset?: number;\n /** Injected by the native `Icon` via `cloneElement`, resolved from a `useColorToken` string. */\n color?: string;\n /** Injected by the web `Icon` via `cloneElement` — the `text-*` class itself, resolved through CSS `currentColor`. */\n className?: string;\n width?: number;\n height?: number;\n}\n\nconst AnimatedCircle = Animated.createAnimatedComponent(Circle);\n\n// Matches the web ring's CSS `ease-out` (cubic-bezier(0, 0, 0.58, 1)).\nconst easeOut = Easing.bezier(0, 0, 0.58, 1);\n\nexport function RingCircle({\n center,\n radius,\n strokeWidth,\n strokeDasharray,\n strokeDashoffset,\n color,\n width,\n height,\n}: RingCircleProps): ReactNode {\n // Same viewBox as Phosphor icons (e.g. CheckCircleRegularIcon, viewBox\n // \"0 0 256 256\"), whose glyph is a 208-diameter circle inset within it.\n // Rendering into the same viewBox at the same glyph diameter gives the ring\n // the same padding, so it keeps a consistent visual weight when swapped for\n // a Phosphor icon in the same slot (Button's overlay spinner → success check).\n const scale = 208 / (center * 2);\n const scaledRadius = radius * scale;\n const scaledStrokeWidth = strokeWidth * scale;\n const scaledDashoffset =\n strokeDashoffset == null ? undefined : strokeDashoffset * scale;\n\n // strokeDashoffset is an SVG prop, not a view style, so NativeWind\n // transitions can't animate it — drive it with Reanimated instead.\n const animatedOffset = useSharedValue(scaledDashoffset ?? 0);\n\n useEffect(() => {\n animatedOffset.value = withTiming(scaledDashoffset ?? 0, {\n duration: animationDurationsMs.progress,\n easing: easeOut,\n });\n }, [animatedOffset, scaledDashoffset]);\n\n const animatedProps = useAnimatedProps(() => ({\n strokeDashoffset: animatedOffset.value,\n }));\n\n return (\n <Svg color={color} width={width} height={height} viewBox=\"0 0 256 256\">\n {strokeDasharray == null ? (\n <Circle\n cx={128}\n cy={128}\n r={scaledRadius}\n stroke=\"currentColor\"\n strokeWidth={scaledStrokeWidth}\n fill=\"none\"\n />\n ) : (\n <AnimatedCircle\n animatedProps={animatedProps}\n cx={128}\n cy={128}\n r={scaledRadius}\n stroke=\"currentColor\"\n strokeWidth={scaledStrokeWidth}\n strokeDasharray={strokeDasharray * scale}\n strokeLinecap=\"round\"\n transform=\"rotate(-90 128 128)\"\n fill=\"none\"\n />\n )}\n </Svg>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { animationDurationsMs } from \"../../animationDurationsMs\";\n\nconst startDelayMs = 100;\nconst stepIntervalMs = 500;\nconst completeDelayMs = 500;\nconst resetDelayMs = 1000;\n\n/**\n * Time from `loading` going false until the ring has finished completing to\n * 100% and faded out — how long a consumer must keep the component mounted\n * to see the finish animation instead of cutting it off.\n */\nexport const indeterminateExitDurationMs =\n resetDelayMs + animationDurationsMs.fade;\n\nconst random = (): number => Math.ceil(Math.random() * 100) / 100;\n\n/**\n * Advances toward 100 in decreasing increments so the bar appears to slow\n * down as it approaches completion, without ever reaching it on its own\n * (e.g. ~20% at 100ms, ~40% at 1s, ~60% at 2s, ~80% at 3s).\n */\nfunction nextSimulatedProgress(progress: number): number {\n if (progress < 60) return progress + random() * 10 + 5;\n if (progress < 70) return progress + random() * 10 + 3;\n if (progress < 80) return progress + random() + 5;\n if (progress < 90) return progress + random() + 1;\n if (progress < 95) return progress + 0.1;\n return progress;\n}\n\nexport function useSimulatedProgress(loading: boolean): {\n progress: number;\n hidden: boolean;\n} {\n const [progress, setProgress] = useState(1);\n const [hidden, setHidden] = useState(!loading);\n\n useEffect(() => {\n if (!loading) return undefined;\n\n setHidden(false);\n const startTimer = setTimeout(() => {\n setProgress(20);\n }, startDelayMs);\n const stepTimer = setInterval(() => {\n setProgress(nextSimulatedProgress);\n }, stepIntervalMs);\n\n return () => {\n clearTimeout(startTimer);\n clearInterval(stepTimer);\n };\n }, [loading]);\n\n useEffect(() => {\n if (loading) return undefined;\n\n const completeTimer = setTimeout(() => {\n setProgress(100);\n }, completeDelayMs);\n const resetTimer = setTimeout(() => {\n setHidden(true);\n setProgress(1);\n }, resetDelayMs);\n\n return () => {\n clearTimeout(completeTimer);\n clearTimeout(resetTimer);\n };\n }, [loading]);\n\n return { progress, hidden };\n}\n","import type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { Icon } from \"../primitives/Icon\";\nimport { View } from \"../primitives/View\";\nimport { RingCircle } from \"./RingCircle\";\nimport { useSimulatedProgress } from \"./useSimulatedProgress\";\n\nexport type CircularProgressSize = \"lg\" | \"md\" | \"sm\" | \"xs\";\n\nconst diameterBySize: Record<CircularProgressSize, number> = {\n xs: 16,\n sm: 32,\n md: 64,\n lg: 128,\n};\n\nconst strokeWidthBySize: Record<CircularProgressSize, number> = {\n xs: 2,\n sm: 4,\n md: 8,\n lg: 16,\n};\n\nconst ring = tv({\n base: \"relative transition-opacity duration-fade\",\n variants: {\n hidden: {\n true: \"opacity-0\",\n false: \"opacity-100\",\n },\n },\n defaultVariants: { hidden: false },\n});\n\nexport interface CircularProgressProps {\n /** Known completion percentage, 0-100. For an unknown percentage (e.g.\n * reconnecting, page transitions), use `IndeterminateCircularProgress` instead. */\n progress: number;\n hidden?: boolean;\n accent?: Accent;\n size?: CircularProgressSize;\n}\n\nexport function CircularProgress({\n progress,\n hidden = false,\n accent = \"brand\",\n size = \"md\",\n}: CircularProgressProps): ReactNode {\n const diameter = diameterBySize[size];\n const strokeWidth = strokeWidthBySize[size];\n const radius = (diameter - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const clampedProgress = Math.min(Math.max(progress, 0), 100);\n const dashOffset = circumference * (1 - clampedProgress / 100);\n const center = diameter / 2;\n\n const trackRing = (\n <RingCircle center={center} radius={radius} strokeWidth={strokeWidth} />\n );\n\n const fillRing = (\n <RingCircle\n center={center}\n radius={radius}\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n />\n );\n\n return (\n <AccentScope accent={accent}>\n <View\n className={ring({ hidden })}\n style={{ width: diameter, height: diameter }}\n >\n <View className=\"absolute inset-0\">\n <Icon\n icon={trackRing}\n size={diameter}\n className=\"text-border-muted\"\n />\n </View>\n <View className=\"absolute inset-0\">\n <Icon icon={fillRing} size={diameter} className=\"text-accent\" />\n </View>\n </View>\n </AccentScope>\n );\n}\n\nexport interface IndeterminateCircularProgressProps {\n /** Whether an operation is in progress. The ring creeps toward 100% while\n * `true`, then completes and fades out once `false`. */\n loading: boolean;\n accent?: Accent;\n size?: CircularProgressSize;\n}\n\nexport function IndeterminateCircularProgress({\n loading,\n accent,\n size,\n}: IndeterminateCircularProgressProps): ReactNode {\n const { progress, hidden } = useSimulatedProgress(loading);\n\n return (\n <CircularProgress\n progress={progress}\n hidden={hidden}\n accent={accent}\n size={size}\n />\n );\n}\n","import { forwardRef } from \"react\";\nimport type {\n PressableProps as RNPressableProps,\n View as RNView,\n} from \"react-native\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { InteractiveBox, interactiveBoxVariants } from \"../containers/Box\";\n\nconst pressableBoxVariants = tv(\n {\n extend: interactiveBoxVariants,\n base: \"overflow-hidden\",\n variants: {\n variant: {\n contained: [\n \"rounded-sm\",\n process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? \"\"\n : \"shadow-s bg-interactive-contained-pressable\",\n \"hover:bg-interactive-contained-hover\",\n \"focus:bg-interactive-contained-focus\",\n \"active:bg-interactive-contained-active\",\n \"disabled:bg-interactive-contained-disabled disabled:shadow-none\",\n \"aria-disabled:bg-interactive-contained-disabled aria-disabled:shadow-none\",\n \"focus-visible:outline-border-muted\",\n ].join(\" \"),\n outlined: [\n \"border bg-highlight\",\n process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? \"\"\n : \"border-interactive-outlined-pressable\",\n \"hover:border-interactive-outlined-hover\",\n \"focus:border-interactive-outlined-focus\",\n \"active:border-interactive-outlined-active\",\n \"disabled:border-interactive-outlined-disabled\",\n \"aria-disabled:border-interactive-outlined-disabled\",\n \"focus-visible:outline-interactive-outlined-outline-focus\",\n ].join(\" \"),\n ghost: [\n \"border border-transparent\",\n \"hover:border hover:border-interactive-outlined-hover\",\n \"focus:border focus:border-interactive-outlined-focus\",\n \"active:border active:border-interactive-outlined-active\",\n \"disabled:border-interactive-outlined-disabled\",\n \"aria-disabled:border-interactive-outlined-disabled\",\n \"focus-visible:outline-interactive-outlined-outline-focus\",\n ].join(\" \"),\n },\n forceStyle: {\n hover: \"\",\n focus: \"\",\n press: \"scale-[0.975]\",\n },\n },\n compoundVariants: process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? [\n /* contained */\n {\n variant: \"contained\",\n forceStyle: undefined,\n ghost: false,\n className: \"shadow-s bg-interactive-contained-pressable\",\n },\n {\n variant: \"contained\",\n forceStyle: \"hover\",\n className: \"shadow-s bg-interactive-contained-hover\",\n },\n {\n variant: \"contained\",\n forceStyle: \"focus\",\n className: \"shadow-s bg-interactive-contained-focus\",\n },\n {\n variant: \"contained\",\n forceStyle: \"press\",\n className: \"shadow-s bg-interactive-contained-active\",\n },\n /* outlined */\n {\n variant: \"outlined\",\n forceStyle: undefined,\n ghost: false,\n className: \"border-interactive-outlined-pressable\",\n },\n {\n variant: \"outlined\",\n forceStyle: \"hover\",\n className: \"border-interactive-outlined-hover\",\n },\n {\n variant: \"outlined\",\n forceStyle: \"focus\",\n className: \"border-interactive-outlined-focus\",\n },\n {\n variant: \"outlined\",\n forceStyle: \"press\",\n className: \"border-interactive-outlined-active\",\n },\n /* ghost */\n {\n variant: \"ghost\",\n forceStyle: undefined,\n className: \"border-transparent\",\n },\n {\n variant: \"ghost\",\n forceStyle: \"hover\",\n className: \"border-interactive-outlined-hover\",\n },\n {\n variant: \"ghost\",\n forceStyle: \"focus\",\n className: \"border-interactive-outlined-focus\",\n },\n {\n variant: \"ghost\",\n forceStyle: \"press\",\n className: \"border-interactive-outlined-active\",\n },\n ]\n : undefined,\n defaultVariants: {\n variant: \"contained\",\n },\n },\n { twMerge: false },\n);\n\ntype PressableBoxVariantProps = VariantProps<typeof pressableBoxVariants>;\n\nexport interface PressableBoxProps\n extends RNPressableProps, PressableBoxVariantProps {\n accent?: Accent;\n className?: string;\n forceStyle?: \"focus\" | \"hover\" | \"press\";\n}\n\n// TODO what is the diff between <Box interactive> and PressableBox ?\nexport const PressableBox = forwardRef<RNView, PressableBoxProps>(\n ({ className, variant, forceStyle, accent, ...props }, ref) => {\n return (\n <AccentScope accent={accent}>\n <InteractiveBox\n ref={ref}\n withFocusVisibleOutline\n role=\"button\"\n className={pressableBoxVariants({\n variant,\n\n className,\n forceStyle,\n })}\n {...props}\n />\n </AccentScope>\n );\n },\n);\n","import { CheckCircleRegularIcon } from \"alouette-icons/phosphor-icons/CheckCircleRegularIcon\";\nimport { WarningDuotoneIcon } from \"alouette-icons/phosphor-icons/WarningDuotoneIcon\";\nimport { type ReactNode, useEffect, useState } from \"react\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { ExternalLink } from \"../../expo/ExternalLink\";\nimport {\n type ExternalOpenLinkBehavior,\n defaultExternalOpenLinkBehavior,\n} from \"../../expo/ExternalLink.shared\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { IndeterminateCircularProgress } from \"../feedback/CircularProgress\";\nimport { indeterminateExitDurationMs } from \"../feedback/useSimulatedProgress\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\nimport { View } from \"../primitives/View\";\nimport { PressableBox, type PressableBoxProps } from \"./PressableBox\";\n\nexport const buttonHeight = {\n sm: 38,\n md: 44,\n} as const;\n\nconst buttonVariants = tv(\n {\n slots: {\n frame: \"flex-row flex-center relative\",\n text: \"font-body-bold text-center shrink transition-opacity duration-fade\",\n icon: \"\",\n terminalIcon: \"text-accent\",\n overlayIconContainer: \"absolute inset-0 flex-center\",\n },\n variants: {\n size: {\n sm: {\n frame: \"rounded-sm px-xs gap-xxs min-h-[38px]\",\n text: \"text-sm py-xxs\",\n },\n md: {\n frame: \"rounded-sm px-m gap-xs min-h-[44px]\",\n text: \"text-base py-xs\",\n },\n },\n variant: {\n contained: { text: \"text-on-accent\" },\n outlined: { text: \"text-sharp\" },\n ghost: { text: \"text-sharp\" },\n },\n disabled: { true: {}, false: {} },\n dimmed: {\n true: { text: \"opacity-30\", icon: \"opacity-30\" },\n false: {},\n },\n },\n compoundVariants: [\n {\n variant: \"contained\",\n disabled: false,\n ghost: false,\n class: { icon: \"text-on-accent\" },\n },\n {\n variant: \"contained\",\n disabled: false,\n ghost: true,\n class: {\n text: \"text-sharp hover:text-on-accent\",\n icon: \"text-sharp hover:text-on-accent\",\n },\n },\n { variant: \"outlined\", disabled: false, class: { icon: \"text-sharp\" } },\n {\n variant: \"contained\",\n disabled: true,\n class: { icon: \"text-disabled-sharp\", text: \"text-disabled-sharp\" },\n },\n {\n variant: \"outlined\",\n disabled: true,\n class: { icon: \"text-disabled-muted\", text: \"text-disabled-muted\" },\n },\n ],\n defaultVariants: { size: \"md\", variant: \"contained\" },\n },\n { twMerge: false },\n);\n\ntype ButtonSizeProps = Pick<VariantProps<typeof buttonVariants>, \"size\">;\n\nexport type ButtonState = \"failed\" | \"loading\" | \"success\";\n\n/** Icon shown above the text for a terminal `state`, once the spinner's\n * finish animation has played out. */\nfunction resolveTerminalIcon(state: ButtonState | undefined): {\n terminalIcon: SVGIconElement | undefined;\n terminalIconAccent: Accent | undefined;\n} {\n if (state === \"success\") {\n return {\n terminalIcon: <CheckCircleRegularIcon />,\n terminalIconAccent: \"success\",\n };\n }\n if (state === \"failed\") {\n return {\n terminalIcon: <WarningDuotoneIcon />,\n terminalIconAccent: \"danger\",\n };\n }\n return { terminalIcon: undefined, terminalIconAccent: undefined };\n}\n\nexport interface ButtonProps\n extends Omit<PressableBoxProps, \"children\">, ButtonSizeProps {\n icon?: SVGIconElement;\n accent?: Accent;\n text: ReactNode;\n state?: ButtonState;\n}\n\ninterface IsButtonDisabledParams {\n disabled?: boolean | null;\n state?: ButtonState;\n}\n\nfunction isButtonDisabled({\n disabled,\n state,\n}: IsButtonDisabledParams): boolean {\n return disabled === true || state != null;\n}\n\nexport function Button({\n icon,\n text,\n disabled,\n state,\n accent = \"brand\",\n variant = \"contained\",\n size = \"md\",\n className,\n ...pressableProps\n}: ButtonProps): ReactNode {\n const isLoading = state === \"loading\";\n\n // Keep the spinner (and the disabled look) mounted past `state` leaving\n // \"loading\" so the ring's complete-then-fade animation can finish, and the\n // background transitions back in step with it, instead of both being cut\n // off mid-animation.\n const [showSpinner, setShowSpinner] = useState(isLoading);\n useEffect(() => {\n if (isLoading) {\n setShowSpinner(true);\n return undefined;\n }\n const timer = setTimeout(() => {\n setShowSpinner(false);\n }, indeterminateExitDurationMs);\n return () => {\n clearTimeout(timer);\n };\n }, [isLoading]);\n\n const { terminalIcon, terminalIconAccent } = resolveTerminalIcon(state);\n const hasOverlayIcon = showSpinner || terminalIcon !== undefined;\n\n const isDisabled = isButtonDisabled({ disabled, state });\n const styles = buttonVariants({\n size,\n variant,\n disabled: isDisabled,\n dimmed: hasOverlayIcon,\n });\n\n return (\n <PressableBox\n accent={accent}\n variant={variant}\n disabled={isDisabled}\n className={styles.frame({ className })}\n {...pressableProps}\n >\n {hasOverlayIcon ? (\n <View className={styles.overlayIconContainer()}>\n {showSpinner || !terminalIcon ? (\n <IndeterminateCircularProgress\n loading={isLoading}\n accent={accent}\n size={size === \"sm\" ? \"xs\" : \"sm\"}\n />\n ) : (\n <AccentScope accent={terminalIconAccent}>\n <Icon\n icon={terminalIcon}\n className={styles.terminalIcon()}\n size={size === \"sm\" ? 24 : 32}\n />\n </AccentScope>\n )}\n </View>\n ) : null}\n {icon ? (\n <Icon\n icon={icon}\n className={styles.icon()}\n size={size === \"sm\" ? 16 : 20}\n />\n ) : null}\n <Text aria-disabled={isDisabled} className={styles.text()}>\n {text}\n </Text>\n </PressableBox>\n );\n}\n\nexport interface ExternalLinkButtonProps extends ButtonProps {\n href: string;\n /** How the link opens. Defaults to an in-app browser sheet / a new tab. */\n openLinkBehavior?: ExternalOpenLinkBehavior;\n}\n\nexport function ExternalLinkButton({\n href,\n openLinkBehavior = defaultExternalOpenLinkBehavior,\n onPress,\n ...buttonProps\n}: ExternalLinkButtonProps): ReactNode {\n return (\n <ExternalLink\n as={Button}\n // A disabled Pressable never sees the press that would cancel the\n // navigation, so the href has to go with it — ExternalLink drops a falsy\n // one on both platforms.\n href={isButtonDisabled(buttonProps) ? \"\" : href}\n openLinkBehavior={openLinkBehavior}\n role=\"link\"\n onPress={onPress ?? undefined}\n {...buttonProps}\n />\n );\n}\n\nexport interface InternalLinkButtonProps extends ButtonProps {\n href: string;\n}\n\nexport function InternalLinkButton({\n href: _href,\n ...buttonProps\n}: InternalLinkButtonProps): ReactNode {\n return <Button {...buttonProps} role=\"link\" />;\n}\n","import type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { buttonHeight } from \"./Button\";\nimport { PressableBox, type PressableBoxProps } from \"./PressableBox\";\n\nconst iconButtonVariants = tv(\n {\n slots: {\n frame: \"shrink-0 flex-center rounded-full\",\n icon: \"\",\n },\n variants: {\n variant: {\n contained: {},\n outlined: {},\n ghost: {},\n },\n disabled: {\n true: {},\n false: {},\n },\n },\n compoundVariants: [\n {\n variant: \"contained\",\n disabled: false,\n class: { icon: \"text-on-accent\" },\n },\n {\n variant: \"outlined\",\n disabled: false,\n class: { icon: \"text-sharp\" },\n },\n {\n variant: \"ghost\",\n disabled: false,\n class: { icon: \"text-sharp\" },\n },\n {\n variant: \"contained\",\n disabled: true,\n class: { icon: \"text-disabled-sharp\" },\n },\n {\n variant: \"outlined\",\n disabled: true,\n class: { icon: \"text-disabled-muted\" },\n },\n {\n variant: \"ghost\",\n disabled: true,\n class: { icon: \"text-disabled-muted\" },\n },\n ],\n defaultVariants: { variant: \"contained\" },\n },\n { twMerge: false },\n);\n\nexport interface IconButtonProps extends Omit<PressableBoxProps, \"children\"> {\n icon: SVGIconElement;\n /** Preset size token, or any number for a custom diameter (px). */\n size?: number | \"md\" | \"sm\";\n /** When \"fill\", the icon takes 80% of the button; default uses 50%. */\n iconSize?: \"fill\";\n \"aria-label\": string;\n}\n\nexport function IconButton({\n icon,\n disabled,\n size = \"md\",\n iconSize,\n variant = \"contained\",\n className,\n ...pressableProps\n}: IconButtonProps): ReactNode {\n const diameter = typeof size === \"number\" ? size : buttonHeight[size];\n const styles = iconButtonVariants({ variant, disabled: disabled === true });\n\n return (\n <PressableBox\n variant={variant}\n disabled={disabled}\n className={styles.frame({ className })}\n style={{ width: diameter, height: diameter }}\n {...pressableProps}\n >\n <Icon\n icon={icon}\n size={diameter * (iconSize === \"fill\" ? 0.8 : 0.55)}\n className={styles.icon()}\n />\n </PressableBox>\n );\n}\n","import { XRegularIcon } from \"alouette-icons/phosphor-icons/XRegularIcon\";\nimport { type ReactNode, useId } from \"react\";\nimport {\n Platform,\n Pressable,\n Modal as RNModal,\n useWindowDimensions,\n} from \"react-native\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { useScrollEndState } from \"../../core/useScrollEndState\";\nimport { buttonHeight } from \"../actions/Button\";\nimport { IconButton } from \"../actions/IconButton\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { ScrollView } from \"../primitives/ScrollView\";\nimport { Text } from \"../primitives/Text\";\nimport { View } from \"../primitives/View\";\nimport { HStack } from \"../stacks/stacks\";\nimport { PortalAccentScope } from \"./PortalAccentScope\";\n\n// Yoga only knows `relative` and `absolute` — `position: sticky` is a web-only\n// feature and the class compiles away on native. A component that pins an\n// element to the edge of a scroll box has to lay it out differently there.\nconst supportsStickyPosition = Platform.OS === \"web\";\n\n// The panel padding is split in half so the web scrollbar sits in a balanced\n// gutter: one half stays on the panel (outside the scroll box, between the panel\n// edge and the bar), the other moves into the scroll content container (inside\n// it, between the bar and the content). The header is outside the scroll box, so\n// it carries the inner half itself to stay aligned with the scrolling content;\n// the footer carries the bottom half, which the scroll content drops (pb-0).\nconst modalVariants = tv({\n slots: {\n // w-full so the panel shrinks on small screens (the backdrop padding keeps a\n // margin); max-w caps it on wide viewports.\n panel: \"w-full max-h-full\",\n inset: \"bg-highlight shadow-l\",\n header: \"items-center gap-xs\",\n scrollContent: \"\",\n // `sticky` pins it to the bottom of the scroll box on web. The border is\n // transparent at rest so toggling it can't shift the layout.\n footer:\n \"items-center justify-end gap-m sticky bottom-0 bg-highlight border-t border-transparent\",\n },\n variants: {\n size: {\n sm: {\n panel: \"max-w-[360px]\",\n inset: \"rounded-sm p-xs\",\n header: \"pl-xs\",\n scrollContent: \"p-xs\",\n footer: \"py-xs\",\n },\n md: {\n panel: \"max-w-[520px]\",\n inset: \"rounded-sm p-m\",\n header: \"pl-m\",\n scrollContent: \"p-m\",\n footer: \"py-sm\",\n },\n lg: {\n panel: \"max-w-[720px]\",\n inset: \"rounded-md p-l\",\n header: \"pl-l\",\n scrollContent: \"p-l\",\n footer: \"py-m\",\n },\n },\n withFooter: {\n true: { scrollContent: \"pb-0\" },\n },\n // Native has no sticky positioning, so the footer sits below the scroll box\n // instead of inside it — outside the scroll content container it has to\n // carry that container's horizontal padding itself to stay aligned with the\n // body.\n detachedFooter: {\n true: {},\n },\n // Only while the footer overlaps scrolled-past content does it need a rule\n // separating it from the body; at the end of the scroll it sits in flow.\n stuck: {\n true: { footer: \"border-border-muted\" },\n },\n },\n compoundVariants: [\n { size: \"sm\", detachedFooter: true, class: { footer: \"px-xs\" } },\n { size: \"md\", detachedFooter: true, class: { footer: \"px-m\" } },\n { size: \"lg\", detachedFooter: true, class: { footer: \"px-l\" } },\n ],\n defaultVariants: { size: \"md\" },\n});\n\ntype ModalVariantProps = VariantProps<typeof modalVariants>;\n\nexport interface ModalProps {\n /** Whether the modal is shown. */\n visible: boolean;\n /**\n * Called when the user dismisses the modal — backdrop press, close button, the\n * Android back button, or the Escape key (web).\n */\n onClose: () => void;\n children: ReactNode;\n /**\n * Heading rendered in the fixed header; also labels the dialog for assistive\n * tech.\n */\n title: string;\n /** Accent-tinted icon rendered before the title in the header. */\n icon?: SVGIconElement;\n /** Actions row rendered below the body (e.g. Cancel/Confirm buttons). */\n footer?: ReactNode;\n accent?: Accent;\n size?: ModalVariantProps[\"size\"];\n /** Hide the header close button (the modal stays dismissible otherwise). */\n hideCloseButton?: boolean;\n /** Accessible label for the close button. */\n closeButtonAriaLabel?: string;\n /**\n * `alertdialog` for interruptions that require an explicit response\n * (destructive confirmation, errors). Defaults to `dialog`.\n */\n role?: \"alertdialog\" | \"dialog\";\n /** ID of the element describing the dialog (announced by assistive tech). */\n \"aria-describedby\"?: string;\n testID?: string;\n}\n\nexport function Modal({\n visible,\n onClose,\n children,\n icon,\n footer,\n accent,\n size = \"md\",\n title,\n hideCloseButton = false,\n closeButtonAriaLabel = \"Close\",\n role = \"dialog\",\n \"aria-describedby\": ariaDescribedby,\n testID,\n}: ModalProps): ReactNode {\n const { height: windowHeight } = useWindowDimensions();\n const titleId = useId();\n const iconSize = size === \"lg\" ? \"md\" : size;\n const { isScrolledToEnd, scrollViewProps } = useScrollEndState();\n const styles = modalVariants({\n size,\n withFooter: footer !== undefined,\n stuck: footer !== undefined && !isScrolledToEnd,\n detachedFooter: !supportsStickyPosition,\n });\n const footerElement =\n footer === undefined ? null : (\n <HStack className={styles.footer()}>{footer}</HStack>\n );\n\n return (\n <RNModal\n transparent\n visible={visible}\n animationType=\"fade\"\n onRequestClose={onClose}\n >\n <PortalAccentScope accent={accent}>\n <View className=\"flex-1 flex-center p-l\">\n {/* Backdrop is an absolutely-filled sibling behind the panel, so it\n catches outside clicks without wrapping the panel — clicks inside\n the panel never reach it. aria-hidden + focusable={false} keep this\n dismiss target out of the accessibility tree and the tab order. */}\n <Pressable\n aria-hidden\n focusable={false}\n className=\"absolute inset-0 bg-translucent\"\n onPress={onClose}\n />\n <View\n aria-modal\n role={role}\n aria-labelledby={titleId}\n aria-describedby={ariaDescribedby}\n testID={testID}\n className={styles.panel()}\n >\n <View className={styles.inset()}>\n {/* Header sits outside the scroll box: the title and the close\n button stay put while the body scrolls under them. */}\n <HStack\n className={styles.header()}\n style={{ minHeight: buttonHeight[iconSize] }}\n >\n {icon === undefined ? null : (\n <Icon icon={icon} size={24} className=\"text-accent\" />\n )}\n <Text\n nativeID={titleId}\n className=\"shrink grow font-heading-bold text-xl leading-tight text-sharp\"\n >\n {title}\n </Text>\n {hideCloseButton ? null : (\n <IconButton\n icon={<XRegularIcon />}\n variant=\"ghost\"\n size={iconSize}\n aria-label={closeButtonAriaLabel}\n onPress={onClose}\n />\n )}\n </HStack>\n\n {/* Pixel maxHeight (not a %) so the ScrollView sizes to its\n content and only scrolls once it exceeds ~70% of the screen;\n `shrink` lets it give way to the header and the detached\n footer when the panel hits the screen height. */}\n <ScrollView\n className=\"shrink\"\n style={{ maxHeight: windowHeight * 0.7 }}\n contentContainerClassName={styles.scrollContent()}\n {...scrollViewProps}\n >\n {children}\n\n {/* Web keeps the footer in the scroll content, where `sticky`\n pins it to the bottom edge and the body scrolls under it. */}\n {supportsStickyPosition ? footerElement : null}\n </ScrollView>\n\n {/* Native has no sticky positioning: the footer sits after the\n scroll box instead. Same result — the ScrollView grows with\n its content up to its maxHeight, so the footer is right below\n short content and pinned under a full-height body. */}\n {supportsStickyPosition ? null : footerElement}\n </View>\n </View>\n </View>\n </PortalAccentScope>\n </RNModal>\n );\n}\n","import { CheckRegularIcon } from \"alouette-icons/phosphor-icons/CheckRegularIcon\";\nimport { InfoRegularIcon } from \"alouette-icons/phosphor-icons/InfoRegularIcon\";\nimport { WarningDuotoneIcon } from \"alouette-icons/phosphor-icons/WarningDuotoneIcon\";\nimport { WarningRegularIcon } from \"alouette-icons/phosphor-icons/WarningRegularIcon\";\nimport { XRegularIcon } from \"alouette-icons/phosphor-icons/XRegularIcon\";\nimport type { ReactNode } from \"react\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport type { Except } from \"type-fest\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { IconButton } from \"../actions/IconButton\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { Box } from \"../containers/Box\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\n\nconst messageFrameVariants = tv(\n {\n base: \"flex-row items-center overflow-hidden bg-highlight-accent\",\n variants: {\n size: {\n sm: \"gap-xs p-sm rounded-xs\",\n md: \"gap-m p-m rounded-sm\",\n lg: \"gap-l p-l rounded-md\",\n },\n variant: {\n // Raised: the banner is its own layer above the screen background.\n surface: \"shadow-m\",\n // Flush: for a banner already inside a raised surface, where a second\n // elevation would read as a card stacked on a card.\n flat: \"shadow-none border-border-muted border\",\n },\n },\n defaultVariants: { size: \"md\", variant: \"surface\" },\n },\n { twMerge: false },\n);\n\ntype MessageVariantProps = VariantProps<typeof messageFrameVariants>;\ntype MessageSize = NonNullable<MessageVariantProps[\"size\"]>;\nexport type MessageVariant = NonNullable<MessageVariantProps[\"variant\"]>;\n\nconst ICON_SIZE: Record<MessageSize, number> = { sm: 20, md: 24, lg: 28 };\nconst DISMISS_BUTTON_SIZE: Record<MessageSize, number> = {\n sm: 24,\n md: 40,\n lg: 40,\n};\n\ninterface MessageBaseProps {\n accent: Accent;\n size?: MessageSize;\n /**\n * \"surface\" (default) is a raised banner. Use \"flat\" only when the message\n * already sits inside a raised surface (a Modal footer, a Surface card).\n */\n variant?: MessageVariant;\n icon: SVGIconElement;\n children?: ReactNode;\n}\ninterface MessagePropsWithDismiss extends MessageBaseProps {\n onDismiss: () => void;\n dismissIconAriaLabel: string;\n}\ninterface MessagePropsWithoutDismiss extends MessageBaseProps {\n onDismiss?: undefined;\n dismissIconAriaLabel?: undefined;\n}\n\nexport type MessageProps = MessagePropsWithDismiss | MessagePropsWithoutDismiss;\n\nexport function Message({\n icon,\n size = \"md\",\n variant,\n accent,\n children,\n onDismiss,\n dismissIconAriaLabel,\n}: MessageProps): ReactNode {\n const dismissDiameter = DISMISS_BUTTON_SIZE[size];\n return (\n <AccentScope accent={accent}>\n <Box className={messageFrameVariants({ size, variant })}>\n <Icon icon={icon} size={ICON_SIZE[size]} className=\"text-accent\" />\n {/* React Native defaults flexShrink to 0: without `shrink` the text\n keeps its content width and pushes the dismiss button out of the\n frame instead of wrapping. */}\n <Text className=\"text-sharp shrink grow\">{children}</Text>\n {onDismiss ? (\n <Box\n style={{ width: dismissDiameter, height: dismissDiameter }}\n className=\"shrink-0 flex-center\"\n >\n <IconButton\n icon={<XRegularIcon />}\n iconSize={size === \"sm\" ? \"fill\" : undefined}\n size={dismissDiameter}\n variant=\"ghost\"\n aria-label={dismissIconAriaLabel}\n onPress={onDismiss}\n />\n </Box>\n ) : null}\n </Box>\n </AccentScope>\n );\n}\n\ntype AccentMessageProps = Except<MessageProps, \"accent\" | \"icon\">;\n\nexport function InfoMessage(props: AccentMessageProps): ReactNode {\n return <Message {...props} accent=\"info\" icon={<InfoRegularIcon />} />;\n}\n\nexport function ConfirmationMessage(props: AccentMessageProps): ReactNode {\n return <Message {...props} accent=\"success\" icon={<CheckRegularIcon />} />;\n}\n\nexport function WarningMessage(props: AccentMessageProps): ReactNode {\n return <Message {...props} accent=\"warning\" icon={<WarningRegularIcon />} />;\n}\n\nexport function ErrorMessage(props: AccentMessageProps): ReactNode {\n return <Message {...props} accent=\"danger\" icon={<WarningDuotoneIcon />} />;\n}\n","import type { ReactNode } from \"react\";\nimport { ErrorMessage, type MessageVariant } from \"../feedback/Message\";\nimport { View } from \"../primitives/View\";\n\nexport interface CollapsibleErrorMessageProps {\n error: Error | null;\n errorToMessage: (error: unknown) => string;\n /** Forwarded to the message: \"flat\" when the caller is inside a surface. */\n variant?: MessageVariant;\n}\n\n// Collapsed, the message is taken out of the flow rather than merely zero-\n// height: an in-flow child would still lend its parent its own intrinsic width,\n// sizing a button to the width of a message nobody can see — and in a row (a\n// modal footer) that width squeezes the sibling buttons.\nexport function CollapsibleErrorMessage({\n error,\n errorToMessage,\n variant,\n}: CollapsibleErrorMessageProps): ReactNode {\n return (\n <View\n role=\"alert\"\n className={`overflow-hidden transition-[height,opacity] duration-collapse ${\n error ? \"p-sm h-auto opacity-100\" : \"absolute h-0 opacity-0\"\n }`}\n >\n {/* Mounted empty rather than filled-and-hidden: a live region only\n announces content added after it exists, and `errorToMessage` is never\n called with a null error. */}\n {error === null ? null : (\n <ErrorMessage size=\"sm\" variant={variant}>\n {errorToMessage(error)}\n </ErrorMessage>\n )}\n </View>\n );\n}\n","import { useEffect, useReducer, useRef } from \"react\";\nimport type { GestureResponderEvent } from \"react-native\";\nimport type { ButtonState } from \"./Button\";\n\nexport const settledDisplayDurationMs = 4000;\n\ninterface PressAsyncState {\n buttonState: ButtonState | undefined;\n error: Error | null;\n}\n\ntype PressAsyncAction =\n | { type: \"reject\"; error: Error }\n | { type: \"resolve\" }\n | { type: \"settledTimeout\" }\n | { type: \"start\" };\n\nconst idleState: PressAsyncState = { buttonState: undefined, error: null };\n\nfunction pressAsyncReducer(\n previousState: PressAsyncState,\n action: PressAsyncAction,\n): PressAsyncState {\n switch (action.type) {\n case \"start\":\n return { buttonState: \"loading\", error: null };\n case \"resolve\":\n return { buttonState: \"success\", error: null };\n case \"reject\":\n return { buttonState: \"failed\", error: action.error };\n case \"settledTimeout\":\n return { buttonState: undefined, error: previousState.error };\n default:\n throw new Error(`Unhandled action: ${JSON.stringify(action)}`);\n }\n}\n\nexport interface UsePressAsyncResult extends PressAsyncState {\n handlePress: (event: GestureResponderEvent) => void;\n}\n\nexport function usePressAsync(\n onPress: (event: GestureResponderEvent) => unknown,\n): UsePressAsyncResult {\n const [pressAsyncState, dispatch] = useReducer(pressAsyncReducer, idleState);\n const settledTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n return () => {\n clearTimeout(settledTimerRef.current);\n };\n }, []);\n\n function handlePress(event: GestureResponderEvent): void {\n if (pressAsyncState.buttonState === \"loading\") return;\n clearTimeout(settledTimerRef.current);\n const result = onPress(event);\n if (!(result instanceof Promise)) return;\n dispatch({ type: \"start\" });\n\n function scheduleSettledTimeout(): void {\n settledTimerRef.current = setTimeout(() => {\n dispatch({ type: \"settledTimeout\" });\n }, settledDisplayDurationMs);\n }\n\n result\n .then(() => {\n dispatch({ type: \"resolve\" });\n scheduleSettledTimeout();\n })\n .catch((caughtError: unknown) => {\n const normalizedError =\n caughtError instanceof Error\n ? caughtError\n : new Error(String(caughtError));\n // eslint-disable-next-line no-console\n console.error(\n \"Unexpected error caught in usePressAsync\",\n normalizedError,\n );\n dispatch({ type: \"reject\", error: normalizedError });\n scheduleSettledTimeout();\n });\n }\n\n return { ...pressAsyncState, handlePress };\n}\n","import { CheckRegularIcon } from \"alouette-icons/phosphor-icons/CheckRegularIcon\";\nimport { InfoRegularIcon } from \"alouette-icons/phosphor-icons/InfoRegularIcon\";\nimport { QuestionRegularIcon } from \"alouette-icons/phosphor-icons/QuestionRegularIcon\";\nimport { WarningRegularIcon } from \"alouette-icons/phosphor-icons/WarningRegularIcon\";\nimport { type ReactNode, useId } from \"react\";\nimport type { GestureResponderEvent } from \"react-native\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { Button, type ButtonState } from \"../actions/Button\";\nimport { CollapsibleErrorMessage } from \"../actions/CollapsibleErrorMessage\";\nimport { usePressAsync } from \"../actions/usePressAsync\";\nimport type { SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\nimport { HStack, VStack } from \"../stacks/stacks\";\nimport { Modal, type ModalProps } from \"./Modal\";\n\nfunction noop(): void {\n // Intentionally empty.\n}\n\ninterface AsyncActionProps {\n /**\n * Called when the user takes the action. Returning a promise puts the button\n * in its loading state and locks the dialog until it settles — the cancel\n * button is disabled and backdrop / Escape / Android back stop dismissing, so\n * the action can't be cut short and a failure can't be scrolled away.\n */\n onConfirm: () => unknown;\n /**\n * Formats a rejection from {@link onConfirm} into the message shown in the\n * footer. Without it a failure only flips the button to its failed state —\n * the library can't provide a default without hardcoding an English string.\n */\n errorToMessage?: (error: unknown) => string;\n}\n\ninterface AlertDialogBaseProps extends Pick<ModalProps, \"size\" | \"testID\"> {\n /** Whether the dialog is shown. */\n visible: boolean;\n /** Heading; also labels the dialog for assistive tech. */\n title: string;\n /** Body copy describing the situation or the consequence of confirming. */\n children?: ReactNode;\n /** Themes the icon and the primary button. Defaults to \"danger\". */\n accent?: Accent;\n /**\n * Icon shown in the header, signalling the nature of the dialog. Prefer a\n * usage component ({@link QuestionAlertDialog}, {@link WarningAlertDialog},\n * {@link InfoAlertDialog}, {@link SuccessAlertDialog}) which supplies it.\n */\n icon: SVGIconElement;\n}\n\ninterface ConfirmAlertDialogProps\n extends AlertDialogBaseProps, AsyncActionProps {\n /**\n * \"confirm\" (default) offers a cancel and a confirm action — for decisions,\n * typically destructive ones.\n */\n variant?: \"confirm\";\n /**\n * Called when the user rejects the action — cancel button, backdrop, Escape,\n * or the Android back button.\n */\n onCancel: () => void;\n /** Confirm button label. Defaults to \"Confirm\". */\n confirmText?: ReactNode;\n /** Cancel button label. Defaults to \"Cancel\". */\n cancelText?: ReactNode;\n /** Disables the confirm button (e.g. while a form is invalid). */\n confirmDisabled?: boolean;\n}\n\ninterface AcknowledgeAlertDialogProps extends AlertDialogBaseProps {\n /**\n * \"alert\" offers a single acknowledge action — for interruptions that only\n * need to be read and dismissed.\n */\n variant: \"alert\";\n /**\n * Called when the user dismisses the dialog — acknowledge button, backdrop,\n * Escape, or the Android back button.\n */\n onClose: () => void;\n /** Acknowledge button label. Defaults to \"OK\". */\n closeText?: ReactNode;\n}\n\ninterface RequiredAlertDialogProps\n extends AlertDialogBaseProps, AsyncActionProps {\n /**\n * \"required\" offers a single action and cannot be dismissed by the backdrop,\n * Escape, or the Android back button — the user must respond (e.g. accept\n * updated terms, a forced sign-out).\n */\n variant: \"required\";\n /** Action button label. Defaults to \"OK\". */\n confirmText?: ReactNode;\n /** Disables the action button (e.g. while a form is invalid). */\n confirmDisabled?: boolean;\n}\n\nexport type AlertDialogProps =\n | AcknowledgeAlertDialogProps\n | ConfirmAlertDialogProps\n | RequiredAlertDialogProps;\n\ninterface ResolvedVariant {\n /** Footer buttons for the variant. */\n footer: ReactNode;\n /**\n * Handler for the dialog's dismiss affordances (backdrop / Escape / Android\n * back): the rejecting action for confirm/alert, a no-op for required.\n */\n onDismiss: () => void;\n}\n\ninterface ActionFooterProps {\n /** The variant's buttons, in reading order. */\n children: ReactNode;\n errorToMessage: AsyncActionProps[\"errorToMessage\"];\n error: Error | null;\n}\n\n// Modal lays the footer out as a right-aligned row; a single full-width child\n// turns it into a column so the failure message spans the dialog instead of\n// being squeezed to the width of the button that triggered it.\nfunction ActionFooter({\n children,\n errorToMessage,\n error,\n}: ActionFooterProps): ReactNode {\n const errorMessage =\n errorToMessage === undefined ? null : (\n // The dialog panel is already a raised surface, so the message is flat.\n <CollapsibleErrorMessage\n error={error}\n errorToMessage={errorToMessage}\n variant=\"flat\"\n />\n );\n return (\n <VStack className=\"w-full gap-sm\">\n <HStack className=\"items-center justify-end gap-m\">{children}</HStack>\n {errorMessage}\n </VStack>\n );\n}\n\ninterface ResolveVariantParams {\n accent: Accent;\n /** State of the confirm action, driven by `usePressAsync`. */\n buttonState: ButtonState | undefined;\n error: Error | null;\n isPending: boolean;\n handleConfirm: (event: GestureResponderEvent) => void;\n}\n\n// Resolves the variant-specific footer and dismiss handler outside the\n// component so its discriminated props can be narrowed by destructuring.\nfunction resolveVariant(\n props: AlertDialogProps,\n {\n accent,\n buttonState,\n error,\n isPending,\n handleConfirm,\n }: ResolveVariantParams,\n): ResolvedVariant {\n switch (props.variant) {\n case \"alert\": {\n const { onClose, closeText } = props;\n return {\n onDismiss: onClose,\n footer: (\n <Button accent={accent} text={closeText ?? \"OK\"} onPress={onClose} />\n ),\n };\n }\n case \"required\": {\n const { confirmText, confirmDisabled, errorToMessage } = props;\n return {\n // Non-dismissible: only the explicit action closes it.\n onDismiss: noop,\n footer: (\n <ActionFooter error={error} errorToMessage={errorToMessage}>\n <Button\n accent={accent}\n text={confirmText ?? \"OK\"}\n state={buttonState}\n disabled={confirmDisabled}\n onPress={handleConfirm}\n />\n </ActionFooter>\n ),\n };\n }\n case \"confirm\":\n case undefined:\n default: {\n const {\n onCancel,\n confirmText,\n cancelText,\n confirmDisabled,\n errorToMessage,\n } = props;\n return {\n onDismiss: isPending ? noop : onCancel,\n footer: (\n <ActionFooter error={error} errorToMessage={errorToMessage}>\n <Button\n variant=\"outlined\"\n text={cancelText ?? \"Cancel\"}\n disabled={isPending}\n onPress={onCancel}\n />\n <Button\n accent={accent}\n text={confirmText ?? \"Confirm\"}\n state={buttonState}\n disabled={confirmDisabled}\n onPress={handleConfirm}\n />\n </ActionFooter>\n ),\n };\n }\n }\n}\n\n// The alert variant has no confirm action; its single button closes the dialog\n// synchronously and never drives the async state.\nfunction resolveConfirmHandler(props: AlertDialogProps): () => unknown {\n return props.variant === \"alert\" ? noop : props.onConfirm;\n}\n\nexport function AlertDialog(props: AlertDialogProps): ReactNode {\n const {\n visible,\n title,\n children,\n accent = \"danger\",\n icon,\n size = \"md\",\n testID,\n } = props;\n const descriptionId = useId();\n const { buttonState, error, handlePress } = usePressAsync(\n resolveConfirmHandler(props),\n );\n const isPending = buttonState === \"loading\";\n const { footer, onDismiss } = resolveVariant(props, {\n accent,\n buttonState,\n error,\n isPending,\n handleConfirm: handlePress,\n });\n\n return (\n <Modal\n hideCloseButton\n visible={visible}\n role=\"alertdialog\"\n accent={accent}\n size={size}\n title={title}\n icon={icon}\n aria-describedby={children === undefined ? undefined : descriptionId}\n testID={testID}\n footer={footer}\n onClose={onDismiss}\n >\n {children === undefined ? null : (\n <Text nativeID={descriptionId} className=\"text-base text-muted\">\n {children}\n </Text>\n )}\n </Modal>\n );\n}\n\n// Omit that distributes over the union so each variant keeps its own props.\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown\n ? Omit<T, K>\n : never;\n\n// Icon is fixed by the usage component; the accent stays the caller's choice.\nexport type AlertDialogUsageProps = DistributiveOmit<AlertDialogProps, \"icon\">;\n\nexport function QuestionAlertDialog(props: AlertDialogUsageProps): ReactNode {\n return <AlertDialog {...props} icon={<QuestionRegularIcon />} />;\n}\n\nexport function WarningAlertDialog(props: AlertDialogUsageProps): ReactNode {\n return <AlertDialog {...props} icon={<WarningRegularIcon />} />;\n}\n\nexport function InfoAlertDialog(props: AlertDialogUsageProps): ReactNode {\n return <AlertDialog {...props} icon={<InfoRegularIcon />} />;\n}\n\nexport function SuccessAlertDialog(props: AlertDialogUsageProps): ReactNode {\n return <AlertDialog {...props} icon={<CheckRegularIcon />} />;\n}\n","import { ArrowSquareOutRegularIcon } from \"alouette-icons/phosphor-icons/ArrowSquareOutRegularIcon\";\nimport type { ReactNode } from \"react\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { ExternalLink } from \"../../expo/ExternalLink\";\nimport {\n type ExternalOpenLinkBehavior,\n defaultExternalOpenLinkBehavior,\n} from \"../../expo/ExternalLink.shared\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { InteractiveBox, type InteractiveBoxProps } from \"../containers/Box\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\n\n// Native resolves the icon tint through useColorToken, which reads the base\n// `text-*` only, so the group-driven hover/active tint is web-only.\nconst externalLinkTextVariants = tv(\n {\n slots: {\n frame:\n \"group flex-row items-center gap-xxs self-start rounded-xs py-xxs focus-visible:outline-interactive-outlined-outline-focus\",\n text: \"shrink font-body-bold underline transition-[color] duration-fast ease-in\",\n icon: \"\",\n },\n variants: {\n size: {\n sm: { text: \"text-sm\" },\n md: { text: \"text-base\" },\n },\n disabled: {\n true: {\n text: \"text-disabled-muted\",\n icon: \"text-disabled-muted\",\n },\n false: {\n text: \"text-interactive-pressable group-hover:text-interactive-hover group-active:text-interactive-active\",\n icon: \"text-interactive-pressable group-hover:text-interactive-hover group-active:text-interactive-active\",\n },\n },\n },\n defaultVariants: { size: \"md\", disabled: false },\n },\n { twMerge: false },\n);\n\ntype ExternalLinkTextSizeProps = Pick<\n VariantProps<typeof externalLinkTextVariants>,\n \"size\"\n>;\n\nexport interface ExternalLinkTextProps\n extends Omit<InteractiveBoxProps, \"children\">, ExternalLinkTextSizeProps {\n href: string;\n /** How the link opens. Defaults to an in-app browser sheet / a new tab. */\n openLinkBehavior?: ExternalOpenLinkBehavior;\n text: ReactNode;\n /** Leading affordance icon. Defaults to the external-link arrow. */\n icon?: SVGIconElement;\n accent?: Accent;\n}\n\n/**\n * Inline text link to an external destination — the lightweight alternative to\n * `ExternalLinkButton` when the link is part of a text flow rather than a call\n * to action.\n */\nexport function ExternalLinkText({\n href,\n openLinkBehavior = defaultExternalOpenLinkBehavior,\n text,\n icon = <ArrowSquareOutRegularIcon />,\n accent,\n size = \"md\",\n disabled,\n className,\n onPress,\n ...pressableProps\n}: ExternalLinkTextProps): ReactNode {\n const isDisabled = disabled === true;\n const styles = externalLinkTextVariants({ size, disabled: isDisabled });\n\n return (\n <AccentScope accent={accent}>\n <ExternalLink\n withFocusVisibleOutline\n as={InteractiveBox}\n // A disabled Pressable never sees the press that would cancel the\n // navigation, so the href has to go with it — ExternalLink drops a\n // falsy one on both platforms.\n href={isDisabled ? \"\" : href}\n openLinkBehavior={openLinkBehavior}\n role=\"link\"\n aria-disabled={isDisabled}\n disabled={disabled}\n className={styles.frame({ className })}\n onPress={onPress ?? undefined}\n {...pressableProps}\n >\n <Icon\n icon={icon}\n size={size === \"sm\" ? 16 : 20}\n className={styles.icon()}\n />\n <Text className={styles.text()}>{text}</Text>\n </ExternalLink>\n </AccentScope>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { GestureResponderEvent } from \"react-native\";\nimport type { MessageVariant } from \"../feedback/Message\";\nimport { VStack } from \"../stacks/stacks\";\nimport { Button, type ButtonProps } from \"./Button\";\nimport { CollapsibleErrorMessage } from \"./CollapsibleErrorMessage\";\nimport { usePressAsync } from \"./usePressAsync\";\n\nexport interface ActionButtonProps extends Omit<\n ButtonProps,\n \"onPress\" | \"state\"\n> {\n onPress: (event: GestureResponderEvent) => unknown;\n errorToMessage: (error: unknown) => string;\n /**\n * Elevation of the failure message. Defaults to the raised \"surface\"; pass\n * \"flat\" when the button already sits inside a raised surface.\n */\n errorMessageVariant?: MessageVariant;\n}\n\nexport function ActionButton({\n onPress,\n errorToMessage,\n errorMessageVariant,\n ...buttonProps\n}: ActionButtonProps): ReactNode {\n const { buttonState, error, handlePress } = usePressAsync(onPress);\n\n return (\n <VStack className=\"shrink\">\n <Button {...buttonProps} state={buttonState} onPress={handlePress} />\n <CollapsibleErrorMessage\n error={error}\n errorToMessage={errorToMessage}\n variant={errorMessageVariant}\n />\n </VStack>\n );\n}\n","import { forwardRef } from \"react\";\nimport {\n Platform,\n TextInput as RNTextInput,\n type TextInputProps as RNTextInputProps,\n} from \"react-native\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport { useColorVariable } from \"../../core/useColorToken\";\n\nconst inputVariants = tv(\n {\n base: [\n \"bg-highlight text-base text-sharp\",\n \"border\",\n \"transition-[border-color,background-color,outline-color] duration-fast ease-in\",\n \"outline-interactive-outlined-pressable\", // to have proper outline color transition\n process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? \"\"\n : \"border-interactive-outlined-pressable\",\n \"hover:border-interactive-outlined-hover\",\n \"focus:border-interactive-outlined-focus\",\n \"focus:outline-1 focus:outline-interactive-outlined-focus focus:outline-offset-0\",\n \"active:border-interactive-outlined-active\",\n \"disabled:bg-disabled-interactive-muted disabled:border-interactive-outlined-disabled disabled:text-form-disabled-text disabled:cursor-not-allowed\",\n \"placeholder:text-form-placeholder\",\n ].join(\" \"),\n variants: {\n multiline: {\n false: \"min-h-[44px] rounded-md px-m py-xs\",\n true: \"min-h-[80px] resize-y rounded-xs px-xs py-xs\",\n },\n forceStyle: {\n undefined: process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? \"border-interactive-outlined-pressable\"\n : \"\",\n hover: process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? \"border-interactive-outlined-hover\"\n : \"\",\n focus: process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? \"border-interactive-outlined-focus outline-1 outline-interactive-outlined-focus outline-offset-0\"\n : \"\",\n press: process.env.EXPO_PUBLIC_STORYBOOK_ENABLED\n ? \"border-interactive-outlined-active\"\n : \"\",\n },\n },\n defaultVariants: {\n forceStyle: \"undefined\",\n },\n },\n { twMerge: false },\n);\n\ntype InputVariantProps = VariantProps<typeof inputVariants>;\n\nconst MODE_PROPS = {\n password: {\n secureTextEntry: true,\n autoComplete: \"current-password\",\n },\n number: {\n inputMode: \"numeric\",\n keyboardType: \"numeric\",\n },\n tel: {\n inputMode: \"tel\",\n autoComplete: \"tel\",\n keyboardType: \"phone-pad\",\n },\n email: {\n inputMode: \"email\",\n autoComplete: \"email\",\n keyboardType: \"email-address\",\n },\n url: {\n inputMode: \"url\",\n keyboardType: \"url\",\n },\n search: {\n inputMode: \"search\",\n },\n webSearch: {\n inputMode: \"search\",\n keyboardType: \"web-search\",\n },\n} as const satisfies Record<string, Partial<RNTextInputProps>>;\n\nexport type InputTextMode = keyof typeof MODE_PROPS;\n\nexport interface InputTextProps\n extends Omit<RNTextInputProps, \"editable\">, InputVariantProps {\n className?: string;\n disabled?: boolean;\n mode?: InputTextMode;\n}\n\nexport const InputText = forwardRef<RNTextInput, InputTextProps>(\n ({ className, disabled, mode, multiline, forceStyle, ...props }, ref) => {\n const placeholderColor =\n Platform.OS === \"web\"\n ? undefined\n : // eslint-disable-next-line react-hooks/rules-of-hooks -- native only, web is set via css.\n useColorVariable(\"--color-form-placeholder\");\n const modeProps = mode ? MODE_PROPS[mode] : undefined;\n return (\n <RNTextInput\n ref={ref}\n editable={!disabled}\n disabled={disabled}\n aria-disabled={disabled === true}\n multiline={multiline === true}\n placeholderTextColor={placeholderColor}\n className={inputVariants({ multiline, forceStyle, className })}\n {...modeProps}\n {...props}\n />\n );\n },\n);\n","import { forwardRef } from \"react\";\nimport type { TextInput as RNTextInput } from \"react-native\";\nimport { InputText, type InputTextProps } from \"./InputText\";\n\nexport type TextAreaProps = Omit<InputTextProps, \"multiline\">;\n\nexport const TextArea = forwardRef<RNTextInput, TextAreaProps>((props, ref) => {\n return <InputText ref={ref} multiline {...props} />;\n});\n","import { type ReactNode, useCallback, useState } from \"react\";\nimport { Switch as RNSwitch } from \"react-native\";\nimport { useColorVariable } from \"../../core/useColorToken\";\nimport { AccentScope, type AccentScopeProps } from \"../containers/AccentScope\";\n\nexport interface SwitchProps {\n accent?: AccentScopeProps[\"accent\"];\n checked?: boolean;\n disabled?: boolean;\n onValueChange?: (value: boolean) => void;\n \"aria-labelledby\"?: string;\n testID?: string;\n}\n\nfunction useControllableChecked(\n controlled: boolean | undefined,\n onValueChange?: (value: boolean) => void,\n): readonly [boolean, (next: boolean) => void] {\n const [internal, setInternal] = useState(controlled ?? false);\n const value = controlled ?? internal;\n const onChange = useCallback(\n (next: boolean) => {\n if (controlled === undefined) {\n setInternal(next);\n }\n if (next !== value) {\n onValueChange?.(next);\n }\n },\n [controlled, onValueChange, value],\n );\n return [value, onChange] as const;\n}\n\nfunction SwitchInner({\n checked,\n disabled,\n onValueChange,\n ...props\n}: SwitchProps): ReactNode {\n const [value, setValue] = useControllableChecked(checked, onValueChange);\n const trackBg = useColorVariable(\"--color-lowered\");\n const thumb = useColorVariable(\"--color-highlight\");\n const disabledTrackBg = useColorVariable(\n \"--color-disabled-interactive-muted\",\n );\n const disabledThumb = useColorVariable(\"--color-disabled-muted\");\n const track = disabled ? disabledTrackBg : trackBg;\n const thumbColor = disabled ? disabledThumb : thumb;\n return (\n <RNSwitch\n value={value}\n disabled={disabled}\n ios_backgroundColor={track}\n trackColor={{ false: track, true: track }}\n thumbColor={thumbColor}\n onValueChange={setValue}\n {...props}\n />\n );\n}\n\nexport function Switch({ accent, ...rest }: SwitchProps): ReactNode {\n return (\n <AccentScope accent={accent}>\n <SwitchInner {...rest} />\n </AccentScope>\n );\n}\n","import { useCallback, useState } from \"react\";\n\nexport interface UseControllableValueParams {\n value: string | undefined;\n defaultValue: string | undefined;\n onValueChange?: (value: string) => void;\n}\n\nexport function useControllableValue({\n value: controlledValue,\n defaultValue,\n onValueChange,\n}: UseControllableValueParams): readonly [\n string | undefined,\n (next: string) => void,\n] {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = controlledValue ?? internalValue;\n const setValue = useCallback(\n (next: string) => {\n if (controlledValue === undefined) {\n setInternalValue(next);\n }\n if (next !== value) {\n onValueChange?.(next);\n }\n },\n [controlledValue, onValueChange, value],\n );\n return [value, setValue] as const;\n}\n","import { CaretDownRegularIcon } from \"alouette-icons/phosphor-icons/CaretDownRegularIcon\";\nimport type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { Icon } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\n\nexport interface SelectOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n options: SelectOption[];\n /** Controlled selected value. */\n value?: string;\n /** Initial value for uncontrolled usage. */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n accent?: Accent;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n testID?: string;\n}\n\n// Shared outlined-input look for the trigger, matching InputText. Focus styling\n// and the background are platform-specific (the background lives in each\n// platform's enabled/disabled variant so the disabled bg never competes with\n// bg-highlight at equal specificity), so they are applied by each platform file.\nexport const selectTriggerBaseClassName = [\n \"flex-row items-center justify-between gap-xs\",\n \"rounded-md border px-m py-xs min-h-[44px]\",\n \"transition-[border-color,outline-color,background-color] duration-fast ease-in\",\n].join(\" \");\n\nconst triggerLabelVariants = tv({\n base: \"flex-1 text-base\",\n variants: {\n // Mirrors InputText: sharp value, form-placeholder, form-disabled-text.\n state: {\n value: \"text-sharp\",\n placeholder: \"text-form-placeholder\",\n disabled: \"text-form-disabled-text\",\n },\n },\n defaultVariants: { state: \"value\" },\n});\n\nexport interface SelectTriggerContentProps {\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport function SelectTriggerContent({\n label,\n placeholder,\n disabled,\n}: SelectTriggerContentProps): ReactNode {\n const state = ((): \"disabled\" | \"placeholder\" | \"value\" => {\n // Placeholder keeps its own color even when disabled (mirrors InputText,\n // whose placeholderTextColor is independent of the disabled text color);\n // only an actual value switches to the darker disabled text color.\n if (label === undefined) return \"placeholder\";\n if (disabled) return \"disabled\";\n return \"value\";\n })();\n return (\n <>\n <Text numberOfLines={1} className={triggerLabelVariants({ state })}>\n {label ?? placeholder ?? \"\"}\n </Text>\n <Icon\n icon={<CaretDownRegularIcon />}\n size={18}\n className={disabled ? \"text-form-disabled-text\" : \"text-muted\"}\n />\n </>\n );\n}\n","import { CheckRegularIcon } from \"alouette-icons/phosphor-icons/CheckRegularIcon\";\nimport { type ReactNode, useState } from \"react\";\nimport { Modal, Pressable, useWindowDimensions } from \"react-native\";\nimport { tv } from \"tailwind-variants\";\nimport { useControllableValue } from \"../../core/useControllableValue\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { InteractiveBox } from \"../containers/Box\";\nimport { Surface } from \"../containers/Surface\";\nimport { Icon } from \"../primitives/Icon\";\nimport { ScrollView } from \"../primitives/ScrollView\";\nimport { Text } from \"../primitives/Text\";\nimport {\n type SelectOption,\n type SelectProps,\n SelectTriggerContent,\n selectTriggerBaseClassName,\n} from \"./Select.shared\";\n\nconst triggerVariants = tv(\n {\n base: selectTriggerBaseClassName,\n variants: {\n // bg lives in each branch (not the shared base) so the disabled bg never\n // competes with bg-highlight at equal specificity.\n disabled: {\n true: \"bg-disabled-interactive-muted border-interactive-outlined-disabled\",\n false: [\n \"bg-highlight\",\n \"border-interactive-outlined-pressable\",\n \"hover:border-interactive-outlined-hover\",\n \"focus:border-interactive-outlined-focus\",\n \"active:border-interactive-outlined-active\",\n ].join(\" \"),\n },\n },\n defaultVariants: { disabled: false },\n },\n { twMerge: false },\n);\n\nconst optionVariants = tv(\n {\n base: [\n \"flex-row items-center justify-between gap-xxs rounded-xs px-m py-m my-xxs\",\n \"hover:bg-interactive-contained-hover focus:bg-interactive-contained-focus active:bg-interactive-contained-active\",\n ].join(\" \"),\n variants: {\n selected: {\n true: \"bg-interactive-contained-active\",\n false: \"bg-interactive-contained-pressable\",\n },\n disabled: {\n true: \"opacity-50\",\n false: \"\",\n },\n },\n defaultVariants: { selected: false, disabled: false },\n },\n { twMerge: false },\n);\n\ninterface SelectOptionRowProps {\n option: SelectOption;\n selected: boolean;\n onSelect: (value: string) => void;\n}\n\nfunction SelectOptionRow({\n option,\n selected,\n onSelect,\n}: SelectOptionRowProps): ReactNode {\n return (\n <Pressable\n role=\"option\"\n aria-selected={selected}\n aria-disabled={option.disabled === true}\n disabled={option.disabled}\n className={optionVariants({ selected, disabled: option.disabled })}\n onPress={() => {\n onSelect(option.value);\n }}\n >\n <Text numberOfLines={1} className=\"flex-1 text-base text-on-accent\">\n {option.label}\n </Text>\n {selected ? (\n <Icon\n icon={<CheckRegularIcon />}\n size={18}\n className=\"text-on-accent\"\n />\n ) : null}\n </Pressable>\n );\n}\n\nfunction SelectInner({\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder,\n disabled,\n testID,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n}: Omit<SelectProps, \"accent\">): ReactNode {\n const [current, setValue] = useControllableValue({\n value,\n defaultValue,\n onValueChange,\n });\n const [open, setOpen] = useState(false);\n const { height: windowHeight } = useWindowDimensions();\n const selected = options.find((option) => option.value === current);\n\n const onSelect = (next: string) => {\n setValue(next);\n setOpen(false);\n };\n\n return (\n <>\n <InteractiveBox\n withFocusVisibleOutline\n role=\"combobox\"\n aria-expanded={open}\n aria-disabled={disabled === true}\n disabled={disabled}\n testID={testID}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n className={triggerVariants({ disabled })}\n onPress={() => {\n setOpen(true);\n }}\n >\n <SelectTriggerContent\n label={selected?.label}\n placeholder={placeholder}\n disabled={disabled}\n />\n </InteractiveBox>\n <Modal\n transparent\n visible={open}\n animationType=\"fade\"\n onRequestClose={() => {\n setOpen(false);\n }}\n >\n <Pressable\n className=\"flex-1 justify-center bg-translucent px-xl\"\n onPress={() => {\n setOpen(false);\n }}\n >\n {/* Captures presses so tapping the list does not dismiss the modal. */}\n <Pressable className=\"w-full\" aria-label={ariaLabel}>\n <Surface variant=\"highlight\" shadow=\"l\" size=\"sm\" className=\"py-xs\">\n {/* Pixel maxHeight (not a %) so the ScrollView sizes to its\n content and only scrolls once it exceeds ~70% of the screen. */}\n <ScrollView\n style={{ maxHeight: windowHeight * 0.7 }}\n showsVerticalScrollIndicator={false}\n >\n {options.map((option) => (\n <SelectOptionRow\n key={option.value}\n option={option}\n selected={option.value === current}\n onSelect={onSelect}\n />\n ))}\n </ScrollView>\n </Surface>\n </Pressable>\n </Pressable>\n </Modal>\n </>\n );\n}\n\nexport function Select({ accent, ...rest }: SelectProps): ReactNode {\n return (\n <AccentScope accent={accent}>\n <SelectInner {...rest} />\n </AccentScope>\n );\n}\n","import type { Provider, ReactNode } from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { useControllableValue } from \"../../core/useControllableValue\";\n\nexport interface SelectionContextValue {\n value: string | undefined;\n onSelect: (value: string) => void;\n disabled?: boolean;\n /** Tighter horizontal padding, for a group holding many options. */\n compact?: boolean;\n}\n\nexport interface SelectionGroupProps {\n /** Controlled selected value. */\n value?: string;\n /** Initial value for uncontrolled usage. */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n accent?: Accent;\n disabled?: boolean;\n \"aria-labelledby\"?: string;\n children: ReactNode;\n}\n\ninterface SelectionContext {\n SelectionContextProvider: Provider<SelectionContextValue | undefined>;\n useSelection: () => SelectionContextValue;\n}\n\n/** One context per group family, so a misplaced child gets a precise error. */\nexport function createSelectionContext(\n missingProviderMessage: string,\n): SelectionContext {\n const Context = createContext<SelectionContextValue | undefined>(undefined);\n return {\n SelectionContextProvider: Context.Provider,\n useSelection: () => {\n const context = useContext(Context);\n if (!context) {\n throw new Error(missingProviderMessage);\n }\n return context;\n },\n };\n}\n\nexport interface SelectionValueProps extends Pick<\n SelectionGroupProps,\n \"defaultValue\" | \"disabled\" | \"onValueChange\" | \"value\"\n> {\n compact?: boolean;\n}\n\nexport function useSelectionValue({\n value: controlledValue,\n defaultValue,\n onValueChange,\n disabled,\n compact,\n}: SelectionValueProps): SelectionContextValue {\n const [value, onSelect] = useControllableValue({\n value: controlledValue,\n defaultValue,\n onValueChange,\n });\n return useMemo(\n () => ({ value, onSelect, disabled, compact }),\n [value, onSelect, disabled, compact],\n );\n}\n","import { createSelectionContext } from \"../selection/SelectionContext\";\n\nexport const {\n SelectionContextProvider: RadioContextProvider,\n useSelection: useRadioContext,\n} = createSelectionContext(\n \"Radio, RadioButton and RadioCard must be rendered inside a RadioGroup, RadioButtonGroup or RadioCardGroup.\",\n);\n","import type { ReactNode } from \"react\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { View } from \"../primitives/View\";\nimport {\n type SelectionGroupProps,\n useSelectionValue,\n} from \"../selection/SelectionContext\";\nimport { RadioContextProvider } from \"./RadioContext\";\n\nexport type RadioGroupProps = SelectionGroupProps;\n\nexport function RadioGroup({\n value,\n defaultValue,\n onValueChange,\n accent,\n disabled,\n children,\n ...props\n}: RadioGroupProps): ReactNode {\n const context = useSelectionValue({\n value,\n defaultValue,\n onValueChange,\n disabled,\n });\n\n return (\n <AccentScope accent={accent}>\n <RadioContextProvider value={context}>\n <View role=\"radiogroup\" {...props}>\n {children}\n </View>\n </RadioContextProvider>\n </AccentScope>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useCurrentMode, useCurrentTheme } from \"../../core/ThemeContext\";\nimport { ScopedTheme } from \"./ScopedTheme\";\n\nexport interface DefaultAccentScopeProps {\n children?: ReactNode;\n}\n\n/**\n * Falls back to the brand accent when the subtree sits in a plain light/dark\n * theme, so an accent-driven element (a radio dot, a selected card) is tinted\n * instead of grayscale. An accent already applied by an ancestor wins.\n */\nexport function DefaultAccentScope({\n children,\n}: DefaultAccentScopeProps): ReactNode {\n const currentTheme = useCurrentTheme();\n const currentMode = useCurrentMode();\n return (\n <ScopedTheme\n theme={\n currentTheme === currentMode ? `${currentTheme}_brand` : currentTheme\n }\n >\n {children}\n </ScopedTheme>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport { DefaultAccentScope } from \"../containers/DefaultAccentScope\";\nimport { View } from \"../primitives/View\";\n\nconst radioIndicatorVariants = tv({\n slots: {\n ring: \"size-[22px] rounded-full border-2 items-center justify-center transition-[border-color] duration-fast ease-in\",\n dot: \"size-[10px] rounded-full bg-accent transition-transform duration-fast ease-in\",\n },\n variants: {\n selected: {\n true: { ring: \"border-accent\", dot: \"scale-100\" },\n false: {\n ring: \"border-interactive-outlined-pressable group-hover:border-interactive-outlined-hover group-active:border-interactive-outlined-active\",\n dot: \"scale-0\",\n },\n },\n onAccent: {\n true: { ring: \"border-on-accent\", dot: \"bg-on-accent\" },\n false: {},\n },\n disabled: {\n true: {\n ring: \"border-interactive-outlined-disabled\",\n dot: \"bg-disabled-muted\",\n },\n false: {},\n },\n },\n // On the disabled contained fill, `interactive-outlined-disabled` is the same\n // color as the background — the ring needs the foreground disabled token the\n // label next to it already uses.\n compoundVariants: [\n {\n disabled: true,\n onAccent: true,\n class: { ring: \"border-disabled-sharp\", dot: \"bg-disabled-sharp\" },\n },\n ],\n});\n\nexport interface RadioIndicatorProps {\n selected: boolean;\n disabled?: boolean;\n /** Set on a filled surface (accent, or the disabled fill), where the accent\n * dot and the outlined tokens have no contrast. */\n onAccent?: boolean;\n}\n\n/**\n * Circle-dot indicator shared by Radio and RadioCard. Its hover/active colors\n * are driven by the `group` on the pressable row that contains it.\n */\nexport function RadioIndicator({\n selected,\n disabled,\n onAccent,\n}: RadioIndicatorProps): ReactNode {\n const styles = radioIndicatorVariants({ selected, disabled, onAccent });\n return (\n <DefaultAccentScope>\n <View className={styles.ring()}>\n <View className={styles.dot()} />\n </View>\n </DefaultAccentScope>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport { InteractiveBox } from \"../containers/Box\";\nimport { Text } from \"../primitives/Text\";\nimport { RadioIndicator } from \"../selection/RadioIndicator\";\nimport { useRadioContext } from \"./RadioContext\";\n\nconst labelVariants = tv({\n base: \"text-base\",\n variants: {\n disabled: {\n true: \"text-disabled-sharp\",\n false: \"text-sharp\",\n },\n },\n});\n\nexport interface RadioProps {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport function Radio({ value, label, disabled }: RadioProps): ReactNode {\n const {\n value: selectedValue,\n onSelect,\n disabled: groupDisabled,\n } = useRadioContext();\n const selected = selectedValue === value;\n const isDisabled = disabled === true || groupDisabled === true;\n\n return (\n <InteractiveBox\n withFocusVisibleOutline\n role=\"radio\"\n aria-checked={selected}\n aria-disabled={isDisabled}\n aria-label={label}\n disabled={isDisabled}\n className=\"group flex-row items-center gap-xs self-start rounded-xs px-xs min-h-11 focus-visible:outline-interactive-outlined-outline-focus\"\n onPress={() => {\n onSelect(value);\n }}\n >\n <RadioIndicator selected={selected} disabled={isDisabled} />\n <Text className={labelVariants({ disabled: isDisabled })}>{label}</Text>\n </InteractiveBox>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Surface, type SurfaceProps } from \"../containers/Surface\";\n\nexport interface SegmentedBarProps extends Omit<\n SurfaceProps,\n \"role\" | \"shadow\" | \"size\" | \"variant\"\n> {\n role: \"navigation\" | \"radiogroup\" | \"tablist\";\n}\n\n/**\n * Lowered track shared by every segmented group (RadioButtonGroup, NavBar, Tabs).\n * It is a 44px Surface with no vertical padding, so each item pressable fills the\n * full height (a 44px tap target) while rendering a shorter visible chip inside it.\n */\nexport function SegmentedBar({\n className,\n ...props\n}: SegmentedBarProps): ReactNode {\n return (\n <Surface\n variant=\"lowered\"\n size=\"sm\"\n className={`flex-row items-stretch self-start gap-xxs px-xs py-0 min-h-[44px] ${className ?? \"\"}`}\n {...props}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SegmentedBar } from \"../selection/SegmentedBar\";\nimport {\n type SelectionGroupProps,\n useSelectionValue,\n} from \"../selection/SelectionContext\";\nimport { RadioContextProvider } from \"./RadioContext\";\n\nexport interface RadioButtonGroupProps extends SelectionGroupProps {\n /** Tightens the horizontal padding so many options fit on one row. */\n compact?: boolean;\n}\n\nexport function RadioButtonGroup({\n value,\n defaultValue,\n onValueChange,\n accent,\n disabled,\n compact,\n children,\n ...props\n}: RadioButtonGroupProps): ReactNode {\n const context = useSelectionValue({\n value,\n defaultValue,\n onValueChange,\n disabled,\n compact,\n });\n\n return (\n <RadioContextProvider value={context}>\n <SegmentedBar role=\"radiogroup\" accent={accent} {...props}>\n {children}\n </SegmentedBar>\n </RadioContextProvider>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport { InteractiveBox, type InteractiveBoxProps } from \"../containers/Box\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\nimport { View } from \"../primitives/View\";\n\n// The selected chip is a raised layer that cross-fades on opacity so the\n// background and shadow animate together with no border. Swapping a bordered\n// variant instead would flash a border on the outgoing segment mid-transition.\nconst chipVariants = tv({\n base: \"absolute inset-0 rounded-xs transition-opacity duration-fast ease-in\",\n variants: {\n selected: {\n true: \"opacity-100\",\n false: \"opacity-0\",\n },\n disabled: {\n true: \"bg-interactive-contained-disabled\",\n false: \"bg-interactive-contained-pressable shadow-s\",\n },\n },\n});\n\n// The visible chip is shorter than the 44px pressable, so the lowered\n// SegmentedBar shows around it as an inset frame while the tap target stays\n// 44px. Its border is permanently transparent and only animates color on the\n// row's hover/active, driven by the `group` on the pressable.\nconst segmentVariants = tv({\n base: \"relative flex-row flex-center gap-xxs min-h-[32px] rounded-xs border border-transparent transition-[border-color] duration-fast ease-in\",\n variants: {\n selected: { true: \"\", false: \"\" },\n disabled: { true: \"\", false: \"\" },\n compact: { true: \"px-xs\", false: \"px-m\" },\n },\n defaultVariants: { compact: false },\n compoundVariants: [\n {\n selected: false,\n disabled: false,\n class:\n \"group-hover:border-interactive-outlined-hover group-active:border-interactive-outlined-active\",\n },\n ],\n});\n\n// Label and icon share one color set. Native resolves the icon tint through\n// useColorToken, which reads the base `text-*` only, so the hover tint and the\n// stacking above the chip are web-only.\nconst foregroundVariants = tv({\n base: \"z-1 transition-[color] duration-fast ease-in\",\n variants: {\n selected: {\n true: \"text-on-accent\",\n false: \"text-muted group-hover:text-sharp\",\n },\n disabled: {\n true: \"text-disabled-muted group-hover:text-disabled-muted\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n selected: true,\n disabled: true,\n class: \"text-disabled-sharp group-hover:text-disabled-sharp\",\n },\n ],\n});\n\nconst labelVariants = tv({\n extend: foregroundVariants,\n base: \"select-none font-body-bold text-base text-center\",\n});\n\nexport interface SegmentedItemProps extends Omit<\n InteractiveBoxProps,\n \"aria-label\" | \"children\" | \"className\" | \"withFocusVisibleOutline\"\n> {\n label: string;\n icon?: SVGIconElement;\n selected: boolean;\n /** Tighter horizontal padding, set by a compact group. */\n compact?: boolean;\n /**\n * react-native's types have no `aria-current` / `aria-controls` / `href`, but\n * react-native-web forwards all three (an `href` makes it render an `<a>`) and\n * native ignores unknown props — declared here for `NavBarItem` and `Tab`.\n */\n \"aria-current\"?: \"page\";\n \"aria-controls\"?: string;\n href?: string;\n}\n\nexport function SegmentedItem({\n label,\n icon,\n selected,\n disabled,\n compact,\n ...props\n}: SegmentedItemProps): ReactNode {\n const isDisabled = disabled === true;\n\n return (\n <InteractiveBox\n withFocusVisibleOutline\n aria-label={label}\n disabled={disabled}\n className=\"group flex-center min-h-[44px] rounded-xs focus-visible:outline-interactive-outlined-outline-focus\"\n {...props}\n >\n <View\n className={segmentVariants({ selected, disabled: isDisabled, compact })}\n >\n <View className={chipVariants({ selected, disabled: isDisabled })} />\n {icon ? (\n <Icon\n icon={icon}\n size={20}\n className={foregroundVariants({ selected, disabled: isDisabled })}\n />\n ) : null}\n <Text\n numberOfLines={1}\n className={labelVariants({ selected, disabled: isDisabled })}\n >\n {label}\n </Text>\n </View>\n </InteractiveBox>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { SegmentedItem } from \"../selection/SegmentedItem\";\nimport { useRadioContext } from \"./RadioContext\";\n\nexport interface RadioButtonProps {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport function RadioButton({\n value,\n label,\n disabled,\n}: RadioButtonProps): ReactNode {\n const {\n value: selectedValue,\n onSelect,\n disabled: groupDisabled,\n compact,\n } = useRadioContext();\n const selected = selectedValue === value;\n const isDisabled = disabled === true || groupDisabled === true;\n\n return (\n <SegmentedItem\n role=\"radio\"\n aria-checked={selected}\n aria-disabled={isDisabled}\n label={label}\n selected={selected}\n disabled={isDisabled}\n compact={compact}\n onPress={() => {\n onSelect(value);\n }}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { View } from \"../primitives/View\";\nimport {\n type SelectionGroupProps,\n useSelectionValue,\n} from \"../selection/SelectionContext\";\nimport { RadioContextProvider } from \"./RadioContext\";\n\nconst radioCardGroupVariants = tv({\n base: \"gap-xs\",\n variants: {\n variant: {\n list: \"flex-col\",\n stack: \"flex-row flex-wrap\",\n },\n },\n defaultVariants: { variant: \"list\" },\n});\n\ntype RadioCardGroupVariantProps = VariantProps<typeof radioCardGroupVariants>;\n\nexport type RadioCardGroupVariant = NonNullable<\n RadioCardGroupVariantProps[\"variant\"]\n>;\n\nconst RadioCardGroupVariantContext =\n createContext<RadioCardGroupVariant>(\"list\");\n\n/** Lets a card size itself for the row it flows in. */\nexport function useRadioCardGroupVariant(): RadioCardGroupVariant {\n return useContext(RadioCardGroupVariantContext);\n}\n\nexport interface RadioCardGroupProps\n extends SelectionGroupProps, RadioCardGroupVariantProps {}\n\nexport function RadioCardGroup({\n value,\n defaultValue,\n onValueChange,\n accent,\n disabled,\n variant,\n children,\n ...props\n}: RadioCardGroupProps): ReactNode {\n const context = useSelectionValue({\n value,\n defaultValue,\n onValueChange,\n disabled,\n });\n\n return (\n <AccentScope accent={accent}>\n <RadioContextProvider value={context}>\n <RadioCardGroupVariantContext value={variant ?? \"list\"}>\n <View\n role=\"radiogroup\"\n className={radioCardGroupVariants({ variant })}\n {...props}\n >\n {children}\n </View>\n </RadioCardGroupVariantContext>\n </RadioContextProvider>\n </AccentScope>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport { PressableBox } from \"../actions/PressableBox\";\nimport { DefaultAccentScope } from \"../containers/DefaultAccentScope\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\nimport { RadioIndicator } from \"../selection/RadioIndicator\";\nimport { VStack } from \"../stacks/stacks\";\nimport { useRadioCardGroupVariant } from \"./RadioCardGroup\";\nimport { useRadioContext } from \"./RadioContext\";\n\n// The selected card is PressableBox's `contained` fill (raised, accent) and the\n// unselected one its `outlined` surface, so every rest/hover/focus/press color\n// comes from the shared interactive tokens — only the foreground follows.\nconst radioCardVariants = tv(\n {\n slots: {\n frame: \"flex-row gap-m rounded-sm p-m min-h-[44px]\",\n icon: \"\",\n label: \"font-body-bold text-base\",\n description: \"text-sm\",\n },\n variants: {\n // In a wrapping group the cards share each row instead of sizing to text,\n // and the icon and the indicator hold the card's top corners.\n layout: {\n list: { frame: \"items-center\" },\n stack: { frame: \"items-start grow shrink basis-[240px]\" },\n },\n selected: {\n true: {\n icon: \"text-on-accent\",\n label: \"text-on-accent\",\n description: \"text-on-accent-muted\",\n },\n false: {\n icon: \"text-muted\",\n label: \"text-sharp\",\n description: \"text-muted\",\n },\n },\n disabled: {\n true: {\n icon: \"text-disabled-muted\",\n label: \"text-disabled-sharp\",\n description: \"text-disabled-muted\",\n },\n false: {},\n },\n },\n },\n { twMerge: false },\n);\n\nexport interface RadioCardProps {\n value: string;\n label: string;\n description?: string;\n icon?: SVGIconElement;\n disabled?: boolean;\n}\n\nexport function RadioCard({\n value,\n label,\n description,\n icon,\n disabled,\n}: RadioCardProps): ReactNode {\n const {\n value: selectedValue,\n onSelect,\n disabled: groupDisabled,\n } = useRadioContext();\n const layout = useRadioCardGroupVariant();\n const selected = selectedValue === value;\n const isDisabled = disabled === true || groupDisabled === true;\n const styles = radioCardVariants({ layout, selected, disabled: isDisabled });\n\n return (\n <DefaultAccentScope>\n <PressableBox\n variant={selected ? \"contained\" : \"outlined\"}\n role=\"radio\"\n aria-checked={selected}\n aria-disabled={isDisabled}\n aria-label={label}\n disabled={isDisabled}\n className={styles.frame()}\n onPress={() => {\n onSelect(value);\n }}\n >\n {icon ? <Icon icon={icon} size={24} className={styles.icon()} /> : null}\n <VStack className=\"flex-1 gap-xxs\">\n <Text className={styles.label()}>{label}</Text>\n {description ? (\n <Text className={styles.description()}>{description}</Text>\n ) : null}\n </VStack>\n <RadioIndicator\n selected={selected}\n disabled={isDisabled}\n onAccent={selected}\n />\n </PressableBox>\n </DefaultAccentScope>\n );\n}\n","import { createSelectionContext } from \"../selection/SelectionContext\";\n\nexport const {\n SelectionContextProvider: NavBarContextProvider,\n useSelection: useNavBarContext,\n} = createSelectionContext(\"NavBarItem must be rendered inside a NavBar.\");\n","import type { ReactNode } from \"react\";\nimport { SegmentedBar } from \"../selection/SegmentedBar\";\nimport {\n type SelectionGroupProps,\n useSelectionValue,\n} from \"../selection/SelectionContext\";\nimport { NavBarContextProvider } from \"./NavBarContext\";\n\nexport interface NavBarProps extends SelectionGroupProps {\n \"aria-label\"?: string;\n}\n\n/**\n * Segmented navigation between destinations. `value` is the current\n * destination — it matches an item's `href`, and is usually owned by the app's\n * router, so pass it controlled.\n */\nexport function NavBar({\n value,\n defaultValue,\n onValueChange,\n accent,\n disabled,\n children,\n ...props\n}: NavBarProps): ReactNode {\n const context = useSelectionValue({\n value,\n defaultValue,\n onValueChange,\n disabled,\n });\n\n return (\n <NavBarContextProvider value={context}>\n <SegmentedBar role=\"navigation\" accent={accent} {...props}>\n {children}\n </SegmentedBar>\n </NavBarContextProvider>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { GestureResponderEvent } from \"react-native\";\nimport type { SVGIconElement } from \"../primitives/Icon\";\nimport {\n SegmentedItem,\n type SegmentedItemProps,\n} from \"../selection/SegmentedItem\";\nimport { useNavBarContext } from \"./NavBarContext\";\n\nexport interface NavBarItemProps {\n /**\n * Destination, matched against the NavBar's value to mark the item current.\n * Renders a real `<a href>` on web (native ignores it); expo Router's\n * `<Link asChild>` injects it, so it does not have to be written twice.\n */\n href?: string;\n label: string;\n icon?: SVGIconElement;\n disabled?: boolean;\n /**\n * Handles the press instead of the group's `onValueChange` — this is what\n * `<Link asChild>` injects. A NavBar whose items carry `onPress` must be\n * controlled: its internal value never updates. A handler that navigates on\n * web must call `event.preventDefault()`, as routers do.\n */\n onPress?: SegmentedItemProps[\"onPress\"];\n}\n\nexport function NavBarItem({\n href,\n label,\n icon,\n disabled,\n onPress,\n}: NavBarItemProps): ReactNode {\n const {\n value: currentValue,\n onSelect,\n disabled: navBarDisabled,\n } = useNavBarContext();\n const selected = href !== undefined && currentValue === href;\n const isDisabled = disabled === true || navBarDisabled === true;\n\n // Routing is the app's job, through the group's onValueChange or an item\n // onPress, so the anchor must not navigate on its own.\n const selectHref =\n href === undefined\n ? undefined\n : (event: GestureResponderEvent) => {\n event.preventDefault();\n onSelect(href);\n };\n\n return (\n <SegmentedItem\n role=\"link\"\n // A disabled Pressable never sees the press, so dropping the href is the\n // only thing that stops the browser from following the link anyway.\n href={isDisabled ? undefined : href}\n aria-current={selected ? \"page\" : undefined}\n aria-disabled={isDisabled}\n label={label}\n icon={icon}\n selected={selected}\n disabled={isDisabled}\n onPress={onPress ?? selectHref}\n />\n );\n}\n","import { createSelectionContext } from \"../selection/SelectionContext\";\n\nexport const {\n SelectionContextProvider: TabsContextProvider,\n useSelection: useTabsContext,\n} = createSelectionContext(\"Tab must be rendered inside Tabs.\");\n","import type { ReactNode } from \"react\";\nimport { SegmentedBar } from \"../selection/SegmentedBar\";\nimport {\n type SelectionGroupProps,\n useSelectionValue,\n} from \"../selection/SelectionContext\";\nimport { TabsContextProvider } from \"./TabsContext\";\n\nexport interface TabsProps extends SelectionGroupProps {\n \"aria-label\"?: string;\n}\n\n/** Segmented switch between views rendered on the same screen. */\nexport function Tabs({\n value,\n defaultValue,\n onValueChange,\n accent,\n disabled,\n children,\n ...props\n}: TabsProps): ReactNode {\n const context = useSelectionValue({\n value,\n defaultValue,\n onValueChange,\n disabled,\n });\n\n return (\n <TabsContextProvider value={context}>\n <SegmentedBar role=\"tablist\" accent={accent} {...props}>\n {children}\n </SegmentedBar>\n </TabsContextProvider>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { SVGIconElement } from \"../primitives/Icon\";\nimport {\n SegmentedItem,\n type SegmentedItemProps,\n} from \"../selection/SegmentedItem\";\nimport { useTabsContext } from \"./TabsContext\";\n\nexport interface TabProps {\n value: string;\n label: string;\n icon?: SVGIconElement;\n disabled?: boolean;\n \"aria-controls\"?: string;\n id?: string;\n /**\n * Runs instead of the group's `onValueChange`. Tabs whose items carry\n * `onPress` must be controlled: the internal value never updates.\n */\n onPress?: SegmentedItemProps[\"onPress\"];\n}\n\nexport function Tab({\n value,\n label,\n icon,\n disabled,\n onPress,\n ...props\n}: TabProps): ReactNode {\n const {\n value: currentValue,\n onSelect,\n disabled: tabsDisabled,\n } = useTabsContext();\n const selected = currentValue === value;\n const isDisabled = disabled === true || tabsDisabled === true;\n\n return (\n <SegmentedItem\n role=\"tab\"\n aria-selected={selected}\n aria-disabled={isDisabled}\n label={label}\n icon={icon}\n selected={selected}\n disabled={isDisabled}\n onPress={\n onPress ??\n (() => {\n onSelect(value);\n })\n }\n {...props}\n />\n );\n}\n","import { AsteriskSimpleRegularIcon } from \"alouette-icons/phosphor-icons/AsteriskSimpleRegularIcon\";\nimport { WarningRegularIcon } from \"alouette-icons/phosphor-icons/WarningRegularIcon\";\nimport { type ReactNode, useId } from \"react\";\nimport { Pressable } from \"react-native\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { Icon } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\nimport { View } from \"../primitives/View\";\nimport { HStack, VStack } from \"../stacks/stacks\";\n\nexport interface FormItemProps {\n label: string;\n /** Muted helper text shown between the label and the input. */\n details?: ReactNode;\n error?: ReactNode;\n /**\n * True when `error` is caused by the field being left empty, as opposed\n * to some other validation failure. An empty required field just needs\n * its star recolored — a second warning icon would be a redundant cue.\n */\n isRequiredError?: boolean;\n /** true shows the default marker; any other ReactNode replaces it. */\n required?: ReactNode;\n /**\n * Wraps the rendered content in a left border + padding to visually nest it\n * inside a group. The label stays at full width above the rail.\n */\n indented?: boolean;\n /** Called when the label is pressed, so it can focus the input. */\n onLabelPress?: () => void;\n render: (labelId: string) => ReactNode;\n}\n\n/**\n * Label, error message and layout for a single form field. Form-library\n * agnostic — pass the input as a render prop so it can wire\n * aria-labelledby to the generated labelId, and onLabelPress so the label\n * can focus it, matching a native <label for> click.\n */\nexport function FormItem({\n label,\n details,\n error,\n isRequiredError,\n required,\n indented,\n onLabelPress,\n render,\n}: FormItemProps): ReactNode {\n const labelId = useId();\n const hasError = Boolean(error);\n const showWarningIcon = hasError && !isRequiredError;\n\n // The trailing marker is always the last element after the label text, so\n // the text never shifts position when error/required state changes. The\n // required star is never removed on error — it's only recolored, with the\n // warning icon added alongside it for non-required-emptiness errors.\n const marker = ((): ReactNode => {\n if (required === true) {\n return (\n <HStack className=\"gap-xxs items-center\">\n <Icon\n icon={<AsteriskSimpleRegularIcon />}\n size={12}\n className=\"text-accent\"\n />\n {showWarningIcon ? (\n <Icon\n icon={<WarningRegularIcon />}\n size={16}\n className=\"text-accent\"\n />\n ) : null}\n </HStack>\n );\n }\n if (required) {\n return required;\n }\n if (showWarningIcon) {\n return (\n <Icon icon={<WarningRegularIcon />} size={16} className=\"text-accent\" />\n );\n }\n return null;\n })();\n\n return (\n <VStack className=\"gap-xxs\">\n <Pressable onPress={onLabelPress}>\n <VStack>\n <HStack className=\"gap-xxs items-center\">\n <Text\n nativeID={labelId}\n accent={hasError ? \"danger\" : undefined}\n className={`font-body-bold text-md ${hasError ? \"text-accent\" : \"\"}`}\n >\n {label}\n </Text>\n {marker ? (\n <View aria-hidden>\n {hasError ? (\n <AccentScope accent=\"danger\">{marker}</AccentScope>\n ) : (\n marker\n )}\n </View>\n ) : null}\n </HStack>\n {details ? (\n <Text className=\"text-muted text-sm\">{details}</Text>\n ) : null}\n </VStack>\n </Pressable>\n {indented ? (\n <View className=\"border-l border-border-muted pl-m\">\n {render(labelId)}\n </View>\n ) : (\n render(labelId)\n )}\n {error ? (\n <View className=\"px-m\">\n <Text role=\"alert\" accent=\"danger\" className=\"text-accent text-sm\">\n {error}\n </Text>\n </View>\n ) : null}\n </VStack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n type Control,\n type DefaultValues,\n type FieldValues,\n FormProvider,\n type SubmitHandler,\n type UseFormProps,\n useForm,\n} from \"react-hook-form\";\n\nexport class FormValidationError extends Error {\n constructor() {\n super(\"Form validation failed.\");\n this.name = \"FormValidationError\";\n }\n}\n\nexport interface FormProps<TFieldValues extends FieldValues> {\n defaultValues: DefaultValues<TFieldValues>;\n mode?: UseFormProps<TFieldValues>[\"mode\"];\n onSubmit: SubmitHandler<TFieldValues>;\n onSubmitError?: (error: unknown) => void;\n render: (params: {\n control: Control<TFieldValues>;\n submit: () => Promise<void>;\n }) => ReactNode;\n}\n\n/**\n * Owns the react-hook-form instance and hands its `control` to `render`, so\n * every field below infers TFieldValues from the control it is given and its\n * own value type from `name` — no type argument per field. submit() rejects\n * with FormValidationError when fields are invalid (nothing was submitted), so\n * FormSubmitButton can tell that apart from a genuine onSubmit failure.\n * Without `onSubmitError`, an exception thrown from `onSubmit` is left to\n * propagate as a genuine unhandled rejection rather than being silently\n * logged — FormSubmitButton (built on ActionButton) consumes it instead to\n * drive its own loading/success/failed state.\n */\nexport function Form<TFieldValues extends FieldValues>({\n defaultValues,\n mode = \"onTouched\",\n onSubmit,\n onSubmitError,\n render,\n}: FormProps<TFieldValues>): ReactNode {\n const form = useForm<TFieldValues>({ mode, defaultValues });\n\n function submit(): Promise<void> {\n // react-hook-form only broadcasts the updated field errors to\n // Controller subscribers in a final internal step *after* the onInvalid\n // callback resolves — throwing from inside onInvalid pre-empts that\n // broadcast, so field-level errors would never reach FormField/FormItem.\n // Record invalidity instead, and throw only once handleSubmit is done.\n let valid = true;\n const result = form\n .handleSubmit(onSubmit, () => {\n valid = false;\n })()\n .then(() => {\n if (!valid) throw new FormValidationError();\n });\n if (onSubmitError) result.catch(onSubmitError);\n return result;\n }\n\n // FormProvider stays so FormField can reach setFocus, and so app-level\n // components deep in the tree can still opt into useFormContext.\n return (\n <FormProvider {...form}>\n {render({ control: form.control, submit })}\n </FormProvider>\n );\n}\n","import type { ReactNode } from \"react\";\nimport {\n type Control,\n Controller,\n type ControllerRenderProps,\n type FieldError,\n type FieldPath,\n type FieldValues,\n type RegisterOptions,\n useFormContext,\n} from \"react-hook-form\";\nimport { FormItem } from \"./FormItem\";\n\nexport interface FormFieldProps<\n TFieldValues extends FieldValues,\n TName extends FieldPath<TFieldValues>,\n> {\n /** From <Form>'s render params. Infers the form type for `name`. */\n control: Control<TFieldValues>;\n name: TName;\n label: string;\n /**\n * Marks the field required and shows FormItem's marker. Pass true for no\n * message, or any other ReactNode to use as the required-field error —\n * unless renderError overrides it — once the field is left empty.\n * react-hook-form's own FieldError.message is always a plain string, so\n * this is the only way to get a richer, i18n'd required message without\n * reaching for renderError.\n */\n required?: ReactNode;\n validate?: RegisterOptions<TFieldValues, TName>[\"validate\"];\n renderError?: (error: FieldError | undefined) => ReactNode;\n render: (params: {\n field: ControllerRenderProps<TFieldValues, TName>;\n labelId: string;\n }) => ReactNode;\n}\n\n/**\n * Wires a react-hook-form Controller to FormItem's label/error/layout.\n * Must be used inside <Form>, whose render params supply `control`. Passing it\n * is what types the field: TFieldValues comes from the control and the value\n * type from `name`, so `field.value` is that one field's type rather than a\n * union of every field in the form.\n * Renders any input via `render` — not tied to a specific input component.\n * The rendered input must attach `field.ref` for pressing the label to\n * focus it, via react-hook-form's own setFocus.\n */\nexport function FormField<\n TFieldValues extends FieldValues,\n TName extends FieldPath<TFieldValues>,\n>({\n control,\n name,\n label,\n required,\n validate,\n renderError,\n render,\n}: FormFieldProps<TFieldValues, TName>): ReactNode {\n const { setFocus } = useFormContext<TFieldValues>();\n\n return (\n <Controller\n control={control}\n name={name}\n rules={{ required: Boolean(required), validate }}\n render={({ field, fieldState }) => {\n const requiredError =\n fieldState.error?.type === \"required\" && required !== true\n ? required\n : undefined;\n return (\n <FormItem\n label={label}\n required={Boolean(required)}\n isRequiredError={fieldState.error?.type === \"required\"}\n error={\n renderError\n ? renderError(fieldState.error)\n : (requiredError ?? fieldState.error?.message)\n }\n render={(labelId) => render({ field, labelId })}\n onLabelPress={() => {\n setFocus(name);\n }}\n />\n );\n }}\n />\n );\n}\n","import { PlusRegularIcon } from \"alouette-icons/phosphor-icons/PlusRegularIcon\";\nimport { TrashRegularIcon } from \"alouette-icons/phosphor-icons/TrashRegularIcon\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport {\n type ArrayPath,\n type Control,\n type FieldArray,\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n useFieldArray,\n} from \"react-hook-form\";\nimport { Button } from \"../actions/Button\";\nimport { IconButton } from \"../actions/IconButton\";\nimport { StableAccentScope } from \"../containers/StableAccentScope\";\nimport { View } from \"../primitives/View\";\nimport { HStack, VStack } from \"../stacks/stacks\";\nimport { FormItem } from \"./FormItem\";\n\n/**\n * Every path in the form whose value is an array. react-hook-form's own\n * ArrayPath deliberately excludes arrays of primitives, which useFieldArray\n * nonetheless drives fine — a `string[]` field would otherwise resolve to\n * `never` and force a cast at the call site.\n */\nexport type FormArrayPath<TFieldValues extends FieldValues> = {\n [TPath in FieldPath<TFieldValues>]: NonNullable<\n FieldPathValue<TFieldValues, TPath>\n > extends readonly unknown[]\n ? TPath\n : never;\n}[FieldPath<TFieldValues>];\n\n/** The item type of the array `TName` points at. */\nexport type FormArrayItem<\n TFieldValues extends FieldValues,\n TName extends FormArrayPath<TFieldValues>,\n> =\n NonNullable<\n FieldPathValue<TFieldValues, TName>\n > extends readonly (infer TItem)[]\n ? TItem\n : never;\n\nexport interface FormFieldArrayProps<\n TFieldValues extends FieldValues,\n TName extends FormArrayPath<TFieldValues>,\n> {\n /** From <Form>'s render params. Infers the form type for `name`. */\n control: Control<TFieldValues>;\n name: TName;\n label: string;\n /** Muted helper text shown under the label (e.g. a minimum-count hint). */\n details?: ReactNode;\n /** Value appended when a new item is added. */\n emptyValue: FormArrayItem<TFieldValues, TName>;\n /**\n * Minimum number of items. The array is padded to this length on mount and\n * the leading `minSize` items cannot be removed.\n */\n minSize?: number;\n /** aria-label for the add button. */\n addLabel?: string;\n /** Disables the add button, e.g. while the last item is still empty. */\n disableAdd?: boolean;\n /** aria-label for each remove button, given the item's own label. */\n removeLabel?: (itemLabel: string) => string;\n render: (params: {\n control: Control<TFieldValues>;\n /** Path prefix for this item, e.g. \"guests.0\". Build sub-paths as `${name}.value`. */\n name: `${TName}.${number}`;\n index: number;\n /** Per-item base accessible name (`${label} ${index + 1}`), e.g. \"Guests 1\". */\n label: string;\n }) => ReactNode;\n}\n\ninterface FormFieldArrayItemProps<\n TFieldValues extends FieldValues,\n TName extends FormArrayPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: `${TName}.${number}`;\n itemLabel: string;\n removeLabel: string;\n index: number;\n removable: boolean;\n onRemove: () => void;\n render: FormFieldArrayProps<TFieldValues, TName>[\"render\"];\n}\n\nfunction FormFieldArrayItem<\n TFieldValues extends FieldValues,\n TName extends FormArrayPath<TFieldValues>,\n>({\n control,\n name,\n itemLabel,\n removeLabel,\n index,\n removable,\n onRemove,\n render,\n}: FormFieldArrayItemProps<TFieldValues, TName>): ReactNode {\n // Hovering the remove button tints the whole row with the danger accent, as\n // an affordance that pressing it will drop the item. StableAccentScope keeps\n // the scope mounted across the toggle so the inputs don't remount.\n const [pendingRemoval, setPendingRemoval] = useState(false);\n\n return (\n <StableAccentScope accent={pendingRemoval ? \"danger\" : undefined}>\n <HStack className=\"gap-sm items-center p-xxs\">\n <View className=\"grow shrink basis-0\">\n {render({ control, name, index, label: itemLabel })}\n </View>\n {removable ? (\n <IconButton\n variant=\"ghost\"\n icon={<TrashRegularIcon />}\n aria-label={removeLabel}\n onHoverIn={() => {\n setPendingRemoval(true);\n }}\n onHoverOut={() => {\n setPendingRemoval(false);\n }}\n onPress={onRemove}\n />\n ) : null}\n </HStack>\n </StableAccentScope>\n );\n}\n\n/**\n * A repeatable list of fields backed by react-hook-form's useFieldArray, taking\n * `control` from <Form>'s render params. FormFieldArray owns only the array\n * label and the add/remove buttons — it is agnostic about what an item contains,\n * including any per-item framing (a caller can wrap multi-field items in a\n * Surface). Each item's inputs (their values, labels and error messages) are the\n * caller's job: `render` receives `control` and the item's path prefix, typed as\n * `${name}.${number}` so `${name}.value` / `${name}.firstName` compose into a\n * real field path for an object item, or `name` binds a raw value directly.\n */\nexport function FormFieldArray<\n TFieldValues extends FieldValues,\n TName extends FormArrayPath<TFieldValues>,\n>({\n control,\n name,\n label,\n details,\n emptyValue,\n minSize = 0,\n addLabel = \"Add item\",\n disableAdd,\n removeLabel = (itemLabel) => `Remove ${itemLabel}`,\n render,\n}: FormFieldArrayProps<TFieldValues, TName>): ReactNode {\n // FormArrayPath also admits arrays of primitives, which react-hook-form's own\n // ArrayPath / FieldArray types reject even though useFieldArray drives them\n // fine at runtime — so the widening is cast away here, once, rather than at\n // every call site.\n const { fields, append, remove } = useFieldArray<TFieldValues>({\n control,\n name: name as ArrayPath<TFieldValues>,\n });\n const appendedItem = emptyValue as FieldArray<\n TFieldValues,\n ArrayPath<TFieldValues>\n >;\n\n // Pad up to the minimum once on mount, appending the whole shortfall in a\n // single call. The ref keeps StrictMode's double-invoked effect from\n // appending twice.\n const paddedRef = useRef(false);\n useEffect(() => {\n if (paddedRef.current) return;\n paddedRef.current = true;\n const shortfall = minSize - fields.length;\n if (shortfall > 0) {\n append(\n Array.from({ length: shortfall }, () => appendedItem),\n { shouldFocus: false },\n );\n }\n }, [append, appendedItem, fields.length, minSize]);\n\n return (\n <FormItem\n label={label}\n details={details}\n render={() => (\n <VStack className=\"gap-xs\">\n {fields.map((field, index) => (\n <FormFieldArrayItem<TFieldValues, TName>\n key={field.id}\n control={control}\n name={`${name}.${index}`}\n itemLabel={`${label} ${index + 1}`}\n removeLabel={removeLabel(`${label} ${index + 1}`)}\n index={index}\n removable={index >= minSize}\n render={render}\n onRemove={() => {\n remove(index);\n }}\n />\n ))}\n <Button\n size=\"sm\"\n variant=\"outlined\"\n icon={<PlusRegularIcon />}\n text={addLabel}\n className=\"self-start\"\n disabled={disableAdd}\n onPress={() => {\n append(appendedItem);\n }}\n />\n </VStack>\n )}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ActionButton } from \"../actions/ActionButton\";\n\nexport interface FormSubmitButtonProps {\n label: string;\n onPress: () => Promise<void>;\n /**\n * Maps a submit failure to displayed text. Required rather than\n * defaulted, since a library-provided default could only ever be a\n * hardcoded English string — not translatable. Check\n * `error instanceof FormValidationError` to render a \"fix the errors\n * above\" case distinctly from a genuine onSubmit failure.\n */\n errorToMessage: (error: unknown) => string;\n}\n\n/**\n * Submit button for a <Form>. Built on ActionButton, so submission gets the\n * same loading/success/failed lifecycle and inline error message as any\n * other async action in the app, rather than a plain boolean isSubmitting.\n */\nexport function FormSubmitButton({\n label,\n onPress,\n errorToMessage,\n}: FormSubmitButtonProps): ReactNode {\n return (\n <ActionButton\n text={label}\n errorToMessage={errorToMessage}\n onPress={onPress}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Control, FieldValues } from \"react-hook-form\";\nimport { VStack } from \"../stacks/stacks\";\nimport { Form, type FormProps } from \"./Form\";\nimport { FormSubmitButton } from \"./FormSubmitButton\";\n\nexport interface SimpleVFormProps<\n TFieldValues extends FieldValues,\n> extends Omit<FormProps<TFieldValues>, \"render\"> {\n submitLabel: string;\n /** Forwarded to FormSubmitButton — see its errorToMessage doc. */\n submitErrorToMessage: (error: unknown) => string;\n className?: string;\n render: (params: {\n control: Control<TFieldValues>;\n submit: () => Promise<void>;\n }) => ReactNode;\n}\n\n/**\n * Standardizes the common case: a Form laid out as a vertical stack with\n * a trailing FormSubmitButton.\n */\nexport function SimpleVForm<TFieldValues extends FieldValues>({\n submitLabel,\n submitErrorToMessage,\n className,\n render,\n ...formProps\n}: SimpleVFormProps<TFieldValues>): ReactNode {\n return (\n <Form\n {...formProps}\n render={({ control, submit }) => (\n <VStack className={className ?? \"gap-l\"}>\n {render({ control, submit })}\n <FormSubmitButton\n label={submitLabel}\n errorToMessage={submitErrorToMessage}\n onPress={submit}\n />\n </VStack>\n )}\n />\n );\n}\n","import { PencilSimpleRegularIcon } from \"alouette-icons/phosphor-icons/PencilSimpleRegularIcon\";\nimport type { ReactNode } from \"react\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { IconButton } from \"../actions/IconButton\";\nimport type { PressableBoxProps } from \"../actions/PressableBox\";\nimport type { SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\nimport { HStack, VStack } from \"../stacks/stacks\";\n\nexport interface EditableItemProps {\n label: string;\n /** Current value shown next to the label — a Badge, a Text, anything short. */\n summary?: ReactNode;\n /** Muted helper text under the label. */\n details?: ReactNode;\n /** Names the edit button for assistive tech — it has no visible text. */\n editAriaLabel: string;\n editIcon?: SVGIconElement;\n variant?: PressableBoxProps[\"variant\"];\n accent?: Accent;\n disabled?: boolean;\n onEdit: () => void;\n /** Rendered under the row, when the value is too large for `summary`. */\n children?: ReactNode;\n}\n\n/**\n * A labelled value with an edit affordance. Owns no editor: pair it with\n * FormEditableItem for a react-hook-form modal, or compose your own Modal\n * from `onEdit`.\n */\nexport function EditableItem({\n label,\n summary,\n details,\n editAriaLabel,\n editIcon = <PencilSimpleRegularIcon />,\n variant,\n accent,\n disabled,\n onEdit,\n children,\n}: EditableItemProps): ReactNode {\n return (\n <VStack className=\"gap-xs\">\n <HStack className=\"items-center justify-between gap-sm\">\n <VStack className=\"shrink\">\n <HStack className=\"items-center gap-sm\">\n <Text className=\"font-body-bold text-md\">{label}</Text>\n {summary}\n </HStack>\n {details ? (\n <Text className=\"text-muted text-sm\">{details}</Text>\n ) : null}\n </VStack>\n <IconButton\n size=\"sm\"\n icon={editIcon}\n variant={variant}\n accent={accent}\n disabled={disabled}\n aria-label={editAriaLabel}\n onPress={onEdit}\n />\n </HStack>\n {children}\n </VStack>\n );\n}\n","import { type ReactNode, useState } from \"react\";\nimport type { Control, FieldValues } from \"react-hook-form\";\nimport { Button } from \"../actions/Button\";\nimport { Modal, type ModalProps } from \"../containers/Modal\";\nimport { EditableItem, type EditableItemProps } from \"../data/EditableItem\";\nimport { Form, type FormProps } from \"./Form\";\nimport { FormSubmitButton } from \"./FormSubmitButton\";\n\nexport interface FormEditableItemProps<TFieldValues extends FieldValues>\n extends\n Pick<\n EditableItemProps,\n | \"accent\"\n | \"details\"\n | \"disabled\"\n | \"editAriaLabel\"\n | \"editIcon\"\n | \"label\"\n | \"summary\"\n | \"variant\"\n >,\n Omit<FormProps<TFieldValues>, \"onSubmitError\" | \"render\"> {\n /** Heading of the editor modal. Defaults to `label`. */\n title?: string;\n size?: ModalProps[\"size\"];\n closeButtonAriaLabel?: string;\n cancelLabel: string;\n submitLabel: string;\n /** Forwarded to FormSubmitButton — see its errorToMessage doc. */\n submitErrorToMessage: (error: unknown) => string;\n /** The fields, rendered as the modal body, bound to the modal Form's own control. */\n render: (params: { control: Control<TFieldValues> }) => ReactNode;\n}\n\n/**\n * An EditableItem whose editor is a modal owning its own Form. The Form is\n * mounted only while editing, so it reseeds from `defaultValues` on every\n * open and cancelling is a plain unmount — the surrounding screen's state is\n * never touched by an abandoned edit, and nothing has to be snapshotted and\n * restored. The fields come through `render`, not children, because they must\n * bind to that inner Form's `control` rather than the screen's.\n */\nexport function FormEditableItem<TFieldValues extends FieldValues>({\n label,\n summary,\n details,\n editAriaLabel,\n editIcon,\n variant,\n accent,\n disabled,\n title,\n size,\n closeButtonAriaLabel,\n cancelLabel,\n submitLabel,\n submitErrorToMessage,\n defaultValues,\n mode,\n onSubmit,\n render,\n}: FormEditableItemProps<TFieldValues>): ReactNode {\n const [editing, setEditing] = useState(false);\n\n function close(): void {\n setEditing(false);\n }\n\n // Closing only once onSubmit resolves keeps the modal open on failure, where\n // FormSubmitButton shows the error. It cuts the button's success state short,\n // but the modal disappearing is the confirmation.\n const handleSubmit: FormProps<TFieldValues>[\"onSubmit\"] = async (\n values,\n event,\n ) => {\n await onSubmit(values, event);\n setEditing(false);\n };\n\n return (\n <EditableItem\n label={label}\n summary={summary}\n details={details}\n editAriaLabel={editAriaLabel}\n editIcon={editIcon}\n variant={variant}\n accent={accent}\n disabled={disabled}\n onEdit={() => {\n setEditing(true);\n }}\n >\n {editing ? (\n <Form\n defaultValues={defaultValues}\n mode={mode}\n render={({ control, submit }) => (\n <Modal\n visible\n title={title ?? label}\n accent={accent}\n size={size}\n closeButtonAriaLabel={closeButtonAriaLabel}\n footer={\n <>\n <Button\n variant=\"outlined\"\n text={cancelLabel}\n onPress={close}\n />\n <FormSubmitButton\n label={submitLabel}\n errorToMessage={submitErrorToMessage}\n onPress={submit}\n />\n </>\n }\n onClose={close}\n >\n {render({ control })}\n </Modal>\n )}\n onSubmit={handleSubmit}\n />\n ) : null}\n </EditableItem>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { type VariantProps, tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { Box } from \"../containers/Box\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\n\nconst badgeVariants = tv(\n {\n slots: {\n frame: \"flex-row items-center self-start rounded-full\",\n text: \"font-body-bold\",\n icon: \"\",\n },\n variants: {\n size: {\n sm: { frame: \"gap-xxs px-xs py-xxs\", text: \"text-xs\", icon: \"\" },\n md: { frame: \"gap-xs px-sm py-xxs\", text: \"text-sm\", icon: \"\" },\n },\n variant: {\n solid: {\n frame: \"bg-highlight-accent\",\n text: \"text-sharp\",\n icon: \"text-sharp\",\n },\n \"solid.enabled\": {\n frame: \"bg-enabled\",\n text: \"text-on-accent\",\n icon: \"text-on-accent\",\n },\n outlined: {\n frame: \"border border-accent\",\n text: \"text-accent\",\n icon: \"text-accent\",\n },\n },\n },\n defaultVariants: { size: \"md\", variant: \"solid\" },\n },\n { twMerge: false },\n);\n\ntype BadgeVariantProps = VariantProps<typeof badgeVariants>;\ntype BadgeSize = NonNullable<BadgeVariantProps[\"size\"]>;\n\nconst ICON_SIZE: Record<BadgeSize, number> = { sm: 12, md: 16 };\n\nexport interface BadgeProps {\n accent?: Accent;\n size?: BadgeSize;\n variant?: NonNullable<BadgeVariantProps[\"variant\"]>;\n icon?: SVGIconElement;\n children?: ReactNode;\n}\n\nexport function Badge({\n accent = \"brand\",\n size = \"md\",\n variant = \"solid\",\n icon,\n children,\n}: BadgeProps): ReactNode {\n const styles = badgeVariants({ size, variant });\n return (\n <AccentScope accent={accent}>\n <Box className={styles.frame()}>\n {icon ? (\n <Icon icon={icon} size={ICON_SIZE[size]} className={styles.icon()} />\n ) : null}\n <Text className={styles.text()}>{children}</Text>\n </Box>\n </AccentScope>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Icon, type SVGIconElement } from \"../primitives/Icon\";\nimport { Text } from \"../primitives/Text\";\nimport { HStack } from \"../stacks/stacks\";\n\nexport interface BulletProps {\n /** Leading icon, tinted with the current accent. */\n icon: SVGIconElement;\n children?: ReactNode;\n}\n\nexport function Bullet({ icon, children }: BulletProps): ReactNode {\n return (\n <HStack className=\"gap-sm items-start\">\n <Icon icon={icon} className=\"text-accent\" />\n <Text className=\"shrink\">{children}</Text>\n </HStack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { Text } from \"../primitives/Text\";\nimport { View } from \"../primitives/View\";\n\nexport type ConnectionStateStatus = \"connected\" | \"connecting\" | \"disconnected\";\n\n// How long the green \"connected\" pill stays fully visible before sliding out.\nconst connectedHoldMs = 1200;\n\nexport interface ConnectionStateProps {\n /** Current connection status, or `null` when unknown (renders nothing). */\n state: ConnectionStateStatus | null;\n /** Force the banner off-screen regardless of `state`. */\n forceHidden?: boolean;\n /** Keep the banner on-screen even when `connected` (for demos/showcases). */\n forceVisible?: boolean;\n /** Label shown in the pill (e.g. \"Reconnecting…\"). */\n children: NonNullable<ReactNode>;\n}\n\n/**\n * Thin status banner pinned to the top of the screen. It stays hidden while\n * connected and slides down to surface a red pill when connecting or\n * disconnected. On reconnection it turns green and holds for `connectedHoldMs`\n * so the confirmation is legible, then slides back out.\n */\nexport function ConnectionState({\n state,\n forceHidden,\n forceVisible,\n children,\n}: ConnectionStateProps): ReactNode {\n const connected = state === \"connected\";\n\n // While `connected`, keep the pill visible for a pause, then slide it out.\n const [hideAfterHold, setHideAfterHold] = useState(false);\n useEffect(() => {\n if (!connected || forceVisible) {\n setHideAfterHold(false);\n return undefined;\n }\n const timer = setTimeout(() => {\n setHideAfterHold(true);\n }, connectedHoldMs);\n return () => {\n clearTimeout(timer);\n };\n }, [connected, forceVisible]);\n\n const hidden =\n forceHidden || (!forceVisible && (!state || (connected && hideAfterHold)));\n const accent: Accent = connected ? \"success\" : \"danger\";\n\n return (\n <AccentScope accent={accent}>\n <View\n className={`absolute inset-x-0 top-0 z-9 h-0.5 bg-interactive-contained-pressable shadow-m transition-transform duration-slide ease-in-out ${hidden ? \"-translate-y-6\" : \"translate-y-0\"}`}\n >\n {state ? (\n <Text className=\"absolute left-1/2 top-0.5 h-5.5 w-50 -translate-x-1/2 rounded-b-sm bg-interactive-contained-pressable text-center leading-5.5 text-on-accent transition-colors duration-fast\">\n {children}\n </Text>\n ) : null}\n </View>\n </AccentScope>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { tv } from \"tailwind-variants\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { View } from \"../primitives/View\";\nimport { useSimulatedProgress } from \"./useSimulatedProgress\";\n\nexport type LinearProgressSize = \"lg\" | \"md\" | \"sm\" | \"xs\";\n\nconst track = tv({\n base: \"absolute inset-x-0 top-0 z-10 overflow-hidden transition-opacity duration-fade\",\n variants: {\n size: {\n xs: \"h-0.5\",\n sm: \"h-1\",\n md: \"h-1.5\",\n lg: \"h-2\",\n },\n hidden: {\n true: \"opacity-0\",\n false: \"opacity-100\",\n },\n },\n defaultVariants: { size: \"md\", hidden: false },\n});\n\nexport interface LinearProgressProps {\n /** Known completion percentage, 0-100. For an unknown percentage (e.g.\n * reconnecting, page transitions), use `IndeterminateLinearProgress` instead. */\n progress: number;\n hidden?: boolean;\n accent?: Accent;\n size?: LinearProgressSize;\n}\n\nexport function LinearProgress({\n progress,\n hidden = false,\n accent = \"brand\",\n size = \"md\",\n}: LinearProgressProps): ReactNode {\n return (\n <AccentScope accent={accent}>\n <View pointerEvents=\"none\" className={track({ size, hidden })}>\n <View\n className=\"h-full bg-accent transition-[width] duration-progress ease-out\"\n style={{ width: `${progress}%` }}\n />\n </View>\n </AccentScope>\n );\n}\n\nexport interface IndeterminateLinearProgressProps {\n /** Whether an operation is in progress. The bar creeps toward 100% while\n * `true`, then completes and fades out once `false`. */\n loading: boolean;\n accent?: Accent;\n size?: LinearProgressSize;\n}\n\nexport function IndeterminateLinearProgress({\n loading,\n accent,\n size,\n}: IndeterminateLinearProgressProps): ReactNode {\n const { progress, hidden } = useSimulatedProgress(loading);\n\n return (\n <LinearProgress\n progress={progress}\n hidden={hidden}\n accent={accent}\n size={size}\n />\n );\n}\n","import { CaretRightRegularIcon } from \"alouette-icons/phosphor-icons/CaretRightRegularIcon\";\nimport type { ReactNode } from \"react\";\nimport { View } from \"react-native\";\nimport { Icon } from \"../primitives/Icon\";\nimport { PressableBox, type PressableBoxProps } from \"./PressableBox\";\n\nexport interface PressableListItemProps {\n variant?: PressableBoxProps[\"variant\"];\n accent?: PressableBoxProps[\"accent\"];\n role?: PressableBoxProps[\"role\"];\n children: ReactNode;\n onPress: () => void;\n}\n\nexport function PressableListItem({\n variant = \"contained\",\n role = \"button\",\n accent,\n children,\n onPress,\n}: PressableListItemProps): ReactNode {\n return (\n <PressableBox\n variant={variant}\n role={role}\n accent={accent}\n className=\"flex-row items-center justify-between mx-xs my-xxs px-m py-m\"\n onPress={onPress}\n >\n <View className=\"flex-1\">{children}</View>\n <View className=\"justify-center\">\n <Icon\n className={\n variant === \"contained\" ? \"text-on-accent-muted\" : \"text-muted\"\n }\n icon={<CaretRightRegularIcon />}\n size={18}\n />\n </View>\n </PressableBox>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { View } from \"react-native\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\n\nexport interface GradientBackgroundProps {\n children?: ReactNode;\n accent?: Accent;\n}\n\nexport function GradientBackground({\n accent,\n children,\n}: GradientBackgroundProps): ReactNode {\n return (\n <AccentScope accent={accent}>\n <View className=\"absolute inset-0 bg-linear-to-t from-screen-gradient-end from-5% via-screen-gradient-middle via-80% to-screen-gradient-start to-98%\">\n {children}\n </View>\n </AccentScope>\n );\n}\n","import { type ReactNode, forwardRef } from \"react\";\nimport {\n ScrollView as RNScrollView,\n type ScrollViewProps as RNScrollViewProps,\n View,\n} from \"react-native\";\nimport type { Accent } from \"../../core/AlouetteConfig\";\nimport { AccentScope } from \"../containers/AccentScope\";\nimport { GradientBackground } from \"./GradientBackground\";\n\ninterface GradientScrollViewInnerProps extends RNScrollViewProps {\n children?: ReactNode;\n}\n\nconst GradientScrollViewInner = forwardRef<\n RNScrollView,\n GradientScrollViewInnerProps\n>(({ children, ...scrollViewProps }, ref) => {\n return (\n <RNScrollView ref={ref} {...scrollViewProps}>\n <View className=\"absolute left-0 right-0 top-[-600] height-[600] background-(--color-screen-gradient-start)\" />\n <View className=\"absolute left-0 right-0 bottom-[-600] height-[600] background-(--color-screen-gradient-end)\" />\n <GradientBackground />\n {children}\n </RNScrollView>\n );\n});\n\nexport interface GradientScrollViewProps extends RNScrollViewProps {\n children?: ReactNode;\n accent: Accent;\n}\n\nexport const GradientScrollView = forwardRef<\n RNScrollView,\n GradientScrollViewProps\n>(({ accent, children, ...scrollViewProps }, ref) => {\n return (\n <AccentScope accent={accent}>\n <GradientScrollViewInner ref={ref} {...scrollViewProps}>\n {children}\n </GradientScrollViewInner>\n </AccentScope>\n );\n});\n","export const Breakpoints = {\n /**\n * min-width: 0\n */\n BASE: 0,\n /**\n * min-width: 480px\n */\n SMALL: 480,\n /**\n * min-width: 768px\n */\n MEDIUM: 768,\n /**\n * min-width: 1024px\n */\n LARGE: 1024,\n /**\n * min-width: 1280px\n */\n WIDE: 1280,\n} as const;\n\nexport type Breakpoint = (typeof Breakpoints)[keyof typeof Breakpoints];\nexport type BreakpointNames = \"base\" | \"large\" | \"medium\" | \"small\" | \"wide\";\n\nexport enum BreakpointNameEnum {\n BASE = \"base\",\n SMALL = \"small\",\n MEDIUM = \"medium\",\n LARGE = \"large\",\n WIDE = \"wide\",\n}\n","import { useWindowDimensions } from \"react-native\";\nimport {\n BreakpointNameEnum,\n type BreakpointNames,\n Breakpoints,\n} from \"../config/Breakpoints\";\n\nexport function useCurrentBreakpointName(): BreakpointNameEnum {\n const { width } = useWindowDimensions();\n if (width >= Breakpoints.WIDE) return BreakpointNameEnum.WIDE;\n if (width >= Breakpoints.LARGE) return BreakpointNameEnum.LARGE;\n if (width >= Breakpoints.MEDIUM) return BreakpointNameEnum.MEDIUM;\n if (width >= Breakpoints.SMALL) return BreakpointNameEnum.SMALL;\n return BreakpointNameEnum.BASE;\n}\n\nexport function useCurrentBreakpointNameFiltered<\n Names extends BreakpointNames[],\n>(names: Names): Names[number] {\n const current = useCurrentBreakpointName();\n // Walk from the largest matching breakpoint down to BASE; pick the first\n // one the consumer asked for.\n const ordered = [\n BreakpointNameEnum.WIDE,\n BreakpointNameEnum.LARGE,\n BreakpointNameEnum.MEDIUM,\n BreakpointNameEnum.SMALL,\n BreakpointNameEnum.BASE,\n ] as const;\n const startIndex = ordered.indexOf(current);\n for (let i = startIndex; i < ordered.length; i++) {\n const candidate = ordered[i]!;\n if (names.includes(candidate)) return candidate;\n }\n return BreakpointNameEnum.BASE;\n}\n","import type { ReactNode } from \"react\";\nimport { View } from \"react-native\";\nimport type { SetRequired } from \"type-fest\";\nimport type { BreakpointNames } from \"../config/Breakpoints\";\nimport { useCurrentBreakpointNameFiltered } from \"./useCurrentBreakpointName\";\n\ntype SwitchBreakpointsProps = SetRequired<\n Partial<Record<BreakpointNames, ReactNode>>,\n \"base\"\n> & { children?: never };\n\n// Static lookup table so the Tailwind/NativeWind scanner sees every classname.\n// Keys are `\"<currentBreakpoint>:<nextDefinedBreakpointOrEnd>\"`. The value\n// is the className that makes the slot visible from `current` (inclusive)\n// up to `next` (exclusive).\n//\n// Tailwind v4 breakpoint mapping — see global.css:\n// sm = 480px (alouette SMALL)\n// md = 768px (alouette MEDIUM)\n// lg = 1024px (alouette LARGE)\n// xl = 1280px (alouette WIDE)\nconst VISIBILITY_CLASS: Record<string, string> = {\n \"base:end\": \"flex\",\n \"base:small\": \"flex sm:hidden\",\n \"base:medium\": \"flex md:hidden\",\n \"base:large\": \"flex lg:hidden\",\n \"base:wide\": \"flex xl:hidden\",\n \"small:end\": \"hidden sm:flex\",\n \"small:medium\": \"hidden sm:flex md:hidden\",\n \"small:large\": \"hidden sm:flex lg:hidden\",\n \"small:wide\": \"hidden sm:flex xl:hidden\",\n \"medium:end\": \"hidden md:flex\",\n \"medium:large\": \"hidden md:flex lg:hidden\",\n \"medium:wide\": \"hidden md:flex xl:hidden\",\n \"large:end\": \"hidden lg:flex\",\n \"large:wide\": \"hidden lg:flex xl:hidden\",\n \"wide:end\": \"hidden xl:flex\",\n};\n\n/**\n * Display based on current breakpoint via responsive utility classes.\n *\n * On web this is SSR-friendly (CSS handles the switching). On native it\n * still relies on NativeWind's runtime media-query evaluation.\n */\nexport function SwitchBreakpointsUsingDisplayNone({\n ...breakpoints\n}: SwitchBreakpointsProps): ReactNode {\n const entries = Object.entries(breakpoints) as [BreakpointNames, ReactNode][];\n\n return entries.map(([name, node], index) => {\n const next = entries[index + 1]?.[0] ?? \"end\";\n const className = VISIBILITY_CLASS[`${name}:${next}`] ?? \"flex\";\n return (\n <View key={name} className={className}>\n {node}\n </View>\n );\n });\n}\n\n/**\n * Display based on current breakpoint via conditional rendering. Only the\n * matching slot is in the tree — heavier components stay unmounted.\n */\nexport function SwitchBreakpointsUsingNull({\n children,\n ...breakpoints\n}: SwitchBreakpointsProps): ReactNode {\n const currentBreakpointName = useCurrentBreakpointNameFiltered(\n Object.keys(breakpoints) as (keyof typeof breakpoints)[],\n );\n\n return breakpoints[currentBreakpointName] ?? null;\n}\n"],"names":["createContext","useContext","jsx","VariableContextProvider","useColorScheme","SafeAreaProvider","forwardRef","RNView","extendTailwindMerge","RNText","styled","RNScrollView","RNFlatList","RNSectionList","tv","Pressable","Children","useSafeAreaInsets","twMerge","jsxs","Fragment","Platform","useState","useRef","useEffect","isValidElement","live","cloneElement","useNativeVariable","WebBrowser","WebBrowserPresentationStyle","Linking","Circle","Easing","useSharedValue","withTiming","useAnimatedProps","Svg","CheckCircleRegularIcon","WarningDuotoneIcon","useWindowDimensions","useId","RNModal","XRegularIcon","ICON_SIZE","InfoRegularIcon","CheckRegularIcon","WarningRegularIcon","useReducer","QuestionRegularIcon","ArrowSquareOutRegularIcon","RNTextInput","useCallback","RNSwitch","CaretDownRegularIcon","Modal","useMemo","labelVariants","AsteriskSimpleRegularIcon","useForm","FormProvider","useFormContext","Controller","TrashRegularIcon","useFieldArray","PlusRegularIcon","PencilSimpleRegularIcon","View","CaretRightRegularIcon","BreakpointNameEnum"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,MAAM,2BAAA,GAA8BA,mBAAA;AAAA,EACzC;AACF,CAAA;;ACXO,MAAM,YAAA,GAAeA,oBAA6B,OAAO,CAAA;AAEzD,SAAS,eAAA,GAAiC;AAC/C,EAAA,OAAOC,iBAAW,YAAY,CAAA;AAChC;AAEO,SAAS,cAAA,GAAoC;AAClD,EAAA,OAAOA,iBAAW,YAAY,CAAA,CAAE,UAAA,CAAW,MAAM,IAAI,MAAA,GAAS,OAAA;AAChE;;ACEO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,QAAA,EAAS,EAAgC;AAC5E,EAAA,MAAM,cAAA,GAAiBA,iBAAW,2BAA2B,CAAA;AAC7D,EAAA,uBACEC,cAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EAAO,KAAA,EAC5B,QAAA,kBAAAA,cAAA,CAACC,kCAAA,EAAA,EAAwB,KAAA,EAAO,cAAA,CAAe,KAAK,CAAA,EACjD,UACH,CAAA,EACF,CAAA;AAEJ;;ACZO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA;AACF,CAAA,EAAqC;AAGnC,EAAA,MAAM,cAAcC,0BAAA,EAAe;AACnC,EAAA,uBACEF,cAAA,CAAC,2BAAA,CAA4B,QAAA,EAA5B,EAAqC,OAAO,cAAA,EAC3C,QAAA,kBAAAA,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,WAAA,KAAgB,MAAA,GAAS,MAAA,GAAS,OAAA,EACnD,UACH,CAAA,EACF,CAAA;AAEJ;;ACxBO,MAAM,iBAAA,GAA+B,CAAC,OAAA,EAAS,OAAA,KAAY;AAChE,EAAA,MAAM,KAAA,GACJ,OAAA,CAAQ,OAAA,CAAQ,IAAA,KAAS,SAAS,MAAA,GAAS,OAAA;AAI7C,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,UAAA,CAAW,QAAA,EAAU,cAAA;AAEpD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,uBACEA,cAAA,CAACG,2CAAA,EAAA,EACC,QAAA,kBAAAH,cAAA,CAAC,gBAAA,EAAA,EAAiB,cAAA,EAChB,QAAA,kBAAAA,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAe,QAAA,EAAA,OAAA,CAAQ,OAAO,CAAA,EAAE,CAAA,EAC/C,CAAA,EACF,CAAA;AAEJ;;ACvBO,MAAM,IAAA,GAAOI,gBAAA,CAA8B,CAAC,KAAA,EAAO,GAAA,KAAQ;AAChE,EAAA,uBAAOJ,cAAA,CAACK,gBAAA,EAAA,EAAO,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AACtC,CAAC;;ACIM,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA,EAAM,UAAA;AAAA,EACN,MAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,MAAM,OAAO,UAAA,IAAc,WAAA;AAC3B,EAAA,uBAAOL,cAAA,CAAC,eAAY,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,IAAK,QAAA,EAAS,CAAA;AAC5D;;AClBA,MAAM,UAAUM,iCAAA,CAAoB;AAAA,EAClC,MAAA,EAAQ;AAAA,IACN,WAAA,EAAa;AAAA,MACX,aAAA,EAAe;AAAA,QACb,WAAA;AAAA,QACA,gBAAA;AAAA,QACA,qBAAA;AAAA,QACA,cAAA;AAAA,QACA,mBAAA;AAAA,QACA,wBAAA;AAAA,QACA,WAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA;AACF;AACF;AAEJ,CAAC,CAAA;AAMM,MAAM,IAAA,GAAOF,gBAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,QAAQ,GAAG,KAAA,IAAS,GAAA,KAAQ;AACxC,IAAA,uBACEJ,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAA,cAAA;AAAA,MAACO,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,OAAA,CAAQ,sBAAA,EAAwB,SAAS,CAAA;AAAA,QACnD,GAAG;AAAA;AAAA,KACN,EACF,CAAA;AAAA,EAEJ;AACF;AAIO,MAAM,SAAA,GAAYH,gBAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,uBACEJ,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,WAAA;AAAA,QACL,SAAA,EAAW,CAAA,YAAA,EAAe,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,QACxC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;;ACvCO,MAAM,UAAA,GAAaQ,iBAAA;AAAA,EACxBC,sBAAA;AAAA,EACA;AAAA,IACE,SAAA,EAAW,OAAA;AAAA,IACX,yBAAA,EAA2B;AAAA;AAE/B;;ACLO,MAAM,QAAA,GAAWD,iBAAA;AAAA,EACtBE,oBAAA;AAAA,EACA;AAAA,IACE,SAAA,EAAW,OAAA;AAAA,IACX,yBAAA,EAA2B,uBAAA;AAAA,IAC3B,sBAAA,EAAwB;AAAA;AAE5B;;ACHO,MAAM,WAAA,GAAcF,iBAAA;AAAA,EACzBG,uBAAA;AAAA,EACA;AAAA,IACE,SAAA,EAAW,OAAA;AAAA,IACX,yBAAA,EAA2B;AAAA;AAE/B;;ACtBO,MAAM,KAAA,GAAQP,gBAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,uBACEJ,cAAA;AAAA,MAACK,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,CAAA,mBAAA,EAAsB,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,QAC/C,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AAIO,MAAM,MAAA,GAASD,gBAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,uBACEJ,cAAA,CAACK,oBAAO,GAAA,EAAU,SAAA,EAAW,YAAY,SAAA,IAAa,EAAE,CAAA,CAAA,EAAK,GAAG,KAAA,EAAO,CAAA;AAAA,EAE3E;AACF;AAIO,MAAM,MAAA,GAASD,gBAAA;AAAA,EACpB,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChC,IAAA,uBACEJ,cAAA,CAACK,oBAAO,GAAA,EAAU,SAAA,EAAW,YAAY,SAAA,IAAa,EAAE,CAAA,CAAA,EAAK,GAAG,KAAA,EAAO,CAAA;AAAA,EAE3E;AACF;;AC/BA,MAAM,oBAAoBO,mBAAA,CAAG;AAAA,EAC3B,IAAA,EAAM,qBAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAMM,MAAM,SAAA,GAAYR,gBAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,UAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,uBACEJ,cAAA;AAAA,MAACK,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,iBAAA,CAAkB,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,QACnD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;;ACfO,MAAM,cAAA,GAAiB,QAAA;AAMvB,MAAM,GAAA,GAAMD,gBAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,QAAQ,GAAG,KAAA,IAAS,GAAA,KAAQ;AACxC,IAAA,uBACEJ,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAA,cAAA;AAAA,MAACK,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,QAC9C,GAAG;AAAA;AAAA,KACN,EACF,CAAA;AAAA,EAEJ;AACF;AAEO,MAAM,yBAAyBO,mBAAA,CAAG;AAAA,EACvC,IAAA,EAAM;AAAA,IACJ,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,4EAAA;AAAA,IACA,2GAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AAAA,EACV,QAAA,EAAU;AAAA,IACR,uBAAA,EAAyB;AAAA,MACvB,IAAA,EAAM;AAAA;AACR;AAEJ,CAAC,CAAA;AAKM,MAAM,cAAA,GAAiBR,gBAAA;AAAA,EAC5B,CAAC,EAAE,uBAAA,EAAyB,WAAW,GAAG,IAAA,IAAQ,GAAA,qBAChDJ,cAAA;AAAA,IAACa,qBAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MAEA,aAAA,EAAc,MAAA;AAAA,MACb,GAAG,IAAA;AAAA,MACJ,SAAA,EAAW,sBAAA,CAAuB,EAAE,uBAAA,EAAyB,WAAW;AAAA;AAAA;AAG9E;AAEqCT,gBAAA;AAAA,EACnC,CAAC,EAAE,uBAAA,EAAyB,QAAA,EAAU,WAAW,GAAG,IAAA,IAAQ,GAAA,KAAQ;AAClE,IAAA,MAAM,KAAA,GAAQU,cAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AACpC,IAAA,uBACEd,cAAA;AAAA,MAACa,qBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QAEA,aAAA,EAAc,MAAA;AAAA,QACd,SAAA,EAAW,CAAA,YAAA,EAAe,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,QACxC,GAAG,IAAA;AAAA,QAEH,6BAAa,KAAA,EAAO;AAAA,UACnB,WAAW,sBAAA,CAAuB;AAAA,YAChC,uBAAA;AAAA,YACA,SAAA,EAAW,MAAM,KAAA,CAAM;AAAA,WACxB;AAAA,SACF;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAIO,MAAM,WAAA,GAAcT,gBAAA;AAAA,EACzB,CAAC,OAAO,GAAA,KAAQ;AACd,IAAA,MAAM,SAASW,4CAAA,EAAkB;AACjC,IAAA,uBACEf,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,YAAY,MAAA,CAAO,GAAA;AAAA,UACnB,eAAe,MAAA,CAAO,MAAA;AAAA,UACtB,aAAa,MAAA,CAAO,IAAA;AAAA,UACpB,cAAc,MAAA,CAAO;AAAA,SACvB;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;;ACnGA,MAAM,kBAAkBY,mBAAA,CAAG;AAAA;AAAA,EAEzB,IAAA,EAAM,qDAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,GAAA,EAAK,iBAAA;AAAA,MACL,EAAA,EAAI,iBAAA;AAAA,MACJ,EAAA,EAAI,gBAAA;AAAA,MACJ,EAAA,EAAI,iBAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,YAAA;AAAA,MACT,SAAA,EAAW,cAAA;AAAA,MACX,kBAAA,EAAoB,qBAAA;AAAA,MACpB,OAAA,EAAS,YAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,aAAA;AAAA,MACN,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,CAAA,EAAG,UAAA;AAAA,MACH,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,IAAA;AAAA,IACN,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAQM,MAAM,OAAA,GAAUR,gBAAA;AAAA,EACrB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,QAAQ,MAAA,EAAQ,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAE/D,IAAA,MAAM,cAAA,GAAiB,MAAA,KAAW,OAAA,KAAY,SAAA,GAAY,SAAA,GAAY,GAAA,CAAA;AACtE,IAAA,uBACEJ,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAA,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAW,eAAA,CAAgB;AAAA,UACzB,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA,EAAQ,cAAA;AAAA,UACR;AAAA,SACD,CAAA;AAAA,QACA,GAAG;AAAA;AAAA,KACN,EACF,CAAA;AAAA,EAEJ;AACF;;AC7DO,SAAS,MAAA,CACd,WACA,gBAAA,EACkB;AAClB,EAAA,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAM;AACnD,IAAA,uBACEA,cAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWgB,qBAAA,CAAQ,gBAAA,EAAkB,SAAS,CAAA;AAAA,QAC7C,GAAI;AAAA;AAAA,KACP;AAAA,EAEJ;AACA,EAAA,eAAA,CAAgB,cAAc,CAAA,OAAA,EAAU,SAAA,CAAU,WAAA,IAAe,SAAA,CAAU,QAAQ,WAAW,CAAA,CAAA,CAAA;AAC9F,EAAA,eAAA,CAAgB,mBAAA,GAAsB,IAAA;AACtC,EAAA,OAAO,eAAA;AACT;;ACbA,MAAM,qBAAqBJ,mBAAA,CAAG;AAAA,EAC5B,IAAA,EAAM,mCAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,CAAA,EAAG,gBAAA;AAAA,MACH,CAAA,EAAG,gBAAA;AAAA,MACH,CAAA,EAAG,eAAA;AAAA,MACH,CAAA,EAAG;AAAA;AACL,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;AAMM,MAAM,UAAA,GAAaR,gBAAA;AAAA,EACxB,CAAC,EAAE,SAAA,EAAW,OAAO,GAAG,KAAA,IAAS,GAAA,KAAQ;AACvC,IAAA,uBACEJ,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,kBAAA,CAAmB,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,QACjD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;;ACbA,MAAM,oBAAA,GAAuB,MAAA,CAAO,IAAA,EAAM,YAAY,CAAA;AAEtD,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,CAAA;AAAA,EACR,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAiC;AAC/B,EAAA,MAAM,0BACJA,cAAA,CAAC,oBAAA,EAAA,EAAqB,WAAU,iBAAA,EAC7B,QAAA,EAAA,WAAA,mCACE,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,cAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAQ,KAAA,GAAQ,CAAA,EAAc,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAChDA,cAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,GAAA,EACtC,oBAEAiB,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAlB,cAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAQ,KAAA,GAAQ,CAAA,EAAc,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAChDA,cAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,GAAA,EACtC,CAAA,EAEJ,CAAA;AAGF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOA,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,SAAA,EAAY,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBAAOA,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAiB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAiC;AAC/B,EAAA,MAAM,0BACJA,cAAA,CAAC,oBAAA,EAAA,EAAqB,WAAU,MAAA,EAC7B,QAAA,EAAA,WAAA,mCACE,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,cAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7BA,cAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,GAAA,EACtC,oBAEAiB,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAlB,cAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAC7BA,cAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,GAAA,EACtC,CAAA,EAEJ,CAAA;AAEF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOA,cAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,SAAA,EAAY,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBAAOA,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAiB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,OAAA;AACT;AAIA,MAAM,aAAA,GAAgBmB,oBAAA,CAAS,EAAA,KAAO,KAAA,GAAQD,cAAAA,GAAW,UAAA;AAQlD,SAAS,KAAA,CAAM;AAAA,EACpB,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,uCACG,aAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,aAAA,mCACE,OAAA,EAAA,EAAQ,MAAA,EAAO,MAAA,EAAO,SAAA,EAAU,UAC9B,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,IAEA,CAAC,SAAS,GAAI,UAAA,GAAa,EAAC,GAAI,CAAC,MAAM,CAAE,CAAA,CAA2B,GAAA;AAAA,MACpE,CAAC,IAAA,qBACClB,cAAA,CAAC,WAAA,EAAA,EAAuB,KAAA,EAAO,IAAA,EAC7B,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAS,CAAA,EAAA,EAD1B,IAElB;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;AAEA,KAAA,CAAM,OAAA,GAAU,YAAA;AAChB,KAAA,CAAM,UAAA,GAAa,eAAA;;AC/GZ,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA;AACF,CAAA,EAAmC;AACjC,EAAA,sCACG,WAAA,EAAA,EAAY,KAAA,EAAM,SACjB,QAAA,kBAAAiB,eAAA,CAAC,UAAA,EAAA,EAAW,WAAU,gBAAA,EACpB,QAAA,EAAA;AAAA,oBAAAjB,cAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IAC5B;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;;AClBO,MAAM,iBAA4B,CAAC,OAAA,EAAS,EAAE,IAAA,EAAM,YAAW,KAAM;AAC1E,EAAA,IAAI,UAAA,EAAY,SAAA,KAAc,KAAA,EAAO,OAAO,OAAA,EAAQ;AACpD,EAAA,uBAAOA,cAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,IAAA,EAAO,mBAAQ,EAAE,CAAA;AACjD;;ACAA,MAAM,WAAA,GAAcY,mBAAA;AAAA,EAClB;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,sBAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,QAAA,EAAU,EAAE,IAAA,EAAM,EAAA;AAAG,KACvB;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,OAAO,uBAAA,EAAwB;AAAA,MACtE,EAAE,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,OAAO,uBAAA;AAAwB;AACzE,GACF;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAEA,MAAM,YAAA,GAAeA,mBAAA;AAAA,EACnB;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,kCAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,EAAE,UAAA,EAAY,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,OAAO,YAAA,EAAa;AAAA,MAC5D,EAAE,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,OAAO,YAAA;AAAa,KAC/D;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AASA,SAAS,YAAA,CAAa;AAAA,EACpB,QAAA;AAAA,EACA,UAAA,GAAa,OAAA;AAAA,EACb,QAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,uBACEZ,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,WAAA,CAAY,EAAE,UAAA,EAAY,QAAA,EAAU,CAAA,EAClD,QAAA,EAAAc,cAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,0BACvBd,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,EAAE,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,CAAA,EAC1D,QAAA,EAAA,KAAA,EACH,CACD,CAAA,EACH,CAAA;AAEJ;AAQA,SAAS,YAAA,CAAa;AAAA,EACpB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAiC;AAC/B,EAAA,MAAM,QAAA,GAAWmB,oBAAA,CAAS,EAAA,KAAO,KAAA,IAASA,qBAAS,EAAA,KAAO,SAAA;AAE1D,EAAA,IAAIA,oBAAA,CAAS,EAAA,KAAO,KAAA,IAAS,QAAA,KAAa,QAAA,EAAU;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,IAAY,aAAa,KAAA,EAAO;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,mCACJ,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAnB,cAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,CAAA,EAAG,aAAA,EAAe,GAClC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC;AAAA,GAAA,EACH,CAAA,GAEA,QAAA;AAEJ;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK;AACP;;AC9FO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA,EAAM,UAAA;AAAA,EACN,MAAA;AAAA,EACA;AACF,CAAA,EAAsC;AACpC,EAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,uBACEA,cAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAO,MAAA,GAAS,CAAA,EAAG,cAAc,WAAW,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,YAAA;AAAA,MAE1D;AAAA;AAAA,GACH;AAEJ;;AChBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA;AACF,CAAA,EAAsC;AACpC,EAAA,uBAAOA,cAAA,CAAC,iBAAA,EAAA,EAAkB,MAAA,EAAiB,QAAA,EAAS,CAAA;AACtD;;ACeA,SAAS,eAAe,OAAA,EAAyC;AAC/D,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;AAYA,SAAS,WAAA,CACP,SAAA,EACA,cAAA,EACA,QAAA,EACY;AACZ,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIoB,cAAA,CAAqB,EAAE,CAAA;AACrD,EAAA,MAAM,cAAcC,YAAA,CAAiB,EAAE,KAAK,SAAA,EAAW,IAAA,EAAM,UAAU,CAAA;AACvE,EAAA,MAAM,WAAA,GAAcA,aAAkB,QAAQ,CAAA;AAC9C,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,SAAA,GAAYA,YAAA,CAAwC,EAAE,CAAA;AAE5D,EAAAC,eAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,SAAA,CAAU,OAAA,CAAQ,QAAQ,YAAY,CAAA;AAAA,IACxC,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,IAAA,IAAI,QAAA,CAAS,QAAQ,SAAA,EAAW;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,WAAA,CAAY,UAAU,EAAE,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,YAAY,OAAA,EAAQ;AAClE,IAAA,UAAA,CAAW,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,QAAQ,CAAC,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,UAAA,CAAW,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,KAAS,QAAQ,CAAC,CAAA;AAC7D,MAAA,SAAA,CAAU,UAAU,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,KAAK,CAAA;AAAA,IACjE,GAAG,cAAc,CAAA;AACjB,IAAA,SAAA,CAAU,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,SAAA,EAAW,cAAc,CAAC,CAAA;AAE9B,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,QAAQ,QAAA,EAAqC;AACpD,EAAA,OAAOR,eAAS,OAAA,CAAQ,QAAQ,CAAA,CAC7B,MAAA,CAAOS,oBAAc,CAAA,CACrB,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAY,IAAA,EAAM,OAAM,CAAE,CAAA;AAC5D;AAQA,SAAS,SAAA,CAAU,UAAiB,IAAA,EAAoB;AACtD,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAI,CAAA;AAC5B,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAgB;AAC1C,EAAA,IAAI,UAAiB,EAAC;AAEtB,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACpB,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,aAAA,CAAc,GAAA,CAAI,KAAK,OAAO,CAAA;AAC9B,QAAA,OAAA,GAAU,EAAC;AAAA,MACb;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,IACvB;AACA,IAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EACjB;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,GAAG,OAAO,CAAA;AACtB,EAAA,OAAO,MAAA;AACT;AAYA,SAAS,eAAA,CACP,UACA,cAAA,EACgB;AAChB,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAQ,CAAA;AAC9B,EAAA,MAAM,WAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,GAAG,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,CAAK,IAAG,CAAA;AAEnC,EAAA,MAAM,QAAA,GAAWF,YAAA,iBAA4B,IAAI,GAAA,EAAK,CAAA;AACtD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,EAC1C;AACA,EAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,eAAgB,QAAQ,CAAA;AAClD,EAAA,MAAM,QAAA,GAAWC,aAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,EAAA,MAAM,SAAA,GAAYA,YAAA,iBAAgD,IAAI,GAAA,EAAK,CAAA;AAE3E,EAAAC,eAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,SAAA,CAAU,OAAA,CAAQ,QAAQ,YAAY,CAAA;AAAA,IACxC,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAME,KAAAA,GAAO,IAAI,GAAA,CAAI,WAAA,CAAY,OAAO,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,CAAS,OAAA,EAAS,YAAY,OAAO,CAAA;AAGhE,IAAA,KAAA,MAAW,GAAA,IAAO,YAAY,OAAA,EAAS;AACrC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACvC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,CAACA,KAAAA,CAAK,GAAA,CAAI,GAAG,CAAA,IAAK,CAAC,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACjD,QAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,UAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC5B,UAAA,QAAA,CAAS,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC3B,UAAA,QAAA,CAAS,CAAC,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,GAAG,CAAC,CAAA;AAAA,QACxD,GAAG,cAAc,CAAA;AACjB,QAAA,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,SAAA,EAAW,cAAc,CAAC,CAAA;AAE9B,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACzB,GAAA;AAAA,IACA,IAAA,EAAM,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,IAC9B,OAAA,EAAS,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG;AAAA,GACxB,CAAE,CAAA;AACJ;AA0BO,SAAS,YAAA,CAAa;AAAA,EAC3B,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,QAAA,EAAU,cAAc,CAAA;AAEtD,EAAA,uBACExB,cAAA,CAAAkB,mBAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVlB,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAW,WAAA;AAAA,QACT,SAAA;AAAA,QACA,IAAA,CAAK,UAAU,aAAA,GAAgB;AAAA,OACjC;AAAA,MAEC,QAAA,EAAA,IAAA,CAAK;AAAA,KAAA;AAAA,IAND,IAAA,CAAK;AAAA,GAQb,CAAA,EACH,CAAA;AAEJ;AAkBO,SAAS,WAAA,CAAY;AAAA,EAC1B,SAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,SAAA,EAAW,cAAA,EAAgB,QAAQ,CAAA;AAE/D,EAAA,uBACEiB,eAAA,CAAAC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AACrB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,OAAOO,mBAAa,IAAA,EAAM;AAAA,QACxB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,SAAA,EAAW,WAAA;AAAA,UACT,KAAK,KAAA,CAAM,SAAA;AAAA,UACX,SAAA;AAAA,UACA;AAAA;AACF,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,IACAA,mBAAa,QAAA,EAAU;AAAA,MACtB,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,QACT,SAAS,KAAA,CAAM,SAAA;AAAA,QACf,SAAA;AAAA,QACA;AAAA;AACF,KACD;AAAA,GAAA,EACH,CAAA;AAEJ;;ACrSO,MAAM,oBAAA,GAAuB;AAAA,EAClC,OAAA,EAAS,GAAA;AAAA,EACT,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ;AACV;;ACCA,MAAM,sBAAA,GAAyB,CAAA;AAMxB,SAAS,iBAAA,GAAoC;AAClD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIL,eAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,iBAAA,GAAoBC,aAAO,CAAC,CAAA;AAClC,EAAA,MAAM,gBAAA,GAAmBA,aAAO,CAAC,CAAA;AACjC,EAAA,MAAM,eAAA,GAAkBA,aAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,wBAAwB,MAAY;AACxC,IAAA,kBAAA;AAAA,MACE,gBAAA,CAAiB,OAAA,GAAU,eAAA,CAAgB,OAAA,IACzC,kBAAkB,OAAA,GAAU;AAAA,KAChC;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,mBAAA,EAAqB,EAAA;AAAA,MACrB,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA,CAAM,WAAA,CAAY,MAAA,CAAO,MAAA;AACrD,QAAA,qBAAA,EAAsB;AAAA,MACxB,CAAA;AAAA,MACA,mBAAA,EAAqB,CAAC,MAAA,EAAQ,MAAA,KAAW;AACvC,QAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAC3B,QAAA,qBAAA,EAAsB;AAAA,MACxB,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAa,iBAAA,KAClC,KAAA,CAAM,WAAA;AACR,QAAA,eAAA,CAAgB,UAAU,aAAA,CAAc,CAAA;AACxC,QAAA,gBAAA,CAAiB,UAAU,WAAA,CAAY,MAAA;AACvC,QAAA,iBAAA,CAAkB,UAAU,iBAAA,CAAkB,MAAA;AAC9C,QAAA,qBAAA,EAAsB;AAAA,MACxB;AAAA;AACF,GACF;AACF;;ACrDO,MAAM,gBAAA,GAAmBK,oCAAA;AA0BzB,SAAS,cAAc,SAAA,EAA+C;AAC3E,EAAA,MAAM,KAAA,GAAQ,SAAA,CACX,KAAA,CAAM,KAAK,EACX,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,WAAW,OAAO,CAAC,CAAA,EACtC,KAAA,CAAM,QAAQ,MAAM,CAAA;AACxB,EAAA,OAAO,gBAAA,CAAiB,CAAA,QAAA,EAAW,KAAA,IAAS,OAAO,CAAA,CAAE,CAAA;AACvD;;ACtBA,MAAM,sBAAsB,MAAM;AAChC,EAAA,MAAM,SAAA,GAAY,iBAAiB,YAAY,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,iBAAiB,YAAY,CAAA;AAE/C,EAAA,OAAO,OAAO,MAAc,gBAAA,KAA+C;AACzE,IAAA,QAAQ,iBAAiB,MAAA;AAAQ,MAC/B,KAAK,YAAA,EAAc;AACjB,QAAA,OAAOC,qBAAA,CAAW,iBAAiB,IAAA,EAAM;AAAA,UACvC,aAAA,EAAe,SAAA;AAAA,UACf,kBAAA,EAAoB,OAAA;AAAA,UACpB,mBAAmBC,sCAAA,CAA4B,UAAA;AAAA,UAC/C,YAAA,EAAc,SAAA;AAAA,UACd,qBAAA,EAAuB,SAAA;AAAA,UACvB,UAAA,EAAY,KAAA;AAAA,UACZ,mBAAA,EAAqB,KAAA;AAAA,UACrB,SAAA,EAAW,IAAA;AAAA,UACX,0BAAA,EAA4B;AAAA,SAC7B,CAAA;AAAA,MACH;AAAA,MACA,KAAK,SAAA,EAAW;AACd,QAAA,OAAOC,mBAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,MAC7B;AAAA,MACA,SAAS;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,qCAAA,EAAwC,iBAAiB,MAAgB,CAAA;AAAA,SAC3E;AAAA,MACF;AAAA;AACF,EACF,CAAA;AACF,CAAA;AAcO,SAAS,YAAA,CAA+C;AAAA,EAC7D,EAAA,EAAI,CAAA;AAAA,EACJ,IAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiE;AAC/D,EAAA,MAAM,mBAAmB,mBAAA,EAAoB;AAC7C,EAAA,MAAM,WAAA,GAA6D,CAAC,CAAA,KAAM;AACxE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,CAAC,CAAA;AACT,MAAA,IAAI,GAAG,gBAAA,EAAkB;AAAA,IAC3B;AAEA,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,OAAO,gBAAA,CAAiB,MAAM,gBAAgB,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,uBAAO7B,cAAA,CAAC,CAAA,EAAA,EAAG,GAAI,KAAA,EAAe,SAAS,WAAA,EAAa,CAAA;AACtD;;ACrEO,MAAM,+BAAA,GAA4D;AAAA,EACvE,MAAA,EAAQ,YAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;;ACcO,SAAS,IAAA,CAAK;AAAA,EACnB,IAAA;AAAA,EACA,IAAA,GAAO,EAAA;AAAA,EACP,SAAA,GAAY;AACd,CAAA,EAAyB;AAGvB,EAAA,MAAM,KAAA,GAAQ,cAAc,SAAS,CAAA;AACrC,EAAA,OAAOyB,mBAAa,IAAA,EAAM;AAAA,IACxB,KAAA;AAAA,IACA,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;;ACXA,MAAM,cAAA,GAAiB,QAAA,CAAS,uBAAA,CAAwBK,qBAAM,CAAA;AAG9D,MAAM,UAAUC,eAAA,CAAO,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,MAAM,CAAC,CAAA;AAEpC,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAM7B,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,GAAS,CAAA,CAAA;AAC9B,EAAA,MAAM,eAAe,MAAA,GAAS,KAAA;AAC9B,EAAA,MAAM,oBAAoB,WAAA,GAAc,KAAA;AACxC,EAAA,MAAM,gBAAA,GACJ,gBAAA,IAAoB,IAAA,GAAO,MAAA,GAAY,gBAAA,GAAmB,KAAA;AAI5D,EAAA,MAAM,cAAA,GAAiBC,uBAAA,CAAe,gBAAA,IAAoB,CAAC,CAAA;AAE3D,EAAAV,eAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,KAAA,GAAQW,mBAAA,CAAW,gBAAA,IAAoB,CAAA,EAAG;AAAA,MACvD,UAAU,oBAAA,CAAqB,QAAA;AAAA,MAC/B,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,cAAA,EAAgB,gBAAgB,CAAC,CAAA;AAErC,EAAA,MAAM,aAAA,GAAgBC,0BAAiB,OAAO;AAAA,IAC5C,kBAAkB,cAAA,CAAe;AAAA,GACnC,CAAE,CAAA;AAEF,EAAA,uBACElC,cAAA,CAACmC,sBAAI,KAAA,EAAc,KAAA,EAAc,QAAgB,OAAA,EAAQ,aAAA,EACtD,6BAAmB,IAAA,mBAClBnC,cAAA;AAAA,IAAC8B,qBAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,GAAA;AAAA,MACJ,EAAA,EAAI,GAAA;AAAA,MACJ,CAAA,EAAG,YAAA;AAAA,MACH,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,iBAAA;AAAA,MACb,IAAA,EAAK;AAAA;AAAA,GACP,mBAEA9B,cAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,aAAA;AAAA,MACA,EAAA,EAAI,GAAA;AAAA,MACJ,EAAA,EAAI,GAAA;AAAA,MACJ,CAAA,EAAG,YAAA;AAAA,MACH,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,iBAAA;AAAA,MACb,iBAAiB,eAAA,GAAkB,KAAA;AAAA,MACnC,aAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAU,qBAAA;AAAA,MACV,IAAA,EAAK;AAAA;AAAA,GACP,EAEJ,CAAA;AAEJ;;AC1FA,MAAM,YAAA,GAAe,GAAA;AACrB,MAAM,cAAA,GAAiB,GAAA;AACvB,MAAM,eAAA,GAAkB,GAAA;AACxB,MAAM,YAAA,GAAe,GAAA;AAOd,MAAM,2BAAA,GACX,eAAe,oBAAA,CAAqB,IAAA;AAEtC,MAAM,MAAA,GAAS,MAAc,IAAA,CAAK,IAAA,CAAK,KAAK,MAAA,EAAO,GAAI,GAAG,CAAA,GAAI,GAAA;AAO9D,SAAS,sBAAsB,QAAA,EAA0B;AACvD,EAAA,IAAI,WAAW,EAAA,EAAI,OAAO,QAAA,GAAW,MAAA,KAAW,EAAA,GAAK,CAAA;AACrD,EAAA,IAAI,WAAW,EAAA,EAAI,OAAO,QAAA,GAAW,MAAA,KAAW,EAAA,GAAK,CAAA;AACrD,EAAA,IAAI,QAAA,GAAW,EAAA,EAAI,OAAO,QAAA,GAAW,QAAO,GAAI,CAAA;AAChD,EAAA,IAAI,QAAA,GAAW,EAAA,EAAI,OAAO,QAAA,GAAW,QAAO,GAAI,CAAA;AAChD,EAAA,IAAI,QAAA,GAAW,EAAA,EAAI,OAAO,QAAA,GAAW,GAAA;AACrC,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,qBAAqB,OAAA,EAGnC;AACA,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIoB,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAA,CAAS,CAAC,OAAO,CAAA;AAE7C,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,MAAM,UAAA,GAAa,WAAW,MAAM;AAClC,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAChB,GAAG,YAAY,CAAA;AACf,IAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAClC,MAAA,WAAA,CAAY,qBAAqB,CAAA;AAAA,IACnC,GAAG,cAAc,CAAA;AAEjB,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,UAAU,CAAA;AACvB,MAAA,aAAA,CAAc,SAAS,CAAA;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,OAAO,MAAA;AAEpB,IAAA,MAAM,aAAA,GAAgB,WAAW,MAAM;AACrC,MAAA,WAAA,CAAY,GAAG,CAAA;AAAA,IACjB,GAAG,eAAe,CAAA;AAClB,IAAA,MAAM,UAAA,GAAa,WAAW,MAAM;AAClC,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IACf,GAAG,YAAY,CAAA;AAEf,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,aAAa,CAAA;AAC1B,MAAA,YAAA,CAAa,UAAU,CAAA;AAAA,IACzB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAC5B;;AC/DA,MAAM,cAAA,GAAuD;AAAA,EAC3D,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,MAAM,iBAAA,GAA0D;AAAA,EAC9D,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,MAAM,OAAOV,mBAAA,CAAG;AAAA,EACd,IAAA,EAAM,2CAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA;AAC7B,CAAC,CAAA;AAWM,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,MAAA,GAAS,OAAA;AAAA,EACT,IAAA,GAAO;AACT,CAAA,EAAqC;AACnC,EAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,EAAA,MAAM,WAAA,GAAc,kBAAkB,IAAI,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAA,CAAU,WAAW,WAAA,IAAe,CAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,MAAA;AACpC,EAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,QAAA,EAAU,CAAC,GAAG,GAAG,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,aAAA,IAAiB,CAAA,GAAI,eAAA,GAAkB,GAAA,CAAA;AAC1D,EAAA,MAAM,SAAS,QAAA,GAAW,CAAA;AAE1B,EAAA,MAAM,SAAA,mBACJZ,cAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,QAAgB,WAAA,EAA0B,CAAA;AAGxE,EAAA,MAAM,QAAA,mBACJA,cAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAiB,aAAA;AAAA,MACjB,gBAAA,EAAkB;AAAA;AAAA,GACpB;AAGF,EAAA,uBACEA,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAiB,eAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA;AAAA,MAC1B,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,MAE3C,QAAA,EAAA;AAAA,wBAAAjB,cAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kBAAA,EACd,QAAA,kBAAAA,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,SAAA;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,SAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,wBACAA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACd,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,SAAA,EAAU,aAAA,EAAc,CAAA,EAChE;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;AAUO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAkD;AAChD,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,qBAAqB,OAAO,CAAA;AAEzD,EAAA,uBACEA,cAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;;AC3GA,MAAM,oBAAA,GAAuBY,mBAAA;AAAA,EAC3B;AAAA,IACE,MAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,SAAA,EAAW;AAAA,UACT,YAAA;AAAA,UACA,OAAA,CAAQ,GAAA,CAAI,6BAAA,GACR,EAAA,GACA,6CAAA;AAAA,UACJ,sCAAA;AAAA,UACA,sCAAA;AAAA,UACA,wCAAA;AAAA,UACA,iEAAA;AAAA,UACA,2EAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,QAAA,EAAU;AAAA,UACR,qBAAA;AAAA,UACA,OAAA,CAAQ,GAAA,CAAI,6BAAA,GACR,EAAA,GACA,uCAAA;AAAA,UACJ,yCAAA;AAAA,UACA,yCAAA;AAAA,UACA,2CAAA;AAAA,UACA,+CAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG,CAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,2BAAA;AAAA,UACA,sDAAA;AAAA,UACA,sDAAA;AAAA,UACA,yDAAA;AAAA,UACA,+CAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG;AAAA,OACZ;AAAA,MACA,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,6BAAA,GAC1B;AAAA;AAAA,MAEE;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,UAAA,EAAY,MAAA;AAAA,QACZ,KAAA,EAAO,KAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA;AAAA,MAEA;AAAA,QACE,OAAA,EAAS,UAAA;AAAA,QACT,UAAA,EAAY,MAAA;AAAA,QACZ,KAAA,EAAO,KAAA;AAAA,QACP,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,UAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,UAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,UAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA;AAAA,MAEA;AAAA,QACE,OAAA,EAAS,OAAA;AAAA,QACT,UAAA,EAAY,MAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,OAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,OAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MACA;AAAA,QACE,OAAA,EAAS,OAAA;AAAA,QACT,UAAA,EAAY,OAAA;AAAA,QACZ,SAAA,EAAW;AAAA;AACb,KACF,GACA,MAAA;AAAA,IACJ,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAYO,MAAM,YAAA,GAAeR,gBAAA;AAAA,EAC1B,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,YAAY,MAAA,EAAQ,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC7D,IAAA,uBACEJ,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAA,cAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,uBAAA,EAAuB,IAAA;AAAA,QACvB,IAAA,EAAK,QAAA;AAAA,QACL,WAAW,oBAAA,CAAqB;AAAA,UAC9B,OAAA;AAAA,UAEA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACA,GAAG;AAAA;AAAA,KACN,EACF,CAAA;AAAA,EAEJ;AACF;;AC/IO,MAAM,YAAA,GAAe;AAAA,EAC1B,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,MAAM,cAAA,GAAiBY,mBAAA;AAAA,EACrB;AAAA,IACE,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,+BAAA;AAAA,MACP,IAAA,EAAM,oEAAA;AAAA,MACN,IAAA,EAAM,EAAA;AAAA,MACN,YAAA,EAAc,aAAA;AAAA,MACd,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI;AAAA,UACF,KAAA,EAAO,uCAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACR;AAAA,QACA,EAAA,EAAI;AAAA,UACF,KAAA,EAAO,qCAAA;AAAA,UACP,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,SAAA,EAAW,EAAE,IAAA,EAAM,gBAAA,EAAiB;AAAA,QACpC,QAAA,EAAU,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,QAC/B,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA;AAAa,OAC9B;AAAA,MACA,UAAU,EAAE,IAAA,EAAM,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,MAChC,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,YAAA,EAAa;AAAA,QAC/C,OAAO;AAAC;AACV,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,EAAE,IAAA,EAAM,gBAAA;AAAiB,OAClC;AAAA,MACA;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,IAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,iCAAA;AAAA,UACN,IAAA,EAAM;AAAA;AACR,OACF;AAAA,MACA,EAAE,SAAS,UAAA,EAAY,QAAA,EAAU,OAAO,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAa,EAAE;AAAA,MACtE;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,qBAAA,EAAuB,MAAM,qBAAA;AAAsB,OACpE;AAAA,MACA;AAAA,QACE,OAAA,EAAS,UAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,qBAAA,EAAuB,MAAM,qBAAA;AAAsB;AACpE,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,WAAA;AAAY,GACtD;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAQA,SAAS,oBAAoB,KAAA,EAG3B;AACA,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,OAAO;AAAA,MACL,YAAA,iCAAewB,6CAAA,EAAA,EAAuB,CAAA;AAAA,MACtC,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AACA,EAAA,IAAI,UAAU,QAAA,EAAU;AACtB,IAAA,OAAO;AAAA,MACL,YAAA,iCAAeC,qCAAA,EAAA,EAAmB,CAAA;AAAA,MAClC,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,YAAA,EAAc,MAAA,EAAW,kBAAA,EAAoB,MAAA,EAAU;AAClE;AAeA,SAAS,gBAAA,CAAiB;AAAA,EACxB,QAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,OAAO,QAAA,KAAa,QAAQ,KAAA,IAAS,IAAA;AACvC;AAEO,SAAS,MAAA,CAAO;AAAA,EACrB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAS,OAAA;AAAA,EACT,OAAA,GAAU,WAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,YAAY,KAAA,KAAU,SAAA;AAM5B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIjB,eAAS,SAAS,CAAA;AACxD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,GAAG,2BAA2B,CAAA;AAC9B,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,EAAE,YAAA,EAAc,kBAAA,EAAmB,GAAI,oBAAoB,KAAK,CAAA;AACtE,EAAA,MAAM,cAAA,GAAiB,eAAe,YAAA,KAAiB,MAAA;AAEvD,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,EAAE,QAAA,EAAU,OAAO,CAAA;AACvD,EAAA,MAAM,SAAS,cAAA,CAAe;AAAA,IAC5B,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,uBACEL,eAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,EAAE,WAAW,CAAA;AAAA,MACpC,GAAG,cAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,cAAA,mBACCjB,cAAA,CAAC,QAAK,SAAA,EAAW,MAAA,CAAO,sBAAqB,EAC1C,QAAA,EAAA,WAAA,IAAe,CAAC,YAAA,mBACfA,cAAA;AAAA,UAAC,6BAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,SAAA;AAAA,YACT,MAAA;AAAA,YACA,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO;AAAA;AAAA,SAC/B,mBAEAA,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,kBAAA,EACnB,QAAA,kBAAAA,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,YAAA;AAAA,YACN,SAAA,EAAW,OAAO,YAAA,EAAa;AAAA,YAC/B,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK;AAAA;AAAA,SAC7B,EACF,GAEJ,CAAA,GACE,IAAA;AAAA,QACH,IAAA,mBACCA,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,SAAA,EAAW,OAAO,IAAA,EAAK;AAAA,YACvB,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK;AAAA;AAAA,SAC7B,GACE,IAAA;AAAA,wBACJA,cAAA,CAAC,QAAK,eAAA,EAAe,UAAA,EAAY,WAAW,MAAA,CAAO,IAAA,IAChD,QAAA,EAAA,IAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ;AAQO,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA;AAAA,EACA,gBAAA,GAAmB,+BAAA;AAAA,EACnB,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuC;AACrC,EAAA,uBACEA,cAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI,MAAA;AAAA,MAIJ,IAAA,EAAM,gBAAA,CAAiB,WAAW,CAAA,GAAI,EAAA,GAAK,IAAA;AAAA,MAC3C,gBAAA;AAAA,MACA,IAAA,EAAK,MAAA;AAAA,MACL,SAAS,OAAA,IAAW,MAAA;AAAA,MACnB,GAAG;AAAA;AAAA,GACN;AAEJ;AAMO,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA,EAAM,KAAA;AAAA,EACN,GAAG;AACL,CAAA,EAAuC;AACrC,EAAA,uBAAOA,cAAA,CAAC,MAAA,EAAA,EAAQ,GAAG,WAAA,EAAa,MAAK,MAAA,EAAO,CAAA;AAC9C;;ACrPA,MAAM,kBAAA,GAAqBY,mBAAA;AAAA,EACzB;AAAA,IACE,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,mCAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,WAAW,EAAC;AAAA,QACZ,UAAU,EAAC;AAAA,QACX,OAAO;AAAC,OACV;AAAA,MACA,QAAA,EAAU;AAAA,QACR,MAAM,EAAC;AAAA,QACP,OAAO;AAAC;AACV,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,gBAAA;AAAiB,OAClC;AAAA,MACA;AAAA,QACE,OAAA,EAAS,UAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA;AAAa,OAC9B;AAAA,MACA;AAAA,QACE,OAAA,EAAS,OAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA;AAAa,OAC9B;AAAA,MACA;AAAA,QACE,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,qBAAA;AAAsB,OACvC;AAAA,MACA;AAAA,QACE,OAAA,EAAS,UAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,qBAAA;AAAsB,OACvC;AAAA,MACA;AAAA,QACE,OAAA,EAAS,OAAA;AAAA,QACT,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,qBAAA;AAAsB;AACvC,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,OAAA,EAAS,WAAA;AAAY,GAC1C;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAWO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,OAAA,GAAU,WAAA;AAAA,EACV,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,MAAM,WAAW,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,aAAa,IAAI,CAAA;AACpE,EAAA,MAAM,SAAS,kBAAA,CAAmB,EAAE,SAAS,QAAA,EAAU,QAAA,KAAa,MAAM,CAAA;AAE1E,EAAA,uBACEZ,cAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,EAAE,WAAW,CAAA;AAAA,MACrC,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,MAC1C,GAAG,cAAA;AAAA,MAEJ,QAAA,kBAAAA,cAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,IAAA,EAAM,QAAA,IAAY,QAAA,KAAa,MAAA,GAAS,GAAA,GAAM,IAAA,CAAA;AAAA,UAC9C,SAAA,EAAW,OAAO,IAAA;AAAK;AAAA;AACzB;AAAA,GACF;AAEJ;;ACzEA,MAAM,sBAAA,GAAyBmB,qBAAS,EAAA,KAAO,KAAA;AAQ/C,MAAM,gBAAgBP,mBAAA,CAAG;AAAA,EACvB,KAAA,EAAO;AAAA;AAAA;AAAA,IAGL,KAAA,EAAO,mBAAA;AAAA,IACP,KAAA,EAAO,uBAAA;AAAA,IACP,MAAA,EAAQ,qBAAA;AAAA,IACR,aAAA,EAAe,EAAA;AAAA;AAAA;AAAA,IAGf,MAAA,EACE;AAAA,GACJ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI;AAAA,QACF,KAAA,EAAO,eAAA;AAAA,QACP,KAAA,EAAO,iBAAA;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,aAAA,EAAe,MAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,EAAA,EAAI;AAAA,QACF,KAAA,EAAO,eAAA;AAAA,QACP,KAAA,EAAO,gBAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAe,KAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,EAAA,EAAI;AAAA,QACF,KAAA,EAAO,eAAA;AAAA,QACP,KAAA,EAAO,gBAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAe,KAAA;AAAA,QACf,MAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,EAAE,aAAA,EAAe,MAAA;AAAO,KAChC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,cAAA,EAAgB;AAAA,MACd,MAAM;AAAC,KACT;AAAA;AAAA;AAAA,IAGA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,EAAE,MAAA,EAAQ,qBAAA;AAAsB;AACxC,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,EAAE,MAAM,IAAA,EAAM,cAAA,EAAgB,MAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAE;AAAA,IAC/D,EAAE,MAAM,IAAA,EAAM,cAAA,EAAgB,MAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAE;AAAA,IAC9D,EAAE,MAAM,IAAA,EAAM,cAAA,EAAgB,MAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAE,GAChE;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA;AAC3B,CAAC,CAAA;AAsCM,SAAS,KAAA,CAAM;AAAA,EACpB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,KAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,oBAAA,GAAuB,OAAA;AAAA,EACvB,IAAA,GAAO,QAAA;AAAA,EACP,kBAAA,EAAoB,eAAA;AAAA,EACpB;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAI0B,+BAAA,EAAoB;AACrD,EAAA,MAAM,UAAUC,WAAA,EAAM;AACtB,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAA;AACxC,EAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAgB,GAAI,iBAAA,EAAkB;AAC/D,EAAA,MAAM,SAAS,aAAA,CAAc;AAAA,IAC3B,IAAA;AAAA,IACA,YAAY,MAAA,KAAW,MAAA;AAAA,IACvB,KAAA,EAAO,MAAA,KAAW,MAAA,IAAa,CAAC,eAAA;AAAA,IAChC,gBAAgB,CAAC;AAAA,GAClB,CAAA;AACD,EAAA,MAAM,aAAA,GACJ,MAAA,KAAW,MAAA,GAAY,IAAA,mBACrBvC,cAAA,CAAC,UAAO,SAAA,EAAW,MAAA,CAAO,MAAA,EAAO,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA;AAGhD,EAAA,uBACEA,cAAA;AAAA,IAACwC,iBAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,IAAA;AAAA,MACX,OAAA;AAAA,MACA,aAAA,EAAc,MAAA;AAAA,MACd,cAAA,EAAgB,OAAA;AAAA,MAEhB,yCAAC,iBAAA,EAAA,EAAkB,MAAA,EACjB,QAAA,kBAAAvB,eAAA,CAAC,IAAA,EAAA,EAAK,WAAU,wBAAA,EAKd,QAAA,EAAA;AAAA,wBAAAjB,cAAA;AAAA,UAACa,qBAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAW,KAAA;AAAA,YACX,SAAA,EAAU,iCAAA;AAAA,YACV,OAAA,EAAS;AAAA;AAAA,SACX;AAAA,wBACAb,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAU,IAAA;AAAA,YACV,IAAA;AAAA,YACA,iBAAA,EAAiB,OAAA;AAAA,YACjB,kBAAA,EAAkB,eAAA;AAAA,YAClB,MAAA;AAAA,YACA,SAAA,EAAW,OAAO,KAAA,EAAM;AAAA,YAExB,QAAA,kBAAAiB,eAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,OAAM,EAG5B,QAAA,EAAA;AAAA,8BAAAA,eAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,OAAO,MAAA,EAAO;AAAA,kBACzB,KAAA,EAAO,EAAE,SAAA,EAAW,YAAA,CAAa,QAAQ,CAAA,EAAE;AAAA,kBAE1C,QAAA,EAAA;AAAA,oBAAA,IAAA,KAAS,MAAA,GAAY,uBACpBjB,cAAA,CAAC,IAAA,EAAA,EAAK,MAAY,IAAA,EAAM,EAAA,EAAI,WAAU,aAAA,EAAc,CAAA;AAAA,oCAEtDA,cAAA;AAAA,sBAAC,IAAA;AAAA,sBAAA;AAAA,wBACC,QAAA,EAAU,OAAA;AAAA,wBACV,SAAA,EAAU,gEAAA;AAAA,wBAET,QAAA,EAAA;AAAA;AAAA,qBACH;AAAA,oBACC,kBAAkB,IAAA,mBACjBA,cAAA;AAAA,sBAAC,UAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,iCAAOyC,yBAAA,EAAA,EAAa,CAAA;AAAA,wBACpB,OAAA,EAAQ,OAAA;AAAA,wBACR,IAAA,EAAM,QAAA;AAAA,wBACN,YAAA,EAAY,oBAAA;AAAA,wBACZ,OAAA,EAAS;AAAA;AAAA;AACX;AAAA;AAAA,eAEJ;AAAA,8BAMAxB,eAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,QAAA;AAAA,kBACV,KAAA,EAAO,EAAE,SAAA,EAAW,YAAA,GAAe,GAAA,EAAI;AAAA,kBACvC,yBAAA,EAA2B,OAAO,aAAA,EAAc;AAAA,kBAC/C,GAAG,eAAA;AAAA,kBAEH,QAAA,EAAA;AAAA,oBAAA,QAAA;AAAA,oBAIA,yBAAyB,aAAA,GAAgB;AAAA;AAAA;AAAA,eAC5C;AAAA,cAMC,yBAAyB,IAAA,GAAO;AAAA,aAAA,EACnC;AAAA;AAAA;AACF,OAAA,EACF,CAAA,EACF;AAAA;AAAA,GACF;AAEJ;;ACjOA,MAAM,oBAAA,GAAuBL,mBAAA;AAAA,EAC3B;AAAA,IACE,IAAA,EAAM,2DAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,wBAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,OAAA,EAAS;AAAA;AAAA,QAEP,OAAA,EAAS,UAAA;AAAA;AAAA;AAAA,QAGT,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,SAAA;AAAU,GACpD;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAMA,MAAM8B,cAAyC,EAAE,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAG;AACxE,MAAM,mBAAA,GAAmD;AAAA,EACvD,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAwBO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,eAAA,GAAkB,oBAAoB,IAAI,CAAA;AAChD,EAAA,uBACE1C,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EACX,QAAA,kBAAAiB,eAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,oBAAA,CAAqB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EACpD,QAAA,EAAA;AAAA,oBAAAjB,cAAA,CAAC,QAAK,IAAA,EAAY,IAAA,EAAM0C,YAAU,IAAI,CAAA,EAAG,WAAU,aAAA,EAAc,CAAA;AAAA,oBAIjE1C,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAS,CAAA;AAAA,IAClD,SAAA,mBACCA,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,KAAA,EAAO,eAAA,EAAiB,QAAQ,eAAA,EAAgB;AAAA,QACzD,SAAA,EAAU,sBAAA;AAAA,QAEV,QAAA,kBAAAA,cAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,IAAA,iCAAOyC,yBAAA,EAAA,EAAa,CAAA;AAAA,YACpB,QAAA,EAAU,IAAA,KAAS,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,YACnC,IAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAQ,OAAA;AAAA,YACR,YAAA,EAAY,oBAAA;AAAA,YACZ,OAAA,EAAS;AAAA;AAAA;AACX;AAAA,KACF,GACE;AAAA,GAAA,EACN,CAAA,EACF,CAAA;AAEJ;AAIO,SAAS,YAAY,KAAA,EAAsC;AAChE,EAAA,uBAAOzC,cAAA,CAAC,WAAS,GAAG,KAAA,EAAO,QAAO,MAAA,EAAO,IAAA,kBAAMA,cAAA,CAAC2C,+BAAA,EAAA,EAAgB,CAAA,EAAI,CAAA;AACtE;AAEO,SAAS,oBAAoB,KAAA,EAAsC;AACxE,EAAA,uBAAO3C,cAAA,CAAC,WAAS,GAAG,KAAA,EAAO,QAAO,SAAA,EAAU,IAAA,kBAAMA,cAAA,CAAC4C,iCAAA,EAAA,EAAiB,CAAA,EAAI,CAAA;AAC1E;AAEO,SAAS,eAAe,KAAA,EAAsC;AACnE,EAAA,uBAAO5C,cAAA,CAAC,WAAS,GAAG,KAAA,EAAO,QAAO,SAAA,EAAU,IAAA,kBAAMA,cAAA,CAAC6C,qCAAA,EAAA,EAAmB,CAAA,EAAI,CAAA;AAC5E;AAEO,SAAS,aAAa,KAAA,EAAsC;AACjE,EAAA,uBAAO7C,cAAA,CAAC,WAAS,GAAG,KAAA,EAAO,QAAO,QAAA,EAAS,IAAA,kBAAMA,cAAA,CAACqC,qCAAA,EAAA,EAAmB,CAAA,EAAI,CAAA;AAC3E;;AC7GO,SAAS,uBAAA,CAAwB;AAAA,EACtC,KAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,uBACErC,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,CAAA,8DAAA,EACT,KAAA,GAAQ,yBAAA,GAA4B,wBACtC,CAAA,CAAA;AAAA,MAKC,QAAA,EAAA,KAAA,KAAU,IAAA,GAAO,IAAA,mBAChBA,cAAA,CAAC,YAAA,EAAA,EAAa,MAAK,IAAA,EAAK,OAAA,EACrB,QAAA,EAAA,cAAA,CAAe,KAAK,CAAA,EACvB;AAAA;AAAA,GAEJ;AAEJ;;ACjCO,MAAM,wBAAA,GAA2B,GAAA;AAaxC,MAAM,SAAA,GAA6B,EAAE,WAAA,EAAa,MAAA,EAAW,OAAO,IAAA,EAAK;AAEzE,SAAS,iBAAA,CACP,eACA,MAAA,EACiB;AACjB,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,KAAA,EAAO,IAAA,EAAK;AAAA,IAC/C,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,KAAA,EAAO,IAAA,EAAK;AAAA,IAC/C,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,IACtD,KAAK,gBAAA;AACH,MAAA,OAAO,EAAE,WAAA,EAAa,MAAA,EAAW,KAAA,EAAO,cAAc,KAAA,EAAM;AAAA,IAC9D;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,KAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA;AAEnE;AAMO,SAAS,cACd,OAAA,EACqB;AACrB,EAAA,MAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA,GAAI8C,gBAAA,CAAW,mBAAmB,SAAS,CAAA;AAC3E,EAAA,MAAM,eAAA,GAAkBzB,aAAsC,MAAS,CAAA;AAEvE,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAAA,IACtC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAS,YAAY,KAAA,EAAoC;AACvD,IAAA,IAAI,eAAA,CAAgB,gBAAgB,SAAA,EAAW;AAC/C,IAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AACpC,IAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAC5B,IAAA,IAAI,EAAE,kBAAkB,OAAA,CAAA,EAAU;AAClC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAE1B,IAAA,SAAS,sBAAA,GAA+B;AACtC,MAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,MAAM;AACzC,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,gBAAA,EAAkB,CAAA;AAAA,MACrC,GAAG,wBAAwB,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAA,CACG,KAAK,MAAM;AACV,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAC5B,MAAA,sBAAA,EAAuB;AAAA,IACzB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,WAAA,KAAyB;AAC/B,MAAA,MAAM,eAAA,GACJ,uBAAuB,KAAA,GACnB,WAAA,GACA,IAAI,KAAA,CAAM,MAAA,CAAO,WAAW,CAAC,CAAA;AAEnC,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,0CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,iBAAiB,CAAA;AACnD,MAAA,sBAAA,EAAuB;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAEA,EAAA,OAAO,EAAE,GAAG,eAAA,EAAiB,WAAA,EAAY;AAC3C;;ACxEA,SAAS,IAAA,GAAa;AAEtB;AA6GA,SAAS,YAAA,CAAa;AAAA,EACpB,QAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,YAAA,GACJ,mBAAmB,MAAA,GAAY,IAAA;AAAA;AAAA,oBAE7BtB,cAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,EAAQ;AAAA;AAAA;AACV,GAAA;AAEJ,EAAA,uBACEiB,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,eAAA,EAChB,QAAA,EAAA;AAAA,oBAAAjB,cAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAS,CAAA;AAAA,IAC5D;AAAA,GAAA,EACH,CAAA;AAEJ;AAaA,SAAS,eACP,KAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EACiB;AACjB,EAAA,QAAQ,MAAM,OAAA;AAAS,IACrB,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,KAAA;AAC/B,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,OAAA;AAAA,QACX,MAAA,iCACG,MAAA,EAAA,EAAO,MAAA,EAAgB,MAAM,SAAA,IAAa,IAAA,EAAM,SAAS,OAAA,EAAS;AAAA,OAEvE;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,cAAA,EAAe,GAAI,KAAA;AACzD,MAAA,OAAO;AAAA;AAAA,QAEL,SAAA,EAAW,IAAA;AAAA,QACX,MAAA,kBACEA,cAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,cAAA,EAC1B,QAAA,kBAAAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,MAAM,WAAA,IAAe,IAAA;AAAA,YACrB,KAAA,EAAO,WAAA;AAAA,YACP,QAAA,EAAU,eAAA;AAAA,YACV,OAAA,EAAS;AAAA;AAAA,SACX,EACF;AAAA,OAEJ;AAAA,IACF;AAAA,IACA,KAAK,SAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,SAAS;AACP,MAAA,MAAM;AAAA,QACJ,QAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF,GAAI,KAAA;AACJ,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,YAAY,IAAA,GAAO,QAAA;AAAA,QAC9B,MAAA,kBACEiB,eAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,cAAA,EAC1B,QAAA,EAAA;AAAA,0BAAAjB,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,UAAA;AAAA,cACR,MAAM,UAAA,IAAc,QAAA;AAAA,cACpB,QAAA,EAAU,SAAA;AAAA,cACV,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACAA,cAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,MAAM,WAAA,IAAe,SAAA;AAAA,cACrB,KAAA,EAAO,WAAA;AAAA,cACP,QAAA,EAAU,eAAA;AAAA,cACV,OAAA,EAAS;AAAA;AAAA;AACX,SAAA,EACF;AAAA,OAEJ;AAAA,IACF;AAAA;AAEJ;AAIA,SAAS,sBAAsB,KAAA,EAAwC;AACrE,EAAA,OAAO,KAAA,CAAM,OAAA,KAAY,OAAA,GAAU,IAAA,GAAO,KAAA,CAAM,SAAA;AAClD;AAEO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,GAAS,QAAA;AAAA,IACT,IAAA;AAAA,IACA,IAAA,GAAO,IAAA;AAAA,IACP;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,gBAAgBuC,WAAA,EAAM;AAC5B,EAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY,GAAI,aAAA;AAAA,IAC1C,sBAAsB,KAAK;AAAA,GAC7B;AACA,EAAA,MAAM,YAAY,WAAA,KAAgB,SAAA;AAClC,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,eAAe,KAAA,EAAO;AAAA,IAClD,MAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,uBACEvC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,eAAA,EAAe,IAAA;AAAA,MACf,OAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,kBAAA,EAAkB,QAAA,KAAa,MAAA,GAAY,MAAA,GAAY,aAAA;AAAA,MACvD,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,SAAA;AAAA,MAER,QAAA,EAAA,QAAA,KAAa,SAAY,IAAA,mBACxBA,cAAA,CAAC,QAAK,QAAA,EAAU,aAAA,EAAe,SAAA,EAAU,sBAAA,EACtC,QAAA,EACH;AAAA;AAAA,GAEJ;AAEJ;AAUO,SAAS,oBAAoB,KAAA,EAAyC;AAC3E,EAAA,sCAAQ,WAAA,EAAA,EAAa,GAAG,OAAO,IAAA,kBAAMA,cAAA,CAAC+C,2CAAoB,CAAA,EAAI,CAAA;AAChE;AAEO,SAAS,mBAAmB,KAAA,EAAyC;AAC1E,EAAA,sCAAQ,WAAA,EAAA,EAAa,GAAG,OAAO,IAAA,kBAAM/C,cAAA,CAAC6C,yCAAmB,CAAA,EAAI,CAAA;AAC/D;AAEO,SAAS,gBAAgB,KAAA,EAAyC;AACvE,EAAA,sCAAQ,WAAA,EAAA,EAAa,GAAG,OAAO,IAAA,kBAAM7C,cAAA,CAAC2C,mCAAgB,CAAA,EAAI,CAAA;AAC5D;AAEO,SAAS,mBAAmB,KAAA,EAAyC;AAC1E,EAAA,sCAAQ,WAAA,EAAA,EAAa,GAAG,OAAO,IAAA,kBAAM3C,cAAA,CAAC4C,qCAAiB,CAAA,EAAI,CAAA;AAC7D;;ACjSA,MAAM,wBAAA,GAA2BhC,mBAAA;AAAA,EAC/B;AAAA,IACE,KAAA,EAAO;AAAA,MACL,KAAA,EACE,2HAAA;AAAA,MACF,IAAA,EAAM,0EAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACtB,EAAA,EAAI,EAAE,IAAA,EAAM,WAAA;AAAY,OAC1B;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,qBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,oGAAA;AAAA,UACN,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,UAAU,KAAA;AAAM,GACjD;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAuBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,IAAA;AAAA,EACA,gBAAA,GAAmB,+BAAA;AAAA,EACnB,IAAA;AAAA,EACA,IAAA,kCAAQoC,mDAAA,EAAA,EAA0B,CAAA;AAAA,EAClC,MAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqC;AACnC,EAAA,MAAM,aAAa,QAAA,KAAa,IAAA;AAChC,EAAA,MAAM,SAAS,wBAAA,CAAyB,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,CAAA;AAEtE,EAAA,uBACEhD,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAiB,eAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,uBAAA,EAAuB,IAAA;AAAA,MACvB,EAAA,EAAI,cAAA;AAAA,MAIJ,IAAA,EAAM,aAAa,EAAA,GAAK,IAAA;AAAA,MACxB,gBAAA;AAAA,MACA,IAAA,EAAK,MAAA;AAAA,MACL,eAAA,EAAe,UAAA;AAAA,MACf,QAAA;AAAA,MACA,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,EAAE,WAAW,CAAA;AAAA,MACrC,SAAS,OAAA,IAAW,MAAA;AAAA,MACnB,GAAG,cAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAjB,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA;AAAA,YACA,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,EAAA;AAAA,YAC3B,SAAA,EAAW,OAAO,IAAA;AAAK;AAAA,SACzB;AAAA,uCACC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,IAAA,IAAS,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA;AAAA,GACxC,EACF,CAAA;AAEJ;;ACtFO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAO,WAAA,EAAY,GAAI,cAAc,OAAO,CAAA;AAEjE,EAAA,uBACEiB,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAChB,QAAA,EAAA;AAAA,oBAAAjB,cAAA,CAAC,UAAQ,GAAG,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,SAAS,WAAA,EAAa,CAAA;AAAA,oBACnEA,cAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA,EAAS;AAAA;AAAA;AACX,GAAA,EACF,CAAA;AAEJ;;AC9BA,MAAM,aAAA,GAAgBY,mBAAA;AAAA,EACpB;AAAA,IACE,IAAA,EAAM;AAAA,MACJ,mCAAA;AAAA,MACA,QAAA;AAAA,MACA,gFAAA;AAAA,MACA,wCAAA;AAAA;AAAA,MACA,OAAA,CAAQ,GAAA,CAAI,6BAAA,GACR,EAAA,GACA,uCAAA;AAAA,MACJ,yCAAA;AAAA,MACA,yCAAA;AAAA,MACA,iFAAA;AAAA,MACA,2CAAA;AAAA,MACA,mJAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,GAAG,CAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,oCAAA;AAAA,QACP,IAAA,EAAM;AAAA,OACR;AAAA,MACA,UAAA,EAAY;AAAA,QACV,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,6BAAA,GACnB,uCAAA,GACA,EAAA;AAAA,QACJ,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,6BAAA,GACf,mCAAA,GACA,EAAA;AAAA,QACJ,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,6BAAA,GACf,iGAAA,GACA,EAAA;AAAA,QACJ,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,6BAAA,GACf,oCAAA,GACA;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAIA,MAAM,UAAA,GAAa;AAAA,EACjB,QAAA,EAAU;AAAA,IACR,eAAA,EAAiB,IAAA;AAAA,IACjB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW,KAAA;AAAA,IACX,YAAA,EAAc,KAAA;AAAA,IACd,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,SAAA,EAAW,OAAA;AAAA,IACX,YAAA,EAAc,OAAA;AAAA,IACd,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW,KAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc;AAAA;AAElB,CAAA;AAWO,MAAM,SAAA,GAAYR,gBAAA;AAAA,EACvB,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,WAAW,UAAA,EAAY,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACvE,IAAA,MAAM,gBAAA,GACJe,oBAAA,CAAS,EAAA,KAAO,KAAA,GACZ,MAAA;AAAA;AAAA,MAEA,iBAAiB,0BAA0B;AAAA,KAAA;AACjD,IAAA,MAAM,SAAA,GAAY,IAAA,GAAO,UAAA,CAAW,IAAI,CAAA,GAAI,MAAA;AAC5C,IAAA,uBACEnB,cAAA;AAAA,MAACiD,qBAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,UAAU,CAAC,QAAA;AAAA,QACX,QAAA;AAAA,QACA,iBAAe,QAAA,KAAa,IAAA;AAAA,QAC5B,WAAW,SAAA,KAAc,IAAA;AAAA,QACzB,oBAAA,EAAsB,gBAAA;AAAA,QACtB,WAAW,aAAA,CAAc,EAAE,SAAA,EAAW,UAAA,EAAY,WAAW,CAAA;AAAA,QAC5D,GAAG,SAAA;AAAA,QACH,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;;AChHO,MAAM,QAAA,GAAW7C,gBAAA,CAAuC,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7E,EAAA,sCAAQ,SAAA,EAAA,EAAU,GAAA,EAAU,SAAA,EAAS,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AACnD,CAAC;;ACMD,SAAS,sBAAA,CACP,YACA,aAAA,EAC6C;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIgB,cAAA,CAAS,cAAc,KAAK,CAAA;AAC5D,EAAA,MAAM,QAAQ,UAAA,IAAc,QAAA;AAC5B,EAAA,MAAM,QAAA,GAAW8B,iBAAA;AAAA,IACf,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB;AACA,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,aAAA,EAAe,KAAK;AAAA,GACnC;AACA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,sBAAA,CAAuB,SAAS,aAAa,CAAA;AACvE,EAAA,MAAM,OAAA,GAAU,iBAAiB,iBAAiB,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,iBAAiB,mBAAmB,CAAA;AAClD,EAAA,MAAM,eAAA,GAAkB,gBAAA;AAAA,IACtB;AAAA,GACF;AACA,EAAA,MAAM,aAAA,GAAgB,iBAAiB,wBAAwB,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,WAAW,eAAA,GAAkB,OAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,WAAW,aAAA,GAAgB,KAAA;AAC9C,EAAA,uBACElD,cAAA;AAAA,IAACmD,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,mBAAA,EAAqB,KAAA;AAAA,MACrB,UAAA,EAAY,EAAE,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,MACxC,UAAA;AAAA,MACA,aAAA,EAAe,QAAA;AAAA,MACd,GAAG;AAAA;AAAA,GACN;AAEJ;AAEO,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,GAAG,MAAK,EAA2B;AAClE,EAAA,sCACG,WAAA,EAAA,EAAY,MAAA,EACX,yCAAC,WAAA,EAAA,EAAa,GAAG,MAAM,CAAA,EACzB,CAAA;AAEJ;;AC5DO,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA;AACF,CAAA,EAGE;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI/B,eAAS,YAAY,CAAA;AAC/D,EAAA,MAAM,QAAQ,eAAA,IAAmB,aAAA;AACjC,EAAA,MAAM,QAAA,GAAW8B,iBAAA;AAAA,IACf,CAAC,IAAA,KAAiB;AAChB,MAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,QAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,aAAA,EAAe,KAAK;AAAA,GACxC;AACA,EAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AACzB;;ACEO,MAAM,0BAAA,GAA6B;AAAA,EACxC,8CAAA;AAAA,EACA,2CAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAEV,MAAM,uBAAuBtC,mBAAA,CAAG;AAAA,EAC9B,IAAA,EAAM,kBAAA;AAAA,EACN,QAAA,EAAU;AAAA;AAAA,IAER,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,YAAA;AAAA,MACP,WAAA,EAAa,uBAAA;AAAA,MACb,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,KAAA,EAAO,OAAA;AAC5B,CAAC,CAAA;AAQM,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAyC;AACvC,EAAA,MAAM,SAAS,MAA4C;AAIzD,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,aAAA;AAChC,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,GAAG;AACH,EAAA,uBACEK,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAlB,cAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAe,CAAA,EAAG,SAAA,EAAW,oBAAA,CAAqB,EAAE,KAAA,EAAO,CAAA,EAC9D,QAAA,EAAA,KAAA,IAAS,WAAA,IAAe,EAAA,EAC3B,CAAA;AAAA,oBACAA,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,iCAAOoD,yCAAA,EAAA,EAAqB,CAAA;AAAA,QAC5B,IAAA,EAAM,EAAA;AAAA,QACN,SAAA,EAAW,WAAW,yBAAA,GAA4B;AAAA;AAAA;AACpD,GAAA,EACF,CAAA;AAEJ;;AChEA,MAAM,eAAA,GAAkBxC,mBAAA;AAAA,EACtB;AAAA,IACE,IAAA,EAAM,0BAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAAA;AAAA,MAGR,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,oEAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL,cAAA;AAAA,UACA,uCAAA;AAAA,UACA,yCAAA;AAAA,UACA,yCAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,GAAG;AAAA;AACZ,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA;AAAM,GACrC;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAEA,MAAM,cAAA,GAAiBA,mBAAA;AAAA,EACrB;AAAA,IACE,IAAA,EAAM;AAAA,MACJ,2EAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,GAAG,CAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,iCAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,UAAU,KAAA;AAAM,GACtD;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAQA,SAAS,eAAA,CAAgB;AAAA,EACvB,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,uBACEK,eAAA;AAAA,IAACJ,qBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,OAAO,QAAA,KAAa,IAAA;AAAA,MACnC,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,cAAA,CAAe,EAAE,UAAU,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AAAA,MACjE,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,MACvB,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAb,cAAA,CAAC,QAAK,aAAA,EAAe,CAAA,EAAG,SAAA,EAAU,iCAAA,EAC/B,iBAAO,KAAA,EACV,CAAA;AAAA,QACC,QAAA,mBACCA,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,iCAAO4C,iCAAA,EAAA,EAAiB,CAAA;AAAA,YACxB,IAAA,EAAM,EAAA;AAAA,YACN,SAAA,EAAU;AAAA;AAAA,SACZ,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,iBAAA,EAAmB;AACrB,CAAA,EAA2C;AACzC,EAAA,MAAM,CAAC,OAAA,EAAS,QAAQ,CAAA,GAAI,oBAAA,CAAqB;AAAA,IAC/C,KAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIxB,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAa,GAAIkB,+BAAA,EAAoB;AACrD,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,UAAU,OAAO,CAAA;AAElE,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AACjC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,uBACErB,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAlB,cAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,uBAAA,EAAuB,IAAA;AAAA,QACvB,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,IAAA;AAAA,QACf,iBAAe,QAAA,KAAa,IAAA;AAAA,QAC5B,QAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAA,EAAY,SAAA;AAAA,QACZ,iBAAA,EAAiB,cAAA;AAAA,QACjB,SAAA,EAAW,eAAA,CAAgB,EAAE,QAAA,EAAU,CAAA;AAAA,QACvC,SAAS,MAAM;AACb,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,CAAA;AAAA,QAEA,QAAA,kBAAAA,cAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACC,OAAO,QAAA,EAAU,KAAA;AAAA,YACjB,WAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA,KACF;AAAA,oBACAA,cAAA;AAAA,MAACqD,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAW,IAAA;AAAA,QACX,OAAA,EAAS,IAAA;AAAA,QACT,aAAA,EAAc,MAAA;AAAA,QACd,gBAAgB,MAAM;AACpB,UAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,QACf,CAAA;AAAA,QAEA,QAAA,kBAAArD,cAAA;AAAA,UAACa,qBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,4CAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,YACf,CAAA;AAAA,YAGA,QAAA,kBAAAb,cAAA,CAACa,qBAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,cAAY,SAAA,EACxC,QAAA,kBAAAb,cAAA,CAAC,OAAA,EAAA,EAAQ,OAAA,EAAQ,aAAY,MAAA,EAAO,GAAA,EAAI,IAAA,EAAK,IAAA,EAAK,WAAU,OAAA,EAG1D,QAAA,kBAAAA,cAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,EAAE,SAAA,EAAW,YAAA,GAAe,GAAA,EAAI;AAAA,gBACvC,4BAAA,EAA8B,KAAA;AAAA,gBAE7B,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,cAAA;AAAA,kBAAC,eAAA;AAAA,kBAAA;AAAA,oBAEC,MAAA;AAAA,oBACA,QAAA,EAAU,OAAO,KAAA,KAAU,OAAA;AAAA,oBAC3B;AAAA,mBAAA;AAAA,kBAHK,MAAA,CAAO;AAAA,iBAKf;AAAA;AAAA,eAEL,CAAA,EACF;AAAA;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,MAAA,CAAO,EAAE,MAAA,EAAQ,GAAG,MAAK,EAA2B;AAClE,EAAA,sCACG,WAAA,EAAA,EAAY,MAAA,EACX,yCAAC,WAAA,EAAA,EAAa,GAAG,MAAM,CAAA,EACzB,CAAA;AAEJ;;AC/JO,SAAS,uBACd,sBAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAUF,oBAAiD,MAAS,CAAA;AAC1E,EAAA,OAAO;AAAA,IACL,0BAA0B,OAAA,CAAQ,QAAA;AAAA,IAClC,cAAc,MAAM;AAClB,MAAA,MAAM,OAAA,GAAUC,iBAAW,OAAO,CAAA;AAClC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GACF;AACF;AASO,SAAS,iBAAA,CAAkB;AAAA,EAChC,KAAA,EAAO,eAAA;AAAA,EACP,YAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA+C;AAC7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,oBAAA,CAAqB;AAAA,IAC7C,KAAA,EAAO,eAAA;AAAA,IACP,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAOuD,aAAA;AAAA,IACL,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,OAAA,EAAQ,CAAA;AAAA,IAC5C,CAAC,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,OAAO;AAAA,GACrC;AACF;;ACpEO,MAAM;AAAA,EACX,wBAAA,EAA0B,oBAAA;AAAA,EAC1B,YAAA,EAAc;AAChB,CAAA,GAAI,sBAAA;AAAA,EACF;AACF,CAAA;;ACIO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,KAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBACEtD,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EACX,QAAA,kBAAAA,cAAA,CAAC,wBAAqB,KAAA,EAAO,OAAA,EAC3B,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,MAAK,YAAA,EAAc,GAAG,KAAA,EACzB,QAAA,EACH,GACF,CAAA,EACF,CAAA;AAEJ;;ACvBO,SAAS,kBAAA,CAAmB;AAAA,EACjC;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,uBACEA,cAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KAAA,EACE,YAAA,KAAiB,WAAA,GAAc,CAAA,EAAG,YAAY,CAAA,MAAA,CAAA,GAAW,YAAA;AAAA,MAG1D;AAAA;AAAA,GACH;AAEJ;;ACtBA,MAAM,yBAAyBY,mBAAA,CAAG;AAAA,EAChC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,+GAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAK,WAAA,EAAY;AAAA,MAChD,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,qIAAA;AAAA,QACN,GAAA,EAAK;AAAA;AACP,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,KAAK,cAAA,EAAe;AAAA,MACtD,OAAO;AAAC,KACV;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,sCAAA;AAAA,QACN,GAAA,EAAK;AAAA,OACP;AAAA,MACA,OAAO;AAAC;AACV,GACF;AAAA;AAAA;AAAA;AAAA,EAIA,gBAAA,EAAkB;AAAA,IAChB;AAAA,MACE,QAAA,EAAU,IAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO,EAAE,IAAA,EAAM,uBAAA,EAAyB,KAAK,mBAAA;AAAoB;AACnE;AAEJ,CAAC,CAAA;AAcM,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAmC;AACjC,EAAA,MAAM,SAAS,sBAAA,CAAuB,EAAE,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AACtE,EAAA,uBACEZ,cAAA,CAAC,kBAAA,EAAA,EACC,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,WAAW,MAAA,CAAO,IAAA,EAAK,EAC3B,QAAA,kBAAAA,cAAA,CAAC,QAAK,SAAA,EAAW,MAAA,CAAO,GAAA,EAAI,EAAG,GACjC,CAAA,EACF,CAAA;AAEJ;;AC5DA,MAAMuD,kBAAgB3C,mBAAA,CAAG;AAAA,EACvB,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,qBAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT;AAEJ,CAAC,CAAA;AAQM,SAAS,KAAA,CAAM,EAAE,KAAA,EAAO,KAAA,EAAO,UAAS,EAA0B;AACvE,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,aAAA;AAAA,IACP,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,eAAA,EAAgB;AACpB,EAAA,MAAM,WAAW,aAAA,KAAkB,KAAA;AACnC,EAAA,MAAM,UAAA,GAAa,QAAA,KAAa,IAAA,IAAQ,aAAA,KAAkB,IAAA;AAE1D,EAAA,uBACEK,eAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,uBAAA,EAAuB,IAAA;AAAA,MACvB,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,QAAA;AAAA,MACd,eAAA,EAAe,UAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAU,kIAAA;AAAA,MACV,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAjB,cAAA,CAAC,cAAA,EAAA,EAAe,QAAA,EAAoB,QAAA,EAAU,UAAA,EAAY,CAAA;AAAA,wBAC1DA,cAAA,CAAC,QAAK,SAAA,EAAWuD,eAAA,CAAc,EAAE,QAAA,EAAU,UAAA,EAAY,CAAA,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACnE;AAEJ;;AClCO,SAAS,YAAA,CAAa;AAAA,EAC3B,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,uBACEvD,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAW,CAAA,kEAAA,EAAqE,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MAC9F,GAAG;AAAA;AAAA,GACN;AAEJ;;ACdO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqC;AACnC,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,KAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBACEA,cAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,OAAA,EAC3B,QAAA,kBAAAA,cAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,YAAA,EAAa,MAAA,EAAiB,GAAG,KAAA,EACjD,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;;AC5BA,MAAM,eAAeY,mBAAA,CAAG;AAAA,EACtB,IAAA,EAAM,sEAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,mCAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT;AAEJ,CAAC,CAAA;AAMD,MAAM,kBAAkBA,mBAAA,CAAG;AAAA,EACzB,IAAA,EAAM,yIAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,EAAA,EAAG;AAAA,IAChC,QAAA,EAAU,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,EAAA,EAAG;AAAA,IAChC,OAAA,EAAS,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,MAAA;AAAO,GAC1C;AAAA,EACA,eAAA,EAAiB,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,EAClC,gBAAA,EAAkB;AAAA,IAChB;AAAA,MACE,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU,KAAA;AAAA,MACV,KAAA,EACE;AAAA;AACJ;AAEJ,CAAC,CAAA;AAKD,MAAM,qBAAqBA,mBAAA,CAAG;AAAA,EAC5B,IAAA,EAAM,8CAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,qDAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB;AAAA,MACE,QAAA,EAAU,IAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO;AAAA;AACT;AAEJ,CAAC,CAAA;AAED,MAAM,gBAAgBA,mBAAA,CAAG;AAAA,EACvB,MAAA,EAAQ,kBAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAC,CAAA;AAqBM,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkC;AAChC,EAAA,MAAM,aAAa,QAAA,KAAa,IAAA;AAEhC,EAAA,uBACEZ,cAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,uBAAA,EAAuB,IAAA;AAAA,MACvB,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,SAAA,EAAU,oGAAA;AAAA,MACT,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAiB,eAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,WAAW,eAAA,CAAgB,EAAE,UAAU,QAAA,EAAU,UAAA,EAAY,SAAS,CAAA;AAAA,UAEtE,QAAA,EAAA;AAAA,4BAAAjB,cAAA,CAAC,IAAA,EAAA,EAAK,WAAW,YAAA,CAAa,EAAE,UAAU,QAAA,EAAU,UAAA,EAAY,CAAA,EAAG,CAAA;AAAA,YAClE,IAAA,mBACCA,cAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,IAAA;AAAA,gBACA,IAAA,EAAM,EAAA;AAAA,gBACN,WAAW,kBAAA,CAAmB,EAAE,QAAA,EAAU,QAAA,EAAU,YAAY;AAAA;AAAA,aAClE,GACE,IAAA;AAAA,4BACJA,cAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAe,CAAA;AAAA,gBACf,WAAW,aAAA,CAAc,EAAE,QAAA,EAAU,QAAA,EAAU,YAAY,CAAA;AAAA,gBAE1D,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;AC1HO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,aAAA;AAAA,IACP,QAAA;AAAA,IACA,QAAA,EAAU,aAAA;AAAA,IACV;AAAA,MACE,eAAA,EAAgB;AACpB,EAAA,MAAM,WAAW,aAAA,KAAkB,KAAA;AACnC,EAAA,MAAM,UAAA,GAAa,QAAA,KAAa,IAAA,IAAQ,aAAA,KAAkB,IAAA;AAE1D,EAAA,uBACEA,cAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,QAAA;AAAA,MACd,eAAA,EAAe,UAAA;AAAA,MACf,KAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,OAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB;AAAA;AAAA,GACF;AAEJ;;AC3BA,MAAM,yBAAyBY,mBAAA,CAAG;AAAA,EAChC,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,OAAA,EAAS,MAAA;AAC9B,CAAC,CAAA;AAQD,MAAM,4BAAA,GACJd,oBAAqC,MAAM,CAAA;AAGtC,SAAS,wBAAA,GAAkD;AAChE,EAAA,OAAOC,iBAAW,4BAA4B,CAAA;AAChD;AAKO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmC;AACjC,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,KAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBACEC,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EACX,QAAA,kBAAAA,cAAA,CAAC,oBAAA,EAAA,EAAqB,KAAA,EAAO,OAAA,EAC3B,QAAA,kBAAAA,cAAA,CAAC,4BAAA,EAAA,EAA6B,KAAA,EAAO,OAAA,IAAW,MAAA,EAC9C,QAAA,kBAAAA,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,sBAAA,CAAuB,EAAE,OAAA,EAAS,CAAA;AAAA,MAC5C,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;ACzDA,MAAM,iBAAA,GAAoBY,mBAAA;AAAA,EACxB;AAAA,IACE,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,4CAAA;AAAA,MACP,IAAA,EAAM,EAAA;AAAA,MACN,KAAA,EAAO,0BAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA;AAAA;AAAA,MAGR,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,EAAE,KAAA,EAAO,cAAA,EAAe;AAAA,QAC9B,KAAA,EAAO,EAAE,KAAA,EAAO,uCAAA;AAAwC,OAC1D;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,gBAAA;AAAA,UACN,KAAA,EAAO,gBAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,YAAA;AAAA,UACN,KAAA,EAAO,YAAA;AAAA,UACP,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,qBAAA;AAAA,UACN,KAAA,EAAO,qBAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA,OAAO;AAAC;AACV;AACF,GACF;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAUO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,aAAA;AAAA,IACP,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,eAAA,EAAgB;AACpB,EAAA,MAAM,SAAS,wBAAA,EAAyB;AACxC,EAAA,MAAM,WAAW,aAAA,KAAkB,KAAA;AACnC,EAAA,MAAM,UAAA,GAAa,QAAA,KAAa,IAAA,IAAQ,aAAA,KAAkB,IAAA;AAC1D,EAAA,MAAM,SAAS,iBAAA,CAAkB,EAAE,QAAQ,QAAA,EAAU,QAAA,EAAU,YAAY,CAAA;AAE3E,EAAA,sCACG,kBAAA,EAAA,EACC,QAAA,kBAAAK,eAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAW,WAAA,GAAc,UAAA;AAAA,MAClC,IAAA,EAAK,OAAA;AAAA,MACL,cAAA,EAAc,QAAA;AAAA,MACd,eAAA,EAAe,UAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,UAAA;AAAA,MACV,SAAA,EAAW,OAAO,KAAA,EAAM;AAAA,MACxB,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAOjB,cAAA,CAAC,QAAK,IAAA,EAAY,IAAA,EAAM,IAAI,SAAA,EAAW,MAAA,CAAO,IAAA,EAAK,EAAG,CAAA,GAAK,IAAA;AAAA,wBACnEiB,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,gBAAA,EAChB,QAAA,EAAA;AAAA,0BAAAjB,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,KAAA,IAAU,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACvC,WAAA,kCACE,IAAA,EAAA,EAAK,SAAA,EAAW,OAAO,WAAA,EAAY,EAAI,uBAAY,CAAA,GAClD;AAAA,SAAA,EACN,CAAA;AAAA,wBACAA,cAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,QAAA;AAAA,YACA,QAAA,EAAU,UAAA;AAAA,YACV,QAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;AC1GO,MAAM;AAAA,EACX,wBAAA,EAA0B,qBAAA;AAAA,EAC1B,YAAA,EAAc;AAChB,CAAA,GAAI,uBAAuB,8CAA8C,CAAA;;ACYlE,SAAS,MAAA,CAAO;AAAA,EACrB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,KAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBACEA,cAAA,CAAC,qBAAA,EAAA,EAAsB,KAAA,EAAO,OAAA,EAC5B,QAAA,kBAAAA,cAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,YAAA,EAAa,MAAA,EAAiB,GAAG,KAAA,EACjD,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;;ACZO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,gBAAA,EAAiB;AACrB,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,MAAA,IAAa,YAAA,KAAiB,IAAA;AACxD,EAAA,MAAM,UAAA,GAAa,QAAA,KAAa,IAAA,IAAQ,cAAA,KAAmB,IAAA;AAI3D,EAAA,MAAM,UAAA,GACJ,IAAA,KAAS,MAAA,GACL,MAAA,GACA,CAAC,KAAA,KAAiC;AAChC,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA;AAEN,EAAA,uBACEA,cAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MAGL,IAAA,EAAM,aAAa,MAAA,GAAY,IAAA;AAAA,MAC/B,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,MAClC,eAAA,EAAe,UAAA;AAAA,MACf,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,SAAS,OAAA,IAAW;AAAA;AAAA,GACtB;AAEJ;;AClEO,MAAM;AAAA,EACX,wBAAA,EAA0B,mBAAA;AAAA,EAC1B,YAAA,EAAc;AAChB,CAAA,GAAI,uBAAuB,mCAAmC,CAAA;;ACQvD,SAAS,IAAA,CAAK;AAAA,EACnB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,KAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,uBACEA,cAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAO,OAAA,EAC1B,QAAA,kBAAAA,cAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,SAAA,EAAU,MAAA,EAAiB,GAAG,KAAA,EAC9C,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;;ACdO,SAAS,GAAA,CAAI;AAAA,EAClB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,QAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,cAAA,EAAe;AACnB,EAAA,MAAM,WAAW,YAAA,KAAiB,KAAA;AAClC,EAAA,MAAM,UAAA,GAAa,QAAA,KAAa,IAAA,IAAQ,YAAA,KAAiB,IAAA;AAEzD,EAAA,uBACEA,cAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,KAAA;AAAA,MACL,eAAA,EAAe,QAAA;AAAA,MACf,eAAA,EAAe,UAAA;AAAA,MACf,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EACE,YACC,MAAM;AACL,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,CAAA,CAAA;AAAA,MAED,GAAG;AAAA;AAAA,GACN;AAEJ;;ACjBO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,UAAUuC,WAAA,EAAM;AACtB,EAAA,MAAM,QAAA,GAAW,QAAQ,KAAK,CAAA;AAC9B,EAAA,MAAM,eAAA,GAAkB,YAAY,CAAC,eAAA;AAMrC,EAAA,MAAM,UAAU,MAAiB;AAC/B,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,uBACEtB,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAChB,QAAA,EAAA;AAAA,wBAAAjB,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,iCAAOwD,mDAAA,EAAA,EAA0B,CAAA;AAAA,YACjC,IAAA,EAAM,EAAA;AAAA,YACN,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QACC,eAAA,mBACCxD,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,IAAA,iCAAO6C,qCAAA,EAAA,EAAmB,CAAA;AAAA,YAC1B,IAAA,EAAM,EAAA;AAAA,YACN,SAAA,EAAU;AAAA;AAAA,SACZ,GACE;AAAA,OAAA,EACN,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,uBACE7C,cAAA,CAAC,QAAK,IAAA,kBAAMA,cAAA,CAAC6C,yCAAmB,CAAA,EAAI,IAAA,EAAM,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,IAE1E;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,GAAG;AAEH,EAAA,uBACE5B,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,SAAA,EAChB,QAAA,EAAA;AAAA,oBAAAjB,cAAA,CAACa,qBAAA,EAAA,EAAU,OAAA,EAAS,YAAA,EAClB,QAAA,kBAAAI,eAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,MAAA,EAAA,EAAO,WAAU,sBAAA,EAChB,QAAA,EAAA;AAAA,wBAAAjB,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,OAAA;AAAA,YACV,MAAA,EAAQ,WAAW,QAAA,GAAW,MAAA;AAAA,YAC9B,SAAA,EAAW,CAAA,uBAAA,EAA0B,QAAA,GAAW,aAAA,GAAgB,EAAE,CAAA,CAAA;AAAA,YAEjE,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QACC,MAAA,mBACCA,cAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EACd,QAAA,EAAA,QAAA,mBACCA,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAO,QAAA,EAAU,QAAA,EAAA,MAAA,EAAO,CAAA,GAErC,QAEJ,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MACC,0BACCA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,mBAAQ,CAAA,GAC5C;AAAA,KAAA,EACN,CAAA,EACF,CAAA;AAAA,IACC,QAAA,mBACCA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EACb,iBAAO,OAAO,CAAA,EACjB,CAAA,GAEA,MAAA,CAAO,OAAO,CAAA;AAAA,IAEf,KAAA,mBACCA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QACd,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,QAAO,QAAA,EAAS,SAAA,EAAU,qBAAA,EAC1C,QAAA,EAAA,KAAA,EACH,GACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;;ACvHO,MAAM,4BAA4B,KAAA,CAAM;AAAA,EAC7C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,yBAAyB,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAwBO,SAAS,IAAA,CAAuC;AAAA,EACrD,aAAA;AAAA,EACA,IAAA,GAAO,WAAA;AAAA,EACP,QAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,IAAA,GAAOyD,qBAAA,CAAsB,EAAE,IAAA,EAAM,eAAe,CAAA;AAE1D,EAAA,SAAS,MAAA,GAAwB;AAM/B,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,MAAM,MAAA,GAAS,IAAA,CACZ,YAAA,CAAa,QAAA,EAAU,MAAM;AAC5B,MAAA,KAAA,GAAQ,KAAA;AAAA,IACV,CAAC,CAAA,EAAE,CACF,IAAA,CAAK,MAAM;AACV,MAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,mBAAA,EAAoB;AAAA,IAC5C,CAAC,CAAA;AACH,IAAA,IAAI,aAAA,EAAe,MAAA,CAAO,KAAA,CAAM,aAAa,CAAA;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAIA,EAAA,uBACEzD,cAAA,CAAC0D,0BAAA,EAAA,EAAc,GAAG,IAAA,EACf,QAAA,EAAA,MAAA,CAAO,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,CAAA,EAC3C,CAAA;AAEJ;;AC1BO,SAAS,SAAA,CAGd;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAmD;AACjD,EAAA,MAAM,EAAE,QAAA,EAAS,GAAIC,4BAAA,EAA6B;AAElD,EAAA,uBACE3D,cAAA;AAAA,IAAC4D,wBAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAQ,GAAG,QAAA,EAAS;AAAA,MAC/C,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,YAAW,KAAM;AACjC,QAAA,MAAM,gBACJ,UAAA,CAAW,KAAA,EAAO,SAAS,UAAA,IAAc,QAAA,KAAa,OAClD,QAAA,GACA,MAAA;AACN,QAAA,uBACE5D,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAAA,YAC1B,eAAA,EAAiB,UAAA,CAAW,KAAA,EAAO,IAAA,KAAS,UAAA;AAAA,YAC5C,KAAA,EACE,cACI,WAAA,CAAY,UAAA,CAAW,KAAK,CAAA,GAC3B,aAAA,IAAiB,WAAW,KAAA,EAAO,OAAA;AAAA,YAE1C,QAAQ,CAAC,OAAA,KAAY,OAAO,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,YAC9C,cAAc,MAAM;AAClB,cAAA,QAAA,CAAS,IAAI,CAAA;AAAA,YACf;AAAA;AAAA,SACF;AAAA,MAEJ;AAAA;AAAA,GACF;AAEJ;;ACAA,SAAS,kBAAA,CAGP;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAA4D;AAI1D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIoB,eAAS,KAAK,CAAA;AAE1D,EAAA,uBACEpB,cAAA,CAAC,qBAAkB,MAAA,EAAQ,cAAA,GAAiB,WAAW,MAAA,EACrD,QAAA,kBAAAiB,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,2BAAA,EAChB,QAAA,EAAA;AAAA,oBAAAjB,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,MAAA,CAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,CAAA,EACpD,CAAA;AAAA,IACC,SAAA,mBACCA,cAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,iCAAO6D,iCAAA,EAAA,EAAiB,CAAA;AAAA,QACxB,YAAA,EAAY,WAAA;AAAA,QACZ,WAAW,MAAM;AACf,UAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,QACxB,CAAA;AAAA,QACA,YAAY,MAAM;AAChB,UAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,QACzB,CAAA;AAAA,QACA,OAAA,EAAS;AAAA;AAAA,KACX,GACE;AAAA,GAAA,EACN,CAAA,EACF,CAAA;AAEJ;AAYO,SAAS,cAAA,CAGd;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,CAAA;AAAA,EACV,QAAA,GAAW,UAAA;AAAA,EACX,UAAA;AAAA,EACA,WAAA,GAAc,CAAC,SAAA,KAAc,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA;AAAA,EAChD;AACF,CAAA,EAAwD;AAKtD,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,KAAWC,2BAAA,CAA4B;AAAA,IAC7D,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,UAAA;AAQrB,EAAA,MAAM,SAAA,GAAYzC,aAAO,KAAK,CAAA;AAC9B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAU,OAAA,EAAS;AACvB,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,MAAM,SAAA,GAAY,UAAU,MAAA,CAAO,MAAA;AACnC,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,MAAA;AAAA,QACE,MAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAU,EAAG,MAAM,YAAY,CAAA;AAAA,QACpD,EAAE,aAAa,KAAA;AAAM,OACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,cAAc,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEjD,EAAA,uBACEtB,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EAAQ,sBACNiB,eAAA,CAAC,MAAA,EAAA,EAAO,WAAU,QAAA,EACf,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAClBjB,cAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YAEC,OAAA;AAAA,YACA,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,YACtB,SAAA,EAAW,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAC,CAAA,CAAA;AAAA,YAChC,aAAa,WAAA,CAAY,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,YAChD,KAAA;AAAA,YACA,WAAW,KAAA,IAAS,OAAA;AAAA,YACpB,MAAA;AAAA,YACA,UAAU,MAAM;AACd,cAAA,MAAA,CAAO,KAAK,CAAA;AAAA,YACd;AAAA,WAAA;AAAA,UAVK,KAAA,CAAM;AAAA,SAYd,CAAA;AAAA,wBACDA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,UAAA;AAAA,YACR,IAAA,iCAAO+D,+BAAA,EAAA,EAAgB,CAAA;AAAA,YACvB,IAAA,EAAM,QAAA;AAAA,YACN,SAAA,EAAU,YAAA;AAAA,YACV,QAAA,EAAU,UAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,MAAA,CAAO,YAAY,CAAA;AAAA,YACrB;AAAA;AAAA;AACF,OAAA,EACF;AAAA;AAAA,GAEJ;AAEJ;;AC3MO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,uBACE/D,cAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,KAAA;AAAA,MACN,cAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;;ACVO,SAAS,WAAA,CAA8C;AAAA,EAC5D,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA8C;AAC5C,EAAA,uBACEA,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACE,GAAG,SAAA;AAAA,MACJ,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,MAAA,uBAClBiB,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAW,SAAA,IAAa,OAAA,EAC7B,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,wBAC3BjB,cAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,WAAA;AAAA,YACP,cAAA,EAAgB,oBAAA;AAAA,YAChB,OAAA,EAAS;AAAA;AAAA;AACX,OAAA,EACF;AAAA;AAAA,GAEJ;AAEJ;;ACdO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,kCAAYgE,+CAAA,EAAA,EAAwB,CAAA;AAAA,EACpC,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,uBACE/C,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,MAAA,EAAA,EAAO,WAAU,qCAAA,EAChB,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,MAAA,EAAA,EAAO,WAAU,QAAA,EAChB,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,MAAA,EAAA,EAAO,WAAU,qBAAA,EAChB,QAAA,EAAA;AAAA,0BAAAjB,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC/C;AAAA,SAAA,EACH,CAAA;AAAA,QACC,0BACCA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,mBAAQ,CAAA,GAC5C;AAAA,OAAA,EACN,CAAA;AAAA,sBACAA,cAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,OAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA,EAAY,aAAA;AAAA,UACZ,OAAA,EAAS;AAAA;AAAA;AACX,KAAA,EACF,CAAA;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;;AC1BO,SAAS,gBAAA,CAAmD;AAAA,EACjE,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAmD;AACjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIoB,eAAS,KAAK,CAAA;AAE5C,EAAA,SAAS,KAAA,GAAc;AACrB,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB;AAKA,EAAA,MAAM,YAAA,GAAoD,OACxD,MAAA,EACA,KAAA,KACG;AACH,IAAA,MAAM,QAAA,CAAS,QAAQ,KAAK,CAAA;AAC5B,IAAA,UAAA,CAAW,KAAK,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,uBACEpB,cAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAQ,MAAM;AACZ,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB,CAAA;AAAA,MAEC,QAAA,EAAA,OAAA,mBACCA,cAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,aAAA;AAAA,UACA,IAAA;AAAA,UACA,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,QAAO,qBACzBA,cAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAO,IAAA;AAAA,cACP,OAAO,KAAA,IAAS,KAAA;AAAA,cAChB,MAAA;AAAA,cACA,IAAA;AAAA,cACA,oBAAA;AAAA,cACA,wBACEiB,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAlB,cAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAQ,UAAA;AAAA,oBACR,IAAA,EAAM,WAAA;AAAA,oBACN,OAAA,EAAS;AAAA;AAAA,iBACX;AAAA,gCACAA,cAAA;AAAA,kBAAC,gBAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO,WAAA;AAAA,oBACP,cAAA,EAAgB,oBAAA;AAAA,oBAChB,OAAA,EAAS;AAAA;AAAA;AACX,eAAA,EACF,CAAA;AAAA,cAEF,OAAA,EAAS,KAAA;AAAA,cAER,QAAA,EAAA,MAAA,CAAO,EAAE,OAAA,EAAS;AAAA;AAAA,WACrB;AAAA,UAEF,QAAA,EAAU;AAAA;AAAA,OACZ,GACE;AAAA;AAAA,GACN;AAEJ;;ACxHA,MAAM,aAAA,GAAgBY,mBAAA;AAAA,EACpB;AAAA,IACE,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,+CAAA;AAAA,MACP,IAAA,EAAM,gBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,IAAI,EAAE,KAAA,EAAO,wBAAwB,IAAA,EAAM,SAAA,EAAW,MAAM,EAAA,EAAG;AAAA,QAC/D,IAAI,EAAE,KAAA,EAAO,uBAAuB,IAAA,EAAM,SAAA,EAAW,MAAM,EAAA;AAAG,OAChE;AAAA,MACA,OAAA,EAAS;AAAA,QACP,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,qBAAA;AAAA,UACP,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM,gBAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,QACA,QAAA,EAAU;AAAA,UACR,KAAA,EAAO,sBAAA;AAAA,UACP,IAAA,EAAM,aAAA;AAAA,UACN,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,IACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA;AAAQ,GAClD;AAAA,EACA,EAAE,SAAS,KAAA;AACb,CAAA;AAKA,MAAM,SAAA,GAAuC,EAAE,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAG;AAUvD,SAAS,KAAA,CAAM;AAAA,EACpB,MAAA,GAAS,OAAA;AAAA,EACT,IAAA,GAAO,IAAA;AAAA,EACP,OAAA,GAAU,OAAA;AAAA,EACV,IAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,EAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,EAAA,uBACEZ,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAiB,eAAA,CAAC,OAAI,SAAA,EAAW,MAAA,CAAO,OAAM,EAC1B,QAAA,EAAA;AAAA,IAAA,IAAA,mBACCjB,cAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,IAAA,EAAM,SAAA,CAAU,IAAI,CAAA,EAAG,SAAA,EAAW,MAAA,CAAO,IAAA,EAAK,EAAG,CAAA,GACjE,IAAA;AAAA,mCACH,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,IAAA,IAAS,QAAA,EAAS;AAAA,GAAA,EAC5C,CAAA,EACF,CAAA;AAEJ;;AC/DO,SAAS,MAAA,CAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAA2B;AACjE,EAAA,uBACEiB,eAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,oBAAA,EAChB,QAAA,EAAA;AAAA,oBAAAjB,cAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAY,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,oBAC1CA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,QAAA,EAAS;AAAA,GAAA,EACrC,CAAA;AAEJ;;ACRA,MAAM,eAAA,GAAkB,IAAA;AAmBjB,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,YAAY,KAAA,KAAU,WAAA;AAG5B,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIoB,eAAS,KAAK,CAAA;AACxD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAa,YAAA,EAAc;AAC9B,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IACvB,GAAG,eAAe,CAAA;AAClB,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,YAAY,CAAC,CAAA;AAE5B,EAAA,MAAM,SACJ,WAAA,IAAgB,CAAC,YAAA,KAAiB,CAAC,SAAU,SAAA,IAAa,aAAA,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAiB,YAAY,SAAA,GAAY,QAAA;AAE/C,EAAA,uBACEtB,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAA,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,+HAAA,EAAkI,MAAA,GAAS,gBAAA,GAAmB,eAAe,CAAA,CAAA;AAAA,MAEvL,kCACCA,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,8KAAA,EACb,UACH,CAAA,GACE;AAAA;AAAA,GACN,EACF,CAAA;AAEJ;;AC5DA,MAAM,QAAQY,mBAAA,CAAG;AAAA,EACf,IAAA,EAAM,gFAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,OAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAA;AACzC,CAAC,CAAA;AAWM,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,MAAA,GAAS,OAAA;AAAA,EACT,IAAA,GAAO;AACT,CAAA,EAAmC;AACjC,EAAA,uBACEZ,cAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EACX,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAc,MAAA,EAAO,SAAA,EAAW,KAAA,CAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAC1D,QAAA,kBAAAA,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,gEAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,KAEnC,CAAA,EACF,CAAA;AAEJ;;ACrCO,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA,GAAU,WAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAsC;AACpC,EAAA,uBACEiB,eAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAU,8DAAA;AAAA,MACV,OAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAjB,cAAA,CAACiE,gBAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,QAAA,EAAS,CAAA;AAAA,wBACnCjE,cAAA,CAACiE,gBAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,kBAAAjE,cAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EACE,OAAA,KAAY,WAAA,GAAc,sBAAA,GAAyB,YAAA;AAAA,YAErD,IAAA,iCAAOkE,2CAAA,EAAA,EAAsB,CAAA;AAAA,YAC7B,IAAA,EAAM;AAAA;AAAA,SACR,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;AC/BO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,uBACElE,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAA,cAAA,CAACiE,oBAAK,SAAA,EAAU,qIAAA,EACb,UACH,CAAA,EACF,CAAA;AAEJ;;ACPA,MAAM,uBAAA,GAA0B7D,iBAG9B,CAAC,EAAE,UAAU,GAAG,eAAA,IAAmB,GAAA,KAAQ;AAC3C,EAAA,uBACEa,eAAA,CAACR,sBAAA,EAAA,EAAa,GAAA,EAAW,GAAG,eAAA,EAC1B,QAAA,EAAA;AAAA,oBAAAT,cAAA,CAACiE,gBAAA,EAAA,EAAK,WAAU,4FAAA,EAA6F,CAAA;AAAA,oBAC7GjE,cAAA,CAACiE,gBAAA,EAAA,EAAK,SAAA,EAAU,6FAAA,EAA8F,CAAA;AAAA,mCAC7G,kBAAA,EAAA,EAAmB,CAAA;AAAA,IACnB;AAAA,GAAA,EACH,CAAA;AAEJ,CAAC,CAAA;AAOM,MAAM,kBAAA,GAAqB7D,iBAGhC,CAAC,EAAE,QAAQ,QAAA,EAAU,GAAG,eAAA,EAAgB,EAAG,GAAA,KAAQ;AACnD,EAAA,uBACEJ,cAAA,CAAC,eAAY,MAAA,EACX,QAAA,kBAAAA,cAAA,CAAC,2BAAwB,GAAA,EAAW,GAAG,eAAA,EACpC,QAAA,EACH,CAAA,EACF,CAAA;AAEJ,CAAC;;AC5CM,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA,EAIzB,IAAA,EAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAIN,KAAA,EAAO,GAAA;AAAA;AAAA;AAAA;AAAA,EAIP,MAAA,EAAQ,GAAA;AAAA;AAAA;AAAA;AAAA,EAIR,KAAA,EAAO,IAAA;AAAA;AAAA;AAAA;AAAA,EAIP,IAAA,EAAM;AACR;AAKO,IAAK,kBAAA,qBAAAmE,mBAAAA,KAAL;AACL,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AALG,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;;ACnBL,SAAS,wBAAA,GAA+C;AAC7D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI7B,+BAAA,EAAoB;AACtC,EAAA,IAAI,KAAA,IAAS,WAAA,CAAY,IAAA,EAAM,OAAO,kBAAA,CAAmB,IAAA;AACzD,EAAA,IAAI,KAAA,IAAS,WAAA,CAAY,KAAA,EAAO,OAAO,kBAAA,CAAmB,KAAA;AAC1D,EAAA,IAAI,KAAA,IAAS,WAAA,CAAY,MAAA,EAAQ,OAAO,kBAAA,CAAmB,MAAA;AAC3D,EAAA,IAAI,KAAA,IAAS,WAAA,CAAY,KAAA,EAAO,OAAO,kBAAA,CAAmB,KAAA;AAC1D,EAAA,OAAO,kBAAA,CAAmB,IAAA;AAC5B;AAEO,SAAS,iCAEd,KAAA,EAA6B;AAC7B,EAAA,MAAM,UAAU,wBAAA,EAAyB;AAGzC,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,kBAAA,CAAmB,IAAA;AAAA,IACnB,kBAAA,CAAmB,KAAA;AAAA,IACnB,kBAAA,CAAmB,MAAA;AAAA,IACnB,kBAAA,CAAmB,KAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AACA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAChD,IAAA,MAAM,SAAA,GAAY,QAAQ,CAAC,CAAA;AAC3B,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,SAAA;AAAA,EACxC;AACA,EAAA,OAAO,kBAAA,CAAmB,IAAA;AAC5B;;ACdA,MAAM,gBAAA,GAA2C;AAAA,EAC/C,UAAA,EAAY,MAAA;AAAA,EACZ,YAAA,EAAc,gBAAA;AAAA,EACd,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,gBAAA;AAAA,EACd,WAAA,EAAa,gBAAA;AAAA,EACb,WAAA,EAAa,gBAAA;AAAA,EACb,cAAA,EAAgB,0BAAA;AAAA,EAChB,aAAA,EAAe,0BAAA;AAAA,EACf,YAAA,EAAc,0BAAA;AAAA,EACd,YAAA,EAAc,gBAAA;AAAA,EACd,cAAA,EAAgB,0BAAA;AAAA,EAChB,aAAA,EAAe,0BAAA;AAAA,EACf,WAAA,EAAa,gBAAA;AAAA,EACb,YAAA,EAAc,0BAAA;AAAA,EACd,UAAA,EAAY;AACd,CAAA;AAQO,SAAS,iCAAA,CAAkC;AAAA,EAChD,GAAG;AACL,CAAA,EAAsC;AACpC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAE1C,EAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,GAAG,KAAA,KAAU;AAC1C,IAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,KAAA;AACxC,IAAA,MAAM,YAAY,gBAAA,CAAiB,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,IAAK,MAAA;AACzD,IAAA,uBACEtC,cAAA,CAACiE,gBAAA,EAAA,EAAgB,SAAA,EACd,QAAA,EAAA,IAAA,EAAA,EADQ,IAEX,CAAA;AAAA,EAEJ,CAAC,CAAA;AACH;AAMO,SAAS,0BAAA,CAA2B;AAAA,EACzC,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsC;AACpC,EAAA,MAAM,qBAAA,GAAwB,gCAAA;AAAA,IAC5B,MAAA,CAAO,KAAK,WAAW;AAAA,GACzB;AAEA,EAAA,OAAO,WAAA,CAAY,qBAAqB,CAAA,IAAK,IAAA;AAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}