@cjlapao/ui-kit 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CapsuleBlueprint-w82xP6zg.d.cts +222 -0
- package/dist/CapsuleBlueprint-w82xP6zg.d.ts +222 -0
- package/dist/index.cjs +27250 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +17707 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +3666 -0
- package/dist/index.d.ts +3666 -0
- package/dist/index.js +27163 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.cjs +16439 -0
- package/dist/markdown.cjs.map +1 -0
- package/dist/markdown.css +48 -0
- package/dist/markdown.css.map +1 -0
- package/dist/markdown.d.cts +26 -0
- package/dist/markdown.d.ts +26 -0
- package/dist/markdown.js +16520 -0
- package/dist/markdown.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/Alert.tsx","../src/contexts/IconContext.tsx","../src/types/Icon.ts","../../common/theme/Theme.ts","../src/components/AppDivider.tsx","../src/components/Badge.tsx","../src/components/BadgeIcon.tsx","../src/components/IconButton.tsx","../src/components/Spinner.tsx","../../common/theme/ButtonTypes.ts","../src/components/TooltipWrapper.tsx","../../common/theme/glass.ts","../src/components/Pill.tsx","../src/components/Progress.tsx","../src/components/MultiProgressBar.tsx","../../common/theme/randomThemeColor.ts","../src/components/StatusSpinner.tsx","../src/components/Loader.tsx","../src/components/EmptyState.tsx","../src/components/Button.tsx","../src/components/Hero.tsx","../src/components/CustomIcon.tsx","../src/icons/components/Add.tsx","../src/icons/components/ArrowDown.tsx","../src/icons/components/ArrowLeft.tsx","../src/icons/components/ArrowRight.tsx","../src/icons/components/ArrowUp.tsx","../src/icons/components/Attached.tsx","../src/icons/components/Attachment.tsx","../src/icons/components/Back.tsx","../src/icons/components/Blueprint.tsx","../src/icons/components/Bug.tsx","../src/icons/components/Chat.tsx","../src/icons/components/CheckCircle.tsx","../src/icons/components/ChevronLeft.tsx","../src/icons/components/ChevronRight.tsx","../src/icons/components/Clean.tsx","../src/icons/components/Close.tsx","../src/icons/components/Close1.tsx","../src/icons/components/CloudOff.tsx","../src/icons/components/Cog.tsx","../src/icons/components/Complete.tsx","../src/icons/components/Container.tsx","../src/icons/components/CopyClipboard.tsx","../src/icons/components/Dashboard.tsx","../src/icons/components/Details.tsx","../src/icons/components/DockerCopy.tsx","../src/icons/components/Docker.tsx","../src/icons/components/Dots.tsx","../src/icons/components/Download.tsx","../src/icons/components/Edit.tsx","../src/icons/components/Equal.tsx","../src/icons/components/Error.tsx","../src/icons/components/Export.tsx","../src/icons/components/EyeClosed.tsx","../src/icons/components/EyeOpen.tsx","../src/icons/components/Globe.tsx","../src/icons/components/Help.tsx","../src/icons/components/Idea.tsx","../src/icons/components/Image.tsx","../src/icons/components/Info.tsx","../src/icons/components/Key.tsx","../src/icons/components/LXCOld.tsx","../src/icons/components/LXC.tsx","../src/icons/components/Log.tsx","../src/icons/components/Moon.tsx","../src/icons/components/Notification.tsx","../src/icons/components/Official.tsx","../src/icons/components/Offline.tsx","../src/icons/components/OpenApp.tsx","../src/icons/components/Parameter.tsx","../src/icons/components/Pause.tsx","../src/icons/components/Praise.tsx","../src/icons/components/ReportFeedback.tsx","../src/icons/components/Reset.tsx","../src/icons/components/Restart.tsx","../src/icons/components/Rocket.tsx","../src/icons/components/Run.tsx","../src/icons/components/Save.tsx","../src/icons/components/Scale.tsx","../src/icons/components/Script.tsx","../src/icons/components/Search.tsx","../src/icons/components/Send.tsx","../src/icons/components/Settings.tsx","../src/icons/components/Shop.tsx","../src/icons/components/Star.tsx","../src/icons/components/Stop.tsx","../src/icons/components/Sun.tsx","../src/icons/components/Suspend.tsx","../src/icons/components/ThemeAuto.tsx","../src/icons/components/ThemeDark.tsx","../src/icons/components/ThemeLight.tsx","../src/icons/components/Trash.tsx","../src/icons/components/UX.tsx","../src/icons/components/User.tsx","../src/icons/components/Users.tsx","../src/icons/components/Verified.tsx","../src/icons/components/ViewGrid.tsx","../src/icons/components/ViewRows.tsx","../src/icons/components/Library.tsx","../src/icons/components/Host.tsx","../src/icons/components/VirtualMachine.tsx","../src/icons/components/Role.tsx","../src/icons/components/Roles.tsx","../src/icons/components/Cache.tsx","../src/icons/components/Claim.tsx","../src/icons/components/Claims.tsx","../src/icons/components/KeyManagement.tsx","../src/icons/components/Windows.tsx","../src/icons/components/Ubuntu.tsx","../src/icons/components/Debian.tsx","../src/icons/components/Apple.tsx","../src/icons/components/KaliLinux.tsx","../src/icons/components/RedHat.tsx","../src/icons/components/Fedora.tsx","../src/icons/components/CentOS.tsx","../src/icons/components/Clone.tsx","../src/icons/components/Copy.tsx","../src/icons/components/Live.tsx","../src/icons/components/HealthCheck.tsx","../src/icons/components/ReverseProxy.tsx","../src/icons/components/ReverseProxyRoutes.tsx","../src/icons/components/ReverseProxyCORS.tsx","../src/icons/components/ReverseProxyFrom.tsx","../src/icons/components/ReverseProxyHeadersRequest.tsx","../src/icons/components/ReverseProxyHeadersResponse.tsx","../src/icons/components/ReverseProxyHTTP.tsx","../src/icons/components/ReverseProxyTLS.tsx","../src/icons/components/ReverseProxyTo.tsx","../src/icons/components/ReverseProxyTCP.tsx","../src/icons/components/Refresh.tsx","../src/icons/components/Calendar.tsx","../src/icons/components/Folder.tsx","../src/icons/components/Jobs.tsx","../src/icons/components/Warning.tsx","../src/icons/components/Artifactory.tsx","../src/icons/components/Azure.tsx","../src/icons/components/Minio.tsx","../src/icons/components/Aws.tsx","../src/icons/components/Orchestrator.tsx","../src/icons/components/Podman.tsx","../src/icons/components/PodmanDesktop.tsx","../src/icons/components/Group.tsx","../src/icons/components/Pin.tsx","../src/icons/components/Database.tsx","../src/icons/components/RemoteHost.tsx","../src/icons/components/Login.tsx","../src/icons/components/Logout.tsx","../src/icons/components/Snapshot.tsx","../src/icons/components/Revert.tsx","../src/icons/components/CleanBrush.tsx","../src/icons/components/Pull.tsx","../src/icons/components/Push.tsx","../src/icons/components/CatalogVersion.tsx","../src/icons/components/File.tsx","../src/icons/components/Revoke.tsx","../src/icons/components/Taint.tsx","../src/icons/components/Unlock.tsx","../src/icons/components/Check.tsx","../src/icons/components/ArrowChevronLeft.tsx","../src/icons/components/ArrowChevronRight.tsx","../src/icons/components/Drag.tsx","../src/icons/registry.ts","../../common/utils/iconUtils.ts","../src/components/DynamicImg.tsx","../src/components/DropdownButton.tsx","../src/components/DropdownMenu.tsx","../src/components/Tooltip.tsx","../src/components/Input.tsx","../src/components/PasswordInput.tsx","../src/components/Textarea.tsx","../src/components/Select.tsx","../src/components/Combobox.tsx","../src/components/Picker.tsx","../src/components/TagPicker.tsx","../src/components/TagPanel.tsx","../src/components/Section.tsx","../src/components/Checkbox.tsx","../src/components/Toggle.tsx","../src/components/MultiToggle.tsx","../src/components/ButtonSelector.tsx","../src/components/FormField.tsx","../src/components/FormLayout.tsx","../src/components/FormSection.tsx","../src/components/InputGroup.tsx","../src/components/MultiSelectPills.tsx","../src/components/SearchBar.tsx","../src/components/GlassBackground.tsx","../src/components/TruncatedText.tsx","../src/components/InfoRow.tsx","../src/components/SectionCard.tsx","../src/components/PagedPanel.tsx","../src/components/Panel.tsx","../src/components/CollapsiblePanel.tsx","../src/components/HeaderGroup.tsx","../src/components/DetailItemCard.tsx","../src/components/InfiniteScrollPanel.tsx","../src/components/CollapsibleHelpText.tsx","../src/components/UserAvatar.tsx","../src/components/Accordion.tsx","../src/hooks/useAccordion.ts","../src/components/Tabs.tsx","../src/components/Modal.tsx","../src/utils/renderIcon.tsx","../src/components/InlinePanel.tsx","../src/components/SideMenu.tsx","../src/components/SideMenuLayout.tsx","../src/contexts/SideMenuActionsContext.tsx","../src/components/SplitView.tsx","../src/hooks/useResizable.ts","../src/components/HelpButton.tsx","../src/components/SmartInput.tsx","../src/components/VariablePicker.tsx","../../common/types/Variables.ts","../../common/utils/smartVariables.ts","../src/components/SmartValue.tsx","../src/components/StartupStageStepper.tsx","../src/components/StatChartTile.tsx","../src/components/StatTile.tsx","../src/components/StatCountTile.tsx","../src/components/StatGoalTile.tsx","../src/components/StatGraphTile.tsx","../src/components/Stepper.tsx","../src/hooks/useStepper.ts","../src/hooks/useTheme.ts","../src/components/Table.tsx","../src/components/AccessMatrix.tsx","../src/components/KeyValueArrayField.tsx","../src/components/ApiErrorState.tsx","../src/components/DynamicFormField.tsx","../../common/types/CapsuleBlueprint.ts","../src/components/NotificationModal.tsx","../src/components/SidePanel.tsx","../src/components/TimelinePanel/TimelinePanel.tsx","../src/components/TreeView/toneColors.ts","../src/components/ConnectionFlow/ConnectionFlow.tsx","../src/components/ConnectionFlow/ConnectionFlowConnector.tsx","../src/components/ConnectionFlow/ConnectionFlowColumn.tsx","../src/components/TreeView/TreeItemCard.tsx","../src/components/TreeView/TreeFlowSvg.tsx","../src/components/ConnectionFlow/ConnectionFlowParallelGroup.tsx","../src/components/TreeView/TreeView.tsx","../src/contexts/BottomSheetContext.tsx","../../common/utils/focusUtils.ts","../../common/utils/stringUtils.ts","../../common/utils/durationUtils.ts","../../common/utils/bytesUtils.ts","../../common/utils/dependencyUtils.ts","../../common/utils/gravatar.ts","../src/utils/toastUtils.ts","../src/components/MetricBar.tsx"],"sourcesContent":["// Components\nexport * from \"./components\";\n\n// Contexts\n// Contexts\nexport * from \"./contexts\";\nexport * from \"./contexts/BottomSheetContext\";\n\n// Hooks\nexport * from \"./hooks\";\n\n// Theme\nexport * from \"./theme\";\n\n// Utilities\nexport * from \"./utils\";\n\n// Types\nexport * from \"./types\";\nexport * from \"./components/MetricBar\";\n\n// Controls — types from internal components not yet in the main barrel\nexport type { KeyValuePair } from \"./components/KeyValueArrayField\";\nexport type {\n StepStatus,\n StepperVariant,\n StepperOrientation,\n StepperSize,\n StepperConnector,\n StepperConnectorAlign,\n StepperProgressBarPosition,\n} from \"./components/Stepper\";\n\n// Icons — explicit re-exports of IconName type + iconRegistry (SVG components are re-exported via \"./icons\" above)\nexport type { IconName } from \"./icons/registry\";\nexport { iconRegistry } from \"./icons/registry\";\n\n// Default exports not covered by `export *`\nexport { default as MultiToggle } from \"./components/MultiToggle\";\n\n// Icon components — explicit re-exports for Rollup compatibility\n// (these are available via `export * from \"./icons\"` but Rollup can't\n// statically resolve nested `export *` chains, so we list the ones\n// consumed by the demo app here)\nexport { Sun } from \"./icons/components/Sun\";\nexport { Moon } from \"./icons/components/Moon\";\nexport { ThemeAuto } from \"./icons/components/ThemeAuto\";\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport type { TrueColor } from \"../theme/Theme\";\nimport { getAlertColorClasses } from \"../theme/Theme\";\n\nexport type AlertVariant = \"subtle\" | \"solid\" | \"outline\";\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n // @deprecated Use color instead\n tone?: TrueColor;\n color?: TrueColor;\n variant?: AlertVariant;\n title?: string;\n description?: string;\n icon?: string | React.ReactElement | false;\n actions?: React.ReactNode;\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nconst defaultIcons: Partial<Record<TrueColor, string>> = {\n neutral: \"Info\",\n slate: \"Info\",\n gray: \"Info\",\n zinc: \"Info\",\n stone: \"Info\",\n red: \"Error\",\n orange: \"Warning\",\n amber: \"Warning\",\n yellow: \"Warning\",\n lime: \"CheckCircle\",\n green: \"CheckCircle\",\n emerald: \"CheckCircle\",\n teal: \"CheckCircle\",\n cyan: \"CheckCircle\",\n sky: \"CheckCircle\",\n blue: \"CheckCircle\",\n indigo: \"CheckCircle\",\n violet: \"CheckCircle\",\n purple: \"CheckCircle\",\n fuchsia: \"CheckCircle\",\n rose: \"Error\",\n};\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n tone,\n color,\n variant = \"subtle\",\n title,\n description,\n icon,\n actions,\n dismissible = false,\n onDismiss,\n className,\n ...rest\n },\n ref,\n ) => {\n const renderIcon = useIconRenderer();\n const effectiveColor = color ?? tone ?? \"neutral\";\n const tokens = getAlertColorClasses(effectiveColor);\n const base = classNames(\n \"relative flex w-full gap-3 rounded-2xl border px-4 py-3 shadow-sm transition\",\n variant === \"subtle\" && tokens.subtle,\n variant === \"solid\" && tokens.solid,\n variant === \"outline\" && [tokens.outline, tokens.border],\n className,\n );\n\n const resolvedIcon =\n icon === false ? null : (icon ?? defaultIcons[effectiveColor]);\n\n return (\n <div ref={ref} className={base} role=\"alert\" {...rest}>\n {resolvedIcon && (\n <div className={classNames(\"flex-shrink-0 pt-1\", tokens.icon)}>\n {renderIcon(resolvedIcon, \"md\")}\n </div>\n )}\n <div className=\"flex flex-1 flex-col gap-1 text-sm\">\n {title && (\n <div className=\"text-sm font-semibold leading-tight text-current\">\n {title}\n </div>\n )}\n {description && (\n <div className={classNames(\"leading-relaxed\", tokens.text)}>\n {description}\n </div>\n )}\n {actions && <div className=\"pt-2 text-sm\">{actions}</div>}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className={classNames(\n \"ml-2 inline-flex h-8 w-8 items-center justify-center rounded-full text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n tokens.dismiss,\n )}\n aria-label=\"Dismiss alert\"\n >\n {renderIcon(\"Close\", \"sm\")}\n </button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = \"Alert\";\n\nexport default Alert;\n","import React, { createContext, useContext, type ReactNode } from \"react\";\nimport { defaultIconRenderer, type IconRenderer } from \"../types/Icon\";\n\ninterface IconContextValue {\n renderIcon: IconRenderer;\n}\n\nconst IconContext = createContext<IconContextValue>({\n renderIcon: defaultIconRenderer,\n});\n\nexport interface IconProviderProps {\n renderIcon: IconRenderer;\n children: ReactNode;\n}\n\n/**\n * Provider for customizing icon rendering in ui-kit components.\n * Wrap your app with this provider to supply a custom icon renderer.\n */\nexport const IconProvider: React.FC<IconProviderProps> = ({\n renderIcon,\n children,\n}) => {\n return (\n <IconContext.Provider value={{ renderIcon }}>\n {children}\n </IconContext.Provider>\n );\n};\n\n/**\n * Hook to access the icon renderer from context\n */\nexport const useIconRenderer = (): IconRenderer => {\n const context = useContext(IconContext);\n return context.renderIcon;\n};\n\nexport { IconContext };\n","import type { ReactElement, ReactNode } from \"react\";\n\nexport type IconSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n/**\n * Base icon name type - apps can extend this with their own icon names\n */\nexport type BaseIconName = string;\n\n/**\n * Icon renderer function type\n */\nexport type IconRenderer = (\n icon: BaseIconName | ReactElement | undefined,\n size: IconSize | undefined,\n className?: string,\n) => ReactNode;\n\n/**\n * Default no-op icon renderer - returns null for string icons\n */\nexport const defaultIconRenderer: IconRenderer = (icon, _size, _className) => {\n if (!icon) return null;\n if (typeof icon === \"string\") {\n // Return a placeholder span for string icons when no renderer is configured\n return null;\n }\n // For React elements, return as-is\n return icon;\n};\n","// Defined here (not in components/Button) so this module stays free of\n// framework-specific imports — the Vue kit re-uses it as-is. Button re-exports\n// it, keeping the public API unchanged.\nexport type ButtonVariant =\n | \"solid\"\n | \"soft\"\n | \"outline\"\n | \"ghost\"\n | \"link\"\n | \"clear\"\n | \"icon\"\n | \"glass\";\n\n/**\n * TrueColor is the only valid color type in the ui-kit theme system.\n * It comprises 21 Tailwind palette color names (red through stone, including fuchsia and rose).\n * All components, tokens, and utilities must use TrueColor exclusively.\n */\nexport type TrueColor =\n | \"red\"\n | \"orange\"\n | \"amber\"\n | \"yellow\"\n | \"lime\"\n | \"green\"\n | \"emerald\"\n | \"teal\"\n | \"cyan\"\n | \"sky\"\n | \"blue\"\n | \"indigo\"\n | \"violet\"\n | \"purple\"\n | \"fuchsia\"\n | \"rose\"\n | \"slate\"\n | \"gray\"\n | \"zinc\"\n | \"neutral\"\n | \"stone\";\n\n/**\n * Shared size type used across all frameworks and components.\n * Replaces both the old ThemeSize (dead code) and ModalSize.\n */\nexport type Size =\n | \"xs\"\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"xxl\"\n | \"xxxl\"\n | \"2xl\"\n | \"3xl\"\n | \"full\";\n\nconst colors: TrueColor[] = [\n \"red\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n \"rose\",\n \"slate\",\n \"gray\",\n \"zinc\",\n \"neutral\",\n \"stone\",\n];\n\ntype ButtonTheme = Record<ButtonVariant, Record<TrueColor, string>>;\ntype ButtonHoverTheme = Record<ButtonVariant, Record<TrueColor, string>>;\ntype ButtonActiveTheme = Record<ButtonVariant, Record<TrueColor, string>>;\ntype ButtonActiveHoverTheme = Record<ButtonVariant, Record<TrueColor, string>>;\ntype ToggleTheme = Record<TrueColor, string>;\ntype CheckboxTheme = Record<TrueColor, string>;\ntype SpinnerTheme = Record<TrueColor, [string, string, string, string]>;\ntype LoaderTheme = Record<TrueColor, { track: string; bar: string }>;\ntype MultiToggleTheme = Record<\n TrueColor,\n { active: string; activeText: string; indicator: string; hover: string }\n>;\ntype MultiToggleVariantTokens = {\n softIndicator: string;\n activeText: string;\n hover: string;\n};\ntype MultiToggleVariantTheme = Record<TrueColor, MultiToggleVariantTokens>;\n\ntype TabsColorTokens = {\n hoverText: string;\n activeText: string;\n onAccentText: string;\n focusRing: string;\n accentBg: string;\n subtleBg: string;\n subtleHoverBg: string;\n segmentedContainer: string;\n badgeSubtle: string;\n badgeStrong: string;\n badgeOnAccent: string;\n underlineActive: string;\n};\n\ntype TabsTheme = Record<TrueColor, TabsColorTokens>;\n\ntype PanelToneConfig = {\n border: string;\n heading: string;\n muted: string;\n badge: string;\n subtleBg: string;\n tonalBg: string;\n glassBg: string;\n glassBorder: string;\n liquidBg: string;\n liquidBorder: string;\n liquidShadow: string;\n liquidHeading: string;\n overlayGradient: string;\n decorationShape: string;\n decorationGradient: string;\n};\n\ntype PanelTheme = Record<TrueColor, PanelToneConfig>;\n\ntype StepperToneConfig = {\n activeBg: string;\n activeText: string;\n completedBg: string;\n completedText: string;\n pendingBorder: string;\n pendingText: string;\n underlineBase: string;\n};\n\ntype StepperTheme = Record<TrueColor, StepperToneConfig>;\n\ntype BadgeTheme = Record<TrueColor, string>;\ntype PillTheme = Record<\n TrueColor,\n Record<\"solid\" | \"soft\" | \"outline\", { base: string; border?: string }>\n>;\ntype AlertTheme = Record<\n TrueColor,\n {\n subtle: string;\n solid: string;\n outline: string;\n icon: string;\n text: string;\n border: string;\n dismiss: string;\n }\n>;\n\ntype StatTileTheme = Record<\n TrueColor,\n {\n decorationBg: string;\n iconColor: string;\n divider: string;\n }\n>;\n\ntype ButtonSelectorColorTokens = {\n selectedBorder: string;\n selectedBg: string;\n selectedIcon: string;\n selectedLabel: string;\n selectedIndicatorBg: string;\n selectedIndicatorBorder: string;\n selectedIndicatorDot: string;\n};\n\ntype ButtonSelectorTheme = Record<TrueColor, ButtonSelectorColorTokens>;\n\ninterface ThemeDefinition {\n button: ButtonTheme;\n buttonHover: ButtonHoverTheme;\n buttonActive: ButtonActiveTheme;\n buttonActiveHover: ButtonActiveHoverTheme;\n toggle: ToggleTheme;\n checkbox: CheckboxTheme;\n spinner: SpinnerTheme;\n loader: LoaderTheme;\n multiToggle: MultiToggleTheme;\n multiToggleVariant: MultiToggleVariantTheme;\n tabs: TabsTheme;\n panel: PanelTheme;\n stepper: StepperTheme;\n badge: BadgeTheme;\n pill: PillTheme;\n alert: AlertTheme;\n statTile: StatTileTheme;\n buttonSelector: ButtonSelectorTheme;\n}\n\nconst createTheme = (): ThemeDefinition => {\n const empty = () => ({}) as Record<TrueColor, string>;\n const theme: ThemeDefinition = {\n button: {\n solid: empty(),\n soft: empty(),\n outline: empty(),\n ghost: empty(),\n link: empty(),\n clear: empty(),\n icon: empty(),\n glass: empty(), // glass variant uses dynamic classes (getGlassFillClass)\n },\n buttonHover: {\n solid: empty(),\n soft: empty(),\n outline: empty(),\n ghost: empty(),\n link: empty(),\n clear: empty(),\n icon: empty(),\n glass: empty(), // glass variant uses dynamic classes at runtime\n },\n buttonActive: {\n solid: empty(),\n soft: empty(),\n outline: empty(),\n ghost: empty(),\n link: empty(),\n clear: empty(),\n icon: empty(),\n glass: empty(), // glass variant uses dynamic classes at runtime\n },\n buttonActiveHover: {\n solid: empty(),\n soft: empty(),\n outline: empty(),\n ghost: empty(),\n link: empty(),\n clear: empty(),\n icon: empty(),\n glass: empty(), // glass variant uses dynamic classes at runtime\n },\n toggle: {} as ToggleTheme,\n checkbox: {} as CheckboxTheme,\n spinner: {} as SpinnerTheme,\n loader: {} as LoaderTheme,\n multiToggle: {} as MultiToggleTheme,\n multiToggleVariant: {} as MultiToggleVariantTheme,\n tabs: {} as TabsTheme,\n panel: {} as PanelTheme,\n stepper: {} as StepperTheme,\n badge: {} as BadgeTheme,\n pill: {} as PillTheme,\n alert: {} as AlertTheme,\n statTile: {} as StatTileTheme,\n buttonSelector: {} as ButtonSelectorTheme,\n };\n\n colors.forEach((color) => {\n // Button\n theme.button.solid[color] =\n `bg-${color}-500 text-white shadow-sm hover:bg-${color}-400 focus-visible:ring-2 focus-visible:ring-${color}-500 focus-visible:ring-offset-2 dark:bg-${color}-400 dark:hover:bg-${color}-300`;\n theme.button.soft[color] =\n `bg-${color}-50 text-${color}-600 ring-1 ring-inset ring-${color}-200 hover:bg-${color}-100 focus-visible:ring-2 focus-visible:ring-${color}-400 focus-visible:ring-offset-2 dark:bg-${color}-500/10 dark:text-${color}-200 dark:ring-${color}-500/40`;\n theme.button.outline[color] =\n `border border-${color}-200 text-${color}-600 hover:bg-${color}-200 focus-visible:ring-2 focus-visible:ring-${color}-400 focus-visible:ring-offset-2 dark:border-${color}-500/50 dark:text-${color}-200 dark:hover:bg-${color}-500/10`;\n theme.button.ghost[color] =\n `text-${color}-600 hover:bg-${color}-100 focus-visible:ring-2 focus-visible:ring-${color}-400 focus-visible:ring-offset-2 dark:text-${color}-200 dark:hover:bg-${color}-500/5`;\n theme.button.link[color] =\n `text-${color}-600 hover:text-${color}-500 hover:underline dark:text-${color}-200`;\n theme.button.clear[color] =\n `text-${color}-600 hover:text-${color}-500 dark:text-${color}-200`;\n theme.button.icon[color] =\n `text-${color}-600 bg-${color}-50 hover:bg-${color}-100 focus-visible:ring-2 focus-visible:ring-${color}-400 focus-visible:ring-offset-2 dark:text-${color}-200 dark:bg-${color}-500/10 dark:hover:bg-${color}-500/20`;\n\n // Button hover classes (accent override — matches the hover portion of each button variant above)\n theme.buttonHover.solid[color] =\n `hover:bg-${color}-400 dark:hover:bg-${color}-300`;\n theme.buttonHover.soft[color] = `hover:bg-${color}-100`;\n theme.buttonHover.outline[color] =\n `hover:bg-${color}-50 dark:hover:bg-${color}-500/10`;\n theme.buttonHover.ghost[color] =\n `hover:bg-${color}-100 dark:hover:bg-${color}-500/5`;\n theme.buttonHover.link[color] = `hover:text-${color}-500 hover:underline`;\n theme.buttonHover.clear[color] = `hover:text-${color}-500`;\n theme.buttonHover.icon[color] =\n `hover:bg-${color}-100 dark:hover:bg-${color}-500/20`;\n\n // Button active classes (persistent \"on\" state — lighter shade, no hover)\n theme.buttonActive.solid[color] =\n `bg-${color}-200 text-${color}-800 shadow-sm dark:bg-${color}-300 dark:text-${color}-900`;\n theme.buttonActive.soft[color] =\n `bg-${color}-100 text-${color}-700 ring-1 ring-inset ring-${color}-300 dark:bg-${color}-500/20 dark:text-${color}-100 dark:ring-${color}-400/50`;\n theme.buttonActive.outline[color] =\n `border border-${color}-300 bg-${color}-50 text-${color}-700 dark:border-${color}-400/60 dark:bg-${color}-500/15 dark:text-${color}-100`;\n theme.buttonActive.ghost[color] =\n `bg-${color}-100 text-${color}-700 dark:bg-${color}-500/15 dark:text-${color}-100`;\n theme.buttonActive.link[color] =\n `text-${color}-400 underline dark:text-${color}-300`;\n theme.buttonActive.clear[color] = `text-${color}-400 dark:text-${color}-300`;\n theme.buttonActive.icon[color] =\n `bg-${color}-100 text-${color}-700 dark:bg-${color}-500/20 dark:text-${color}-200`;\n\n // Button active-hover classes (hover within the active state — one step darker than the active base)\n theme.buttonActiveHover.solid[color] =\n `hover:bg-${color}-300 dark:hover:bg-${color}-400`;\n theme.buttonActiveHover.soft[color] =\n `hover:bg-${color}-200 dark:hover:bg-${color}-500/30`;\n theme.buttonActiveHover.outline[color] =\n `hover:bg-${color}-100 dark:hover:bg-${color}-500/25`;\n theme.buttonActiveHover.ghost[color] =\n `hover:bg-${color}-200 dark:hover:bg-${color}-500/25`;\n theme.buttonActiveHover.link[color] =\n `hover:text-${color}-500 dark:hover:text-${color}-200`;\n theme.buttonActiveHover.clear[color] =\n `hover:text-${color}-500 dark:hover:text-${color}-200`;\n theme.buttonActiveHover.icon[color] =\n `hover:bg-${color}-200 dark:hover:bg-${color}-500/30`;\n\n // Toggle\n theme.toggle[color] =\n `peer-checked:bg-${color}-500 peer-checked:border-${color}-500 peer-focus:ring-${color}-400 dark:peer-checked:bg-${color}-400`;\n\n // Checkbox\n theme.checkbox[color] =\n `accent-${color}-600 focus-visible:ring-${color}-500 dark:focus-visible:ring-${color}-400`;\n\n // Spinner\n theme.spinner[color] = [\n `border-t-${color}-500 dark:border-t-${color}-300`,\n `border-r-${color}-300 dark:border-r-${color}-200`,\n `border-b-${color}-200 dark:border-b-${color}-100/60`,\n `border-l-${color}-100 dark:border-l-${color}-100/40`,\n ];\n\n // Loader\n theme.loader[color] = {\n track: `bg-${color}-100/60 dark:bg-${color}-900/40`,\n bar: `bg-${color}-500`,\n };\n\n // MultiToggle\n theme.multiToggle[color] = {\n active: `bg-${color}-500/90 dark:bg-${color}-400/90`,\n activeText: `text-${color}-700 dark:text-${color}-200`,\n indicator: `bg-${color}-500/15 dark:bg-${color}-400/20 border border-${color}-400/40 dark:border-${color}-300/20`,\n hover: `hover:text-${color}-600 dark:hover:text-${color}-300`,\n };\n\n // MultiToggle variant (solid/soft)\n theme.multiToggleVariant[color] = {\n softIndicator: `bg-${color}-100 dark:bg-${color}-900/30`,\n activeText: `text-${color}-600 dark:text-${color}-400`,\n hover: `hover:text-${color}-600 dark:hover:text-${color}-400`,\n };\n\n // Tabs\n theme.tabs[color] = {\n hoverText: `hover:text-${color}-500 dark:hover:text-${color}-200`,\n activeText: `text-${color}-600 dark:text-${color}-300`,\n onAccentText: \"text-white dark:text-white\",\n focusRing: `focus-visible:ring-${color}-400`,\n accentBg: `bg-${color}-500 dark:bg-${color}-400`,\n subtleBg: `bg-${color}-50 dark:bg-${color}-500/10`,\n subtleHoverBg: `hover:bg-${color}-100 dark:hover:bg-${color}-500/20`,\n segmentedContainer: `border-${color}-200 bg-${color}-50 dark:border-${color}-500/40 dark:bg-${color}-700/10`,\n badgeSubtle: `bg-${color}-100 text-${color}-600 dark:bg-${color}-500/20 dark:text-${color}-200`,\n badgeStrong: `bg-${color}-200 text-${color}-700 dark:bg-${color}-500/40 dark:text-${color}-100`,\n badgeOnAccent: \"bg-white/20 text-white\",\n underlineActive: `after:bg-${color}-500 dark:after:bg-${color}-400`,\n };\n\n // Panel\n theme.panel[color] = {\n border: `border-${color}-300 dark:border-${color}-500/50`,\n heading: `text-${color}-700 dark:text-${color}-200`,\n muted: `text-${color}-600/90 dark:text-${color}-200/85`,\n badge: `bg-${color}-100 text-${color}-700 dark:bg-${color}-500/20 dark:text-${color}-100`,\n subtleBg: `bg-${color}-50/80 dark:bg-${color}-500/10`,\n tonalBg: `bg-${color}-100/80 dark:bg-${color}-500/15`,\n glassBg: `bg-${color}-50/50 dark:bg-${color}-500/15`,\n glassBorder: `border-${color}-500 dark:border-${color}-400`,\n liquidBg: `bg-${color}-50/30 dark:bg-${color}-500/10`,\n liquidBorder: `border-${color}-300/50 dark:border-${color}-500/25`,\n liquidShadow: \"shadow-lg\",\n liquidHeading: `text-${color}-700 dark:text-${color}-200`,\n overlayGradient: `from-${color}-900/70 via-${color}-900/40 to-${color}-900/15`,\n decorationShape: `bg-${color}-400/10 dark:bg-${color}-300/5`,\n decorationGradient: `from-${color}-100/60 to-transparent dark:from-${color}-500/10 dark:to-transparent`,\n };\n\n // Stepper\n theme.stepper[color] = {\n activeBg: `bg-${color}-600 dark:bg-${color}-400`,\n activeText: \"text-white\",\n completedBg: `bg-${color}-100 dark:bg-${color}-600/60`,\n completedText: `text-${color}-700 dark:text-${color}-100`,\n pendingBorder: `border-${color}-200 dark:border-${color}-700/60`,\n pendingText: `text-${color}-500 dark:text-${color}-200`,\n underlineBase: `bg-${color}-100 dark:bg-${color}-700/40`,\n };\n\n // Badge\n theme.badge[color] = `bg-${color}-500 text-white dark:bg-${color}-400`;\n\n // Pill\n theme.pill[color] = {\n solid: { base: `bg-${color}-500 text-white` },\n soft: {\n base: `bg-${color}-50 text-${color}-700 dark:bg-${color}-500/15 dark:text-${color}-100`,\n },\n outline: {\n base: `text-${color}-600 dark:text-${color}-200`,\n border: `border border-${color}-200 dark:border-${color}-500/40`,\n },\n };\n\n // Alert\n theme.alert[color] = {\n subtle: `bg-${color}-50 text-${color}-800 dark:bg-${color}-900/40 dark:text-${color}-100`,\n solid: `bg-${color}-600 text-white dark:bg-${color}-500 dark:text-white`,\n outline: `bg-white text-${color}-700 dark:bg-${color}-900/60 dark:text-${color}-100`,\n icon: `text-${color}-500 dark:text-${color}-300`,\n text: `text-${color}-700 dark:text-${color}-100`,\n border: `border-${color}-200 dark:border-${color}-700`,\n dismiss: `hover:text-${color}-700 dark:hover:text-${color}-100`,\n };\n\n // StatTile\n theme.statTile[color] = {\n decorationBg: `bg-${color}-300/40 dark:bg-${color}-400/20`,\n iconColor: `text-${color}-800 dark:text-${color}-300`,\n divider: `border-${color}-200 dark:border-${color}-800`,\n };\n\n // ButtonSelector\n theme.buttonSelector[color] = {\n selectedBorder: `border-${color}-300/70 dark:border-${color}-500/40`,\n selectedBg: `bg-${color}-50/80 dark:bg-${color}-500/10`,\n selectedIcon: `text-${color}-600 dark:text-${color}-400`,\n selectedLabel: `text-${color}-700 dark:text-${color}-300`,\n selectedIndicatorBg: `bg-${color}-500`,\n selectedIndicatorBorder: `border-${color}-500`,\n selectedIndicatorDot: \"bg-white\",\n };\n });\n\n return theme;\n};\n\nconst defaultTheme: ThemeDefinition = createTheme();\n\nlet currentTheme: ThemeDefinition = defaultTheme;\n\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Record<string, unknown>\n ? DeepPartial<T[K]>\n : T[K];\n};\n\ntype PlainObject = Record<string, unknown>;\n\nconst isPlainObject = (value: unknown): value is PlainObject =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst deepMerge = (\n base: PlainObject,\n overrides?: DeepPartial<PlainObject>,\n): PlainObject => {\n if (!overrides) {\n return base;\n }\n\n const result: PlainObject = { ...base };\n const overrideEntries = Object.entries(overrides as PlainObject);\n\n for (const [key, overrideValue] of overrideEntries) {\n if (overrideValue === undefined) {\n continue;\n }\n\n const baseValue = base[key];\n if (isPlainObject(baseValue) && isPlainObject(overrideValue)) {\n result[key] = deepMerge(\n baseValue,\n overrideValue as DeepPartial<PlainObject>,\n );\n } else {\n result[key] = overrideValue;\n }\n }\n\n return result;\n};\n\nconst mergeTheme = <T extends object>(\n base: T,\n overrides?: DeepPartial<T>,\n): T => {\n if (!overrides) {\n return base;\n }\n\n return deepMerge(\n base as PlainObject,\n overrides as DeepPartial<PlainObject>,\n ) as T;\n};\n\nexport const configureTheme = (\n overrides: DeepPartial<ThemeDefinition>,\n): void => {\n currentTheme = mergeTheme(defaultTheme, overrides);\n};\n\nexport const resetTheme = (): void => {\n currentTheme = defaultTheme;\n};\n\nexport const getButtonColorClasses = (\n variant: ButtonVariant,\n color: TrueColor,\n): string => {\n const variantTheme =\n currentTheme.button[variant] ?? currentTheme.button.solid;\n const fallbackVariant = currentTheme.button.solid;\n return (\n variantTheme[color] ??\n variantTheme.blue ??\n fallbackVariant[color] ??\n fallbackVariant.blue\n );\n};\n\nexport const getButtonHoverClasses = (\n variant: ButtonVariant,\n color: TrueColor,\n): string => {\n const variantTheme =\n currentTheme.buttonHover[variant] ?? currentTheme.buttonHover.solid;\n const fallbackVariant = currentTheme.buttonHover.solid;\n return (\n variantTheme[color] ??\n variantTheme.blue ??\n fallbackVariant[color] ??\n fallbackVariant.blue\n );\n};\n\nexport const getButtonActiveClasses = (\n variant: ButtonVariant,\n color: TrueColor,\n): string => {\n const variantTheme =\n currentTheme.buttonActive[variant] ?? currentTheme.buttonActive.solid;\n const fallbackVariant = currentTheme.buttonActive.solid;\n return (\n variantTheme[color] ??\n variantTheme.blue ??\n fallbackVariant[color] ??\n fallbackVariant.blue\n );\n};\n\nexport const getButtonActiveHoverClasses = (\n variant: ButtonVariant,\n color: TrueColor,\n): string => {\n const variantTheme =\n currentTheme.buttonActiveHover[variant] ??\n currentTheme.buttonActiveHover.solid;\n const fallbackVariant = currentTheme.buttonActiveHover.solid;\n return (\n variantTheme[color] ??\n variantTheme.blue ??\n fallbackVariant[color] ??\n fallbackVariant.blue\n );\n};\n\nexport const getButtonBaseClasses = (\n variant: ButtonVariant,\n color: TrueColor,\n): string => {\n const all = getButtonColorClasses(variant, color);\n return all\n .split(\" \")\n .filter((cls) => !cls.includes(\"hover:\"))\n .join(\" \");\n};\n\nexport const getToggleColorClasses = (color: TrueColor): string =>\n currentTheme.toggle[color] ?? currentTheme.toggle.blue;\n\nexport const getCheckboxColorClasses = (color: TrueColor): string =>\n currentTheme.checkbox[color] ?? currentTheme.checkbox.blue;\n\nexport const getSpinnerColorTokens = (\n color: TrueColor,\n): [string, string, string, string] =>\n currentTheme.spinner[color] ?? currentTheme.spinner.blue;\n\nexport const getLoaderProgressColors = (\n color: TrueColor,\n): { track: string; bar: string } =>\n currentTheme.loader[color] ?? currentTheme.loader.blue;\n\nexport const getMultiToggleColorTokens = (\n color: TrueColor,\n): { active: string; activeText: string; indicator: string; hover: string } =>\n currentTheme.multiToggle[color] ?? currentTheme.multiToggle.blue;\n\nexport const getMultiToggleVariantTokens = (\n color: TrueColor,\n): MultiToggleVariantTokens =>\n currentTheme.multiToggleVariant[color] ??\n currentTheme.multiToggleVariant.blue;\n\nexport const getTabsColorTokens = (color: TrueColor): TabsColorTokens =>\n currentTheme.tabs[color] ?? currentTheme.tabs.blue;\n\nexport const getPanelToneStyles = (tone: TrueColor): PanelToneConfig =>\n currentTheme.panel[tone] ?? currentTheme.panel.neutral;\n\nexport const getStepperTonePalette = (tone: TrueColor): StepperToneConfig =>\n currentTheme.stepper[tone] ?? currentTheme.stepper.blue;\n\nexport const getBadgeColorClasses = (color: TrueColor): string =>\n currentTheme.badge[color] ?? currentTheme.badge.blue;\n\nexport const getPillColorClasses = (\n color: TrueColor,\n variant: \"solid\" | \"soft\" | \"outline\",\n): { base: string; border?: string } =>\n currentTheme.pill[color]?.[variant] ?? currentTheme.pill.blue[variant];\n\nexport const getAlertColorClasses = (\n color: TrueColor,\n): AlertTheme[TrueColor] =>\n currentTheme.alert[color] ?? currentTheme.alert.blue;\n\nexport const getStatTileColorClasses = (\n color: TrueColor,\n): StatTileTheme[TrueColor] =>\n currentTheme.statTile[color] ?? currentTheme.statTile.blue;","import React from \"react\";\n\nexport interface AppDividerProps {\n /** Height of the divider in pixels or as CSS value */\n height?: number | string;\n /** Width of the divider in pixels */\n width?: number;\n /** Margin around the divider */\n margin?: number | string;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * A vertical divider for separating header sections\n */\nexport const AppDivider: React.FC<AppDividerProps> = ({ className = \"\" }) => {\n return (\n <div className={`flex h-[75%] items-center ${className}`}>\n <div\n className={`h-6 w-[1.2px] bg-neutral-300 dark:bg-neutral-700 ${className}-line`}\n ></div>\n </div>\n );\n};\n\nexport default AppDivider;\n","import React from \"react\";\nimport classNames from \"classnames\";\n\nimport type { TrueColor } from \"../theme/Theme\";\nimport { getBadgeColorClasses } from \"../theme/Theme\";\n\nexport interface BadgeProps {\n /**\n * Content to display inside the badge\n */\n count?: number | string;\n\n /**\n * Show only a dot indicator (no count)\n */\n dot?: boolean;\n\n /**\n * Max count to display before showing \"+\"\n * @default 99\n */\n maxCount?: number;\n\n /**\n * Badge color variant\n * @default \"neutral\"\n */\n tone?: TrueColor;\n\n /**\n * Additional class names\n */\n className?: string;\n\n /**\n * Additional styles\n */\n style?: React.CSSProperties;\n}\n\n/**\n * Badge component for displaying notification counts or indicators\n */\nexport const Badge: React.FC<BadgeProps> = ({\n count,\n dot = false,\n maxCount = 99,\n tone = \"neutral\",\n className = \"\",\n style,\n}) => {\n if (count === 0 && !dot) {\n return null;\n }\n\n const colorClass = getBadgeColorClasses(tone);\n\n let content: React.ReactNode;\n\n if (dot) {\n content = (\n <span\n className={classNames(\"h-2 w-2 rounded-full\", colorClass)}\n aria-hidden=\"true\"\n />\n );\n } else {\n const displayValue =\n count !== undefined\n ? Number(count) > maxCount\n ? `${maxCount}+`\n : count\n : \"\";\n content = displayValue;\n }\n\n const badgeClasses = classNames(\n \"inline-grid place-items-center text-center rounded-full text-[10px] font-semibold leading-4\",\n \"min-h-[1.125rem] min-w-[1.125rem] border border-white/80 dark:border-neutral-900/60\",\n dot ? \"px-1 py-1 bg-transparent text-transparent\" : \"px-1.5\",\n !dot && colorClass,\n className,\n );\n\n const badgeStyle = { ...style };\n\n if (dot) {\n return (\n <span className={badgeClasses} style={badgeStyle} aria-hidden=\"true\">\n <span\n className={classNames(\"block h-2 w-2 rounded-full\", colorClass)}\n aria-hidden=\"true\"\n />\n </span>\n );\n }\n\n return (\n <span className={badgeClasses} style={badgeStyle} aria-hidden=\"true\">\n {content}\n </span>\n );\n};\n\nexport default Badge;\n","import classNames from \"classnames\";\nimport React, { forwardRef } from \"react\";\nimport Badge, { type BadgeProps } from \"./Badge\";\nimport IconButton, { type IconButtonProps } from \"./IconButton\";\n\ntype BadgePosition = \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\";\n\nconst POSITION_CLASSES: Record<BadgePosition, string> = {\n \"top-start\": \"top-0 left-0 -translate-x-1/2 -translate-y-1/2\",\n \"top-end\": \"top-0 right-0 translate-x-1/2 -translate-y-1/2\",\n \"bottom-start\": \"bottom-0 left-0 -translate-x-1/2 translate-y-1/2\",\n \"bottom-end\": \"bottom-0 right-0 translate-x-1/2 translate-y-1/2\",\n};\n\nexport interface BadgeIconProps extends IconButtonProps {\n /**\n * Optional custom badge node. When provided, overrides count/dot rendering.\n */\n badgeContent?: React.ReactNode;\n /**\n * Numeric badge count. Ignored when `badgeContent` is supplied.\n */\n badgeCount?: number;\n /**\n * Show a small dot indicator instead of a number. Ignored when `badgeContent` is supplied.\n */\n badgeDot?: boolean;\n /**\n * Tailwind position for the badge relative to the button.\n */\n badgePosition?: BadgePosition;\n /**\n * Additional props forwarded to the underlying `Badge`.\n */\n badgeProps?: Omit<BadgeProps, \"count\" | \"dot\">;\n /**\n * Extra class applied to the outer wrapper span.\n */\n wrapperClassName?: string;\n /**\n * Expands the control to fill the available width.\n */\n fullWidth?: boolean;\n}\n\nconst shouldRenderBadge = ({\n badgeContent,\n badgeCount,\n badgeDot,\n}: Pick<BadgeIconProps, \"badgeContent\" | \"badgeCount\" | \"badgeDot\">) => {\n if (badgeContent) {\n return true;\n }\n if (badgeDot) {\n return true;\n }\n if (typeof badgeCount === \"number\" && badgeCount !== 0) {\n return true;\n }\n return false;\n};\n\nconst BadgeIcon = forwardRef<HTMLButtonElement, BadgeIconProps>(\n (\n {\n badgeContent,\n badgeCount,\n badgeDot = false,\n badgePosition = \"top-end\",\n badgeProps,\n wrapperClassName,\n className,\n fullWidth = false,\n ...iconButtonProps\n },\n ref,\n ) => {\n const showBadge = shouldRenderBadge({ badgeContent, badgeCount, badgeDot });\n const badgeNode =\n badgeContent ??\n (showBadge ? (\n <Badge count={badgeCount} dot={badgeDot} {...badgeProps} />\n ) : null);\n\n return (\n <span\n className={classNames(\n \"relative inline-flex\",\n fullWidth && \"w-full\",\n wrapperClassName,\n )}\n >\n <IconButton\n ref={ref}\n accent={true}\n className={classNames(fullWidth && \"w-full\", className)}\n {...iconButtonProps}\n />\n {showBadge && badgeNode && (\n <span\n className={classNames(\n \"pointer-events-none absolute\",\n POSITION_CLASSES[badgePosition],\n )}\n >\n {badgeNode}\n </span>\n )}\n </span>\n );\n },\n);\n\nBadgeIcon.displayName = \"BadgeIcon\";\n\nexport default BadgeIcon;\n","import classNames from \"classnames\";\nimport React, { type ButtonHTMLAttributes, forwardRef } from \"react\";\nimport {\n type ButtonColor,\n type ButtonSize,\n type ButtonVariant,\n} from \"./Button\";\nimport Spinner, { type SpinnerColor, type SpinnerSize } from \"./Spinner\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport { getButtonColorClasses } from \"../theme/Theme\";\nimport { iconAccentHover, iconAccentRing } from \"../theme/ButtonTypes\";\nimport type { IconSize } from \"../types/Icon\";\nimport TooltipWrapper from \"./TooltipWrapper\";\nimport type { TooltipPosition } from \"./Tooltip\";\nimport {\n getGlassFillClass,\n getGlassVibrancyClass,\n getSpecularClasses,\n type GlassVibrancy,\n type GlassOpacity,\n type SpecularMode,\n} from \"../../../common/theme/glass\";\n\ntype IconButtonRounded = \"md\" | \"lg\" | \"xl\" | \"full\";\n\nconst sizeTokens: Record<\n ButtonSize,\n {\n button: string;\n icon: string;\n spinner: SpinnerSize;\n }\n> = {\n xs: { button: \"h-7 w-7 leading-none\", icon: \"h-4 w-4\", spinner: \"xs\" },\n sm: { button: \"h-8 w-8 leading-none\", icon: \"h-5 w-5\", spinner: \"xs\" },\n md: { button: \"h-10 w-10 leading-none\", icon: \"h-6 w-6\", spinner: \"sm\" },\n lg: { button: \"h-12 w-12 leading-none\", icon: \"h-7 w-7\", spinner: \"md\" },\n xl: { button: \"h-14 w-14 leading-none\", icon: \"h-8 w-8\", spinner: \"lg\" },\n};\n\nconst roundedMap: Record<IconButtonRounded, string> = {\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n xl: \"rounded-xl\",\n full: \"rounded-full\",\n};\n\nconst baseClasses =\n \"inline-flex items-center justify-center select-none transition-colors duration-150 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\";\n\nexport interface IconButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"color\"> {\n icon: string | React.ReactElement;\n variant?: ButtonVariant;\n color?: ButtonColor;\n size?: ButtonSize;\n rounded?: IconButtonRounded;\n customSizeClass?: string;\n iconClassName?: string;\n loading?: boolean;\n spinnerVariant?: \"solid\" | \"segments\";\n spinnerColor?: SpinnerColor;\n srLabel?: string;\n accent?: boolean;\n accentColor?: ButtonColor;\n /** When set, a styled tooltip is shown on hover (replaces the native title attribute). */\n tooltip?: string;\n /** Position of the tooltip relative to the button. Defaults to 'top'. */\n tooltipPosition?: TooltipPosition;\n /** When true, applies glass styling (fill + vibrancy + optional specular overlay). */\n glass?: boolean;\n /** Backdrop vibrancy level for glass surfaces. */\n vibrancy?: GlassVibrancy;\n /** Glass fill transparency level for glass surfaces. Defaults to \"clear\" for IconButton. */\n glassOpacity?: GlassOpacity;\n /** Specular highlight mode for glass surfaces. Defaults to \"none\" for IconButton. */\n specularMode?: SpecularMode;\n}\n\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n icon,\n variant = \"icon\",\n color = \"blue\",\n size = \"md\",\n rounded = \"full\",\n customSizeClass,\n iconClassName,\n loading = false,\n spinnerVariant = \"segments\",\n spinnerColor,\n srLabel,\n accent = false,\n accentColor,\n glass = false,\n vibrancy = \"medium\",\n glassOpacity = \"clear\",\n specularMode = \"none\",\n className,\n disabled,\n tooltip,\n tooltipPosition,\n ...rest\n },\n ref,\n ) => {\n const renderIcon = useIconRenderer();\n const sizeConfig = sizeTokens[size] ?? sizeTokens.md;\n const baseColorClasses = getButtonColorClasses(variant, color);\n const accentTone = accentColor ?? color;\n const accentRing = iconAccentRing[accentTone] ?? iconAccentRing.blue;\n const accentHover = iconAccentHover[accentTone] ?? iconAccentHover.blue;\n const accentClasses = accent\n ? classNames(\n \"bg-transparent text-inherit hover:bg-transparent focus-visible:ring-2 focus-visible:ring-offset-2\",\n accentRing,\n accentHover,\n )\n : null;\n\n // When accent is off but accentColor is explicitly provided,\n // apply hover text color for non-solid variants (ghost, soft, outline, icon)\n const nonAccentHover =\n !accent && accentColor && variant !== \"solid\"\n ? (iconAccentHover[accentColor] ?? null)\n : null;\n\n const dimensionClass = customSizeClass ?? sizeConfig.button;\n const spinnerColorToken: SpinnerColor =\n spinnerColor ?? (color as SpinnerColor);\n\n // Glass styling — variant=\"glass\" auto-enables glass; glass prop overrides\n const isGlass = variant === \"glass\" || glass;\n const glassClasses = isGlass\n ? classNames(\n \"backdrop-blur-sm\",\n getGlassFillClass(color, glassOpacity),\n getGlassVibrancyClass(vibrancy),\n )\n : null;\n\n const resolvedSpecularMode = isGlass ? specularMode : \"none\";\n const specularOverlay =\n resolvedSpecularMode !== \"none\"\n ? (() => {\n const specClasses = getSpecularClasses(resolvedSpecularMode);\n return specClasses ? (\n <div\n className={classNames(\n \"pointer-events-none absolute inset-0 rounded-[inherit]\",\n specClasses,\n )}\n aria-hidden=\"true\"\n />\n ) : null;\n })()\n : null;\n\n const computedClassName = classNames(\n baseClasses,\n dimensionClass,\n roundedMap[rounded] ?? roundedMap.full,\n isGlass ? (accentClasses ?? \"\") : (accentClasses ?? baseColorClasses),\n nonAccentHover,\n isGlass && \"relative\",\n glassClasses,\n className,\n );\n\n const iconContent = renderIcon(\n icon,\n size as IconSize,\n classNames(\"flex-shrink-0\", sizeConfig.icon, iconClassName),\n );\n\n // Pull aria-label and title out of rest so we can set them explicitly.\n // title falls back to aria-label → srLabel so the native browser tooltip\n // always shows the accessible label rather than the icon's own SVG title.\n // When a styled tooltip is provided, omit the native title to avoid doubling.\n const { \"aria-label\": ariaLabel, title, ...restProps } = rest;\n const computedAriaLabel = ariaLabel ?? srLabel;\n const computedTitle = tooltip ? undefined : (title ?? computedAriaLabel);\n\n const button = (\n <button\n ref={ref}\n className={computedClassName}\n data-variant={variant}\n data-color={color}\n data-size={size}\n data-glass={glass}\n disabled={disabled || loading}\n aria-label={computedAriaLabel}\n title={computedTitle}\n {...restProps}\n >\n {specularOverlay}\n {loading ? (\n <Spinner\n size={sizeConfig.spinner}\n color={spinnerColorToken}\n variant={spinnerVariant}\n aria-hidden=\"true\"\n />\n ) : (\n iconContent\n )}\n <span className=\"sr-only\">\n {srLabel ?? rest[\"aria-label\"] ?? \"Icon button\"}\n </span>\n </button>\n );\n\n if (tooltip) {\n return (\n <TooltipWrapper text={tooltip} position={tooltipPosition}>\n {button}\n </TooltipWrapper>\n );\n }\n\n return button;\n },\n);\n\nIconButton.displayName = \"IconButton\";\n\nexport default IconButton;\n","import classNames from \"classnames\";\nimport React from \"react\";\nimport { getSpinnerColorTokens, type TrueColor } from \"../theme/Theme\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type SpinnerColor = TrueColor;\nexport type SpinnerVariant = \"solid\" | \"segments\";\nexport type SpinnerThickness = \"thin\" | \"normal\" | \"thick\";\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize;\n color?: SpinnerColor;\n variant?: SpinnerVariant;\n thickness?: SpinnerThickness;\n label?: string;\n}\n\nconst sizeTokens: Record<\n SpinnerSize,\n { diameter: string; border: Record<SpinnerThickness, string> }\n> = {\n xs: {\n diameter: \"h-4 w-4\",\n border: { thin: \"border\", normal: \"border-[2px]\", thick: \"border-[4px]\" },\n },\n sm: {\n diameter: \"h-5 w-5\",\n border: {\n thin: \"border-[1.5px]\",\n normal: \"border-2\",\n thick: \"border-[4px]\",\n },\n },\n md: {\n diameter: \"h-6 w-6\",\n border: {\n thin: \"border-3\",\n normal: \"border-[3.5px]\",\n thick: \"border-[4.5px]\",\n },\n },\n lg: {\n diameter: \"h-8 w-8\",\n border: {\n thin: \"border-[3.5px]\",\n normal: \"border-[4px]\",\n thick: \"border-[5px]\",\n },\n },\n xl: {\n diameter: \"h-10 w-10\",\n border: {\n thin: \"border-[4px]\",\n normal: \"border-[4.5px]\",\n thick: \"border-[5.5px]\",\n },\n },\n};\n\nconst Spinner = React.forwardRef<HTMLSpanElement, SpinnerProps>(\n (\n {\n size = \"md\",\n color = \"blue\",\n variant = \"solid\",\n thickness = \"normal\",\n label,\n className,\n ...rest\n },\n ref,\n ) => {\n const sizeStyles = sizeTokens[size] ?? sizeTokens.md;\n const borderThickness =\n sizeStyles.border[thickness] ?? sizeStyles.border.thin;\n const colorStyles = getSpinnerColorTokens(color);\n\n const spinnerBase = classNames(\n \"inline-flex rounded-full border-solid border-transparent\",\n sizeStyles.diameter,\n borderThickness,\n className,\n );\n\n const spinnerClass = classNames(\n spinnerBase,\n \"transition-all duration-150 ease-in-out\",\n variant === \"segments\"\n ? [\"animate-[spin_1s_linear_infinite]\", ...colorStyles]\n : [\"animate-spin\", colorStyles[0]],\n );\n\n return (\n <span\n className=\"inline-flex items-center gap-2\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <span ref={ref} className={spinnerClass} {...rest} />\n {label && (\n <span className=\"text-sm font-medium text-neutral-600 dark:text-neutral-300\">\n {label}\n </span>\n )}\n <span className=\"sr-only\">{label ?? \"Loading\"}</span>\n </span>\n );\n },\n);\n\nSpinner.displayName = \"Spinner\";\n\nexport default Spinner;\n","import type { TrueColor } from \"./Theme\";\n\nconst colors: TrueColor[] = [\n \"red\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n \"rose\",\n \"slate\",\n \"gray\",\n \"zinc\",\n \"neutral\",\n \"stone\",\n];\n\nconst createIconAccentRing = (): Record<TrueColor, string> => {\n const rings: Record<string, string> = {};\n colors.forEach((color) => {\n rings[color] = `focus-visible:ring-${color}-500`;\n });\n return rings as Record<TrueColor, string>;\n};\n\nconst createIconAccentHover = (): Record<TrueColor, string> => {\n const hovers: Record<string, string> = {};\n colors.forEach((color) => {\n hovers[color] = `hover:text-${color}-500 dark:hover:text-${color}-300`;\n });\n return hovers as Record<TrueColor, string>;\n};\n\nconst createIconAccentActive = (): Record<TrueColor, string> => {\n const actives: Record<string, string> = {};\n colors.forEach((color) => {\n actives[color] = `!text-${color}-500 !dark:text-${color}-300`;\n });\n return actives as Record<TrueColor, string>;\n};\n\nexport const iconAccentRing: Record<TrueColor, string> =\n createIconAccentRing();\nexport const iconAccentHover: Record<TrueColor, string> =\n createIconAccentHover();\nexport const iconAccentActive: Record<TrueColor, string> =\n createIconAccentActive();","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\nimport type { TooltipPosition } from \"./Tooltip\";\n\nexport interface TooltipWrapperProps {\n /** Tooltip text. When omitted no tooltip is shown but the child is rendered unchanged. */\n text?: string;\n /** Delay in ms before the tooltip appears. Defaults to 500. */\n delay?: number;\n /** Where to place the tooltip relative to the child. Defaults to 'top'. */\n position?: TooltipPosition;\n /** The element to attach the tooltip to. Must accept onMouseEnter / onMouseLeave. */\n children: React.ReactElement<React.HTMLAttributes<Element>>;\n}\n\nconst VIEWPORT_PADDING = 8; // px to keep away from viewport edges\n\n/**\n * Attaches a styled tooltip to any child element without adding any wrapper\n * element to the DOM. The tooltip is rendered via a React portal directly into\n * document.body and positioned with `position: fixed`, so it has zero impact on\n * the child's layout or spacing.\n *\n * Includes edge collision detection: when the tooltip would overflow the\n * viewport, it is shifted inward and its caret is repositioned to still point\n * at the trigger element.\n *\n * The component always renders a Fragment so that switching `text` between\n * undefined and a string value never causes the child element to unmount —\n * important when the child holds a ref (e.g. for truncation detection).\n */\nconst TooltipWrapper: React.FC<TooltipWrapperProps> = ({\n text,\n delay = 500,\n position = \"top\",\n children,\n}) => {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n\n const [visible, setVisible] = useState(false);\n // Captured center point of the trigger (fixed coords)\n const [triggerCenter, setTriggerCenter] = useState({ top: 0, left: 0 });\n // Post-collision-detection final left for the tooltip (null = not yet measured)\n const [finalLeft, setFinalLeft] = useState<number | null>(null);\n // Caret left offset inside the tooltip box\n const [caretOffset, setCaretOffset] = useState(\"50%\");\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n // Hide immediately when text is removed while tooltip is showing.\n useEffect(() => {\n if (!text && visible) {\n if (timerRef.current) clearTimeout(timerRef.current);\n setVisible(false);\n setFinalLeft(null);\n }\n }, [text, visible]);\n\n // After the tooltip renders, measure it and clamp within the viewport.\n // The `finalLeft !== null` guard prevents re-running after we've already adjusted.\n useLayoutEffect(() => {\n if (!visible || !tooltipRef.current || finalLeft !== null) return;\n\n const el = tooltipRef.current;\n const rect = el.getBoundingClientRect();\n const vw = window.innerWidth;\n\n // Start from the ideal center-aligned position\n let left = triggerCenter.left;\n\n if (rect.right > vw - VIEWPORT_PADDING) {\n // Overflows right — shift left\n left = triggerCenter.left - (rect.right - (vw - VIEWPORT_PADDING));\n } else if (rect.left < VIEWPORT_PADDING) {\n // Overflows left — shift right\n left = triggerCenter.left + (VIEWPORT_PADDING - rect.left);\n }\n\n // Move the caret so it still points at the original trigger center.\n // rect.width is the tooltip width; caret is inside the tooltip box.\n const tooltipEdge = left - rect.width / 2;\n const caretPct = ((triggerCenter.left - tooltipEdge) / rect.width) * 100;\n setCaretOffset(`${Math.max(8, Math.min(92, caretPct))}%`);\n setFinalLeft(left);\n }, [visible, triggerCenter, finalLeft]);\n\n const show = useCallback(\n (e: React.MouseEvent) => {\n // No text → no tooltip; still forward the original handler.\n if (text) {\n const rect = (e.currentTarget as Element).getBoundingClientRect();\n setTriggerCenter({\n top: position === \"top\" ? rect.top : rect.bottom,\n left: rect.left + rect.width / 2,\n });\n setFinalLeft(null);\n setCaretOffset(\"50%\");\n timerRef.current = setTimeout(() => setVisible(true), delay);\n }\n children.props.onMouseEnter?.(e);\n },\n [text, delay, position, children.props],\n );\n\n const hide = useCallback(\n (e?: React.MouseEvent) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n setVisible(false);\n setFinalLeft(null);\n setCaretOffset(\"50%\");\n if (e) children.props.onMouseLeave?.(e);\n },\n [children.props],\n );\n\n const isTop = position === \"top\";\n const renderLeft = finalLeft ?? triggerCenter.left;\n\n // Always render a Fragment so the child element is never unmounted when\n // `text` changes — this keeps refs and ResizeObserver stable.\n const child = React.cloneElement(children, {\n onMouseEnter: show,\n onMouseLeave: hide,\n });\n\n return (\n <>\n {child}\n {visible &&\n text &&\n createPortal(\n <div\n ref={tooltipRef}\n role=\"tooltip\"\n style={{\n position: \"fixed\",\n top: triggerCenter.top,\n left: renderLeft,\n transform: isTop\n ? \"translate(-50%, calc(-100% - 8px))\"\n : \"translate(-50%, 8px)\",\n // Hide until collision detection has run to avoid a 1-frame flash\n // at the wrong position when near the viewport edge\n visibility: finalLeft === null ? \"hidden\" : \"visible\",\n zIndex: 9999,\n }}\n className=\"pointer-events-none whitespace-nowrap rounded-md bg-neutral-900 px-2.5 py-1.5 text-xs leading-snug text-white shadow-lg dark:bg-neutral-700\"\n >\n {text}\n <span\n style={{ left: caretOffset }}\n className={classNames(\n \"absolute -translate-x-1/2 border-4 border-transparent\",\n isTop\n ? \"top-full border-t-neutral-900 dark:border-t-neutral-700\"\n : \"bottom-full border-b-neutral-900 dark:border-b-neutral-700\",\n )}\n />\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nexport default TooltipWrapper;\n","/**\n * common/theme/glass.ts — Framework-agnostic glass utility module.\n *\n * Extracts all glass logic from Panel into reusable functions and types\n * so that any control (Button, IconButton, DropdownButton, etc.) can\n * compose glass styling without duplicating the Panel implementation.\n *\n * This file is pure TypeScript — no React, Vue, or DOM imports.\n */\n\nimport type { TrueColor } from \"./Theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Backdrop vibrancy level for glass surfaces.\n * - `\"low\"` → 1.0× saturation\n * - `\"medium\"` → 1.2× saturation (default)\n * - `\"high\"` → 1.4× saturation\n * - `number` → arbitrary multiplier (0 – 2 recommended)\n */\nexport type GlassVibrancy = \"low\" | \"medium\" | \"high\" | number;\n\n/**\n * Glass fill transparency level.\n * - `\"frosted\"` → 45 % light / 15 % dark (default)\n * - `\"light\"` → 70 % light / 25 % dark\n * - `\"clear\"` → 20 % light / 5 % dark\n * - `number` → 0–1 fraction; light = round(frac × 100), dark = min(round(frac × 30), 30)\n */\nexport type GlassOpacity = \"frosted\" | \"light\" | \"clear\" | number;\n\n/**\n * Specular highlight mode for glass surfaces.\n * - `\"none\"` → no specular overlay\n * - `\"classic\"` → single hairline gradient at top edge\n * - `\"halo\"` → corner caps + diffuse band + bottom darken\n */\nexport type SpecularMode = \"none\" | \"classic\" | \"halo\";\n\n// ---------------------------------------------------------------------------\n// Colour safelist\n// ---------------------------------------------------------------------------\n\n/**\n * Tailwind colour names that are safe to use in dynamic utility classes.\n * Mirrors the TrueColor union from Theme.ts to guard against invalid CSS\n * being emitted for colours that don't exist in Tailwind's palette.\n */\nconst GLASS_COLOR_SAFELIST: ReadonlySet<TrueColor> = new Set([\n \"red\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n \"rose\",\n \"slate\",\n \"gray\",\n \"zinc\",\n \"neutral\",\n \"stone\",\n]);\n\n// ---------------------------------------------------------------------------\n// getGlassFillClass\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the Tailwind fill classes for a glass surface.\n *\n * Returns a string like `\"bg-blue-100/55 hover:bg-blue-100/65 dark:bg-blue-600/25 dark:hover:bg-blue-600/35\"`.\n *\n * @param color - TrueColor token (e.g. `\"blue\"`, `\"red\"`, `\"fuchsia\"`)\n * @param opacity - Glass opacity preset or numeric fraction (0–1)\n */\nexport const getGlassFillClass = (\n color: TrueColor,\n opacity: GlassOpacity,\n): string => {\n const litOpacity: number = (() => {\n if (typeof opacity === \"number\") return Math.round(opacity * 100);\n if (opacity === \"frosted\") return 55;\n if (opacity === \"light\") return 75;\n if (opacity === \"clear\") return 30;\n return 55; // fallback\n })();\n\n const drkOpacity: number = (() => {\n if (typeof opacity === \"number\")\n return Math.min(Math.round(opacity * 30), 30);\n if (opacity === \"frosted\") return 25;\n if (opacity === \"light\") return 35;\n if (opacity === \"clear\") return 10;\n return 25; // fallback\n })();\n\n // Gate against colours that don't exist in Tailwind's palette (e.g.\n // \"white\" is a literal, not a colour).\n // Fall back to \"neutral\" so no invalid CSS is emitted.\n const safeBase: TrueColor = GLASS_COLOR_SAFELIST.has(color)\n ? color\n : \"neutral\";\n\n return `bg-${safeBase}-100/${litOpacity} hover:bg-${safeBase}-100/${litOpacity + 10} dark:bg-${safeBase}-600/${drkOpacity} dark:hover:bg-${safeBase}-600/${drkOpacity + 10}`;\n};\n\n// ---------------------------------------------------------------------------\n// getGlassVibrancyClass\n// ---------------------------------------------------------------------------\n\n/**\n * Map a vibrancy setting to a Tailwind backdrop-saturate class.\n *\n * @param vibrancy - Low / medium / high preset or arbitrary multiplier\n * @returns e.g. `\"backdrop-saturate-[1.2]\"`\n */\nexport const getGlassVibrancyClass = (vibrancy: GlassVibrancy): string => {\n const value: number = (() => {\n if (typeof vibrancy === \"number\") return vibrancy;\n if (vibrancy === \"low\") return 1;\n if (vibrancy === \"medium\") return 1.2;\n if (vibrancy === \"high\") return 1.4;\n return 1.2;\n })();\n\n return `backdrop-saturate-[${value}]`;\n};\n\n// ---------------------------------------------------------------------------\n// getSpecularClasses\n// ---------------------------------------------------------------------------\n\n/**\n * Build Tailwind classes for a specular highlight overlay.\n *\n * - `\"none\"` → `null` (no overlay)\n * - `\"classic\"` → soft top-edge hairline reflection\n * - `\"halo\"` → corner caps + diffuse top glow\n *\n * @returns class string or `null`\n */\nexport const getSpecularClasses = (mode: SpecularMode): string | null => {\n switch (mode) {\n case \"none\":\n return null;\n\n /**\n * Classic: a soft top-edge reflection, like light grazing the upper edge\n * of a pane of glass. Subtle white-to-transparent gradient, 10px tall,\n * spanning the full width, softly clipped by the track's rounded corners.\n */\n case \"classic\":\n return (\n \"pointer-events-none absolute inset-x-0 top-0 h-[10px]\" +\n \" bg-gradient-to-b from-white/12 via-white/4 to-transparent\" +\n \" dark:from-white/5 dark:via-white/2\"\n );\n\n /**\n * Halo: two corner reflections (top-left + top-right) plus a diffuse\n * glow band across the top. Mimics light scattering across a curved\n * glass surface — soft, wide, and very low opacity.\n */\n case \"halo\":\n return (\n // Top-left corner reflection\n \"pointer-events-none absolute top-0 left-0 w-[40%] h-[35%]\" +\n \" rounded-tl-[inherit]\" +\n \" bg-gradient-to-br from-white/10 via-white/4 to-transparent\" +\n // Top-right corner reflection\n \" pointer-events-none absolute top-0 right-0 w-[40%] h-[35%]\" +\n \" rounded-tr-[inherit]\" +\n \" bg-gradient-to-bl from-white/10 via-white/4 to-transparent\" +\n // Diffuse top glow band\n \" pointer-events-none absolute inset-x-0 top-0 h-[20%]\" +\n \" bg-gradient-to-b from-white/6 via-white/2 to-transparent\" +\n \" dark:from-white/3 dark:via-white/1\"\n );\n\n default:\n return null;\n }\n};","import React from \"react\";\nimport classNames from \"classnames\";\n\nimport type { TrueColor } from \"../theme/Theme\";\nimport { getPillColorClasses } from \"../theme/Theme\";\n\nexport type PillVariant = \"solid\" | \"soft\" | \"outline\";\nexport type PillSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type PillTone = TrueColor;\n\nconst sizeStyles: Record<PillSize, string> = {\n xs: \"text-[11px] h-4 px-2\",\n sm: \"text-[12px] h-5 px-2.5\",\n md: \"text-xs h-6 px-3\",\n lg: \"text-sm h-7 px-4\",\n};\n\nexport interface PillProps extends React.HTMLAttributes<HTMLDivElement> {\n tone?: PillTone;\n variant?: PillVariant;\n size?: PillSize;\n uppercase?: boolean;\n icon?: React.ReactNode;\n dot?: boolean;\n}\n\nexport const Pill: React.FC<PillProps> = ({\n tone = \"blue\",\n variant = \"soft\",\n size = \"md\",\n uppercase = false,\n icon,\n dot = false,\n className,\n children,\n ...rest\n}) => {\n const toneTokens = getPillColorClasses(tone, variant);\n const sizeToken = sizeStyles[size];\n\n const pillClasses = classNames(\n \"inline-flex items-center justify-center rounded-full leading-none\",\n sizeToken,\n toneTokens.base,\n toneTokens.border,\n uppercase && \"uppercase tracking-wide\",\n dot && \"px-0 h-2 w-2 min-w-[0.5rem]\",\n dot && \"rounded-full\",\n className,\n );\n\n return (\n <span className={pillClasses} {...rest}>\n {icon && !dot ? (\n <span className=\"mr-1.5 flex items-center text-inherit\">{icon}</span>\n ) : null}\n {!dot ? children : null}\n </span>\n );\n};\n\nexport default Pill;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { type SpinnerColor } from \"./Spinner\";\nimport { getLoaderProgressColors } from \"../theme/Theme\";\nimport \"./progress-animations.css\";\n\nexport type ProgressSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type ProgressMotion =\n | \"none\"\n | \"shimmer\"\n | \"pulse\"\n | \"shimmer-pulse\"\n | \"stripes\"\n | \"stripes-shimmer\";\nexport type ProgressMotionSpeed = \"slow\" | \"normal\" | \"fast\";\nexport type ProgressMotionDirection = \"forward\" | \"reverse\";\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number;\n size?: ProgressSize;\n color?: SpinnerColor;\n motion?: ProgressMotion;\n motionSpeed?: ProgressMotionSpeed;\n motionDirection?: ProgressMotionDirection;\n /**\n * @deprecated Use `motion=\"shimmer\"` or `motion=\"none\"` instead.\n */\n showShimmer?: boolean;\n}\n\nconst heightTokens: Record<ProgressSize, string> = {\n xs: \"h-1\",\n sm: \"h-1.5\",\n md: \"h-2\",\n lg: \"h-3\",\n};\n\nconst speedSeconds: Record<ProgressMotionSpeed, string> = {\n slow: \"2.4s\",\n normal: \"1.8s\",\n fast: \"1.2s\",\n};\n\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n value = 0,\n size = \"md\",\n color = \"blue\",\n motion,\n motionSpeed = \"normal\",\n motionDirection = \"forward\",\n showShimmer = true,\n className,\n ...rest\n },\n ref,\n ) => {\n const clamped = Math.min(100, Math.max(0, Math.round(value)));\n const palette = getLoaderProgressColors(color);\n const trackHeight = heightTokens[size] ?? heightTokens.md;\n const resolvedMotion: ProgressMotion =\n motion ?? (showShimmer ? \"shimmer\" : \"none\");\n const showShimmerOverlay =\n resolvedMotion === \"shimmer\" ||\n resolvedMotion === \"shimmer-pulse\" ||\n resolvedMotion === \"stripes-shimmer\";\n const showStripesOverlay =\n resolvedMotion === \"stripes\" || resolvedMotion === \"stripes-shimmer\";\n const pulseBar =\n resolvedMotion === \"pulse\" || resolvedMotion === \"shimmer-pulse\";\n\n const duration = speedSeconds[motionSpeed] ?? speedSeconds.normal;\n const direction = motionDirection === \"reverse\" ? \"reverse\" : \"normal\";\n\n return (\n <div\n ref={ref}\n className={classNames(\n \"relative w-full overflow-hidden rounded-full shadow-inner\",\n trackHeight,\n palette.track,\n className,\n )}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={100}\n {...rest}\n >\n <div\n className={classNames(\n \"relative h-full overflow-hidden rounded-full transition-[width] duration-300 ease-out\",\n pulseBar && \"animate-pulse\",\n palette.bar,\n )}\n style={{ width: `${clamped}%` }}\n >\n {showShimmerOverlay && (\n <span\n className=\"absolute inset-0 bg-linear-to-r from-transparent via-white/40 to-transparent\"\n style={{\n animation: `progress-shimmer ${duration} linear infinite`,\n animationDirection: direction,\n }}\n />\n )}\n {showStripesOverlay && (\n <span\n className=\"absolute inset-0\"\n style={{\n backgroundImage:\n \"repeating-linear-gradient(45deg, rgba(255,255,255,0.4) 0px, rgba(255,255,255,0.4) 12px, transparent 12px, transparent 24px)\",\n backgroundSize: \"34px 34px\",\n animation: `progress-stripes ${duration} linear infinite`,\n animationDirection: direction,\n }}\n />\n )}\n </div>\n </div>\n );\n },\n);\n\nProgress.displayName = \"Progress\";\n\nexport default Progress;\n","import React, { useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\nimport { getColorPalette } from \"../theme\";\n\nexport interface MultiProgressBarSeries {\n key: string;\n label: string;\n labelClassName?: string;\n value: number;\n /** Tailwind bg color class e.g., 'bg-rose-500'. Omit to auto-assign from the theme palette. */\n color?: string;\n /** Custom formatted value to display in legend, if omitted `value` is used */\n displayValue?: React.ReactNode;\n}\n\nexport interface MultiProgressBarProps {\n label: string;\n labelClassName?: string;\n secondaryLabel?: React.ReactNode;\n secondaryLabelClassName?: string;\n totalLabel?: React.ReactNode;\n total: number;\n series: MultiProgressBarSeries[];\n className?: string;\n}\n\ninterface TooltipState {\n key: string;\n x: number;\n y: number;\n}\n\nconst MultiProgressBar: React.FC<MultiProgressBarProps> = ({\n label,\n labelClassName,\n secondaryLabel,\n secondaryLabelClassName,\n totalLabel,\n total,\n className,\n series,\n}) => {\n const [hoveredKey, setHoveredKey] = useState<string | null>(null);\n const [tooltip, setTooltip] = useState<TooltipState | null>(null);\n const barRef = useRef<HTMLDivElement>(null);\n\n const resolvedSeries = useMemo(() => {\n const palette = getColorPalette(series.length, \"bg\");\n return series.map((s, i) => ({ ...s, color: s.color ?? palette[i] }));\n }, [series]);\n\n const defaultTotal = total || 1;\n const totalValue = resolvedSeries.reduce(\n (acc, curr) => acc + (curr.value > 0 ? curr.value : 0),\n 0,\n );\n const normalizationFactor =\n totalValue > defaultTotal ? defaultTotal / totalValue : 1;\n\n const labelClasses =\n labelClassName ||\n \"text-sm font-semibold text-neutral-800 dark:text-neutral-200\";\n const secondaryLabelClasses =\n secondaryLabelClassName ||\n \"text-xs text-neutral-500 dark:text-neutral-400 mt-0.5\";\n\n let cumulativePct = 0;\n const segments = resolvedSeries\n .filter((s) => s.value > 0)\n .map((s) => {\n const pct = Math.min(\n 100,\n ((s.value * normalizationFactor) / defaultTotal) * 100,\n );\n const centerPct = cumulativePct + pct / 2;\n cumulativePct += pct;\n return { ...s, pct, centerPct };\n });\n\n const handleSegmentEnter = (key: string, e: React.MouseEvent) => {\n setHoveredKey(key);\n setTooltip({ key, x: e.clientX, y: e.clientY });\n };\n\n const handleSegmentMove = (key: string, e: React.MouseEvent) => {\n setTooltip({ key, x: e.clientX, y: e.clientY });\n };\n\n const handleSegmentLeave = () => {\n setHoveredKey(null);\n setTooltip(null);\n };\n\n const tooltipSegment = tooltip\n ? segments.find((s) => s.key === tooltip.key)\n : null;\n\n return (\n <div className={classNames(className)}>\n {/* Header */}\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"flex flex-col\">\n <span className={classNames(labelClasses)}>{label}</span>\n {secondaryLabel && (\n <span className={classNames(secondaryLabelClasses)}>\n {secondaryLabel}\n </span>\n )}\n </div>\n {totalLabel && (\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400\">\n {totalLabel}\n </span>\n )}\n </div>\n\n {/* Bar */}\n <div ref={barRef} className=\"relative py-2\">\n <div className=\"h-2.5 rounded-full overflow-hidden bg-neutral-100 dark:bg-neutral-800 shadow-inner\">\n <div className=\"flex h-full w-full\">\n {segments.map((s) => {\n const isActive = hoveredKey === s.key;\n const isDimmed = hoveredKey !== null && !isActive;\n return (\n <div\n key={s.key}\n className={classNames(\n \"h-full cursor-pointer transition-all duration-200 ease-out\",\n s.color,\n isActive && \"brightness-110\",\n isDimmed && \"opacity-25\",\n )}\n style={{ width: `${s.pct}%` }}\n onMouseEnter={(e) => handleSegmentEnter(s.key, e)}\n onMouseMove={(e) => handleSegmentMove(s.key, e)}\n onMouseLeave={handleSegmentLeave}\n />\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Tooltip — rendered in a portal so no ancestor overflow:hidden can clip it */}\n {tooltip &&\n tooltipSegment &&\n createPortal(\n <div\n className=\"fixed z-[9999] pointer-events-none\"\n style={{\n left: tooltip.x,\n top: tooltip.y,\n transform: \"translate(-50%, calc(-100% - 12px))\",\n }}\n >\n <div className=\"bg-neutral-900 dark:bg-white text-white dark:text-neutral-900 rounded-lg px-3 py-2 text-xs whitespace-nowrap shadow-xl ring-1 ring-black/10 dark:ring-black/5\">\n <p className=\"font-semibold leading-tight\">\n {tooltipSegment.label}\n </p>\n <p className=\"text-neutral-400 dark:text-neutral-500 mt-0.5\">\n {tooltipSegment.displayValue ?? tooltipSegment.value}\n <span className=\"mx-1 opacity-40\">·</span>\n {tooltipSegment.pct.toFixed(1)}%\n </p>\n </div>\n {/* Arrow */}\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 border-x-[5px] border-x-transparent border-t-[5px] border-t-neutral-900 dark:border-t-white\" />\n </div>,\n document.body,\n )}\n\n {/* Legend */}\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1.5 mt-1\">\n {resolvedSeries.map((s) => {\n const isActive = hoveredKey === s.key;\n const isDimmed = hoveredKey !== null && !isActive;\n\n return (\n <span\n key={s.key}\n className={classNames(\n \"flex items-center gap-1.5 whitespace-nowrap cursor-pointer select-none\",\n \"text-xs transition-all duration-200\",\n isActive\n ? \"text-neutral-800 dark:text-neutral-100\"\n : isDimmed\n ? \"text-neutral-300 dark:text-neutral-600\"\n : \"text-neutral-500 dark:text-neutral-400\",\n )}\n onMouseEnter={() => setHoveredKey(s.key)}\n onMouseLeave={() => setHoveredKey(null)}\n >\n {/* Dot — grows and glows on hover */}\n <span\n className={classNames(\n \"inline-block rounded-full transition-all duration-200\",\n s.color,\n isActive ? \"w-3 h-3 shadow-md brightness-110\" : \"w-2 h-2\",\n isDimmed && \"opacity-30\",\n )}\n />\n {/* Value */}\n <span\n className={classNames(\n \"font-semibold transition-colors duration-200\",\n isActive\n ? \"text-neutral-900 dark:text-neutral-50\"\n : isDimmed\n ? \"text-neutral-300 dark:text-neutral-600\"\n : \"text-neutral-700 dark:text-neutral-300\",\n )}\n >\n {s.displayValue ?? s.value}\n </span>\n {s.label}\n </span>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default MultiProgressBar;\n","import type { TrueColor } from \"./Theme\";\n\ntype RandomIntensity = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nconst RANDOM_INTENSITIES: RandomIntensity[] = [\n 100, 200, 300, 400, 500, 600, 700, 800, 900,\n];\n\n// Keep this aligned with TrueColor values that map to Tailwind palette names.\n// `slate` and `neutral` are excluded to avoid neutral/gray outputs.\nconst RANDOM_THEME_COLORS: TrueColor[] = [\n \"red\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n \"rose\",\n \"gray\",\n \"zinc\",\n \"stone\",\n];\n\nconst randomFrom = <T>(arr: readonly T[]): T =>\n arr[Math.floor(Math.random() * arr.length)];\n\nexport interface RandomThemeColorValue {\n color: string;\n intensity: RandomIntensity;\n token: string;\n}\n\n/**\n * Returns a random Tailwind color token based on the ui-kit theme palette,\n * like `blue-500` or `emerald-300`.\n */\nexport const getRandomThemeColorValue = (): RandomThemeColorValue => {\n const themeColor = randomFrom(RANDOM_THEME_COLORS);\n const intensity = randomFrom(RANDOM_INTENSITIES);\n return {\n color: themeColor,\n intensity,\n token: `${themeColor}-${intensity}`,\n };\n};\n\n/**\n * Returns a random Tailwind utility class for a theme color token.\n * Example: `getRandomThemeColorClass('bg')` -> `bg-blue-500`.\n */\nexport const getRandomThemeColorClass = (\n prefix: \"bg\" | \"text\" | \"border\" = \"bg\",\n): string => {\n const { token } = getRandomThemeColorValue();\n return `${prefix}-${token}`;\n};\n\n// Ordered spectrum colors from TrueColor — used as the primary palette before falling back to random.\nconst THEME_MULTI_COLORS: TrueColor[] = [\n \"red\",\n \"orange\",\n \"amber\",\n \"yellow\",\n \"lime\",\n \"green\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"purple\",\n \"fuchsia\",\n \"rose\",\n \"slate\",\n \"gray\",\n \"zinc\",\n \"neutral\",\n \"stone\",\n];\n\n/**\n * Returns an array of `count` Tailwind color utility classes.\n * Uses TrueColor values in order (at intensity 500) for the first N items,\n * then falls back to `getRandomThemeColorClass` for any overflow.\n *\n * @example\n * getColorPalette(5) // ['bg-red-500', 'bg-orange-500', ...]\n * getColorPalette(5, 'text') // ['text-red-500', 'text-orange-500', ...]\n */\nexport const getColorPalette = (\n count: number,\n prefix: \"bg\" | \"text\" | \"border\" = \"bg\",\n): string[] =>\n Array.from({ length: count }, (_, i) => {\n if (i < THEME_MULTI_COLORS.length) {\n return `${prefix}-${THEME_MULTI_COLORS[i]}-500`;\n }\n return getRandomThemeColorClass(prefix);\n });\n\n/**\n * Returns an array of `count` TrueColor names (e.g. `'red'`, `'orange'`, `'blue'`).\n * Uses TrueColor values in order for the first N items,\n * then falls back to random colors from RANDOM_THEME_COLORS for overflow.\n * Useful when components construct their own Tailwind class strings via template literals.\n *\n * @example\n * getColorPaletteNames(3) // ['red', 'orange', 'amber']\n */\nexport const getColorPaletteNames = (count: number): TrueColor[] =>\n Array.from({ length: count }, (_, i) => {\n if (i < THEME_MULTI_COLORS.length) {\n return THEME_MULTI_COLORS[i];\n }\n return randomFrom(RANDOM_THEME_COLORS);\n });","import classNames from \"classnames\";\nimport React from \"react\";\n\nexport type StatusSpinnerIntent =\n | \"neutral\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\";\nexport type StatusSpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nconst SIZE_TOKENS: Record<\n StatusSpinnerSize,\n { wrapper: string; dot: string; border: string }\n> = {\n xs: { wrapper: \"h-4 w-4\", dot: \"h-1.5 w-1.5\", border: \"border-[1.5px]\" },\n sm: { wrapper: \"h-5 w-5\", dot: \"h-2 w-2\", border: \"border-[2px]\" },\n md: { wrapper: \"h-6 w-6\", dot: \"h-2.5 w-2.5\", border: \"border-[2.5px]\" },\n lg: { wrapper: \"h-8 w-8\", dot: \"h-3 w-3\", border: \"border-[3px]\" },\n};\n\nconst INTENT_TOKENS: Record<\n StatusSpinnerIntent,\n { dot: string; accent: string; track: string }\n> = {\n neutral: {\n dot: \"bg-slate-400 shadow-[0_0_6px_rgba(148,163,184,0.55)] dark:bg-slate-300\",\n accent: \"rgb(148,163,184)\",\n track: \"rgba(148,163,184,0.25)\",\n },\n info: {\n dot: \"bg-sky-400 shadow-[0_0_8px_rgba(56,189,248,0.65)]\",\n accent: \"rgb(56,189,248)\",\n track: \"rgba(56,189,248,0.25)\",\n },\n success: {\n dot: \"bg-emerald-400 shadow-[0_0_8px_rgba(16,185,129,0.65)]\",\n accent: \"rgb(16,185,129)\",\n track: \"rgba(16,185,129,0.23)\",\n },\n warning: {\n dot: \"bg-amber-400 shadow-[0_0_8px_rgba(251,191,36,0.7)]\",\n accent: \"rgb(251,191,36)\",\n track: \"rgba(251,191,36,0.3)\",\n },\n danger: {\n dot: \"bg-rose-400 shadow-[0_0_8px_rgba(251,113,133,0.7)]\",\n accent: \"rgb(251,113,133)\",\n track: \"rgba(251,113,133,0.28)\",\n },\n};\n\nexport interface StatusSpinnerProps\n extends React.HTMLAttributes<HTMLSpanElement> {\n intent?: StatusSpinnerIntent;\n size?: StatusSpinnerSize;\n animated?: boolean;\n label?: string;\n}\n\nconst StatusSpinner = React.forwardRef<HTMLSpanElement, StatusSpinnerProps>(\n (\n {\n intent = \"info\",\n size = \"md\",\n animated = true,\n label,\n className,\n ...rest\n },\n ref,\n ) => {\n const palette = INTENT_TOKENS[intent] ?? INTENT_TOKENS.info;\n const sizeToken = SIZE_TOKENS[size] ?? SIZE_TOKENS.md;\n\n const spinnerStyle: React.CSSProperties = animated\n ? {\n borderTopColor: palette.accent,\n borderRightColor: palette.track,\n borderBottomColor: palette.track,\n borderLeftColor: palette.track,\n }\n : {\n borderColor: palette.track,\n };\n\n return (\n <span\n ref={ref}\n className={classNames(\"inline-flex items-center gap-2\", className)}\n {...rest}\n >\n <span\n className={classNames(\n \"relative inline-flex shrink-0 items-center justify-center\",\n sizeToken.wrapper,\n )}\n role=\"status\"\n aria-live=\"polite\"\n >\n <span\n className={classNames(\n \"absolute inset-0 rounded-full border-solid border-transparent transition-all duration-200 ease-out\",\n sizeToken.border,\n animated && \"animate-spin motion-reduce:animate-none\",\n )}\n style={spinnerStyle}\n />\n <span\n className={classNames(\n \"relative rounded-full ring-1 ring-white/40 transition-shadow duration-200 dark:ring-black/40\",\n sizeToken.dot,\n palette.dot,\n )}\n />\n </span>\n {label && (\n <span className=\"text-xs font-medium text-neutral-600 dark:text-neutral-300\">\n {label}\n </span>\n )}\n <span className=\"sr-only\">{label ?? \"Loading status\"}</span>\n </span>\n );\n },\n);\n\nStatusSpinner.displayName = \"StatusSpinner\";\n\nexport default StatusSpinner;\n","import classNames from \"classnames\";\nimport React, { type ReactNode } from \"react\";\nimport Spinner, { type SpinnerColor, type SpinnerProps } from \"./Spinner\";\nimport Progress from \"./Progress\";\n\ntype LoaderVariant = \"spinner\" | \"progress\";\ntype LoaderSize = \"sm\" | \"md\" | \"lg\";\ntype GlassBlurIntensity = \"none\" | \"low\" | \"medium\" | \"high\";\ntype LoaderColor = SpinnerColor;\n\nexport interface LoaderProps {\n variant?: LoaderVariant;\n size?: LoaderSize;\n color?: LoaderColor;\n spinnerVariant?: SpinnerProps[\"variant\"];\n spinnerThickness?: SpinnerProps[\"thickness\"];\n title?: ReactNode;\n label?: ReactNode;\n progress?: number;\n className?: string;\n overlay?: boolean;\n glass?: boolean;\n glassBlurIntensity?: GlassBlurIntensity;\n}\n\nconst sizeMap: Record<\n LoaderSize,\n {\n spinner: SpinnerProps[\"size\"];\n title: string;\n label: string;\n }\n> = {\n sm: { spinner: \"sm\", title: \"text-sm\", label: \"text-xs\" },\n md: { spinner: \"md\", title: \"text-base\", label: \"text-sm\" },\n lg: { spinner: \"lg\", title: \"text-lg\", label: \"text-sm\" },\n};\n\nconst Loader: React.FC<LoaderProps> = ({\n variant = \"spinner\",\n spinnerVariant = \"segments\",\n spinnerThickness = \"normal\",\n size = \"md\",\n color = \"blue\",\n title,\n label,\n progress = 0,\n className,\n overlay = false,\n glass = false,\n glassBlurIntensity = \"medium\",\n}) => {\n const resolvedSize = sizeMap[size] ?? sizeMap.md;\n const blurIntensityMap: Record<GlassBlurIntensity, string> = {\n none: \"backdrop-blur-none\",\n low: \"backdrop-blur-md\",\n medium: \"backdrop-blur-lg\",\n high: \"backdrop-blur-2xl\",\n };\n const containerClass = classNames(\n \"inline-flex flex-col items-center justify-center gap-3 text-center\",\n overlay &&\n (glass\n ? `absolute inset-0 z-50 rounded-[inherit] bg-white/70 p-6 ${blurIntensityMap[glassBlurIntensity]} dark:bg-neutral-900/60`\n : `absolute inset-0 z-50 rounded-[inherit] bg-white/85 p-6 ${blurIntensityMap[glassBlurIntensity]} dark:bg-neutral-900/80`),\n className,\n );\n\n const renderBody = () => {\n if (variant === \"progress\") {\n return (\n <div className=\"w-full min-w-[12rem] space-y-3\">\n <Progress value={progress} size=\"md\" color={color} />\n </div>\n );\n }\n\n return (\n <Spinner\n size={resolvedSize.spinner}\n color={color}\n variant={spinnerVariant}\n thickness={spinnerThickness}\n />\n );\n };\n\n return (\n <div className={containerClass}>\n {title && (\n <div\n className={classNames(\n \"font-semibold text-neutral-800 dark:text-neutral-100\",\n resolvedSize.title,\n )}\n >\n {title}\n </div>\n )}\n {renderBody()}\n {label && (\n <div\n className={classNames(\n \"text-neutral-600 dark:text-neutral-300\",\n resolvedSize.label,\n )}\n >\n {label}\n </div>\n )}\n </div>\n );\n};\n\nexport default Loader;\n","import classNames from \"classnames\";\nimport React from \"react\";\nimport Button, {\n type ButtonVariant,\n type ButtonSize,\n type ButtonColor,\n} from \"./Button\";\nimport { type IconSize } from \"../types/Icon\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport type { TrueColor, Size } from \"../theme/Theme\";\nexport type TextSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst iconSizes: Record<IconSize, string> = {\n xs: \"h-6 w-6\",\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-12 w-12\",\n xl: \"h-16 w-16\",\n};\n\nconst textSizes: Record<TextSize, string> = {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-lg\",\n lg: \"text-xl\",\n xl: \"text-2xl\",\n};\n\nexport type EmptyStateTone = TrueColor;\n\ntype ToneConfig = { border: string; text: string; bg: string; icon: string };\n\n// ── Neutral palette tones (static strings — Tailwind picks these up directly) ──\n\nconst neutralTones: Record<Extract<TrueColor, \"neutral\" | \"slate\" | \"gray\" | \"zinc\" | \"stone\">, ToneConfig> = {\n neutral: {\n border: \"border-neutral-300/70 dark:border-neutral-700/60\",\n text: \"text-neutral-600 dark:text-neutral-300\",\n bg: \"bg-white/80 dark:bg-neutral-900/40\",\n icon: \"text-neutral-400 dark:text-neutral-500\",\n },\n slate: {\n border: \"border-slate-300/70 dark:border-slate-700/60\",\n text: \"text-slate-600 dark:text-slate-300\",\n bg: \"bg-slate-50/80 dark:bg-slate-900/40\",\n icon: \"text-slate-400 dark:text-slate-500\",\n },\n gray: {\n border: \"border-gray-300/70 dark:border-gray-700/60\",\n text: \"text-gray-600 dark:text-gray-300\",\n bg: \"bg-gray-50/80 dark:bg-gray-900/40\",\n icon: \"text-gray-400 dark:text-gray-500\",\n },\n zinc: {\n border: \"border-zinc-300/70 dark:border-zinc-700/60\",\n text: \"text-zinc-600 dark:text-zinc-300\",\n bg: \"bg-zinc-50/80 dark:bg-zinc-900/40\",\n icon: \"text-zinc-400 dark:text-zinc-500\",\n },\n stone: {\n border: \"border-stone-300/70 dark:border-stone-700/60\",\n text: \"text-stone-600 dark:text-stone-300\",\n bg: \"bg-stone-50/80 dark:bg-stone-900/40\",\n icon: \"text-stone-400 dark:text-stone-500\",\n },\n};\n\nconst sizes: Record<Size, string> = {\n xs: \"h-[30%] w-[30%]\",\n sm: \"h-[35%] w-[35%]\",\n md: \"h-[40%] w-[40%]\",\n lg: \"h-[45%] w-[45%]\",\n xl: \"h-[50%] w-[50%]\",\n xxl: \"h-[55%] w-[55%]\",\n xxxl: \"h-[60%] w-[60%]\",\n full: \"h-full w-full\",\n \"2xl\": \"h-[65%] w-[65%]\",\n \"3xl\": \"h-[70%] w-[70%]\",\n};\n\n// ── Dynamic builder for all TrueColor values ────────────────────────────────\n// Uses only class patterns already declared in tailwind-safelist.ts:\n// border-{c}-200 (border200)\n// dark:border-{c}-500/40 (darkBorder500_40)\n// text-{c}-700 (text700)\n// dark:text-{c}-200 (darkText200)\n// bg-{c}-50/80 (bg50_80)\n// dark:bg-{c}-500/10 (darkBg500_10)\n// text-{c}-500 (text500)\n// dark:text-{c}-300 (darkText300)\n\nfunction buildToneClasses(color: TrueColor): ToneConfig {\n // Static tones for neutral palettes\n if (color === \"neutral\") return neutralTones.neutral;\n if (color === \"slate\") return neutralTones.slate;\n if (color === \"gray\") return neutralTones.gray;\n if (color === \"zinc\") return neutralTones.zinc;\n if (color === \"stone\") return neutralTones.stone;\n\n // All other TrueColor values (red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose)\n return {\n border: `border-${color}-200 dark:border-${color}-500/40`,\n text: `text-${color}-700 dark:text-${color}-200`,\n bg: `bg-${color}-50/80 dark:bg-${color}-500/10`,\n icon: `text-${color}-500 dark:text-${color}-300`,\n };\n}\n\n// ── Props ───────────────────────────────────────────────────────────────────\n\nexport interface EmptyStateProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n actionLabel?: string;\n onAction?: () => void;\n actionVariant?: ButtonVariant;\n actionColor?: ButtonColor;\n icon?: string | React.ReactElement;\n iconSize?: IconSize;\n iconColor?: TrueColor;\n textSize?: TextSize;\n showIcon?: boolean;\n tone?: EmptyStateTone;\n disableBorder?: boolean;\n transparentBackground?: boolean;\n fullWidth?: boolean;\n fullHeight?: boolean;\n actionSize?: ButtonSize;\n actionLeadingIcon?: string | React.ReactElement;\n size?: Size;\n}\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nconst EmptyState: React.FC<EmptyStateProps> = ({\n title,\n subtitle,\n actionLabel,\n onAction,\n actionVariant = \"soft\",\n actionColor = \"blue\",\n icon = \"Plus\",\n iconSize = \"xl\",\n iconColor,\n textSize = \"md\",\n showIcon = true,\n tone = \"neutral\",\n fullWidth = false,\n fullHeight = false,\n actionSize = \"sm\",\n size = \"md\",\n actionLeadingIcon,\n className,\n disableBorder = false,\n transparentBackground = false,\n ...rest\n}) => {\n const renderIcon = useIconRenderer();\n const palette = buildToneClasses(tone);\n\n // lets make the subtitle text size smaller than the title text size\n const subtitleTextSize =\n textSize === \"xs\"\n ? \"xs\"\n : textSize === \"sm\"\n ? \"xs\"\n : textSize === \"md\"\n ? \"sm\"\n : textSize === \"lg\"\n ? \"md\"\n : \"lg\";\n const iconPallete = !iconColor ? palette : buildToneClasses(iconColor);\n\n return (\n <section\n className={classNames(\n \"flex flex-col items-center justify-center gap-1 rounded-3xl px-6 py-10 text-center transition\",\n !disableBorder && \"border-2 border-dashed shadow-sm\",\n palette.border,\n !transparentBackground && palette.bg,\n sizes[size],\n fullWidth && \"w-full\",\n fullHeight && \"h-full\",\n className,\n )}\n {...rest}\n >\n {showIcon && (\n <div className={classNames(\"p-2 dark:bg-white/5\", iconPallete.icon)}>\n {React.isValidElement(icon)\n ? icon\n : renderIcon(icon, iconSize, iconSizes[iconSize])}\n </div>\n )}\n <div className=\"space-y-1\">\n <p\n className={classNames(\n textSizes[textSize],\n \"font-semibold\",\n palette.text,\n )}\n >\n {title}\n </p>\n {subtitle && (\n <p\n className={classNames(\n textSizes[subtitleTextSize],\n \"leading-relaxed break-all\",\n palette.text,\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n {actionLabel && onAction && (\n <div className=\"mt-4\">\n <Button\n size={actionSize}\n variant={actionVariant}\n color={actionColor}\n onClick={onAction}\n leadingIcon={actionLeadingIcon}\n >\n {actionLabel}\n </Button>\n </div>\n )}\n </section>\n );\n};\n\nexport default EmptyState;\n","import React, {\n type ButtonHTMLAttributes,\n type ReactNode,\n forwardRef,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { type IconSize } from \"../types/Icon\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport {\n getButtonColorClasses,\n getButtonBaseClasses,\n getButtonHoverClasses,\n getButtonActiveClasses,\n getButtonActiveHoverClasses,\n type TrueColor,\n type ButtonVariant,\n} from \"../theme/Theme\";\nimport {\n getGlassFillClass,\n getGlassVibrancyClass,\n getSpecularClasses,\n type GlassVibrancy,\n type GlassOpacity,\n type SpecularMode,\n} from \"../../../common/theme/glass\";\nimport { iconAccentHover, iconAccentRing } from \"../theme/ButtonTypes\";\nimport TooltipWrapper from \"./TooltipWrapper\";\nimport type { TooltipPosition } from \"./Tooltip\";\n\nexport type ButtonColor = TrueColor;\nexport type { ButtonVariant };\nexport type { GlassVibrancy, GlassOpacity, SpecularMode };\n\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type ButtonWeight = \"normal\" | \"medium\" | \"semibold\" | \"bold\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n color?: TrueColor;\n size?: ButtonSize;\n weight?: ButtonWeight;\n fullWidth?: boolean;\n leadingIcon?: string | React.ReactElement;\n trailingIcon?: string | React.ReactElement;\n loading?: boolean;\n iconOnly?: boolean;\n accent?: boolean;\n accentColor?: TrueColor;\n /** When true, renders in a persistent lighter \"on\" state with hover suppressed. accentColor overrides the active color. */\n active?: boolean;\n /** When true, applies glass styling (fill + vibrancy + optional specular overlay). */\n glass?: boolean;\n /** Backdrop vibrancy level for glass surfaces. */\n vibrancy?: GlassVibrancy;\n /** Glass fill transparency level for glass surfaces. */\n glassOpacity?: GlassOpacity;\n /** Specular highlight mode for glass surfaces. */\n specularMode?: SpecularMode;\n className?: string;\n children?: ReactNode;\n /** When set, a styled tooltip is shown on hover. */\n tooltip?: string;\n /** Position of the tooltip relative to the button. Defaults to 'top'. */\n tooltipPosition?: TooltipPosition;\n}\n\nconst baseClasses =\n \"inline-flex items-center justify-center rounded-md transition-colors duration-150 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 select-none\";\n\nconst sizeStyles: Record<\n ButtonSize,\n { base: string; iconOnly: string; gap: string; icon: string; spinner: string }\n> = {\n xs: {\n base: \"px-2 py-1 text-xs\",\n iconOnly: \"p-1.5 text-xs\",\n gap: \"gap-1.5\",\n icon: \"h-4 w-4\",\n spinner: \"h-4 w-4\",\n },\n sm: {\n base: \"px-3 py-2 text-xs\",\n iconOnly: \"p-2 text-xs\",\n gap: \"gap-1.5\",\n icon: \"h-5 w-5\",\n spinner: \"h-4 w-4\",\n },\n md: {\n base: \"px-3.5 py-2.5 text-sm\",\n iconOnly: \"p-2.5 text-sm\",\n gap: \"gap-2\",\n icon: \"h-6 w-6\",\n spinner: \"h-6 w-6\",\n },\n lg: {\n base: \"px-4 py-2.5 text-base\",\n iconOnly: \"p-3 text-base\",\n gap: \"gap-2.5\",\n icon: \"h-7 w-7\",\n spinner: \"h-7 w-7\",\n },\n xl: {\n base: \"px-5 py-3 text-base\",\n iconOnly: \"p-3.5 text-base\",\n gap: \"gap-3\",\n icon: \"h-8 w-8\",\n spinner: \"h-8 w-8\",\n },\n};\n\nconst weightClasses: Record<ButtonWeight, string> = {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n};\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = \"solid\",\n color = \"blue\",\n size = \"md\",\n weight = \"normal\",\n fullWidth = false,\n leadingIcon,\n trailingIcon,\n loading = false,\n iconOnly = false,\n accent = false,\n accentColor,\n active = false,\n glass = false,\n vibrancy = \"medium\",\n glassOpacity = \"frosted\",\n specularMode = \"none\",\n className,\n children,\n disabled,\n onClick,\n tooltip,\n tooltipPosition,\n ...props\n },\n ref,\n ) => {\n const renderIcon = useIconRenderer();\n const sizeConfig = sizeStyles[size] ?? sizeStyles.md;\n const baseColorClasses = getButtonColorClasses(variant, color);\n const isIconMode = iconOnly || variant === \"icon\";\n const accentTone = accentColor ?? color;\n const accentRingClass = iconAccentRing[accentTone] ?? iconAccentRing.blue;\n const accentHoverClass =\n iconAccentHover[accentTone] ?? iconAccentHover.blue;\n const accentClasses =\n isIconMode && accent\n ? classNames(\n \"bg-transparent text-inherit hover:bg-transparent focus-visible:ring-2 focus-visible:ring-offset-2\",\n accentRingClass,\n accentHoverClass,\n )\n : null;\n\n const isEffectivelyDisabled = (disabled ?? false) || loading;\n // active: persistent lighter \"on\" state, no hover; accentColor overrides the active color\n // accentColor on enabled non-active: replaces only the hover classes\n const colorClasses = (() => {\n if (active) {\n const activeColor = accentColor ?? color;\n const activeBase = getButtonActiveClasses(variant, activeColor);\n return isEffectivelyDisabled\n ? activeBase\n : classNames(\n activeBase,\n getButtonActiveHoverClasses(variant, activeColor),\n );\n }\n if (!isIconMode && accentColor && !isEffectivelyDisabled)\n return classNames(\n getButtonBaseClasses(variant, color),\n getButtonHoverClasses(variant, accentColor),\n );\n return baseColorClasses;\n })();\n\n // Glass styling — variant=\"glass\" auto-enables glass; glass prop overrides\n const isGlass = variant === \"glass\" || glass;\n const glassClasses = isGlass\n ? classNames(\n \"backdrop-blur-sm\",\n getGlassFillClass(color, glassOpacity),\n getGlassVibrancyClass(vibrancy),\n )\n : null;\n\n const resolvedSpecularMode = isGlass ? specularMode : \"none\";\n const specularOverlay =\n resolvedSpecularMode !== \"none\"\n ? (() => {\n const specClasses = getSpecularClasses(resolvedSpecularMode);\n return specClasses ? (\n <div\n className={classNames(\n \"pointer-events-none absolute inset-0 rounded-[inherit]\",\n specClasses,\n )}\n aria-hidden=\"true\"\n />\n ) : null;\n })()\n : null;\n\n const computedClassName = classNames(\n baseClasses,\n sizeConfig.gap,\n isIconMode ? sizeConfig.iconOnly : sizeConfig.base,\n isGlass ? accentClasses : (accentClasses ?? colorClasses),\n weightClasses[weight],\n fullWidth && \"w-full\",\n isGlass && \"relative\",\n glassClasses,\n className,\n );\n\n const spinner = (\n <span\n className={classNames(\n \"inline-flex animate-spin rounded-full border-2 border-current border-t-transparent\",\n sizeConfig.spinner,\n )}\n aria-hidden=\"true\"\n />\n );\n\n const isDisabled = disabled ?? false;\n const ariaLabel = (props as { \"aria-label\"?: string })[\"aria-label\"];\n const srOnlyContent =\n typeof children === \"string\"\n ? children\n : ariaLabel\n ? ariaLabel\n : undefined;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n };\n\n const button = (\n <button\n ref={ref}\n className={computedClassName}\n disabled={isDisabled || loading}\n data-variant={variant}\n data-color={color}\n data-size={size}\n data-glass={glass}\n aria-busy={loading || undefined}\n onClick={handleClick}\n {...props}\n >\n {specularOverlay}\n {loading\n ? spinner\n : renderIcon(\n leadingIcon,\n size as IconSize,\n classNames(\" flex-shrink-0\", sizeConfig.icon),\n )}\n {isIconMode ? (\n <span className=\"sr-only\">{srOnlyContent ?? \"Button\"}</span>\n ) : (\n children\n )}\n {!loading &&\n renderIcon(\n trailingIcon,\n size as IconSize,\n classNames(\"flex-shrink-0\", sizeConfig.icon),\n )}\n </button>\n );\n\n if (tooltip) {\n return (\n <TooltipWrapper text={tooltip} position={tooltipPosition}>\n {button}\n </TooltipWrapper>\n );\n }\n\n return button;\n },\n);\n\nButton.displayName = \"Button\";\n\nexport default Button;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { CustomIcon } from \"./CustomIcon\";\nimport { type IconName } from \"../icons/registry\";\nimport type { TrueColor } from \"../theme\";\nimport { type PanelDecoration } from \"./Panel\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type HeroTitleSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type HeroSubtitleSize = \"xs\" | \"sm\" | \"md\";\nexport type HeroPadding = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface HeroProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Main heading text. */\n title: React.ReactNode;\n /** Supporting text rendered below the title at lower opacity. */\n subtitle?: React.ReactNode;\n /** Icon name from the registry, or a pre-built React element. When omitted the icon slot is not rendered. */\n icon?: IconName | React.ReactElement;\n /** Colour tone — drives the gradient background. Defaults to `\"blue\"`. */\n tone?: TrueColor;\n /** Size of the title text. Colour is always white. Defaults to `\"sm\"`. */\n titleSize?: HeroTitleSize;\n /** Size of the subtitle text. Colour is always white/75. Defaults to `\"xs\"`. */\n subtitleSize?: HeroSubtitleSize;\n /** Internal padding. Defaults to `\"none\"`. */\n padding?: HeroPadding;\n /** Whether to apply `rounded-xl` corner rounding. Defaults to `true`. */\n rounded?: boolean;\n /**\n * Decorative layer inside the banner:\n * - `\"shapes\"` — three floating circles at low white opacity\n * - `\"gradient\"` — a diagonal white-to-transparent light wash\n * - `\"both\"` — circles + wash (default)\n * - `\"none\"` — no decoration\n */\n decoration?: PanelDecoration;\n}\n\n// ── Static gradient map ────────────────────────────────────────────────────────\n// All values are complete, literal Tailwind class strings so the JIT scanner\n// includes them without needing a safelist entry.\n\nconst toneGradient: Record<TrueColor, string> = {\n red: \"from-red-500 to-rose-600\",\n orange: \"from-orange-400 to-orange-600\",\n amber: \"from-amber-400 to-orange-500\",\n yellow: \"from-yellow-400 to-amber-500\",\n lime: \"from-lime-500 to-green-600\",\n green: \"from-green-500 to-emerald-600\",\n emerald: \"from-emerald-500 to-teal-600\",\n teal: \"from-teal-500 to-cyan-600\",\n cyan: \"from-cyan-400 to-sky-500\",\n sky: \"from-sky-400 to-indigo-500\",\n blue: \"from-blue-500 to-indigo-600\",\n indigo: \"from-indigo-500 to-violet-600\",\n violet: \"from-violet-500 to-purple-600\",\n purple: \"from-purple-500 to-fuchsia-600\",\n fuchsia: \"from-fuchsia-500 to-pink-600\",\n rose: \"from-rose-500 to-red-600\",\n slate: \"from-slate-600 to-slate-800\",\n gray: \"from-gray-600 to-gray-800\",\n zinc: \"from-zinc-600 to-zinc-800\",\n neutral: \"from-neutral-600 to-neutral-800\",\n stone: \"from-stone-600 to-stone-800\",\n};\n\n// ── Size maps ─────────────────────────────────────────────────────────────────\n\nconst titleSizeMap: Record<HeroTitleSize, string> = {\n xs: \"text-xs font-bold\",\n sm: \"text-sm font-bold\",\n md: \"text-base font-bold\",\n lg: \"text-lg font-semibold\",\n xl: \"text-xl font-semibold\",\n};\n\nconst subtitleSizeMap: Record<HeroSubtitleSize, string> = {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-base\",\n};\n\nconst paddingMap: Record<HeroPadding, string> = {\n none: \"p-0\",\n xs: \"p-2\",\n sm: \"p-3\",\n md: \"p-5\",\n lg: \"p-7\",\n xl: \"p-9\",\n};\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nconst Hero: React.FC<HeroProps> = ({\n title,\n subtitle,\n icon,\n tone = \"blue\",\n titleSize = \"sm\",\n subtitleSize = \"xs\",\n padding = \"sm\",\n rounded = true,\n decoration = \"both\",\n className,\n ...rest\n}) => {\n const showShapes = decoration === \"shapes\" || decoration === \"both\";\n const showGradient = decoration === \"gradient\" || decoration === \"both\";\n\n const iconNode = icon ? (\n typeof icon === \"string\" ? (\n <CustomIcon icon={icon as IconName} className=\"w-6 h-6 text-white\" />\n ) : (\n icon\n )\n ) : null;\n\n return (\n <div\n className={classNames(\n \"relative overflow-hidden flex items-center gap-4 bg-linear-to-br shadow-lg\",\n toneGradient[tone],\n paddingMap[padding],\n rounded && \"rounded-xl\",\n className,\n )}\n {...rest}\n >\n {/* Decoration: floating circles at white/10 opacity — same intensity on all tones */}\n {showShapes && (\n <>\n <div\n className=\"pointer-events-none absolute -right-10 -top-10 w-52 h-52 rounded-full bg-white/10\"\n aria-hidden=\"true\"\n />\n <div\n className=\"pointer-events-none absolute -left-8 -bottom-10 w-36 h-36 rounded-full bg-white/10 opacity-70\"\n aria-hidden=\"true\"\n />\n <div\n className=\"pointer-events-none absolute right-10 bottom-8 w-16 h-16 rounded-full bg-white/10 opacity-50\"\n aria-hidden=\"true\"\n />\n </>\n )}\n\n {/* Decoration: diagonal light wash for depth */}\n {showGradient && (\n <div\n className=\"pointer-events-none absolute inset-0 bg-linear-to-tr from-white/10 to-transparent\"\n aria-hidden=\"true\"\n />\n )}\n\n {/* Icon container */}\n {iconNode && (\n <div className=\"relative shrink-0 w-12 h-12 rounded-xl bg-white/15 backdrop-blur-sm flex items-center justify-center border border-white/20 shadow-inner\">\n {iconNode}\n </div>\n )}\n\n {/* Text */}\n <div className=\"relative min-w-0 flex-1\">\n <p\n className={classNames(\n \"text-white leading-tight\",\n titleSizeMap[titleSize],\n )}\n >\n {title}\n </p>\n {subtitle && (\n <p\n className={classNames(\n \"text-white/75 mt-0.5 leading-relaxed\",\n subtitleSizeMap[subtitleSize],\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n </div>\n );\n};\n\nexport default Hero;\n","import React, { useMemo } from \"react\";\nimport { type IconName, iconRegistry } from \"../icons/registry\";\nimport { mergeClassTokens, hasExplicitSize } from \"../utils/iconUtils\";\nimport type { IconSize } from \"../types/Icon\";\n\nexport interface CustomIconProps {\n /** Name of the icon to display */\n icon: IconName;\n /** Alternative text for accessibility */\n alt?: string;\n /** Size of the icon in pixels */\n customSize?: number | string;\n /** Size of the icon: xs, sm, md, lg, xl */\n size?: IconSize;\n\n /** Additional CSS class names */\n className?: string;\n /** Click handler */\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n /** Whether the icon should use color or be monochrome */\n colored?: boolean;\n /** Primary color to use for the icon */\n color?: string;\n /** Hover color for the icon */\n hoverColor?: string;\n\n /** @deprecated No longer used with component-based icons */\n forceSvg?: boolean;\n}\n\nconst SIZE_CLASS_MAP: Record<IconSize, string> = {\n xs: \"h-4 w-4\",\n sm: \"h-5 w-5\",\n md: \"h-6 w-6\",\n lg: \"h-7 w-7\",\n xl: \"h-8 w-8\",\n};\n\nexport const CustomIcon: React.FC<CustomIconProps> = ({\n icon,\n alt = \"\",\n customSize = undefined,\n size = \"md\",\n className = \"\",\n onClick,\n colored = false,\n color,\n hoverColor,\n}) => {\n const IconComponent = iconRegistry[icon];\n\n const dimension = useMemo(() => {\n if (!customSize) {\n return undefined;\n }\n if (typeof customSize === \"number\") {\n return `${customSize}px`;\n }\n return customSize;\n }, [customSize]);\n\n const baseStyle = useMemo(() => {\n const style: React.CSSProperties = {};\n if (dimension) {\n style.width = dimension;\n style.height = dimension;\n }\n if (color && !colored) {\n (style as Record<string, string>)[\"--icon-color\"] = color;\n }\n if (hoverColor && !colored) {\n (style as Record<string, string>)[\"--icon-hover-color\"] = hoverColor;\n }\n return style;\n }, [dimension, color, hoverColor, colored]);\n\n const fallbackSizeClass =\n !dimension && !hasExplicitSize(className)\n ? SIZE_CLASS_MAP[size]\n : undefined;\n\n const iconClass = mergeClassTokens(\n \"inline-flex items-center justify-center flex-shrink-0 [&>svg]:h-full [&>svg]:w-full\",\n !colored ? \"fill-current\" : \"\",\n fallbackSizeClass,\n className,\n );\n\n if (!IconComponent) {\n console.warn(`Icon not found in registry: ${icon}`);\n return (\n <span\n className={`flex items-center justify-center rounded bg-neutral-100 text-xs font-bold uppercase text-neutral-500 dark:bg-neutral-800 dark:text-neutral-400 ${className}`}\n style={baseStyle}\n onClick={onClick}\n >\n {icon?.charAt(0) || \"?\"}\n </span>\n );\n }\n\n return (\n <span className={iconClass} style={baseStyle} onClick={onClick}>\n <IconComponent className=\"w-full h-full\" aria-label={alt} />\n </span>\n );\n};\n\nexport default CustomIcon;\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Add = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M5.15186 12C5.15186 11.7952 5.2238 11.6209 5.36768 11.4771C5.51709 11.3276 5.69141 11.2529 5.89062 11.2529H11.2612V5.89062C11.2612 5.69141 11.3332 5.51986 11.4771 5.37598C11.6209 5.22656 11.7952 5.15186 12 5.15186C12.2048 5.15186 12.3791 5.22656 12.5229 5.37598C12.6724 5.51986 12.7471 5.69141 12.7471 5.89062V11.2529H18.1094C18.3086 11.2529 18.4801 11.3276 18.624 11.4771C18.7734 11.6209 18.8481 11.7952 18.8481 12C18.8481 12.2048 18.7734 12.3791 18.624 12.5229C18.4801 12.6668 18.3086 12.7388 18.1094 12.7388H12.7471V18.1094C12.7471 18.3086 12.6724 18.4801 12.5229 18.624C12.3791 18.7734 12.2048 18.8481 12 18.8481C11.7952 18.8481 11.6209 18.7734 11.4771 18.624C11.3332 18.4801 11.2612 18.3086 11.2612 18.1094V12.7388H5.89062C5.69141 12.7388 5.51709 12.6668 5.36768 12.5229C5.2238 12.3791 5.15186 12.2048 5.15186 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nAdd.displayName = \"Add\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ArrowDown = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M12.146 16.157c-.27 0-.516-.11-.739-.328L6.26 10.565a1.013 1.013 0 0 1-.198-.293.95.95 0 0 1-.062-.35.925.925 0 0 1 .451-.8.91.91 0 0 1 .465-.122.93.93 0 0 1 .67.28l4.874 5.004h-.622l4.86-5.004a.93.93 0 0 1 1.128-.157.909.909 0 0 1 .458.8c0 .25-.089.462-.266.636l-5.134 5.27c-.11.11-.226.191-.349.246a1.08 1.08 0 0 1-.39.082z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nArrowDown.displayName = \"ArrowDown\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ArrowLeft = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M 11,7 A 1,1 0 0 0 10.292969,7.2929687 L 6.2929687,11.292969 A 1,1 0 0 0 6,12 1,1 0 0 0 6.2929687,12.707031 l 4.0000003,4 a 1,1 0 0 0 1.414062,0 1,1 0 0 0 0,-1.414062 L 9.4140625,13 H 17 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 H 9.4140625 L 11.707031,8.7070313 a 1,1 0 0 0 0,-1.4140626 A 1,1 0 0 0 11,7 Z\" />\n </svg>\n ),\n);\n\nArrowLeft.displayName = \"ArrowLeft\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ArrowRight = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m 13,7 a 1,1 0 0 0 -0.707031,0.2929687 1,1 0 0 0 0,1.4140626 L 14.585938,11 H 7 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 7.585938 l -2.292969,2.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.414062,0 l 4,-4 a 1,1 0 0 0 0.259766,-0.447265 1,1 0 0 0 0,-0.179688 A 1,1 0 0 0 18,12 a 1,1 0 0 0 -0.0332,-0.166016 1,1 0 0 0 -0.02734,-0.142578 1,1 0 0 0 -0.232422,-0.398437 l -4,-4.0000003 A 1,1 0 0 0 13,7 Z\"\n id=\"Vector\"\n />\n </svg>\n ),\n);\n\nArrowRight.displayName = \"ArrowRight\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ArrowUp = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m 12.137985,8.9997632 c 0.27,0 0.516,0.11 0.739,0.328 l 5.147,5.2639998 a 1.013,1.013 0 0 1 0.198,0.293 0.95,0.95 0 0 1 0.062,0.35 0.925,0.925 0 0 1 -0.451,0.8 0.91,0.91 0 0 1 -0.465,0.122 0.93,0.93 0 0 1 -0.67,-0.28 l -4.874,-5.004 h 0.622 l -4.8600002,5.004 a 0.93,0.93 0 0 1 -1.128,0.157 0.909,0.909 0 0 1 -0.458,-0.8 c 0,-0.25 0.089,-0.462 0.266,-0.636 L 11.399985,9.3277632 c 0.11,-0.11 0.226,-0.191 0.349,-0.246 a 1.08,1.08 0 0 1 0.39,-0.082 z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nArrowUp.displayName = \"ArrowUp\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Attached = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.5 7.45C9.5 5.54462 11.0446 4 12.95 4C14.8554 4 16.4 5.54462 16.4 7.45V14.7C16.4 17.2957 14.2957 19.4 11.7 19.4C9.10426 19.4 7 17.2957 7 14.7V8.2C7 7.8134 7.3134 7.5 7.7 7.5C8.0866 7.5 8.4 7.8134 8.4 8.2V14.7C8.4 16.5225 9.87746 18 11.7 18C13.5225 18 15 16.5225 15 14.7V7.45C15 6.31782 14.0822 5.4 12.95 5.4C11.8178 5.4 10.9 6.31782 10.9 7.45V14.2C10.9 14.6418 11.2582 15 11.7 15C12.1418 15 12.5 14.6418 12.5 14.2V8.2C12.5 7.8134 12.8134 7.5 13.2 7.5C13.5866 7.5 13.9 7.8134 13.9 8.2V14.2C13.9 15.415 12.915 16.4 11.7 16.4C10.485 16.4 9.5 15.415 9.5 14.2V7.45Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nAttached.displayName = \"Attached\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Attachment = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.5 7.45C9.5 5.54462 11.0446 4 12.95 4C14.8554 4 16.4 5.54462 16.4 7.45V14.7C16.4 17.2957 14.2957 19.4 11.7 19.4C9.10426 19.4 7 17.2957 7 14.7V8.2C7 7.8134 7.3134 7.5 7.7 7.5C8.0866 7.5 8.4 7.8134 8.4 8.2V14.7C8.4 16.5225 9.87746 18 11.7 18C13.5225 18 15 16.5225 15 14.7V7.45C15 6.31782 14.0822 5.4 12.95 5.4C11.8178 5.4 10.9 6.31782 10.9 7.45V14.2C10.9 14.6418 11.2582 15 11.7 15C12.1418 15 12.5 14.6418 12.5 14.2V8.2C12.5 7.8134 12.8134 7.5 13.2 7.5C13.5866 7.5 13.9 7.8134 13.9 8.2V14.2C13.9 15.415 12.915 16.4 11.7 16.4C10.485 16.4 9.5 15.415 9.5 14.2V7.45Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nAttachment.displayName = \"Attachment\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Back = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M4 10L3.29289 10.7071L2.58579 10L3.29289 9.29289L4 10ZM21 18C21 18.5523 20.5523 19 20 19C19.4477 19 19 18.5523 19 18L21 18ZM8.29289 15.7071L3.29289 10.7071L4.70711 9.29289L9.70711 14.2929L8.29289 15.7071ZM3.29289 9.29289L8.29289 4.29289L9.70711 5.70711L4.70711 10.7071L3.29289 9.29289ZM4 9L14 9L14 11L4 11L4 9ZM21 16L21 18L19 18L19 16L21 16ZM14 9C17.866 9 21 12.134 21 16L19 16C19 13.2386 16.7614 11 14 11L14 9Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nBack.displayName = \"Back\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Blueprint = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n version=\"1.1\"\n id=\"Layer_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n {...props}\n ref={ref}\n >\n <path d=\"M508.489,48.861c-2.213-1.67-5.078-2.201-7.741-1.442L338.391,93.808L176.035,47.419c-1.585-0.453-3.265-0.453-4.85,0 L6.403,94.5C2.613,95.584,0,99.047,0,102.989v353.103c0,2.769,1.301,5.379,3.511,7.047c1.55,1.169,3.42,1.781,5.318,1.781 c0.811,0,1.627-0.112,2.425-0.339l162.356-46.388l162.356,46.388c1.585,0.453,3.265,0.453,4.85,0l164.782-47.08 c3.79-1.084,6.403-4.547,6.403-8.489V55.908C512,53.137,510.699,50.529,508.489,48.861z M164.782,273.268 c-3.205,2.046-4.834,6.018-3.736,9.862c0.614,2.15,1.989,3.863,3.736,4.982v43.621l-88.276,25.221v-40.49l10.573-3.02 c4.688-1.338,7.402-6.225,6.063-10.912c-1.339-4.688-6.229-7.405-10.913-6.062l-5.723,1.633v-69.474 c20.122-4.1,35.31-21.935,35.31-43.249c0-4.876-3.952-8.828-8.828-8.828s-8.828,3.951-8.828,8.828 c0,11.508-7.381,21.319-17.655,24.964v-46.89l88.276-25.222V273.268z M164.782,119.87l-99.529,28.435 c-3.79,1.084-6.402,4.547-6.402,8.489v152.802v0.005v59.055c0,2.771,1.299,5.379,3.511,7.047 c2.212,1.668,5.076,2.205,7.741,1.441l94.679-27.05v52.257L17.655,444.389V109.647l147.126-42.036V119.87z M329.563,444.388 l-147.126-42.037v-52.258l147.126,42.036V444.388z M329.563,238.977v0.005v134.788l-147.126-42.036V138.231l64.736,18.496v11 c0,4.876,3.952,8.828,8.828,8.828s8.828-3.951,8.828-8.828v-5.956l64.736,18.496V238.977z M329.563,161.907l-147.126-42.036 V67.612l147.126,42.037V161.907z M347.218,245.844l10.573-3.02c4.688-1.338,7.402-6.225,6.063-10.912 c-1.339-4.687-6.228-7.409-10.913-6.062l-5.723,1.633v-47.216l88.276-25.221v47.602c-3.205,2.046-4.834,6.018-3.736,9.862 c0.614,2.15,1.989,3.863,3.736,4.982v65.88c-20.122,4.1-35.31,21.935-35.31,43.249c0,4.876,3.952,8.828,8.828,8.828 s8.828-3.951,8.828-8.828c0-11.508,7.38-21.319,17.655-24.964v46.89l-88.276,25.222V245.844z M494.345,402.353l-147.126,42.036 V392.13l99.528-28.435c3.79-1.084,6.403-4.547,6.403-8.489V143.344c0-2.771-1.301-5.379-3.511-7.047 c-2.212-1.669-5.079-2.207-7.741-1.441l-94.679,27.05v-52.258l147.126-42.037V402.353z\"></path>{\" \"}\n <path d=\"M414.784,217.361c-1.339-4.687-6.228-7.406-10.913-6.062l-16.976,4.85c-4.688,1.339-7.402,6.225-6.063,10.912 c1.108,3.876,4.641,6.404,8.483,6.404c0.803,0,1.62-0.111,2.431-0.343l16.976-4.85 C413.409,226.934,416.123,222.048,414.784,217.361z\"></path>{\" \"}\n <path d=\"M110.118,297.68c1.108,3.877,4.642,6.404,8.483,6.404c0.803,0,1.62-0.111,2.429-0.343l16.976-4.85 c4.688-1.339,7.402-6.225,6.063-10.912c-1.338-4.686-6.224-7.407-10.912-6.062l-16.976,4.85 C111.492,288.108,108.778,292.993,110.118,297.68z\"></path>{\" \"}\n <path d=\"M223.971,298.971c-1.339,4.687,1.375,9.574,6.063,10.913l47.08,13.453c0.81,0.232,1.627,0.342,2.429,0.342 c3.841,0,7.375-2.528,8.484-6.405c1.341-4.687-1.375-9.573-6.063-10.912l-47.08-13.453 C230.202,291.567,225.312,294.284,223.971,298.971z\"></path>{\" \"}\n <path d=\"M256,229.52c4.875,0,8.828-3.951,8.828-8.828v-17.655c0-4.876-3.952-8.828-8.828-8.828s-8.828,3.951-8.828,8.828v17.655 C247.172,225.568,251.125,229.52,256,229.52z\"></path>{\" \"}\n <path d=\"M256,282.485c4.875,0,8.828-3.951,8.828-8.828v-17.655c0-4.876-3.952-8.828-8.828-8.828s-8.828,3.951-8.828,8.828v17.655 C247.172,278.534,251.125,282.485,256,282.485z\" />\n </svg>\n ),\n);\n\nBlueprint.displayName = \"Blueprint\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Bug = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"-1.44 -1.44 26.88 26.88\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.3859 2.64323C17.7411 2.43012 17.8562 1.96943 17.6431 1.61424C17.43 1.25906 16.9693 1.14388 16.6141 1.35699L14.2687 2.76426C13.582 2.43471 12.8126 2.25011 12 2.25011C11.1874 2.25011 10.418 2.43471 9.73131 2.76426L7.38587 1.35699C7.03069 1.14388 6.56999 1.25906 6.35688 1.61424C6.14377 1.96943 6.25894 2.43012 6.61413 2.64323L8.37676 3.70081C7.37449 4.65692 6.75 6.00559 6.75 7.50011V7.79077C6.49339 7.92641 6.25088 8.08518 6.02526 8.2643C5.95652 8.19683 5.87356 8.14157 5.77854 8.10356L3.77854 7.30356C3.39396 7.14973 2.95748 7.33679 2.80364 7.72137C2.64981 8.10596 2.83687 8.54244 3.22146 8.69628L4.99257 9.40472C4.52263 10.1351 4.25 11.0045 4.25 11.9376V13.2501H2C1.58579 13.2501 1.25 13.5859 1.25 14.0001C1.25 14.4143 1.58579 14.7501 2 14.7501H4.25V15.0001C4.25 16.2791 4.55983 17.4858 5.10854 18.5491L3.22146 19.304C2.83687 19.4578 2.64981 19.8943 2.80364 20.2789C2.95748 20.6634 3.39396 20.8505 3.77854 20.6967L5.77854 19.8967C5.83233 19.8752 5.88225 19.8481 5.92792 19.8164C7.34764 21.6039 9.53996 22.7501 12 22.7501C14.46 22.7501 16.6524 21.6039 18.0721 19.8164C18.1177 19.8481 18.1677 19.8752 18.2215 19.8967L20.2215 20.6967C20.606 20.8505 21.0425 20.6634 21.1964 20.2789C21.3502 19.8943 21.1631 19.4578 20.7785 19.304L18.8915 18.5491C19.4402 17.4858 19.75 16.2791 19.75 15.0001V14.7501H22C22.4142 14.7501 22.75 14.4143 22.75 14.0001C22.75 13.5859 22.4142 13.2501 22 13.2501H19.75V11.9376C19.75 11.0045 19.4774 10.1351 19.0074 9.40472L20.7785 8.69628C21.1631 8.54244 21.3502 8.10596 21.1964 7.72137C21.0425 7.33679 20.606 7.14973 20.2215 7.30356L18.2215 8.10356C18.1264 8.14157 18.0435 8.19683 17.9747 8.2643C17.7491 8.08518 17.5066 7.92641 17.25 7.79077V7.50011C17.25 6.00559 16.6255 4.65692 15.6232 3.70081L17.3859 2.64323ZM5.75 15.0001V11.9376C5.75 10.1772 7.17709 8.75011 8.9375 8.75011H15.0625C16.8229 8.75011 18.25 10.1772 18.25 11.9376V15.0001C18.25 18.1981 15.8482 20.8351 12.75 21.2056V15.0001C12.75 14.5859 12.4142 14.2501 12 14.2501C11.5858 14.2501 11.25 14.5859 11.25 15.0001V21.2056C8.15183 20.8351 5.75 18.1981 5.75 15.0001ZM12 3.75011C14.0037 3.75011 15.6404 5.32165 15.7447 7.2994C15.522 7.26693 15.2942 7.25011 15.0625 7.25011H8.9375C8.70578 7.25011 8.47799 7.26693 8.25528 7.2994C8.35958 5.32165 9.99627 3.75011 12 3.75011Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nBug.displayName = \"Bug\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Chat = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 13.7344V13H4.53906V13.6797C4.53906 14.4036 4.71875 14.9505 5.07812 15.3203C5.43229 15.6849 5.97917 15.8672 6.71875 15.8672H11.5781C11.8177 15.8672 12.0104 15.8958 12.1562 15.9531C12.2969 16.0052 12.4505 16.1146 12.6172 16.2812L15.0938 18.7344V16.5078C15.0938 16.2734 15.1458 16.1094 15.25 16.0156C15.349 15.9167 15.5078 15.8672 15.7266 15.8672H16.7969C17.5312 15.8672 18.0781 15.6849 18.4375 15.3203C18.7917 14.9505 18.9688 14.4036 18.9688 13.6797V7.71875C18.9688 7 18.7917 6.45833 18.4375 6.09375C18.0781 5.72396 17.5312 5.53906 16.7969 5.53906H14.75V4H16.8359C17.6224 4 18.2891 4.14583 18.8359 4.4375C19.3776 4.72917 19.7917 5.14844 20.0781 5.69531C20.3646 6.23698 20.5078 6.89583 20.5078 7.67188V13.7344C20.5078 14.5104 20.3646 15.1719 20.0781 15.7188C19.7865 16.2604 19.3724 16.6771 18.8359 16.9688C18.2943 17.2604 17.6458 17.4062 16.8906 17.4062H16.4688V19.3281C16.4688 19.6771 16.3828 19.9531 16.2109 20.1562C16.0339 20.3594 15.7891 20.4609 15.4766 20.4609C15.2578 20.4609 15.0521 20.4036 14.8594 20.2891C14.6667 20.1797 14.4375 20.0078 14.1719 19.7734L11.5 17.4062H6.67188C5.89062 17.4062 5.22656 17.2604 4.67969 16.9688C4.13281 16.6771 3.71615 16.2604 3.42969 15.7188C3.14323 15.1719 3 14.5104 3 13.7344ZM10.75 4H12.35V11H10.75V4ZM5.8498 4.2002C4.30341 4.2002 3.0498 5.4538 3.0498 7.0002V11.0002H4.6498V9.3002H7.5498V11.0002H9.14981V7.0002C9.14981 5.4538 7.8962 4.2002 6.3498 4.2002H5.8498ZM7.5498 7.7002V7.0002C7.5498 6.33745 7.01255 5.8002 6.3498 5.8002H5.8498C5.18706 5.8002 4.6498 6.33745 4.6498 7.0002V7.7002H7.5498Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nChat.displayName = \"Chat\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const CheckCircle = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M12.148 20.297a7.862 7.862 0 0 1-3.164-.64 8.291 8.291 0 0 1-2.601-1.75 8.198 8.198 0 0 1-1.75-2.595A7.947 7.947 0 0 1 4 12.149c0-1.125.21-2.18.633-3.164a8.227 8.227 0 0 1 4.352-4.352A7.946 7.946 0 0 1 12.147 4c1.125 0 2.18.21 3.165.633a8.134 8.134 0 0 1 2.593 1.758 8.198 8.198 0 0 1 1.75 2.593c.427.985.64 2.04.64 3.164 0 1.125-.213 2.18-.64 3.165a8.196 8.196 0 0 1-4.343 4.343c-.985.427-2.04.64-3.165.64zm0-1.79a6.283 6.283 0 0 0 4.492-1.86 6.49 6.49 0 0 0 1.368-2.03c.333-.77.5-1.594.5-2.469 0-.88-.167-1.703-.5-2.468a6.373 6.373 0 0 0-1.367-2.032 6.284 6.284 0 0 0-4.493-1.859c-.88 0-1.705.164-2.476.492a6.399 6.399 0 0 0-3.39 3.399 6.2 6.2 0 0 0-.493 2.468c0 .875.164 1.698.492 2.47a6.398 6.398 0 0 0 3.39 3.398c.772.328 1.597.492 2.477.492zm-.843-2.648a.855.855 0 0 1-.414-.101 1.276 1.276 0 0 1-.344-.297l-1.805-2.188c-.146-.182-.219-.367-.219-.554 0-.209.073-.386.22-.531a.714.714 0 0 1 .523-.22.71.71 0 0 1 .336.079c.099.052.197.138.296.258l1.391 1.75L14.25 9.28c.177-.281.398-.422.664-.422.198 0 .375.065.531.196.157.13.235.3.235.508a.67.67 0 0 1-.063.273 1.515 1.515 0 0 1-.14.273l-3.43 5.344c-.182.271-.43.406-.742.406z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nCheckCircle.displayName = \"CheckCircle\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ChevronLeft = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n version=\"1.1\"\n id=\"svg1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"m 13,3 a 1,1 0 0 0 -0.707031,0.2929688 l -6.0000003,6 a 1.0001,1.0001 0 0 0 0,1.4140622 l 6.0000003,6 a 1,1 0 0 0 1.414062,0 1,1 0 0 0 0,-1.414062 L 8.4140625,10 13.707031,4.7070312 a 1,1 0 0 0 0,-1.4140624 A 1,1 0 0 0 13,3 Z\"\n />\n </svg>\n ),\n);\n\nChevronLeft.displayName = \"ChevronLeft\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ChevronRight = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n version=\"1.1\"\n id=\"svg1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m 7,3 a 1,1 0 0 0 -0.7070313,0.2929688 1,1 0 0 0 0,1.4140624 L 11.585938,10 6.2929687,15.292969 a 1,1 0 0 0 0,1.414062 1,1 0 0 0 1.4140625,0 l 5.9999998,-6 a 1.0001,1.0001 0 0 0 0,-1.4140622 l -5.9999998,-6 A 1,1 0 0 0 7,3 Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nChevronRight.displayName = \"ChevronRight\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Clean = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M20.0967 12.3593C20.0967 13.3645 19.9274 14.3124 19.5889 15.203C19.2503 16.0937 18.7764 16.8983 18.167 17.6171C17.5628 18.3306 16.8519 18.9244 16.0342 19.3983C15.2217 19.8775 14.3389 20.203 13.3857 20.3749V21.3202C13.3857 21.5181 13.3389 21.6666 13.2451 21.7655C13.1566 21.8645 13.042 21.9114 12.9014 21.9062C12.7607 21.9062 12.6149 21.8515 12.4639 21.7421L9.91699 19.8827C9.74512 19.7577 9.65918 19.6067 9.65918 19.4296C9.66439 19.2577 9.75033 19.1093 9.91699 18.9843L12.4717 17.1249C12.6175 17.0207 12.7607 16.966 12.9014 16.9608C13.042 16.9556 13.1566 17.0051 13.2451 17.1093C13.3389 17.2082 13.3857 17.3541 13.3857 17.5468V18.5312C14.0889 18.3749 14.7399 18.1093 15.3389 17.7343C15.9378 17.3541 16.4587 16.8905 16.9014 16.3437C17.3441 15.7916 17.6878 15.1796 17.9326 14.5077C18.1826 13.8306 18.3076 13.1145 18.3076 12.3593C18.3076 11.5155 18.1488 10.7213 17.8311 9.97646C17.5133 9.23167 17.0785 8.58063 16.5264 8.02334C16.3232 7.77855 16.2321 7.54417 16.2529 7.32021C16.279 7.09626 16.3649 6.91136 16.5107 6.76553C16.6774 6.59886 16.891 6.51032 17.1514 6.4999C17.4118 6.48949 17.641 6.60146 17.8389 6.83584C18.5368 7.53896 19.0863 8.36709 19.4873 9.32021C19.8936 10.2681 20.0967 11.2812 20.0967 12.3593ZM3.7998 12.3593C3.7998 11.3541 3.96908 10.4062 4.30762 9.51553C4.64616 8.61969 5.12012 7.81501 5.72949 7.10146C6.33887 6.38271 7.0498 5.78636 7.8623 5.3124C8.6748 4.83324 9.55762 4.51032 10.5107 4.34365V3.39834C10.5107 3.19521 10.555 3.04417 10.6436 2.94521C10.7373 2.84626 10.8545 2.79938 10.9951 2.80459C11.1357 2.80459 11.279 2.85928 11.4248 2.96865L13.9795 4.83584C14.1514 4.96084 14.2373 5.11188 14.2373 5.28896C14.2373 5.46084 14.1514 5.60928 13.9795 5.73428L11.4248 7.59365C11.279 7.69782 11.1357 7.75251 10.9951 7.75771C10.8545 7.76292 10.7373 7.71605 10.6436 7.61709C10.555 7.51292 10.5107 7.36449 10.5107 7.17178V6.1874C9.80762 6.34365 9.15658 6.61188 8.55762 6.99209C7.95866 7.36709 7.43522 7.83063 6.9873 8.38271C6.5446 8.92959 6.20085 9.54157 5.95605 10.2187C5.71126 10.8905 5.58887 11.6041 5.58887 12.3593C5.58887 13.203 5.74772 13.9973 6.06543 14.7421C6.38314 15.4869 6.81803 16.1353 7.37012 16.6874C7.57324 16.9374 7.66178 17.1744 7.63574 17.3983C7.6097 17.6223 7.52637 17.8046 7.38574 17.9452C7.21908 18.1119 7.00553 18.2004 6.74512 18.2108C6.4847 18.2265 6.25293 18.1171 6.0498 17.8827C5.35189 17.1744 4.80241 16.3463 4.40137 15.3983C4.00033 14.4452 3.7998 13.4322 3.7998 12.3593Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nClean.displayName = \"Clean\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Close = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.9393 12L6.9696 15.9697L8.03026 17.0304L12 13.0607L15.9697 17.0304L17.0304 15.9697L13.0607 12L17.0303 8.03039L15.9696 6.96973L12 10.9393L8.03038 6.96973L6.96972 8.03039L10.9393 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nClose.displayName = \"Close\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Close1 = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M 7.1576421,16.842346 C 7.0128266,16.697531 6.9404471,16.523413 6.9405037,16.319992 6.9404401,16.108631 7.010882,15.932547 7.1517448,15.791685 L 10.949318,11.994111 7.1576138,8.2024065 C 7.016751,8.0615437 6.9463585,7.8893279 6.9463727,7.6858367 6.9423987,7.4784988 7.0128266,7.3024292 7.1576421,7.1576138 7.3024575,7.0127983 7.4785271,6.9423705 7.685865,6.9463444 c 0.2074509,-0.00397 0.381576,0.064509 0.5224387,0.2053721 l 3.7917043,3.7917045 3.791719,-3.7917186 c 0.140856,-0.1408557 0.314945,-0.2093037 0.52241,-0.2053439 0.207324,-0.00396 0.383394,0.066468 0.528209,0.2112836 0.144816,0.1448154 0.215244,0.320885 0.211284,0.5282087 0,0.2035053 -0.07036,0.3756859 -0.211213,0.5165415 l -3.791719,3.7917187 3.797588,3.797588 c 0.140856,0.140855 0.209304,0.314945 0.205344,0.52241 0.004,0.207324 -0.06647,0.383393 -0.211284,0.528209 -0.144815,0.144815 -0.320885,0.215243 -0.528209,0.211283 -0.203505,0 -0.375685,-0.07036 -0.516541,-0.211212 l -3.797588,-3.797588 -3.7975733,3.797574 c -0.1408627,0.140862 -0.3150372,0.213213 -0.5224387,0.21711 -0.2034205,5.6e-5 -0.3775385,-0.07232 -0.5223539,-0.217139 z\"\n fill=\"#000000\"\n />\n </svg>\n ),\n);\n\nClose1.displayName = \"Close1\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const CloudOff = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n version=\"1.1\"\n id=\"svg1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"m 3,2 a 1,1 0 0 0 -0.7070312,0.2929688 1,1 0 0 0 0,1.4140625 L 6.421875,7.8359375 C 3.7890261,8.6864035 2,11.020131 2,13.648438 2,17.148958 4.8825427,20 8.4003906,20 H 16.5 c 0.603655,0 1.13929,-0.219048 1.685547,-0.400391 l 2.107422,2.107422 a 1,1 0 0 0 1.414062,0 1,1 0 0 0 0,-1.414062 L 3.7070313,2.2929688 A 1,1 0 0 0 3,2 Z m 9.689453,2 C 11.95139,4 11.239375,4.1262891 10.576172,4.3554687 A 1,1 0 0 0 9.9570313,5.6269531 1,1 0 0 0 11.228516,6.2460937 C 11.688112,6.0872734 12.177916,6 12.689453,6 c 2.477673,0 4.473176,1.9035485 4.611328,4.306641 a 1.0001,1.0001 0 0 0 0.597656,0.859375 C 19.094175,11.688836 20,13.050483 20,14.496094 c 0,0.221516 -0.01982,0.437827 -0.05859,0.646484 a 1,1 0 0 0 0.800781,1.166016 1,1 0 0 0 1.164063,-0.800781 C 21.967272,15.17947 22,14.840578 22,14.496094 22,12.476021 20.840455,10.737125 19.185547,9.7519531 18.765591,6.5230229 16.041315,4 12.689453,4 Z M 7.890625,9.3046875 16.570312,17.984375 C 16.545108,17.984904 16.525359,18 16.5,18 H 8.4003906 C 5.9535585,18 4,16.058117 4,13.648438 4,11.689193 5.4282505,9.8479795 7.6601562,9.4863281 A 1.0001,1.0001 0 0 0 7.890625,9.3046875 Z\"\n />\n </svg>\n ),\n);\n\nCloudOff.displayName = \"CloudOff\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Cog = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M.63 11.08zm.21.41v-.1zm.23.38L1 11.68zM1 11.68l-.11-.19zm-.21-.29c-.06-.1-.11-.21-.16-.31.05.1.1.21.16.31zm.32.54v-.06z\"></path>\n <path d=\"m11.26 12.63 1.83 1.09a7.34 7.34 0 0 0 1-.94 7.48 7.48 0 0 0 1.56-2.86l-1.74-1A5.29 5.29 0 0 0 14 8a5.29 5.29 0 0 0-.08-.9l1.74-1a7.45 7.45 0 0 0-1.33-2.58 7.54 7.54 0 0 0-1.24-1.22l-1.83 1.04a6 6 0 0 0-1.11-.53v-2A8.55 8.55 0 0 0 7.94.53a8.39 8.39 0 0 0-2.26.3v2a7.23 7.23 0 0 0-1.12.54L2.78 2.28A7.46 7.46 0 0 0 .2 6.06l1.72 1a5.29 5.29 0 0 0-.08.9 5.29 5.29 0 0 0 .08.9l-1.73 1a8 8 0 0 0 .43 1.15c.05.1.1.21.16.31v.1l.11.19.12.19v.06a7.69 7.69 0 0 0 1.64 1.78l1.81-1.08a7.23 7.23 0 0 0 1.12.54v2a8.39 8.39 0 0 0 2.26.31 8.56 8.56 0 0 0 2.22-.3v-2a6 6 0 0 0 1.2-.48zm-2.39 1.52a7.57 7.57 0 0 1-.95.06 7.73 7.73 0 0 1-1-.06v-1.69a4.92 4.92 0 0 1-2.53-1.27l-1.54.92a6.22 6.22 0 0 1-1.08-1.61l1.56-.93a4.27 4.27 0 0 1 0-3.17l-1.56-.92a6.11 6.11 0 0 1 1.12-1.62l1.56.93A5 5 0 0 1 7 3.53V1.82a7.73 7.73 0 0 1 1-.06 7.57 7.57 0 0 1 .95.06v1.72a4.9 4.9 0 0 1 2.4 1.26l1.59-.94a6.31 6.31 0 0 1 1.11 1.62l-1.6.94a4.35 4.35 0 0 1 .3 1.58 4.44 4.44 0 0 1-.29 1.55l1.56.93a6.43 6.43 0 0 1-1.11 1.61l-1.58-.93a5 5 0 0 1-2.49 1.28z\"></path>\n <path d=\"M7.92 5.49A2.59 2.59 0 0 0 5.25 8a2.59 2.59 0 0 0 2.67 2.51A2.6 2.6 0 0 0 10.6 8a2.6 2.6 0 0 0-2.68-2.51zM8 9.2A1.35 1.35 0 0 1 6.55 8 1.35 1.35 0 0 1 8 6.7 1.35 1.35 0 0 1 9.39 8 1.35 1.35 0 0 1 8 9.2z\"></path>\n </svg>\n ),\n);\n\nCog.displayName = \"Cog\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Complete = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"#000000\"\n viewBox=\"0 0 1920 1920\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M960 1807.059c-467.125 0-847.059-379.934-847.059-847.059 0-467.125 379.934-847.059 847.059-847.059 467.125 0 847.059 379.934 847.059 847.059 0 467.125-379.934 847.059-847.059 847.059M960 0C430.645 0 0 430.645 0 960s430.645 960 960 960 960-430.645 960-960S1489.355 0 960 0M854.344 1157.975 583.059 886.69l-79.85 79.85 351.135 351.133L1454.4 717.617l-79.85-79.85-520.206 520.208Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nComplete.displayName = \"Complete\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Container = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 36 36\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M32,30H4a2,2,0,0,1-2-2V8A2,2,0,0,1,4,6H32a2,2,0,0,1,2,2V28A2,2,0,0,1,32,30ZM4,8V28H32V8Z\" />\n <path d=\"M9,25.3a.8.8,0,0,1-.8-.8v-13a.8.8,0,0,1,1.6,0v13A.8.8,0,0,1,9,25.3Z\" />\n <path d=\"M14.92,25.3a.8.8,0,0,1-.8-.8v-13a.8.8,0,0,1,1.6,0v13A.8.8,0,0,1,14.92,25.3Z\" />\n <path d=\"M21,25.3a.8.8,0,0,1-.8-.8v-13a.8.8,0,0,1,1.6,0v13A.8.8,0,0,1,21,25.3Z\" />\n <path d=\"M27,25.3a.8.8,0,0,1-.8-.8v-13a.8.8,0,0,1,1.6,0v13A.8.8,0,0,1,27,25.3Z\" />\n </svg>\n ),\n);\n\nContainer.displayName = \"Container\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const CopyClipboard = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M15 1.25H10.9436C9.10583 1.24998 7.65019 1.24997 6.51098 1.40314C5.33856 1.56076 4.38961 1.89288 3.64124 2.64124C2.89288 3.38961 2.56076 4.33856 2.40314 5.51098C2.24997 6.65019 2.24998 8.10582 2.25 9.94357V16C2.25 17.8722 3.62205 19.424 5.41551 19.7047C5.55348 20.4687 5.81753 21.1208 6.34835 21.6517C6.95027 22.2536 7.70814 22.5125 8.60825 22.6335C9.47522 22.75 10.5775 22.75 11.9451 22.75H15.0549C16.4225 22.75 17.5248 22.75 18.3918 22.6335C19.2919 22.5125 20.0497 22.2536 20.6517 21.6517C21.2536 21.0497 21.5125 20.2919 21.6335 19.3918C21.75 18.5248 21.75 17.4225 21.75 16.0549V10.9451C21.75 9.57754 21.75 8.47522 21.6335 7.60825C21.5125 6.70814 21.2536 5.95027 20.6517 5.34835C20.1208 4.81753 19.4687 4.55348 18.7047 4.41551C18.424 2.62205 16.8722 1.25 15 1.25ZM17.1293 4.27117C16.8265 3.38623 15.9876 2.75 15 2.75H11C9.09318 2.75 7.73851 2.75159 6.71085 2.88976C5.70476 3.02502 5.12511 3.27869 4.7019 3.7019C4.27869 4.12511 4.02502 4.70476 3.88976 5.71085C3.75159 6.73851 3.75 8.09318 3.75 10V16C3.75 16.9876 4.38624 17.8265 5.27117 18.1293C5.24998 17.5194 5.24999 16.8297 5.25 16.0549V10.9451C5.24998 9.57754 5.24996 8.47522 5.36652 7.60825C5.48754 6.70814 5.74643 5.95027 6.34835 5.34835C6.95027 4.74643 7.70814 4.48754 8.60825 4.36652C9.47522 4.24996 10.5775 4.24998 11.9451 4.25H15.0549C15.8297 4.24999 16.5194 4.24998 17.1293 4.27117ZM7.40901 6.40901C7.68577 6.13225 8.07435 5.9518 8.80812 5.85315C9.56347 5.75159 10.5646 5.75 12 5.75H15C16.4354 5.75 17.4365 5.75159 18.1919 5.85315C18.9257 5.9518 19.3142 6.13225 19.591 6.40901C19.8678 6.68577 20.0482 7.07435 20.1469 7.80812C20.2484 8.56347 20.25 9.56458 20.25 11V16C20.25 17.4354 20.2484 18.4365 20.1469 19.1919C20.0482 19.9257 19.8678 20.3142 19.591 20.591C19.3142 20.8678 18.9257 21.0482 18.1919 21.1469C17.4365 21.2484 16.4354 21.25 15 21.25H12C10.5646 21.25 9.56347 21.2484 8.80812 21.1469C8.07435 21.0482 7.68577 20.8678 7.40901 20.591C7.13225 20.3142 6.9518 19.9257 6.85315 19.1919C6.75159 18.4365 6.75 17.4354 6.75 16V11C6.75 9.56458 6.75159 8.56347 6.85315 7.80812C6.9518 7.07435 7.13225 6.68577 7.40901 6.40901Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nCopyClipboard.displayName = \"CopyClipboard\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Dashboard = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n id=\"meteor-icon-kit__solid-dashboard\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M2 0H7C8.10457 0 9 0.89543 9 2V7C9 8.10457 8.10457 9 7 9H2C0.89543 9 0 8.10457 0 7V2C0 0.89543 0.89543 0 2 0ZM2 11H7C8.10457 11 9 11.8954 9 13V22C9 23.1046 8.10457 24 7 24H2C0.89543 24 0 23.1046 0 22V13C0 11.8954 0.89543 11 2 11ZM13 0H22C23.1046 0 24 0.89543 24 2V13C24 14.1046 23.1046 15 22 15H13C11.8954 15 11 14.1046 11 13V2C11 0.89543 11.8954 0 13 0ZM13 17H22C23.1046 17 24 17.8954 24 19V22C24 23.1046 23.1046 24 22 24H13C11.8954 24 11 23.1046 11 22V19C11 17.8954 11.8954 17 13 17Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nDashboard.displayName = \"Dashboard\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Details = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 36 36\"\n version=\"1.1\"\n preserveAspectRatio=\"xMidYMid meet\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M32,6H4A2,2,0,0,0,2,8V28a2,2,0,0,0,2,2H32a2,2,0,0,0,2-2V8A2,2,0,0,0,32,6Zm0,22H4V8H32Z\"\n className=\"clr-i-outline clr-i-outline-path-1\"\n ></path>\n <path\n d=\"M9,14H27a1,1,0,0,0,0-2H9a1,1,0,0,0,0,2Z\"\n className=\"clr-i-outline clr-i-outline-path-2\"\n ></path>\n <path\n d=\"M9,18H27a1,1,0,0,0,0-2H9a1,1,0,0,0,0,2Z\"\n className=\"clr-i-outline clr-i-outline-path-3\"\n ></path>\n <path\n d=\"M9,22H19a1,1,0,0,0,0-2H9a1,1,0,0,0,0,2Z\"\n className=\"clr-i-outline clr-i-outline-path-4\"\n ></path>\n <rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" fill-opacity=\"0\"></rect>\n </svg>\n ),\n);\n\nDetails.displayName = \"Details\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const DockerCopy = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"#ff0000\"\n d=\"M12.342 4.536l.15-.227.262.159.116.083c.28.216.869.768.996 1.684.223-.04.448-.06.673-.06.534 0 .893.124 1.097.227l.105.057.068.045.191.156-.066.2a2.044 2.044 0 01-.47.73c-.29.299-.8.652-1.609.698l-.178.005h-.148c-.37.977-.867 2.078-1.702 3.066a7.081 7.081 0 01-1.74 1.488 7.941 7.941 0 01-2.549.968c-.644.125-1.298.187-1.953.185-1.45 0-2.73-.288-3.517-.792-.703-.449-1.243-1.182-1.606-2.177a8.25 8.25 0 01-.461-2.83.516.516 0 01.432-.516l.068-.005h10.54l.092-.007.149-.016c.256-.034.646-.11.92-.27-.328-.543-.421-1.178-.268-1.854a3.3 3.3 0 01.3-.81l.108-.187zM2.89 5.784l.04.007a.127.127 0 01.077.082l.006.04v1.315l-.006.041a.127.127 0 01-.078.082l-.039.006H1.478a.124.124 0 01-.117-.088l-.007-.04V5.912l.007-.04a.127.127 0 01.078-.083l.039-.006H2.89zm1.947 0l.039.007a.127.127 0 01.078.082l.006.04v1.315l-.007.041a.127.127 0 01-.078.082l-.039.006H3.424a.125.125 0 01-.117-.088L3.3 7.23V5.913a.13.13 0 01.085-.123l.039-.007h1.413zm1.976 0l.039.007a.127.127 0 01.077.082l.007.04v1.315l-.007.041a.127.127 0 01-.078.082l-.039.006H5.4a.124.124 0 01-.117-.088l-.006-.04V5.912l.006-.04a.127.127 0 01.078-.083l.039-.006h1.413zm1.952 0l.039.007a.127.127 0 01.078.082l.007.04v1.315a.13.13 0 01-.085.123l-.04.006H7.353a.124.124 0 01-.117-.088l-.006-.04V5.912l.006-.04a.127.127 0 01.078-.083l.04-.006h1.412zm1.97 0l.039.007a.127.127 0 01.078.082l.006.04v1.315a.13.13 0 01-.085.123l-.039.006H9.322a.124.124 0 01-.117-.088l-.006-.04V5.912l.006-.04a.127.127 0 01.078-.083l.04-.006h1.411zM4.835 3.892l.04.007a.127.127 0 01.077.081l.007.041v1.315a.13.13 0 01-.085.123l-.039.007H3.424a.125.125 0 01-.117-.09l-.007-.04V4.021a.13.13 0 01.085-.122l.039-.007h1.412zm1.976 0l.04.007a.127.127 0 01.077.081l.007.041v1.315a.13.13 0 01-.085.123l-.039.007H5.4a.125.125 0 01-.117-.09l-.006-.04V4.021l.006-.04a.127.127 0 01.078-.082l.039-.007h1.412zm1.953 0c.054 0 .1.037.117.088l.007.041v1.315a.13.13 0 01-.085.123l-.04.007H7.353a.125.125 0 01-.117-.09l-.006-.04V4.021l.006-.04a.127.127 0 01.078-.082l.04-.007h1.412zm0-1.892c.054 0 .1.037.117.088l.007.04v1.316a.13.13 0 01-.085.123l-.04.006H7.353a.124.124 0 01-.117-.088l-.006-.04V2.128l.006-.04a.127.127 0 01.078-.082L7.353 2h1.412z\"\n ></path>\n </svg>\n ),\n);\n\nDockerCopy.displayName = \"DockerCopy\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Docker = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"#ff0000\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M12.342 4.536l.15-.227.262.159.116.083c.28.216.869.768.996 1.684.223-.04.448-.06.673-.06.534 0 .893.124 1.097.227l.105.057.068.045.191.156-.066.2a2.044 2.044 0 01-.47.73c-.29.299-.8.652-1.609.698l-.178.005h-.148c-.37.977-.867 2.078-1.702 3.066a7.081 7.081 0 01-1.74 1.488 7.941 7.941 0 01-2.549.968c-.644.125-1.298.187-1.953.185-1.45 0-2.73-.288-3.517-.792-.703-.449-1.243-1.182-1.606-2.177a8.25 8.25 0 01-.461-2.83.516.516 0 01.432-.516l.068-.005h10.54l.092-.007.149-.016c.256-.034.646-.11.92-.27-.328-.543-.421-1.178-.268-1.854a3.3 3.3 0 01.3-.81l.108-.187zM2.89 5.784l.04.007a.127.127 0 01.077.082l.006.04v1.315l-.006.041a.127.127 0 01-.078.082l-.039.006H1.478a.124.124 0 01-.117-.088l-.007-.04V5.912l.007-.04a.127.127 0 01.078-.083l.039-.006H2.89zm1.947 0l.039.007a.127.127 0 01.078.082l.006.04v1.315l-.007.041a.127.127 0 01-.078.082l-.039.006H3.424a.125.125 0 01-.117-.088L3.3 7.23V5.913a.13.13 0 01.085-.123l.039-.007h1.413zm1.976 0l.039.007a.127.127 0 01.077.082l.007.04v1.315l-.007.041a.127.127 0 01-.078.082l-.039.006H5.4a.124.124 0 01-.117-.088l-.006-.04V5.912l.006-.04a.127.127 0 01.078-.083l.039-.006h1.413zm1.952 0l.039.007a.127.127 0 01.078.082l.007.04v1.315a.13.13 0 01-.085.123l-.04.006H7.353a.124.124 0 01-.117-.088l-.006-.04V5.912l.006-.04a.127.127 0 01.078-.083l.04-.006h1.412zm1.97 0l.039.007a.127.127 0 01.078.082l.006.04v1.315a.13.13 0 01-.085.123l-.039.006H9.322a.124.124 0 01-.117-.088l-.006-.04V5.912l.006-.04a.127.127 0 01.078-.083l.04-.006h1.411zM4.835 3.892l.04.007a.127.127 0 01.077.081l.007.041v1.315a.13.13 0 01-.085.123l-.039.007H3.424a.125.125 0 01-.117-.09l-.007-.04V4.021a.13.13 0 01.085-.122l.039-.007h1.412zm1.976 0l.04.007a.127.127 0 01.077.081l.007.041v1.315a.13.13 0 01-.085.123l-.039.007H5.4a.125.125 0 01-.117-.09l-.006-.04V4.021l.006-.04a.127.127 0 01.078-.082l.039-.007h1.412zm1.953 0c.054 0 .1.037.117.088l.007.041v1.315a.13.13 0 01-.085.123l-.04.007H7.353a.125.125 0 01-.117-.09l-.006-.04V4.021l.006-.04a.127.127 0 01.078-.082l.04-.007h1.412zm0-1.892c.054 0 .1.037.117.088l.007.04v1.316a.13.13 0 01-.085.123l-.04.006H7.353a.124.124 0 01-.117-.088l-.006-.04V2.128l.006-.04a.127.127 0 01.078-.082L7.353 2h1.412z\"\n ></path>\n </svg>\n ),\n);\n\nDocker.displayName = \"Docker\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Dots = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M6.555 14.008c-.308 0-.586-.073-.836-.219a1.75 1.75 0 0 1-.602-.601 1.613 1.613 0 0 1-.219-.829c0-.307.073-.586.22-.836.15-.25.35-.447.6-.593.25-.151.53-.227.837-.227.302 0 .578.076.828.227.25.146.448.343.594.593.15.25.226.53.226.836 0 .303-.075.579-.226.829a1.614 1.614 0 0 1-1.422.82zm5.86 0c-.303 0-.58-.073-.83-.219a1.75 1.75 0 0 1-.6-.601 1.613 1.613 0 0 1-.22-.829c0-.307.073-.586.22-.836.15-.25.35-.447.6-.593a1.57 1.57 0 0 1 .83-.227c.301 0 .577.076.827.227.255.146.456.343.602.593.15.25.226.53.226.836 0 .303-.075.579-.226.829-.146.25-.347.45-.602.601-.25.146-.526.219-.828.219zm5.866 0c-.307 0-.586-.073-.836-.219a1.75 1.75 0 0 1-.601-.601 1.613 1.613 0 0 1-.219-.829c0-.307.073-.586.219-.836.15-.25.351-.447.601-.593.25-.151.529-.227.836-.227.302 0 .578.076.828.227.25.146.45.343.602.593.151.25.227.53.227.836 0 .303-.076.579-.227.829a1.75 1.75 0 0 1-.602.601c-.25.146-.526.219-.828.219z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nDots.displayName = \"Dots\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Download = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.553 2.695a.64.64 0 0 0-.469-.195.633.633 0 0 0-.475.195.625.625 0 0 0-.195.456v6.478l.052.957-.326-.436-.865-.931a.58.58 0 0 0-.443-.189.598.598 0 0 0-.41.156.515.515 0 0 0-.176.404c0 .156.06.297.182.423l2.136 2.05a.709.709 0 0 0 .26.177.665.665 0 0 0 .514 0 .788.788 0 0 0 .26-.176l2.136-2.051a.595.595 0 0 0 .182-.423c0-.165-.056-.3-.169-.404a.598.598 0 0 0-.41-.156.6.6 0 0 0-.45.189l-.872.93-.325.437.059-.957V3.15a.625.625 0 0 0-.196-.456zM4.726 16.257c.378.373.927.56 1.648.56h7.513c.72 0 1.267-.187 1.64-.56.378-.374.567-.916.567-1.628V8.288c0-.716-.19-1.259-.567-1.628-.373-.373-.92-.56-1.64-.56h-1.862v1.446h1.738c.282 0 .499.073.65.22.153.144.229.366.229.665v6.048c0 .3-.076.521-.228.664-.152.148-.369.222-.651.222H6.49c-.287 0-.506-.074-.658-.222-.147-.143-.221-.364-.221-.664V8.431c0-.3.074-.52.221-.664.152-.148.371-.221.658-.221h1.738V6.1H6.374c-.72 0-1.27.187-1.648.56-.373.37-.56.912-.56 1.628v6.34c0 .713.187 1.255.56 1.628z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nDownload.displayName = \"Download\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Edit = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n version=\"1.1\"\n id=\"svg2\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"m 19.472656,1.1640625 c -0.44982,0.00947 -0.894876,0.1094418 -1.304687,0.2949219 -0.409924,0.1854726 -0.776127,0.4535327 -1.080078,0.7851562 L 17.109375,2.21875 7.5585937,11.769531 C 6.8612273,12.466898 6.546933,13.495805 6.3828125,14.5 c -0.08206,0.502097 -0.1135749,0.992864 -0.072266,1.447266 0.041309,0.454402 0.112561,0.897717 0.4980468,1.283203 0.3861895,0.386189 0.8305249,0.457876 1.2851563,0.498047 0.4546314,0.04017 0.9472152,0.0073 1.4492188,-0.07617 1.0040072,-0.16687 2.0301232,-0.485202 2.7265622,-1.181641 L 21.785156,6.9550781 C 22.117681,6.6519719 22.385677,6.2842429 22.572266,5.875 22.758696,5.4658203 22.860378,5.0221149 22.871094,4.5722656 22.88181,4.1223759 22.801586,3.6754052 22.634766,3.2578125 22.46785,2.8399944 22.21798,2.4610707 21.900391,2.1425781 21.58274,1.8240241 21.202454,1.5723647 20.785156,1.4042969 20.367832,1.2362182 19.922349,1.1546014 19.472656,1.1640625 Z m 0.03125,1.5 c 0.247107,-0.0052 0.491428,0.038518 0.720703,0.1308594 0.229303,0.092352 0.438732,0.231204 0.613282,0.40625 0.17461,0.1751074 0.310659,0.3837793 0.402343,0.6132812 0.09178,0.2297473 0.136743,0.475646 0.13086,0.7226563 -0.0059,0.2470507 -0.06149,0.4897234 -0.164063,0.7148437 -0.102611,0.2250571 -0.248965,0.4272363 -0.43164,0.59375 A 0.750075,0.750075 0 0 0 20.75,5.8691406 l -9.541016,9.5410154 c -0.253561,0.253561 -1.111101,0.628589 -1.912109,0.761719 -0.4005039,0.06657 -0.7912664,0.08733 -1.0722656,0.0625 -0.2809992,-0.02483 -0.4247051,-0.135643 -0.3535157,-0.06445 0.070486,0.07049 -0.040841,-0.0762 -0.066406,-0.357422 -0.025566,-0.281223 -0.00685,-0.671863 0.058594,-1.072266 0.1308796,-0.800805 0.505179,-1.657522 0.7578126,-1.910156 L 18.169922,3.28125 a 0.750075,0.750075 0 0 0 0.02344,-0.025391 c 0.167049,-0.1822565 0.368474,-0.3277601 0.59375,-0.4296875 0.225189,-0.10192 0.469618,-0.1569034 0.716797,-0.1621094 z\" />\n <path d=\"M 6,3.25 C 4.74051,3.25 3.531209,3.750041 2.640625,4.640625 1.7500557,5.5312062 1.25,6.740477 1.25,8 v 10 c 0,1.259547 0.5000374,2.468835 1.390625,3.359375 C 3.5312156,22.250025 4.7405194,22.75 6,22.75 h 11 c 1.30862,0 2.362743,-0.60616 2.957031,-1.515625 C 20.55132,20.32491 20.75,19.189773 20.75,18 V 13 A 0.75,0.75 0 0 0 20,12.25 0.75,0.75 0 0 0 19.25,13 v 5 c 0,1.010227 -0.195616,1.873528 -0.548828,2.414062 C 18.34796,20.954597 17.90138,21.25 17,21.25 H 6 C 5.1377406,21.25 4.3108813,20.908578 3.7011719,20.298828 3.0914795,19.689168 2.75,18.862253 2.75,18 V 8 C 2.75,7.137783 3.0914612,6.3108907 3.7011719,5.7011719 4.3108879,5.0914558 5.13775,4.75 6,4.75 h 5 A 0.75,0.75 0 0 0 11.75,4 0.75,0.75 0 0 0 11,3.25 Z\" />\n </svg>\n ),\n);\n\nEdit.displayName = \"Edit\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Equal = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n version=\"1.1\"\n id=\"svg2\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"m 9,9 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 6 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\"\n />\n <path\n fill=\"currentColor\"\n d=\"m 9,13 a 1,1 0 0 0 -1,1 1,1 0 0 0 1,1 h 6 a 1,1 0 0 0 1,-1 1,1 0 0 0 -1,-1 z\"\n />\n </svg>\n ),\n);\n\nEqual.displayName = \"Equal\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Error = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M6.084 20c-.433 0-.804-.095-1.115-.284-.31-.19-.55-.448-.717-.774A2.298 2.298 0 0 1 4 17.86c0-.384.1-.752.298-1.105L10.22 6.082a1.96 1.96 0 0 1 .771-.806C11.313 5.092 11.65 5 12 5s.684.092 1 .276c.32.18.58.448.779.806l5.923 10.673c.097.174.17.355.222.545a2.298 2.298 0 0 1-.176 1.642 1.916 1.916 0 0 1-.718.774c-.31.19-.681.284-1.114.284H6.084zm5.924-5.282c.397 0 .598-.215.603-.647l.114-4.295a.658.658 0 0 0-.206-.513A.692.692 0 0 0 12 9.05a.715.715 0 0 0-.527.205.683.683 0 0 0-.19.513l.099 4.303c.01.432.219.647.626.647zm0 2.645a.826.826 0 0 0 .595-.245.793.793 0 0 0 .26-.6.793.793 0 0 0-.26-.6.813.813 0 0 0-.595-.252.821.821 0 0 0-.603.252.82.82 0 0 0-.252.6c0 .237.084.437.252.6a.852.852 0 0 0 .603.245z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nError.displayName = \"Error\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Export = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M7.64062 21.0547C6.77604 21.0547 6.11719 20.8307 5.66406 20.3828C5.21615 19.9349 4.99219 19.2839 4.99219 18.4297V10.8203C4.99219 9.96094 5.21615 9.3099 5.66406 8.86719C6.11719 8.41927 6.77604 8.19531 7.64062 8.19531H9.86719V9.92969H7.78125C7.4375 9.92969 7.17448 10.0182 6.99219 10.1953C6.8151 10.3672 6.72656 10.6328 6.72656 10.9922V18.25C6.72656 18.6094 6.8151 18.875 6.99219 19.0469C7.17448 19.224 7.4375 19.3125 7.78125 19.3125H16.5078C16.8464 19.3125 17.1068 19.224 17.2891 19.0469C17.4714 18.875 17.5625 18.6094 17.5625 18.25V10.9922C17.5625 10.6328 17.4714 10.3672 17.2891 10.1953C17.1068 10.0182 16.8464 9.92969 16.5078 9.92969H14.4219V8.19531H16.6562C17.5208 8.19531 18.1771 8.41927 18.625 8.86719C19.0781 9.3099 19.3047 9.96094 19.3047 10.8203V18.4297C19.3047 19.2839 19.0781 19.9349 18.625 20.3828C18.1771 20.8307 17.5208 21.0547 16.6562 21.0547H7.64062ZM12.1406 14.625C11.9219 14.625 11.7344 14.5469 11.5781 14.3906C11.4219 14.2344 11.3438 14.0521 11.3438 13.8438V6.07031L11.4141 4.92188L11.0234 5.44531L9.97656 6.5625C9.83073 6.71354 9.65104 6.78906 9.4375 6.78906C9.25 6.78906 9.08594 6.72656 8.94531 6.60156C8.8099 6.47656 8.74219 6.3151 8.74219 6.11719C8.74219 5.92969 8.8151 5.76042 8.96094 5.60938L11.5234 3.14844C11.6328 3.04427 11.737 2.97396 11.8359 2.9375C11.9349 2.89583 12.0365 2.875 12.1406 2.875C12.25 2.875 12.3542 2.89583 12.4531 2.9375C12.5573 2.97396 12.6615 3.04427 12.7656 3.14844L15.3281 5.60938C15.474 5.76042 15.5469 5.92969 15.5469 6.11719C15.5469 6.3151 15.4766 6.47656 15.3359 6.60156C15.1953 6.72656 15.0312 6.78906 14.8438 6.78906C14.6302 6.78906 14.4531 6.71354 14.3125 6.5625L13.2734 5.44531L12.8828 4.92188L12.9453 6.07031V13.8438C12.9453 14.0521 12.8672 14.2344 12.7109 14.3906C12.5599 14.5469 12.3698 14.625 12.1406 14.625Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nExport.displayName = \"Export\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const EyeClosed = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n version=\"1.1\"\n id=\"svg1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"m 3,2.25 a 0.75,0.75 0 0 0 -0.53125,0.21875 0.75,0.75 0 0 0 0,1.0625 l 18,18 a 0.75,0.75 0 0 0 1.0625,0 0.75,0.75 0 0 0 0,-1.0625 l -18,-18 A 0.75,0.75 0 0 0 3,2.25 Z m 9,2 c -0.370699,0 -0.734042,0.02108 -1.087891,0.0625 -0.372135,0.043564 -0.733865,0.1094654 -1.0859371,0.1933594 A 0.75,0.75 0 0 0 9.2695313,5.4101562 0.75,0.75 0 0 0 10.173828,5.9648437 C 10.470556,5.8941377 10.775626,5.83929 11.087891,5.8027344 11.384842,5.7679745 11.688299,5.75 12,5.75 c 5.519095,0 8.746379,5.65946 9.082031,6.261719 -0.149,0.272042 -0.564523,1.085755 -1.648437,2.330078 a 0.75,0.75 0 0 0 0.07422,1.056641 0.75,0.75 0 0 0 1.058594,-0.07227 c 1.366418,-1.568633 2.09961,-2.980469 2.09961,-2.980469 a 0.750075,0.750075 0 0 0 0,-0.691406 C 22.666016,11.654297 18.913603,4.25 12,4.25 Z m 0,4 A 0.75,0.75 0 0 0 11.25,9 0.75,0.75 0 0 0 12,9.75 c 0.264818,0 0.516006,0.044247 0.75,0.1269531 C 13.387645,10.102328 13.89765,10.612336 14.123047,11.25 14.205757,11.484134 14.25,11.735253 14.25,12 A 0.75,0.75 0 0 0 15,12.75 0.75,0.75 0 0 0 15.75,12 c 0,-0.436453 -0.0746,-0.858534 -0.212891,-1.25 C 15.159906,9.6828644 14.317155,8.8400755 13.25,8.4628906 12.858394,8.3244766 12.436382,8.25 12,8.25 Z m -7.8945313,0.00195 A 0.75,0.75 0 0 0 3.5878906,8.5 C 3.2657323,8.8600661 2.9766988,9.2119003 2.7226563,9.5429688 h 0.00195 C 1.8221237,10.719 1.3339844,11.654297 1.3339844,11.654297 a 0.750075,0.750075 0 0 0 0,0.691406 c 0,0 3.7523759,7.404297 10.6660156,7.404297 0.370655,0 0.733981,-0.02106 1.087891,-0.0625 a 0.75,0.75 0 0 0 0.65625,-0.832031 0.75,0.75 0 0 0 -0.832032,-0.658203 C 12.615219,18.232028 12.311745,18.25 12,18.25 6.4709663,18.25 3.2352034,12.56067 2.9101563,11.976563 3.0416824,11.738675 3.247073,11.326187 3.9140625,10.457031 4.14742,10.15292 4.4107565,9.8289539 4.7050781,9.5 A 0.75,0.75 0 0 0 4.6464844,8.4414063 0.75,0.75 0 0 0 4.1054687,8.2519531 Z M 8.9179688,11.759766 A 0.75,0.75 0 0 0 8.3027344,12.625 c 0.036111,0.215265 0.088994,0.423684 0.1601562,0.625 C 8.8400772,14.31716 9.6828662,15.159907 10.75,15.537109 11.141466,15.675399 11.563547,15.75 12,15.75 A 0.75,0.75 0 0 0 12.75,15 0.75,0.75 0 0 0 12,14.25 c -0.264747,0 -0.515866,-0.04424 -0.75,-0.126953 C 10.612334,13.897649 10.102327,13.38764 9.8769531,12.75 9.8344349,12.629716 9.8028791,12.503935 9.78125,12.375 A 0.75,0.75 0 0 0 8.9179688,11.759766 Z\"\n />\n </svg>\n ),\n);\n\nEyeClosed.displayName = \"EyeClosed\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const EyeOpen = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n version=\"1.1\"\n id=\"svg2\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"m 12,4.25 c -6.9136397,0 -10.6660156,7.404297 -10.6660156,7.404297 a 0.750075,0.750075 0 0 0 0,0.691406 c 0,0 3.7523759,7.404297 10.6660156,7.404297 6.913603,0 10.666016,-7.404297 10.666016,-7.404297 a 0.750075,0.750075 0 0 0 0,-0.691406 C 22.666016,11.654297 18.913603,4.25 12,4.25 Z m 0,1.5 c 5.509197,0 8.728011,5.629731 9.074219,6.25 C 20.728011,12.620269 17.509197,18.25 12,18.25 6.4907618,18.25 3.2719846,12.620269 2.9257813,12 3.2719846,11.379731 6.4907618,5.75 12,5.75 Z\"\n />\n <path\n fill=\"currentColor\"\n d=\"m 12,8.25 c -2.0622051,0 -3.75,1.6877949 -3.75,3.75 0,2.062205 1.6877949,3.75 3.75,3.75 2.062205,0 3.75,-1.687795 3.75,-3.75 0,-2.0622051 -1.687795,-3.75 -3.75,-3.75 z m 0,1.5 c 1.251595,0 2.25,0.998405 2.25,2.25 0,1.251595 -0.998405,2.25 -2.25,2.25 -1.251595,0 -2.25,-0.998405 -2.25,-2.25 0,-1.251595 0.998405,-2.25 2.25,-2.25 z\"\n />\n </svg>\n ),\n);\n\nEyeOpen.displayName = \"EyeOpen\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Globe = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n version=\"1.1\"\n id=\"svg3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M 12 1.9999805 C 6.4889971 1.9999805 1.9999805 6.4889971 1.9999805 12 C 1.9999805 17.511003 6.4889971 22.00002 12 22.00002 C 17.511003 22.00002 22.00002 17.511003 22.00002 12 C 22.00002 6.4889971 17.511003 1.9999805 12 1.9999805 z M 9.7852734 4.3109766 C 9.0156782 5.4315159 8.4068848 6.6714576 7.9985742 7.9999805 L 5.0673633 7.9999805 C 6.0900495 6.2262937 7.7728525 4.8864357 9.7852734 4.3109766 z M 14.215605 4.3112109 C 16.22764 4.8868084 17.910099 6.2265506 18.932637 7.9999805 L 16.002187 7.9999805 C 15.593899 6.671553 14.985141 5.4316872 14.215605 4.3112109 z M 12.000352 4.6819336 C 12.802406 5.6669552 13.444958 6.7859498 13.890996 7.9999805 L 10.109766 7.9999805 C 10.555785 6.7859498 11.198306 5.6669552 12.000352 4.6819336 z M 4.2503906 10.00002 L 7.5475781 10.00002 C 7.4512896 10.65291 7.4003906 11.320575 7.4003906 12.000117 C 7.4003906 12.679594 7.451242 13.347144 7.5475195 13.99998 L 4.2503906 13.99998 C 4.0869542 13.361092 4.0000195 12.691034 4.0000195 12 C 4.0000195 11.308966 4.0869542 10.638908 4.2503906 10.00002 z M 9.575625 10.00002 L 14.425137 10.00002 C 14.538123 10.650072 14.600391 11.317601 14.600391 12.000117 C 14.600391 12.682566 14.538164 13.349987 14.425195 13.99998 L 9.5755664 13.99998 C 9.4626035 13.349987 9.4003711 12.682566 9.4003711 12.000117 C 9.4003711 11.317601 9.4626451 10.650072 9.575625 10.00002 z M 16.453184 10.00002 L 19.749609 10.00002 C 19.913046 10.638908 19.99998 11.308966 19.99998 12 C 19.99998 12.691034 19.913046 13.361092 19.749609 13.99998 L 16.453242 13.99998 C 16.54952 13.347143 16.600371 12.679594 16.600371 12.000117 C 16.600371 11.320574 16.549474 10.652911 16.453184 10.00002 z M 5.0673633 16.00002 L 7.9985742 16.00002 C 8.4068805 17.328528 9.0156658 18.568482 9.7852734 19.689023 C 7.7728525 19.113564 6.0900495 17.773706 5.0673633 16.00002 z M 10.109707 16.00002 L 13.891055 16.00002 C 13.445014 17.214108 12.802482 18.333184 12.00041 19.318242 C 11.198313 18.333184 10.555738 17.214108 10.109707 16.00002 z M 16.002187 16.00002 L 18.932637 16.00002 C 17.91011 17.773429 16.227668 19.113122 14.215664 19.68873 C 14.985177 18.568263 15.593915 17.328417 16.002187 16.00002 z \" />\n </svg>\n ),\n);\n\nGlobe.displayName = \"Globe\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Help = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 19.5C16.1421 19.5 19.5 16.1421 19.5 12C19.5 7.85786 16.1421 4.5 12 4.5C7.85786 4.5 4.5 7.85786 4.5 12C4.5 16.1421 7.85786 19.5 12 19.5ZM12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21ZM12.75 15V16.5H11.25V15H12.75ZM10.5 10.4318C10.5 9.66263 11.1497 9 12 9C12.8503 9 13.5 9.66263 13.5 10.4318C13.5 10.739 13.3151 11.1031 12.9076 11.5159C12.5126 11.9161 12.0104 12.2593 11.5928 12.5292L11.25 12.7509V14.25H12.75V13.5623C13.1312 13.303 13.5828 12.9671 13.9752 12.5696C14.4818 12.0564 15 11.3296 15 10.4318C15 8.79103 13.6349 7.5 12 7.5C10.3651 7.5 9 8.79103 9 10.4318H10.5Z\"\n />\n </svg>\n ),\n);\n\nHelp.displayName = \"Help\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Idea = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"-4 0 19 19\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"cf-icon-svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M10.328 6.83a5.903 5.903 0 0 1-1.439 3.64 2.874 2.874 0 0 0-.584 1v1.037a.95.95 0 0 1-.95.95h-3.71a.95.95 0 0 1-.95-.95V11.47a2.876 2.876 0 0 0-.584-1A5.903 5.903 0 0 1 .67 6.83a4.83 4.83 0 0 1 9.28-1.878 4.796 4.796 0 0 1 .38 1.88zm-.95 0a3.878 3.878 0 0 0-7.756 0c0 2.363 2.023 3.409 2.023 4.64v1.037h3.71V11.47c0-1.231 2.023-2.277 2.023-4.64zM7.83 14.572a.475.475 0 0 1-.475.476h-3.71a.475.475 0 0 1 0-.95h3.71a.475.475 0 0 1 .475.474zm-.64 1.262a.238.238 0 0 1-.078.265 2.669 2.669 0 0 1-3.274 0 .237.237 0 0 1 .145-.425h2.983a.238.238 0 0 1 .225.16z\"></path>\n </svg>\n ),\n);\n\nIdea.displayName = \"Idea\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Image = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n <path\n d=\"M21 16V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V18M21 16V4C21 3.44772 20.5523 3 20 3H4C3.44772 3 3 3.44772 3 4V18M21 16L15.4829 12.3219C15.1843 12.1228 14.8019 12.099 14.4809 12.2595L3 18\"\n stroke=\"#000000\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"8\" cy=\"9\" r=\"2\" stroke=\"#000000\" strokeLinejoin=\"round\" />\n </svg>\n ),\n);\n\nImage.displayName = \"Image\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Info = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M 12 1.25 C 6.0718224 1.25 1.25 6.0718224 1.25 12 1.25 17.928178 6.0718224 22.75 12 22.75 17.928178 22.75 22.75 17.928178 22.75 12 22.75 6.0718224 17.928178 1.25 12 1.25 Z m 0 1.5 c 5.117517 0 9.25 4.1324826 9.25 9.25 0 5.117517 -4.132483 9.25 -9.25 9.25 C 6.8824826 21.25 2.75 17.117517 2.75 12 2.75 6.8824826 6.8824826 2.75 12 2.75 Z\" />\n <path d=\"M 12 10.25 A 0.75 0.75 0 0 0 11.25 11 v 6 A 0.75 0.75 0 0 0 12 17.75 0.75 0.75 0 0 0 12.75 17 V 11 A 0.75 0.75 0 0 0 12 10.25 Z\" />\n <path\n transform=\"matrix(1 0 0 -1 11 9)\"\n d=\"M 2 1 A 1 1 0 0 1 1 2 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 1 2 1 Z\"\n />\n </svg>\n ),\n);\n\nInfo.displayName = \"Info\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Key = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M18.9771 5.02291L19.5074 4.49258V4.49258L18.9771 5.02291ZM18.9771 14.7904L19.5074 15.3207L18.9771 14.7904ZM7.14558 12.6684L6.61525 12.138L6.61525 12.138L7.14558 12.6684ZM3.43349 16.3804L3.96382 16.9108L3.96382 16.9108L3.43349 16.3804ZM7.61956 20.5665L7.08923 20.0362L7.08923 20.0362L7.61956 20.5665ZM11.3319 16.8541L10.8016 16.3238L11.3319 16.8541ZM3.00906 17.5904L2.26365 17.6732L3.00906 17.5904ZM3.24113 19.679L2.49572 19.7618L2.49572 19.7618L3.24113 19.679ZM4.32101 20.7589L4.23819 21.5043H4.23819L4.32101 20.7589ZM6.4096 20.9909L6.49242 20.2455H6.49242L6.4096 20.9909ZM3.52408 20.2677L4.05441 19.7374L4.05441 19.7374L3.52408 20.2677ZM3.73229 20.4759L3.20196 21.0062L3.20196 21.0063L3.73229 20.4759ZM7.40432 11.6311L6.67789 11.8177H6.67789L7.40432 11.6311ZM12.3689 16.5957L12.1823 17.3221L12.3689 16.5957ZM7.63832 17.063C7.34382 16.7717 6.86895 16.7743 6.57767 17.0688C6.2864 17.3633 6.28901 17.8382 6.58351 18.1294L7.63832 17.063ZM20.0119 8.20635C20.1258 8.60458 20.5411 8.83502 20.9393 8.72105C21.3375 8.60709 21.5679 8.19187 21.454 7.79365L20.0119 8.20635ZM21.3916 12.2267C21.5167 11.8318 21.2981 11.4103 20.9033 11.2851C20.5085 11.1599 20.0869 11.3785 19.9617 11.7733L21.3916 12.2267ZM13.1161 10.8839C12.628 10.3957 12.628 9.60427 13.1161 9.11612L12.0555 8.05546C10.9815 9.1294 10.9815 10.8706 12.0555 11.9445L13.1161 10.8839ZM14.8839 10.8839C14.3957 11.372 13.6043 11.372 13.1161 10.8839L12.0555 11.9445C13.1294 13.0185 14.8706 13.0185 15.9445 11.9445L14.8839 10.8839ZM14.8839 9.11612C15.372 9.60427 15.372 10.3957 14.8839 10.8839L15.9445 11.9445C17.0185 10.8706 17.0185 9.1294 15.9445 8.05546L14.8839 9.11612ZM15.9445 8.05546C14.8706 6.98151 13.1294 6.98151 12.0555 8.05546L13.1161 9.11612C13.6043 8.62796 14.3957 8.62796 14.8839 9.11612L15.9445 8.05546ZM19.5074 4.49258C16.5173 1.50247 11.6694 1.50247 8.67928 4.49258L9.73994 5.55324C12.1443 3.14892 16.0424 3.14892 18.4468 5.55324L19.5074 4.49258ZM6.61525 12.138L2.90316 15.8501L3.96382 16.9108L7.67591 13.1987L6.61525 12.138ZM8.14989 21.0968L9.39029 19.8564L8.32963 18.7958L7.08923 20.0362L8.14989 21.0968ZM9.39029 19.8564L11.8623 17.3845L10.8016 16.3238L8.32963 18.7958L9.39029 19.8564ZM2.26365 17.6732L2.49572 19.7618L3.98654 19.5962L3.75447 17.5076L2.26365 17.6732ZM4.23819 21.5043L6.32678 21.7364L6.49242 20.2455L4.40384 20.0135L4.23819 21.5043ZM2.99375 20.798L3.20196 21.0062L4.26263 19.9456L4.05441 19.7374L2.99375 20.798ZM4.40384 20.0135C4.35042 20.0075 4.30062 19.9836 4.26262 19.9456L3.20196 21.0063C3.48081 21.2851 3.84626 21.4607 4.23819 21.5043L4.40384 20.0135ZM2.49572 19.7618C2.53926 20.1537 2.7149 20.5192 2.99375 20.798L4.05441 19.7374C4.01641 19.6994 3.99248 19.6496 3.98654 19.5962L2.49572 19.7618ZM7.08923 20.0362C6.93242 20.193 6.71283 20.27 6.49242 20.2455L6.32678 21.7364C7.00007 21.8112 7.67087 21.5759 8.14989 21.0968L7.08923 20.0362ZM2.90316 15.8501C2.42414 16.3291 2.18884 16.9999 2.26365 17.6732L3.75447 17.5076C3.72999 17.2872 3.80701 17.0676 3.96382 16.9108L2.90316 15.8501ZM8.13075 11.4446C7.60655 9.4033 8.14412 7.14906 9.73994 5.55324L8.67928 4.49258C6.69321 6.47865 6.02725 9.28401 6.67789 11.8177L8.13075 11.4446ZM18.4468 14.2601C16.8509 15.8559 14.5967 16.3934 12.5554 15.8693L12.1823 17.3221C14.716 17.9728 17.5214 17.3068 19.5074 15.3207L18.4468 14.2601ZM11.8623 17.3845C11.9181 17.3287 12.0324 17.2836 12.1823 17.3221L12.5554 15.8693C11.9675 15.7183 11.2845 15.8409 10.8016 16.3238L11.8623 17.3845ZM7.67591 13.1987C8.15857 12.716 8.28182 12.0329 8.13075 11.4446L6.67789 11.8177C6.7163 11.9672 6.67127 12.082 6.61525 12.138L7.67591 13.1987ZM9.38736 18.7929L7.63832 17.063L6.58351 18.1294L8.33255 19.8593L9.38736 18.7929ZM18.4468 5.55324C19.213 6.3195 19.734 7.23555 20.0119 8.20635L21.454 7.79365C21.1079 6.58425 20.4583 5.4435 19.5074 4.49258L18.4468 5.55324ZM19.9617 11.7733C19.6735 12.6821 19.1692 13.5376 18.4468 14.2601L19.5074 15.3207C20.4038 14.4244 21.0325 13.3592 21.3916 12.2267L19.9617 11.7733Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nKey.displayName = \"Key\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const LXCOld = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n version=\"1.1\"\n baseProfile=\"full\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <g stroke=\"white\">\n <g transform=\"rotate(30) skewX(30)\">\n <rect\n x=\"110\"\n y=\"-72\"\n width=\"175\"\n height=\"75\"\n fill=\"currentColor\"\n transform=\"skewX(-50)\"\n />\n <rect\n x=\"110\"\n y=\"3\"\n width=\"87.5\"\n height=\"75\"\n fill=\"currentColor\"\n transform=\"skewX(-50)\"\n />\n <rect\n x=\"16.5\"\n y=\"78.9\"\n width=\"87.5\"\n height=\"25\"\n fill=\"currentColor\"\n />\n <rect\n x=\"16.5\"\n y=\"104.5\"\n width=\"175\"\n height=\"25\"\n fill=\"currentColor\"\n />\n <rect x=\"16.5\" y=\"130\" width=\"175\" height=\"50\" fill=\"currentColor\" />\n <rect\n x=\"104\"\n y=\"166\"\n width=\"89.5\"\n height=\"25\"\n fill=\"currentColor\"\n transform=\"skewY(-40)\"\n />\n <rect\n x=\"228.3\"\n y=\"29.5\"\n width=\"87.5\"\n height=\"75\"\n fill=\"currentColor\"\n transform=\"skewX(-50)\"\n />\n <rect\n x=\"191.8\"\n y=\"266\"\n width=\"89.5\"\n height=\"25\"\n fill=\"currentColor\"\n transform=\"skewY(-40)\"\n />\n <rect\n x=\"192\"\n y=\"291\"\n width=\"179.5\"\n height=\"50\"\n fill=\"currentColor\"\n transform=\"skewY(-40)\"\n />\n <rect\n x=\"282.3\"\n y=\"240\"\n width=\"89.1\"\n height=\"50\"\n fill=\"currentColor\"\n transform=\"skewY(-40)\"\n />\n <rect x=\"194\" y=\"3.7\" width=\"87.5\" height=\"25\" fill=\"currentColor\" />\n </g>\n <line x1=\"93\" y1=\"57\" x2=\"93\" y2=\"88\" />\n <line x1=\"169\" y1=\"131\" x2=\"92\" y2=\"88\" />\n <line x1=\"92\" y1=\"88\" x2=\"14\" y2=\"128\" />\n </g>\n </svg>\n ),\n);\n\nLXCOld.displayName = \"LXCOld\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const LXC = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M12 6v-4l-4-2-4 2v4l-4 2v5l4 2 4-2 4 2 4-2v-5zM8.090 1.12l2.91 1.44-2.6 1.3-2.91-1.44zM5 2.78l3 1.5v3.6l-3-1.5v-3.6zM4 13.88l-3-1.5v-3.6l3 1.5v3.6zM4.28 9.88l-2.88-1.46 2.6-1.3 2.88 1.44zM12 13.88l-3-1.5v-3.6l3 1.5v3.6zM12.28 9.88l-2.88-1.46 2.6-1.3 2.88 1.44z\"\n ></path>\n </svg>\n ),\n);\n\nLXC.displayName = \"LXC\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Log = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M8.46484 7.16797C8.27669 7.16797 8.11621 7.10433 7.9834 6.97705C7.85612 6.84977 7.79248 6.69206 7.79248 6.50391C7.79248 6.31576 7.85612 6.15804 7.9834 6.03076C8.11621 5.89795 8.27669 5.83154 8.46484 5.83154H19.8037C19.9919 5.83154 20.1496 5.89795 20.2769 6.03076C20.4097 6.15804 20.4761 6.31576 20.4761 6.50391C20.4761 6.69206 20.4097 6.84977 20.2769 6.97705C20.1496 7.10433 19.9919 7.16797 19.8037 7.16797H8.46484ZM8.46484 12.7734C8.27669 12.7734 8.11621 12.7098 7.9834 12.5825C7.85612 12.4497 7.79248 12.2892 7.79248 12.1011C7.79248 11.9129 7.85612 11.7552 7.9834 11.6279C8.11621 11.5007 8.27669 11.437 8.46484 11.437H19.8037C19.9919 11.437 20.1496 11.5007 20.2769 11.6279C20.4097 11.7552 20.4761 11.9129 20.4761 12.1011C20.4761 12.2892 20.4097 12.4497 20.2769 12.5825C20.1496 12.7098 19.9919 12.7734 19.8037 12.7734H8.46484ZM8.23877 18.1597C8.05062 18.1597 7.89014 18.096 7.75732 17.9688C7.63005 17.8415 7.56641 17.6838 7.56641 17.4956C7.56641 17.3075 7.63005 17.1497 7.75732 17.0225C7.89014 16.8896 8.05062 16.8232 8.23877 16.8232H19.5776C19.7658 16.8232 19.9235 16.8896 20.0508 17.0225C20.1836 17.1497 20.25 17.3075 20.25 17.4956C20.25 17.6838 20.1836 17.8415 20.0508 17.9688C19.9235 18.096 19.7658 18.1597 19.5776 18.1597H8.23877ZM4.7959 7.5415C4.50814 7.5415 4.26188 7.44189 4.05713 7.24268C3.85238 7.03792 3.75 6.79167 3.75 6.50391C3.75 6.21061 3.85238 5.96436 4.05713 5.76514C4.26188 5.56038 4.50814 5.45801 4.7959 5.45801C5.08366 5.45801 5.32992 5.56038 5.53467 5.76514C5.73942 5.96436 5.8418 6.21061 5.8418 6.50391C5.8418 6.79167 5.73942 7.03792 5.53467 7.24268C5.32992 7.44189 5.08366 7.5415 4.7959 7.5415ZM4.7959 13.147C4.50814 13.147 4.26188 13.0446 4.05713 12.8398C3.85238 12.6351 3.75 12.3888 3.75 12.1011C3.75 11.8133 3.85238 11.5671 4.05713 11.3623C4.26188 11.1576 4.50814 11.0552 4.7959 11.0552C5.08366 11.0552 5.32992 11.1576 5.53467 11.3623C5.73942 11.5671 5.8418 11.8133 5.8418 12.1011C5.8418 12.3888 5.73942 12.6351 5.53467 12.8398C5.32992 13.0446 5.08366 13.147 4.7959 13.147ZM4.56982 18.5415C4.28206 18.5415 4.03581 18.4391 3.83105 18.2344C3.6263 18.0296 3.52393 17.7834 3.52393 17.4956C3.52393 17.2023 3.6263 16.9561 3.83105 16.7568C4.03581 16.5521 4.28206 16.4497 4.56982 16.4497C4.85758 16.4497 5.10384 16.5521 5.30859 16.7568C5.51335 16.9561 5.61572 17.2023 5.61572 17.4956C5.61572 17.7834 5.51335 18.0296 5.30859 18.2344C5.10384 18.4391 4.85758 18.5415 4.56982 18.5415Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nLog.displayName = \"Log\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Moon = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M9.272 2.406a1 1 0 0 0-1.23-1.355C6.59 1.535 5.432 2.487 4.37 3.55a11.399 11.399 0 0 0 0 16.182c4.518 4.519 11.51 4.261 15.976-.205 1.062-1.062 2.014-2.22 2.498-3.673A1 1 0 0 0 21.55 14.6c-3.59 1.322-7.675.734-10.434-2.025-2.765-2.766-3.328-6.83-1.844-10.168Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nMoon.displayName = \"Moon\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Notification = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M4.41992 17.5781C4.41992 17.3021 4.49284 17.0391 4.63867 16.7891C4.78451 16.5339 4.9694 16.2891 5.19336 16.0547C5.42253 15.8203 5.6543 15.5885 5.88867 15.3594C6.07096 15.1823 6.21159 14.9505 6.31055 14.6641C6.41471 14.3776 6.49284 14.0625 6.54492 13.7188C6.59701 13.375 6.63867 13.0234 6.66992 12.6641C6.70117 11.6797 6.82357 10.8073 7.03711 10.0469C7.25586 9.28646 7.57878 8.64844 8.00586 8.13281C8.43815 7.61719 8.99544 7.23698 9.67773 6.99219C9.82357 6.47656 10.1022 6.04427 10.5137 5.69531C10.9251 5.34635 11.4199 5.17188 11.998 5.17188C12.5814 5.17188 13.0788 5.34635 13.4902 5.69531C13.9017 6.04427 14.1803 6.47656 14.3262 6.99219C15.0085 7.23698 15.5632 7.61719 15.9902 8.13281C16.4225 8.64844 16.7454 9.28646 16.959 10.0469C17.1777 10.8073 17.3027 11.6797 17.334 12.6641C17.3652 13.0234 17.4069 13.375 17.459 13.7188C17.5111 14.0625 17.5866 14.3776 17.6855 14.6641C17.7897 14.9505 17.9329 15.1823 18.1152 15.3594C18.3496 15.5885 18.5788 15.8203 18.8027 16.0547C19.0319 16.2891 19.2194 16.5339 19.3652 16.7891C19.5111 17.0391 19.584 17.3021 19.584 17.5781C19.584 17.9115 19.4668 18.1797 19.2324 18.3828C19.0033 18.5807 18.6855 18.6797 18.2793 18.6797H15.0605C15.0397 19.1849 14.8965 19.6536 14.6309 20.0859C14.3704 20.5234 14.0137 20.875 13.5605 21.1406C13.1126 21.4115 12.5918 21.5469 11.998 21.5469C11.4095 21.5469 10.8887 21.4115 10.4355 21.1406C9.98763 20.875 9.63086 20.5234 9.36523 20.0859C9.10482 19.6536 8.96419 19.1849 8.94336 18.6797H5.72461C5.31836 18.6797 4.99805 18.5807 4.76367 18.3828C4.53451 18.1797 4.41992 17.9115 4.41992 17.5781ZM6.28711 17.25H17.6934V17.1562C17.6257 17.0885 17.5371 16.9974 17.4277 16.8828C17.3184 16.7682 17.196 16.6432 17.0605 16.5078C16.9303 16.3672 16.8001 16.224 16.6699 16.0781C16.5345 15.9271 16.4173 15.7448 16.3184 15.5312C16.2194 15.3125 16.1361 15.0677 16.0684 14.7969C16.0007 14.5208 15.9434 14.2214 15.8965 13.8984C15.8548 13.5755 15.8236 13.2266 15.8027 12.8516C15.7715 11.7995 15.6517 10.9609 15.4434 10.3359C15.235 9.70573 14.959 9.23698 14.6152 8.92969C14.2767 8.61719 13.8965 8.40365 13.4746 8.28906C13.3861 8.26823 13.3132 8.23177 13.2559 8.17969C13.2038 8.1224 13.1751 8.04167 13.1699 7.9375C13.1491 7.54167 13.0345 7.22135 12.8262 6.97656C12.623 6.73177 12.347 6.60938 11.998 6.60938C11.6595 6.60938 11.3861 6.73177 11.1777 6.97656C10.9694 7.22135 10.8548 7.54167 10.834 7.9375C10.8288 8.04167 10.7975 8.1224 10.7402 8.17969C10.6882 8.23177 10.6152 8.26823 10.5215 8.28906C10.0996 8.40365 9.7194 8.61719 9.38086 8.92969C9.04232 9.23698 8.76888 9.70573 8.56055 10.3359C8.35221 10.9609 8.23242 11.7995 8.20117 12.8516C8.18034 13.2266 8.14648 13.5755 8.09961 13.8984C8.05794 14.2214 8.00065 14.5208 7.92773 14.7969C7.86003 15.0677 7.77669 15.3125 7.67773 15.5312C7.57878 15.7448 7.46159 15.9271 7.32617 16.0781C7.20117 16.224 7.07096 16.3672 6.93555 16.5078C6.80013 16.6432 6.67513 16.7682 6.56055 16.8828C6.44596 16.9974 6.35482 17.0885 6.28711 17.1562V17.25ZM10.4199 18.6797C10.446 19.1745 10.6048 19.5677 10.8965 19.8594C11.1934 20.151 11.5605 20.2969 11.998 20.2969C12.446 20.2969 12.8132 20.151 13.0996 19.8594C13.3913 19.5677 13.5527 19.1745 13.584 18.6797H10.4199Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nNotification.displayName = \"Notification\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Official = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M17.03 9.78a.75.75 0 00-1.06-1.06l-5.47 5.47-2.47-2.47a.75.75 0 00-1.06 1.06l3 3a.75.75 0 001.06 0l6-6z\" />\n <path\n fillRule=\"evenodd\"\n d=\"M14.136 1.2a3.61 3.61 0 00-4.272 0L8.489 2.21a2.11 2.11 0 01-.929.384l-1.686.259a3.61 3.61 0 00-3.021 3.02L2.594 7.56a2.11 2.11 0 01-.384.929L1.2 9.864a3.61 3.61 0 000 4.272l1.01 1.375c.2.274.333.593.384.929l.259 1.686a3.61 3.61 0 003.02 3.021l1.687.259c.336.051.655.183.929.384l1.375 1.01a3.61 3.61 0 004.272 0l1.375-1.01a2.11 2.11 0 01.929-.384l1.686-.259a3.61 3.61 0 003.021-3.02l.259-1.687a2.11 2.11 0 01.384-.929l1.01-1.375a3.61 3.61 0 000-4.272l-1.01-1.375a2.11 2.11 0 01-.384-.929l-.259-1.686a3.61 3.61 0 00-3.02-3.021l-1.687-.259a2.11 2.11 0 01-.929-.384L14.136 1.2zm-3.384 1.209a2.11 2.11 0 012.496 0l1.376 1.01a3.61 3.61 0 001.589.658l1.686.258a2.11 2.11 0 011.765 1.766l.26 1.686a3.61 3.61 0 00.657 1.59l1.01 1.375a2.11 2.11 0 010 2.496l-1.01 1.376a3.61 3.61 0 00-.658 1.589l-.258 1.686a2.11 2.11 0 01-1.766 1.765l-1.686.26a3.61 3.61 0 00-1.59.657l-1.375 1.01a2.11 2.11 0 01-2.496 0l-1.376-1.01a3.61 3.61 0 00-1.589-.658l-1.686-.258a2.11 2.11 0 01-1.766-1.766l-.258-1.686a3.61 3.61 0 00-.658-1.59l-1.01-1.375a2.11 2.11 0 010-2.496l1.01-1.376a3.61 3.61 0 00.658-1.589l.258-1.686a2.11 2.11 0 011.766-1.766l1.686-.258a3.61 3.61 0 001.59-.658l1.375-1.01z\"\n />\n </svg>\n ),\n);\n\nOfficial.displayName = \"Official\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Offline = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m 8 1.992188 c -2.617188 0 -5.238281 0.933593 -7.195312 2.808593 l -0.496094 0.480469 c -0.3984378 0.378906 -0.410156 1.011719 -0.03125 1.410156 c 0.382812 0.398438 1.015625 0.410156 1.414062 0.027344 l 0.5 -0.476562 c 3.085938 -2.953126 8.53125 -2.953126 11.617188 0 l 0.5 0.476562 c 0.398437 0.382812 1.03125 0.371094 1.414062 -0.027344 c 0.378906 -0.398437 0.367188 -1.03125 -0.03125 -1.410156 l -0.496094 -0.480469 c -1.957031 -1.875 -4.578124 -2.808593 -7.195312 -2.808593 z m -0.03125 4.007812 c -1.570312 0.011719 -3.128906 0.628906 -4.207031 1.8125 l -0.5 0.550781 c -0.375 0.40625 -0.347657 1.042969 0.0625 1.414063 c 0.410156 0.371094 1.042969 0.339844 1.414062 -0.070313 l 0.5 -0.542969 c 1.242188 -1.363281 3.992188 -1.492187 5.398438 -0.128906 c 0.121093 -0.023437 0.242187 -0.035156 0.363281 -0.035156 c 0.53125 0 1.039062 0.210938 1.414062 0.585938 l 0.222657 0.222656 c 0.011719 -0.011719 0.023437 -0.019532 0.039062 -0.03125 c 0.40625 -0.371094 0.4375 -1.007813 0.0625 -1.414063 l -0.5 -0.550781 c -1.125 -1.230469 -2.703125 -1.824219 -4.269531 -1.8125 z m 0.03125 4 c -0.511719 0 -1.023438 0.195312 -1.414062 0.585938 c -0.78125 0.78125 -0.78125 2.046874 0 2.828124 s 2.046874 0.78125 2.828124 0 c 0.210938 -0.210937 0.359376 -0.453124 0.457032 -0.714843 l -0.285156 -0.285157 c -0.554688 -0.554687 -0.707032 -1.367187 -0.46875 -2.070312 c -0.335938 -0.226562 -0.726563 -0.34375 -1.117188 -0.34375 z m 0 0\"\n fill-opacity=\"0.34902\"\n ></path>\n <path d=\"m 11 10 c -0.265625 0 -0.519531 0.105469 -0.707031 0.292969 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 l 1.292969 1.292969 l -1.292969 1.292969 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 s 1.023437 0.390625 1.414062 0 l 1.292969 -1.292969 l 1.292969 1.292969 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 s 0.390625 -1.023437 0 -1.414062 l -1.292969 -1.292969 l 1.292969 -1.292969 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 s -0.519531 0.105469 -0.707031 0.292969 l -1.292969 1.292969 l -1.292969 -1.292969 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 z m 0 0\"></path>\n </svg>\n ),\n);\n\nOffline.displayName = \"Offline\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const OpenApp = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M7.14 18.727c-.864 0-1.523-.224-1.976-.672-.448-.443-.672-1.091-.672-1.946V6.617c0-.854.224-1.505.672-1.953.453-.448 1.112-.672 1.977-.672h9.437c.865 0 1.521.224 1.969.672.453.448.68 1.099.68 1.953v9.492c0 .854-.227 1.503-.68 1.946-.448.448-1.104.672-1.969.672H7.141zm.141-1.735h9.157c.338 0 .599-.086.78-.258.183-.177.274-.445.274-.804V6.805c0-.36-.091-.628-.273-.805-.183-.177-.443-.266-.782-.266H7.281c-.343 0-.607.089-.789.266-.177.177-.265.445-.265.805v9.125c0 .36.088.627.265.804.182.172.446.258.79.258zm5.79-7.805c.182-.156.361-.229.538-.218.183.005.331.067.446.187.114.12.174.268.18.446.005.177-.07.354-.227.53l-1.297 1.446-2.625 2.625a.798.798 0 0 1-.586.242.735.735 0 0 1-.758-.766.78.78 0 0 1 .242-.554l2.641-2.633 1.445-1.305zm.53 2.344.266-2.226-2.14.304h-1.243c-.229 0-.414-.062-.554-.187a.645.645 0 0 1-.211-.508c0-.213.067-.383.203-.508.14-.125.328-.187.562-.187h3.618c.27 0 .484.073.64.219.162.145.242.367.242.664v3.593c0 .23-.062.414-.187.555a.636.636 0 0 1-.5.21.657.657 0 0 1-.508-.202c-.125-.14-.187-.326-.187-.555v-1.172z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nOpenApp.displayName = \"OpenApp\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Parameter = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 32 32\"\n id=\"icon\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M28,13V8a2.0023,2.0023,0,0,0-2-2H23V8h3v5a3.9756,3.9756,0,0,0,1.3823,3A3.9756,3.9756,0,0,0,26,19v5H23v2h3a2.0023,2.0023,0,0,0,2-2V19a2.0023,2.0023,0,0,1,2-2V15A2.0023,2.0023,0,0,1,28,13Z\"\n id=\"path1\"\n />\n <path\n d=\"M17,9l-.857,3h2L19,9h2l-.857,3H22v2H19.572l-1.143,4H21v2H17.857L17,23H15l.857-3h-2L13,23H11l.857-3H10V18h2.429l1.143-4H11V12h3.143L15,9Zm.572,5h-2l-1.143,4h2Z\"\n id=\"path2\"\n />\n <path\n d=\"M6,13V8H9V6H6A2.0023,2.0023,0,0,0,4,8v5a2.0023,2.0023,0,0,1-2,2v2a2.0023,2.0023,0,0,1,2,2v5a2.0023,2.0023,0,0,0,2,2H9V24H6V19a3.9756,3.9756,0,0,0-1.3823-3A3.9756,3.9756,0,0,0,6,13Z\"\n id=\"path3\"\n />\n </svg>\n ),\n);\n\nParameter.displayName = \"Parameter\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Pause = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M8.66368 19.9984C8.39536 19.9984 8.16985 19.9099 7.98715 19.7329C7.81016 19.5616 7.72168 19.3447 7.72168 19.0821V6.49347C7.72168 6.23085 7.81016 6.01389 7.98715 5.84262C8.16985 5.66563 8.39536 5.57715 8.66368 5.57715C8.93201 5.57715 9.15467 5.66563 9.33166 5.84262C9.51434 6.01389 9.60569 6.23085 9.60569 6.49347V19.0821C9.60569 19.3447 9.51434 19.5616 9.33166 19.7329C9.15467 19.9099 8.93201 19.9984 8.66368 19.9984ZM14.6155 19.9984C14.3528 19.9984 14.1302 19.9099 13.9475 19.7329C13.7705 19.5616 13.682 19.3447 13.682 19.0821V6.49347C13.682 6.23085 13.7705 6.01389 13.9475 5.84262C14.1302 5.66563 14.3528 5.57715 14.6155 5.57715C14.8838 5.57715 15.1093 5.66563 15.292 5.84262C15.4747 6.01389 15.566 6.23085 15.566 6.49347V19.0821C15.566 19.3447 15.4747 19.5616 15.292 19.7329C15.1093 19.9099 14.8838 19.9984 14.6155 19.9984Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nPause.displayName = \"Pause\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Praise = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 1024 1024\"\n fill=\"currentColor\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M253.6 912.8H104.8c-13.6 0-24-10.4-24-24v-448c0-13.6 10.4-24 24-24h141.6v-1.6C363.2 400 450.4 304.8 453.6 186.4v-0.8c0-3.2-0.8-6.4-0.8-9.6 0-52.8 42.4-95.2 95.2-95.2 44.8 0 82.4 30.4 92.8 73.6l2.4 12c4.8 23.2 6.4 47.2 6.4 70.4 0 42.4-7.2 84.8-20.8 124.8l-4.8 17.6h232c32.8 1.6 62.4 18.4 80 45.6 8 12.8 12.8 28.8 14.4 44 1.6 16.8-2.4 32-6.4 48-4.8 21.6-9.6 42.4-14.4 64-6.4 28-12.8 56.8-19.2 84.8L891.2 752c-4.8 22.4-10.4 44.8-15.2 68-3.2 15.2-6.4 31.2-14.4 44.8-8 12.8-18.4 24-31.2 32-14.4 8.8-30.4 14.4-47.2 15.2H258.4c-2.4 0.8-3.2 0.8-4.8 0.8z m248.8-746.4l-0.8 3.2v10.4c0 0.8 0.8 28.8-4.8 56.8-1.6 8-4 16-6.4 24.8l-2.4 7.2C457.6 360 381.6 432 288 456l-10.4 2.4v406.4H769.6c18.4 0 33.6-2.4 45.6-17.6 8.8-11.2 10.4-27.2 13.6-40.8 4.8-22.4 10.4-44.8 15.2-68 6.4-28.8 13.6-58.4 20-87.2l19.2-86.4c3.2-15.2 7.2-30.4 10.4-45.6 1.6-7.2 3.2-15.2 4.8-22.4 1.6-7.2 4-15.2 3.2-22.4 0-3.2-0.8-5.6-1.6-8-0.8-5.6-3.2-10.4-5.6-15.2-11.2-17.6-28.8-24-48.8-23.2H587.2c-13.6 0-24-10.4-24-24 0-4 0.8-7.2 2.4-10.4l4.8-9.6c12-24.8 21.6-51.2 27.2-79.2l1.6-4c0.8-2.4 5.6-23.2 5.6-62.4 0-32-5.6-60.8-5.6-60.8 0-25.6-21.6-47.2-48-47.2-23.2-1.6-43.2 14.4-48.8 36zM128.8 464.8V864h101.6V464l-101.6 0.8z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nPraise.displayName = \"Praise\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReportFeedback = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 42 42\"\n {...props}\n ref={ref}\n >\n <path d=\"M6.5,25.5v4c0.016,2.812,1.344,2.375,2.328,1.531L14.5,25.91v2.59c0,2.43,0.56,3,3,3h9c0,0,5.209,6.125,5.25,6.084 c0.75,0.916,2.781,0.604,2.75-1.084v-5h3c2.45,0,3-0.609,3-3v-15c0-2.4-0.59-3-3-3h-10v-2c0-2.47-0.46-3-3-3h-21c-2.36,0-3,0.51-3,3 v13c0,2.439,0.55,4,3,4H6.5z M31.5,28.5v4.721l-4-4.721h-9c-0.75,0-1-0.27-1-1v-13c0-0.67,0.31-1,1-1h18c0.689,0,1,0.37,1,0.94V27.5 c0,0.721-0.359,1-1,1H31.5z\"></path>\n </svg>\n));\n\nReportFeedback.displayName = \"ReportFeedback\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Reset = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M12.0731 20.9542C10.9156 20.9542 9.83119 20.7352 8.81979 20.2971C7.80837 19.8645 6.91864 19.264 6.15061 18.496C5.38258 17.7334 4.77952 16.8463 4.34142 15.835C3.90873 14.8182 3.69238 13.731 3.69238 12.5736C3.69238 11.4161 3.90873 10.3317 4.34142 9.32028C4.77952 8.30344 5.38258 7.41102 6.15061 6.64299C6.91864 5.87496 7.80837 5.2746 8.81979 4.84191C9.83119 4.40922 10.9156 4.19287 12.0731 4.19287C13.2305 4.19287 14.315 4.40922 15.3263 4.84191C16.3432 5.2746 17.2357 5.87496 18.0037 6.64299C18.7717 7.41102 19.3721 8.30344 19.8047 9.32028C20.2429 10.3317 20.4619 11.4161 20.4619 12.5736C20.4619 13.731 20.2429 14.8182 19.8047 15.835C19.3721 16.8463 18.7717 17.7334 18.0037 18.496C17.2357 19.264 16.3432 19.8645 15.3263 20.2971C14.315 20.7352 13.2305 20.9542 12.0731 20.9542ZM12.0731 19.2993C13.0034 19.2993 13.8742 19.1235 14.6855 18.7719C15.4967 18.4257 16.2107 17.9443 16.8272 17.3278C17.4493 16.7112 17.9333 15.9972 18.2795 15.186C18.6257 14.3747 18.7987 13.5039 18.7987 12.5736C18.7987 11.6433 18.6257 10.7725 18.2795 9.9612C17.9333 9.14449 17.4493 8.43055 16.8272 7.81938C16.2107 7.20279 15.4967 6.72142 14.6855 6.37527C13.8742 6.0237 13.0034 5.84791 12.0731 5.84791C11.1482 5.84791 10.2774 6.0237 9.46071 6.37527C8.6494 6.72142 7.93546 7.20279 7.31887 7.81938C6.7023 8.43055 6.21822 9.14449 5.86666 9.9612C5.52051 10.7725 5.34742 11.6433 5.34742 12.5736C5.34742 13.5039 5.52051 14.3747 5.86666 15.186C6.21822 15.9972 6.7023 16.7112 7.31887 17.3278C7.93546 17.9443 8.6494 18.4257 9.46071 18.7719C10.2774 19.1235 11.1482 19.2993 12.0731 19.2993ZM8.36545 11.673L13.1521 8.81727C13.3685 8.68746 13.5983 8.63067 13.8417 8.6469C14.0851 8.65771 14.2906 8.74425 14.4583 8.90652C14.6314 9.06877 14.7179 9.30946 14.7179 9.62857V15.5104C14.7179 15.8242 14.6314 16.0621 14.4583 16.2244C14.2906 16.3867 14.0851 16.476 13.8417 16.4922C13.5983 16.503 13.3685 16.4407 13.1521 16.3056L8.35734 13.4741C8.13559 13.3443 7.98414 13.1631 7.90302 12.9306C7.8273 12.698 7.8273 12.4654 7.90302 12.2328C7.97874 11.9949 8.13288 11.8083 8.36545 11.673ZM9.85824 12.4924C9.82579 12.5087 9.80956 12.5357 9.80956 12.5736C9.80956 12.6114 9.82849 12.6412 9.86635 12.6628L13.0953 14.5613C13.1386 14.5883 13.1737 14.5964 13.2008 14.5856C13.2332 14.5694 13.2495 14.5423 13.2495 14.5045V10.6346C13.2495 10.5913 13.2332 10.5643 13.2008 10.5534C13.1737 10.5426 13.1386 10.548 13.0953 10.5697L9.85824 12.4924Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nReset.displayName = \"Reset\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Restart = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M18.887 13.3433C18.887 14.2423 18.7188 15.0837 18.3822 15.8673C18.0456 16.6509 17.5794 17.3409 16.9831 17.937C16.3918 18.5331 15.7044 18.9995 14.9207 19.3361C14.137 19.6727 13.2957 19.8408 12.3966 19.8408C11.5024 19.8408 10.6611 19.6727 9.87259 19.3361C9.08893 18.9995 8.39904 18.5331 7.80288 17.937C7.21154 17.3409 6.7476 16.6509 6.41106 15.8673C6.07452 15.0837 5.90625 14.2423 5.90625 13.3433C5.90625 13.0981 5.98317 12.8986 6.13703 12.7448C6.29087 12.5909 6.48558 12.514 6.72116 12.514C6.95673 12.514 7.14663 12.5909 7.29087 12.7448C7.43509 12.8986 7.50721 13.0981 7.50721 13.3433C7.50721 14.0164 7.63221 14.6486 7.88221 15.2399C8.13702 15.8313 8.48797 16.3505 8.93509 16.7976C9.38701 17.2448 9.90865 17.5956 10.5 17.8505C11.0913 18.1053 11.7235 18.2327 12.3966 18.2327C13.0745 18.2327 13.7067 18.1053 14.2933 17.8505C14.8846 17.5956 15.4038 17.2448 15.8509 16.7976C16.3029 16.3505 16.6539 15.8313 16.9038 15.2399C17.1587 14.6486 17.286 14.0164 17.286 13.3433C17.286 12.6702 17.1587 12.038 16.9038 11.4467C16.6539 10.8553 16.3029 10.3361 15.8509 9.88898C15.4038 9.43706 14.8846 9.08609 14.2933 8.8361C13.7067 8.58129 13.0745 8.45388 12.3966 8.45388C12.1995 8.45388 12.0096 8.4611 11.8269 8.47551C11.649 8.48994 11.4832 8.51397 11.3293 8.54763L13.125 10.3217C13.1971 10.3938 13.2524 10.4731 13.2909 10.5597C13.3293 10.6462 13.3486 10.7447 13.3486 10.8553C13.3486 11.0717 13.2716 11.2568 13.1178 11.4106C12.9687 11.5596 12.7861 11.6342 12.5697 11.6342C12.3534 11.6342 12.1707 11.562 12.0216 11.4178L9.06491 8.43225C8.98317 8.35052 8.92068 8.26157 8.87741 8.16542C8.83895 8.06445 8.81971 7.95869 8.81971 7.84811C8.81971 7.63176 8.90144 7.43705 9.06491 7.26398L12.0216 4.26398C12.1659 4.11014 12.3486 4.0332 12.5697 4.0332C12.7909 4.0332 12.976 4.11014 13.125 4.26398C13.274 4.41782 13.3486 4.60532 13.3486 4.82648C13.3486 4.93224 13.3293 5.03081 13.2909 5.12216C13.2524 5.20869 13.1995 5.28801 13.1322 5.36013L11.5168 6.93945C11.6514 6.91542 11.7909 6.89619 11.9351 6.88176C12.0841 6.86253 12.238 6.85292 12.3966 6.85292C13.2957 6.85292 14.137 7.02119 14.9207 7.35773C15.7044 7.69427 16.3918 8.16062 16.9831 8.75676C17.5794 9.35292 18.0456 10.0428 18.3822 10.8265C18.7188 11.6101 18.887 12.4491 18.887 13.3433Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nRestart.displayName = \"Restart\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Rocket = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M9.03429 5.96305L6.49114 8.49856C6.02369 8.9646 5.59488 9.3921 5.25624 9.77856C5.03877 10.0267 4.82145 10.2984 4.63737 10.5985L4.61259 10.5738C4.56555 10.5269 4.54201 10.5034 4.51839 10.4805C4.07636 10.0516 3.55641 9.71062 2.98636 9.47575C2.9559 9.4632 2.92498 9.45095 2.86314 9.42645L2.48449 9.27641C1.97153 9.07315 1.83482 8.41279 2.22514 8.02365C3.34535 6.90684 4.69032 5.56594 5.33941 5.29662C5.91185 5.05911 6.53023 4.98008 7.12664 5.06822C7.67311 5.14898 8.19006 5.42968 9.03429 5.96305Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M13.3767 19.3132C13.5816 19.5212 13.7177 19.6681 13.8408 19.8251C14.0031 20.0322 14.1483 20.2523 14.2748 20.4829C14.4172 20.7426 14.5278 21.02 14.749 21.5748C14.929 22.0265 15.5272 22.1459 15.8746 21.7995L15.9586 21.7157C17.0788 20.5988 18.4237 19.2579 18.6938 18.6108C18.9321 18.04 19.0113 17.4235 18.9229 16.8289C18.8419 16.2841 18.5605 15.7688 18.0256 14.9273L15.474 17.4713C14.9959 17.9479 14.5576 18.385 14.1612 18.7273C13.9236 18.9325 13.6637 19.1376 13.3767 19.3132Z\"\n fill=\"currentColor\"\n ></path>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.4467 16.3769L20.2935 10.5476C21.1356 9.70811 21.5566 9.28836 21.7783 8.75458C22.0001 8.22081 22.0001 7.62719 22.0001 6.43996V5.87277C22.0001 4.04713 22.0001 3.13431 21.4312 2.56715C20.8624 2 19.9468 2 18.1157 2H17.5468C16.356 2 15.7606 2 15.2252 2.2211C14.6898 2.4422 14.2688 2.86195 13.4268 3.70146L7.57991 9.53078C6.59599 10.5117 5.98591 11.12 5.74966 11.7075C5.67502 11.8931 5.6377 12.0767 5.6377 12.2692C5.6377 13.0713 6.2851 13.7168 7.57991 15.0077L7.75393 15.1812L9.79245 13.1123C10.0832 12.8172 10.558 12.8137 10.8531 13.1044C11.1481 13.3951 11.1516 13.87 10.8609 14.1651L8.8162 16.2403L8.95326 16.3769C10.2481 17.6679 10.8955 18.3133 11.7 18.3133C11.8777 18.3133 12.0478 18.2818 12.2189 18.2188C12.8222 17.9966 13.438 17.3826 14.4467 16.3769ZM17.1935 9.5312C16.435 10.2874 15.2053 10.2874 14.4468 9.5312C13.6883 8.775 13.6883 7.54895 14.4468 6.79274C15.2053 6.03653 16.435 6.03653 17.1935 6.79274C17.952 7.54895 17.952 8.775 17.1935 9.5312Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nRocket.displayName = \"Rocket\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Run = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M6.79932 18.3247V6.2328C6.79932 5.75894 6.91921 5.40783 7.15899 5.17946C7.39878 4.9511 7.68423 4.83691 8.01536 4.83691C8.31224 4.83691 8.60911 4.9197 8.90599 5.08526L19.0197 10.9942C19.3851 11.2055 19.6477 11.4053 19.8076 11.5937C19.9731 11.7821 20.0559 12.0104 20.0559 12.2788C20.0559 12.5414 19.9731 12.7698 19.8076 12.9639C19.6477 13.1523 19.3851 13.3521 19.0197 13.5633L8.90599 19.4723C8.60911 19.6378 8.31224 19.7206 8.01536 19.7206C7.68423 19.7206 7.39878 19.6036 7.15899 19.3695C6.91921 19.1412 6.79932 18.7929 6.79932 18.3247ZM8.48637 17.4512C8.48637 17.5312 8.51491 17.5883 8.572 17.6225C8.6348 17.6568 8.70331 17.6511 8.77753 17.6054L17.6581 12.4329C17.7266 12.393 17.7609 12.3416 17.7609 12.2788C17.7609 12.2046 17.7266 12.1532 17.6581 12.1246L8.77753 6.95215C8.70331 6.90648 8.6348 6.90077 8.572 6.93502C8.51491 6.96928 8.48637 7.02637 8.48637 7.10629V17.4512Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nRun.displayName = \"Run\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Save = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"-6.72 -6.72 45.44 45.44\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n transform=\"translate(-154.000000, -517.000000)\"\n fill=\"currentColor\"\n d=\"M172,522 C172,521.447 172.448,521 173,521 C173.552,521 174,521.447 174,522 L174,526 C174,526.553 173.552,527 173,527 C172.448,527 172,526.553 172,526 L172,522 L172,522 Z M163,529 L177,529 C177.552,529 178,528.553 178,528 L178,517 L162,517 L162,528 C162,528.553 162.448,529 163,529 L163,529 Z M182,517 L180,517 L180,529 C180,530.104 179.104,531 178,531 L162,531 C160.896,531 160,530.104 160,529 L160,517 L158,517 C155.791,517 154,518.791 154,521 L154,545 C154,547.209 155.791,549 158,549 L182,549 C184.209,549 186,547.209 186,545 L186,521 C186,518.791 184.209,517 182,517 L182,517 Z\"\n />\n </svg>\n ),\n);\n\nSave.displayName = \"Save\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Scale = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path d=\"M15.81 10l-2.5-5h0.69c0.276 0 0.5-0.224 0.5-0.5s-0.224-0.5-0.5-0.5h-0.79c-1.056-1.145-2.541-1.881-4.198-1.95l-0.012-0.050c0-0.552-0.448-1-1-1s-1 0.448-1 1v0.050c-1.681 0.073-3.178 0.807-4.247 1.947l-0.753 0.003c-0.276 0-0.5 0.224-0.5 0.5s0.224 0.5 0.5 0.5h0.69l-2.5 5h-0.19c0 1.1 1.34 2 3 2s3-0.9 3-2h-0.19l-2.55-5.090c0.064-0.039 0.118-0.089 0.159-0.148 0.873-1.019 2.148-1.669 3.575-1.702l0.006 10.94h-1v1h-2v1h8v-1h-2v-1h-1v-10.94c1.418 0.030 2.679 0.682 3.524 1.693 0.053 0.084 0.117 0.145 0.193 0.186l-2.527 5.061h-0.19c0 1.1 1.34 2 3 2s3-0.9 3-2h-0.19zM5 10h-4l2-3.94zM11 10l2-3.94 2 3.94h-4z\"></path>\n </svg>\n ),\n);\n\nScale.displayName = \"Scale\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Script = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 32 32\"\n id=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <polygon points=\"18.83 26 21.41 23.42 20 22 16 26 20 30 21.42 28.59 18.83 26\"></polygon>\n <polygon points=\"27.17 26 24.59 28.58 26 30 30 26 26 22 24.58 23.41 27.17 26\"></polygon>\n <path d=\"M14,28H8V4h8v6a2.0058,2.0058,0,0,0,2,2h6v6h2V10a.9092.9092,0,0,0-.3-.7l-7-7A.9087.9087,0,0,0,18,2H8A2.0058,2.0058,0,0,0,6,4V28a2.0058,2.0058,0,0,0,2,2h6ZM18,4.4,23.6,10H18Z\"></path>\n </svg>\n ),\n);\n\nScript.displayName = \"Script\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Search = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m 10,2 c -4.4064311,0 -8,3.5935689 -8,8 0,4.40644 3.5935706,8 8,8 1.837571,0 3.455411,-0.729126 4.808594,-1.777344 l 5.484375,5.484375 a 1,1 0 0 0 1.414062,0 1,1 0 0 0 0,-1.414062 L 16.222656,14.808594 C 17.270874,13.455411 18,11.837571 18,10 18,5.5935706 14.40644,2 10,2 Z m 0,2 c 3.32556,0 6,2.6744494 6,6 0,3.325562 -2.674438,6 -6,6 C 6.6744494,16 4,13.32556 4,10 4,6.6744511 6.6744511,4 10,4 Z\"\n id=\"Vector\"\n />\n </svg>\n ),\n);\n\nSearch.displayName = \"Search\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Send = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M11.7812 21.3672C11.4167 21.3672 11.1536 21.237 10.9922 20.9766C10.8307 20.7161 10.6927 20.3906 10.5781 20L9.33594 15.875C9.26302 15.6146 9.23698 15.4062 9.25781 15.25C9.27865 15.0885 9.36458 14.9271 9.51562 14.7656L17.4922 6.16406C17.5391 6.11719 17.5625 6.0651 17.5625 6.00781C17.5625 5.95052 17.5417 5.90365 17.5 5.86719C17.4583 5.83073 17.4089 5.8125 17.3516 5.8125C17.2995 5.80729 17.25 5.82812 17.2031 5.875L8.63281 13.8828C8.46094 14.0391 8.29427 14.1276 8.13281 14.1484C7.97135 14.1641 7.76562 14.1328 7.51562 14.0547L3.29688 12.7734C2.92188 12.6589 2.61198 12.5234 2.36719 12.3672C2.1224 12.2057 2 11.9453 2 11.5859C2 11.3047 2.11198 11.0625 2.33594 10.8594C2.5599 10.6562 2.83594 10.4922 3.16406 10.3672L16.6016 5.21875C16.7839 5.15104 16.9531 5.09896 17.1094 5.0625C17.2708 5.02083 17.4167 5 17.5469 5C17.8021 5 18.0026 5.07292 18.1484 5.21875C18.2943 5.36458 18.3672 5.5651 18.3672 5.82031C18.3672 5.95573 18.3464 6.10156 18.3047 6.25781C18.2682 6.41406 18.2161 6.58333 18.1484 6.76562L13.0312 20.1328C12.8854 20.5078 12.7109 20.8073 12.5078 21.0312C12.3047 21.2552 12.0625 21.3672 11.7812 21.3672Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11.7812 21.3672C11.4167 21.3672 11.1536 21.237 10.9922 20.9766C10.8307 20.7161 10.6927 20.3906 10.5781 20L9.33594 15.875C9.26302 15.6146 9.23698 15.4062 9.25781 15.25C9.27865 15.0885 9.36458 14.9271 9.51562 14.7656L17.4922 6.16406C17.5391 6.11719 17.5625 6.0651 17.5625 6.00781C17.5625 5.95052 17.5417 5.90365 17.5 5.86719C17.4583 5.83073 17.4089 5.8125 17.3516 5.8125C17.2995 5.80729 17.25 5.82812 17.2031 5.875L8.63281 13.8828C8.46094 14.0391 8.29427 14.1276 8.13281 14.1484C7.97135 14.1641 7.76562 14.1328 7.51562 14.0547L3.29688 12.7734C2.92188 12.6589 2.61198 12.5234 2.36719 12.3672C2.1224 12.2057 2 11.9453 2 11.5859C2 11.3047 2.11198 11.0625 2.33594 10.8594C2.5599 10.6562 2.83594 10.4922 3.16406 10.3672L16.6016 5.21875C16.7839 5.15104 16.9531 5.09896 17.1094 5.0625C17.2708 5.02083 17.4167 5 17.5469 5C17.8021 5 18.0026 5.07292 18.1484 5.21875C18.2943 5.36458 18.3672 5.5651 18.3672 5.82031C18.3672 5.95573 18.3464 6.10156 18.3047 6.25781C18.2682 6.41406 18.2161 6.58333 18.1484 6.76562L13.0312 20.1328C12.8854 20.5078 12.7109 20.8073 12.5078 21.0312C12.3047 21.2552 12.0625 21.3672 11.7812 21.3672Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nSend.displayName = \"Send\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Settings = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <g stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g id=\"System\" transform=\"translate(-1200.000000, 0.000000)\">\n <g id=\"settings_2_line\" transform=\"translate(1200.000000, 0.000000)\">\n <path\n d=\"M24,0 L24,24 L0,24 L0,0 L24,0 Z M12.5934901,23.257841 L12.5819402,23.2595131 L12.5108777,23.2950439 L12.4918791,23.2987469 L12.4918791,23.2987469 L12.4767152,23.2950439 L12.4056548,23.2595131 C12.3958229,23.2563662 12.3870493,23.2590235 12.3821421,23.2649074 L12.3780323,23.275831 L12.360941,23.7031097 L12.3658947,23.7234994 L12.3769048,23.7357139 L12.4804777,23.8096931 L12.4953491,23.8136134 L12.4953491,23.8136134 L12.5071152,23.8096931 L12.6106902,23.7357139 L12.6232938,23.7196733 L12.6232938,23.7196733 L12.6266527,23.7031097 L12.609561,23.275831 C12.6075724,23.2657013 12.6010112,23.2592993 12.5934901,23.257841 L12.5934901,23.257841 Z M12.8583906,23.1452862 L12.8445485,23.1473072 L12.6598443,23.2396597 L12.6498822,23.2499052 L12.6498822,23.2499052 L12.6471943,23.2611114 L12.6650943,23.6906389 L12.6699349,23.7034178 L12.6699349,23.7034178 L12.678386,23.7104931 L12.8793402,23.8032389 C12.8914285,23.8068999 12.9022333,23.8029875 12.9078286,23.7952264 L12.9118235,23.7811639 L12.8776777,23.1665331 C12.8752882,23.1545897 12.8674102,23.1470016 12.8583906,23.1452862 L12.8583906,23.1452862 Z M12.1430473,23.1473072 C12.1332178,23.1423925 12.1221763,23.1452606 12.1156365,23.1525954 L12.1099173,23.1665331 L12.0757714,23.7811639 C12.0751323,23.7926639 12.0828099,23.8018602 12.0926481,23.8045676 L12.108256,23.8032389 L12.3092106,23.7104931 L12.3186497,23.7024347 L12.3186497,23.7024347 L12.3225043,23.6906389 L12.340401,23.2611114 L12.337245,23.2485176 L12.337245,23.2485176 L12.3277531,23.2396597 L12.1430473,23.1473072 Z\"\n id=\"MingCute\"\n fillRule=\"nonzero\"\n >\n {\" \"}\n </path>\n <path\n d=\"M18,4 C18,3.44772 17.5523,3 17,3 C16.4477,3 16,3.44772 16,4 L16,5 L4,5 C3.44772,5 3,5.44772 3,6 C3,6.55228 3.44772,7 4,7 L16,7 L16,8 C16,8.55228 16.4477,9 17,9 C17.5523,9 18,8.55228 18,8 L18,7 L20,7 C20.5523,7 21,6.55228 21,6 C21,5.44772 20.5523,5 20,5 L18,5 L18,4 Z M4,11 C3.44772,11 3,11.4477 3,12 C3,12.5523 3.44772,13 4,13 L6,13 L6,14 C6,14.5523 6.44772,15 7,15 C7.55228,15 8,14.5523 8,14 L8,13 L20,13 C20.5523,13 21,12.5523 21,12 C21,11.4477 20.5523,11 20,11 L8,11 L8,10 C8,9.44772 7.55228,9 7,9 C6.44772,9 6,9.44772 6,10 L6,11 L4,11 Z M3,18 C3,17.4477 3.44772,17 4,17 L16,17 L16,16 C16,15.4477 16.4477,15 17,15 C17.5523,15 18,15.4477 18,16 L18,17 L20,17 C20.5523,17 21,17.4477 21,18 C21,18.5523 20.5523,19 20,19 L18,19 L18,20 C18,20.5523 17.5523,21 17,21 C16.4477,21 16,20.5523 16,20 L16,19 L4,19 C3.44772,19 3,18.5523 3,18 Z\"\n fill=\"currentColor\"\n >\n {\" \"}\n </path>\n </g>\n </g>\n </g>\n </svg>\n ),\n);\n\nSettings.displayName = \"Settings\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Shop = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.16222 5.6H17.8377C18.4403 5.6 18.9753 5.9856 19.1658 6.55728L20.125 9.43468C20.2301 9.74999 19.9182 10.044 19.6096 9.92061C18.6026 9.5178 17.4854 9.48497 16.4565 9.82795L15.4427 10.1659C15.1553 10.2617 14.8446 10.2617 14.5572 10.1659L13.4546 9.79833C12.5104 9.48359 11.4895 9.48359 10.5453 9.79833L9.44266 10.1659C9.15529 10.2617 8.8446 10.2617 8.55723 10.1659L7.54344 9.82795C6.5145 9.48497 5.39731 9.5178 4.39029 9.92061C4.08169 10.044 3.76983 9.74999 3.87494 9.43468L4.83407 6.55728C5.02463 5.9856 5.55962 5.6 6.16222 5.6ZM3.31617 6.05131C3.72452 4.82629 4.87093 4 6.16222 4H17.8377C19.129 4 20.2754 4.82629 20.6837 6.05132L21.6429 8.92871C22.0886 10.266 21.0633 11.5283 19.8002 11.5527V17C19.8002 18.5464 18.5466 19.8 17.0002 19.8H7.0002C5.4538 19.8 4.2002 18.5464 4.2002 17V11.5527C2.93688 11.5286 1.91122 10.2662 2.35704 8.92871L3.31617 6.05131ZM5.8002 11.2071V17C5.8002 17.6627 6.33745 18.2 7.0002 18.2H17.0002C17.6629 18.2 18.2002 17.6627 18.2002 17V11.2071C17.7855 11.1661 17.3637 11.2121 16.9624 11.3458L15.9486 11.6838C15.3328 11.889 14.6671 11.889 14.0513 11.6838L12.9486 11.3162C12.3328 11.111 11.6671 11.111 11.0513 11.3162L9.94863 11.6838C9.33283 11.889 8.66706 11.889 8.05126 11.6838L7.03747 11.3458C6.6364 11.2122 6.21474 11.1662 5.8002 11.2071Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nShop.displayName = \"Shop\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Star = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M9.15316 5.40838C10.4198 3.13613 11.0531 2 12 2C12.9469 2 13.5802 3.13612 14.8468 5.40837L15.1745 5.99623C15.5345 6.64193 15.7144 6.96479 15.9951 7.17781C16.2757 7.39083 16.6251 7.4699 17.3241 7.62805L17.9605 7.77203C20.4201 8.32856 21.65 8.60682 21.9426 9.54773C22.2352 10.4886 21.3968 11.4691 19.7199 13.4299L19.2861 13.9372C18.8096 14.4944 18.5713 14.773 18.4641 15.1177C18.357 15.4624 18.393 15.8341 18.465 16.5776L18.5306 17.2544C18.7841 19.8706 18.9109 21.1787 18.1449 21.7602C17.3788 22.3417 16.2273 21.8115 13.9243 20.7512L13.3285 20.4768C12.6741 20.1755 12.3469 20.0248 12 20.0248C11.6531 20.0248 11.3259 20.1755 10.6715 20.4768L10.0757 20.7512C7.77268 21.8115 6.62118 22.3417 5.85515 21.7602C5.08912 21.1787 5.21588 19.8706 5.4694 17.2544L5.53498 16.5776C5.60703 15.8341 5.64305 15.4624 5.53586 15.1177C5.42868 14.773 5.19043 14.4944 4.71392 13.9372L4.2801 13.4299C2.60325 11.4691 1.76482 10.4886 2.05742 9.54773C2.35002 8.60682 3.57986 8.32856 6.03954 7.77203L6.67589 7.62805C7.37485 7.4699 7.72433 7.39083 8.00494 7.17781C8.28555 6.96479 8.46553 6.64194 8.82547 5.99623L9.15316 5.40838Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nStar.displayName = \"Star\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Stop = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M4.72266 18.0033V7.01596C4.72266 6.44896 4.88356 6.00711 5.20539 5.6904C5.53231 5.37369 5.98438 5.21533 6.5616 5.21533H17.4646C18.0418 5.21533 18.4913 5.37369 18.8131 5.6904C19.1401 6.00711 19.3034 6.44896 19.3034 7.01596V18.0033C19.3034 18.5601 19.1401 18.9967 18.8131 19.3135C18.4913 19.6353 18.0418 19.7962 17.4646 19.7962H6.5616C5.98438 19.7962 5.53231 19.6353 5.20539 19.3135C4.88356 18.9967 4.72266 18.5601 4.72266 18.0033ZM6.23212 17.5665C6.23212 17.8014 6.29598 17.9853 6.42369 18.1182C6.55138 18.2458 6.72762 18.3097 6.95238 18.3097H17.0968C17.3266 18.3097 17.5028 18.2458 17.6254 18.1182C17.7532 17.9853 17.8169 17.8014 17.8169 17.5665V7.44505C17.8169 7.21518 17.7532 7.03639 17.6254 6.9087C17.5028 6.77589 17.3266 6.70947 17.0968 6.70947H6.95238C6.72762 6.70947 6.55138 6.77589 6.42369 6.9087C6.29598 7.03639 6.23212 7.21518 6.23212 7.44505V17.5665Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nStop.displayName = \"Stop\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Sun = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M12 0a1 1 0 0 1 1 1v4a1 1 0 1 1-2 0V1a1 1 0 0 1 1-1ZM4.929 3.515a1 1 0 0 0-1.414 1.414l2.828 2.828a1 1 0 0 0 1.414-1.414L4.93 3.515ZM1 11a1 1 0 1 0 0 2h4a1 1 0 1 0 0-2H1ZM18 12a1 1 0 0 1 1-1h4a1 1 0 1 1 0 2h-4a1 1 0 0 1-1-1ZM17.657 16.243a1 1 0 0 0-1.414 1.414l2.828 2.828a1 1 0 1 0 1.414-1.414l-2.828-2.828ZM7.757 17.657a1 1 0 1 0-1.414-1.414L3.515 19.07a1 1 0 1 0 1.414 1.414l2.828-2.828ZM20.485 4.929a1 1 0 0 0-1.414-1.414l-2.828 2.828a1 1 0 1 0 1.414 1.414l2.828-2.828ZM13 19a1 1 0 1 0-2 0v4a1 1 0 1 0 2 0v-4ZM12 7a5 5 0 1 0 0 10 5 5 0 0 0 0-10Z\"></path>\n </svg>\n ),\n);\n\nSun.displayName = \"Sun\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Suspend = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M16.1479 14.9733C16.4441 14.9733 16.7353 14.958 17.0213 14.9274C17.3125 14.8916 17.5858 14.8456 17.8412 14.7894C18.1018 14.7281 18.329 14.6541 18.5231 14.5672C18.6356 14.5213 18.7301 14.4906 18.8066 14.4753C18.8884 14.46 18.9676 14.4523 19.0442 14.4523C19.1975 14.4523 19.3354 14.5085 19.4579 14.6209C19.5857 14.7332 19.6495 14.8865 19.6495 15.0806C19.6495 15.1368 19.6393 15.2134 19.6189 15.3105C19.6036 15.4075 19.5704 15.5148 19.5193 15.6322C19.1005 16.5927 18.5282 17.4202 17.803 18.1149C17.0827 18.8146 16.2449 19.351 15.2897 19.7239C14.3345 20.1019 13.3052 20.2909 12.2018 20.2909C11.032 20.2909 9.95676 20.0892 8.976 19.6857C7.99523 19.2871 7.14216 18.7278 6.41681 18.0076C5.69655 17.2822 5.1372 16.4292 4.73877 15.4484C4.34033 14.4676 4.14111 13.3923 4.14111 12.2226C4.14111 11.1448 4.34799 10.1155 4.76175 9.13469C5.17551 8.14881 5.74763 7.28298 6.4781 6.53718C7.21368 5.78628 8.05908 5.21672 9.01431 4.8285C9.13691 4.77743 9.23907 4.74422 9.32079 4.72889C9.40764 4.70846 9.47405 4.69824 9.52002 4.69824C9.71924 4.69824 9.88014 4.7672 10.0027 4.90512C10.1253 5.04305 10.1866 5.19374 10.1866 5.35719C10.1866 5.44914 10.1739 5.53854 10.1483 5.62538C10.1279 5.70711 10.0845 5.80928 10.0181 5.93187C9.87503 6.20771 9.7601 6.58061 9.67326 7.05056C9.59153 7.52051 9.55067 8.03643 9.55067 8.59833C9.55067 9.91113 9.81884 11.0451 10.3552 12.0004C10.8916 12.9505 11.6527 13.6835 12.6386 14.1994C13.6244 14.7154 14.7942 14.9733 16.1479 14.9733ZM5.61993 12.1766C5.61993 13.1421 5.78339 14.0283 6.11031 14.8354C6.43724 15.6426 6.89697 16.3449 7.48952 16.9425C8.08718 17.5351 8.78955 17.9949 9.59664 18.3217C10.4037 18.6538 11.2849 18.8197 12.2401 18.8197C12.9859 18.8197 13.7011 18.7099 14.3856 18.4903C15.0752 18.2707 15.6983 17.9539 16.2551 17.5402C16.817 17.1264 17.2844 16.6335 17.6573 16.0614C17.3917 16.1584 17.1133 16.2274 16.8221 16.2682C16.5361 16.3092 16.2271 16.3296 15.895 16.3296C14.2859 16.3296 12.9042 16.0282 11.7497 15.4254C10.6004 14.8175 9.71669 13.9491 9.0986 12.8202C8.48561 11.6913 8.17913 10.3402 8.17913 8.7669C8.17913 8.3889 8.20466 8.02877 8.25575 7.68653C8.31194 7.33917 8.39111 7.0097 8.49327 6.69809C7.90073 7.09653 7.3899 7.58436 6.96083 8.16158C6.53174 8.73881 6.1997 9.37223 5.96472 10.0618C5.73486 10.7514 5.61993 11.4564 5.61993 12.1766Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nSuspend.displayName = \"Suspend\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ThemeAuto = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n focusable=\"false\"\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M10.85 12.65h2.3L12 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zM14.3 16l-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9z\"\n ></path>\n </svg>\n ),\n);\n\nThemeAuto.displayName = \"ThemeAuto\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ThemeDark = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n focusable=\"false\"\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zM12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6c3.31 0 6 2.69 6 6s-2.69 6-6 6\"\n ></path>\n </svg>\n ),\n);\n\nThemeDark.displayName = \"ThemeDark\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ThemeLight = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n focusable=\"false\"\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zM12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6 6 2.69 6 6-2.69 6-6 6m0-10c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4\"\n ></path>\n </svg>\n ),\n);\n\nThemeLight.displayName = \"ThemeLight\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Trash = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M10.43 17.781a.576.576 0 0 1-.414-.148.577.577 0 0 1-.164-.406l-.235-8.063a.5.5 0 0 1 .149-.398.56.56 0 0 1 .414-.157.56.56 0 0 1 .414.157c.11.099.166.229.172.39L11 17.22a.55.55 0 0 1-.156.406.56.56 0 0 1-.414.156zm3.14-.11a.57.57 0 0 1-.422-.155.525.525 0 0 1-.148-.407l.234-8.054c.006-.167.06-.3.164-.399a.56.56 0 0 1 .415-.156c.177 0 .315.052.414.156a.5.5 0 0 1 .148.399l-.227 8.062a.561.561 0 0 1-.171.406.566.566 0 0 1-.407.149zM8.36 6.329V4.672c0-.615.187-1.094.562-1.438.38-.343.909-.515 1.586-.515h2.976c.678 0 1.204.172 1.579.515.38.344.57.823.57 1.438v1.656h-1.594V4.742a.552.552 0 0 0-.187-.437c-.12-.115-.282-.172-.485-.172h-2.742a.7.7 0 0 0-.492.172.564.564 0 0 0-.18.437v1.586H8.36zM4.968 7.352a.759.759 0 0 1-.547-.22.729.729 0 0 1-.227-.546.72.72 0 0 1 .227-.54.759.759 0 0 1 .547-.218h14.07c.214 0 .393.073.54.219.15.14.226.32.226.539a.742.742 0 0 1-.22.547.742.742 0 0 1-.546.219H4.97zm3.437 13.171c-.63 0-1.133-.174-1.508-.523-.375-.349-.575-.838-.601-1.469L5.766 7.195h1.57l.523 11.024c.01.229.081.414.211.554.136.141.31.211.524.211h6.804c.22 0 .394-.07.524-.21.135-.136.208-.32.219-.555l.507-11.024h1.594l-.531 11.328c-.026.636-.23 1.128-.61 1.477-.374.349-.874.523-1.5.523H8.407z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nTrash.displayName = \"Trash\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const UX = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"#000000\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m27 0c2.7614237 0 5 2.23857625 5 5v22c0 2.7614237-2.2385763 5-5 5h-21c-3.23839694 0-5.87757176-2.5655749-5.99586153-5.7750617l-.00413847-.2249383v-8c0-3.2383969 2.56557489-5.8775718 5.77506174-5.9958615l.22493826-.0041385h6v-7c0-2.76142375 2.2385763-5 5-5zm-15 14h-6c-2.14219539 0-3.89107888 1.6839685-3.99510469 3.8003597l-.00489531.1996403v8c0 2.1421954 1.68396847 3.8910789 3.80035966 3.9951047l.19964034.0048953 7.0005351.0011995c-.6282342-.835866-1.0005351-1.875055-1.0005351-3.0011995zm5.0856015-11.99929704-.0856015-.00070296c-1.5976809 0-2.9036609 1.24891996-2.9949073 2.82372721l-.0050927.17627279v22c0 1.5976809 1.24892 2.9036609 2.8237272 2.9949073l.1762728.0050927h10c1.5976809 0 2.9036609-1.24892 2.9949073-2.8237272l.0050927-.1762728v-22c0-1.59768088-1.24892-2.90366088-2.8237272-2.99490731l-.1762728-.00509269-.0856015.00070296c-.2061166.58222896-.7615518.99929704-1.4143985.99929704h-7c-.6528467 0-1.2082819-.41706808-1.4143985-.99929704zm8.9143985 12.99929704c.5522847 0 1 .4477153 1 1s-.4477153 1-1 1h-8c-.5522847 0-1-.4477153-1-1s.4477153-1 1-1zm-3-5c.5522847 0 1 .4477153 1 1s-.4477153 1-1 1h-5c-.5522847 0-1-.4477153-1-1s.4477153-1 1-1z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nUX.displayName = \"UX\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const User = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 1C8.96243 1 6.5 3.46243 6.5 6.5C6.5 9.53757 8.96243 12 12 12C15.0376 12 17.5 9.53757 17.5 6.5C17.5 3.46243 15.0376 1 12 1ZM8.5 6.5C8.5 4.567 10.067 3 12 3C13.933 3 15.5 4.567 15.5 6.5C15.5 8.433 13.933 10 12 10C10.067 10 8.5 8.433 8.5 6.5Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M8 14C4.68629 14 2 16.6863 2 20V22C2 22.5523 2.44772 23 3 23C3.55228 23 4 22.5523 4 22V20C4 17.7909 5.79086 16 8 16H16C18.2091 16 20 17.7909 20 20V22C20 22.5523 20.4477 23 21 23C21.5523 23 22 22.5523 22 22V20C22 16.6863 19.3137 14 16 14H8Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nUser.displayName = \"User\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Users = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9 0C5.96243 0 3.5 2.46243 3.5 5.5C3.5 8.53757 5.96243 11 9 11C12.0376 11 14.5 8.53757 14.5 5.5C14.5 2.46243 12.0376 0 9 0ZM5.5 5.5C5.5 3.567 7.067 2 9 2C10.933 2 12.5 3.567 12.5 5.5C12.5 7.433 10.933 9 9 9C7.067 9 5.5 7.433 5.5 5.5Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M15.5 0C14.9477 0 14.5 0.447715 14.5 1C14.5 1.55228 14.9477 2 15.5 2C17.433 2 19 3.567 19 5.5C19 7.433 17.433 9 15.5 9C14.9477 9 14.5 9.44771 14.5 10C14.5 10.5523 14.9477 11 15.5 11C18.5376 11 21 8.53757 21 5.5C21 2.46243 18.5376 0 15.5 0Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M19.0837 14.0157C19.3048 13.5096 19.8943 13.2786 20.4004 13.4997C22.5174 14.4246 24 16.538 24 19V21C24 21.5523 23.5523 22 23 22C22.4477 22 22 21.5523 22 21V19C22 17.3613 21.0145 15.9505 19.5996 15.3324C19.0935 15.1113 18.8625 14.5217 19.0837 14.0157Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M6 13C2.68629 13 0 15.6863 0 19V21C0 21.5523 0.447715 22 1 22C1.55228 22 2 21.5523 2 21V19C2 16.7909 3.79086 15 6 15H12C14.2091 15 16 16.7909 16 19V21C16 21.5523 16.4477 22 17 22C17.5523 22 18 21.5523 18 21V19C18 15.6863 15.3137 13 12 13H6Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nUsers.displayName = \"Users\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Verified = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M9.5924 3.20027C9.34888 3.4078 9.22711 3.51158 9.09706 3.59874C8.79896 3.79854 8.46417 3.93721 8.1121 4.00672C7.95851 4.03705 7.79903 4.04977 7.48008 4.07522C6.6787 4.13918 6.278 4.17115 5.94371 4.28923C5.17051 4.56233 4.56233 5.17051 4.28923 5.94371C4.17115 6.278 4.13918 6.6787 4.07522 7.48008C4.04977 7.79903 4.03705 7.95851 4.00672 8.1121C3.93721 8.46417 3.79854 8.79896 3.59874 9.09706C3.51158 9.22711 3.40781 9.34887 3.20027 9.5924C2.67883 10.2043 2.4181 10.5102 2.26522 10.8301C1.91159 11.57 1.91159 12.43 2.26522 13.1699C2.41811 13.4898 2.67883 13.7957 3.20027 14.4076C3.40778 14.6511 3.51158 14.7729 3.59874 14.9029C3.79854 15.201 3.93721 15.5358 4.00672 15.8879C4.03705 16.0415 4.04977 16.201 4.07522 16.5199C4.13918 17.3213 4.17115 17.722 4.28923 18.0563C4.56233 18.8295 5.17051 19.4377 5.94371 19.7108C6.278 19.8288 6.6787 19.8608 7.48008 19.9248C7.79903 19.9502 7.95851 19.963 8.1121 19.9933C8.46417 20.0628 8.79896 20.2015 9.09706 20.4013C9.22711 20.4884 9.34887 20.5922 9.5924 20.7997C10.2043 21.3212 10.5102 21.5819 10.8301 21.7348C11.57 22.0884 12.43 22.0884 13.1699 21.7348C13.4898 21.5819 13.7957 21.3212 14.4076 20.7997C14.6511 20.5922 14.7729 20.4884 14.9029 20.4013C15.201 20.2015 15.5358 20.0628 15.8879 19.9933C16.0415 19.963 16.201 19.9502 16.5199 19.9248C17.3213 19.8608 17.722 19.8288 18.0563 19.7108C18.8295 19.4377 19.4377 18.8295 19.7108 18.0563C19.8288 17.722 19.8608 17.3213 19.9248 16.5199C19.9502 16.201 19.963 16.0415 19.9933 15.8879C20.0628 15.5358 20.2015 15.201 20.4013 14.9029C20.4884 14.7729 20.5922 14.6511 20.7997 14.4076C21.3212 13.7957 21.5819 13.4898 21.7348 13.1699C22.0884 12.43 22.0884 11.57 21.7348 10.8301C21.5819 10.5102 21.3212 10.2043 20.7997 9.5924C20.5922 9.34887 20.4884 9.22711 20.4013 9.09706C20.2015 8.79896 20.0628 8.46417 19.9933 8.1121C19.963 7.95851 19.9502 7.79903 19.9248 7.48008C19.8608 6.6787 19.8288 6.278 19.7108 5.94371C19.4377 5.17051 18.8295 4.56233 18.0563 4.28923C17.722 4.17115 17.3213 4.13918 16.5199 4.07522C16.201 4.04977 16.0415 4.03705 15.8879 4.00672C15.5358 3.93721 15.201 3.79854 14.9029 3.59874C14.7729 3.51158 14.6511 3.40781 14.4076 3.20027C13.7957 2.67883 13.4898 2.41811 13.1699 2.26522C12.43 1.91159 11.57 1.91159 10.8301 2.26522C10.5102 2.4181 10.2043 2.67883 9.5924 3.20027ZM16.3735 9.86314C16.6913 9.5453 16.6913 9.03 16.3735 8.71216C16.0557 8.39433 15.5403 8.39433 15.2225 8.71216L10.3723 13.5624L8.77746 11.9676C8.45963 11.6498 7.94432 11.6498 7.62649 11.9676C7.30866 12.2854 7.30866 12.8007 7.62649 13.1186L9.79678 15.2889C10.1146 15.6067 10.6299 15.6067 10.9478 15.2889L16.3735 9.86314Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nVerified.displayName = \"Verified\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ViewGrid = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M5.853 10.903c-.626 0-1.092-.15-1.4-.453C4.151 10.143 4 9.668 4 9.027v-3.15c0-.636.151-1.108.453-1.416.308-.307.774-.461 1.4-.461h3.205c.62 0 1.082.154 1.384.461.308.308.461.78.461 1.416v3.15c0 .641-.153 1.116-.46 1.423-.303.302-.764.454-1.385.454H5.853zm.008-1.447h3.181c.138 0 .242-.034.31-.103.07-.07.104-.178.104-.326V5.869c0-.143-.034-.25-.103-.318-.07-.069-.173-.103-.31-.103H5.86c-.138 0-.241.034-.31.103-.069.069-.103.175-.103.318v3.158c0 .148.034.257.103.326.069.069.172.103.31.103zm8.089 1.447c-.626 0-1.093-.15-1.4-.453-.302-.307-.454-.782-.454-1.423v-3.15c0-.636.152-1.108.454-1.416.307-.307.774-.461 1.4-.461h3.197c.626 0 1.09.154 1.392.461.307.308.461.78.461 1.416v3.15c0 .641-.154 1.116-.461 1.423-.303.302-.767.454-1.392.454H13.95zm.008-1.447h3.18c.144 0 .247-.034.311-.103.069-.07.103-.178.103-.326V5.869c0-.143-.034-.25-.103-.318-.064-.069-.167-.103-.31-.103h-3.181c-.144 0-.25.034-.319.103-.063.069-.095.175-.095.318v3.158c0 .148.032.257.095.326.07.069.175.103.319.103zM5.853 19c-.626 0-1.092-.154-1.4-.461-.302-.308-.453-.78-.453-1.416v-3.15c0-.641.151-1.113.453-1.415.308-.308.774-.461 1.4-.461h3.205c.62 0 1.082.153 1.384.46.308.303.461.775.461 1.416v3.15c0 .636-.153 1.108-.46 1.416-.303.307-.764.461-1.385.461H5.853zm.008-1.448h3.181c.138 0 .242-.034.31-.103.07-.069.104-.175.104-.318v-3.165c0-.144-.034-.25-.103-.319-.07-.069-.173-.103-.31-.103H5.86c-.138 0-.241.034-.31.103-.069.07-.103.175-.103.319v3.165c0 .143.034.25.103.318.069.069.172.103.31.103zM13.95 19c-.626 0-1.093-.154-1.4-.461-.302-.308-.454-.78-.454-1.416v-3.15c0-.641.152-1.113.454-1.415.307-.308.774-.461 1.4-.461h3.197c.626 0 1.09.153 1.392.46.307.303.461.775.461 1.416v3.15c0 .636-.154 1.108-.461 1.416-.303.307-.767.461-1.392.461H13.95zm.008-1.448h3.18c.144 0 .247-.034.311-.103.069-.069.103-.175.103-.318v-3.165c0-.144-.034-.25-.103-.319-.064-.069-.167-.103-.31-.103h-3.181c-.144 0-.25.034-.319.103-.063.07-.095.175-.095.319v3.165c0 .143.032.25.095.318.07.069.175.103.319.103z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nViewGrid.displayName = \"ViewGrid\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ViewRows = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M5.853 10.903c-.626 0-1.092-.15-1.4-.453C4.151 10.143 4 9.668 4 9.027v-3.15c0-.636.151-1.108.453-1.416.308-.307.774-.461 1.4-.461h11.294c.62 0 1.082.154 1.384.461.307.308.461.78.461 1.416v3.15c0 .641-.154 1.116-.461 1.423-.302.302-.764.454-1.384.454H5.853zm.008-1.447h11.27c.138 0 .241-.034.31-.103.07-.07.104-.178.104-.326V5.869c0-.143-.035-.25-.104-.318-.069-.069-.172-.103-.31-.103H5.861c-.138 0-.241.034-.31.103-.069.069-.103.175-.103.318v3.158c0 .148.034.257.103.326.069.069.172.103.31.103zM5.853 19c-.626 0-1.092-.154-1.4-.461-.302-.308-.453-.78-.453-1.416v-3.15c0-.641.151-1.113.453-1.415.308-.308.774-.461 1.4-.461h11.294c.62 0 1.082.153 1.384.46.307.303.461.775.461 1.416v3.15c0 .636-.154 1.108-.461 1.416-.302.307-.764.461-1.384.461H5.853zm.008-1.448h11.27c.138 0 .241-.034.31-.103.07-.069.104-.175.104-.318v-3.165c0-.144-.035-.25-.104-.319-.069-.069-.172-.103-.31-.103H5.861c-.138 0-.241.034-.31.103-.069.07-.103.175-.103.319v3.165c0 .143.034.25.103.318.069.069.172.103.31.103z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nViewRows.displayName = \"ViewRows\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Library = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>Library</title>\n <g\n id=\"Library\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M14.0083644,0.939560224 L14.0083644,13.8893447 L13.6610723,14.0007356 L7.65153252,15.9282414 L7.4982496,15.9774055 L7.34507468,15.9279058 L1.38047408,14.0004001 L1.03422406,13.8885067 L1.03422406,0.942580109 L1.60961539,1.03034254 C4.43406394,1.4611458 6.3457687,2.00700515 7.38381906,2.71598132 L7.50622406,2.80462601 L7.6373061,2.7149727 C8.64753858,2.05347306 10.4414399,1.52507801 13.0519567,1.09196389 L13.4304464,1.03073453 L14.0083644,0.939560224 Z M13.0082241,2.11262601 L12.8871089,2.1344342 C10.2880887,2.58738735 8.62348941,3.13786595 7.93659592,3.73617771 L7.85254932,3.81448555 L7.66722406,3.99956022 L8,4 L7.99922406,14.7665602 L13.0082241,13.158626 L13.0082241,2.11262601 Z M2.03422406,2.11062601 L2.03422406,13.160626 L6.99922406,14.7645602 L7,4 L7.31822406,3.99956022 L7.13402945,3.80304568 C6.53919545,3.16845709 4.8632229,2.59037382 2.15686043,2.13119177 L2.03422406,2.11062601 Z\"\n id=\"Combined-Shape\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nLibrary.displayName = \"Library\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Host = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>catalog_provider</title>\n <g\n id=\"catalog_provider\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M5,2 C5.55228475,2 6,2.44771525 6,3 L6,14 C6,14.5522847 5.55228475,15 5,15 L3,15 C2.44771525,15 2,14.5522847 2,14 L2,3 C2,2.44771525 2.44771525,2 3,2 L5,2 Z M11,2 C11.5522847,2 12,2.44771525 12,3 L12,14 C12,14.5522847 11.5522847,15 11,15 L9,15 C8.44771525,15 8,14.5522847 8,14 L8,3 C8,2.44771525 8.44771525,2 9,2 L11,2 Z M4,11 C3.44771525,11 3,11.4477153 3,12 C3,12.5522847 3.44771525,13 4,13 C4.55228475,13 5,12.5522847 5,12 C5,11.4477153 4.55228475,11 4,11 Z M10,11 C9.44771525,11 9,11.4477153 9,12 C9,12.5522847 9.44771525,13 10,13 C10.5522847,13 11,12.5522847 11,12 C11,11.4477153 10.5522847,11 10,11 Z\"\n id=\"Combined-Shape\"\n fill=\"currentColor\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nHost.displayName = \"Host\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const VirtualMachine = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>virtual_machine</title>\n <g\n id=\"virtual_machine\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M4.5,14 C4.22385763,14 4,13.7761424 4,13.5 C4,13.2238576 4.22385763,13 4.5,13 L6,13 L6,12 L3,12 C1.8954305,12 1,11.1045695 1,10 L1,4 C1,2.8954305 1.8954305,2 3,2 L13,2 C14.1045695,2 15,2.8954305 15,4 L15,10 C15,11.1045695 14.1045695,12 13,12 L10,12 L10,13 L11.5,13 C11.7761424,13 12,13.2238576 12,13.5 C12,13.7761424 11.7761424,14 11.5,14 L4.5,14 Z M13,3 L3,3 C2.44771525,3 2,3.44771525 2,4 L2,10 C2,10.5522847 2.44771525,11 3,11 L13,11 C13.5522847,11 14,10.5522847 14,10 L14,4 C14,3.44771525 13.5522847,3 13,3 Z\"\n id=\"Shape\"\n fill=\"currentColor\"\n ></path>\n </g>\n </svg>\n));\n\nVirtualMachine.displayName = \"VirtualMachine\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Role = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>remote_hosts_management_role</title>\n <g\n id=\"remote_hosts_management_role\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M8.52261263,14.0549475 L8.09072524,14.0549475 L7.99886963,13.9359472 L7.68109348,13.7817024 C7.11085943,13.4937372 6.56212167,13.1703049 6.03543684,12.8115392 L5.64456683,12.5358421 C4.79772025,11.9175832 4.16798291,11.3225072 3.6742663,10.6203175 C3.19022463,9.93193302 2.93238191,9.22212152 2.93172116,8.45186088 L2.93148896,3.37214596 C2.93162198,2.9107786 3.16134138,2.60235027 3.60212938,2.4682822 C3.98782224,2.35091617 3.98782224,2.35091617 4.37355953,2.23348466 C6.24828124,1.66275476 7.07927705,1.41073863 8.11895509,1.09906136 C8.31648258,1.03985 8.54512169,1.04042748 8.74276011,1.09969537 C9.4370912,1.30794988 9.99208789,1.47601303 11.2395016,1.85495311 C12.2320199,2.1564609 12.6747209,2.29067371 13.2255636,2.45666557 C13.5641452,2.55870558 13.8076311,2.76575932 13.9099763,3.10859064 L13.9308696,3.25161795 L13.9215557,8.74578657 C13.9197741,8.75514753 13.9197741,8.75514753 13.9171313,8.76989039 L13.9112585,8.80242216 C13.9079619,8.81956542 13.9045576,8.83418977 13.8943445,8.87806283 C13.8771617,8.94386498 13.8640946,8.99907101 13.8350916,9.12591984 C13.7617028,9.44689511 13.7222086,9.59334119 13.6476519,9.77970142 C13.3614875,10.4949556 12.8956813,11.0908136 12.1913459,11.737816 C11.3488645,12.511698 10.3718181,13.1660603 9.21205213,13.7635735 C9.1233448,13.8092799 9.05237926,13.8456306 8.89349015,13.9268577 C8.81933562,13.9647673 8.81933562,13.9647673 8.75048972,14 L8.52186963,13.5549475 L8.52261263,14.0549475 Z M8.43014272,2.054942 L8.4061031,2.05694758 C7.36824847,2.36807823 6.53815952,2.61981934 4.67183698,3.18799224 C4.60968732,3.20691271 4.56245045,3.22129321 4.52083671,3.23396169 L4.32063439,3.29490613 C4.20815461,3.32914333 4.1136551,3.35789946 3.89315624,3.42499708 L3.93086963,3.41294716 L3.93172079,8.45100026 C3.93213245,8.93088525 4.07552677,9.38547738 4.3611679,9.84688122 L4.49229237,10.0451364 C4.91455435,10.6456995 5.46849712,11.1691528 6.23420684,11.7281759 C6.95490279,12.2543101 7.72202877,12.7063782 8.53376045,13.0839497 L8.43586963,13.0369472 C8.56503229,12.9716751 8.63509088,12.9358146 8.7028274,12.9009878 L8.75404358,12.8746257 C9.83930862,12.3154955 10.7434411,11.7099662 11.5148531,11.0013668 C12.1186093,10.4467564 12.4977433,9.96176932 12.7192001,9.40824863 C12.7679461,9.28640413 12.7984751,9.17320127 12.8599634,8.90427423 L12.880941,8.81304101 C12.8992173,8.73424375 12.911303,8.68470851 12.9267276,8.62563979 C12.9274428,8.62275741 12.9274428,8.62275741 12.932586,8.59475763 L12.9308696,8.60094716 L12.9308696,3.41194716 L12.8009622,3.37311511 C12.3524442,3.23784094 11.9414784,3.11327484 11.1894271,2.88485859 L10.9532005,2.81310365 C9.70254685,2.43317935 9.14829994,2.26534325 8.45549314,2.05754592 C8.4444007,2.05421952 8.4154478,2.05414639 8.4061031,2.05694758 L8.43014272,2.054942 Z\"\n id=\"Fill-1\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nRole.displayName = \"Role\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Roles = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>remote_hosts_management_roles</title>\n <g\n id=\"remote_hosts_management_roles\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M10.2546711,5.03500986 L13.3928001,5.93970436 C13.6738768,6.02038003 13.8859552,6.19213778 13.9766765,6.48156078 L13.9995665,6.63111359 L13.9995665,10.2298539 L13.9823406,10.3672931 L13.8977254,10.7110561 C13.8610139,10.855936 13.8330477,10.9441749 13.787333,11.0530013 C13.5751887,11.5579958 13.2343522,11.9732312 12.7243458,12.4194139 C12.2094938,12.8698233 11.6255613,13.2597113 10.9511789,13.6161073 L10.1792011,14 L9.69478706,14 L9.60756646,13.8919997 L9.35510065,13.7747987 C8.99227803,13.5974771 8.64174688,13.4006979 8.30381537,13.1845274 L7.97009516,12.9618957 C7.36452611,12.5408395 6.91164465,12.1332639 6.55400513,11.6488318 C6.19468899,11.1621605 6.00066283,10.6534635 6.00016261,10.0981077 L6,6.71141034 C6.00011718,6.32433038 6.21060953,6.05517466 6.58217015,5.94754401 L9.74446495,5.03458147 C9.90699992,4.98817966 10.0922604,4.98862529 10.2546711,5.03500986 Z M12.9995665,6.86699973 L9.998,6.001 L7.0605359,6.85005612 L6.99956646,6.86699973 L7.0001622,10.097204 C7.00041217,10.3747271 7.08678916,10.6407425 7.26293433,10.9162413 L7.35850446,11.0548782 C7.64204687,11.4389438 8.01774149,11.7770544 8.54095904,12.140851 C8.93834482,12.4171424 9.35631709,12.6623774 9.79417017,12.8763639 L10.0025665,12.9729997 L10.1658359,12.8938943 C10.9147059,12.5264477 11.5368442,12.1296212 12.0659073,11.6667794 C12.4715666,11.3118854 12.7221883,11.0065573 12.8653777,10.6657049 L12.8977581,10.5760199 C12.9030457,10.5589368 12.9084427,10.5402479 12.914195,10.5191463 L12.9995665,10.1769997 L12.9995665,6.86699973 Z M6.25467113,2.03500986 L9.39280014,2.93970436 C9.67387677,3.02038003 9.88595519,3.19213778 9.97667646,3.48156078 L9.99956646,3.63111359 L9.999,4 L8.999,4 L8.99956646,3.86699973 L5.998,3.001 L3.0605359,3.85005612 L2.99956646,3.86699973 L3.0001622,7.09720405 C3.00041217,7.37472711 3.08678916,7.64074246 3.26293433,7.91624132 L3.35850446,8.05487823 C3.64204687,8.43894382 4.01774149,8.77705437 4.54095904,9.14085096 C4.69094012,9.24512871 4.84385366,9.34498261 4.99966171,9.44040232 L5,10.592 C4.75999056,10.4641364 4.52910305,10.3286411 4.30381537,10.1845274 L3.97009516,9.96189568 C3.36452611,9.54083955 2.91164465,9.13326386 2.55400513,8.64883178 C2.19468899,8.16216047 2.00066283,7.65346349 2.00016261,7.09810771 L2,3.71141034 C2.00011718,3.32433038 2.21060953,3.05517466 2.58217015,2.94754401 L5.74446495,2.03458147 C5.90699992,1.98817966 6.0922604,1.98862529 6.25467113,2.03500986 Z\"\n id=\"Shape\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nRoles.displayName = \"Role\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Cache = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>catalog_cache</title>\n <g\n id=\"catalog_cache\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M8.5,1 C12.0898509,1 15,3.91014913 15,7.5 C15,11.0898509 12.0898509,14 8.5,14 C4.91014913,14 2,11.0898509 2,7.5 C2,3.91014913 4.91014913,1 8.5,1 Z M8.5,2 C5.46243388,2 3,4.46243388 3,7.5 C3,10.5375661 5.46243388,13 8.5,13 C11.5375661,13 14,10.5375661 14,7.5 C14,4.46243388 11.5375661,2 8.5,2 Z M9.0001365,4 L8.99872252,7 L12,7 L12,8 L8,8 L8,4 L9.0001365,4 Z\"\n id=\"Combined-Shape\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nCache.displayName = \"Cache\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Claim = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>remote_hosts_management_claim</title>\n <g\n id=\"remote_hosts_management_claim\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M8,1 C9.65685425,1 11,2.34314575 11,4 L11,6 C12.1045695,6 13,6.8954305 13,8 L13,12 C13,13.1045695 12.1045695,14 11,14 L4,14 C2.8954305,14 2,13.1045695 2,12 L2,8 C2,6.8954305 2.8954305,6 4,6 L4,4 C4,2.34314575 5.34314575,1 7,1 L8,1 Z M11,7 L4,7 C3.44771525,7 3,7.44771525 3,8 L3,12 C3,12.5522847 3.44771525,13 4,13 L11,13 C11.5522847,13 12,12.5522847 12,12 L12,8 C12,7.44771525 11.5522847,7 11,7 Z M8,2 L7,2 C5.8954305,2 5,2.8954305 5,4 L5,6 L10,6 L10,4 C10,2.9456382 9.18412221,2.08183488 8.14926234,2.00548574 L8,2 Z\"\n id=\"Shape\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nClaim.displayName = \"Claim\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Claims = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>remote_hosts_management_claims</title>\n <g\n id=\"remote_hosts_management_claims\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M10.5,4 C11.8807119,4 13,5.11928813 13,6.5 L13,8 C13.5522847,8 14,8.44771525 14,9 L14,13 C14,13.5522847 13.5522847,14 13,14 L8,14 C7.44771525,14 7,13.5522847 7,13 L7,9 C7,8.44771525 7.44771525,8 8,8 L8,6.5 C8,5.11928813 9.11928813,4 10.5,4 Z M13,9 L8,9 L8,13 L13,13 L13,9 Z M5.5,2 C6.4721012,2 7.31461527,2.55482847 7.72814766,3.36509085 C7.27104161,3.95546042 7,4.69607763 7,5.5 L7,4.5 C7,3.72030388 6.40511192,3.07955132 5.64446001,3.00686658 L5.5,3 C4.67157288,3 4,3.67157288 4,4.5 L4,6 L7,6 L7,6.26756439 C6.848186,6.35538405 6.70898693,6.46258595 6.58578644,6.58578644 C6.46249782,6.70907505 6.35523069,6.84838515 6.26737596,7.00032581 L3,7 L3,11 L6,11 L6,12 L3,12 C2.44771525,12 2,11.5522847 2,11 L2,7 C2,6.44771525 2.44771525,6 3,6 L3,4.5 C3,3.11928813 4.11928813,2 5.5,2 Z M10.5,5 C9.67157288,5 9,5.67157288 9,6.5 L9,8 L12,8 L12,6.5 C12,5.72030388 11.4051119,5.07955132 10.64446,5.00686658 L10.5,5 Z\"\n id=\"Shape\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nClaims.displayName = \"Claims\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const KeyManagement = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <title>remote_hosts_management_key</title>\n <g\n id=\"remote_hosts_management_key\"\n stroke=\"none\"\n strokeWidth=\"1\"\n fill=\"none\"\n fillRule=\"evenodd\"\n >\n <path\n d=\"M6,2 C8.209139,2 10,3.790861 10,6 C10,6.36113362 9.95214232,6.71108947 9.86242313,7.04387141 L13.9739242,11.1563871 L14.0065031,14.0173931 L11.1454971,13.9848142 L7.0268506,9.86697151 C6.69916388,9.95375886 6.35498204,10 6,10 C3.790861,10 2,8.209139 2,6 C2,3.790861 3.790861,2 6,2 Z M6,3 C4.34314575,3 3,4.34314575 3,6 C3,7.65685425 4.34314575,9 6,9 C6.26363661,9 6.52188668,8.96623246 6.77082915,8.9003004 L7.32700996,8.75299672 L7.73388837,9.15979572 L11.564,12.989 L12.994,13.005 L12.978,11.575 L9.15522912,7.75089095 L8.74636182,7.34192276 L8.89689778,6.78356233 C8.9650682,6.53070804 9,6.26814159 9,6 C9,4.34314575 7.65685425,3 6,3 Z\"\n id=\"Combined-Shape\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n transform=\"translate(8.0033, 8.0087) scale(-1, 1) translate(-8.0033, -8.0087)\"\n ></path>\n </g>\n </svg>\n ),\n);\n\nKeyManagement.displayName = \"KeyManagement\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Windows = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 20 20\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <g\n id=\"Dribbble-Light-Preview\"\n transform=\"translate(-60.000000, -7439.000000)\"\n fill=\"currentColor\"\n >\n <g id=\"icons\" transform=\"translate(56.000000, 160.000000)\">\n <path d=\"M13.1458647,7289.43426 C13.1508772,7291.43316 13.1568922,7294.82929 13.1619048,7297.46884 C16.7759398,7297.95757 20.3899749,7298.4613 23.997995,7299 C23.997995,7295.84873 24.002005,7292.71146 23.997995,7289.71311 C20.3809524,7289.71311 16.7649123,7289.43426 13.1458647,7289.43426 M4,7289.43526 L4,7296.22153 C6.72581454,7296.58933 9.45162907,7296.94113 12.1724311,7297.34291 C12.1774436,7294.71736 12.1704261,7292.0908 12.1704261,7289.46524 C9.44661654,7289.47024 6.72380952,7289.42627 4,7289.43526 M4,7281.84344 L4,7288.61071 C6.72581454,7288.61771 9.45162907,7288.57673 12.1774436,7288.57973 C12.1754386,7285.96017 12.1754386,7283.34361 12.1724311,7280.72405 C9.44461153,7281.06486 6.71679198,7281.42567 4,7281.84344 M24,7288.47179 C20.3879699,7288.48578 16.7759398,7288.54075 13.1619048,7288.55175 C13.1598997,7285.88921 13.1598997,7283.22967 13.1619048,7280.56914 C16.7689223,7280.01844 20.3839599,7279.50072 23.997995,7279 C24,7282.15826 23.997995,7285.31353 24,7288.47179\" />\n </g>\n </g>\n </svg>\n ),\n);\n\nWindows.displayName = \"Windows\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Ubuntu = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"-5 0 32 32\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M16.469 9.375c-1.063-0.594-1.406-1.938-0.813-3 0.406-0.719 1.156-1.094 1.906-1.094 0.375 0 0.75 0.094 1.094 0.281 1.063 0.625 1.406 1.969 0.813 3-0.406 0.719-1.156 1.094-1.906 1.094-0.375 0-0.75-0.094-1.094-0.281zM21.938 15.594h-3.625c-0.125-1.688-0.969-3.188-2.25-4.156-0.219-0.156-0.438-0.313-0.688-0.469-0.813-0.438-1.75-0.688-2.75-0.688-1.031 0-1.969 0.25-2.813 0.719l-2-3.031c1.406-0.844 3.031-1.313 4.813-1.313 0.688 0 1.375 0.063 2.063 0.219-0.25 1.219 0.281 2.5 1.406 3.156 0.438 0.25 0.938 0.375 1.469 0.375 0.719 0 1.406-0.25 1.938-0.719 1.438 1.563 2.344 3.625 2.438 5.906zM7.125 8.438l2 3.031c-1.25 0.969-2.094 2.438-2.188 4.125-0.031 0.125-0.031 0.25-0.031 0.406 0 0.125 0 0.281 0.031 0.406 0.125 1.781 1.063 3.313 2.438 4.281l-1.906 3.094c-1.813-1.188-3.188-3-3.813-5.125 0.875-0.5 1.5-1.469 1.5-2.563s-0.625-2.094-1.563-2.594c0.594-2.063 1.844-3.844 3.531-5.063zM2.188 13.906c1.219 0 2.219 0.969 2.219 2.188s-1 2.219-2.219 2.219-2.188-1-2.188-2.219 0.969-2.188 2.188-2.188zM8.188 24.219l1.906-3.125c0.75 0.375 1.625 0.594 2.531 0.594 1 0 1.938-0.25 2.781-0.719 0.25-0.125 0.469-0.281 0.688-0.469 1.25-0.938 2.094-2.406 2.219-4.094h3.625c-0.094 2.375-1.094 4.531-2.656 6.125-0.469-0.344-1.063-0.531-1.656-0.531-0.531 0-1.031 0.125-1.469 0.375-1 0.594-1.531 1.656-1.469 2.719-0.688 0.156-1.375 0.25-2.063 0.25-1.625 0-3.125-0.406-4.438-1.125zM17.625 22.75c0.75 0 1.5 0.375 1.906 1.094 0.594 1.063 0.219 2.438-0.813 3.031-0.344 0.188-0.719 0.281-1.094 0.281-0.781 0-1.5-0.375-1.906-1.094-0.625-1.063-0.25-2.406 0.813-3.031 0.344-0.188 0.719-0.281 1.094-0.281z\" />\n </svg>\n ),\n);\n\nUbuntu.displayName = \"Ubuntu\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Debian = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 32 32\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M3.973 10.755c0.085-0.271 0.171-0.624 0.24-0.984l0.010-0.066c-0.437 0.55-0.212 0.662-0.25 1.037zM4.761 7.43c0.087 0.712-0.537 1 0.137 0.525 0.375-0.825-0.137-0.225-0.125-0.525zM16.562 1.154c0.327-0.062 0.734-0.115 1.146-0.147l0.041-0.003c-0.462 0.038-0.925 0.063-1.375 0.125l0.187 0.025zM27.378 14.53l-0.087 0.187c-0.145 1.031-0.448 1.963-0.885 2.814l0.023-0.049c0.472-0.854 0.803-1.852 0.933-2.912l0.004-0.040zM13.701 17.507c-0.153-0.187-0.283-0.401-0.381-0.633l-0.007-0.017c0.134 0.419 0.316 0.784 0.546 1.113l-0.009-0.013-0.15-0.45zM12.926 17.545l-0.062 0.35c0.298 0.477 0.628 0.89 1 1.262l-0-0c-0.3-0.587-0.525-0.825-0.937-1.625zM25.276 13.968c-0.028 0.687-0.2 1.328-0.487 1.901l0.012-0.027-0.437 0.226c-0.35 0.675 0.038 0.437-0.212 0.975-0.602 0.595-1.264 1.13-1.976 1.596l-0.048 0.030c-0.251 0 0.175-0.312 0.237-0.425-0.739 0.5-0.601 0.75-1.713 1.062l-0.038-0.075c-0.468 0.16-1.008 0.253-1.569 0.253-2.759 0-4.996-2.237-4.996-4.996 0-0.020 0-0.041 0-0.061l-0 0.003c-0.037 0.212-0.087 0.162-0.15 0.25-0.010-0.112-0.016-0.242-0.016-0.374 0-1.752 1.015-3.268 2.49-3.989l0.026-0.012c0.55-0.283 1.2-0.448 1.888-0.448 1.066 0 2.040 0.397 2.78 1.052l-0.004-0.004c-0.771-0.993-1.965-1.626-3.306-1.626-0.033 0-0.066 0-0.099 0.001l0.005-0c-1.417 0.013-2.649 0.792-3.303 1.943l-0.010 0.019c-0.75 0.475-0.837 1.837-1.162 2.076-0.068 0.337-0.107 0.724-0.107 1.12 0 2.225 1.232 4.161 3.051 5.165l0.030 0.015c0.337 0.237 0.1 0.262 0.15 0.437-0.752-0.362-1.388-0.85-1.906-1.443l-0.006-0.007c0.28 0.439 0.611 0.814 0.992 1.131l0.008 0.006c-0.687-0.225-1.587-1.625-1.849-1.687 1.162 2.074 4.724 3.65 6.574 2.874-0.164 0.012-0.355 0.019-0.547 0.019-0.845 0-1.658-0.135-2.419-0.385l0.055 0.016c-0.412-0.2-0.962-0.637-0.875-0.712 0.83 0.359 1.796 0.567 2.811 0.567 1.736 0 3.329-0.61 4.577-1.627l-0.013 0.010c0.55-0.437 1.162-1.175 1.337-1.187-0.25 0.4 0.050 0.2-0.15 0.55 0.55-0.9-0.25-0.375 0.575-1.55l0.3 0.412c-0.112-0.75 0.925-1.651 0.825-2.827 0.237-0.375 0.25 0.375 0 1.212 0.362-0.925 0.1-1.062 0.187-1.824 0.1 0.215 0.198 0.476 0.277 0.745l0.011 0.042c-0.015-0.121-0.023-0.262-0.023-0.405 0-0.581 0.138-1.13 0.382-1.615l-0.009 0.021c-0.112-0.062-0.35 0.375-0.4-0.662 0-0.462 0.125-0.25 0.175-0.35-0.252-0.292-0.423-0.66-0.474-1.066l-0.001-0.010c0.1-0.162 0.275 0.412 0.425 0.425-0.111-0.386-0.2-0.845-0.247-1.316l-0.003-0.034c-0.425-0.85-0.15 0.125-0.5-0.375-0.425-1.363 0.375-0.312 0.425-0.925 0.533 0.885 0.956 1.911 1.212 3.002l0.014 0.073c-0.151-0.837-0.363-1.575-0.64-2.28l0.028 0.081c0.2 0.087-0.325-1.551 0.262-0.462-0.805-2.376-2.428-4.295-4.526-5.464l-0.050-0.025c0.225 0.212 0.525 0.487 0.412 0.525-0.937-0.562-0.775-0.6-0.912-0.837-0.762-0.312-0.812 0.025-1.325 0-0.865-0.449-1.877-0.854-2.933-1.158l-0.119-0.029 0.062 0.287c-0.962-0.312-1.125 0.125-2.162 0-0.063-0.050 0.337-0.175 0.662-0.225-0.926 0.125-0.876-0.175-1.788 0.038 0.194-0.132 0.419-0.265 0.652-0.384l0.035-0.016c-0.75 0.050-1.799 0.437-1.475 0.087-1.776 0.642-3.315 1.483-4.697 2.52l0.046-0.033-0.036-0.275c-0.562 0.675-2.449 2.013-2.599 2.888l-0.164 0.037c-0.287 0.5-0.475 1.062-0.712 1.576-0.375 0.65-0.562 0.25-0.5 0.35-0.534 1.086-1.027 2.373-1.408 3.708l-0.041 0.169c0.074 0.691 0.116 1.493 0.116 2.305 0 0.402-0.010 0.802-0.031 1.199l0.002-0.056c-0.003 0.111-0.005 0.242-0.005 0.374 0 6.747 4.321 12.485 10.347 14.597l0.108 0.033c0.811 0.203 1.743 0.32 2.702 0.32 0.144 0 0.288-0.003 0.43-0.008l-0.021 0.001c-1.237-0.35-1.4-0.187-2.599-0.612-0.875-0.4-1.062-0.875-1.675-1.412l0.25 0.437c-1.213-0.425-0.712-0.525-1.701-0.837l0.262-0.337c-0.519-0.189-0.94-0.545-1.206-1.001l-0.006-0.011-0.425 0.012c-0.512-0.626-0.787-1.088-0.762-1.451l-0.139 0.25c-0.162-0.262-1.899-2.376-1-1.888-0.258-0.179-0.469-0.409-0.62-0.677l-0.005-0.010 0.175-0.212c-0.364-0.413-0.633-0.918-0.77-1.476l-0.005-0.024c0.131 0.198 0.326 0.345 0.555 0.411l0.007 0.002c-1.1-2.714-1.162-0.15-2.001-2.752l0.187-0.025c-0.104-0.174-0.213-0.383-0.309-0.599l-0.016-0.039 0.075-0.75c-0.787-0.925-0.225-3.876-0.112-5.501 0.338-0.964 0.709-1.781 1.142-2.559l-0.043 0.083-0.262-0.050c0.5-0.887 2.925-3.589 4.050-3.45 0.537-0.687-0.112 0-0.225-0.175 1.2-1.238 1.575-0.875 2.376-1.1 0.875-0.501-0.75 0.2-0.337-0.189 1.5-0.375 1.062-0.875 3.025-1.062 0.2 0.125-0.487 0.175-0.65 0.325 0.719-0.231 1.545-0.365 2.403-0.365 1.194 0 2.328 0.259 3.349 0.723l-0.051-0.021c2.392 1.275 4.071 3.617 4.408 6.373l0.004 0.040 0.1 0.025c0.024 0.284 0.038 0.615 0.038 0.949 0 0.863-0.091 1.705-0.264 2.517l0.014-0.079 0.25-0.525zM17 1.542l-0.187 0.037 0.175-0.012v-0.025zM16.475 1.392c0.25 0.050 0.562 0.087 0.525 0.15 0.287-0.062 0.35-0.125-0.537-0.15zM22.001 13.632c0.062-0.901-0.175-0.626-0.25-0.276 0.087 0.050 0.162 0.625 0.25 0.275zM21.025 16.194c0.274-0.375 0.479-0.82 0.583-1.302l0.004-0.023c-0.099 0.347-0.24 0.65-0.42 0.925l0.008-0.013c-0.937 0.587-0.087-0.337 0-0.7-1 1.262-0.137 0.75-0.175 1.112zM18.349 16.856c-0.5 0 0.1 0.25 0.751 0.35 0.18-0.135 0.339-0.27 0.489-0.414l-0.002 0.002c-0.242 0.056-0.52 0.087-0.805 0.087-0.152 0-0.302-0.009-0.45-0.027l0.018 0.002z\"></path>\n </svg>\n ),\n);\n\nDebian.displayName = \"Debian\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Apple = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M18.71 19.5C17.88 20.74 17 21.95 15.66 21.97C14.32 22 13.89 21.18 12.37 21.18C10.84 21.18 10.37 21.95 9.09997 22C7.78997 22.05 6.79997 20.68 5.95997 19.47C4.24997 17 2.93997 12.45 4.69997 9.39C5.56997 7.87 7.12997 6.91 8.81997 6.88C10.1 6.86 11.32 7.75 12.11 7.75C12.89 7.75 14.37 6.68 15.92 6.84C16.57 6.87 18.39 7.1 19.56 8.82C19.47 8.88 17.39 10.1 17.41 12.63C17.44 15.65 20.06 16.66 20.09 16.67C20.06 16.74 19.67 18.11 18.71 19.5ZM13 3.5C13.73 2.67 14.94 2.04 15.94 2C16.07 3.17 15.6 4.35 14.9 5.19C14.21 6.04 13.07 6.7 11.95 6.61C11.8 5.46 12.36 4.26 13 3.5Z\"></path>\n </svg>\n ),\n);\n\nApple.displayName = \"Apple\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const KaliLinux = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"-2.88 -2.88 37.76 37.76\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M16.85 8.081l-0.187-0.606c-1.436-0.223-3.092-0.35-4.778-0.35-0.879 0-1.75 0.035-2.611 0.103l0.114-0.007c-3.096 0.294-5.941 0.915-8.648 1.835l0.265-0.078c3.126-0.78 6.714-1.228 10.407-1.228 1.917 0 3.805 0.121 5.659 0.355l-0.221-0.023zM30.992 23.819s0.39-4.471-6.636-5.502c-0.944-0.144-2.037-0.228-3.148-0.234l-0.006-0c-5.631 0.075-5.836-6.494-1.593-6.826 2.193 0.12 4.213 0.758 5.973 1.793l-0.062-0.034c-0.006 0.040-0.009 0.085-0.009 0.132 0 0.209 0.067 0.403 0.181 0.561l-0.002-0.003c0.293 0.215 0.628 0.402 0.985 0.545l0.031 0.011c0.492 0.288 0.911 0.642 1.261 1.055l0.006 0.007c0.241-0.236 0.509-0.447 0.797-0.628l0.020-0.012c-0.214-0.019-0.411-0.072-0.593-0.153l0.012 0.005c-0.35-0.164-0.649-0.378-0.902-0.638l-0.001-0.001c-0.012-0.027-0.019-0.069 0.075-0.087 0.074-0.061-0.090-0.259-0.162-0.331s-0.556-0.895-0.567-0.912c-0.010-0.026-0.027-0.047-0.050-0.062l-0-0c-0.020-0.001-0.044-0.001-0.067-0.001-0.18 0-0.355 0.019-0.524 0.054l0.017-0.003c-0.446-0.244-0.786-0.632-0.962-1.102l-0.005-0.014c0.004 0.134-0.124 0.28 0 0.586-0.463-0.208-0.811-0.604-0.949-1.088l-0.003-0.012c-0.044 0.091-0.070 0.198-0.070 0.312s0.026 0.221 0.072 0.316l-0.002-0.004c-0.506-0.15-0.892-0.55-1.022-1.052l-0.002-0.010c-0.046 0.085-0.073 0.186-0.073 0.293s0.027 0.208 0.075 0.296l-0.002-0.003c-1.069-0.483-2.318-0.765-3.633-0.765-0.071 0-0.142 0.001-0.212 0.002l0.011-0c-1.603-0.147-1.937-2.967-1.787-3.441-2.007-0.913-4.336-1.539-6.784-1.751l-0.080-0.006c-1.356-0.169-2.926-0.265-4.518-0.265-1.326 0-2.636 0.067-3.928 0.197l0.163-0.013c0.395-0.014 0.859-0.022 1.325-0.022 4.728 0 9.263 0.824 13.469 2.337l-0.278-0.087c0.367 1.327 0.789 2.458 1.294 3.541l-0.058-0.138c-1.376 0.702-2.309 2.094-2.344 3.707l-0 0.005c-0.001 0.039-0.002 0.085-0.002 0.131 0 2.398 1.944 4.343 4.343 4.343 0 0 0 0 0 0h-0c0.162-0.007 0.352-0.011 0.543-0.011 1.981 0 3.859 0.438 5.544 1.222l-0.081-0.034c2.145 1.673 3.533 4.23 3.611 7.114l0 0.013c0.165-2.136-0.636-6.727-4.374-8.12 5.225 0.915 5.685 4.789 5.685 4.789zM26.683 13.223c0.049-0.085 0.207 0.271 0.329 0.421 0.005 0.030 0.012 0.049-0.056 0.034-0.002-0.015-0.007-0.029-0.016-0.040l0 0c-0.084-0.049-0.157-0.106-0.221-0.171l-0-0c-0.030-0.045-0.048-0.1-0.048-0.159 0-0.030 0.005-0.060 0.013-0.087l-0.001 0.002zM26.158 12.299l0.321-0.021c-1.421-1.523-3.226-2.67-5.262-3.287l-0.084-0.022c1.974 0.757 3.653 1.891 5.020 3.325l0.005 0.005zM16.972 8.431c-2.388 0.009-4.675 0.43-6.798 1.194l0.142-0.044c-2.553 0.762-4.779 1.865-6.768 3.28l0.070-0.047c3.932-2.105 8.557-3.461 13.469-3.755l0.092-0.004z\"></path>\n </svg>\n ),\n);\n\nKaliLinux.displayName = \"KaliLinux\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const RedHat = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"-3.2 -3.2 38.40 38.40\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M26.135 15.933c0.136 0.467 0.233 1.011 0.271 1.572l0.001 0.024c0 2.206-2.479 3.43-5.74 3.43-7.367 0.005-13.821-4.313-13.821-7.165 0-0.002 0-0.004 0-0.005 0-0.416 0.087-0.811 0.245-1.169l-0.007 0.019c-2.648 0.132-6.080 0.606-6.080 3.634 0 4.96 11.753 11.073 21.058 11.073 7.135 0 8.934-3.227 8.934-5.773 0-2.006-1.733-4.28-4.857-5.638zM21.010 17.732c1.971 0 4.824-0.407 4.824-2.752 0.001-0.020 0.001-0.043 0.001-0.067 0-0.167-0.019-0.33-0.054-0.486l0.003 0.015-1.175-5.099c-0.27-1.122-0.507-1.631-2.477-2.615-1.684-0.889-3.637-1.604-5.692-2.045l-0.151-0.027c-0.916 0-1.183 1.182-2.277 1.182-1.052 0-1.833-0.882-2.818-0.882-0.946 0-1.562 0.644-2.037 1.969 0 0-1.325 3.736-1.496 4.279-0.023 0.080-0.036 0.172-0.036 0.267 0 0.014 0 0.028 0.001 0.042l-0-0.002c0 1.452 5.72 6.216 13.384 6.216z\"></path>\n </svg>\n ),\n);\n\nRedHat.displayName = \"RedHat\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Fedora = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"-3.52 -3.52 39.04 39.04\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M8.903 29.322s0.112 0.009 0.342 0.031q-0.171-0.017-0.342-0.032zM8.618 29.272l0.187 0.031zM7.31 25.209c0.211 0.166 0.448 0.315 0.702 0.437l0.023 0.010-0.031 0.006-0.022-0.019c-0.255-0.131-0.475-0.275-0.678-0.44l0.007 0.005zM3.121 24.879c1.178 1.095 2.314 2.184 3.472 3.299l0.025 0.025c0.099 0.257 0.237 0.478 0.41 0.666l-0.001-0.002c-1.8-0.747-3.195-2.169-3.889-3.941l-0.016-0.048zM2.649 22.737q2.087 1.912 4.116 3.885c-0.136 0.244-0.226 0.532-0.25 0.839l-0 0.007c-0.002 0.031-0.003 0.067-0.003 0.104s0.001 0.073 0.003 0.109l-0-0.005c-1.15-1.105-2.319-2.224-3.599-3.387-0.138-0.456-0.234-0.986-0.268-1.533l-0.001-0.020zM2.736 21.125c1.65 1.486 3.164 2.945 4.724 4.447l0.219 0.207c-0.298 0.135-0.547 0.332-0.739 0.577l-0.003 0.004q-2.116-2.049-4.308-4.018c-0-0.013-0-0.029-0-0.045 0-0.415 0.039-0.822 0.114-1.215l-0.006 0.040zM21.316 18.009l0.55 0.442c-0.326 0.072-0.704 0.118-1.092 0.129l-0.008 0h-0.020c0.23-0.151 0.42-0.341 0.567-0.564l0.005-0.007zM23.465 17.896l-0.062 0.029zM21.3 16.953l-0.034 0.331zM5.406 16.762q1.234 1.14 2.447 2.304c-1.032 0.618-1.75 1.669-1.906 2.895l-0.002 0.020q-1.341-1.261-2.719-2.482-0.060 0.136-0.114 0.275c0.971 0.872 1.902 1.738 2.814 2.608 0.018 0.634 0.182 1.225 0.46 1.747l-0.010-0.021q-1.757-1.679-3.574-3.293c0.034-0.135 0.050-0.271 0.092-0.404 0.191-0.684 0.468-1.283 0.827-1.823l-0.015 0.023c0.862 0.776 1.687 1.551 2.502 2.324q0.061-0.148 0.134-0.29-1.225-1.153-2.482-2.273c0.199-0.286 0.4-0.536 0.617-0.771l-0.004 0.005q1.216 1.111 2.406 2.252c0.067-0.075 0.137-0.152 0.21-0.222q-1.197-1.135-2.424-2.237c0.226-0.222 0.467-0.431 0.721-0.623l0.018-0.013zM21.527 16.331c0.591 0.525 1.197 1.057 1.842 1.606-0.319 0.159-0.696 0.305-1.087 0.416l-0.047 0.011-0.771-0.622c0.105-0.231 0.167-0.501 0.167-0.786 0-0.224-0.038-0.44-0.108-0.64l0.004 0.014zM6.504 16.076c0.9 0.842 1.781 1.683 2.667 2.537-0.384 0.049-0.732 0.155-1.052 0.311l0.020-0.009c-0.8-0.762-1.625-1.537-2.497-2.331 0.244-0.169 0.527-0.338 0.82-0.488l0.042-0.020zM7.791 15.576l0.777 0.74c-0.069 0.19-0.108 0.41-0.108 0.639 0 0.239 0.043 0.469 0.123 0.68l-0.004-0.013c-0.585-0.555-1.175-1.116-1.789-1.684 0.275-0.127 0.608-0.25 0.952-0.348l0.052-0.013zM8.129 15.483l-0.159 0.040 0.159-0.037zM9.371 15.308l-0.025 0.018h-0.016l0.005 0.005c-0.265 0.176-0.48 0.407-0.632 0.678l-0.005 0.010-0.562-0.534c0.363-0.091 0.787-0.153 1.222-0.174l0.016-0.001zM21.925 14.998q1.286 1.146 2.609 2.249c-0.264 0.191-0.564 0.375-0.878 0.537l-0.039 0.018q-1.433-1.226-2.819-2.506c-0.030 0.002-0.062 0.001-0.092 0.004l-0.032-0.019c0.459-0.036 0.885-0.137 1.282-0.294l-0.030 0.010zM22.999 14.255q1.236 1.088 2.506 2.137c-0.234 0.246-0.482 0.474-0.744 0.683l-0.015 0.011q-1.296-1.083-2.553-2.212c0.274-0.147 0.51-0.324 0.715-0.531l0-0c0.034-0.027 0.059-0.059 0.091-0.087zM23.753 13.236c0.805 0.7 1.65 1.413 2.553 2.149-0.204 0.305-0.409 0.571-0.631 0.821l0.006-0.007q-1.262-1.043-2.487-2.131c0.22-0.239 0.407-0.513 0.55-0.812l0.009-0.020zM23.668 9.789c1.122 1 2.319 2.028 3.646 3.105-0.079 0.414-0.184 0.776-0.317 1.123l0.015-0.045q-1.466-1.197-2.883-2.453l0.003 0.069c0 0.095-0.005 0.19-0.012 0.282 0.879 0.765 1.8 1.546 2.799 2.356-0.153 0.367-0.312 0.676-0.492 0.971l0.018-0.031q-1.307-1.071-2.574-2.189c0.157-0.407 0.248-0.878 0.248-1.37 0-0.664-0.166-1.29-0.458-1.838l0.010 0.021zM23.011 7.502q2.153 1.972 4.411 3.824c0 0.089 0.019 0.175 0.016 0.262 0 0.017 0 0.036 0 0.056 0 0.339-0.027 0.672-0.080 0.997l0.005-0.036q-2.627-2.15-5.101-4.479c0.305-0.146 0.557-0.358 0.746-0.619l0.004-0.006zM23.378 6.14q1.816 1.664 3.706 3.244c-0.017-0.055-0.041-0.109-0.061-0.162 0.195 0.515 0.329 1.111 0.375 1.731l0.001 0.021q-2.172-1.797-4.236-3.718l0.019-0.041c0.108-0.221 0.18-0.478 0.2-0.75l0-0.007c0.003-0.037 0.004-0.080 0.004-0.123s-0.002-0.086-0.005-0.129l0 0.006c-0-0.026-0.002-0.050-0.005-0.075l0 0.003zM22.816 4.972c1.83 0.723 3.268 2.108 4.043 3.852l0.018 0.047q-1.852-1.576-3.628-3.239c-0.11-0.255-0.255-0.473-0.433-0.659l0.001 0.001zM21.286 4.622l0.162 0.030zM20.405 4.557c0.042-0.001 0.091-0.002 0.14-0.002 0.48 0 0.948 0.054 1.398 0.156l-0.042-0.008c0.668 0.302 1.125 0.961 1.127 1.728v0c-0.031 0.869-0.743 1.561-1.616 1.561-0.038 0-0.076-0.001-0.113-0.004l0.005 0c-0.27-0.071-0.58-0.112-0.9-0.112h-0c-2.065 0.026-3.728 1.706-3.728 3.774 0 0.125 0.006 0.249 0.018 0.371l-0.001-0.015c0.030 0.995-0.055 2.001 0.041 2.989 0.416 0.571 1.233 0.225 1.843 0.32 0.345 0 0.702 0.009 1.062 0.010 0.016 0.006 0.034 0.009 0.052 0.010h0c0.893 0.001 1.616 0.725 1.616 1.618s-0.725 1.618-1.618 1.618c-0.003 0-0.005 0-0.008-0h0c-0 0-0.001 0-0.001 0-0.027 0-0.052 0.006-0.075 0.017l0.001-0c-0.971 0.004-1.941 0-2.912 0.003 0.038 0.484 0.059 1.049 0.059 1.618 0 1.568-0.163 3.098-0.472 4.574l0.025-0.144c-1.007 2.775-3.621 4.722-6.689 4.722-0.591 0-1.165-0.072-1.714-0.208l0.049 0.010c-0.644-0.291-1.084-0.928-1.085-1.667v-0c0.039-0.877 0.759-1.572 1.642-1.572 0.096 0 0.191 0.008 0.282 0.024l-0.010-0.001c0.094 0.008 0.141 0.015 0.21 0.025 0.219 0.049 0.471 0.077 0.73 0.077 0.708 0 1.366-0.211 1.916-0.574l-0.013 0.008c1.088-0.736 1.794-1.965 1.794-3.359 0-0.223-0.018-0.441-0.053-0.654l0.003 0.023c-0.025-0.858 0.054-1.73-0.041-2.582-0.416-0.57-1.23-0.225-1.839-0.32h-1c-0.023-0.012-0.050-0.019-0.078-0.019-0.002 0-0.003 0-0.005 0h0c-0.001 0-0.001 0-0.002 0-0.894 0-1.618-0.725-1.618-1.618 0-0.891 0.72-1.614 1.61-1.618h0c0.029-0 0.056-0.008 0.080-0.020l-0.001 0h2.894c-0.028-0.462-0.044-1.002-0.044-1.546 0-1.449 0.113-2.872 0.33-4.26l-0.020 0.154c0.875-2.967 3.571-5.098 6.766-5.106h0.001zM16.006 1.006c-6.164 0.012-11.457 3.731-13.768 9.045l-0.038 0.097c-0.779 1.915-1.232 4.136-1.232 6.463 0 0.463 0.018 0.922 0.053 1.376l-0.004-0.060c0.012 3.332-0.025 6.667 0.019 9.996 0.223 1.743 1.697 3.076 3.482 3.076 0.153 0 0.304-0.010 0.451-0.029l-0.018 0.002c4.070-0.025 8.14 0.055 12.209-0.042 7.764-0.617 13.832-7.070 13.832-14.94 0-8.276-6.709-14.984-14.984-14.984-0.001 0-0.002 0-0.003 0h0z\"></path>\n </svg>\n ),\n);\n\nFedora.displayName = \"Fedora\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const CentOS = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 32 32\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M 15.996094 3 L 13 6.0039062 L 15 6.0039062 L 15 12 L 16 13 L 17 12 L 17 6.0039062 L 19 6.0039062 L 15.996094 3 z M 7 7 L 7 11 L 8.2929688 9.7070312 L 12.585938 14 L 14 14 L 14 12.585938 L 9.7070312 8.2929688 L 11 7 L 7 7 z M 12.414062 7 L 11.121094 8.2929688 L 14 11.171875 L 14 7 L 12.414062 7 z M 18 7 L 18 11.171875 L 20.878906 8.2929688 L 19.585938 7 L 18 7 z M 21 7 L 22.292969 8.2929688 L 18 12.585938 L 18 14 L 19.414062 14 L 23.707031 9.7070312 L 25 11 L 25 7 L 21 7 z M 8.2929688 11.121094 L 7 12.414062 L 7 14 L 11.171875 14 L 8.2929688 11.121094 z M 23.707031 11.121094 L 20.828125 14 L 25 14 L 25 12.414062 L 23.707031 11.121094 z M 6.0039062 13 L 3 16.003906 L 6.0039062 19 L 6.0039062 17 L 12 17 L 13 16 L 12 15 L 6.0039062 15 L 6.0039062 13 z M 25.996094 13 L 25.996094 15 L 20 15 L 19 16 L 20 17 L 25.996094 17 L 25.996094 19 L 29 15.996094 L 25.996094 13 z M 7 18 L 7 19.585938 L 8.2929688 20.878906 L 11.171875 18 L 7 18 z M 12.585938 18 L 8.2929688 22.292969 L 7 21 L 7 25 L 11 25 L 9.7070312 23.707031 L 14 19.414062 L 14 18 L 12.585938 18 z M 18 18 L 18 19.414062 L 22.292969 23.707031 L 21 25 L 25 25 L 25 21 L 23.707031 22.292969 L 19.414062 18 L 18 18 z M 20.828125 18 L 23.707031 20.878906 L 25 19.585938 L 25 18 L 20.828125 18 z M 16 19 L 15 20 L 15 25.996094 L 13 25.996094 L 16.003906 29 L 19 25.996094 L 17 25.996094 L 17 20 L 16 19 z M 14 20.828125 L 11.121094 23.707031 L 12.414062 25 L 14 25 L 14 20.828125 z M 18 20.828125 L 18 25 L 19.585938 25 L 20.878906 23.707031 L 18 20.828125 z\"></path>\n </svg>\n ),\n);\n\nCentOS.displayName = \"CentOS\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Clone = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n fill=\"currentColor\"\n viewBox=\"0 0 36 36\"\n version=\"1.1\"\n preserveAspectRatio=\"xMidYMid meet\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path d=\"M6,6H22v4h2V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6V22a2,2,0,0,0,2,2h4V22H6Z\"></path>\n <path d=\"M30,12H14a2,2,0,0,0-2,2V30a2,2,0,0,0,2,2H30a2,2,0,0,0,2-2V14A2,2,0,0,0,30,12Zm0,18H14V14H30Z\"></path>\n <polygon points=\"21 28 23 28 23 23 28 23 28 21 23 21 23 16 21 16 21 21 16 21 16 23 21 23 21 28\"></polygon>\n <rect x=\"0\" y=\"0\" width=\"36\" height=\"36\" fill-opacity=\"0\"></rect>\n </svg>\n ),\n);\n\nClone.displayName = \"Clone\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Copy = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 1024 1024\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path d=\"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64h64z\"></path>\n <path d=\"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64H384zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64z\"></path>\n </svg>\n ),\n);\n\nCopy.displayName = \"Copy\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Live = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path d=\"M6.34277267,4.93867691 C6.73329697,5.3292012 6.73329697,5.96236618 6.34277267,6.35289047 C3.21757171,9.47809143 3.21757171,14.5450433 6.34277267,17.6702443 C6.73329697,18.0607686 6.73329697,18.6939336 6.34277267,19.0844579 C5.95224838,19.4749821 5.3190834,19.4749821 4.92855911,19.0844579 C1.02230957,15.1782083 1.02230957,8.84492646 4.92855911,4.93867691 C5.3190834,4.54815262 5.95224838,4.54815262 6.34277267,4.93867691 Z M19.0743401,4.93867691 C22.9805896,8.84492646 22.9805896,15.1782083 19.0743401,19.0844579 C18.6838158,19.4749821 18.0506508,19.4749821 17.6601265,19.0844579 C17.2696022,18.6939336 17.2696022,18.0607686 17.6601265,17.6702443 C20.7853275,14.5450433 20.7853275,9.47809143 17.6601265,6.35289047 C17.2696022,5.96236618 17.2696022,5.3292012 17.6601265,4.93867691 C18.0506508,4.54815262 18.6838158,4.54815262 19.0743401,4.93867691 Z M9.3094225,7.81205295 C9.69994679,8.20257725 9.69994679,8.83574222 9.3094225,9.22626652 C7.77845993,10.7572291 7.77845993,13.2394099 9.3094225,14.7703724 C9.69994679,15.1608967 9.69994679,15.7940617 9.3094225,16.184586 C8.91889821,16.5751103 8.28573323,16.5751103 7.89520894,16.184586 C5.58319778,13.8725748 5.58319778,10.1240641 7.89520894,7.81205295 C8.28573323,7.42152866 8.91889821,7.42152866 9.3094225,7.81205295 Z M16.267742,7.81205295 C18.5797531,10.1240641 18.5797531,13.8725748 16.267742,16.184586 C15.8772177,16.5751103 15.2440527,16.5751103 14.8535284,16.184586 C14.4630041,15.7940617 14.4630041,15.1608967 14.8535284,14.7703724 C16.384491,13.2394099 16.384491,10.7572291 14.8535284,9.22626652 C14.4630041,8.83574222 14.4630041,8.20257725 14.8535284,7.81205295 C15.2440527,7.42152866 15.8772177,7.42152866 16.267742,7.81205295 Z M12.0814755,10.5814755 C12.9099026,10.5814755 13.5814755,11.2530483 13.5814755,12.0814755 C13.5814755,12.9099026 12.9099026,13.5814755 12.0814755,13.5814755 C11.2530483,13.5814755 10.5814755,12.9099026 10.5814755,12.0814755 C10.5814755,11.2530483 11.2530483,10.5814755 12.0814755,10.5814755 Z\" />\n </svg>\n ),\n);\n\nLive.displayName = \"Live\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const HealthCheck = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M18 11.9999H17.1986C16.3689 11.9999 15.9541 11.9999 15.6102 12.1946C15.2664 12.3893 15.0529 12.745 14.6261 13.4564L14.5952 13.5079C14.1976 14.1706 13.9987 14.502 13.7095 14.4965C13.4202 14.4911 13.2339 14.1525 12.8615 13.4753L11.1742 10.4075C10.8269 9.77606 10.6533 9.46034 10.3759 9.44537C10.0986 9.43039 9.892 9.72558 9.47875 10.3159L9.19573 10.7203C8.75681 11.3473 8.53734 11.6608 8.21173 11.8303C7.88612 11.9999 7.50342 11.9999 6.73803 11.9999H6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n ></path>\n <path\n d=\"M8.96173 18.9108L9.42605 18.3219L8.96173 18.9108ZM12 5.5006L11.4596 6.0207C11.601 6.1676 11.7961 6.2506 12 6.2506C12.2039 6.2506 12.399 6.1676 12.5404 6.0207L12 5.5006ZM15.0383 18.9109L15.5026 19.4999V19.4999L15.0383 18.9109ZM12 20.4859L12 19.7359L12 20.4859ZM2.65666 13.3964C2.87558 13.748 3.33811 13.8556 3.68974 13.6367C4.04137 13.4178 4.14895 12.9552 3.93003 12.6036L2.65666 13.3964ZM6.52969 15.7718C6.23645 15.4793 5.76158 15.4798 5.46903 15.7731C5.17649 16.0663 5.17706 16.5412 5.47031 16.8337L6.52969 15.7718ZM2.75 9.13707C2.75 6.33419 4.00722 4.59507 5.57921 3.99711C7.15546 3.39753 9.35129 3.8302 11.4596 6.0207L12.5404 4.9805C10.1489 2.49583 7.3447 1.72069 5.04591 2.59512C2.74286 3.47116 1.25 5.88785 1.25 9.13707H2.75ZM15.5026 19.4999C16.9949 18.3234 18.7837 16.7461 20.2061 14.9838C21.6126 13.2412 22.75 11.2089 22.75 9.13703H21.25C21.25 10.688 20.3777 12.3829 19.0389 14.0417C17.716 15.6807 16.0239 17.1788 14.574 18.3219L15.5026 19.4999ZM22.75 9.13703C22.75 5.88784 21.2571 3.47115 18.9541 2.59511C16.6553 1.7207 13.8511 2.49583 11.4596 4.9805L12.5404 6.0207C14.6487 3.8302 16.8445 3.39753 18.4208 3.99711C19.9928 4.59506 21.25 6.33418 21.25 9.13703H22.75ZM8.49742 19.4998C9.77172 20.5044 10.6501 21.2359 12 21.2359L12 19.7359C11.2693 19.7359 10.8157 19.4174 9.42605 18.3219L8.49742 19.4998ZM14.574 18.3219C13.1843 19.4174 12.7307 19.7359 12 19.7359L12 21.2359C13.3499 21.2359 14.2283 20.5044 15.5026 19.4999L14.574 18.3219ZM3.93003 12.6036C3.18403 11.4054 2.75 10.2312 2.75 9.13707H1.25C1.25 10.617 1.83054 12.0695 2.65666 13.3964L3.93003 12.6036ZM9.42605 18.3219C8.50908 17.599 7.49093 16.7307 6.52969 15.7718L5.47031 16.8337C6.48347 17.8445 7.54819 18.7515 8.49742 19.4998L9.42605 18.3219Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nHealthCheck.displayName = \"HealthCheck\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxy = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M4,15 L4,14 L8,14 L8,13 L9,13 L9,14 L13,14 L13,15 L4,15 Z M12,2 C13.1045695,2 14,2.8954305 14,4 L14,9 C14,10.1045695 13.1045695,11 12,11 L5,11 C3.8954305,11 3,10.1045695 3,9 L3,4 C3,2.8954305 3.8954305,2 5,2 L12,2 Z M4,7 L4,9.1 C4,9.65228475 4.44771525,10.1 5,10.1 L12,10.1 C12.5522847,10.1 13,9.65228475 13,9.1 L13,7 L4,7 Z M7,4 L7,5 L6,5 L6,4 L7,4 Z M4,6 L13,6 L13,3.9 C13,3.34771525 12.5522847,2.9 12,2.9 L5,2.9 C4.44771525,2.9 4,3.34771525 4,3.9 L4,6 Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nReverseProxy.displayName = \"ReverseProxy\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyRoutes = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n fill=\"currentColor\"\n height=\"200px\"\n width=\"200px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n {...props}\n ref={ref}\n >\n <path d=\"M132.741,108.06C59.546,108.06,0,167.606,0,240.801c0,34.903,16.315,85.856,41.556,129.805 c28.759,50.069,61.991,78.787,91.185,78.787c29.194,0,62.426-28.718,91.185-78.787c25.241-43.949,41.555-94.903,41.555-129.805 C265.482,167.606,205.935,108.06,132.741,108.06z M132.741,430.431c-41.194,0-113.778-109.625-113.778-189.63 c0-62.736,51.037-113.778,113.778-113.778c62.741,0,113.778,51.042,113.778,113.778 C246.518,320.805,173.935,430.431,132.741,430.431z\"></path>\n <path d=\"M132.741,174.431c-36.593,0-66.37,29.773-66.37,66.37c0,36.597,29.778,66.37,66.37,66.37s66.37-29.773,66.37-66.37 C199.111,204.204,169.333,174.431,132.741,174.431z M132.741,288.208c-26.139,0-47.407-21.269-47.407-47.407 c0-26.139,21.269-47.407,47.407-47.407c26.139,0,47.407,21.268,47.407,47.407C180.148,266.94,158.88,288.208,132.741,288.208z\"></path>\n <path d=\"M417.185,13.245c-52.278,0-94.815,42.532-94.815,94.815c0,47.736,57.62,142.222,94.815,142.222S512,155.796,512,108.06 C512,55.778,469.463,13.245,417.185,13.245z M417.185,231.319c-19.907,0-75.852-77.81-75.852-123.259 c0-41.824,34.028-75.852,75.852-75.852c41.824,0,75.852,34.028,75.852,75.852C493.037,153.509,437.093,231.319,417.185,231.319z\"></path>\n <path d=\"M417.185,60.653c-26.139,0-47.407,21.268-47.407,47.407c0,26.139,21.269,47.407,47.407,47.407 c26.139,0,47.407-21.269,47.407-47.407C464.593,81.921,443.324,60.653,417.185,60.653z M417.185,136.505 c-15.685,0-28.444-12.759-28.444-28.444c0-15.685,12.759-28.444,28.444-28.444s28.444,12.759,28.444,28.444 C445.63,123.745,432.87,136.505,417.185,136.505z\"></path>\n <path d=\"M347.407,366.259c-11.426-9.514-16.685-19.546-16.102-30.671c1.296-24.805,32.018-50.611,43.741-58.458 c4.343-2.912,5.518-8.796,2.611-13.148c-2.907-4.357-8.806-5.537-13.139-2.625c-2.046,1.361-50.046,33.801-52.148,73.19 c-0.926,17.278,6.778,32.852,22.889,46.278c35.158,29.301,54.657,58.958,49.667,75.56c-4.259,14.153-26.63,19.509-44.639,21.514 c-81.602,9.079-146.278-17.986-146.935-18.259c-4.824-2.069-10.38,0.181-12.435,4.991c-2.056,4.815,0.167,10.38,4.981,12.44 c2.389,1.028,51.5,21.685,119.88,21.685c11.676,0,23.935-0.602,36.602-2.014c34.472-3.829,54.889-15.57,60.704-34.898 C413.371,427.62,372.611,387.268,347.407,366.259z\"></path>\n </svg>\n));\n\nReverseProxyRoutes.displayName = \"ReverseProxyRoutes\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyCORS = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M14,3 L14,14 L9.01449382,14 L9.79949382,13.003 L13.0232075,13.0036634 L13.0232075,4.01062736 L9.81849382,4.01 L9.01449382,3 L14,3 Z M6.25052955,2.68829789 L9.07895667,5.51672502 L6.25052955,8.34515214 L5.54342276,7.63804536 L7.18849382,5.99229789 L2.01449382,5.99309336 L2.01449382,4.99309336 L7.14049382,4.99229789 L5.54342276,3.39540467 L6.25052955,2.68829789 Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M6.25052955,8.68829789 L9.07895667,11.516725 L6.25052955,14.3451521 L5.54342276,13.6380454 L7.18849382,11.9922979 L2.01449382,11.9930934 L2.01449382,10.9930934 L7.14049382,10.9922979 L5.54342276,9.39540467 L6.25052955,8.68829789 Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n));\n\nReverseProxyCORS.displayName = \"ReverseProxyCORS\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyFrom = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M10.227436,5.63934145 L13.0558631,8.46776857 L10.227436,11.2961957 L9.52032918,10.5890889 L11.1654002,8.94334145 L5.99140023,8.94413691 L5.99181061,8.65768667 C5.91300669,9.41199683 5.2751711,10 4.5,10 C3.67157288,10 3,9.32842712 3,8.5 C3,7.67157288 3.67157288,7 4.5,7 C5.27520319,7 5.9130595,7.58805186 5.9918204,8.34240702 L5.99140023,7.94413691 L11.1174002,7.94334145 L9.52032918,6.34644823 L10.227436,5.63934145 Z M4.5,8 C4.22385763,8 4,8.22385763 4,8.5 C4,8.77614237 4.22385763,9 4.5,9 C4.77614237,9 5,8.77614237 5,8.5 C5,8.22385763 4.77614237,8 4.5,8 Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n));\n\nReverseProxyFrom.displayName = \"ReverseProxyFrom\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyHeadersRequest = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M6.25052955,2.68829789 L9.07895667,5.51672502 L6.25052955,8.34515214 L5.54342276,7.63804536 L7.18849382,5.99229789 L2.01449382,5.99309336 L2.01449382,4.99309336 L7.14049382,4.99229789 L5.54342276,3.39540467 L6.25052955,2.68829789 Z M14,3 L14,8 L9.01449382,8 L9.79949382,7.003 L13.0232075,7.00366338 L13.0232075,4.01062736 L9.82349382,4.01 L9.01449382,3 L14,3 Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M14,9 L14,14 L2,14 L2,9 L14,9 Z M13,10 L3,10 L3,13 L13,13 L13,10 Z\"\n fill-opacity=\"0.5\"\n fill=\"currentColor\"\n ></path>\n </svg>\n));\n\nReverseProxyHeadersRequest.displayName = \"ReverseProxyHeadersRequest\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyHeadersResponse = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M11.2505295,2.68829789 L14.0789567,5.51672502 L11.2505295,8.34515214 L10.5434228,7.63804536 L12.1884938,5.99229789 L7.01449382,5.99309336 L7.01449382,4.99309336 L12.1404938,4.99229789 L10.5434228,3.39540467 L11.2505295,2.68829789 Z M9,3 L9,4.01 L3,4.01062736 L3,7.00366338 L9,7.003 L9,8 L2,8 L2,3 L9,3 Z\"\n fill=\"currentColor\"\n ></path>\n <path\n d=\"M14,9 L14,14 L2,14 L2,9 L14,9 Z M13,10 L3,10 L3,13 L13,13 L13,10 Z\"\n fill-opacity=\"0.5\"\n fill=\"currentColor\"\n ></path>\n </svg>\n));\n\nReverseProxyHeadersResponse.displayName = \"ReverseProxyHeadersResponse\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyHTTP = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <polygon\n fill-opacity=\"0.5\"\n fill=\"currentColor\"\n points=\"13 5 13 3 3 3 3 5 2 5 2 2 14 2 14 6 3 6 3 13 7 13 7 14 2 14 2 5\"\n ></polygon>\n <path\n d=\"M6,9 L7,9 L7,10 L6,10 L6,9 Z M6,11 L7,11 L7,12 L6,12 L6,11 Z M10.0052414,6.97597605 L10.9947586,7.12039149 L9.9801732,14.0722077 L8.99065605,13.9277923 L10.0052414,6.97597605 Z M12.9822964,6.97965987 L13.9728609,7.11670767 L13.0110545,14.0685239 L12.0204901,13.9314761 L12.9822964,6.97965987 Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n));\n\nReverseProxyHTTP.displayName = \"ReverseProxyHTTP\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyTLS = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M8.52261263,14.0549475 L8.09072524,14.0549475 L7.99886963,13.9359472 L7.68109348,13.7817024 C7.11085943,13.4937372 6.56212167,13.1703049 6.03543684,12.8115392 L5.64456683,12.5358421 C4.79772025,11.9175832 4.16798291,11.3225072 3.6742663,10.6203175 C3.19022463,9.93193302 2.93238191,9.22212152 2.93172116,8.45186088 L2.93148896,3.37214596 C2.93162198,2.9107786 3.16134138,2.60235027 3.60212938,2.4682822 C3.98782224,2.35091617 3.98782224,2.35091617 4.37355953,2.23348466 C6.24828124,1.66275476 7.07927705,1.41073863 8.11895509,1.09906136 C8.31648258,1.03985 8.54512169,1.04042748 8.74276011,1.09969537 C9.4370912,1.30794988 9.99208789,1.47601303 11.2395016,1.85495311 C12.2320199,2.1564609 12.6747209,2.29067371 13.2255636,2.45666557 C13.5641452,2.55870558 13.8076311,2.76575932 13.9099763,3.10859064 L13.9308696,3.25161795 L13.9215557,8.74578657 C13.9197741,8.75514753 13.9197741,8.75514753 13.9171313,8.76989039 L13.9112585,8.80242216 C13.9079619,8.81956542 13.9045576,8.83418977 13.8943445,8.87806283 C13.8771617,8.94386498 13.8640946,8.99907101 13.8350916,9.12591984 C13.7617028,9.44689511 13.7222086,9.59334119 13.6476519,9.77970142 C13.3614875,10.4949556 12.8956813,11.0908136 12.1913459,11.737816 C11.3488645,12.511698 10.3718181,13.1660603 9.21205213,13.7635735 C9.1233448,13.8092799 9.05237926,13.8456306 8.89349015,13.9268577 C8.81933562,13.9647673 8.81933562,13.9647673 8.75048972,14 L8.52186963,13.5549475 L8.52261263,14.0549475 Z M8.43014272,2.054942 L8.4061031,2.05694758 C7.36824847,2.36807823 6.53815952,2.61981934 4.67183698,3.18799224 C4.60968732,3.20691271 4.56245045,3.22129321 4.52083671,3.23396169 L4.32063439,3.29490613 C4.20815461,3.32914333 4.1136551,3.35789946 3.89315624,3.42499708 L3.93086963,3.41294716 L3.93172079,8.45100026 C3.93213245,8.93088525 4.07552677,9.38547738 4.3611679,9.84688122 L4.49229237,10.0451364 C4.91455435,10.6456995 5.46849712,11.1691528 6.23420684,11.7281759 C6.95490279,12.2543101 7.72202877,12.7063782 8.53376045,13.0839497 L8.43586963,13.0369472 C8.56503229,12.9716751 8.63509088,12.9358146 8.7028274,12.9009878 L8.75404358,12.8746257 C9.83930862,12.3154955 10.7434411,11.7099662 11.5148531,11.0013668 C12.1186093,10.4467564 12.4977433,9.96176932 12.7192001,9.40824863 C12.7679461,9.28640413 12.7984751,9.17320127 12.8599634,8.90427423 L12.880941,8.81304101 C12.8992173,8.73424375 12.911303,8.68470851 12.9267276,8.62563979 C12.9274428,8.62275741 12.9274428,8.62275741 12.932586,8.59475763 L12.9308696,8.60094716 L12.9308696,3.41194716 L12.8009622,3.37311511 C12.3524442,3.23784094 11.9414784,3.11327484 11.1894271,2.88485859 L10.9532005,2.81310365 C9.70254685,2.43317935 9.14829994,2.26534325 8.45549314,2.05754592 C8.4444007,2.05421952 8.4154478,2.05414639 8.4061031,2.05694758 L8.43014272,2.054942 Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n));\n\nReverseProxyTLS.displayName = \"ReverseProxyTLS\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyTo = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M6.22743596,5.63934145 L9.05586309,8.46776857 L6.22743596,11.2961957 L5.52032918,10.5890889 L7.16540023,8.94334145 L1.99140023,8.94413691 L1.99140023,7.94413691 L7.11740023,7.94334145 L5.52032918,6.34644823 L6.22743596,5.63934145 Z M12.5,7 C13.3284271,7 14,7.67157288 14,8.5 C14,9.32842712 13.3284271,10 12.5,10 C11.6715729,10 11,9.32842712 11,8.5 C11,7.67157288 11.6715729,7 12.5,7 Z M12.5,8 C12.2238576,8 12,8.22385763 12,8.5 C12,8.77614237 12.2238576,9 12.5,9 C12.7761424,9 13,8.77614237 13,8.5 C13,8.22385763 12.7761424,8 12.5,8 Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n));\n\nReverseProxyTo.displayName = \"ReverseProxyTo\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ReverseProxyTCP = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 100 100\"\n width=\"100%\"\n height=\"100%\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M 40 90 H 15 V 15 H 85 V 35 H 15\"\n stroke=\"currentColor\"\n strokeWidth=\"10\"\n strokeLinejoin=\"miter\"\n strokeLinecap=\"square\"\n strokeOpacity=\"0.5\"\n fill=\"none\"\n />\n\n <g fill=\"currentColor\">\n <path d=\"M 30 48 H 47 V 55 H 42 V 80 H 35 V 55 H 30 Z\" />\n\n <path d=\"M 69 48 H 52 V 80 H 69 V 73 H 59 V 55 H 69 Z\" />\n\n <path d=\"M 74 48 V 80 H 81 V 68 H 91 V 48 Z M 81 55 H 84 V 61 H 81 Z\" />\n </g>\n </svg>\n));\n\nReverseProxyTCP.displayName = \"ReverseProxyTCP\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Refresh = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n {...props}\n ref={ref}\n >\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </svg>\n ),\n);\n\nRefresh.displayName = \"Refresh\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Calendar = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M3 10H21M7 3V5M17 3V5M6.2 21H17.8C18.9201 21 19.4802 21 19.908 20.782C20.2843 20.5903 20.5903 20.2843 20.782 19.908C21 19.4802 21 18.9201 21 17.8V8.2C21 7.07989 21 6.51984 20.782 6.09202C20.5903 5.71569 20.2843 5.40973 19.908 5.21799C19.4802 5 18.9201 5 17.8 5H6.2C5.0799 5 4.51984 5 4.09202 5.21799C3.71569 5.40973 3.40973 5.71569 3.21799 6.09202C3 6.51984 3 7.07989 3 8.2V17.8C3 18.9201 3 19.4802 3.21799 19.908C3.40973 20.2843 3.71569 20.5903 4.09202 20.782C4.51984 21 5.07989 21 6.2 21Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n ></path>\n </svg>\n ),\n);\n\nCalendar.displayName = \"Calendar\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Folder = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M3 8.2C3 7.07989 3 6.51984 3.21799 6.09202C3.40973 5.71569 3.71569 5.40973 4.09202 5.21799C4.51984 5 5.0799 5 6.2 5H9.67452C10.1637 5 10.4083 5 10.6385 5.05526C10.8425 5.10425 11.0376 5.18506 11.2166 5.29472C11.4184 5.4184 11.5914 5.59135 11.9373 5.93726L12.0627 6.06274C12.4086 6.40865 12.5816 6.5816 12.7834 6.70528C12.9624 6.81494 13.1575 6.89575 13.3615 6.94474C13.5917 7 13.8363 7 14.3255 7H17.8C18.9201 7 19.4802 7 19.908 7.21799C20.2843 7.40973 20.5903 7.71569 20.782 8.09202C21 8.51984 21 9.0799 21 10.2V15.8C21 16.9201 21 17.4802 20.782 17.908C20.5903 18.2843 20.2843 18.5903 19.908 18.782C19.4802 19 18.9201 19 17.8 19H6.2C5.07989 19 4.51984 19 4.09202 18.782C3.71569 18.5903 3.40973 18.2843 3.21799 17.908C3 17.4802 3 16.9201 3 15.8V8.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n ></path>\n </svg>\n ),\n);\n\nFolder.displayName = \"Folder\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Jobs = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M2.27749 5.24694C2.38823 4.84781 2.80157 4.61402 3.2007 4.72476L4.9044 5.19744C5.82129 5.45183 6.5469 6.15866 6.80003 7.07489L8.95106 14.8609L9.10935 15.4075C9.74249 15.6438 10.2863 16.0866 10.6314 16.6747L10.9414 16.579L19.8115 14.2739C20.2124 14.1697 20.6219 14.4102 20.7261 14.8111C20.8303 15.212 20.5897 15.6214 20.1888 15.7256L11.3515 18.0223L11.0228 18.1238C11.0161 19.3947 10.1392 20.5555 8.81236 20.9003C7.22189 21.3136 5.58709 20.3982 5.16092 18.8556C4.73476 17.313 5.67861 15.7274 7.26908 15.3141C7.3479 15.2936 7.42682 15.2764 7.5057 15.2623L5.35419 7.47433C5.24592 7.08242 4.92897 6.76092 4.50338 6.64284L2.79968 6.17016C2.40054 6.05942 2.16675 5.64608 2.27749 5.24694Z\"\n fill=\"currentColor\"\n ></path>\n <path\n opacity=\"0.5\"\n d=\"M9.56443 8.73049L10.0789 10.5926C10.5639 12.3481 10.8064 13.2259 11.5194 13.6252C12.2323 14.0244 13.1374 13.7892 14.9474 13.3188L16.8673 12.8199C18.6774 12.3495 19.5824 12.1143 19.9941 11.4227C20.4057 10.7312 20.1632 9.85344 19.6782 8.09788L19.1638 6.2358C18.6788 4.48023 18.4363 3.60244 17.7233 3.20319C17.0103 2.80394 16.1052 3.03915 14.2952 3.50955L12.3753 4.00849C10.5652 4.47889 9.66021 4.71409 9.24856 5.40562C8.83692 6.09714 9.07942 6.97493 9.56443 8.73049Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nJobs.displayName = \"Jobs\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Warning = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 60.601 60.601\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m30.295 9.0586-25.144 43.554h50.289l-25.145-43.554\"\n fill=\"none\"\n ></path>\n <path\n d=\"m29.932 19.858 6.2807 3.3256-2.14 3.724-4.2756 1.0652-3.6058-5.9844z\"\n fillRule=\"evenodd\"\n strokeLinejoin=\"bevel\"\n strokeMiterlimit=\"10\"\n strokeWidth=\".13332\"\n stroke=\"currentColor\"\n ></path>\n <path\n d=\"m25.922 29.038 0.80466 1.4636-0.80466 2.6588-2.6706 0.26848-1.7355-1.9962 0.13049-1.5979z\"\n fillRule=\"evenodd\"\n strokeLinejoin=\"bevel\"\n strokeMiterlimit=\"10\"\n strokeWidth=\".13332\"\n stroke=\"currentColor\"\n ></path>\n <path\n d=\"m27.392 34.226 1.605 0.13423 0.53499 1.4636-1.605 2.1261-1.6006-0.13423-0.26967-2.793z\"\n fillRule=\"evenodd\"\n strokeLinejoin=\"bevel\"\n strokeMiterlimit=\"10\"\n strokeWidth=\".13332\"\n stroke=\"currentColor\"\n ></path>\n <path\n d=\"m20.176 44.467 0.4045 1.4636-0.26966 1.5979-2.5401 1.0652-1.0656-1.1995 0.66547-2.6588z\"\n fillRule=\"evenodd\"\n strokeLinejoin=\"bevel\"\n strokeMiterlimit=\"10\"\n strokeWidth=\".13332\"\n stroke=\"currentColor\"\n ></path>\n <path\n d=\"m13.365 46.731 1.4701 0.52828-0.40451 1.5979-1.3353 0.93099-0.93514-0.39838v-1.5979z\"\n fillRule=\"evenodd\"\n strokeLinejoin=\"bevel\"\n strokeMiterlimit=\"10\"\n strokeWidth=\".13332\"\n stroke=\"currentColor\"\n ></path>\n <path\n d=\"m20.446 36.755 3.8754 1.7278 0.40016 2.6588-4.1408 1.3337-1.3396-0.93533-1.4701-4.1224z\"\n fillRule=\"evenodd\"\n strokeLinejoin=\"bevel\"\n strokeMiterlimit=\"10\"\n strokeWidth=\".13332\"\n stroke=\"currentColor\"\n ></path>\n <path d=\"m30.297 3.6289c-1.2075 0-2.2599 0.65852-2.8262 1.6348l-27.027 46.809c-0.56625 0.9775-0.61211 2.2213-0.0059 3.2676 0.605 1.05 1.702 1.6328 2.832 1.6328h54.062c1.1275 0 2.227-0.58281 2.832-1.6328 0.60625-1.0462 0.5601-2.2901-4e-3 -3.2676l-27.035-46.809c-0.56625-0.97625-1.6194-1.6348-2.8281-1.6348zm0.03515 5.4551 8.2871 14.369-1.6055 6.3809-3.0703 1.3301-1.3398 4.9238-3.8711 3.8574-1.4707 5.4531-3.6094 3.7285-18.574 3.4551z\"></path>\n </svg>\n ),\n);\n\nWarning.displayName = \"Warning\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Artifactory = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <rect x=\"5\" y=\"42.4\" width=\"38\" height=\"2.92\"></rect>\n <path d=\"M23.93,34.48A16.24,16.24,0,1,1,40.17,18.24,16.25,16.25,0,0,1,23.93,34.48Zm0-29.38A13.14,13.14,0,1,0,37.07,18.24,13.16,13.16,0,0,0,23.93,5.1Z\"></path>\n </svg>\n ),\n);\n\nArtifactory.displayName = \"Artifactory\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Azure = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path d=\"M7.47 12.412l3.348-.592.031-.007-1.722-2.049a291.474 291.474 0 01-1.723-2.058c0-.01 1.779-4.909 1.789-4.926a788.95 788.95 0 012.934 5.066l2.95 5.115.023.039-10.948-.001 3.317-.587zM.9 11.788c0-.003.811-1.412 1.803-3.131L4.507 5.53l2.102-1.764C7.765 2.797 8.714 2 8.717 2a.37.37 0 01-.033.085L6.4 6.981 4.16 11.789l-1.63.002c-.897.001-1.63 0-1.63-.003z\"></path>\n </svg>\n ),\n);\n\nAzure.displayName = \"Azure\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Minio = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"256\"\n height=\"256\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M13.207.006a2.16 2.16 0 0 0-1.62.582a2.15 2.15 0 0 0-.095 3.035l3.408 3.55a3.042 3.042 0 0 1-.663 4.688l-.463.239V7.285a15.42 15.42 0 0 0-8.018 10.486v.018l6.549-3.328v7.621L13.779 24V13.682l.897-.463a4.443 4.443 0 0 0 1.22-7.03l-3.37-3.525a.749.749 0 0 1 .037-1.055a.752.752 0 0 1 1.056.038l.467.486l-.006.006l4.07 4.244a.057.057 0 0 0 .082 0a.06.06 0 0 0 0-.07l-3.14-5.143l-.149.143l.149-.145C14.494.393 13.829.054 13.207.006Zm-.902 9.865v2.994l-4.152 2.149a13.979 13.979 0 0 1 2.767-3.928a14.178 14.178 0 0 1 1.385-1.215z\"\n />\n </svg>\n ),\n);\n\nMinio.displayName = \"Minio\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Aws = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path d=\"M4.51 7.687c0 .197.02.357.058.475.042.117.096.245.17.384a.233.233 0 01.037.123c0 .053-.032.107-.1.16l-.336.224a.255.255 0 01-.138.048c-.054 0-.107-.026-.16-.074a1.652 1.652 0 01-.192-.251 4.137 4.137 0 01-.164-.315c-.416.491-.937.737-1.565.737-.447 0-.804-.129-1.064-.385-.261-.256-.394-.598-.394-1.025 0-.454.16-.822.484-1.1.325-.278.756-.416 1.304-.416.18 0 .367.016.564.042.197.027.4.07.612.118v-.39c0-.406-.085-.689-.25-.854-.17-.166-.458-.246-.868-.246-.186 0-.377.022-.574.07a4.23 4.23 0 00-.575.181 1.525 1.525 0 01-.186.07.326.326 0 01-.085.016c-.075 0-.112-.054-.112-.166v-.262c0-.085.01-.15.037-.186a.399.399 0 01.15-.113c.185-.096.409-.176.67-.24.26-.07.537-.101.83-.101.633 0 1.096.144 1.394.432.293.288.442.726.442 1.314v1.73h.01zm-2.161.811c.175 0 .356-.032.548-.096.192-.064.362-.182.505-.342a.848.848 0 00.181-.341c.032-.129.054-.283.054-.465V7.03a4.43 4.43 0 00-.49-.09 3.996 3.996 0 00-.5-.033c-.357 0-.617.07-.793.214-.176.144-.26.347-.26.614 0 .25.063.437.196.566.128.133.314.197.559.197zm4.273.577c-.096 0-.16-.016-.202-.054-.043-.032-.08-.106-.112-.208l-1.25-4.127a.938.938 0 01-.048-.214c0-.085.042-.133.127-.133h.522c.1 0 .17.016.207.053.043.032.075.107.107.208l.894 3.535.83-3.535c.026-.106.058-.176.101-.208a.365.365 0 01.213-.053h.426c.1 0 .17.016.212.053.043.032.08.107.102.208l.84 3.578.92-3.578a.459.459 0 01.107-.208.347.347 0 01.208-.053h.495c.085 0 .133.043.133.133 0 .027-.006.054-.01.086a.768.768 0 01-.038.133l-1.283 4.127c-.031.107-.069.177-.111.209a.34.34 0 01-.203.053h-.457c-.101 0-.17-.016-.213-.053-.043-.038-.08-.107-.101-.214L8.213 5.37l-.82 3.439c-.026.107-.058.176-.1.213-.043.038-.118.054-.213.054h-.458zm6.838.144a3.51 3.51 0 01-.82-.096c-.266-.064-.473-.134-.612-.214-.085-.048-.143-.101-.165-.15a.38.38 0 01-.031-.149v-.272c0-.112.042-.166.122-.166a.3.3 0 01.096.016c.032.011.08.032.133.054.18.08.378.144.585.187.213.042.42.064.633.064.336 0 .596-.059.777-.176a.575.575 0 00.277-.508.52.52 0 00-.144-.373c-.095-.102-.276-.193-.537-.278l-.772-.24c-.388-.123-.676-.305-.851-.545a1.275 1.275 0 01-.266-.774c0-.224.048-.422.143-.593.096-.17.224-.32.384-.438.16-.122.34-.213.553-.277.213-.064.436-.091.67-.091.118 0 .24.005.357.021.122.016.234.038.346.06.106.026.208.052.303.085.096.032.17.064.224.096a.461.461 0 01.16.133.289.289 0 01.047.176v.251c0 .112-.042.171-.122.171a.552.552 0 01-.202-.064 2.428 2.428 0 00-1.022-.208c-.303 0-.543.048-.708.15-.165.1-.25.256-.25.475 0 .149.053.277.16.379.106.101.303.202.585.293l.756.24c.383.123.66.294.825.513.165.219.244.47.244.748 0 .23-.047.437-.138.619a1.435 1.435 0 01-.388.47c-.165.133-.362.23-.591.299-.24.075-.49.112-.761.112z\"></path>\n <path\n fillRule=\"evenodd\"\n d=\"M14.465 11.813c-1.75 1.297-4.294 1.986-6.481 1.986-3.065 0-5.827-1.137-7.913-3.027-.165-.15-.016-.353.18-.235 2.257 1.313 5.04 2.109 7.92 2.109 1.941 0 4.075-.406 6.039-1.239.293-.133.543.192.255.406z\"\n clip-rule=\"evenodd\"\n ></path>\n <path\n fillRule=\"evenodd\"\n d=\"M15.194 10.98c-.223-.287-1.479-.138-2.048-.069-.17.022-.197-.128-.043-.24 1-.705 2.645-.502 2.836-.267.192.24-.053 1.89-.99 2.68-.143.123-.281.06-.217-.1.212-.53.686-1.72.462-2.003z\"\n clip-rule=\"evenodd\"\n ></path>\n </svg>\n ),\n);\n\nAws.displayName = \"Aws\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Orchestrator = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M2.93984699,5.04722482 C3.45032393,5.22930038 3.71753343,5.78325199 3.53916992,6.28968026 L2.18116652,10.2121429 C2.1477435,10.3046831 2.15895191,10.4072402 2.21159877,10.4905982 C2.26424564,10.5739562 2.3525593,10.6289766 2.45138148,10.6399856 L6.14778358,11.0507147 L7,16 L5.96071169,16 C5.66920876,15.997325 5.41541793,15.8026111 5.34060299,15.5242388 L4.58538682,12.8408089 L1.43634323,12.4985347 C0.943506392,12.4342967 0.506124506,12.1542667 0.245442025,11.7360705 C-0.0152404569,11.3178743 -0.0715227002,10.8059506 0.0921970146,10.3422071 L1.72041537,5.65989568 C1.799705,5.41875465 1.97280198,5.21866664 2.20154903,5.10373879 C2.43029607,4.98881094 2.6959128,4.96847897 2.93984699,5.04722482 Z M14.7760189,8.14393564 C14.999906,8.27857079 15.1588898,8.49425219 15.2175778,8.74296527 L15.9511321,11.9038371 C16.0861912,12.43211 15.9372096,12.9906928 15.5548378,13.3896796 C15.1724659,13.7886665 14.6081578,13.9743677 14.0537657,13.8836489 L11.3382043,13.3852825 L10.7668783,15.5255272 C10.6900323,15.8055868 10.4279253,16.0004105 10.128545,16 L9,16 L9.85698889,11.1221528 L13.4154325,11.7741253 C13.525236,11.7930528 13.6375135,11.7572706 13.7142185,11.6789038 C13.7909236,11.600537 13.8217742,11.4900904 13.7963164,11.3849899 L13.2955246,9.20037005 C13.1644054,8.68133222 13.4903336,8.15708398 14.0255521,8.02613688 C14.2819254,7.96688689 14.5521319,8.00930049 14.7760189,8.14393564 Z M7.5,5 C8.88663968,5 10,6.11708483 10,7.5 C10,8.88291517 8.88663968,10 7.5,10 C6.11336032,10 5,8.88291517 5,7.5 C5,6.11708483 6.11336032,5 7.5,5 Z M11.2454613,0.0490332115 C11.3653238,-0.0148740908 11.5037495,-0.016378144 11.6246672,0.044912983 C11.7214013,0.0939458847 11.799265,0.179282324 11.8460594,0.285176849 L13.9244034,6.16119904 C13.9963415,6.29145315 14.018116,6.44949292 13.98465,6.59846902 C13.9511839,6.74744512 13.8654024,6.87433657 13.7473065,6.94955672 C13.4858777,7.09318464 13.2525596,6.91444768 13.1260618,6.61123319 L11.0796086,0.80866531 C11.0059855,0.685051715 10.9820058,0.531777817 11.0136294,0.386936906 C11.0452529,0.242095994 11.1295104,0.119287533 11.2454613,0.0490332115 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nOrchestrator.displayName = \"Orchestrator\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Podman = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M17.2.275L6.75.308a.259.259 0 0 0-.203.098L.056 8.602a.259.259 0 0 0-.05.219l2.356 10.194a.26.26 0 0 0 .14.174l9.43 4.511a.258.258 0 0 0 .224-.002l9.401-4.566a.259.259 0 0 0 .141-.175L23.993 8.75a.258.258 0 0 0-.051-.22L17.403.374A.259.259 0 0 0 17.2.275zm-.123.517l6.385 7.966-2.242 9.964-9.177 4.457-9.205-4.402L.54 8.827 6.875.824zM11.46 2.857c-.933 0-1.84.1-2.426.332h-.002c-1.554.569-2.725 2.105-3.074 3.952v.004c-.309 1.463-.392 2.703-.556 3.824-.07.481-.159.94-.283 1.387-.628.497-1.079 1.263-1.244 2.138v.004c-.116.547-.181 1.04-.237 1.5h-.644v.518h8.891c-.061.464-.122.996-.181 1.42H7.596v.517h7.939c-.242-.078-.486-.218-.756-.502h-.697l-.85.488-.232-.396.162-.092h-1.069c.113-.776.17-1.601.373-2.564v-.004c.22-1.164.96-2.112 1.895-2.453l.004-.002h.002c.318-.127.928-.205 1.543-.205.613 0 1.244.075 1.622.207.935.341 1.676 1.29 1.895 2.453v.004c.204.963.26 1.788.373 2.564h-.742l.162.092-.233.396-.85-.488h-.75c-.219.25-.474.412-.747.502h4.392v-.518h-.842c-.103-.743-.181-1.67-.382-2.623v-.002a4.14 4.14 0 0 0-.264-.863h1.863v-.517h-2.13a3.488 3.488 0 0 0-.8-.906h1.8v-.518H17.95a8.862 8.862 0 0 1-.193-.775h1.484v-.518h-1.576c-.013-.081-.027-.161-.039-.244-.164-1.12-.246-2.36-.555-3.824v-.004c-.348-1.848-1.52-3.383-3.075-3.952l-.002-.002h-.002c-.65-.227-1.596-.33-2.531-.33zm0 .386c.904 0 1.833.11 2.404.309h.002c1.4.514 2.5 1.934 2.826 3.666v.003c.303 1.436.385 2.66.552 3.805.076.515.173 1.013.315 1.505-.449-.135-1.05-.197-1.648-.197-.12 0-.236.003-.352.008l-1.863-1.865a2.17 2.17 0 0 0 .11-.246l2.13 1.23.13-.224-2.185-1.262c.016-.069.027-.14.036-.21l2.302.616.068-.248-2.354-.63c-.02-1.153-1.008-2.078-2.208-2.078-1.205 0-2.196.931-2.206 2.091l-2.303.617.066.25 2.252-.605c.01.076.024.151.041.224L7.436 11.24l.129.222 2.087-1.207c.034.089.074.176.12.258l-1.266 1.266a6.959 6.959 0 0 0-1.045-.075c-.603 0-1.186.064-1.578.22a2.668 2.668 0 0 0-.285.124c.076-.335.137-.675.187-1.021.168-1.144.248-2.37.551-3.805l.002-.001v-.002c.326-1.733 1.426-3.153 2.828-3.666h.002l.004-.002c.488-.194 1.381-.307 2.287-.307zM8.473 5.194a1.295 1.295 0 0 0-.965.502l-.117.153.306.236.12-.152a.923.923 0 0 1 .673-.352.92.92 0 0 1 .67.262l.139.134.271-.275-.136-.137a1.293 1.293 0 0 0-.961-.37zm6.39 0a1.289 1.289 0 0 0-.96.371l-.138.137.274.275.136-.134a.923.923 0 0 1 .672-.262.923.923 0 0 1 .674.352l.119.152.307-.236-.12-.153c-.23-.3-.587-.486-.964-.502zM8.53 6.708c-.642 0-1.164.538-1.164 1.19 0 .65.522 1.187 1.164 1.187.643 0 1.164-.536 1.164-1.188 0-.651-.521-1.19-1.164-1.19zm6.273 0c-.643 0-1.162.538-1.162 1.19 0 .65.52 1.187 1.162 1.187.643 0 1.164-.536 1.164-1.188 0-.651-.521-1.19-1.164-1.19zm-6.273.387c.428 0 .776.355.776.802 0 .447-.348.8-.776.8a.785.785 0 0 1-.775-.8c0-.035.002-.07.006-.103.07.191.248.318.445.318a.487.487 0 0 0 .477-.496.49.49 0 0 0-.383-.486.759.759 0 0 1 .23-.035zm6.273 0c.428 0 .777.355.777.802 0 .447-.349.8-.777.8a.785.785 0 0 1-.77-.9c.072.19.248.315.444.315a.486.486 0 0 0 .479-.496.491.491 0 0 0-.383-.484.755.755 0 0 1 .23-.037zm-3.08.716c1.012 0 1.819.775 1.819 1.723 0 .947-.807 1.722-1.819 1.722s-1.82-.775-1.82-1.722c0-.948.808-1.723 1.82-1.723zm-.002.528c-.142 0-.258.043-.355.076a.804.804 0 0 1-.232.054c-.107 0-.2.047-.268.127a.568.568 0 0 0-.104.207c-.04.134-.062.268-.08.315a.276.276 0 0 0 .032.25c.033.056.071.1.117.146.09.092.206.183.322.268.12.088.237.166.326.224l-.008.09c-.043.036-.14.102-.324.178a.533.533 0 0 1-.299.025.43.43 0 0 1-.236-.172c.015-.138.044-.293.068-.449l-.376-.095c-.05.238-.067.43-.094.64l.037.059c.143.224.318.344.506.392a.908.908 0 0 0 .52-.033 1.57 1.57 0 0 0 .444-.242c.088.067.244.174.446.242a.908.908 0 0 0 .52.033.868.868 0 0 0 .507-.392l.037-.059a6.292 6.292 0 0 0-.096-.637l-.377.092c.032.148.051.32.07.451a.434.434 0 0 1-.237.17.533.533 0 0 1-.3-.025c-.178-.068-.272-.14-.325-.178l-.006-.084c.09-.058.209-.137.336-.23.115-.085.231-.176.322-.268a.72.72 0 0 0 .117-.146.273.273 0 0 0 .031-.25c-.018-.047-.039-.181-.08-.315a.564.564 0 0 0-.103-.207.343.343 0 0 0-.268-.127.815.815 0 0 1-.234-.054c-.097-.033-.212-.076-.354-.076zm.002.386c.057 0 .134.024.23.057.09.03.208.07.337.076.04.102.06.237.09.338a.361.361 0 0 1-.041.045 2.66 2.66 0 0 1-.276.228c-.165.122-.271.188-.342.233a5.287 5.287 0 0 1-.34-.233 2.557 2.557 0 0 1-.275-.228.34.34 0 0 1-.04-.047c.035-.119.046-.234.089-.34.08.012.246-.042.336-.072a.837.837 0 0 1 .232-.057zm-3.234.61a.635.635 0 0 0-.611.517l1.084-.289a.614.614 0 0 0-.473-.228zm6.336 0a.61.61 0 0 0-.436.187c.352.096.69.184 1.033.275a.632.632 0 0 0-.597-.462zm-.623.607c-.007.035-.002.07-.002.103l.921.532a.648.648 0 0 0 .276-.313l-1.195-.322zm-5.086.05l-1.18.315c.078.15.207.264.362.316l.797-.46c.018-.059.015-.12.021-.17zm4.441.714l1.656 1.658a4.19 4.19 0 0 0-.826.146l-.95-1.647a2.51 2.51 0 0 0 .12-.157zm-3.646.03c.04.055.083.118.129.169l-.658 1.134a2.656 2.656 0 0 0-.276-.119l-.002-.002a3.3 3.3 0 0 0-.292-.082zm3.338.317l.892 1.547c-.623.251-1.149.725-1.523 1.33h-1.652c-.262-.75-.741-1.38-1.358-1.764l.623-1.082c.394.347.919.559 1.492.559a2.25 2.25 0 0 0 1.526-.59zM7.46 12.09c.574 0 1.167.073 1.518.195.867.319 1.555 1.203 1.76 2.285l.001.002v.002c.109.513.173.98.227 1.424H9.86a.386.386 0 0 0-.494 0H9.11a1.351 1.351 0 0 0-.078-.418.799.799 0 0 0 .569.238c.45 0 .814-.375.814-.828a.824.824 0 0 0-.814-.828.822.822 0 0 0-.791 1.016 1.495 1.495 0 0 0-1.18-.559c-.798 0-1.46.611-1.48 1.38h-.342a.386.386 0 0 0-.494 0H4.028c.054-.445.116-.912.224-1.425l.002-.002v-.002c.205-1.084.894-1.97 1.764-2.287h.002l.004-.002c.295-.117.863-.191 1.437-.19zm-1.91 1.105a.898.898 0 0 0-.67.348l-.119.154.307.237.119-.155a.525.525 0 0 1 .379-.197.52.52 0 0 1 .377.147l.138.136.272-.275-.137-.137a.895.895 0 0 0-.666-.258zm4.094 0a.9.9 0 0 0-.668.258l-.137.137.273.275.137-.136a.522.522 0 0 1 .377-.147.525.525 0 0 1 .379.197l.119.155.307-.237-.12-.154a.894.894 0 0 0-.667-.348zm4.222.735a.947.947 0 0 0-.707.365l-.117.154.306.237.12-.155a.568.568 0 0 1 .413-.213.571.571 0 0 1 .414.159l.14.136.27-.275-.138-.137a.942.942 0 0 0-.701-.271zm4.374 0a.942.942 0 0 0-.7.271l-.14.137.272.275.139-.136a.571.571 0 0 1 .414-.159.568.568 0 0 1 .414.213l.119.155.306-.237-.117-.154a.947.947 0 0 0-.707-.365zm-12.65.232a.824.824 0 0 0-.815.828c0 .453.365.828.814.828.45 0 .815-.375.815-.828a.824.824 0 0 0-.815-.828zm5.518.285h1.242a4.137 4.137 0 0 0-.263.864v.002c-.05.237-.092.464-.127.685h-.602a16.77 16.77 0 0 0-.236-1.5l-.002-.002c-.003-.016-.009-.032-.012-.049zm-5.519.102a.43.43 0 0 1 .426.441.43.43 0 0 1-.426.442c-.22 0-.4-.171-.422-.397a.298.298 0 0 0 .215.092.31.31 0 0 0 .305-.316.317.317 0 0 0-.129-.258c.01-.001.02-.004.031-.004zm4.014 0c.235 0 .427.193.427.441a.433.433 0 0 1-.427.442.427.427 0 0 1-.422-.405.3.3 0 0 0 .256.145.31.31 0 0 0 .304-.317.314.314 0 0 0-.207-.298c.023-.004.045-.008.069-.008zm4.304.414a.865.865 0 0 0-.856.87c0 .478.382.874.856.874a.868.868 0 0 0 .857-.873.867.867 0 0 0-.857-.871zm4.292 0a.867.867 0 0 0-.814 1.14 1.597 1.597 0 0 0-1.295-.652c-.846 0-1.546.65-1.568 1.463l-1.525.408.066.248 1.477-.394c.004.028.009.06.015.087l-1.418.817.131.222 1.367-.789c.235.552.801.94 1.455.94.66 0 1.233-.397 1.463-.957l1.398.806.13-.222-1.45-.836c.005-.025.008-.053.012-.078l1.511.404.067-.248-1.563-.418a1.438 1.438 0 0 0-.107-.5c.157.186.39.303.648.303a.867.867 0 0 0 .856-.873.865.865 0 0 0-.856-.871zm-10.567.043c.598 0 1.071.444 1.092.992h-.41c.007-.01.016-.02.023-.033a.24.24 0 0 0 .025-.22c-.005-.016-.021-.102-.05-.196a.416.416 0 0 0-.078-.156.282.282 0 0 0-.225-.108.499.499 0 0 1-.129-.031c-.062-.021-.142-.05-.248-.05-.106 0-.188.029-.25.05a.49.49 0 0 1-.127.031.29.29 0 0 0-.225.108.424.424 0 0 0-.08.156c-.029.094-.043.18-.048.195a.242.242 0 0 0 .023.22c.008.014.017.023.025.034h-.41c.02-.548.494-.992 1.092-.992zm6.275.344c.259 0 .47.211.47.484a.477.477 0 0 1-.47.486.472.472 0 0 1-.467-.453.322.322 0 0 0 .246.115c.18 0 .326-.15.326-.338a.34.34 0 0 0-.156-.289c.017-.002.033-.005.05-.005zm4.292 0c.26 0 .469.211.469.484 0 .272-.21.486-.469.486a.477.477 0 0 1-.47-.486c0-.016.002-.031.004-.047a.33.33 0 0 0 .312.24c.18 0 .326-.15.326-.338a.338.338 0 0 0-.256-.332.475.475 0 0 1 .084-.007zm-10.567.24c.021 0 .063.01.125.031.086.03.117.039.186.049.012.041.022.088.033.129a1.475 1.475 0 0 1-.168.138c-.038.028-.064.045-.088.061h-.176c-.024-.016-.052-.033-.09-.06a1.602 1.602 0 0 1-.168-.14l.034-.128c.107-.014.146-.04.185-.049a.504.504 0 0 1 .127-.031zm8.458.25c.661 0 1.184.502 1.184 1.113 0 .156-.035.304-.096.44l-.002-.024-.022-.156a2.443 2.443 0 0 0-.04-.24l-.377.093.044.274a.24.24 0 0 1-.115.074.299.299 0 0 1-.168-.014c-.087-.03-.132-.063-.18-.094.057-.037.13-.084.198-.134.08-.06.16-.123.226-.19a.542.542 0 0 0 .092-.111.245.245 0 0 0 .026-.225c-.008-.019-.022-.112-.053-.21a.444.444 0 0 0-.084-.163.286.286 0 0 0-.23-.107.566.566 0 0 1-.14-.037c-.065-.022-.152-.055-.263-.055-.11 0-.195.032-.262.055a.575.575 0 0 1-.14.037.294.294 0 0 0-.23.107.436.436 0 0 0-.083.162c-.03.1-.045.192-.052.211a.246.246 0 0 0 .025.225.534.534 0 0 0 .09.111c.066.067.146.13.226.19.068.05.138.095.194.132a.57.57 0 0 1-.18.096.305.305 0 0 1-.17.014.237.237 0 0 1-.111-.076c.008-.09.026-.177.04-.272l-.376-.094c-.032.146-.045.286-.063.409a1.052 1.052 0 0 1-.09-.428c0-.611.521-1.113 1.182-1.113zm0 .623c.026 0 .074.01.14.033.066.025.169.052.206.055l.035.156c-.04.04-.112.1-.184.152-.095.07-.14.095-.197.131-.056-.036-.1-.061-.195-.13a1.236 1.236 0 0 1-.184-.157l.035-.152a1.04 1.04 0 0 0 .206-.055.523.523 0 0 1 .138-.033zm-2.22.353a.43.43 0 0 0-.385.272l.656-.176a.416.416 0 0 0-.271-.096zm4.333 0a.414.414 0 0 0-.22.07l.603.16a.426.426 0 0 0-.383-.23zm-4.054.567l-.607.162a.436.436 0 0 0 .125.113zm3.925.002l.407.234a.443.443 0 0 0 .087-.102zm-1.986.234c.067.047.165.108.285.148a.68.68 0 0 0 .389.024.57.57 0 0 0 .232-.121 1.201 1.201 0 0 1-.904.394c-.356 0-.67-.145-.885-.375a.58.58 0 0 0 .207.102c.144.036.28.014.391-.024.12-.04.218-.1.285-.148zm-9.524 1.61v.517h6.214v-.518zm3.619 1.292v.517H15.3v-.517z\"\n />\n </svg>\n ),\n);\n\nPodman.displayName = \"Podman\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const PodmanDesktop = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"645\"\n height=\"642.17\"\n fill=\"none\"\n version=\"1.1\"\n viewBox=\"0 0 645 642.17\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m327.87 17.267c-3.379-1.689-7.355-1.689-10.734 0l-290.5 145.25c-4.065 2.033-6.633 6.188-6.633 10.733v287.67c0 4.545 2.568 8.7 6.633 10.733l290.5 145.25c3.379 1.689 7.355 1.689 10.734 0l290.5-145.25c4.065-2.033 6.633-6.188 6.633-10.733v-287.67c0-4.545-2.568-8.7-6.633-10.733z\"\n clip-rule=\"evenodd\"\n fill=\"url(#paint1_linear_1_2)\"\n fillRule=\"evenodd\"\n style={{ fill: \"url(#paint1_linear_1_2)\" }}\n />\n <g\n transform=\"translate(-189 -194.42)\"\n filter=\"url(#filter0_d_1_2)\"\n shape-rendering=\"crispEdges\"\n >\n <path\n d=\"m506.13 211.68c3.379-1.689 7.355-1.689 10.734 0l290.5 145.25c4.065 2.033 6.633 6.188 6.633 10.733v287.67c0 4.545-2.568 8.7-6.633 10.733l-290.5 145.25c-3.379 1.689-7.355 1.689-10.734 0l-290.5-145.25c-4.065-2.033-6.633-6.188-6.633-10.733v-287.67c0-4.545 2.568-8.7 6.633-10.733z\"\n fill=\"url(#paint2_linear_1_2)\"\n fill-opacity=\".2\"\n style={{ fill: \"url(#paint2_linear_1_2)\" }}\n />\n <path\n d=\"m506.13 211.68c3.379-1.689 7.355-1.689 10.734 0l290.5 145.25c4.065 2.033 6.633 6.188 6.633 10.733v287.67c0 4.545-2.568 8.7-6.633 10.733l-290.5 145.25c-3.379 1.689-7.355 1.689-10.734 0l-290.5-145.25c-4.065-2.033-6.633-6.188-6.633-10.733v-287.67c0-4.545 2.568-8.7 6.633-10.733z\"\n stroke=\"url(#paint3_linear_1_2)\"\n strokeLinecap=\"square\"\n strokeLinejoin=\"round\"\n strokeWidth=\"32\"\n style={{ stroke: \"url(#paint3_linear_1_2)\" }}\n />\n </g>\n <g transform=\"translate(-189 -194.42)\" filter=\"url(#filter1_i_1_2)\">\n <path\n d=\"m512.5 227 285.5 144v282.5l-287.5 142-285.5-142v-282.5z\"\n fill=\"url(#paint4_linear_1_2)\"\n fill-opacity=\".2\"\n style={{ fill: \"url(#paint4_linear_1_2)\" }}\n />\n </g>\n <path\n d=\"m322 33.584-286 142.5 286 145.5 287-145.5z\"\n fill=\"url(#paint5_linear_1_2)\"\n fill-opacity=\".3\"\n style={{ fill: \"url(#paint5_linear_1_2)\" }}\n />\n <path\n d=\"m107.91 390.82h428.23\"\n stroke=\"url(#paint6_linear_1_2)\"\n style={{ stroke: \"url(#paint6_linear_1_2)\" }}\n />\n <g transform=\"translate(-189 -194.42)\" filter=\"url(#filter2_dd_1_2)\">\n <path\n d=\"m297.09 421.02c0-7.732 6.268-14 14-14h400.58c7.732 0 14 6.268 14 14v186.29c0 7.732-6.268 14-14 14h-400.58c-7.732 0-14-6.268-14-14zm35.714 26.715c0-2.762 2.239-5 5-5h25.715c2.762 0 5 2.238 5 5v97.145c0 2.761-2.238 5-5 5h-25.715c-2.761 0-5-2.239-5-5zm76.43-5c-2.761 0-5 2.238-5 5v97.145c0 2.761 2.239 5 5 5h25.715c2.761 0 5-2.239 5-5v-97.145c0-2.762-2.239-5-5-5zm66.43 5c0-2.762 2.239-5 5-5h25.715c2.761 0 5 2.238 5 5v97.145c0 2.761-2.239 5-5 5h-25.715c-2.761 0-5-2.239-5-5zm76.601-5.161c-2.762 0-5 2.238-5 5v97.145c0 2.761 2.238 5 5 5h25.715c2.761 0 5-2.239 5-5v-97.145c0-2.762-2.239-5-5-5z\"\n clip-rule=\"evenodd\"\n fill=\"url(#paint7_linear_1_2)\"\n fillRule=\"evenodd\"\n style={{ fill: \"url(#paint7_linear_1_2)\" }}\n />\n </g>\n <path\n d=\"m108.09 391.18h428.58v23.714c0 6.628-5.372 12-12 12h-404.58c-6.628 0-12-5.372-12-12z\"\n fill=\"#472ea8\"\n />\n <defs>\n <filter\n id=\"filter0_d_1_2\"\n x=\"189\"\n y=\"194.42\"\n width=\"645\"\n height=\"642.17\"\n color-interpolation-filters=\"sRGB\"\n filterUnits=\"userSpaceOnUse\"\n >\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n result=\"hardAlpha\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n />\n <feOffset dy=\"4\" />\n <feGaussianBlur stdDeviation=\"2\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\" />\n <feBlend in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_1_2\" />\n <feBlend\n in=\"SourceGraphic\"\n in2=\"effect1_dropShadow_1_2\"\n result=\"shape\"\n />\n </filter>\n <filter\n id=\"filter1_i_1_2\"\n x=\"225\"\n y=\"227\"\n width=\"573\"\n height=\"568.5\"\n color-interpolation-filters=\"sRGB\"\n filterUnits=\"userSpaceOnUse\"\n >\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n result=\"hardAlpha\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n />\n <feOffset />\n <feGaussianBlur stdDeviation=\"8\" />\n <feComposite in2=\"hardAlpha\" k2=\"-1\" k3=\"1\" operator=\"arithmetic\" />\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\" />\n <feBlend in2=\"shape\" result=\"effect1_innerShadow_1_2\" />\n </filter>\n <filter\n id=\"filter2_dd_1_2\"\n x=\"286.09\"\n y=\"392.02\"\n width=\"450.58\"\n height=\"237.29\"\n color-interpolation-filters=\"sRGB\"\n filterUnits=\"userSpaceOnUse\"\n >\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n result=\"hardAlpha\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n />\n <feOffset dy=\"-4\" />\n <feGaussianBlur stdDeviation=\"5.5\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.14 0\" />\n <feBlend in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_1_2\" />\n <feColorMatrix\n in=\"SourceAlpha\"\n result=\"hardAlpha\"\n values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\"\n />\n <feOffset dy=\"4\" />\n <feGaussianBlur stdDeviation=\"2\" />\n <feComposite in2=\"hardAlpha\" operator=\"out\" />\n <feColorMatrix values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\" />\n <feBlend\n in2=\"effect1_dropShadow_1_2\"\n result=\"effect2_dropShadow_1_2\"\n />\n <feBlend\n in=\"SourceGraphic\"\n in2=\"effect2_dropShadow_1_2\"\n result=\"shape\"\n />\n </filter>\n <linearGradient\n id=\"paint1_linear_1_2\"\n x1=\"511.5\"\n x2=\"511.5\"\n y1=\"210.42\"\n y2=\"812.58\"\n gradientTransform=\"translate(-189 -194.42)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stop-color=\"#2E114A\" offset=\"0\" />\n <stop stop-color=\"#07051B\" offset=\".9434\" />\n </linearGradient>\n <linearGradient\n id=\"paint2_linear_1_2\"\n x1=\"271.39\"\n x2=\"271.39\"\n y1=\"814\"\n y2=\"209\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stop-opacity=\".73\" offset=\"0\" />\n <stop stop-color=\"#F1F1F1\" stop-opacity=\".94\" offset=\"1\" />\n </linearGradient>\n <linearGradient\n id=\"paint3_linear_1_2\"\n x1=\"172.13\"\n x2=\"814\"\n y1=\"251.54\"\n y2=\"814\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stop-color=\"#6AD2FA\" offset=\"0\" />\n <stop stop-color=\"#7669FA\" offset=\".49479\" />\n <stop stop-color=\"#8850E4\" offset=\".74479\" />\n <stop stop-color=\"#CE0EBB\" offset=\"1\" />\n </linearGradient>\n <linearGradient\n id=\"paint4_linear_1_2\"\n x1=\"284.3\"\n x2=\"284.3\"\n y1=\"792\"\n y2=\"227\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stop-opacity=\".73\" offset=\"0\" />\n <stop stop-color=\"#F1F1F1\" stop-opacity=\".94\" offset=\"1\" />\n </linearGradient>\n <linearGradient\n id=\"paint5_linear_1_2\"\n x1=\"513.91\"\n x2=\"513.91\"\n y1=\"230\"\n y2=\"395.12\"\n gradientTransform=\"translate(-189 -194.42)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stop-color=\"#621EA6\" stop-opacity=\".89\" offset=\"0\" />\n <stop stop-color=\"#CCCAD1\" stop-opacity=\"0\" offset=\"1\" />\n </linearGradient>\n <linearGradient\n id=\"paint6_linear_1_2\"\n x1=\"512.46\"\n x2=\"512.46\"\n y1=\"585.23\"\n y2=\"586.23\"\n gradientTransform=\"translate(-189 -194.42)\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stop-opacity=\"0\" offset=\"0\" />\n <stop stop-opacity=\".37\" offset=\".22917\" />\n <stop stop-opacity=\".046875\" offset=\".64583\" />\n <stop stop-opacity=\"0\" offset=\"1\" />\n </linearGradient>\n <linearGradient\n id=\"paint7_linear_1_2\"\n x1=\"511.38\"\n x2=\"511.38\"\n y1=\"407.02\"\n y2=\"621.31\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stop-color=\"#E9E9E9\" offset=\"0\" />\n <stop stop-color=\"#A59ADE\" offset=\"1\" />\n </linearGradient>\n </defs>\n </svg>\n ),\n);\n\nPodmanDesktop.displayName = \"PodmanDesktop\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Group = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n {...props}\n ref={ref}\n >\n <path d=\"M4 5h1V4h8v5h1V3H5V2H2v3h1v9h6v-1H4zM3 3h1v1H3zM2 22h3v-3H2zm1-2h1v1H3zM19 2v3h3V2zm2 2h-1V3h1zm0 6H10v11h9v1h3v-3h-1zm-2 10h-8v-9h9v8h-1zm2 1h-1v-1h1z\"></path>\n <path fill=\"none\" d=\"M0 0h24v24H0z\"></path>\n </svg>\n ),\n);\n\nGroup.displayName = \"Group\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Pin = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"m 15.298529,6.3788907 2.338848,2.3412219 c 0.742684,0.7433849 1.344499,1.3458184 1.731948,1.8686014 0.399022,0.538493 0.656953,1.105513 0.516967,1.75281 -0.139986,0.647296 -0.609185,1.056934 -1.195003,1.382093 -0.56879,0.315651 -1.365655,0.615083 -2.348948,0.984472 l -1.457357,0.54756 c -0.585597,0.220041 -0.745117,0.288596 -0.863652,0.391282 -0.05964,0.0516 -0.113006,0.110057 -0.159004,0.17419 -0.09155,0.127602 -0.145441,0.293019 -0.311522,0.896603 l -0.0091,0.0331 c -0.168588,0.612798 -0.307763,1.11856 -0.460207,1.498269 -0.154655,0.385459 -0.363491,0.750499 -0.738704,0.964643 -0.260658,0.148758 -0.555668,0.226749 -0.855764,0.226306 C 11.05491,19.439379 10.69304,19.225088 10.368301,18.966493 10.048379,18.711657 9.6777884,18.340646 9.2288236,17.891202 L 8.0587581,16.719935 5.0196264,19.762178 c -0.215795,0.215986 -0.5658556,0.216207 -0.7818718,3.68e-4 -0.2160161,-0.215765 -0.2161931,-0.565841 -3.98e-4,-0.781827 L 7.2772844,15.937665 6.145868,14.805099 C 5.6997117,14.35853 5.3314434,13.989878 5.0781714,13.671648 4.8210882,13.3487 4.6079617,12.989263 4.6052563,12.560091 c -0.00193,-0.305773 0.077446,-0.606532 0.2300295,-0.871466 0.2142397,-0.371969 0.5771047,-0.579257 0.960094,-0.732954 0.3772838,-0.151486 0.8794344,-0.289924 1.4876986,-0.45759 l 0.032862,-0.0091 c 0.6046964,-0.166715 0.7702027,-0.220763 0.897679,-0.312539 0.06571,-0.04731 0.1254935,-0.102391 0.1780453,-0.164054 0.102015,-0.1197067 0.169568,-0.2805541 0.3855252,-0.8699619 L 9.3053551,7.7009135 C 9.6697092,6.7064091 9.9648148,5.9009114 10.277774,5.3257897 c 0.322049,-0.591833 0.730065,-1.0673944 1.380015,-1.2107859 0.650024,-0.1434137 1.220067,0.1164485 1.760992,0.5180068 0.525518,0.3901693 1.131608,0.9968781 1.879748,1.7458801 z M 12.759616,5.5208191 C 12.315332,5.1909787 12.080106,5.1541577 11.895964,5.1947677 11.711823,5.2354071 11.513675,5.3679551 11.249036,5.8543011 10.979901,6.3488442 10.711871,7.0762107 10.327348,8.1256554 L 9.8154302,9.5228681 c -0.00986,0.026906 -0.019571,0.053481 -0.029162,0.079723 C 9.6136337,10.074917 9.480297,10.439743 9.2332465,10.729659 9.1230196,10.858956 8.9975852,10.974542 8.8596707,11.073837 8.5505296,11.296384 8.176106,11.399291 7.6916471,11.532495 c -0.026928,0.0074 -0.054203,0.01489 -0.081817,0.02248 -0.6494418,0.179056 -1.0903642,0.301497 -1.4024982,0.426814 -0.3131954,0.125759 -0.3883337,0.214365 -0.413854,0.258668 -0.054712,0.09502 -0.083203,0.202865 -0.08251,0.312628 3.244e-4,0.05138 0.022041,0.165712 0.2323589,0.429983 0.2095956,0.263312 0.5325878,0.587881 1.0088937,1.064674 l 3.0346351,3.037746 c 0.4793434,0.479815 0.8055864,0.805195 1.0703724,1.016022 0.265671,0.211637 0.380299,0.23272 0.431531,0.232794 0.107257,2.21e-4 0.212744,-0.02772 0.305994,-0.08094 0.04467,-0.02551 0.134015,-0.100696 0.260658,-0.416125 0.126127,-0.314323 0.249306,-0.758607 0.429246,-1.412833 0.0076,-0.0275 0.01504,-0.0547 0.02241,-0.0816 0.132688,-0.483722 0.235226,-0.857386 0.456815,-1.166254 0.09649,-0.134531 0.208468,-0.257194 0.333563,-0.365556 0.287491,-0.248864 0.650172,-0.384795 1.119445,-0.560754 0.02609,-0.0097 0.05249,-0.01961 0.07917,-0.02971 l 1.413275,-0.530973 c 1.037916,-0.389956 1.756864,-0.661598 2.245303,-0.932724 0.479889,-0.266334 0.611029,-0.464482 0.650909,-0.649065 0.03995,-0.184658 0.0024,-0.419442 -0.324644,-0.860704 C 18.148151,10.797991 17.605752,10.25296 16.821787,9.4682354 L 14.549726,7.1938018 C 13.760084,6.403379 13.211419,5.8562545 12.759616,5.5208191 Z\"\n fill=\"currentColor\"\n />\n </svg>\n ),\n);\n\nPin.displayName = \"Pin\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Database = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M3.25 6C3.25 4.45831 4.48029 3.26447 6.00774 2.50075C7.58004 1.7146 9.69967 1.25 12 1.25C14.3003 1.25 16.42 1.7146 17.9923 2.50075C19.5197 3.26447 20.75 4.45831 20.75 6V18C20.75 19.5417 19.5197 20.7355 17.9923 21.4992C16.42 22.2854 14.3003 22.75 12 22.75C9.69967 22.75 7.58004 22.2854 6.00774 21.4992C4.48029 20.7355 3.25 19.5417 3.25 18V6ZM4.75 6C4.75 5.33255 5.31057 4.52639 6.67856 3.84239C8.00168 3.18083 9.88205 2.75 12 2.75C14.118 2.75 15.9983 3.18083 17.3214 3.84239C18.6894 4.52639 19.25 5.33255 19.25 6C19.25 6.66745 18.6894 7.47361 17.3214 8.15761C15.9983 8.81917 14.118 9.25 12 9.25C9.88205 9.25 8.00168 8.81917 6.67856 8.15761C5.31057 7.47361 4.75 6.66745 4.75 6ZM4.75 18C4.75 18.6674 5.31057 19.4736 6.67856 20.1576C8.00168 20.8192 9.88205 21.25 12 21.25C14.118 21.25 15.9983 20.8192 17.3214 20.1576C18.6894 19.4736 19.25 18.6674 19.25 18V14.7072C18.8733 15.0077 18.4459 15.2724 17.9923 15.4992C16.42 16.2854 14.3003 16.75 12 16.75C9.69967 16.75 7.58004 16.2854 6.00774 15.4992C5.55414 15.2724 5.12675 15.0077 4.75 14.7072V18ZM19.25 8.70722V12C19.25 12.6674 18.6894 13.4736 17.3214 14.1576C15.9983 14.8192 14.118 15.25 12 15.25C9.88205 15.25 8.00168 14.8192 6.67856 14.1576C5.31057 13.4736 4.75 12.6674 4.75 12V8.70722C5.12675 9.00772 5.55414 9.27245 6.00774 9.49925C7.58004 10.2854 9.69967 10.75 12 10.75C14.3003 10.75 16.42 10.2854 17.9923 9.49925C18.4459 9.27245 18.8733 9.00772 19.25 8.70722Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nDatabase.displayName = \"Database\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const RemoteHost = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fillRule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M22 18.2105C22 17.8399 21.6876 17.5395 21.3023 17.5395H13.7252C13.5364 17.0909 13.164 16.7327 12.6977 16.5511V13.7368H18.5116C20.0529 13.7368 21.3023 12.5351 21.3023 11.0526C21.3023 9.57018 20.0529 8.36842 18.5116 8.36842C20.0529 8.36842 21.3023 7.16666 21.3023 5.68421C21.3023 4.20176 20.0529 3 18.5116 3H5.48837C3.94711 3 2.69767 4.20176 2.69767 5.68421C2.69767 7.16666 3.94711 8.36842 5.48837 8.36842C3.94711 8.36842 2.69767 9.57018 2.69767 11.0526C2.69767 12.5351 3.94711 13.7368 5.48837 13.7368H11.3023V16.5511C10.836 16.7327 10.4636 17.0909 10.2748 17.5395H2.69767C2.31236 17.5395 2 17.8399 2 18.2105C2 18.5811 2.31236 18.8816 2.69767 18.8816H10.2748C10.5508 19.5374 11.2192 20 12 20C12.7808 20 13.4492 19.5374 13.7252 18.8816H21.3023C21.6876 18.8816 22 18.5811 22 18.2105ZM12.2326 5.68421C12.2326 5.3136 12.5449 5.01316 12.9302 5.01316H18.5116C18.8969 5.01316 19.2093 5.3136 19.2093 5.68421C19.2093 6.05482 18.8969 6.35526 18.5116 6.35526H12.9302C12.5449 6.35526 12.2326 6.05482 12.2326 5.68421ZM12.2326 11.0526C12.2326 10.682 12.5449 10.3816 12.9302 10.3816H18.5116C18.8969 10.3816 19.2093 10.682 19.2093 11.0526C19.2093 11.4232 18.8969 11.7237 18.5116 11.7237H12.9302C12.5449 11.7237 12.2326 11.4232 12.2326 11.0526ZM6.4186 6.57895C6.93236 6.57895 7.34884 6.17836 7.34884 5.68421C7.34884 5.19006 6.93236 4.78947 6.4186 4.78947C5.90485 4.78947 5.48837 5.19006 5.48837 5.68421C5.48837 6.17836 5.90485 6.57895 6.4186 6.57895ZM6.4186 11.9474C6.93236 11.9474 7.34884 11.5468 7.34884 11.0526C7.34884 10.5585 6.93236 10.1579 6.4186 10.1579C5.90485 10.1579 5.48837 10.5585 5.48837 11.0526C5.48837 11.5468 5.90485 11.9474 6.4186 11.9474Z\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nRemoteHost.displayName = \"RemoteHost\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Login = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"800px\"\n height=\"800px\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"m 12.443359,8.2519531 a 0.75,0.75 0 0 0 -0.511718,0.2597657 0.75,0.75 0 0 0 0.08203,1.0566406 l 1.958984,1.6796876 H 2.0019531 a 0.75,0.75 0 0 0 -0.75,0.75 0.75,0.75 0 0 0 0.75,0.75 H 13.976563 l -1.962891,1.681641 a 0.75,0.75 0 0 0 -0.08203,1.05664 0.75,0.75 0 0 0 1.05664,0.08203 l 3.5,-3 a 0.75,0.75 0 0 0 0.02539,-0.03125 0.75,0.75 0 0 0 0.0293,-0.03711 0.75,0.75 0 0 0 0.02734,-0.01367 0.75,0.75 0 0 0 0.02734,-0.05664 0.75,0.75 0 0 0 0.111328,-0.230469 0.75,0.75 0 0 0 0.02734,-0.09766 0.75,0.75 0 0 0 0.0078,-0.08399 0.75,0.75 0 0 0 0.0078,-0.01953 0.75,0.75 0 0 0 -0.02344,-0.115234 0.75,0.75 0 0 0 -0.01953,-0.126954 0.75,0.75 0 0 0 -0.01172,-0.02148 0.75,0.75 0 0 0 -0.06445,-0.111328 0.75,0.75 0 0 0 -0.0625,-0.111328 0.75,0.75 0 0 0 -0.01563,-0.0078 0.75,0.75 0 0 0 -0.05273,-0.05469 0.75,0.75 0 0 0 -0.01367,-0.01953 l -3.5,-3.0000005 A 0.75,0.75 0 0 0 12.443359,8.2519531 Z\"\n />\n <path\n fill=\"currentColor\"\n d=\"m 15,1.25 c -1.4142,0 -2.488723,-0.00407 -3.390625,0.1171875 C 10.707473,1.4884456 9.9292663,1.7660661 9.3476563,2.3476563 8.8390637,2.8562488 8.558327,3.5218998 8.4199219,4.2753906 8.2815168,5.0288814 8.2580656,5.898247 8.2519531,6.9960937 A 0.75,0.75 0 0 0 8.9980469,7.75 0.75,0.75 0 0 0 9.7519531,7.0039062 C 9.7579506,5.926723 9.7895888,5.1181917 9.8945313,4.546875 9.9994737,3.9755583 10.150369,3.6679905 10.410156,3.4082031 10.707256,3.1111133 11.076619,2.9519275 11.808594,2.8535156 12.540569,2.7551037 13.5858,2.75 15,2.75 h 1 c 1.4142,0 2.45942,0.0051 3.191406,0.1035156 0.731987,0.098412 1.103365,0.2576345 1.400391,0.5546875 0.29709,0.2970832 0.456274,0.6684153 0.554687,1.4003906 C 21.244898,5.5405691 21.25,6.585785 21.25,8 v 8 c 0,1.4142 -0.0051,2.459435 -0.103516,3.191406 -0.09841,0.731972 -0.257591,1.103295 -0.554687,1.400391 -0.297028,0.297061 -0.668406,0.456273 -1.400391,0.554687 C 18.459422,21.244898 17.4142,21.25 16,21.25 h -1 c -1.4142,0 -2.459433,-0.0051 -3.191406,-0.103516 -0.731973,-0.09841 -1.101336,-0.257589 -1.398438,-0.554687 C 10.150363,20.331996 9.9994736,20.024438 9.8945313,19.453125 9.7895889,18.881812 9.7579506,18.073262 9.7519531,16.996094 A 0.75,0.75 0 0 0 8.9980469,16.25 0.75,0.75 0 0 0 8.2519531,17.003906 c 0.00611,1.097832 0.029564,1.965263 0.1679688,2.71875 0.1384051,0.753487 0.4191481,1.421088 0.9277344,1.929688 0.5816084,0.581602 1.3598147,0.859207 2.2617187,0.980468 C 12.511279,22.754074 13.5858,22.75 15,22.75 h 1 c 1.4142,0 2.490663,0.0041 3.392578,-0.117188 0.901915,-0.12126 1.678193,-0.39883 2.259766,-0.980468 0.581604,-0.581604 0.859207,-1.357863 0.980468,-2.259766 C 22.754074,18.490675 22.75,17.4142 22.75,16 V 8 c 0,-1.414215 0.0041,-2.490671 -0.117188,-3.3925781 C 22.511551,3.7055148 22.233954,2.9292531 21.652344,2.3476563 21.07077,1.7660293 20.294492,1.4884454 19.392578,1.3671875 18.490665,1.2459296 17.4142,1.25 16,1.25 Z\"\n />\n </svg>\n ),\n);\n\nLogin.displayName = \"Login\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Logout = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"800px\"\n height=\"800px\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"m 15,1.25 c -1.4142,0 -2.488723,-0.00407 -3.390625,0.1171875 C 10.707473,1.4884456 9.9292663,1.7660661 9.3476563,2.3476563 8.8390637,2.8562488 8.558327,3.5218998 8.4199219,4.2753906 8.2815168,5.0288814 8.2580656,5.898247 8.2519531,6.9960937 A 0.75,0.75 0 0 0 8.9980469,7.75 0.75,0.75 0 0 0 9.7519531,7.0039062 C 9.7579506,5.926723 9.7895888,5.1181917 9.8945313,4.546875 9.9994737,3.9755583 10.150369,3.6679905 10.410156,3.4082031 10.707256,3.1111133 11.076619,2.9519275 11.808594,2.8535156 12.540569,2.7551037 13.5858,2.75 15,2.75 h 1 c 1.4142,0 2.45942,0.0051 3.191406,0.1035156 0.731987,0.098412 1.103365,0.2576345 1.400391,0.5546875 0.29709,0.2970832 0.456274,0.6684153 0.554687,1.4003906 C 21.244898,5.5405691 21.25,6.585785 21.25,8 v 8 c 0,1.4142 -0.0051,2.459435 -0.103516,3.191406 -0.09841,0.731972 -0.257591,1.103295 -0.554687,1.400391 -0.297028,0.297061 -0.668406,0.456273 -1.400391,0.554687 C 18.459422,21.244898 17.4142,21.25 16,21.25 h -1 c -1.4142,0 -2.459433,-0.0051 -3.191406,-0.103516 -0.731973,-0.09841 -1.101336,-0.257589 -1.398438,-0.554687 C 10.150363,20.331996 9.9994736,20.024438 9.8945313,19.453125 9.7895889,18.881812 9.7579506,18.073262 9.7519531,16.996094 A 0.75,0.75 0 0 0 8.9980469,16.25 0.75,0.75 0 0 0 8.2519531,17.003906 c 0.00611,1.097832 0.029564,1.965263 0.1679688,2.71875 0.1384051,0.753487 0.4191481,1.421088 0.9277344,1.929688 0.5816084,0.581602 1.3598147,0.859207 2.2617187,0.980468 C 12.511279,22.754074 13.5858,22.75 15,22.75 h 1 c 1.4142,0 2.490663,0.0041 3.392578,-0.117188 0.901915,-0.12126 1.678193,-0.39883 2.259766,-0.980468 0.581604,-0.581604 0.859207,-1.357863 0.980468,-2.259766 C 22.754074,18.490675 22.75,17.4142 22.75,16 V 8 c 0,-1.414215 0.0041,-2.490671 -0.117188,-3.3925781 C 22.511551,3.7055148 22.233954,2.9292531 21.652344,2.3476563 21.07077,1.7660293 20.294492,1.4884454 19.392578,1.3671875 18.490665,1.2459296 17.4142,1.25 16,1.25 Z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M 5.5566406,8.2519531 A 0.75,0.75 0 0 0 5.0117187,8.4296875 l -3.5,3.0000005 a 0.75,0.75 0 0 0 -0.013672,0.02734 0.75,0.75 0 0 0 -0.041016,0.04102 0.75,0.75 0 0 0 -0.027344,0.01367 0.75,0.75 0 0 0 -0.074219,0.226562 0.75,0.75 0 0 0 -0.09375,0.234375 A 0.75,0.75 0 0 0 1.25,12 a 0.75,0.75 0 0 0 0.011719,0.02734 0.75,0.75 0 0 0 0.09375,0.234375 0.75,0.75 0 0 0 0.074219,0.226562 0.75,0.75 0 0 0 0.027344,0.01367 0.75,0.75 0 0 0 0.041016,0.04102 0.75,0.75 0 0 0 0.013672,0.02734 l 3.5,3 a 0.75,0.75 0 0 0 1.0585938,-0.08203 0.75,0.75 0 0 0 -0.082031,-1.058593 L 4.0292969,12.75 H 15 A 0.75,0.75 0 0 0 15.75,12 0.75,0.75 0 0 0 15,11.25 H 4.0292969 L 5.9882812,9.5703125 A 0.75,0.75 0 0 0 6.0703125,8.5117188 0.75,0.75 0 0 0 5.5566406,8.2519531 Z\"\n />\n </svg>\n ),\n);\n\nLogout.displayName = \"Logout\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Snapshot = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M13,5 C14.1045695,5 15,5.8954305 15,7 L15,12 C15,13.1045695 14.1045695,14 13,14 L6,14 C4.8954305,14 4,13.1045695 4,12 L4,7 C4,5.8954305 4.8954305,5 6,5 L13,5 Z M13,6 L6,6 C5.44771525,6 5,6.44771525 5,7 L5,12 C5,12.5522847 5.44771525,13 6,13 L13,13 C13.5522847,13 14,12.5522847 14,12 L14,7 C14,6.44771525 13.5522847,6 13,6 Z M10,2 C11.1045695,2 12,2.8954305 12,4 L11,4 C11,3.48716416 10.6139598,3.06449284 10.1166211,3.00672773 L10,3 L3,3 C2.44771525,3 2,3.44771525 2,4 L2,9 C2,9.55228475 2.44771525,10 3,10 L3,11 C1.8954305,11 1,10.1045695 1,9 L1,4 C1,2.8954305 1.8954305,2 3,2 L10,2 Z\"\n id=\"Combined-Shape\"\n fill=\"currentColor\"\n ></path>\n </svg>\n ),\n);\n\nSnapshot.displayName = \"Snapshot\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Revert = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n version=\"1.1\"\n id=\"svg2\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M 8.5761719 4.5761719 L 4.1523438 9 L 8.5761719 13.423828 L 9.4238281 12.576172 L 6.4472656 9.5996094 L 14.5 9.5996094 C 16.661041 9.5996094 18.400391 11.338959 18.400391 13.5 C 18.400391 15.661041 16.661041 17.400391 14.5 17.400391 L 5 17.400391 L 5 18.599609 L 14.5 18.599609 C 17.309559 18.599609 19.599609 16.309559 19.599609 13.5 C 19.599609 10.690441 17.309559 8.4003906 14.5 8.4003906 L 6.4472656 8.4003906 L 9.4238281 5.4238281 L 8.5761719 4.5761719 z \"\n />\n </svg>\n ),\n);\n\nRevert.displayName = \"Revert\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const CleanBrush = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M11.5,1.53589838 C12.2174389,1.95011195 12.4632517,2.86749756 12.0490381,3.58493649 L10.2990381,6.6160254 L12.8971143,8.1160254 L11.3971143,10.7141016 L11.0838897,10.5355535 C11.1781923,11.5900484 11.4477907,12.4981215 11.8896336,13.2634139 L12.3226476,14.0134143 L3.0540923,14.0134143 L2.9380998,13.6759335 C2.10148654,11.2418023 2.42825412,8.7993538 3.90177275,6.38744616 L3.60288568,6.21410162 L5.10288568,3.6160254 L7.70096189,5.1160254 L9.45096189,2.08493649 C9.86517546,1.36749756 10.7825611,1.12168482 11.5,1.53589838 Z M4.76910324,6.88768603 L4.84656206,6.76169205 C3.56240522,8.79245371 3.1907041,10.7956476 3.7177794,12.8032376 L3.77720324,13.012462 L5.23281189,13.0140072 C5.03908437,12.5922102 4.95204684,12.0567372 4.96727143,11.421927 L5.96698396,11.445903 C5.94512853,12.3571957 6.15298858,12.8402948 6.55399878,13.0136098 L10.6542032,13.012462 L10.6235758,12.9411802 C10.2761203,12.0808769 10.0861676,11.1066418 10.0516516,10.0209402 L10.0501032,9.93568603 L4.76910324,6.88768603 Z M10.3169873,2.58493649 L8.0669873,6.48205081 L5.46810324,4.98168603 L4.96710324,5.84968603 L5.26710324,6.02368603 L10.5499819,9.06959056 L11.0311032,9.34668603 L11.5301032,8.48168603 L8.9330127,6.98205081 L11.1830127,3.08493649 C11.3210839,2.84579018 11.2391463,2.53999498 11,2.40192379 C10.7608537,2.2638526 10.4550585,2.34579018 10.3169873,2.58493649 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nCleanBrush.displayName = \"CleanBrush\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Pull = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M4,10 L4,10.999 L3,11 C2.44771525,11 2,11.4477153 2,12 L2,13 C2,13.5522847 2.44771525,14 3,14 L12,14 C12.5522847,14 13,13.5522847 13,13 L13,12 C13,11.4477153 12.5522847,11 12,11 L11,11 L11,10 L12,10 C13.1045695,10 14,10.8954305 14,12 L14,13 C14,14.1045695 13.1045695,15 12,15 L3,15 C1.8954305,15 1,14.1045695 1,13 L1,12 C1,10.8954305 1.8954305,10 3,10 L4,10 Z M8,1.93553715 L7.99920454,9.11 L9.64495201,7.46446609 L10.3520588,8.17157288 L7.52363166,11 L4.69520454,8.17157288 L5.40231132,7.46446609 L6.99920454,9.062 L7,1.93553715 L8,1.93553715 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nPull.displayName = \"Pull\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Push = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M4,10 L4,10.999 L3,11 C2.44771525,11 2,11.4477153 2,12 L2,13 C2,13.5522847 2.44771525,14 3,14 L12,14 C12.5522847,14 13,13.5522847 13,13 L13,12 C13,11.4477153 12.5522847,11 12,11 L11,11 L11,10 L12,10 C13.1045695,10 14,10.8954305 14,12 L14,13 C14,14.1045695 13.1045695,15 12,15 L3,15 C1.8954305,15 1,14.1045695 1,13 L1,12 C1,10.8954305 1.8954305,10 3,10 L4,10 Z M7.52363166,1.93553715 L10.3520588,4.76396427 L9.64495201,5.47107105 L8,3.82653715 L8,11 L7,11 L7,3.87253715 L5.40231132,5.47107105 L4.69520454,4.76396427 L7.52363166,1.93553715 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nPush.displayName = \"Push\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const CatalogVersion = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M13.9988247,5.96187171 L13.9988247,11.918465 L4.99882467,14.086909 L4.998,11.7778717 L5.998,11.6668717 L5.99882467,12.816626 L12.9988247,11.129626 L12.9988247,7.08862601 L12.7385366,7.12251872 C12.4857601,7.15518994 12.2393797,7.18838655 11.9994167,7.22209366 L11.9982788,6.21226472 C12.304139,6.17008654 12.6196593,6.12875664 12.944877,6.08824889 L13.9988247,5.96187171 Z M10.9988247,1.96187171 L10.9988247,8.91846498 L1.99882467,11.086909 L1.99882467,4.21148719 L2.19833363,4.06147226 C3.2602385,3.26300394 5.69995691,2.63635153 9.5852642,2.13388792 L10.9988247,1.96187171 Z M9.99882467,8.12962601 L9.99882467,3.08862601 L9.73853659,3.12251872 C6.41390091,3.552226 4.19571179,4.07282047 3.13221035,4.65040211 L2.99882467,4.72662601 L2.99882467,9.81662601 L9.99882467,8.12962601 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n));\n\nCatalogVersion.displayName = \"CatalogVersion\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const File = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M5,2 C3.8954305,2 3,2.8954305 3,4 L3,12 C3,13.1045695 3.8954305,14 5,14 L11,14 C12.1045695,14 13,13.1045695 13,12 L13,5.73681369 C13,5.26122834 12.8305251,4.80120737 12.5219837,4.43929079 L10.4424373,2 L5,2 Z M5,3 L9.982,3 L11.7609918,5.08805224 C11.9152626,5.26901053 12,5.49902102 12,5.73681369 L12,12 C12,12.5522847 11.5522847,13 11,13 L5,13 C4.44771525,13 4,12.5522847 4,12 L4,4 C4,3.44771525 4.44771525,3 5,3 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nFile.displayName = \"File\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Revoke = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M8,2 C11.3137085,2 14,4.6862915 14,8 C14,9.47139954 13.4703539,10.8190936 12.5913132,11.8628307 L12.6345189,11.9066914 L11.9302132,12.6165882 L11.8858196,12.5718535 C10.8389186,13.4625313 9.48222558,14 8,14 C4.6862915,14 2,11.3137085 2,8 C2,6.53471952 2.52525,5.19211776 3.39773801,4.15020669 L3.36000654,4.11387771 L4.06431234,3.40398099 L4.10123046,3.43919545 C5.14988186,2.54191547 6.51165536,2 8,2 Z M3,8 C3,10.7614237 5.23857625,13 8,13 C9.20436215,13 10.3092701,12.574186 11.1723859,11.8648958 L4.11068395,4.85756444 C3.41605172,5.71622139 3,6.80952365 3,8 Z M8,3 C6.78915781,3 5.67884291,3.43040853 4.81370321,4.14657771 L11.8779482,11.1564363 C12.5794066,10.2956779 13,9.19695639 13,8 C13,5.23857625 10.7614237,3 8,3 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nRevoke.displayName = \"Revoke\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Taint = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M13.9106454,7.91865116 C13.4206479,7.63313742 12.8300029,7.83741895 12.2319998,7.96540944 C11.1178003,8.20553745 9.67721708,7.71318009 10.568586,6.43272613 C11.068988,5.71380616 12.538793,5.02759868 12.9228939,4.19297255 C13.3361931,3.29484301 13.2725473,2.18559207 11.8828151,1.39443009 C10.9504607,0.863709904 9.60272152,1.21220091 8.84272159,2.18847443 C8.08262793,3.16470219 8.31408203,4.61837224 8.02594194,5.83042735 C7.58777967,7.68001008 6.18171419,6.44517061 6.16083481,5.10061846 C6.13540931,3.3477549 6.62050916,0.863435394 3.58971886,1.00586056 C3.35489032,1.01711549 3.13594979,1.04520706 2.93348311,1.08819082 C0.249370127,1.66363333 0.532800047,4.89942518 2.72077592,6.00581664 C4.30793661,6.80782178 6.30387377,7.12428657 6.39927214,8.00946837 C6.37670554,8.93918948 3.37905041,6.701998 2.18433295,8.81794737 C1.26451557,10.4481276 2.42389509,13.1347385 4.23163666,11.8743009 C4.56732361,11.6402807 4.92904533,11.279208 5.32059808,10.781818 C6.80961867,9.0801506 7.78977768,10.0873065 6.18323737,11.4378064 C4.92253078,12.497554 5.79470756,14.056453 6.68211621,14.5174476 C7.80885267,15.103779 8.94941497,15.2895082 10.1662538,14.3022771 C11.110489,13.5361871 10.9360958,12.4714526 10.4441534,11.9458566 C9.05435083,10.4608924 8.79770556,8.811565 10.4208603,9.46272665 C11.4996281,9.89565249 12.3738905,11.5382086 13.7026718,11.5088131 C15.2777642,11.0734167 15.5030318,8.74570537 13.9106454,7.91865116 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nTaint.displayName = \"Taint\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Unlock = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n d=\"M8,0.5 C9.93299662,0.5 11.5,2.06700338 11.5,4 L10.5,4 C10.5,2.61928813 9.38071187,1.5 8,1.5 L7,1.5 C5.61928813,1.5 4.5,2.61928813 4.5,4 L4.5,6 L11,6 C12.1045695,6 13,6.8954305 13,8 L13,12 C13,13.1045695 12.1045695,14 11,14 L4,14 C2.8954305,14 2,13.1045695 2,12 L2,8 C2,7.06808721 2.63737692,6.28504178 3.49998077,6.06301369 L3.5,4 C3.5,2.06700338 5.06700338,0.5 7,0.5 L8,0.5 Z M11,7 L4,7 C3.44771525,7 3,7.44771525 3,8 L3,12 C3,12.5522847 3.44771525,13 4,13 L11,13 C11.5522847,13 12,12.5522847 12,12 L12,8 C12,7.44771525 11.5522847,7 11,7 Z\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n ></path>\n </svg>\n ),\n);\n\nUnlock.displayName = \"Unlock\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Check = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"-2.88 -2.88 29.76 29.76\"\n fill=\"none\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n fill=\"currentColor\"\n d=\"M 19.556641,5.34375 A 1,1 0 0 0 18.849609,5.6367187 L 8.9492188,15.535156 4.7070312,11.292969 a 1,1 0 0 0 -1.4140624,0 1,1 0 0 0 0,1.414062 l 4.9492187,4.949219 a 1.0001,1.0001 0 0 0 1.4140625,0 L 20.263672,7.0507812 a 1,1 0 0 0 0,-1.4140625 A 1,1 0 0 0 19.556641,5.34375 Z\"\n />\n </svg>\n ),\n);\n\nCheck.displayName = \"Check\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ArrowChevronLeft = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n transform=\"rotate(90 12 12)\"\n d=\"M12.146 16.157c-.27 0-.516-.11-.739-.328L6.26 10.565a1.013 1.013 0 0 1-.198-.293.95.95 0 0 1-.062-.35.925.925 0 0 1 .451-.8.91.91 0 0 1 .465-.122.93.93 0 0 1 .67.28l4.874 5.004h-.622l4.86-5.004a.93.93 0 0 1 1.128-.157.909.909 0 0 1 .458.8c0 .25-.089.462-.266.636l-5.134 5.27c-.11.11-.226.191-.349.246a1.08 1.08 0 0 1-.39.082z\"\n fill=\"currentColor\"\n />\n </svg>\n));\n\nArrowChevronLeft.displayName = \"ArrowChevronLeft\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const ArrowChevronRight = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <path\n transform=\"rotate(-90 12 12)\"\n d=\"M12.146 16.157c-.27 0-.516-.11-.739-.328L6.26 10.565a1.013 1.013 0 0 1-.198-.293.95.95 0 0 1-.062-.35.925.925 0 0 1 .451-.8.91.91 0 0 1 .465-.122.93.93 0 0 1 .67.28l4.874 5.004h-.622l4.86-5.004a.93.93 0 0 1 1.128-.157.909.909 0 0 1 .458.8c0 .25-.089.462-.266.636l-5.134 5.27c-.11.11-.226.191-.349.246a1.08 1.08 0 0 1-.39.082z\"\n fill=\"currentColor\"\n />\n </svg>\n));\n\nArrowChevronRight.displayName = \"ArrowChevronRight\";\n","import { forwardRef, type SVGProps } from \"react\";\n\nexport const Drag = forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n ref={ref}\n >\n <circle cx=\"6\" cy=\"5\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"10\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"15\" r=\"1.1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.1\" />\n <circle cx=\"12\" cy=\"10\" r=\"1.1\" />\n <circle cx=\"12\" cy=\"15\" r=\"1.1\" />\n </svg>\n ),\n);\n\nDrag.displayName = \"Drag\";\n","import React from \"react\";\nimport { Add } from \"./components/Add\";\nimport { ArrowDown } from \"./components/ArrowDown\";\nimport { ArrowLeft } from \"./components/ArrowLeft\";\nimport { ArrowRight } from \"./components/ArrowRight\";\nimport { ArrowUp } from \"./components/ArrowUp\";\nimport { Attached } from \"./components/Attached\";\nimport { Attachment } from \"./components/Attachment\";\nimport { Back } from \"./components/Back\";\nimport { Blueprint } from \"./components/Blueprint\";\nimport { Bug } from \"./components/Bug\";\nimport { Chat } from \"./components/Chat\";\nimport { CheckCircle } from \"./components/CheckCircle\";\nimport { ChevronLeft } from \"./components/ChevronLeft\";\nimport { ChevronRight } from \"./components/ChevronRight\";\nimport { Clean } from \"./components/Clean\";\nimport { Close } from \"./components/Close\";\nimport { Close1 } from \"./components/Close1\";\nimport { CloudOff } from \"./components/CloudOff\";\nimport { Cog } from \"./components/Cog\";\nimport { Complete } from \"./components/Complete\";\nimport { Container } from \"./components/Container\";\nimport { CopyClipboard } from \"./components/CopyClipboard\";\nimport { Dashboard } from \"./components/Dashboard\";\nimport { Details } from \"./components/Details\";\nimport { DockerCopy } from \"./components/DockerCopy\";\nimport { Docker } from \"./components/Docker\";\nimport { Dots } from \"./components/Dots\";\nimport { Download } from \"./components/Download\";\nimport { Edit } from \"./components/Edit\";\nimport { Equal } from \"./components/Equal\";\nimport { Error } from \"./components/Error\";\nimport { Export } from \"./components/Export\";\nimport { EyeClosed } from \"./components/EyeClosed\";\nimport { EyeOpen } from \"./components/EyeOpen\";\nimport { Globe } from \"./components/Globe\";\nimport { Help } from \"./components/Help\";\nimport { Idea } from \"./components/Idea\";\nimport { Image } from \"./components/Image\";\nimport { Info } from \"./components/Info\";\nimport { Key } from \"./components/Key\";\nimport { LXCOld } from \"./components/LXCOld\";\nimport { LXC } from \"./components/LXC\";\nimport { Log } from \"./components/Log\";\nimport { Moon } from \"./components/Moon\";\nimport { Notification } from \"./components/Notification\";\nimport { Official } from \"./components/Official\";\nimport { Offline } from \"./components/Offline\";\nimport { OpenApp } from \"./components/OpenApp\";\nimport { Parameter } from \"./components/Parameter\";\nimport { Pause } from \"./components/Pause\";\nimport { Praise } from \"./components/Praise\";\nimport { ReportFeedback } from \"./components/ReportFeedback\";\nimport { Reset } from \"./components/Reset\";\nimport { Restart } from \"./components/Restart\";\nimport { Rocket } from \"./components/Rocket\";\nimport { Run } from \"./components/Run\";\nimport { Save } from \"./components/Save\";\nimport { Scale } from \"./components/Scale\";\nimport { Script } from \"./components/Script\";\nimport { Search } from \"./components/Search\";\nimport { Send } from \"./components/Send\";\nimport { Settings } from \"./components/Settings\";\nimport { Shop } from \"./components/Shop\";\nimport { Star } from \"./components/Star\";\nimport { Stop } from \"./components/Stop\";\nimport { Sun } from \"./components/Sun\";\nimport { Suspend } from \"./components/Suspend\";\nimport { ThemeAuto } from \"./components/ThemeAuto\";\nimport { ThemeDark } from \"./components/ThemeDark\";\nimport { ThemeLight } from \"./components/ThemeLight\";\nimport { Trash } from \"./components/Trash\";\nimport { UX } from \"./components/UX\";\nimport { User } from \"./components/User\";\nimport { Users } from \"./components/Users\";\nimport { Verified } from \"./components/Verified\";\nimport { ViewGrid } from \"./components/ViewGrid\";\nimport { ViewRows } from \"./components/ViewRows\";\nimport { Library } from \"./components/Library\";\nimport { Host } from \"./components/Host\";\nimport { VirtualMachine } from \"./components/VirtualMachine\";\nimport { Role } from \"./components/Role\";\nimport { Roles } from \"./components/Roles\";\nimport { Cache } from \"./components/Cache\";\nimport { Claim } from \"./components/Claim\";\nimport { Claims } from \"./components/Claims\";\nimport { KeyManagement } from \"./components/KeyManagement\";\nimport { Windows } from \"./components/Windows\";\nimport { Ubuntu } from \"./components/Ubuntu\";\nimport { Debian } from \"./components/Debian\";\nimport { Apple } from \"./components/Apple\";\nimport { KaliLinux } from \"./components/KaliLinux\";\nimport { RedHat } from \"./components/RedHat\";\nimport { Fedora } from \"./components/Fedora\";\nimport { CentOS } from \"./components/CentOS\";\nimport { Clone } from \"./components/Clone\";\nimport { Copy } from \"./components/Copy\";\nimport { Live } from \"./components/Live\";\nimport { HealthCheck } from \"./components/HealthCheck\";\nimport { ReverseProxy } from \"./components/ReverseProxy\";\nimport { ReverseProxyRoutes } from \"./components/ReverseProxyRoutes\";\nimport { ReverseProxyCORS } from \"./components/ReverseProxyCORS\";\nimport { ReverseProxyFrom } from \"./components/ReverseProxyFrom\";\nimport { ReverseProxyHeadersRequest } from \"./components/ReverseProxyHeadersRequest\";\nimport { ReverseProxyHeadersResponse } from \"./components/ReverseProxyHeadersResponse\";\nimport { ReverseProxyHTTP } from \"./components/ReverseProxyHTTP\";\nimport { ReverseProxyTLS } from \"./components/ReverseProxyTLS\";\nimport { ReverseProxyTo } from \"./components/ReverseProxyTo\";\nimport { ReverseProxyTCP } from \"./components/ReverseProxyTCP\";\nimport { Refresh } from \"./components/Refresh\";\nimport { Calendar } from \"./components/Calendar\";\nimport { Folder } from \"./components/Folder\";\nimport { Jobs } from \"./components/Jobs\";\nimport { Warning } from \"./components/Warning\";\nimport { Artifactory } from \"./components/Artifactory\";\nimport { Azure } from \"./components/Azure\";\nimport { Minio } from \"./components/Minio\";\nimport { Aws } from \"./components/Aws\";\nimport { Orchestrator } from \"./components/Orchestrator\";\nimport { Podman } from \"./components/Podman\";\nimport { PodmanDesktop } from \"./components/PodmanDesktop\";\nimport { Group } from \"./components/Group\";\nimport { Pin } from \"./components/Pin\";\nimport { Database } from \"./components/Database\";\nimport { RemoteHost } from \"./components/RemoteHost\";\nimport { Login } from \"./components/Login\";\nimport { Logout } from \"./components/Logout\";\nimport { Snapshot } from \"./components/Snapshot\";\nimport { Revert } from \"./components/Revert\";\nimport { CleanBrush } from \"./components/CleanBrush\";\nimport { Pull } from \"./components/Pull\";\nimport { Push } from \"./components/Push\";\nimport { CatalogVersion } from \"./components/CatalogVersion\";\nimport { File } from \"./components/File\";\nimport { Revoke } from \"./components/Revoke\";\nimport { Taint } from \"./components/Taint\";\nimport { Unlock } from \"./components/Unlock\";\nimport { Check } from \"./components/Check\";\nimport { ArrowChevronLeft } from \"./components/ArrowChevronLeft\";\nimport { ArrowChevronRight } from \"./components/ArrowChevronRight\";\nimport { Drag } from \"./components/Drag\";\n\nexport type IconName =\n | \"Add\"\n | \"ArrowDown\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"ArrowUp\"\n | \"Attached\"\n | \"Attachment\"\n | \"Back\"\n | \"Blueprint\"\n | \"Bug\"\n | \"Chat\"\n | \"CheckCircle\"\n | \"ChevronLeft\"\n | \"ChevronRight\"\n | \"Clean\"\n | \"Close\"\n | \"Close1\"\n | \"CloudOff\"\n | \"Cog\"\n | \"Complete\"\n | \"Container\"\n | \"CopyClipboard\"\n | \"Dashboard\"\n | \"Details\"\n | \"Docker copy\"\n | \"Docker\"\n | \"Dots\"\n | \"Download\"\n | \"Edit\"\n | \"Equal\"\n | \"Error\"\n | \"Export\"\n | \"EyeClosed\"\n | \"EyeOpen\"\n | \"Globe\"\n | \"Help\"\n | \"Idea\"\n | \"Image\"\n | \"Info\"\n | \"Key\"\n | \"LXC-Old\"\n | \"LXC\"\n | \"Log\"\n | \"Moon\"\n | \"Notification\"\n | \"Official\"\n | \"Offline\"\n | \"OpenApp\"\n | \"Parameter\"\n | \"Pause\"\n | \"Praise\"\n | \"ReportFeedback\"\n | \"Reset\"\n | \"Restart\"\n | \"Rocket\"\n | \"Run\"\n | \"Save\"\n | \"Scale\"\n | \"Script\"\n | \"Search\"\n | \"Send\"\n | \"Settings\"\n | \"Shop\"\n | \"Star\"\n | \"Stop\"\n | \"Sun\"\n | \"Suspend\"\n | \"ThemeAuto\"\n | \"ThemeDark\"\n | \"ThemeLight\"\n | \"Trash\"\n | \"UX\"\n | \"User\"\n | \"Users\"\n | \"Verified\"\n | \"ViewGrid\"\n | \"ViewRows\"\n | \"Library\"\n | \"Host\"\n | \"VirtualMachine\"\n | \"Role\"\n | \"Roles\"\n | \"Cache\"\n | \"Claim\"\n | \"Claims\"\n | \"KeyManagement\"\n | \"Windows\"\n | \"Ubuntu\"\n | \"Debian\"\n | \"Apple\"\n | \"KaliLinux\"\n | \"RedHat\"\n | \"Fedora\"\n | \"CentOS\"\n | \"Clone\"\n | \"Copy\"\n | \"Live\"\n | \"HealthCheck\"\n | \"ReverseProxy\"\n | \"ReverseProxyCORS\"\n | \"ReverseProxyRoutes\"\n | \"ReverseProxyFrom\"\n | \"ReverseProxyHeadersRequest\"\n | \"ReverseProxyHeadersResponse\"\n | \"ReverseProxyHTTP\"\n | \"ReverseProxyTo\"\n | \"ReverseProxyTLS\"\n | \"ReverseProxyTCP\"\n | \"Refresh\"\n | \"Calendar\"\n | \"Folder\"\n | \"Jobs\"\n | \"Warning\"\n | \"Artifactory\"\n | \"Azure\"\n | \"Minio\"\n | \"Aws\"\n | \"Orchestrator\"\n | \"Podman\"\n | \"PodmanDesktop\"\n | \"Group\"\n | \"Pin\"\n | \"Database\"\n | \"RemoteHost\"\n | \"Login\"\n | \"Logout\"\n | \"Snapshot\"\n | \"Revert\"\n | \"CleanBrush\"\n | \"Pull\"\n | \"Push\"\n | \"CatalogVersion\"\n | \"File\"\n | \"Revoke\"\n | \"Taint\"\n | \"Unlock\"\n | \"Check\"\n | \"ArrowChevronLeft\"\n | \"ArrowChevronRight\"\n | \"Drag\";\n\nexport const iconRegistry: Record<\n IconName,\n React.ForwardRefExoticComponent<React.SVGProps<SVGSVGElement>>\n> = {\n Add: Add,\n ArrowDown: ArrowDown,\n ArrowLeft: ArrowLeft,\n ArrowRight: ArrowRight,\n ArrowUp: ArrowUp,\n Attached: Attached,\n Attachment: Attachment,\n Back: Back,\n Blueprint: Blueprint,\n Bug: Bug,\n Chat: Chat,\n CheckCircle: CheckCircle,\n ChevronLeft: ChevronLeft,\n ChevronRight: ChevronRight,\n Clean: Clean,\n Close: Close,\n Close1: Close1,\n CloudOff: CloudOff,\n Cog: Cog,\n Complete: Complete,\n Container: Container,\n CopyClipboard: CopyClipboard,\n Dashboard: Dashboard,\n Details: Details,\n \"Docker copy\": DockerCopy,\n Docker: Docker,\n Dots: Dots,\n Download: Download,\n Edit: Edit,\n Equal: Equal,\n Error: Error,\n Export: Export,\n EyeClosed: EyeClosed,\n EyeOpen: EyeOpen,\n Globe: Globe,\n Help: Help,\n Idea: Idea,\n Image: Image,\n Info: Info,\n Key: Key,\n \"LXC-Old\": LXCOld,\n LXC: LXC,\n Log: Log,\n Moon: Moon,\n Notification: Notification,\n Official: Official,\n Offline: Offline,\n OpenApp: OpenApp,\n Parameter: Parameter,\n Pause: Pause,\n Praise: Praise,\n ReportFeedback: ReportFeedback,\n Reset: Reset,\n Restart: Restart,\n Rocket: Rocket,\n Run: Run,\n Save: Save,\n Scale: Scale,\n Script: Script,\n Search: Search,\n Send: Send,\n Settings: Settings,\n Shop: Shop,\n Star: Star,\n Stop: Stop,\n Sun: Sun,\n Suspend: Suspend,\n ThemeAuto: ThemeAuto,\n ThemeDark: ThemeDark,\n ThemeLight: ThemeLight,\n Trash: Trash,\n UX: UX,\n User: User,\n Users: Users,\n Verified: Verified,\n ViewGrid: ViewGrid,\n ViewRows: ViewRows,\n Library: Library,\n Host: Host,\n VirtualMachine: VirtualMachine,\n Role: Role,\n Roles: Roles,\n Cache: Cache,\n Claim: Claim,\n Claims: Claims,\n KeyManagement: KeyManagement,\n Windows: Windows,\n Ubuntu: Ubuntu,\n Debian: Debian,\n Apple: Apple,\n KaliLinux: KaliLinux,\n RedHat: RedHat,\n Fedora: Fedora,\n CentOS: CentOS,\n Clone: Clone,\n Copy: Copy,\n Live: Live,\n HealthCheck: HealthCheck,\n ReverseProxy: ReverseProxy,\n ReverseProxyCORS: ReverseProxyCORS,\n ReverseProxyRoutes: ReverseProxyRoutes,\n ReverseProxyFrom: ReverseProxyFrom,\n ReverseProxyHeadersRequest: ReverseProxyHeadersRequest,\n ReverseProxyHeadersResponse: ReverseProxyHeadersResponse,\n ReverseProxyHTTP: ReverseProxyHTTP,\n ReverseProxyTo: ReverseProxyTo,\n ReverseProxyTLS: ReverseProxyTLS,\n ReverseProxyTCP: ReverseProxyTCP,\n Refresh: Refresh,\n Calendar: Calendar,\n Folder: Folder,\n Jobs: Jobs,\n Warning: Warning,\n Artifactory: Artifactory,\n Azure: Azure,\n Minio: Minio,\n Aws: Aws,\n Orchestrator: Orchestrator,\n Podman: Podman,\n PodmanDesktop: PodmanDesktop,\n Group: Group,\n Pin: Pin,\n Database: Database,\n RemoteHost: RemoteHost,\n Login: Login,\n Logout: Logout,\n Snapshot: Snapshot,\n Revert: Revert,\n CleanBrush: CleanBrush,\n Pull: Pull,\n Push: Push,\n CatalogVersion: CatalogVersion,\n File: File,\n Revoke: Revoke,\n Taint: Taint,\n Unlock: Unlock,\n Check: Check,\n ArrowChevronLeft: ArrowChevronLeft,\n ArrowChevronRight: ArrowChevronRight,\n Drag: Drag,\n};\n","export const widthTokenRegex = /^(?:min-|max-)?w-/;\nexport const heightTokenRegex = /^(?:min-|max-)?h-/;\n\nexport const mergeClassTokens = (...groups: Array<string | undefined>) => {\n const tokens: string[] = [];\n\n const addToken = (token: string) => {\n if (widthTokenRegex.test(token)) {\n for (let i = tokens.length - 1; i >= 0; i -= 1) {\n if (widthTokenRegex.test(tokens[i])) {\n tokens.splice(i, 1);\n }\n }\n }\n\n if (heightTokenRegex.test(token)) {\n for (let i = tokens.length - 1; i >= 0; i -= 1) {\n if (heightTokenRegex.test(tokens[i])) {\n tokens.splice(i, 1);\n }\n }\n }\n\n if (!tokens.includes(token)) {\n tokens.push(token);\n }\n };\n\n groups\n .filter(Boolean)\n .forEach((group) => group!.split(/\\s+/).filter(Boolean).forEach(addToken));\n\n return tokens.join(\" \");\n};\n\nexport const hasExplicitSize = (value?: string) =>\n Boolean(value) && /\\b(?:min-|max-)?(?:w|h)-/.test(value as string);\n","import React from \"react\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\n\nexport interface DynamicImgProps {\n base64: string;\n fill?: string;\n stroke?: string;\n className?: string;\n title?: string;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n style?: React.CSSProperties;\n}\n\nconst sizeClasses = {\n xs: \"h-3 w-3\",\n sm: \"h-4 w-4\",\n md: \"h-6 w-6\",\n lg: \"h-8 w-8\",\n xl: \"h-10 w-10\",\n};\n\nconst DynamicImg: React.FC<DynamicImgProps> = ({\n base64,\n fill,\n stroke,\n className,\n title,\n size = \"md\",\n style,\n}) => {\n const renderIcon = useIconRenderer();\n\n if (!base64) {\n return <>{renderIcon(\"Chat\", size)}</>;\n }\n\n if (base64.toLowerCase().includes(\"data:image/png;base64,\")) {\n return (\n <img\n src={base64}\n alt=\"Dynamic Image\"\n className={className}\n style={style}\n title={title}\n />\n );\n }\n\n if (!base64.toLowerCase().includes(\"data:image/svg+xml;base64,\")) {\n return <>{renderIcon(\"Chat\", size)}</>;\n }\n\n const svgDecoded = atob(base64.replace(/^data:image\\/svg\\+xml;base64,/, \"\"));\n\n const svgStyled = svgDecoded\n .replace(/fill=\".*?\"/g, `fill=\"${fill || \"currentColor\"}\"`)\n .replace(/stroke=\".*?\"/g, `stroke=\"${stroke || \"currentColor\"}\"`);\n\n return (\n <div\n className={`inline-flex select-none items-center justify-center p-[5px] text-current [&>svg]:h-full [&>svg]:w-full [&>svg_*]:fill-current [&>svg_*]:stroke-current ${sizeClasses[size]} ${className ?? \"\"}`}\n style={style}\n title={title}\n dangerouslySetInnerHTML={{ __html: svgStyled }}\n />\n );\n};\n\nDynamicImg.displayName = \"DynamicImg\";\n\nexport default DynamicImg;\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport Button, { type ButtonProps, type ButtonSize } from \"./Button\";\nimport DropdownMenu, { type DropdownMenuOption } from \"./DropdownMenu\";\n\nexport interface DropdownButtonOption extends DropdownMenuOption {\n value: string;\n}\n\nexport interface DropdownButtonProps\n extends Omit<\n ButtonProps,\n \"children\" | \"leadingIcon\" | \"trailingIcon\" | \"iconOnly\" | \"fullWidth\"\n > {\n label: React.ReactNode;\n options: DropdownButtonOption[];\n onPrimaryClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n onOptionSelect?: (option: DropdownButtonOption) => void;\n dropdownIcon?: ButtonProps[\"leadingIcon\"];\n fullWidth?: boolean;\n split?: boolean;\n /**\n * Hide the dropdown caret trigger when there are no menu options.\n * Defaults to true so empty split buttons render as a single clean button.\n */\n hideDropdownTriggerWhenEmpty?: boolean;\n menuWidth?: number | \"trigger\";\n menuClassName?: string;\n}\n\nexport const DropdownButton: React.FC<DropdownButtonProps> = ({\n label,\n options,\n onPrimaryClick,\n onOptionSelect,\n dropdownIcon = \"ArrowDown\",\n variant = \"solid\",\n color = \"blue\",\n size = \"md\",\n className,\n disabled,\n fullWidth = false,\n split = true,\n hideDropdownTriggerWhenEmpty = true,\n menuWidth = 220,\n menuClassName,\n ...buttonProps\n}) => {\n const [open, setOpen] = useState(false);\n const caretRef = useRef<HTMLButtonElement>(null);\n const anchorRef = useRef<HTMLDivElement>(null);\n const containerClasses = classNames(\n \"inline-flex items-stretch\",\n fullWidth && \"w-full\",\n className,\n );\n\n const handleSelect = (option: DropdownButtonOption) => {\n onOptionSelect?.(option);\n setOpen(false);\n };\n\n const { onClick: restOnClick, ...restButtonProps } = buttonProps;\n\n const handlePrimaryClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n restOnClick?.(event);\n onPrimaryClick?.(event);\n };\n\n const handleCaretToggle = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n event.stopPropagation();\n setOpen((prev) => !prev);\n };\n\n const menuOptions = useMemo(() => options ?? [], [options]);\n const hasOptions = menuOptions.length > 0;\n const showCaret = hasOptions || !hideDropdownTriggerWhenEmpty;\n\n useEffect(() => {\n if (!hasOptions && open) {\n setOpen(false);\n }\n }, [hasOptions, open]);\n\n const caretWidthMap: Record<ButtonSize, string> = {\n xs: \"min-w-[2rem]\",\n sm: \"min-w-[2.25rem]\",\n md: \"min-w-[2.5rem]\",\n lg: \"min-w-[2.75rem]\",\n xl: \"min-w-[3rem]\",\n };\n\n const caretIconClassMap: Record<ButtonSize, string> = {\n xs: \"[&>svg]:h-3 [&>svg]:w-3 [&>svg]:min-w-[0.75rem]\",\n sm: \"[&>svg]:h-3.5 [&>svg]:w-3.5 [&>svg]:min-w-[0.875rem]\",\n md: \"[&>svg]:h-4 [&>svg]:w-4 [&>svg]:min-w-4\",\n lg: \"[&>svg]:h-4.5 [&>svg]:w-4.5 [&>svg]:min-w-[1.125rem]\",\n xl: \"[&>svg]:h-5 [&>svg]:w-5 [&>svg]:min-w-[1.25rem]\",\n };\n\n const renderCaretButton = () => (\n <Button\n ref={caretRef as React.Ref<HTMLButtonElement>}\n type=\"button\"\n variant={variant}\n color={color}\n size={size}\n iconOnly\n aria-label=\"Toggle dropdown menu\"\n leadingIcon={dropdownIcon}\n data-dropdown-caret\n className={classNames(\n \"rounded-l-none border-l border-white/20 text-inherit dark:border-white/10\",\n split && caretWidthMap[size],\n caretIconClassMap[size],\n )}\n onClick={handleCaretToggle}\n disabled={disabled || options.length === 0}\n />\n );\n\n const mainButton = (\n <Button\n type=\"button\"\n variant={variant}\n color={color}\n size={size}\n className={classNames(\n split && showCaret && \"rounded-r-none\",\n fullWidth ? \"flex-1\" : \"\",\n )}\n disabled={disabled}\n onClick={handlePrimaryClick}\n {...restButtonProps}\n >\n {label}\n </Button>\n );\n\n return (\n <div ref={anchorRef} className={containerClasses}>\n {mainButton}\n {showCaret ? renderCaretButton() : null}\n <DropdownMenu\n anchorRef={anchorRef}\n open={open && hasOptions && showCaret}\n onClose={() => setOpen(false)}\n items={menuOptions}\n onSelect={handleSelect}\n width={menuWidth}\n align=\"end\"\n side=\"auto\"\n className={menuClassName}\n />\n </div>\n );\n};\n\nDropdownButton.displayName = \"DropdownButton\";\n\nexport default DropdownButton;\n","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\n\nexport interface DropdownMenuOption {\n label: ReactNode;\n value: string;\n description?: ReactNode;\n icon?: string | React.ReactElement;\n disabled?: boolean;\n danger?: boolean;\n}\n\nexport interface DropdownMenuProps {\n anchorRef: React.RefObject<HTMLElement | null>;\n open: boolean;\n onClose: () => void;\n items: DropdownMenuOption[];\n onSelect?: (item: DropdownMenuOption) => void;\n align?: \"start\" | \"end\";\n side?: \"auto\" | \"top\" | \"bottom\";\n width?: number | \"trigger\";\n maxHeight?: number;\n className?: string;\n itemClassName?: string;\n}\n\nconst PORTAL_ROOT = typeof document !== \"undefined\" ? document.body : null;\n\ntype RectBounds = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n width: number;\n height: number;\n};\n\nconst viewportBounds = (): RectBounds => ({\n top: 0,\n left: 0,\n right: window.innerWidth,\n bottom: window.innerHeight,\n width: window.innerWidth,\n height: window.innerHeight,\n});\n\nconst isClippingParent = (element: HTMLElement): boolean => {\n const style = window.getComputedStyle(element);\n const values = [style.overflow, style.overflowX, style.overflowY].join(\" \");\n return /(auto|scroll|hidden|clip)/.test(values);\n};\n\nconst resolveBoundaryBounds = (anchor: HTMLElement): RectBounds => {\n let node: HTMLElement | null = anchor.parentElement;\n\n while (node && node !== document.body) {\n if (isClippingParent(node)) {\n const rect = node.getBoundingClientRect();\n return {\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n width: rect.width,\n height: rect.height,\n };\n }\n node = node.parentElement;\n }\n\n return viewportBounds();\n};\n\nconst resolveAnchorLayerZIndex = (anchor: HTMLElement): number => {\n let node: HTMLElement | null = anchor;\n let highest: number | null = null;\n\n while (node && node !== document.body) {\n const zIndex = window.getComputedStyle(node).zIndex;\n if (zIndex && zIndex !== \"auto\") {\n const parsed = Number(zIndex);\n if (Number.isFinite(parsed)) {\n highest = highest === null ? parsed : Math.max(highest, parsed);\n }\n }\n node = node.parentElement;\n }\n\n const base = highest ?? 20;\n return Math.max(1, base + 1);\n};\n\nexport const DropdownMenu: React.FC<DropdownMenuProps> = ({\n anchorRef,\n open,\n onClose,\n items,\n onSelect,\n align = \"end\",\n side = \"auto\",\n width = \"trigger\",\n maxHeight = 288,\n className,\n itemClassName,\n}) => {\n const renderIcon = useIconRenderer();\n const menuRef = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<React.CSSProperties>();\n const [computedMaxHeight, setComputedMaxHeight] = useState<number>(maxHeight);\n\n const handleSelect = useCallback(\n (item: DropdownMenuOption) => {\n if (item.disabled) {\n return;\n }\n onSelect?.(item);\n onClose();\n },\n [onClose, onSelect],\n );\n\n useEffect(() => {\n if (!open) {\n return;\n }\n const handlePointer = (event: MouseEvent) => {\n if (\n menuRef.current?.contains(event.target as Node) ||\n anchorRef.current?.contains(event.target as Node)\n ) {\n return;\n }\n onClose();\n };\n\n const handleKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n };\n\n document.addEventListener(\"pointerdown\", handlePointer);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointer);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [open, onClose, anchorRef]);\n\n useEffect(() => {\n if (!open) {\n setStyle(undefined);\n setComputedMaxHeight(maxHeight);\n }\n }, [maxHeight, open]);\n\n const updatePosition = useCallback(() => {\n if (!open || !anchorRef.current || !menuRef.current) {\n return;\n }\n\n const anchorRect = anchorRef.current.getBoundingClientRect();\n const caretElement = anchorRef.current.querySelector(\n \"[data-dropdown-caret]\",\n );\n const alignReferenceRect =\n caretElement?.getBoundingClientRect() ?? anchorRect;\n const menuRect = menuRef.current.getBoundingClientRect();\n const boundary = resolveBoundaryBounds(anchorRef.current);\n const zIndex = resolveAnchorLayerZIndex(anchorRef.current);\n const offset = 8;\n const minMargin = 8;\n\n const maxAllowedWidth = Math.max(120, boundary.width - minMargin * 2);\n const unclampedWidth =\n typeof width === \"number\"\n ? width\n : width === \"trigger\"\n ? Math.max(anchorRect.width, menuRect.width)\n : menuRect.width;\n const computedWidth = Math.min(unclampedWidth, maxAllowedWidth);\n const computedHeight = menuRect.height;\n\n const belowTop = anchorRect.bottom + offset;\n const aboveTop = anchorRect.top - offset - computedHeight;\n\n const overflowForTop = (top: number): number => {\n const overflowTop = Math.max(0, boundary.top + minMargin - top);\n const overflowBottom = Math.max(\n 0,\n top + computedHeight - (boundary.bottom - minMargin),\n );\n return overflowTop + overflowBottom;\n };\n\n const chooseTop = (): { top: number; isTopSide: boolean } => {\n if (side === \"top\") return { top: aboveTop, isTopSide: true };\n if (side === \"bottom\") return { top: belowTop, isTopSide: false };\n\n const belowOverflow = overflowForTop(belowTop);\n const aboveOverflow = overflowForTop(aboveTop);\n if (aboveOverflow < belowOverflow)\n return { top: aboveTop, isTopSide: true };\n return { top: belowTop, isTopSide: false };\n };\n\n const verticalChoice = chooseTop();\n const clampedTop = Math.min(\n Math.max(verticalChoice.top, boundary.top + minMargin),\n Math.max(\n boundary.top + minMargin,\n boundary.bottom - computedHeight - minMargin,\n ),\n );\n\n const availableBelow = Math.max(\n 120,\n boundary.bottom - minMargin - belowTop,\n );\n const availableAbove = Math.max(\n 120,\n anchorRect.top - offset - (boundary.top + minMargin),\n );\n const nextMaxHeight = Math.max(\n 120,\n Math.min(\n maxHeight,\n verticalChoice.isTopSide ? availableAbove : availableBelow,\n ),\n );\n\n const startLeft = alignReferenceRect.left;\n const endLeft = alignReferenceRect.right - computedWidth;\n const overflowForLeft = (left: number): number => {\n const overflowLeft = Math.max(0, boundary.left + minMargin - left);\n const overflowRight = Math.max(\n 0,\n left + computedWidth - (boundary.right - minMargin),\n );\n return overflowLeft + overflowRight;\n };\n\n const preferredLeft = align === \"start\" ? startLeft : endLeft;\n const alternateLeft = align === \"start\" ? endLeft : startLeft;\n const leftCandidate =\n overflowForLeft(preferredLeft) <= overflowForLeft(alternateLeft)\n ? preferredLeft\n : alternateLeft;\n const clampedLeft = Math.min(\n Math.max(leftCandidate, boundary.left + minMargin),\n Math.max(\n boundary.left + minMargin,\n boundary.right - computedWidth - minMargin,\n ),\n );\n\n const nextStyle: React.CSSProperties = {\n top: `${clampedTop}px`,\n left: `${clampedLeft}px`,\n maxWidth: `${maxAllowedWidth}px`,\n zIndex,\n };\n\n if (typeof width === \"number\") {\n nextStyle.width = computedWidth;\n } else if (width === \"trigger\") {\n nextStyle.minWidth = computedWidth;\n }\n\n setComputedMaxHeight(nextMaxHeight);\n setStyle((prev) => {\n const prevTop = typeof prev?.top === \"string\" ? prev.top : \"\";\n const prevLeft = typeof prev?.left === \"string\" ? prev.left : \"\";\n const prevWidth =\n typeof prev?.width === \"number\" ? prev.width : undefined;\n const prevMinWidth =\n typeof prev?.minWidth === \"number\" ? prev.minWidth : undefined;\n const prevMaxWidth =\n typeof prev?.maxWidth === \"string\" ? prev.maxWidth : \"\";\n const prevZIndex =\n typeof prev?.zIndex === \"number\" ? prev.zIndex : undefined;\n\n if (\n prevTop === nextStyle.top &&\n prevLeft === nextStyle.left &&\n prevWidth === nextStyle.width &&\n prevMinWidth === nextStyle.minWidth &&\n prevMaxWidth === nextStyle.maxWidth &&\n prevZIndex === nextStyle.zIndex\n ) {\n return prev;\n }\n return nextStyle;\n });\n }, [align, anchorRef, maxHeight, open, side, width]);\n\n useLayoutEffect(() => {\n updatePosition();\n }, [updatePosition]);\n\n useEffect(() => {\n if (!open) return;\n\n let frame = 0;\n const scheduleUpdate = () => {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n updatePosition();\n frame = 0;\n });\n };\n\n const handleResize = () => scheduleUpdate();\n const handleScroll = () => scheduleUpdate();\n\n window.addEventListener(\"resize\", handleResize);\n window.addEventListener(\"scroll\", handleScroll, true);\n\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => scheduleUpdate())\n : undefined;\n\n if (resizeObserver) {\n if (anchorRef.current) resizeObserver.observe(anchorRef.current);\n if (menuRef.current) resizeObserver.observe(menuRef.current);\n }\n\n scheduleUpdate();\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", handleResize);\n window.removeEventListener(\"scroll\", handleScroll, true);\n resizeObserver?.disconnect();\n };\n }, [anchorRef, open, updatePosition]);\n\n if (!open || !PORTAL_ROOT) {\n return null;\n }\n\n const resolvedStyle = style ?? { visibility: \"hidden\" };\n\n return createPortal(\n <div\n ref={menuRef}\n style={resolvedStyle}\n role=\"menu\"\n className={classNames(\n \"fixed min-w-[10rem] overflow-hidden rounded-lg border border-neutral-200 bg-white/95 p-1 text-sm shadow-xl ring-1 ring-black/5 backdrop-blur dark:border-neutral-700 dark:bg-neutral-900/95\",\n !style && \"invisible opacity-0\",\n className,\n )}\n >\n <ul\n className=\"overflow-auto\"\n style={{ maxHeight: computedMaxHeight }}\n onClick={(event) => event.stopPropagation()}\n >\n {items.map((item) => (\n <li key={item.value}>\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={(event) => {\n event.stopPropagation();\n handleSelect(item);\n }}\n className={classNames(\n \"flex w-full items-start gap-3 rounded-md px-3 py-2 text-left transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-400/60\",\n item.disabled\n ? \"cursor-not-allowed opacity-50\"\n : item.danger\n ? \"text-rose-600 hover:bg-rose-50 dark:text-rose-300 dark:hover:bg-rose-500/10\"\n : \"hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n itemClassName,\n )}\n >\n {item.icon && (\n <span className=\"mt-0.5 flex h-4 w-4 items-center justify-center text-neutral-400 dark:text-neutral-300\">\n {typeof item.icon === \"string\"\n ? renderIcon(item.icon, \"sm\")\n : item.icon}\n </span>\n )}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate font-medium text-neutral-900 dark:text-neutral-100\">\n {item.label}\n </span>\n {item.description && (\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {item.description}\n </span>\n )}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </div>,\n PORTAL_ROOT,\n );\n};\n\nDropdownMenu.displayName = \"DropdownMenu\";\n\nexport default DropdownMenu;\n","import React, { useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\n\nexport type TooltipPosition = \"top\" | \"bottom\";\n\nexport interface TooltipProps {\n /** Text shown in the tooltip. When omitted the component renders children as-is. */\n text?: string;\n /** How long to wait (ms) before showing the tooltip. Defaults to 500. */\n delay?: number;\n /** Where to place the tooltip relative to the trigger. Defaults to 'top'. */\n position?: TooltipPosition;\n /** Extra classes applied to the outer wrapper element. */\n wrapperClassName?: string;\n children: React.ReactNode;\n}\n\nconst Tooltip: React.FC<TooltipProps> = ({\n text,\n delay = 500,\n position = \"top\",\n wrapperClassName,\n children,\n}) => {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [visible, setVisible] = useState(false);\n const [coords, setCoords] = useState<{ x: number; y: number } | null>(null);\n\n if (!text) return <>{children}</>;\n\n const show = () => {\n timerRef.current = setTimeout(() => {\n if (wrapperRef.current) {\n const rect = wrapperRef.current.getBoundingClientRect();\n setCoords({\n x: rect.left + rect.width / 2,\n y: position === \"top\" ? rect.top : rect.bottom,\n });\n }\n setVisible(true);\n }, delay);\n };\n\n const hide = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n setVisible(false);\n setCoords(null);\n };\n\n const isTop = position === \"top\";\n\n return (\n <div\n ref={wrapperRef}\n className={classNames(\"relative inline-flex\", wrapperClassName)}\n onMouseEnter={show}\n onMouseLeave={hide}\n >\n {children}\n {visible &&\n coords &&\n createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed z-[9999] whitespace-nowrap rounded-md bg-neutral-900 px-2.5 py-1.5 text-xs leading-snug text-white shadow-lg dark:bg-neutral-700\"\n style={{\n left: coords.x,\n top: coords.y,\n transform: isTop\n ? \"translate(-50%, calc(-100% - 6px))\"\n : \"translate(-50%, 6px)\",\n }}\n >\n {text}\n {/* caret */}\n <span\n className={classNames(\n \"absolute left-1/2 -translate-x-1/2 border-4 border-transparent\",\n isTop\n ? \"top-full border-t-neutral-900 dark:border-t-neutral-700\"\n : \"bottom-full border-b-neutral-900 dark:border-b-neutral-700\",\n )}\n />\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\nexport default Tooltip;\n","import classNames from \"classnames\";\nimport React, {\n type ForwardedRef,\n type InputHTMLAttributes,\n forwardRef,\n} from \"react\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport type { TrueColor } from \"../theme/Theme\";\n\ntype InputValidationStatus = \"none\" | \"error\" | \"success\";\ntype InputSize = \"sm\" | \"md\" | \"lg\";\nexport type InputVariant = \"flat\" | \"elevated\" | \"ghost\" | \"underline\";\n\nconst sizeStyles: Record<\n InputSize,\n {\n input: string;\n leadingPadding: string;\n trailingPadding: string;\n icon?: string | React.ElementType;\n iconLeft: string;\n iconRight: string;\n iconSize: string;\n }\n> = {\n sm: {\n input: \"px-3 py-1.5 text-sm\",\n leadingPadding: \"pl-8\",\n trailingPadding: \"pr-8\",\n iconSize: \"h-3.5 w-3.5\",\n iconLeft: \"left-2.5\",\n iconRight: \"right-2.5\",\n },\n md: {\n input: \"px-3.5 py-2.5 text-sm\",\n leadingPadding: \"pl-10\",\n trailingPadding: \"pr-10\",\n iconSize: \"h-4 w-4\",\n iconLeft: \"left-3.5\",\n iconRight: \"right-3.5\",\n },\n lg: {\n input: \"px-4 py-3 text-base\",\n leadingPadding: \"pl-11\",\n trailingPadding: \"pr-11\",\n iconSize: \"h-5 w-5\",\n iconLeft: \"left-4\",\n iconRight: \"right-4\",\n },\n};\n\ntype InputToneTokens = {\n /** Full focus indicator: colored border + glow ring. Used by flat / elevated / ghost variants. */\n focusRing: string;\n /** Border-only focus indicator: no ring. Used by the underline variant. */\n focusBorder: string;\n icon: string;\n};\n\nconst toneTokens: Partial<Record<TrueColor, InputToneTokens>> = {\n red: {\n focusRing: \"focus:border-rose-400 focus:ring-2 focus:ring-rose-400/60\",\n focusBorder: \"focus:border-rose-500\",\n icon: \"text-rose-500 dark:text-rose-300\",\n },\n orange: {\n focusRing: \"focus:border-orange-400 focus:ring-2 focus:ring-orange-400/60\",\n focusBorder: \"focus:border-orange-500\",\n icon: \"text-orange-500 dark:text-orange-300\",\n },\n amber: {\n focusRing: \"focus:border-amber-400 focus:ring-2 focus:ring-amber-400/60\",\n focusBorder: \"focus:border-amber-500\",\n icon: \"text-amber-500 dark:text-amber-300\",\n },\n yellow: {\n focusRing: \"focus:border-yellow-400 focus:ring-2 focus:ring-yellow-400/60\",\n focusBorder: \"focus:border-yellow-500\",\n icon: \"text-yellow-500 dark:text-yellow-300\",\n },\n lime: {\n focusRing: \"focus:border-lime-400 focus:ring-2 focus:ring-lime-400/60\",\n focusBorder: \"focus:border-lime-500\",\n icon: \"text-lime-500 dark:text-lime-300\",\n },\n green: {\n focusRing:\n \"focus:border-emerald-400 focus:ring-2 focus:ring-emerald-400/60\",\n focusBorder: \"focus:border-emerald-500\",\n icon: \"text-emerald-500 dark:text-emerald-300\",\n },\n emerald: {\n focusRing:\n \"focus:border-emerald-400 focus:ring-2 focus:ring-emerald-400/60\",\n focusBorder: \"focus:border-emerald-500\",\n icon: \"text-emerald-500 dark:text-emerald-300\",\n },\n teal: {\n focusRing: \"focus:border-teal-400 focus:ring-2 focus:ring-teal-400/60\",\n focusBorder: \"focus:border-teal-500\",\n icon: \"text-teal-500 dark:text-teal-300\",\n },\n cyan: {\n focusRing: \"focus:border-cyan-400 focus:ring-2 focus:ring-cyan-400/60\",\n focusBorder: \"focus:border-cyan-500\",\n icon: \"text-cyan-500 dark:text-cyan-300\",\n },\n sky: {\n focusRing: \"focus:border-sky-400 focus:ring-2 focus:ring-sky-400/60\",\n focusBorder: \"focus:border-sky-500\",\n icon: \"text-sky-500 dark:text-sky-300\",\n },\n blue: {\n focusRing: \"focus:border-blue-400 focus:ring-2 focus:ring-blue-400/60\",\n focusBorder: \"focus:border-blue-500\",\n icon: \"text-blue-500 dark:text-blue-300\",\n },\n indigo: {\n focusRing: \"focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/60\",\n focusBorder: \"focus:border-indigo-500\",\n icon: \"text-indigo-500 dark:text-indigo-300\",\n },\n violet: {\n focusRing: \"focus:border-violet-400 focus:ring-2 focus:ring-violet-400/60\",\n focusBorder: \"focus:border-violet-500\",\n icon: \"text-violet-500 dark:text-violet-300\",\n },\n purple: {\n focusRing: \"focus:border-purple-400 focus:ring-2 focus:ring-purple-400/60\",\n focusBorder: \"focus:border-purple-500\",\n icon: \"text-purple-500 dark:text-purple-300\",\n },\n fuchsia: {\n focusRing:\n \"focus:border-fuchsia-400 focus:ring-2 focus:ring-fuchsia-400/60\",\n focusBorder: \"focus:border-fuchsia-500\",\n icon: \"text-fuchsia-500 dark:text-fuchsia-300\",\n }, rose: {\n focusRing: \"focus:border-rose-400 focus:ring-2 focus:ring-rose-400/60\",\n focusBorder: \"focus:border-rose-500\",\n icon: \"text-rose-500 dark:text-rose-300\",\n },\n slate: {\n focusRing: \"focus:border-slate-500 focus:ring-2 focus:ring-slate-500/60\",\n focusBorder: \"focus:border-slate-600\",\n icon: \"text-slate-500 dark:text-slate-200\",\n },\n gray: {\n focusRing: \"focus:border-gray-400 focus:ring-2 focus:ring-gray-400/60\",\n focusBorder: \"focus:border-gray-500\",\n icon: \"text-gray-500 dark:text-gray-300\",\n },\n zinc: {\n focusRing: \"focus:border-zinc-400 focus:ring-2 focus:ring-zinc-400/60\",\n focusBorder: \"focus:border-zinc-500\",\n icon: \"text-zinc-500 dark:text-zinc-300\",\n },\n neutral: {\n focusRing:\n \"focus:border-neutral-400 focus:ring-2 focus:ring-neutral-400/60 dark:focus:border-neutral-500 dark:focus:ring-neutral-500/60\",\n focusBorder: \"focus:border-neutral-600 dark:focus:border-neutral-400\",\n icon: \"text-neutral-500 dark:text-neutral-300\",\n },\n stone: {\n focusRing: \"focus:border-stone-400 focus:ring-2 focus:ring-stone-400/60\",\n focusBorder: \"focus:border-stone-500\",\n icon: \"text-stone-500 dark:text-stone-300\",\n },};\n\nconst statusClasses: Record<Exclude<InputValidationStatus, \"none\">, string> = {\n error:\n \"border-rose-500 focus:border-rose-500 focus:ring-rose-500/60 text-neutral-900 placeholder:text-neutral-400 dark:border-rose-400 dark:focus:border-rose-400 dark:focus:ring-rose-400/60 dark:text-neutral-100\",\n success:\n \"border-emerald-500 focus:border-emerald-500 focus:ring-emerald-500/60 text-neutral-900 placeholder:text-neutral-400 dark:border-emerald-400 dark:focus:border-emerald-400 dark:focus:ring-emerald-400/60 dark:text-neutral-100\",\n};\n\nconst unstyledStatusClasses: Record<\n Exclude<InputValidationStatus, \"none\">,\n string\n> = {\n error: \"text-neutral-900 dark:text-neutral-100\",\n success: \"text-neutral-900 dark:text-neutral-100\",\n};\n\nconst disabledClasses =\n \"disabled:cursor-not-allowed disabled:border-neutral-200 disabled:bg-neutral-100 disabled:text-neutral-400 dark:disabled:border-neutral-700 dark:disabled:bg-neutral-800 dark:disabled:text-neutral-500\";\n\n/**\n * Visual surface variants:\n *\n * flat — clean thin border, no shadow. Best for most form contexts. (default)\n * elevated — adds a subtle drop shadow; stands out against low-contrast backgrounds.\n * ghost — transparent border at rest; border and ring reveal on hover, focus, or validation.\n * Great for inline editing or dense layouts.\n * underline — bottom border only; no background fill. Minimalist / inline editing style.\n * Focus shows the accent border colour; no glow ring.\n */\nconst variantStyles: Record<InputVariant, string> = {\n flat: \"rounded-lg border border-neutral-300 bg-white dark:border-neutral-700 dark:bg-neutral-900\",\n elevated:\n \"rounded-lg border border-neutral-300 bg-white shadow-sm dark:border-neutral-700 dark:bg-neutral-900\",\n ghost:\n \"rounded-lg border border-transparent bg-neutral-100/80 hover:border-neutral-300 hover:bg-white dark:bg-neutral-800/60 dark:hover:border-neutral-600 dark:hover:bg-neutral-800\",\n underline:\n \"rounded-none border-0 border-b border-neutral-300 bg-transparent px-0 transition-colors dark:border-neutral-600\",\n};\n\ntype IconRenderer = string | React.ReactElement;\n\nexport interface InputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\" | \"color\"> {\n size?: InputSize;\n tone?: TrueColor;\n /** Visual surface style. Defaults to `flat`. */\n variant?: InputVariant;\n validationStatus?: InputValidationStatus;\n leadingIcon?: IconRenderer;\n trailingIcon?: IconRenderer;\n /** When provided, the trailing icon renders as an interactive button instead of a static decoration. */\n onTrailingIconClick?: React.MouseEventHandler<HTMLButtonElement>;\n wrapperClassName?: string;\n unstyled?: boolean;\n fullHeight?: boolean;\n}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n size = \"md\",\n tone = \"blue\",\n variant = \"flat\",\n validationStatus = \"none\",\n leadingIcon,\n trailingIcon,\n onTrailingIconClick,\n className,\n wrapperClassName,\n disabled,\n unstyled = false,\n fullHeight = false,\n ...rest\n },\n ref: ForwardedRef<HTMLInputElement>,\n) {\n const renderIcon = useIconRenderer();\n const sizeToken = sizeStyles[size] ?? sizeStyles.md;\n const tokens = (toneTokens[tone] ?? toneTokens.neutral) as InputToneTokens;\n const hasLeadingIcon = Boolean(leadingIcon);\n const hasTrailingIcon = Boolean(trailingIcon);\n const isUnstyled = unstyled;\n\n const renderVisual = (visual: IconRenderer, iconClassName: string) => {\n if (!visual) {\n return null;\n }\n if (typeof visual === \"string\") {\n return renderIcon(visual, undefined, iconClassName);\n }\n if (React.isValidElement<{ className?: string }>(visual)) {\n return React.cloneElement(visual, {\n className: classNames(iconClassName, visual.props.className),\n });\n }\n return <span className={iconClassName}>{visual}</span>;\n };\n\n const baseInputClasses = classNames(\n \"block w-full text-sm text-neutral-900 placeholder:text-neutral-400 focus:outline-none dark:text-neutral-100 dark:placeholder:text-neutral-500\",\n sizeToken.input,\n !isUnstyled && variantStyles[variant],\n disabledClasses,\n hasLeadingIcon && sizeToken.leadingPadding,\n hasTrailingIcon && sizeToken.trailingPadding,\n className,\n );\n\n const unstyledClasses = isUnstyled\n ? classNames(\n \"border-0 bg-transparent focus:border-transparent focus:ring-0 dark:bg-transparent\",\n sizeToken.input,\n hasLeadingIcon && sizeToken.leadingPadding,\n hasTrailingIcon && sizeToken.trailingPadding,\n )\n : \"\";\n\n const statusClass =\n validationStatus !== \"none\"\n ? isUnstyled\n ? unstyledStatusClasses[validationStatus]\n : statusClasses[validationStatus]\n : undefined;\n\n const mergedInputClasses = classNames(\n isUnstyled ? unstyledClasses : baseInputClasses,\n !isUnstyled &&\n (variant === \"underline\" ? tokens.focusBorder : tokens.focusRing),\n fullHeight && \"h-full\",\n );\n\n const renderIconWrapper = (\n visual: IconRenderer,\n position: \"left\" | \"right\",\n onClick?: React.MouseEventHandler<HTMLButtonElement>,\n ) => {\n if (!visual) {\n return null;\n }\n const positionClass =\n position === \"left\" ? sizeToken.iconLeft : sizeToken.iconRight;\n if (onClick) {\n return (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={onClick}\n className={classNames(\n \"absolute flex items-center justify-center rounded\",\n positionClass,\n sizeToken.iconSize,\n tokens.icon,\n validationStatus === \"error\" && \"text-rose-500 dark:text-rose-400\",\n validationStatus === \"success\" &&\n \"text-emerald-500 dark:text-emerald-400\",\n \"cursor-pointer p-0.5 transition-colors duration-150 hover:text-neutral-700 dark:hover:text-neutral-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-current\",\n )}\n >\n {renderVisual(visual, sizeToken.iconSize)}\n </button>\n );\n }\n const iconClassName = classNames(\n \"pointer-events-none absolute flex items-center justify-center text-neutral-400 dark:text-neutral-500\",\n positionClass,\n sizeToken.iconSize,\n tokens.icon,\n validationStatus === \"error\" && \"text-rose-500 dark:text-rose-400\",\n validationStatus === \"success\" &&\n \"text-emerald-500 dark:text-emerald-400\",\n );\n return (\n <span className={iconClassName}>\n {renderVisual(visual, sizeToken.iconSize)}\n </span>\n );\n };\n\n return (\n <span\n className={classNames(\n \"relative flex w-full items-center\",\n disabled && \"opacity-70\",\n fullHeight && \"h-full\",\n wrapperClassName,\n )}\n >\n {leadingIcon && renderIconWrapper(leadingIcon, \"left\")}\n <input\n ref={ref}\n className={classNames(mergedInputClasses, statusClass)}\n disabled={disabled}\n aria-invalid={\n validationStatus === \"error\" ? \"true\" : rest[\"aria-invalid\"]\n }\n {...rest}\n />\n {trailingIcon &&\n renderIconWrapper(trailingIcon, \"right\", onTrailingIconClick)}\n </span>\n );\n});\n\nInput.displayName = \"Input\";\n\n(Input as unknown as { __UI_INPUT?: boolean }).__UI_INPUT = true;\n\nexport type InputValidationStatusType = InputValidationStatus;\n\nexport default Input;\n","import { useState, forwardRef, type ForwardedRef } from \"react\";\nimport Input, { type InputProps } from \"./Input\";\nimport { EyeOpen } from \"../icons/components/EyeOpen\";\nimport { EyeClosed } from \"../icons/components/EyeClosed\";\n\nexport type PasswordInputProps = Omit<\n InputProps,\n \"type\" | \"trailingIcon\" | \"onTrailingIconClick\"\n>;\n\nconst PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(props, ref: ForwardedRef<HTMLInputElement>) {\n const [showPassword, setShowPassword] = useState(false);\n\n return (\n <Input\n {...props}\n ref={ref}\n type={showPassword ? \"text\" : \"password\"}\n trailingIcon={\n showPassword ? (\n <EyeClosed className=\"w-4 h-4\" />\n ) : (\n <EyeOpen className=\"w-4 h-4\" />\n )\n }\n onTrailingIconClick={() => setShowPassword((v) => !v)}\n />\n );\n },\n);\n\nPasswordInput.displayName = \"PasswordInput\";\n\nexport default PasswordInput;\n","import classNames from \"classnames\";\nimport {\n type ForwardedRef,\n type ReactNode,\n type TextareaHTMLAttributes,\n forwardRef,\n useMemo,\n} from \"react\";\nimport type { TrueColor } from \"../theme/Theme\";\n\ntype TextareaSize = \"sm\" | \"md\" | \"lg\";\ntype TextareaValidationStatus = \"none\" | \"error\" | \"success\";\ntype TextareaResize = \"none\" | \"vertical\" | \"horizontal\" | \"both\";\n\nconst sizeTokens: Record<\n TextareaSize,\n { padding: string; text: string; minHeight: string }\n> = {\n sm: { padding: \"px-3 py-2\", text: \"text-sm\", minHeight: \"min-h-[6rem]\" },\n md: { padding: \"px-3.5 py-2.5\", text: \"text-sm\", minHeight: \"min-h-[7rem]\" },\n lg: { padding: \"px-4 py-3\", text: \"text-base\", minHeight: \"min-h-[8rem]\" },\n};\n\ntype ToneTokens = {\n focusRing: string;\n border: string;\n darkBorder: string;\n background: string;\n darkBackground: string;\n};\n\nconst toneTokens: Partial<Record<TrueColor, ToneTokens>> = {\n indigo: {\n focusRing: \"focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/60\",\n border: \"border-neutral-300\",\n darkBorder: \"dark:border-neutral-700\",\n background: \"bg-white\",\n darkBackground: \"dark:bg-neutral-900\",\n },\n blue: {\n focusRing: \"focus:border-blue-400 focus:ring-2 focus:ring-blue-400/60\",\n border: \"border-neutral-300\",\n darkBorder: \"dark:border-neutral-700\",\n background: \"bg-white\",\n darkBackground: \"dark:bg-neutral-900\",\n },\n emerald: {\n focusRing:\n \"focus:border-emerald-400 focus:ring-2 focus:ring-emerald-400/60\",\n border: \"border-neutral-300\",\n darkBorder: \"dark:border-neutral-700\",\n background: \"bg-white\",\n darkBackground: \"dark:bg-neutral-900\",\n },\n amber: {\n focusRing: \"focus:border-amber-400 focus:ring-2 focus:ring-amber-400/60\",\n border: \"border-neutral-300\",\n darkBorder: \"dark:border-neutral-700\",\n background: \"bg-white\",\n darkBackground: \"dark:bg-neutral-900\",\n },\n rose: {\n focusRing: \"focus:border-rose-400 focus:ring-2 focus:ring-rose-400/60\",\n border: \"border-neutral-300\",\n darkBorder: \"dark:border-neutral-700\",\n background: \"bg-white\",\n darkBackground: \"dark:bg-neutral-900\",\n },\n slate: {\n focusRing: \"focus:border-slate-500 focus:ring-2 focus:ring-slate-500/60\",\n border: \"border-neutral-300\",\n darkBorder: \"dark:border-neutral-700\",\n background: \"bg-white\",\n darkBackground: \"dark:bg-neutral-900\",\n }, neutral: {\n focusRing: \"focus:border-slate-500 focus:ring-2 focus:ring-slate-500/60\",\n border: \"border-neutral-300\",\n darkBorder: \"dark:border-neutral-700\",\n background: \"bg-white\",\n darkBackground: \"dark:bg-neutral-900\",\n },\n};\n\nconst statusClasses: Record<\n Exclude<TextareaValidationStatus, \"none\">,\n string\n> = {\n error:\n \"border-rose-500 focus:border-rose-500 focus:ring-rose-500/60 text-neutral-900 dark:border-rose-400 dark:focus:border-rose-400 dark:focus:ring-rose-400/60 dark:text-neutral-100\",\n success:\n \"border-emerald-500 focus:border-emerald-500 focus:ring-emerald-500/60 text-neutral-900 dark:border-emerald-400 dark:focus:border-emerald-400 dark:focus:ring-emerald-400/60 dark:text-neutral-100\",\n};\n\nconst disabledClasses =\n \"disabled:cursor-not-allowed disabled:border-neutral-200 disabled:bg-neutral-100 disabled:text-neutral-400 dark:disabled:border-neutral-700 dark:disabled:bg-neutral-800 dark:disabled:text-neutral-500\";\n\nexport interface TextareaProps\n extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, \"size\" | \"color\"> {\n size?: TextareaSize;\n tone?: TrueColor;\n validationStatus?: TextareaValidationStatus;\n resize?: TextareaResize;\n helpText?: ReactNode;\n}\n\nconst resizeClasses: Record<TextareaResize, string> = {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n};\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n function Textarea(\n {\n size = \"md\",\n tone = \"neutral\",\n validationStatus = \"none\",\n className,\n resize = \"vertical\",\n disabled,\n ...rest\n },\n ref: ForwardedRef<HTMLTextAreaElement>,\n ) {\n const sizeToken = sizeTokens[size] ?? sizeTokens.md;\n const tokens = (toneTokens[tone] ?? toneTokens.neutral) as ToneTokens;\n const resizeClass = resizeClasses[resize] ?? resizeClasses.vertical;\n\n const classes = useMemo(\n () =>\n classNames(\n \"block w-full rounded-lg border bg-white text-sm text-neutral-900 placeholder:text-neutral-400 shadow-sm focus:outline-none dark:text-neutral-100 dark:placeholder:text-neutral-500\",\n sizeToken.padding,\n sizeToken.text,\n sizeToken.minHeight,\n tokens.border,\n tokens.darkBorder,\n tokens.background,\n tokens.darkBackground,\n tokens.focusRing,\n disabledClasses,\n resizeClass,\n validationStatus !== \"none\" ? statusClasses[validationStatus] : null,\n className,\n ),\n [\n className,\n resizeClass,\n sizeToken.minHeight,\n sizeToken.padding,\n sizeToken.text,\n tokens.background,\n tokens.border,\n tokens.darkBackground,\n tokens.darkBorder,\n tokens.focusRing,\n validationStatus,\n ],\n );\n\n return (\n <textarea ref={ref} className={classes} disabled={disabled} {...rest} />\n );\n },\n);\n\nTextarea.displayName = \"Textarea\";\n\n(Textarea as unknown as { __UI_INPUT?: boolean }).__UI_INPUT = true;\n\nexport default Textarea;\n","import classNames from \"classnames\";\nimport React, {\n type ForwardedRef,\n type ReactNode,\n type SelectHTMLAttributes,\n forwardRef,\n useMemo,\n} from \"react\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport type { TrueColor } from \"../theme/Theme\";\n\ntype SelectSize = \"sm\" | \"md\" | \"lg\";\ntype SelectValidationStatus = \"none\" | \"error\" | \"success\";\n\nconst sizeStyles: Record<\n SelectSize,\n {\n select: string;\n iconSize: string;\n iconRight: string;\n }\n> = {\n sm: {\n select: \"px-3 py-1.5 text-sm pr-9\",\n iconSize: \"h-4 w-4\",\n iconRight: \"right-3\",\n },\n md: {\n select: \"px-3.5 py-2.5 text-sm pr-10\",\n iconSize: \"h-5 w-5\",\n iconRight: \"right-3.5\",\n },\n lg: {\n select: \"px-4 py-3 text-base pr-11\",\n iconSize: \"h-5 w-5\",\n iconRight: \"right-4\",\n },\n};\n\ntype SelectToneTokens = {\n focusRing: string;\n icon: string;\n};\n\nconst toneTokens: Partial<Record<TrueColor, SelectToneTokens>> = {\n red: {\n focusRing: \"focus:border-red-400 focus:ring-2 focus:ring-red-400/60\",\n icon: \"text-red-500 dark:text-red-300\",\n },\n orange: {\n focusRing: \"focus:border-orange-400 focus:ring-2 focus:ring-orange-400/60\",\n icon: \"text-orange-500 dark:text-orange-300\",\n },\n amber: {\n focusRing: \"focus:border-amber-400 focus:ring-2 focus:ring-amber-400/60\",\n icon: \"text-amber-500 dark:text-amber-300\",\n },\n yellow: {\n focusRing: \"focus:border-yellow-400 focus:ring-2 focus:ring-yellow-400/60\",\n icon: \"text-yellow-500 dark:text-yellow-300\",\n },\n lime: {\n focusRing: \"focus:border-lime-400 focus:ring-2 focus:ring-lime-400/60\",\n icon: \"text-lime-500 dark:text-lime-300\",\n },\n green: {\n focusRing: \"focus:border-green-400 focus:ring-2 focus:ring-green-400/60\",\n icon: \"text-green-500 dark:text-green-300\",\n },\n emerald: {\n focusRing:\n \"focus:border-emerald-400 focus:ring-2 focus:ring-emerald-400/60\",\n icon: \"text-emerald-500 dark:text-emerald-300\",\n },\n teal: {\n focusRing: \"focus:border-teal-400 focus:ring-2 focus:ring-teal-400/60\",\n icon: \"text-teal-500 dark:text-teal-300\",\n },\n cyan: {\n focusRing: \"focus:border-cyan-400 focus:ring-2 focus:ring-cyan-400/60\",\n icon: \"text-cyan-500 dark:text-cyan-300\",\n },\n sky: {\n focusRing: \"focus:border-sky-400 focus:ring-2 focus:ring-sky-400/60\",\n icon: \"text-sky-500 dark:text-sky-300\",\n },\n blue: {\n focusRing: \"focus:border-blue-400 focus:ring-2 focus:ring-blue-400/60\",\n icon: \"text-blue-500 dark:text-blue-300\",\n },\n indigo: {\n focusRing: \"focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/60\",\n icon: \"text-indigo-500 dark:text-indigo-300\",\n },\n violet: {\n focusRing: \"focus:border-violet-400 focus:ring-2 focus:ring-violet-400/60\",\n icon: \"text-violet-500 dark:text-violet-300\",\n },\n purple: {\n focusRing: \"focus:border-purple-400 focus:ring-2 focus:ring-purple-400/60\",\n icon: \"text-purple-500 dark:text-purple-300\",\n },\n fuchsia: {\n focusRing:\n \"focus:border-fuchsia-400 focus:ring-2 focus:ring-fuchsia-400/60\",\n icon: \"text-fuchsia-500 dark:text-fuchsia-300\",\n }, rose: {\n focusRing: \"focus:border-rose-400 focus:ring-2 focus:ring-rose-400/60\",\n icon: \"text-rose-500 dark:text-rose-300\",\n },\n slate: {\n focusRing: \"focus:border-slate-500 focus:ring-2 focus:ring-slate-500/60\",\n icon: \"text-slate-500 dark:text-slate-200\",\n },\n gray: {\n focusRing:\n \"focus:border-neutral-500 focus:ring-2 focus:ring-neutral-500/60\",\n icon: \"text-neutral-500 dark:text-neutral-200\",\n },\n zinc: {\n focusRing:\n \"focus:border-neutral-500 focus:ring-2 focus:ring-neutral-500/60\",\n icon: \"text-neutral-500 dark:text-neutral-200\",\n },\n neutral: {\n focusRing:\n \"focus:border-neutral-500 focus:ring-2 focus:ring-neutral-500/60\",\n icon: \"text-neutral-500 dark:text-neutral-200\",\n },\n stone: {\n focusRing:\n \"focus:border-neutral-500 focus:ring-2 focus:ring-neutral-500/60\",\n icon: \"text-neutral-500 dark:text-neutral-200\",\n },\n};\n\nconst statusClasses: Record<Exclude<SelectValidationStatus, \"none\">, string> = {\n error:\n \"border-rose-500 focus:border-rose-500 focus:ring-rose-500/60 text-neutral-900 dark:border-rose-400 dark:focus:border-rose-400 dark:focus:ring-rose-400/60 dark:text-neutral-100\",\n success:\n \"border-emerald-500 focus:border-emerald-500 focus:ring-emerald-500/60 text-neutral-900 dark:border-emerald-400 dark:focus:border-emerald-400 dark:focus:ring-emerald-400/60 dark:text-neutral-100\",\n};\n\nconst disabledClasses =\n \"disabled:cursor-not-allowed disabled:border-neutral-200 disabled:bg-neutral-100 disabled:text-neutral-400 disabled:shadow-none dark:disabled:border-neutral-700 dark:disabled:bg-neutral-800 dark:disabled:text-neutral-500\";\n\nexport interface SelectProps\n extends Omit<SelectHTMLAttributes<HTMLSelectElement>, \"size\" | \"color\"> {\n size?: SelectSize;\n tone?: TrueColor;\n validationStatus?: SelectValidationStatus;\n placeholder?: ReactNode;\n leadingIcon?: string | React.ReactElement;\n hideCaret?: boolean;\n unstyled?: boolean;\n}\n\nconst Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n {\n size = \"md\",\n tone = \"blue\",\n validationStatus = \"none\",\n className,\n placeholder,\n leadingIcon,\n hideCaret = false,\n disabled,\n children,\n unstyled = false,\n multiple,\n ...rest\n },\n ref: ForwardedRef<HTMLSelectElement>,\n) {\n const renderIcon = useIconRenderer();\n const sizeToken = sizeStyles[size] ?? sizeStyles.md;\n const tokens = (toneTokens[tone] ?? toneTokens.neutral) as SelectToneTokens;\n const hasLeadingIcon = Boolean(leadingIcon);\n const showCaret = !hideCaret && !multiple;\n\n const renderVisual = (\n visual: string | React.ReactElement | undefined,\n iconClassName: string,\n ) => {\n if (!visual) {\n return null;\n }\n if (typeof visual === \"string\") {\n return renderIcon(visual, undefined, iconClassName);\n }\n if (React.isValidElement<{ className?: string }>(visual)) {\n return React.cloneElement(visual, {\n className: classNames(iconClassName, visual.props.className),\n });\n }\n return <span className={iconClassName}>{visual}</span>;\n };\n\n const baseClasses = classNames(\n \"block w-full appearance-none text-sm text-neutral-900 placeholder:text-neutral-400 focus:outline-none dark:text-neutral-100 dark:placeholder:text-neutral-500\",\n multiple ? \"py-2 pr-3\" : sizeToken.select,\n !unstyled &&\n \"rounded-lg border border-neutral-300 bg-white shadow-sm dark:border-neutral-700 dark:bg-neutral-900\",\n disabledClasses,\n className,\n );\n\n const statusClass =\n validationStatus !== \"none\" && !unstyled\n ? statusClasses[validationStatus]\n : undefined;\n\n const focusClass = !unstyled\n ? tokens.focusRing\n : \"focus:ring-0 focus:border-transparent\";\n\n const computed = classNames(\n baseClasses,\n focusClass,\n statusClass,\n multiple && \"min-h-[3.25rem]\",\n );\n\n const caret = useMemo(\n () =>\n showCaret ? (\n <span\n className={classNames(\n \"pointer-events-none absolute inset-y-0 flex items-center\",\n sizeToken.iconRight,\n tokens.icon,\n )}\n >\n {renderIcon(\"ArrowDown\", undefined, sizeToken.iconSize)}\n </span>\n ) : null,\n [\n showCaret,\n sizeToken.iconRight,\n sizeToken.iconSize,\n tokens.icon,\n renderIcon,\n ],\n );\n\n const leading = hasLeadingIcon ? (\n <span className=\"pointer-events-none absolute inset-y-0 left-3 flex items-center text-neutral-400 dark:text-neutral-500\">\n {renderVisual(leadingIcon, sizeToken.iconSize)}\n </span>\n ) : null;\n\n return (\n <span className=\"relative flex w-full items-center\">\n {leading}\n <select\n ref={ref}\n className={classNames(\n computed,\n hasLeadingIcon && !multiple && \"pl-9\",\n showCaret && !multiple && \"pr-10\",\n )}\n disabled={disabled}\n aria-invalid={\n validationStatus === \"error\" ? \"true\" : rest[\"aria-invalid\"]\n }\n {...rest}\n >\n {placeholder !== undefined && (\n <option value=\"\" disabled hidden>\n {placeholder}\n </option>\n )}\n {children}\n </select>\n {caret}\n </span>\n );\n});\n\nSelect.displayName = \"Select\";\n\n(Select as unknown as { __UI_SELECT?: boolean }).__UI_SELECT = true;\n\nexport default Select;\n","import React, { useState, useRef, useEffect, useMemo } from \"react\";\nimport classNames from \"classnames\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport IconButton from \"./IconButton\";\nimport { type TrueColor } from \"../theme/Theme\";\n\nconst toneTokens: Record<\n TrueColor,\n { focusRing: string; optionHover: string; optionSelected: string }\n> = {\n red: {\n focusRing:\n \"focus:border-rose-500 focus:ring-rose-200 dark:focus:border-rose-400 dark:focus:ring-rose-900/40\",\n optionHover:\n \"hover:bg-rose-50 hover:text-rose-700 dark:hover:bg-rose-900/30 dark:hover:text-rose-300\",\n optionSelected:\n \"bg-rose-50 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300\",\n },\n orange: {\n focusRing:\n \"focus:border-orange-500 focus:ring-orange-200 dark:focus:border-orange-400 dark:focus:ring-orange-900/40\",\n optionHover:\n \"hover:bg-orange-50 hover:text-orange-700 dark:hover:bg-orange-900/30 dark:hover:text-orange-300\",\n optionSelected:\n \"bg-orange-50 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300\",\n },\n amber: {\n focusRing:\n \"focus:border-amber-500 focus:ring-amber-200 dark:focus:border-amber-400 dark:focus:ring-amber-900/40\",\n optionHover:\n \"hover:bg-amber-50 hover:text-amber-700 dark:hover:bg-amber-900/30 dark:hover:text-amber-300\",\n optionSelected:\n \"bg-amber-50 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300\",\n },\n yellow: {\n focusRing:\n \"focus:border-yellow-500 focus:ring-yellow-200 dark:focus:border-yellow-400 dark:focus:ring-yellow-900/40\",\n optionHover:\n \"hover:bg-yellow-50 hover:text-yellow-700 dark:hover:bg-yellow-900/30 dark:hover:text-yellow-300\",\n optionSelected:\n \"bg-yellow-50 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300\",\n },\n lime: {\n focusRing:\n \"focus:border-lime-500 focus:ring-lime-200 dark:focus:border-lime-400 dark:focus:ring-lime-900/40\",\n optionHover:\n \"hover:bg-lime-50 hover:text-lime-700 dark:hover:bg-lime-900/30 dark:hover:text-lime-300\",\n optionSelected:\n \"bg-lime-50 text-lime-700 dark:bg-lime-900/30 dark:text-lime-300\",\n },\n green: {\n focusRing:\n \"focus:border-emerald-500 focus:ring-emerald-200 dark:focus:border-emerald-400 dark:focus:ring-emerald-900/40\",\n optionHover:\n \"hover:bg-emerald-50 hover:text-emerald-700 dark:hover:bg-emerald-900/30 dark:hover:text-emerald-300\",\n optionSelected:\n \"bg-emerald-50 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300\",\n },\n emerald: {\n focusRing:\n \"focus:border-emerald-500 focus:ring-emerald-200 dark:focus:border-emerald-400 dark:focus:ring-emerald-900/40\",\n optionHover:\n \"hover:bg-emerald-50 hover:text-emerald-700 dark:hover:bg-emerald-900/30 dark:hover:text-emerald-300\",\n optionSelected:\n \"bg-emerald-50 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300\",\n },\n teal: {\n focusRing:\n \"focus:border-teal-500 focus:ring-teal-200 dark:focus:border-teal-400 dark:focus:ring-teal-900/40\",\n optionHover:\n \"hover:bg-teal-50 hover:text-teal-700 dark:hover:bg-teal-900/30 dark:hover:text-teal-300\",\n optionSelected:\n \"bg-teal-50 text-teal-700 dark:bg-teal-900/30 dark:text-teal-300\",\n },\n cyan: {\n focusRing:\n \"focus:border-cyan-500 focus:ring-cyan-200 dark:focus:border-cyan-400 dark:focus:ring-cyan-900/40\",\n optionHover:\n \"hover:bg-cyan-50 hover:text-cyan-700 dark:hover:bg-cyan-900/30 dark:hover:text-cyan-300\",\n optionSelected:\n \"bg-cyan-50 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300\",\n },\n sky: {\n focusRing:\n \"focus:border-sky-500 focus:ring-sky-200 dark:focus:border-sky-400 dark:focus:ring-sky-900/40\",\n optionHover:\n \"hover:bg-sky-50 hover:text-sky-700 dark:hover:bg-sky-900/30 dark:hover:text-sky-300\",\n optionSelected:\n \"bg-sky-50 text-sky-700 dark:bg-sky-900/30 dark:text-sky-300\",\n },\n blue: {\n focusRing:\n \"focus:border-blue-500 focus:ring-blue-200 dark:focus:border-blue-400 dark:focus:ring-blue-900/40\",\n optionHover:\n \"hover:bg-blue-50 hover:text-blue-700 dark:hover:bg-blue-900/30 dark:hover:text-blue-300\",\n optionSelected:\n \"bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300\",\n },\n indigo: {\n focusRing:\n \"focus:border-indigo-500 focus:ring-indigo-200 dark:focus:border-indigo-400 dark:focus:ring-indigo-900/40\",\n optionHover:\n \"hover:bg-indigo-50 hover:text-indigo-700 dark:hover:bg-indigo-900/30 dark:hover:text-indigo-300\",\n optionSelected:\n \"bg-indigo-50 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300\",\n },\n violet: {\n focusRing:\n \"focus:border-violet-500 focus:ring-violet-200 dark:focus:border-violet-400 dark:focus:ring-violet-900/40\",\n optionHover:\n \"hover:bg-violet-50 hover:text-violet-700 dark:hover:bg-violet-900/30 dark:hover:text-violet-300\",\n optionSelected:\n \"bg-violet-50 text-violet-700 dark:bg-violet-900/30 dark:text-violet-300\",\n },\n purple: {\n focusRing:\n \"focus:border-purple-500 focus:ring-purple-200 dark:focus:border-purple-400 dark:focus:ring-purple-900/40\",\n optionHover:\n \"hover:bg-purple-50 hover:text-purple-700 dark:hover:bg-purple-900/30 dark:hover:text-purple-300\",\n optionSelected:\n \"bg-purple-50 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300\",\n },\n fuchsia: {\n focusRing:\n \"focus:border-fuchsia-500 focus:ring-fuchsia-200 dark:focus:border-fuchsia-400 dark:focus:ring-fuchsia-900/40\",\n optionHover:\n \"hover:bg-fuchsia-50 hover:text-fuchsia-700 dark:hover:bg-fuchsia-900/30 dark:hover:text-fuchsia-300\",\n optionSelected:\n \"bg-fuchsia-50 text-fuchsia-700 dark:bg-fuchsia-900/30 dark:text-fuchsia-300\",\n },\n rose: {\n focusRing:\n \"focus:border-rose-500 focus:ring-rose-200 dark:focus:border-rose-400 dark:focus:ring-rose-900/40\",\n optionHover:\n \"hover:bg-rose-50 hover:text-rose-700 dark:hover:bg-rose-900/30 dark:hover:text-rose-300\",\n optionSelected:\n \"bg-rose-50 text-rose-700 dark:bg-rose-900/30 dark:text-rose-300\",\n },\n slate: {\n focusRing:\n \"focus:border-slate-500 focus:ring-slate-200 dark:focus:border-slate-400 dark:focus:ring-slate-900/40\",\n optionHover:\n \"hover:bg-slate-50 hover:text-slate-700 dark:hover:bg-slate-900/30 dark:hover:text-slate-300\",\n optionSelected:\n \"bg-slate-50 text-slate-700 dark:bg-slate-900/30 dark:text-slate-300\",\n },\n gray: {\n focusRing:\n \"focus:border-gray-500 focus:ring-gray-200 dark:focus:border-gray-400 dark:focus:ring-gray-900/40\",\n optionHover:\n \"hover:bg-gray-50 hover:text-gray-700 dark:hover:bg-gray-900/30 dark:hover:text-gray-300\",\n optionSelected:\n \"bg-gray-50 text-gray-700 dark:bg-gray-900/30 dark:text-gray-300\",\n },\n zinc: {\n focusRing:\n \"focus:border-zinc-500 focus:ring-zinc-200 dark:focus:border-zinc-400 dark:focus:ring-zinc-900/40\",\n optionHover:\n \"hover:bg-zinc-50 hover:text-zinc-700 dark:hover:bg-zinc-900/30 dark:hover:text-zinc-300\",\n optionSelected:\n \"bg-zinc-50 text-zinc-700 dark:bg-zinc-900/30 dark:text-zinc-300\",\n },\n neutral: {\n focusRing:\n \"focus:border-neutral-500 focus:ring-neutral-200 dark:focus:border-neutral-400 dark:focus:ring-neutral-900/40\",\n optionHover:\n \"hover:bg-neutral-50 hover:text-neutral-700 dark:hover:bg-neutral-900/30 dark:hover:text-neutral-300\",\n optionSelected:\n \"bg-neutral-50 text-neutral-700 dark:bg-neutral-900/30 dark:text-neutral-300\",\n },\n stone: {\n focusRing:\n \"focus:border-stone-500 focus:ring-stone-200 dark:focus:border-stone-400 dark:focus:ring-stone-900/40\",\n optionHover:\n \"hover:bg-stone-50 hover:text-stone-700 dark:hover:bg-stone-900/30 dark:hover:text-stone-300\",\n optionSelected:\n \"bg-stone-50 text-stone-700 dark:bg-stone-900/30 dark:text-stone-300\",\n },};\n\nexport interface ComboboxProps {\n value?: string;\n onChange: (value: string) => void;\n options: string[];\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n emptyMessage?: string;\n color?: TrueColor;\n}\n\nexport const Combobox: React.FC<ComboboxProps> = ({\n value = \"\",\n onChange,\n options = [],\n placeholder,\n className,\n disabled = false,\n error = false,\n emptyMessage = \"No matching options found. You can keep typing to create a custom one.\",\n color = \"blue\",\n}) => {\n const renderIcon = useIconRenderer();\n const [isOpen, setIsOpen] = useState(false);\n const [filter, setFilter] = useState(\"\");\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const colorTokens = toneTokens[color] ?? toneTokens.neutral;\n\n useEffect(() => {\n setFilter(value);\n }, [value]);\n\n const filteredOptions = useMemo(() => {\n if (!filter) return options;\n const lowerFilter = filter.toLowerCase();\n return options.filter((opt) => opt.toLowerCase().includes(lowerFilter));\n }, [options, filter]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setFilter(newValue);\n onChange(newValue);\n setIsOpen(true);\n };\n\n const handleOptionClick = (option: string) => {\n onChange(option);\n setFilter(option);\n setIsOpen(false);\n };\n\n const handleInputFocus = () => {\n if (!disabled) {\n setIsOpen(true);\n }\n };\n\n return (\n <div\n ref={containerRef}\n className={classNames(\"relative w-full\", className)}\n >\n <div className=\"relative\">\n <input\n ref={inputRef}\n type=\"text\"\n value={filter}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n placeholder={placeholder}\n disabled={disabled}\n className={classNames(\n \"block w-full rounded-lg border px-3 py-2 text-sm shadow-sm focus:outline-none focus:ring-2 disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-500\",\n error\n ? \"border-red-300 focus:border-red-500 focus:ring-red-200\"\n : `border-gray-300 ${colorTokens.focusRing}`,\n )}\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-2\">\n {filter && !disabled && (\n <IconButton\n icon=\"Close\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-gray-400 hover:text-gray-600\"\n onClick={() => {\n onChange(\"\");\n setFilter(\"\");\n inputRef.current?.focus();\n }}\n aria-label=\"Clear\"\n />\n )}\n <div className=\"pointer-events-none text-gray-400 pl-1\">\n {renderIcon(\"ArrowDown\", \"sm\", \"h-4 w-4\")}\n </div>\n </div>\n </div>\n\n {isOpen && !disabled && (\n <div className=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 shadow-lg ring-1 ring-black/5 focus:outline-none dark:bg-neutral-800\">\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <div\n key={index}\n onClick={() => handleOptionClick(option)}\n className={classNames(\n `cursor-pointer px-4 py-2 text-sm ${colorTokens.optionHover}`,\n option === value\n ? `${colorTokens.optionSelected} font-medium`\n : \"text-gray-900 dark:text-gray-100\",\n )}\n >\n {option}\n </div>\n ))\n ) : (\n <div className=\"px-4 py-2 text-sm text-gray-500 italic dark:text-gray-400\">\n {emptyMessage}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n\nCombobox.displayName = \"Combobox\";\n\nexport default Combobox;\n","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\nimport Pill from \"./Pill\";\nimport { type TrueColor } from \"../theme/Theme\";\nimport type { TreeTone } from \"./TreeView/types\";\n\nconst toneTokens: Record<\n TrueColor,\n {\n triggerOpen: string;\n filterActive: string;\n optionSelectedBg: string;\n optionSelectedText: string;\n optionSelectedIcon: string;\n }\n> = {\n red: {\n triggerOpen: \"border-rose-500 ring-2 ring-rose-500/20 dark:border-rose-400\",\n filterActive:\n \"bg-rose-100 text-rose-600 dark:bg-rose-900/40 dark:text-rose-400\",\n optionSelectedBg: \"bg-rose-50 dark:bg-rose-900/20\",\n optionSelectedText: \"text-rose-700 dark:text-rose-300\",\n optionSelectedIcon: \"text-rose-500 dark:text-rose-400\",\n },\n orange: {\n triggerOpen:\n \"border-orange-500 ring-2 ring-orange-500/20 dark:border-orange-400\",\n filterActive:\n \"bg-orange-100 text-orange-600 dark:bg-orange-900/40 dark:text-orange-400\",\n optionSelectedBg: \"bg-orange-50 dark:bg-orange-900/20\",\n optionSelectedText: \"text-orange-700 dark:text-orange-300\",\n optionSelectedIcon: \"text-orange-500 dark:text-orange-400\",\n },\n amber: {\n triggerOpen:\n \"border-amber-500 ring-2 ring-amber-500/20 dark:border-amber-400\",\n filterActive:\n \"bg-amber-100 text-amber-600 dark:bg-amber-900/40 dark:text-amber-400\",\n optionSelectedBg: \"bg-amber-50 dark:bg-amber-900/20\",\n optionSelectedText: \"text-amber-700 dark:text-amber-300\",\n optionSelectedIcon: \"text-amber-500 dark:text-amber-400\",\n },\n yellow: {\n triggerOpen:\n \"border-yellow-500 ring-2 ring-yellow-500/20 dark:border-yellow-400\",\n filterActive:\n \"bg-yellow-100 text-yellow-600 dark:bg-yellow-900/40 dark:text-yellow-400\",\n optionSelectedBg: \"bg-yellow-50 dark:bg-yellow-900/20\",\n optionSelectedText: \"text-yellow-700 dark:text-yellow-300\",\n optionSelectedIcon: \"text-yellow-500 dark:text-yellow-400\",\n },\n lime: {\n triggerOpen: \"border-lime-500 ring-2 ring-lime-500/20 dark:border-lime-400\",\n filterActive:\n \"bg-lime-100 text-lime-600 dark:bg-lime-900/40 dark:text-lime-400\",\n optionSelectedBg: \"bg-lime-50 dark:bg-lime-900/20\",\n optionSelectedText: \"text-lime-700 dark:text-lime-300\",\n optionSelectedIcon: \"text-lime-500 dark:text-lime-400\",\n },\n green: {\n triggerOpen:\n \"border-emerald-500 ring-2 ring-emerald-500/20 dark:border-emerald-400\",\n filterActive:\n \"bg-emerald-100 text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400\",\n optionSelectedBg: \"bg-emerald-50 dark:bg-emerald-900/20\",\n optionSelectedText: \"text-emerald-700 dark:text-emerald-300\",\n optionSelectedIcon: \"text-emerald-500 dark:text-emerald-400\",\n },\n emerald: {\n triggerOpen:\n \"border-emerald-500 ring-2 ring-emerald-500/20 dark:border-emerald-400\",\n filterActive:\n \"bg-emerald-100 text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400\",\n optionSelectedBg: \"bg-emerald-50 dark:bg-emerald-900/20\",\n optionSelectedText: \"text-emerald-700 dark:text-emerald-300\",\n optionSelectedIcon: \"text-emerald-500 dark:text-emerald-400\",\n },\n teal: {\n triggerOpen: \"border-teal-500 ring-2 ring-teal-500/20 dark:border-teal-400\",\n filterActive:\n \"bg-teal-100 text-teal-600 dark:bg-teal-900/40 dark:text-teal-400\",\n optionSelectedBg: \"bg-teal-50 dark:bg-teal-900/20\",\n optionSelectedText: \"text-teal-700 dark:text-teal-300\",\n optionSelectedIcon: \"text-teal-500 dark:text-teal-400\",\n },\n cyan: {\n triggerOpen: \"border-cyan-500 ring-2 ring-cyan-500/20 dark:border-cyan-400\",\n filterActive:\n \"bg-cyan-100 text-cyan-600 dark:bg-cyan-900/40 dark:text-cyan-400\",\n optionSelectedBg: \"bg-cyan-50 dark:bg-cyan-900/20\",\n optionSelectedText: \"text-cyan-700 dark:text-cyan-300\",\n optionSelectedIcon: \"text-cyan-500 dark:text-cyan-400\",\n },\n sky: {\n triggerOpen: \"border-sky-500 ring-2 ring-sky-500/20 dark:border-sky-400\",\n filterActive:\n \"bg-sky-100 text-sky-600 dark:bg-sky-900/40 dark:text-sky-400\",\n optionSelectedBg: \"bg-sky-50 dark:bg-sky-900/20\",\n optionSelectedText: \"text-sky-700 dark:text-sky-300\",\n optionSelectedIcon: \"text-sky-500 dark:text-sky-400\",\n },\n blue: {\n triggerOpen: \"border-blue-500 ring-2 ring-blue-500/20 dark:border-blue-400\",\n filterActive:\n \"bg-blue-100 text-blue-600 dark:bg-blue-900/40 dark:text-blue-400\",\n optionSelectedBg: \"bg-blue-50 dark:bg-blue-900/20\",\n optionSelectedText: \"text-blue-700 dark:text-blue-300\",\n optionSelectedIcon: \"text-blue-500 dark:text-blue-400\",\n },\n indigo: {\n triggerOpen:\n \"border-indigo-500 ring-2 ring-indigo-500/20 dark:border-indigo-400\",\n filterActive:\n \"bg-indigo-100 text-indigo-600 dark:bg-indigo-900/40 dark:text-indigo-400\",\n optionSelectedBg: \"bg-indigo-50 dark:bg-indigo-900/20\",\n optionSelectedText: \"text-indigo-700 dark:text-indigo-300\",\n optionSelectedIcon: \"text-indigo-500 dark:text-indigo-400\",\n },\n violet: {\n triggerOpen:\n \"border-violet-500 ring-2 ring-violet-500/20 dark:border-violet-400\",\n filterActive:\n \"bg-violet-100 text-violet-600 dark:bg-violet-900/40 dark:text-violet-400\",\n optionSelectedBg: \"bg-violet-50 dark:bg-violet-900/20\",\n optionSelectedText: \"text-violet-700 dark:text-violet-300\",\n optionSelectedIcon: \"text-violet-500 dark:text-violet-400\",\n },\n purple: {\n triggerOpen:\n \"border-purple-500 ring-2 ring-purple-500/20 dark:border-purple-400\",\n filterActive:\n \"bg-purple-100 text-purple-600 dark:bg-purple-900/40 dark:text-purple-400\",\n optionSelectedBg: \"bg-purple-50 dark:bg-purple-900/20\",\n optionSelectedText: \"text-purple-700 dark:text-purple-300\",\n optionSelectedIcon: \"text-purple-500 dark:text-purple-400\",\n },\n fuchsia: {\n triggerOpen:\n \"border-fuchsia-500 ring-2 ring-fuchsia-500/20 dark:border-fuchsia-400\",\n filterActive:\n \"bg-fuchsia-100 text-fuchsia-600 dark:bg-fuchsia-900/40 dark:text-fuchsia-400\",\n optionSelectedBg: \"bg-fuchsia-50 dark:bg-fuchsia-900/20\",\n optionSelectedText: \"text-fuchsia-700 dark:text-fuchsia-300\",\n optionSelectedIcon: \"text-fuchsia-500 dark:text-fuchsia-400\",\n }, rose: {\n triggerOpen: \"border-rose-500 ring-2 ring-rose-500/20 dark:border-rose-400\",\n filterActive:\n \"bg-rose-100 text-rose-600 dark:bg-rose-900/40 dark:text-rose-400\",\n optionSelectedBg: \"bg-rose-50 dark:bg-rose-900/20\",\n optionSelectedText: \"text-rose-700 dark:text-rose-300\",\n optionSelectedIcon: \"text-rose-500 dark:text-rose-400\",\n },\n slate: {\n triggerOpen:\n \"border-slate-500 ring-2 ring-slate-500/20 dark:border-slate-400\",\n filterActive:\n \"bg-slate-100 text-slate-600 dark:bg-slate-900/40 dark:text-slate-400\",\n optionSelectedBg: \"bg-slate-50 dark:bg-slate-900/20\",\n optionSelectedText: \"text-slate-700 dark:text-slate-300\",\n optionSelectedIcon: \"text-slate-500 dark:text-slate-400\",\n },\n gray: {\n triggerOpen: \"border-gray-500 ring-2 ring-gray-500/20 dark:border-gray-400\",\n filterActive:\n \"bg-gray-100 text-gray-600 dark:bg-gray-900/40 dark:text-gray-400\",\n optionSelectedBg: \"bg-gray-50 dark:bg-gray-900/20\",\n optionSelectedText: \"text-gray-700 dark:text-gray-300\",\n optionSelectedIcon: \"text-gray-500 dark:text-gray-400\",\n },\n zinc: {\n triggerOpen: \"border-zinc-500 ring-2 ring-zinc-500/20 dark:border-zinc-400\",\n filterActive:\n \"bg-zinc-100 text-zinc-600 dark:bg-zinc-900/40 dark:text-zinc-400\",\n optionSelectedBg: \"bg-zinc-50 dark:bg-zinc-900/20\",\n optionSelectedText: \"text-zinc-700 dark:text-zinc-300\",\n optionSelectedIcon: \"text-zinc-500 dark:text-zinc-400\",\n },\n neutral: {\n triggerOpen:\n \"border-neutral-500 ring-2 ring-neutral-500/20 dark:border-neutral-400\",\n filterActive:\n \"bg-neutral-100 text-neutral-600 dark:bg-neutral-900/40 dark:text-neutral-400\",\n optionSelectedBg: \"bg-neutral-50 dark:bg-neutral-900/20\",\n optionSelectedText: \"text-neutral-700 dark:text-neutral-300\",\n optionSelectedIcon: \"text-neutral-500 dark:text-neutral-400\",\n },\n stone: {\n triggerOpen:\n \"border-stone-500 ring-2 ring-stone-500/20 dark:border-stone-400\",\n filterActive:\n \"bg-stone-100 text-stone-600 dark:bg-stone-900/40 dark:text-stone-400\",\n optionSelectedBg: \"bg-stone-50 dark:bg-stone-900/20\",\n optionSelectedText: \"text-stone-700 dark:text-stone-300\",\n optionSelectedIcon: \"text-stone-500 dark:text-stone-400\",\n },};\n\n// ── Shared positioning helpers (mirrors DropdownMenu) ─────────────────────────\n\ntype RectBounds = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n width: number;\n height: number;\n};\n\nconst viewportBounds = (): RectBounds => ({\n top: 0,\n left: 0,\n right: window.innerWidth,\n bottom: window.innerHeight,\n width: window.innerWidth,\n height: window.innerHeight,\n});\n\nconst isClippingParent = (el: HTMLElement): boolean =>\n /(auto|scroll|hidden|clip)/.test(\n [\n getComputedStyle(el).overflow,\n getComputedStyle(el).overflowX,\n getComputedStyle(el).overflowY,\n ].join(\" \"),\n );\n\nconst resolveBoundaryBounds = (anchor: HTMLElement): RectBounds => {\n let node: HTMLElement | null = anchor.parentElement;\n while (node && node !== document.body) {\n if (isClippingParent(node)) {\n const r = node.getBoundingClientRect();\n return {\n top: r.top,\n left: r.left,\n right: r.right,\n bottom: r.bottom,\n width: r.width,\n height: r.height,\n };\n }\n node = node.parentElement;\n }\n return viewportBounds();\n};\n\nconst resolveZIndex = (anchor: HTMLElement): number => {\n let node: HTMLElement | null = anchor;\n let highest: number | null = null;\n while (node && node !== document.body) {\n const z = getComputedStyle(node).zIndex;\n if (z && z !== \"auto\") {\n const n = Number(z);\n if (Number.isFinite(n))\n highest = highest === null ? n : Math.max(highest, n);\n }\n node = node.parentElement;\n }\n return Math.max(1, (highest ?? 20) + 1);\n};\n\nconst PORTAL_ROOT = typeof document !== \"undefined\" ? document.body : null;\nconst MAX_DROPDOWN_HEIGHT = 280;\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\nexport interface PickerTag {\n label: string;\n tone?: TreeTone;\n}\n\nexport interface PickerItem {\n id: string;\n /** Optional leading icon element */\n icon?: React.ReactNode;\n title: string;\n subtitle?: string;\n description?: string;\n /** Tags rendered as Pills at the trailing edge of each row */\n tags?: PickerTag[];\n}\n\nexport interface PickerFilter {\n /** Label shown on the filter toggle when active (e.g. \"Stopped\") */\n label: string;\n /** Predicate that returns true for items included in the filtered view */\n predicate: (item: PickerItem) => boolean;\n}\n\nexport interface PickerProps {\n items: PickerItem[];\n loading?: boolean;\n /** Single-select: the currently selected item id */\n selectedId?: string;\n /** Called when an item is clicked (single mode: closes dropdown; multi mode: toggles) */\n onSelect?: (item: PickerItem) => void;\n /** Placeholder shown on the trigger button when nothing is selected */\n placeholder?: string;\n /** Placeholder text inside the search input */\n searchPlaceholder?: string;\n emptyMessage?: string;\n loadingMessage?: string;\n /**\n * When provided, a filter toggle is shown that restricts the list to items\n * matching the predicate. The user can toggle it off to see all items.\n */\n defaultFilter?: PickerFilter;\n /**\n * When true, the dropdown ignores any clipping ancestor (e.g. a modal's\n * overflow container) and positions itself against the viewport instead.\n * Useful when the picker is inside a constrained modal or panel.\n * Default: false\n */\n escapeBoundary?: boolean;\n className?: string;\n color?: TrueColor;\n\n // ── Multi-select ────────────────────────────────────────────────────────\n /** Enable multi-select mode. Use selectedIds + onMultiChange instead of selectedId + onSelect. */\n multi?: boolean;\n /** Multi-select: the currently selected item ids */\n selectedIds?: string[];\n /** Called with the new selection array whenever the user toggles an item */\n onMultiChange?: (ids: string[]) => void;\n /** Max individual pills shown in the trigger before collapsing to \"N selected\". Default: 3 */\n maxPillsShown?: number;\n\n // ── Size ────────────────────────────────────────────────────────────────\n /** 'sm' renders a compact trigger suitable for toolbars. Default: 'md' */\n size?: \"sm\" | \"md\";\n\n /** When true, the picker fills all available horizontal space. Default: true */\n fullWidth?: boolean;\n /** When true, the picker fills all available vertical space. Default: false */\n fullHeight?: boolean;\n}\n\n// ── Picker ────────────────────────────────────────────────────────────────────\n\nconst Picker: React.FC<PickerProps> = ({\n items,\n loading = false,\n selectedId,\n onSelect,\n placeholder = \"Select an item…\",\n searchPlaceholder,\n emptyMessage = \"No items found.\",\n loadingMessage = \"Loading…\",\n defaultFilter,\n escapeBoundary = false,\n className,\n color = \"blue\",\n multi = false,\n selectedIds: selectedIdsProp,\n onMultiChange,\n maxPillsShown = 3,\n size = \"md\",\n fullWidth = true,\n fullHeight = false,\n}) => {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [filterActive, setFilterActive] = useState(true);\n const [style, setStyle] = useState<React.CSSProperties>();\n const [computedMaxHeight, setComputedMaxHeight] =\n useState(MAX_DROPDOWN_HEIGHT);\n const colorTokens = toneTokens[color] ?? toneTokens.neutral;\n\n // Normalised selection for both modes\n const effectiveSelectedIds = useMemo<string[]>(\n () => (multi ? (selectedIdsProp ?? []) : selectedId ? [selectedId] : []),\n [multi, selectedIdsProp, selectedId],\n );\n\n const selectedItem = useMemo(\n () => items.find((o) => o.id === selectedId),\n [items, selectedId],\n );\n\n const baseItems = useMemo(\n () =>\n filterActive && defaultFilter\n ? items.filter(defaultFilter.predicate)\n : items,\n [items, filterActive, defaultFilter],\n );\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return baseItems;\n return baseItems.filter(\n (item) =>\n item.title.toLowerCase().includes(q) ||\n (item.subtitle ?? \"\").toLowerCase().includes(q) ||\n (item.description ?? \"\").toLowerCase().includes(q) ||\n (item.tags ?? []).some((t) => t.label.toLowerCase().includes(q)),\n );\n }, [baseItems, query]);\n\n // ── Portal positioning ────────────────────────────────────────────────────\n\n const updatePosition = useCallback(() => {\n if (!open || !triggerRef.current || !dropdownRef.current) return;\n\n const anchorRect = triggerRef.current.getBoundingClientRect();\n const menuRect = dropdownRef.current.getBoundingClientRect();\n const boundary = escapeBoundary\n ? viewportBounds()\n : resolveBoundaryBounds(triggerRef.current);\n const zIndex = resolveZIndex(triggerRef.current);\n const offset = 4;\n const minMargin = 8;\n\n const computedWidth = Math.min(\n Math.max(anchorRect.width, menuRect.width),\n boundary.width - minMargin * 2,\n );\n const computedHeight = menuRect.height;\n\n const belowTop = anchorRect.bottom + offset;\n const aboveTop = anchorRect.top - offset - computedHeight;\n\n const overflowFor = (top: number) =>\n Math.max(0, boundary.top + minMargin - top) +\n Math.max(0, top + computedHeight - (boundary.bottom - minMargin));\n\n const isTopSide = overflowFor(aboveTop) < overflowFor(belowTop);\n const rawTop = isTopSide ? aboveTop : belowTop;\n const clampedTop = Math.min(\n Math.max(rawTop, boundary.top + minMargin),\n Math.max(\n boundary.top + minMargin,\n boundary.bottom - computedHeight - minMargin,\n ),\n );\n\n const availableSpace = isTopSide\n ? Math.max(120, anchorRect.top - offset - (boundary.top + minMargin))\n : Math.max(120, boundary.bottom - minMargin - belowTop);\n const nextMaxHeight = Math.min(MAX_DROPDOWN_HEIGHT, availableSpace);\n\n const startLeft = anchorRect.left;\n const clampedLeft = Math.min(\n Math.max(startLeft, boundary.left + minMargin),\n Math.max(\n boundary.left + minMargin,\n boundary.right - computedWidth - minMargin,\n ),\n );\n\n setComputedMaxHeight(Math.max(120, nextMaxHeight));\n setStyle({\n position: \"fixed\",\n top: clampedTop,\n left: clampedLeft,\n width: computedWidth,\n zIndex,\n });\n }, [open]);\n\n useLayoutEffect(() => {\n updatePosition();\n }, [updatePosition]);\n\n useEffect(() => {\n if (!open) {\n setStyle(undefined);\n return;\n }\n\n let frame = 0;\n const schedule = () => {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n updatePosition();\n frame = 0;\n });\n };\n\n window.addEventListener(\"resize\", schedule);\n window.addEventListener(\"scroll\", schedule, true);\n const ro =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(schedule)\n : undefined;\n if (ro) {\n if (triggerRef.current) ro.observe(triggerRef.current);\n if (dropdownRef.current) ro.observe(dropdownRef.current);\n }\n schedule();\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", schedule);\n window.removeEventListener(\"scroll\", schedule, true);\n ro?.disconnect();\n };\n }, [open, updatePosition]);\n\n // ── Click-outside & Escape ────────────────────────────────────────────────\n\n useEffect(() => {\n if (!open) return;\n const handlePointer = (e: MouseEvent) => {\n if (\n dropdownRef.current?.contains(e.target as Node) ||\n triggerRef.current?.contains(e.target as Node)\n )\n return;\n setOpen(false);\n setQuery(\"\");\n };\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"pointerdown\", handlePointer);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointer);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [open]);\n\n useEffect(() => {\n if (open) requestAnimationFrame(() => searchRef.current?.focus());\n }, [open]);\n\n const handleSelect = (item: PickerItem) => {\n if (multi) {\n const next = effectiveSelectedIds.includes(item.id)\n ? effectiveSelectedIds.filter((id) => id !== item.id)\n : [...effectiveSelectedIds, item.id];\n onMultiChange?.(next);\n // Keep dropdown open in multi mode\n } else {\n onSelect?.(item);\n setOpen(false);\n setQuery(\"\");\n }\n };\n\n const handleClearMulti = () => {\n onMultiChange?.([]);\n };\n\n // ── Derived search placeholder ────────────────────────────────────────────\n\n const resolvedSearchPlaceholder =\n searchPlaceholder ??\n (defaultFilter\n ? filterActive\n ? `Search ${defaultFilter.label.toLowerCase()} items…`\n : \"Search all items…\"\n : \"Search…\");\n\n // ── Dropdown portal ───────────────────────────────────────────────────────\n\n const dropdown =\n open && PORTAL_ROOT\n ? createPortal(\n <div\n ref={dropdownRef}\n style={style ?? { visibility: \"hidden\" }}\n className={classNames(\n \"fixed overflow-hidden rounded-lg border border-neutral-200 bg-white shadow-xl ring-1 ring-black/5 dark:border-neutral-700 dark:bg-neutral-900\",\n !style && \"invisible opacity-0\",\n )}\n >\n {/* Search + filter row */}\n <div className=\"flex items-center gap-2 border-b border-neutral-100 px-3 py-2 dark:border-neutral-800\">\n <svg\n className=\"h-4 w-4 shrink-0 text-neutral-400\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path strokeLinecap=\"round\" d=\"m21 21-4.35-4.35\" />\n </svg>\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) =>\n e.key === \"Escape\" && (setOpen(false), setQuery(\"\"))\n }\n placeholder={resolvedSearchPlaceholder}\n className=\"min-w-0 flex-1 bg-transparent text-sm text-neutral-700 placeholder:text-neutral-400 focus:outline-none dark:text-neutral-200 dark:placeholder:text-neutral-500\"\n />\n {query && (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setQuery(\"\")}\n className=\"shrink-0 text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300\"\n >\n <svg\n className=\"h-3.5 w-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n )}\n {defaultFilter && (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setFilterActive((v) => !v)}\n className={classNames(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors\",\n filterActive\n ? colorTokens.filterActive\n : \"bg-neutral-100 text-neutral-500 hover:bg-neutral-200 dark:bg-neutral-800 dark:text-neutral-400\",\n )}\n >\n {filterActive ? defaultFilter.label : \"All\"}\n </button>\n )}\n </div>\n\n {/* Option list */}\n <ul\n className=\"divide-y divide-neutral-50 overflow-y-auto dark:divide-neutral-800/60\"\n style={{ maxHeight: computedMaxHeight }}\n >\n {/* Multi-select clear row */}\n {multi && effectiveSelectedIds.length > 0 && (\n <li\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClearMulti}\n className=\"flex cursor-pointer select-none items-center justify-between px-4 py-1.5 text-xs text-neutral-400 hover:bg-neutral-50 dark:hover:bg-neutral-800/60 dark:text-neutral-500 border-b border-neutral-100 dark:border-neutral-800\"\n >\n <span>{effectiveSelectedIds.length} selected</span>\n <span className=\"text-rose-500 dark:text-rose-400 hover:underline\">\n Clear\n </span>\n </li>\n )}\n {filtered.length === 0 ? (\n <li className=\"px-4 py-5 text-center text-sm text-neutral-400 dark:text-neutral-500\">\n {baseItems.length === 0\n ? emptyMessage\n : \"No items match your search.\"}\n </li>\n ) : (\n filtered.map((item) => {\n const isSelected = effectiveSelectedIds.includes(item.id);\n return (\n <li\n key={item.id}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => handleSelect(item)}\n className={classNames(\n \"flex cursor-pointer select-none items-center gap-3 px-4 py-2.5 transition-colors\",\n isSelected\n ? colorTokens.optionSelectedBg\n : \"hover:bg-neutral-50 dark:hover:bg-neutral-800/60\",\n )}\n >\n {/* Multi: always show checkbox. Single: only show checkmark for selected item. */}\n {multi ? (\n <span\n className={classNames(\n \"flex h-4 w-4 shrink-0 items-center justify-center rounded border transition-colors\",\n isSelected\n ? classNames(\n colorTokens.optionSelectedBg,\n \"border-current\",\n colorTokens.optionSelectedIcon,\n )\n : \"border-neutral-300 dark:border-neutral-600\",\n )}\n >\n {isSelected && (\n <svg\n className={classNames(\n \"h-3.5 w-3.5\",\n colorTokens.optionSelectedIcon,\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m5 13 4 4L19 7\"\n />\n </svg>\n )}\n </span>\n ) : isSelected ? (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <svg\n className={classNames(\n \"h-3.5 w-3.5\",\n colorTokens.optionSelectedIcon,\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m5 13 4 4L19 7\"\n />\n </svg>\n </span>\n ) : null}\n\n {/* Icon */}\n {item.icon && (\n <span\n className={classNames(\n \"shrink-0\",\n isSelected\n ? colorTokens.optionSelectedIcon\n : \"text-neutral-400 dark:text-neutral-500\",\n )}\n >\n {item.icon}\n </span>\n )}\n\n {/* Title + subtitle + description */}\n <div className=\"min-w-0 flex-1\">\n <p\n className={classNames(\n \"truncate text-sm font-medium\",\n isSelected\n ? colorTokens.optionSelectedText\n : \"text-neutral-800 dark:text-neutral-200\",\n )}\n >\n {item.title}\n </p>\n {item.subtitle && (\n <p className=\"truncate text-xs text-neutral-400 dark:text-neutral-500\">\n {item.subtitle}\n </p>\n )}\n {item.description && (\n <p className=\"truncate text-xs text-neutral-400 dark:text-neutral-500 mt-0.5\">\n {item.description}\n </p>\n )}\n </div>\n\n {/* Tags */}\n {item.tags && item.tags.length > 0 && (\n <div className=\"flex shrink-0 flex-wrap gap-1\">\n {item.tags.map((tag, ti) => (\n <Pill\n key={ti}\n size=\"sm\"\n tone={tag.tone ?? \"neutral\"}\n variant=\"soft\"\n >\n {tag.label}\n </Pill>\n ))}\n </div>\n )}\n </li>\n );\n })\n )}\n </ul>\n </div>,\n PORTAL_ROOT,\n )\n : null;\n\n // ── Size tokens ───────────────────────────────────────────────────────────\n\n const sm = size === \"sm\";\n const triggerPadding = sm ? \"px-2 py-1\" : \"px-3 py-2.5\";\n const triggerText = sm ? \"text-xs\" : \"text-sm\";\n const triggerGap = sm ? \"gap-1.5\" : \"gap-3\";\n const triggerRadius = \"rounded-lg\";\n const chevronSize = sm ? \"h-3 w-3\" : \"h-4 w-4\";\n\n // ── Multi trigger content ─────────────────────────────────────────────────\n\n const multiTriggerContent = multi\n ? (() => {\n if (effectiveSelectedIds.length === 0) {\n return (\n <span\n className={classNames(\n \"flex-1\",\n triggerText,\n \"text-neutral-400 dark:text-neutral-500\",\n )}\n >\n {placeholder}\n </span>\n );\n }\n const visibleIds = effectiveSelectedIds.slice(0, maxPillsShown);\n const overflow = effectiveSelectedIds.length - visibleIds.length;\n return (\n <div className=\"flex flex-1 min-w-0 flex-wrap gap-1\">\n {visibleIds.map((id) => {\n const it = items.find((o) => o.id === id);\n if (!it) return null;\n return (\n <span\n key={id}\n className={classNames(\n \"inline-flex items-center rounded px-1.5 py-0.5 font-medium leading-none\",\n sm ? \"text-[10px]\" : \"text-xs\",\n colorTokens.filterActive,\n )}\n >\n {it.title}\n </span>\n );\n })}\n {overflow > 0 && (\n <span\n className={classNames(\n \"inline-flex items-center rounded px-1.5 py-0.5 font-medium leading-none\",\n sm ? \"text-[10px]\" : \"text-xs\",\n \"bg-neutral-100 text-neutral-500 dark:bg-neutral-700/50 dark:text-neutral-400\",\n )}\n >\n +{overflow}\n </span>\n )}\n </div>\n );\n })()\n : null;\n\n // ── Trigger button ────────────────────────────────────────────────────────\n\n return (\n <div\n className={classNames(\n fullWidth ? \"w-full\" : \"w-fit\",\n fullHeight && \"h-full\",\n )}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n onClick={() => setOpen((prev) => !prev)}\n className={classNames(\n \"flex w-full items-center border text-left transition-colors bg-white dark:bg-neutral-900\",\n fullHeight && \"h-full\",\n triggerPadding,\n triggerText,\n triggerGap,\n triggerRadius,\n open\n ? colorTokens.triggerOpen\n : \"border-neutral-300 hover:border-neutral-400 dark:border-neutral-600 dark:hover:border-neutral-500\",\n className,\n )}\n >\n {loading ? (\n <>\n <svg\n className=\"h-4 w-4 animate-spin shrink-0 text-neutral-400\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span className={classNames(triggerText, \"text-neutral-400\")}>\n {loadingMessage}\n </span>\n </>\n ) : multi ? (\n multiTriggerContent\n ) : selectedItem ? (\n <>\n {selectedItem.icon && (\n <span className=\"shrink-0 text-neutral-500 dark:text-neutral-400\">\n {selectedItem.icon}\n </span>\n )}\n <div className=\"min-w-0 flex-1\">\n <span\n className={classNames(\n \"block truncate font-medium text-neutral-800 dark:text-neutral-100\",\n triggerText,\n )}\n >\n {selectedItem.title}\n </span>\n {selectedItem.subtitle && (\n <span className=\"block truncate text-xs text-neutral-400 dark:text-neutral-500\">\n {selectedItem.subtitle}\n </span>\n )}\n </div>\n {selectedItem.tags && selectedItem.tags.length > 0 && (\n <div className=\"flex shrink-0 flex-wrap gap-1\">\n {selectedItem.tags.map((tag, ti) => (\n <Pill\n key={ti}\n size=\"sm\"\n tone={tag.tone ?? \"neutral\"}\n variant=\"soft\"\n >\n {tag.label}\n </Pill>\n ))}\n </div>\n )}\n </>\n ) : (\n <span\n className={classNames(\n \"flex-1\",\n triggerText,\n \"text-neutral-400 dark:text-neutral-500\",\n )}\n >\n {placeholder}\n </span>\n )}\n\n {/* Chevron */}\n <svg\n className={classNames(\n chevronSize,\n \"shrink-0 text-neutral-400 transition-transform\",\n open && \"rotate-180\",\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n {dropdown}\n </div>\n );\n};\n\nPicker.displayName = \"Picker\";\n\nexport { Picker };\nexport default Picker;\n","import React, {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\nimport Pill from \"./Pill\";\nimport type { TrueColor } from \"../theme/Theme\";\nimport type { PickerTag } from \"./Picker\";\n\n// ── Tone tokens (mirrors Picker) ──────────────────────────────────────────────\n\nconst toneTokens: Record<\n TrueColor,\n {\n triggerOpen: string;\n optionSelectedBg: string;\n optionSelectedText: string;\n optionSelectedIcon: string;\n focusedBg: string;\n createRowIcon: string;\n createRowLabel: string;\n }\n> = {\n red: {\n triggerOpen: \"border-rose-500 ring-2 ring-rose-500/20 dark:border-rose-400\",\n optionSelectedBg: \"bg-rose-50 dark:bg-rose-900/20\",\n optionSelectedText: \"text-rose-700 dark:text-rose-300\",\n optionSelectedIcon: \"text-rose-500 dark:text-rose-400\",\n focusedBg: \"bg-rose-50/60 dark:bg-rose-900/10\",\n createRowIcon: \"text-rose-500 dark:text-rose-400\",\n createRowLabel: \"text-rose-700 dark:text-rose-300\",\n },\n orange: {\n triggerOpen:\n \"border-orange-500 ring-2 ring-orange-500/20 dark:border-orange-400\",\n optionSelectedBg: \"bg-orange-50 dark:bg-orange-900/20\",\n optionSelectedText: \"text-orange-700 dark:text-orange-300\",\n optionSelectedIcon: \"text-orange-500 dark:text-orange-400\",\n focusedBg: \"bg-orange-50/60 dark:bg-orange-900/10\",\n createRowIcon: \"text-orange-500 dark:text-orange-400\",\n createRowLabel: \"text-orange-700 dark:text-orange-300\",\n },\n amber: {\n triggerOpen:\n \"border-amber-500 ring-2 ring-amber-500/20 dark:border-amber-400\",\n optionSelectedBg: \"bg-amber-50 dark:bg-amber-900/20\",\n optionSelectedText: \"text-amber-700 dark:text-amber-300\",\n optionSelectedIcon: \"text-amber-500 dark:text-amber-400\",\n focusedBg: \"bg-amber-50/60 dark:bg-amber-900/10\",\n createRowIcon: \"text-amber-500 dark:text-amber-400\",\n createRowLabel: \"text-amber-700 dark:text-amber-300\",\n },\n yellow: {\n triggerOpen:\n \"border-yellow-500 ring-2 ring-yellow-500/20 dark:border-yellow-400\",\n optionSelectedBg: \"bg-yellow-50 dark:bg-yellow-900/20\",\n optionSelectedText: \"text-yellow-700 dark:text-yellow-300\",\n optionSelectedIcon: \"text-yellow-500 dark:text-yellow-400\",\n focusedBg: \"bg-yellow-50/60 dark:bg-yellow-900/10\",\n createRowIcon: \"text-yellow-500 dark:text-yellow-400\",\n createRowLabel: \"text-yellow-700 dark:text-yellow-300\",\n },\n lime: {\n triggerOpen: \"border-lime-500 ring-2 ring-lime-500/20 dark:border-lime-400\",\n optionSelectedBg: \"bg-lime-50 dark:bg-lime-900/20\",\n optionSelectedText: \"text-lime-700 dark:text-lime-300\",\n optionSelectedIcon: \"text-lime-500 dark:text-lime-400\",\n focusedBg: \"bg-lime-50/60 dark:bg-lime-900/10\",\n createRowIcon: \"text-lime-500 dark:text-lime-400\",\n createRowLabel: \"text-lime-700 dark:text-lime-300\",\n },\n green: {\n triggerOpen:\n \"border-emerald-500 ring-2 ring-emerald-500/20 dark:border-emerald-400\",\n optionSelectedBg: \"bg-emerald-50 dark:bg-emerald-900/20\",\n optionSelectedText: \"text-emerald-700 dark:text-emerald-300\",\n optionSelectedIcon: \"text-emerald-500 dark:text-emerald-400\",\n focusedBg: \"bg-emerald-50/60 dark:bg-emerald-900/10\",\n createRowIcon: \"text-emerald-500 dark:text-emerald-400\",\n createRowLabel: \"text-emerald-700 dark:text-emerald-300\",\n },\n emerald: {\n triggerOpen:\n \"border-emerald-500 ring-2 ring-emerald-500/20 dark:border-emerald-400\",\n optionSelectedBg: \"bg-emerald-50 dark:bg-emerald-900/20\",\n optionSelectedText: \"text-emerald-700 dark:text-emerald-300\",\n optionSelectedIcon: \"text-emerald-500 dark:text-emerald-400\",\n focusedBg: \"bg-emerald-50/60 dark:bg-emerald-900/10\",\n createRowIcon: \"text-emerald-500 dark:text-emerald-400\",\n createRowLabel: \"text-emerald-700 dark:text-emerald-300\",\n },\n teal: {\n triggerOpen: \"border-teal-500 ring-2 ring-teal-500/20 dark:border-teal-400\",\n optionSelectedBg: \"bg-teal-50 dark:bg-teal-900/20\",\n optionSelectedText: \"text-teal-700 dark:text-teal-300\",\n optionSelectedIcon: \"text-teal-500 dark:text-teal-400\",\n focusedBg: \"bg-teal-50/60 dark:bg-teal-900/10\",\n createRowIcon: \"text-teal-500 dark:text-teal-400\",\n createRowLabel: \"text-teal-700 dark:text-teal-300\",\n },\n cyan: {\n triggerOpen: \"border-cyan-500 ring-2 ring-cyan-500/20 dark:border-cyan-400\",\n optionSelectedBg: \"bg-cyan-50 dark:bg-cyan-900/20\",\n optionSelectedText: \"text-cyan-700 dark:text-cyan-300\",\n optionSelectedIcon: \"text-cyan-500 dark:text-cyan-400\",\n focusedBg: \"bg-cyan-50/60 dark:bg-cyan-900/10\",\n createRowIcon: \"text-cyan-500 dark:text-cyan-400\",\n createRowLabel: \"text-cyan-700 dark:text-cyan-300\",\n },\n sky: {\n triggerOpen: \"border-sky-500 ring-2 ring-sky-500/20 dark:border-sky-400\",\n optionSelectedBg: \"bg-sky-50 dark:bg-sky-900/20\",\n optionSelectedText: \"text-sky-700 dark:text-sky-300\",\n optionSelectedIcon: \"text-sky-500 dark:text-sky-400\",\n focusedBg: \"bg-sky-50/60 dark:bg-sky-900/10\",\n createRowIcon: \"text-sky-500 dark:text-sky-400\",\n createRowLabel: \"text-sky-700 dark:text-sky-300\",\n },\n blue: {\n triggerOpen: \"border-blue-500 ring-2 ring-blue-500/20 dark:border-blue-400\",\n optionSelectedBg: \"bg-blue-50 dark:bg-blue-900/20\",\n optionSelectedText: \"text-blue-700 dark:text-blue-300\",\n optionSelectedIcon: \"text-blue-500 dark:text-blue-400\",\n focusedBg: \"bg-blue-50/60 dark:bg-blue-900/10\",\n createRowIcon: \"text-blue-500 dark:text-blue-400\",\n createRowLabel: \"text-blue-700 dark:text-blue-300\",\n },\n indigo: {\n triggerOpen:\n \"border-indigo-500 ring-2 ring-indigo-500/20 dark:border-indigo-400\",\n optionSelectedBg: \"bg-indigo-50 dark:bg-indigo-900/20\",\n optionSelectedText: \"text-indigo-700 dark:text-indigo-300\",\n optionSelectedIcon: \"text-indigo-500 dark:text-indigo-400\",\n focusedBg: \"bg-indigo-50/60 dark:bg-indigo-900/10\",\n createRowIcon: \"text-indigo-500 dark:text-indigo-400\",\n createRowLabel: \"text-indigo-700 dark:text-indigo-300\",\n },\n violet: {\n triggerOpen:\n \"border-violet-500 ring-2 ring-violet-500/20 dark:border-violet-400\",\n optionSelectedBg: \"bg-violet-50 dark:bg-violet-900/20\",\n optionSelectedText: \"text-violet-700 dark:text-violet-300\",\n optionSelectedIcon: \"text-violet-500 dark:text-violet-400\",\n focusedBg: \"bg-violet-50/60 dark:bg-violet-900/10\",\n createRowIcon: \"text-violet-500 dark:text-violet-400\",\n createRowLabel: \"text-violet-700 dark:text-violet-300\",\n },\n purple: {\n triggerOpen:\n \"border-purple-500 ring-2 ring-purple-500/20 dark:border-purple-400\",\n optionSelectedBg: \"bg-purple-50 dark:bg-purple-900/20\",\n optionSelectedText: \"text-purple-700 dark:text-purple-300\",\n optionSelectedIcon: \"text-purple-500 dark:text-purple-400\",\n focusedBg: \"bg-purple-50/60 dark:bg-purple-900/10\",\n createRowIcon: \"text-purple-500 dark:text-purple-400\",\n createRowLabel: \"text-purple-700 dark:text-purple-300\",\n },\n fuchsia: {\n triggerOpen:\n \"border-fuchsia-500 ring-2 ring-fuchsia-500/20 dark:border-fuchsia-400\",\n optionSelectedBg: \"bg-fuchsia-50 dark:bg-fuchsia-900/20\",\n optionSelectedText: \"text-fuchsia-700 dark:text-fuchsia-300\",\n optionSelectedIcon: \"text-fuchsia-500 dark:text-fuchsia-400\",\n focusedBg: \"bg-fuchsia-50/60 dark:bg-fuchsia-900/10\",\n createRowIcon: \"text-fuchsia-500 dark:text-fuchsia-400\",\n createRowLabel: \"text-fuchsia-700 dark:text-fuchsia-300\",\n }, rose: {\n triggerOpen: \"border-rose-500 ring-2 ring-rose-500/20 dark:border-rose-400\",\n optionSelectedBg: \"bg-rose-50 dark:bg-rose-900/20\",\n optionSelectedText: \"text-rose-700 dark:text-rose-300\",\n optionSelectedIcon: \"text-rose-500 dark:text-rose-400\",\n focusedBg: \"bg-rose-50/60 dark:bg-rose-900/10\",\n createRowIcon: \"text-rose-500 dark:text-rose-400\",\n createRowLabel: \"text-rose-700 dark:text-rose-300\",\n },\n slate: {\n triggerOpen:\n \"border-slate-500 ring-2 ring-slate-500/20 dark:border-slate-400\",\n optionSelectedBg: \"bg-slate-50 dark:bg-slate-900/20\",\n optionSelectedText: \"text-slate-700 dark:text-slate-300\",\n optionSelectedIcon: \"text-slate-500 dark:text-slate-400\",\n focusedBg: \"bg-slate-50/60 dark:bg-slate-900/10\",\n createRowIcon: \"text-slate-500 dark:text-slate-400\",\n createRowLabel: \"text-slate-700 dark:text-slate-300\",\n },\n gray: {\n triggerOpen: \"border-gray-500 ring-2 ring-gray-500/20 dark:border-gray-400\",\n optionSelectedBg: \"bg-gray-50 dark:bg-gray-900/20\",\n optionSelectedText: \"text-gray-700 dark:text-gray-300\",\n optionSelectedIcon: \"text-gray-500 dark:text-gray-400\",\n focusedBg: \"bg-gray-50/60 dark:bg-gray-900/10\",\n createRowIcon: \"text-gray-500 dark:text-gray-400\",\n createRowLabel: \"text-gray-700 dark:text-gray-300\",\n },\n zinc: {\n triggerOpen: \"border-zinc-500 ring-2 ring-zinc-500/20 dark:border-zinc-400\",\n optionSelectedBg: \"bg-zinc-50 dark:bg-zinc-900/20\",\n optionSelectedText: \"text-zinc-700 dark:text-zinc-300\",\n optionSelectedIcon: \"text-zinc-500 dark:text-zinc-400\",\n focusedBg: \"bg-zinc-50/60 dark:bg-zinc-900/10\",\n createRowIcon: \"text-zinc-500 dark:text-zinc-400\",\n createRowLabel: \"text-zinc-700 dark:text-zinc-300\",\n },\n neutral: {\n triggerOpen:\n \"border-neutral-500 ring-2 ring-neutral-500/20 dark:border-neutral-400\",\n optionSelectedBg: \"bg-neutral-100 dark:bg-neutral-800\",\n optionSelectedText: \"text-neutral-700 dark:text-neutral-300\",\n optionSelectedIcon: \"text-neutral-500 dark:text-neutral-400\",\n focusedBg: \"bg-neutral-50 dark:bg-neutral-800/60\",\n createRowIcon: \"text-neutral-500 dark:text-neutral-400\",\n createRowLabel: \"text-neutral-700 dark:text-neutral-300\",\n },\n stone: {\n triggerOpen:\n \"border-stone-500 ring-2 ring-stone-500/20 dark:border-stone-400\",\n optionSelectedBg: \"bg-stone-50 dark:bg-stone-900/20\",\n optionSelectedText: \"text-stone-700 dark:text-stone-300\",\n optionSelectedIcon: \"text-stone-500 dark:text-stone-400\",\n focusedBg: \"bg-stone-50/60 dark:bg-stone-900/10\",\n createRowIcon: \"text-stone-500 dark:text-stone-400\",\n createRowLabel: \"text-stone-700 dark:text-stone-300\",\n },\n};\n\n// ── Shared positioning helpers (mirrors Picker) ───────────────────────────────\n\ntype RectBounds = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n width: number;\n height: number;\n};\n\nconst viewportBounds = (): RectBounds => ({\n top: 0,\n left: 0,\n right: window.innerWidth,\n bottom: window.innerHeight,\n width: window.innerWidth,\n height: window.innerHeight,\n});\n\nconst isClippingParent = (el: HTMLElement): boolean =>\n /(auto|scroll|hidden|clip)/.test(\n [\n getComputedStyle(el).overflow,\n getComputedStyle(el).overflowX,\n getComputedStyle(el).overflowY,\n ].join(\" \"),\n );\n\nconst resolveBoundaryBounds = (anchor: HTMLElement): RectBounds => {\n let node: HTMLElement | null = anchor.parentElement;\n while (node && node !== document.body) {\n if (isClippingParent(node)) {\n const r = node.getBoundingClientRect();\n return {\n top: r.top,\n left: r.left,\n right: r.right,\n bottom: r.bottom,\n width: r.width,\n height: r.height,\n };\n }\n node = node.parentElement;\n }\n return viewportBounds();\n};\n\nconst resolveZIndex = (anchor: HTMLElement): number => {\n let node: HTMLElement | null = anchor;\n let highest: number | null = null;\n while (node && node !== document.body) {\n const z = getComputedStyle(node).zIndex;\n if (z && z !== \"auto\") {\n const n = Number(z);\n if (Number.isFinite(n))\n highest = highest === null ? n : Math.max(highest, n);\n }\n node = node.parentElement;\n }\n return Math.max(1, (highest ?? 20) + 1);\n};\n\nconst PORTAL_ROOT = typeof document !== \"undefined\" ? document.body : null;\nconst MAX_DROPDOWN_HEIGHT = 280;\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\n/** A known option in the dropdown list */\nexport interface TagPickerItem {\n id: string;\n label: string;\n /** Optional leading icon */\n icon?: React.ReactNode;\n /** Optional Pills rendered at the trailing edge of each row */\n tags?: PickerTag[];\n}\n\nexport interface TagPickerProps {\n /** Known options shown in the dropdown */\n items: TagPickerItem[];\n /**\n * Controlled array of selected values.\n * For known items this is the item's `id`.\n * For free-text entries created via `allowCreate`, this is the raw text itself.\n */\n value: string[];\n onChange: (values: string[]) => void;\n /**\n * Show a \"Create '…'\" row when the search query doesn't match any existing item.\n * Default: false\n */\n allowCreate?: boolean;\n /**\n * Called when the user confirms a new free-text value.\n * If omitted, the raw text is added to value[] directly via onChange.\n */\n onCreateItem?: (label: string) => void;\n /**\n * When false, behaves as single-select: picking a new item replaces the current value.\n * Default: true (multi-select with tag pills)\n */\n multi?: boolean;\n /** Placeholder shown in the trigger when nothing is selected */\n placeholder?: string;\n /** Placeholder inside the search input */\n searchPlaceholder?: string;\n emptyMessage?: string;\n loading?: boolean;\n loadingMessage?: string;\n color?: TrueColor;\n itemColor?: TrueColor;\n /**\n * When true, the dropdown positions against the viewport instead of a clipping ancestor.\n * Useful when the component is inside a modal or constrained panel.\n * Default: false\n */\n escapeBoundary?: boolean;\n /**\n * Maximum number of tag pills shown before a \"+N\" overflow pill appears.\n * Set to 0 or undefined to show all tags. Default: 3\n */\n tagLimit?: number;\n /**\n * When true, items added during this session (not present in the initial value)\n * are highlighted with an emerald color cue — both in the trigger pills and in\n * the dropdown list. Default: true\n */\n highlightNew?: boolean;\n className?: string;\n disabled?: boolean;\n /** When true, hides the remove (×) button on tag pills and prevents adding/removing items via the dropdown. @default false */\n readOnly?: boolean;\n /**\n * Optional function to normalize a value before it is added.\n * Applied to both free-text creations and known-item selections.\n * The return value is what gets stored in `value[]`.\n * Example: `(v) => v.toUpperCase()`\n */\n normalizeValue?: (value: string) => string;\n}\n\n// ── TagPicker ─────────────────────────────────────────────────────────────────\n\nconst TagPicker: React.FC<TagPickerProps> = ({\n items,\n value,\n onChange,\n allowCreate = false,\n onCreateItem,\n multi = true,\n placeholder = \"Select…\",\n searchPlaceholder = \"Search…\",\n emptyMessage = \"No items found.\",\n loading = false,\n loadingMessage = \"Loading…\",\n color = \"blue\",\n itemColor = null,\n escapeBoundary = false,\n tagLimit = 3,\n highlightNew = true,\n className,\n disabled = false,\n readOnly = false,\n normalizeValue,\n}) => {\n const uid = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const [style, setStyle] = useState<React.CSSProperties>();\n const [computedMaxHeight, setComputedMaxHeight] =\n useState(MAX_DROPDOWN_HEIGHT);\n const [showAllTags, setShowAllTags] = useState(false);\n\n const colorTokens = toneTokens[color] ?? toneTokens.blue;\n if (!itemColor) {\n itemColor = color;\n }\n\n // ── Session-new tracking ───────────────────────────────────────────────────\n\n const initialValueRef = useRef<Set<string>>(new Set(value));\n\n const sessionAddedSet = useMemo(\n () =>\n highlightNew\n ? new Set(value.filter((v) => !initialValueRef.current.has(v)))\n : new Set<string>(),\n [value, highlightNew],\n );\n\n // ── Derived ────────────────────────────────────────────────────────────────\n\n const selectedSet = useMemo(() => new Set(value), [value]);\n\n const labelFor = useCallback(\n (v: string): string => items.find((i) => i.id === v)?.label ?? v,\n [items],\n );\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return items;\n return items.filter(\n (item) =>\n item.label.toLowerCase().includes(q) ||\n (item.tags ?? []).some((t) => t.label.toLowerCase().includes(q)),\n );\n }, [items, query]);\n\n const showCreate = useMemo(() => {\n if (!allowCreate || !query.trim()) return false;\n const q = query.trim().toLowerCase();\n return (\n !items.some((item) => item.label.toLowerCase() === q) &&\n !value.includes(query.trim())\n );\n }, [allowCreate, query, items, value]);\n\n const maxFocusIndex = filtered.length - 1 + (showCreate ? 1 : 0);\n\n // ── Portal positioning (mirrors Picker) ────────────────────────────────────\n\n const updatePosition = useCallback(() => {\n if (!open || !triggerRef.current || !dropdownRef.current) return;\n\n const anchorRect = triggerRef.current.getBoundingClientRect();\n const menuRect = dropdownRef.current.getBoundingClientRect();\n const boundary = escapeBoundary\n ? viewportBounds()\n : resolveBoundaryBounds(triggerRef.current);\n const zIndex = resolveZIndex(triggerRef.current);\n const offset = 4;\n const minMargin = 8;\n\n // The dropdown is portaled to document.body, so it is never clipped by an\n // intermediate scroll ancestor. Use the viewport for all vertical decisions\n // (flip direction + clamping). Use the boundary only for horizontal alignment.\n const vp = viewportBounds();\n\n const computedWidth = Math.min(\n Math.max(anchorRect.width, menuRect.width),\n Math.min(boundary.width, vp.width) - minMargin * 2,\n );\n // When the menu hasn't rendered yet its height is 0; assume max height so the\n // flip decision is made conservatively (prefers opening above when space is tight).\n const computedHeight = menuRect.height || MAX_DROPDOWN_HEIGHT;\n\n const belowTop = anchorRect.bottom + offset;\n const aboveTop = anchorRect.top - offset - computedHeight;\n\n const overflowFor = (top: number) =>\n Math.max(0, vp.top + minMargin - top) +\n Math.max(0, top + computedHeight - (vp.bottom - minMargin));\n\n const isTopSide = overflowFor(aboveTop) < overflowFor(belowTop);\n const rawTop = isTopSide ? aboveTop : belowTop;\n const clampedTop = Math.min(\n Math.max(rawTop, vp.top + minMargin),\n Math.max(vp.top + minMargin, vp.bottom - computedHeight - minMargin),\n );\n\n const availableSpace = isTopSide\n ? Math.max(120, anchorRect.top - offset - (vp.top + minMargin))\n : Math.max(120, vp.bottom - minMargin - belowTop);\n\n const startLeft = anchorRect.left;\n const clampedLeft = Math.min(\n Math.max(startLeft, boundary.left + minMargin),\n Math.max(\n boundary.left + minMargin,\n boundary.right - computedWidth - minMargin,\n ),\n );\n\n setComputedMaxHeight(\n Math.max(120, Math.min(MAX_DROPDOWN_HEIGHT, availableSpace)),\n );\n setStyle({\n position: \"fixed\",\n top: clampedTop,\n left: clampedLeft,\n width: computedWidth,\n zIndex,\n });\n }, [open, escapeBoundary]);\n\n useLayoutEffect(() => {\n updatePosition();\n }, [updatePosition]);\n\n useEffect(() => {\n if (!open) {\n setStyle(undefined);\n return;\n }\n\n let frame = 0;\n const schedule = () => {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n updatePosition();\n frame = 0;\n });\n };\n\n window.addEventListener(\"resize\", schedule);\n window.addEventListener(\"scroll\", schedule, true);\n const ro =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(schedule)\n : undefined;\n if (ro) {\n if (triggerRef.current) ro.observe(triggerRef.current);\n if (dropdownRef.current) ro.observe(dropdownRef.current);\n }\n schedule();\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", schedule);\n window.removeEventListener(\"scroll\", schedule, true);\n ro?.disconnect();\n };\n }, [open, updatePosition]);\n\n // ── Click-outside & Escape ─────────────────────────────────────────────────\n\n useEffect(() => {\n if (!open) return;\n const handlePointer = (e: MouseEvent) => {\n if (\n dropdownRef.current?.contains(e.target as Node) ||\n triggerRef.current?.contains(e.target as Node)\n )\n return;\n setOpen(false);\n setQuery(\"\");\n };\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setOpen(false);\n setQuery(\"\");\n }\n };\n document.addEventListener(\"pointerdown\", handlePointer);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointer);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [open]);\n\n useEffect(() => {\n if (open) requestAnimationFrame(() => searchRef.current?.focus());\n }, [open]);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [query]);\n\n // ── Handlers ───────────────────────────────────────────────────────────────\n\n const normalize = useCallback(\n (v: string) => (normalizeValue ? normalizeValue(v) : v),\n [normalizeValue],\n );\n\n const handleToggle = useCallback(\n (item: TagPickerItem) => {\n const id = normalize(item.id);\n if (!multi) {\n onChange([id]);\n setOpen(false);\n setQuery(\"\");\n return;\n }\n if (selectedSet.has(item.id)) {\n onChange(value.filter((v) => v !== item.id));\n } else {\n onChange([...value, id]);\n }\n },\n [multi, normalize, onChange, selectedSet, value],\n );\n\n const handleRemove = useCallback(\n (v: string) => onChange(value.filter((x) => x !== v)),\n [onChange, value],\n );\n\n const handleCreate = useCallback(() => {\n const label = normalize(query.trim());\n if (!label) return;\n if (onCreateItem) {\n onCreateItem(label);\n } else if (!multi) {\n onChange([label]);\n setOpen(false);\n } else {\n onChange([...value, label]);\n }\n setQuery(\"\");\n }, [query, normalize, onCreateItem, multi, onChange, value]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setFocusedIndex((prev) => Math.min(prev + 1, maxFocusIndex));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setFocusedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n if (focusedIndex >= 0 && focusedIndex < filtered.length) {\n handleToggle(filtered[focusedIndex]);\n } else if (showCreate && focusedIndex === filtered.length) {\n handleCreate();\n } else if (query.trim()) {\n if (filtered.length > 0) handleToggle(filtered[0]);\n else if (showCreate) handleCreate();\n }\n } else if (e.key === \"Backspace\" && !query && value.length > 0 && multi) {\n onChange(value.slice(0, -1));\n }\n };\n\n // ── Dropdown portal ────────────────────────────────────────────────────────\n\n const dropdown =\n open && PORTAL_ROOT\n ? createPortal(\n <div\n ref={dropdownRef}\n style={style ?? { visibility: \"hidden\" }}\n className={classNames(\n \"fixed overflow-hidden rounded-lg border border-neutral-200 bg-white shadow-xl ring-1 ring-black/5 dark:border-neutral-700 dark:bg-neutral-900\",\n !style && \"invisible opacity-0\",\n )}\n >\n {/* Search row */}\n <div className=\"flex items-center gap-2 border-b border-neutral-100 px-3 py-2 dark:border-neutral-800\">\n <svg\n className=\"h-4 w-4 shrink-0 text-neutral-400\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path strokeLinecap=\"round\" d=\"m21 21-4.35-4.35\" />\n </svg>\n <input\n ref={searchRef}\n id={`${uid}-search`}\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={`${uid}-listbox`}\n aria-autocomplete=\"list\"\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={searchPlaceholder}\n className=\"min-w-0 flex-1 bg-transparent text-sm text-neutral-700 placeholder:text-neutral-400 focus:outline-none dark:text-neutral-200 dark:placeholder:text-neutral-500\"\n />\n {query && (\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setQuery(\"\")}\n className=\"shrink-0 text-neutral-400 hover:text-neutral-600 dark:hover:text-neutral-300\"\n >\n <svg\n className=\"h-3.5 w-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n\n {/* Option list */}\n <ul\n id={`${uid}-listbox`}\n role=\"listbox\"\n aria-multiselectable={multi}\n className=\"overflow-y-auto divide-y divide-neutral-50 dark:divide-neutral-800/60\"\n style={{ maxHeight: computedMaxHeight }}\n >\n {loading ? (\n <li className=\"flex items-center justify-center gap-2 px-4 py-5 text-sm text-neutral-400 dark:text-neutral-500\">\n <svg\n className=\"h-4 w-4 animate-spin\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n {loadingMessage}\n </li>\n ) : filtered.length === 0 && !showCreate ? (\n <li className=\"px-4 py-5 text-center text-sm text-neutral-400 dark:text-neutral-500\">\n {items.length === 0\n ? emptyMessage\n : \"No items match your search.\"}\n </li>\n ) : (\n filtered.map((item, index) => {\n const isSelected = selectedSet.has(item.id);\n const isFocused = index === focusedIndex;\n const isNew = sessionAddedSet.has(item.id);\n return (\n <li\n key={item.id}\n role=\"option\"\n aria-selected={isSelected}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setFocusedIndex(index)}\n onClick={() => {\n if (!readOnly) handleToggle(item);\n }}\n className={classNames(\n \"flex cursor-pointer select-none items-center gap-3 px-4 py-2.5 transition-colors\",\n isSelected\n ? isNew\n ? \"bg-emerald-50 dark:bg-emerald-900/20\"\n : colorTokens.optionSelectedBg\n : isFocused\n ? colorTokens.focusedBg\n : \"hover:bg-neutral-50 dark:hover:bg-neutral-800/60\",\n )}\n >\n {/* Checkmark slot */}\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n {isSelected && (\n <svg\n className={classNames(\n \"h-3.5 w-3.5\",\n isNew\n ? \"text-emerald-500 dark:text-emerald-400\"\n : colorTokens.optionSelectedIcon,\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m5 13 4 4L19 7\"\n />\n </svg>\n )}\n </span>\n\n {/* Icon */}\n {item.icon && (\n <span\n className={classNames(\n \"shrink-0\",\n isSelected\n ? isNew\n ? \"text-emerald-500 dark:text-emerald-400\"\n : colorTokens.optionSelectedIcon\n : \"text-neutral-400 dark:text-neutral-500\",\n )}\n >\n {item.icon}\n </span>\n )}\n\n {/* Label */}\n <span\n className={classNames(\n \"min-w-0 flex-1 truncate text-sm font-medium\",\n isSelected\n ? isNew\n ? \"text-emerald-700 dark:text-emerald-300\"\n : colorTokens.optionSelectedText\n : \"text-neutral-800 dark:text-neutral-200\",\n )}\n >\n {item.label}\n </span>\n\n {/* New badge */}\n {isNew && (\n <span className=\"shrink-0 rounded-full bg-emerald-100 px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400\">\n new\n </span>\n )}\n\n {/* Tags */}\n {item.tags && item.tags.length > 0 && (\n <div className=\"flex shrink-0 flex-wrap gap-1\">\n {item.tags.map((tag, ti) => (\n <Pill\n key={ti}\n size=\"sm\"\n tone={tag.tone ?? \"neutral\"}\n variant=\"soft\"\n >\n {tag.label}\n </Pill>\n ))}\n </div>\n )}\n </li>\n );\n })\n )}\n\n {/* Create row */}\n {showCreate && (\n <li\n role=\"option\"\n aria-selected={false}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setFocusedIndex(filtered.length)}\n onClick={handleCreate}\n className={classNames(\n \"flex cursor-pointer select-none items-center gap-2 border-t border-neutral-100 px-4 py-2.5 text-sm transition-colors dark:border-neutral-700/60\",\n focusedIndex === filtered.length\n ? colorTokens.focusedBg\n : \"hover:bg-neutral-50 dark:hover:bg-neutral-800/60\",\n )}\n >\n <svg\n className={classNames(\n \"h-3.5 w-3.5 shrink-0\",\n colorTokens.createRowIcon,\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 5v14M5 12h14\"\n />\n </svg>\n <span className=\"text-neutral-500 dark:text-neutral-400\">\n Create{\" \"}\n <span\n className={classNames(\n \"font-medium\",\n colorTokens.createRowLabel,\n )}\n title={query.trim()}\n >\n “{query.trim()}”\n </span>\n </span>\n </li>\n )}\n </ul>\n </div>,\n PORTAL_ROOT,\n )\n : null;\n\n // ── Trigger ────────────────────────────────────────────────────────────────\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? `${uid}-listbox` : undefined}\n onClick={() => {\n if (!disabled && !readOnly) setOpen((prev) => !prev);\n }}\n className={classNames(\n \"flex w-full min-h-10.5 flex-wrap items-start gap-1.5 rounded-lg border px-3 py-2 text-left transition-colors\",\n \"bg-white dark:bg-neutral-900\",\n open\n ? colorTokens.triggerOpen\n : \"border-neutral-300 hover:border-neutral-400 dark:border-neutral-600 dark:hover:border-neutral-500\",\n disabled && \"cursor-not-allowed opacity-50\",\n readOnly &&\n \"cursor-default border-neutral-200 dark:border-neutral-700 bg-neutral-50 dark:bg-neutral-800/50\",\n className,\n )}\n >\n {loading ? (\n <>\n <svg\n className=\"h-4 w-4 animate-spin shrink-0 text-neutral-400\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span className=\"text-sm text-neutral-400\">{loadingMessage}</span>\n </>\n ) : value.length > 0 ? (\n <span className=\"flex flex-1 flex-wrap items-center gap-1.5\">\n {(multi && tagLimit > 0 && !showAllTags\n ? value.slice(0, tagLimit)\n : value\n ).map((v) => (\n <span key={v} className=\"inline-flex items-center\">\n <Pill\n size=\"sm\"\n tone={\n sessionAddedSet.has(v) ? \"emerald\" : (itemColor ?? color)\n }\n variant=\"soft\"\n >\n {labelFor(v)}\n </Pill>\n {multi && !readOnly && (\n <button\n type=\"button\"\n aria-label={`Remove ${labelFor(v)}`}\n onPointerDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(v);\n }}\n className=\"-ml-0.5 flex h-4 w-4 items-center justify-center rounded-full text-neutral-400 transition-colors hover:bg-neutral-200 hover:text-neutral-600 dark:hover:bg-neutral-700 dark:hover:text-neutral-300\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n className=\"h-2.5 w-2.5\"\n >\n <path strokeLinecap=\"round\" d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n )}\n </span>\n ))}\n {multi &&\n tagLimit > 0 &&\n value.length > tagLimit &&\n !showAllTags && (\n <button\n type=\"button\"\n onPointerDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n setShowAllTags(true);\n }}\n className=\"inline-flex\"\n aria-label={`Show ${value.length - tagLimit} more tags`}\n >\n <Pill size=\"sm\" tone=\"neutral\" variant=\"soft\">\n +{value.length - tagLimit}\n </Pill>\n </button>\n )}\n {multi &&\n tagLimit > 0 &&\n showAllTags &&\n value.length > tagLimit && (\n <button\n type=\"button\"\n onPointerDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n setShowAllTags(false);\n }}\n className=\"text-xs text-neutral-400 underline-offset-2 hover:underline dark:text-neutral-500\"\n >\n Show less\n </button>\n )}\n </span>\n ) : (\n <span className=\"flex-1 text-sm text-neutral-400 dark:text-neutral-500\">\n {placeholder}\n </span>\n )}\n\n {/* Chevron */}\n <svg\n className={classNames(\n \"ml-auto mt-1 h-4 w-4 shrink-0 self-start text-neutral-400 transition-transform\",\n open && \"rotate-180\",\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n\n {dropdown}\n </>\n );\n};\n\nTagPicker.displayName = \"TagPicker\";\n\nexport { TagPicker };\nexport default TagPicker;\n","import React, { useState } from \"react\";\nimport classNames from \"classnames\";\nimport { Section, type SectionSize, type SectionVariant } from \"./Section\";\nimport { Pill, type PillVariant, type PillSize } from \"./Pill\";\nimport { type TrueColor } from \"../theme/Theme\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface TagPanelTag {\n id?: string;\n label: string;\n /** Pill tone. Defaults to `'neutral'`. */\n tone?: TrueColor;\n /** Pill variant. Defaults to `'soft'`. */\n variant?: PillVariant;\n /** Pill size. Defaults to `'sm'`. */\n size?: PillSize;\n /** Optional leading icon inside the pill. */\n icon?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport interface TagPanelProps {\n /** Section heading. Omit entirely to hide the header. */\n title?: React.ReactNode;\n /** Optional secondary line below the title. */\n subtitle?: React.ReactNode;\n /** Tags to render as pills. */\n tags: TagPanelTag[];\n /**\n * Maximum number of pills shown before a `+N` overflow pill appears.\n * Set to `0` to always show all. Default: `5`.\n */\n tagLimit?: number;\n /**\n * Tone used for the `+N` overflow pill.\n * Defaults to `'neutral'`.\n */\n overflowTone?: TrueColor;\n /** Rendered when `tags` is empty. */\n emptyState?: React.ReactNode;\n /** Optional actions rendered on the right side of the section header. */\n actions?: React.ReactNode;\n /** Controls header padding and font size. Defaults to `'md'`. */\n size?: SectionSize;\n /** Visual style of the section header. Defaults to `'uppercase'`. */\n variant?: SectionVariant;\n /** Extra classes for the root element. */\n className?: string;\n /** Extra classes for the tags container. */\n bodyClassName?: string;\n /** Remove all padding from the section header. */\n noPadding?: boolean;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const TagPanel: React.FC<TagPanelProps> = ({\n title,\n subtitle,\n tags,\n tagLimit = 5,\n overflowTone = \"neutral\",\n emptyState,\n actions,\n size,\n variant,\n className,\n bodyClassName,\n noPadding,\n}) => {\n const [expanded, setExpanded] = useState(false);\n\n const limited = tagLimit > 0 && !expanded && tags.length > tagLimit;\n const visible = limited ? tags.slice(0, tagLimit) : tags;\n const overflowCount = tags.length - tagLimit;\n\n return (\n <div className={classNames(\"flex flex-col\", className)}>\n {title != null && (\n <Section\n title={title}\n subtitle={subtitle}\n actions={actions}\n size={size}\n variant={variant}\n noPadding={noPadding}\n />\n )}\n\n <div\n className={classNames(\n \"flex flex-wrap items-center gap-1 px-0 pb-1\",\n bodyClassName,\n )}\n >\n {tags.length === 0 ? (\n emptyState ? (\n <>{emptyState}</>\n ) : (\n <span className=\"text-xs text-neutral-400 dark:text-neutral-500 italic\">\n No tags\n </span>\n )\n ) : (\n <>\n {visible.map((tag, i) => (\n <Pill\n key={tag.id ?? `${tag.label}-${i}`}\n tone={tag.tone ?? \"neutral\"}\n variant={tag.variant ?? \"soft\"}\n size={tag.size ?? \"sm\"}\n icon={tag.icon}\n >\n {tag.children ?? tag.label}\n </Pill>\n ))}\n\n {limited && (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n aria-label={`Show ${overflowCount} more tags`}\n className=\"inline-flex\"\n >\n <Pill tone={overflowTone} variant=\"soft\" size={size}>\n +{overflowCount}\n </Pill>\n </button>\n )}\n\n {expanded && tagLimit > 0 && tags.length > tagLimit && (\n <button\n type=\"button\"\n onClick={() => setExpanded(false)}\n className=\"text-xs text-neutral-400 underline-offset-2 hover:underline dark:text-neutral-500\"\n >\n Show less\n </button>\n )}\n </>\n )}\n </div>\n </div>\n );\n};\n\nexport default TagPanel;\n","import React from \"react\";\nimport classNames from \"classnames\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type SectionSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport type SectionVariant =\n /** Bold neutral title, no extra decoration (clean default). */\n | \"default\"\n /** Lighter muted title — lower visual weight. */\n | \"subtle\"\n /** Tiny all-caps + wide letter-spacing (matches standard detail-panel style). */\n | \"uppercase\"\n /** Same as `default` but with a bottom border separating header from body. */\n | \"bordered\"\n /** Subtle filled background on the header strip. */\n | \"filled\";\n\nexport interface SectionProps {\n /** Section heading. */\n title: React.ReactNode;\n /** Optional secondary line below the title. */\n subtitle?: React.ReactNode;\n children?: React.ReactNode;\n /** Controls header padding and title/subtitle font size. Defaults to `'md'`. */\n size?: SectionSize;\n /** Visual style of the section header. Defaults to `'uppercase'`. */\n variant?: SectionVariant;\n /** Optional content rendered on the right side of the header (e.g. icon buttons). */\n actions?: React.ReactNode;\n /**\n * Override title text size independently from `size`.\n * Accepts any Tailwind text-size class, e.g. `\"text-xs\"` or `\"text-sm\"`.\n */\n titleSize?: string;\n /**\n * Override title text colour / weight independently from `variant`.\n * e.g. `\"text-sky-600 font-bold\"`\n * Merged after variant styles so it wins on conflicts.\n */\n titleColor?: string;\n /**\n * Override subtitle text size independently from `size`.\n * e.g. `\"text-[10px]\"`\n */\n subtitleSize?: string;\n /**\n * Override subtitle text colour / weight.\n * e.g. `\"text-neutral-600 dark:text-neutral-300\"`\n */\n subtitleColor?: string;\n /** Extra classes for the title span. */\n titleClassName?: string;\n /** Extra classes for the subtitle span. */\n subtitleClassName?: string;\n /** Extra classes for the body wrapper div. */\n bodyClassName?: string;\n /** Extra classes for the header wrapper div. */\n headerClassName?: string;\n className?: string;\n /** Whether to remove all padding from the section. */\n noPadding?: boolean;\n}\n\n// ── Tokens ────────────────────────────────────────────────────────────────────\n\ntype SizeToken = {\n headerPadding: string;\n title: string;\n subtitle: string;\n body: string;\n};\n\nconst sizeTokens: Record<SectionSize, SizeToken> = {\n xs: {\n headerPadding: \"px-3 pt-2 pb-1\",\n title: \"text-[9px]\",\n subtitle: \"text-[9px]\",\n body: \"space-y-0\",\n },\n sm: {\n headerPadding: \"px-4 pt-2.5 pb-1\",\n title: \"text-[10px]\",\n subtitle: \"text-[10px]\",\n body: \"space-y-0.5\",\n },\n md: {\n headerPadding: \"px-4 pt-3 pb-2\",\n title: \"text-[10px]\",\n subtitle: \"text-xs\",\n body: \"space-y-0.5\",\n },\n lg: {\n headerPadding: \"px-4 pt-3.5 pb-2.5\",\n title: \"text-xs\",\n subtitle: \"text-xs\",\n body: \"space-y-1\",\n },\n};\n\n// Applied to the title <span>\nconst titleVariantStyles: Record<SectionVariant, string> = {\n default: \"font-semibold text-neutral-600 dark:text-neutral-300\",\n subtle: \"font-medium text-neutral-400 dark:text-neutral-500\",\n uppercase:\n \"font-semibold uppercase tracking-widest text-neutral-400 dark:text-neutral-500\",\n bordered: \"font-semibold text-neutral-600 dark:text-neutral-300\",\n filled: \"font-semibold text-neutral-700 dark:text-neutral-200\",\n};\n\n// Applied to the header container <div>\nconst headerVariantStyles: Record<SectionVariant, string> = {\n default: \"\",\n subtle: \"\",\n uppercase: \"\",\n bordered: \"border-b border-neutral-100 dark:border-neutral-800\",\n filled: \"bg-neutral-50 dark:bg-neutral-800/50\",\n};\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const Section: React.FC<SectionProps> = ({\n title,\n subtitle,\n children,\n size = \"md\",\n variant = \"uppercase\",\n actions,\n titleSize,\n titleColor,\n subtitleSize,\n subtitleColor,\n titleClassName,\n subtitleClassName,\n bodyClassName,\n headerClassName,\n className,\n noPadding = false,\n}) => {\n const tokens = sizeTokens[size];\n\n return (\n <div className={classNames(\"flex flex-col\", className)}>\n {/* Header */}\n <div\n className={classNames(\n \"flex items-center justify-between\",\n noPadding ? \"px-0 pt-0 pb-0\" : tokens.headerPadding,\n headerVariantStyles[variant],\n headerClassName,\n )}\n >\n <div className=\"flex flex-col gap-0.5 min-w-0\">\n <span\n className={classNames(\n titleSize ?? tokens.title,\n titleVariantStyles[variant],\n titleColor,\n titleClassName,\n )}\n >\n {title}\n </span>\n {subtitle && (\n <span\n className={classNames(\n subtitleSize ?? tokens.subtitle,\n subtitleColor ?? \"text-neutral-400 dark:text-neutral-500\",\n subtitleClassName,\n )}\n >\n {subtitle}\n </span>\n )}\n </div>\n\n {actions && (\n <div className=\"flex items-center gap-1 shrink-0\">{actions}</div>\n )}\n </div>\n\n {/* Body */}\n {children && (\n <div className={classNames(tokens.body, bodyClassName)}>{children}</div>\n )}\n </div>\n );\n};\n\nexport default Section;\n","import {\n forwardRef,\n type InputHTMLAttributes,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { getCheckboxColorClasses, TrueColor, Size } from \"../theme/Theme\";\n\ntype CheckboxDescriptionPlacement = \"bottom\" | \"inline\";\ntype CheckboxAlign = \"left\" | \"right\";\n\nexport interface CheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"color\" | \"children\"\n > {\n /**\n * Optional label rendered next to the checkbox control.\n */\n label?: ReactNode;\n /**\n * Optional description displayed under the label.\n */\n description?: ReactNode;\n /**\n * Controls if the description is stacked under the label (default) or inline beside it.\n */\n descriptionPlacement?: CheckboxDescriptionPlacement;\n /**\n * Adjusts checkbox dimensions and typography.\n */\n size?: Size;\n /**\n * Accent color applied to the checkbox.\n */\n color?: TrueColor;\n /**\n * Enables the native indeterminate visual state.\n */\n indeterminate?: boolean;\n /**\n * When true the container will stretch to the available width.\n */\n fullWidth?: boolean;\n /**\n * Renders the checkbox control on the left (default) or right side of the label block.\n */\n controlAlign?: CheckboxAlign;\n /**\n * Additional classes applied to the root label element.\n */\n className?: string;\n /**\n * Additional classes applied directly to the input element.\n */\n inputClassName?: string;\n}\n\nconst sizeTokens: Record<\n Size,\n {\n gap: string;\n control: string;\n label: string;\n description: string;\n descriptionOffset: string;\n checkboxOffset: string;\n }\n> = {\n xs: {\n gap: \"gap-1\",\n control: \"h-3 w-3\",\n label: \"text-xs\",\n description: \"text-xs\",\n descriptionOffset: \"\",\n checkboxOffset: \"mt-0.5\",\n },\n sm: {\n gap: \"gap-1.5\",\n control: \"h-4 w-4\",\n label: \"text-sm\",\n description: \"text-xs\",\n descriptionOffset: \"\",\n checkboxOffset: \"mt-1\",\n },\n md: {\n gap: \"gap-1.5\",\n control: \"h-5 w-5\",\n label: \"text-md\",\n description: \"text-xs\",\n descriptionOffset: \"mt-0.5\",\n checkboxOffset: \"mt-0.5\",\n },\n lg: {\n gap: \"gap-1.5\",\n control: \"h-6 w-6\",\n label: \"text-base\",\n description: \"text-sm\",\n descriptionOffset: \"mt-1\",\n checkboxOffset: \"mt-0.2\",\n },\n xl: {\n gap: \"gap-2\",\n control: \"h-7 w-7\",\n label: \"text-lg\",\n description: \"text-sm\",\n descriptionOffset: \"mt-1.5\",\n checkboxOffset: \"mt-0.5\",\n },\n xxl: {\n gap: \"gap-2.5\",\n control: \"h-8 w-8\",\n label: \"text-xl\",\n description: \"text-sm\",\n descriptionOffset: \"mt-2\",\n checkboxOffset: \"mt-0.5\",\n },\n xxxl: {\n gap: \"gap-2.5\",\n control: \"h-8 w-8\",\n label: \"text-xl\",\n description: \"text-sm\",\n descriptionOffset: \"mt-2\",\n checkboxOffset: \"mt-0.5\",\n },\n \"2xl\": {\n gap: \"gap-2.5\",\n control: \"h-8 w-8\",\n label: \"text-xl\",\n description: \"text-sm\",\n descriptionOffset: \"mt-2\",\n checkboxOffset: \"mt-0.5\",\n },\n \"3xl\": {\n gap: \"gap-2.5\",\n control: \"h-8 w-8\",\n label: \"text-xl\",\n description: \"text-sm\",\n descriptionOffset: \"mt-2\",\n checkboxOffset: \"mt-0.5\",\n },\n full: {\n gap: \"gap-2.5\",\n control: \"h-8 w-8\",\n label: \"text-xl\",\n description: \"text-sm\",\n descriptionOffset: \"mt-2\",\n checkboxOffset: \"mt-0.5\",\n },\n};\n\n/**\n * Accessible checkbox control styled exclusively with Tailwind utilities.\n */\nconst Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (\n {\n id,\n label,\n description,\n descriptionPlacement = \"bottom\",\n size = \"md\",\n color = \"blue\",\n indeterminate = false,\n fullWidth = false,\n controlAlign = \"left\",\n className,\n inputClassName,\n disabled,\n ...inputProps\n },\n forwardedRef,\n ) => {\n const generatedId = useId();\n const controlId = id ?? generatedId;\n const descriptionId = description ? `${controlId}-description` : undefined;\n const innerRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!innerRef.current) return;\n innerRef.current.indeterminate = Boolean(indeterminate);\n }, [indeterminate]);\n\n const setRefs = useCallback(\n (node: HTMLInputElement | null) => {\n innerRef.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef],\n );\n\n const sizeStyles = sizeTokens[size] ?? sizeTokens.md;\n const colorStyles = getCheckboxColorClasses(color);\n\n const descriptionNode = description ? (\n descriptionPlacement === \"inline\" ? (\n <span\n id={descriptionId}\n className={classNames(\n sizeStyles.description,\n \"text-neutral-500 dark:text-neutral-400\",\n disabled && \"text-neutral-400 dark:text-neutral-500\",\n )}\n >\n {description}\n </span>\n ) : (\n <span\n id={descriptionId}\n className={classNames(\n sizeStyles.description,\n sizeStyles.descriptionOffset,\n \"block text-neutral-500 dark:text-neutral-400\",\n disabled && \"text-neutral-400 dark:text-neutral-500\",\n )}\n >\n {description}\n </span>\n )\n ) : null;\n\n const controlNode = (\n <input\n id={controlId}\n ref={setRefs}\n type=\"checkbox\"\n aria-describedby={descriptionId}\n disabled={disabled}\n className={classNames(\n `peer ${sizeStyles.checkboxOffset} shrink-0 rounded border border-neutral-300 bg-white text-white transition-colors duration-150`,\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"checked:border-transparent hover:border-neutral-400\",\n \"dark:border-neutral-600 dark:bg-neutral-900 dark:hover:border-neutral-500\",\n \"disabled:border-neutral-200 disabled:bg-neutral-100 disabled:hover:border-neutral-200\",\n sizeStyles.control,\n colorStyles,\n inputClassName,\n )}\n {...inputProps}\n />\n );\n\n const textNode =\n label || descriptionNode ? (\n <span\n className={classNames(\n \"min-w-0\",\n descriptionPlacement === \"inline\" &&\n Boolean(label) &&\n \"flex flex-wrap items-center gap-1\",\n descriptionPlacement === \"inline\" && !label && \"flex items-center\",\n )}\n >\n {label && (\n <span\n className={classNames(\n sizeStyles.label,\n \"font-medium text-neutral-900 dark:text-neutral-100\",\n disabled && \"text-neutral-500 dark:text-neutral-400\",\n )}\n >\n {label}\n </span>\n )}\n {descriptionNode}\n </span>\n ) : null;\n\n return (\n <label\n className={classNames(\n \"group flex items-start\",\n controlAlign === \"right\" && \"flex-row-reverse\",\n sizeStyles.gap,\n fullWidth && \"w-full\",\n disabled && \"cursor-not-allowed opacity-60\",\n !disabled && \"cursor-pointer\",\n className,\n )}\n >\n {controlNode}\n {textNode}\n </label>\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n\nexport default Checkbox;\n","import {\n forwardRef,\n type InputHTMLAttributes,\n type ReactNode,\n useCallback,\n useId,\n useRef,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { type TrueColor, getToggleColorClasses } from \"../theme/Theme\";\nimport {\n getGlassFillClass,\n getGlassVibrancyClass,\n getSpecularClasses,\n type GlassVibrancy,\n type GlassOpacity,\n type SpecularMode,\n} from \"../../../common/theme/glass\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport TooltipWrapper from \"./TooltipWrapper\";\nimport type { TooltipPosition } from \"./Tooltip\";\n\nexport type ToggleSize = \"sm\" | \"md\" | \"lg\";\nexport type ToggleAlign = \"left\" | \"right\";\nexport type ToggleDescriptionPlacement = \"inline\" | \"stacked\";\nexport type TogglePadding = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nconst paddingStyles: Record<TogglePadding, string> = {\n none: \"\",\n xs: \"p-0.5\",\n sm: \"p-1\",\n md: \"p-1.5\",\n lg: \"p-2\",\n xl: \"p-3\",\n};\n\nexport interface ToggleProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\" | \"color\" | \"children\"\n > {\n label?: ReactNode;\n description?: ReactNode;\n descriptionPlacement?: ToggleDescriptionPlacement;\n size?: ToggleSize;\n padding?: TogglePadding;\n color?: TrueColor;\n alignLabel?: ToggleAlign;\n iconOn?: string | React.ReactElement;\n iconOff?: string | React.ReactElement;\n fullWidth?: boolean;\n className?: string;\n /** When set, a styled tooltip is shown on hover. */\n tooltip?: string;\n /** Position of the tooltip relative to the toggle. Defaults to 'top'. */\n tooltipPosition?: TooltipPosition;\n /** When true, applies glass styling (fill + vibrancy + optional specular overlay). */\n glass?: boolean;\n /** Backdrop vibrancy level for glass surfaces. */\n vibrancy?: GlassVibrancy;\n /** Glass fill transparency level for glass surfaces. */\n glassOpacity?: GlassOpacity;\n /** Specular highlight mode for glass surfaces. */\n specularMode?: SpecularMode;\n}\n\nconst sizeTokens: Record<\n ToggleSize,\n {\n track: string;\n thumb: string;\n thumbOffset: string;\n thumbTranslate: string;\n gap: string;\n font: string;\n description: string;\n }\n> = {\n sm: {\n track: \"h-5 w-9\",\n thumb: \"h-4 w-4\",\n thumbOffset: \"top-0.5 left-0.5\",\n thumbTranslate: \"peer-checked:translate-x-4\",\n gap: \"gap-2\",\n font: \"text-sm\",\n description: \"text-xs\",\n },\n md: {\n track: \"h-6 w-11\",\n thumb: \"h-5 w-5\",\n thumbOffset: \"top-0.5 left-0.5\",\n thumbTranslate: \"peer-checked:translate-x-5\",\n gap: \"gap-3\",\n font: \"text-sm\",\n description: \"text-xs\",\n },\n lg: {\n track: \"h-7 w-14\",\n thumb: \"h-6 w-6\",\n thumbOffset: \"top-0.5 left-0.5\",\n thumbTranslate: \"peer-checked:translate-x-6\",\n gap: \"gap-3\",\n font: \"text-base\",\n description: \"text-sm\",\n },\n};\n\nconst iconWrapSize: Record<ToggleSize, string> = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n};\n\nconst Toggle = forwardRef<HTMLInputElement, ToggleProps>(\n (\n {\n id,\n label,\n description,\n descriptionPlacement = \"stacked\",\n size = \"md\",\n padding = \"sm\",\n color = \"blue\",\n alignLabel = \"right\",\n iconOn,\n iconOff,\n fullWidth = false,\n className,\n disabled,\n onChange,\n tooltip,\n tooltipPosition,\n glass = false,\n vibrancy = \"medium\",\n glassOpacity = \"frosted\",\n specularMode = \"none\",\n ...inputProps\n },\n forwardedRef,\n ) => {\n const renderIcon = useIconRenderer();\n const generatedId = useId();\n const toggleId = id ?? generatedId;\n const descriptionId = description ? `${toggleId}-description` : undefined;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const mergeRefs = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef],\n );\n\n const sizeStyles = sizeTokens[size] ?? sizeTokens.md;\n const colorStyles = getToggleColorClasses(color);\n\n const glassSpecularClass = glass\n ? getSpecularClasses(specularMode)\n : null;\n\n const toggle = (\n <div\n data-glass={glass}\n className={classNames(\n \"group flex select-none items-center\",\n alignLabel === \"left\" ? \"flex-row-reverse\" : \"flex-row\",\n sizeStyles.gap,\n paddingStyles[padding],\n fullWidth && \"w-full\",\n disabled && \"cursor-not-allowed opacity-60\",\n inputProps.readOnly && !disabled && \"cursor-default\",\n !disabled && !inputProps.readOnly && \"cursor-pointer\",\n className,\n )}\n onClick={(e) => {\n if (inputProps.readOnly) {\n e.preventDefault();\n }\n if (!disabled && !inputProps.readOnly && onChange) {\n const newChecked = !inputRef.current?.checked;\n onChange({ target: { checked: newChecked } } as any);\n }\n }}\n >\n <span className=\"relative inline-flex shrink-0\">\n <input\n id={toggleId}\n ref={mergeRefs}\n type=\"checkbox\"\n role=\"switch\"\n className={classNames(\n \"peer sr-only\",\n disabled\n ? \"cursor-not-allowed\"\n : inputProps.readOnly\n ? \"cursor-default\"\n : \"cursor-pointer\",\n )}\n aria-describedby={descriptionId}\n disabled={disabled}\n onChange={onChange}\n onClick={(e) => {\n if (inputProps.readOnly) {\n e.preventDefault();\n }\n }}\n {...inputProps}\n />\n\n <span\n aria-hidden=\"true\"\n className={classNames(\n \"block relative rounded-full overflow-hidden border border-transparent bg-neutral-200 dark:bg-neutral-600 transition-colors duration-200 ease-in-out peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-offset-2\",\n sizeStyles.track,\n glass\n ? classNames(\n \"backdrop-blur-sm\",\n getGlassFillClass(color, glassOpacity),\n getGlassVibrancyClass(vibrancy),\n \"dark:bg-neutral-600\",\n )\n : colorStyles,\n disabled && \"opacity-70 peer-checked:opacity-70 dark:opacity-50\",\n )}\n />\n\n {glassSpecularClass && (\n <div\n aria-hidden=\"true\"\n className={classNames(\n \"pointer-events-none absolute inset-0 rounded-full\",\n glassSpecularClass,\n )}\n />\n )}\n\n {iconOff && (\n <span\n className={classNames(\n \"pointer-events-none absolute inset-y-0 left-1 flex items-center text-neutral-400 transition-opacity duration-200 ease-in-out\",\n iconWrapSize[size],\n \"peer-checked:opacity-0\",\n )}\n >\n {renderIcon(iconOff, \"sm\")}\n </span>\n )}\n\n {iconOn && (\n <span\n className={classNames(\n \"pointer-events-none text-black absolute inset-y-0 right-1 flex items-center text-black opacity-0 transition-opacity duration-200 ease-in-out\",\n iconWrapSize[size],\n \"peer-checked:opacity-100\",\n )}\n >\n {renderIcon(iconOn, \"sm\")}\n </span>\n )}\n\n <span\n className={classNames(\n \"pointer-events-none absolute transform rounded-full bg-white shadow-sm ring-0 transition-transform duration-200 ease-in-out dark:bg-neutral-200\",\n \"translate-x-0\",\n sizeStyles.thumb,\n sizeStyles.thumbOffset,\n sizeStyles.thumbTranslate,\n )}\n />\n </span>\n {label && (\n <label\n htmlFor={toggleId}\n className={classNames(\n \"min-w-0\",\n descriptionPlacement === \"inline\"\n ? \"flex flex-wrap items-center gap-2 text-neutral-900 dark:text-neutral-100\"\n : \"flex flex-col\",\n )}\n >\n <span\n className={classNames(\n sizeStyles.font,\n \"font-medium leading-tight text-neutral-900 dark:text-neutral-100 mt-0.5\",\n disabled && \"text-neutral-400 dark:text-neutral-300\",\n )}\n >\n {label}\n </span>\n {description && (\n <span\n id={descriptionId}\n className={classNames(\n sizeStyles.description,\n \"text-neutral-400 dark:text-neutral-300\",\n descriptionPlacement === \"stacked\" && \"mt-1\",\n disabled && \"text-neutral-300 dark:text-neutral-400\",\n )}\n >\n {description}\n </span>\n )}\n </label>\n )}\n {!label && description && (\n <span\n id={descriptionId}\n className={classNames(\n sizeStyles.description,\n \"text-neutral-400 dark:text-neutral-300\",\n descriptionPlacement === \"stacked\" && \"mt-1\",\n disabled && \"text-neutral-300 dark:text-neutral-400\",\n )}\n >\n {description}\n </span>\n )}\n </div>\n );\n\n if (tooltip) {\n return (\n <TooltipWrapper text={tooltip} position={tooltipPosition}>\n {toggle}\n </TooltipWrapper>\n );\n }\n\n return toggle;\n },\n);\n\nToggle.displayName = \"Toggle\";\n\nexport default Toggle;\n","import React, {\n type ButtonHTMLAttributes,\n type ReactNode,\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport { getMultiToggleVariantTokens, type TrueColor } from \"../theme/Theme\";\nimport type { IconSize } from \"../types/Icon\";\n\nexport type MultiToggleSize = \"sm\" | \"md\" | \"lg\";\nexport type MultiToggleShape =\n | \"none\"\n | \"xs\"\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"full\";\nexport type MultiToggleVariant = \"theme\" | \"solid\" | \"soft\";\n\ntype LiteralUnion<T extends U, U = string> = T | (U & Record<never, never>);\n\nexport type MultiToggleOptionWidth = number | LiteralUnion<\"auto\">;\nexport type MultiToggleActiveWidthStrategy = \"auto\" | \"max\";\n\nexport interface MultiToggleOption {\n value: string;\n label?: ReactNode;\n icon?: string | React.ReactElement;\n disabled?: boolean;\n width?: MultiToggleOptionWidth;\n}\n\nexport interface MultiToggleProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\" | \"value\"> {\n options: MultiToggleOption[];\n value: string;\n rounded?: MultiToggleShape;\n\n onChange: (value: string) => void;\n size?: MultiToggleSize;\n color?: TrueColor;\n fullWidth?: boolean;\n className?: string;\n showOnlyActiveLabel?: boolean;\n truncateOverflow?: boolean;\n adaptiveWidth?: boolean;\n optionMaxWidth?: number | string;\n activeWidthStrategy?: MultiToggleActiveWidthStrategy;\n variant?: MultiToggleVariant;\n /** When set, overrides the active option's text color with this color's active-text token. */\n accentColor?: TrueColor;\n}\n\nconst toneTokens: Record<\n TrueColor,\n { activeText: string; indicator: string; hover: string }\n> = {\n red: {\n activeText: \"text-rose-700 dark:text-rose-200\",\n indicator:\n \"bg-rose-500/15 dark:bg-rose-400/20 border border-rose-400/40 dark:border-rose-300/20\",\n hover: \"hover:text-rose-600 dark:hover:text-rose-300\",\n },\n orange: {\n activeText: \"text-orange-700 dark:text-orange-200\",\n indicator:\n \"bg-orange-500/15 dark:bg-orange-400/20 border border-orange-400/40 dark:border-orange-300/20\",\n hover: \"hover:text-orange-600 dark:hover:text-orange-300\",\n },\n amber: {\n activeText: \"text-amber-700 dark:text-amber-200\",\n indicator:\n \"bg-amber-500/15 dark:bg-amber-400/20 border border-amber-400/40 dark:border-amber-300/20\",\n hover: \"hover:text-amber-600 dark:hover:text-amber-300\",\n },\n yellow: {\n activeText: \"text-yellow-700 dark:text-yellow-200\",\n indicator:\n \"bg-yellow-500/15 dark:bg-yellow-400/20 border border-yellow-400/40 dark:border-yellow-300/20\",\n hover: \"hover:text-yellow-600 dark:hover:text-yellow-300\",\n },\n lime: {\n activeText: \"text-lime-700 dark:text-lime-200\",\n indicator:\n \"bg-lime-500/15 dark:bg-lime-400/20 border border-lime-400/40 dark:border-lime-300/20\",\n hover: \"hover:text-lime-600 dark:hover:text-lime-300\",\n },\n green: {\n activeText: \"text-emerald-700 dark:text-emerald-200\",\n indicator:\n \"bg-emerald-500/15 dark:bg-emerald-400/20 border border-emerald-400/40 dark:border-emerald-300/20\",\n hover: \"hover:text-emerald-600 dark:hover:text-emerald-300\",\n },\n emerald: {\n activeText: \"text-emerald-700 dark:text-emerald-200\",\n indicator:\n \"bg-emerald-500/15 dark:bg-emerald-400/20 border border-emerald-400/40 dark:border-emerald-300/20\",\n hover: \"hover:text-emerald-600 dark:hover:text-emerald-300\",\n },\n teal: {\n activeText: \"text-teal-700 dark:text-teal-200\",\n indicator:\n \"bg-teal-500/15 dark:bg-teal-400/20 border border-teal-400/40 dark:border-teal-300/20\",\n hover: \"hover:text-teal-600 dark:hover:text-teal-300\",\n },\n cyan: {\n activeText: \"text-cyan-700 dark:text-cyan-200\",\n indicator:\n \"bg-cyan-500/15 dark:bg-cyan-400/20 border border-cyan-400/40 dark:border-cyan-300/20\",\n hover: \"hover:text-cyan-600 dark:hover:text-cyan-300\",\n },\n sky: {\n activeText: \"text-sky-700 dark:text-sky-200\",\n indicator:\n \"bg-sky-500/15 dark:bg-sky-400/20 border border-sky-400/40 dark:border-sky-300/20\",\n hover: \"hover:text-sky-600 dark:hover:text-sky-300\",\n },\n blue: {\n activeText: \"text-blue-700 dark:text-blue-200\",\n indicator:\n \"bg-blue-500/15 dark:bg-blue-400/20 border border-blue-400/40 dark:border-blue-300/20\",\n hover: \"hover:text-blue-600 dark:hover:text-blue-300\",\n },\n indigo: {\n activeText: \"text-indigo-700 dark:text-indigo-200\",\n indicator:\n \"bg-indigo-500/15 dark:bg-indigo-400/20 border border-indigo-400/40 dark:border-indigo-300/20\",\n hover: \"hover:text-indigo-600 dark:hover:text-indigo-300\",\n },\n violet: {\n activeText: \"text-violet-700 dark:text-violet-200\",\n indicator:\n \"bg-violet-500/15 dark:bg-violet-400/20 border border-violet-400/40 dark:border-violet-300/20\",\n hover: \"hover:text-violet-600 dark:hover:text-violet-300\",\n },\n purple: {\n activeText: \"text-purple-700 dark:text-purple-200\",\n indicator:\n \"bg-purple-500/15 dark:bg-purple-400/20 border border-purple-400/40 dark:border-purple-300/20\",\n hover: \"hover:text-purple-600 dark:hover:text-purple-300\",\n },\n fuchsia: {\n activeText: \"text-fuchsia-700 dark:text-fuchsia-200\",\n indicator:\n \"bg-fuchsia-500/15 dark:bg-fuchsia-400/20 border border-fuchsia-400/40 dark:border-fuchsia-300/20\",\n hover: \"hover:text-fuchsia-600 dark:hover:text-fuchsia-300\",\n }, rose: {\n activeText: \"text-rose-700 dark:text-rose-200\",\n indicator:\n \"bg-rose-500/15 dark:bg-rose-400/20 border border-rose-400/40 dark:border-rose-300/20\",\n hover: \"hover:text-rose-600 dark:hover:text-rose-300\",\n },\n slate: {\n activeText: \"text-slate-700 dark:text-slate-200\",\n indicator:\n \"bg-slate-500/15 dark:bg-slate-400/20 border border-slate-400/40 dark:border-slate-300/20\",\n hover: \"hover:text-slate-600 dark:hover:text-slate-300\",\n },\n gray: {\n activeText: \"text-gray-700 dark:text-gray-200\",\n indicator:\n \"bg-gray-500/15 dark:bg-gray-400/20 border border-gray-400/40 dark:border-gray-300/20\",\n hover: \"hover:text-gray-600 dark:hover:text-gray-300\",\n },\n zinc: {\n activeText: \"text-zinc-700 dark:text-zinc-200\",\n indicator:\n \"bg-zinc-500/15 dark:bg-zinc-400/20 border border-zinc-400/40 dark:border-zinc-300/20\",\n hover: \"hover:text-zinc-600 dark:hover:text-zinc-300\",\n },\n neutral: {\n activeText: \"text-neutral-700 dark:text-neutral-200\",\n indicator:\n \"bg-neutral-500/15 dark:bg-neutral-400/20 border border-neutral-400/40 dark:border-neutral-300/20\",\n hover: \"hover:text-neutral-600 dark:hover:text-neutral-300\",\n },\n stone: {\n activeText: \"text-stone-700 dark:text-stone-200\",\n indicator:\n \"bg-stone-500/15 dark:bg-stone-400/20 border border-stone-400/40 dark:border-stone-300/20\",\n hover: \"hover:text-stone-600 dark:hover:text-stone-300\",\n },};\n\nconst sizeTokens: Record<\n MultiToggleSize,\n {\n track: string;\n indicatorInset: string;\n cell: string;\n gap: string;\n label: string;\n icon: string;\n paddingY: string;\n }\n> = {\n sm: {\n track: \"h-8 text-xs\",\n indicatorInset: \"inset-y-[0px]\",\n cell: \"px-2 py-1\",\n gap: \"gap-1\",\n label: \"text-xs\",\n icon: \"h-4 w-4\",\n paddingY: \"py-0.5\",\n },\n md: {\n track: \"h-9 text-sm\",\n indicatorInset: \"inset-y-[0px]\",\n cell: \"px-2.5 py-1.5\",\n gap: \"gap-1.5\",\n label: \"text-sm\",\n icon: \"h-5 w-5\",\n paddingY: \"py-0.5\",\n },\n lg: {\n track: \"h-11 text-base\",\n indicatorInset: \"inset-y-[0px]\",\n cell: \"px-3.5 py-2\",\n gap: \"gap-2\",\n label: \"text-base\",\n icon: \"h-6 w-6\",\n paddingY: \"py-0.5\",\n },\n};\n\nconst CONTAINER_HORIZONTAL_PADDING = 2;\nconst INDICATOR_MARGIN = 1;\n\nconst computeInset = (segmentWidth: number) => {\n if (segmentWidth <= 0) {\n return 0;\n }\n const proportional = segmentWidth / 16;\n return Math.min(INDICATOR_MARGIN, proportional);\n};\n\nconst toCssDimension = (value?: number | string | null): string | undefined => {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (typeof value === \"number\") {\n return `${value}px`;\n }\n\n return value;\n};\n\nconst MultiToggle: React.FC<MultiToggleProps> = ({\n options,\n value,\n onChange,\n size = \"md\",\n color = \"blue\",\n fullWidth = false,\n className,\n showOnlyActiveLabel = false,\n truncateOverflow,\n adaptiveWidth = false,\n optionMaxWidth,\n disabled,\n rounded = \"lg\",\n style: sharedButtonStyle,\n activeWidthStrategy = \"auto\",\n variant = \"theme\",\n accentColor,\n ...buttonProps\n}) => {\n const renderIcon = useIconRenderer();\n const containerRef = useRef<HTMLDivElement | null>(null);\n const optionRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const measurementRefs = useRef<Array<HTMLDivElement | null>>([]);\n const hasCustomWidths =\n adaptiveWidth || options.some((option) => option.width !== undefined);\n const [indicatorInlineStyle, setIndicatorInlineStyle] =\n useState<React.CSSProperties>();\n const [maxOptionWidth, setMaxOptionWidth] = useState<number>();\n const parsedOptionMaxWidth = toCssDimension(optionMaxWidth);\n const shouldLockToMaxWidth = hasCustomWidths && activeWidthStrategy === \"max\";\n const controlRounded =\n rounded === \"none\"\n ? \"\"\n : rounded === \"xs\"\n ? \"rounded-xs\"\n : rounded === \"sm\"\n ? \"rounded-sm\"\n : rounded === \"md\"\n ? \"rounded-md\"\n : rounded === \"lg\"\n ? \"rounded-lg\"\n : rounded === \"xl\"\n ? \"rounded-xl\"\n : \"rounded-full\";\n\n // Inner indicator is inset by p-0.5 (2px), so use one step smaller radius\n // to preserve consistent visual gap between track edge and indicator corners.\n const indicatorRounded =\n rounded === \"none\" || rounded === \"xs\"\n ? \"\"\n : rounded === \"sm\"\n ? \"rounded-xs\"\n : rounded === \"md\"\n ? \"rounded-sm\"\n : rounded === \"lg\"\n ? \"rounded-md\"\n : rounded === \"xl\"\n ? \"rounded-lg\"\n : \"rounded-full\";\n\n const optionCount = options.length ?? 0;\n const activeIndex = Math.max(\n 0,\n options.findIndex((option) => option.value === value),\n );\n const sizeStyles = sizeTokens[size] ?? sizeTokens.md;\n const colorStyles = toneTokens[color] ?? toneTokens.neutral;\n const variantTokens = getMultiToggleVariantTokens(color);\n const isVariantMode = variant === \"solid\" || variant === \"soft\";\n const activeTextClass = accentColor\n ? isVariantMode\n ? getMultiToggleVariantTokens(accentColor).activeText\n : (toneTokens[accentColor] ?? toneTokens.neutral).activeText\n : isVariantMode\n ? variantTokens.activeText\n : colorStyles.activeText;\n const usesSegmentLayout = !hasCustomWidths && !shouldLockToMaxWidth;\n optionRefs.current.length = optionCount;\n measurementRefs.current.length = optionCount;\n\n const indicatorStyle = useMemo(() => {\n const segmentExpression = `(100% - ${CONTAINER_HORIZONTAL_PADDING * 2}px) / ${optionCount}`;\n const margin = INDICATOR_MARGIN;\n\n if (usesSegmentLayout) {\n return {\n width: `calc(${segmentExpression} - ${margin * 2}px)`,\n transform: `translateX(calc(${CONTAINER_HORIZONTAL_PADDING}px + ${activeIndex} * (${segmentExpression}) + ${margin}px))`,\n };\n }\n\n const widthPercent = 100 / optionCount;\n return {\n width: `calc(${widthPercent}% - ${margin * 2}px)`,\n transform: `translateX(calc(${activeIndex} * (100% / ${optionCount}) + ${margin}px))`,\n };\n }, [activeIndex, optionCount, usesSegmentLayout]);\n\n const updateIndicatorPosition = useCallback(() => {\n const container = containerRef.current;\n const activeButton = optionRefs.current[activeIndex];\n\n if (!container || !activeButton) {\n return;\n }\n\n const containerStyles = window.getComputedStyle(container);\n const paddingLeft = parseFloat(containerStyles?.paddingLeft ?? \"0\") || 0;\n const paddingRight = parseFloat(containerStyles?.paddingRight ?? \"0\") || 0;\n const containerInnerWidth = Math.max(\n 0,\n container.clientWidth - paddingLeft - paddingRight,\n );\n\n if (usesSegmentLayout) {\n const segmentWidth = containerInnerWidth / optionCount;\n const inset = computeInset(segmentWidth);\n const indicatorWidth = Math.max(0, segmentWidth - inset * 2);\n const offset = paddingLeft + activeIndex * segmentWidth + inset;\n setIndicatorInlineStyle({\n width: `${indicatorWidth}px`,\n transform: `translateX(${offset}px)`,\n });\n return;\n }\n\n const baseWidth =\n shouldLockToMaxWidth && maxOptionWidth\n ? maxOptionWidth\n : activeButton.offsetWidth;\n const inset = computeInset(baseWidth);\n const indicatorWidth = Math.max(\n 0,\n Math.min(baseWidth, containerInnerWidth) - inset * 2,\n );\n // offsetLeft is relative to the container's border-box edge (same as `absolute left-0`),\n // so do NOT subtract paddingLeft — that would shift the pill left and create unequal gutters.\n let offset = activeButton.offsetLeft + inset;\n const maxOffset = Math.max(\n inset,\n container.clientWidth - indicatorWidth - inset,\n );\n offset = Math.min(Math.max(offset, inset), maxOffset);\n\n setIndicatorInlineStyle({\n width: `${indicatorWidth}px`,\n transform: `translateX(${offset}px)`,\n });\n }, [\n activeIndex,\n shouldLockToMaxWidth,\n maxOptionWidth,\n optionCount,\n usesSegmentLayout,\n ]);\n\n const optionsSignature = useMemo(\n () =>\n options\n .map((option) => {\n const labelSignature =\n typeof option.label === \"string\"\n ? option.label\n : option.label !== undefined\n ? \"node\"\n : \"\";\n return `${option.value}:${option.width ?? \"\"}:${labelSignature}`;\n })\n .join(\"|\"),\n [options],\n );\n\n useLayoutEffect(() => {\n if (!shouldLockToMaxWidth) {\n setMaxOptionWidth(undefined);\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const containerStyles = window.getComputedStyle(container);\n const paddingLeft = parseFloat(containerStyles?.paddingLeft ?? \"0\") || 0;\n const paddingRight = parseFloat(containerStyles?.paddingRight ?? \"0\") || 0;\n const containerInnerWidth = Math.max(\n 0,\n container.clientWidth - paddingLeft - paddingRight,\n );\n\n const widths = measurementRefs.current.map(\n (node) => node?.offsetWidth ?? 0,\n );\n const largestWidth = widths.reduce(\n (currentMax, width) => (width > currentMax ? width : currentMax),\n 0,\n );\n const constrainedWidth = Math.min(largestWidth, containerInnerWidth);\n\n setMaxOptionWidth(constrainedWidth || undefined);\n }, [shouldLockToMaxWidth, optionsSignature, size, optionMaxWidth]);\n\n useLayoutEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n updateIndicatorPosition();\n\n const handleWindowResize = () => {\n updateIndicatorPosition();\n };\n\n let resizeObserver: ResizeObserver | undefined;\n\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n updateIndicatorPosition();\n });\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n optionRefs.current.forEach((button) => {\n if (button) {\n resizeObserver?.observe(button);\n }\n });\n }\n\n window.addEventListener(\"resize\", handleWindowResize);\n\n return () => {\n window.removeEventListener(\"resize\", handleWindowResize);\n resizeObserver?.disconnect();\n };\n }, [\n optionsSignature,\n optionMaxWidth,\n updateIndicatorPosition,\n shouldLockToMaxWidth,\n maxOptionWidth,\n ]);\n\n const shouldTruncate = truncateOverflow ?? true;\n const computedIndicatorStyle = indicatorInlineStyle ?? indicatorStyle;\n\n return (\n <div\n ref={containerRef}\n className={classNames(\n \"relative inline-flex select-none items-center p-0.5\",\n isVariantMode\n ? \"bg-neutral-100 dark:bg-neutral-700\"\n : \"bg-neutral-100 shadow-inner dark:bg-neutral-600\",\n controlRounded,\n sizeStyles.track,\n fullWidth && \"w-full\",\n disabled && \"opacity-60 cursor-not-allowed\",\n className,\n )}\n role=\"radiogroup\"\n aria-disabled={disabled}\n >\n <span\n className={classNames(\n \"pointer-events-none absolute left-0 flex items-center justify-center transition-transform duration-200 ease-out\",\n sizeStyles.indicatorInset,\n sizeStyles.paddingY,\n )}\n style={computedIndicatorStyle ?? indicatorStyle}\n >\n <span\n className={classNames(\n \"h-full w-full\",\n indicatorRounded,\n variant === \"solid\" && \"bg-white dark:bg-neutral-800 shadow-sm\",\n variant === \"soft\" && variantTokens.softIndicator,\n variant === \"theme\" && colorStyles.indicator,\n )}\n />\n </span>\n\n {shouldLockToMaxWidth && (\n <div\n aria-hidden\n style={{\n position: \"absolute\",\n visibility: \"hidden\",\n pointerEvents: \"none\",\n whiteSpace: \"nowrap\",\n height: 0,\n overflow: \"hidden\",\n }}\n >\n {options.map((option, index) => {\n const measurementStyle: React.CSSProperties = {};\n if (option.width && option.width !== \"auto\") {\n const targetWidth = toCssDimension(option.width);\n if (targetWidth) {\n measurementStyle.width = targetWidth;\n }\n }\n if (parsedOptionMaxWidth) {\n measurementStyle.maxWidth = parsedOptionMaxWidth;\n }\n\n return (\n <div\n key={`measure-${option.value}`}\n ref={(node) => {\n measurementRefs.current[index] = node;\n }}\n className={classNames(\n \"inline-flex min-w-0 items-center justify-center rounded-full\",\n sizeStyles.cell,\n sizeStyles.gap,\n )}\n style={measurementStyle}\n >\n <span\n className={classNames(\n \"flex min-w-0 items-center justify-center\",\n sizeStyles.gap,\n )}\n >\n {option.icon &&\n renderIcon(option.icon, size as IconSize, sizeStyles.icon)}\n {option.label && (\n <span className={classNames(sizeStyles.label, \"min-w-0\")}>\n {option.label}\n </span>\n )}\n </span>\n </div>\n );\n })}\n </div>\n )}\n\n {options.map((option, index) => {\n const isActive = option.value == value;\n const optionDisabled = disabled || option.disabled;\n const applyCustomWidth =\n hasCustomWidths && (!showOnlyActiveLabel || isActive);\n const customWidthValue =\n option.width !== undefined\n ? option.width\n : adaptiveWidth && applyCustomWidth\n ? \"auto\"\n : undefined;\n let buttonStyle: React.CSSProperties | undefined;\n\n if (applyCustomWidth) {\n buttonStyle = {\n flex: \"0 1 auto\",\n minWidth: 0,\n };\n\n if (customWidthValue && customWidthValue !== \"auto\") {\n const targetWidth = toCssDimension(customWidthValue);\n if (targetWidth) {\n buttonStyle.flex = \"0 0 auto\";\n buttonStyle.width = targetWidth;\n }\n }\n\n if (parsedOptionMaxWidth) {\n buttonStyle.maxWidth = parsedOptionMaxWidth;\n }\n }\n\n if (shouldLockToMaxWidth && isActive && maxOptionWidth) {\n if (!buttonStyle) {\n buttonStyle = {\n flex: \"0 0 auto\",\n minWidth: 0,\n };\n } else {\n buttonStyle.flex = \"0 0 auto\";\n }\n buttonStyle.width = `${maxOptionWidth}px`;\n if (parsedOptionMaxWidth) {\n buttonStyle.maxWidth = parsedOptionMaxWidth;\n }\n }\n\n const mergedStyle =\n sharedButtonStyle || buttonStyle\n ? {\n ...(sharedButtonStyle ?? {}),\n ...(buttonStyle ?? {}),\n }\n : undefined;\n\n return (\n <button\n ref={(node) => {\n optionRefs.current[index] = node;\n }}\n key={option.value}\n type=\"button\"\n className={classNames(\n \"relative z-[1] flex min-w-0 items-center justify-center transition-colors duration-150\",\n controlRounded,\n sizeStyles.cell,\n sizeStyles.gap,\n hasCustomWidths ? \"flex-none\" : \"flex-1\",\n optionDisabled\n ? \"text-neutral-400 dark:text-neutral-500 cursor-not-allowed\"\n : classNames(\n \"cursor-pointer\",\n isActive\n ? activeTextClass\n : \"text-neutral-600 dark:text-neutral-300\",\n isVariantMode ? variantTokens.hover : colorStyles.hover,\n ),\n )}\n onClick={() => {\n if (optionDisabled || option.value === value) {\n return;\n }\n onChange(option.value);\n }}\n disabled={optionDisabled}\n aria-pressed={isActive}\n role=\"radio\"\n aria-checked={isActive}\n tabIndex={optionDisabled ? -1 : isActive ? 0 : -1}\n style={mergedStyle}\n {...buttonProps}\n >\n <span\n className={classNames(\n \"flex min-w-0 items-center justify-center\",\n sizeStyles.gap,\n )}\n >\n {option.icon &&\n renderIcon(option.icon, size as IconSize, sizeStyles.icon)}\n {option.label && (!showOnlyActiveLabel || isActive) && (\n <span\n className={classNames(\n sizeStyles.label,\n \"min-w-0 px-1 text-center leading-tight block\",\n shouldTruncate ? \"truncate\" : \"whitespace-nowrap\",\n )}\n title={\n shouldTruncate && typeof option.label === \"string\"\n ? option.label\n : undefined\n }\n >\n {option.label}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n );\n};\n\nMultiToggle.displayName = \"MultiToggle\";\n\nexport default MultiToggle;\n","import React, { useId } from \"react\";\nimport classNames from \"classnames\";\nimport type { TrueColor } from \"../theme/Theme\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport type { IconSize } from \"../types/Icon\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ButtonSelectorMode = \"single\" | \"multi\";\n\nexport interface ButtonSelectorOption<T extends string = string> {\n value: T;\n label: string;\n description?: string;\n /** Icon name (string from icon registry) or a ReactElement */\n icon?: string | React.ReactElement;\n disabled?: boolean;\n}\n\nexport interface ButtonSelectorProps<T extends string = string> {\n options: ButtonSelectorOption<T>[];\n /** In single mode: a single value. In multi mode: an array of values. */\n value: T | T[];\n onChange: (value: T | T[]) => void;\n /** \"single\" enforces radio-like behaviour; \"multi\" allows multiple selections (default). */\n mode?: ButtonSelectorMode;\n color?: TrueColor;\n /** Number of grid columns (default: 2) */\n cols?: 1 | 2 | 3 | 4;\n /** Tailwind gap class applied to the grid (default: \"gap-2\") */\n gap?: string;\n /** Optional label rendered above the grid */\n label?: string;\n /** Icon size passed to the icon renderer (default: \"sm\") */\n iconSize?: IconSize;\n className?: string;\n disabled?: boolean;\n}\n\n// ─── Selected-state color tokens ───────────────────────────────────────────────\n// Defined as a static literal map so Tailwind's scanner can detect every class.\n\ntype SelectedTokens = {\n border: string;\n bg: string;\n icon: string;\n label: string;\n indicatorBg: string;\n indicatorBorder: string;\n};\n\nconst COLOR_TOKENS: Record<TrueColor, SelectedTokens> = {\n red: {\n border: \"border-red-400 dark:border-red-500\",\n bg: \"bg-red-50 dark:bg-red-500/10\",\n icon: \"text-red-600 dark:text-red-400\",\n label: \"text-red-700 dark:text-red-300\",\n indicatorBg: \"bg-red-500\",\n indicatorBorder: \"border-red-500\",\n },\n orange: {\n border: \"border-orange-400 dark:border-orange-500\",\n bg: \"bg-orange-50 dark:bg-orange-500/10\",\n icon: \"text-orange-600 dark:text-orange-400\",\n label: \"text-orange-700 dark:text-orange-300\",\n indicatorBg: \"bg-orange-500\",\n indicatorBorder: \"border-orange-500\",\n },\n amber: {\n border: \"border-amber-400 dark:border-amber-500\",\n bg: \"bg-amber-50 dark:bg-amber-500/10\",\n icon: \"text-amber-600 dark:text-amber-400\",\n label: \"text-amber-700 dark:text-amber-300\",\n indicatorBg: \"bg-amber-500\",\n indicatorBorder: \"border-amber-500\",\n },\n yellow: {\n border: \"border-yellow-400 dark:border-yellow-500\",\n bg: \"bg-yellow-50 dark:bg-yellow-500/10\",\n icon: \"text-yellow-600 dark:text-yellow-400\",\n label: \"text-yellow-700 dark:text-yellow-300\",\n indicatorBg: \"bg-yellow-500\",\n indicatorBorder: \"border-yellow-500\",\n },\n lime: {\n border: \"border-lime-400 dark:border-lime-500\",\n bg: \"bg-lime-50 dark:bg-lime-500/10\",\n icon: \"text-lime-600 dark:text-lime-400\",\n label: \"text-lime-700 dark:text-lime-300\",\n indicatorBg: \"bg-lime-500\",\n indicatorBorder: \"border-lime-500\",\n },\n green: {\n border: \"border-green-400 dark:border-green-500\",\n bg: \"bg-green-50 dark:bg-green-500/10\",\n icon: \"text-green-600 dark:text-green-400\",\n label: \"text-green-700 dark:text-green-300\",\n indicatorBg: \"bg-green-500\",\n indicatorBorder: \"border-green-500\",\n },\n emerald: {\n border: \"border-emerald-400 dark:border-emerald-500\",\n bg: \"bg-emerald-50 dark:bg-emerald-500/10\",\n icon: \"text-emerald-600 dark:text-emerald-400\",\n label: \"text-emerald-700 dark:text-emerald-300\",\n indicatorBg: \"bg-emerald-500\",\n indicatorBorder: \"border-emerald-500\",\n },\n teal: {\n border: \"border-teal-400 dark:border-teal-500\",\n bg: \"bg-teal-50 dark:bg-teal-500/10\",\n icon: \"text-teal-600 dark:text-teal-400\",\n label: \"text-teal-700 dark:text-teal-300\",\n indicatorBg: \"bg-teal-500\",\n indicatorBorder: \"border-teal-500\",\n },\n cyan: {\n border: \"border-cyan-400 dark:border-cyan-500\",\n bg: \"bg-cyan-50 dark:bg-cyan-500/10\",\n icon: \"text-cyan-600 dark:text-cyan-400\",\n label: \"text-cyan-700 dark:text-cyan-300\",\n indicatorBg: \"bg-cyan-500\",\n indicatorBorder: \"border-cyan-500\",\n },\n sky: {\n border: \"border-sky-400 dark:border-sky-500\",\n bg: \"bg-sky-50 dark:bg-sky-500/10\",\n icon: \"text-sky-600 dark:text-sky-400\",\n label: \"text-sky-700 dark:text-sky-300\",\n indicatorBg: \"bg-sky-500\",\n indicatorBorder: \"border-sky-500\",\n },\n blue: {\n border: \"border-blue-400 dark:border-blue-500\",\n bg: \"bg-blue-50 dark:bg-blue-500/10\",\n icon: \"text-blue-600 dark:text-blue-400\",\n label: \"text-blue-700 dark:text-blue-300\",\n indicatorBg: \"bg-blue-500\",\n indicatorBorder: \"border-blue-500\",\n },\n indigo: {\n border: \"border-indigo-400 dark:border-indigo-500\",\n bg: \"bg-indigo-50 dark:bg-indigo-500/10\",\n icon: \"text-indigo-600 dark:text-indigo-400\",\n label: \"text-indigo-700 dark:text-indigo-300\",\n indicatorBg: \"bg-indigo-500\",\n indicatorBorder: \"border-indigo-500\",\n },\n violet: {\n border: \"border-violet-400 dark:border-violet-500\",\n bg: \"bg-violet-50 dark:bg-violet-500/10\",\n icon: \"text-violet-600 dark:text-violet-400\",\n label: \"text-violet-700 dark:text-violet-300\",\n indicatorBg: \"bg-violet-500\",\n indicatorBorder: \"border-violet-500\",\n },\n purple: {\n border: \"border-purple-400 dark:border-purple-500\",\n bg: \"bg-purple-50 dark:bg-purple-500/10\",\n icon: \"text-purple-600 dark:text-purple-400\",\n label: \"text-purple-700 dark:text-purple-300\",\n indicatorBg: \"bg-purple-500\",\n indicatorBorder: \"border-purple-500\",\n },\n fuchsia: {\n border: \"border-fuchsia-400 dark:border-fuchsia-500\",\n bg: \"bg-fuchsia-50 dark:bg-fuchsia-500/10\",\n icon: \"text-fuchsia-600 dark:text-fuchsia-400\",\n label: \"text-fuchsia-700 dark:text-fuchsia-300\",\n indicatorBg: \"bg-fuchsia-500\",\n indicatorBorder: \"border-fuchsia-500\",\n },\n rose: {\n border: \"border-rose-400 dark:border-rose-500\",\n bg: \"bg-rose-50 dark:bg-rose-500/10\",\n icon: \"text-rose-600 dark:text-rose-400\",\n label: \"text-rose-700 dark:text-rose-300\",\n indicatorBg: \"bg-rose-500\",\n indicatorBorder: \"border-rose-500\",\n },\n slate: {\n border: \"border-slate-400 dark:border-slate-500\",\n bg: \"bg-slate-50 dark:bg-slate-500/10\",\n icon: \"text-slate-600 dark:text-slate-400\",\n label: \"text-slate-700 dark:text-slate-300\",\n indicatorBg: \"bg-slate-500\",\n indicatorBorder: \"border-slate-500\",\n },\n gray: {\n border: \"border-gray-400 dark:border-gray-500\",\n bg: \"bg-gray-50 dark:bg-gray-500/10\",\n icon: \"text-gray-600 dark:text-gray-400\",\n label: \"text-gray-700 dark:text-gray-300\",\n indicatorBg: \"bg-gray-500\",\n indicatorBorder: \"border-gray-500\",\n },\n zinc: {\n border: \"border-zinc-400 dark:border-zinc-500\",\n bg: \"bg-zinc-50 dark:bg-zinc-500/10\",\n icon: \"text-zinc-600 dark:text-zinc-400\",\n label: \"text-zinc-700 dark:text-zinc-300\",\n indicatorBg: \"bg-zinc-500\",\n indicatorBorder: \"border-zinc-500\",\n },\n neutral: {\n border: \"border-neutral-400 dark:border-neutral-500\",\n bg: \"bg-neutral-50 dark:bg-neutral-500/10\",\n icon: \"text-neutral-600 dark:text-neutral-400\",\n label: \"text-neutral-700 dark:text-neutral-300\",\n indicatorBg: \"bg-neutral-500\",\n indicatorBorder: \"border-neutral-500\",\n },\n stone: {\n border: \"border-stone-400 dark:border-stone-500\",\n bg: \"bg-stone-50 dark:bg-stone-500/10\",\n icon: \"text-stone-600 dark:text-stone-400\",\n label: \"text-stone-700 dark:text-stone-300\",\n indicatorBg: \"bg-stone-500\",\n indicatorBorder: \"border-stone-500\",\n },\n};\n\n// ─── Grid cols map ─────────────────────────────────────────────────────────────\n\nconst colsClass: Record<1 | 2 | 3 | 4, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function ButtonSelector<T extends string = string>(\n props: ButtonSelectorProps<T>,\n): React.ReactElement {\n const {\n options,\n value,\n onChange,\n mode = \"multi\",\n color = \"blue\",\n cols = 2,\n gap = \"gap-2\",\n label,\n iconSize = \"sm\",\n className,\n disabled = false,\n } = props;\n\n const renderIcon = useIconRenderer();\n const labelId = useId();\n const tokens = COLOR_TOKENS[color] ?? COLOR_TOKENS.blue;\n\n const isSelected = (v: T): boolean =>\n Array.isArray(value) ? value.includes(v) : value === v;\n\n const handleClick = (v: T, itemDisabled: boolean) => {\n if (disabled || itemDisabled) return;\n if (mode === \"single\") {\n onChange(v);\n } else {\n const arr = Array.isArray(value) ? value : value ? [value] : [];\n onChange(arr.includes(v) ? arr.filter((x) => x !== v) : [...arr, v]);\n }\n };\n\n return (\n <div className={classNames(\"flex flex-col\", className)}>\n {label && (\n <p\n id={labelId}\n className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-neutral-500 dark:text-neutral-400\"\n >\n {label}\n </p>\n )}\n\n <div\n className={classNames(\"grid\", colsClass[cols], gap)}\n role={mode === \"single\" ? \"radiogroup\" : \"group\"}\n aria-labelledby={label ? labelId : undefined}\n >\n {options.map((opt) => {\n const selected = isSelected(opt.value);\n const itemDisabled = disabled || !!opt.disabled;\n\n return (\n <button\n key={opt.value}\n type=\"button\"\n role={mode === \"single\" ? \"radio\" : \"checkbox\"}\n aria-checked={selected}\n disabled={itemDisabled}\n onClick={() => handleClick(opt.value, !!opt.disabled)}\n className={classNames(\n \"flex items-center gap-2.5 rounded-xl border px-3 py-2.5 text-left transition-colors duration-150\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n itemDisabled && \"cursor-not-allowed opacity-60\",\n selected\n ? [tokens.border, tokens.bg]\n : \"border-neutral-200/70 bg-white dark:border-neutral-700/60 dark:bg-neutral-800/40 hover:border-neutral-300 dark:hover:border-neutral-600\",\n )}\n >\n {/* Icon */}\n {opt.icon && (\n <span\n className={classNames(\n \"shrink-0\",\n selected\n ? tokens.icon\n : \"text-neutral-400 dark:text-neutral-500\",\n )}\n >\n {renderIcon(opt.icon, iconSize)}\n </span>\n )}\n\n {/* Label + description */}\n <div className=\"min-w-0 flex-1\">\n <p\n className={classNames(\n \"truncate text-xs font-semibold leading-tight\",\n selected\n ? tokens.label\n : \"text-neutral-700 dark:text-neutral-200\",\n )}\n >\n {opt.label}\n </p>\n {opt.description && (\n <p className=\"truncate text-[10px] leading-tight text-neutral-400 dark:text-neutral-500\">\n {opt.description}\n </p>\n )}\n </div>\n\n {/* Indicator (checkbox / radio dot) */}\n <div\n className={classNames(\n \"ml-auto flex h-4 w-4 shrink-0 items-center justify-center rounded-full border-2\",\n selected\n ? [tokens.indicatorBg, tokens.indicatorBorder]\n : \"border-neutral-300 dark:border-neutral-600\",\n )}\n aria-hidden=\"true\"\n >\n {selected && (\n <div className=\"h-1.5 w-1.5 rounded-full bg-white\" />\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport default ButtonSelector;\n","import classNames from \"classnames\";\nimport React, { type ReactNode, useId } from \"react\";\n\ntype FormFieldLayout = \"stacked\" | \"inline\";\ntype FormFieldValidationStatus = \"none\" | \"error\" | \"success\";\ntype FormFieldWidth = \"auto\" | \"full\";\n\nexport interface FormFieldProps {\n label?: ReactNode;\n labelFor?: string;\n description?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode;\n validationStatus?: FormFieldValidationStatus;\n required?: boolean;\n optionalLabel?: ReactNode;\n labelAction?: ReactNode;\n layout?: FormFieldLayout;\n children: ReactNode;\n className?: string;\n helpText?: ReactNode;\n width?: FormFieldWidth;\n}\n\nconst descriptionColor = \"text-neutral-600 dark:text-neutral-300\";\nconst hintColor = \"text-neutral-500 dark:text-neutral-400\";\nconst errorColor = \"text-rose-600 dark:text-rose-400\";\nconst successColor = \"text-emerald-600 dark:text-emerald-400\";\n\nconst FormField: React.FC<FormFieldProps> = ({\n label,\n labelFor,\n description,\n hint,\n error,\n validationStatus = \"none\",\n required = false,\n optionalLabel,\n labelAction,\n layout = \"stacked\",\n children,\n className,\n helpText,\n width = \"auto\",\n}) => {\n const fieldId = useId();\n type ChildElementProps = {\n id?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: string;\n };\n\n const childElement = React.isValidElement(children)\n ? (children as React.ReactElement<ChildElementProps>)\n : null;\n\n const controlId = labelFor ?? childElement?.props?.id ?? `field-${fieldId}`;\n\n const descriptionId = description ? `${controlId}-description` : undefined;\n const hintId = hint ? `${controlId}-hint` : undefined;\n const errorId = error ? `${controlId}-error` : undefined;\n const helpId = helpText ? `${controlId}-help` : undefined;\n\n const describedBy = [descriptionId, hintId, errorId, helpId]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n const child =\n childElement && describedBy\n ? React.cloneElement(childElement, {\n id: controlId,\n \"aria-describedby\": classNames(\n childElement.props[\"aria-describedby\"],\n describedBy,\n ),\n \"aria-invalid\":\n validationStatus === \"error\"\n ? \"true\"\n : (childElement.props[\"aria-invalid\"] ?? undefined),\n })\n : children;\n\n const layoutClasses =\n layout === \"inline\"\n ? \"sm:grid sm:grid-cols-3 sm:items-start sm:gap-6\"\n : \"flex flex-col gap-2 justify-start h-full\";\n\n const widthClasses = width === \"full\" ? \"w-full\" : \"w-auto\";\n\n const labelWrapperClasses =\n layout === \"inline\"\n ? \"sm:col-span-1 flex flex-col\"\n : \"flex items-center justify-between gap-2\";\n\n const controlWrapperClasses =\n layout === \"inline\"\n ? \"sm:col-span-2 mt-2 sm:mt-0\"\n : \"p-1 flex flex-col gap-2\";\n\n const statusColor =\n validationStatus === \"error\"\n ? errorColor\n : validationStatus === \"success\"\n ? successColor\n : hintColor;\n\n return (\n <div className={classNames(layoutClasses, widthClasses, className)}>\n <div className={labelWrapperClasses}>\n {(label || optionalLabel) && (\n <div className=\"flex items-center gap-2\">\n {label && (\n <label\n htmlFor={controlId}\n className=\"text-sm font-medium text-neutral-900 dark:text-neutral-100\"\n >\n {label}\n {required && (\n <span\n className=\"ml-1 text-rose-500 dark:text-rose-400\"\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n </label>\n )}\n {!required && optionalLabel && (\n <span className=\"text-sm text-neutral-500 dark:text-neutral-400\">\n {optionalLabel}\n </span>\n )}\n </div>\n )}\n {description && (\n <p\n id={descriptionId}\n className={classNames(\"mt-1 text-sm\", descriptionColor)}\n >\n {description}\n </p>\n )}\n {labelAction && <div className=\"mt-2 sm:mt-4\">{labelAction}</div>}\n </div>\n\n <div className={classNames(\"h-full\", controlWrapperClasses)}>\n <div className=\"flex flex-col gap-2 grow h-full\">{child}</div>\n {helpText && (\n <p id={helpId} className={classNames(\"text-sm\", hintColor)}>\n {helpText}\n </p>\n )}\n {error ? (\n <p id={errorId} className={classNames(\"text-sm\", errorColor)}>\n {error}\n </p>\n ) : hint ? (\n <p id={hintId} className={classNames(\"text-sm\", statusColor)}>\n {hint}\n </p>\n ) : null}\n </div>\n </div>\n );\n};\n\nexport default FormField;\n","import classNames from \"classnames\";\nimport React, { type ReactNode } from \"react\";\n\ntype FormLayoutColumns = 1 | 2 | 3;\ntype FormLayoutGap = \"sm\" | \"md\" | \"lg\";\n\nconst columnClasses: Record<FormLayoutColumns, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\n};\n\nconst gapClasses: Record<FormLayoutGap, string> = {\n sm: \"gap-x-4 gap-y-4\",\n md: \"gap-x-6 gap-y-6\",\n lg: \"gap-x-8 gap-y-8\",\n};\n\nconst verticalPaddingClasses: Record<FormLayoutGap, string> = {\n sm: \"py-2\",\n md: \"py-4\",\n lg: \"py-6\",\n};\n\nexport interface FormLayoutProps {\n columns?: FormLayoutColumns;\n gap?: FormLayoutGap;\n verticalPadding?: FormLayoutGap;\n children: ReactNode;\n className?: string;\n}\n\nconst alignItemsClasses: Record<FormLayoutColumns, string> = {\n 1: \"items-start\",\n 2: \"items-center\",\n 3: \"items-center\",\n};\n\nconst FormLayout: React.FC<FormLayoutProps> = ({\n columns = 1,\n gap = \"md\",\n children,\n className,\n verticalPadding = \"sm\",\n}) => (\n <div\n className={classNames(\n \"grid px-2\",\n verticalPaddingClasses[verticalPadding],\n alignItemsClasses[columns],\n columnClasses[columns],\n gapClasses[gap],\n className,\n )}\n >\n {children}\n </div>\n);\n\nexport default FormLayout;\n","import classNames from \"classnames\";\nimport React, { type ReactNode } from \"react\";\n\nexport interface FormSectionProps {\n title?: ReactNode;\n description?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n className?: string;\n padding?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst paddingMap: Record<\n \"sm\" | \"md\" | \"lg\",\n { body: string; header: string; footer: string }\n> = {\n sm: {\n header: \"px-4 py-4\",\n body: \"px-4 py-4\",\n footer: \"px-4 py-4\",\n },\n md: {\n header: \"px-6 py-5\",\n body: \"px-6 py-6\",\n footer: \"px-6 py-4\",\n },\n lg: {\n header: \"px-8 py-6\",\n body: \"px-8 py-8\",\n footer: \"px-8 py-6\",\n },\n};\n\nconst FormSection: React.FC<FormSectionProps> = ({\n title,\n description,\n footer,\n children,\n className,\n padding = \"md\",\n}) => {\n const pad = paddingMap[padding];\n return (\n <section\n className={classNames(\n \"rounded-2xl border border-neutral-200 bg-white shadow-sm dark:border-neutral-700 dark:bg-neutral-900\",\n className,\n )}\n >\n {(title || description) && (\n <div\n className={classNames(\n \"border-b border-neutral-200 dark:border-neutral-700\",\n pad.header,\n )}\n >\n <div>\n {title && (\n <h2 className=\"text-base font-semibold leading-6 text-neutral-900 dark:text-neutral-100\">\n {title}\n </h2>\n )}\n {description && (\n <p className=\"mt-2 text-sm text-neutral-600 dark:text-neutral-300\">\n {description}\n </p>\n )}\n </div>\n </div>\n )}\n <div className={classNames(\"space-y-6\", pad.body)}>{children}</div>\n {footer && (\n <div\n className={classNames(\n \"border-t border-neutral-200 dark:border-neutral-700\",\n pad.footer,\n )}\n >\n {footer}\n </div>\n )}\n </section>\n );\n};\n\nexport default FormSection;\n","import classNames from \"classnames\";\nimport React, {\n type ReactElement,\n type ReactNode,\n isValidElement,\n} from \"react\";\nimport type { ButtonColor } from \"./Button\";\n\ntype InputGroupSize = \"sm\" | \"md\" | \"lg\";\ntype InputGroupValidationStatus = \"none\" | \"error\" | \"success\";\n\nconst sizeTokens: Record<\n InputGroupSize,\n {\n text: string;\n padding: string;\n }\n> = {\n sm: {\n text: \"text-sm\",\n padding: \"px-3\",\n },\n md: {\n text: \"text-sm\",\n padding: \"px-3.5\",\n },\n lg: {\n text: \"text-base\",\n padding: \"px-4\",\n },\n};\n\ntype ToneTokens = {\n focusRing: string;\n ring: string;\n background: string;\n addonBackground: string;\n addonBorder: string;\n addonText: string;\n darkBackground: string;\n darkRing: string;\n darkAddonBackground: string;\n darkAddonBorder: string;\n darkAddonText: string;\n};\n\nconst toneTokens: Partial<Record<ButtonColor, ToneTokens>> = {\n indigo: {\n focusRing: \"focus-within:ring-indigo-400\",\n ring: \"ring-indigo-200/70\",\n background: \"bg-white\",\n addonBackground: \"bg-indigo-50/80\",\n addonBorder: \"border-indigo-200\",\n addonText: \"text-indigo-600\",\n darkBackground: \"dark:bg-neutral-900\",\n darkRing: \"dark:ring-indigo-500/30\",\n darkAddonBackground: \"dark:bg-indigo-500/15\",\n darkAddonBorder: \"dark:border-indigo-500/40\",\n darkAddonText: \"dark:text-indigo-200\",\n },\n blue: {\n focusRing: \"focus-within:ring-blue-400\",\n ring: \"ring-blue-200/70\",\n background: \"bg-white\",\n addonBackground: \"bg-blue-50/80\",\n addonBorder: \"border-blue-200\",\n addonText: \"text-blue-600\",\n darkBackground: \"dark:bg-neutral-900\",\n darkRing: \"dark:ring-blue-500/30\",\n darkAddonBackground: \"dark:bg-blue-500/15\",\n darkAddonBorder: \"dark:border-blue-500/40\",\n darkAddonText: \"dark:text-blue-200\",\n },\n emerald: {\n focusRing: \"focus-within:ring-emerald-400\",\n ring: \"ring-emerald-200/70\",\n background: \"bg-white\",\n addonBackground: \"bg-emerald-50/80\",\n addonBorder: \"border-emerald-200\",\n addonText: \"text-emerald-600\",\n darkBackground: \"dark:bg-neutral-900\",\n darkRing: \"dark:ring-emerald-500/30\",\n darkAddonBackground: \"dark:bg-emerald-500/15\",\n darkAddonBorder: \"dark:border-emerald-500/40\",\n darkAddonText: \"dark:text-emerald-200\",\n },\n amber: {\n focusRing: \"focus-within:ring-amber-400\",\n ring: \"ring-amber-200/70\",\n background: \"bg-white\",\n addonBackground: \"bg-amber-50/80\",\n addonBorder: \"border-amber-200\",\n addonText: \"text-amber-600\",\n darkBackground: \"dark:bg-neutral-900\",\n darkRing: \"dark:ring-amber-400/30\",\n darkAddonBackground: \"dark:bg-amber-500/20\",\n darkAddonBorder: \"dark:border-amber-500/40\",\n darkAddonText: \"dark:text-amber-200\",\n },\n rose: {\n focusRing: \"focus-within:ring-rose-400\",\n ring: \"ring-rose-200/70\",\n background: \"bg-white\",\n addonBackground: \"bg-rose-50/80\",\n addonBorder: \"border-rose-200\",\n addonText: \"text-rose-600\",\n darkBackground: \"dark:bg-neutral-900\",\n darkRing: \"dark:ring-rose-500/30\",\n darkAddonBackground: \"dark:bg-rose-500/15\",\n darkAddonBorder: \"dark:border-rose-500/40\",\n darkAddonText: \"dark:text-rose-200\",\n },\n slate: {\n focusRing: \"focus-within:ring-slate-500\",\n ring: \"ring-slate-200/70\",\n background: \"bg-white\",\n addonBackground: \"bg-slate-100\",\n addonBorder: \"border-slate-200\",\n addonText: \"text-slate-700\",\n darkBackground: \"dark:bg-neutral-900\",\n darkRing: \"dark:ring-slate-500/40\",\n darkAddonBackground: \"dark:bg-slate-800/70\",\n darkAddonBorder: \"dark:border-slate-700\",\n darkAddonText: \"dark:text-slate-200\",\n },};\n\nconst statusRing: Record<\n Exclude<InputGroupValidationStatus, \"none\">,\n string\n> = {\n error:\n \"focus-within:ring-rose-500 ring-rose-400/70 dark:ring-rose-400/40 dark:focus-within:ring-rose-400\",\n success:\n \"focus-within:ring-emerald-500 ring-emerald-400/70 dark:ring-emerald-400/40 dark:focus-within:ring-emerald-400\",\n};\n\nconst isAttachableChild = (child: ReactNode) => {\n if (!isValidElement(child)) {\n return false;\n }\n const type = child.type as { __UI_INPUT?: boolean; __UI_SELECT?: boolean };\n return Boolean(type && (type.__UI_INPUT || type.__UI_SELECT));\n};\n\nconst attachChildProps = (\n child: ReactNode,\n tone: ButtonColor,\n size: InputGroupSize,\n): ReactNode => {\n if (!isValidElement(child) || !isAttachableChild(child)) {\n return child;\n }\n\n const props: Record<string, unknown> = {\n tone,\n size,\n unstyled: true,\n };\n\n return React.cloneElement(child as ReactElement, props);\n};\n\nexport interface InputGroupProps {\n leadingAddon?: ReactNode;\n trailingAddon?: ReactNode;\n children: ReactNode;\n tone?: ButtonColor;\n size?: InputGroupSize;\n className?: string;\n validationStatus?: InputGroupValidationStatus;\n disabled?: boolean;\n}\n\nconst addonBaseClasses =\n \"inline-flex min-w-0 items-center whitespace-nowrap border border-transparent text-sm font-medium\";\n\nconst InputGroup: React.FC<InputGroupProps> = ({\n leadingAddon,\n trailingAddon,\n children,\n tone = \"blue\",\n size = \"md\",\n className,\n validationStatus = \"none\",\n disabled = false,\n}) => {\n const toneToken = (toneTokens[tone] ?? toneTokens.neutral) as ToneTokens;\n const sizeToken = sizeTokens[size] ?? sizeTokens.md;\n\n const ringClasses =\n validationStatus === \"none\"\n ? classNames(\n \"ring-1 ring-inset transition focus-within:ring-2\",\n toneToken.ring,\n toneToken.darkRing,\n toneToken.focusRing,\n )\n : statusRing[validationStatus];\n\n const groupClasses = classNames(\n \"flex w-full items-stretch overflow-hidden rounded-lg shadow-sm\",\n ringClasses,\n toneToken.background,\n toneToken.darkBackground,\n disabled && \"opacity-60 cursor-not-allowed\",\n className,\n );\n\n const leading =\n leadingAddon !== undefined ? (\n <span\n className={classNames(\n addonBaseClasses,\n sizeToken.text,\n sizeToken.padding,\n toneToken.addonBackground,\n toneToken.addonBorder,\n toneToken.addonText,\n toneToken.darkAddonBackground,\n toneToken.darkAddonBorder,\n toneToken.darkAddonText,\n \"border-r sm:min-w-max\",\n )}\n >\n {leadingAddon}\n </span>\n ) : null;\n\n const trailing =\n trailingAddon !== undefined ? (\n <span\n className={classNames(\n addonBaseClasses,\n sizeToken.text,\n sizeToken.padding,\n toneToken.addonBackground,\n toneToken.addonBorder,\n toneToken.addonText,\n toneToken.darkAddonBackground,\n toneToken.darkAddonBorder,\n toneToken.darkAddonText,\n \"border-l sm:min-w-max\",\n )}\n >\n {trailingAddon}\n </span>\n ) : null;\n\n const enhancedChildren = React.Children.map(children, (child) =>\n attachChildProps(child, tone, size),\n );\n\n return (\n <div\n className={groupClasses}\n data-disabled={disabled}\n data-status={validationStatus}\n >\n {leading}\n <div className=\"flex min-w-0 flex-1 items-center\">{enhancedChildren}</div>\n {trailing}\n </div>\n );\n};\n\nexport default InputGroup;\n","import React, { useEffect, useId, useMemo, useState } from \"react\";\nimport type { TrueColor } from \"../theme/Theme\";\n\nexport type MultiSelectPillOption = {\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n};\n\nexport interface MultiSelectPillsProps {\n /**\n * Used as the name for the generated hidden inputs (e.g. `${name}[]`).\n */\n name: string;\n /**\n * Options rendered as pills.\n */\n options: MultiSelectPillOption[];\n /**\n * Optional legend displayed above the pill list.\n */\n legend?: React.ReactNode;\n /**\n * Optional helper text rendered below the legend.\n */\n description?: React.ReactNode;\n /**\n * Current selected values when using the component in a controlled way.\n */\n value?: string[];\n /**\n * Default selected values for uncontrolled usage.\n */\n defaultValue?: string[];\n /**\n * Called whenever the selected values change.\n */\n onChange?: (selectedValues: string[]) => void;\n /**\n * Optional class applied to the fieldset wrapper.\n */\n className?: string;\n /**\n * Disable the whole control.\n */\n disabled?: boolean;\n /**\n * Tailwind size token controlling text size and padding.\n */\n size?: \"xs\" | \"sm\" | \"base\" | \"lg\";\n /**\n * Theme color used when a pill is selected.\n * Accepts any TrueColor value. Defaults to \"blue\".\n */\n color?: TrueColor;\n /**\n * Border radius of the pills.\n * Defaults to \"full\" (fully rounded).\n */\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n /**\n * Gap between pills.\n * Defaults to \"2\".\n */\n gap?: \"1\" | \"1.5\" | \"2\" | \"3\" | \"4\";\n /**\n * Selection behaviour. Defaults to multi-select.\n */\n selectionMode?: \"multiple\" | \"single\";\n}\n\n// ── Maps ──────────────────────────────────────────────────────────────────────\n\nconst sizeMap = {\n xs: { text: \"text-xs\", padding: \"px-2 py-1\" },\n sm: { text: \"text-sm\", padding: \"px-3 py-1.5\" },\n base: { text: \"text-base\", padding: \"px-4 py-2\" },\n lg: { text: \"text-lg\", padding: \"px-5 py-2.5\" },\n} as const;\n\nconst roundedMap = {\n none: \"rounded-none\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n} as const;\n\nconst gapMap = {\n \"1\": \"gap-1\",\n \"1.5\": \"gap-1.5\",\n \"2\": \"gap-2\",\n \"3\": \"gap-3\",\n \"4\": \"gap-4\",\n} as const;\n\nconst colorTokens: Record<TrueColor, { selected: string; ring: string }> = {\n red: {\n selected:\n \"border-rose-500 bg-rose-500 text-white dark:bg-rose-500 dark:border-rose-500\",\n ring: \"focus-visible:ring-rose-400\",\n },\n orange: {\n selected:\n \"border-orange-500 bg-orange-500 text-white dark:bg-orange-500 dark:border-orange-500\",\n ring: \"focus-visible:ring-orange-400\",\n },\n amber: {\n selected:\n \"border-amber-500 bg-amber-500 text-white dark:bg-amber-400 dark:border-amber-400\",\n ring: \"focus-visible:ring-amber-400\",\n },\n yellow: {\n selected:\n \"border-yellow-500 bg-yellow-500 text-white dark:bg-yellow-400 dark:border-yellow-400\",\n ring: \"focus-visible:ring-yellow-400\",\n },\n lime: {\n selected:\n \"border-lime-500 bg-lime-500 text-white dark:bg-lime-500 dark:border-lime-500\",\n ring: \"focus-visible:ring-lime-400\",\n },\n green: {\n selected:\n \"border-emerald-600 bg-emerald-600 text-white dark:bg-emerald-500 dark:border-emerald-500\",\n ring: \"focus-visible:ring-emerald-400\",\n },\n emerald: {\n selected:\n \"border-emerald-600 bg-emerald-600 text-white dark:bg-emerald-500 dark:border-emerald-500\",\n ring: \"focus-visible:ring-emerald-400\",\n },\n teal: {\n selected:\n \"border-teal-500 bg-teal-500 text-white dark:bg-teal-500 dark:border-teal-500\",\n ring: \"focus-visible:ring-teal-400\",\n },\n cyan: {\n selected:\n \"border-cyan-500 bg-cyan-500 text-white dark:bg-cyan-500 dark:border-cyan-500\",\n ring: \"focus-visible:ring-cyan-400\",\n },\n sky: {\n selected:\n \"border-sky-500 bg-sky-500 text-white dark:bg-sky-500 dark:border-sky-500\",\n ring: \"focus-visible:ring-sky-400\",\n },\n blue: {\n selected:\n \"border-blue-500 bg-blue-500 text-white dark:bg-blue-500 dark:border-blue-500\",\n ring: \"focus-visible:ring-blue-400\",\n },\n indigo: {\n selected:\n \"border-indigo-600 bg-indigo-600 text-white dark:bg-indigo-500 dark:border-indigo-500\",\n ring: \"focus-visible:ring-indigo-400\",\n },\n violet: {\n selected:\n \"border-violet-500 bg-violet-500 text-white dark:bg-violet-500 dark:border-violet-500\",\n ring: \"focus-visible:ring-violet-400\",\n },\n purple: {\n selected:\n \"border-purple-500 bg-purple-500 text-white dark:bg-purple-500 dark:border-purple-500\",\n ring: \"focus-visible:ring-purple-400\",\n },\n fuchsia: {\n selected:\n \"border-fuchsia-500 bg-fuchsia-500 text-white dark:bg-fuchsia-500 dark:border-fuchsia-500\",\n ring: \"focus-visible:ring-fuchsia-400\",\n }, rose: {\n selected:\n \"border-rose-500 bg-rose-500 text-white dark:bg-rose-500 dark:border-rose-500\",\n ring: \"focus-visible:ring-rose-400\",\n },\n slate: {\n selected:\n \"border-slate-600 bg-slate-600 text-white dark:bg-slate-500 dark:border-slate-500\",\n ring: \"focus-visible:ring-slate-400\",\n },\n gray: {\n selected:\n \"border-gray-600 bg-gray-600 text-white dark:bg-gray-500 dark:border-gray-500\",\n ring: \"focus-visible:ring-gray-400\",\n },\n zinc: {\n selected:\n \"border-zinc-600 bg-zinc-600 text-white dark:bg-zinc-500 dark:border-zinc-500\",\n ring: \"focus-visible:ring-zinc-400\",\n },\n neutral: {\n selected:\n \"border-neutral-600 bg-neutral-600 text-white dark:bg-neutral-500 dark:border-neutral-500\",\n ring: \"focus-visible:ring-neutral-400\",\n },\n stone: {\n selected:\n \"border-stone-600 bg-stone-600 text-white dark:bg-stone-500 dark:border-stone-500\",\n ring: \"focus-visible:ring-stone-400\",\n },};\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nconst MultiSelectPills: React.FC<MultiSelectPillsProps> = ({\n name,\n options,\n legend,\n description,\n value,\n defaultValue = [],\n onChange,\n className,\n disabled = false,\n size = \"sm\",\n color = \"blue\",\n rounded = \"full\",\n gap = \"2\",\n selectionMode = \"multiple\",\n}) => {\n const generatedId = useId();\n const isControlled = value !== undefined;\n\n const [internalSelected, setInternalSelected] =\n useState<string[]>(defaultValue);\n\n useEffect(() => {\n if (!isControlled) return;\n setInternalSelected(value ?? []);\n }, [isControlled, value]);\n\n useEffect(() => {\n if (isControlled) return;\n setInternalSelected(defaultValue);\n }, [defaultValue, isControlled]);\n\n const selectedValues = useMemo(\n () => (isControlled ? (value ?? []) : internalSelected),\n [isControlled, value, internalSelected],\n );\n const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);\n\n const sizeClasses = sizeMap[size];\n const roundedClass = roundedMap[rounded];\n const gapClass = gapMap[gap];\n const colorClasses = colorTokens[color] ?? colorTokens.blue;\n\n const handleToggle = (\n optionValue: string,\n optionDisabled: boolean | undefined,\n ) => {\n if (disabled || optionDisabled) return;\n\n const isAlreadySelected = selectedSet.has(optionValue);\n let nextSelected: string[];\n\n if (selectionMode === \"single\") {\n nextSelected = isAlreadySelected ? [] : [optionValue];\n } else {\n nextSelected = isAlreadySelected\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue];\n }\n\n if (!isControlled) setInternalSelected(nextSelected);\n onChange?.(nextSelected);\n };\n\n return (\n <fieldset\n className={[\"flex flex-col\", className ?? \"\"].filter(Boolean).join(\" \")}\n disabled={disabled}\n >\n {legend && (\n <legend\n className={`text-sm font-medium text-neutral-800 dark:text-neutral-200 ${!description ? \"pb-3\" : \"\"}`}\n >\n {legend}\n </legend>\n )}\n {description && (\n <p className=\"text-xs text-neutral-500 dark:text-neutral-400 pb-2\">\n {description}\n </p>\n )}\n\n <div className={`flex flex-wrap ${gapClass}`}>\n {options.map((option, index) => {\n const optionId = `${generatedId}-${name}-${index}`;\n const isSelected = selectedSet.has(option.value);\n const isOptionDisabled = option.disabled ?? false;\n\n return (\n <React.Fragment key={option.value}>\n <input\n type=\"checkbox\"\n id={optionId}\n name={`${name}[]`}\n value={option.value}\n checked={isSelected}\n readOnly\n className=\"sr-only\"\n tabIndex={-1}\n />\n <button\n type=\"button\"\n onClick={() => handleToggle(option.value, option.disabled)}\n className={[\n \"inline-flex items-center border font-medium transition focus:outline-none focus-visible:ring-2\",\n sizeClasses.text,\n sizeClasses.padding,\n roundedClass,\n isSelected\n ? colorClasses.selected\n : \"border-neutral-300 bg-white text-neutral-700 hover:border-neutral-400 hover:bg-neutral-50 dark:bg-neutral-900 dark:border-neutral-700 dark:text-neutral-200 dark:hover:bg-neutral-800 dark:hover:border-neutral-600\",\n disabled || isOptionDisabled\n ? \"cursor-not-allowed opacity-60\"\n : \"cursor-pointer\",\n colorClasses.ring,\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-pressed={isSelected}\n aria-disabled={disabled || isOptionDisabled}\n disabled={disabled || isOptionDisabled}\n >\n {option.label}\n {option.description && (\n <span className=\"ml-2 text-xs text-neutral-500 dark:text-neutral-400\">\n {option.description}\n </span>\n )}\n </button>\n </React.Fragment>\n );\n })}\n </div>\n </fieldset>\n );\n};\n\nMultiSelectPills.displayName = \"MultiSelectPills\";\n\nexport default MultiSelectPills;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport type { TrueColor } from \"../theme/Theme\";\n\n// ── Color tokens ──────────────────────────────────────────────────────────────\n// Full class strings are required so Tailwind's JIT scanner can pick them up.\n\nconst COLOR_TOKENS: Partial<\n Record<\n TrueColor,\n {\n border: string; // focus-within border\n ring: string; // focus-within ring\n icon: string; // icon color on focus (gradient variant)\n btnHover: string; // clear button hover classes\n }\n >\n> = {\n blue: {\n border: \"focus-within:border-blue-500\",\n ring: \"focus-within:ring-blue-400/40\",\n icon: \"group-focus-within:text-blue-500\",\n btnHover:\n \"hover:bg-blue-100 hover:text-blue-600 dark:hover:bg-blue-900/40 dark:hover:text-blue-400\",\n },\n indigo: {\n border: \"focus-within:border-indigo-500\",\n ring: \"focus-within:ring-indigo-400/40\",\n icon: \"group-focus-within:text-indigo-500\",\n btnHover:\n \"hover:bg-indigo-100 hover:text-indigo-600 dark:hover:bg-indigo-900/40 dark:hover:text-indigo-400\",\n },\n violet: {\n border: \"focus-within:border-violet-500\",\n ring: \"focus-within:ring-violet-400/40\",\n icon: \"group-focus-within:text-violet-500\",\n btnHover:\n \"hover:bg-violet-100 hover:text-violet-600 dark:hover:bg-violet-900/40 dark:hover:text-violet-400\",\n },\n purple: {\n border: \"focus-within:border-purple-500\",\n ring: \"focus-within:ring-purple-400/40\",\n icon: \"group-focus-within:text-purple-500\",\n btnHover:\n \"hover:bg-purple-100 hover:text-purple-600 dark:hover:bg-purple-900/40 dark:hover:text-purple-400\",\n },\n fuchsia: {\n border: \"focus-within:border-fuchsia-500\",\n ring: \"focus-within:ring-fuchsia-400/40\",\n icon: \"group-focus-within:text-fuchsia-500\",\n btnHover:\n \"hover:bg-fuchsia-100 hover:text-fuchsia-600 dark:hover:bg-fuchsia-900/40 dark:hover:text-fuchsia-400\",\n }, rose: {\n border: \"focus-within:border-rose-500\",\n ring: \"focus-within:ring-rose-400/40\",\n icon: \"group-focus-within:text-rose-500\",\n btnHover:\n \"hover:bg-rose-100 hover:text-rose-600 dark:hover:bg-rose-900/40 dark:hover:text-rose-400\",\n },\n red: {\n border: \"focus-within:border-red-500\",\n ring: \"focus-within:ring-red-400/40\",\n icon: \"group-focus-within:text-red-500\",\n btnHover:\n \"hover:bg-red-100 hover:text-red-600 dark:hover:bg-red-900/40 dark:hover:text-red-400\",\n },\n orange: {\n border: \"focus-within:border-orange-500\",\n ring: \"focus-within:ring-orange-400/40\",\n icon: \"group-focus-within:text-orange-500\",\n btnHover:\n \"hover:bg-orange-100 hover:text-orange-600 dark:hover:bg-orange-900/40 dark:hover:text-orange-400\",\n },\n amber: {\n border: \"focus-within:border-amber-500\",\n ring: \"focus-within:ring-amber-400/40\",\n icon: \"group-focus-within:text-amber-500\",\n btnHover:\n \"hover:bg-amber-100 hover:text-amber-600 dark:hover:bg-amber-900/40 dark:hover:text-amber-400\",\n },\n yellow: {\n border: \"focus-within:border-yellow-500\",\n ring: \"focus-within:ring-yellow-400/40\",\n icon: \"group-focus-within:text-yellow-500\",\n btnHover:\n \"hover:bg-yellow-100 hover:text-yellow-600 dark:hover:bg-yellow-900/40 dark:hover:text-yellow-400\",\n },\n lime: {\n border: \"focus-within:border-lime-500\",\n ring: \"focus-within:ring-lime-400/40\",\n icon: \"group-focus-within:text-lime-500\",\n btnHover:\n \"hover:bg-lime-100 hover:text-lime-600 dark:hover:bg-lime-900/40 dark:hover:text-lime-400\",\n },\n green: {\n border: \"focus-within:border-green-500\",\n ring: \"focus-within:ring-green-400/40\",\n icon: \"group-focus-within:text-green-500\",\n btnHover:\n \"hover:bg-green-100 hover:text-green-600 dark:hover:bg-green-900/40 dark:hover:text-green-400\",\n },\n emerald: {\n border: \"focus-within:border-emerald-500\",\n ring: \"focus-within:ring-emerald-400/40\",\n icon: \"group-focus-within:text-emerald-500\",\n btnHover:\n \"hover:bg-emerald-100 hover:text-emerald-600 dark:hover:bg-emerald-900/40 dark:hover:text-emerald-400\",\n },\n teal: {\n border: \"focus-within:border-teal-500\",\n ring: \"focus-within:ring-teal-400/40\",\n icon: \"group-focus-within:text-teal-500\",\n btnHover:\n \"hover:bg-teal-100 hover:text-teal-600 dark:hover:bg-teal-900/40 dark:hover:text-teal-400\",\n },\n cyan: {\n border: \"focus-within:border-cyan-500\",\n ring: \"focus-within:ring-cyan-400/40\",\n icon: \"group-focus-within:text-cyan-500\",\n btnHover:\n \"hover:bg-cyan-100 hover:text-cyan-600 dark:hover:bg-cyan-900/40 dark:hover:text-cyan-400\",\n },\n sky: {\n border: \"focus-within:border-sky-500\",\n ring: \"focus-within:ring-sky-400/40\",\n icon: \"group-focus-within:text-sky-500\",\n btnHover:\n \"hover:bg-sky-100 hover:text-sky-600 dark:hover:bg-sky-900/40 dark:hover:text-sky-400\",\n },\n slate: {\n border: \"focus-within:border-slate-500\",\n ring: \"focus-within:ring-slate-400/40\",\n icon: \"group-focus-within:text-slate-500\",\n btnHover:\n \"hover:bg-slate-200 hover:text-slate-600 dark:hover:bg-slate-700 dark:hover:text-slate-200\",\n },\n gray: {\n border: \"focus-within:border-gray-500\",\n ring: \"focus-within:ring-gray-400/40\",\n icon: \"group-focus-within:text-gray-500\",\n btnHover:\n \"hover:bg-gray-200 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-200\",\n },\n};\n\nconst DEFAULT_TOKENS = COLOR_TOKENS.blue!;\n\nfunction getTokens(color: TrueColor) {\n return COLOR_TOKENS[color] ?? DEFAULT_TOKENS;\n}\n\n// ── Gradient pairs (600 → 400 within the same hue) ───────────────────────────\n// Each entry is [darker, lighter] — used as the default glow gradient.\n\nconst GRADIENT_MAP: Partial<Record<TrueColor, [string, string]>> = {\n blue: [\"#2563eb\", \"#60a5fa\"],\n indigo: [\"#4f46e5\", \"#818cf8\"],\n violet: [\"#7c3aed\", \"#a78bfa\"],\n purple: [\"#9333ea\", \"#c084fc\"],\n fuchsia: [\"#c026d3\", \"#e879f9\"], rose: [\"#e11d48\", \"#fb7185\"],\n red: [\"#dc2626\", \"#f87171\"],\n orange: [\"#ea580c\", \"#fb923c\"],\n amber: [\"#d97706\", \"#fbbf24\"],\n yellow: [\"#ca8a04\", \"#facc15\"],\n lime: [\"#65a30d\", \"#a3e635\"],\n green: [\"#16a34a\", \"#4ade80\"],\n emerald: [\"#059669\", \"#34d399\"],\n teal: [\"#0d9488\", \"#2dd4bf\"],\n cyan: [\"#0891b2\", \"#22d3ee\"],\n sky: [\"#0284c7\", \"#38bdf8\"],\n slate: [\"#475569\", \"#94a3b8\"],\n gray: [\"#4b5563\", \"#9ca3af\"],\n zinc: [\"#52525b\", \"#a1a1aa\"],\n neutral: [\"#525252\", \"#a3a3a3\"],\n stone: [\"#57534e\", \"#a8a29e\"],\n};\n\nfunction resolveGradient(\n color: TrueColor,\n from?: string,\n to?: string,\n): [string, string] {\n const pair = GRADIENT_MAP[color] ?? GRADIENT_MAP.blue!;\n return [from ?? pair[0], to ?? pair[1]];\n}\n\n// ── Props ──────────────────────────────────────────────────────────────────────\n\nexport interface SearchBarProps {\n placeholder?: string;\n onSearch: (query: string, signal?: AbortSignal) => void;\n onClear?: () => void;\n debounceMs?: number;\n autoSearch?: boolean;\n className?: string;\n disabled?: boolean;\n initialValue?: string;\n shouldClear?: boolean;\n leadingIcon?: string | React.ReactElement;\n variant?: \"default\" | \"gradient\";\n /** Accent colour for focus ring, icon highlight, and clear-button hover. Default: 'blue' */\n color?: TrueColor;\n /**\n * Start (darker) colour of the gradient glow (gradient variant only).\n * Defaults to the -600 shade of `color` when omitted.\n */\n gradientFrom?: string;\n /**\n * End (lighter) colour of the gradient glow (gradient variant only).\n * Defaults to the -400 shade of `color` when omitted.\n */\n gradientTo?: string;\n /**\n * Controls how prominent the gradient glow is (gradient variant only).\n * - `subtle` – barely visible; a hint of colour at the border\n * - `soft` – gentle glow, low key (default)\n * - `medium` – clearly visible glow\n * - `strong` – bold, wide glow\n */\n glowIntensity?: \"subtle\" | \"soft\" | \"medium\" | \"strong\";\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const SearchBar: React.FC<SearchBarProps> = ({\n placeholder = \"Search...\",\n onSearch,\n onClear,\n debounceMs = 400,\n autoSearch = true,\n className,\n disabled = false,\n initialValue = \"\",\n shouldClear = false,\n leadingIcon = \"Search\",\n variant = \"default\",\n color = \"blue\",\n gradientFrom,\n gradientTo,\n glowIntensity = \"soft\",\n}) => {\n const [resolvedFrom, resolvedTo] = resolveGradient(\n color,\n gradientFrom,\n gradientTo,\n );\n const glowConfig = {\n subtle: {\n inset: \"-inset-px\",\n blur: \"blur-sm\",\n idleOpacity: 0.06,\n focusOpacity: 0.14,\n },\n soft: {\n inset: \"-inset-0.5\",\n blur: \"blur-sm\",\n idleOpacity: 0.1,\n focusOpacity: 0.22,\n },\n medium: {\n inset: \"-inset-0.5\",\n blur: \"blur\",\n idleOpacity: 0.2,\n focusOpacity: 0.4,\n },\n strong: {\n inset: \"-inset-1\",\n blur: \"blur-md\",\n idleOpacity: 0.3,\n focusOpacity: 0.55,\n },\n } as const;\n const glow = glowConfig[glowIntensity];\n const tokens = getTokens(color);\n\n const renderIcon = useIconRenderer();\n const [query, setQuery] = useState(initialValue);\n const [focused, setFocused] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const generationRef = useRef(0);\n const onSearchRef = useRef(onSearch);\n\n useEffect(() => {\n onSearchRef.current = onSearch;\n }, [onSearch]);\n\n const clearPendingSearch = () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n debounceRef.current = null;\n }\n if (abortRef.current) {\n abortRef.current.abort();\n abortRef.current = null;\n }\n };\n\n const triggerSearch = (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n onSearchRef.current(\"\");\n return;\n }\n abortRef.current = new AbortController();\n onSearchRef.current(trimmed, abortRef.current?.signal);\n };\n\n useEffect(() => {\n if (!autoSearch) {\n return undefined;\n }\n\n clearPendingSearch();\n if (!query.trim()) {\n onSearchRef.current(\"\");\n return undefined;\n }\n\n const myGeneration = ++generationRef.current;\n debounceRef.current = setTimeout(() => {\n if (myGeneration !== generationRef.current) {\n return;\n }\n triggerSearch(query);\n }, debounceMs);\n\n return () => clearPendingSearch();\n }, [query, autoSearch, debounceMs]);\n\n const handleInput = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value);\n if (!event.target.value) {\n clearPendingSearch();\n onSearchRef.current(\"\");\n }\n },\n [],\n );\n\n const handleClear = useCallback(() => {\n clearPendingSearch();\n setQuery(\"\");\n onClear?.();\n inputRef.current?.focus();\n }, [onClear]);\n\n useEffect(() => {\n if (shouldClear) {\n handleClear();\n }\n }, [shouldClear, handleClear]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Escape\") {\n handleClear();\n }\n if (event.key === \"Enter\") {\n clearPendingSearch();\n generationRef.current += 1;\n triggerSearch(event.currentTarget.value);\n }\n },\n [handleClear],\n );\n\n // ── Clear button — always rendered to keep width stable ───────────────────\n // Visible only when there is text and the bar is not disabled.\n const showClear = !!(query && !disabled);\n\n const clearBtn = showClear ? (\n <button\n type=\"button\"\n onClick={handleClear}\n className={classNames(\n \"absolute right-2 top-1/2 -translate-y-1/2 inline-flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full transition\",\n \"focus-visible:outline-none focus-visible:ring-2\",\n tokens.ring.replace(\"focus-within:\", \"focus-visible:\"),\n \"bg-slate-200/80 text-slate-400 dark:bg-slate-700/80 dark:text-slate-400\",\n tokens.btnHover,\n )}\n aria-label=\"Clear search\"\n >\n {renderIcon(\"Close\", \"xs\")}\n </button>\n ) : null;\n\n const clearBtnGradient = showClear ? (\n <button\n type=\"button\"\n onClick={handleClear}\n className={classNames(\n \"absolute right-3 top-1/2 -translate-y-1/2 inline-flex h-5 w-5 items-center justify-center rounded-full transition\",\n \"focus-visible:outline-none focus-visible:ring-2\",\n tokens.ring.replace(\"focus-within:\", \"focus-visible:\"),\n \"bg-slate-200 text-slate-500\",\n tokens.btnHover,\n )}\n aria-label=\"Clear search\"\n >\n {renderIcon(\"Close\", \"xs\")}\n </button>\n ) : null;\n\n // ── Gradient variant ──────────────────────────────────────────────────────\n if (variant === \"gradient\") {\n return (\n <div className={classNames(\"relative w-full group\", className)}>\n <div\n className={classNames(\n \"absolute rounded-2xl transition-opacity duration-500 leading-none\",\n glow.inset,\n glow.blur,\n )}\n style={{\n background: `linear-gradient(to right, ${resolvedFrom}, ${resolvedTo})`,\n opacity: focused ? glow.focusOpacity : glow.idleOpacity,\n }}\n aria-hidden\n />\n <div className=\"relative flex w-full items-center rounded-xl bg-white/80 backdrop-blur-xl border border-white/20 px-4 py-2 shadow-[0_8px_30px_rgb(0,0,0,0.04)] transition\">\n <span\n className={classNames(\n \"mr-2 inline-flex hrink-0 items-center text-slate-400 transition-colors\",\n tokens.icon,\n )}\n >\n {renderIcon(leadingIcon, \"xs\")}\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={handleInput}\n onKeyDown={handleKeyDown}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n placeholder={placeholder}\n disabled={disabled}\n className=\"text-sm flex-1 border-none bg-transparent text-slate-900 placeholder-slate-400 outline-none leading-5\"\n />\n {clearBtnGradient}\n </div>\n </div>\n );\n }\n\n // ── Default variant ───────────────────────────────────────────────────────\n return (\n <div\n className={classNames(\n \"group relative flex w-full items-center rounded-lg border border-slate-200/80 bg-white/80 px-3 py-1.5 shadow-sm transition\",\n \"focus-within:ring-2\",\n tokens.border,\n tokens.ring,\n \"dark:border-slate-700/60 dark:bg-slate-900/60\",\n disabled && \"opacity-60\",\n className,\n )}\n >\n <span className=\"mr-2 inline-flex shrink-0 items-center text-slate-400 dark:text-slate-500\">\n {renderIcon(leadingIcon, \"sm\")}\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={handleInput}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className=\"flex-1 border-none bg-transparent text-sm text-slate-900 placeholder-slate-400 outline-none dark:text-slate-200 dark:placeholder-slate-500\"\n />\n {clearBtn}\n </div>\n );\n};\n\nexport default SearchBar;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport type { TrueColor } from \"../theme/Theme\";\n\nexport type GradientDirection =\n | \"t\"\n | \"tr\"\n | \"r\"\n | \"br\"\n | \"b\"\n | \"bl\"\n | \"l\"\n | \"tl\";\n\nexport type GlassBackgroundPosition = \"fixed\" | \"absolute\";\n\nexport interface GlassBackgroundProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"color\"> {\n /** Positioning mode.\n * `\"fixed\"` (default) — covers the full viewport, always visible.\n * `\"absolute\"` — fills a `position: relative` parent (e.g. a PlaygroundSection preview).\n * Parent must be `relative` when `\"absolute\"`.\n */\n position?: GlassBackgroundPosition;\n /** Primary theme color driving the gradient (default: \"purple\"). */\n color?: TrueColor;\n /** Secondary color for the middle gradient stop. Derived from color if omitted. */\n colorSecondary?: TrueColor;\n /** Deep color for the final gradient stop. Derived if omitted. */\n colorDeep?: TrueColor;\n /** Gradient direction (default: \"br\" → bottom-right). */\n direction?: GradientDirection;\n /** Enable a slow-moving shimmer overlay (default: false). */\n shimmer?: boolean;\n /** Show ambient glow circles behind content (default: true). */\n ambient?: boolean;\n}\n\n/**\n * GlassBackground — a fixed, full-viewport gradient background layer\n * with optional ambient glows and shimmer. Renders behind its children\n * so panels, modals, and other surfaces can sit on top.\n */\nconst GlassBackground: React.FC<GlassBackgroundProps> = ({\n position = \"fixed\",\n color = \"purple\",\n colorSecondary,\n colorDeep,\n direction = \"br\",\n shimmer = false,\n ambient = true,\n className,\n style,\n children,\n ...rest\n}) => {\n // Colors are already TrueColor — no resolution needed\n const c = color;\n const s = colorSecondary ?? getFallbackSecondary(color);\n const d = colorDeep ?? getFallbackDeep(color);\n\n // Map direction codes to CSS gradient angle strings\n const directionArg: Record<GradientDirection, string> = {\n t: \"to top\",\n tr: \"to top right\",\n r: \"to right\",\n br: \"to bottom right\",\n b: \"to bottom\",\n bl: \"to bottom left\",\n l: \"to left\",\n tl: \"to top left\",\n };\n\n // Ambient glow positions\n const glowPositions = [\n { top: \"-25%\", left: \"-25%\", size: \"w-2/3 h-2/3\" },\n { bottom: \"-25%\", right: \"-25%\", size: \"w-2/3 h-2/3\" },\n ];\n\n return (\n <div\n className={classNames(\n position === \"fixed\" ? \"fixed inset-0 z-0\" : \"absolute inset-0 z-0\",\n className,\n )}\n style={style}\n {...rest}\n >\n {/* Gradient background */}\n <div\n className=\"absolute inset-0 transition-colors duration-300 dark:hidden glass-gradient\"\n style={{\n \"--glass-from\": `var(--color-${c}-300)`,\n \"--glass-via\": `var(--color-${s}-200)`,\n \"--glass-to\": `var(--color-${d}-50)`,\n \"--glass-angle\": directionArg[direction],\n } as React.CSSProperties}\n />\n <div\n className=\"absolute inset-0 hidden transition-colors duration-300 dark:block glass-gradient\"\n style={{\n \"--glass-from\": `var(--color-${c}-700)`,\n \"--glass-via\": `var(--color-${s}-600)`,\n \"--glass-to\": `var(--color-${d}-800)`,\n \"--glass-angle\": directionArg[direction],\n } as React.CSSProperties}\n />\n\n {/* Ambient glows */}\n {ambient && (\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n {glowPositions.map((pos, idx) => (\n <div\n key={idx}\n className={classNames(\n \"absolute rounded-full blur-3xl ambient-pulse\",\n pos.size,\n `bg-${c}-400/12 dark:bg-${c}-500/15`,\n )}\n style={pos}\n />\n ))}\n </div>\n )}\n\n {/* Shimmer overlay */}\n {shimmer && (\n <div\n className={classNames(\n \"pointer-events-none absolute inset-0 animate-shimmer\",\n )}\n style={{\n background:\n \"linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.08) 50%, transparent 100%)\",\n }}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Children on top */}\n <div className=\"relative z-10\">{children}</div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Derive a sensible secondary color based on the primary.\n */\nfunction getFallbackSecondary(color: TrueColor): TrueColor {\n // Color is already TrueColor — no resolution needed\n // Neighboring hues on the color wheel tend to look good\n const neighbors: Record<string, TrueColor> = {\n purple: \"blue\",\n blue: \"indigo\",\n indigo: \"violet\",\n violet: \"purple\",\n rose: \"red\",\n emerald: \"teal\",\n teal: \"emerald\",\n amber: \"orange\",\n orange: \"amber\",\n red: \"rose\",\n cyan: \"sky\",\n sky: \"cyan\",\n lime: \"green\",\n green: \"lime\",\n neutral: \"zinc\",\n zinc: \"stone\",\n stone: \"neutral\",\n gray: \"zinc\",\n };\n return neighbors[color] ?? color;\n}\n\n/**\n * Derive a deep color for the final gradient stop.\n */\nfunction getFallbackDeep(color: TrueColor): TrueColor {\n const deepMap: Record<string, TrueColor> = {\n purple: \"indigo\",\n blue: \"violet\",\n indigo: \"purple\",\n violet: \"blue\",\n rose: \"red\",\n emerald: \"green\",\n teal: \"cyan\",\n amber: \"red\",\n orange: \"amber\",\n red: \"rose\",\n cyan: \"blue\",\n sky: \"indigo\",\n lime: \"emerald\",\n green: \"emerald\",\n neutral: \"stone\",\n zinc: \"neutral\",\n stone: \"gray\",\n gray: \"neutral\",\n };\n return deepMap[color] ?? color;\n}\n\nexport default GlassBackground;","import React, { useEffect, useRef, useState } from \"react\";\nimport type { TooltipPosition } from \"./Tooltip\";\nimport TooltipWrapper from \"./TooltipWrapper\";\n\nexport interface TruncatedTextProps {\n /** The text to display, truncated with an ellipsis when it overflows. */\n text: string;\n /** Extra classes applied to the text element. */\n className?: string;\n /** Delay in ms before the tooltip becomes visible. Defaults to 2000. */\n delay?: number;\n /** Render as a different element. Defaults to \"div\". */\n as?: \"div\" | \"span\" | \"p\";\n /** Where to place the tooltip. Defaults to 'top'. */\n tooltipPosition?: TooltipPosition;\n /**\n * When true, the outer `<div class=\"min-w-0\">` wrapper is omitted and the\n * TooltipWrapper is returned directly. Use this when TruncatedText is a flex\n * child and you control sizing via `className` (e.g. `\"min-w-0 flex-1\"`).\n */\n noWrapper?: boolean;\n}\n\nconst TruncatedText: React.FC<TruncatedTextProps> = ({\n text,\n className,\n delay = 2000,\n as: Tag = \"div\",\n tooltipPosition = \"top\",\n noWrapper = false,\n}) => {\n const ref = useRef<HTMLElement>(null);\n const [truncated, setTruncated] = useState(false);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n // Guard against ResizeObserver firing for a detached node, which would\n // report scrollWidth=0 and incorrectly reset the truncated state.\n const check = () => {\n if (el.isConnected) setTruncated(el.scrollWidth > el.clientWidth);\n };\n const observer = new ResizeObserver(check);\n observer.observe(el);\n check();\n return () => observer.disconnect();\n }, [text]);\n\n // Always keep TooltipWrapper in the tree (pass text only when truncated).\n // This avoids React reconciliation switching between a bare Tag and a\n // TooltipWrapper>Tag tree, which would unmount/remount the Tag element and\n // detach the ref, causing a ResizeObserver feedback loop.\n const inner = (\n <TooltipWrapper\n text={truncated ? text : undefined}\n delay={delay}\n position={tooltipPosition}\n >\n <Tag\n ref={\n ref as React.Ref<\n HTMLDivElement & HTMLSpanElement & HTMLParagraphElement\n >\n }\n className={[\"truncate\", className].filter(Boolean).join(\" \")}\n >\n {text}\n </Tag>\n </TooltipWrapper>\n );\n\n if (noWrapper) return inner;\n\n return <div className=\"min-w-0\">{inner}</div>;\n};\n\nexport default TruncatedText;\n","import React, { useRef, useState } from \"react\";\nimport classNames from \"classnames\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type InfoRowSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nexport type InfoRowPadding =\n | \"none\"\n | \"xs\"\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\";\n\nexport interface InfoRowProps {\n /** Row label (left side). Accepts ReactNode for composed/styled labels. */\n label: React.ReactNode;\n /**\n * Override label text size independently from `size`.\n * When omitted the shared `size` prop drives label size.\n */\n labelSize?: InfoRowSize;\n /**\n * Extra classes for the label span — use for custom colour, weight, etc.\n * e.g. `labelClassName=\"text-emerald-600 font-semibold\"`\n */\n labelClassName?: string;\n /**\n * Fixed width class for the label column (e.g. `\"w-32\"`).\n * Defaults to a size-appropriate width (`w-16` / `w-20` / `w-24` / `w-28`).\n * Pass `\"\"` to let the label size naturally.\n */\n labelWidth?: string;\n /**\n * Row value (right side).\n * - `string` / `number` — rendered as text, copy button enabled automatically.\n * - `boolean` — rendered as \"Yes\" / \"No\" with copy enabled.\n * - `ReactNode` — rendered as-is, copy button suppressed.\n * - `null` / `undefined` / `''` — treated as empty (see `hideIfEmpty`).\n */\n value?: React.ReactNode;\n /**\n * Override value text size independently from `size`.\n * When omitted the shared `size` prop drives value size.\n */\n valueSize?: InfoRowSize;\n /**\n * Extra classes for the value span — use for custom colour, weight, etc.\n * e.g. `valueClassName=\"text-sky-500\"`\n */\n valueClassName?: string;\n /** Controls both label and value text size when individual overrides are absent. Defaults to `'md'`. */\n size?: InfoRowSize;\n /**\n * Vertical padding override. Accepts the full size scale including `'none'`.\n * When omitted, padding is derived from `size` (xs→py-1, sm→py-1.5, md→py-2, lg→py-2.5).\n */\n padding?: InfoRowPadding;\n /**\n * Show a copy-to-clipboard button.\n * Defaults to `true` — shown automatically when the resolved value is a string or number.\n * Pass `false` to suppress the button entirely.\n */\n copyable?: boolean;\n /**\n * Render the value in a monospace font.\n * Shorthand for `valueClassName=\"font-mono\"`.\n */\n mono?: boolean;\n /**\n * Hide the row entirely when `value` is `null`, `undefined`, or `''`.\n * Defaults to `true`. Set to `false` to show the `emptyText` placeholder instead.\n */\n hideIfEmpty?: boolean;\n /**\n * Placeholder text shown when `hideIfEmpty` is `false` and the value is empty.\n * Defaults to `'—'`.\n */\n emptyText?: string;\n /**\n * Allow the value to wrap to multiple lines instead of truncating.\n * Defaults to `false`.\n */\n wrap?: boolean;\n /**\n * Show a tooltip with the full value when the text is truncated.\n * Only active when `wrap` is `false` and the value is a string or number.\n * Defaults to `true`.\n */\n tooltipOnTruncate?: boolean;\n /** Remove the bottom border (e.g. for the last row when handled externally). */\n noBorder?: boolean;\n /**\n * Remove the default horizontal padding (`px-3`/`px-4`).\n * Useful when the parent already provides horizontal spacing.\n */\n noPadding?: boolean;\n /**\n * Add a subtle hover background and rounded corners (matches classic detail-panel row style).\n * Defaults to `false`.\n */\n hoverable?: boolean;\n className?: string;\n}\n\n// ── Size tokens ───────────────────────────────────────────────────────────────\n\ntype SizeToken = {\n defaultPadding: string;\n horizontalPadding: string;\n defaultLabelWidth: string;\n text: string;\n};\n\nconst sizeTokens: Record<InfoRowSize, SizeToken> = {\n xs: {\n defaultPadding: \"py-1\",\n horizontalPadding: \"px-3\",\n defaultLabelWidth: \"w-16\",\n text: \"text-[10px]\",\n },\n sm: {\n defaultPadding: \"py-1.5\",\n horizontalPadding: \"px-3\",\n defaultLabelWidth: \"w-20\",\n text: \"text-xs\",\n },\n md: {\n defaultPadding: \"py-2\",\n horizontalPadding: \"px-4\",\n defaultLabelWidth: \"w-24\",\n text: \"text-sm\",\n },\n lg: {\n defaultPadding: \"py-2.5\",\n horizontalPadding: \"px-4\",\n defaultLabelWidth: \"w-28\",\n text: \"text-base\",\n },\n};\n\n// ── Padding tokens ────────────────────────────────────────────────────────────\n\nconst paddingTokens: Record<InfoRowPadding, string> = {\n none: \"py-0\",\n xs: \"py-0.5\",\n sm: \"py-1.5\",\n md: \"py-2\",\n lg: \"py-2.5\",\n xl: \"py-4\",\n \"2xl\": \"py-5\",\n \"3xl\": \"py-6\",\n};\n\n// ── Inline SVG icons ──────────────────────────────────────────────────────────\n\nconst CopyIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n);\n\nconst CheckIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n);\n\n// ── Value normalisation ───────────────────────────────────────────────────────\n\ntype NormalisedValue = {\n display: React.ReactNode;\n copyText: string | null;\n isEmpty: boolean;\n};\n\nfunction normaliseValue(value: React.ReactNode): NormalisedValue {\n if (value === undefined || value === null || value === \"\") {\n return { display: null, copyText: null, isEmpty: true };\n }\n if (typeof value === \"boolean\") {\n const text = value ? \"Yes\" : \"No\";\n return { display: text, copyText: text, isEmpty: false };\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n return { display: value, copyText: String(value), isEmpty: false };\n }\n return { display: value, copyText: null, isEmpty: false };\n}\n\n// ── Tooltip ───────────────────────────────────────────────────────────────────\n\nconst ValueTooltip: React.FC<{ text: string }> = ({ text }) => (\n <div\n role=\"tooltip\"\n className={classNames(\n \"pointer-events-none absolute bottom-full right-0 z-50 mb-1.5\",\n \"max-w-xs break-all rounded-md px-2.5 py-1.5\",\n \"bg-neutral-900 dark:bg-neutral-700 text-white text-xs leading-snug\",\n \"shadow-lg\",\n // fade-in\n \"animate-[fadeIn_120ms_ease-out]\",\n )}\n >\n {text}\n {/* arrow */}\n <span\n className={classNames(\n \"absolute top-full right-3\",\n \"border-4 border-transparent border-t-neutral-900 dark:border-t-neutral-700\",\n )}\n />\n </div>\n);\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const InfoRow: React.FC<InfoRowProps> = ({\n label,\n labelSize,\n labelClassName,\n labelWidth,\n value,\n valueSize,\n valueClassName,\n size = \"md\",\n padding,\n copyable = true,\n mono = false,\n hideIfEmpty = true,\n emptyText = \"—\",\n wrap = false,\n tooltipOnTruncate = true,\n noBorder = false,\n noPadding = false,\n hoverable = false,\n className,\n}) => {\n const [copied, setCopied] = useState(false);\n const [tooltipVisible, setTooltip] = useState(false);\n const valueRef = useRef<HTMLSpanElement>(null);\n\n const { display, copyText, isEmpty } = normaliseValue(value);\n\n if (isEmpty && hideIfEmpty) return null;\n\n const tokens = sizeTokens[size];\n const labelTokens = sizeTokens[labelSize ?? size];\n const valueTokens = sizeTokens[valueSize ?? size];\n const rowPadding =\n padding !== undefined ? paddingTokens[padding] : tokens.defaultPadding;\n const showCopy = copyable && copyText !== null && !isEmpty;\n const canTooltip = tooltipOnTruncate && !wrap && copyText !== null;\n // Smart layout: label caps at 30% of row width, value gets the rest.\n // Falls back to fixed-width flex when an explicit labelWidth is provided.\n const useSmartLayout = labelWidth === undefined;\n\n const handleCopy = () => {\n if (!copyText || copied) return;\n void navigator.clipboard.writeText(copyText).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1600);\n });\n };\n\n const handleMouseEnter = () => {\n if (!canTooltip || !valueRef.current) return;\n if (valueRef.current.scrollWidth > valueRef.current.offsetWidth) {\n setTooltip(true);\n }\n };\n\n const handleMouseLeave = () => setTooltip(false);\n\n return (\n <div\n className={classNames(\n \"group flex items-center gap-3 transition-colors duration-300\",\n rowPadding,\n !noPadding && tokens.horizontalPadding,\n hoverable && \"rounded-md mx-1\",\n hoverable &&\n !copied &&\n \"hover:bg-neutral-50 dark:hover:bg-neutral-800/50\",\n !noBorder &&\n !hoverable &&\n \"border-b border-neutral-100 dark:border-neutral-800 last:border-0\",\n copied && \"bg-emerald-50/60 dark:bg-emerald-950/20\",\n copied && hoverable && \"animate-copied-flash\",\n className,\n )}\n >\n {/* Label — natural content width, capped at 30%; fixed width when labelWidth is explicit */}\n <span\n className={classNames(\n labelTokens.text,\n \"text-neutral-500 dark:text-neutral-400\",\n useSmartLayout\n ? \"shrink-0 min-w-0 truncate\"\n : `grow shrink-0 ${labelWidth ?? tokens.defaultLabelWidth}`,\n labelClassName,\n )}\n style={useSmartLayout ? { maxWidth: \"30%\" } : undefined}\n >\n {label}\n </span>\n\n {/* Value + copy button — fills remaining space */}\n <div\n className=\"relative flex flex-1 items-center justify-end gap-1 min-w-0\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <span\n ref={valueRef}\n className={classNames(\n valueTokens.text,\n \"font-medium\",\n wrap ? \"wrap-break-word whitespace-normal text-right\" : \"truncate\",\n isEmpty\n ? \"text-neutral-400 dark:text-neutral-600\"\n : \"text-neutral-800 dark:text-neutral-200\",\n mono && \"font-mono\",\n valueClassName,\n )}\n >\n {isEmpty ? emptyText : display}\n </span>\n\n {tooltipVisible && copyText && <ValueTooltip text={copyText} />}\n\n {showCopy && (\n <button\n type=\"button\"\n onClick={handleCopy}\n title={copied ? \"Copied!\" : \"Copy to clipboard\"}\n aria-label={copied ? \"Copied!\" : \"Copy to clipboard\"}\n className={classNames(\n \"shrink-0 rounded-md p-1 transition-all duration-200\",\n copied\n ? [\n \"opacity-100 scale-110\",\n \"text-emerald-500 dark:text-emerald-400\",\n \"bg-emerald-100 dark:bg-emerald-950/40\",\n ]\n : [\n \"opacity-0 translate-x-1\",\n \"group-hover:opacity-100 group-hover:translate-x-0\",\n \"text-neutral-400 dark:text-neutral-500\",\n \"hover:text-neutral-600 dark:hover:text-neutral-300\",\n \"hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n ],\n )}\n >\n <span\n className={classNames(\n \"block transition-all duration-200\",\n copied ? \"scale-110\" : \"scale-100\",\n )}\n >\n {copied ? (\n <CheckIcon className=\"h-3.5 w-3.5\" />\n ) : (\n <CopyIcon className=\"h-3.5 w-3.5\" />\n )}\n </span>\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default InfoRow;\n","import React from \"react\";\nimport classNames from \"classnames\";\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type SectionCardVariant = \"glass\" | \"elevated\" | \"subtle\" | \"flat\";\nexport type SectionCardSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SectionCardProps {\n /** Section heading displayed above the content area. */\n title: string;\n titleClassName?: string;\n actions?: React.ReactNode;\n /**\n * Visual treatment of the card container.\n * - `glass` — frosted glass (default)\n * - `elevated` — white/dark surface with shadow\n * - `subtle` — very light tinted background, no border\n * - `flat` — no background or border; title + content only\n */\n variant?: SectionCardVariant;\n /** Body padding size. Defaults to 'md'. */\n size?: SectionCardSize;\n /** Blur the body content (e.g. to indicate unavailable data). */\n blur?: boolean;\n className?: string;\n bodyClassName?: string;\n children?: React.ReactNode;\n}\n\n// ── Style tokens ──────────────────────────────────────────────────────────────\n\nconst variantStyles: Record<SectionCardVariant, string> = {\n glass: [\n \"bg-white/95 dark:bg-neutral-900/90\",\n \"backdrop-blur-xl\",\n \"border border-neutral-200 dark:border-neutral-800\",\n \"rounded-xl\",\n ].join(\" \"),\n elevated: [\n \"bg-white dark:bg-neutral-900\",\n \"border border-neutral-200 dark:border-neutral-800\",\n \"shadow-sm\",\n \"rounded-xl\",\n ].join(\" \"),\n subtle: [\"bg-neutral-50 dark:bg-neutral-800/50\", \"rounded-xl\"].join(\" \"),\n flat: \"\",\n};\n\nconst sizeTokens: Record<SectionCardSize, { header: string; body: string }> = {\n sm: { header: \"px-4 pt-2.5 pb-1.5\", body: \"px-4 pb-3\" },\n md: { header: \"px-6 pt-3 pb-2\", body: \"px-6 pb-4\" },\n lg: { header: \"px-8 pt-4 pb-2\", body: \"px-8 pb-6\" },\n};\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const SectionCard: React.FC<SectionCardProps> = ({\n title,\n titleClassName,\n actions,\n variant = \"glass\",\n size = \"md\",\n blur = false,\n className,\n bodyClassName,\n children,\n}) => {\n const { header, body } = sizeTokens[size];\n\n return (\n <div\n className={classNames(\n \"overflow-hidden\",\n variantStyles[variant],\n className,\n )}\n >\n {/* Section heading */}\n <div className={header}>\n <div className=\"flex items-center justify-between\">\n <span\n className={classNames(\n \"text-[10px] font-semibold uppercase tracking-widest\",\n \"text-neutral-400 dark:text-neutral-500\",\n titleClassName,\n )}\n >\n {title}\n </span>\n {actions && <div>{actions}</div>}\n </div>\n </div>\n\n {/* Body */}\n <div className={classNames(body, blur && \"blur-xs\", bodyClassName)}>\n {children}\n </div>\n </div>\n );\n};\n\nexport default SectionCard;\n","import React, { useState } from \"react\";\nimport classNames from \"classnames\";\nimport Panel, { PanelProps } from \"./Panel\";\nimport { CustomIcon } from \"./CustomIcon\";\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface PagedPanelProps extends PanelProps {\n /** One entry per page — rendered one at a time. */\n pages: React.ReactNode[];\n /**\n * Static title shown in the header, OR an array of per-page titles.\n * When an array is supplied its length should match `pages`.\n */\n title?: React.ReactNode | React.ReactNode[];\n /** Optional subtitle shown below the title (static). */\n subtitle?: React.ReactNode;\n /** Show a loading overlay over the whole panel. */\n error?: string | null;\n /**\n * When true, renders without the Panel wrapper (no border, background or\n * shadow). Use this when embedding PagedPanel inside an existing Panel.\n */\n bare?: boolean;\n}\n\n// ── Nav button ───────────────────────────────────────────────────────────────\n\nconst NavBtn: React.FC<{\n direction: \"left\" | \"right\";\n disabled: boolean;\n onClick: () => void;\n}> = ({ direction, disabled, onClick }) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={direction === \"left\" ? \"Previous page\" : \"Next page\"}\n className={classNames(\n \"flex items-center justify-center w-7 h-7 rounded-lg transition-colors duration-150\",\n \"text-neutral-400 dark:text-neutral-500\",\n \"hover:bg-neutral-100 dark:hover:bg-neutral-800 hover:text-neutral-700 dark:hover:text-neutral-200\",\n \"disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-neutral-400 dark:disabled:hover:text-neutral-500\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500\",\n )}\n >\n <CustomIcon\n icon={direction === \"left\" ? \"ArrowChevronLeft\" : \"ArrowChevronRight\"}\n size=\"sm\"\n />\n </button>\n);\n\n// ── Component ────────────────────────────────────────────────────────────────\n\nconst PagedPanel: React.FC<PagedPanelProps> = ({\n pages,\n title,\n subtitle,\n error,\n bare = false,\n ...rest\n}) => {\n const [current, setCurrent] = useState(0);\n const total = pages.length;\n const showNav = total > 1;\n\n // Guard: if pages shrinks (e.g. after a data reload) clamp to last valid page\n const safeCurrent = total > 0 ? Math.min(current, total - 1) : 0;\n if (safeCurrent !== current) setCurrent(safeCurrent);\n\n // Resolve the title for the current page\n const resolvedTitle = Array.isArray(title) ? title[safeCurrent] : title;\n const showHeader = resolvedTitle != null || subtitle != null || showNav;\n\n const header = showHeader && (\n <div className=\"flex items-center gap-2 px-4 py-3 border-b border-neutral-100 dark:border-neutral-800\">\n {/* Left nav slot — always same width so title stays centred */}\n <div className=\"shrink-0 w-7\">\n {showNav && (\n <NavBtn\n direction=\"left\"\n disabled={current === 0}\n onClick={() => setCurrent((p) => Math.max(0, p - 1))}\n />\n )}\n </div>\n\n {/* Centre: title + subtitle + page indicator */}\n <div className=\"flex-1 text-center min-w-0\">\n {resolvedTitle != null && (\n <div className=\"text-sm font-semibold text-neutral-700 dark:text-neutral-200 leading-snug truncate\">\n {resolvedTitle}\n </div>\n )}\n {subtitle != null && (\n <div className=\"text-xs text-neutral-400 dark:text-neutral-500 mt-0.5 truncate\">\n {subtitle}\n </div>\n )}\n {showNav && (\n <div className=\"text-[11px] text-neutral-400 dark:text-neutral-500 mt-0.5 tabular-nums\">\n {safeCurrent + 1} / {total}\n </div>\n )}\n </div>\n\n {/* Right nav slot */}\n <div className=\"shrink-0 w-7\">\n {showNav && (\n <NavBtn\n direction=\"right\"\n disabled={current === total - 1}\n onClick={() => setCurrent((p) => Math.min(total - 1, p + 1))}\n />\n )}\n </div>\n </div>\n );\n\n const content = (\n <div className=\"h-full w-full p-4 flex items-center justify-center\">\n {error ? (\n <p className=\"text-sm text-rose-500 dark:text-rose-400\">{error}</p>\n ) : total === 0 && !rest.loading ? (\n <p className=\"text-sm text-neutral-400 dark:text-neutral-500\">\n No data available.\n </p>\n ) : (\n pages[safeCurrent]\n )}\n </div>\n );\n\n if (bare) {\n return (\n <div className={classNames(\"relative overflow-hidden\", rest.className)}>\n {header}\n {content}\n </div>\n );\n }\n\n return (\n <Panel\n {...rest}\n bodyClassName={total === 0 && !rest.loading ? \"h-full\" : \"\"}\n className={classNames(\"relative overflow-hidden\", rest.className)}\n >\n {header}\n {content}\n </Panel>\n );\n};\n\nexport default PagedPanel;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport Button, { type ButtonProps } from \"./Button\";\nimport Loader, { type LoaderProps } from \"./Loader\";\nimport {\n getPanelToneStyles,\n type TrueColor,\n} from \"../theme/Theme\";\n\nexport type PanelVariant =\n | \"elevated\"\n | \"outlined\"\n | \"subtle\"\n | \"tonal\"\n | \"default\"\n | \"glass\"\n | \"simple\"\n | \"liquid-glass\";\nexport type PanelTone = TrueColor;\nexport type PanelDecoration = \"none\" | \"gradient\" | \"shapes\" | \"both\";\nexport type PanelMediaPlacement = \"top\" | \"start\" | \"end\" | \"overlay\";\nexport type PanelPadding = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type PanelCorner =\n | \"rounded\"\n | \"rounded-sm\"\n | \"rounded-md\"\n | \"rounded-lg\"\n | \"rounded-full\"\n | \"pill\"\n | \"none\";\nexport type PanelActionLayout = \"auto\" | \"stacked\" | \"inline\";\nexport type PanelLoaderType = Exclude<LoaderProps[\"variant\"], undefined>;\nexport type PanelSpecularMode = \"none\" | \"classic\" | \"halo\";\n\nexport interface PanelAction\n extends Pick<\n ButtonProps,\n | \"variant\"\n | \"color\"\n | \"size\"\n | \"weight\"\n | \"leadingIcon\"\n | \"trailingIcon\"\n | \"loading\"\n | \"disabled\"\n | \"accent\"\n | \"accentColor\"\n > {\n id?: string;\n label: React.ReactNode;\n onClick?: ButtonProps[\"onClick\"];\n className?: string;\n}\n\nexport interface PanelProps\n extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n title?: React.ReactNode;\n titleClassName?: string;\n subtitle?: React.ReactNode;\n subtitleClassName?: string;\n description?: React.ReactNode;\n descriptionClassName?: string;\n badge?: React.ReactNode;\n media?: React.ReactNode;\n mediaPlacement?: PanelMediaPlacement;\n actions?: PanelAction[];\n actionLayout?: PanelActionLayout;\n variant?: PanelVariant;\n tone?: TrueColor;\n padding?: PanelPadding;\n corner?: PanelCorner;\n fullWidth?: boolean;\n disabled?: boolean;\n flexBody?: boolean;\n maxWidth?: string | number;\n minHeight?: string | number;\n bodyClassName?: string;\n bodyStyle?: React.CSSProperties;\n children?: React.ReactNode;\n loading?: boolean;\n loaderType?: PanelLoaderType;\n loaderTitle?: React.ReactNode;\n loaderMessage?: React.ReactNode;\n loaderProgress?: number;\n loaderColor?: LoaderProps[\"color\"];\n hoverShadow?: boolean;\n decoration?: PanelDecoration;\n /**\n * Adds a subtle background tint on hover and lightens any decoration elements.\n * Defaults to `true` when an `onClick` handler is present, otherwise `false`.\n */\n hoverable?: boolean;\n color?: TrueColor;\n /**\n * Override the default hover color.\n * If not provided, it defaults to the `color` prop if available, or a neutral tint.\n */\n hoverColor?: TrueColor;\n /**\n * Override the default border color.\n * If not provided, it defaults to the `tone` or `color` prop depending on variant.\n */\n borderColor?: TrueColor;\n /**\n * Override the default background color.\n */\n backgroundColor?: TrueColor;\n /**\n * controls if the panel body should be scrollable\n * @default true\n */\n scrollable?: boolean;\n /**\n * Backdrop vibrancy for the liquid-glass variant.\n * Preset takes priority over a numeric value when both are provided.\n */\n vibrancy?: \"low\" | \"medium\" | \"high\" | number;\n /**\n * Glass fill opacity for the liquid-glass variant.\n * Preset takes priority over a numeric value when both are provided.\n * @default \"frosted\"\n */\n glassOpacity?: \"frosted\" | \"light\" | \"clear\" | number;\n /**\n * Whether the liquid-glass variant shows a specular highlight at the top.\n * @default true\n *\n * @deprecated Use specularMode instead. Kept for backward compatibility.\n * When both are provided, specularMode takes precedence. If neither is set,\n * defaults to \"classic\".\n */\n specularHighlight?: boolean;\n /**\n * Specular highlight mode for the liquid-glass variant.\n * Controls how light reflects off the glass surface.\n * @default \"classic\"\n */\n specularMode?: PanelSpecularMode;\n}\n\nconst variantBaseStyles: Record<PanelVariant, string> = {\n elevated:\n \"bg-white shadow-xl ring-1 ring-black/5 dark:bg-neutral-900 dark:ring-white/10 text-neutral-900 dark:text-neutral-100\",\n outlined:\n \"bg-white/90 text-neutral-900 ring-1 dark:bg-neutral-900/80 dark:text-neutral-100 dark:ring-white/10\",\n subtle:\n \"text-neutral-900 shadow-sm ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n tonal:\n \"text-neutral-900 shadow-sm ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n default:\n \"bg-white/80 backdrop-blur-xl text-neutral-900 shadow-2xl ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n glass:\n \"backdrop-blur-xl text-neutral-900 ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n \"liquid-glass\":\n \"backdrop-blur-2xl ring-1 ring-transparent dark:ring-white/5\",\n simple:\n \"text-neutral-900 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n};\n\nexport const paddingStyles: Record<PanelPadding, string> = {\n none: \"p-0\",\n xs: \"p-2 sm:p-3\",\n sm: \"p-4 sm:p-5\",\n md: \"p-6 sm:p-8\",\n lg: \"p-8 sm:p-10\",\n};\n\nconst cornerStyles: Record<PanelCorner, string> = {\n rounded: \"rounded-sm\",\n \"rounded-sm\": \"rounded-lg\",\n \"rounded-md\": \"rounded-2xl\",\n \"rounded-lg\": \"rounded-3xl\",\n \"rounded-full\": \"rounded-full\",\n pill: \"rounded-3xl\",\n none: \"rounded-none\",\n};\n\nconst actionButtonWidth: Record<PanelActionLayout, string> = {\n auto: \"w-full sm:w-auto\",\n stacked: \"w-full\",\n inline: \"w-auto\",\n};\n\nconst actionWrapperLayout: Record<PanelActionLayout, string> = {\n auto: \"flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center\",\n stacked: \"flex-col gap-3\",\n inline: \"flex-wrap items-center gap-3\",\n};\n\nconst defaultActionColor: TrueColor = \"neutral\";\n\nconst Panel: React.FC<PanelProps> = ({\n title,\n subtitle,\n description,\n badge,\n media,\n mediaPlacement = \"top\",\n actions,\n actionLayout = \"auto\",\n variant = \"elevated\",\n tone = \"neutral\",\n padding = \"md\",\n corner = \"rounded-sm\",\n fullWidth,\n maxWidth,\n minHeight,\n className,\n bodyClassName,\n bodyStyle,\n style,\n children,\n loading = false,\n disabled = false,\n flexBody = false,\n loaderType = \"spinner\",\n loaderTitle,\n loaderMessage,\n loaderProgress,\n loaderColor,\n hoverShadow = false,\n decoration = \"none\",\n hoverable,\n titleClassName,\n subtitleClassName,\n descriptionClassName,\n color,\n hoverColor,\n borderColor,\n backgroundColor,\n scrollable = true,\n vibrancy = \"medium\",\n glassOpacity = \"frosted\",\n specularHighlight = true,\n specularMode,\n ...rest\n}) => {\n const palette = getPanelToneStyles(tone);\n const colorPalette = color ? getPanelToneStyles(color) : palette;\n const isHoverable = hoverable ?? Boolean(rest.onClick);\n\n const resolvedSpecularMode: PanelSpecularMode = (() => {\n if (specularMode !== undefined) return specularMode;\n if (specularHighlight === false) return \"none\";\n return \"classic\";\n })();\n\n const effectiveHoverColor =\n hoverColor ?? (color && color !== \"neutral\" ? color : undefined);\n const hoverColorName = effectiveHoverColor\n ? effectiveHoverColor\n : undefined;\n\n const borderPalette = borderColor\n ? getPanelToneStyles(borderColor)\n : undefined;\n const effectiveBorderClass = borderPalette?.border;\n\n const bgPalette = backgroundColor\n ? getPanelToneStyles(backgroundColor)\n : undefined;\n\n const effectiveBgClass = (() => {\n if (!backgroundColor) return undefined;\n if (backgroundColor === \"neutral\") return \"bg-white dark:bg-neutral-900\";\n if (bgPalette) {\n if (variant === \"glass\") return bgPalette.glassBg;\n if (variant === \"subtle\") return bgPalette.subtleBg;\n if (variant === \"simple\") return bgPalette.tonalBg;\n if (variant === \"tonal\") return bgPalette.tonalBg;\n // For elevated/outlined, we might want to apply the subtle background\n return bgPalette.tonalBg;\n }\n return undefined;\n })();\n\n const isOverlay = mediaPlacement === \"overlay\" && Boolean(media);\n const hasMedia = Boolean(media);\n // Decoration is suppressed in overlay mode since the image + gradient already provide impact\n const showDecorationGradient =\n !isOverlay && (decoration === \"gradient\" || decoration === \"both\");\n const showDecorationShapes =\n !isOverlay && (decoration === \"shapes\" || decoration === \"both\");\n\n const resolvedStyle: React.CSSProperties = (() => {\n const styles: React.CSSProperties = { ...style };\n if (maxWidth !== undefined) {\n styles.maxWidth =\n typeof maxWidth === \"number\" ? `${maxWidth}px` : maxWidth;\n }\n if (minHeight !== undefined) {\n styles.minHeight =\n typeof minHeight === \"number\" ? `${minHeight}px` : minHeight;\n }\n return styles;\n })();\n\n const vibrancyValue = (() => {\n if (typeof vibrancy === \"number\") return vibrancy;\n if (vibrancy === \"low\") return 1;\n if (vibrancy === \"medium\") return 1.2;\n if (vibrancy === \"high\") return 1.4;\n return 1.2;\n })();\n const vibrancyClass = `backdrop-saturate-[${vibrancyValue}]`;\n\n const glassFillClass = (() => {\n const litOpacity = (() => {\n if (typeof glassOpacity === \"number\") return Math.round((glassOpacity as number) * 100);\n if (glassOpacity === \"frosted\") return 45;\n if (glassOpacity === \"light\") return 70;\n if (glassOpacity === \"clear\") return 20;\n return 45;\n })();\n const drkOpacity = (() => {\n if (typeof glassOpacity === \"number\") return Math.min(Math.round((glassOpacity as number) * 30), 30);\n if (glassOpacity === \"frosted\") return 15;\n if (glassOpacity === \"light\") return 25;\n if (glassOpacity === \"clear\") return 5;\n return 15;\n })();\n const base = tone;\n return `bg-${base}-50/${litOpacity} dark:bg-${base}-500/${drkOpacity}`;\n })();\n\n const variantClasses = (() => {\n switch (variant) {\n case \"outlined\":\n return classNames(\n variantBaseStyles.outlined,\n effectiveBorderClass ?? palette.border,\n );\n case \"subtle\":\n return classNames(\n variantBaseStyles.subtle,\n effectiveBorderClass ?? palette.border,\n effectiveBgClass ?? palette.subtleBg,\n );\n case \"tonal\":\n return classNames(\n variantBaseStyles.tonal,\n effectiveBgClass ?? palette.tonalBg,\n effectiveBorderClass,\n );\n case \"default\":\n return classNames(\n variantBaseStyles.default,\n effectiveBorderClass ?? \"border border-white/40\",\n );\n case \"glass\":\n return classNames(\n variantBaseStyles.glass,\n \"border\",\n effectiveBorderClass ?? colorPalette.glassBorder,\n effectiveBgClass ?? palette.glassBg,\n );\n case \"liquid-glass\":\n return classNames(\n \"backdrop-blur-2xl ring-1 ring-transparent dark:ring-white/5\",\n vibrancyClass,\n glassFillClass,\n effectiveBorderClass ?? palette.liquidBorder,\n palette.liquidShadow,\n palette.liquidHeading,\n );\n case \"simple\":\n return classNames(\n variantBaseStyles.simple,\n effectiveBgClass ?? palette.tonalBg,\n effectiveBorderClass,\n );\n case \"elevated\":\n return classNames(\n !effectiveBgClass && variantBaseStyles.elevated,\n effectiveBgClass &&\n \"text-neutral-900 shadow-xl ring-1 ring-black/5 dark:text-neutral-100 dark:ring-white/10\",\n effectiveBorderClass,\n effectiveBgClass,\n );\n default:\n return classNames(\n !effectiveBgClass && variantBaseStyles.elevated,\n effectiveBgClass &&\n \"text-neutral-900 shadow-xl ring-1 ring-black/5 dark:text-neutral-100 dark:ring-white/10\",\n effectiveBorderClass,\n effectiveBgClass,\n );\n }\n })();\n\n const overlayClasses = isOverlay\n ? \"relative overflow-hidden text-white shadow-xl ring-0\"\n : undefined;\n\n const headingClass = isOverlay\n ? \"text-white\"\n : variant === \"liquid-glass\"\n ? palette.liquidHeading\n : palette.heading;\n const subtitleClass = isOverlay ? \"text-white/80\" : palette.muted;\n const descriptionClass = isOverlay ? \"text-white/75\" : palette.muted;\n const badgeNode =\n typeof badge === \"string\" ? (\n <span\n className={classNames(\n \"inline-flex items-center rounded-full px-2.5 py-1 text-xs font-medium tracking-wide\",\n isOverlay\n ? \"bg-white/15 text-white/90 backdrop-blur-sm\"\n : palette.badge,\n )}\n >\n {badge}\n </span>\n ) : (\n badge\n );\n\n const titleNode =\n typeof title === \"string\" ? (\n <h3\n className={classNames(\n \"text-xl font-semibold leading-7\",\n headingClass,\n titleClassName,\n )}\n >\n {title}\n </h3>\n ) : (\n title\n );\n\n const subtitleNode =\n typeof subtitle === \"string\" ? (\n <p\n className={classNames(\n \"text-base font-medium leading-6\",\n subtitleClass,\n subtitleClassName,\n )}\n >\n {subtitle}\n </p>\n ) : (\n subtitle\n );\n\n const descriptionNode =\n typeof description === \"string\" ? (\n <p\n className={classNames(\n \"text-sm leading-6\",\n descriptionClass,\n descriptionClassName,\n )}\n >\n {description}\n </p>\n ) : (\n description\n );\n\n const headerSection =\n badgeNode || titleNode || subtitleNode || descriptionNode ? (\n <div className={`space-y-3${flexBody ? \" flex flex-col\" : \"\"}`}>\n {badge && <div>{badgeNode}</div>}\n {title && <div className=\"space-y-2\">{titleNode}</div>}\n {subtitle && <div>{subtitleNode}</div>}\n {description && <div>{descriptionNode}</div>}\n </div>\n ) : null;\n\n const bodyContent = children ? (\n <div\n className={classNames(\n padding === \"none\" ? \"\" : \"space-y-3 leading-6\",\n flexBody ? \"flex-1 flex flex-col w-full\" : \"\",\n isOverlay ? \"text-white/80\" : \"text-neutral-700 dark:text-neutral-300\",\n bodyClassName,\n )}\n style={bodyStyle}\n >\n {children}\n </div>\n ) : null;\n\n const bodySection = bodyContent ? (\n <div\n className={classNames(\n flexBody ? \"flex-1 flex flex-col w-full\" : \"\",\n \"min-h-0 flex-1\",\n scrollable\n ? \"overflow-auto [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-neutral-200 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-700 hover:[&::-webkit-scrollbar-thumb]:bg-neutral-300 dark:hover:[&::-webkit-scrollbar-thumb]:bg-neutral-600 [&::-webkit-scrollbar-track]:bg-transparent\"\n : \"\",\n padding === \"none\" ? \"\" : \"pr-1\",\n )}\n >\n {bodyContent}\n </div>\n ) : null;\n\n const actionsSection =\n actions && actions.length > 0 ? (\n <div\n className={classNames(\n \"flex pt-3\",\n actionWrapperLayout[actionLayout],\n bodySection ? \"mt-auto\" : \"mt-4\",\n )}\n >\n {actions.map((action, index) => {\n const {\n id,\n label,\n className: actionClassName,\n color,\n size,\n ...buttonProps\n } = action;\n const key = id ?? `${index}`;\n const responsiveWidth = actionButtonWidth[actionLayout];\n\n return (\n <Button\n key={key}\n color={color ?? defaultActionColor}\n size={size ?? \"md\"}\n className={classNames(responsiveWidth, actionClassName)}\n {...buttonProps}\n >\n {label}\n </Button>\n );\n })}\n </div>\n ) : null;\n\n const mediaTopNode =\n hasMedia && mediaPlacement === \"top\" ? (\n <div className=\"overflow-hidden\">{media}</div>\n ) : null;\n\n const mediaSideNode =\n hasMedia && (mediaPlacement === \"start\" || mediaPlacement === \"end\") ? (\n <div className=\"w-full overflow-hidden rounded-xl border border-black/5 dark:border-white/10 sm:w-1/3 sm:min-w-[14rem]\">\n {media}\n </div>\n ) : null;\n\n const contentSection = (() => {\n if (mediaPlacement === \"start\" || mediaPlacement === \"end\") {\n return (\n <div\n className={classNames(\n \"flex min-h-0 flex-1 flex-col gap-6 sm:flex-row\",\n mediaPlacement === \"end\" ? \"sm:flex-row-reverse\" : \"sm:flex-row\",\n hasMedia ? \"sm:items-start\" : undefined,\n )}\n >\n {mediaSideNode}\n <div className=\"flex min-h-0 flex-1 flex-col gap-4\">\n {headerSection}\n {bodySection}\n {actionsSection}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4\">\n {mediaTopNode}\n {headerSection}\n {bodySection}\n {actionsSection}\n </div>\n );\n })();\n\n return (\n <section\n className={classNames(\n \"relative flex w-full min-h-0 flex-col overflow-hidden shrink-0\",\n variantClasses,\n paddingStyles[padding],\n cornerStyles[corner],\n fullWidth ? \"w-full\" : undefined,\n isOverlay ? overlayClasses : undefined,\n hoverShadow &&\n \"transition-shadow duration-200 hover:shadow-xl hover:-translate-y-[1px]\",\n isHoverable && \"group cursor-pointer\",\n isHoverable &&\n hoverColorName &&\n `hover:bg-${hoverColorName}-50 dark:hover:bg-${hoverColorName}-900/20`,\n className,\n )}\n style={resolvedStyle}\n data-variant={variant}\n data-tone={tone}\n aria-busy={loading}\n {...rest}\n >\n {isOverlay && (\n <>\n <div className=\"absolute inset-0 overflow-hidden\">\n <div className=\"h-full w-full\">{media}</div>\n </div>\n <div\n className={classNames(\n \"pointer-events-none absolute inset-0 bg-gradient-to-br\",\n palette.overlayGradient,\n )}\n />\n </>\n )}\n {showDecorationGradient && (\n <div\n className={classNames(\n \"pointer-events-none absolute inset-0 bg-gradient-to-br\",\n palette.decorationGradient,\n isHoverable &&\n \"transition-opacity duration-200 group-hover:opacity-50\",\n )}\n aria-hidden=\"true\"\n />\n )}\n {showDecorationShapes && (\n <>\n <div\n className={classNames(\n \"pointer-events-none absolute -right-10 -top-10 w-52 h-52 rounded-full\",\n palette.decorationShape,\n isHoverable &&\n \"transition-opacity duration-200 group-hover:opacity-50\",\n )}\n aria-hidden=\"true\"\n />\n <div\n className={classNames(\n \"pointer-events-none absolute -left-8 -bottom-10 w-36 h-36 rounded-full opacity-70\",\n palette.decorationShape,\n isHoverable &&\n \"transition-opacity duration-200 group-hover:opacity-40\",\n )}\n aria-hidden=\"true\"\n />\n <div\n className={classNames(\n \"pointer-events-none absolute right-10 bottom-8 w-16 h-16 rounded-full opacity-50\",\n palette.decorationShape,\n isHoverable &&\n \"transition-opacity duration-200 group-hover:opacity-25\",\n )}\n aria-hidden=\"true\"\n />\n </>\n )}\n {isHoverable && !hoverColorName && (\n <div\n className=\"pointer-events-none absolute inset-0 rounded-[inherit] bg-transparent transition-colors duration-200 group-hover:bg-black/[0.025] dark:group-hover:bg-white/[0.04]\"\n aria-hidden=\"true\"\n />\n )}\n {variant === \"liquid-glass\" && resolvedSpecularMode !== \"none\" && (\n <>\n {resolvedSpecularMode === \"classic\" && (\n <div\n className={classNames(\n \"pointer-events-none absolute inset-x-0 top-0 h-px rounded-t-[inherit]\",\n \"bg-gradient-to-r from-transparent via-white/40 to-transparent\",\n \"dark:via-white/10\",\n )}\n aria-hidden=\"true\"\n />\n )}\n {resolvedSpecularMode === \"halo\" && (\n <>\n {/* Top-left corner cap */}\n <div\n className=\"pointer-events-none absolute top-0 left-0 w-24 h-12 rounded-tl-[inherit] bg-gradient-to-br from-white/45 via-white/15 to-transparent\"\n aria-hidden=\"true\"\n />\n {/* Top-right corner cap */}\n <div\n className=\"pointer-events-none absolute top-0 right-0 w-24 h-12 rounded-tr-[inherit] bg-gradient-to-bl from-white/45 via-white/15 to-transparent\"\n aria-hidden=\"true\"\n />\n {/* Diffuse glow band */}\n <div\n className=\"pointer-events-none absolute inset-x-0 top-0 h-[28%] bg-gradient-to-b from-white/20 via-white/8 to-transparent\"\n aria-hidden=\"true\"\n />\n {/* Bottom darken */}\n <div\n className=\"pointer-events-none absolute inset-x-0 bottom-0 h-[15%] bg-gradient-to-t from-transparent to-black/4\"\n aria-hidden=\"true\"\n />\n </>\n )}\n </>\n )}\n <div\n className={classNames(\n \"relative z-10 flex min-h-0 flex-1 flex-col gap-4\",\n isOverlay && \"backdrop-blur-sm\",\n )}\n >\n {disabled && (\n <div\n className=\"absolute inset-0 z-10 bg-white/70 dark:bg-slate-900/70\"\n aria-hidden=\"true\"\n />\n )}\n {contentSection}\n </div>\n {loading && (\n <Loader\n overlay\n variant={loaderType}\n title={loaderTitle}\n label={loaderMessage}\n progress={loaderProgress}\n color={loaderColor}\n />\n )}\n </section>\n );\n};\n\nexport default Panel;\n","import React, { useState } from \"react\";\nimport classNames from \"classnames\";\nimport Panel, { PanelProps, paddingStyles } from \"./Panel\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\n\n// Override specific props for CollapsiblePanel\nexport interface CollapsiblePanelProps\n extends Omit<\n PanelProps,\n \"title\" | \"subtitle\" | \"actions\" | \"children\" | \"onToggle\"\n > {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n actions?: React.ReactNode;\n\n defaultExpanded?: boolean;\n expanded?: boolean;\n onToggle?: (expanded: boolean) => void;\n minExpandedHeight?: number | string;\n\n children: React.ReactNode;\n contentClassName?: string;\n contentMaxHeight?: number;\n /** When true, the expanded content grows to fill available space instead of scrolling. */\n fillHeight?: boolean;\n}\n\nconst CollapsiblePanel: React.FC<CollapsiblePanelProps> = ({\n title,\n subtitle,\n actions,\n defaultExpanded = false,\n expanded,\n onToggle,\n children,\n contentClassName,\n contentMaxHeight = 320,\n minExpandedHeight,\n fillHeight = false,\n className,\n disabled,\n variant = \"elevated\",\n tone = \"neutral\",\n padding = \"md\",\n corner = \"rounded-sm\",\n hoverable = false,\n ...panelProps\n}) => {\n const renderIcon = useIconRenderer();\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const isControlled = typeof expanded === \"boolean\";\n const isExpanded = isControlled ? expanded : internalExpanded;\n\n const handleToggle = () => {\n if (disabled) return;\n const next = !isExpanded;\n if (!isControlled) setInternalExpanded(next);\n onToggle?.(next);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleToggle();\n }\n };\n\n const computedContentMaxHeight = `min(${contentMaxHeight ?? 320}px, 65vh)`;\n const resolvedPadding = paddingStyles[padding] || paddingStyles.md;\n\n return (\n <Panel\n className={classNames(\n \"transition-all duration-300\",\n fillHeight && isExpanded ? \"flex flex-col min-h-0\" : \"shrink-0\",\n className,\n )}\n variant={variant}\n tone={tone}\n padding=\"none\"\n corner={corner}\n disabled={disabled}\n hoverable={hoverable}\n scrollable={false}\n {...panelProps}\n >\n <div\n className={classNames(\n \"flex flex-col w-full\",\n fillHeight && isExpanded && \"h-full\",\n )}\n >\n {/* Header — div with button roles keeps actions (which may render their own <button>) out of a native <button>. */}\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={classNames(\n \"flex w-full items-center gap-3 text-left focus:outline-none transition-opacity\",\n resolvedPadding,\n disabled\n ? \"cursor-not-allowed opacity-60\"\n : \"cursor-pointer hover:opacity-80 focus-visible:ring-2 focus-visible:ring-indigo-500 rounded-lg\",\n )}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n aria-expanded={isExpanded}\n aria-controls=\"collapsible-panel-content\"\n >\n <div className=\"flex flex-1 flex-col gap-0.5\">\n <span className=\"text-sm font-semibold\">{title}</span>\n {subtitle && <span className=\"text-xs opacity-70\">{subtitle}</span>}\n </div>\n\n {actions && <div onClick={(e) => e.stopPropagation()}>{actions}</div>}\n\n <span\n className={classNames(\n \"transition-transform duration-300\",\n isExpanded ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n {renderIcon(\"ArrowDown\", \"sm\")}\n </span>\n </div>\n\n {/* Content Wrapper */}\n <div id=\"collapsible-panel-content\" role=\"region\" aria-label=\"panel content\"\n className={classNames(\n \"overflow-hidden transition-[max-height,opacity,margin] duration-300 ease-in-out\",\n fillHeight && isExpanded && \"flex-1 min-h-0\",\n isExpanded ? \"opacity-100\" : \"max-h-0 opacity-0 m-0\",\n )}\n style={{\n maxHeight:\n isExpanded && !fillHeight\n ? `calc(${computedContentMaxHeight} + ${typeof minExpandedHeight === \"number\" ? minExpandedHeight + \"px\" : minExpandedHeight || \"0px\"} + 4rem)`\n : isExpanded\n ? undefined\n : \"0px\",\n }}\n >\n <div\n className={classNames(\n \"text-sm leading-relaxed\",\n resolvedPadding,\n \"pt-0\",\n isExpanded && !fillHeight\n ? \"overflow-y-auto [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-neutral-200 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-700 hover:[&::-webkit-scrollbar-thumb]:bg-neutral-300 dark:hover:[&::-webkit-scrollbar-thumb]:bg-neutral-600 [&::-webkit-scrollbar-track]:bg-transparent\"\n : \"overflow-hidden\",\n contentClassName,\n )}\n style={{\n maxHeight:\n isExpanded && !fillHeight\n ? computedContentMaxHeight\n : undefined,\n minHeight: isExpanded ? minExpandedHeight : undefined,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n </Panel>\n );\n};\n\nexport default CollapsiblePanel;\n","import React, { type ReactNode } from \"react\";\n\nexport interface HeaderGroupProps {\n children: ReactNode;\n className?: string;\n}\n\nexport const HeaderGroup: React.FC<HeaderGroupProps> = ({\n children,\n className = \"\",\n}) => {\n return (\n <div\n className={`flex\n items-center\n text-black\n dark:text-white\n h-full\n relative\n [&+&]:ml-2\n [&+&::before]:content-['']\n [&+&::before]:absolute\n [&+&::before]:left-[-4px]\n [&+&::before]:top-1/2\n [&+&::before]:-translate-y-1/2\n [&+&::before]:transform\n [&+&::before]:h-1/2\n [&+&::before]:w-[2px]\n [&+&::before]:bg-neutral-300\n ${className}`}\n >\n <div className=\"flex items-center px-1\">{children}</div>\n </div>\n );\n};\n\nHeaderGroup.displayName = \"HeaderGroup\";\n\nexport default HeaderGroup;\n","import React, { useState, type ReactNode } from \"react\";\nimport Button from \"./Button\";\n\nexport interface DetailItemCardProps {\n title: string;\n subtitle?: string;\n description?: string;\n badges?: ReactNode;\n children?: ReactNode;\n defaultExpanded?: boolean;\n onClick?: () => void;\n className?: string;\n badgesAlignment?: \"bottom\" | \"right\" | \"bottom-end\";\n}\n\nconst DetailItemCard: React.FC<DetailItemCardProps> = ({\n title,\n subtitle,\n description,\n badges,\n children,\n defaultExpanded = false,\n onClick,\n className = \"\",\n badgesAlignment = \"right\",\n}) => {\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const hasDetails = !!children;\n\n const handleToggleExpand = (e: React.MouseEvent) => {\n if (hasDetails) {\n e.stopPropagation();\n setExpanded((prev) => !prev);\n }\n };\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.stopPropagation();\n onClick();\n }\n };\n\n return (\n <div\n className={`flex w-full flex-col gap-2.5 ${expanded ? \"expanded\" : \"\"} ${className}`}\n onClick={handleClick}\n >\n <div className=\"flex flex-1 flex-row items-center justify-between gap-1.5\">\n {hasDetails && (\n <div className=\"flex-shrink-0\">\n <Button\n variant=\"icon\"\n className=\"h-6 w-6\"\n onClick={handleToggleExpand}\n aria-expanded={expanded}\n aria-label={expanded ? \"Collapse details\" : \"Expand details\"}\n >\n <span\n className={`flex items-center justify-center text-lg font-bold transition-transform duration-200 ${expanded ? \"rotate-0\" : \"rotate-0\"}`}\n >\n {expanded ? \"−\" : \"+\"}\n </span>\n </Button>\n </div>\n )}\n <div className=\"flex flex-1 flex-col leading-normal\">\n <div className=\"text-base font-normal text-neutral-900 dark:text-neutral-100\">\n {title}\n </div>\n {subtitle && (\n <div className=\"text-xs font-semibold text-neutral-500 dark:text-neutral-400\">\n {subtitle}\n </div>\n )}\n {description && (\n <div className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {description}\n </div>\n )}\n {badgesAlignment == \"bottom\" && (\n <div className=\"flex flex-row justify-start gap-px\">{badges}</div>\n )}\n {badgesAlignment == \"bottom-end\" && (\n <div className=\"flex flex-row justify-end gap-px\">{badges}</div>\n )}\n </div>\n\n {badgesAlignment == \"right\" && (\n <div className=\"flex flex-col justify-end gap-px\">{badges}</div>\n )}\n </div>\n\n {hasDetails && expanded && (\n <div className=\"flex flex-col gap-2.5 px-[30px] text-sm text-neutral-500 dark:text-neutral-400\">\n {children}\n </div>\n )}\n </div>\n );\n};\n\nDetailItemCard.displayName = \"DetailItemCard\";\n\nexport default DetailItemCard;\n","import React, { useEffect, useState, useRef, useCallback } from \"react\";\nimport classNames from \"classnames\";\nimport Spinner from \"./Spinner\";\n\nexport interface InfiniteScrollPanelProps<T> {\n items: T[];\n isLoading: boolean;\n hasMore: boolean;\n onLoadMore: () => Promise<void>;\n renderItem: (item: T, index: number) => React.ReactNode;\n loadingComponent?: React.ReactNode;\n emptyComponent?: React.ReactNode;\n className?: string;\n threshold?: number;\n debounceMs?: number;\n useFixedColumns?: boolean;\n minColumnWidthPx?: number;\n maxColumns?: number;\n columnTemplate?: string;\n masonry?: boolean;\n}\n\nexport function InfiniteScrollPanel<T>({\n items,\n isLoading,\n hasMore,\n onLoadMore,\n renderItem,\n loadingComponent,\n emptyComponent,\n className = \"\",\n threshold = 3,\n debounceMs = 100,\n useFixedColumns = false,\n minColumnWidthPx = 300,\n maxColumns,\n columnTemplate,\n masonry = false,\n}: InfiniteScrollPanelProps<T>) {\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const itemsContainerRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Array<HTMLDivElement | null>>([]);\n const loadingRef = useRef<HTMLDivElement>(null);\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const resizeObserversRef = useRef<ResizeObserver[]>([]);\n const rafIdRef = useRef<number | null>(null);\n const delayedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [columnCount, setColumnCount] = useState<number>(1);\n\n const handleLoadMore = useCallback(async () => {\n if (isLoadingMore || !hasMore) return;\n\n setIsLoadingMore(true);\n try {\n await onLoadMore();\n } catch (error) {\n console.error(\"Error loading more items:\", error);\n } finally {\n setIsLoadingMore(false);\n }\n }, [isLoadingMore, hasMore, onLoadMore]);\n\n const handleScroll = useCallback(() => {\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n debounceTimeoutRef.current = setTimeout(() => {\n if (!containerRef.current || !loadingRef.current) return;\n\n const container = containerRef.current;\n const loadingElement = loadingRef.current;\n const containerRect = container.getBoundingClientRect();\n const loadingRect = loadingElement.getBoundingClientRect();\n\n const isVisible =\n loadingRect.top <= containerRect.bottom + threshold * 50;\n\n if (isVisible && hasMore && !isLoadingMore && !isLoading) {\n void handleLoadMore();\n }\n }, debounceMs);\n }, [\n hasMore,\n isLoadingMore,\n isLoading,\n threshold,\n debounceMs,\n handleLoadMore,\n ]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n container.addEventListener(\"scroll\", handleScroll);\n window.addEventListener(\"resize\", handleScroll);\n\n return () => {\n container.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"resize\", handleScroll);\n };\n }, [handleScroll]);\n\n useEffect(() => {\n if (\n items.length > 0 &&\n items.length < threshold &&\n hasMore &&\n !isLoadingMore &&\n !isLoading\n ) {\n void handleLoadMore();\n }\n }, [\n items.length,\n threshold,\n hasMore,\n isLoadingMore,\n isLoading,\n handleLoadMore,\n ]);\n\n useEffect(() => {\n if (!isLoading && !isLoadingMore) {\n handleScroll();\n }\n }, [isLoading, isLoadingMore, items.length, handleScroll]);\n\n const defaultLoadingComponent = (\n <div className=\"flex flex-col items-center justify-center gap-4\">\n <Spinner thickness=\"thick\" color=\"blue\" size=\"lg\" variant=\"segments\" />\n <span className=\"text-md\">Loading more...</span>\n </div>\n );\n\n const defaultEmptyComponent = (\n <div className=\"flex items-center justify-center p-12 text-center text-base text-neutral-500 dark:text-neutral-400\">\n <span>No items found</span>\n </div>\n );\n\n const recomputeMasonrySpans = useCallback(() => {\n const grid = itemsContainerRef.current;\n if (!grid) return;\n const computed = window.getComputedStyle(grid);\n const rowGap = parseFloat(computed.rowGap || \"0\");\n const rowHeight = parseFloat(\n computed.getPropertyValue(\"--masonry-row-height\") || \"8\",\n );\n\n itemRefs.current.forEach((el) => {\n if (!el) return;\n const contentHeight = el.getBoundingClientRect().height;\n const rowSpan = Math.max(\n 1,\n Math.ceil((contentHeight + rowGap) / (rowHeight + rowGap)),\n );\n const current = el.style.gridRowEnd;\n const next = `span ${rowSpan}`;\n if (current !== next) {\n el.style.gridRowEnd = next;\n }\n });\n }, []);\n\n const scheduleRecompute = useCallback(\n (delayMs: number = 60) => {\n if (delayedTimerRef.current) {\n clearTimeout(delayedTimerRef.current);\n delayedTimerRef.current = null;\n }\n delayedTimerRef.current = setTimeout(() => {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n }\n rafIdRef.current = requestAnimationFrame(() => {\n recomputeMasonrySpans();\n rafIdRef.current = null;\n });\n }, delayMs);\n },\n [recomputeMasonrySpans],\n );\n\n useEffect(() => {\n if (useFixedColumns) return;\n resizeObserversRef.current.forEach((ro) => ro.disconnect());\n resizeObserversRef.current = [];\n\n itemRefs.current.forEach((el) => {\n if (!el) return;\n const ro = new ResizeObserver(() => scheduleRecompute());\n ro.observe(el);\n resizeObserversRef.current.push(ro);\n });\n\n scheduleRecompute(0);\n\n const handler = () => scheduleRecompute(0);\n window.addEventListener(\"resize\", handler);\n return () => {\n window.removeEventListener(\"resize\", handler);\n resizeObserversRef.current.forEach((ro) => ro.disconnect());\n resizeObserversRef.current = [];\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n if (delayedTimerRef.current) {\n clearTimeout(delayedTimerRef.current);\n delayedTimerRef.current = null;\n }\n };\n }, [items, scheduleRecompute, useFixedColumns]);\n\n useEffect(() => {\n if (!useFixedColumns) return;\n const computeColumns = () => {\n const container = containerRef.current;\n if (!container) return;\n const gap = 16;\n const width = container.clientWidth;\n const cols = Math.max(\n 1,\n Math.floor((width + gap) / (minColumnWidthPx + gap)),\n );\n setColumnCount(maxColumns ? Math.min(cols, maxColumns) : cols);\n };\n computeColumns();\n window.addEventListener(\"resize\", computeColumns);\n return () => window.removeEventListener(\"resize\", computeColumns);\n }, [useFixedColumns, minColumnWidthPx, maxColumns]);\n\n return (\n <div\n ref={containerRef}\n className={classNames(\n \"relative flex h-full min-h-0 flex-col overflow-x-hidden overflow-y-auto\",\n \"scrollbar-thin scrollbar-track-neutral-100 scrollbar-thumb-neutral-300 hover:scrollbar-thumb-neutral-400\",\n \"dark:scrollbar-track-neutral-800 dark:scrollbar-thumb-neutral-600 dark:hover:scrollbar-thumb-neutral-500\",\n \"[&::-webkit-scrollbar-track]:rounded [&::-webkit-scrollbar-thumb]:rounded\",\n className,\n )}\n >\n {items.length === 0 && !isLoading ? (\n emptyComponent || defaultEmptyComponent\n ) : (\n <>\n {useFixedColumns ? (\n <div\n className={classNames(\n \"mb-5 grid gap-4\",\n columnCount === 1 && \"grid-cols-1\",\n columnCount === 2 && \"grid-cols-2\",\n columnCount === 3 && \"grid-cols-3\",\n columnCount === 4 && \"grid-cols-4\",\n columnCount >= 5 && \"grid-cols-5\",\n )}\n >\n {Array.from({ length: columnCount }).map((_, colIdx) => (\n <div key={colIdx} className=\"flex flex-col gap-4\">\n {items\n .map((item, index) => ({ item, index }))\n .filter(({ index }) => index % columnCount === colIdx)\n .map(({ item, index }) => (\n <div\n key={index}\n className=\"flex items-start justify-center\"\n >\n {renderItem(item, index)}\n </div>\n ))}\n </div>\n ))}\n </div>\n ) : (\n <div\n ref={itemsContainerRef}\n className={classNames(\n \"mb-[60px] grid grid-cols-[repeat(auto-fill,minmax(300px,1fr))] items-start gap-2.5 py-4\",\n masonry &&\n \"[--masonry-row-height:8px] auto-rows-[var(--masonry-row-height)]\",\n )}\n style={{\n gridTemplateColumns: columnTemplate,\n }}\n >\n {items.map((item, index) => (\n <div\n key={index}\n className=\"flex items-start justify-center\"\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n >\n {renderItem(item, index)}\n </div>\n ))}\n </div>\n )}\n\n {items.length > 0 && (hasMore || isLoadingMore) && (\n <div\n ref={loadingRef}\n className={`flex min-h-[100px] ${!loadingComponent ? \" items-center justify-center p-8\" : \"\"}`}\n >\n {loadingComponent || defaultLoadingComponent}\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\nInfiniteScrollPanel.displayName = \"InfiniteScrollPanel\";\n\nexport default InfiniteScrollPanel;\n","import React, { useState } from \"react\";\nimport classNames from \"classnames\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport type { TrueColor } from \"../theme/Theme\";\n\nexport interface CollapsibleHelpTextProps\n extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n text: string;\n maxLength?: number;\n children?: React.ReactNode;\n showIcon?: boolean;\n icon?: string;\n tone?: TrueColor;\n variant?: \"card\" | \"plain\";\n renderMarkdown?: (text: string) => React.ReactNode;\n}\n\nconst toneTokens: Partial<\n Record<\n TrueColor,\n {\n border: string;\n accent: string;\n iconBg: string;\n text: string;\n focusRing: string;\n hover: string;\n }\n >\n> = {\n blue: {\n border: \"border-blue-100 dark:border-blue-500/40\",\n accent: \"text-blue-600 dark:text-blue-300\",\n iconBg: \"bg-blue-50 dark:bg-blue-500/10\",\n text: \"text-blue-700 dark:text-blue-200\",\n focusRing:\n \"focus-visible:ring-blue-200 dark:focus-visible:ring-blue-500/40\",\n hover: \"hover:bg-blue-50/60 dark:hover:bg-blue-500/5\",\n },\n indigo: {\n border: \"border-indigo-100 dark:border-indigo-500/40\",\n accent: \"text-indigo-600 dark:text-indigo-300\",\n iconBg: \"bg-indigo-50 dark:bg-indigo-500/10\",\n text: \"text-indigo-700 dark:text-indigo-200\",\n focusRing:\n \"focus-visible:ring-indigo-200 dark:focus-visible:ring-indigo-500/40\",\n hover: \"hover:bg-indigo-50/60 dark:hover:bg-indigo-500/5\",\n },\n emerald: {\n border: \"border-emerald-100 dark:border-emerald-500/40\",\n accent: \"text-emerald-600 dark:text-emerald-300\",\n iconBg: \"bg-emerald-50 dark:bg-emerald-500/10\",\n text: \"text-emerald-700 dark:text-emerald-200\",\n focusRing:\n \"focus-visible:ring-emerald-200 dark:focus-visible:ring-emerald-500/40\",\n hover: \"hover:bg-emerald-50/60 dark:hover:bg-emerald-500/5\",\n },\n amber: {\n border: \"border-amber-100 dark:border-amber-500/40\",\n accent: \"text-amber-600 dark:text-amber-300\",\n iconBg: \"bg-amber-50 dark:bg-amber-500/10\",\n text: \"text-amber-700 dark:text-amber-200\",\n focusRing:\n \"focus-visible:ring-amber-200 dark:focus-visible:ring-amber-500/40\",\n hover: \"hover:bg-amber-50/60 dark:hover:bg-amber-500/5\",\n },\n rose: {\n border: \"border-rose-100 dark:border-rose-500/40\",\n accent: \"text-rose-600 dark:text-rose-300\",\n iconBg: \"bg-rose-50 dark:bg-rose-500/10\",\n text: \"text-rose-700 dark:text-rose-200\",\n focusRing:\n \"focus-visible:ring-rose-200 dark:focus-visible:ring-rose-500/40\",\n hover: \"hover:bg-rose-50/60 dark:hover:bg-rose-500/5\",\n },\n slate: {\n border: \"border-slate-200 dark:border-slate-700\",\n accent: \"text-slate-600 dark:text-slate-300\",\n iconBg: \"bg-slate-100 dark:bg-slate-800\",\n text: \"text-slate-700 dark:text-slate-200\",\n focusRing: \"focus-visible:ring-slate-200 dark:focus-visible:ring-slate-600\",\n hover: \"hover:bg-slate-50 dark:hover:bg-slate-800/80\",\n },\n};\n\nconst truncate = (value: string, limit: number) => {\n if (value.length <= limit) {\n return value;\n }\n return `${value.slice(0, limit).trim()}...`;\n};\n\nexport const CollapsibleHelpText: React.FC<CollapsibleHelpTextProps> = ({\n title,\n text,\n maxLength = 160,\n showIcon = false,\n icon = \"Help\",\n children,\n className,\n tone = \"blue\",\n variant = \"card\",\n renderMarkdown,\n ...rest\n}) => {\n const renderIcon = useIconRenderer();\n const sanitized = text?.trim() ?? \"\";\n const needsTruncation = sanitized.length > maxLength;\n const [expanded, setExpanded] = useState(false);\n\n const colorTokens = toneTokens[tone] ?? toneTokens.neutral!;\n const displayText =\n expanded || !needsTruncation ? sanitized : truncate(sanitized, maxLength);\n\n const textContent = renderMarkdown ? (\n renderMarkdown(displayText)\n ) : (\n <div className=\"prose prose-sm max-w-none text-slate-600 prose-p:my-1 prose-ul:my-1 dark:text-slate-200\">\n <p>{displayText}</p>\n </div>\n );\n\n const headerContent = (\n <>\n {showIcon && (\n <span\n className={classNames(\n \"flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-full\",\n colorTokens.iconBg,\n colorTokens.accent,\n )}\n >\n {renderIcon(icon, \"sm\", \"text-inherit\")}\n </span>\n )}\n <div className=\"flex flex-1 flex-col gap-1 text-left\">\n {title && (\n <p className={classNames(\"text-sm font-semibold\", colorTokens.text)}>\n {title}\n </p>\n )}\n {textContent}\n </div>\n {needsTruncation && (\n <span\n className={classNames(\n \"ml-2 flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full border border-slate-200 text-slate-500 transition dark:border-slate-700 dark:text-slate-200\",\n colorTokens.accent,\n )}\n aria-hidden=\"true\"\n >\n {renderIcon(\n \"ArrowDown\",\n \"sm\",\n classNames(\n \"transition-transform duration-200\",\n expanded && \"rotate-180\",\n ),\n )}\n </span>\n )}\n </>\n );\n\n const containerClasses = classNames(\n \"w-full transition\",\n variant === \"card\"\n ? classNames(\n \"rounded-2xl border bg-white/90 p-4 shadow-sm dark:bg-slate-900/80\",\n colorTokens.border,\n )\n : \"rounded-xl border border-transparent bg-transparent p-0 shadow-none\",\n className,\n );\n\n const triggerClasses = classNames(\n \"flex w-full items-start gap-3 rounded-2xl px-1 py-1 text-left transition\",\n variant === \"plain\" && \"rounded-xl px-0 py-0\",\n colorTokens.hover,\n colorTokens.focusRing,\n );\n\n return (\n <div className={containerClasses} {...rest}>\n {needsTruncation ? (\n <button\n type=\"button\"\n className={triggerClasses}\n onClick={() => setExpanded((prev) => !prev)}\n aria-expanded={expanded}\n >\n {headerContent}\n </button>\n ) : (\n <div className=\"flex items-start gap-3\">{headerContent}</div>\n )}\n {children && (\n <div className=\"mt-3 text-sm text-slate-500 dark:text-slate-300\">\n {children}\n </div>\n )}\n </div>\n );\n};\n\nCollapsibleHelpText.displayName = \"CollapsibleHelpText\";\n\nexport default CollapsibleHelpText;\n","import { useState, useEffect } from \"react\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\n\nexport interface UserAvatarUser {\n name?: string;\n username?: string;\n email?: string;\n avatarUrl?: string;\n}\n\nexport interface UserAvatarProps {\n user?: UserAvatarUser | null;\n size?: number;\n className?: string;\n variant?: \"circle\" | \"rounded\" | \"square\";\n}\n\nexport const UserAvatar = ({\n user,\n size = 32,\n className = \"\",\n variant = \"circle\",\n}: UserAvatarProps) => {\n const renderIcon = useIconRenderer();\n const [hasError, setHasError] = useState(false);\n const [imgSrc, setImgSrc] = useState<string | null>(null);\n\n useEffect(() => {\n setHasError(false);\n if (user?.avatarUrl) {\n setImgSrc(user.avatarUrl);\n } else {\n setImgSrc(null);\n }\n }, [user?.avatarUrl, size]);\n\n const roundedClass =\n variant === \"circle\"\n ? \"rounded-full\"\n : variant === \"rounded\"\n ? \"rounded-md\"\n : \"rounded-none\";\n const baseClasses = `flex items-center justify-center font-bold text-slate-600 overflow-hidden ${roundedClass} ${className}`;\n\n const renderFallback = () => {\n const identifier = user?.name || user?.username || user?.email;\n if (identifier) {\n return (\n <div\n className={`w-full h-full bg-slate-200 flex items-center justify-center text-xs dark:bg-slate-700 dark:text-slate-300 ${roundedClass}`}\n >\n {identifier[0].toUpperCase()}\n </div>\n );\n }\n return (\n <div\n className={`w-full h-full bg-slate-200 flex items-center justify-center text-xs dark:bg-slate-700 dark:text-slate-300 ${roundedClass}`}\n >\n {renderIcon(\"User\", \"xs\")}\n </div>\n );\n };\n\n if (!user || !user.avatarUrl) {\n return (\n <div className={baseClasses} style={{ width: size, height: size }}>\n {renderFallback()}\n </div>\n );\n }\n\n return (\n <div\n className={`${baseClasses} bg-transparent`}\n style={{ width: size, height: size }}\n >\n {!hasError && imgSrc ? (\n <img\n src={imgSrc}\n alt={user?.name || user?.username || \"User Avatar\"}\n className={`h-full w-full object-cover ${roundedClass}`}\n onError={() => setHasError(true)}\n />\n ) : (\n renderFallback()\n )}\n </div>\n );\n};\n\nUserAvatar.displayName = \"UserAvatar\";\n\nexport default UserAvatar;\n","import React, { useMemo } from \"react\";\nimport classNames from \"classnames\";\nimport Loader, { type LoaderProps } from \"./Loader\";\nimport { useAccordion, type UseAccordionOptions } from \"../hooks/useAccordion\";\nimport type { PanelTone } from \"./Panel\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\n\nexport type AccordionVariant =\n | \"default\"\n | \"bordered\"\n | \"minimal\"\n | \"tonal\"\n | \"ghost\";\nexport type AccordionSize = \"sm\" | \"md\" | \"lg\";\nexport type AccordionIndicator = \"chevron\" | \"plus-minus\" | \"caret\" | \"none\";\nexport type AccordionChevronPlacement = \"left\" | \"right\";\n\nexport interface AccordionItem {\n id: string;\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n description?: React.ReactNode;\n icon?: string | React.ReactElement;\n badge?: React.ReactNode;\n actions?: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n loading?: boolean;\n}\n\nexport interface AccordionProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\">,\n UseAccordionOptions {\n items: AccordionItem[];\n variant?: AccordionVariant;\n tone?: PanelTone;\n size?: AccordionSize;\n indicator?: AccordionIndicator;\n chevronPlacement?: AccordionChevronPlacement;\n divider?: boolean;\n animated?: boolean;\n transitionMs?: number;\n onItemToggle?: (id: string, isOpen: boolean) => void;\n iconClassName?: string;\n itemClassName?: string;\n headerClassName?: string;\n contentClassName?: string;\n ariaLabel?: string;\n loading?: boolean;\n loaderTitle?: React.ReactNode;\n loaderMessage?: React.ReactNode;\n loaderType?: LoaderProps[\"variant\"];\n loaderProgress?: number;\n loaderColor?: LoaderProps[\"color\"];\n}\n\nconst sizeTokens: Record<\n AccordionSize,\n {\n header: string;\n title: string;\n subtitle: string;\n description: string;\n content: string;\n badge: string;\n iconSize: number;\n }\n> = {\n sm: {\n header: \"px-4 py-3 gap-3\",\n title: \"text-sm font-semibold\",\n subtitle: \"text-xs font-medium text-neutral-500 dark:text-neutral-400\",\n description: \"text-xs text-neutral-500 dark:text-neutral-400\",\n content: \"px-4 pb-4\",\n badge: \"text-xs\",\n iconSize: 16,\n },\n md: {\n header: \"px-5 py-4 gap-3\",\n title: \"text-base font-semibold\",\n subtitle: \"text-sm font-medium text-neutral-500 dark:text-neutral-400\",\n description: \"text-sm text-neutral-500 dark:text-neutral-400\",\n content: \"px-5 pb-5\",\n badge: \"text-xs\",\n iconSize: 20,\n },\n lg: {\n header: \"px-6 py-5 gap-4\",\n title: \"text-lg font-semibold\",\n subtitle: \"text-base font-medium text-neutral-500 dark:text-neutral-400\",\n description: \"text-sm text-neutral-500 dark:text-neutral-400\",\n content: \"px-6 pb-6\",\n badge: \"text-sm\",\n iconSize: 24,\n },\n};\n\nconst variantClasses: Record<\n AccordionVariant,\n {\n root: string;\n item: string;\n header: string;\n content: string;\n }\n> = {\n default: {\n root: \"rounded-xl border border-neutral-200 bg-white shadow-sm dark:border-neutral-700 dark:bg-neutral-900/90\",\n item: \"border-b border-neutral-200 last:border-0 dark:border-neutral-800\",\n header:\n \"hover:bg-neutral-50/80 dark:hover:bg-neutral-800/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500\",\n content: \"bg-neutral-50/60 dark:bg-neutral-900/40\",\n },\n bordered: {\n root: \"rounded-2xl border border-neutral-300 bg-white shadow-sm dark:border-neutral-700 dark:bg-neutral-900\",\n item: \"border-t first:border-t-0 border-neutral-300 dark:border-neutral-700\",\n header:\n \"hover:bg-neutral-100/60 dark:hover:bg-neutral-800/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500\",\n content: \"bg-white dark:bg-neutral-900/60\",\n },\n minimal: {\n root: \"rounded-xl border border-transparent bg-transparent\",\n item: \"border-b border-neutral-200 last:border-0 dark:border-neutral-800\",\n header:\n \"hover:bg-neutral-100/70 dark:hover:bg-neutral-800/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500\",\n content: \"bg-transparent\",\n },\n tonal: {\n root: \"rounded-2xl border border-transparent bg-neutral-50/80 dark:bg-neutral-900/80\",\n item: \"border-b border-neutral-200 last:border-0 dark:border-neutral-800/80\",\n header:\n \"hover:bg-white/60 dark:hover:bg-neutral-800/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500\",\n content: \"bg-white/60 dark:bg-neutral-900/60\",\n },\n ghost: {\n root: \"rounded-xl border border-transparent bg-transparent\",\n item: \"border-b border-transparent\",\n header:\n \"hover:bg-neutral-100/50 dark:hover:bg-neutral-800/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral-400 dark:focus-visible:ring-neutral-500\",\n content: \"bg-transparent\",\n },\n};\n\nconst toneClasses: Partial<\n Record<\n PanelTone,\n { header: string; indicator: string; icon: string; badge: string }\n >\n> = {\n neutral: {\n header:\n \"bg-neutral-50/50 text-neutral-900 shadow-sm hover:bg-neutral-100/80 dark:bg-neutral-900/40 dark:text-neutral-100 dark:hover:bg-neutral-800/60\",\n indicator: \"text-neutral-400 dark:text-neutral-500\",\n icon: \"text-neutral-500 dark:text-neutral-400\",\n badge:\n \"bg-neutral-200 text-neutral-700 dark:bg-neutral-700 dark:text-neutral-300\",\n },\n};\n\nconst indicatorIconMap: Record<AccordionIndicator, string | undefined> = {\n chevron: \"ArrowDown\",\n caret: \"ArrowDown\",\n \"plus-minus\": \"Plus\",\n none: undefined,\n};\n\nconst indicatorRotationClass: Record<AccordionIndicator, string> = {\n chevron: \"transition-transform duration-200\",\n caret: \"transition-transform duration-200\",\n \"plus-minus\": \"transition-transform duration-200\",\n none: \"\",\n};\n\nconst contentTransitionClass = \"transition-all duration-200 ease-out\";\n\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n variant = \"default\",\n tone = \"neutral\",\n size = \"md\",\n indicator = \"chevron\",\n chevronPlacement = \"right\",\n divider = false,\n animated = true,\n transitionMs = 220,\n onItemToggle,\n iconClassName,\n itemClassName,\n headerClassName,\n contentClassName,\n ariaLabel,\n loading = false,\n loaderTitle,\n loaderMessage,\n loaderType = \"spinner\",\n loaderProgress,\n loaderColor,\n defaultOpenIds,\n openIds,\n onChange,\n multiple,\n className,\n style,\n ...rest\n}) => {\n const renderIcon = useIconRenderer();\n const accordion = useAccordion({\n defaultOpenIds,\n openIds,\n onChange,\n multiple,\n });\n\n const sizeToken = sizeTokens[size];\n const variantToken = variantClasses[variant];\n const toneToken = (toneClasses[tone] ?? toneClasses.neutral)!;\n\n const indicatorIcon = indicatorIconMap[indicator];\n const showIndicator = indicator !== \"none\";\n\n const computedItems = useMemo(() => items ?? [], [items]);\n\n return (\n <div\n className={classNames(\n \"relative flex w-full flex-col overflow-hidden\",\n variantToken.root,\n divider && \"divide-y divide-neutral-200 dark:divide-neutral-800\",\n className,\n )}\n style={style}\n aria-busy={loading}\n role=\"presentation\"\n {...rest}\n >\n <div role=\"group\" aria-label={ariaLabel} className=\"flex flex-col\">\n {computedItems.map((item) => {\n const isOpen = accordion.isOpen(item.id);\n const isDisabled = Boolean(item.disabled);\n const isLoading = Boolean(item.loading);\n\n const indicatorRotation =\n indicator === \"plus-minus\"\n ? isOpen\n ? \"rotate-45\"\n : \"\"\n : isOpen\n ? \"-rotate-180\"\n : \"\";\n\n const isIndicator = showIndicator && indicatorIcon;\n const indicatorSizeConfig = size === \"sm\"\n ? { width: 32, height: 32, icon: 16 }\n : size === \"lg\"\n ? { width: 36, height: 36, icon: 20 }\n : { width: 32, height: 32, icon: 16 };\n\n const indicatorElement = isIndicator\n ? (\n <span\n className={classNames(\n `mt-1 flex h-${indicatorSizeConfig.height} w-${indicatorSizeConfig.width} flex-shrink-0 items-center justify-center rounded-full border border-slate-200 dark:border-slate-700`,\n \"pointer-events-none\",\n toneToken.indicator,\n indicatorRotationClass[indicator],\n indicatorRotation,\n )}\n aria-hidden=\"true\"\n tabIndex={-1}\n >\n {renderIcon(indicatorIcon, \"xs\")}\n </span>\n )\n : null;\n\n return (\n <div\n key={item.id}\n data-item-id={item.id}\n className={classNames(\n \"relative flex flex-col\",\n variantToken.item,\n isDisabled && \"opacity-60\",\n itemClassName,\n )}\n >\n <div\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n className={classNames(\n \"flex w-full items-start gap-4 text-left transition-colors duration-150\",\n sizeToken.header,\n variantToken.header,\n toneToken.header,\n headerClassName,\n isDisabled && \"cursor-not-allowed\",\n )}\n aria-expanded={isOpen}\n aria-controls={`${item.id}-content`}\n id={`${item.id}-trigger`}\n onClick={() => {\n accordion.toggle(item.id);\n onItemToggle?.(item.id, !isOpen);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n accordion.toggle(item.id);\n onItemToggle?.(item.id, !isOpen);\n }\n }}\n >\n {chevronPlacement === \"left\" && indicatorElement ? (\n <div className=\"mt-1 flex items-center\">\n {indicatorElement}\n </div>\n ) : null}\n <div className=\"flex flex-1 items-start gap-3\">\n {item.icon ? (\n <div\n className={classNames(\n \"mt-1 flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-lg bg-neutral-100 dark:bg-neutral-800\",\n toneToken.icon,\n iconClassName,\n )}\n >\n {renderIcon(item.icon, \"md\")}\n </div>\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className={sizeToken.title}>{item.title}</span>\n {item.badge ? (\n <span\n className={classNames(\n \"inline-flex items-center rounded-full px-2 py-0.5 font-medium\",\n sizeToken.badge,\n toneToken.badge,\n )}\n >\n {item.badge}\n </span>\n ) : null}\n </div>\n {item.subtitle ? (\n <div className={classNames(sizeToken.subtitle)}>\n {item.subtitle}\n </div>\n ) : null}\n {item.description ? (\n <div className={classNames(sizeToken.description)}>\n {item.description}\n </div>\n ) : null}\n </div>\n </div>\n {item.actions ? (\n <div className=\"flex shrink-0 items-center gap-2 text-neutral-500 dark:text-neutral-300\">\n {item.actions}\n </div>\n ) : null}\n {chevronPlacement === \"right\" && indicatorElement ? (\n <div className=\"mt-1 flex items-center\">\n {indicatorElement}\n </div>\n ) : null}\n </div>\n <div\n id={`${item.id}-content`}\n role=\"region\"\n aria-labelledby={`${item.id}-trigger`}\n className={classNames(\n \"overflow-hidden\",\n animated && contentTransitionClass,\n contentClassName,\n animated && `duration-[${transitionMs}ms]`,\n )}\n style={animated ? { maxHeight: undefined } : undefined}\n data-open={isOpen}\n >\n <div\n className={classNames(\n \"grid transition-all duration-200 ease-out\",\n isOpen\n ? \"grid-rows-[1fr] opacity-100\"\n : \"grid-rows-[0fr] opacity-0\",\n )}\n >\n <div className={classNames(\"min-h-0\", variantToken.content)}>\n <div\n className={classNames(\n \"overflow-hidden\",\n sizeToken.content,\n \"text-sm leading-6 text-neutral-600 dark:text-neutral-300\",\n )}\n >\n {item.content}\n </div>\n </div>\n </div>\n </div>\n {isLoading && (\n <Loader\n overlay\n title=\"Loading\"\n className=\"rounded-none\"\n size=\"md\"\n color=\"blue\"\n />\n )}\n </div>\n );\n })}\n </div>\n {loading && (\n <Loader\n overlay\n title={loaderTitle}\n label={loaderMessage}\n variant={loaderType}\n progress={loaderProgress}\n color={loaderColor}\n />\n )}\n </div>\n );\n};\n\nAccordion.displayName = \"Accordion\";\n\nexport default Accordion;\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface UseAccordionOptions {\n defaultOpenIds?: string[];\n openIds?: string[];\n multiple?: boolean;\n onChange?: (openIds: string[]) => void;\n}\n\nexport interface UseAccordionResult {\n openIds: string[];\n isOpen: (id: string) => boolean;\n toggle: (id: string) => void;\n open: (id: string) => void;\n close: (id: string) => void;\n setOpenIds: (ids: string[]) => void;\n}\n\nexport function useAccordion({\n defaultOpenIds,\n openIds: controlledOpenIds,\n multiple = false,\n onChange,\n}: UseAccordionOptions = {}): UseAccordionResult {\n const [internalOpenIds, setInternalOpenIds] = useState<string[]>(\n defaultOpenIds ?? [],\n );\n\n const resolvedOpenIds = controlledOpenIds ?? internalOpenIds;\n\n const emitChange = useCallback(\n (next: string[]) => {\n if (!controlledOpenIds) {\n setInternalOpenIds(next);\n }\n onChange?.(next);\n },\n [controlledOpenIds, onChange],\n );\n\n const toggle = useCallback(\n (id: string) => {\n const isCurrentlyOpen = resolvedOpenIds.includes(id);\n\n if (isCurrentlyOpen) {\n emitChange(resolvedOpenIds.filter((item) => item !== id));\n return;\n }\n\n if (multiple) {\n emitChange([...resolvedOpenIds, id]);\n } else {\n emitChange([id]);\n }\n },\n [emitChange, multiple, resolvedOpenIds],\n );\n\n const open = useCallback(\n (id: string) => {\n if (resolvedOpenIds.includes(id)) {\n return;\n }\n if (multiple) {\n emitChange([...resolvedOpenIds, id]);\n } else {\n emitChange([id]);\n }\n },\n [emitChange, multiple, resolvedOpenIds],\n );\n\n const close = useCallback(\n (id: string) => {\n if (!resolvedOpenIds.includes(id)) {\n return;\n }\n emitChange(resolvedOpenIds.filter((item) => item !== id));\n },\n [emitChange, resolvedOpenIds],\n );\n\n const api = useMemo(\n () => ({\n openIds: resolvedOpenIds,\n isOpen: (id: string) => resolvedOpenIds.includes(id),\n toggle,\n open,\n close,\n setOpenIds: emitChange,\n }),\n [resolvedOpenIds, toggle, open, close, emitChange],\n );\n\n return api;\n}\n\nexport default useAccordion;\n","import React, { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { useIconRenderer } from \"../contexts/IconContext\";\nimport { getTabsColorTokens, type TrueColor } from \"../theme/Theme\";\nimport IconButton from \"./IconButton\";\nimport { iconAccentActive } from \"../theme/ButtonTypes\";\nimport Badge from \"./Badge\";\n\nexport type TabsVariant =\n | \"underline\"\n | \"soft\"\n | \"pill\"\n | \"segmented\"\n | \"minimal\";\nexport type TabsSize = \"sm\" | \"md\" | \"lg\";\nexport type TabsOrientation = \"horizontal\" | \"vertical\";\nexport type TabsJustify = \"start\" | \"center\" | \"end\" | \"between\";\n\nexport interface TabItemAction {\n id?: string;\n label?: ReactNode;\n /** Render a fully custom React node in the tab bar. When set, `icon` and `onClick` are ignored. */\n node?: ReactNode;\n icon?: string | React.ReactElement;\n onClick?: () => void;\n color?: TrueColor;\n active?: boolean;\n}\n\nexport interface TabItem {\n id: string;\n label: ReactNode;\n icon?: string | React.ReactElement;\n description?: ReactNode;\n badge?: string | number;\n disabled?: boolean;\n panel?: ReactNode;\n badgeColor?: TrueColor;\n actions?: TabItemAction[];\n}\n\nexport interface TabsProps {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onChange?: (id: string, item: TabItem) => void;\n variant?: TabsVariant;\n size?: TabsSize;\n color?: TrueColor;\n orientation?: TabsOrientation;\n justify?: TabsJustify;\n fullWidth?: boolean;\n className?: string;\n listClassName?: string;\n allowReselect?: boolean;\n panelIdPrefix?: string;\n showDividers?: boolean;\n hideUnderlineContainer?: boolean;\n /** Override the variant's container class (e.g. to customise the underline border color). Takes precedence over hideUnderlineContainer. */\n containerClassName?: string;\n panelClassName?: string;\n /**\n * When true, renders a gradient fade at the top of each panel's scroll area so\n * content doesn't hard-clip against the tab bar when scrolled. Default: true.\n * Pass a Tailwind `from-*` colour to match your panel background (default: white / neutral-900 dark).\n */\n scrollFade?: boolean;\n scrollFadeFrom?: string;\n}\n\nconst joinClasses = (...parts: Array<string | false | null | undefined>) =>\n parts.filter(Boolean).join(\" \");\n\nconst baseTabClasses =\n \"group relative inline-flex items-center transition-all duration-150 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-60\";\n\nconst focusOffset =\n \"focus-visible:ring-2 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-0\";\n\nconst focusRing = (color: TrueColor) => getTabsColorTokens(color).focusRing;\n\nconst sizeStyles: Record<\n TabsSize,\n { padding: string; text: string; gap: string; icon: string }\n> = {\n sm: {\n padding: \"px-3 py-1.5\",\n text: \"text-sm font-medium\",\n gap: \"gap-1.5\",\n icon: \"h-4 w-4\",\n },\n md: {\n padding: \"px-4 py-2\",\n text: \"text-md\",\n gap: \"gap-2\",\n icon: \"h-5 w-5\",\n },\n lg: {\n padding: \"px-5 py-2.5\",\n text: \"text-base\",\n gap: \"gap-2.5\",\n icon: \"h-5 w-5\",\n },\n};\n\ntype VariantConfig = {\n container?: string;\n list?: string;\n base: string;\n active: string;\n inactive: string;\n disabled: string;\n badge?: string;\n badgeActive?: string;\n badgeInactive?: string;\n};\n\nconst neutralTextInactive = \"text-neutral-600 dark:text-neutral-300\";\n\nconst buildVariantConfig = (\n variant: TabsVariant,\n color: TrueColor,\n orientation: TabsOrientation,\n hideUnderlineContainer?: boolean,\n): VariantConfig => {\n const tokens = getTabsColorTokens(color);\n const hoverAccentText = tokens.hoverText;\n const activeAccentText = tokens.activeText;\n const activeOnAccent = tokens.onAccentText;\n const accentBgStrong = tokens.accentBg;\n const subtleBg = tokens.subtleBg;\n const subtleHoverBg = tokens.subtleHoverBg;\n const badgeSubtle = tokens.badgeSubtle;\n const badgeStrong = tokens.badgeStrong;\n const badgeOnAccent = tokens.badgeOnAccent;\n const underlineActive = tokens.underlineActive;\n const segmentedContainer = tokens.segmentedContainer;\n\n switch (variant) {\n case \"soft\":\n return {\n container: joinClasses(\n \"rounded-full\",\n subtleBg,\n orientation === \"vertical\" ? \"p-1.5\" : \"p-1\",\n ),\n list: \"gap-1\",\n base: joinClasses(\n \"rounded-full font-medium\",\n neutralTextInactive,\n hoverAccentText,\n \"hover:bg-white/70 dark:hover:bg-white/10\",\n ),\n active: joinClasses(\"shadow-sm\", accentBgStrong, activeOnAccent),\n inactive: \"\",\n disabled: \"text-slate-300 dark:text-slate-600\",\n badge: badgeSubtle,\n badgeActive: badgeOnAccent,\n badgeInactive: badgeSubtle,\n };\n case \"pill\":\n return {\n container: \"gap-2\",\n list: \"gap-2\",\n base: joinClasses(\n \"rounded-full border border-transparent font-medium\",\n neutralTextInactive,\n hoverAccentText,\n \"hover:border-current\",\n ),\n active: joinClasses(\n accentBgStrong,\n activeOnAccent,\n \"shadow-sm border-transparent\",\n ),\n inactive: \"border-slate-200 dark:border-slate-700\",\n disabled: \"text-slate-300 dark:text-slate-600 border-transparent\",\n badge: badgeSubtle,\n badgeActive: badgeOnAccent,\n badgeInactive: badgeSubtle,\n };\n case \"segmented\":\n return {\n container: joinClasses(\"rounded-lg border\", segmentedContainer),\n list: classNames(\n \"gap-0 overflow-hidden\",\n orientation === \"vertical\" ? \"flex-col\" : \"flex-row\",\n ),\n base: joinClasses(\n \"font-medium border border-transparent first:rounded-l-lg last:rounded-r-lg first:rounded-t-lg last:rounded-b-lg\",\n neutralTextInactive,\n hoverAccentText,\n orientation === \"horizontal\"\n ? \"-ml-px first:ml-0\"\n : \"-mt-px first:mt-0\",\n ),\n active: joinClasses(\n accentBgStrong,\n activeOnAccent,\n \"shadow-sm border-transparent dark:shadow-none\",\n ),\n inactive: joinClasses(\"bg-transparent\", subtleHoverBg),\n disabled: \"text-slate-300 dark:text-slate-600 border-transparent\",\n badge: badgeSubtle,\n badgeActive: badgeOnAccent,\n badgeInactive: badgeSubtle,\n };\n case \"minimal\":\n return {\n container: \"gap-2\",\n list: \"gap-0\",\n base: joinClasses(\n \"font-medium rounded-lg\",\n neutralTextInactive,\n hoverAccentText,\n \"hover:bg-neutral-900/5 dark:hover:bg-neutral-100/10\",\n \"px-2 py-1\",\n ),\n active: joinClasses(activeAccentText, \"font-medium \"),\n inactive: \"text-neutral-900/20 dark:text-neutral-500\",\n disabled: \"text-slate-300 dark:text-slate-600\",\n badge: badgeSubtle,\n badgeActive: badgeStrong,\n badgeInactive: badgeSubtle,\n };\n case \"underline\":\n default:\n return {\n container: hideUnderlineContainer ? undefined : \"\",\n list: classNames(\"gap-3\", orientation === \"vertical\" && \"gap-3\"),\n base: joinClasses(\n \"rounded-none font-medium\",\n \"pb-3 pt-2\",\n \"border-b-2 border-transparent\",\n \"after:absolute after:inset-x-1.5 after:bottom-0 after:h-[3px] after:rounded-full after:opacity-0 after:transition-all after:duration-200\",\n tokens.underlineActive,\n \"group-hover:after:opacity-100\",\n neutralTextInactive,\n hoverAccentText,\n ),\n active: joinClasses(\n activeAccentText,\n underlineActive,\n \"after:opacity-100\",\n ),\n inactive: \"\",\n disabled: \"text-slate-300 dark:text-slate-600 border-transparent\",\n badge: badgeSubtle,\n badgeActive: badgeStrong,\n badgeInactive: badgeSubtle,\n };\n }\n};\n\nconst Tabs: React.FC<TabsProps> = ({\n items,\n value,\n defaultValue,\n onChange,\n variant = \"underline\",\n size = \"md\",\n color = \"blue\",\n orientation = \"horizontal\",\n justify = \"start\",\n fullWidth = false,\n className,\n listClassName,\n allowReselect = false,\n panelIdPrefix = \"tab-panel\",\n showDividers = false,\n hideUnderlineContainer = false,\n containerClassName,\n panelClassName,\n scrollFade = true,\n scrollFadeFrom = \"from-white dark:from-neutral-900\",\n}) => {\n const renderIcon = useIconRenderer();\n const [internalValue, setInternalValue] = useState<string | undefined>(\n defaultValue ?? items[0]?.id,\n );\n const activeId = value ?? internalValue;\n\n useEffect(() => {\n if (value !== undefined) {\n return;\n }\n if (!items.some((item) => item.id === internalValue)) {\n setInternalValue(items[0]?.id);\n }\n }, [items, value, internalValue]);\n\n const config = useMemo(\n () =>\n buildVariantConfig(variant, color, orientation, hideUnderlineContainer),\n [variant, color, orientation, hideUnderlineContainer],\n );\n\n const sizeConfig = sizeStyles[size] ?? sizeStyles.md;\n const iconClasses = classNames(\"flex-shrink-0\", sizeConfig.icon);\n\n const shouldShowDividers =\n showDividers && (variant === \"underline\" || variant === \"minimal\");\n const baseList = classNames(\n \"relative flex\",\n orientation === \"vertical\" ? \"flex-col\" : \"items-center\",\n justify === \"center\" && orientation === \"horizontal\" && \"justify-center\",\n justify === \"end\" && orientation === \"horizontal\" && \"justify-end\",\n justify === \"between\" &&\n orientation === \"horizontal\" &&\n \"justify-between w-full\",\n fullWidth && \"w-full\",\n config.list,\n shouldShowDividers && \"gap-0\",\n listClassName,\n );\n\n const resolvedContainer =\n containerClassName !== undefined ? containerClassName : config.container;\n\n const rootClass = classNames(\n \"tabs\",\n \"flex\",\n orientation === \"vertical\" ? \"flex-row h-full\" : \"flex-col h-full\",\n \"overflow-hidden min-h-0\",\n resolvedContainer,\n className,\n );\n\n // const badgeBase = config.badge ?? \"bg-slate-100 text-slate-600\";\n // const badgeActive = config.badgeActive ?? badgeBase;\n // const badgeInactive = config.badgeInactive ?? badgeBase;\n\n const renderTabIcon = (icon: string | React.ReactElement | undefined) => {\n if (!icon) {\n return null;\n }\n\n if (typeof icon === \"string\") {\n return renderIcon(icon, undefined, iconClasses);\n }\n\n if (React.isValidElement<{ className?: string }>(icon)) {\n return React.cloneElement(icon, {\n className: classNames(iconClasses, icon.props.className),\n });\n }\n\n return <span className={iconClasses}>{icon}</span>;\n };\n\n return (\n <div className={rootClass}>\n <div\n role=\"tablist\"\n aria-orientation={orientation}\n className={classNames(baseList, \"flex-shrink-0 z-10\")}\n >\n {items.map((item, index) => {\n const isActive = item.id === activeId;\n const isDisabled = item.disabled;\n const controlsId = `${panelIdPrefix}-${item.id}`;\n const baseClassesForItem = classNames(\n baseTabClasses,\n sizeConfig.padding,\n sizeConfig.text,\n sizeConfig.gap,\n focusRing(color),\n focusOffset,\n config.base,\n isActive ? config.active : config.inactive,\n isDisabled && config.disabled,\n fullWidth && \"flex-1 justify-center\",\n );\n const showDividerAfter =\n shouldShowDividers && index < items.length - 1;\n\n return (\n <React.Fragment key={item.id}>\n <button\n type=\"button\"\n role=\"tab\"\n id={`tab-${item.id}`}\n aria-selected={isActive}\n aria-controls={controlsId}\n disabled={isDisabled}\n className={baseClassesForItem}\n onClick={() => {\n if (isDisabled) {\n return;\n }\n if (!allowReselect && item.id === activeId) {\n return;\n }\n if (value === undefined) {\n setInternalValue(item.id);\n }\n onChange?.(item.id, item);\n }}\n tabIndex={isActive ? 0 : -1}\n >\n {renderTabIcon(item.icon)}\n <span className=\"flex min-w-0 flex-col text-left\">\n <span className=\"truncate\">{item.label}</span>\n {item.description ? (\n <span className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">\n {item.description}\n </span>\n ) : null}\n </span>\n {item.badge ? (\n <Badge count={item.badge} tone={item.badgeColor} />\n ) : null}\n </button>\n {showDividerAfter ? (\n <span\n aria-hidden=\"true\"\n className={classNames(\n \"pointer-events-none\",\n orientation === \"vertical\"\n ? \"mx-0 my-2 h-[2px] rounded-full w-full bg-slate-200 dark:bg-neutral-100/2\"\n : \"mx-2 h-5 rounded-full w-[2px] bg-slate-300 dark:bg-neutral-400\",\n )}\n />\n ) : null}\n </React.Fragment>\n );\n })}\n <div className=\"flex-grow\" />\n <div\n id=\"tab-item-actions-end\"\n className=\"flex items-center gap-1 pr-2 text-neutral-400 dark:text-neutral-500\"\n >\n {items\n .find((item) => item.id === activeId)\n ?.actions?.map((action, idx) =>\n action.node ? (\n <React.Fragment key={action.id ?? `tab-action-${idx}`}>\n {action.node}\n </React.Fragment>\n ) : action.icon ? (\n <IconButton\n key={action.id ?? `tab-action-${idx}`}\n accent={true}\n color={action.color ?? color}\n accentColor={action.color ?? color}\n icon={action.icon}\n size={size}\n aria-pressed={action.active || undefined}\n aria-label={\n typeof action.label === \"string\"\n ? action.label\n : `Action ${idx + 1}`\n }\n onClick={action.onClick ?? (() => undefined)}\n className={classNames(\n `${action.active && iconAccentActive[action.color ?? color]}`,\n )}\n />\n ) : null,\n )}\n </div>\n </div>\n {items.map((item) => {\n if (item.panel === undefined) {\n return null;\n }\n const controlsId = `${panelIdPrefix}-${item.id}`;\n const isActive = item.id === activeId;\n return (\n <div\n key={controlsId}\n role=\"tabpanel\"\n id={controlsId}\n aria-labelledby={`tab-${item.id}`}\n hidden={!isActive}\n aria-hidden={!isActive}\n className={classNames(\n \"focus:outline-none flex-1 min-h-0\",\n scrollFade\n ? \"relative overflow-hidden\"\n : \"overflow-auto scrollbar-thin\",\n isActive ? panelClassName : \"hidden\",\n )}\n >\n {scrollFade ? (\n <>\n <div\n aria-hidden\n className={classNames(\n \"pointer-events-none absolute inset-x-0 top-0 h-8 z-10 bg-gradient-to-b to-transparent\",\n scrollFadeFrom,\n )}\n />\n <div className=\"overflow-auto h-full scrollbar-thin\">\n {item.panel}\n </div>\n </>\n ) : (\n item.panel\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nTabs.displayName = \"Tabs\";\n\nexport default Tabs;\n","import classNames from \"classnames\";\nimport React, {\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Loader,\n Tabs,\n type TabsProps,\n IconButton,\n Button,\n type ButtonColor,\n type ButtonProps,\n type ButtonVariant,\n} from \".\";\nimport { type Size as ModalSize } from \"../theme\";\nimport { type IconName } from \"../icons/registry\";\nimport { renderIcon } from \"../utils/renderIcon\";\n\ntype ModalActionsAlign = \"start\" | \"center\" | \"end\" | \"between\";\n\nconst sizePresets: Record<\n ModalSize,\n {\n width?: number;\n className: string;\n }\n> = {\n xs: { width: 320, className: \"sm:max-w-[320px]\" },\n sm: { width: 400, className: \"sm:max-w-[400px]\" },\n md: { width: 600, className: \"sm:max-w-[600px]\" },\n lg: { width: 800, className: \"sm:max-w-[800px]\" },\n xl: { width: 1000, className: \"sm:max-w-[1000px]\" },\n xxl: { width: 1120, className: \"sm:max-w-[1120px]\" },\n \"2xl\": { width: 1120, className: \"sm:max-w-[1120px]\" },\n xxxl: { width: 1280, className: \"sm:max-w-[1280px]\" },\n \"3xl\": { width: 1280, className: \"sm:max-w-[1280px]\" },\n full: { className: \"sm:max-w-none sm:w-full\" },\n};\n\nconst toCssDimension = (value?: number | string): string | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === \"number\") {\n return `${value}px`;\n }\n return value;\n};\n\nconst isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\ninterface ModalActionsProps {\n children: ReactNode;\n align?: ModalActionsAlign;\n className?: string;\n}\n\nconst alignmentClassMap: Record<ModalActionsAlign, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\n\nconst ModalActions: React.FC<ModalActionsProps> = ({\n children,\n align = \"end\",\n className,\n}) => {\n const alignmentClass = alignmentClassMap[align] ?? alignmentClassMap.end;\n return (\n <div\n className={classNames(\n \"flex w-full flex-wrap items-center gap-2\",\n alignmentClass,\n className,\n )}\n >\n {children}\n </div>\n );\n};\n\nexport interface ModalProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\" | \"children\"> {\n isOpen: boolean;\n onClose: () => void;\n title: ReactNode;\n description?: ReactNode;\n icon?: IconName | React.ReactElement;\n children: ReactNode;\n bodyHeader?: ReactNode;\n bodyClassName?: string;\n footer?: ReactNode;\n actions?: ReactNode;\n size?: ModalSize;\n maxWidth?: number | string;\n minWidth?: number | string;\n minHeight?: number | string;\n backgroundClassName?: string;\n background_color?: string;\n darkOverlay?: boolean;\n dark_overlay?: boolean;\n closeOnBackdropClick?: boolean;\n closeOnEsc?: boolean;\n preventScroll?: boolean;\n overlayClassName?: string;\n showFooterDivider?: boolean;\n headerActions?: ButtonProps[];\n header_actions?: ButtonProps[];\n headerTabs?: TabsProps;\n header_tabs?: TabsProps;\n loading?: boolean;\n loadingTitle?: ReactNode;\n loadingLabel?: ReactNode;\n hideCloseButton?: boolean;\n /** When provided, a back arrow button is shown on the left of the header. */\n onBack?: () => void;\n /** Tooltip for the back button. Defaults to \"Go back\". */\n backTooltip?: string;\n initialFocusRef?: React.RefObject<HTMLElement>;\n ariaLabel?: string;\n role?: \"dialog\" | \"alertdialog\";\n}\n\nconst Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n description,\n icon,\n children,\n bodyHeader,\n bodyClassName,\n footer,\n actions,\n size = \"md\",\n maxWidth,\n minWidth,\n minHeight,\n backgroundClassName,\n background_color,\n darkOverlay,\n dark_overlay,\n closeOnBackdropClick = true,\n closeOnEsc = true,\n preventScroll = true,\n className,\n overlayClassName,\n style,\n headerActions,\n header_actions,\n headerTabs,\n loading,\n loadingTitle,\n loadingLabel,\n hideCloseButton = false,\n onBack,\n backTooltip = \"Go back\",\n initialFocusRef,\n ariaLabel,\n role = \"dialog\",\n showFooterDivider,\n onMouseDown,\n onClick,\n onKeyDown,\n ...rest\n}) => {\n const hasDom = isBrowser;\n const contentRef = useRef<HTMLDivElement>(null);\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n\n const headingId = useId();\n const bodyId = useId();\n\n const isDarkOverlay = darkOverlay ?? dark_overlay ?? false;\n const footerContent = footer ?? actions;\n const effectiveHeaderActions = headerActions ?? header_actions ?? [];\n\n const tabsConfig = useMemo(() => {\n if (headerTabs) {\n return headerTabs;\n }\n }, [headerTabs]);\n\n const presetForSize =\n typeof size === \"string\" ? sizePresets[size] : undefined;\n const fallbackPreset = sizePresets.md;\n const resolvedPreset = presetForSize ?? fallbackPreset;\n const isFullWidth = size === \"full\";\n const explicitSize =\n typeof size === \"number\" ||\n (typeof size === \"string\" && presetForSize === undefined && !isFullWidth);\n const sizeClass = !explicitSize ? resolvedPreset.className : undefined;\n const presetWidth =\n !explicitSize && !isFullWidth ? resolvedPreset.width : undefined;\n const presetWidthValue = presetWidth\n ? toCssDimension(presetWidth)\n : undefined;\n const explicitWidthValue = explicitSize\n ? toCssDimension(size as number | string)\n : undefined;\n const resolvedMaxWidth =\n maxWidth !== undefined\n ? toCssDimension(maxWidth)\n : isFullWidth\n ? \"100%\"\n : (explicitWidthValue ?? presetWidthValue);\n const resolvedWidth = isFullWidth\n ? \"100%\"\n : explicitWidthValue\n ? `min(100%, ${explicitWidthValue})`\n : presetWidthValue\n ? `min(100%, ${presetWidthValue})`\n : undefined;\n\n const overlayClasses = classNames(\n \"fixed inset-0 z-[1600] flex min-h-full items-start justify-center overflow-y-auto px-4 py-6 sm:px-8 sm:py-12 sm:items-center\",\n isDarkOverlay ? \"bg-neutral-950/70\" : \"bg-neutral-900/40\",\n \"backdrop-blur-sm\",\n overlayClassName,\n );\n\n const contentClasses = classNames(\n \"relative flex w-full max-h-[90vh] sm:max-h-[85vh] flex-col overflow-hidden rounded-[28px] border border-neutral-200/70 bg-white shadow-2xl transition-all duration-200 ease-out dark:border-neutral-700/60 dark:bg-neutral-800\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-0\",\n sizeClass,\n backgroundClassName,\n background_color,\n className,\n );\n\n const showFooterDividerClass = showFooterDivider\n ? \"border-t border-neutral-200/70 dark:border-neutral-700/60\"\n : \"\";\n\n const contentStyle: React.CSSProperties = {\n ...(resolvedWidth ? { width: resolvedWidth } : undefined),\n ...(resolvedMaxWidth ? { maxWidth: resolvedMaxWidth } : undefined),\n ...(minWidth !== undefined\n ? { minWidth: toCssDimension(minWidth) }\n : undefined),\n ...(minHeight !== undefined\n ? { minHeight: toCssDimension(minHeight) }\n : undefined),\n ...style,\n };\n\n const ariaLabelValue =\n ariaLabel ?? (typeof title === \"string\" ? title : undefined);\n const ariaLabelledBy = ariaLabelValue ? undefined : headingId;\n const ariaDescribedBy = description || bodyHeader ? bodyId : undefined;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEsc && event.key === \"Escape\") {\n event.preventDefault();\n onClose();\n }\n },\n [closeOnEsc, onClose],\n );\n\n // Effect to handle initial focus\n useEffect(() => {\n if (!hasDom) {\n return;\n }\n\n if (isOpen) {\n previouslyFocusedRef.current =\n document.activeElement as HTMLElement | null;\n\n const focusTarget =\n initialFocusRef?.current ??\n (!hideCloseButton ? closeButtonRef.current : null) ??\n (contentRef.current as HTMLElement | null);\n\n // Use requestAnimationFrame to ensure the modal is rendered and refs are available\n const focusFrame = requestAnimationFrame(() => {\n focusTarget?.focus({ preventScroll: true });\n });\n\n return () => {\n cancelAnimationFrame(focusFrame);\n };\n }\n }, [hasDom, isOpen, hideCloseButton, initialFocusRef]); // Minimal dependencies to ensure focus only runs on open or relevant prop change that might affect focus target\n\n // Effect to handle event listeners and scroll locking\n useEffect(() => {\n if (!hasDom) {\n return;\n }\n\n if (isOpen) {\n if (closeOnEsc) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n\n if (preventScroll) {\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n document.body.style.overflow = originalOverflow;\n };\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [closeOnEsc, handleKeyDown, hasDom, isOpen, preventScroll]);\n\n useEffect(() => {\n if (!hasDom) {\n return;\n }\n\n if (!isOpen && previouslyFocusedRef.current) {\n const node = previouslyFocusedRef.current;\n previouslyFocusedRef.current = null;\n node.focus({ preventScroll: true });\n }\n }, [hasDom, isOpen]);\n\n const handleBackdropMouseDown = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!closeOnBackdropClick) {\n return;\n }\n if (event.target === event.currentTarget) {\n event.stopPropagation();\n onClose();\n }\n },\n [closeOnBackdropClick, onClose],\n );\n\n const handleContentMouseDown = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n onMouseDown?.(event);\n },\n [onMouseDown],\n );\n\n const handleContentClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n onClick?.(event);\n },\n [onClick],\n );\n\n const handleContentKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n },\n [onKeyDown],\n );\n\n if (!hasDom || !isOpen) {\n return null;\n }\n\n const content = (\n <div className={overlayClasses} onMouseDown={handleBackdropMouseDown}>\n <div\n ref={contentRef}\n className={contentClasses}\n style={contentStyle}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledBy}\n aria-label={ariaLabelValue}\n aria-describedby={ariaDescribedBy}\n aria-busy={loading ? \"true\" : undefined}\n tabIndex={-1}\n onMouseDown={handleContentMouseDown}\n onClick={handleContentClick}\n onKeyDown={handleContentKeyDown}\n {...rest}\n >\n <div className=\"flex shrink-0 items-start justify-between gap-4 border-b border-neutral-200/70 pl-4 pr-3 py-4 dark:border-neutral-700/60\">\n {onBack && (\n <div className=\"flex shrink-0 items-center self-center\">\n <IconButton\n icon=\"ArrowChevronLeft\"\n variant=\"ghost\"\n color=\"slate\"\n size=\"sm\"\n tooltip={backTooltip}\n tooltipPosition=\"bottom\"\n aria-label={backTooltip}\n onClick={onBack}\n />\n </div>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {icon && (\n <div className=\"flex shrink-0 items-center justify-center text-neutral-600 dark:text-neutral-200\">\n {renderIcon(icon, \"sm\")}\n </div>\n )}\n <div className=\"min-w-0\">\n <h2\n id={headingId}\n className=\"truncate text-xl font-medium tracking-tight text-neutral-900 dark:text-neutral-100\"\n >\n {title}\n </h2>\n </div>\n </div>\n {description && (\n <p className=\"text-sm text-neutral-600 dark:text-neutral-300\">\n {description}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {effectiveHeaderActions.map((action, index) => (\n <Button key={`modal-header-action-${index}`} {...action} />\n ))}\n {!hideCloseButton && (\n <IconButton\n ref={closeButtonRef}\n icon=\"Close\"\n variant=\"ghost\"\n color=\"slate\"\n size=\"sm\"\n aria-label=\"Close dialog\"\n onClick={onClose}\n />\n )}\n </div>\n </div>\n\n {tabsConfig && (\n <div className=\"shrink-0 border-b border-neutral-200/70 px-6 py-2 dark:border-neutral-700/60\">\n <Tabs\n {...tabsConfig}\n className={classNames(\n \"w-full overflow-x-auto\",\n tabsConfig.className,\n )}\n />\n </div>\n )}\n\n {bodyHeader && (\n <div className=\"shrink-0 border-b border-neutral-200/70 bg-neutral-50 px-6 py-3 dark:border-neutral-700/60 dark:bg-neutral-800/60\">\n {\" \"}\n {bodyHeader}\n </div>\n )}\n <div className=\"relative flex flex-1 min-h-0 overflow-hidden bg-neutral-50 dark:bg-neutral-800/60\">\n {loading && (\n <Loader\n overlay\n title={loadingTitle}\n label={loadingLabel}\n className=\"z-30\"\n />\n )}\n <div\n id={bodyId}\n className={classNames(\n \"relative flex-1 min-h-0 overflow-y-auto px-6 py-5\",\n \"[&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-neutral-200 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-700 hover:[&::-webkit-scrollbar-thumb]:bg-neutral-300 dark:hover:[&::-webkit-scrollbar-thumb]:bg-neutral-600 [&::-webkit-scrollbar-track]:bg-transparent\",\n bodyClassName,\n loading && \"pointer-events-none\",\n )}\n >\n <div className=\"flex flex-col gap-4\">{children}</div>\n </div>\n </div>\n {footerContent && (\n <div\n className={classNames(\n \"flex shrink-0 items-center justify-end gap-3 bg-neutral-50 px-6 py-4 dark:bg-neutral-800/60\",\n showFooterDividerClass,\n )}\n >\n {footerContent}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(content, document.body);\n};\n\ninterface ConfirmModalProps\n extends Omit<\n ModalProps,\n \"footer\" | \"actions\" | \"children\" | \"onClose\" | \"title\"\n > {\n title: ReactNode;\n children?: ReactNode;\n onClose: () => void;\n onConfirm: () => void;\n confirmLabel?: ReactNode;\n cancelLabel?: ReactNode;\n confirmVariant?: ButtonVariant;\n confirmColor?: ButtonColor;\n isConfirmDisabled?: boolean;\n confirmButtonProps?: ButtonProps;\n cancelButtonProps?: ButtonProps;\n description?: ReactNode;\n}\n\nconst ConfirmModal: React.FC<ConfirmModalProps> = ({\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n onConfirm,\n onClose,\n confirmVariant = \"solid\",\n isConfirmDisabled = false,\n confirmButtonProps,\n cancelButtonProps,\n children,\n ...props\n}) => {\n return (\n <Modal\n {...props}\n onClose={onClose}\n footer={\n <ModalActions>\n <Button\n variant=\"soft\"\n color=\"slate\"\n onClick={onClose}\n {...cancelButtonProps}\n >\n {cancelLabel}\n </Button>\n <Button\n variant={confirmVariant}\n color={props.confirmColor || \"blue\"}\n onClick={onConfirm}\n disabled={isConfirmDisabled}\n {...confirmButtonProps}\n >\n {confirmLabel}\n </Button>\n </ModalActions>\n }\n >\n {children}\n </Modal>\n );\n};\n\ninterface DeleteConfirmModalProps\n extends Omit<\n ConfirmModalProps,\n \"confirmLabel\" | \"confirmVariant\" | \"confirmColor\"\n > {\n /** The exact string the user must type to enable the delete button. */\n confirmValue: string;\n /** Human-readable label shown in the instruction, e.g. \"key name\". Default: \"name\" */\n confirmValueLabel?: string;\n confirmLabel?: ReactNode;\n}\n\nconst DeleteConfirmModal: React.FC<DeleteConfirmModalProps> = ({\n confirmValue,\n confirmValueLabel = \"name\",\n confirmLabel = \"Delete\",\n onConfirm,\n onClose,\n isConfirmDisabled,\n children,\n cancelLabel = \"Cancel\",\n cancelButtonProps,\n confirmButtonProps,\n ...props\n}) => {\n const [inputValue, setInputValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const isMatch = inputValue === confirmValue;\n\n useEffect(() => {\n if (!props.isOpen) setInputValue(\"\");\n }, [props.isOpen]);\n\n return (\n <Modal\n {...props}\n onClose={onClose}\n role=\"alertdialog\"\n initialFocusRef={inputRef as React.RefObject<HTMLElement>}\n footer={\n <ModalActions>\n <Button\n variant=\"soft\"\n color=\"slate\"\n onClick={onClose}\n {...cancelButtonProps}\n >\n {cancelLabel}\n </Button>\n <Button\n variant=\"solid\"\n color=\"rose\"\n onClick={onConfirm}\n disabled={!isMatch || isConfirmDisabled}\n {...confirmButtonProps}\n >\n {confirmLabel}\n </Button>\n </ModalActions>\n }\n >\n {children}\n <div className=\"flex flex-col gap-2 pt-1\">\n <label className=\"text-sm text-neutral-600 dark:text-neutral-400\">\n Type the {confirmValueLabel}{\" \"}\n <span className=\"font-mono font-semibold text-neutral-800 dark:text-neutral-200\">\n {confirmValue}\n </span>{\" \"}\n to confirm:\n </label>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && isMatch && !isConfirmDisabled) onConfirm();\n }}\n placeholder={confirmValue}\n className=\"w-full rounded-lg border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 px-3 py-2 text-sm font-mono text-neutral-900 dark:text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 outline-none focus:border-rose-400 focus:ring-2 focus:ring-rose-400/30\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\n </Modal>\n );\n};\n\ninterface ApplyConfirmModalProps\n extends Omit<\n ConfirmModalProps,\n \"confirmLabel\" | \"confirmVariant\" | \"confirmColor\"\n > {\n /** The exact string the user must type to enable the apply button. */\n confirmValue: string;\n /** Human-readable label shown in the instruction, e.g. \"key name\". Default: \"name\" */\n confirmValueLabel?: string;\n confirmLabel?: ReactNode;\n}\n\nconst ApplyConfirmModal: React.FC<ApplyConfirmModalProps> = ({\n confirmValue,\n confirmValueLabel = \"name\",\n confirmLabel = \"Apply\",\n onConfirm,\n onClose,\n isConfirmDisabled,\n children,\n cancelLabel = \"Cancel\",\n cancelButtonProps,\n confirmButtonProps,\n ...props\n}) => {\n const [inputValue, setInputValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const isMatch = inputValue === confirmValue;\n\n useEffect(() => {\n if (!props.isOpen) setInputValue(\"\");\n }, [props.isOpen]);\n\n return (\n <Modal\n {...props}\n onClose={onClose}\n role=\"alertdialog\"\n initialFocusRef={inputRef as React.RefObject<HTMLElement>}\n footer={\n <ModalActions>\n <Button\n variant=\"soft\"\n color=\"slate\"\n onClick={onClose}\n {...cancelButtonProps}\n >\n {cancelLabel}\n </Button>\n <Button\n variant=\"solid\"\n color=\"blue\"\n onClick={onConfirm}\n disabled={!isMatch || isConfirmDisabled}\n {...confirmButtonProps}\n >\n {confirmLabel}\n </Button>\n </ModalActions>\n }\n >\n {children}\n <div className=\"flex flex-col gap-2 pt-1\">\n <label className=\"text-sm text-neutral-600 dark:text-neutral-400\">\n Type the {confirmValueLabel}{\" \"}\n <span className=\"font-mono font-semibold text-neutral-800 dark:text-neutral-200\">\n {confirmValue}\n </span>{\" \"}\n to confirm:\n </label>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && isMatch && !isConfirmDisabled) onConfirm();\n }}\n placeholder={confirmValue}\n className=\"w-full rounded-lg border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 px-3 py-2 text-sm font-mono text-neutral-900 dark:text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-400/30\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\n </Modal>\n );\n};\n\ntype ModalComponentType = typeof Modal & {\n Actions: typeof ModalActions;\n Confirm: typeof ConfirmModal;\n DeleteConfirm: typeof DeleteConfirmModal;\n ApplyConfirm: typeof ApplyConfirmModal;\n};\n\n(Modal as ModalComponentType).Actions = ModalActions;\n(Modal as ModalComponentType).Confirm = ConfirmModal;\n(Modal as ModalComponentType).DeleteConfirm = DeleteConfirmModal;\n(Modal as ModalComponentType).ApplyConfirm = ApplyConfirmModal;\n\nexport { ModalActions, ConfirmModal, DeleteConfirmModal, ApplyConfirmModal };\nexport type {\n ModalActionsProps,\n DeleteConfirmModalProps,\n ApplyConfirmModalProps,\n};\nexport default Modal as ModalComponentType;\n","import React, { cloneElement } from \"react\";\nimport { type IconName, type IconSize, type IconRenderer } from \"../types\";\nimport { mergeClassTokens } from \"./iconUtils\";\nimport { default as CustomIcon } from \"../components/CustomIcon\";\n\nexport const renderIcon: IconRenderer = (icon, size, className) => {\n if (!icon) {\n return null;\n }\n\n const resolvedSize: IconSize = size ?? \"md\";\n\n if (typeof icon === \"string\") {\n return (\n <CustomIcon\n icon={icon as IconName}\n className={className}\n size={resolvedSize}\n />\n );\n }\n\n if (React.isValidElement<{ className?: string }>(icon)) {\n return cloneElement(icon, {\n className: mergeClassTokens(icon.props.className, className),\n });\n }\n\n return <span className={className}> {icon} </span>;\n};\n","import classNames from \"classnames\";\nimport React, {\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Loader,\n IconButton,\n Button,\n type ButtonProps,\n type ButtonVariant,\n type ButtonColor,\n} from \".\";\nimport type { Size } from \"../theme\";\nimport { type IconName } from \"../icons/registry\";\nimport { renderIcon } from \"../utils/renderIcon\";\n\n// ── Size presets (mirrors Modal) ──────────────────────────────────────────────\n\nconst sizePresets: Record<Size, { className: string; maxWidth?: string }> =\n {\n xs: { maxWidth: \"320px\", className: \"max-w-[320px]\" },\n sm: { maxWidth: \"400px\", className: \"max-w-[400px]\" },\n md: { maxWidth: \"600px\", className: \"max-w-[600px]\" },\n lg: { maxWidth: \"800px\", className: \"max-w-[800px]\" },\n xl: { maxWidth: \"1000px\", className: \"max-w-[1000px]\" },\n xxl: { maxWidth: \"1120px\", className: \"max-w-[1120px]\" },\n \"2xl\": { maxWidth: \"1120px\", className: \"max-w-[1120px]\" },\n xxxl: { maxWidth: \"1280px\", className: \"max-w-[1280px]\" },\n \"3xl\": { maxWidth: \"1280px\", className: \"max-w-[1280px]\" },\n full: { className: \"w-full max-w-none\" },\n };\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n/** Where the panel is anchored inside its positioned ancestor. */\nexport type InlinePanelAnchor = \"top\" | \"bottom\" | \"center\" | \"fill\";\n\nexport interface InlinePanelProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\" | \"children\"> {\n // ── Visibility ──────────────────────────────────────────────────────────\n isOpen: boolean;\n onClose: () => void;\n\n // ── Content ─────────────────────────────────────────────────────────────\n title: ReactNode;\n description?: ReactNode;\n /** Icon name string or a React element rendered in the header. */\n icon?: IconName | React.ReactElement;\n children: ReactNode;\n bodyHeader?: ReactNode;\n bodyClassName?: string;\n /** Slot rendered in the footer bar (use alongside actions). */\n footer?: ReactNode;\n /** Alias for footer — matches Modal API. */\n actions?: ReactNode;\n\n // ── Sizing (ignored when anchor=\"fill\") ─────────────────────────────────\n /**\n * Width preset for the content card. Only meaningful when anchor is\n * \"top\" or \"bottom\". Ignored for \"fill\". Default: \"md\".\n */\n size?: Size;\n maxWidth?: number | string;\n minWidth?: number | string;\n height?: number | string;\n maxHeight?: number | string;\n minHeight?: number | string;\n\n // ── Positioning ──────────────────────────────────────────────────────────\n /**\n * \"fill\" — covers the entire parent (absolute inset-0).\n * \"top\" — slides in from the top edge.\n * \"bottom\" — slides up from the bottom edge.\n *\n * The parent element MUST have `position: relative` (or any non-static\n * position) for the overlay to clip correctly.\n *\n * @default \"fill\"\n */\n anchor?: InlinePanelAnchor;\n /** z-index of the panel relative to its positioned parent. @default 20 */\n zIndex?: number;\n\n // ── Behaviour ────────────────────────────────────────────────────────────\n /** Press Escape to close. @default true */\n closeOnEsc?: boolean;\n /**\n * Click the backdrop behind the panel card to close.\n * Only relevant when anchor is \"top\" or \"bottom\".\n * @default false (more conservative than Modal — inline forms are higher-risk to dismiss accidentally)\n */\n closeOnBackdropClick?: boolean;\n /** Show a semi-transparent backdrop behind the card (top/bottom only). @default false */\n showBackdrop?: boolean;\n\n // ── Loading ──────────────────────────────────────────────────────────────\n loading?: boolean;\n loadingTitle?: ReactNode;\n loadingLabel?: ReactNode;\n\n // ── Header extras ────────────────────────────────────────────────────────\n headerActions?: ButtonProps[];\n onBack?: () => void;\n backTooltip?: string;\n hideCloseButton?: boolean;\n showFooterDivider?: boolean;\n\n // ── Focus ────────────────────────────────────────────────────────────────\n /** Ref to the element that should receive focus when the panel opens. */\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n\n // ── ARIA ─────────────────────────────────────────────────────────────────\n ariaLabel?: string;\n role?: \"dialog\" | \"alertdialog\";\n}\n\n// ── InlinePanel ───────────────────────────────────────────────────────────────\n\nconst InlinePanel: React.FC<InlinePanelProps> = ({\n isOpen,\n onClose,\n title,\n description,\n icon,\n children,\n bodyHeader,\n bodyClassName,\n footer,\n actions,\n size = \"md\",\n maxWidth,\n minWidth,\n height,\n maxHeight,\n minHeight,\n anchor = \"fill\",\n zIndex = 20,\n closeOnEsc = true,\n closeOnBackdropClick = false,\n showBackdrop = false,\n loading,\n loadingTitle,\n loadingLabel,\n headerActions = [],\n onBack,\n backTooltip = \"Go back\",\n hideCloseButton = false,\n showFooterDivider,\n initialFocusRef,\n ariaLabel,\n role = \"dialog\",\n className,\n style,\n ...rest\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const closeButtonRef = useRef<HTMLButtonElement>(null);\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n const prevOpenRef = useRef(isOpen);\n\n const headingId = useId();\n const bodyId = useId();\n\n // ── Mount / unmount with animation ───────────────────────────────────────\n\n const [mounted, setMounted] = useState(isOpen);\n\n useEffect(() => {\n if (isOpen && !prevOpenRef.current) {\n setMounted(true);\n }\n prevOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleTransitionEnd = useCallback(\n (e: React.TransitionEvent<HTMLDivElement>) => {\n // Only act on the shell itself, not on child element transitions\n if (e.target !== e.currentTarget) return;\n if (!isOpen) setMounted(false);\n },\n [isOpen],\n );\n\n // ── Focus management ─────────────────────────────────────────────────────\n\n useEffect(() => {\n if (isOpen) {\n previouslyFocusedRef.current =\n document.activeElement as HTMLElement | null;\n const focusTarget =\n initialFocusRef?.current ??\n (!hideCloseButton ? closeButtonRef.current : null) ??\n contentRef.current;\n const frame = requestAnimationFrame(() =>\n focusTarget?.focus({ preventScroll: true }),\n );\n return () => cancelAnimationFrame(frame);\n }\n }, [isOpen, hideCloseButton, initialFocusRef]);\n\n useEffect(() => {\n if (!isOpen && previouslyFocusedRef.current) {\n const node = previouslyFocusedRef.current;\n previouslyFocusedRef.current = null;\n node.focus({ preventScroll: true });\n }\n }, [isOpen]);\n\n // ── Escape key ───────────────────────────────────────────────────────────\n\n useEffect(() => {\n if (!isOpen || !closeOnEsc) return;\n const handler = (e: KeyboardEvent) => {\n // Don't steal Escape from a nested Modal (which calls preventDefault)\n if (e.key === \"Escape\" && !e.defaultPrevented) {\n e.preventDefault();\n onClose();\n }\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [isOpen, closeOnEsc, onClose]);\n\n // ── Dev-mode parent-positioning check ────────────────────────────────────\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && isOpen && contentRef.current) {\n const parent = contentRef.current.parentElement;\n if (parent) {\n const { position } = getComputedStyle(parent);\n if (position === \"static\") {\n console.warn(\n \"[InlinePanel] The parent element has `position: static`. \" +\n \"Add `position: relative` (or any non-static position) so the \" +\n \"panel clips to the intended container.\",\n );\n }\n }\n }\n }, [isOpen]);\n\n // ── Shell position classes ────────────────────────────────────────────────\n\n const shellPositionClass = useMemo(() => {\n switch (anchor) {\n case \"top\":\n return \"absolute top-0 inset-x-0 flex justify-center items-start\";\n case \"bottom\":\n return \"absolute bottom-0 inset-x-0 flex justify-center items-end\";\n case \"center\":\n return \"absolute inset-0 flex justify-center items-center\";\n case \"fill\":\n default:\n return \"absolute inset-0\";\n }\n }, [anchor]);\n\n // ── Transition classes ────────────────────────────────────────────────────\n\n const transitionBase =\n \"transition-[transform,opacity,scale] duration-200 ease-out\";\n\n const shellTransitionClass = useMemo(() => {\n if (anchor === \"fill\") {\n return isOpen ? \"opacity-100\" : \"opacity-0 pointer-events-none\";\n }\n if (anchor === \"top\") {\n return isOpen\n ? \"translate-y-0 opacity-100\"\n : \"-translate-y-full opacity-0 pointer-events-none\";\n }\n if (anchor === \"bottom\") {\n return isOpen\n ? \"translate-y-0 opacity-100\"\n : \"translate-y-full opacity-0 pointer-events-none\";\n }\n // center\n return isOpen\n ? \"scale-100 opacity-100\"\n : \"scale-95 opacity-0 pointer-events-none\";\n }, [anchor, isOpen]);\n\n // ── Content card sizing (ignored for fill) ────────────────────────────────\n\n const preset = sizePresets[size] ?? sizePresets.md;\n const isFill = anchor === \"fill\";\n const isCenter = anchor === \"center\";\n\n const cardSizeClass = isFill ? \"w-full h-full\" : preset.className;\n\n const cardStyle: React.CSSProperties = {\n ...(maxWidth !== undefined\n ? { maxWidth: typeof maxWidth === \"number\" ? `${maxWidth}px` : maxWidth }\n : !isFill\n ? { maxWidth: preset.maxWidth }\n : undefined),\n ...(minWidth !== undefined\n ? { minWidth: typeof minWidth === \"number\" ? `${minWidth}px` : minWidth }\n : undefined),\n ...(height !== undefined\n ? { height: typeof height === \"number\" ? `${height}px` : height }\n : undefined),\n ...(maxHeight !== undefined\n ? {\n maxHeight:\n typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight,\n }\n : undefined),\n ...(minHeight !== undefined\n ? {\n minHeight:\n typeof minHeight === \"number\" ? `${minHeight}px` : minHeight,\n }\n : undefined),\n ...style,\n };\n\n const footerContent = footer ?? actions;\n const showFooterDividerClass = showFooterDivider\n ? \"border-t border-neutral-200/70 dark:border-neutral-700/60\"\n : \"\";\n\n const ariaLabelValue =\n ariaLabel ?? (typeof title === \"string\" ? title : undefined);\n const ariaLabelledBy = ariaLabelValue ? undefined : headingId;\n const ariaDescribedBy = description || bodyHeader ? bodyId : undefined;\n\n if (!mounted) return null;\n\n return (\n // ── Positioning shell ──────────────────────────────────────────────────\n <div\n className={classNames(\n shellPositionClass,\n transitionBase,\n shellTransitionClass,\n )}\n style={{ zIndex }}\n onTransitionEnd={handleTransitionEnd}\n >\n {/* Optional backdrop for top/bottom/center anchors */}\n {!isFill && showBackdrop && (\n <div\n aria-hidden=\"true\"\n className=\"absolute inset-0 bg-neutral-900/30 backdrop-blur-sm\"\n onMouseDown={closeOnBackdropClick ? onClose : undefined}\n />\n )}\n\n {/* ── Content card ──────────────────────────────────────────────── */}\n <div\n ref={contentRef}\n className={classNames(\n \"relative flex flex-col overflow-hidden border border-neutral-200/70 bg-white shadow-2xl dark:border-neutral-700/60 dark:bg-neutral-800\",\n isFill\n ? \"rounded-[inherit] w-full h-full\"\n : isCenter\n ? \"rounded-[28px] w-full mx-4\"\n : \"rounded-[28px] w-full\",\n cardSizeClass,\n \"focus-visible:outline-none\",\n className,\n )}\n style={cardStyle}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledBy}\n aria-label={ariaLabelValue}\n aria-describedby={ariaDescribedBy}\n aria-busy={loading ? \"true\" : undefined}\n tabIndex={-1}\n {...rest}\n >\n {/* ── Header ──────────────────────────────────────────────────── */}\n <div className=\"flex shrink-0 items-start justify-between gap-4 border-b border-neutral-200/70 pl-4 pr-3 py-4 dark:border-neutral-700/60\">\n {onBack && (\n <div className=\"flex shrink-0 items-center self-center\">\n <IconButton\n icon=\"ArrowChevronLeft\"\n variant=\"ghost\"\n color=\"slate\"\n size=\"sm\"\n tooltip={backTooltip}\n tooltipPosition=\"bottom\"\n aria-label={backTooltip}\n onClick={onBack}\n />\n </div>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {icon && (\n <div className=\"flex shrink-0 items-center justify-center text-neutral-600 dark:text-neutral-200\">\n {renderIcon(icon, \"sm\")}\n </div>\n )}\n <div className=\"min-w-0\">\n <h2\n id={headingId}\n className=\"truncate text-xl font-medium tracking-tight text-neutral-900 dark:text-neutral-100\"\n >\n {title}\n </h2>\n </div>\n </div>\n {description && (\n <p className=\"text-sm text-neutral-600 dark:text-neutral-300\">\n {description}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {headerActions.map((action, i) => (\n <Button key={`inline-panel-action-${i}`} {...action} />\n ))}\n {!hideCloseButton && (\n <IconButton\n ref={closeButtonRef}\n icon=\"Close\"\n variant=\"ghost\"\n color=\"slate\"\n size=\"sm\"\n aria-label=\"Close\"\n onClick={onClose}\n />\n )}\n </div>\n </div>\n\n {/* ── Body header ─────────────────────────────────────────────── */}\n {bodyHeader && (\n <div\n id={bodyId}\n className=\"shrink-0 border-b border-neutral-200/70 bg-neutral-50 px-6 py-3 dark:border-neutral-700/60 dark:bg-neutral-800/60\"\n >\n {bodyHeader}\n </div>\n )}\n\n {/* ── Body ────────────────────────────────────────────────────── */}\n <div className=\"relative flex flex-1 min-h-0 overflow-hidden bg-neutral-50 dark:bg-neutral-800/60\">\n {loading && (\n <Loader\n overlay\n title={loadingTitle}\n label={loadingLabel}\n className=\"z-30\"\n />\n )}\n <div\n id={bodyHeader ? undefined : bodyId}\n className={classNames(\n \"relative flex-1 min-h-0 overflow-y-auto px-6 py-5\",\n \"[&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-neutral-200 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-700\",\n bodyClassName,\n loading && \"pointer-events-none\",\n )}\n >\n <div className=\"flex flex-col gap-4\">{children}</div>\n </div>\n </div>\n\n {/* ── Footer ──────────────────────────────────────────────────── */}\n {footerContent && (\n <div\n className={classNames(\n \"flex shrink-0 items-center justify-end gap-3 bg-neutral-50 px-6 py-4 dark:bg-neutral-800/60\",\n showFooterDividerClass,\n )}\n >\n {footerContent}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nInlinePanel.displayName = \"InlinePanel\";\n\n// ── ConfirmInlinePanel ────────────────────────────────────────────────────────\n\nexport interface ConfirmInlinePanelProps\n extends Omit<InlinePanelProps, \"actions\" | \"footer\" | \"role\" | \"children\"> {\n children?: ReactNode;\n onConfirm: () => void;\n confirmLabel?: ReactNode;\n cancelLabel?: ReactNode;\n confirmVariant?: ButtonVariant;\n confirmColor?: ButtonColor;\n isConfirmDisabled?: boolean;\n}\n\nexport const ConfirmInlinePanel: React.FC<ConfirmInlinePanelProps> = ({\n onConfirm,\n onClose,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n confirmVariant = \"solid\",\n confirmColor = \"blue\",\n isConfirmDisabled = false,\n anchor = \"center\",\n showBackdrop = true,\n size = \"sm\",\n children,\n ...props\n}) => (\n <InlinePanel\n {...props}\n anchor={anchor}\n showBackdrop={showBackdrop}\n size={size}\n onClose={onClose}\n role=\"alertdialog\"\n actions={\n <>\n <Button variant=\"soft\" color=\"slate\" size=\"sm\" onClick={onClose}>\n {cancelLabel}\n </Button>\n <Button\n variant={confirmVariant}\n color={confirmColor}\n size=\"sm\"\n disabled={isConfirmDisabled}\n onClick={onConfirm}\n >\n {confirmLabel}\n </Button>\n </>\n }\n >\n {children ?? null}\n </InlinePanel>\n);\n\nConfirmInlinePanel.displayName = \"ConfirmInlinePanel\";\n\n// ── DeleteConfirmInlinePanel ──────────────────────────────────────────────────\n\nexport interface DeleteConfirmInlinePanelProps\n extends Omit<\n ConfirmInlinePanelProps,\n \"confirmLabel\" | \"confirmVariant\" | \"confirmColor\"\n > {\n /** The exact string the user must type to enable the delete button. */\n confirmValue: string;\n /** Human-readable label shown in the instruction, e.g. \"snapshot name\". @default \"name\" */\n confirmValueLabel?: string;\n confirmLabel?: ReactNode;\n}\n\nexport const DeleteConfirmInlinePanel: React.FC<\n DeleteConfirmInlinePanelProps\n> = ({\n confirmValue,\n confirmValueLabel = \"name\",\n confirmLabel = \"Delete\",\n onConfirm,\n onClose,\n isConfirmDisabled,\n children,\n cancelLabel = \"Cancel\",\n ...props\n}) => {\n const [inputValue, setInputValue] = useState(\"\");\n const inputRef = useRef<HTMLInputElement>(null);\n const isMatch = inputValue === confirmValue;\n\n useEffect(() => {\n if (!props.isOpen) setInputValue(\"\");\n }, [props.isOpen]);\n\n return (\n <ConfirmInlinePanel\n {...props}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel={confirmLabel}\n cancelLabel={cancelLabel}\n confirmVariant=\"solid\"\n confirmColor=\"rose\"\n isConfirmDisabled={!isMatch || isConfirmDisabled}\n initialFocusRef={inputRef}\n >\n {children}\n <div className=\"flex flex-col gap-2 pt-1\">\n <label className=\"text-sm text-neutral-600 dark:text-neutral-400\">\n Type the {confirmValueLabel}{\" \"}\n <span className=\"font-mono font-semibold text-neutral-800 dark:text-neutral-200\">\n {confirmValue}\n </span>{\" \"}\n to confirm:\n </label>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && isMatch && !isConfirmDisabled) onConfirm();\n }}\n placeholder={confirmValue}\n className=\"w-full rounded-lg border border-neutral-300 dark:border-neutral-600 bg-white dark:bg-neutral-800 px-3 py-2 text-sm font-mono text-neutral-900 dark:text-neutral-100 placeholder-neutral-400 dark:placeholder-neutral-500 outline-none focus:border-rose-400 focus:ring-2 focus:ring-rose-400/30\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\n </ConfirmInlinePanel>\n );\n};\n\nDeleteConfirmInlinePanel.displayName = \"DeleteConfirmInlinePanel\";\n\nexport { InlinePanel };\nexport default InlinePanel;\n","import { Link, useLocation } from \"react-router-dom\";\nimport React, { useMemo, useState } from \"react\";\nimport CustomIcon from \"./CustomIcon\";\nimport { type IconName } from \"../icons/registry\";\nimport { TrueColor } from \"../theme\";\n\nexport type SideMenuItemType = \"link\" | \"group\" | \"divider\";\n\nexport interface SideMenuGuardClaim {\n type: \"claim\";\n claim: string;\n}\nexport interface SideMenuGuardAnyClaim {\n type: \"anyClaim\";\n claims: string[];\n}\nexport interface SideMenuGuardAllClaims {\n type: \"allClaims\";\n claims: string[];\n}\nexport interface SideMenuGuardRole {\n type: \"role\";\n role: string;\n}\nexport interface SideMenuGuardAnyRole {\n type: \"anyRole\";\n roles: string[];\n}\nexport interface SideMenuGuardModule {\n type: \"module\";\n module: string;\n}\nexport interface SideMenuGuardAnyModule {\n type: \"anyModule\";\n modules: string[];\n}\nexport interface SideMenuGuardCustom {\n type: \"custom\";\n fn: () => boolean;\n}\n\nexport type SideMenuItemGuard =\n | SideMenuGuardClaim\n | SideMenuGuardAnyClaim\n | SideMenuGuardAllClaims\n | SideMenuGuardRole\n | SideMenuGuardAnyRole\n | SideMenuGuardModule\n | SideMenuGuardAnyModule\n | SideMenuGuardCustom;\n\nexport interface SideMenuItemBase {\n /** When true, the item is not rendered in the menu */\n hidden?: boolean;\n slug: string;\n /** Guard rules — ALL must pass (AND logic). */\n guards?: SideMenuItemGuard[];\n}\n\nexport interface SideMenuSettings {\n /** When true, the menu is collapsed */\n collapsed?: boolean;\n}\n\nexport interface SideMenuItemLink extends SideMenuItemBase {\n color?: TrueColor;\n type?: \"link\";\n label: string;\n path: string;\n icon?: IconName;\n groupName?: string;\n /** Optional badge rendered to the right of the label (e.g. active job count). */\n badge?: React.ReactNode;\n}\n\nexport interface SideMenuItemGroup extends SideMenuItemBase {\n type: \"group\";\n label: string;\n /** When true, renders a divider line immediately before the group header. */\n hasDivider?: boolean;\n}\n\nexport interface SideMenuItemDivider extends SideMenuItemBase {\n type: \"divider\";\n groupName?: string;\n}\n\nexport type SideMenuItem =\n | SideMenuItemLink\n | SideMenuItemGroup\n | SideMenuItemDivider;\n\nexport interface SideMenuProps {\n color?: TrueColor;\n title?: string;\n /** Icon element shown in the logo area (always visible, collapsed or expanded) */\n logoIcon?: React.ReactNode;\n /** Text element shown next to the logoIcon when expanded */\n logoText?: React.ReactNode;\n items: SideMenuItem[];\n className?: string;\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n mobileOpen?: boolean;\n onCloseMobile?: () => void;\n /** When true, the desktop sidebar uses h-full instead of a fixed calc height. */\n fullHeight?: boolean;\n /** Called with item.guards; return true = show. Omit to show all. */\n guardEvaluator?: (guards: SideMenuItemGuard[]) => boolean;\n /**\n * Active module view filter (e.g. 'all' | 'host' | 'orchestrator').\n * When set to a non-'all' value, items whose module/anyModule guards reference\n * a module listed in `moduleViewOptions` must match this value to be shown.\n * Modules NOT in `moduleViewOptions` (e.g. 'reverse_proxy', 'api') are never\n * subject to the view filter and behave as before.\n * Items with no module guard are always shown.\n */\n activeModuleView?: string;\n /**\n * The set of module names that are treated as view-selectable\n * (e.g. ['host', 'orchestrator']). Only module guards whose value appears\n * in this list are subject to the activeModuleView filter.\n * Defaults to [] (no view filtering on any module).\n */\n moduleViewOptions?: readonly string[];\n}\n\nconst getSideMenuColorTokens = (color: TrueColor) => {\n switch (color) {\n case \"neutral\":\n return {\n bg: \"bg-neutral-100 dark:bg-neutral-800/60\",\n text: \"text-neutral-900 dark:text-neutral-100\",\n hoverBg: \"hover:bg-neutral-200 dark:hover:bg-neutral-700/50\",\n hoverText: \"hover:text-neutral-900 dark:hover:text-neutral-100\",\n iconActive: \"text-neutral-900 dark:text-neutral-100\",\n iconHover:\n \"group-hover:text-neutral-900 dark:group-hover:text-neutral-100\",\n };\n case \"blue\":\n return {\n bg: \"bg-blue-50 dark:bg-blue-500/10\",\n text: \"text-blue-700 dark:text-blue-400\",\n hoverBg: \"hover:bg-blue-100 dark:hover:bg-blue-500/20\",\n hoverText: \"hover:text-blue-900 dark:hover:text-blue-300\",\n iconActive: \"text-blue-600 dark:text-blue-400\",\n iconHover: \"group-hover:text-blue-700 dark:group-hover:text-blue-300\",\n };\n case \"sky\":\n return {\n bg: \"bg-sky-50 dark:bg-sky-500/10\",\n text: \"text-sky-700 dark:text-sky-400\",\n hoverBg: \"hover:bg-sky-100 dark:hover:bg-sky-500/20\",\n hoverText: \"hover:text-sky-900 dark:hover:text-sky-300\",\n iconActive: \"text-sky-600 dark:text-sky-400\",\n iconHover: \"group-hover:text-sky-700 dark:group-hover:text-sky-300\",\n };\n case \"emerald\":\n return {\n bg: \"bg-emerald-50 dark:bg-emerald-500/10\",\n text: \"text-emerald-700 dark:text-emerald-400\",\n hoverBg: \"hover:bg-emerald-100 dark:hover:bg-emerald-500/20\",\n hoverText: \"hover:text-emerald-900 dark:hover:text-emerald-300\",\n iconActive: \"text-emerald-600 dark:text-emerald-400\",\n iconHover:\n \"group-hover:text-emerald-700 dark:group-hover:text-emerald-300\",\n };\n case \"amber\":\n return {\n bg: \"bg-amber-50 dark:bg-amber-500/10\",\n text: \"text-amber-700 dark:text-amber-400\",\n hoverBg: \"hover:bg-amber-100 dark:hover:bg-amber-500/20\",\n hoverText: \"hover:text-amber-900 dark:hover:text-amber-300\",\n iconActive: \"text-amber-600 dark:text-amber-400\",\n iconHover: \"group-hover:text-amber-700 dark:group-hover:text-amber-300\",\n };\n case \"rose\":\n return {\n bg: \"bg-rose-50 dark:bg-rose-500/10\",\n text: \"text-rose-700 dark:text-rose-400\",\n hoverBg: \"hover:bg-rose-100 dark:hover:bg-rose-500/20\",\n hoverText: \"hover:text-rose-900 dark:hover:text-rose-300\",\n iconActive: \"text-rose-600 dark:text-rose-400\",\n iconHover: \"group-hover:text-rose-700 dark:group-hover:text-rose-300\",\n };\n case \"red\":\n return {\n bg: \"bg-red-50 dark:bg-red-500/10\",\n text: \"text-red-700 dark:text-red-400\",\n hoverBg: \"hover:bg-red-100 dark:hover:bg-red-500/20\",\n hoverText: \"hover:text-red-900 dark:hover:text-red-300\",\n iconActive: \"text-red-600 dark:text-red-400\",\n iconHover: \"group-hover:text-red-700 dark:group-hover:text-red-300\",\n };\n case \"orange\":\n return {\n bg: \"bg-orange-50 dark:bg-orange-500/10\",\n text: \"text-orange-700 dark:text-orange-400\",\n hoverBg: \"hover:bg-orange-100 dark:hover:bg-orange-500/20\",\n hoverText: \"hover:text-orange-900 dark:hover:text-orange-300\",\n iconActive: \"text-orange-600 dark:text-orange-400\",\n iconHover:\n \"group-hover:text-orange-700 dark:group-hover:text-orange-300\",\n };\n case \"yellow\":\n return {\n bg: \"bg-yellow-50 dark:bg-yellow-500/10\",\n text: \"text-yellow-700 dark:text-yellow-400\",\n hoverBg: \"hover:bg-yellow-100 dark:hover:bg-yellow-500/20\",\n hoverText: \"hover:text-yellow-900 dark:hover:text-yellow-300\",\n iconActive: \"text-yellow-600 dark:text-yellow-400\",\n iconHover:\n \"group-hover:text-yellow-700 dark:group-hover:text-yellow-300\",\n };\n case \"lime\":\n return {\n bg: \"bg-lime-50 dark:bg-lime-500/10\",\n text: \"text-lime-700 dark:text-lime-400\",\n hoverBg: \"hover:bg-lime-100 dark:hover:bg-lime-500/20\",\n hoverText: \"hover:text-lime-900 dark:hover:text-lime-300\",\n iconActive: \"text-lime-600 dark:text-lime-400\",\n iconHover: \"group-hover:text-lime-700 dark:group-hover:text-lime-300\",\n };\n case \"green\":\n return {\n bg: \"bg-green-50 dark:bg-green-500/10\",\n text: \"text-green-700 dark:text-green-400\",\n hoverBg: \"hover:bg-green-100 dark:hover:bg-green-500/20\",\n hoverText: \"hover:text-green-900 dark:hover:text-green-300\",\n iconActive: \"text-green-600 dark:text-green-400\",\n iconHover: \"group-hover:text-green-700 dark:group-hover:text-green-300\",\n };\n case \"teal\":\n return {\n bg: \"bg-teal-50 dark:bg-teal-500/10\",\n text: \"text-teal-700 dark:text-teal-400\",\n hoverBg: \"hover:bg-teal-100 dark:hover:bg-teal-500/20\",\n hoverText: \"hover:text-teal-900 dark:hover:text-teal-300\",\n iconActive: \"text-teal-600 dark:text-teal-400\",\n iconHover: \"group-hover:text-teal-700 dark:group-hover:text-teal-300\",\n };\n case \"cyan\":\n return {\n bg: \"bg-cyan-50 dark:bg-cyan-500/10\",\n text: \"text-cyan-700 dark:text-cyan-400\",\n hoverBg: \"hover:bg-cyan-100 dark:hover:bg-cyan-500/20\",\n hoverText: \"hover:text-cyan-900 dark:hover:text-cyan-300\",\n iconActive: \"text-cyan-600 dark:text-cyan-400\",\n iconHover: \"group-hover:text-cyan-700 dark:group-hover:text-cyan-300\",\n };\n case \"indigo\":\n return {\n bg: \"bg-indigo-50 dark:bg-indigo-500/10\",\n text: \"text-indigo-700 dark:text-indigo-400\",\n hoverBg: \"hover:bg-indigo-100 dark:hover:bg-indigo-500/20\",\n hoverText: \"hover:text-indigo-900 dark:hover:text-indigo-300\",\n iconActive: \"text-indigo-600 dark:text-indigo-400\",\n iconHover:\n \"group-hover:text-indigo-700 dark:group-hover:text-indigo-300\",\n };\n case \"violet\":\n return {\n bg: \"bg-violet-50 dark:bg-violet-500/10\",\n text: \"text-violet-700 dark:text-violet-400\",\n hoverBg: \"hover:bg-violet-100 dark:hover:bg-violet-500/20\",\n hoverText: \"hover:text-violet-900 dark:hover:text-violet-300\",\n iconActive: \"text-violet-600 dark:text-violet-400\",\n iconHover:\n \"group-hover:text-violet-700 dark:group-hover:text-violet-300\",\n };\n case \"purple\":\n return {\n bg: \"bg-purple-50 dark:bg-purple-500/10\",\n text: \"text-purple-700 dark:text-purple-400\",\n hoverBg: \"hover:bg-purple-100 dark:hover:bg-purple-500/20\",\n hoverText: \"hover:text-purple-900 dark:hover:text-purple-300\",\n iconActive: \"text-purple-600 dark:text-purple-400\",\n iconHover:\n \"group-hover:text-purple-700 dark:group-hover:text-purple-300\",\n };\n case \"fuchsia\":\n return {\n bg: \"bg-fuchsia-50 dark:bg-fuchsia-500/10\",\n text: \"text-fuchsia-700 dark:text-fuchsia-400\",\n hoverBg: \"hover:bg-fuchsia-100 dark:hover:bg-fuchsia-500/20\",\n hoverText: \"hover:text-fuchsia-900 dark:hover:text-fuchsia-300\",\n iconActive: \"text-fuchsia-600 dark:text-fuchsia-400\",\n iconHover:\n \"group-hover:text-fuchsia-700 dark:group-hover:text-fuchsia-300\",\n }; case \"slate\":\n return {\n bg: \"bg-slate-50 dark:bg-slate-500/10\",\n text: \"text-slate-700 dark:text-slate-400\",\n hoverBg: \"hover:bg-slate-100 dark:hover:bg-slate-500/20\",\n hoverText: \"hover:text-slate-900 dark:hover:text-slate-300\",\n iconActive: \"text-slate-600 dark:text-slate-400\",\n iconHover: \"group-hover:text-slate-700 dark:group-hover:text-slate-300\",\n };\n case \"gray\":\n return {\n bg: \"bg-gray-50 dark:bg-gray-500/10\",\n text: \"text-gray-700 dark:text-gray-400\",\n hoverBg: \"hover:bg-gray-100 dark:hover:bg-gray-500/20\",\n hoverText: \"hover:text-gray-900 dark:hover:text-gray-300\",\n iconActive: \"text-gray-600 dark:text-gray-400\",\n iconHover: \"group-hover:text-gray-700 dark:group-hover:text-gray-300\",\n };\n case \"zinc\":\n return {\n bg: \"bg-zinc-50 dark:bg-zinc-500/10\",\n text: \"text-zinc-700 dark:text-zinc-400\",\n hoverBg: \"hover:bg-zinc-100 dark:hover:bg-zinc-500/20\",\n hoverText: \"hover:text-zinc-900 dark:hover:text-zinc-300\",\n iconActive: \"text-zinc-600 dark:text-zinc-400\",\n iconHover: \"group-hover:text-zinc-700 dark:group-hover:text-zinc-300\",\n };\n case \"stone\":\n return {\n bg: \"bg-stone-50 dark:bg-stone-500/10\",\n text: \"text-stone-700 dark:text-stone-400\",\n hoverBg: \"hover:bg-stone-100 dark:hover:bg-stone-500/20\",\n hoverText: \"hover:text-stone-900 dark:hover:text-stone-300\",\n iconActive: \"text-stone-600 dark:text-stone-400\",\n iconHover: \"group-hover:text-stone-700 dark:group-hover:text-stone-300\",\n };\n default:\n return {\n bg: \"bg-blue-50 dark:bg-blue-500/10\",\n text: \"text-blue-700 dark:text-blue-400\",\n hoverBg: \"hover:bg-blue-100 dark:hover:bg-blue-500/20\",\n hoverText: \"hover:text-blue-900 dark:hover:text-blue-300\",\n iconActive: \"text-blue-600 dark:text-blue-400\",\n iconHover: \"group-hover:text-blue-700 dark:group-hover:text-blue-300\",\n };\n }\n};\n\nexport const SideMenu = ({\n title,\n logoIcon,\n logoText,\n items,\n className = \"\",\n collapsed = false,\n onToggleCollapse,\n mobileOpen = false,\n onCloseMobile,\n fullHeight = false,\n guardEvaluator,\n activeModuleView,\n moduleViewOptions = [],\n color = \"blue\",\n}: SideMenuProps) => {\n const location = useLocation();\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n\n const isCollapsed = onToggleCollapse ? collapsed : internalCollapsed;\n const toggleCollapse =\n onToggleCollapse || (() => setInternalCollapsed(!internalCollapsed));\n\n const isActive = (path: string) => {\n if (path === \"/\") return location.pathname === \"/\";\n return location.pathname.startsWith(path);\n };\n\n const visibleItems = useMemo(() => {\n const isViewFiltered = !!activeModuleView && activeModuleView !== \"all\";\n\n const passesModuleViewFilter = (guards: SideMenuItemGuard[]): boolean => {\n if (!isViewFiltered || moduleViewOptions.length === 0) return true;\n for (const guard of guards) {\n if (guard.type === \"module\") {\n // Only view-filter this guard if the module is a known view option\n if (\n moduleViewOptions.includes(guard.module) &&\n guard.module !== activeModuleView\n )\n return false;\n } else if (guard.type === \"anyModule\") {\n // Only look at the subset of modules that are view options\n const viewModulesInGuard = guard.modules.filter((m) =>\n moduleViewOptions.includes(m),\n );\n if (\n viewModulesInGuard.length > 0 &&\n !viewModulesInGuard.includes(activeModuleView!)\n )\n return false;\n }\n }\n return true;\n };\n\n const passesGuard = (item: SideMenuItem): boolean => {\n if (item.hidden) return false;\n if (item.guards?.length) {\n if (!passesModuleViewFilter(item.guards)) return false;\n if (guardEvaluator) return guardEvaluator(item.guards);\n }\n return true;\n };\n\n // Which group slugs have ≥1 visible link?\n const groupsWithVisibleLinks = new Set<string>();\n items.forEach((item) => {\n if (\n item.type !== \"group\" &&\n item.type !== \"divider\" &&\n passesGuard(item)\n ) {\n const link = item as SideMenuItemLink;\n if (link.groupName) groupsWithVisibleLinks.add(link.groupName);\n }\n });\n\n return items.filter((item) => {\n if (!passesGuard(item)) return false;\n if (item.type === \"group\") return groupsWithVisibleLinks.has(item.slug);\n // Standalone dividers: hide if groupName set but that group has no visible links\n if (item.type === \"divider\")\n return !item.groupName || groupsWithVisibleLinks.has(item.groupName);\n return true;\n });\n }, [items, guardEvaluator, activeModuleView, moduleViewOptions]);\n\n // Mobile Overlay Classes\n const mobileClasses = `\n fixed inset-y-0 left-0 z-[60] w-64 bg-white/90 dark:bg-neutral-900/95 backdrop-blur-xl transition-transform duration-300 ease-in-out md:hidden\n ${mobileOpen ? \"translate-x-0\" : \"-translate-x-full\"}\n `;\n\n // Desktop Classes\n // NOTE: backdrop-blur is intentionally NOT on this element — it would create a CSS stacking\n // context that scopes child z-indices, preventing the logo from escaping the overlay.\n // The blur + background are applied via an inner absolute layer instead.\n const desktopClasses = `\n hidden md:flex flex-col flex-shrink-0 relative ${fullHeight ? \"h-full\" : \"sticky top-16 h-[calc(100vh-64px)]\"}\n transition-all duration-300\n shadow-[10px_0_30px_-10px_rgba(0,0,0,0.1)] dark:shadow-[10px_0_30px_-10px_rgba(0,0,0,0.4)] overflow-hidden\n ${isCollapsed ? \"w-[68px]\" : \"w-64\"}\n `;\n\n const logoSection = (logoIcon || logoText) && (\n <div\n className={`relative z-50 flex h-15 items-center bg-white dark:bg-neutral-900 border-b border-gray-200 dark:border-neutral-700 px-4 py-4 ${isCollapsed ? \"justify-center\" : \"\"}`}\n >\n {logoIcon && <div className=\"shrink-0\">{logoIcon}</div>}\n {logoText && (\n <div\n className={`overflow-hidden transition-all duration-300 ${isCollapsed ? \"w-0 opacity-0 ml-0\" : \"w-auto opacity-100 ml-3\"}`}\n >\n <div className=\"whitespace-nowrap\">{logoText}</div>\n </div>\n )}\n </div>\n );\n\n const renderContent = (isMobile: boolean) => (\n <>\n {/* Glass background — kept on a separate layer so the outer wrapper doesn't\n create a stacking context. This lets child elements use root-level z-indices. */}\n {!isMobile && (\n <div className=\"absolute inset-0 backdrop-blur-2xl bg-white/70 dark:bg-neutral-900/90 pointer-events-none\" />\n )}\n {/* Dither Noise Overlay */}\n <div\n className=\"absolute inset-0 opacity-[0.4] pointer-events-none mix-blend-overlay\"\n style={{\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E\")`,\n }}\n />\n <div className=\"relative h-full flex flex-col w-full\">\n {/* Logo Header */}\n {logoSection}\n\n {/* Title + Mobile Close */}\n {(title || isMobile) && (\n <div\n className={`px-6 pt-4 pb-2 flex items-center ${isCollapsed && !isMobile ? \"justify-center px-3\" : \"justify-between\"}`}\n >\n {title && !(isCollapsed && !isMobile) && (\n <h2 className=\"text-xs font-semibold text-gray-400 dark:text-neutral-500 uppercase tracking-wider whitespace-nowrap\">\n {title}\n </h2>\n )}\n {/* Mobile Close Button */}\n {isMobile && (\n <button\n onClick={onCloseMobile}\n className=\"p-1 rounded-lg hover:bg-white/50 dark:hover:bg-neutral-700/50 text-gray-400 dark:text-neutral-500 hover:text-gray-700 dark:hover:text-neutral-200 transition-colors ml-auto\"\n >\n <CustomIcon icon=\"Close\" className=\"w-5 h-5\" />\n </button>\n )}\n </div>\n )}\n\n {/* Navigation Items */}\n <div className=\"flex-1 px-3 py-1 overflow-y-auto w-full [&::-webkit-scrollbar]:w-1.5 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-neutral-200 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-700 hover:[&::-webkit-scrollbar-thumb]:bg-neutral-300 dark:hover:[&::-webkit-scrollbar-thumb]:bg-neutral-600 [&::-webkit-scrollbar-track]:bg-transparent\">\n <nav className=\"space-y-1 w-full\">\n {visibleItems.map((item, index) => {\n // Divider\n if (item.type === \"divider\") {\n return (\n <div\n key={`divider-${index}`}\n className={`my-2 border-t border-gray-200/60 dark:border-neutral-700/60 ${isCollapsed && !isMobile ? \"mx-1\" : \"mx-0\"}`}\n />\n );\n }\n\n // Group Header\n if (item.type === \"group\") {\n if (isCollapsed && !isMobile) return null;\n return (\n <React.Fragment key={`group-${index}-${item.label}`}>\n {item.hasDivider && (\n <div\n className={`my-2 border-t border-gray-200/60 ${isCollapsed && !isMobile ? \"mx-1\" : \"mx-0\"}`}\n />\n )}\n <div\n className={`px-3 py-1 mb-1 text-xs font-semibold text-gray-400 dark:text-neutral-500 uppercase tracking-wider ${index === 0 ? \"mt-1\" : \"mt-4\"}`}\n >\n {item.label}\n </div>\n </React.Fragment>\n );\n }\n\n // Link (Default)\n const linkItem = item as SideMenuItemLink;\n const active = isActive(linkItem.path);\n const itemColor = linkItem.color || color;\n const tokens = getSideMenuColorTokens(itemColor);\n\n return (\n <Link\n key={linkItem.path}\n to={linkItem.path}\n onClick={() => mobileOpen && onCloseMobile?.()}\n title={isCollapsed && !isMobile ? linkItem.label : undefined}\n className={`relative group flex items-center px-3 py-2.5 text-sm font-medium rounded-lg transition-all duration-150 ${\n active\n ? `${tokens.bg} ${tokens.text} shadow-sm`\n : `text-gray-600 dark:text-neutral-400 ${tokens.hoverBg} ${tokens.hoverText}`\n } ${isCollapsed && !isMobile ? \"justify-center\" : \"\"}`}\n >\n {linkItem.icon && (\n <div\n className={`flex items-center justify-center relative shrink-0 ${isCollapsed && !isMobile ? \"\" : \"mr-3\"}`}\n >\n <CustomIcon\n icon={linkItem.icon}\n className={`h-5 w-5 transition-colors duration-150 ${active ? tokens.iconActive : `text-gray-400 dark:text-neutral-500 ${tokens.iconHover}`}`}\n />\n {/* Badge in collapsed mode: small dot over the icon */}\n {isCollapsed && !isMobile && linkItem.badge && (\n <span className=\"absolute -top-1 -right-1\">\n {linkItem.badge}\n </span>\n )}\n </div>\n )}\n {!(isCollapsed && !isMobile) && (\n <span className=\"whitespace-nowrap overflow-hidden text-ellipsis flex-1\">\n {linkItem.label}\n </span>\n )}\n {/* Badge in expanded mode: right-aligned next to label */}\n {!(isCollapsed && !isMobile) && linkItem.badge && (\n <span className=\"ml-auto shrink-0 pl-2\">\n {linkItem.badge}\n </span>\n )}\n </Link>\n );\n })}\n </nav>\n </div>\n\n {/* Collapse Toggle (desktop only) */}\n {!isMobile && (\n <div className=\"shrink-0 border-t border-gray-200/60 dark:border-neutral-700/60 px-3 py-3\">\n <button\n onClick={toggleCollapse}\n className={`flex items-center w-full px-3 py-2 text-sm font-medium rounded-lg text-gray-500 dark:text-neutral-400 hover:bg-gray-100 dark:hover:bg-neutral-700/50 hover:text-gray-700 dark:hover:text-neutral-200 transition-colors ${\n isCollapsed ? \"justify-center\" : \"\"\n }`}\n title={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n >\n <CustomIcon\n icon={isCollapsed ? \"ArrowChevronRight\" : \"ArrowChevronLeft\"}\n className=\"w-4 h-4 shrink-0\"\n />\n {!isCollapsed && (\n <span className=\"ml-3 whitespace-nowrap\">Collapse</span>\n )}\n </button>\n </div>\n )}\n </div>\n </>\n );\n\n return (\n <>\n {/* Mobile Backdrop */}\n {mobileOpen && (\n <div\n className=\"fixed inset-0 z-50 bg-black/20 backdrop-blur-sm md:hidden\"\n onClick={onCloseMobile}\n />\n )}\n\n {/* Mobile Sidebar */}\n <aside className={`${mobileClasses} ${className}`}>\n {renderContent(true)}\n </aside>\n\n {/* Desktop Sidebar */}\n <aside className={`${desktopClasses} ${className}`}>\n {renderContent(false)}\n </aside>\n </>\n );\n};\n\nexport default SideMenu;\n","import React, { useState } from \"react\";\nimport classNames from \"classnames\";\nimport SideMenu, { type SideMenuProps } from \"./SideMenu\";\nimport CustomIcon from \"./CustomIcon\";\nimport { SideMenuActionsProvider } from \"../contexts/SideMenuActionsContext\";\n\nexport interface SideMenuLayoutProps {\n /** Props passed to the SideMenu component (including color). */\n sideMenuProps: SideMenuProps;\n /** Content rendered in the fixed header bar at the top of the main area */\n header?: React.ReactNode;\n /** Main scrollable body content */\n children?: React.ReactNode;\n /** Additional class name for the root container */\n className?: string;\n /** Additional class name for the header section */\n headerClassName?: string;\n /** Additional class name for the scrollable body */\n bodyClassName?: string;\n /**\n * Per-item actions from the list/sidebar (e.g. edit/delete buttons for the active item).\n * Consumed by the header via `useSideMenuActions`.\n */\n sideItemActions?: React.ReactNode;\n /**\n * Actions from the detail/side panel (e.g. PageHeader action buttons).\n * Consumed by the header via `useSideMenuActions`.\n */\n sidePanelActions?: React.ReactNode;\n}\n\nexport const SideMenuLayout = ({\n sideMenuProps,\n header,\n children,\n className,\n headerClassName,\n bodyClassName,\n sideItemActions,\n sidePanelActions,\n}: SideMenuLayoutProps) => {\n const [collapsed, setCollapsed] = useState(sideMenuProps.collapsed ?? false);\n const [mobileOpen, setMobileOpen] = useState(false);\n\n const handleToggleCollapse = () => {\n if (sideMenuProps.onToggleCollapse) {\n sideMenuProps.onToggleCollapse();\n } else {\n setCollapsed((prev) => !prev);\n }\n };\n\n const isCollapsed = sideMenuProps.onToggleCollapse\n ? (sideMenuProps.collapsed ?? false)\n : collapsed;\n\n const handleCloseMobile = () => {\n if (sideMenuProps.onCloseMobile) {\n sideMenuProps.onCloseMobile();\n } else {\n setMobileOpen(false);\n }\n };\n\n const isMobileOpen = sideMenuProps.onCloseMobile\n ? (sideMenuProps.mobileOpen ?? false)\n : mobileOpen;\n\n return (\n <SideMenuActionsProvider\n initialSideItemActions={sideItemActions}\n initialSidePanelActions={sidePanelActions}\n >\n <div\n className={classNames(\n \"flex h-full w-full overflow-hidden bg-gray-50\",\n className,\n )}\n >\n {/* Side Menu */}\n <SideMenu\n {...sideMenuProps}\n collapsed={isCollapsed}\n onToggleCollapse={handleToggleCollapse}\n mobileOpen={isMobileOpen}\n onCloseMobile={handleCloseMobile}\n fullHeight\n />\n\n {/* Main Content Area */}\n <div className=\"flex flex-1 flex-col min-w-0 h-full\">\n {/* Mobile menu toggle */}\n <div className=\"md:hidden flex items-center px-4 py-2 border-b border-gray-200 bg-white\">\n <button\n onClick={() => setMobileOpen(true)}\n className=\"p-2 rounded-lg hover:bg-gray-100 text-gray-500\"\n aria-label=\"Open menu\"\n >\n <CustomIcon icon=\"ViewRows\" className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Header */}\n {header && (\n <div className={classNames(\"flex-shrink-0\", headerClassName)}>\n {header}\n </div>\n )}\n\n {/* Scrollable Body */}\n <main className={classNames(\"flex-1 overflow-y-auto\", bodyClassName)}>\n {children}\n </main>\n </div>\n </div>\n </SideMenuActionsProvider>\n );\n};\n\nexport default SideMenuLayout;\n","import React, { createContext, useCallback, useContext, useState } from \"react\";\n\nexport interface SideMenuActionsContextValue {\n /** Per-item / list actions (e.g. \"Add\" button in the list panel header). */\n sideItemActions?: React.ReactNode;\n /** Detail panel actions (e.g. PageHeader action buttons). */\n sidePanelActions?: React.ReactNode;\n /** Push new list/item actions into the header. Pass `undefined` to clear. */\n setSideItemActions: (actions: React.ReactNode | undefined) => void;\n /** Push new panel actions into the header. Pass `undefined` to clear. */\n setSidePanelActions: (actions: React.ReactNode | undefined) => void;\n}\n\nconst noop = () => {};\n\nconst SideMenuActionsContext = createContext<SideMenuActionsContextValue>({\n setSideItemActions: noop,\n setSidePanelActions: noop,\n});\n\nexport interface SideMenuActionsProviderProps {\n initialSideItemActions?: React.ReactNode;\n initialSidePanelActions?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport const SideMenuActionsProvider: React.FC<\n SideMenuActionsProviderProps\n> = ({ initialSideItemActions, initialSidePanelActions, children }) => {\n const [sideItemActions, setSideItemActionsState] = useState<React.ReactNode>(\n initialSideItemActions,\n );\n const [sidePanelActions, setSidePanelActionsState] =\n useState<React.ReactNode>(initialSidePanelActions);\n\n const setSideItemActions = useCallback(\n (actions: React.ReactNode | undefined) => {\n setSideItemActionsState(actions);\n },\n [],\n );\n\n const setSidePanelActions = useCallback(\n (actions: React.ReactNode | undefined) => {\n setSidePanelActionsState(actions);\n },\n [],\n );\n\n return (\n <SideMenuActionsContext.Provider\n value={{\n sideItemActions,\n sidePanelActions,\n setSideItemActions,\n setSidePanelActions,\n }}\n >\n {children}\n </SideMenuActionsContext.Provider>\n );\n};\n\nexport const useSideMenuActions = (): SideMenuActionsContextValue =>\n useContext(SideMenuActionsContext);\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport classNames from \"classnames\";\nimport { type TrueColor, getPillColorClasses } from \"../theme/Theme\";\nimport CustomIcon from \"./CustomIcon\";\nimport EmptyState from \"./EmptyState\";\nimport { type IconName } from \"../icons/registry\";\nimport { useResizable } from \"../hooks/useResizable\";\nimport Loader from \"./Loader\";\nimport IconButton from \"./IconButton\";\nimport SearchBar from \"./SearchBar\";\nimport HelpButton, { type HelpButtonProps } from \"./HelpButton\";\nimport Panel, { type PanelDecoration, type PanelVariant } from \"./Panel\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type SplitViewSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SplitViewItemBadge {\n label: React.ReactNode;\n tone?: TrueColor;\n variant?: \"solid\" | \"soft\" | \"outline\";\n}\n\nexport interface SplitViewItem {\n id: string;\n /** Primary label */\n label: React.ReactNode;\n /** Secondary line shown below the label */\n subtitle?: React.ReactNode;\n /** Badges/pills rendered after the subtitle */\n badges?: SplitViewItemBadge[];\n /** Content to render in the detail pane when this item is selected */\n panel: React.ReactNode;\n /** Disable selection */\n disabled?: boolean;\n /** Hide the item entirely */\n hidden?: boolean;\n /** Optional icon rendered before the label */\n icon?: IconName;\n /** Action buttons shown on the right side of the item row (visible on hover) */\n actions?: React.ReactNode;\n /** Extra content rendered below the item row when it is the active selection */\n subContent?: React.ReactNode;\n tags?: string[];\n /** When true, renders the item with an intense accent background and a pulsing dot to signal new content */\n highlight?: boolean;\n}\n\nexport type SplitViewHeaderSlot<T> = T | ((activeItem: SplitViewItem) => T);\n\nexport interface SplitViewHeaderDetails {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n description?: React.ReactNode;\n /** Right-aligned tag/badge area. Accepts any React node(s). */\n tags?: React.ReactNode;\n /**\n * Custom body content rendered as the Panel children.\n * When provided, it overrides title/subtitle/description/tags content.\n */\n headerBody?: React.ReactNode;\n tone?: TrueColor;\n variant?: PanelVariant;\n /** Alias for `variant` */\n variants?: PanelVariant;\n decoration?: PanelDecoration;\n /** Alias for `decoration` */\n decorations?: PanelDecoration;\n /** Optional divider between header row and details block (default: true). */\n bordered?: boolean;\n className?: string;\n}\n\nexport interface SplitViewPanelHeaderProps {\n /** Full icon node (left side) */\n icon?: SplitViewHeaderSlot<React.ReactNode>;\n /** Defaults to the active item's label when omitted */\n title?: SplitViewHeaderSlot<React.ReactNode>;\n subtitle?: SplitViewHeaderSlot<React.ReactNode>;\n /** Right side actions in the main row */\n actions?: SplitViewHeaderSlot<React.ReactNode>;\n /** Extra customizable content rendered between identity and search */\n body?: SplitViewHeaderSlot<React.ReactNode>;\n search?: SplitViewHeaderSlot<React.ReactNode>;\n searchWidth?: string;\n /** Second row, right-aligned actions */\n bottomActions?: SplitViewHeaderSlot<React.ReactNode>;\n /** Optional details block rendered below the header row and styled like a Panel. */\n headerDetails?: SplitViewHeaderSlot<\n SplitViewHeaderDetails | null | undefined\n >;\n /** Optional help button inserted after title */\n helper?: SplitViewHeaderSlot<HelpButtonProps | undefined>;\n border?: boolean;\n className?: string;\n}\n\nexport interface SplitViewProps {\n items: SplitViewItem[];\n /** Controlled selected id */\n value?: string;\n /** Uncontrolled default */\n defaultValue?: string;\n onChange?: (id: string, item: SplitViewItem) => void;\n\n /** Title shown above the item list (e.g. \"LIBRARIES (3)\") */\n listTitle?: React.ReactNode;\n /** Placeholder for the search input */\n searchPlaceholder?: string;\n /** Width of the list panel – Tailwind class (when not resizable) or initial px value for resizable */\n listWidth?: string;\n /** Accent color used for active item highlight */\n color?: TrueColor;\n size?: SplitViewSize;\n\n /** Deprecated: one visible item is now always shown as detail-only (list hidden). */\n autoHideList?: boolean;\n\n /** Allow collapsing the list panel */\n collapsible?: boolean;\n /** Controlled collapsed state */\n collapsed?: boolean;\n /** Uncontrolled initial collapsed state */\n defaultCollapsed?: boolean;\n /** Callback when collapsed state changes */\n onCollapsedChange?: (collapsed: boolean) => void;\n\n /** Allow drag-to-resize the list panel */\n resizable?: boolean;\n /** Minimum list width in px when resizable (default: 180) */\n minListWidth?: number;\n /** Maximum list width in px when resizable (default: 50% of container) */\n maxListWidth?: number;\n\n /** Extra class for the root container */\n className?: string;\n /** Extra class for the list panel */\n listClassName?: string;\n /** Extra class for the detail panel */\n panelClassName?: string;\n /** Content rendered above the detail panel (header area) */\n panelHeader?:\n | React.ReactNode\n | ((activeItem: SplitViewItem) => React.ReactNode);\n /**\n * Built-in SplitView header renderer (PageHeader-like) with support for dynamic slots.\n * When provided, this takes precedence over `panelHeader`.\n */\n panelHeaderProps?:\n | SplitViewPanelHeaderProps\n | ((\n activeItem: SplitViewItem,\n ) => SplitViewPanelHeaderProps | null | undefined);\n /** Rendered when no items match the search filter in the list */\n emptyState?: React.ReactNode;\n /** Action buttons rendered in the list header row (e.g. an \"Add\" button) */\n listActions?: React.ReactNode;\n /** Content shown in the detail panel when no item is selected. Defaults to a generic EmptyState. Pass `null` to render nothing. */\n panelEmptyState?: React.ReactNode | null;\n\n /** When true, shows a loading state instead of the normal content */\n loading?: boolean;\n /** Custom loading content. Defaults to a centered Spinner with \"Loading...\" label. */\n loadingState?: React.ReactNode;\n\n /** When truthy, shows an error state instead of the normal content. Pass a string to use as the error subtitle. */\n error?: React.ReactNode;\n /** Custom error content. Defaults to a danger-toned EmptyState. */\n errorState?: React.ReactNode;\n /** Callback for the default error state's retry button */\n onRetry?: () => void;\n\n /** When true, renders a left border on the SplitView container to visually separate it from adjacent content (e.g. a side menu) */\n borderLeft?: boolean;\n\n /**\n * When true (default), the detail panel body scrolls automatically — panels can render\n * content of any height and the wrapper handles overflow.\n * When false, the panel body uses `overflow-hidden` so that panels which manage their\n * own internal scroll (e.g. a sticky-header + scrollable table layout) fill the space\n * correctly without a double-scroll or broken `h-full` percentage height.\n */\n panelScrollable?: boolean;\n\n /**\n * When true (default), clicking a list item immediately opens its detail panel —\n * the current behaviour.\n * When false, clicking a row only highlights it; the detail panel only opens when\n * the user explicitly clicks the expand (→) button on that row.\n */\n autoExpand?: boolean;\n /** Controlled expanded id (only meaningful when autoExpand=false) */\n expandedValue?: string;\n /** Callback fired when the expanded item changes (only when autoExpand=false) */\n onExpand?: (id: string, item: SplitViewItem) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Style tokens */\n/* ------------------------------------------------------------------ */\n\nconst sizeTokens: Record<\n SplitViewSize,\n { item: string; label: string; subtitle: string; badge: string }\n> = {\n sm: {\n item: \"px-4 py-2.5\",\n label: \"text-sm\",\n subtitle: \"text-xs\",\n badge: \"text-[10px] px-1.5 py-0\",\n },\n md: {\n item: \"px-4 py-3\",\n label: \"text-sm\",\n subtitle: \"text-xs\",\n badge: \"text-[11px] px-2 py-0.5\",\n },\n lg: {\n item: \"px-5 py-4\",\n label: \"text-base\",\n subtitle: \"text-sm\",\n badge: \"text-xs px-2.5 py-0.5\",\n },\n};\n\nconst iconSizeClasses: Record<SplitViewSize, string> = {\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n};\n\ntype ActiveColorTokens = {\n bg: string;\n border: string;\n text: string;\n subtitle: string;\n resizer: string;\n};\n\n// All class names must be written out as full strings so Tailwind's JIT scanner can detect them.\nconst neutralActive: ActiveColorTokens = {\n bg: \"bg-neutral-100 dark:bg-neutral-800/40\",\n border: \"border-l-neutral-500\",\n text: \"text-neutral-900 dark:text-neutral-100\",\n subtitle: \"text-neutral-600 dark:text-neutral-400\",\n resizer: \"bg-neutral-400/40\",\n};\n\nconst activeColors: Record<TrueColor, ActiveColorTokens> = {\n red: {\n bg: \"bg-red-50 dark:bg-red-900/30\",\n border: \"border-l-red-600\",\n text: \"text-red-900 dark:text-red-100\",\n subtitle: \"text-red-600 dark:text-red-400\",\n resizer: \"bg-red-400\",\n },\n orange: {\n bg: \"bg-orange-50 dark:bg-orange-900/30\",\n border: \"border-l-orange-600\",\n text: \"text-orange-900 dark:text-orange-100\",\n subtitle: \"text-orange-600 dark:text-orange-400\",\n resizer: \"bg-orange-400\",\n },\n amber: {\n bg: \"bg-amber-50 dark:bg-amber-900/30\",\n border: \"border-l-amber-600\",\n text: \"text-amber-900 dark:text-amber-100\",\n subtitle: \"text-amber-600 dark:text-amber-400\",\n resizer: \"bg-amber-400\",\n },\n yellow: {\n bg: \"bg-yellow-50 dark:bg-yellow-900/30\",\n border: \"border-l-yellow-600\",\n text: \"text-yellow-900 dark:text-yellow-100\",\n subtitle: \"text-yellow-600 dark:text-yellow-400\",\n resizer: \"bg-yellow-400\",\n },\n lime: {\n bg: \"bg-lime-50 dark:bg-lime-900/30\",\n border: \"border-l-lime-600\",\n text: \"text-lime-900 dark:text-lime-100\",\n subtitle: \"text-lime-600 dark:text-lime-400\",\n resizer: \"bg-lime-400\",\n },\n green: {\n bg: \"bg-green-50 dark:bg-green-900/30\",\n border: \"border-l-green-600\",\n text: \"text-green-900 dark:text-green-100\",\n subtitle: \"text-green-600 dark:text-green-400\",\n resizer: \"bg-green-400\",\n },\n emerald: {\n bg: \"bg-emerald-50 dark:bg-emerald-900/30\",\n border: \"border-l-emerald-600\",\n text: \"text-emerald-900 dark:text-emerald-100\",\n subtitle: \"text-emerald-600 dark:text-emerald-400\",\n resizer: \"bg-emerald-400\",\n },\n teal: {\n bg: \"bg-teal-50 dark:bg-teal-900/30\",\n border: \"border-l-teal-600\",\n text: \"text-teal-900 dark:text-teal-100\",\n subtitle: \"text-teal-600 dark:text-teal-400\",\n resizer: \"bg-teal-400\",\n },\n cyan: {\n bg: \"bg-cyan-50 dark:bg-cyan-900/30\",\n border: \"border-l-cyan-600\",\n text: \"text-cyan-900 dark:text-cyan-100\",\n subtitle: \"text-cyan-600 dark:text-cyan-400\",\n resizer: \"bg-cyan-400\",\n },\n sky: {\n bg: \"bg-sky-50 dark:bg-sky-900/30\",\n border: \"border-l-sky-600\",\n text: \"text-sky-900 dark:text-sky-100\",\n subtitle: \"text-sky-600 dark:text-sky-400\",\n resizer: \"bg-sky-400\",\n },\n blue: {\n bg: \"bg-blue-50 dark:bg-blue-900/30\",\n border: \"border-l-blue-600\",\n text: \"text-blue-900 dark:text-blue-100\",\n subtitle: \"text-blue-600 dark:text-blue-400\",\n resizer: \"bg-blue-400\",\n },\n indigo: {\n bg: \"bg-indigo-50 dark:bg-indigo-900/30\",\n border: \"border-l-indigo-600\",\n text: \"text-indigo-900 dark:text-indigo-100\",\n subtitle: \"text-indigo-600 dark:text-indigo-400\",\n resizer: \"bg-indigo-400\",\n },\n violet: {\n bg: \"bg-violet-50 dark:bg-violet-900/30\",\n border: \"border-l-violet-600\",\n text: \"text-violet-900 dark:text-violet-100\",\n subtitle: \"text-violet-600 dark:text-violet-400\",\n resizer: \"bg-violet-400\",\n },\n purple: {\n bg: \"bg-purple-50 dark:bg-purple-900/30\",\n border: \"border-l-purple-600\",\n text: \"text-purple-900 dark:text-purple-100\",\n subtitle: \"text-purple-600 dark:text-purple-400\",\n resizer: \"bg-purple-400\",\n },\n fuchsia: {\n bg: \"bg-fuchsia-50 dark:bg-fuchsia-900/30\",\n border: \"border-l-fuchsia-600\",\n text: \"text-fuchsia-900 dark:text-fuchsia-100\",\n subtitle: \"text-fuchsia-600 dark:text-fuchsia-400\",\n resizer: \"bg-fuchsia-400\",\n }, rose: {\n bg: \"bg-rose-50 dark:bg-rose-900/30\",\n border: \"border-l-rose-600\",\n text: \"text-rose-900 dark:text-rose-100\",\n subtitle: \"text-rose-600 dark:text-rose-400\",\n resizer: \"bg-rose-400\",\n },\n slate: {\n bg: \"bg-slate-50 dark:bg-slate-900/30\",\n border: \"border-l-slate-600\",\n text: \"text-slate-900 dark:text-slate-100\",\n subtitle: \"text-slate-600 dark:text-slate-400\",\n resizer: \"bg-slate-400\",\n },\n gray: {\n bg: \"bg-gray-50 dark:bg-gray-900/30\",\n border: \"border-l-gray-600\",\n text: \"text-gray-900 dark:text-gray-100\",\n subtitle: \"text-gray-600 dark:text-gray-400\",\n resizer: \"bg-gray-400\",\n },\n zinc: {\n bg: \"bg-zinc-50 dark:bg-zinc-900/30\",\n border: \"border-l-zinc-600\",\n text: \"text-zinc-900 dark:text-zinc-100\",\n subtitle: \"text-zinc-600 dark:text-zinc-400\",\n resizer: \"bg-zinc-400\",\n },\n neutral: neutralActive,\n stone: neutralActive,\n};\n\ntype HighlightTokens = { bg: string; dot: string };\n\nconst neutralHighlight: HighlightTokens = {\n bg: \"bg-neutral-100 dark:bg-neutral-700/50\",\n dot: \"bg-neutral-500\",\n};\n\n// All class names are written as full strings so Tailwind's JIT scanner can detect them.\nconst highlightColors: Record<TrueColor, HighlightTokens> = {\n red: { bg: \"bg-red-100 dark:bg-red-900/50\", dot: \"bg-red-500\" },\n orange: { bg: \"bg-orange-100 dark:bg-orange-900/50\", dot: \"bg-orange-500\" },\n amber: { bg: \"bg-amber-100 dark:bg-amber-900/50\", dot: \"bg-amber-500\" },\n yellow: { bg: \"bg-yellow-100 dark:bg-yellow-900/50\", dot: \"bg-yellow-500\" },\n lime: { bg: \"bg-lime-100 dark:bg-lime-900/50\", dot: \"bg-lime-500\" },\n green: { bg: \"bg-green-100 dark:bg-green-900/50\", dot: \"bg-green-500\" },\n emerald: {\n bg: \"bg-emerald-100 dark:bg-emerald-900/50\",\n dot: \"bg-emerald-500\",\n },\n teal: { bg: \"bg-teal-100 dark:bg-teal-900/50\", dot: \"bg-teal-500\" },\n cyan: { bg: \"bg-cyan-100 dark:bg-cyan-900/50\", dot: \"bg-cyan-500\" },\n sky: { bg: \"bg-sky-100 dark:bg-sky-900/50\", dot: \"bg-sky-500\" },\n blue: { bg: \"bg-blue-100 dark:bg-blue-900/50\", dot: \"bg-blue-500\" },\n indigo: { bg: \"bg-indigo-100 dark:bg-indigo-900/50\", dot: \"bg-indigo-500\" },\n violet: { bg: \"bg-violet-100 dark:bg-violet-900/50\", dot: \"bg-violet-500\" },\n purple: { bg: \"bg-purple-100 dark:bg-purple-900/50\", dot: \"bg-purple-500\" },\n fuchsia: {\n bg: \"bg-fuchsia-100 dark:bg-fuchsia-900/50\",\n dot: \"bg-fuchsia-500\",\n },\n rose: { bg: \"bg-rose-100 dark:bg-rose-900/50\", dot: \"bg-rose-500\" },\n slate: { bg: \"bg-slate-100 dark:bg-slate-800/50\", dot: \"bg-slate-500\" },\n gray: { bg: \"bg-gray-100 dark:bg-gray-800/50\", dot: \"bg-gray-500\" },\n zinc: { bg: \"bg-zinc-100 dark:bg-zinc-800/50\", dot: \"bg-zinc-500\" },\n neutral: neutralHighlight,\n stone: neutralHighlight,\n};\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nconst SplitView: React.FC<SplitViewProps> = ({\n items,\n value,\n defaultValue,\n onChange,\n listTitle,\n searchPlaceholder = \"Search...\",\n listWidth,\n color = \"blue\",\n size = \"md\",\n autoHideList = true,\n collapsible = false,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n resizable = false,\n minListWidth = 180,\n maxListWidth: maxListWidthProp,\n className,\n listClassName,\n panelClassName,\n panelHeader,\n panelHeaderProps,\n emptyState,\n listActions,\n panelEmptyState,\n loading = false,\n loadingState,\n error,\n errorState,\n onRetry,\n borderLeft = false,\n autoExpand = true,\n expandedValue,\n onExpand,\n panelScrollable = true,\n}) => {\n const visibleItems = useMemo(() => items.filter((i) => !i.hidden), [items]);\n const isSingleVisibleItem = visibleItems.length === 1;\n const isNoVisibleItems = visibleItems.length === 0;\n // Single-item mode is now always detail-only; keep autoHideList reference for backward compatibility.\n const shouldHideList =\n isSingleVisibleItem ||\n (autoHideList && visibleItems.length === 1) ||\n isNoVisibleItems;\n const [internalValue, setInternalValue] = useState<string | undefined>(\n defaultValue ?? visibleItems[0]?.id,\n );\n const activeId = value ?? internalValue;\n\n // When autoExpand=false, the detail panel is driven by a separate \"expanded\" id.\n // When autoExpand=true it always mirrors activeId.\n const [internalExpandedId, setInternalExpandedId] = useState<\n string | undefined\n >(autoExpand ? (defaultValue ?? visibleItems[0]?.id) : undefined);\n const expandedId = autoExpand\n ? activeId\n : (expandedValue ?? internalExpandedId);\n\n const [filter, setFilter] = useState(\"\");\n\n /* ---- Collapse state (controlled / uncontrolled) ---- */\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const isCollapsedControlled = typeof controlledCollapsed === \"boolean\";\n const isCollapsed =\n collapsible &&\n !shouldHideList &&\n (isCollapsedControlled ? controlledCollapsed : internalCollapsed);\n\n const toggleCollapsed = useCallback(() => {\n const next = !isCollapsed;\n if (!isCollapsedControlled) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n }, [isCollapsed, isCollapsedControlled, onCollapsedChange]);\n\n /* ---- Resizable ---- */\n const containerRef = useRef<HTMLDivElement>(null);\n\n const getMaxWidth = useCallback(() => {\n if (maxListWidthProp) return maxListWidthProp;\n if (containerRef.current)\n return Math.floor(containerRef.current.offsetWidth * 0.5);\n return 600;\n }, [maxListWidthProp]);\n\n const initialPxWidth = listWidth ? parseInt(listWidth, 10) : 288; // 288px = w-72\n const validInitialWidth = isNaN(initialPxWidth) ? 288 : initialPxWidth;\n\n const {\n width: resizableWidth,\n isDragging,\n handleProps,\n } = useResizable({\n initialWidth: validInitialWidth,\n minWidth: minListWidth,\n maxWidth: getMaxWidth,\n enabled: resizable && !isCollapsed && !shouldHideList,\n });\n\n // Keep selection in sync when items change\n useEffect(() => {\n if (value !== undefined) return;\n if (!visibleItems.some((i) => i.id === internalValue)) {\n setInternalValue(visibleItems[0]?.id);\n }\n }, [visibleItems, value, internalValue]);\n\n useEffect(() => {\n if (shouldHideList && visibleItems[0] && activeId !== visibleItems[0].id) {\n if (value === undefined) {\n setInternalValue(visibleItems[0].id);\n }\n }\n }, [shouldHideList, visibleItems, activeId, value]);\n\n const filteredItems = useMemo(() => {\n if (!filter) return visibleItems;\n const lower = filter.toLowerCase();\n return visibleItems.filter((item) => {\n const labelText = typeof item.label === \"string\" ? item.label : \"\";\n const subtitleText =\n typeof item.subtitle === \"string\" ? item.subtitle : \"\";\n return (\n labelText.toLowerCase().includes(lower) ||\n subtitleText.toLowerCase().includes(lower)\n );\n });\n }, [visibleItems, filter]);\n\n // The right-hand detail panel always follows the selected row (activeId), in both modes.\n // expandedId is only used to control subContent (inline expansion) when autoExpand=false.\n const activeItem = visibleItems.find((i) => i.id === activeId);\n\n const tokens = sizeTokens[size];\n const accent = activeColors[color];\n const highlightAccent = highlightColors[color];\n const resizerColor = accent.resizer;\n\n const handleSelect = (item: SplitViewItem) => {\n if (item.disabled) return;\n if (value === undefined) {\n setInternalValue(item.id);\n }\n onChange?.(item.id, item);\n };\n\n const handleExpand = (item: SplitViewItem) => {\n if (item.disabled) return;\n const isAlreadyExpanded = expandedId === item.id;\n if (isAlreadyExpanded) {\n // Collapse\n if (expandedValue === undefined) setInternalExpandedId(undefined);\n onExpand?.(item.id, item);\n return;\n }\n // Expand — also select the item\n if (value === undefined) setInternalValue(item.id);\n onChange?.(item.id, item);\n if (expandedValue === undefined) setInternalExpandedId(item.id);\n onExpand?.(item.id, item);\n };\n\n const listWidthClass = listWidth ?? \"w-72\";\n\n const renderBadge = (badge: SplitViewItemBadge, idx: number) => {\n const pillTokens = getPillColorClasses(\n badge.tone ?? \"sky\",\n badge.variant ?? \"soft\",\n );\n return (\n <span\n key={idx}\n className={classNames(\n \"inline-flex items-center rounded-full font-medium leading-none\",\n tokens.badge,\n pillTokens.base,\n pillTokens.border,\n )}\n >\n {badge.label}\n </span>\n );\n };\n\n const resolveHeaderSlot = <T,>(\n slot: SplitViewHeaderSlot<T> | undefined,\n item: SplitViewItem,\n ): T | undefined => {\n if (typeof slot === \"function\") {\n return (slot as (activeItem: SplitViewItem) => T)(item);\n }\n return slot;\n };\n\n const renderBuiltInHeader = (\n item: SplitViewItem,\n options?: { promoteItemActions?: boolean },\n ) => {\n if (panelHeaderProps === undefined) return null;\n\n const headerProps =\n typeof panelHeaderProps === \"function\"\n ? panelHeaderProps(item)\n : panelHeaderProps;\n if (!headerProps) return null;\n\n const icon = resolveHeaderSlot(headerProps.icon, item);\n const title = resolveHeaderSlot(headerProps.title, item) ?? item.label;\n const subtitle = resolveHeaderSlot(headerProps.subtitle, item);\n const body = resolveHeaderSlot(headerProps.body, item);\n const search = resolveHeaderSlot(headerProps.search, item);\n const helper = resolveHeaderSlot(headerProps.helper, item);\n const bottomActions = resolveHeaderSlot(headerProps.bottomActions, item);\n const headerDetails = resolveHeaderSlot(headerProps.headerDetails, item);\n const customActions = resolveHeaderSlot(headerProps.actions, item);\n const promotedActions = options?.promoteItemActions\n ? item.actions\n : undefined;\n const promotedListActions = options?.promoteItemActions\n ? listActions\n : undefined;\n const mergedActions =\n customActions || promotedActions || promotedListActions ? (\n <>\n {customActions}\n {promotedActions}\n {promotedListActions}\n </>\n ) : undefined;\n const border = headerProps.border ?? true;\n const detailsVariant =\n headerDetails?.variant ?? headerDetails?.variants ?? \"subtle\";\n const detailsDecoration =\n headerDetails?.decoration ?? headerDetails?.decorations ?? \"none\";\n const detailsTone = headerDetails?.tone ?? \"neutral\";\n const hasCustomHeaderBody =\n headerDetails?.headerBody !== undefined &&\n headerDetails?.headerBody !== null;\n const hasHeaderDetailsContent = Boolean(\n hasCustomHeaderBody ||\n headerDetails?.title ||\n headerDetails?.subtitle ||\n headerDetails?.description ||\n headerDetails?.tags,\n );\n const isDetailsBordered = headerDetails?.bordered ?? true;\n\n return (\n <div className={classNames(\"flex-none\", border, headerProps.className)}>\n <div className=\"flex items-center gap-3 px-4 py-3\">\n {icon && <div className=\"shrink-0\">{icon}</div>}\n <div className=\"flex-1 min-w-0\">\n <h2 className=\"flex items-center gap-1 text-sm font-semibold text-neutral-900 dark:text-neutral-100 truncate\">\n <span>{title}</span>\n {helper && <HelpButton {...helper} />}\n </h2>\n {subtitle && (\n <p className=\"mt-0.5 text-xs text-neutral-500 dark:text-neutral-400 truncate\">\n {subtitle}\n </p>\n )}\n </div>\n {body && <div className=\"shrink-0\">{body}</div>}\n {search && (\n <div className={classNames(\"shrink-0\", headerProps.searchWidth)}>\n {search}\n </div>\n )}\n {mergedActions && (\n <div className=\"flex items-center gap-1 shrink-0\">\n {mergedActions}\n </div>\n )}\n </div>\n {bottomActions && (\n <div className=\"flex items-center justify-end gap-2 px-4 pb-3\">\n {bottomActions}\n </div>\n )}\n {headerDetails && hasHeaderDetailsContent && (\n <div\n className={classNames(\n isDetailsBordered &&\n \"border-t border-b border-neutral-200 dark:border-neutral-700\",\n )}\n >\n <Panel\n variant={detailsVariant}\n tone={detailsTone}\n decoration={detailsDecoration}\n corner=\"none\"\n padding=\"none\"\n className={classNames(\n \"w-full shadow-none px-3 py-4\",\n headerDetails.className,\n )}\n >\n {hasCustomHeaderBody ? (\n headerDetails.headerBody\n ) : (\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n {headerDetails.title && (\n <div className=\"text-[10px] font-semibold uppercase tracking-[0.16em] text-neutral-500 dark:text-neutral-400\">\n {headerDetails.title}\n </div>\n )}\n {headerDetails.subtitle && (\n <div className=\"mt-1 text-sm font-semibold text-neutral-900 dark:text-neutral-100\">\n {headerDetails.subtitle}\n </div>\n )}\n {headerDetails.description && (\n <div className=\"mt-1 text-[12px] text-neutral-600 dark:text-neutral-400\">\n {headerDetails.description}\n </div>\n )}\n </div>\n {headerDetails.tags && (\n <div className=\"flex items-center justify-end gap-2 flex-wrap\">\n {headerDetails.tags}\n </div>\n )}\n </div>\n )}\n </Panel>\n </div>\n )}\n </div>\n );\n };\n\n const renderPanelHeader = (\n item: SplitViewItem,\n options?: { promoteItemActions?: boolean },\n ) => {\n if (panelHeaderProps !== undefined) {\n return renderBuiltInHeader(item, options);\n }\n if (!panelHeader) return null;\n return typeof panelHeader === \"function\" ? panelHeader(item) : panelHeader;\n };\n const singleItem = shouldHideList ? visibleItems[0] : undefined;\n const singleHeader = singleItem\n ? renderPanelHeader(singleItem, { promoteItemActions: true })\n : null;\n const activeHeader = activeItem\n ? renderPanelHeader(activeItem, { promoteItemActions: false })\n : null;\n\n /* ---- List panel width ---- */\n const listPanelStyle: React.CSSProperties | undefined = isCollapsed\n ? { width: 48 }\n : resizable\n ? { width: resizableWidth }\n : undefined;\n\n const listPanelWidthClass =\n isCollapsed || resizable ? undefined : listWidthClass;\n\n /* ---- Overlay helper ---- */\n const renderOverlay = () => {\n if (loading) {\n return (\n <div className=\"absolute inset-0 z-50 flex items-center justify-center rounded-[inherit] bg-white/60 backdrop-blur-md dark:bg-neutral-900/50\">\n {loadingState ?? (\n <Loader\n size=\"lg\"\n label=\"Please wait...\"\n color={color}\n variant=\"spinner\"\n title=\"Loading...\"\n spinnerThickness=\"thick\"\n spinnerVariant=\"segments\"\n />\n )}\n </div>\n );\n }\n if (error) {\n return (\n <div className=\"absolute inset-0 z-40 flex items-center justify-center rounded-[inherit] bg-white/60 backdrop-blur-md p-6 dark:bg-neutral-900/50\">\n {errorState ?? (\n <EmptyState\n icon=\"Error\"\n title=\"Something went wrong\"\n subtitle={\n typeof error === \"string\"\n ? error\n : \"An unexpected error occurred.\"\n }\n showIcon\n actionLabel={onRetry ? \"Retry\" : undefined}\n onAction={onRetry}\n actionVariant=\"solid\"\n actionColor={color}\n disableBorder\n transparentBackground\n iconColor=\"rose\"\n size=\"lg\"\n />\n )}\n </div>\n );\n }\n return null;\n };\n\n /* ---- Auto-hide: just render the detail panel ---- */\n if (shouldHideList) {\n return (\n <div\n className={classNames(\n \"relative flex h-full min-h-0 overflow-hidden\",\n borderLeft && \"border-l border-gray-200 dark:border-gray-700\",\n className,\n )}\n >\n {renderOverlay()}\n <div\n className={classNames(\n \"flex flex-1 flex-col min-w-0 h-full overflow-hidden\",\n panelClassName,\n )}\n >\n {singleItem ? (\n <>\n {singleHeader ? (\n <div className=\"shrink-0\">{singleHeader}</div>\n ) : listActions ? (\n <div className=\"shrink-0 flex items-center justify-end gap-1 px-4 py-2 border-b border-neutral-200 dark:border-neutral-700\">\n {listActions}\n </div>\n ) : null}\n <div\n className={classNames(\n \"flex-1\",\n panelScrollable ? \"overflow-y-auto\" : \"overflow-hidden\",\n )}\n >\n {singleItem.panel}\n </div>\n </>\n ) : (\n panelEmptyState !== null && (\n <div className=\"flex flex-1 items-center justify-center p-6\">\n {panelEmptyState ?? (\n <EmptyState\n icon=\"Info\"\n title=\"No items\"\n subtitle=\"There are no items to display.\"\n showIcon\n disableBorder\n color={color}\n />\n )}\n </div>\n )\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className={classNames(\n \"relative flex h-full min-h-0 overflow-hidden\",\n borderLeft && \"border-l border-gray-200 dark:border-gray-700\",\n className,\n )}\n >\n {renderOverlay()}\n {/* ---- List Panel ---- */}\n <div\n style={listPanelStyle}\n className={classNames(\n \"flex flex-col shrink-0 border-r border-gray-200 dark:border-gray-700 bg-gray-50/80 dark:bg-gray-900/80 h-full overflow-hidden\",\n isCollapsed && \"transition-[width] duration-300 ease-in-out\",\n listPanelWidthClass,\n listClassName,\n )}\n >\n {isCollapsed ? (\n /* ---- Collapsed: just an expand button ---- */\n <div className=\"flex items-center justify-center pt-3\">\n <IconButton\n tooltip=\"Expand View\"\n icon=\"ArrowChevronRight\"\n variant=\"ghost\"\n color={color}\n size=\"xs\"\n onClick={toggleCollapsed}\n aria-label=\"Expand list\"\n />\n </div>\n ) : (\n <>\n {/* Title + Actions */}\n {(listTitle || listActions || collapsible) && (\n <div className=\"shrink-0 px-4 pt-4 pb-2 flex items-center justify-between gap-2\">\n {listTitle && (\n <h3 className=\"text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider\">\n {listTitle}\n </h3>\n )}\n <div className=\"flex items-center gap-1 ml-auto\">\n {listActions}\n {collapsible && (\n <IconButton\n tooltip=\"Collapse View\"\n icon=\"ArrowChevronLeft\"\n variant=\"ghost\"\n color={color}\n size=\"xs\"\n onClick={toggleCollapsed}\n aria-label=\"Collapse list\"\n />\n )}\n </div>\n </div>\n )}\n\n {/* Search — hidden when only one item since there is nothing to filter */}\n {visibleItems.length > 1 && (\n <div className=\"shrink-0 px-3 pb-2 pt-1\">\n <SearchBar\n placeholder={searchPlaceholder}\n variant=\"gradient\"\n glowIntensity=\"subtle\"\n color={color}\n onSearch={setFilter}\n />\n </div>\n )}\n\n {/* Item list */}\n <div className=\"flex-1 overflow-y-auto\">\n {filteredItems.length === 0 ? (\n <div className=\"px-4 py-6 text-center text-sm text-gray-400 dark:text-gray-500\">\n {emptyState ?? \"No items found\"}\n </div>\n ) : (\n filteredItems.map((item) => {\n const isActive = item.id === activeId;\n const isExpanded = item.id === expandedId;\n const hasExpandControl =\n !autoExpand && item.subContent !== undefined;\n return (\n <div key={item.id}>\n {/* Row wrapper – uses a div so that action/expand buttons inside are not nested buttons */}\n <div\n role=\"button\"\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n onClick={() => {\n if (!item.disabled) handleSelect(item);\n }}\n onKeyDown={(e) => {\n if (\n !item.disabled &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n handleSelect(item);\n }\n }}\n className={classNames(\n \"group/item w-full text-left border-l-3 transition-all duration-150 outline-none cursor-default\",\n item.disabled &&\n \"opacity-50 cursor-not-allowed pointer-events-none\",\n tokens.item,\n isActive\n ? classNames(\n accent.bg,\n accent.border,\n \"border-l-[3px]\",\n )\n : item.highlight\n ? classNames(\n highlightAccent.bg,\n accent.border,\n \"border-l-[3px]\",\n )\n : \"border-l-[3px] border-l-transparent hover:bg-gray-100/80 dark:hover:bg-gray-800/60\",\n )}\n >\n <div className=\"flex items-start gap-2 min-w-0\">\n {/* Item content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex min-w-0 items-start gap-2\">\n {item.icon && (\n <div className=\"flex items-start\">\n <CustomIcon\n icon={item.icon}\n className={classNames(\n \"shrink-0\",\n iconSizeClasses[size],\n )}\n />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div\n className={classNames(\n \"font-semibold leading-tight truncate\",\n tokens.label,\n isActive || item.highlight\n ? accent.text\n : \"text-gray-900 dark:text-gray-100\",\n )}\n >\n {item.label}\n </div>\n {item.subtitle && (\n <div\n className={classNames(\n \"mt-0.5 leading-tight truncate\",\n tokens.subtitle,\n isActive\n ? accent.subtitle\n : \"text-gray-500 dark:text-gray-400\",\n )}\n >\n {item.subtitle}\n </div>\n )}\n {item.badges && item.badges.length > 0 && (\n <div className=\"mt-1.5 flex flex-wrap gap-1.5\">\n {item.badges.map((badge, idx) =>\n renderBadge(badge, idx),\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n {/* Right rail order: actions, highlight dot, expand/collapse */}\n {(item.actions ||\n hasExpandControl ||\n item.highlight) && (\n <div className=\"shrink-0 flex items-center gap-0.5\">\n {item.actions && (\n <div\n className=\"flex items-center gap-0.5 opacity-0 group-hover/item:opacity-100 transition-opacity duration-150\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {item.actions}\n </div>\n )}\n {item.highlight && (\n <span\n className={classNames(\n \"h-2 w-2 shrink-0 rounded-full\",\n highlightAccent.dot,\n !isActive && \"animate-pulse\",\n )}\n />\n )}\n {/* Expand button – only when autoExpand=false */}\n {hasExpandControl && (\n <div\n className=\"flex items-center\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => handleExpand(item)}\n title={\n isExpanded\n ? \"Collapse details\"\n : \"Expand details\"\n }\n aria-label={\n isExpanded\n ? \"Collapse details\"\n : \"Expand details\"\n }\n aria-expanded={isExpanded}\n className={classNames(\n \"rounded p-1 transition-colors duration-150\",\n isExpanded\n ? classNames(accent.text, \"opacity-100\")\n : \"text-gray-400 opacity-0 group-hover/item:opacity-100 hover:text-gray-700 dark:hover:text-gray-200\",\n )}\n >\n <svg\n className={classNames(\n \"h-4 w-4 transition-transform duration-200 ease-in-out\",\n isExpanded ? \"rotate-90\" : \"rotate-0\",\n )}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n {item.subContent !== undefined && (\n <div\n className={classNames(\n \"grid transition-[grid-template-rows,opacity] duration-300 ease-in-out\",\n // When autoExpand=false, subContent is gated by the expand button (isExpanded),\n // not by row selection (isActive) — fixes both the auto-expand and sticky-collapse bugs.\n (autoExpand ? isActive : isExpanded)\n ? \"grid-rows-[1fr] opacity-100\"\n : \"grid-rows-[0fr] opacity-0\",\n )}\n >\n <div className=\"overflow-hidden\">\n <div\n className={classNames(\n \"border-l-[3px]\",\n (autoExpand ? isActive : isExpanded)\n ? accent.border\n : \"border-l-transparent\",\n )}\n >\n {item.subContent}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n </>\n )}\n </div>\n\n {/* ---- Resize Handle ---- */}\n {resizable && !isCollapsed && (\n <div\n {...handleProps}\n className={classNames(\n \"w-1.5 shrink-0 cursor-col-resize transition-all duration-150\",\n resizerColor,\n isDragging\n ? \"opacity-100\"\n : \"opacity-0 hover:opacity-30 active:opacity-100\",\n )}\n />\n )}\n\n {/* ---- Detail Panel ---- */}\n <div\n className={classNames(\n \"flex flex-1 flex-col min-w-0 h-full bg-white overflow-hidden\",\n panelClassName,\n )}\n >\n {activeItem ? (\n <>\n {/* Panel Header */}\n {activeHeader && <div className=\"shrink-0\">{activeHeader}</div>}\n {/* Panel Body */}\n <div\n className={classNames(\n \"flex-1\",\n panelScrollable ? \"overflow-y-auto\" : \"overflow-hidden\",\n )}\n >\n {activeItem.panel}\n </div>\n </>\n ) : (\n panelEmptyState !== null && (\n <div className=\"flex flex-1 items-center justify-center p-6\">\n {panelEmptyState ?? (\n <EmptyState\n icon=\"Info\"\n title=\"No item selected\"\n subtitle=\"Select an item from the list to view its details.\"\n showIcon\n disableBorder\n color={color}\n />\n )}\n </div>\n )\n )}\n </div>\n </div>\n );\n};\n\nSplitView.displayName = \"SplitView\";\n\nexport default SplitView;\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UseResizableOptions {\n /** Initial width in pixels */\n initialWidth: number;\n /** Minimum width in pixels */\n minWidth?: number;\n /** Maximum width in pixels (or function returning max) */\n maxWidth?: number | (() => number);\n /** Called on every resize frame */\n onResize?: (width: number) => void;\n /** Called when drag ends */\n onResizeEnd?: (width: number) => void;\n /** Whether resizing is enabled */\n enabled?: boolean;\n}\n\nexport interface UseResizableReturn {\n /** Current width in pixels */\n width: number;\n /** Whether the user is currently dragging */\n isDragging: boolean;\n /** Props to spread onto the resize handle element */\n handleProps: {\n onPointerDown: (e: React.PointerEvent) => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n role: \"separator\";\n \"aria-orientation\": \"vertical\";\n \"aria-valuenow\": number;\n \"aria-valuemin\": number;\n \"aria-valuemax\": number;\n tabIndex: number;\n };\n}\n\nexport function useResizable({\n initialWidth,\n minWidth = 100,\n maxWidth: maxWidthOpt = 600,\n onResize,\n onResizeEnd,\n enabled = true,\n}: UseResizableOptions): UseResizableReturn {\n const [width, setWidth] = useState(initialWidth);\n const [isDragging, setIsDragging] = useState(false);\n const startXRef = useRef(0);\n const startWidthRef = useRef(0);\n\n const getMaxWidth = useCallback(() => {\n return typeof maxWidthOpt === \"function\" ? maxWidthOpt() : maxWidthOpt;\n }, [maxWidthOpt]);\n\n const clamp = useCallback(\n (value: number) => Math.max(minWidth, Math.min(getMaxWidth(), value)),\n [minWidth, getMaxWidth],\n );\n\n useEffect(() => {\n if (!isDragging) return;\n\n const handlePointerMove = (e: PointerEvent) => {\n const delta = e.clientX - startXRef.current;\n const newWidth = clamp(startWidthRef.current + delta);\n setWidth(newWidth);\n onResize?.(newWidth);\n };\n\n const handlePointerUp = () => {\n setIsDragging(false);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n setWidth((w) => {\n onResizeEnd?.(w);\n return w;\n });\n };\n\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n\n document.addEventListener(\"pointermove\", handlePointerMove);\n document.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n document.removeEventListener(\"pointermove\", handlePointerMove);\n document.removeEventListener(\"pointerup\", handlePointerUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n }, [isDragging, clamp, onResize, onResizeEnd]);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n startXRef.current = e.clientX;\n startWidthRef.current = width;\n setIsDragging(true);\n },\n [enabled, width],\n );\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!enabled) return;\n const step = 20;\n let newWidth = width;\n if (e.key === \"ArrowRight\") {\n newWidth = clamp(width + step);\n } else if (e.key === \"ArrowLeft\") {\n newWidth = clamp(width - step);\n } else {\n return;\n }\n e.preventDefault();\n setWidth(newWidth);\n onResize?.(newWidth);\n onResizeEnd?.(newWidth);\n },\n [enabled, width, clamp, onResize, onResizeEnd],\n );\n\n const resolvedMax = getMaxWidth();\n\n return {\n width,\n isDragging,\n handleProps: {\n onPointerDown,\n onKeyDown,\n role: \"separator\" as const,\n \"aria-orientation\": \"vertical\" as const,\n \"aria-valuenow\": width,\n \"aria-valuemin\": minWidth,\n \"aria-valuemax\": resolvedMax,\n tabIndex: enabled ? 0 : -1,\n },\n };\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport type { Components } from \"react-markdown\";\nimport classNames from \"classnames\";\nimport IconButton from \"./IconButton\";\nimport CustomIcon from \"./CustomIcon\";\nimport type { TrueColor } from \"../theme/Theme\";\nimport type { IconName } from \"../icons/registry\";\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport type HelpButtonPlacement = \"top\" | \"bottom\" | \"left\" | \"right\" | \"auto\";\n\nexport interface HelpButtonProps {\n /**\n * Help content to display in the panel.\n * Pass a `string` to render as Markdown (tables and URLs supported).\n * Pass a `ReactNode` to render arbitrary JSX directly.\n */\n content: string | React.ReactNode;\n /** Optional title shown in the panel header. Defaults to \"Help\". */\n title?: React.ReactNode;\n /**\n * Preferred placement of the floating panel relative to the trigger button.\n * \"auto\" (default) picks the side with the most available space.\n */\n placement?: HelpButtonPlacement;\n /** Accent color for the trigger button and the panel header stripe. */\n color?: TrueColor;\n /** Size of the trigger icon button. */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n /** Icon for the trigger button. Defaults to \"Help\". */\n icon?: IconName;\n /** Maximum width of the floating panel in px. Defaults to 360. */\n maxWidth?: number;\n /** Extra class applied to the root wrapper. */\n className?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tone tokens (header stripe + accent text + icon bg) */\n/* ------------------------------------------------------------------ */\n\ntype ToneTokens = { strip: string; accent: string; iconBg: string };\n\nconst toneMap: Partial<Record<TrueColor, ToneTokens>> = {\n blue: {\n strip: \"border-t-blue-500 bg-blue-50/70 dark:bg-blue-950/40\",\n accent: \"text-blue-700 dark:text-blue-300\",\n iconBg: \"bg-blue-100/80 dark:bg-blue-900/40\",\n },\n indigo: {\n strip: \"border-t-indigo-500 bg-indigo-50/70 dark:bg-indigo-950/40\",\n accent: \"text-indigo-700 dark:text-indigo-300\",\n iconBg: \"bg-indigo-100/80 dark:bg-indigo-900/40\",\n },\n violet: {\n strip: \"border-t-violet-500 bg-violet-50/70 dark:bg-violet-950/40\",\n accent: \"text-violet-700 dark:text-violet-300\",\n iconBg: \"bg-violet-100/80 dark:bg-violet-900/40\",\n },\n sky: {\n strip: \"border-t-sky-500 bg-sky-50/70 dark:bg-sky-950/40\",\n accent: \"text-sky-700 dark:text-sky-300\",\n iconBg: \"bg-sky-100/80 dark:bg-sky-900/40\",\n },\n cyan: {\n strip: \"border-t-cyan-500 bg-cyan-50/70 dark:bg-cyan-950/40\",\n accent: \"text-cyan-700 dark:text-cyan-300\",\n iconBg: \"bg-cyan-100/80 dark:bg-cyan-900/40\",\n },\n teal: {\n strip: \"border-t-teal-500 bg-teal-50/70 dark:bg-teal-950/40\",\n accent: \"text-teal-700 dark:text-teal-300\",\n iconBg: \"bg-teal-100/80 dark:bg-teal-900/40\",\n },\n emerald: {\n strip: \"border-t-emerald-500 bg-emerald-50/70 dark:bg-emerald-950/40\",\n accent: \"text-emerald-700 dark:text-emerald-300\",\n iconBg: \"bg-emerald-100/80 dark:bg-emerald-900/40\",\n },\n green: {\n strip: \"border-t-green-500 bg-green-50/70 dark:bg-green-950/40\",\n accent: \"text-green-700 dark:text-green-300\",\n iconBg: \"bg-green-100/80 dark:bg-green-900/40\",\n },\n amber: {\n strip: \"border-t-amber-500 bg-amber-50/70 dark:bg-amber-950/40\",\n accent: \"text-amber-700 dark:text-amber-300\",\n iconBg: \"bg-amber-100/80 dark:bg-amber-900/40\",\n },\n orange: {\n strip: \"border-t-orange-500 bg-orange-50/70 dark:bg-orange-950/40\",\n accent: \"text-orange-700 dark:text-orange-300\",\n iconBg: \"bg-orange-100/80 dark:bg-orange-900/40\",\n },\n rose: {\n strip: \"border-t-rose-500 bg-rose-50/70 dark:bg-rose-950/40\",\n accent: \"text-rose-700 dark:text-rose-300\",\n iconBg: \"bg-rose-100/80 dark:bg-rose-900/40\",\n },\n slate: {\n strip: \"border-t-slate-400 bg-slate-50/80 dark:bg-slate-800/50\",\n accent: \"text-slate-700 dark:text-slate-300\",\n iconBg: \"bg-slate-100/80 dark:bg-slate-800\",\n },\n};\n\nconst fallbackTone: ToneTokens = {\n strip: \"border-t-neutral-400 bg-neutral-50/80 dark:bg-neutral-800/50\",\n accent: \"text-neutral-700 dark:text-neutral-300\",\n iconBg: \"bg-neutral-100 dark:bg-neutral-800\",\n};\n\n/* ------------------------------------------------------------------ */\n/* Markdown component map */\n/* ------------------------------------------------------------------ */\n\nconst mdComponents: Components = {\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 underline underline-offset-2 hover:text-blue-800 dark:hover:text-blue-200 transition-colors duration-150\"\n >\n {children}\n </a>\n ),\n p: ({ children }) => (\n <p className=\"text-sm text-neutral-700 dark:text-neutral-300 leading-relaxed mb-2 last:mb-0\">\n {children}\n </p>\n ),\n h1: ({ children }) => (\n <h1 className=\"text-base font-bold text-neutral-900 dark:text-neutral-100 mb-2 mt-3 first:mt-0\">\n {children}\n </h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"text-sm font-bold text-neutral-900 dark:text-neutral-100 mb-1.5 mt-3 first:mt-0\">\n {children}\n </h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"text-sm font-semibold text-neutral-800 dark:text-neutral-200 mb-1 mt-2 first:mt-0\">\n {children}\n </h3>\n ),\n ul: ({ children }) => (\n <ul className=\"list-disc list-outside text-sm text-neutral-700 dark:text-neutral-300 space-y-0.5 mb-2 pl-4\">\n {children}\n </ul>\n ),\n ol: ({ children }) => (\n <ol className=\"list-decimal list-outside text-sm text-neutral-700 dark:text-neutral-300 space-y-0.5 mb-2 pl-4\">\n {children}\n </ol>\n ),\n li: ({ children }) => <li className=\"leading-relaxed\">{children}</li>,\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-[3px] border-neutral-300 dark:border-neutral-600 pl-3 my-2 text-neutral-500 dark:text-neutral-400 italic\">\n {children}\n </blockquote>\n ),\n hr: () => <hr className=\"my-3 border-neutral-200 dark:border-neutral-700\" />,\n strong: ({ children }) => (\n <strong className=\"font-semibold text-neutral-900 dark:text-neutral-100\">\n {children}\n </strong>\n ),\n em: ({ children }) => (\n <em className=\"italic text-neutral-600 dark:text-neutral-400\">\n {children}\n </em>\n ),\n /**\n * Inline code has no className; fenced block code has a language-* class.\n * We style them differently — inline is a subtle chip, block is a scrollable box.\n */\n code: ({ className, children }) => {\n const isBlock = Boolean(className);\n if (isBlock) {\n return (\n <code className=\"block bg-neutral-100 dark:bg-neutral-800 text-neutral-800 dark:text-neutral-200 rounded-lg p-3 text-xs font-mono overflow-x-auto whitespace-pre\">\n {children}\n </code>\n );\n }\n return (\n <code className=\"bg-neutral-100 dark:bg-neutral-800 text-neutral-800 dark:text-neutral-200 rounded px-1.5 py-0.5 text-xs font-mono\">\n {children}\n </code>\n );\n },\n pre: ({ children }) => (\n <pre className=\"my-2 rounded-lg overflow-hidden\">{children}</pre>\n ),\n // remark-gfm table support\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3 rounded-xl border border-neutral-200 dark:border-neutral-700\">\n <table className=\"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700 text-xs\">\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-neutral-100 dark:bg-neutral-800\">{children}</thead>\n ),\n tbody: ({ children }) => (\n <tbody className=\"divide-y divide-neutral-100 dark:divide-neutral-800/80\">\n {children}\n </tbody>\n ),\n tr: ({ children }) => (\n <tr className=\"transition-colors duration-100 hover:bg-neutral-50 dark:hover:bg-neutral-800/40\">\n {children}\n </tr>\n ),\n th: ({ children }) => (\n <th className=\"px-3 py-2 text-left text-xs font-semibold text-neutral-700 dark:text-neutral-300 whitespace-nowrap\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"px-3 py-2 text-neutral-600 dark:text-neutral-400\">\n {children}\n </td>\n ),\n};\n\n/* ------------------------------------------------------------------ */\n/* Position computation */\n/* ------------------------------------------------------------------ */\n\nconst ESTIMATED_HEIGHT = 320;\nconst GAP = 8;\n\nfunction computePopoverPosition(\n rect: DOMRect,\n placement: HelpButtonPlacement,\n maxWidth: number,\n): {\n style: React.CSSProperties;\n resolvedPlacement: \"top\" | \"bottom\" | \"left\" | \"right\";\n} {\n const vpW = window.innerWidth;\n const vpH = window.innerHeight;\n const W = Math.min(maxWidth, vpW - 16);\n\n const spaceBelow = vpH - rect.bottom - GAP;\n const spaceAbove = rect.top - GAP;\n\n let resolved: \"top\" | \"bottom\" | \"left\" | \"right\";\n if (placement === \"auto\" || placement === \"bottom\") {\n resolved =\n spaceBelow >= ESTIMATED_HEIGHT || spaceBelow >= spaceAbove\n ? \"bottom\"\n : \"top\";\n } else if (placement === \"top\") {\n resolved =\n spaceAbove >= ESTIMATED_HEIGHT || spaceAbove >= spaceBelow\n ? \"top\"\n : \"bottom\";\n } else {\n resolved = placement;\n }\n\n const style: React.CSSProperties = { width: W };\n\n if (resolved === \"bottom\") {\n style.top = rect.bottom + GAP;\n style.left = Math.max(\n 8,\n Math.min(rect.left + rect.width / 2 - W / 2, vpW - W - 8),\n );\n } else if (resolved === \"top\") {\n // distance from bottom of viewport so it sits above the button\n style.bottom = vpH - rect.top + GAP;\n style.left = Math.max(\n 8,\n Math.min(rect.left + rect.width / 2 - W / 2, vpW - W - 8),\n );\n } else if (resolved === \"right\") {\n style.left = Math.min(rect.right + GAP, vpW - W - 8);\n style.top = Math.max(\n 8,\n Math.min(\n rect.top + rect.height / 2 - ESTIMATED_HEIGHT / 2,\n vpH - ESTIMATED_HEIGHT - 8,\n ),\n );\n } else {\n // left\n style.left = Math.max(8, rect.left - W - GAP);\n style.top = Math.max(\n 8,\n Math.min(\n rect.top + rect.height / 2 - ESTIMATED_HEIGHT / 2,\n vpH - ESTIMATED_HEIGHT - 8,\n ),\n );\n }\n\n return { style, resolvedPlacement: resolved };\n}\n\nconst originClass: Record<\"top\" | \"bottom\" | \"left\" | \"right\", string> = {\n bottom: \"origin-top\",\n top: \"origin-bottom\",\n left: \"origin-right\",\n right: \"origin-left\",\n};\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nconst HelpButton: React.FC<HelpButtonProps> = ({\n content,\n title,\n placement = \"auto\",\n color = \"sky\",\n size = \"xs\",\n icon = \"Help\",\n maxWidth = 360,\n className,\n}) => {\n const [open, setOpen] = useState(false);\n const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({});\n const [resolvedPlacement, setResolvedPlacement] = useState<\n \"top\" | \"bottom\" | \"left\" | \"right\"\n >(\"bottom\");\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n\n const recompute = useCallback(() => {\n if (!buttonRef.current) return;\n const rect = buttonRef.current.getBoundingClientRect();\n const { style, resolvedPlacement: rp } = computePopoverPosition(\n rect,\n placement,\n maxWidth,\n );\n setPopoverStyle(style);\n setResolvedPlacement(rp);\n }, [placement, maxWidth]);\n\n const toggle = useCallback(() => {\n if (!open) recompute();\n setOpen((v) => !v);\n }, [open, recompute]);\n\n const close = useCallback(() => {\n setOpen(false);\n buttonRef.current?.focus();\n }, []);\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (\n !buttonRef.current?.contains(e.target as Node) &&\n !panelRef.current?.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n // Escape key\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [open, close]);\n\n // Reposition on scroll or resize while open\n useEffect(() => {\n if (!open) return;\n window.addEventListener(\"scroll\", recompute, true);\n window.addEventListener(\"resize\", recompute);\n return () => {\n window.removeEventListener(\"scroll\", recompute, true);\n window.removeEventListener(\"resize\", recompute);\n };\n }, [open, recompute]);\n\n const tone = toneMap[color] ?? fallbackTone;\n const isMarkdown = typeof content === \"string\";\n\n return (\n <span className={classNames(\"inline-flex items-center\", className)}>\n {/* Trigger */}\n <IconButton\n ref={buttonRef}\n icon={icon}\n size={size}\n variant=\"ghost\"\n color={color}\n onClick={toggle}\n aria-label=\"Show help\"\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n />\n\n {/* Floating panel — rendered in a portal to avoid overflow clipping */}\n {createPortal(\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label={typeof title === \"string\" ? title : \"Help\"}\n style={{ ...popoverStyle, position: \"fixed\" }}\n className={classNames(\n \"z-[2000] rounded-2xl border shadow-xl dark:shadow-neutral-950/60\",\n \"bg-white dark:bg-neutral-900\",\n \"border-neutral-200/70 dark:border-neutral-700/60\",\n // Animation — opacity + scale, origin tracks resolved placement\n \"transition-[opacity,transform] duration-200 ease-out\",\n originClass[resolvedPlacement],\n open\n ? \"opacity-100 scale-100 pointer-events-auto\"\n : \"opacity-0 scale-95 pointer-events-none\",\n )}\n >\n {/* ---- Accent header strip ---- */}\n <div\n className={classNames(\n \"flex items-center justify-between gap-2 px-3 py-2 rounded-t-2xl border-t-[3px]\",\n tone.strip,\n )}\n >\n <div\n className={classNames(\n \"flex items-center gap-2 min-w-0\",\n tone.accent,\n )}\n >\n <span\n className={classNames(\n \"flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full\",\n tone.iconBg,\n )}\n >\n <CustomIcon icon=\"Info\" className=\"h-3 w-3\" />\n </span>\n <span className=\"text-xs font-semibold truncate\">\n {title ?? \"Help\"}\n </span>\n </div>\n <IconButton\n icon=\"Close\"\n size=\"xs\"\n variant=\"ghost\"\n color=\"slate\"\n onClick={close}\n aria-label=\"Close help\"\n />\n </div>\n\n {/* ---- Content body ---- */}\n <div className=\"px-4 py-3 overflow-y-auto max-h-[55vh] scrollbar-thin scrollbar-thumb-neutral-300 dark:scrollbar-thumb-neutral-700\">\n {isMarkdown ? (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={mdComponents}\n >\n {content as string}\n </ReactMarkdown>\n ) : (\n <div className=\"text-sm text-neutral-700 dark:text-neutral-300 leading-relaxed\">\n {content}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )}\n </span>\n );\n};\n\nHelpButton.displayName = \"HelpButton\";\n\nexport default HelpButton;\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { IconButton } from \".\";\nimport { VariablePicker } from \"./VariablePicker\";\nimport { type SmartVariable } from \"../types/Variables\";\nimport { SMART_VAR_REGEX } from \"../utils/smartVariables\";\nimport { type CapsuleBlueprintParameter } from \"../types/CapsuleBlueprint\";\nimport { createPortal } from \"react-dom\";\n\nexport interface SmartInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n globalParameters?: CapsuleBlueprintParameter[];\n serviceNames?: string[];\n context?: {\n slug?: string;\n enable_https?: boolean;\n };\n multiline?: boolean; // If true, behaves like a textarea (kinda) or restricted? For now assuming single line mostly.\n}\n\nexport const SmartInput: React.FC<SmartInputProps> = ({\n value = \"\",\n onChange,\n placeholder,\n className = \"\",\n globalParameters = [],\n serviceNames = [],\n context = {},\n // multiline // reserved for future\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [showPicker, setShowPicker] = useState(false);\n const [viewMode, setViewMode] = useState<\"token\" | \"value\">(\"token\"); // New state\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const pickerRef = useRef<HTMLDivElement>(null);\n\n // Calculate picker position (basic implementation)\n const [pickerPos, setPickerPos] = useState({ top: 0, left: 0 });\n\n const hasVariables = React.useMemo(() => {\n const regex = new RegExp(SMART_VAR_REGEX);\n return regex.test(value);\n }, [value]);\n\n const handleContainerClick = () => {\n setIsEditing(true);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n // Only stop editing if we didn't click into the picker or the toggle button\n if (\n !containerRef.current?.contains(e.relatedTarget as Node) &&\n !pickerRef.current?.contains(e.relatedTarget as Node)\n ) {\n setIsEditing(false);\n setShowPicker(false);\n }\n };\n\n const togglePicker = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent container click from focusing input immediately if unnecessary\n if (showPicker) {\n setShowPicker(false);\n } else {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setPickerPos({\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n });\n }\n setShowPicker(true);\n setIsEditing(true); // Ensure we are in edit mode to receive insertion\n }\n };\n\n const handleSelectVariable = (variable: SmartVariable) => {\n // Insert variable at cursor position or append\n const input = inputRef.current;\n let newValue = value;\n\n if (input) {\n const start = input.selectionStart || 0;\n const end = input.selectionEnd || 0;\n newValue =\n value.substring(0, start) + variable.fullToken + value.substring(end);\n\n // Restore focus and cursor?\n // Setting state is async, so cursor restoration is tricky without effect.\n // For now simple append/replace.\n } else {\n newValue += variable.fullToken;\n }\n\n onChange(newValue);\n setShowPicker(false);\n // keep editing\n input?.focus();\n };\n\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isEditing]);\n\n // Close picker if clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n showPicker &&\n pickerRef.current &&\n !pickerRef.current.contains(event.target as Node) &&\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setShowPicker(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [showPicker]);\n\n const resolveVariable = (\n type: string,\n source: string,\n name: string,\n ): { value: string; isResolved: boolean; isRuntime?: boolean } => {\n if (source === \"global\" || source === \"env\") {\n // NOTE: Current regex match groups: 1=type, 2=source, 3=name\n // But typically we see {{ var::global::NAME }}.\n // 'source' argument here comes from the second part.\n // If the user types {{ env::global::NAME }}, source is 'global'.\n\n let param = globalParameters.find((p) => p.key === name);\n if (!param) {\n // Fallback: Try case-insensitive comparison\n param = globalParameters.find(\n (p) => p.key.toLowerCase() === name.toLowerCase(),\n );\n }\n\n if (param) {\n // Strict Type Check\n if (param.type !== type) {\n return { value: \"\", isResolved: false };\n }\n return { value: param.default_value || \"\", isResolved: true };\n }\n return { value: \"\", isResolved: false };\n }\n if (source === \"service\") {\n return { value: name, isResolved: true };\n }\n if (source === \"system\") {\n const lowerName = name.toLowerCase();\n // Derived Variables\n if (lowerName === \"sub_domain\") {\n return { value: context.slug || \"\", isResolved: true };\n }\n if (lowerName === \"domain\") {\n return { value: \"parallels.private\", isResolved: true };\n }\n if (lowerName === \"host_url\") {\n const protocol = context.enable_https ? \"https\" : \"http\";\n const domain = \"parallels.private\";\n const sub = context.slug || \"\";\n if (sub) {\n return { value: `${protocol}://${sub}.${domain}`, isResolved: true };\n }\n return { value: \"\", isResolved: false };\n }\n\n // Runtime Variables\n const runtimeVars = [\n \"name\",\n \"reverse_proxy_host\",\n \"ip_address\",\n \"host_gateway_ip\",\n \"capsule_id\",\n \"capsule_name\",\n \"host_ip\",\n \"app_url\",\n ];\n if (runtimeVars.includes(lowerName)) {\n return { value: `[${lowerName}]`, isResolved: true, isRuntime: true };\n }\n\n // Fallback for unknown system vars\n return { value: `[System: ${name}]`, isResolved: true, isRuntime: true };\n }\n return { value: \"\", isResolved: false };\n };\n\n // Render parsed view\n const renderView = () => {\n if (!value) {\n return (\n <span className=\"text-slate-400 italic\">{placeholder || \"Empty\"}</span>\n );\n }\n\n const parts = [];\n let lastIndex = 0;\n let match;\n // Case insensitive regex match to align with MarkdownEditor\n const regex = new RegExp(SMART_VAR_REGEX, \"gi\");\n\n while ((match = regex.exec(value)) !== null) {\n // Text before match\n if (match.index > lastIndex) {\n parts.push(\n <span key={`text-${lastIndex}`}>\n {value.substring(lastIndex, match.index)}\n </span>,\n );\n }\n\n // The variable token\n // const fullToken = match[0];\n const type = match[1]; // var | env\n const source = match[2]; // global | system | service\n const name = match[3];\n\n if (viewMode === \"value\") {\n const {\n value: resolvedVal,\n isResolved,\n isRuntime,\n } = resolveVariable(type, source, name);\n const isEmpty = !resolvedVal;\n\n let badgeClass = \"bg-green-50 text-green-700 border-green-200\";\n if (isEmpty) {\n badgeClass = \"bg-red-50 text-red-700 border-red-200\";\n }\n\n if (isResolved && isRuntime) {\n badgeClass = \"bg-purple-50 text-purple-700 border-purple-200\";\n } else if (source === \"system\" && !isEmpty) {\n // Derived or resolved system vars (green/amber)\n badgeClass = \"bg-emerald-50 text-emerald-700 border-emerald-200\";\n }\n\n parts.push(\n <span\n key={`token-${match.index}`}\n className={`mx-0.5 inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono border ${badgeClass} select-none cursor-help`}\n title={isResolved ? `Value: ${resolvedVal}` : \"Variable not found\"}\n >\n {isEmpty ? \"empty\" : resolvedVal}\n </span>,\n );\n } else {\n let badgeClass = \"bg-slate-100 text-slate-700 border-slate-200\";\n if (source === \"global\") {\n if (type === \"var\") {\n badgeClass = \"bg-indigo-50 text-indigo-700 border-indigo-200\";\n } else if (type === \"env\") {\n badgeClass = \"bg-teal-50 text-teal-700 border-teal-200\";\n } else {\n badgeClass = \"bg-indigo-50 text-indigo-700 border-indigo-200\";\n }\n }\n if (source === \"system\")\n badgeClass = \"bg-amber-50 text-amber-900 border-amber-200\";\n if (source === \"service\")\n badgeClass = \"bg-emerald-50 text-emerald-700 border-emerald-200\";\n\n let labelPrefix = \"G\";\n if (source === \"global\") {\n labelPrefix = type === \"env\" ? \"ENV\" : \"VAR\";\n } else if (source === \"system\") {\n labelPrefix = \"SYS\";\n } else if (source === \"service\") {\n labelPrefix = \"SVC\";\n }\n\n parts.push(\n <span\n key={`token-${match.index}`}\n className={`mx-0.5 inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono border ${badgeClass} select-none cursor-help`}\n title={`${type}::${source}`}\n >\n {labelPrefix}:{name}\n </span>,\n );\n }\n\n lastIndex = regex.lastIndex;\n }\n\n // Remaining text\n if (lastIndex < value.length) {\n parts.push(\n <span key={`text-${lastIndex}`}>{value.substring(lastIndex)}</span>,\n );\n }\n\n return <div className=\"truncate\">{parts}</div>;\n };\n\n return (\n <div\n ref={containerRef}\n className={`relative min-h-[38px] flex items-center rounded-lg border bg-white ${isEditing ? \"border-blue-500 ring-1 ring-blue-500/20\" : \"border-slate-300 hover:border-slate-400\"} ${className}`}\n >\n {isEditing ? (\n <input\n ref={inputRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onBlur={handleBlur}\n className=\"flex-1 w-full h-full px-3 py-2 bg-transparent border-none outline-none text-sm font-mono placeholder:font-sans\"\n placeholder={placeholder}\n autoComplete=\"off\"\n />\n ) : (\n <div\n onClick={handleContainerClick}\n className=\"flex-1 px-3 py-2 text-sm cursor-text h-full flex items-center\"\n >\n {renderView()}\n </div>\n )}\n\n <div className=\"flex items-center pr-1 border-l border-transparent gap-0.5\">\n {hasVariables && (\n <IconButton\n icon={viewMode === \"token\" ? \"EyeOpen\" : (\"EyeClosed\" as any)}\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n setIsEditing(false); // Force exit edit mode to see changes\n setViewMode((prev) => (prev === \"token\" ? \"value\" : \"token\"));\n }}\n className=\"text-slate-400 hover:text-slate-600\"\n title={viewMode === \"token\" ? \"Show Values\" : \"Show Tokens\"}\n />\n )}\n <IconButton\n icon=\"Plus\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={togglePicker}\n className={\n showPicker\n ? \"text-blue-600 bg-blue-50\"\n : \"text-slate-400 hover:text-slate-600\"\n }\n title=\"Insert Variable\"\n />\n </div>\n\n {/* Portal for Variable Picker to avoid z-index/overflow issues */}\n {showPicker &&\n createPortal(\n <div\n ref={pickerRef}\n style={{\n position: \"absolute\",\n top: pickerPos.top,\n left: pickerPos.left,\n zIndex: 9999,\n }}\n >\n <VariablePicker\n onSelect={handleSelectVariable}\n onClose={() => setShowPicker(false)}\n globalParameters={globalParameters}\n serviceNames={serviceNames}\n />\n </div>,\n document.body,\n )}\n </div>\n );\n};\n\nexport default SmartInput;\n","import React, { useMemo, useState } from \"react\";\nimport { Tabs, type TabItem, Input, IconButton } from \".\";\nimport { type SmartVariable, SYSTEM_VARIABLES } from \"../types/Variables\";\nimport { createSmartToken } from \"../utils/smartVariables\";\nimport { type CapsuleBlueprintParameter } from \"../types/CapsuleBlueprint\";\n\ninterface VariablePickerProps {\n onSelect: (variable: SmartVariable) => void;\n onClose?: () => void;\n globalParameters: CapsuleBlueprintParameter[];\n serviceNames: string[];\n}\n\nexport const VariablePicker: React.FC<VariablePickerProps> = ({\n onSelect,\n onClose,\n globalParameters,\n serviceNames,\n}) => {\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [activeTab, setActiveTab] = useState(\"global\");\n\n const globalVars: SmartVariable[] = useMemo(() => {\n return globalParameters.map((p) => ({\n fullToken: createSmartToken(\n p.type === \"env\" ? \"env\" : \"var\",\n \"global\",\n p.key,\n ),\n type: p.type === \"env\" ? \"env\" : \"var\",\n source: \"global\",\n name: p.key,\n description: p.name || p.help,\n defaultValue: p.default_value,\n }));\n }, [globalParameters]);\n\n const serviceVars: SmartVariable[] = useMemo(() => {\n return serviceNames.map((name) => ({\n fullToken: createSmartToken(\"var\", \"service\", name),\n type: \"var\",\n source: \"service\",\n name: name,\n description: `Reference to service: ${name}`,\n }));\n }, [serviceNames]);\n\n const filterVars = (vars: SmartVariable[]) => {\n if (!searchTerm) return vars;\n const lower = searchTerm.toLowerCase();\n return vars.filter(\n (v) =>\n v.name.toLowerCase().includes(lower) ||\n (v.description && v.description.toLowerCase().includes(lower)),\n );\n };\n\n const renderList = (vars: SmartVariable[], emptyMsg: string) => {\n const filtered = filterVars(vars);\n if (filtered.length === 0) {\n return (\n <div className=\"p-4 text-center text-slate-500 italic\">{emptyMsg}</div>\n );\n }\n return (\n <div className=\"flex flex-col gap-1 p-2\">\n {filtered.map((v) => (\n <button\n key={v.fullToken}\n onClick={() => onSelect(v)}\n className=\"flex flex-col items-start p-2 hover:bg-slate-100 rounded text-left group transition-colors\"\n >\n <div className=\"flex items-center gap-2 w-full\">\n <span className=\"font-mono text-xs font-semibold text-blue-600 bg-blue-50 px-1.5 py-0.5 rounded border border-blue-100\">\n {v.name}\n </span>\n {v.defaultValue && (\n <span className=\"text-xs text-slate-400 ml-auto truncate max-w-[150px]\">\n Def: {v.defaultValue}\n </span>\n )}\n </div>\n {v.description && (\n <span className=\"text-xs text-slate-500 mt-1 line-clamp-1 group-hover:text-slate-700\">\n {v.description}\n </span>\n )}\n <span className=\"text-[10px] text-slate-300 mt-0.5 font-mono hidden group-hover:block\">\n {v.fullToken}\n </span>\n </button>\n ))}\n </div>\n );\n };\n\n const tabs: TabItem[] = [\n {\n id: \"global\",\n label: \"Global\",\n icon: \"Globe\" as any,\n panel: (\n <div className=\"h-64 overflow-y-auto\">\n {renderList(globalVars, \"No global parameters found.\")}\n </div>\n ),\n },\n {\n id: \"system\",\n label: \"System\",\n icon: \"Cog\" as any,\n panel: (\n <div className=\"h-64 overflow-y-auto\">\n {renderList(SYSTEM_VARIABLES, \"No system variables found.\")}\n </div>\n ),\n },\n {\n id: \"services\",\n label: \"Services\",\n icon: \"Container\" as any,\n panel: (\n <div className=\"h-64 overflow-y-auto\">\n {renderList(serviceVars, \"No services found.\")}\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"w-[400px] bg-white rounded-lg shadow-xl border border-slate-200 flex flex-col overflow-hidden\">\n <div className=\"flex items-center justify-between p-3 border-b border-slate-100 bg-slate-50\">\n <h3 className=\"text-sm font-semibold text-slate-900\">\n Insert Variable\n </h3>\n {onClose && (\n <IconButton\n icon=\"Close\"\n size=\"xs\"\n variant=\"ghost\"\n onClick={onClose}\n />\n )}\n </div>\n\n <div className=\"p-2 border-b border-slate-100\">\n <Input\n placeholder=\"Search variables...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n autoFocus\n className=\"text-sm\"\n />\n </div>\n\n <div className=\"flex-1\">\n <Tabs\n items={tabs}\n value={activeTab}\n onChange={setActiveTab}\n variant=\"minimal\"\n className=\"h-full flex flex-col\"\n />\n </div>\n </div>\n );\n};\n\nexport default VariablePicker;\n","export type SmartVariableType = \"var\" | \"env\";\nexport type SmartVariableSource = \"global\" | \"system\" | \"service\";\n\nexport interface SmartVariable {\n fullToken: string;\n type: SmartVariableType;\n source: SmartVariableSource;\n name: string;\n description?: string;\n defaultValue?: string;\n}\n\nexport const SYSTEM_VARIABLES: SmartVariable[] = [\n {\n fullToken: \"{{ var::system::capsule_id }}\",\n type: \"var\",\n source: \"system\",\n name: \"capsule_id\",\n description: \"The unique identifier of the capsule instance.\",\n },\n {\n fullToken: \"{{ var::system::capsule_name }}\",\n type: \"var\",\n source: \"system\",\n name: \"capsule_name\",\n description: \"The name of the capsule.\",\n },\n {\n fullToken: \"{{ var::system::host_ip }}\",\n type: \"var\",\n source: \"system\",\n name: \"host_ip\",\n description: \"The IP address of the host machine.\",\n },\n {\n fullToken: \"{{ var::system::app_url }}\",\n type: \"var\",\n source: \"system\",\n name: \"app_url\",\n description: \"The main URL for the application.\",\n },\n // Runtime Variables\n {\n fullToken: \"{{ var::system::name }}\",\n type: \"var\",\n source: \"system\",\n name: \"name\",\n description: \"Capsule Name (Runtime)\",\n },\n {\n fullToken: \"{{ var::system::reverse_proxy_host }}\",\n type: \"var\",\n source: \"system\",\n name: \"reverse_proxy_host\",\n description: \"IP of the caddy reverse host (Runtime)\",\n },\n {\n fullToken: \"{{ var::system::ip_address }}\",\n type: \"var\",\n source: \"system\",\n name: \"ip_address\",\n description: \"IP of the VM (Runtime)\",\n },\n {\n fullToken: \"{{ var::system::host_gateway_ip }}\",\n type: \"var\",\n source: \"system\",\n name: \"host_gateway_ip\",\n description: \"IP of the docker gateway (Runtime)\",\n },\n // Derived Variables\n {\n fullToken: \"{{ var::system::sub_domain }}\",\n type: \"var\",\n source: \"system\",\n name: \"sub_domain\",\n description: \"The subdomain value (derived from slug)\",\n },\n {\n fullToken: \"{{ var::system::domain }}\",\n type: \"var\",\n source: \"system\",\n name: \"domain\",\n description: \"The domain suffix (parallels.private)\",\n },\n {\n fullToken: \"{{ var::system::host_url }}\",\n type: \"var\",\n source: \"system\",\n name: \"host_url\",\n description: \"The full URL (derived from sub_domain and domain)\",\n },\n];\n","import {\n type SmartVariable,\n type SmartVariableType,\n type SmartVariableSource,\n} from \"../types/Variables\";\n\n// Regex to match {{ type::source::name }}\n// Captures: 1=type, 2=source, 3=name\nexport const SMART_VAR_REGEX =\n /\\{\\{\\s*(var|env)::(global|system|service)::([a-zA-Z0-9_\\-.]+)\\s*\\}\\}/g;\n\nexport const parseSmartVariable = (token: string): SmartVariable | null => {\n // Reset regex index if reusing global regex, but here we just use match\n const match = token.match(\n /^\\{\\{\\s*(var|env)::(global|system|service)::([a-zA-Z0-9_\\-.]+)\\s*\\}\\}$/,\n );\n\n if (!match) return null;\n\n return {\n fullToken: token,\n type: match[1] as SmartVariableType,\n source: match[2] as SmartVariableSource,\n name: match[3],\n };\n};\n\nexport const createSmartToken = (\n type: SmartVariableType,\n source: SmartVariableSource,\n name: string,\n) => {\n return `{{ ${type}::${source}::${name} }}`;\n};\n\n/**\n * Extracts all unique variables from a given text string.\n */\nexport const extractVariables = (text: string): SmartVariable[] => {\n const variables: SmartVariable[] = [];\n const seen = new Set<string>();\n\n let match;\n // We need to loop because exec with global flag keeps state\n // Create a new regex instance or reset lastIndex if exposed global\n const regex = new RegExp(SMART_VAR_REGEX);\n\n while ((match = regex.exec(text)) !== null) {\n const fullToken = match[0];\n if (!seen.has(fullToken)) {\n seen.add(fullToken);\n variables.push({\n fullToken,\n type: match[1] as SmartVariableType,\n source: match[2] as SmartVariableSource,\n name: match[3],\n });\n }\n }\n\n return variables;\n};\n\nimport { type CapsuleBlueprintParameter } from \"../types/CapsuleBlueprint\";\n\ninterface VariableContext {\n globalParameters?: CapsuleBlueprintParameter[];\n serviceNames?: string[];\n context?: {\n slug?: string;\n enable_https?: boolean;\n };\n}\n\nexport const resolveVariable = (\n value: string,\n ctx: VariableContext,\n): { value: string; isResolved: boolean; isRuntime: boolean } => {\n // Basic regex match for single variable\n const match = value.match(\n /^\\{\\{\\s*(var|env)::(global|system|service)::([a-zA-Z0-9_\\-.]+)\\s*\\}\\}$/,\n );\n if (!match) return { value, isResolved: false, isRuntime: false };\n\n const [, , source, name] = match;\n\n if (source === \"global\" || source === \"env\") {\n let param = ctx.globalParameters?.find((p) => p.key === name);\n if (!param) {\n // Fallback: Try case-insensitive comparison\n param = ctx.globalParameters?.find(\n (p) => p.key.toLowerCase() === name.toLowerCase(),\n );\n }\n\n if (param) {\n const val = param.default ?? param.default_value;\n return {\n value: val ? String(val) : \"\",\n isResolved: true,\n isRuntime: false,\n };\n }\n return { value: \"\", isResolved: false, isRuntime: false };\n }\n if (source === \"service\") {\n return { value: name, isResolved: true, isRuntime: false };\n }\n if (source === \"system\") {\n const lowerName = name.toLowerCase();\n // Derived Variables\n if (lowerName === \"sub_domain\") {\n return {\n value: ctx.context?.slug || \"\",\n isResolved: true,\n isRuntime: false,\n };\n }\n if (lowerName === \"domain\") {\n return { value: \"parallels.private\", isResolved: true, isRuntime: false };\n }\n if (lowerName === \"host_url\") {\n const protocol = ctx.context?.enable_https ? \"https\" : \"http\";\n const domain = \"parallels.private\";\n const sub = ctx.context?.slug || \"\";\n if (sub) {\n return {\n value: `${protocol}://${sub}.${domain}`,\n isResolved: true,\n isRuntime: false,\n };\n }\n return { value: \"\", isResolved: false, isRuntime: false };\n }\n\n // Runtime Variables\n const runtimeVars = [\n \"name\",\n \"reverse_proxy_host\",\n \"ip_address\",\n \"host_gateway_ip\",\n \"capsule_id\",\n \"capsule_name\",\n \"host_ip\",\n \"app_url\",\n ];\n if (runtimeVars.includes(lowerName)) {\n return { value: `[${lowerName}]`, isResolved: true, isRuntime: true };\n }\n\n // Fallback for unknown system vars\n return { value: `[System: ${name}]`, isResolved: true, isRuntime: true };\n }\n return { value: \"\", isResolved: false, isRuntime: false };\n};\n","import React, { useState } from \"react\";\nimport { IconButton } from \".\";\nimport { type CapsuleBlueprintParameter } from \"../types/CapsuleBlueprint\";\nimport { resolveVariable, SMART_VAR_REGEX } from \"../utils/smartVariables\";\n\nexport interface SmartValueProps {\n value: string;\n globalParameters?: CapsuleBlueprintParameter[];\n serviceNames?: string[];\n context?: {\n slug?: string;\n enable_https?: boolean;\n };\n className?: string;\n}\n\nexport const SmartValue: React.FC<SmartValueProps> = ({\n value = \"\",\n globalParameters = [],\n serviceNames = [],\n context = {},\n className = \"\",\n}) => {\n const [viewMode, setViewMode] = useState<\"token\" | \"value\">(\"token\");\n\n // Case insensitive regex match\n const regex = new RegExp(SMART_VAR_REGEX, \"gi\");\n const hasVariables = regex.test(value);\n\n // Reset regex index\n regex.lastIndex = 0;\n\n const renderParts = () => {\n const parts = [];\n let lastIndex = 0;\n let match;\n\n // Reset regex again for the loop\n regex.lastIndex = 0;\n\n while ((match = regex.exec(value)) !== null) {\n // Text before match\n if (match.index > lastIndex) {\n parts.push(\n <span key={`text-${lastIndex}`}>\n {value.substring(lastIndex, match.index)}\n </span>,\n );\n }\n\n const fullToken = match[0];\n const type = match[1]; // var | env\n const source = match[2]; // global | system | service\n const name = match[3];\n\n if (viewMode === \"value\") {\n const ctx = { globalParameters, serviceNames, context };\n // resolveVariable expects the full token usually, or we can adapt logic.\n // The utils resolveVariable expects the full token string to match its regex.\n const {\n value: resolvedVal,\n isResolved,\n isRuntime,\n } = resolveVariable(fullToken, ctx);\n const isEmpty = !resolvedVal;\n\n let badgeClass = \"bg-green-50 text-green-700 border-green-200\";\n if (isEmpty) {\n badgeClass = \"bg-red-50 text-red-700 border-red-200\";\n }\n\n if (isResolved && isRuntime) {\n badgeClass = \"bg-purple-50 text-purple-700 border-purple-200\";\n } else if (source === \"system\" && !isEmpty) {\n badgeClass = \"bg-emerald-50 text-emerald-700 border-emerald-200\";\n }\n\n parts.push(\n <span\n key={`token-${match.index}`}\n className={`mx-0.5 inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono border ${badgeClass} select-none cursor-help align-middle`}\n title={isResolved ? `Value: ${resolvedVal}` : \"Variable not found\"}\n >\n {isEmpty ? \"empty\" : resolvedVal}\n </span>,\n );\n } else {\n let badgeClass = \"bg-slate-100 text-slate-700 border-slate-200\";\n if (source === \"global\")\n badgeClass = \"bg-indigo-50 text-indigo-700 border-indigo-200\";\n if (source === \"system\")\n badgeClass = \"bg-amber-50 text-amber-900 border-amber-200\";\n if (source === \"service\")\n badgeClass = \"bg-emerald-50 text-emerald-700 border-emerald-200\";\n\n parts.push(\n <span\n key={`token-${match.index}`}\n className={`mx-0.5 inline-flex items-center px-1.5 py-0.5 rounded text-xs font-mono border ${badgeClass} select-none cursor-help align-middle`}\n title={`${type}::${source}`}\n >\n {source === \"global\" ? \"G\" : source === \"system\" ? \"S\" : \"SVC\"}:\n {name}\n </span>,\n );\n }\n\n lastIndex = regex.lastIndex;\n }\n\n // Remaining text\n if (lastIndex < value.length) {\n parts.push(\n <span key={`text-${lastIndex}`}>{value.substring(lastIndex)}</span>,\n );\n }\n\n return parts;\n };\n\n if (!hasVariables) {\n return <span className={className}>{value}</span>;\n }\n\n return (\n <div className={`flex items-start gap-1 group ${className}`}>\n <div className=\"flex-1 min-w-0 flex flex-wrap items-center gap-y-1 max-h-[80px] overflow-y-auto\">\n {renderParts()}\n </div>\n <IconButton\n icon={viewMode === \"token\" ? \"EyeOpen\" : \"EyeClosed\"}\n variant=\"ghost\"\n size=\"xs\"\n onClick={(e) => {\n e.stopPropagation();\n setViewMode((prev) => (prev === \"token\" ? \"value\" : \"token\"));\n }}\n className=\"text-slate-400 hover:text-slate-600 hidden group-hover:inline-flex\"\n title={viewMode === \"token\" ? \"Show Values\" : \"Show Tokens\"}\n />\n </div>\n );\n};\n\nexport default SmartValue;\n","import React, { useEffect, useMemo, useState } from \"react\";\nimport classNames from \"classnames\";\nimport type { StartupStage, StartupStageStatus } from \"../types/App\";\nimport { Progress } from \".\";\nimport \"./StartupStageStepper.css\";\n\nexport type StartupStageStepperProps = {\n stages: StartupStage[];\n currentStageId?: string;\n className?: string;\n detailClassName?: string;\n onStageSelect?: (stage: StartupStage) => void;\n showHistoryToggle?: boolean;\n defaultShowHistory?: boolean;\n title?: string;\n variant?: \"minimal\" | \"panel\";\n size?: StartupStageStepperSize;\n};\n\ntype StartupStageStepperSize = \"sm\" | \"md\" | \"lg\";\n\nconst SIZE_TOKENS: Record<\n StartupStageStepperSize,\n {\n nodeDimension: string;\n nodeFont: string;\n icon: string;\n headerTitle: string;\n bodyText: string;\n badgeText: string;\n detailPadding: string;\n trackGap: string;\n trackPadding: string;\n connectorThickness: string;\n historyText: string;\n }\n> = {\n sm: {\n nodeDimension: \"size-9\",\n nodeFont: \"text-xs\",\n icon: \"h-3.5 w-3.5\",\n headerTitle: \"text-base\",\n bodyText: \"text-xs\",\n badgeText: \"text-[11px]\",\n detailPadding: \"p-3\",\n trackGap: \"gap-1.5\",\n trackPadding: \"px-0.5\",\n connectorThickness: \"h-[2px]\",\n historyText: \"text-xs\",\n },\n md: {\n nodeDimension: \"size-11\",\n nodeFont: \"text-sm\",\n icon: \"h-4 w-4\",\n headerTitle: \"text-lg\",\n bodyText: \"text-sm\",\n badgeText: \"text-xs\",\n detailPadding: \"p-4\",\n trackGap: \"gap-2\",\n trackPadding: \"px-1\",\n connectorThickness: \"h-[3px]\",\n historyText: \"text-sm\",\n },\n lg: {\n nodeDimension: \"size-13\",\n nodeFont: \"text-base\",\n icon: \"h-5 w-5\",\n headerTitle: \"text-xl\",\n bodyText: \"text-base\",\n badgeText: \"text-sm\",\n detailPadding: \"p-5\",\n trackGap: \"gap-3\",\n trackPadding: \"px-2\",\n connectorThickness: \"h-[5px]\",\n historyText: \"text-base\",\n },\n};\n\nconst STATUS_TOKENS: Record<\n StartupStageStatus,\n {\n label: string;\n pillBg: string;\n pillBorder: string;\n pillText: string;\n badgeBg: string;\n badgeText: string;\n }\n> = {\n pending: {\n label: \"Pending\",\n pillBg: \"bg-neutral-50/70 dark:bg-neutral-900/40\",\n pillBorder: \"border-neutral-200/80 dark:border-neutral-700/70\",\n pillText: \"text-neutral-500 dark:text-neutral-400\",\n badgeBg: \"bg-neutral-100 dark:bg-neutral-800\",\n badgeText: \"text-neutral-500 dark:text-neutral-300\",\n },\n \"in-progress\": {\n label: \"In Progress\",\n pillBg: \"bg-sky-50/80 dark:bg-sky-400/10\",\n pillBorder: \"border-sky-200/80 dark:border-sky-500/60\",\n pillText: \"text-sky-700 dark:text-sky-300\",\n badgeBg: \"bg-sky-100 dark:bg-sky-400/30\",\n badgeText: \"text-sky-700 dark:text-sky-100\",\n },\n \"is-ok\": {\n label: \"Completed\",\n pillBg: \"bg-emerald-50/80 dark:bg-emerald-400/10\",\n pillBorder: \"border-emerald-200/80 dark:border-emerald-500/60\",\n pillText: \"text-emerald-700 dark:text-emerald-200\",\n badgeBg: \"bg-emerald-100 dark:bg-emerald-400/30\",\n badgeText: \"text-emerald-700 dark:text-emerald-50\",\n },\n \"has-error\": {\n label: \"Needs Attention\",\n pillBg: \"bg-rose-50/80 dark:bg-rose-500/10\",\n pillBorder: \"border-rose-200/70 dark:border-rose-500/60\",\n pillText: \"text-rose-600 dark:text-rose-200\",\n badgeBg: \"bg-rose-100 dark:bg-rose-500/30\",\n badgeText: \"text-rose-700 dark:text-rose-50\",\n },\n};\n\nconst renderStatusIcon = (\n status: StartupStageStatus,\n sizeClass: string,\n): React.ReactElement => {\n switch (status) {\n case \"pending\":\n return (\n <svg viewBox=\"0 0 24 24\" className={sizeClass} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" />\n </svg>\n );\n case \"in-progress\":\n return (\n <svg\n viewBox=\"0 0 24 24\"\n className={classNames(sizeClass, \"animate-spin\")}\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray=\"42\"\n strokeLinecap=\"round\"\n fill=\"none\"\n className=\"opacity-30\"\n />\n <path\n d=\"M12 3a9 9 0 019 9\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n case \"is-ok\":\n return (\n <svg viewBox=\"0 0 24 24\" className={sizeClass} aria-hidden=\"true\">\n <path\n d=\"M5 12.5 9.5 17l9-10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n case \"has-error\":\n default:\n return (\n <svg viewBox=\"0 0 24 24\" className={sizeClass} aria-hidden=\"true\">\n <path\n d=\"M12 7v5m0 4h.01M12 2 2 22h20L12 2Z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n }\n};\n\nconst getFriendlyStageMessage = (stage: StartupStage): string =>\n stage.statusMessage ??\n stage.progress?.currentMessage ??\n stage.description ??\n stage.errorMessage ??\n \"Awaiting status…\";\n\ntype ConnectorTone = \"complete\" | \"active\" | \"error\" | \"pending\";\n\nconst CONNECTOR_STYLES: Record<\n ConnectorTone,\n { base: string; animated?: boolean }\n> = {\n complete: { base: \"bg-emerald-400 dark:bg-emerald-500\" },\n active: {\n base: \"bg-sky-300/70 dark:bg-sky-400/70\",\n animated: true,\n },\n error: { base: \"bg-rose-400 dark:bg-rose-500\" },\n pending: { base: \"bg-neutral-200 dark:bg-neutral-700\" },\n};\n\nconst getConnectorTone = (stage?: StartupStage): ConnectorTone => {\n if (!stage) {\n return \"pending\";\n }\n if (stage.status === \"is-ok\") {\n return \"complete\";\n }\n if (stage.status === \"has-error\") {\n return \"error\";\n }\n if (stage.status === \"in-progress\") {\n return \"active\";\n }\n return \"pending\";\n};\n\nexport const StartupStageStepper: React.FC<StartupStageStepperProps> = ({\n stages,\n currentStageId,\n className,\n detailClassName,\n onStageSelect,\n showHistoryToggle = true,\n defaultShowHistory = false,\n title = \"Startup progress\",\n variant = \"minimal\",\n size = \"md\",\n}) => {\n const orderedStages = useMemo(() => stages.filter(Boolean), [stages]);\n const sizeToken = SIZE_TOKENS[size] ?? SIZE_TOKENS.md;\n\n const derivedStageId = useMemo(() => {\n if (currentStageId) {\n return currentStageId;\n }\n const inProgress = orderedStages.find(\n (stage) => stage.status === \"in-progress\",\n );\n if (inProgress) {\n return inProgress.id;\n }\n const pending = orderedStages.find((stage) => stage.status === \"pending\");\n return pending?.id ?? orderedStages[0]?.id;\n }, [currentStageId, orderedStages]);\n\n const [selectedStageId, setSelectedStageId] = useState<string | undefined>(\n derivedStageId,\n );\n const [historyOpen, setHistoryOpen] = useState(defaultShowHistory);\n const [showErrorDetails, setShowErrorDetails] = useState(false);\n\n useEffect(() => {\n setSelectedStageId((prev) => {\n if (!derivedStageId) {\n return prev;\n }\n if (!prev) {\n return derivedStageId;\n }\n // Always snap back to the derived active stage when status changes\n if (prev !== derivedStageId) {\n return derivedStageId;\n }\n return prev;\n });\n }, [derivedStageId]);\n\n useEffect(() => {\n setShowErrorDetails(false);\n }, [selectedStageId]);\n\n if (orderedStages.length === 0) {\n return null;\n }\n\n const selectedStage =\n orderedStages.find((stage) => stage.id === selectedStageId) ??\n orderedStages[0];\n const selectedStatus = STATUS_TOKENS[selectedStage.status];\n const historyCandidates = orderedStages.filter((stage) =>\n [\"is-ok\", \"has-error\"].includes(stage.status),\n );\n const showHistory = showHistoryToggle && historyCandidates.length > 0;\n const isErrorStage = selectedStage.status === \"has-error\";\n const hasTechnicalDetails = Boolean(\n selectedStage.errorMessage || selectedStage.errorType,\n );\n const detailBgClass = isErrorStage\n ? \"bg-rose-50/80 text-rose-900 dark:bg-rose-500/10 dark:text-rose-100\"\n : \"bg-neutral-50/60 text-neutral-600 dark:bg-neutral-900/50 dark:text-neutral-200\";\n const detailBorderClass =\n variant === \"panel\"\n ? isErrorStage\n ? \"border border-rose-200/70 dark:border-rose-500/60\"\n : \"border border-neutral-100/60 dark:border-neutral-700/60\"\n : isErrorStage\n ? \"border border-rose-100/60 dark:border-rose-500/40\"\n : \"border border-transparent\";\n const containerClasses =\n variant === \"panel\"\n ? \"rounded-3xl border border-neutral-200/70 bg-white/80 p-4 shadow-sm dark:border-neutral-700/70 dark:bg-neutral-900/70\"\n : undefined;\n\n return (\n <section\n className={classNames(\n \"flex w-full flex-col gap-3\",\n containerClasses,\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wide text-neutral-500 dark:text-neutral-400\">\n {title}\n </p>\n <p\n className={classNames(\n sizeToken.headerTitle,\n \"font-semibold text-neutral-900 dark:text-neutral-50\",\n )}\n >\n {selectedStage.title}\n </p>\n </div>\n <div\n className={classNames(\n \"rounded-full px-3 py-1 font-semibold uppercase tracking-wide\",\n sizeToken.badgeText,\n selectedStatus.badgeBg,\n selectedStatus.badgeText,\n )}\n >\n {selectedStatus.label}\n </div>\n </div>\n\n <div className=\"overflow-x-auto py-2\">\n <div\n className={classNames(\n \"flex min-w-full items-center\",\n sizeToken.trackGap,\n sizeToken.trackPadding,\n )}\n >\n {orderedStages.map((stage, index) => {\n const token = STATUS_TOKENS[stage.status];\n const isActive = stage.id === selectedStage.id;\n const connectorTone = getConnectorTone(orderedStages[index - 1]);\n return (\n <React.Fragment key={stage.id}>\n {index > 0 && (\n <div\n className={classNames(\n \"flex-1 rounded-full transition-colors\",\n sizeToken.connectorThickness,\n CONNECTOR_STYLES[connectorTone].base,\n CONNECTOR_STYLES[connectorTone].animated &&\n \"startup-stage-connector--animated\",\n )}\n />\n )}\n <button\n type=\"button\"\n title={stage.title}\n aria-label={stage.title}\n onClick={() => {\n setSelectedStageId(stage.id);\n onStageSelect?.(stage);\n }}\n className={classNames(\n \"flex flex-none items-center justify-center rounded-full border-2 transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-neutral-900\",\n sizeToken.nodeDimension,\n sizeToken.nodeFont,\n token.pillText,\n {\n \"border-emerald-400 bg-emerald-50 dark:border-emerald-500/80 dark:bg-emerald-400/10\":\n stage.status === \"is-ok\",\n \"border-sky-400 bg-sky-50 dark:border-sky-500/80 dark:bg-sky-400/10\":\n stage.status === \"in-progress\",\n \"border-rose-400 bg-rose-50 dark:border-rose-500/80 dark:bg-rose-500/10\":\n stage.status === \"has-error\",\n \"border-neutral-300 bg-white dark:border-neutral-600 dark:bg-neutral-900\":\n stage.status === \"pending\",\n \"ring-2 ring-sky-300 dark:ring-sky-500\": isActive,\n },\n )}\n aria-current={isActive}\n >\n {renderStatusIcon(\n stage.status,\n classNames(\"text-current\", sizeToken.icon),\n )}\n <span className=\"sr-only\">\n {stage.title} · {token.label}\n </span>\n </button>\n </React.Fragment>\n );\n })}\n </div>\n </div>\n\n <div\n className={classNames(\n \"rounded-2xl\",\n detailBgClass,\n detailBorderClass,\n sizeToken.detailPadding,\n sizeToken.bodyText,\n detailClassName,\n )}\n >\n <p>{getFriendlyStageMessage(selectedStage)}</p>\n\n {typeof selectedStage.progress?.percentage === \"number\" && (\n <div className=\"mt-4\">\n <Progress\n size=\"md\"\n value={selectedStage.progress.percentage}\n color=\"blue\"\n />\n {selectedStage.progress?.details && (\n <p className=\"mt-2 text-[11px] font-medium uppercase tracking-wide text-neutral-400 dark:text-neutral-500\">\n {selectedStage.progress.details}\n </p>\n )}\n </div>\n )}\n\n {selectedStage.retryCount !== undefined &&\n selectedStage.maxRetryCount !== undefined &&\n selectedStage.retryCount > 1 && (\n <p className=\"mt-3 text-[11px] font-semibold uppercase tracking-wide text-amber-600 dark:text-amber-300\">\n Retry {selectedStage.retryCount} of {selectedStage.maxRetryCount}\n </p>\n )}\n\n {isErrorStage && hasTechnicalDetails && (\n <div className=\"mt-4 rounded-xl border border-rose-100/70 bg-white/80 p-3 text-sm text-neutral-700 dark:border-rose-500/40 dark:bg-neutral-950/40 dark:text-neutral-100\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wide text-rose-500 dark:text-rose-300\">\n Technical details\n </p>\n {!showErrorDetails && (\n <p className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n Tap to reveal diagnostic info\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"text-xs font-semibold uppercase tracking-wide text-rose-600 transition-colors hover:text-rose-500 dark:text-rose-300 dark:hover:text-rose-200\"\n onClick={() => setShowErrorDetails((prev) => !prev)}\n aria-expanded={showErrorDetails}\n >\n {showErrorDetails ? \"Hide\" : \"Show\"}\n </button>\n </div>\n {showErrorDetails && (\n <div className=\"mt-3 space-y-2\">\n {selectedStage.errorMessage && (\n <pre className=\"whitespace-pre-wrap rounded-lg bg-rose-100/70 px-3 py-2 font-mono text-xs text-rose-900 dark:bg-rose-500/20 dark:text-rose-100\">\n {selectedStage.errorMessage}\n </pre>\n )}\n {selectedStage.errorType && (\n <p className=\"text-xs font-semibold uppercase tracking-wide text-rose-600 dark:text-rose-300\">\n Type: {selectedStage.errorType}\n </p>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {showHistory && (\n <div\n className={classNames(\n \"rounded-2xl bg-neutral-50/40 dark:bg-neutral-900/40\",\n sizeToken.detailPadding,\n )}\n >\n <button\n type=\"button\"\n className={classNames(\n \"flex w-full items-center justify-between font-semibold text-neutral-600 transition-colors hover:text-neutral-900 dark:text-neutral-300 dark:hover:text-neutral-100\",\n sizeToken.bodyText,\n )}\n onClick={() => setHistoryOpen((prev) => !prev)}\n >\n <span>\n Completed steps{\" \"}\n <span className=\"font-normal text-neutral-400 dark:text-neutral-500\">\n ({historyCandidates.length})\n </span>\n </span>\n <span\n className={classNames(\n \"size-6 rounded-full border border-neutral-300/60 p-1 text-neutral-500 transition-transform dark:border-neutral-600/70\",\n historyOpen ? \"rotate-180\" : \"\",\n )}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 24 24\" className=\"h-full w-full\">\n <path\n d=\"m6 10 6 6 6-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n {historyOpen && (\n <ol\n className={classNames(\n \"mt-3 divide-y divide-neutral-100 dark:divide-neutral-800\",\n sizeToken.historyText,\n )}\n >\n {historyCandidates.map((stage) => {\n const token = STATUS_TOKENS[stage.status];\n return (\n <li\n key={stage.id}\n className=\"flex items-center justify-between py-2\"\n >\n <span className=\"font-medium text-neutral-800 dark:text-neutral-100\">\n {stage.title}\n </span>\n <span\n className={classNames(\n \"text-xs font-semibold uppercase\",\n token.pillText,\n )}\n >\n {token.label}\n </span>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n )}\n </section>\n );\n};\n\nexport default StartupStageStepper;\n","import React, { useState, useMemo } from \"react\";\nimport classNames from \"classnames\";\nimport StatTile from \"./StatTile\";\nimport type { StatTileProps } from \"./StatTile\";\nimport { CustomIcon } from \"./CustomIcon\";\nimport type { TrueColor } from \"../theme\";\nimport { getColorPaletteNames } from \"../theme\";\n\nexport interface StatChartItem {\n label: string;\n value: number;\n /** Omit to auto-assign from the theme palette. */\n color?: TrueColor;\n intensity?: string;\n onClick?: () => void;\n}\n\nexport interface StatChartDataset {\n id: string | number;\n label: string;\n centerLabel: string;\n items: StatChartItem[];\n}\n\nexport interface StatChartTileProps\n extends Omit<StatTileProps, \"body\" | \"title\" | \"value\" | \"subtitle\"> {\n data: StatChartDataset[];\n}\n\nconst StatChartTile: React.FC<StatChartTileProps> = ({ data, ...props }) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const currentDataset = data[currentIndex];\n\n const resolvedItems = useMemo(() => {\n const palette = getColorPaletteNames(currentDataset.items.length);\n return currentDataset.items.map((item, i) => ({\n ...item,\n color: (item.color ?? palette[i]) as TrueColor,\n }));\n }, [currentDataset]);\n\n const total = useMemo(\n () => currentDataset.items.reduce((acc, item) => acc + item.value, 0),\n [currentDataset],\n );\n\n const handlePrev = () => {\n if (currentIndex > 0) {\n setCurrentIndex(currentIndex - 1);\n }\n };\n\n const handleNext = () => {\n if (currentIndex < data.length - 1) {\n setCurrentIndex(currentIndex + 1);\n }\n };\n\n // Chart dimensions\n const size = 200;\n const strokeWidth = 12; // Thicker stroke for donut\n const radius = (size - strokeWidth) / 2 - 1; // -1 for buffer\n const circumference = radius * 2 * Math.PI;\n\n // Calculate segments\n let cumulativePercent = 0;\n const segments =\n total === 0\n ? [\n {\n label: \"\",\n value: 0,\n color: \"neutral\",\n intensity: \"200\",\n dashArray: `${circumference} ${circumference}`,\n dashOffset: 0,\n onClick: undefined,\n },\n ]\n : resolvedItems.map((item) => {\n const percent = item.value / total;\n const dashArray = `${circumference * percent} ${circumference}`;\n const dashOffset = -circumference * cumulativePercent;\n cumulativePercent += percent;\n return {\n ...item,\n dashArray,\n dashOffset,\n };\n });\n\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n\n return (\n <StatTile\n {...props}\n body={\n <div className=\"flex flex-col h-full\">\n {/* Header with Navigation */}\n <div className=\"flex justify-between items-center mb-2 px-2\">\n <button\n onClick={handlePrev}\n disabled={currentIndex === 0}\n className={classNames(\n \"p-1 rounded-full transition-colors\",\n currentIndex === 0\n ? \"text-neutral-300 cursor-not-allowed\"\n : \"text-neutral-500 hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n data.length <= 1 && \"invisible\",\n )}\n >\n <CustomIcon icon=\"ArrowChevronLeft\" size=\"sm\" />\n </button>\n\n <span className=\"font-bold text-neutral-900 dark:text-white flex-1 text-center\">\n {currentDataset.label}\n </span>\n\n <button\n onClick={handleNext}\n disabled={currentIndex === data.length - 1}\n className={classNames(\n \"p-1 rounded-full transition-colors\",\n currentIndex === data.length - 1\n ? \"text-neutral-300 cursor-not-allowed\"\n : \"text-neutral-500 hover:bg-neutral-100 dark:hover:bg-neutral-800\",\n data.length <= 1 && \"invisible\",\n )}\n >\n <CustomIcon icon=\"ArrowChevronRight\" size=\"sm\" />\n </button>\n </div>\n\n {/* Chart Area */}\n <div className=\"relative flex-1 flex items-center justify-center min-h-55\">\n <svg\n className=\"transform -rotate-90 w-48 h-48 overflow-visible\"\n viewBox={`0 0 ${size} ${size}`}\n >\n {/* Background Circle (Optional, maybe not needed if full 100%) */}\n <circle\n className=\"text-neutral-100 dark:text-neutral-800\"\n strokeWidth={strokeWidth}\n stroke=\"currentColor\"\n fill=\"none\"\n r={radius}\n cx={size / 2}\n cy={size / 2}\n />\n\n {/* Segments - Render non-hovered first */}\n {segments.map((segment, idx) => {\n if (idx === hoveredIndex && total > 0) return null;\n return (\n <circle\n key={idx}\n className={classNames(\n `text-${segment.color}-${segment.intensity || \"500\"} transition-all duration-300 ease-out origin-center`,\n total > 0 &&\n \"hover:scale-110 hover:drop-shadow-lg cursor-pointer hover:opacity-90\",\n )}\n strokeWidth={strokeWidth}\n strokeDasharray={segment.dashArray}\n strokeDashoffset={segment.dashOffset}\n strokeLinecap={total > 0 ? \"round\" : undefined}\n stroke=\"currentColor\"\n fill=\"none\"\n r={radius}\n cx={size / 2}\n cy={size / 2}\n onMouseEnter={() => total > 0 && setHoveredIndex(idx)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={(e) => {\n if (total > 0 && segment.onClick) {\n e.stopPropagation();\n segment.onClick();\n }\n }}\n >\n {total > 0 && (\n <title>\n {segment.label}: {segment.value}\n </title>\n )}\n </circle>\n );\n })}\n\n {/* Render Hovered Segment Last (On Top) */}\n {hoveredIndex !== null &&\n total > 0 &&\n segments[hoveredIndex] &&\n (() => {\n const segment = segments[hoveredIndex];\n return (\n <circle\n key={hoveredIndex}\n className={classNames(\n `text-${segment.color}-${segment.intensity || \"500\"} transition-all duration-300 ease-out origin-center scale-110 drop-shadow-lg cursor-pointer opacity-90`,\n )}\n strokeWidth={strokeWidth}\n strokeDasharray={segment.dashArray}\n strokeDashoffset={segment.dashOffset}\n strokeLinecap=\"round\"\n stroke=\"currentColor\"\n fill=\"none\"\n r={radius}\n cx={size / 2}\n cy={size / 2}\n onMouseEnter={() => setHoveredIndex(hoveredIndex)}\n onMouseLeave={() => setHoveredIndex(null)}\n onClick={(e) => {\n if (segment.onClick) {\n e.stopPropagation();\n segment.onClick();\n }\n }}\n >\n <title>\n {segment.label}: {segment.value}\n </title>\n </circle>\n );\n })()}\n </svg>\n\n {/* Center Text */}\n <div className=\"absolute flex flex-col items-center justify-center text-center max-w-30\">\n <span className=\"text-4xl font-bold text-neutral-900 dark:text-white leading-none mb-1\">\n {total}\n </span>\n <span className=\"text-sm font-medium text-neutral-500 dark:text-neutral-400 leading-tight\">\n {currentDataset.centerLabel}\n </span>\n </div>\n </div>\n\n {/* Legend */}\n {total > 0 && (\n <div className=\"grid grid-cols-2 gap-x-6 gap-y-3 mt-4 px-2\">\n {resolvedItems.map((item, idx) => (\n <div\n key={idx}\n className={classNames(\n \"flex items-center justify-between min-w-0 group\",\n item.onClick\n ? \"cursor-pointer hover:bg-neutral-50 dark:hover:bg-neutral-800/50 rounded px-1 -mx-1\"\n : \"cursor-default\",\n )}\n title={`${item.label}: ${item.value}`}\n onClick={() => item.onClick && item.onClick()}\n >\n <div className=\"flex items-center min-w-0 mr-2\">\n <div\n className={`w-2.5 h-2.5 flex-none rounded-full bg-${item.color}-500 mr-2`}\n />\n <span className=\"text-xs text-neutral-600 dark:text-neutral-300 truncate group-hover:text-neutral-900 dark:group-hover:text-white transition-colors\">\n {item.label}\n </span>\n </div>\n <span className=\"text-xs font-bold text-neutral-900 dark:text-white flex-none\">\n {item.value}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n }\n />\n );\n};\n\nexport default StatChartTile;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { Panel, Loader } from \".\";\nimport { getStatTileColorClasses, type TrueColor } from \"../theme\";\nimport { CustomIcon } from \"./CustomIcon\";\nimport { type IconName } from \"../icons/registry\";\n\nexport interface StatTileTrend {\n value: string | number;\n direction: \"up\" | \"down\" | \"neutral\";\n label?: string;\n}\n\nexport interface StatTileMeta {\n text: React.ReactNode;\n icon?: IconName;\n variant?: \"text\" | \"badge\";\n color?: TrueColor;\n}\n\nexport interface StatTileError {\n icon?: IconName;\n message?: string;\n onRetry?: () => void;\n}\n\nexport interface StatTileProgress {\n value: number;\n label?: string;\n color?: TrueColor;\n}\n\nexport interface StatTileProps {\n title?: React.ReactNode;\n value?: React.ReactNode;\n subtitle?: React.ReactNode;\n body?: React.ReactNode;\n icon?: IconName;\n color?: TrueColor;\n trend?: StatTileTrend;\n progress?: StatTileProgress;\n meta?: StatTileMeta[];\n footer?: React.ReactNode;\n actions?: React.ReactNode;\n className?: string;\n onClick?: () => void;\n withDecoration?: boolean;\n withHoverEffect?: boolean;\n textColor?: TrueColor;\n loading?: boolean;\n spinnerVariant?: \"solid\" | \"segments\";\n spinnerThickness?: \"thin\" | \"normal\" | \"thick\";\n spinnerColor?: TrueColor;\n error?: StatTileError | null;\n}\n\nconst StatTile: React.FC<StatTileProps> = ({\n title,\n value,\n subtitle,\n body,\n icon,\n color = \"blue\",\n trend,\n progress,\n meta,\n footer,\n actions,\n className,\n onClick,\n withDecoration = false,\n withHoverEffect = false,\n textColor,\n loading = false,\n spinnerVariant,\n spinnerThickness,\n spinnerColor,\n error,\n}) => {\n const styles = getStatTileColorClasses(color);\n const showDecoration = withDecoration || !!icon;\n const effectiveTextColor = textColor || \"neutral\";\n\n // Determine value text color: use trend color if no textColor is set and trend exists\n const getValueTextColor = () => {\n if (textColor) {\n return `text-${textColor}-700 dark:text-${textColor}-100`;\n }\n if (trend) {\n if (trend.direction === \"up\") {\n return \"text-emerald-700 dark:text-emerald-400\";\n } else if (trend.direction === \"down\") {\n return \"text-rose-700 dark:text-rose-400\";\n }\n }\n return \"text-neutral-600 dark:text-neutral-400\";\n };\n\n return (\n <Panel\n variant=\"default\"\n corner=\"rounded\"\n padding=\"none\"\n flexBody={true}\n className={classNames(\n \"relative overflow-hidden transition-all duration-200\",\n className,\n {\n \"cursor-pointer\": !!onClick,\n \"hover:shadow-md\": !!onClick && !withHoverEffect,\n \"hover:-translate-y-1 hover:shadow-lg\": withHoverEffect,\n },\n )}\n onClick={onClick}\n >\n {/* Loading Overlay */}\n {loading && (\n <Loader\n overlay={true}\n glass={true}\n size=\"md\"\n color={spinnerColor || \"blue\"}\n spinnerVariant={spinnerVariant || \"segments\"}\n spinnerThickness={spinnerThickness || \"normal\"}\n variant=\"spinner\"\n />\n )}\n\n {/* Decorative Corner & Icon */}\n {showDecoration && (\n <div\n className={classNames(\n \"absolute -top-px -right-px w-24 h-24 rounded-bl-[100px] pointer-events-none transition-colors duration-200 z-0 flex items-start justify-end p-5\",\n styles.decorationBg,\n )}\n >\n {icon && (\n <div className={classNames(\"z-10 mt-px mr-px\", styles.iconColor)}>\n <CustomIcon icon={icon} size=\"lg\" />\n </div>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-5 flex flex-col h-full relative z-10\">\n {(!body || title || actions) && (\n <div\n className={classNames(\n \"flex justify-between items-start min-h-[28px]\",\n !showDecoration\n ? `mb-3 pb-2 border-b-2 border-${effectiveTextColor}-100 dark:border-${effectiveTextColor}-800`\n : \"mb-2\",\n )}\n >\n <div\n className={classNames(\n \"flex-1 min-w-0\",\n showDecoration ? \"pr-12\" : \"\",\n )}\n >\n <h3\n className={classNames(\n \"text-sm font-medium uppercase tracking-wide line-clamp-2\",\n textColor\n ? `text-${textColor}-500 dark:text-${textColor}-400`\n : \"text-neutral-500 dark:text-neutral-400\",\n )}\n >\n {title}\n </h3>\n </div>\n {actions && <div className=\"flex-none -mr-1\">{actions}</div>}\n </div>\n )}\n\n {/* Error State */}\n {error ? (\n <div className=\"flex flex-col items-center justify-center flex-grow py-2 text-center\">\n {error.icon && (\n <div className=\"text-rose-500 mb-2\">\n <CustomIcon icon={error.icon} size=\"md\" />\n </div>\n )}\n <p\n className={classNames(\n \"text-sm text-neutral-600 dark:text-neutral-400\",\n error.onRetry ? \"mb-3\" : \"\",\n )}\n >\n {error.message || \"Failed to load data\"}\n </p>\n {error.onRetry && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n error.onRetry?.();\n }}\n className=\"text-xs font-medium text-blue-600 hover:text-blue-700 hover:underline focus:outline-none\"\n >\n Try Again\n </button>\n )}\n </div>\n ) : body ? (\n body\n ) : (\n <>\n <div\n className={classNames(\n \"mt-1 mb-4 transition-all duration-500 ease-out delay-75\",\n loading\n ? \"opacity-0 translate-y-4\"\n : \"opacity-100 translate-y-0\",\n )}\n >\n <div className=\"flex items-baseline gap-3\">\n <span\n className={classNames(\n \"text-3xl font-bold tracking-tight translate-y-[3px]\",\n getValueTextColor(),\n )}\n >\n {value}\n </span>\n {trend && (\n <div\n className={classNames(\n \"flex items-center justify-center gap-1 text-sm font-semibold px-2 py-0.5 rounded-full\",\n trend.direction === \"up\"\n ? \"text-emerald-700 bg-emerald-50 dark:text-emerald-400 dark:bg-emerald-500/10\"\n : trend.direction === \"down\"\n ? \"text-rose-700 bg-rose-50 dark:text-rose-400 dark:bg-rose-500/10\"\n : \"text-neutral-600 bg-neutral-100 dark:text-neutral-400 dark:bg-neutral-800\",\n )}\n >\n <CustomIcon\n icon={\n (trend.direction === \"up\"\n ? \"ArrowUp\"\n : trend.direction === \"down\"\n ? \"ArrowDown\"\n : \"Equal\") as IconName\n }\n size=\"xs\"\n />\n <span className=\"translate-y-[0.5px]\">{trend.value}</span>\n </div>\n )}\n </div>\n {trend?.label && (\n <div className=\"mt-1 text-xs text-neutral-400 dark:text-neutral-500\">\n {trend.label}\n </div>\n )}\n {subtitle && (\n <div className=\"mt-1 text-sm text-neutral-500 dark:text-neutral-400\">\n {subtitle}\n </div>\n )}\n </div>\n\n {/* Progress Bar */}\n {progress !== undefined && (\n <div className=\"mt-auto pt-2\">\n <div className=\"flex justify-between text-xs mb-1.5\">\n <span className=\"font-medium text-neutral-600 dark:text-neutral-300\">\n {progress.label || \"Progress\"}\n </span>\n <span className=\"text-neutral-500\">{progress.value}%</span>\n </div>\n <div className=\"h-1.5 w-full bg-neutral-100 dark:bg-neutral-700 rounded-full overflow-hidden\">\n <div\n className={classNames(\n \"h-full rounded-full transition-all duration-500\",\n // Let's use simpler map:\n progress.color === \"blue\"\n ? \"bg-blue-500\"\n : progress.color\n ? `bg-${progress.color}-500`\n : `bg-${color}-500`,\n )}\n style={{\n width: `${Math.min(100, Math.max(0, progress.value))}%`,\n }}\n />\n </div>\n </div>\n )}\n\n {/* Meta Items or Footer */}\n {(meta || footer) && (\n <div className={classNames(\"mt-4 pt-4 border-t\", styles.divider)}>\n {meta && (\n <div className=\"flex flex-wrap gap-3\">\n {meta.map((item, idx) => (\n <div\n key={idx}\n className=\"flex items-center text-sm text-neutral-600 dark:text-neutral-300\"\n >\n {item.icon && (\n <CustomIcon\n icon={item.icon}\n size=\"sm\"\n className=\"mr-1.5 text-neutral-400\"\n />\n )}\n {item.text}\n </div>\n ))}\n </div>\n )}\n {footer && <div className=\"mt-2\">{footer}</div>}\n </div>\n )}\n </>\n )}\n </div>\n </Panel>\n );\n};\n\nexport default StatTile;\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { getStatTileColorClasses, type TrueColor } from \"../theme\";\nimport { Panel, Loader } from \".\";\nimport { CustomIcon } from \"./CustomIcon\";\nimport { type IconName } from \"../icons/registry\";\n\nexport interface StatCountTileBreakdown {\n label: string;\n value: string | number;\n color?: TrueColor;\n}\n\nexport interface StatCountTileProps {\n title?: React.ReactNode;\n count?: React.ReactNode;\n breakdown?: StatCountTileBreakdown[];\n icon?: IconName;\n color?: TrueColor;\n className?: string;\n onClick?: () => void;\n withDecoration?: boolean;\n withHoverEffect?: boolean;\n textColor?: TrueColor;\n loading?: boolean;\n spinnerVariant?: \"solid\" | \"segments\";\n spinnerThickness?: \"thin\" | \"normal\" | \"thick\";\n spinnerColor?: TrueColor;\n error?: {\n icon?: IconName;\n message?: string;\n onRetry?: () => void;\n variant?: \"text\" | \"badge\";\n } | null;\n}\n\nexport const StatCountTile: React.FC<StatCountTileProps> = ({\n title,\n count,\n breakdown,\n icon,\n color = \"blue\",\n className,\n onClick,\n withDecoration = false,\n withHoverEffect = false,\n textColor,\n loading = false,\n spinnerVariant,\n spinnerThickness,\n spinnerColor,\n error,\n}) => {\n const styles = getStatTileColorClasses(color);\n const showDecoration = withDecoration || !!icon;\n const effectiveTextColor = textColor || \"neutral\";\n\n return (\n <Panel\n variant=\"default\"\n corner=\"rounded\"\n padding=\"none\"\n flexBody={true}\n className={classNames(\n \"relative overflow-hidden transition-all duration-200\",\n className,\n {\n \"cursor-pointer\": !!onClick,\n \"hover:shadow-md\": !!onClick && !withHoverEffect,\n \"hover:-translate-y-1 hover:shadow-lg\": withHoverEffect,\n },\n )}\n onClick={onClick}\n >\n {/* Loading Overlay */}\n {loading && (\n <Loader\n overlay={true}\n glass={true}\n size=\"md\"\n color={spinnerColor || \"blue\"}\n spinnerVariant={spinnerVariant || \"segments\"}\n spinnerThickness={spinnerThickness || \"normal\"}\n variant=\"spinner\"\n />\n )}\n\n {/* Decorative Corner & Icon */}\n {showDecoration && (\n <div\n className={classNames(\n \"absolute -top-px -right-px w-24 h-24 rounded-bl-[100px] pointer-events-none transition-colors duration-200 z-0 flex items-start justify-end p-5\",\n styles.decorationBg,\n )}\n >\n {icon && (\n <div className={classNames(\"z-10 mt-px mr-px\", styles.iconColor)}>\n <CustomIcon icon={icon} size=\"lg\" />\n </div>\n )}\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-5 flex flex-col h-full relative z-10\">\n {/* Header */}\n <div\n className={classNames(\n \"flex justify-between items-start min-h-[28px]\",\n !showDecoration\n ? `mb-3 pb-2 border-b-2 border-${effectiveTextColor}-100 dark:border-${effectiveTextColor}-800`\n : \"mb-4\",\n )}\n >\n <div\n className={classNames(\n \"flex-1 min-w-0\",\n showDecoration ? \"pr-12\" : \"\",\n )}\n >\n <h3\n className={classNames(\n \"text-sm font-medium uppercase tracking-wide line-clamp-2\",\n textColor\n ? `text-${textColor}-500 dark:text-${textColor}-400`\n : \"text-neutral-500 dark:text-neutral-400\",\n )}\n >\n {title}\n </h3>\n </div>\n </div>\n\n {/* Main Body */}\n {error ? (\n <div className=\"flex flex-col items-center justify-center flex-grow py-2 text-center\">\n {error.icon && (\n <div className=\"text-rose-500 mb-2\">\n <CustomIcon icon={error.icon} size=\"md\" />\n </div>\n )}\n <p\n className={classNames(\n \"text-sm text-neutral-600 dark:text-neutral-400\",\n error.onRetry ? \"mb-3\" : \"\",\n )}\n >\n {error.message || \"Failed to load data\"}\n </p>\n {error.onRetry && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n error.onRetry?.();\n }}\n className=\"text-xs font-medium text-blue-600 hover:text-blue-700 hover:underline focus:outline-none\"\n >\n Try Again\n </button>\n )}\n </div>\n ) : (\n <>\n <div\n className={classNames(\n \"mt-1 mb-6 transition-all duration-500 ease-out delay-75\",\n loading\n ? \"opacity-0 translate-y-4\"\n : \"opacity-100 translate-y-0\",\n )}\n >\n <span\n className={classNames(\n \"text-5xl font-black tracking-tight\",\n textColor\n ? `text-${textColor}-700 dark:text-${textColor}-100`\n : \"bg-gradient-to-br from-slate-900 via-slate-800 to-slate-600 dark:from-white dark:to-slate-400 bg-clip-text text-transparent\",\n )}\n >\n {count}\n </span>\n </div>\n\n {/* Breakdown */}\n {breakdown && breakdown.length > 0 && (\n <div className=\"mt-auto space-y-3\">\n {breakdown.map((item, idx) => (\n <div\n key={idx}\n className=\"flex items-center justify-between text-sm\"\n >\n <span className=\"text-neutral-500 dark:text-neutral-400 font-medium\">\n {item.label}\n </span>\n <div className=\"flex items-center gap-2\">\n <span\n className={classNames(\n \"font-semibold\",\n item.color\n ? `text-${item.color}-600 dark:text-${item.color}-400`\n : \"text-neutral-700 dark:text-neutral-200\",\n )}\n >\n {item.value}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n </Panel>\n );\n};\n\nexport default StatCountTile;\n","import React, { useMemo } from \"react\";\nimport classNames from \"classnames\";\nimport StatTile from \"./StatTile\";\nimport type { StatTileProps } from \"./StatTile\";\nimport { CustomIcon } from \"./CustomIcon\";\nimport { type IconName } from \"../icons/registry\";\nimport type { TrueColor } from \"../theme\";\nimport { getColorPaletteNames } from \"../theme\";\n\nexport interface StatGoalItem {\n value: number;\n label: string;\n icon: IconName;\n /** Omit to auto-assign from the theme palette. */\n color?: TrueColor;\n tooltip?: string;\n}\n\nexport interface StatGoalTileProps\n extends Omit<StatTileProps, \"body\" | \"value\" | \"subtitle\"> {\n goals: StatGoalItem[];\n}\n\nconst CircularProgress: React.FC<{\n value: number;\n color: TrueColor;\n icon: IconName;\n size?: number;\n strokeWidth?: number;\n}> = ({ value, color, icon, size = 56, strokeWidth = 4 }) => {\n const radius = (size - strokeWidth) / 2 - 1;\n const circumference = radius * 2 * Math.PI;\n const offset = circumference - (value / 100) * circumference;\n\n // Map theme colors to hex or specific tailwind classes for stroke\n // Since we can't easily adhere to \"stroke-current\" with dynamic colors in SVG stroke attribute without complex mapping or specific classes\n // We will use standard tailwind text classes on the SVG and use `stroke=\"currentColor\"`\n\n return (\n <div\n className=\"relative inline-flex items-center justify-center shrink-0\"\n style={{ width: size, height: size }}\n >\n <svg className=\"transform -rotate-90 w-full h-full overflow-visible\">\n {/* Background Circle */}\n <circle\n className=\"text-neutral-100 dark:text-neutral-800\"\n strokeWidth={strokeWidth}\n stroke=\"currentColor\"\n fill=\"transparent\"\n r={radius}\n cx={size / 2}\n cy={size / 2}\n />\n {/* Progress Circle */}\n <circle\n className={classNames(\n `text-${color}-500 transition-all duration-1000 ease-out`,\n )}\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n stroke=\"currentColor\"\n fill=\"transparent\"\n r={radius}\n cx={size / 2}\n cy={size / 2}\n />\n </svg>\n <div className={classNames(`absolute text-${color}-500`)}>\n <CustomIcon icon={icon} size=\"md\" />\n </div>\n </div>\n );\n};\n\nconst StatGoalTile: React.FC<StatGoalTileProps> = ({ goals, ...props }) => {\n const resolvedGoals = useMemo(() => {\n const palette = getColorPaletteNames(goals.length);\n return goals.map((g, i) => ({\n ...g,\n color: (g.color ?? palette[i]) as TrueColor,\n }));\n }, [goals]);\n\n return (\n <StatTile\n {...props}\n body={\n <div className=\"flex flex-col h-full justify-center\">\n {resolvedGoals.map((goal, idx) => (\n <React.Fragment key={idx}>\n <div\n className=\"flex items-center gap-4 py-3 first:pt-0 last:pb-0\"\n title={goal.tooltip}\n >\n <CircularProgress\n value={goal.value}\n color={goal.color}\n icon={goal.icon}\n />\n <div className=\"flex flex-col\">\n <span className=\"text-2xl font-bold text-neutral-900 dark:text-white leading-none\">\n {goal.value}%\n </span>\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400 font-medium mt-1\">\n {goal.label}\n </span>\n </div>\n </div>\n {idx < goals.length - 1 && (\n <div className=\"h-px bg-neutral-100 dark:bg-neutral-800 my-1 w-full\" />\n )}\n </React.Fragment>\n ))}\n </div>\n }\n />\n );\n};\n\nexport default StatGoalTile;\n","import React, {\n useRef,\n useState,\n useCallback,\n useMemo,\n useEffect,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n BarChart,\n Bar,\n XAxis,\n YAxis,\n CartesianGrid,\n ResponsiveContainer,\n LineChart,\n Line,\n Tooltip as RechartsTooltip,\n} from \"recharts\";\nimport StatTile from \"./StatTile\";\nimport type { StatTileProps } from \"./StatTile\";\nimport type { TrueColor } from \"../theme\";\nimport { getColorPaletteNames } from \"../theme\";\n\nexport interface StatGraphSeries {\n key: string;\n label: string;\n /** Omit to auto-assign from the theme palette. */\n color?: TrueColor;\n}\n\nexport interface StatGraphTileProps\n extends Omit<\n StatTileProps,\n \"body\" | \"progress\" | \"trend\" | \"meta\" | \"footer\"\n > {\n data: any[];\n variant: \"bar\" | \"sparkline\";\n series: StatGraphSeries[];\n height?: number;\n showLegend?: boolean;\n showAxes?: boolean;\n showGrid?: boolean;\n showTooltip?: boolean;\n /** Y-axis domain for sparkline. Defaults to [0, 'auto']. Use ['auto', 'auto'] for auto-scaling. */\n yDomain?: [number | string, number | string];\n /** Enable chart enter/update animation. Keep disabled for high-frequency realtime updates. */\n chartAnimation?: boolean;\n /** Animation duration when chartAnimation is enabled. */\n chartAnimationDuration?: number;\n /** Optional cap for rendered data points to reduce chart redraw work. */\n maxDataPoints?: number;\n}\n\n// ── Portal tooltip (same approach as MultiProgressBar) ────────────────────────\n\ninterface TooltipState {\n x: number;\n y: number;\n payload: any[];\n label: string;\n}\n\ninterface TooltipSnapshot {\n x: number;\n y: number;\n label: string;\n keys: string;\n values: string;\n}\n\nfunction PortalTooltip({\n tooltip,\n series,\n getColor,\n}: {\n tooltip: TooltipState | null;\n series: StatGraphSeries[];\n getColor: (color: string) => string;\n}) {\n if (!tooltip || tooltip.payload.length === 0) return null;\n\n return createPortal(\n <div\n className=\"fixed z-[9999] pointer-events-none\"\n style={{\n left: tooltip.x,\n top: tooltip.y,\n transform: \"translate(-50%, calc(-100% - 12px))\",\n }}\n >\n <div className=\"bg-neutral-900 dark:bg-white text-white dark:text-neutral-900 rounded-lg px-3 py-2 text-xs whitespace-nowrap shadow-xl ring-1 ring-black/10 dark:ring-black/5 min-w-[100px]\">\n {tooltip.payload.map((entry: any) => {\n const s = series.find((s) => s.key === entry.dataKey);\n return (\n <div key={entry.dataKey} className=\"flex items-center gap-2\">\n <span\n className=\"w-2 h-2 rounded-full flex-shrink-0\"\n style={{\n backgroundColor: entry.fill ?? getColor(s?.color ?? \"blue\"),\n }}\n />\n <span className=\"font-semibold\">{entry.value}</span>\n {s && (\n <span className=\"text-neutral-400 dark:text-neutral-500\">\n {s.label}\n </span>\n )}\n </div>\n );\n })}\n </div>\n {/* Arrow */}\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 border-x-[5px] border-x-transparent border-t-[5px] border-t-neutral-900 dark:border-t-white\" />\n </div>,\n document.body,\n );\n}\n\n// Recharts custom content — renders nothing; we use it only to intercept hover state\nfunction SilentTooltipContent() {\n return null;\n}\n\n// ── StatGraphTile ─────────────────────────────────────────────────────────────\n\nconst StatGraphTile: React.FC<StatGraphTileProps> = ({\n data,\n variant = \"bar\",\n series,\n height = 200,\n showLegend = true,\n showAxes = true,\n showGrid = true,\n showTooltip = true,\n yDomain = [0, \"auto\"],\n chartAnimation = true,\n chartAnimationDuration = 250,\n maxDataPoints = 0,\n ...props\n}) => {\n const [tooltip, setTooltip] = useState<TooltipState | null>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const tooltipFrameRef = useRef<number | null>(null);\n const tooltipSnapshotRef = useRef<TooltipSnapshot | null>(null);\n\n useEffect(() => {\n return () => {\n if (tooltipFrameRef.current != null) {\n cancelAnimationFrame(tooltipFrameRef.current);\n }\n };\n }, []);\n\n // Graph colors helper\n const getColor = useCallback((color: string) => {\nconst colorMap: Record<string, string> = {\n // Spectrum colors (Tailwind 500 hex values)\n red: \"#ef4444\",\n orange: \"#f97316\",\n amber: \"#f59e0b\",\n yellow: \"#eab308\",\n lime: \"#84cc16\",\n green: \"#22c55e\",\n emerald: \"#10b981\",\n teal: \"#14b8a6\",\n cyan: \"#06b6d4\",\n sky: \"#0ea5e9\",\n blue: \"#3b82f6\",\n indigo: \"#6366f1\",\n violet: \"#8b5cf6\",\n purple: \"#a855f7\",\n fuchsia: \"#d946ef\",\n pink: \"#ec4899\",\n rose: \"#f43f5e\",\n slate: \"#64748b\",\n gray: \"#6b7280\",\n zinc: \"#71717a\",\n neutral: \"#737373\",\n stone: \"#78716c\",\n };\n return colorMap[color] || \"#3b82f6\";\n }, []);\n\n const resolvedSeries = useMemo(() => {\n const palette = getColorPaletteNames(series.length);\n return series.map((s, i) => ({\n ...s,\n color: (s.color ?? palette[i]) as TrueColor,\n }));\n }, [series]);\n\n const chartData = useMemo(() => {\n if (!maxDataPoints || maxDataPoints <= 0 || data.length <= maxDataPoints)\n return data;\n return data.slice(-maxDataPoints);\n }, [data, maxDataPoints]);\n\n const queueTooltipUpdate = useCallback((next: TooltipState | null) => {\n if (tooltipFrameRef.current != null) {\n cancelAnimationFrame(tooltipFrameRef.current);\n }\n\n tooltipFrameRef.current = requestAnimationFrame(() => {\n tooltipFrameRef.current = null;\n\n if (!next) {\n if (tooltipSnapshotRef.current === null) return;\n tooltipSnapshotRef.current = null;\n setTooltip(null);\n return;\n }\n\n const snapshot: TooltipSnapshot = {\n x: next.x,\n y: next.y,\n label: next.label,\n keys: next.payload\n .map((entry: any) => String(entry.dataKey ?? \"\"))\n .join(\"|\"),\n values: next.payload\n .map((entry: any) => String(entry.value ?? \"\"))\n .join(\"|\"),\n };\n\n const prev = tooltipSnapshotRef.current;\n if (\n prev &&\n prev.x === snapshot.x &&\n prev.y === snapshot.y &&\n prev.label === snapshot.label &&\n prev.keys === snapshot.keys &&\n prev.values === snapshot.values\n ) {\n return;\n }\n\n tooltipSnapshotRef.current = snapshot;\n setTooltip(next);\n });\n }, []);\n\n // Custom Recharts tooltip renderer — silently tracks hover position/payload into portal state\n const rechartsTooltipContent = useCallback(\n ({ active, payload, label, coordinate }: any) => {\n if (!showTooltip) return null;\n if (active && payload && payload.length > 0 && coordinate) {\n const wrapperEl = wrapperRef.current;\n if (wrapperEl) {\n const rect = wrapperEl.getBoundingClientRect();\n const absX = rect.left + (coordinate.x ?? 0);\n const absY = rect.top + (coordinate.y ?? 0);\n queueTooltipUpdate({ x: absX, y: absY, payload, label: label ?? \"\" });\n }\n } else {\n queueTooltipUpdate(null);\n }\n return <SilentTooltipContent />;\n },\n [showTooltip, queueTooltipUpdate],\n );\n\n // Legend (bar only)\n const customActions = useMemo(() => {\n if (!showLegend || variant !== \"bar\") return null;\n return (\n <div className=\"flex items-center space-x-4\">\n {resolvedSeries.map((s) => (\n <div key={s.key} className=\"flex items-center\">\n <div\n className=\"w-2.5 h-2.5 rounded-full mr-2\"\n style={{ backgroundColor: getColor(s.color) }}\n />\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400 font-medium\">\n {s.label}\n </span>\n </div>\n ))}\n </div>\n );\n }, [showLegend, variant, resolvedSeries, getColor]);\n\n const textColor = \"#64748b\";\n const gridColor = \"#e2e8f0\";\n\n const renderChart = () => {\n if (variant === \"bar\") {\n return (\n <div\n ref={wrapperRef}\n className=\"relative\"\n onMouseLeave={() => queueTooltipUpdate(null)}\n >\n <ResponsiveContainer width=\"100%\" height={height}>\n <BarChart\n data={chartData}\n barSize={8}\n margin={{ top: 10, right: 0, left: -20, bottom: 0 }}\n >\n {showGrid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n vertical={false}\n stroke={gridColor}\n opacity={0.5}\n />\n )}\n {showAxes && (\n <>\n <XAxis\n dataKey=\"name\"\n axisLine={false}\n tickLine={false}\n tick={{ fill: textColor, fontSize: 12 }}\n dy={10}\n />\n <YAxis\n axisLine={false}\n tickLine={false}\n tick={{ fill: textColor, fontSize: 12 }}\n />\n </>\n )}\n <RechartsTooltip\n content={rechartsTooltipContent}\n cursor={{ fill: \"rgba(100,116,139,0.05)\" }}\n isAnimationActive={false}\n />\n {resolvedSeries.map((s) => (\n <Bar\n key={s.key}\n dataKey={s.key}\n fill={getColor(s.color)}\n radius={[4, 4, 4, 4]}\n isAnimationActive={chartAnimation}\n animationDuration={\n chartAnimation ? chartAnimationDuration : 0\n }\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n <PortalTooltip\n tooltip={tooltip}\n series={resolvedSeries}\n getColor={getColor}\n />\n </div>\n );\n }\n\n if (variant === \"sparkline\") {\n return (\n <div\n ref={wrapperRef}\n className=\"relative\"\n onMouseLeave={() => queueTooltipUpdate(null)}\n >\n <ResponsiveContainer width=\"100%\" height={80}>\n <LineChart data={chartData}>\n <YAxis domain={yDomain} hide />\n <Line\n type=\"monotone\"\n dataKey={resolvedSeries[0].key}\n stroke={getColor(resolvedSeries[0].color)}\n strokeWidth={3}\n dot={false}\n activeDot={{ r: 6, strokeWidth: 0 }}\n isAnimationActive={chartAnimation}\n animationDuration={chartAnimation ? chartAnimationDuration : 0}\n />\n {showTooltip && (\n <RechartsTooltip\n content={rechartsTooltipContent}\n cursor={false}\n isAnimationActive={false}\n />\n )}\n </LineChart>\n </ResponsiveContainer>\n <PortalTooltip\n tooltip={tooltip}\n series={resolvedSeries}\n getColor={getColor}\n />\n </div>\n );\n }\n return null;\n };\n\n return (\n <StatTile\n {...props}\n actions={customActions || props.actions}\n body={\n <div className=\"flex flex-col h-full w-full\">\n {variant === \"sparkline\" && (\n <div className=\"mt-2 mb-4 px-1\">\n {renderChart()}\n <div className=\"mt-4\">\n <div className=\"text-3xl font-bold text-neutral-900 dark:text-white\">\n {props.value}\n </div>\n {props.subtitle && (\n <div className=\"text-sm text-neutral-500 dark:text-neutral-400 mt-1\">\n {props.subtitle}\n </div>\n )}\n </div>\n </div>\n )}\n {variant === \"bar\" && <div className=\"mt-4\">{renderChart()}</div>}\n </div>\n }\n />\n );\n};\n\nexport default StatGraphTile;\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { type PanelTone, Loader, type LoaderProps } from \".\";\nimport { useStepper } from \"../hooks\";\nimport { getStepperTonePalette } from \"../theme\";\nimport { type IconName } from \"../icons/registry\";\nimport { renderIcon } from \"../utils/renderIcon\";\n\nexport type StepStatus = \"pending\" | \"active\" | \"completed\" | \"error\";\n\nexport interface StepperStep {\n id?: string;\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n description?: React.ReactNode;\n content?: React.ReactNode;\n icon?: IconName | React.ReactElement;\n optionalLabel?: React.ReactNode;\n status?: StepStatus;\n disabled?: boolean;\n}\n\nexport type Step = StepperStep;\n\nexport type StepperOrientation = \"horizontal\" | \"vertical\";\nexport type StepperVariant = \"card\" | \"minimal\";\nexport type StepperSize = \"sm\" | \"md\" | \"lg\";\nexport type StepperConnector = \"line\" | \"progress\" | \"none\";\nexport type StepperProgressBarPosition = \"top\" | \"bottom\";\nexport type StepperConnectorAlign = \"left\" | \"center\" | \"right\";\n\nexport interface StepperProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n steps: StepperStep[];\n currentIndex?: number;\n currentStepId?: string;\n defaultCurrentIndex?: number;\n defaultCurrentStepId?: string;\n completedStepIds?: string[];\n orientation?: StepperOrientation;\n variant?: StepperVariant;\n size?: StepperSize;\n tone?: PanelTone;\n connector?: StepperConnector;\n interactive?: boolean;\n readOnly?: boolean;\n animated?: boolean;\n transitionMs?: number;\n showProgressSummary?: boolean;\n showProgressBar?: boolean;\n progressBarPosition?: \"top\" | \"bottom\";\n progressPrecision?: number;\n progressLabel?: React.ReactNode;\n onChange?: (index: number, stepId?: string) => void;\n onStepClick?: (step: StepperStep, index: number) => void;\n renderActions?: (step: StepperStep, index: number) => React.ReactNode;\n loaderStepIds?: string[];\n loading?: boolean;\n loaderTitle?: React.ReactNode;\n loaderMessage?: React.ReactNode;\n loaderType?: LoaderProps[\"variant\"];\n loaderProgress?: number;\n loaderColor?: LoaderProps[\"color\"];\n wrapperClassName?: string;\n headerClassName?: string;\n stepClassName?: string;\n contentClassName?: string;\n stepMaxHeight?: number | string;\n connectNodes?: boolean;\n connectorAlign?: StepperConnectorAlign;\n /** Override whether the underline bar is shown beneath each step's title/subtitle. When omitted the variant default is used (`card` → true, `minimal` → false). */\n showStepUnderline?: boolean;\n}\n\nconst sizeTokens: Record<\n StepperSize,\n {\n node: string;\n nodeText: string;\n title: string;\n subtitle: string;\n description: string;\n optional: string;\n gap: string;\n underlineHeight: string;\n }\n> = {\n sm: {\n node: \"h-9 w-9 text-xs\",\n nodeText: \"text-xs\",\n title: \"text-sm font-semibold\",\n subtitle: \"text-xs font-medium text-neutral-500 dark:text-neutral-400\",\n description: \"text-xs text-neutral-500 dark:text-neutral-400\",\n optional: \"text-[11px] italic text-neutral-400 dark:text-neutral-500\",\n gap: \"gap-2.5\",\n underlineHeight: \"h-0.5\",\n },\n md: {\n node: \"h-10 w-10 text-sm\",\n nodeText: \"text-sm\",\n title: \"text-base font-semibold\",\n subtitle: \"text-sm font-medium text-neutral-500 dark:text-neutral-400\",\n description: \"text-sm text-neutral-500 dark:text-neutral-400\",\n optional: \"text-xs italic text-neutral-400 dark:text-neutral-500\",\n gap: \"gap-3\",\n underlineHeight: \"h-[3px]\",\n },\n lg: {\n node: \"h-12 w-12 text-base\",\n nodeText: \"text-base\",\n title: \"text-lg font-semibold\",\n subtitle: \"text-sm font-medium text-neutral-500 dark:text-neutral-400\",\n description: \"text-sm text-neutral-500 dark:text-neutral-400\",\n optional: \"text-sm italic text-neutral-400 dark:text-neutral-500\",\n gap: \"gap-4\",\n underlineHeight: \"h-1\",\n },\n};\n\nconst variantConfig: Record<\n StepperVariant,\n {\n headerPadding: string;\n showDescription: boolean;\n emphasizeActiveTitle: boolean;\n showUnderline: boolean;\n }\n> = {\n card: {\n headerPadding: \"px-2 py-1.5\",\n showDescription: true,\n emphasizeActiveTitle: true,\n showUnderline: false,\n },\n minimal: {\n headerPadding: \"px-1 py-1\",\n showDescription: false,\n emphasizeActiveTitle: true,\n showUnderline: false,\n },\n};\n\nconst statusIcon: Record<StepStatus, IconName | undefined> = {\n pending: undefined,\n active: undefined,\n completed: \"CheckCircle\",\n error: \"Error\",\n};\n\nconst convertToBg = (value: string): string =>\n value\n .split(\" \")\n .map((token) => {\n if (token.startsWith(\"bg-\") || token.startsWith(\"dark:bg-\")) {\n return token;\n }\n if (token.startsWith(\"border-\")) {\n return token.replace(\"border-\", \"bg-\");\n }\n if (token.startsWith(\"dark:border-\")) {\n return token.replace(\"dark:border-\", \"dark:bg-\");\n }\n return \"\";\n })\n .filter(Boolean)\n .join(\" \");\n\nconst nodeRadii: Record<StepperSize, number> = {\n sm: 18,\n md: 20,\n lg: 24,\n};\n\nconst connectorThickness: Record<StepperSize, string> = {\n sm: \"h-[3px]\",\n md: \"h-1\",\n lg: \"h-[5px]\",\n};\n\nconst verticalConnectorThickness: Record<StepperSize, string> = {\n sm: \"w-[3px]\",\n md: \"w-1\",\n lg: \"w-[5px]\",\n};\nexport const Stepper: React.FC<StepperProps> = ({\n steps,\n currentIndex,\n currentStepId,\n defaultCurrentIndex,\n defaultCurrentStepId,\n completedStepIds,\n orientation = \"horizontal\",\n variant = \"card\",\n size = \"md\",\n tone = \"blue\",\n connector = \"progress\",\n interactive = true,\n readOnly,\n showProgressSummary = false,\n showProgressBar = false,\n progressPrecision = 0,\n progressLabel,\n onChange,\n onStepClick,\n loaderStepIds,\n loading = false,\n loaderTitle,\n loaderMessage,\n loaderType = \"spinner\",\n loaderProgress,\n loaderColor,\n wrapperClassName,\n headerClassName,\n stepClassName,\n contentClassName,\n stepMaxHeight,\n connectNodes = false,\n connectorAlign = \"center\",\n showStepUnderline,\n className,\n style,\n ...rest\n}) => {\n const state = useStepper(steps, {\n currentIndex,\n currentStepId,\n defaultCurrentIndex,\n defaultCurrentStepId,\n completedStepIds,\n onChange,\n });\n const nodeRefs = useRef<(HTMLDivElement | HTMLButtonElement | null)[]>([]);\n const verticalContainerRef = useRef<HTMLDivElement | null>(null);\n const [verticalSegments, setVerticalSegments] = useState<number[]>([]);\n\n const palette = getStepperTonePalette(tone);\n const sizeToken = sizeTokens[size];\n const connectorThicknessClass = connectorThickness[size];\n const verticalConnectorThicknessClass = verticalConnectorThickness[size];\n const variantToken = variantConfig[variant];\n const isInteractive = interactive && !readOnly;\n const loaderSet = useMemo(\n () => new Set(loaderStepIds ?? []),\n [loaderStepIds],\n );\n const connectorBaseClasses = convertToBg(palette.underlineBase);\n const connectorActiveClasses = convertToBg(palette.activeBg);\n\n const progressPercent = Math.min(100, Math.max(0, state.progressPercent));\n const formattedProgress =\n Math.round(progressPercent * Math.pow(10, progressPrecision)) /\n Math.pow(10, progressPrecision);\n\n const activeStep = steps[state.currentIndex];\n\n const stepMeta = steps.map((step, index) => {\n const resolvedId = step.id ?? String(index);\n const derivedActive = state.isActive(resolvedId, index);\n const derivedCompleted = state.isCompleted(resolvedId, index);\n const status: StepStatus =\n step.status ??\n (derivedActive ? \"active\" : derivedCompleted ? \"completed\" : \"pending\");\n\n // A step that is active is never \"completed\" for connector-fill purposes,\n // even if its id appears in completedStepIds or its explicit status is \"completed\".\n const isCompleted =\n (step.status ? step.status === \"completed\" : derivedCompleted) &&\n !derivedActive;\n\n const nodeBaseClass =\n variant === \"minimal\"\n ? \"rounded-md border flex items-center justify-center font-semibold transition-all duration-200\"\n : \"rounded-full border flex items-center justify-center font-semibold transition-all duration-200\";\n\n const nodeClasses = classNames(\n nodeBaseClass,\n sizeToken.node,\n sizeToken.nodeText,\n step.disabled && \"opacity-60\",\n status === \"active\" && [\n palette.activeBg,\n palette.activeText,\n \"border-transparent shadow-sm\",\n ],\n status === \"completed\" && [\n palette.completedBg,\n palette.completedText,\n \"border-transparent shadow-sm\",\n ],\n status === \"pending\" && [\n \"bg-white dark:bg-neutral-900\",\n palette.pendingBorder,\n palette.pendingText,\n ],\n status === \"error\" &&\n \"bg-rose-500 text-white border-transparent shadow-sm\",\n );\n\n const underlineClasses =\n connector !== \"none\"\n ? classNames(\n \"w-full transition-all duration-200 ease-out rounded-full\",\n sizeToken.underlineHeight,\n palette.underlineBase,\n )\n : \"\";\n\n const textStyle =\n stepMaxHeight !== undefined\n ? {\n maxHeight:\n typeof stepMaxHeight === \"number\"\n ? `${stepMaxHeight}px`\n : stepMaxHeight,\n }\n : undefined;\n\n const nodeIcon = step.icon ?? statusIcon[status];\n const isLoadingStep = loaderSet.has(resolvedId);\n\n return {\n step,\n index,\n resolvedId,\n status,\n nodeClasses,\n underlineClasses,\n textStyle,\n nodeIcon,\n isLoadingStep,\n isCompleted,\n };\n });\n nodeRefs.current.length = stepMeta.length;\n\n useLayoutEffect(() => {\n if (orientation !== \"vertical\") {\n if (verticalSegments.length !== 0) {\n setVerticalSegments([]);\n }\n return;\n }\n\n const measure = () => {\n const container = verticalContainerRef.current;\n if (!container) return;\n const nodes = nodeRefs.current;\n if (nodes.length < 2) {\n setVerticalSegments([]);\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const centers: number[] = [];\n for (const node of nodes) {\n if (!node) {\n return;\n }\n const rect = node.getBoundingClientRect();\n centers.push(rect.top + rect.height / 2 - containerRect.top);\n }\n const segments = centers\n .slice(0, -1)\n .map((value, idx) => centers[idx + 1] - value);\n setVerticalSegments((prev) => {\n if (\n prev.length === segments.length &&\n prev.every((value, idx) => value === segments[idx])\n ) {\n return prev;\n }\n return segments;\n });\n };\n\n measure();\n window.addEventListener(\"resize\", measure);\n return () => window.removeEventListener(\"resize\", measure);\n }, [orientation, steps, completedStepIds, loaderStepIds, state.currentIndex]);\n\n const progressBlock =\n showProgressBar || showProgressSummary ? (\n <div className=\"mt-6 flex w-full flex-col gap-2\">\n {showProgressSummary && (\n <div className=\"flex items-center justify-between text-sm font-medium text-neutral-500 dark:text-neutral-400\">\n <span>{progressLabel ?? \"Progress\"}</span>\n <span>{formattedProgress}%</span>\n </div>\n )}\n {showProgressBar && (\n <div className=\"relative h-1 w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-800\">\n <div\n className={classNames(\n \"absolute inset-y-0 left-0 rounded-full transition-all duration-300 ease-out\",\n palette.completedBg,\n )}\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n )}\n </div>\n ) : null;\n\n const renderNodeRow = () => {\n const rowGapClass = connectNodes ? \"gap-0\" : \"gap-2\";\n const nodeRadius = nodeRadii[size];\n let connectorWidth = `calc(50% + ${nodeRadius}px)`;\n let leftNodeStyle =\n connectorAlign === \"left\"\n ? \"calc(50% * -1)\"\n : connectorAlign === \"right\"\n ? `${nodeRadius * 4}px`\n : `-${nodeRadius}px`;\n let rightNodeStyle =\n connectorAlign === \"left\"\n ? \"unset\"\n : connectorAlign === \"right\"\n ? \"calc(50% * -1)\"\n : `-${nodeRadius}px`;\n\n return (\n <div className={classNames(\"flex items-center\", rowGapClass)}>\n {stepMeta.map((meta, idx) => {\n const {\n resolvedId,\n nodeClasses,\n nodeIcon,\n isLoadingStep,\n step,\n isCompleted,\n } = meta;\n const NodeTag = isInteractive && !step.disabled ? \"button\" : \"div\";\n\n const handleClick = () => {\n if (!isInteractive || step.disabled) return;\n state.goToIndex(idx);\n onStepClick?.(step, idx);\n };\n\n let showLeft = connectNodes && connector !== \"none\" && idx > 0;\n let showRight =\n connectNodes && connector !== \"none\" && idx < stepMeta.length - 1;\n let segmentSize = \"pl-4 pr-2\";\n if (!connectNodes) {\n if (connectorAlign === \"left\") {\n showRight = false;\n showLeft = false;\n segmentSize = \"pl-4 pr-2 flex-1\";\n leftNodeStyle = \"0px\";\n }\n if (connectorAlign === \"center\") {\n showLeft = connector !== \"none\" && idx > 0;\n showRight = connector !== \"none\" && idx < stepMeta.length - 1;\n connectorWidth = `calc(50% - ${nodeRadius}px)`;\n rightNodeStyle = `0px`;\n }\n if (connectorAlign === \"right\") {\n showLeft = connector !== \"none\" && idx > 0;\n showRight = false;\n // Connector spans from the previous cell's right edge (= left: 0)\n // to just before the current node (= calc(100% - 2r)).\n leftNodeStyle = \"0px\";\n connectorWidth = `calc(100% - ${nodeRadius * 2}px)`;\n }\n }\n const previousStep = stepMeta[idx - 1];\n const previousCompleted = previousStep?.isCompleted ?? false;\n const currentCompleted = isCompleted;\n // For right-align the absolute left-connector handles the line; the flex segment would push the node off the right edge.\n const detachedSegment =\n !connectNodes &&\n connector !== \"none\" &&\n connectorAlign !== \"right\" &&\n idx < stepMeta.length - 1;\n const segmentIsCompleted = isCompleted;\n\n const connectorSegment = detachedSegment ? (\n <div className={`flex items-center ${segmentSize}`}>\n <div\n className={classNames(\n \"relative w-full overflow-hidden rounded-full transition-colors duration-200\",\n connectorThicknessClass,\n connectorBaseClasses,\n )}\n >\n {connector === \"progress\" && (\n <div\n className={classNames(\n \"absolute inset-y-0 left-0 rounded-full transition-all duration-300 ease-out\",\n connectorActiveClasses,\n )}\n style={{ width: segmentIsCompleted ? \"100%\" : \"0%\" }}\n />\n )}\n </div>\n </div>\n ) : null;\n\n const leftConnector = showLeft ? (\n <span\n className={classNames(\n \"pointer-events-none absolute top-1/2 -translate-y-1/2 rounded-full transition-colors duration-200\",\n connectorThicknessClass,\n connector === \"progress\" && previousCompleted\n ? connectorActiveClasses\n : connectorBaseClasses,\n )}\n style={{ left: `${leftNodeStyle}`, width: connectorWidth }}\n />\n ) : null;\n\n const rightConnector = showRight ? (\n <span\n className={classNames(\n \"pointer-events-none absolute top-1/2 -translate-y-1/2 rounded-full transition-colors duration-200\",\n connectorThicknessClass,\n connector === \"progress\" && currentCompleted\n ? connectorActiveClasses\n : connectorBaseClasses,\n )}\n style={{ right: `${rightNodeStyle}`, width: connectorWidth }}\n />\n ) : null;\n\n return (\n <div\n key={`${resolvedId}-node`}\n className={`relative flex flex-1 ${connectorAlign === \"left\" ? \"items-center\" : connectorAlign === \"right\" ? \"items-center justify-end\" : \"items-center justify-center\"}`}\n >\n {leftConnector}\n <NodeTag\n type={NodeTag === \"button\" ? \"button\" : undefined}\n className={classNames(\n \"relative z-10 flex items-center justify-center focus-visible:outline-none\",\n nodeClasses,\n NodeTag === \"button\" &&\n !step.disabled &&\n \"hover:brightness-95\",\n NodeTag === \"button\" &&\n step.disabled &&\n \"cursor-not-allowed opacity-60\",\n )}\n onClick={handleClick}\n aria-current={\n state.isActive(resolvedId, idx) ? \"step\" : undefined\n }\n disabled={step.disabled}\n >\n {nodeIcon ? renderIcon(nodeIcon, \"sm\") : idx + 1}\n {isLoadingStep && (\n <Loader\n overlay\n variant=\"spinner\"\n size=\"sm\"\n className=\"rounded-full\"\n title={null}\n label={null}\n />\n )}\n </NodeTag>\n {rightConnector}\n {connectorSegment}\n </div>\n );\n })}\n </div>\n );\n };\n\n const renderHorizontal = () => {\n const gridColumns = Math.max(1, steps.length);\n\n return (\n <div className={classNames(\"relative flex flex-col\", headerClassName)}>\n {renderNodeRow()}\n <div\n className=\"mt-4 grid items-stretch gap-2\"\n style={{\n gridTemplateColumns: `repeat(${gridColumns}, minmax(0, 1fr))`,\n }}\n >\n {stepMeta.map((meta) => {\n const {\n resolvedId,\n status,\n textStyle,\n underlineClasses,\n step,\n index,\n } = meta;\n const TextTag = isInteractive && !step.disabled ? \"button\" : \"div\";\n\n const handleClick = () => {\n if (!isInteractive || step.disabled) return;\n state.goToIndex(index);\n onStepClick?.(step, index);\n };\n\n return (\n <TextTag\n key={`${resolvedId}-body`}\n type={TextTag === \"button\" ? \"button\" : undefined}\n className={classNames(\n \"flex h-full flex-col justify-between rounded-xl px-2 text-left transition-colors duration-150 focus-visible:outline-none\",\n step.disabled && \"cursor-not-allowed opacity-60\",\n isInteractive &&\n !step.disabled &&\n \"hover:bg-neutral-50 dark:hover:bg-neutral-800/30\",\n )}\n onClick={handleClick}\n aria-current={\n state.isActive(resolvedId, index) ? \"step\" : undefined\n }\n disabled={step.disabled}\n >\n <div\n className=\"flex min-w-0 flex-col gap-1 overflow-hidden break-words\"\n style={textStyle}\n >\n <div\n className={classNames(\n sizeToken.title,\n variantToken.emphasizeActiveTitle &&\n status === \"active\" &&\n \"text-neutral-900 dark:text-neutral-100\",\n )}\n >\n {step.title}\n </div>\n {step.subtitle && (\n <div className={sizeToken.subtitle}>{step.subtitle}</div>\n )}\n {variantToken.showDescription && step.description ? (\n <div className={sizeToken.description}>\n {step.description}\n </div>\n ) : null}\n </div>\n <div className=\"mt-3 flex flex-col gap-1\">\n {step.optionalLabel ? (\n <div className={sizeToken.optional}>\n {step.optionalLabel}\n </div>\n ) : null}\n {connector !== \"none\" &&\n (showStepUnderline ?? variantToken.showUnderline) && (\n <div className={underlineClasses} />\n )}\n </div>\n </TextTag>\n );\n })}\n </div>\n </div>\n );\n };\n\n const renderVertical = () => (\n <div\n ref={verticalContainerRef}\n className={classNames(\"relative flex flex-col gap-0\", headerClassName)}\n >\n {stepMeta.map((meta, index) => {\n const {\n step,\n resolvedId,\n nodeClasses,\n textStyle,\n nodeIcon,\n isLoadingStep,\n isCompleted,\n } = meta;\n const StepTag = isInteractive && !step.disabled ? \"button\" : \"div\";\n const NodeTag = isInteractive && !step.disabled ? \"button\" : \"div\";\n const segmentLength = verticalSegments[index] ?? 0;\n const showConnector =\n connector !== \"none\" &&\n index < stepMeta.length - 1 &&\n segmentLength > 0;\n\n return (\n <div\n key={resolvedId}\n className={classNames(\n \"relative flex items-start gap-4 py-4\",\n index === 0 && \"pt-0\",\n index === stepMeta.length - 1 && \"pb-0\",\n stepClassName,\n )}\n >\n <div className=\"relative flex flex-col items-center\">\n <div\n className=\"relative flex items-center justify-center\"\n ref={(el) => {\n if (orientation === \"vertical\") {\n nodeRefs.current[index] = el;\n }\n }}\n >\n <NodeTag\n type={NodeTag === \"button\" ? \"button\" : undefined}\n className={classNames(\n \"relative z-10 flex items-center justify-center focus-visible:outline-none\",\n nodeClasses,\n NodeTag === \"button\" &&\n !step.disabled &&\n \"hover:brightness-95\",\n NodeTag === \"button\" &&\n step.disabled &&\n \"cursor-not-allowed opacity-60\",\n )}\n onClick={() => {\n if (!isInteractive || step.disabled) return;\n state.goToIndex(index);\n onStepClick?.(step, index);\n }}\n aria-current={\n state.isActive(resolvedId, index) ? \"step\" : undefined\n }\n disabled={step.disabled}\n >\n {nodeIcon ? renderIcon(nodeIcon, \"sm\") : index + 1}\n {isLoadingStep && (\n <Loader\n overlay\n variant=\"spinner\"\n size=\"sm\"\n className=\"rounded-full\"\n title={null}\n label={null}\n />\n )}\n </NodeTag>\n </div>\n {showConnector && (\n <span\n className={classNames(\n \"pointer-events-none absolute left-1/2 -translate-x-1/2 rounded-full transition-colors duration-200\",\n verticalConnectorThicknessClass,\n connectorBaseClasses,\n )}\n style={{\n top: `${nodeRadii[size]}px`,\n height: `${segmentLength}px`,\n }}\n >\n {connector === \"progress\" && isCompleted && (\n <span\n className={classNames(\n \"absolute inset-0 rounded-full\",\n connectorActiveClasses,\n )}\n />\n )}\n </span>\n )}\n </div>\n <StepTag\n type={StepTag === \"button\" ? \"button\" : undefined}\n className=\"flex flex-1 flex-col text-left\"\n onClick={() => {\n if (!isInteractive || step.disabled) return;\n state.goToIndex(index);\n onStepClick?.(step, index);\n }}\n aria-current={\n state.isActive(resolvedId, index) ? \"step\" : undefined\n }\n disabled={step.disabled}\n >\n <div className={sizeToken.title} style={textStyle}>\n {step.title}\n </div>\n {step.subtitle && (\n <div className={sizeToken.subtitle}>{step.subtitle}</div>\n )}\n {step.description && (\n <div className={sizeToken.description}>{step.description}</div>\n )}\n {step.optionalLabel && (\n <div className={sizeToken.optional}>{step.optionalLabel}</div>\n )}\n </StepTag>\n </div>\n );\n })}\n </div>\n );\n\n const horizontal = orientation === \"horizontal\";\n\n const content = activeStep?.content ?? (\n <div className=\"space-y-2 text-sm text-neutral-600 dark:text-neutral-300\">\n {activeStep?.description}\n </div>\n );\n\n const alignmentMarginClass =\n connectorAlign === \"left\"\n ? \"mr-auto\"\n : connectorAlign === \"right\"\n ? \"ml-auto\"\n : \"mx-auto\";\n\n return (\n <div\n className={classNames(\n \"relative flex w-full flex-col\",\n horizontal ? \"gap-6\" : \"gap-4\",\n alignmentMarginClass,\n wrapperClassName,\n className,\n )}\n aria-busy={loading}\n style={style}\n {...rest}\n >\n {horizontal ? (\n <>\n {renderHorizontal()}\n {progressBlock}\n </>\n ) : (\n <>\n {renderVertical()}\n {progressBlock}\n </>\n )}\n\n <div\n className={classNames(\n \"rounded-2xl border border-neutral-200 bg-white/95 p-5 shadow-sm dark:border-neutral-800 dark:bg-neutral-900/80\",\n contentClassName,\n )}\n >\n {content}\n </div>\n\n {loading && (\n <Loader\n overlay\n title={loaderTitle}\n label={loaderMessage}\n variant={loaderType}\n progress={loaderProgress}\n color={loaderColor}\n />\n )}\n </div>\n );\n};\n\nexport default Stepper;\n","import { useCallback, useMemo, useState } from \"react\";\n\nexport interface StepperState<TStep extends { id?: string }> {\n steps: TStep[];\n currentIndex: number;\n currentStepId?: string;\n progressPercent: number;\n goToIndex: (index: number) => void;\n goToStep: (id: string) => void;\n goToNext: () => void;\n goToPrev: () => void;\n isActive: (id: string, index: number) => boolean;\n isCompleted: (id: string, index: number) => boolean;\n}\n\nexport interface UseStepperOptions {\n defaultCurrentIndex?: number;\n defaultCurrentStepId?: string;\n currentIndex?: number;\n currentStepId?: string;\n onChange?: (index: number, stepId?: string) => void;\n completedStepIds?: string[];\n}\n\nexport function useStepper<TStep extends { id?: string }>(\n steps: TStep[],\n {\n defaultCurrentIndex = 0,\n defaultCurrentStepId,\n currentIndex,\n currentStepId,\n onChange,\n completedStepIds,\n }: UseStepperOptions = {},\n): StepperState<TStep> {\n const resolveInitialIndex = useCallback(() => {\n if (typeof currentIndex === \"number\") {\n return currentIndex;\n }\n if (currentStepId) {\n const targetIndex = steps.findIndex((step) => step.id === currentStepId);\n if (targetIndex !== -1) {\n return targetIndex;\n }\n }\n if (defaultCurrentStepId) {\n const targetIndex = steps.findIndex(\n (step) => step.id === defaultCurrentStepId,\n );\n if (targetIndex !== -1) {\n return targetIndex;\n }\n }\n return Math.min(\n Math.max(defaultCurrentIndex, 0),\n Math.max(steps.length - 1, 0),\n );\n }, [\n currentIndex,\n currentStepId,\n defaultCurrentIndex,\n defaultCurrentStepId,\n steps,\n ]);\n\n const [internalIndex, setInternalIndex] = useState(resolveInitialIndex);\n\n const resolvedIndex =\n typeof currentIndex === \"number\" ? currentIndex : internalIndex;\n\n const resolvedStepId = useMemo(() => {\n if (currentStepId) {\n return currentStepId;\n }\n const step = steps[resolvedIndex];\n return step?.id;\n }, [currentStepId, steps, resolvedIndex]);\n\n const emitChange = useCallback(\n (nextIndex: number) => {\n const boundedIndex = Math.min(\n Math.max(nextIndex, 0),\n Math.max(steps.length - 1, 0),\n );\n if (typeof currentIndex !== \"number\") {\n setInternalIndex(boundedIndex);\n }\n const step = steps[boundedIndex];\n onChange?.(boundedIndex, step?.id);\n },\n [currentIndex, onChange, steps],\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n emitChange(index);\n },\n [emitChange],\n );\n\n const goToStep = useCallback(\n (id: string) => {\n const idx = steps.findIndex((step) => step.id === id);\n if (idx !== -1) {\n emitChange(idx);\n }\n },\n [emitChange, steps],\n );\n\n const goToNext = useCallback(() => {\n emitChange(resolvedIndex + 1);\n }, [emitChange, resolvedIndex]);\n\n const goToPrev = useCallback(() => {\n emitChange(resolvedIndex - 1);\n }, [emitChange, resolvedIndex]);\n\n const completedSet = useMemo(\n () => new Set(completedStepIds ?? []),\n [completedStepIds],\n );\n\n const progressPercent = useMemo(() => {\n if (steps.length === 0) {\n return 0;\n }\n const baseCompleted = completedStepIds\n ? completedStepIds.length\n : Math.max(resolvedIndex, 0);\n\n const bounded = Math.min(baseCompleted, steps.length);\n return (bounded / steps.length) * 100;\n }, [completedStepIds, resolvedIndex, steps.length]);\n\n const isActive = useCallback(\n (id: string, index: number) => {\n if (currentStepId) {\n return currentStepId === id;\n }\n return resolvedIndex === index;\n },\n [currentStepId, resolvedIndex],\n );\n\n const isCompleted = useCallback(\n (id: string, index: number) => {\n if (completedSet.size > 0) {\n return completedSet.has(id);\n }\n return index < resolvedIndex;\n },\n [completedSet, resolvedIndex],\n );\n\n return {\n steps,\n currentIndex: resolvedIndex,\n currentStepId: resolvedStepId,\n progressPercent,\n goToIndex,\n goToStep,\n goToNext,\n goToPrev,\n isActive,\n isCompleted,\n };\n}\n\nexport default useStepper;\n","import { useLayoutEffect, useEffect, useState } from \"react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\";\n\nconst STORAGE_KEY = \"ui-kit-demo-theme\";\n\n/**\n * Read the stored theme from localStorage, falling back to `\"light\"`\n * (the kit's default) when nothing is stored.\n *\n * SSR-safe: returns `\"light\"` when `window` / `localStorage` aren't present.\n */\nfunction getStoredTheme(): ThemeMode {\n if (typeof window === \"undefined\") return \"light\";\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === \"light\" || stored === \"dark\" || stored === \"system\") {\n return stored;\n }\n return \"light\";\n}\n\nfunction isSystemDark(): boolean {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\n/**\n * Write the active `class=\"dark\"` on `<html>` (when in dark mode) and persist\n * the user's chosen mode in localStorage.\n *\n * The demo's `demo/src/index.css` uses\n * `@custom-variant dark (&:where(.dark, .dark *))` which picks up `.dark`\n * on the root element and cascades through all descendants.\n */\nfunction applyTheme(mode: ThemeMode): void {\n if (typeof document === \"undefined\") return;\n const isDark = mode === \"system\" ? isSystemDark() : mode === \"dark\";\n const root = document.documentElement;\n root.classList.toggle(\"dark\", isDark);\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(STORAGE_KEY, mode);\n } catch {\n /* localStorage unavailable */\n }\n }\n}\n\n/**\n * Hook for managing the demo app's color theme.\n *\n * Modes:\n * - `\"system\"` — follow OS `prefers-color-scheme` (reactive).\n * - `\"light\"` — force light.\n * - `\"dark\"` — force dark.\n *\n * The hook applies `class=\"dark\"` to `<html>` which, combined with the\n * `@custom-variant dark (&:where(.dark, .dark *))` directive in\n * `demo/src/index.css`, cascades dark-mode styles to all `.dark:` descendants.\n * Persists the choice in `localStorage` and re-applies on OS preference\n * changes when in `system` mode.\n *\n * First visit defaults to `\"light\"`.\n */\nexport function useTheme() {\n const [theme, setTheme] = useState<ThemeMode>(getStoredTheme);\n const [effectiveTheme, setEffectiveTheme] = useState<\"light\" | \"dark\">(() => {\n const t = getStoredTheme();\n return t === \"system\" ? (isSystemDark() ? \"dark\" : \"light\") : t;\n });\n\n // Apply synchronously on mount and when theme changes\n useLayoutEffect(() => {\n applyTheme(theme);\n }, [theme]);\n\n // Update effectiveTheme when the mode changes\n useEffect(() => {\n setEffectiveTheme(theme === \"system\" ? (isSystemDark() ? \"dark\" : \"light\") : theme);\n }, [theme]);\n\n // React to OS preference changes while in system mode\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n if (theme !== \"system\") return;\n\n const mql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => {\n const isDark = mql.matches;\n document.documentElement.classList.toggle(\"dark\", isDark);\n setEffectiveTheme(isDark ? \"dark\" : \"light\");\n };\n\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, [theme]);\n\n return { theme, effectiveTheme, setTheme };\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { Loader, IconButton, Button, Select, Badge, type PanelTone } from \".\";\nimport type { TrueColor } from \"../theme\";\nimport type { IconName } from \"../icons/registry\";\nimport TruncatedText from \"./TruncatedText\";\n\ntype SortDirection = \"asc\" | \"desc\";\n\nexport interface TableSortState {\n columnId: string;\n direction: SortDirection;\n}\n\nexport interface TablePaginationState {\n page: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n}\n\n/** Unified snapshot of all user-configurable table preferences. */\nexport interface TableSettings {\n columnVisibility?: Record<string, boolean>;\n columnWidths?: Record<string, number>;\n activeView?: \"table\" | \"panel\";\n groupBy?: string | null;\n showGroupHeader?: boolean;\n stickyColumns?: Record<string, \"left\" | \"right\">;\n}\n\ntype AccessorFn<T> = (row: T, index: number) => React.ReactNode;\n\nexport interface TableColumn<T> {\n id: string;\n header: React.ReactNode;\n accessor?: keyof T | AccessorFn<T>;\n render?: (row: T, index: number) => React.ReactNode;\n /** Override the value used for sorting when render returns a non-primitive (e.g. an icon). */\n sortValue?: (row: T) => string | number;\n width?: string | number;\n minWidth?: string | number;\n maxWidth?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n sortable?: boolean;\n tooltip?: string;\n className?: string;\n headerClassName?: string;\n sticky?: \"left\" | \"right\";\n /** When true, this column is excluded from user preference menus (hide/show, group-by, sticky). */\n isActionsColumn?: boolean;\n /** When true, the column starts hidden by default but can still be enabled from the Columns menu. */\n defaultHidden?: boolean;\n /** When false, this column cannot be hidden via the column visibility toggle. Defaults to true. */\n hideable?: boolean;\n /** When false, this column will not appear in the group-by picker. Defaults to true. */\n groupable?: boolean;\n /** When false, this column cannot be resized even when `resizableColumns` is set on the table. Defaults to true. */\n resizable?: boolean;\n /**\n * Returns a plain string used as the group key and header label when this column is the active\n * group-by. Use this when `render` returns JSX (which would otherwise give \"[object Object]\").\n * Falls back to: accessor result → sortValue → render result (only if a primitive string/number).\n */\n groupValue?: (row: T) => string;\n /**\n * Background Tailwind class(es) applied to sticky cells so they remain opaque over scrolled\n * content. Defaults to `'bg-white dark:bg-neutral-900'`. Pass `'bg-transparent'` to let the\n * row/table background show through instead.\n */\n stickyBackground?: string;\n /**\n * Per-row variant of `stickyBackground`. When provided, takes precedence over `stickyBackground`\n * for the matching row. Return `undefined` to fall back to the static `stickyBackground`.\n */\n stickyBackgroundFn?: (row: T, index: number) => string | undefined;\n}\n\nexport type Column<T> = TableColumn<T>;\n\nexport type TableVariant =\n | \"default\"\n | \"compact\"\n | \"minimal\"\n | \"bordered\"\n | \"flat\";\n\n/** Internal type for a single group entry when grouping is active. */\ntype GroupEntry<T> = {\n key: string;\n display: string;\n rows: { row: T; originalIndex: number }[];\n};\n\nexport interface TableProps<T> {\n columns?: TableColumn<T>[];\n data: T[];\n selectedItems?: T[];\n rowKey?: (row: T, index: number) => string | number;\n variant?: TableVariant;\n tone?: PanelTone;\n /** Theme color applied to action buttons, sort indicators, group dot, badges, and pagination. */\n color?: TrueColor;\n striped?: boolean;\n noBorders?: boolean;\n hoverable?: boolean;\n stickyHeader?: boolean;\n /**\n * When true, the last column is pinned to the right edge and stays visible\n * while the other columns scroll horizontally. A left border separator is\n * added automatically to distinguish it from the scrolling content.\n */\n stickyActions?: boolean;\n loading?: boolean;\n loadingMessage?: string;\n loaderType?: \"spinner\" | \"progress\";\n loaderProgress?: number;\n emptyState?: React.ReactNode;\n sortState?: TableSortState;\n defaultSort?: TableSortState;\n onSortChange?: (sort: TableSortState | null) => void;\n headerActions?: React.ReactNode;\n footer?: React.ReactNode;\n pagination?: TablePaginationState;\n maxHeight?: string | number;\n onRowClick?: (row: T, index: number) => void;\n rowClassName?: (row: T, index: number) => string;\n /** When provided and returns true for a row, that row is rendered with an intense accent background and a pulsing left-border indicator to signal new/updated content. */\n rowHighlight?: (row: T, index: number) => boolean;\n className?: string;\n tableClassName?: string;\n bodyClassName?: string;\n style?: React.CSSProperties;\n fullHeight?: boolean;\n manualSorting?: boolean;\n /** When true, wraps the table in a rounded border regardless of the variant. */\n rounded?: boolean;\n /** Title shown in the header bar alongside headerActions / view toggle. Defaults to empty. */\n headerTitle?: string;\n /**\n * Initial column visibility map (`columnId → visible`).\n * Serialise with `JSON.stringify` to save; parse and pass back to restore.\n */\n columnVisibility?: Record<string, boolean>;\n /** Called whenever the user changes column visibility. Receives the full current config. */\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n /**\n * When true, shows the column visibility toggle button in the header bar.\n * Defaults to false — the icon is hidden unless this prop is explicitly set.\n */\n showColumnSelector?: boolean;\n /**\n * Enables drag-to-resize column headers. Each column can opt out via `column.resizable = false`.\n */\n resizableColumns?: boolean;\n /**\n * Initial column width map (`columnId → pixels`).\n * Serialise with `JSON.stringify` to save; parse and pass back to restore.\n */\n columnWidths?: Record<string, number>;\n /** Called when the user finishes resizing a column. Receives the full updated widths map. */\n onColumnWidthChange?: (widths: Record<string, number>) => void;\n /** Renders each row as a panel card. When provided alongside columns, a view toggle appears in the header. */\n panelItem?: (row: T, index: number) => React.ReactNode;\n /** Initial view when both columns and panelItem are provided. Defaults to \"table\". */\n defaultView?: \"table\" | \"panel\";\n /** Called whenever the user switches between table and panel view. */\n onViewChange?: (view: \"table\" | \"panel\") => void;\n /** CSS class(es) for the panel grid container. Defaults to a 1–3 column responsive grid. */\n panelGridClassName?: string;\n /**\n * Minimum width of each panel card. The grid uses CSS `auto-fill` to place\n * as many columns as fit the container — adapts to the parent width with no\n * hard breakpoints. Accepts a CSS length string (\"280px\", \"20rem\") or a\n * number treated as px. When set, takes precedence over the column layout in\n * `panelGridClassName` (extra classes from `panelGridClassName` still apply).\n */\n panelMinItemWidth?: string | number;\n /**\n * Gap between panel cards when `panelMinItemWidth` is set. Accepts a CSS\n * length string (\"1rem\", \"16px\") or a number treated as px. Defaults to\n * \"1rem\" (= `gap-4`). The value is applied via inline style so it cannot be\n * accidentally overridden by a conflicting Tailwind class.\n */\n panelGap?: string | number;\n /**\n * Maximum width of each panel card when `panelMinItemWidth` is set. Prevents cards from\n * growing too wide on large containers. Accepts a CSS length string (\"480px\", \"30rem\") or\n * a number treated as px. When omitted, cards stretch to fill available space (`1fr`).\n */\n panelMaxItemWidth?: string | number;\n /**\n * When provided, the panel view only renders the first row for each unique key value.\n * Use this when `data` is a flattened list but panels should show one card per logical entity.\n * Example: `panelDeduplicateBy={(row) => row.manifest.id}`\n */\n panelDeduplicateBy?: (row: T) => string | number;\n // ── Grouping ────────────────────────────────────────────────────────────────\n /**\n * Column id to group rows by (code-defined).\n * Always applied; the user cannot override this via the UI.\n */\n groupBy?: string;\n /**\n * When true, a grouping control is shown in the header letting the user\n * configure grouping at runtime. Only effective when `groupBy` is not set.\n */\n groupable?: boolean;\n /**\n * Initial user-configured group column id (uncontrolled).\n * Pass the persisted value here on mount to restore previous state.\n * Only used when `groupable` is true and `groupBy` is not set.\n */\n defaultGroupBy?: string;\n /** Whether to show a header row for each group value. Defaults to true. */\n showGroupHeader?: boolean;\n /** Whether groups start expanded. Defaults to true. */\n defaultGroupExpanded?: boolean;\n /** Called when the user changes the group column (null = no grouping). Use for persistence. */\n onGroupByChange?: (columnId: string | null) => void;\n // ── User sticky columns ──────────────────────────────────────────────────────\n /**\n * When true, a sticky-column picker is shown in the header bar letting the\n * user pin individual columns to the left or right at runtime.\n */\n userStickyColumns?: boolean;\n /**\n * Initial user-configured sticky map (`columnId → 'left' | 'right'`).\n * Pass the persisted value here on mount to restore previous state.\n */\n defaultStickyColumns?: Record<string, \"left\" | \"right\">;\n /** Called when the user changes column stickiness. Use for persistence. */\n onStickyColumnsChange?: (config: Record<string, \"left\" | \"right\">) => void;\n /**\n * Unified table settings snapshot. Fields here take precedence over the\n * individual initial-value props (`columnVisibility`, `columnWidths`,\n * `defaultView`, `defaultGroupBy`, `defaultStickyColumns`).\n * Pass a previously persisted value to restore all settings on mount.\n */\n tableSettings?: TableSettings;\n /**\n * Called whenever any user-configurable table setting changes (visibility,\n * widths, view, group-by, sticky columns). Use a single handler to persist\n * the full settings object instead of wiring up all individual callbacks.\n */\n onTableSettingsChange?: (settings: TableSettings) => void;\n}\n\nconst getToneHeaderClasses = (tone: TrueColor): string => {\n if (tone === \"neutral\" || tone === \"slate\" || tone === \"gray\" || tone === \"zinc\" || tone === \"stone\") {\n return \"bg-neutral-50 text-neutral-700 dark:bg-neutral-800/70 dark:text-neutral-200 border-neutral-200 dark:border-neutral-700\";\n }\n\n return `bg-${tone}-50 text-${tone}-700 dark:bg-${tone}-500/15 dark:text-${tone}-100 border-${tone}-200 dark:border-${tone}-500/30`;\n};\n\n/** Returns a static `bg-*-500` class for the active-group indicator dot. */\nfunction getDotColorClass(color: TrueColor): string {\n switch (color) {\n case \"blue\":\n return \"bg-blue-500\";\n case \"green\":\n return \"bg-green-500\";\n case \"teal\":\n return \"bg-teal-500\";\n case \"cyan\":\n return \"bg-cyan-500\";\n case \"indigo\":\n return \"bg-indigo-500\";\n case \"purple\":\n return \"bg-purple-500\";\n case \"violet\":\n return \"bg-violet-500\";\n case \"red\":\n return \"bg-red-500\";\n case \"orange\":\n return \"bg-orange-500\";\n case \"amber\":\n return \"bg-amber-500\";\n case \"yellow\":\n return \"bg-yellow-500\";\n case \"lime\":\n return \"bg-lime-500\";\n case \"emerald\":\n return \"bg-emerald-500\";\n case \"sky\":\n return \"bg-sky-500\";\n case \"fuchsia\":\n return \"bg-fuchsia-500\"; case \"rose\":\n return \"bg-rose-500\";\n case \"slate\":\n return \"bg-slate-500\";\n case \"gray\":\n return \"bg-gray-500\";\n case \"zinc\":\n return \"bg-zinc-500\";\n case \"neutral\":\n return \"bg-neutral-500\";\n case \"stone\":\n return \"bg-stone-500\";\n default:\n return \"bg-blue-500\";\n }\n}\n\n/** Returns static `accent-*` classes for native checkbox/radio inputs. */\nfunction getAccentClass(color: TrueColor): string {\n switch (color) {\n case \"blue\":\n return \"accent-blue-600 dark:accent-blue-400\";\n case \"green\":\n return \"accent-green-600 dark:accent-green-400\";\n case \"teal\":\n return \"accent-teal-600 dark:accent-teal-400\";\n case \"cyan\":\n return \"accent-cyan-600 dark:accent-cyan-400\";\n case \"indigo\":\n return \"accent-indigo-600 dark:accent-indigo-400\";\n case \"purple\":\n return \"accent-purple-600 dark:accent-purple-400\";\n case \"violet\":\n return \"accent-violet-600 dark:accent-violet-400\";\n case \"red\":\n return \"accent-red-600 dark:accent-red-400\";\n case \"orange\":\n return \"accent-orange-600 dark:accent-orange-400\";\n case \"amber\":\n return \"accent-amber-600 dark:accent-amber-400\";\n case \"yellow\":\n return \"accent-yellow-600 dark:accent-yellow-400\";\n case \"lime\":\n return \"accent-lime-600 dark:accent-lime-400\";\n case \"emerald\":\n return \"accent-emerald-600 dark:accent-emerald-400\";\n case \"sky\":\n return \"accent-sky-600 dark:accent-sky-400\";\n case \"fuchsia\":\n return \"accent-fuchsia-600 dark:accent-fuchsia-400\"; case \"rose\":\n return \"accent-rose-600 dark:accent-rose-400\";\n case \"slate\":\n return \"accent-slate-600 dark:accent-slate-400\";\n case \"gray\":\n return \"accent-gray-600 dark:accent-gray-400\";\n case \"zinc\":\n return \"accent-zinc-600 dark:accent-zinc-400\";\n case \"neutral\":\n return \"accent-neutral-700 dark:accent-neutral-300\";\n case \"stone\":\n return \"accent-stone-600 dark:accent-stone-400\";\n default:\n return \"accent-blue-600 dark:accent-blue-400\";\n }\n}\n\n/** Returns a static `bg-*-50` class for the selected row background. */\nfunction getSelectedRowClass(color: TrueColor): string {\n switch (color) {\n case \"blue\":\n return \"bg-blue-50 dark:bg-blue-500/10 border-blue-200 dark:border-blue-800\";\n case \"green\":\n return \"bg-green-50 dark:bg-green-500/10 border-green-200 dark:border-green-800\";\n case \"teal\":\n return \"bg-teal-50 dark:bg-teal-500/10 border-teal-200 dark:border-teal-800\";\n case \"cyan\":\n return \"bg-cyan-50 dark:bg-cyan-500/10 border-cyan-200 dark:border-cyan-800\";\n case \"indigo\":\n return \"bg-indigo-50 dark:bg-indigo-500/10 border-indigo-200 dark:border-indigo-800\";\n case \"purple\":\n return \"bg-purple-50 dark:bg-purple-500/10 border-purple-200 dark:border-purple-800\";\n case \"violet\":\n return \"bg-violet-50 dark:bg-violet-500/10 border-violet-200 dark:border-violet-800\";\n case \"red\":\n return \"bg-red-50 dark:bg-red-500/10 border-red-200 dark:border-red-800\";\n case \"orange\":\n return \"bg-orange-50 dark:bg-orange-500/10 border-orange-200 dark:border-orange-800\";\n case \"amber\":\n return \"bg-amber-50 dark:bg-amber-500/10 border-amber-200 dark:border-amber-800\";\n case \"yellow\":\n return \"bg-yellow-50 dark:bg-yellow-500/10 border-yellow-200 dark:border-yellow-800\";\n case \"lime\":\n return \"bg-lime-50 dark:bg-lime-500/10 border-lime-200 dark:border-lime-800\";\n case \"emerald\":\n return \"bg-emerald-50 dark:bg-emerald-500/10 border-emerald-200 dark:border-emerald-800\";\n case \"sky\":\n return \"bg-sky-50 dark:bg-sky-500/10 border-sky-200 dark:border-sky-800\";\n case \"fuchsia\":\n return \"bg-fuchsia-50 dark:bg-fuchsia-500/10 border-fuchsia-200 dark:border-fuchsia-800\"; case \"rose\":\n return \"bg-rose-50 dark:bg-rose-500/10 border-rose-200 dark:border-rose-800\";\n case \"slate\":\n return \"bg-slate-50 dark:bg-slate-500/10 border-slate-200 dark:border-slate-800\";\n case \"gray\":\n return \"bg-gray-50 dark:bg-gray-500/10 border-gray-200 dark:border-gray-800\";\n case \"zinc\":\n return \"bg-zinc-50 dark:bg-zinc-500/10 border-zinc-200 dark:border-zinc-800\";\n case \"neutral\":\n return \"bg-neutral-100 dark:bg-neutral-800 border-neutral-200 dark:border-neutral-700\";\n case \"stone\":\n return \"bg-stone-50 dark:bg-stone-500/10 border-stone-200 dark:border-stone-800\";\n default:\n return \"bg-blue-50 dark:bg-blue-500/10 border-blue-200 dark:border-blue-800\";\n }\n}\n\nfunction getHighlightRowClass(color: TrueColor): string {\n switch (color) {\n case \"blue\":\n return \"bg-blue-100 dark:bg-blue-500/20\";\n case \"green\":\n return \"bg-green-100 dark:bg-green-500/20\";\n case \"teal\":\n return \"bg-teal-100 dark:bg-teal-500/20\";\n case \"cyan\":\n return \"bg-cyan-100 dark:bg-cyan-500/20\";\n case \"indigo\":\n return \"bg-indigo-100 dark:bg-indigo-500/20\";\n case \"purple\":\n return \"bg-purple-100 dark:bg-purple-500/20\";\n case \"violet\":\n return \"bg-violet-100 dark:bg-violet-500/20\";\n case \"red\":\n return \"bg-red-100 dark:bg-red-500/20\";\n case \"orange\":\n return \"bg-orange-100 dark:bg-orange-500/20\";\n case \"amber\":\n return \"bg-amber-100 dark:bg-amber-500/20\";\n case \"yellow\":\n return \"bg-yellow-100 dark:bg-yellow-500/20\";\n case \"lime\":\n return \"bg-lime-100 dark:bg-lime-500/20\";\n case \"emerald\":\n return \"bg-emerald-100 dark:bg-emerald-500/20\";\n case \"sky\":\n return \"bg-sky-100 dark:bg-sky-500/20\";\n case \"fuchsia\":\n return \"bg-fuchsia-100 dark:bg-fuchsia-500/20\"; case \"rose\":\n return \"bg-rose-100 dark:bg-rose-500/20\";\n case \"slate\":\n return \"bg-slate-100 dark:bg-slate-500/20\";\n case \"gray\":\n return \"bg-gray-100 dark:bg-gray-500/20\";\n case \"zinc\":\n return \"bg-zinc-100 dark:bg-zinc-500/20\";\n case \"neutral\":\n return \"bg-neutral-100 dark:bg-neutral-700/50\";\n case \"stone\":\n return \"bg-stone-100 dark:bg-stone-500/20\";\n default:\n return \"bg-blue-100 dark:bg-blue-500/20\";\n }\n}\n\nfunction getHighlightBorderClass(color: TrueColor): string {\n switch (color) {\n case \"blue\":\n return \"border-l-blue-500\";\n case \"green\":\n return \"border-l-green-500\";\n case \"teal\":\n return \"border-l-teal-500\";\n case \"cyan\":\n return \"border-l-cyan-500\";\n case \"indigo\":\n return \"border-l-indigo-500\";\n case \"purple\":\n return \"border-l-purple-500\";\n case \"violet\":\n return \"border-l-violet-500\";\n case \"red\":\n return \"border-l-red-500\";\n case \"orange\":\n return \"border-l-orange-500\";\n case \"amber\":\n return \"border-l-amber-500\";\n case \"yellow\":\n return \"border-l-yellow-500\";\n case \"lime\":\n return \"border-l-lime-500\";\n case \"emerald\":\n return \"border-l-emerald-500\";\n case \"sky\":\n return \"border-l-sky-500\";\n case \"fuchsia\":\n return \"border-l-fuchsia-500\"; case \"rose\":\n return \"border-l-rose-500\";\n case \"slate\":\n return \"border-l-slate-500\";\n case \"gray\":\n return \"border-l-gray-500\";\n case \"zinc\":\n return \"border-l-zinc-500\";\n case \"neutral\":\n return \"border-l-neutral-500\";\n case \"stone\":\n return \"border-l-stone-500\";\n default:\n return \"border-l-blue-500\";\n }\n}\n\n/** Returns static Tailwind hover class for the column resize handle track. */\nfunction getResizeHandleHoverClass(color: TrueColor): string {\n switch (color) {\n case \"blue\":\n return \"group-hover/rh:bg-blue-500 dark:group-hover/rh:bg-blue-400\";\n case \"green\":\n return \"group-hover/rh:bg-green-500 dark:group-hover/rh:bg-green-400\";\n case \"teal\":\n return \"group-hover/rh:bg-teal-500 dark:group-hover/rh:bg-teal-400\";\n case \"cyan\":\n return \"group-hover/rh:bg-cyan-500 dark:group-hover/rh:bg-cyan-400\";\n case \"indigo\":\n return \"group-hover/rh:bg-indigo-500 dark:group-hover/rh:bg-indigo-400\";\n case \"purple\":\n return \"group-hover/rh:bg-purple-500 dark:group-hover/rh:bg-purple-400\";\n case \"violet\":\n return \"group-hover/rh:bg-violet-500 dark:group-hover/rh:bg-violet-400\";\n case \"red\":\n return \"group-hover/rh:bg-red-500 dark:group-hover/rh:bg-red-400\";\n case \"orange\":\n return \"group-hover/rh:bg-orange-500 dark:group-hover/rh:bg-orange-400\";\n case \"amber\":\n return \"group-hover/rh:bg-amber-500 dark:group-hover/rh:bg-amber-400\";\n case \"yellow\":\n return \"group-hover/rh:bg-yellow-500 dark:group-hover/rh:bg-yellow-400\";\n case \"lime\":\n return \"group-hover/rh:bg-lime-500 dark:group-hover/rh:bg-lime-400\";\n case \"emerald\":\n return \"group-hover/rh:bg-emerald-500 dark:group-hover/rh:bg-emerald-400\";\n case \"sky\":\n return \"group-hover/rh:bg-sky-500 dark:group-hover/rh:bg-sky-400\";\n case \"fuchsia\":\n return \"group-hover/rh:bg-fuchsia-500 dark:group-hover/rh:bg-fuchsia-400\"; case \"rose\":\n return \"group-hover/rh:bg-rose-500 dark:group-hover/rh:bg-rose-400\";\n case \"slate\":\n return \"group-hover/rh:bg-slate-500 dark:group-hover/rh:bg-slate-400\";\n case \"gray\":\n return \"group-hover/rh:bg-gray-500 dark:group-hover/rh:bg-gray-400\";\n case \"zinc\":\n return \"group-hover/rh:bg-zinc-500 dark:group-hover/rh:bg-zinc-400\";\n case \"neutral\":\n return \"group-hover/rh:bg-neutral-500 dark:group-hover/rh:bg-neutral-400\";\n case \"stone\":\n return \"group-hover/rh:bg-stone-500 dark:group-hover/rh:bg-stone-400\";\n default:\n return \"group-hover/rh:bg-blue-500 dark:group-hover/rh:bg-blue-400\";\n }\n}\n\nconst variantCellPadding: Record<TableVariant, string> = {\n default: \"px-6 py-5 text-sm\",\n compact: \"px-4 py-3 text-sm\",\n minimal: \"px-3 py-4 text-xs\",\n bordered: \"px-5 py-5 text-sm\",\n flat: \"px-4 py-3 text-sm\",\n};\n\nconst variantSidePadding: Record<\n TableVariant,\n { left: string; right: string; contentVertical: string }\n> = {\n default: { left: \"pl-6\", right: \"pr-6\", contentVertical: \"py-1.5\" },\n compact: { left: \"pl-4\", right: \"pr-4\", contentVertical: \"py-1\" },\n minimal: { left: \"pl-3\", right: \"pr-3\", contentVertical: \"py-1.5\" },\n bordered: { left: \"pl-5\", right: \"pr-5\", contentVertical: \"py-1.5\" },\n flat: { left: \"pl-4\", right: \"pr-4\", contentVertical: \"py-1.5\" },\n};\n\nconst variantTableBase: Record<TableVariant, string> = {\n default: \"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700\",\n compact: \"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700\",\n minimal: \"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700\",\n bordered: \"min-w-full border border-neutral-200 dark:border-neutral-700\",\n flat: \"min-w-full divide-y divide-neutral-100 dark:divide-neutral-800\",\n};\n\nconst variantWrapperBase: Record<TableVariant, string> = {\n default:\n \"overflow-hidden rounded-2xl border border-neutral-200/80 bg-white shadow-sm dark:border-neutral-700/60 dark:bg-neutral-900/90\",\n compact:\n \"overflow-hidden rounded-2xl border border-neutral-200/60 bg-white shadow-sm dark:border-neutral-700/60 dark:bg-neutral-900/90\",\n minimal:\n \"overflow-hidden rounded-xl border border-neutral-200/60 bg-white/95 shadow-sm dark:border-neutral-700/60 dark:bg-neutral-900/90\",\n bordered:\n \"overflow-hidden rounded-2xl border border-neutral-300 bg-white shadow-sm dark:border-neutral-700 dark:bg-neutral-900\",\n flat: \"overflow-hidden bg-transparent dark:bg-transparent\",\n};\n\nconst alignmentClass: Record<\n NonNullable<TableColumn<unknown>[\"align\"]>,\n string\n> = {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n};\n\nconst alignmentFlexClass: Record<\n NonNullable<TableColumn<unknown>[\"align\"]>,\n string\n> = {\n left: \"justify-start\",\n center: \"justify-center\",\n right: \"justify-end\",\n};\n\nconst getCellAlignment = (align?: TableColumn<unknown>[\"align\"]) =>\n align ? alignmentClass[align] : \"text-left\";\nconst getCellFlexAlignment = (align?: TableColumn<unknown>[\"align\"]) =>\n align ? alignmentFlexClass[align] : \"justify-start\";\n\nconst sortIconMap: Record<\"asc\" | \"desc\" | \"default\", IconName> = {\n asc: \"ArrowUp\",\n desc: \"ArrowDown\",\n default: \"Dots\",\n};\n\nfunction resolveValue<T>(\n row: T,\n column: TableColumn<T>,\n index: number,\n): React.ReactNode {\n if (column.render) {\n return column.render(row, index);\n }\n\n if (column.accessor) {\n if (typeof column.accessor === \"function\") {\n return column.accessor(row, index);\n }\n\n return (row as Record<string, unknown>)[\n column.accessor as string\n ] as React.ReactNode;\n }\n\n return null;\n}\n\nfunction resolveRowKey<T>(\n row: T,\n index: number,\n rowKey?: (row: T, index: number) => string | number,\n): string | number {\n if (rowKey) {\n return rowKey(row, index);\n }\n\n if (typeof (row as Record<string, unknown>).id !== \"undefined\") {\n return String((row as Record<string, unknown>).id);\n }\n\n return index;\n}\n\nfunction applyWidthStyle(\n width?: string | number,\n minWidth?: string | number,\n maxWidth?: string | number,\n) {\n if (!width && !minWidth && !maxWidth) {\n return undefined;\n }\n\n const style: React.CSSProperties = {};\n if (width !== undefined)\n style.width = typeof width === \"number\" ? `${width}px` : width;\n if (minWidth !== undefined)\n style.minWidth = typeof minWidth === \"number\" ? `${minWidth}px` : minWidth;\n if (maxWidth !== undefined) {\n style.maxWidth = typeof maxWidth === \"number\" ? `${maxWidth}px` : maxWidth;\n // If maxWidth is set, prevent the column from expanding beyond it\n if (!width) {\n style.width = style.maxWidth;\n }\n }\n\n return style;\n}\n\nfunction getNextSortDirection(current?: SortDirection): SortDirection {\n if (current === \"asc\") {\n return \"desc\";\n }\n\n return \"asc\";\n}\n\n// ── Inline chevron SVG (avoids importing icon components directly) ─────────────\nfunction ChevronSvg({ expanded }: { expanded: boolean }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n width=\"14\"\n height=\"14\"\n className={classNames(\n \"flex-shrink-0 text-current transition-transform duration-200\",\n expanded && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction TableComponent<T>({\n columns,\n data,\n selectedItems,\n rowKey,\n variant = \"default\",\n tone = \"neutral\",\n striped = false,\n noBorders = false,\n hoverable = true,\n stickyHeader = false,\n stickyActions = false,\n loading = false,\n loadingMessage,\n loaderType = \"spinner\",\n loaderProgress,\n emptyState,\n sortState,\n defaultSort,\n onSortChange,\n headerActions,\n footer,\n maxHeight,\n onRowClick,\n rowClassName,\n rowHighlight,\n className,\n tableClassName,\n bodyClassName,\n style,\n fullHeight,\n pagination,\n manualSorting = false,\n rounded = false,\n panelItem,\n defaultView,\n onViewChange,\n panelGridClassName,\n panelMinItemWidth,\n panelMaxItemWidth,\n panelGap,\n panelDeduplicateBy,\n headerTitle = \"\",\n columnVisibility: columnVisibilityProp,\n onColumnVisibilityChange,\n showColumnSelector = false,\n resizableColumns = false,\n columnWidths: columnWidthsProp,\n onColumnWidthChange,\n // Grouping props\n groupBy,\n groupable,\n defaultGroupBy,\n showGroupHeader,\n defaultGroupExpanded,\n onGroupByChange,\n userStickyColumns,\n defaultStickyColumns,\n onStickyColumnsChange,\n tableSettings,\n onTableSettingsChange,\n color = \"blue\",\n}: TableProps<T>) {\n const getDefaultColumnVisibility = (column: TableColumn<T>) => {\n if (column.hideable === false) {\n return true;\n }\n\n return column.defaultHidden !== true;\n };\n\n const showViewToggle = !!columns?.length && !!panelItem;\n const defaultViewResolved: \"table\" | \"panel\" =\n tableSettings?.activeView ??\n defaultView ??\n (showViewToggle ? \"table\" : panelItem ? \"panel\" : \"table\");\n const [activeView, setActiveView] = useState<\"table\" | \"panel\">(\n defaultViewResolved,\n );\n\n const [internalSort, setInternalSort] = useState<TableSortState | null>(\n defaultSort ?? null,\n );\n\n const resolvedSort = sortState ?? internalSort;\n\n // ── Column visibility ────────────────────────────────────────────────────────\n const [colVisibility, setColVisibility] = useState<Record<string, boolean>>(\n () => {\n const init: Record<string, boolean> = {};\n const source = tableSettings?.columnVisibility ?? columnVisibilityProp;\n for (const col of columns ?? []) {\n init[col.id] = source?.[col.id] ?? getDefaultColumnVisibility(col);\n }\n return init;\n },\n );\n\n // Sync when the columnVisibility prop changes (e.g. after loading saved config)\n useEffect(() => {\n const source = tableSettings?.columnVisibility ?? columnVisibilityProp;\n if (!source) return;\n setColVisibility((prev) => {\n const next = { ...prev };\n for (const col of columns ?? []) {\n next[col.id] =\n source[col.id] ?? prev[col.id] ?? getDefaultColumnVisibility(col);\n }\n return next;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columnVisibilityProp, tableSettings?.columnVisibility]);\n\n const [colPanelOpen, setColPanelOpen] = useState(false);\n const colPanelRef = useRef<HTMLDivElement>(null);\n\n // ── Column resize ─────────────────────────────────────────────────────────────\n const [internalColWidths, setInternalColWidths] = useState<\n Record<string, number>\n >(() => {\n const init: Record<string, number> = {};\n const widthSource = tableSettings?.columnWidths ?? columnWidthsProp;\n if (widthSource) {\n Object.assign(init, widthSource);\n } else {\n for (const col of columns ?? []) {\n if (typeof col.width === \"number\") {\n init[col.id] = col.width;\n } else if (\n typeof col.width === \"string\" &&\n /^\\d+(\\.\\d+)?px$/.test(col.width)\n ) {\n init[col.id] = parseFloat(col.width);\n }\n }\n }\n return init;\n });\n\n // Sync when columnWidths prop changes (e.g. after loading saved config)\n useEffect(() => {\n const widthSource = tableSettings?.columnWidths ?? columnWidthsProp;\n if (!widthSource) return;\n setInternalColWidths((prev) => ({ ...prev, ...widthSource }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [columnWidthsProp, tableSettings?.columnWidths]);\n\n // refs: one per <th> for DOM measurement, plus transient resize state\n const thRefs = useRef<Record<string, HTMLTableCellElement | null>>({});\n const resizingRef = useRef<{\n colId: string;\n startX: number;\n startWidth: number;\n } | null>(null);\n const widthsDuringResizeRef = useRef<Record<string, number>>({});\n\n // Clean up any lingering body styles if the component unmounts mid-drag\n useEffect(() => {\n return () => {\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n }, []);\n\n const handleResizeStart = (\n e: React.MouseEvent,\n colId: string,\n minColWidth: number,\n ) => {\n e.preventDefault();\n e.stopPropagation();\n\n // On the very first resize, seed ALL visible column widths from the DOM so\n // switching to table-layout:fixed doesn't cause a layout jump.\n let currentWidths = { ...internalColWidths };\n if (Object.keys(currentWidths).length === 0) {\n for (const col of visibleColumns) {\n const el = thRefs.current[col.id];\n if (el) currentWidths[col.id] = el.offsetWidth;\n }\n setInternalColWidths(currentWidths);\n }\n\n const startWidth =\n currentWidths[colId] ?? thRefs.current[colId]?.offsetWidth ?? 100;\n resizingRef.current = { colId, startX: e.clientX, startWidth };\n widthsDuringResizeRef.current = { ...currentWidths };\n\n const onMouseMove = (moveEvt: MouseEvent) => {\n if (!resizingRef.current) return;\n const newWidth = Math.max(\n minColWidth,\n resizingRef.current.startWidth +\n (moveEvt.clientX - resizingRef.current.startX),\n );\n widthsDuringResizeRef.current = {\n ...widthsDuringResizeRef.current,\n [resizingRef.current.colId]: newWidth,\n };\n setInternalColWidths({ ...widthsDuringResizeRef.current });\n };\n\n const onMouseUp = () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n onColumnWidthChange?.(widthsDuringResizeRef.current);\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n columnWidths: widthsDuringResizeRef.current,\n });\n resizingRef.current = null;\n };\n\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n };\n\n // When resizable and any width is stored, switch the table to fixed layout\n // so column widths are honoured precisely.\n const useFixedLayout =\n resizableColumns && Object.keys(internalColWidths).length > 0;\n\n // ── User sticky columns state ────────────────────────────────────────────────\n const [internalStickyColumns, setInternalStickyColumns] = useState<\n Record<string, \"left\" | \"right\">\n >(tableSettings?.stickyColumns ?? defaultStickyColumns ?? {});\n const [stickyPanelOpen, setStickyPanelOpen] = useState(false);\n const stickyPanelRef = useRef<HTMLDivElement>(null);\n\n // ── Unified settings snapshot ref (declared early so all handlers can use it) ─\n // The .current assignment is done after all state is declared below.\n const settingsSnapshotRef = useRef<TableSettings>({});\n\n const handleStickyChange = (colId: string, pin: \"left\" | \"right\" | null) => {\n setInternalStickyColumns((prev) => {\n const next = { ...prev };\n if (pin === null) delete next[colId];\n else next[colId] = pin;\n onStickyColumnsChange?.(next);\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n stickyColumns: next,\n });\n return next;\n });\n };\n\n const hasStickyColumns = Object.keys(internalStickyColumns).length > 0;\n\n // ── Grouping state ───────────────────────────────────────────────────────────\n const [internalGroupBy, setInternalGroupBy] = useState<string | null>(\n tableSettings?.groupBy ?? defaultGroupBy ?? null,\n );\n const [expandedGroups, setExpandedGroups] = useState<Record<string, boolean>>(\n {},\n );\n const [groupPanelOpen, setGroupPanelOpen] = useState(false);\n const [showGroupHeaderLocal, setShowGroupHeaderLocal] = useState(\n tableSettings?.showGroupHeader ?? showGroupHeader ?? true,\n );\n const groupPanelRef = useRef<HTMLDivElement>(null);\n\n const resolvedGroupBy = groupBy ?? internalGroupBy;\n const resolvedShowGroupHeader = showGroupHeader ?? showGroupHeaderLocal;\n\n // ── Unified settings snapshot — update after all state is declared ───────────\n // Handlers close over the ref (declared above); this assignment runs\n // synchronously on every render before any user interaction can fire.\n settingsSnapshotRef.current = {\n columnVisibility: colVisibility,\n columnWidths: internalColWidths,\n activeView,\n groupBy: internalGroupBy,\n showGroupHeader: showGroupHeaderLocal,\n stickyColumns: internalStickyColumns,\n };\n\n // ── Selection Lookup ─────────────────────────────────────────────────────────\n const selectionLookup = useMemo(() => {\n if (!selectedItems || selectedItems.length === 0) return null;\n\n const lookup = new Set<unknown>();\n selectedItems.forEach((item) => {\n // Support reference equality\n lookup.add(item);\n\n // Support ID equality\n if (rowKey) {\n // We pass -1 as index since we don't have it for selected items,\n // expecting rowKey to rely on intrinsic properties.\n lookup.add(rowKey(item, -1));\n } else if (typeof (item as Record<string, unknown>).id !== \"undefined\") {\n const idVal = (item as Record<string, unknown>).id;\n lookup.add(String(idVal));\n }\n });\n return lookup;\n }, [selectedItems, rowKey]);\n\n // ── Outside-click handlers ───────────────────────────────────────────────────\n useEffect(() => {\n if (!colPanelOpen) return;\n const handler = (e: MouseEvent) => {\n if (\n colPanelRef.current &&\n !colPanelRef.current.contains(e.target as Node)\n ) {\n setColPanelOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [colPanelOpen]);\n\n useEffect(() => {\n if (!groupPanelOpen) return;\n const handler = (e: MouseEvent) => {\n if (\n groupPanelRef.current &&\n !groupPanelRef.current.contains(e.target as Node)\n ) {\n setGroupPanelOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [groupPanelOpen]);\n\n useEffect(() => {\n if (!stickyPanelOpen) return;\n const handler = (e: MouseEvent) => {\n if (\n stickyPanelRef.current &&\n !stickyPanelRef.current.contains(e.target as Node)\n ) {\n setStickyPanelOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [stickyPanelOpen]);\n\n // ── Sort handler ─────────────────────────────────────────────────────────────\n const handleSortToggle = (column: TableColumn<T>) => {\n if (!column.sortable) {\n return;\n }\n\n const nextDirection = getNextSortDirection(\n resolvedSort?.columnId === column.id ? resolvedSort.direction : undefined,\n );\n\n const nextSort = nextDirection\n ? { columnId: column.id, direction: nextDirection }\n : null;\n\n if (!sortState) {\n setInternalSort(nextSort);\n }\n\n if (onSortChange) {\n onSortChange(nextSort);\n }\n };\n\n // ── Group handler ────────────────────────────────────────────────────────────\n const handleGroupChange = (columnId: string | null) => {\n setInternalGroupBy(columnId);\n setExpandedGroups({}); // reset expansion state when group changes\n onGroupByChange?.(columnId);\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n groupBy: columnId,\n });\n };\n\n // ── Sorted data ──────────────────────────────────────────────────────────────\n const sortedData = useMemo(() => {\n if (manualSorting) {\n return data;\n }\n\n if (!resolvedSort) {\n return data;\n }\n\n const column = columns?.find((col) => col.id === resolvedSort.columnId);\n\n if (!column || (!column.accessor && !column.render && !column.sortValue)) {\n return data;\n }\n\n // sortValue takes priority; fall back to the raw accessor value, then render.\n // Accessor is preferred over render because render typically returns JSX which\n // cannot be meaningfully compared as a string.\n const getValue = column.sortValue\n ? (row: T) => column.sortValue!(row)\n : column.accessor\n ? (row: T, index: number) => {\n if (typeof column.accessor === \"function\")\n return column.accessor(row, index);\n return (row as Record<string, unknown>)[column.accessor as string];\n }\n : (row: T, index: number) =>\n column.render ? column.render(row, index) : null;\n\n const sorted = [...data];\n sorted.sort((a, b) => {\n const aValue = getValue(a, data.indexOf(a));\n const bValue = getValue(b, data.indexOf(b));\n\n if (aValue === bValue) {\n return 0;\n }\n\n const safeString = (val: React.ReactNode): string => {\n if (typeof val === \"string\") return val;\n if (typeof val === \"number\") return String(val);\n if (typeof val === \"boolean\") return String(val);\n return \"\";\n };\n\n const aComparable =\n typeof aValue === \"number\"\n ? aValue\n : safeString(aValue as React.ReactNode).toLowerCase();\n const bComparable =\n typeof bValue === \"number\"\n ? bValue\n : safeString(bValue as React.ReactNode).toLowerCase();\n\n if (aComparable < bComparable) {\n return resolvedSort.direction === \"asc\" ? -1 : 1;\n }\n\n return resolvedSort.direction === \"asc\" ? 1 : -1;\n });\n\n return sorted;\n }, [resolvedSort, columns, data, manualSorting]);\n\n // ── Column helpers ───────────────────────────────────────────────────────────\n const effectiveColumns = columns ?? [];\n const menuColumns = effectiveColumns.filter((col) => !col.isActionsColumn);\n\n // User-configurable grouping is only shown when groupable=true and no code-defined groupBy\n const isUserGroupable =\n groupable === true &&\n !groupBy &&\n menuColumns.some((col) => col.groupable !== false);\n\n // The grouped column is always hidden from the rendered table\n const visibleColumns = effectiveColumns.filter(\n (col) => colVisibility[col.id] !== false && col.id !== resolvedGroupBy,\n );\n const hasHideableColumns = menuColumns.some((col) => col.hideable !== false);\n\n // ── Ordered visible columns ──────────────────────────────────────────────────\n // When columns are pinned (user-configured or code-defined), they are moved to\n // the appropriate edge while preserving relative order within each group:\n // [ left-pinned | normal | right-pinned ]\n // The stickyActions column (original last col) is always last within the right group.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const orderedVisibleColumns = useMemo((): TableColumn<T>[] => {\n const left: TableColumn<T>[] = [];\n const middle: TableColumn<T>[] = [];\n const right: TableColumn<T>[] = [];\n visibleColumns.forEach((col, i) => {\n const effective = internalStickyColumns[col.id] ?? col.sticky;\n if (effective === \"left\") {\n left.push(col);\n } else if (\n effective === \"right\" ||\n (stickyActions && i === visibleColumns.length - 1)\n ) {\n right.push(col);\n } else {\n middle.push(col);\n }\n });\n return [...left, ...middle, ...right];\n }, [visibleColumns, internalStickyColumns, stickyActions]);\n\n // ── Grouped data ─────────────────────────────────────────────────────────────\n const groupedData = useMemo((): GroupEntry<T>[] | null => {\n if (!resolvedGroupBy) return null;\n const column = effectiveColumns.find((c) => c.id === resolvedGroupBy);\n if (!column) return null;\n\n const groups: GroupEntry<T>[] = [];\n const groupMap = new Map<string, number>();\n\n sortedData.forEach((row, idx) => {\n // Resolution priority: groupValue → accessor primitive → sortValue → render primitive → \"\"\n let display = \"\";\n if (column.groupValue) {\n display = column.groupValue(row);\n } else if (column.accessor) {\n const accVal =\n typeof column.accessor === \"function\"\n ? column.accessor(row, idx)\n : (row as Record<string, unknown>)[column.accessor as string];\n if (typeof accVal === \"string\") display = accVal;\n else if (typeof accVal === \"number\") display = String(accVal);\n } else if (column.sortValue) {\n const sv = column.sortValue(row);\n display = String(sv);\n } else {\n const rendered = resolveValue(row, column, idx);\n if (typeof rendered === \"string\") display = rendered;\n else if (typeof rendered === \"number\") display = String(rendered);\n // React elements → display stays \"\" (avoids [object Object])\n }\n const key = display.toLowerCase(); // case-insensitive grouping\n\n if (!groupMap.has(key)) {\n groupMap.set(key, groups.length);\n groups.push({ key, display, rows: [] });\n }\n groups[groupMap.get(key)!].rows.push({ row, originalIndex: idx });\n });\n\n return groups;\n }, [resolvedGroupBy, effectiveColumns, sortedData]);\n\n // Auto-initialize expansion state for newly seen groups\n useEffect(() => {\n if (!groupedData) return;\n setExpandedGroups((prev) => {\n const next = { ...prev };\n let changed = false;\n for (const g of groupedData) {\n if (!(g.key in next)) {\n next[g.key] = defaultGroupExpanded !== false; // default: expanded\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [groupedData, defaultGroupExpanded]);\n\n const toggleGroup = (key: string) => {\n setExpandedGroups((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n // When panelDeduplicateBy is set, only the first row for each key is shown in panel view\n const panelRows = useMemo(() => {\n if (!panelDeduplicateBy) return sortedData;\n const seen = new Set<string | number>();\n return sortedData.filter((row) => {\n const key = panelDeduplicateBy(row);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }, [sortedData, panelDeduplicateBy]);\n\n // When grouping is active AND showing group headers, we render an extra\n // leading column for the expand/collapse chevron.\n const showGroupExpandCol = !!(resolvedGroupBy && resolvedShowGroupHeader);\n\n // ── Effective per-column stickiness (column-defined + user-configured) ───────\n // User config takes precedence over the column-defined sticky value, so users\n // can override or clear a code-defined pin at runtime.\n const getEffectiveSticky = (\n col: TableColumn<T>,\n ): \"left\" | \"right\" | undefined =>\n internalStickyColumns[col.id] ?? col.sticky ?? undefined;\n\n // True when at least one visible column is pinned to the left (code-defined or user-configured).\n // Used to decide whether the grouped-row spacer td needs an opaque background.\n const hasLeftStickyColumn = orderedVisibleColumns.some(\n (col) => getEffectiveSticky(col) === \"left\",\n );\n\n // ── Sticky-right column offsets ──────────────────────────────────────────────\n // When multiple columns are pinned to the right (via sticky:'right',\n // stickyActions, or user config), each one needs a `right` offset equal to\n // the total width of all right-sticky columns further to the right. We\n // calculate this from internalColWidths → column.width → column.minWidth.\n const rightStickyOffsets = useMemo((): Record<string, number | undefined> => {\n const offsets: Record<string, number | undefined> = {};\n let cumulative = 0;\n for (let i = orderedVisibleColumns.length - 1; i >= 0; i--) {\n const col = orderedVisibleColumns[i];\n const effective = internalStickyColumns[col.id] ?? col.sticky;\n const isSticky =\n effective === \"right\" ||\n (stickyActions && i === orderedVisibleColumns.length - 1);\n if (!isSticky) continue;\n offsets[col.id] = cumulative;\n const w =\n internalColWidths[col.id] ??\n (typeof col.width === \"number\" ? col.width : undefined) ??\n (typeof col.minWidth === \"number\" ? col.minWidth : undefined);\n if (w !== undefined) cumulative += w;\n }\n return offsets;\n }, [\n orderedVisibleColumns,\n stickyActions,\n internalColWidths,\n internalStickyColumns,\n ]);\n\n // ── Visual class helpers ─────────────────────────────────────────────────────\n const wrapperClasses = classNames(\n \"w-full\",\n variantWrapperBase[variant],\n rounded &&\n \"overflow-hidden rounded-2xl border border-neutral-200/80 dark:border-neutral-700/60\",\n fullHeight && \"h-full flex flex-col\",\n className,\n );\n const tableClasses = classNames(variantTableBase[variant], tableClassName);\n\n const cellPadding = variantCellPadding[variant];\n const sidePaddingTokens = variantSidePadding[variant];\n\n const headerToneClasses =\n variant === \"flat\"\n ? \"bg-white text-neutral-500 dark:bg-transparent dark:text-neutral-400 border-neutral-200 dark:border-neutral-700\"\n : getToneHeaderClasses(tone);\n const headerBaseClasses =\n \"text-xs font-semibold uppercase tracking-wide text-left text-neutral-600 dark:text-neutral-200\";\n\n const tbodyClasses = classNames(\n \"bg-white dark:bg-neutral-900/40 divide-y divide-neutral-200 dark:divide-neutral-800\",\n (striped || noBorders) && \"divide-y-0\",\n bodyClassName,\n );\n\n const scrollContainerStyle = maxHeight\n ? {\n maxHeight: typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight,\n }\n : undefined;\n\n const hasRows = sortedData.length > 0;\n\n // ── Empty state renderers ────────────────────────────────────────────────────\n const emptyColSpan =\n (showGroupExpandCol ? visibleColumns.length + 1 : visibleColumns.length) ||\n 1;\n\n const renderEmptyState = () => (\n <tr>\n <td\n colSpan={emptyColSpan}\n className={classNames(\n \"px-6 py-16 text-center text-sm font-medium text-neutral-500 dark:text-neutral-300\",\n )}\n >\n {emptyState ?? \"No data to display\"}\n </td>\n </tr>\n );\n\n const renderPanelEmptyState = () => (\n <div className=\"px-6 py-16 text-center text-sm font-medium text-neutral-500 dark:text-neutral-300\">\n {emptyState ?? \"No data to display\"}\n </div>\n );\n\n // ── Row renderer (shared between grouped and flat modes) ──────────────────────\n const renderRow = (\n row: T,\n originalIndex: number,\n isGroupedSubRow = false,\n ) => {\n const key = resolveRowKey(row, originalIndex, rowKey);\n\n // Check reference or ID match\n const isSelected = selectionLookup?.has(row) || selectionLookup?.has(key);\n const isHighlighted =\n !isSelected && (rowHighlight?.(row, originalIndex) ?? false);\n\n const selectedClass = isSelected ? getSelectedRowClass(color) : \"\";\n const highlightRowClass = isHighlighted ? getHighlightRowClass(color) : \"\";\n const baseRowBgClass =\n striped && originalIndex % 2 === 1\n ? \"bg-neutral-100 dark:bg-neutral-800/40\"\n : \"bg-white dark:bg-neutral-900\";\n // Use fully-opaque hover for all cells so the whole row shifts uniformly.\n // Sticky cells need !important to override their explicit base background class.\n const rowCellHoverClass =\n !isSelected && !isHighlighted && hoverable\n ? striped && originalIndex % 2 === 1\n ? \"group-hover:bg-neutral-200 dark:group-hover:bg-neutral-700\"\n : \"group-hover:bg-neutral-200 dark:group-hover:bg-neutral-700\"\n : undefined;\n const stickyCellHoverClass =\n !isSelected && !isHighlighted && hoverable\n ? striped && originalIndex % 2 === 1\n ? \"group-hover:!bg-neutral-200 dark:group-hover:!bg-neutral-700\"\n : \"group-hover:!bg-neutral-200 dark:group-hover:!bg-neutral-700\"\n : undefined;\n const rowClasses = classNames(\n cellPadding,\n \"group\",\n isSelected\n ? selectedClass\n : isHighlighted\n ? highlightRowClass\n : striped &&\n originalIndex % 2 === 1 &&\n \"bg-neutral-100 dark:bg-neutral-800/40\",\n isHighlighted && hoverable && \"hover:brightness-95\",\n \"transition-colors duration-150 ease-out\",\n onRowClick ? \"cursor-pointer\" : \"cursor-default\",\n rowClassName ? rowClassName(row, originalIndex) : undefined,\n );\n\n return (\n <tr\n key={key}\n className={rowClasses}\n onClick={onRowClick ? () => onRowClick(row, originalIndex) : undefined}\n >\n {/* Expand spacer column — only in grouped mode with visible group headers */}\n {showGroupExpandCol && (\n <td\n className={classNames(\n \"w-10 sticky left-0 z-20\",\n // Only apply an opaque background when there is a left-sticky data column;\n // otherwise the spacer can remain transparent.\n hasLeftStickyColumn &&\n (isSelected\n ? getSelectedRowClass(color)\n : isHighlighted\n ? getHighlightRowClass(color)\n : baseRowBgClass),\n // When there are sticky columns use the opaque hover; otherwise use the normal semi-transparent hover.\n hasLeftStickyColumn ? stickyCellHoverClass : rowCellHoverClass,\n )}\n aria-hidden=\"true\"\n >\n <div className=\"w-full h-full\" />\n </td>\n )}\n {/* Indent spacer — only in grouped mode without group headers */}\n {resolvedGroupBy && !showGroupExpandCol && (\n <td className=\"w-4\" aria-hidden=\"true\" />\n )}\n {orderedVisibleColumns.map((column, colIndex) => {\n const cellValue = resolveValue(row, column, originalIndex);\n // Text cells (string/number) get TruncatedText with a tooltip on actual overflow.\n // JSX cells fall back to the old maxWidth-based truncate class.\n const isTextCell =\n typeof cellValue === \"string\" || typeof cellValue === \"number\";\n\n const tdResizeWidth = internalColWidths[column.id];\n const effectiveSticky = getEffectiveSticky(column);\n const isStickyLeft = effectiveSticky === \"left\";\n const isStickyRight =\n effectiveSticky === \"right\" ||\n (stickyActions && colIndex === orderedVisibleColumns.length - 1);\n const rightOffset = isStickyRight\n ? rightStickyOffsets[column.id]\n : undefined;\n return (\n <td\n key={column.id}\n className={classNames(\n \"whitespace-nowrap align-middle text-sm text-neutral-700 dark:text-neutral-200\",\n (isStickyLeft || isStickyRight) && \"sticky\",\n isStickyLeft && (showGroupExpandCol ? \"left-10\" : \"left-0\"),\n // right position is set via inline style when offset > 0\n isStickyRight && !rightOffset && \"right-0\",\n (isStickyLeft || isStickyRight) && \"z-10\",\n (isStickyLeft || isStickyRight) &&\n (isSelected\n ? getSelectedRowClass(color)\n : isHighlighted\n ? getHighlightRowClass(color)\n : striped && originalIndex % 2 === 1\n ? \"bg-neutral-100 dark:bg-neutral-800/40\"\n : (column.stickyBackgroundFn?.(row, originalIndex) ??\n column.stickyBackground ??\n \"bg-white dark:bg-neutral-900\")),\n // Sticky cells must keep an opaque background on hover to avoid scrolled content\n // bleeding through — use the fully-opaque sticky hover class instead of the semi-transparent hover.\n isStickyLeft || isStickyRight\n ? stickyCellHoverClass\n : rowCellHoverClass,\n (isStickyLeft || isStickyRight) &&\n isHighlighted &&\n hoverable &&\n \"group-hover:brightness-95\",\n getCellAlignment(column.align),\n colIndex === 0 && sidePaddingTokens.left,\n colIndex === orderedVisibleColumns.length - 1 &&\n sidePaddingTokens.right,\n // Pulsing left border indicator on the first visible cell for highlighted rows\n colIndex === 0 &&\n isHighlighted &&\n classNames(\n \"border-l-4 animate-pulse\",\n getHighlightBorderClass(color),\n ),\n isStickyRight &&\n effectiveSticky === \"right\" &&\n !noBorders &&\n \"border-l border-neutral-300 dark:border-neutral-700\",\n column.className,\n )}\n style={{\n ...(tdResizeWidth\n ? {\n width: tdResizeWidth,\n minWidth: tdResizeWidth,\n maxWidth: tdResizeWidth,\n }\n : applyWidthStyle(\n column.width,\n column.minWidth,\n column.maxWidth,\n )),\n ...(isStickyRight && rightOffset !== undefined\n ? { right: rightOffset }\n : {}),\n }}\n >\n <div\n className={classNames(\n \"flex items-center min-w-0\",\n \"py-1\",\n sidePaddingTokens.contentVertical,\n getCellFlexAlignment(column.align),\n // For JSX cells with a declared maxWidth, still clip via truncate\n !isTextCell && column.maxWidth && \"truncate\",\n // Add extra left indent to the first data column in grouped sub-rows\n isGroupedSubRow && colIndex === 0 && \"pl-2\",\n )}\n >\n {isTextCell ? (\n <TruncatedText\n text={String(cellValue)}\n as=\"span\"\n delay={2000}\n noWrapper\n className=\"min-w-0 flex-1\"\n />\n ) : (\n cellValue\n )}\n </div>\n </td>\n );\n })}\n </tr>\n );\n };\n\n // ── Group label for the config panel ─────────────────────────────────────────\n const getColumnLabel = (col: TableColumn<T>) =>\n typeof col.header === \"string\" ? col.header : col.id;\n\n return (\n <div className={wrapperClasses} style={style}>\n <div\n className={classNames(\n \"relative flex flex-col\",\n fullHeight && \"flex-1 overflow-hidden h-full\",\n )}\n >\n {/* ── Header bar ────────────────────────────────────────────────────── */}\n {(headerActions ||\n showViewToggle ||\n (showColumnSelector && hasHideableColumns) ||\n isUserGroupable ||\n userStickyColumns) && (\n <div className=\"flex-none flex items-center gap-3 border-b border-neutral-200 px-6 py-3 dark:border-neutral-700\">\n {headerTitle && (\n <div className=\"text-sm font-semibold text-neutral-700 dark:text-neutral-200\">\n {headerTitle}\n </div>\n )}\n <div className=\"flex-1\" />\n <div className=\"flex items-center gap-2\">\n {/* View toggle */}\n {showViewToggle && (\n <>\n <IconButton\n icon=\"ViewRows\"\n size=\"xs\"\n variant=\"ghost\"\n color={color}\n tooltip=\"Table view\"\n tooltipPosition=\"bottom\"\n disabled={activeView === \"table\"}\n aria-pressed={activeView === \"table\"}\n onClick={() => {\n setActiveView(\"table\");\n onViewChange?.(\"table\");\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n activeView: \"table\",\n });\n }}\n aria-label=\"Switch to table view\"\n />\n <IconButton\n icon=\"ViewGrid\"\n size=\"xs\"\n variant=\"ghost\"\n color={color}\n tooltip=\"Panel view\"\n tooltipPosition=\"bottom\"\n disabled={activeView === \"panel\"}\n aria-pressed={activeView === \"panel\"}\n onClick={() => {\n setActiveView(\"panel\");\n onViewChange?.(\"panel\");\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n activeView: \"panel\",\n });\n }}\n aria-label=\"Switch to panel view\"\n />\n </>\n )}\n\n {/* Column visibility toggle — table view only */}\n {showColumnSelector &&\n hasHideableColumns &&\n activeView === \"table\" && (\n <div className=\"relative\" ref={colPanelRef}>\n <IconButton\n icon=\"EyeOpen\"\n size=\"xs\"\n variant=\"ghost\"\n color={color}\n tooltip=\"Columns\"\n tooltipPosition=\"bottom\"\n aria-pressed={colPanelOpen}\n onClick={() => setColPanelOpen((o) => !o)}\n aria-label=\"Toggle column visibility\"\n />\n {colPanelOpen && (\n <div className=\"absolute right-0 top-full z-50 mt-1 min-w-[200px] rounded-xl border border-neutral-200 bg-white shadow-lg dark:border-neutral-700 dark:bg-neutral-900\">\n <div className=\"px-3 py-2 text-xs font-semibold uppercase tracking-wide text-neutral-400 dark:text-neutral-500 border-b border-neutral-100 dark:border-neutral-800\">\n Columns\n </div>\n <div className=\"py-1 max-h-64 overflow-y-auto\">\n {menuColumns.map((col) => {\n const hideable = col.hideable !== false;\n const visible = colVisibility[col.id] !== false;\n const label =\n typeof col.header === \"string\"\n ? col.header\n : col.id;\n return (\n <label\n key={col.id}\n className={classNames(\n \"flex items-center gap-2.5 px-3 py-1.5 text-sm select-none\",\n hideable\n ? \"cursor-pointer hover:bg-neutral-50 dark:hover:bg-neutral-800/60\"\n : \"cursor-not-allowed opacity-40\",\n )}\n >\n <input\n type=\"checkbox\"\n checked={visible}\n disabled={!hideable}\n onChange={() => {\n const next = {\n ...colVisibility,\n [col.id]: !visible,\n };\n setColVisibility(next);\n onColumnVisibilityChange?.(next);\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n columnVisibility: next,\n });\n }}\n className={classNames(\n \"h-3.5 w-3.5 rounded border-neutral-300\",\n getAccentClass(color),\n )}\n />\n <span className=\"text-neutral-700 dark:text-neutral-200\">\n {label}\n </span>\n </label>\n );\n })}\n </div>\n <div className=\"border-t border-neutral-100 px-3 py-2 dark:border-neutral-800\">\n <Button\n variant=\"ghost\"\n color={color}\n size=\"xs\"\n onClick={() => {\n const reset: Record<string, boolean> = {};\n for (const col of effectiveColumns) {\n reset[col.id] = getDefaultColumnVisibility(col);\n }\n setColVisibility(reset);\n onColumnVisibilityChange?.(reset);\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n columnVisibility: reset,\n });\n }}\n >\n Reset to default\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Group-by config button — table view only */}\n {isUserGroupable && activeView === \"table\" && (\n <div className=\"relative\" ref={groupPanelRef}>\n {/* Wrapper to position the active indicator dot */}\n <div className=\"relative inline-flex\">\n <IconButton\n icon=\"Group\"\n size=\"xs\"\n variant=\"ghost\"\n color={color}\n tooltip=\"Group by\"\n tooltipPosition=\"bottom\"\n aria-pressed={groupPanelOpen || !!resolvedGroupBy}\n onClick={() => setGroupPanelOpen((o) => !o)}\n aria-label=\"Configure row grouping\"\n />\n {/* Active indicator dot */}\n {resolvedGroupBy && (\n <span\n className={classNames(\n \"pointer-events-none absolute -right-0.5 -top-0.5 h-2 w-2 rounded-full ring-2 ring-white dark:ring-neutral-900\",\n getDotColorClass(color),\n )}\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {groupPanelOpen && (\n <div className=\"absolute right-0 top-full z-50 mt-1 min-w-[220px] rounded-xl border border-neutral-200 bg-white shadow-lg dark:border-neutral-700 dark:bg-neutral-900\">\n {/* Panel header */}\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-neutral-100 dark:border-neutral-800\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-neutral-400 dark:text-neutral-500\">\n Group by\n </span>\n {internalGroupBy && (\n <button\n type=\"button\"\n onClick={() => handleGroupChange(null)}\n className=\"text-xs text-neutral-400 hover:text-neutral-600 dark:text-neutral-500 dark:hover:text-neutral-300 transition-colors\"\n >\n Clear\n </button>\n )}\n </div>\n\n {/* Column radio list — shows ALL columns (even hidden), excludes groupable:false */}\n <div className=\"py-1 max-h-64 overflow-y-auto\">\n <label className=\"flex items-center gap-2.5 px-3 py-1.5 text-sm select-none cursor-pointer hover:bg-neutral-50 dark:hover:bg-neutral-800/60\">\n <input\n type=\"radio\"\n name=\"table-group-by\"\n checked={!internalGroupBy}\n onChange={() => handleGroupChange(null)}\n className={classNames(\n \"h-3.5 w-3.5 border-neutral-300\",\n getAccentClass(color),\n )}\n />\n <span className=\"italic text-neutral-400 dark:text-neutral-500\">\n None\n </span>\n </label>\n {menuColumns\n .filter((col) => col.groupable !== false)\n .map((col) => (\n <label\n key={col.id}\n className=\"flex items-center gap-2.5 px-3 py-1.5 text-sm select-none cursor-pointer hover:bg-neutral-50 dark:hover:bg-neutral-800/60\"\n >\n <input\n type=\"radio\"\n name=\"table-group-by\"\n checked={internalGroupBy === col.id}\n onChange={() => handleGroupChange(col.id)}\n className={classNames(\n \"h-3.5 w-3.5 border-neutral-300\",\n getAccentClass(color),\n )}\n />\n <span className=\"text-neutral-700 dark:text-neutral-200\">\n {getColumnLabel(col)}\n </span>\n {/* Show \"(hidden)\" hint when the column is currently not visible */}\n {colVisibility[col.id] === false && (\n <span className=\"ml-auto text-xs text-neutral-400 dark:text-neutral-500\">\n hidden\n </span>\n )}\n </label>\n ))}\n </div>\n\n {/* Show group header toggle */}\n <div className=\"border-t border-neutral-100 px-3 py-2.5 dark:border-neutral-800\">\n <label className=\"flex items-center gap-2.5 text-sm select-none cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={resolvedShowGroupHeader}\n onChange={() => {\n setShowGroupHeaderLocal((v) => {\n const next = !v;\n onTableSettingsChange?.({\n ...settingsSnapshotRef.current,\n showGroupHeader: next,\n });\n return next;\n });\n }}\n className={classNames(\n \"h-3.5 w-3.5 rounded border-neutral-300\",\n getAccentClass(color),\n )}\n />\n <span className=\"text-neutral-700 dark:text-neutral-200\">\n Show group header\n </span>\n </label>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Sticky column picker — table view only */}\n {userStickyColumns && activeView === \"table\" && (\n <div className=\"relative\" ref={stickyPanelRef}>\n <div className=\"relative inline-flex\">\n <IconButton\n icon=\"Pin\"\n size=\"xs\"\n variant=\"ghost\"\n color={color}\n tooltip=\"Sticky columns\"\n tooltipPosition=\"bottom\"\n aria-pressed={stickyPanelOpen || hasStickyColumns}\n onClick={() => setStickyPanelOpen((o) => !o)}\n aria-label=\"Configure sticky columns\"\n />\n {hasStickyColumns && (\n <span\n className={classNames(\n \"pointer-events-none absolute -right-0.5 -top-0.5 h-2 w-2 rounded-full ring-2 ring-white dark:ring-neutral-900\",\n getDotColorClass(color),\n )}\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {stickyPanelOpen && (\n <div className=\"absolute right-0 top-full z-50 mt-1 min-w-[240px] rounded-xl border border-neutral-200 bg-white shadow-lg dark:border-neutral-700 dark:bg-neutral-900\">\n {/* Panel header */}\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-neutral-100 dark:border-neutral-800\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-neutral-400 dark:text-neutral-500\">\n Sticky columns\n </span>\n {hasStickyColumns && (\n <button\n type=\"button\"\n onClick={() => {\n setInternalStickyColumns({});\n onStickyColumnsChange?.({});\n }}\n className=\"text-xs text-neutral-400 hover:text-neutral-600 dark:text-neutral-500 dark:hover:text-neutral-300 transition-colors\"\n >\n Clear all\n </button>\n )}\n </div>\n\n {/* Column list */}\n <div className=\"py-1 max-h-64 overflow-y-auto\">\n {menuColumns.map((col) => {\n const label = getColumnLabel(col);\n const current = internalStickyColumns[col.id] ?? null;\n return (\n <div\n key={col.id}\n className=\"flex items-center gap-2 px-3 py-1.5 text-sm hover:bg-neutral-50 dark:hover:bg-neutral-800/60\"\n >\n <span className=\"flex-1 truncate text-neutral-700 dark:text-neutral-200\">\n {label}\n </span>\n {/* Left / None / Right toggle */}\n <div className=\"flex items-center rounded-md border border-neutral-200 dark:border-neutral-700 overflow-hidden text-xs\">\n {([\"left\", null, \"right\"] as const).map(\n (side) => (\n <button\n key={String(side)}\n type=\"button\"\n onClick={() =>\n handleStickyChange(col.id, side)\n }\n className={classNames(\n \"px-2 py-0.5 transition-colors select-none\",\n current === side\n ? \"bg-neutral-200 dark:bg-neutral-700 font-semibold text-neutral-900 dark:text-neutral-100\"\n : \"text-neutral-400 hover:bg-neutral-100 dark:hover:bg-neutral-800 dark:text-neutral-500\",\n )}\n >\n {side === \"left\"\n ? \"←\"\n : side === \"right\"\n ? \"→\"\n : \"·\"}\n </button>\n ),\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Legend */}\n <div className=\"border-t border-neutral-100 px-3 py-2 dark:border-neutral-800\">\n <span className=\"text-xs text-neutral-400 dark:text-neutral-500\">\n ← pin left · · unpin · → pin\n right\n </span>\n </div>\n </div>\n )}\n </div>\n )}\n\n {headerActions}\n </div>\n </div>\n )}\n\n {/* ── Table view ────────────────────────────────────────────────────── */}\n {activeView === \"table\" && visibleColumns.length > 0 && (\n <div\n className={classNames(\"relative\", fullHeight && \"flex-1 min-h-0\")}\n >\n <div\n className={classNames(\n \"overflow-x-auto relative\",\n fullHeight ? \"h-full overflow-y-auto\" : \"\",\n !fullHeight && maxHeight && \"overflow-y-auto\",\n )}\n style={!fullHeight ? scrollContainerStyle : undefined}\n >\n <table\n className={tableClasses}\n style={\n useFixedLayout\n ? { tableLayout: \"fixed\", width: \"100%\" }\n : undefined\n }\n >\n {/* Colgroup drives precise column widths in fixed layout */}\n {useFixedLayout && (\n <colgroup>\n {showGroupExpandCol && <col style={{ width: \"2.5rem\" }} />}\n {resolvedGroupBy && !showGroupExpandCol && (\n <col style={{ width: \"1rem\" }} />\n )}\n {orderedVisibleColumns.map((col) => {\n const resizedW = internalColWidths[col.id];\n if (resizedW)\n return (\n <col\n key={col.id}\n style={{\n width: `${resizedW}px`,\n minWidth: `${resizedW}px`,\n }}\n />\n );\n // For non-resized columns, honour width/minWidth so fixed layout can't squeeze them below their declared minimum\n const declaredW =\n col.width !== undefined\n ? typeof col.width === \"number\"\n ? col.width\n : col.width\n : undefined;\n const declaredMin =\n col.minWidth !== undefined\n ? typeof col.minWidth === \"number\"\n ? col.minWidth\n : col.minWidth\n : undefined;\n const colW = declaredW ?? declaredMin;\n return (\n <col\n key={col.id}\n style={\n colW !== undefined\n ? {\n width:\n typeof colW === \"number\"\n ? `${colW}px`\n : colW,\n minWidth:\n typeof colW === \"number\"\n ? `${colW}px`\n : colW,\n }\n : undefined\n }\n />\n );\n })}\n </colgroup>\n )}\n <thead>\n <tr\n className={classNames(\n headerToneClasses,\n \"border-b dark:border-opacity-60\",\n )}\n >\n {/* Extra leading th for expand/collapse when grouping with group headers */}\n {showGroupExpandCol && (\n <th\n scope=\"col\"\n className={classNames(\n headerToneClasses,\n \"sticky left-0\",\n stickyHeader && \"top-0\",\n stickyHeader ? \"z-30\" : \"z-10\",\n \"w-10 pl-3 pr-1\",\n )}\n aria-hidden=\"true\"\n >\n <div className=\"w-full h-full\" />\n </th>\n )}\n {/* Indent spacer th for grouped mode without group headers */}\n {resolvedGroupBy && !showGroupExpandCol && (\n <th scope=\"col\" className=\"w-4\" aria-hidden=\"true\" />\n )}\n {orderedVisibleColumns.map((column, colIndex) => {\n const isSorted = resolvedSort?.columnId === column.id;\n const sortDirection = isSorted\n ? resolvedSort?.direction\n : undefined;\n\n const isResizable =\n resizableColumns && column.resizable !== false;\n const resizeWidth = internalColWidths[column.id];\n const thEffectiveSticky = getEffectiveSticky(column);\n const isStickyLeft = thEffectiveSticky === \"left\";\n const isStickyRight =\n thEffectiveSticky === \"right\" ||\n (stickyActions &&\n colIndex === orderedVisibleColumns.length - 1);\n const rightOffset = isStickyRight\n ? rightStickyOffsets[column.id]\n : undefined;\n\n return (\n <th\n key={column.id}\n ref={(el) => {\n thRefs.current[column.id] = el;\n }}\n scope=\"col\"\n className={classNames(\n headerBaseClasses,\n headerToneClasses,\n cellPadding,\n stickyHeader && \"sticky top-0\",\n (isStickyLeft || isStickyRight) && \"sticky\",\n isStickyLeft &&\n (showGroupExpandCol ? \"left-10\" : \"left-0\"),\n // right position is set via inline style when offset > 0\n isStickyRight && !rightOffset && \"right-0\",\n stickyHeader && (isStickyLeft || isStickyRight)\n ? \"z-30\"\n : stickyHeader\n ? \"z-20\"\n : isStickyLeft || isStickyRight\n ? \"z-10\"\n : \"\",\n getCellAlignment(column.align),\n \"overflow-hidden\",\n isResizable && \"relative\",\n isStickyRight &&\n thEffectiveSticky === \"right\" &&\n !noBorders &&\n \"border-l border-neutral-200 dark:border-neutral-700\",\n column.headerClassName,\n )}\n style={{\n ...(resizeWidth\n ? {\n width: resizeWidth,\n minWidth: resizeWidth,\n maxWidth: resizeWidth,\n }\n : applyWidthStyle(\n column.width,\n column.minWidth,\n column.maxWidth,\n )),\n ...(isStickyRight && rightOffset !== undefined\n ? { right: rightOffset }\n : {}),\n }}\n aria-sort={\n sortDirection\n ? sortDirection === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n }\n title={column.tooltip}\n >\n <div\n className={classNames(\n \"flex items-center gap-1 min-w-0\",\n column.align === \"right\"\n ? \"justify-end\"\n : column.align === \"center\"\n ? \"justify-center\"\n : \"justify-start\",\n )}\n >\n <span className=\"truncate min-w-0 flex-1\">\n {column.header}\n </span>\n {column.sortable ? (\n <IconButton\n icon={\n sortDirection\n ? sortIconMap[sortDirection]\n : sortIconMap.default\n }\n size=\"xs\"\n variant=\"icon\"\n color={isSorted ? color : \"slate\"}\n rounded=\"md\"\n accent={false}\n tooltip={\n sortDirection === \"asc\"\n ? \"Sort descending\"\n : sortDirection === \"desc\"\n ? \"Clear sort\"\n : \"Sort ascending\"\n }\n tooltipPosition=\"bottom\"\n className={classNames(\n \"ml-1 flex-shrink-0\",\n !isSorted &&\n \"text-neutral-400 hover:text-neutral-600 dark:text-neutral-400 dark:hover:text-neutral-200\",\n )}\n onClick={() => handleSortToggle(column)}\n aria-label=\"Toggle sort\"\n />\n ) : null}\n </div>\n {/* Resize handle */}\n {isResizable && (\n <div\n role=\"separator\"\n aria-hidden=\"true\"\n className=\"group/rh absolute inset-y-0 right-0 z-10 flex w-2 cursor-col-resize select-none items-center justify-center\"\n onMouseDown={(e) => {\n const minW =\n column.minWidth !== undefined\n ? typeof column.minWidth === \"number\"\n ? column.minWidth\n : parseInt(column.minWidth, 10)\n : 48;\n handleResizeStart(\n e,\n column.id,\n Math.max(48, isNaN(minW) ? 48 : minW),\n );\n }}\n >\n <div\n className={classNames(\n \"h-1/2 w-px bg-neutral-300 dark:bg-neutral-600 transition-colors\",\n getResizeHandleHoverClass(color),\n )}\n />\n </div>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className={tbodyClasses}>\n {/* ── Grouped rendering ─────────────────────────────── */}\n {groupedData\n ? hasRows\n ? groupedData.map((group) => {\n const isExpanded =\n expandedGroups[group.key] !== false;\n return (\n <React.Fragment key={`group-${group.key}`}>\n {/* Group header row */}\n {resolvedShowGroupHeader && (\n <tr\n className=\"cursor-pointer select-none border-b border-neutral-100 bg-neutral-50 transition-colors duration-150 hover:bg-neutral-100 dark:border-neutral-800 dark:bg-neutral-800/40 dark:hover:bg-neutral-700/50\"\n onClick={() => toggleGroup(group.key)}\n >\n <td\n colSpan={visibleColumns.length + 1}\n className=\"py-2 bg-neutral-50 hover:bg-neutral-100 dark:bg-neutral-800/40 dark:hover:bg-neutral-700/50\"\n >\n <div\n className={classNames(\n \"sticky left-0 flex w-fit items-center gap-2 bg-inherit\",\n sidePaddingTokens.left,\n )}\n >\n <span\n className={classNames(\n \"inline-flex text-neutral-400 dark:text-neutral-500\",\n )}\n >\n <ChevronSvg expanded={isExpanded} />\n </span>\n <span className=\"text-sm font-semibold text-neutral-700 dark:text-neutral-200\">\n {group.display || (\n <span className=\"italic text-neutral-400 dark:text-neutral-500\">\n empty\n </span>\n )}\n </span>\n <Badge\n count={group.rows.length}\n tone={color as PanelTone}\n />\n </div>\n </td>\n </tr>\n )}\n {/* Sub-rows — hidden when collapsed */}\n {(isExpanded || !resolvedShowGroupHeader) &&\n group.rows.map(({ row, originalIndex }) =>\n renderRow(row, originalIndex, true),\n )}\n </React.Fragment>\n );\n })\n : renderEmptyState()\n : /* ── Flat (ungrouped) rendering ──────────────────── */\n hasRows\n ? sortedData.map((row, rowIndex) =>\n renderRow(row, rowIndex, false),\n )\n : renderEmptyState()}\n </tbody>\n </table>\n {loading && (\n <Loader\n overlay\n variant={loaderType}\n label={loadingMessage}\n progress={loaderProgress}\n className=\"rounded-none\"\n />\n )}\n </div>\n </div>\n )}\n\n {/* ── Panel view ────────────────────────────────────────────────────── */}\n {activeView === \"panel\" && panelItem && (\n <div\n className={classNames(\n \"relative\",\n fullHeight ? \"flex-1 min-h-0 overflow-auto\" : undefined,\n )}\n style={!fullHeight ? scrollContainerStyle : undefined}\n >\n {loading && (\n <Loader\n overlay\n variant={loaderType}\n label={loadingMessage}\n progress={loaderProgress}\n className=\"rounded-none\"\n />\n )}\n {hasRows ? (\n <div\n className={classNames(\n \"p-4\",\n panelMinItemWidth != null\n ? // auto-fill mode: grid base + any extra non-layout classes from consumer\n // gap is intentionally excluded here — it lives in the inline style below\n classNames(\"grid\", panelGridClassName)\n : // legacy / explicit class mode (gap lives in the class string as before)\n (panelGridClassName ??\n \"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\"),\n )}\n style={\n panelMinItemWidth != null\n ? (() => {\n const minW =\n typeof panelMinItemWidth === \"number\"\n ? `${panelMinItemWidth}px`\n : panelMinItemWidth;\n const maxW =\n panelMaxItemWidth != null\n ? `min(${typeof panelMaxItemWidth === \"number\" ? `${panelMaxItemWidth}px` : panelMaxItemWidth}, 1fr)`\n : \"1fr\";\n return {\n gridTemplateColumns: `repeat(auto-fill, minmax(min(${minW}, 100%), ${maxW}))`,\n gap:\n panelGap != null\n ? typeof panelGap === \"number\"\n ? `${panelGap}px`\n : panelGap\n : \"1rem\",\n };\n })()\n : undefined\n }\n >\n {panelRows.map((row, rowIndex) => (\n <React.Fragment key={resolveRowKey(row, rowIndex, rowKey)}>\n {panelItem(row, rowIndex)}\n </React.Fragment>\n ))}\n </div>\n ) : (\n renderPanelEmptyState()\n )}\n </div>\n )}\n\n {/* ── Footer / pagination ───────────────────────────────────────────── */}\n {(footer || (pagination && pagination.total > 0)) && (\n <div className=\"border-t border-neutral-200 bg-neutral-50 px-6 py-3 text-sm text-neutral-600 dark:border-neutral-700 dark:bg-neutral-900/60 dark:text-neutral-300\">\n {footer\n ? footer\n : pagination && (\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-neutral-600 dark:text-neutral-400\">\n Showing{\" \"}\n {(pagination.page - 1) * pagination.pageSize + 1} to{\" \"}\n {Math.min(\n pagination.page * pagination.pageSize,\n pagination.total,\n )}{\" \"}\n of {pagination.total} results\n </span>\n <div className=\"w-32 ml-4\">\n <Select\n value={pagination.pageSize}\n onChange={(e) => {\n pagination.onPageSizeChange(Number(e.target.value));\n }}\n size=\"sm\"\n >\n <option value={20}>20 per page</option>\n <option value={50}>50 per page</option>\n <option value={100}>100 per page</option>\n </Select>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"soft\"\n color={color}\n size=\"sm\"\n disabled={pagination.page === 1 || loading}\n onClick={() =>\n pagination.onPageChange(\n Math.max(1, pagination.page - 1),\n )\n }\n leadingIcon=\"ArrowLeft\"\n >\n Previous\n </Button>\n <span className=\"text-sm font-medium text-neutral-700 dark:text-neutral-300\">\n Page {pagination.page} of{\" \"}\n {Math.ceil(pagination.total / pagination.pageSize)}\n </span>\n <Button\n variant=\"soft\"\n color={color}\n size=\"sm\"\n disabled={\n pagination.page >=\n Math.ceil(pagination.total / pagination.pageSize) ||\n loading\n }\n onClick={() =>\n pagination.onPageChange(\n Math.min(\n Math.ceil(pagination.total / pagination.pageSize),\n pagination.page + 1,\n ),\n )\n }\n trailingIcon=\"ArrowRight\"\n >\n Next\n </Button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Table<T>(props: TableProps<T>): React.ReactElement {\n return <TableComponent {...props} />;\n}\n\nexport default Table;\n","import React, { useMemo, useState } from \"react\";\nimport classNames from \"classnames\";\nimport Table, { TableColumn } from \"./Table\";\nimport Button from \"./Button\";\nimport Badge from \"./Badge\";\nimport type { TableVariant } from \"./Table\";\nimport type { PanelTone } from \"./Panel\";\n\nexport interface AccessMatrixPermission {\n group: string;\n resource: string;\n action: string;\n enabled: boolean;\n}\n\nexport interface AccessMatrixProps {\n permissions: AccessMatrixPermission[];\n /** Number of groups visible before the \"Show more\" button appears. Defaults to 5. */\n limit?: number;\n variant?: TableVariant;\n tone?: PanelTone;\n striped?: boolean;\n /** Forwards to Table: remove inner row borders/dividers. */\n noBorders?: boolean;\n /** Forwards to Table: make the table fill parent height and scroll internally. */\n fullHeight?: boolean;\n className?: string;\n hoverable?: boolean;\n /**\n * Background Tailwind class(es) applied to the sticky Resource column cells so they remain\n * opaque over scrolled action columns. Defaults to `'bg-white dark:bg-neutral-900'`.\n * Pass `'bg-transparent'` when the table sits inside a container whose background should\n * show through (e.g. a tinted panel or card).\n */\n stickyBackground?: string;\n}\n\ninterface MatrixRow {\n _key: string;\n _group: string;\n _resource: string;\n _isGroupHeader?: boolean;\n _groupCount?: number;\n [actionKey: string]: boolean | string | number | undefined;\n}\n\nfunction ChevronSvg({ expanded }: { expanded: boolean }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n width=\"14\"\n height=\"14\"\n className={`flex-shrink-0 text-current transition-transform duration-200${expanded ? \" rotate-90\" : \"\"}`}\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst EnabledCell: React.FC = () => (\n <span className=\"flex items-center justify-center\" aria-label=\"Enabled\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\" className=\"h-5 w-5 text-emerald-500\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" fill=\"currentColor\" fillOpacity=\"0.12\" />\n <path\n d=\"M6.5 10.5l2.5 2.5 4.5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n);\n\nconst DisabledCell: React.FC = () => (\n <span className=\"flex items-center justify-center\" aria-label=\"Disabled\">\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n className=\"h-5 w-5 text-slate-300 dark:text-slate-600\"\n >\n <path\n d=\"M6 10h8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n);\n\nconst AccessMatrix: React.FC<AccessMatrixProps> = ({\n permissions,\n limit = 5,\n variant = \"default\",\n tone = \"neutral\",\n striped = false,\n noBorders = false,\n fullHeight = false,\n className,\n stickyBackground,\n hoverable = false,\n}) => {\n const [expanded, setExpanded] = useState(false);\n const [collapsedGroups, setCollapsedGroups] = useState<Set<string>>(\n new Set(),\n );\n\n // Unique actions in insertion order → become the action columns\n const actions = useMemo(() => {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const p of permissions) {\n if (!seen.has(p.action)) {\n seen.add(p.action);\n result.push(p.action);\n }\n }\n return result;\n }, [permissions]);\n\n // Unique groups in insertion order → used for slicing (limit)\n const allGroups = useMemo(() => {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const p of permissions) {\n if (!seen.has(p.group)) {\n seen.add(p.group);\n result.push(p.group);\n }\n }\n return result;\n }, [permissions]);\n\n const visibleGroups = expanded ? allGroups : allGroups.slice(0, limit);\n const hiddenCount = allGroups.length - limit;\n\n // Build rows: group header pseudo-rows + data rows, with collapsed groups omitted\n const rows = useMemo((): MatrixRow[] => {\n const lookup = new Map<string, boolean>();\n for (const p of permissions) {\n lookup.set(`${p.group}::${p.resource}::${p.action}`, p.enabled);\n }\n\n const groupResources = new Map<string, string[]>();\n for (const p of permissions) {\n if (!groupResources.has(p.group)) groupResources.set(p.group, []);\n const res = groupResources.get(p.group)!;\n if (!res.includes(p.resource)) res.push(p.resource);\n }\n\n const result: MatrixRow[] = [];\n for (const group of visibleGroups) {\n const resources = groupResources.get(group) ?? [];\n\n // Group header pseudo-row\n result.push({\n _key: `__group__${group}`,\n _group: group,\n _resource: group,\n _isGroupHeader: true,\n _groupCount: resources.length,\n });\n\n // Data rows — omitted when the group is collapsed\n if (!collapsedGroups.has(group)) {\n for (const resource of resources) {\n const row: MatrixRow = {\n _key: `${group}::${resource}`,\n _group: group,\n _resource: resource,\n };\n for (const action of actions) {\n row[action] =\n lookup.get(`${group}::${resource}::${action}`) ?? false;\n }\n result.push(row);\n }\n }\n }\n return result;\n }, [permissions, visibleGroups, actions, collapsedGroups]);\n\n // Pre-compute per-group alternating stripe index (resets per group, skips headers)\n const stripeMap = useMemo(() => {\n const map = new Map<string, boolean>();\n let idx = 0;\n for (const row of rows) {\n if (row._isGroupHeader) {\n idx = 0;\n } else {\n map.set(row._key, idx % 2 === 1);\n idx++;\n }\n }\n return map;\n }, [rows]);\n\n const toggleGroup = (group: string) => {\n setCollapsedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(group)) next.delete(group);\n else next.add(group);\n return next;\n });\n };\n\n const columns = useMemo((): TableColumn<MatrixRow>[] => {\n // Resource column — sticky left, no expand-spacer sibling so it lands at left-0\n const resourceCol: TableColumn<MatrixRow> = {\n id: \"_resource\",\n header: \"Resource\",\n minWidth: 140,\n sticky: \"left\",\n sortable: false,\n resizable: false,\n hideable: false,\n stickyBackgroundFn: (row) =>\n row._isGroupHeader ? \"bg-neutral-50 dark:bg-neutral-800/40\" : undefined,\n render: (row) => {\n if (row._isGroupHeader) {\n return (\n <span className=\"inline-flex items-center gap-2\">\n <ChevronSvg expanded={!collapsedGroups.has(row._group)} />\n <span className=\"font-semibold text-neutral-700 dark:text-neutral-200\">\n {row._resource}\n </span>\n <Badge count={row._groupCount as number} tone={tone} />\n </span>\n );\n }\n return (\n <span className=\"pl-2 text-sm text-neutral-700 dark:text-neutral-200\">\n {row._resource}\n </span>\n );\n },\n };\n\n // One column per unique action\n const actionCols: TableColumn<MatrixRow>[] = actions.map((action) => ({\n id: action,\n header: action,\n align: \"center\" as const,\n sortable: false,\n resizable: false,\n hideable: false,\n render: (row: MatrixRow) => {\n if (row._isGroupHeader) return null;\n return row[action] === true ? <EnabledCell /> : <DisabledCell />;\n },\n }));\n\n return [resourceCol, ...actionCols];\n // collapsedGroups is needed so the chevron direction re-renders on toggle\n }, [actions, stickyBackground, tone, collapsedGroups]);\n\n return (\n <div\n className={classNames(fullHeight && \"h-full flex flex-col\", className)}\n >\n <Table<MatrixRow>\n columns={columns}\n data={rows}\n variant={variant}\n tone={tone}\n rowKey={(row) => row._key}\n striped={striped}\n noBorders={noBorders}\n hoverable={hoverable}\n fullHeight={fullHeight}\n className={fullHeight ? \"flex-1 min-h-0\" : undefined}\n stickyHeader\n onRowClick={(row) => {\n if (row._isGroupHeader) toggleGroup(row._group);\n }}\n rowClassName={(row) => {\n if (row._isGroupHeader) {\n return \"cursor-pointer select-none border-b border-neutral-100 bg-neutral-50 hover:bg-neutral-100 dark:border-neutral-800 dark:bg-neutral-800/40 dark:hover:bg-neutral-700/50\";\n }\n return striped && stripeMap.get(row._key)\n ? \"bg-neutral-100 dark:bg-neutral-800/40\"\n : \"\";\n }}\n />\n {hiddenCount > 0 && (\n <div className=\"mt-3 flex justify-center\">\n <Button\n variant=\"ghost\"\n color=\"blue\"\n size=\"sm\"\n trailingIcon={expanded ? \"ArrowUp\" : \"ArrowDown\"}\n onClick={() => setExpanded((prev) => !prev)}\n >\n {expanded\n ? \"Show less\"\n : `Show ${hiddenCount} more ${hiddenCount === 1 ? \"group\" : \"groups\"}`}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nexport default AccessMatrix;\n","import React, { useEffect, useState } from \"react\";\nimport { Button, CollapsibleHelpText, Input } from \".\";\n\nexport interface KeyValuePair {\n key: string;\n value: string;\n}\n\nexport interface KeyValueArrayFieldProps {\n label: string;\n hint?: string;\n value: KeyValuePair[];\n onChange: (value: KeyValuePair[]) => void;\n error?: string;\n help?: string;\n isVisible?: boolean;\n addLabel?: string;\n}\n\nconst KeyValueArrayField: React.FC<KeyValueArrayFieldProps> = ({\n label,\n hint,\n value,\n onChange,\n error,\n help,\n isVisible = true,\n addLabel,\n}) => {\n const [pairs, setPairs] = useState(value || []);\n\n useEffect(() => {\n setPairs(value || []);\n }, [value]);\n\n const handleAddPair = () => {\n const nextPairs = [...pairs, { key: \"\", value: \"\" }];\n setPairs(nextPairs);\n onChange(nextPairs);\n };\n\n const handleRemovePair = (index: number) => {\n const nextPairs = pairs.filter((_, i) => i !== index);\n setPairs(nextPairs);\n onChange(nextPairs);\n };\n\n const handlePairChange = (\n index: number,\n field: \"key\" | \"value\",\n fieldValue: string,\n ) => {\n const nextPairs = pairs.map((pair, i) =>\n i === index ? { ...pair, [field]: fieldValue } : pair,\n );\n setPairs(nextPairs);\n onChange(nextPairs);\n };\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <div className=\"space-y-3 rounded-2xl border border-slate-200/70 bg-white/90 p-4 shadow-sm dark:border-slate-800/70 dark:bg-slate-900/50\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-sm font-semibold text-slate-800 dark:text-slate-100\">\n {label}\n </span>\n {hint && (\n <span className=\"text-xs text-slate-500 dark:text-slate-400\">\n {hint}\n </span>\n )}\n </div>\n {help && (\n <CollapsibleHelpText\n text={help}\n tone=\"indigo\"\n maxLength={200}\n showIcon\n />\n )}\n <div className=\"space-y-3\">\n {pairs.map((pair, index) => (\n <div key={`${pair.key}-${index}`} className=\"flex flex-wrap gap-3\">\n <Input\n className=\"flex-1 min-w-[140px]\"\n size=\"sm\"\n placeholder=\"Key\"\n value={pair.key}\n onChange={(event) =>\n handlePairChange(index, \"key\", event.target.value)\n }\n />\n <Input\n className=\"flex-1 min-w-[140px]\"\n size=\"sm\"\n placeholder=\"Value\"\n value={pair.value}\n onChange={(event) =>\n handlePairChange(index, \"value\", event.target.value)\n }\n />\n <Button\n variant=\"soft\"\n color=\"rose\"\n size=\"sm\"\n onClick={() => handleRemovePair(index)}\n className=\"flex-shrink-0\"\n >\n Remove\n </Button>\n </div>\n ))}\n </div>\n <Button variant=\"outline\" color=\"blue\" size=\"sm\" onClick={handleAddPair}>\n {addLabel ?? `Add ${label}`}\n </Button>\n {error && <span className=\"text-xs text-rose-500\">{error}</span>}\n </div>\n );\n};\n\nexport default KeyValueArrayField;\n","import React from \"react\";\nimport { EmptyState, type EmptyStateProps } from \".\";\nimport { type IconName } from \"../icons/registry\";\n\nexport interface ApiErrorStateProps\n extends Omit<\n EmptyStateProps,\n \"title\" | \"tone\" | \"icon\" | \"onAction\" | \"buttonText\"\n > {\n onRetry?: () => void;\n title?: React.ReactNode;\n isError?: boolean;\n buttonText?: string;\n}\n\nconst ApiErrorState: React.FC<ApiErrorStateProps> = ({\n onRetry,\n title = \"Connection Error\",\n buttonText = \"Try Again\",\n subtitle = \"We couldn't connect to the server. Please check your internet connection and try again.\",\n isError = true,\n actionLeadingIcon = \"Restart\" as IconName,\n ...rest\n}) => {\n if (!isError) return null;\n\n return (\n <EmptyState\n title={title}\n subtitle={subtitle}\n icon={\"CloudOff\" as IconName}\n tone=\"rose\"\n onAction={onRetry}\n actionLabel={onRetry ? buttonText : undefined}\n actionLeadingIcon={actionLeadingIcon}\n {...rest}\n />\n );\n};\n\nexport default ApiErrorState;\n","import React, { useMemo } from \"react\";\nimport type { CapsuleBlueprintParameter } from \"../../../common/types/CapsuleBlueprint\";\nimport { CapsuleBlueprintValueType } from \"../../../common/types/CapsuleBlueprint\";\nimport { CollapsibleHelpText, Input, Checkbox, Select } from \".\";\nimport classNames from \"classnames\";\n\ntype DynamicValue = string | boolean;\n\nexport interface DynamicFormFieldProps {\n parameter: CapsuleBlueprintParameter;\n value: DynamicValue;\n onChange: (\n serviceName: string,\n key: string,\n value: DynamicValue,\n triggerDependencyEvaluation?: boolean,\n ) => void;\n error?: string;\n className?: string;\n isVisible?: boolean;\n}\n\nconst normalizeOptions = (\n options: CapsuleBlueprintParameter[\"options\"],\n): Array<{ id: string; label: string; value: string }> => {\n if (!options) {\n return [];\n }\n if (Array.isArray(options)) {\n return options.map((option, index) => {\n if (typeof option === \"string\") {\n return {\n id: `opt-${index}-${option}`,\n label: option,\n value: option,\n };\n }\n return {\n id: `opt-${index}-${option.key ?? option.value}`,\n label: String(option.value ?? option.key ?? \"\"),\n value: String(option.key ?? option.value ?? \"\"),\n };\n });\n }\n return Object.entries(options).map(([key, label], index) => ({\n id: `opt-${index}-${key}`,\n label: String(label),\n value: key,\n }));\n};\n\nconst DynamicFormField: React.FC<DynamicFormFieldProps> = ({\n parameter,\n value,\n onChange,\n error,\n className,\n isVisible = true,\n}) => {\n const { name, key, hint, is_required, options, is_secret, help } = parameter;\n const normalizedOptions = useMemo(() => normalizeOptions(options), [options]);\n\n const handleChange = (fieldValue: DynamicValue, trigger?: boolean) => {\n onChange(\n parameter.service_name || \"global\",\n key,\n fieldValue,\n trigger ?? true,\n );\n };\n\n const handleBlur = () => {\n const hasDependencies =\n parameter.depends_on && parameter.depends_on.length > 0;\n if (\n hasDependencies &&\n parameter.value_type === CapsuleBlueprintValueType.String\n ) {\n handleChange(value, true);\n }\n };\n\n const renderTextField = (type: \"text\" | \"password\" | \"number\") => (\n <div className={classNames(\"w-full space-y-1\", className)}>\n <label className=\"block text-sm font-medium text-neutral-700 dark:text-neutral-200\">\n {name}\n {is_required && <span className=\"ml-1 text-rose-500\">*</span>}\n </label>\n <Input\n className=\"w-full\"\n type={type}\n value={String(value ?? \"\")}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => handleChange(event.target.value)}\n onBlur={handleBlur}\n required={is_required}\n validationStatus={error ? \"error\" : \"none\"}\n />\n {(error || hint) && (\n <p\n className={`text-xs ${error ? \"text-rose-500\" : \"text-neutral-500\"}`}\n >\n {error || hint}\n </p>\n )}\n </div>\n );\n\n const renderField = () => {\n switch (parameter.value_type) {\n case CapsuleBlueprintValueType.String:\n return renderTextField(is_secret ? \"password\" : \"text\");\n case CapsuleBlueprintValueType.Int:\n return renderTextField(\"number\");\n case CapsuleBlueprintValueType.Boolean:\n return (\n <Checkbox\n checked={Boolean(value)}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => handleChange(event.target.checked)}\n label={name}\n description={hint}\n />\n );\n case CapsuleBlueprintValueType.Select:\n return (\n <div className=\"w-full space-y-1\">\n <label className=\"block text-sm font-medium text-neutral-700 dark:text-neutral-200\">\n {name}\n {is_required && <span className=\"ml-1 text-rose-500\">*</span>}\n </label>\n <Select\n value={String(value ?? \"\")}\n onChange={(event: React.ChangeEvent<HTMLSelectElement>) => handleChange(event.target.value ?? \"\")}\n required={is_required}\n validationStatus={error ? \"error\" : \"none\"}\n >\n {normalizedOptions.map((option) => (\n <option key={option.id} value={option.value}>\n {option.label}\n </option>\n ))}\n </Select>\n {(error || hint) && (\n <p\n className={`text-xs ${error ? \"text-rose-500\" : \"text-neutral-500\"}`}\n >\n {error || hint}\n </p>\n )}\n </div>\n );\n default:\n }\n };\n\n if (!isVisible) {\n return null;\n }\n\n if (!parameter.value_type) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col gap-2 rounded-2xl border border-slate-200/70 bg-white/90 p-4 shadow-sm dark:border-slate-800/70 dark:bg-slate-900/50\">\n {renderField()}\n {help && (\n <CollapsibleHelpText\n title=\"What is this?\"\n text={help}\n tone=\"emerald\"\n maxLength={180}\n showIcon\n />\n )}\n </div>\n );\n};\n\nexport default DynamicFormField;\n","export enum CapsuleBlueprintValueType {\n String = \"string\",\n Int = \"int\",\n Boolean = \"boolean\",\n Select = \"select\",\n List = \"list\",\n Map = \"map\",\n}\n\nexport interface CapsuleBlueprintParameter {\n name: string;\n key: string;\n description?: string;\n type?: string;\n value_type?: CapsuleBlueprintValueType;\n default?: any;\n required?: boolean;\n is_required?: boolean;\n is_secret?: boolean;\n options?: any;\n hint?: string;\n help?: string;\n service_name?: string;\n depends_on?: string[];\n [key: string]: any;\n}\n","import React from \"react\";\nimport Modal from \"./Modal\";\nimport { Button } from \".\";\nimport { type IconName } from \"../icons/registry\";\n\nexport type NotificationType = \"success\" | \"error\" | \"warning\" | \"info\";\n\nexport interface NotificationModalProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n message: React.ReactNode;\n type?: NotificationType;\n actionLabel?: string;\n onAction?: () => void;\n secondaryActionLabel?: string;\n onSecondaryAction?: () => void;\n}\n\nconst typeConfig: Record<\n NotificationType,\n { icon: IconName; color: string; titleColor: string }\n> = {\n success: {\n icon: \"CheckCircle\",\n color: \"emerald\",\n titleColor: \"text-emerald-900\",\n },\n error: {\n icon: \"Warning\" as IconName,\n color: \"rose\",\n titleColor: \"text-rose-900\",\n },\n warning: {\n icon: \"Warning\" as IconName,\n color: \"amber\",\n titleColor: \"text-amber-900\",\n },\n info: { icon: \"Info\", color: \"blue\", titleColor: \"text-blue-900\" },\n};\n\nexport const NotificationModal: React.FC<NotificationModalProps> = ({\n isOpen,\n onClose,\n title,\n message,\n type = \"info\",\n actionLabel = \"Close\",\n onAction,\n secondaryActionLabel,\n onSecondaryAction,\n}) => {\n const config = typeConfig[type];\n\n const handleAction = () => {\n if (onAction) {\n onAction();\n } else {\n onClose();\n }\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n size=\"sm\"\n icon={config.icon}\n actions={\n <Modal.Actions>\n {secondaryActionLabel && (\n <Button\n variant=\"soft\"\n color=\"slate\"\n onClick={onSecondaryAction || onClose}\n >\n {secondaryActionLabel}\n </Button>\n )}\n <Button onClick={handleAction} color={config.color as any}>\n {actionLabel}\n </Button>\n </Modal.Actions>\n }\n >\n <div className={`text-sm text-gray-600`}>{message}</div>\n </Modal>\n );\n};\n\nexport default NotificationModal;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport IconButton from \"./IconButton\";\nimport { IconSize } from \"../types\";\nimport { TrueColor } from \"../theme/Theme\";\n\nexport interface SidePanelProps {\n /** Whether the panel is open */\n isOpen: boolean;\n /** Called when the user clicks the close button */\n onClose?: () => void;\n /** Panel title */\n title?: React.ReactNode;\n /** Secondary line rendered below the title */\n subtitle?: React.ReactNode;\n /** Width of the panel in px (default: 420) */\n width?: number;\n /** Optional icon rendered to the left of the title */\n icon?: React.ReactNode;\n /** Extra nodes rendered in the header next to the close button */\n headerActions?: React.ReactNode;\n /** Sticky footer rendered at the bottom of the panel */\n footer?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n closeIconSize?: IconSize;\n /** Allow the user to drag the left edge to resize the panel. @default false */\n resizable?: boolean;\n /** Minimum width in px when resizable. @default 280 */\n minWidth?: number;\n /** Maximum width in px when resizable. @default 900 */\n maxWidth?: number;\n /** color for the resizer */\n color?: TrueColor;\n}\n\n/**\n * SidePanel — slides in from the right as a fixed overlay.\n *\n * Because it uses `position: fixed` it never affects the page layout,\n * so no horizontal scrollbar artifacts occur during the animation.\n *\n * ```tsx\n * <SidePanel isOpen={open} onClose={() => setOpen(false)} title=\"Details\">\n * …detail content…\n * </SidePanel>\n * ```\n */\nexport const SidePanel: React.FC<SidePanelProps> = ({\n isOpen,\n onClose,\n title,\n subtitle,\n icon,\n width = 420,\n headerActions,\n footer,\n children,\n className,\n closeIconSize = \"sm\",\n resizable = false,\n minWidth = 280,\n maxWidth = 900,\n color = \"neutral\",\n}) => {\n // Mount immediately on open so the opening animation can play.\n // Unmount only after the closing animation finishes (onTransitionEnd).\n const [mounted, setMounted] = useState(isOpen);\n const prevOpenRef = useRef(isOpen);\n\n useEffect(() => {\n if (isOpen && !prevOpenRef.current) {\n setMounted(true);\n }\n prevOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleTransitionEnd = () => {\n if (!isOpen) setMounted(false);\n };\n\n // ── Resizing ──────────────────────────────────────────────────────────────\n const [currentWidth, setCurrentWidth] = useState(width);\n const isDraggingRef = useRef(false);\n const startXRef = useRef(0);\n const startWidthRef = useRef(0);\n\n // Keep currentWidth in sync if the width prop changes while not dragging\n useEffect(() => {\n if (!isDraggingRef.current) setCurrentWidth(width);\n }, [width]);\n\n const onMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!resizable) return;\n e.preventDefault();\n isDraggingRef.current = true;\n startXRef.current = e.clientX;\n startWidthRef.current = currentWidth;\n\n const onMouseMove = (ev: MouseEvent) => {\n const delta = startXRef.current - ev.clientX;\n const next = Math.min(\n maxWidth,\n Math.max(minWidth, startWidthRef.current + delta),\n );\n setCurrentWidth(next);\n };\n document.body.style.userSelect = \"none\";\n document.body.style.cursor = \"col-resize\";\n const onMouseUp = () => {\n isDraggingRef.current = false;\n document.body.style.userSelect = \"\";\n document.body.style.cursor = \"\";\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n };\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n },\n [resizable, currentWidth, minWidth, maxWidth],\n );\n\n const resolvedWidth = resizable ? currentWidth : width;\n\n if (!mounted) return null;\n\n return (\n <div\n className={classNames(\n \"absolute top-0 right-0 h-full z-40\",\n \"overflow-hidden\",\n // Only animate width when not actively resizing\n !isDraggingRef.current && \"transition-[width] duration-300 ease-in-out\",\n \"border-l border-neutral-200 dark:border-neutral-700\",\n \"shadow-xl dark:shadow-neutral-900/50\",\n )}\n style={{ width: isOpen ? resolvedWidth : 0 }}\n onTransitionEnd={handleTransitionEnd}\n >\n {/* Drag handle — left edge, only rendered when resizable */}\n {resizable && (\n <div\n onMouseDown={onMouseDown}\n className=\"absolute left-0 top-0 h-full z-40 w-1 cursor-col-resize group\"\n >\n {/* Visible highlight on hover/drag */}\n <div\n className={`h-full w-full bg-transparent transition-colors group-hover:bg-${color}-300/60 dark:group-hover:bg-${color}-600/60 active:bg-${color}-400/60 dark:active:bg-${color}-500/40`}\n />\n </div>\n )}\n\n {/* Inner container — fixed at target width so content never squishes during animation */}\n <div\n className={classNames(\n \"flex h-full flex-col bg-white dark:bg-neutral-900\",\n className,\n )}\n style={{ width: resolvedWidth }}\n >\n {/* ── Header ─────────────────────────────────────────────── */}\n <div className=\"flex-none flex items-center justify-between gap-3 border-b border-neutral-200 dark:border-neutral-700 px-4 py-3\">\n {icon && <div className=\"shrink-0 mt-0.5\">{icon}</div>}\n <div className=\"min-w-0 flex-1\">\n {title && (\n <h3 className=\"text-sm font-semibold text-neutral-900 dark:text-neutral-100 truncate\">\n {title}\n </h3>\n )}\n {subtitle && (\n <p className=\"mt-0.5 text-xs text-neutral-500 dark:text-neutral-400 truncate\">\n {subtitle}\n </p>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1 pt-0.5\">\n {headerActions}\n {onClose && (\n <IconButton\n icon=\"Close\"\n size={closeIconSize}\n variant=\"ghost\"\n color=\"slate\"\n onClick={onClose}\n aria-label=\"Close panel\"\n />\n )}\n </div>\n </div>\n\n {/* ── Body ───────────────────────────────────────────────── */}\n <div className=\"flex-1 min-h-0 overflow-y-auto\">{children}</div>\n\n {/* ── Footer ─────────────────────────────────────────────── */}\n {footer && (\n <div className=\"flex-none border-t border-neutral-200 dark:border-neutral-700 px-4 py-3\">\n {footer}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default SidePanel;\n","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport classNames from \"classnames\";\nimport Button from \"../Button\";\nimport DropdownMenu from \"../DropdownMenu\";\nimport type { DropdownMenuOption } from \"../DropdownMenu\";\nimport { getPanelToneStyles, TrueColor } from \"../../theme/Theme\";\nimport { getTreeColorTokens } from \"../TreeView/toneColors\";\nimport { paddingStyles } from \"../Panel\";\nimport type {\n TimelinePanelProps,\n TimelinePanelItem,\n TimelinePanelAction,\n TimelinePanelHeaderAction,\n} from \"./types\";\nimport type { PanelVariant, PanelCorner, PanelPadding } from \"../Panel\";\nimport Loader from \"../Loader\";\n\n// ── useIsDark — detects Tailwind dark class on <html> ────────────────────────\n\nfunction useIsDark(): boolean {\n const detect = (): boolean => {\n if (typeof document === \"undefined\") return false;\n const probe = document.createElement(\"div\");\n probe.className = \"hidden dark:block\";\n document.body.appendChild(probe);\n const dark = window.getComputedStyle(probe).display === \"block\";\n probe.remove();\n return dark;\n };\n const [isDark, setIsDark] = useState<boolean>(() => detect());\n useEffect(() => {\n const update = () => setIsDark(detect());\n const obs = new MutationObserver(update);\n obs.observe(document.documentElement, { attributeFilter: [\"class\"] });\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n media.addEventListener(\"change\", update);\n update();\n return () => {\n media.removeEventListener(\"change\", update);\n obs.disconnect();\n };\n }, []);\n return isDark;\n}\n\n// ── SVG layout constants ───────────────────────────────────────────────────────\n\n/** Width of the left gutter that the SVG occupies. */\nconst SVG_W = 28;\n/** X position of the vertical trunk line. */\nconst TRUNK_X = 12;\n/**\n * One indent column = icon width (32px / w-8) + inner gap (12px / gap-3).\n * Each depth level shifts by this amount so a child's icon aligns with its\n * parent's text start.\n */\nconst ITEM_DEPTH_PX = 44;\n/** Icon width in px (w-8). Used to compute parent icon center for L alignment. */\nconst ICON_W = 32;\n/** Corner radius for the L-connector bend. */\nconst L_CORNER_R = 6;\n/** Gap between the horizontal line end and the item icon. */\nconst L_GAP = 6;\n/** Ring radius for root / current-state connectors. */\nconst ROOT_RING_R = 6.5;\n/** Stroke width. */\nconst BW = 1.5;\n\n// ── TimelineSvg ───────────────────────────────────────────────────────────────\n// Absolute overlay drawn on top of the item rows.\n// Renders:\n// • vertical trunk connecting only depth-0 items (root → current)\n// • root: filled anchor circle on trunk\n// • current: hollow anchor circle on trunk\n// • depth > 0 items: L-shaped connector at depth * DEPTH_INDENT\n// vertical from prev item's midY → this item's midY\n// horizontal → item icon\n// consecutive same-depth items share the vertical (their segments join)\n\ninterface TimelineSvgProps {\n items: TimelinePanelItem[];\n /** Measured offsetHeight of each item row div */\n itemHeights: number[];\n isDark: boolean;\n tone: TrueColor;\n showTrunkDots: boolean;\n}\n\nconst TimelineSvg: React.FC<TimelineSvgProps> = ({\n items,\n itemHeights,\n isDark,\n tone,\n showTrunkDots,\n}) => {\n const ci = isDark ? 1 : 0;\n const tok = getTreeColorTokens(tone);\n // Derived color shorthands — [light, dark] resolved to current mode\n const trunkColor = tok.trunk[ci];\n const branchColor = tok.trunk[ci];\n const rootFill = tok.connDot[ci]; // tone accent fill for root circle\n const rootBorder = tok.trunk[ci]; // matches line color\n const rootDot = tok.connFill[ci]; // inner dot contrasts against filled circle\n const curFill = tok.connFill[ci]; // very light tinted bg for current circle\n const curBorder = tok.trunk[ci]; // matches line color\n\n // Compute midY for each item. No stub — cumY starts at 0.\n const midYs: number[] = [];\n let cumY = 0;\n for (let i = 0; i < items.length; i++) {\n const h = itemHeights[i] ?? 44;\n midYs.push(cumY + h / 2);\n cumY += h;\n }\n\n const totalSvgH = cumY;\n\n if (totalSvgH === 0 || midYs.length === 0) return null;\n\n // Trunk anchors: depth-0 items PLUS any isRoot / isCurrent items at any depth.\n // isCurrent always renders its circle on the trunk (TRUNK_X), so the trunk\n // must extend down to it even when depth > 0.\n const d0Indices = items\n .map((it, idx) =>\n (it.depth ?? 0) === 0 || it.isRoot || it.isCurrent ? idx : -1,\n )\n .filter((idx) => idx >= 0);\n // Trunk segments: one segment between each consecutive pair of depth-0 items,\n // leaving a gap of (ROOT_RING_R + L_GAP) around each anchor circle.\n // Segments up to/including current are solid; segments after current are dashed.\n const ANCHOR_GAP = ROOT_RING_R + L_GAP;\n const currentIdx = items.findIndex((it) => it.isCurrent);\n const trunkSegments = d0Indices.slice(0, -1).map((fromIdx, i) => {\n const toIdx = d0Indices[i + 1];\n const dashed = currentIdx >= 0 && fromIdx >= currentIdx;\n return {\n y1: midYs[fromIdx] + ANCHOR_GAP,\n y2: midYs[toIdx] - ANCHOR_GAP,\n dashed,\n };\n });\n\n return (\n <svg\n width={SVG_W}\n height={totalSvgH}\n viewBox={`0 0 ${SVG_W} ${totalSvgH}`}\n overflow=\"visible\"\n aria-hidden=\"true\"\n style={{ position: \"absolute\", left: 0, top: 0, pointerEvents: \"none\" }}\n >\n {/* ── Vertical trunk — depth-0 items only, gaps around anchors ────────── */}\n {trunkSegments.map(({ y1, y2, dashed }, i) => (\n <line\n key={i}\n x1={TRUNK_X}\n y1={y1}\n x2={TRUNK_X}\n y2={y2}\n stroke={trunkColor}\n strokeWidth={2}\n strokeLinecap=\"round\"\n {...(dashed ? { strokeDasharray: \"3 4\" } : {})}\n />\n ))}\n\n {/* ── Trunk dots — one per item on the solid segment ──────────────────── */}\n {showTrunkDots &&\n midYs.map((my, i) => {\n const item = items[i];\n if (!item || item.isRoot || item.isCurrent) return null;\n const onSolid = currentIdx < 0 || i < currentIdx;\n if (!onSolid) return null;\n return (\n <circle\n key={`td-${item.id}`}\n cx={TRUNK_X}\n cy={my}\n r={3}\n fill={trunkColor}\n />\n );\n })}\n\n {/* ── Per-item connectors ──────────────────────────────────────────────── */}\n {midYs.map((my, i) => {\n const item = items[i];\n if (!item) return null;\n\n if (item.isRoot) {\n // When the root is also the current snapshot, draw the dashed\n // extension downward — otherwise the isCurrent branch is never reached.\n const dashY2 =\n i < items.length - 1 ? totalSvgH : my + ROOT_RING_R + 20;\n return (\n <g key={item.id}>\n <circle cx={TRUNK_X} cy={my} r={ROOT_RING_R} fill={rootFill} />\n <circle\n cx={TRUNK_X}\n cy={my}\n r={ROOT_RING_R}\n stroke={rootBorder}\n strokeWidth={BW}\n fill=\"none\"\n />\n <circle cx={TRUNK_X} cy={my} r=\"2.5\" fill={rootDot} />\n {item.isCurrent && (\n <line\n x1={TRUNK_X}\n y1={my + ROOT_RING_R + 4}\n x2={TRUNK_X}\n y2={dashY2}\n stroke={trunkColor}\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeDasharray=\"2 3\"\n />\n )}\n </g>\n );\n }\n\n if (item.isCurrent) {\n const hasItemsAfter = i < items.length - 1;\n const dashY2 = hasItemsAfter ? totalSvgH : my + ROOT_RING_R + 20;\n const curDepth = Math.min(item.depth ?? 0, 3);\n let lPath: string | null = null;\n if (curDepth > 0) {\n const lx = SVG_W + (curDepth - 1) * ITEM_DEPTH_PX + ICON_W / 2;\n let prevRefIdxC = i - 1;\n while (\n prevRefIdxC > 0 &&\n (items[prevRefIdxC]?.depth ?? 0) > curDepth\n )\n prevRefIdxC--;\n const prevDepth = items[prevRefIdxC]\n ? (items[prevRefIdxC].depth ?? 0)\n : 0;\n const topGap =\n prevDepth < curDepth ? ICON_W / 2 + L_GAP : -L_CORNER_R;\n const topY = (midYs[prevRefIdxC] ?? my) + topGap;\n const rightX = SVG_W + curDepth * ITEM_DEPTH_PX - L_GAP;\n const cornerY = Math.max(topY, my - L_CORNER_R);\n lPath = [\n `M ${lx} ${topY}`,\n `L ${lx} ${cornerY}`,\n `A ${L_CORNER_R} ${L_CORNER_R} 0 0 0 ${lx + L_CORNER_R} ${my}`,\n `L ${rightX} ${my}`,\n ].join(\" \");\n }\n return (\n <g key={item.id}>\n <circle cx={TRUNK_X} cy={my} r={ROOT_RING_R} fill={curFill} />\n <circle\n cx={TRUNK_X}\n cy={my}\n r={ROOT_RING_R}\n stroke={curBorder}\n strokeWidth={BW}\n fill=\"none\"\n />\n {lPath && (\n <path\n d={lPath}\n stroke={branchColor}\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n )}\n <line\n x1={TRUNK_X}\n y1={my + ROOT_RING_R + 4}\n x2={TRUNK_X}\n y2={dashY2}\n stroke={trunkColor}\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeDasharray=\"2 3\"\n />\n </g>\n );\n }\n\n // L-shaped connector aligned to the parent icon center.\n // Vertical: from previous item's midY → this item's midY at parent icon center X.\n // Rounded corner → horizontal to this item's icon left edge.\n const depth = Math.min(item.depth ?? 0, 3);\n if (depth === 0) return null;\n\n // X = center of the parent icon (depth - 1 level)\n const lx = SVG_W + (depth - 1) * ITEM_DEPTH_PX + ICON_W / 2;\n // Walk back to find the last item whose depth <= current depth so the\n // vertical segment spans across any deeper children in between.\n let prevRefIdx = i - 1;\n while (prevRefIdx > 0 && (items[prevRefIdx]?.depth ?? 0) > depth)\n prevRefIdx--;\n const prevDepth = items[prevRefIdx]\n ? (items[prevRefIdx].depth ?? 0)\n : 0;\n const topGap = prevDepth < depth ? ICON_W / 2 + L_GAP : -L_CORNER_R;\n const topY = (midYs[prevRefIdx] ?? my) + topGap;\n const rightX = SVG_W + depth * ITEM_DEPTH_PX - L_GAP;\n const cornerY = Math.max(topY, my - L_CORNER_R);\n\n const lPath = [\n `M ${lx} ${topY}`,\n `L ${lx} ${cornerY}`,\n `A ${L_CORNER_R} ${L_CORNER_R} 0 0 0 ${lx + L_CORNER_R} ${my}`,\n `L ${rightX} ${my}`,\n ].join(\" \");\n\n return (\n <g key={item.id}>\n <path\n d={lPath}\n stroke={branchColor}\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </g>\n );\n })}\n </svg>\n );\n};\n\n// ── Variant shell styles (mirrors Panel) ──────────────────────────────────────\n\nconst variantShellStyles: Record<PanelVariant, string> = {\n elevated:\n \"bg-white shadow-xl ring-1 ring-black/5 dark:bg-neutral-900 dark:ring-white/10 text-neutral-900 dark:text-neutral-100\",\n outlined:\n \"bg-white/90 text-neutral-900 ring-1 dark:bg-neutral-900/80 dark:text-neutral-100 dark:ring-white/10\",\n subtle:\n \"text-neutral-900 shadow-sm ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n tonal:\n \"text-neutral-900 shadow-sm ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n default:\n \"bg-white/80 backdrop-blur-xl text-neutral-900 shadow-2xl ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n glass:\n \"backdrop-blur-xl text-neutral-900 ring-1 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n \"liquid-glass\":\n \"backdrop-blur-2xl ring-1 ring-transparent dark:ring-white/5\",\n simple:\n \"text-neutral-900 ring-transparent dark:text-neutral-100 dark:ring-white/5\",\n};\n\nconst cornerStyles: Record<PanelCorner, string> = {\n rounded: \"rounded-sm\",\n \"rounded-sm\": \"rounded-lg\",\n \"rounded-md\": \"rounded-2xl\",\n \"rounded-lg\": \"rounded-3xl\",\n \"rounded-full\": \"rounded-full\",\n pill: \"rounded-3xl\",\n none: \"rounded-none\",\n};\n\n// ── Overflow (⋮) button ───────────────────────────────────────────────────────\n\ninterface OverflowButtonProps {\n options: DropdownMenuOption[];\n onSelect: (item: DropdownMenuOption) => void;\n}\n\nconst OverflowButton: React.FC<OverflowButtonProps> = ({\n options,\n onSelect,\n}) => {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLButtonElement>(null);\n if (options.length === 0) return null;\n return (\n <>\n <button\n ref={ref}\n type=\"button\"\n aria-label=\"More actions\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-neutral-400 transition-colors hover:bg-neutral-100 hover:text-neutral-600 dark:text-neutral-500 dark:hover:bg-neutral-800 dark:hover:text-neutral-300\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <circle cx=\"2.5\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"13.5\" cy=\"8\" r=\"1.5\" />\n </svg>\n </button>\n <DropdownMenu\n anchorRef={ref as React.RefObject<HTMLElement | null>}\n open={open}\n onClose={() => setOpen(false)}\n items={options}\n onSelect={(opt) => {\n onSelect(opt);\n setOpen(false);\n }}\n align=\"end\"\n width={180}\n />\n </>\n );\n};\n\n// ── TimelineItemRow ───────────────────────────────────────────────────────────\n\ninterface TimelineItemRowProps {\n item: TimelinePanelItem;\n color: TrueColor;\n itemRef: (el: HTMLDivElement | null) => void;\n actionSize: TimelinePanelAction[\"size\"];\n}\n\nconst TimelineItemRow: React.FC<TimelineItemRowProps> = ({\n item,\n color,\n itemRef,\n actionSize,\n}) => {\n const depth = Math.min(item.depth ?? 0, 3);\n const depthPx = depth * ITEM_DEPTH_PX;\n\n const overflowOptions: DropdownMenuOption[] = (\n item.overflowActions ?? []\n ).map((a) => ({\n label: a.label,\n value: a.value,\n icon: a.icon,\n danger: a.danger,\n disabled: a.disabled,\n }));\n\n const handleOverflowSelect = (option: DropdownMenuOption) => {\n item.overflowActions?.find((a) => a.value === option.value)?.onClick?.();\n };\n\n const iconColorClasses = classNames(\n item.iconBackground ? `rounded-full bg-${color}-100` : \"\",\n );\n\n return (\n // paddingLeft = SVG_W + depthPx so the whole row is column-shifted (total inside parent)\n <div\n ref={itemRef}\n className=\"flex items-center gap-2 py-2.5\"\n style={{ paddingLeft: SVG_W + depthPx }}\n >\n {/* Icon + text */}\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n {/* Icon slot */}\n {item.icon && (\n <div\n className={classNames(\n \"flex h-8 w-8 shrink-0 items-center justify-center text-blue-500 dark:bg-neutral-800 dark:text-neutral-400\",\n iconColorClasses,\n )}\n >\n {item.icon}\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm font-medium text-neutral-900 dark:text-neutral-100\">\n {item.title}\n </div>\n {item.subtitle && (\n <div className=\"mt-0.5 truncate text-xs text-neutral-500 dark:text-neutral-400\">\n {item.subtitle}\n </div>\n )}\n </div>\n </div>\n\n {/* Actions — always at far right, unaffected by depth */}\n {((item.actions !== undefined &&\n item.actions !== null &&\n (!Array.isArray(item.actions) ||\n (item.actions as TimelinePanelAction[]).length > 0)) ||\n overflowOptions.length > 0) && (\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {Array.isArray(item.actions)\n ? (item.actions as TimelinePanelAction[]).map((action, idx) => (\n <Button\n key={idx}\n variant={action.variant ?? \"outline\"}\n color={action.color ?? color}\n size={action.size ?? actionSize ?? \"sm\"}\n onClick={action.onClick}\n disabled={action.disabled}\n loading={action.loading}\n >\n {action.label}\n </Button>\n ))\n : (item.actions as React.ReactNode)}\n <OverflowButton\n options={overflowOptions}\n onSelect={handleOverflowSelect}\n />\n </div>\n )}\n </div>\n );\n};\n\nfunction isHeaderActionObject(v: unknown): v is TimelinePanelHeaderAction {\n return (\n typeof v === \"object\" &&\n v !== null &&\n !React.isValidElement(v) &&\n \"label\" in v\n );\n}\n\n// ── TimelinePanel ─────────────────────────────────────────────────────────────\n\nconst TimelinePanel: React.FC<TimelinePanelProps> = ({\n title,\n headerAction,\n items,\n variant = \"simple\",\n tone = \"neutral\",\n padding = \"sm\",\n corner = \"none\",\n loading = false,\n emptyState,\n className,\n loaderProps,\n showTrunkDots = false,\n}) => {\n const isDark = useIsDark();\n const palette = getPanelToneStyles(tone);\n\n // ── Height measurement for SVG ────────────────────────────────────────────\n const itemEls = useRef<(HTMLDivElement | null)[]>([]);\n const [itemHeights, setItemHeights] = useState<number[]>([]);\n\n const measureHeights = useCallback(() => {\n const heights = itemEls.current.map((el) => el?.offsetHeight ?? 0);\n setItemHeights((prev) =>\n prev.length === heights.length && prev.every((h, i) => h === heights[i])\n ? prev\n : heights,\n );\n }, []);\n\n useLayoutEffect(() => {\n // Trim stale refs when items shrink (e.g. after a delete) so heights array\n // stays in sync with items.length and the SVG guard doesn't suppress render.\n itemEls.current = itemEls.current.slice(0, items.length);\n measureHeights();\n const ro = new ResizeObserver(measureHeights);\n itemEls.current.forEach((el) => el && ro.observe(el));\n return () => ro.disconnect();\n }, [measureHeights, items]);\n\n // ── Variant shell ─────────────────────────────────────────────────────────\n const variantClass = (() => {\n switch (variant) {\n case \"outlined\":\n return classNames(variantShellStyles.outlined, palette.border);\n case \"subtle\":\n return classNames(\n variantShellStyles.subtle,\n palette.border,\n palette.subtleBg,\n );\n case \"tonal\":\n return classNames(variantShellStyles.tonal, palette.tonalBg);\n case \"glass\":\n return classNames(\n variantShellStyles.glass,\n \"border\",\n palette.glassBorder,\n palette.glassBg,\n );\n case \"simple\":\n return classNames(variantShellStyles.simple);\n default:\n return variantShellStyles[variant] ?? variantShellStyles.elevated;\n }\n })();\n\n return (\n <section\n className={classNames(\n \"relative flex w-full flex-col overflow-hidden\",\n paddingStyles[padding as PanelPadding],\n variantClass,\n cornerStyles[corner],\n className,\n )}\n aria-busy={loading}\n >\n {/* ── Header ─────────────────────────────────────────────────────────── */}\n {(title || headerAction) && (\n <div className={classNames(\"flex items-center justify-between gap-4\")}>\n {title && (\n <h3\n className={classNames(\n \"text-lg font-semibold leading-2\",\n palette.heading,\n )}\n >\n {title}\n </h3>\n )}\n {headerAction &&\n (() => {\n if (isHeaderActionObject(headerAction)) {\n return (\n <Button\n variant={headerAction.variant ?? \"solid\"}\n color={headerAction.color ?? tone}\n size={headerAction.size ?? \"sm\"}\n onClick={headerAction.onClick}\n disabled={headerAction.disabled}\n loading={headerAction.loading}\n leadingIcon={headerAction.leadingIcon}\n weight=\"semibold\"\n >\n {headerAction.label}\n </Button>\n );\n }\n return (\n <div className=\"flex shrink-0 gap-2\">\n {headerAction as React.ReactNode}\n </div>\n );\n })()}\n </div>\n )}\n\n {/* ── Body ───────────────────────────────────────────────────────────── */}\n <div className=\"relative\">\n {loading && items.length === 0 ? (\n /* No items yet — centred spinner */\n <div className=\"flex items-center justify-center min-h-30 w-full h-full\">\n <Loader\n spinnerThickness={loaderProps?.spinnerThickness}\n color={tone}\n glass={loaderProps?.glass}\n glassBlurIntensity={loaderProps?.glassBlurIntensity}\n label={loaderProps?.label}\n size={loaderProps?.size}\n spinnerVariant={loaderProps?.spinnerVariant}\n title={loaderProps?.title}\n variant={loaderProps?.variant}\n />\n </div>\n ) : items.length === 0 && emptyState ? (\n <div className=\"py-4\">{emptyState}</div>\n ) : (\n <div className=\"relative\">\n {/* SVG overlay — drawn once heights are known */}\n {itemHeights.length === items.length && items.length > 0 && (\n <TimelineSvg\n items={items}\n itemHeights={itemHeights}\n isDark={isDark}\n tone={tone}\n showTrunkDots={showTrunkDots}\n />\n )}\n\n <div className={classNames(loading && \"pointer-events-none\")}>\n {items.map((item, i) => (\n <TimelineItemRow\n key={item.id}\n color={tone}\n item={item}\n itemRef={(el) => {\n itemEls.current[i] = el;\n }}\n actionSize=\"sm\"\n />\n ))}\n </div>\n\n {/* Glass overlay loader when refreshing over existing items */}\n {loading && (\n <Loader\n overlay\n glass\n color={tone}\n spinnerThickness={loaderProps?.spinnerThickness}\n glassBlurIntensity={loaderProps?.glassBlurIntensity ?? \"low\"}\n label={loaderProps?.label}\n size={loaderProps?.size}\n spinnerVariant={loaderProps?.spinnerVariant}\n title={loaderProps?.title}\n variant={loaderProps?.variant}\n className=\"absolute inset-0 rounded-[inherit]\"\n />\n )}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nTimelinePanel.displayName = \"TimelinePanel\";\n\nexport default TimelinePanel;\n","import type { TrueColor } from \"../../theme/Theme\";\n\n// ── Color token interface ────────────────────────────────────────────────────\n\nexport interface TreeColorTokens {\n // Tailwind class strings — static so JIT scanner can include them\n bg: string; // card background (header area)\n pulseBg: string; // pulsing overlay background (more intense than bg, used with animate-pulse)\n border: string; // card border\n headerText: string; // primary title/subtitle text\n labelText: string; // secondary icon / label / description text\n // SVG hex values [light, dark]\n trunk: readonly [string, string]; // trunk & branch line\n connFill: readonly [string, string]; // connector ring fill (≈ card bg)\n connBorder: readonly [string, string]; // connector ring stroke (≈ card border)\n connDot: readonly [string, string]; // connector inner dot (≈ label text)\n}\n\n// ── Disabled / neutral fallback ──────────────────────────────────────────────\n\nexport const NEUTRAL_TOKENS: TreeColorTokens = {\n bg: \"bg-neutral-50 dark:bg-neutral-800/50\",\n pulseBg: \"bg-neutral-100 dark:bg-neutral-700/60\",\n border: \"border-neutral-200 dark:border-neutral-700\",\n headerText: \"text-neutral-600 dark:text-neutral-400\",\n labelText: \"text-neutral-500 dark:text-neutral-400\",\n trunk: [\"#d4d4d4\", \"#525252\"],\n connFill: [\"#fafafa\", \"#171717\"],\n connBorder: [\"#e5e5e5\", \"#404040\"],\n connDot: [\"#737373\", \"#a3a3a3\"],\n};\n\n// ── Per-base-color token table ───────────────────────────────────────────────\n//\n// All class strings are FULL STATIC STRINGS so Tailwind's JIT scanner includes them.\n// Dark-mode bg uses shade-950/30 approximation.\n// SVG: trunk=300/700, fill=50/950, border=200/800, dot=600/400.\n\nconst BASE_TOKENS: Record<string, TreeColorTokens> = {\n red: {\n bg: \"bg-red-50 dark:bg-red-950/30\",\n pulseBg: \"bg-red-100 dark:bg-red-800/60\",\n border: \"border-red-200 dark:border-red-800\",\n headerText: \"text-red-800 dark:text-red-200\",\n labelText: \"text-red-600 dark:text-red-400\",\n trunk: [\"#fca5a5\", \"#b91c1c\"],\n connFill: [\"#fef2f2\", \"#450a0a\"],\n connBorder: [\"#fecaca\", \"#991b1b\"],\n connDot: [\"#dc2626\", \"#f87171\"],\n },\n orange: {\n bg: \"bg-orange-50 dark:bg-orange-950/30\",\n pulseBg: \"bg-orange-100 dark:bg-orange-800/60\",\n border: \"border-orange-200 dark:border-orange-800\",\n headerText: \"text-orange-800 dark:text-orange-200\",\n labelText: \"text-orange-600 dark:text-orange-400\",\n trunk: [\"#fdba74\", \"#c2410c\"],\n connFill: [\"#fff7ed\", \"#431407\"],\n connBorder: [\"#fed7aa\", \"#9a3412\"],\n connDot: [\"#ea580c\", \"#fb923c\"],\n },\n amber: {\n bg: \"bg-amber-50 dark:bg-amber-950/30\",\n pulseBg: \"bg-amber-100 dark:bg-amber-800/60\",\n border: \"border-amber-200 dark:border-amber-800\",\n headerText: \"text-amber-800 dark:text-amber-200\",\n labelText: \"text-amber-600 dark:text-amber-400\",\n trunk: [\"#fcd34d\", \"#b45309\"],\n connFill: [\"#fffbeb\", \"#451a03\"],\n connBorder: [\"#fde68a\", \"#92400e\"],\n connDot: [\"#d97706\", \"#fbbf24\"],\n },\n yellow: {\n bg: \"bg-yellow-50 dark:bg-yellow-950/30\",\n pulseBg: \"bg-yellow-100 dark:bg-yellow-800/60\",\n border: \"border-yellow-200 dark:border-yellow-800\",\n headerText: \"text-yellow-800 dark:text-yellow-200\",\n labelText: \"text-yellow-600 dark:text-yellow-400\",\n trunk: [\"#fde047\", \"#a16207\"],\n connFill: [\"#fefce8\", \"#422006\"],\n connBorder: [\"#fef08a\", \"#854d0e\"],\n connDot: [\"#ca8a04\", \"#facc15\"],\n },\n lime: {\n bg: \"bg-lime-50 dark:bg-lime-950/30\",\n pulseBg: \"bg-lime-100 dark:bg-lime-800/60\",\n border: \"border-lime-200 dark:border-lime-800\",\n headerText: \"text-lime-800 dark:text-lime-200\",\n labelText: \"text-lime-600 dark:text-lime-400\",\n trunk: [\"#bef264\", \"#4d7c0f\"],\n connFill: [\"#f7fee7\", \"#1a2e05\"],\n connBorder: [\"#d9f99d\", \"#3f6212\"],\n connDot: [\"#65a30d\", \"#a3e635\"],\n },\n green: {\n bg: \"bg-green-50 dark:bg-green-950/30\",\n pulseBg: \"bg-green-100 dark:bg-green-800/60\",\n border: \"border-green-200 dark:border-green-800\",\n headerText: \"text-green-800 dark:text-green-200\",\n labelText: \"text-green-600 dark:text-green-400\",\n trunk: [\"#86efac\", \"#15803d\"],\n connFill: [\"#f0fdf4\", \"#052e16\"],\n connBorder: [\"#bbf7d0\", \"#166534\"],\n connDot: [\"#16a34a\", \"#4ade80\"],\n },\n emerald: {\n bg: \"bg-emerald-50 dark:bg-emerald-950/30\",\n pulseBg: \"bg-emerald-100 dark:bg-emerald-800/60\",\n border: \"border-emerald-200 dark:border-emerald-800\",\n headerText: \"text-emerald-800 dark:text-emerald-200\",\n labelText: \"text-emerald-600 dark:text-emerald-400\",\n trunk: [\"#6ee7b7\", \"#047857\"],\n connFill: [\"#ecfdf5\", \"#022c22\"],\n connBorder: [\"#a7f3d0\", \"#065f46\"],\n connDot: [\"#059669\", \"#34d399\"],\n },\n teal: {\n bg: \"bg-teal-50 dark:bg-teal-950/30\",\n pulseBg: \"bg-teal-100 dark:bg-teal-800/60\",\n border: \"border-teal-200 dark:border-teal-800\",\n headerText: \"text-teal-800 dark:text-teal-200\",\n labelText: \"text-teal-600 dark:text-teal-400\",\n trunk: [\"#5eead4\", \"#0f766e\"],\n connFill: [\"#f0fdfa\", \"#042f2e\"],\n connBorder: [\"#99f6e4\", \"#115e59\"],\n connDot: [\"#0d9488\", \"#2dd4bf\"],\n },\n cyan: {\n bg: \"bg-cyan-50 dark:bg-cyan-950/30\",\n pulseBg: \"bg-cyan-100 dark:bg-cyan-800/60\",\n border: \"border-cyan-200 dark:border-cyan-800\",\n headerText: \"text-cyan-800 dark:text-cyan-200\",\n labelText: \"text-cyan-600 dark:text-cyan-400\",\n trunk: [\"#67e8f9\", \"#0e7490\"],\n connFill: [\"#ecfeff\", \"#083344\"],\n connBorder: [\"#a5f3fc\", \"#155e75\"],\n connDot: [\"#0891b2\", \"#22d3ee\"],\n },\n sky: {\n bg: \"bg-sky-50 dark:bg-sky-950/30\",\n pulseBg: \"bg-sky-100 dark:bg-sky-800/60\",\n border: \"border-sky-200 dark:border-sky-800\",\n headerText: \"text-sky-800 dark:text-sky-200\",\n labelText: \"text-sky-600 dark:text-sky-400\",\n trunk: [\"#7dd3fc\", \"#0369a1\"],\n connFill: [\"#f0f9ff\", \"#082f49\"],\n connBorder: [\"#bae6fd\", \"#075985\"],\n connDot: [\"#0284c7\", \"#38bdf8\"],\n },\n blue: {\n bg: \"bg-blue-50 dark:bg-blue-950/30\",\n pulseBg: \"bg-blue-100 dark:bg-blue-800/60\",\n border: \"border-blue-200 dark:border-blue-800\",\n headerText: \"text-blue-800 dark:text-blue-200\",\n labelText: \"text-blue-600 dark:text-blue-400\",\n trunk: [\"#93c5fd\", \"#1d4ed8\"],\n connFill: [\"#eff6ff\", \"#172554\"],\n connBorder: [\"#bfdbfe\", \"#1e40af\"],\n connDot: [\"#2563eb\", \"#60a5fa\"],\n },\n indigo: {\n bg: \"bg-indigo-50 dark:bg-indigo-950/30\",\n pulseBg: \"bg-indigo-100 dark:bg-indigo-800/60\",\n border: \"border-indigo-200 dark:border-indigo-800\",\n headerText: \"text-indigo-800 dark:text-indigo-200\",\n labelText: \"text-indigo-600 dark:text-indigo-400\",\n trunk: [\"#a5b4fc\", \"#4338ca\"],\n connFill: [\"#eef2ff\", \"#1e1b4b\"],\n connBorder: [\"#c7d2fe\", \"#3730a3\"],\n connDot: [\"#4f46e5\", \"#818cf8\"],\n },\n violet: {\n bg: \"bg-violet-50 dark:bg-violet-950/30\",\n pulseBg: \"bg-violet-100 dark:bg-violet-800/60\",\n border: \"border-violet-200 dark:border-violet-800\",\n headerText: \"text-violet-800 dark:text-violet-200\",\n labelText: \"text-violet-600 dark:text-violet-400\",\n trunk: [\"#c4b5fd\", \"#6d28d9\"],\n connFill: [\"#f5f3ff\", \"#2e1065\"],\n connBorder: [\"#ddd6fe\", \"#4c1d95\"],\n connDot: [\"#7c3aed\", \"#a78bfa\"],\n },\n purple: {\n bg: \"bg-purple-50 dark:bg-purple-950/30\",\n pulseBg: \"bg-purple-100 dark:bg-purple-800/60\",\n border: \"border-purple-200 dark:border-purple-800\",\n headerText: \"text-purple-800 dark:text-purple-200\",\n labelText: \"text-purple-600 dark:text-purple-400\",\n trunk: [\"#d8b4fe\", \"#7e22ce\"],\n connFill: [\"#faf5ff\", \"#3b0764\"],\n connBorder: [\"#e9d5ff\", \"#6b21a8\"],\n connDot: [\"#9333ea\", \"#c084fc\"],\n },\n fuchsia: {\n bg: \"bg-fuchsia-50 dark:bg-fuchsia-950/30\",\n pulseBg: \"bg-fuchsia-100 dark:bg-fuchsia-800/60\",\n border: \"border-fuchsia-200 dark:border-fuchsia-800\",\n headerText: \"text-fuchsia-800 dark:text-fuchsia-200\",\n labelText: \"text-fuchsia-600 dark:text-fuchsia-400\",\n trunk: [\"#f0abfc\", \"#a21caf\"],\n connFill: [\"#fdf4ff\", \"#4a044e\"],\n connBorder: [\"#f5d0fe\", \"#86198f\"],\n connDot: [\"#c026d3\", \"#e879f9\"],\n },\n pink: {\n bg: \"bg-pink-50 dark:bg-pink-950/30\",\n pulseBg: \"bg-pink-100 dark:bg-pink-800/60\",\n border: \"border-pink-200 dark:border-pink-800\",\n headerText: \"text-pink-800 dark:text-pink-200\",\n labelText: \"text-pink-600 dark:text-pink-400\",\n trunk: [\"#f9a8d4\", \"#be185d\"],\n connFill: [\"#fdf2f8\", \"#500724\"],\n connBorder: [\"#fbcfe8\", \"#9d174d\"],\n connDot: [\"#db2777\", \"#f472b6\"],\n },\n rose: {\n bg: \"bg-rose-50 dark:bg-rose-950/30\",\n pulseBg: \"bg-rose-100 dark:bg-rose-800/60\",\n border: \"border-rose-200 dark:border-rose-800\",\n headerText: \"text-rose-800 dark:text-rose-200\",\n labelText: \"text-rose-600 dark:text-rose-400\",\n trunk: [\"#fca5a5\", \"#be123c\"],\n connFill: [\"#fff1f2\", \"#4c0519\"],\n connBorder: [\"#fecdd3\", \"#9f1239\"],\n connDot: [\"#e11d48\", \"#fb7185\"],\n },\n slate: {\n bg: \"bg-slate-50 dark:bg-slate-800/50\",\n pulseBg: \"bg-slate-100 dark:bg-slate-700/60\",\n border: \"border-slate-200 dark:border-slate-700\",\n headerText: \"text-slate-700 dark:text-slate-300\",\n labelText: \"text-slate-500 dark:text-slate-400\",\n trunk: [\"#cbd5e1\", \"#334155\"],\n connFill: [\"#f8fafc\", \"#020617\"],\n connBorder: [\"#e2e8f0\", \"#1e293b\"],\n connDot: [\"#475569\", \"#94a3b8\"],\n },\n gray: {\n bg: \"bg-gray-50 dark:bg-gray-800/50\",\n pulseBg: \"bg-gray-100 dark:bg-gray-700/60\",\n border: \"border-gray-200 dark:border-gray-700\",\n headerText: \"text-gray-700 dark:text-gray-300\",\n labelText: \"text-gray-500 dark:text-gray-400\",\n trunk: [\"#d1d5db\", \"#374151\"],\n connFill: [\"#f9fafb\", \"#030712\"],\n connBorder: [\"#e5e7eb\", \"#1f2937\"],\n connDot: [\"#4b5563\", \"#9ca3af\"],\n },\n zinc: {\n bg: \"bg-zinc-50 dark:bg-zinc-800/50\",\n pulseBg: \"bg-zinc-100 dark:bg-zinc-700/60\",\n border: \"border-zinc-200 dark:border-zinc-700\",\n headerText: \"text-zinc-700 dark:text-zinc-300\",\n labelText: \"text-zinc-500 dark:text-zinc-400\",\n trunk: [\"#d4d4d8\", \"#3f3f46\"],\n connFill: [\"#fafafa\", \"#09090b\"],\n connBorder: [\"#e4e4e7\", \"#27272a\"],\n connDot: [\"#52525b\", \"#a1a1aa\"],\n },\n neutral: NEUTRAL_TOKENS,\n stone: {\n bg: \"bg-stone-50 dark:bg-stone-800/50\",\n pulseBg: \"bg-stone-100 dark:bg-stone-700/60\",\n border: \"border-stone-200 dark:border-stone-700\",\n headerText: \"text-stone-700 dark:text-stone-300\",\n labelText: \"text-stone-500 dark:text-stone-400\",\n trunk: [\"#d6d3d1\", \"#44403c\"],\n connFill: [\"#fafaf9\", \"#0c0a09\"],\n connBorder: [\"#e7e5e4\", \"#292524\"],\n connDot: [\"#57534e\", \"#a8a29e\"],\n },\n};\n\n// ── Public accessor ──────────────────────────────────────────────────────────\n\nfunction resolveBaseColor(color: TrueColor): string {\n switch (color) {\n case \"blue\":\n return \"blue\";\n case \"sky\":\n return \"sky\";\n case \"emerald\":\n return \"emerald\";\n case \"amber\":\n return \"amber\";\n case \"rose\":\n return \"rose\";\n case \"neutral\":\n case \"slate\":\n return \"neutral\";\n case \"red\":\n return \"red\";\n default:\n return color;\n }\n}\n\nexport function getTreeColorTokens(\n tone: TrueColor | undefined,\n): TreeColorTokens {\n if (!tone) return NEUTRAL_TOKENS;\n const base = resolveBaseColor(tone);\n return BASE_TOKENS[base] ?? NEUTRAL_TOKENS;\n}\n","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport classNames from \"classnames\";\nimport ConnectionFlowConnector from \"./ConnectionFlowConnector\";\nimport ConnectionFlowColumn, {\n type ColumnGeometry,\n} from \"./ConnectionFlowColumn\";\nimport ConnectionFlowParallelGroup from \"./ConnectionFlowParallelGroup\";\nimport type {\n ConnectionFlowItem,\n ConnectionFlowProps,\n ConnectionState,\n} from \"./types\";\nimport type { TreeTone } from \"../TreeView/types\";\nimport { getTreeColorTokens } from \"../TreeView/toneColors\";\n\n// ── useIsDark (local copy — mirrors ConnectionFlowConnector's) ─────────────────\n\nfunction useIsDark(): boolean {\n const detect = (): boolean => {\n if (typeof document === \"undefined\") return false;\n const probe = document.createElement(\"div\");\n probe.className = \"hidden dark:block\";\n document.body.appendChild(probe);\n const dark = window.getComputedStyle(probe).display === \"block\";\n probe.remove();\n return dark;\n };\n const [isDark, setIsDark] = useState<boolean>(() => detect());\n useEffect(() => {\n const update = () => setIsDark(detect());\n const obs = new MutationObserver(update);\n obs.observe(document.documentElement, { attributeFilter: [\"class\"] });\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n media.addEventListener(\"change\", update);\n update();\n return () => {\n media.removeEventListener(\"change\", update);\n obs.disconnect();\n };\n }, []);\n return isDark;\n}\n\n// ── Bypass path data ──────────────────────────────────────────────────────────\n// The bypass travels from the top-right connection point of the source card\n// to the top-left connection point of the destination card using an orthogonal\n// stepped path with rounded corners, staying just above the card tops.\n\ninterface BypassArcData {\n /** top-right connection point of source card — inset from corner */\n sx: number;\n /** top edge of source card */\n sy: number;\n /** top-left connection point of destination card — inset from corner */\n dx: number;\n /** top edge of destination card */\n dy: number;\n sourceTone: TreeTone;\n destTone: TreeTone;\n /** True when at least one item in the destination group is currently active (running). */\n destActive: boolean;\n}\n\n/** How many px above the card tops the bypass path travels. */\nconst BYPASS_LIFT = 10;\n/** Radius of the rounded corners on the bypass path. */\nconst BYPASS_CORNER_R = 6;\n/** Inset from card corners for the top-edge connection points (matches card border-radius). */\nconst CARD_CORNER_INSET = 19;\n/** How many px the ring base overlaps into the card so the card border is fully covered. */\nconst RING_OVERLAP = 1;\n\nexport type {\n ConnectionState,\n ConnectionFlowConnectorConfig,\n ConnectionFlowItem,\n ConnectionFlowProps,\n} from \"./types\";\n\n// ── Column group — single item or parallel cluster ────────────────────────────\n\ntype ColumnGroup =\n | { kind: \"single\"; item: ConnectionFlowItem }\n | { kind: \"parallel\"; items: ConnectionFlowItem[] };\n\nfunction buildGroups(items: ConnectionFlowItem[]): ColumnGroup[] {\n const groups: ColumnGroup[] = [];\n let i = 0;\n while (i < items.length) {\n if (items[i].parallel) {\n const batch: ConnectionFlowItem[] = [];\n while (i < items.length && items[i].parallel) {\n batch.push(items[i]);\n i++;\n }\n groups.push({ kind: \"parallel\", items: batch });\n } else {\n groups.push({ kind: \"single\", item: items[i] });\n i++;\n }\n }\n return groups;\n}\n\n/** Returns a stable key for a group */\nfunction groupKey(g: ColumnGroup): string {\n return g.kind === \"single\" ? g.item.id : g.items.map((it) => it.id).join(\"|\");\n}\n\n/** True when a group does NOT emit a right-side connector */\nfunction isTerminal(g: ColumnGroup): boolean {\n return g.kind === \"single\"\n ? (g.item.terminal ?? false)\n : (g.items[g.items.length - 1]?.terminal ?? false);\n}\n\n/** True when every item in the group is flagged as skipped */\nfunction isGroupSkipped(g: ColumnGroup): boolean {\n return g.kind === \"single\"\n ? (g.item.skipped ?? false)\n : g.items.every((it) => it.skipped ?? false);\n}\n\n/** Returns the effective tone of the first item in a group (neutral when unset). */\nfunction effectiveTone(g: ColumnGroup): TreeTone {\n return (g.kind === \"single\" ? g.item.tone : g.items[0]?.tone) ?? \"neutral\";\n}\n\n// ── ConnectionFlow ────────────────────────────────────────────────────────────\n\nconst ConnectionFlow: React.FC<ConnectionFlowProps> = ({\n items,\n flowState = \"flowing\",\n flowIcon,\n connectorWidth = 56,\n animated = true,\n dotSpacing = 60,\n connectorBorderSize = \"xs\",\n connectorHalf = true,\n showLine = true,\n childIndent = \"xs\",\n childRowGap = 8,\n allowScroll = false,\n itemWidth,\n autoScale = false,\n minScale = 0.55,\n className,\n rightAction,\n hoverable = false,\n autoConnectorState = false,\n animateCompleted = false,\n fullWidthConnectors = false,\n}) => {\n const isDark = useIsDark();\n\n // Track geometry per column group\n const [colGeo, setColGeo] = useState<Record<number, ColumnGeometry>>({});\n\n const handleGeo = useCallback((idx: number, geo: ColumnGeometry) => {\n setColGeo((prev) => {\n const cur = prev[idx];\n if (\n cur &&\n cur.totalHeight === geo.totalHeight &&\n cur.isParallelGroup === geo.isParallelGroup &&\n cur.anchors.length === geo.anchors.length &&\n cur.anchors.every((a, i) => a === geo.anchors[i])\n )\n return prev;\n return { ...prev, [idx]: geo };\n });\n }, []);\n\n // ── Auto-scale ────────────────────────────────────────────────────────────\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [scale, setScale] = useState(1);\n const [scaledHeight, setScaledHeight] = useState<number | undefined>(\n undefined,\n );\n\n useLayoutEffect(() => {\n if (!autoScale) {\n setScale(1);\n setScaledHeight(undefined);\n return;\n }\n\n const container = containerRef.current;\n const content = contentRef.current;\n if (!container || !content) return;\n\n const measure = () => {\n // Temporarily reset transform so we read the natural (scale=1) dimensions\n content.style.transform = \"\";\n const containerW = container.offsetWidth;\n const naturalW = content.scrollWidth;\n const naturalH = content.scrollHeight;\n if (!containerW || !naturalW) return;\n\n const raw = containerW / naturalW;\n const s = Math.min(1, Math.max(minScale, raw));\n setScale(s);\n setScaledHeight(s < 1 ? Math.ceil(naturalH * s) : undefined);\n };\n\n measure();\n\n const ro = new ResizeObserver(measure);\n ro.observe(container);\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [autoScale, minScale, items]);\n\n // ── Bypass arc state ──────────────────────────────────────────────────────\n // One ref per group (index = group index); tracks only the card div, not the connector.\n const groupDivRefs = useRef<(HTMLDivElement | null)[]>([]);\n const [bypassArcs, setBypassArcs] = useState<BypassArcData[]>([]);\n\n // ── Pre-process items into groups ─────────────────────────────────────────\n const groups = buildGroups(items);\n\n // ── Auto-skipped set ──────────────────────────────────────────────────────\n // When autoConnectorState is on, derive which groups are \"skipped\" from their\n // tone alone (neutral tone with at least one non-neutral successor).\n // The result is stable across renders where items haven't changed.\n // Explicit skipped:false always takes precedence — an item that was executed\n // but happens to have a neutral tone must not be auto-treated as bypassed.\n const autoSkippedSet = useMemo(() => {\n const set = new Set<number>();\n if (!autoConnectorState) return set;\n const grps = buildGroups(items);\n grps.forEach((g, gi) => {\n if (effectiveTone(g) !== \"neutral\") return;\n // If any item in the group explicitly declares skipped:false it ran —\n // honour that and skip the auto-detection for this group.\n const explicitlyNotSkipped =\n g.kind === \"single\"\n ? g.item.skipped === false\n : g.items.some((it) => it.skipped === false);\n if (explicitlyNotSkipped) return;\n const hasNonNeutralAfter = grps\n .slice(gi + 1)\n .some((sg) => effectiveTone(sg) !== \"neutral\");\n if (hasNonNeutralAfter) set.add(gi);\n });\n return set;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, autoConnectorState]);\n\n // Compute bypass arc positions from DOM measurements.\n // Uses `items` (not derived `groups`) in deps so the callback is only recreated\n // when the actual items or scale change, not on every render.\n const computeBypassArcs = useCallback(() => {\n if (!contentRef.current) return;\n const contentEl = contentRef.current;\n const contentRect = contentEl.getBoundingClientRect();\n if (!contentRect.width) return;\n\n const grps = buildGroups(items);\n const arcs: BypassArcData[] = [];\n let skipStart = -1;\n\n for (let gi = 0; gi <= grps.length; gi++) {\n const skipped =\n gi < grps.length &&\n (isGroupSkipped(grps[gi]) || autoSkippedSet.has(gi));\n\n if (skipped && skipStart === -1) {\n skipStart = gi;\n } else if (!skipped && skipStart !== -1) {\n // Arc from group[skipStart-1] to group[gi]\n const prevEl = groupDivRefs.current[skipStart - 1];\n const nextEl = groupDivRefs.current[gi];\n\n if (prevEl && nextEl) {\n const prevRect = prevEl.getBoundingClientRect();\n const nextRect = nextEl.getBoundingClientRect();\n // Convert screen coords → content's natural (pre-scale) coordinate space.\n // Connection points are on the TOP edge of each card, inset from the corners\n // so they sit inside the rounded-corner border (not at the very tip).\n const sx =\n (prevRect.right - CARD_CORNER_INSET - contentRect.left) / scale;\n const sy = (prevRect.top - contentRect.top) / scale;\n const dx =\n (nextRect.left + CARD_CORNER_INSET - contentRect.left) / scale;\n const dy = (nextRect.top - contentRect.top) / scale;\n\n const prevGroup = grps[skipStart - 1];\n const srcTone: TreeTone = prevGroup\n ? ((prevGroup.kind === \"single\"\n ? prevGroup.item.tone\n : prevGroup.items[0]?.tone) ?? \"neutral\")\n : \"neutral\";\n const dstGroup = grps[gi];\n const dstTone: TreeTone = dstGroup\n ? ((dstGroup.kind === \"single\"\n ? dstGroup.item.tone\n : dstGroup.items[0]?.tone) ?? \"neutral\")\n : \"neutral\";\n const destActive = dstGroup\n ? dstGroup.kind === \"single\"\n ? (dstGroup.item.active ?? false)\n : dstGroup.items.some((it) => it.active ?? false)\n : false;\n\n arcs.push({\n sx,\n sy,\n dx,\n dy,\n sourceTone: srcTone,\n destTone: dstTone,\n destActive,\n });\n }\n skipStart = -1;\n }\n }\n\n setBypassArcs(arcs);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [items, scale, autoSkippedSet]);\n\n useLayoutEffect(() => {\n computeBypassArcs();\n const ro = new ResizeObserver(computeBypassArcs);\n if (contentRef.current) ro.observe(contentRef.current);\n return () => ro.disconnect();\n }, [computeBypassArcs]);\n\n if (groups.length === 0) return null;\n\n // Which groups emit a right-side connector\n const emitsConnector = groups.map(\n (g, gi) => !isTerminal(g) && gi < groups.length - 1,\n );\n\n // When autoScale is active and scale < 1 the content must overflow the clipped\n // outer div — we allow horizontal scroll only if scale is pinned at minScale.\n const needsScroll = autoScale && scale <= minScale;\n\n const outerClass = classNames(\n autoScale ? \"relative w-full\" : \"flex items-start\",\n !autoScale && fullWidthConnectors && \"w-full\",\n !autoScale && allowScroll && \"overflow-auto max-w-full\",\n needsScroll && \"overflow-x-auto\",\n !autoScale && !allowScroll && !needsScroll && \"overflow-hidden\",\n className,\n );\n\n const contentStyle: React.CSSProperties | undefined =\n autoScale && scale < 1\n ? { transform: `scale(${scale})`, transformOrigin: \"left top\" }\n : undefined;\n\n const content = (\n <div\n ref={contentRef}\n className={classNames(\n \"relative flex items-start\",\n fullWidthConnectors && \"w-full\",\n )}\n style={contentStyle}\n >\n {groups.map((group, gi) => {\n const prevGroup = groups[gi - 1];\n const isFirst = gi === 0;\n const renderConnector =\n !isFirst && (prevGroup ? emitsConnector[gi - 1] : false);\n\n // Resolve connector config — from the group's \"first receiver\" item\n const receiverItem =\n group.kind === \"single\" ? group.item : group.items[0];\n const connCfg = receiverItem.connector;\n\n // Connector state: explicit override → auto-derived (if autoConnectorState) → global flowState\n const state: ConnectionState =\n connCfg?.state ??\n (autoConnectorState && prevGroup\n ? effectiveTone(prevGroup) !== \"neutral\"\n ? \"stopped\"\n : \"disabled\"\n : flowState);\n const icon = connCfg?.icon ?? flowIcon;\n const cWidth = connCfg?.width ?? connectorWidth;\n const cAnimated = connCfg?.animated ?? animated;\n const cDotSpace = connCfg?.dotSpacing ?? dotSpacing;\n const cBorder = connCfg?.borderSize ?? connectorBorderSize;\n const cHalf = connCfg?.halfRing ?? connectorHalf;\n const cShowLine = connCfg?.showLine ?? showLine;\n\n // Suppress animateCompleted on connectors adjacent to skipped groups —\n // the bypass arc already carries the animated flow over those steps.\n const thisGroupSkipped =\n isGroupSkipped(group) || autoSkippedSet.has(gi);\n const prevGroupSkipped =\n gi > 0 &&\n (isGroupSkipped(groups[gi - 1]) || autoSkippedSet.has(gi - 1));\n const cAnimateCompleted =\n thisGroupSkipped || prevGroupSkipped\n ? false\n : (connCfg?.animateCompleted ?? animateCompleted);\n\n // Source tone (from the outgoing / previous group)\n const prevFirstItem = prevGroup\n ? prevGroup.kind === \"single\"\n ? prevGroup.item\n : prevGroup.items[0]\n : undefined;\n const srcTone: TreeTone =\n connCfg?.sourceTone ?? prevFirstItem?.tone ?? \"neutral\";\n\n // Target tone (from this group's first item)\n const dstTone: TreeTone =\n connCfg?.targetTone ?? receiverItem.tone ?? \"neutral\";\n\n const prevGeo = colGeo[gi - 1];\n const curGeo = colGeo[gi];\n\n // Left anchors — all prev anchors (handles both single and parallel source)\n const leftAnchors = prevGeo?.anchors;\n\n // Right anchors — for fan-out into a parallel group\n const rightAnchors =\n curGeo?.isParallelGroup && curGeo.anchors.length > 1\n ? curGeo.anchors\n : undefined;\n\n // Right anchor Y for single target (not fan-out)\n const rightAnchorY = rightAnchors ? undefined : curGeo?.anchors[0];\n\n // Connector height: span the taller of the two adjacent groups\n const connectorHeight =\n prevGeo && curGeo\n ? Math.max(prevGeo.totalHeight, curGeo.totalHeight)\n : (prevGeo?.totalHeight ?? curGeo?.totalHeight);\n\n // Extra source tones for multi-source rings (fan-in from prev parallel group, or children)\n const extraSourceTones: TreeTone[] =\n prevGroup?.kind === \"parallel\"\n ? prevGroup.items.slice(1).map((it) => it.tone ?? \"neutral\")\n : prevGroup?.kind === \"single\"\n ? (prevGroup.item.children?.map(\n (c) => c.connector?.sourceTone ?? c.tone ?? \"neutral\",\n ) ?? [])\n : [];\n\n // Right anchor tones for fan-out rings\n const rightAnchorTones: TreeTone[] = rightAnchors\n ? (\n group as { kind: \"parallel\"; items: ConnectionFlowItem[] }\n ).items.map((it) => it.tone ?? \"neutral\")\n : [];\n\n // Right anchor states for per-lane animation in fan-out\n const rightAnchorStates = rightAnchors\n ? (\n group as { kind: \"parallel\"; items: ConnectionFlowItem[] }\n ).items.map((it): ConnectionState => {\n if (it.connector?.state !== undefined) return it.connector.state;\n if (autoConnectorState) {\n if (it.active) return \"flowing\";\n const tone = it.tone ?? \"neutral\";\n return tone !== \"neutral\" ? \"stopped\" : \"disabled\";\n }\n return state;\n })\n : [];\n\n return (\n <React.Fragment key={groupKey(group)}>\n {/* Connector leading INTO this group */}\n {renderConnector && (\n <ConnectionFlowConnector\n state={state}\n sourceTone={srcTone}\n targetTone={dstTone}\n middleIcon={icon}\n width={cWidth}\n halfRing={cHalf}\n showLine={cShowLine}\n animated={cAnimated}\n dotSpacing={cDotSpace}\n borderSize={cBorder}\n sourceFill={connCfg?.sourceFill}\n sourceBorder={connCfg?.sourceBorder}\n sourceDot={connCfg?.sourceDot}\n targetFill={connCfg?.targetFill}\n targetBorder={connCfg?.targetBorder}\n targetDot={connCfg?.targetDot}\n dotColor={connCfg?.dotColor}\n leftAnchors={leftAnchors}\n connectorHeight={connectorHeight}\n rightAnchorY={rightAnchorY}\n extraSourceTones={extraSourceTones}\n rightAnchors={rightAnchors}\n rightAnchorTones={rightAnchorTones}\n rightAnchorStates={rightAnchorStates}\n animateCompleted={cAnimateCompleted}\n fullWidth={fullWidthConnectors}\n />\n )}\n\n {/* Column or parallel group — wrapped in a ref div for bypass arc measurement */}\n <div\n ref={(el) => {\n groupDivRefs.current[gi] = el;\n }}\n className={\n itemWidth || fullWidthConnectors ? \"shrink-0\" : \"flex-1 min-w-0\"\n }\n style={\n itemWidth\n ? {\n width:\n typeof itemWidth === \"number\"\n ? `${itemWidth}px`\n : itemWidth,\n }\n : undefined\n }\n >\n {group.kind === \"single\" ? (\n <ConnectionFlowColumn\n item={group.item}\n childIndent={childIndent}\n childRowGap={childRowGap}\n animated={animated}\n showLine={showLine}\n connectorHalf={connectorHalf}\n connectorBorderSize={connectorBorderSize}\n dotSpacing={dotSpacing}\n flowActive={state === \"flowing\"}\n onGeometryChange={(geo) => handleGeo(gi, geo)}\n itemWidth={itemWidth}\n hoverable={hoverable}\n />\n ) : (\n <ConnectionFlowParallelGroup\n items={group.items}\n itemWidth={itemWidth}\n hoverable={hoverable}\n onGeometryChange={(geo) => handleGeo(gi, geo)}\n />\n )}\n </div>\n </React.Fragment>\n );\n })}\n\n {rightAction && (\n <div className=\"flex items-center shrink-0 ml-3 self-start\">\n {rightAction}\n </div>\n )}\n\n {/* ── Bypass arc overlay ──────────────────────────────────────────── */}\n {bypassArcs.length > 0 && (\n <svg\n className=\"absolute inset-0 pointer-events-none z-20\"\n style={{ width: \"100%\", height: \"100%\", overflow: \"visible\" }}\n >\n {bypassArcs.map((arc, i) => {\n const ci = isDark ? 1 : 0;\n const srcTokens = getTreeColorTokens(arc.sourceTone);\n const dstTokens = getTreeColorTokens(arc.destTone);\n const lineColor = srcTokens.connBorder[ci];\n const dotFill = srcTokens.connDot[ci];\n\n // Path starts/ends RING_OVERLAP px inside the card top edge so the\n // ring fill covers the card border (same technique as left/right rings).\n const sBase = arc.sy + RING_OVERLAP;\n const dBase = arc.dy + RING_OVERLAP;\n\n // Orthogonal stepped path with rounded corners:\n // (sx, sBase) → up → rounded bend → right → rounded bend → down to (dx, dBase)\n const aboveY = Math.min(arc.sy, arc.dy) - BYPASS_LIFT;\n const CR = BYPASS_CORNER_R;\n const d = [\n `M ${arc.sx} ${sBase}`,\n `V ${aboveY + CR}`,\n `Q ${arc.sx} ${aboveY} ${arc.sx + CR} ${aboveY}`,\n `H ${arc.dx - CR}`,\n `Q ${arc.dx} ${aboveY} ${arc.dx} ${aboveY + CR}`,\n `V ${dBase}`,\n ].join(\" \");\n\n // Approximate path length for dot timing\n const legV1 = Math.abs(sBase - aboveY - CR);\n const legH = Math.max(0, arc.dx - arc.sx - 2 * CR);\n const legV2 = Math.abs(dBase - aboveY - CR);\n const corners = Math.PI * 0.5 * CR * 2; // two quarter-circle corners\n const pathLen = legV1 + legH + legV2 + corners;\n\n const DOT_VELOCITY = 35;\n const DOT_GAP = dotSpacing / DOT_VELOCITY;\n const numDots = Math.max(1, Math.ceil(pathLen / dotSpacing));\n const virtualLen = numDots * dotSpacing;\n const dur = numDots * DOT_GAP;\n\n // Add overflow extension AFTER the destination so dots follow the correct\n // arc shape (including the destination corner and descent) before the\n // invisible loop-back segment begins. Extending the H segment rightward\n // (old approach) caused dots to travel past the destination horizontally\n // and miss the descent curve entirely.\n const overflow = Math.max(0, virtualLen - pathLen);\n const dMotion =\n overflow > 0\n ? [\n `M ${arc.sx} ${sBase}`,\n `V ${aboveY + CR}`,\n `Q ${arc.sx} ${aboveY} ${arc.sx + CR} ${aboveY}`,\n `H ${arc.dx - CR}`,\n `Q ${arc.dx} ${aboveY} ${arc.dx} ${aboveY + CR}`,\n `V ${dBase}`,\n `v ${overflow}`,\n ].join(\" \")\n : d;\n\n const fadeOutEnd = pathLen / virtualLen;\n const fadeOutStart = Math.max(0, fadeOutEnd - 10 / virtualLen);\n const fadeInEnd = Math.min(fadeOutStart, 4 / virtualLen);\n const opTimes = `0;${fadeInEnd.toFixed(4)};${fadeOutStart.toFixed(4)};${fadeOutEnd.toFixed(4)};1`;\n\n // Ring visual constants (match ConnectionFlowConnector)\n const ringR = 5.5;\n const bw = 1.5;\n\n // Source ring — half-circle bumping upward, base sits RING_OVERLAP px\n // inside the card so the fill covers the card's top border.\n const srcFill = srcTokens.connFill[ci];\n const srcBorder = srcTokens.connBorder[ci];\n const srcDot = srcTokens.connDot[ci];\n const srcArcD = `M ${arc.sx - ringR} ${sBase} A ${ringR} ${ringR} 0 0 1 ${arc.sx + ringR} ${sBase}`;\n\n // Destination ring — same treatment.\n const dstFill = dstTokens.connFill[ci];\n const dstBorder = dstTokens.connBorder[ci];\n const dstDot = dstTokens.connDot[ci];\n const dstArcD = `M ${arc.dx - ringR} ${dBase} A ${ringR} ${ringR} 0 0 1 ${arc.dx + ringR} ${dBase}`;\n\n return (\n <g key={i}>\n {/* Bypass path */}\n <path\n d={d}\n fill=\"none\"\n stroke={lineColor}\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n\n {/* Source ring endpoint */}\n <path d={srcArcD} fill={srcFill} />\n <path\n d={srcArcD}\n stroke={srcBorder}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n <circle cx={arc.sx} cy={sBase} r=\"2\" fill={srcDot} />\n\n {/* Destination ring endpoint */}\n <path d={dstArcD} fill={dstFill} />\n <path\n d={dstArcD}\n stroke={dstBorder}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n <circle cx={arc.dx} cy={dBase} r=\"2\" fill={dstDot} />\n\n {/* Animated dots — only when bypass is actively being traversed\n (source done, destination not yet reached), or when\n animateCompleted is on (completed arcs also animate). */}\n {(() => {\n // Animate when source is done AND destination is either\n // not yet reached (neutral) or currently running (destActive).\n const arcActive =\n arc.sourceTone !== \"neutral\" &&\n (arc.destTone === \"neutral\" || arc.destActive);\n const arcCompleted =\n arc.sourceTone !== \"neutral\" &&\n arc.destTone !== \"neutral\" &&\n !arc.destActive;\n return (\n animated &&\n (arcActive || (animateCompleted && arcCompleted))\n );\n })() &&\n Array.from({ length: numDots }, (_, di) => (\n <circle key={di} r=\"3\" fill={dotFill} opacity=\"0\">\n <animateMotion\n path={dMotion}\n dur={`${dur}s`}\n begin={`${(-di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;0.9;0.9;0;0\"\n keyTimes={opTimes}\n dur={`${dur}s`}\n begin={`${(-di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n </circle>\n ))}\n </g>\n );\n })}\n </svg>\n )}\n </div>\n );\n\n if (autoScale) {\n return (\n <div\n ref={containerRef}\n className={outerClass}\n style={\n scaledHeight !== undefined ? { height: scaledHeight } : undefined\n }\n >\n {content}\n </div>\n );\n }\n\n return <div className={outerClass}>{content}</div>;\n};\n\nexport default ConnectionFlow;\n","import React, { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { getTreeColorTokens, NEUTRAL_TOKENS } from \"../TreeView/toneColors\";\nimport type { TreeTone } from \"../TreeView/types\";\nimport type { ConnectionState, ConnectionFlowConnectorConfig } from \"./types\";\n\n// ── useIsDark ─────────────────────────────────────────────────────────────────\n\nfunction useIsDark(): boolean {\n const detectDark = (): boolean => {\n if (typeof document === \"undefined\") return false;\n const probe = document.createElement(\"div\");\n probe.className = \"hidden dark:block\";\n document.body.appendChild(probe);\n const darkActive = window.getComputedStyle(probe).display === \"block\";\n probe.remove();\n return darkActive;\n };\n\n const [isDark, setIsDark] = useState<boolean>(() => detectDark());\n\n useEffect(() => {\n const update = () => setIsDark(detectDark());\n const obs = new MutationObserver(update);\n obs.observe(document.documentElement, { attributeFilter: [\"class\"] });\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n media.addEventListener(\"change\", update);\n update();\n return () => {\n media.removeEventListener(\"change\", update);\n obs.disconnect();\n };\n }, []);\n return isDark;\n}\n\n// ── Border width map ──────────────────────────────────────────────────────────\n\nconst BORDER_WIDTH: Record<\"fit\" | \"xs\" | \"sm\" | \"md\" | \"lg\", number> = {\n fit: 1,\n xs: 1.5,\n sm: 2,\n md: 2.5,\n lg: 3,\n};\n\n// ── ConnectionFlowConnector ───────────────────────────────────────────────────\n\nexport interface ConnectionFlowConnectorProps {\n state?: ConnectionState;\n sourceTone?: TreeTone;\n targetTone?: TreeTone;\n middleIcon?: React.ReactNode;\n width?: number;\n halfRing?: boolean;\n showLine?: boolean;\n animated?: boolean;\n dotSpacing?: number;\n borderSize?: \"fit\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\n // Fine-grained color overrides\n sourceFill?: string;\n sourceBorder?: string;\n sourceDot?: string;\n targetFill?: string;\n targetBorder?: string;\n targetDot?: string;\n dotColor?: string;\n /**\n * Multi-source mode: Y offsets from the TOP of the connector space for each\n * source card's centre (parent first, then children).\n * When provided and length > 1, a vertical trunk is drawn on the left side\n * connecting all source rings, and each source gets its own dotted line to\n * the RIGHT entry ring.\n */\n leftAnchors?: number[];\n /**\n * Total height the connector should occupy.\n * Defaults to the source column height; pass max(source, target) when heights differ.\n */\n connectorHeight?: number;\n /**\n * Y offset of the TARGET card's centre from the top of the connector space.\n * When different from the source anchor, a bezier curve is drawn between the\n * two ring positions instead of a straight horizontal line.\n * Defaults to the source anchor (straight line).\n */\n rightAnchorY?: number;\n /**\n * Tones for extra source rings (index 0 = parent, already set via sourceTone).\n * Used to colour child source rings independently.\n */\n extraSourceTones?: TreeTone[];\n /**\n * Fan-out mode: Y offsets from the TOP of the connector space for each TARGET card's centre.\n * When provided and length > 1, a vertical trunk is drawn on the RIGHT side\n * connecting all target rings, and each target gets its own dotted line from the LEFT entry ring.\n */\n rightAnchors?: number[];\n /**\n * Tones for each right-side ring in fan-out mode.\n * Index i corresponds to rightAnchors[i]. Falls back to targetTone.\n */\n rightAnchorTones?: TreeTone[];\n /**\n * Per-lane active state for fan-out mode.\n * Index i corresponds to rightAnchors[i]. When provided, each lane's animation is\n * controlled independently. Falls back to the overall `state`.\n */\n rightAnchorStates?: ConnectionState[];\n /**\n * When true, flowing dots are shown even when `state` is `'stopped'`\n * (already-traversed / completed connectors also animate).\n * Default: false\n */\n animateCompleted?: boolean;\n /**\n * When true, the connector stretches to fill available flex space instead of using a\n * fixed pixel width. The SVG geometry is recalculated from the measured container width\n * so rings stay at correct positions and the middle icon stays at the exact midpoint.\n * Default: false\n */\n fullWidth?: boolean;\n}\n\nconst ConnectionFlowConnector: React.FC<ConnectionFlowConnectorProps> = ({\n state = \"flowing\",\n sourceTone = \"neutral\",\n targetTone = \"neutral\",\n middleIcon,\n width = 56,\n halfRing = true,\n showLine = true,\n animated = true,\n dotSpacing = 60,\n borderSize = \"xs\",\n sourceFill: srcFillOvr,\n sourceBorder: srcBorderOvr,\n sourceDot: srcDotOvr,\n targetFill: dstFillOvr,\n targetBorder: dstBorderOvr,\n targetDot: dstDotOvr,\n dotColor: dotColorOvr,\n leftAnchors,\n connectorHeight,\n rightAnchorY,\n extraSourceTones = [],\n rightAnchors,\n rightAnchorTones = [],\n rightAnchorStates = [],\n animateCompleted = false,\n fullWidth = false,\n}) => {\n const isDark = useIsDark();\n\n // ── Full-width mode: measure the actual rendered container width ───────────\n const containerRef = useRef<HTMLDivElement>(null);\n const [measuredWidth, setMeasuredWidth] = useState(width);\n\n useLayoutEffect(() => {\n if (!fullWidth) {\n setMeasuredWidth(width);\n return;\n }\n const el = containerRef.current;\n if (!el) return;\n const ro = new ResizeObserver(() => {\n const w = el.offsetWidth;\n if (w > 0) setMeasuredWidth(w);\n });\n ro.observe(el);\n const initial = el.offsetWidth;\n if (initial > 0) setMeasuredWidth(initial);\n return () => ro.disconnect();\n }, [fullWidth, width]);\n const ci = isDark ? 1 : 0;\n const bw = BORDER_WIDTH[borderSize];\n const ringR = 5.5;\n\n // isActive gates animated-dot rendering; extended to 'stopped' when animateCompleted is on\n const isActive =\n state === \"flowing\" || (animateCompleted && state === \"stopped\");\n // Show tone colors for both 'flowing' and 'stopped' — only 'disabled' uses neutral gray\n const showTone = state !== \"disabled\";\n\n // Resolved color tokens for sourceTone (parent)\n const srcTokens = getTreeColorTokens(sourceTone);\n const dstTokens = getTreeColorTokens(targetTone);\n\n const srcFill = srcFillOvr ?? srcTokens.connFill[ci];\n const srcBorder = srcBorderOvr ?? srcTokens.connBorder[ci];\n const srcDot = srcDotOvr ?? srcTokens.connDot[ci];\n const dstFill =\n dstFillOvr ??\n (showTone ? dstTokens.connFill[ci] : NEUTRAL_TOKENS.connFill[ci]);\n const dstBorder =\n dstBorderOvr ??\n (showTone ? dstTokens.connBorder[ci] : NEUTRAL_TOKENS.connBorder[ci]);\n const dstDot =\n dstDotOvr ??\n (showTone ? dstTokens.connDot[ci] : NEUTRAL_TOKENS.connDot[ci]);\n // Keep connector lines on the same tonal ramp as connector rings/cards.\n const lineColor = showTone\n ? dstTokens.connBorder[ci]\n : NEUTRAL_TOKENS.connBorder[ci];\n const animDotColor =\n dotColorOvr ??\n (isActive ? dstTokens.connDot[ci] : NEUTRAL_TOKENS.connDot[ci]);\n\n // ── Simple vs multi-source / fan-out mode ─────────────────────────────────\n const isMultiSource = !!(leftAnchors && leftAnchors.length > 1);\n const isMultiTarget = !!(rightAnchors && rightAnchors.length > 1);\n // Connector SVG spans the full column height when geometry is known\n const svgH = connectorHeight ?? ringR * 2 + 4;\n // Source anchor Y (left ring) — first left anchor or vertical centre of SVG\n const sy = leftAnchors?.[0] ?? svgH / 2;\n // Target anchor Y (right ring) — when provided and different, draw a bezier curve\n const ty = rightAnchorY ?? sy;\n // Keep legacy name for multi-source code that uses `my` throughout\n const my = sy;\n\n // Effective width: measured container width when fullWidth, otherwise the fixed prop\n const w = fullWidth ? measuredWidth : width;\n\n // Fan-out: control-point X for bezier curves from source to each target lane\n const fanOutCx = w / 2;\n\n // Global dot animation timing (px/s)\n const DOT_VELOCITY = 35;\n const DOT_GAP = dotSpacing / DOT_VELOCITY;\n\n // Arc helpers (half-rings)\n // Source right-facing: opens rightward (sweep=1)\n const srcArc = (y: number) =>\n `M 0 ${y - ringR} A ${ringR} ${ringR} 0 0 1 0 ${y + ringR}`;\n // Target left-facing: opens leftward (sweep=0) — uses target anchor Y\n const dstArc = `M ${w} ${ty - ringR} A ${ringR} ${ringR} 0 0 0 ${w} ${ty + ringR}`;\n\n // Trunk X — middle of the connector gap\n const trunkX = w / 2;\n // In multi-source, the vertical trunk on the left spans from first to last anchor\n return (\n <div\n ref={containerRef}\n className={`relative z-10 flex items-start justify-center -mx-[1px]${fullWidth ? \" flex-1 min-w-0\" : \" shrink-0\"}`}\n style={fullWidth ? { height: svgH } : { width: w, height: svgH }}\n >\n <svg\n width={w}\n height={svgH}\n viewBox={`0 0 ${w} ${svgH}`}\n overflow=\"visible\"\n style={{ position: \"absolute\", left: 0, top: 0, pointerEvents: \"none\" }}\n >\n {/* ── Horizontal line(s) ────────────────────────────────── */}\n {showLine &&\n (isMultiSource ? (\n <>\n {/* Bezier curves per source lane converging to the feed entry point (trunkX, sy) */}\n {leftAnchors!.map((ay, idx) => (\n <path\n key={`hline-src-${idx}`}\n d={\n ay === sy\n ? `M 0 ${ay} L ${trunkX} ${sy}`\n : `M 0 ${ay} C ${trunkX / 2} ${ay}, ${trunkX / 2} ${sy}, ${trunkX} ${sy}`\n }\n stroke={lineColor}\n strokeWidth={idx === 0 ? 2 : 1.5}\n strokeLinecap=\"round\"\n strokeDasharray={state === \"disabled\" ? \"4 4\" : undefined}\n strokeOpacity={idx === 0 ? 1 : 0.75}\n fill=\"none\"\n />\n ))}\n {/* Feed line from trunk to right ring — straight or bezier */}\n <path\n d={\n sy === ty\n ? `M ${trunkX} ${sy} L ${w - ringR} ${ty}`\n : `M ${trunkX} ${sy} C ${(trunkX + w) / 2} ${sy}, ${(trunkX + w) / 2} ${ty}, ${w - ringR} ${ty}`\n }\n stroke={lineColor}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={state === \"disabled\" ? \"4 4\" : undefined}\n fill=\"none\"\n />\n </>\n ) : isMultiTarget ? (\n <>\n {/* One smooth bezier curve per target lane — departs and arrives horizontally */}\n {rightAnchors!.map((ry, idx) => (\n <path\n key={`hline-target-${idx}`}\n d={\n ry === sy\n ? `M ${ringR} ${sy} L ${w - ringR} ${ry}`\n : `M ${ringR} ${sy} C ${fanOutCx} ${sy}, ${fanOutCx} ${ry}, ${w - ringR} ${ry}`\n }\n stroke={lineColor}\n strokeWidth={idx === 0 ? 2 : 1.5}\n strokeLinecap=\"round\"\n strokeDasharray={state === \"disabled\" ? \"4 4\" : undefined}\n strokeOpacity={idx === 0 ? 1 : 0.75}\n fill=\"none\"\n />\n ))}\n </>\n ) : (\n <path\n d={\n sy === ty\n ? `M ${ringR} ${sy} L ${w - ringR} ${ty}`\n : `M ${ringR} ${sy} C ${w / 2} ${sy}, ${w / 2} ${ty}, ${w - ringR} ${ty}`\n }\n stroke={lineColor}\n strokeWidth={2}\n strokeLinecap=\"round\"\n fill=\"none\"\n strokeDasharray={state === \"disabled\" ? \"4 4\" : undefined}\n />\n ))}\n\n {/* ── Source rings ─────────────────────────────────────── */}\n {isMultiSource ? (\n leftAnchors!.map((ay, idx) => {\n const tone =\n idx === 0\n ? sourceTone\n : (extraSourceTones[idx - 1] ?? sourceTone);\n const tok = getTreeColorTokens(tone);\n const fill = idx === 0 ? srcFill : tok.connFill[ci];\n const border = idx === 0 ? srcBorder : tok.connBorder[ci];\n const dot = idx === 0 ? srcDot : tok.connDot[ci];\n return (\n <g key={`src-${idx}`}>\n {halfRing ? (\n <>\n <path d={srcArc(ay)} fill={fill} />\n <path\n d={srcArc(ay)}\n stroke={border}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </>\n ) : (\n <>\n <circle cx={0} cy={ay} r={ringR} fill={fill} />\n <circle\n cx={0}\n cy={ay}\n r={ringR}\n stroke={border}\n strokeWidth={bw}\n fill=\"none\"\n />\n </>\n )}\n <circle cx={0} cy={ay} r=\"2\" fill={dot} />\n </g>\n );\n })\n ) : (\n <g>\n {halfRing ? (\n <>\n <path d={srcArc(my)} fill={srcFill} />\n <path\n d={srcArc(my)}\n stroke={srcBorder}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </>\n ) : (\n <>\n <circle cx={0} cy={my} r={ringR} fill={srcFill} />\n <circle\n cx={0}\n cy={my}\n r={ringR}\n stroke={srcBorder}\n strokeWidth={bw}\n fill=\"none\"\n />\n </>\n )}\n <circle cx={0} cy={my} r=\"2\" fill={srcDot} />\n </g>\n )}\n\n {/* ── Target entry ring(s) ── */}\n {isMultiTarget ? (\n rightAnchors!.map((ry, idx) => {\n const tone = rightAnchorTones[idx] ?? targetTone;\n const tok = getTreeColorTokens(tone);\n const laneState = rightAnchorStates[idx] ?? state;\n const laneTone = laneState !== \"disabled\";\n const fill = laneTone\n ? tok.connFill[ci]\n : NEUTRAL_TOKENS.connFill[ci];\n const border = laneTone\n ? tok.connBorder[ci]\n : NEUTRAL_TOKENS.connBorder[ci];\n const dot = laneTone ? tok.connDot[ci] : NEUTRAL_TOKENS.connDot[ci];\n const arc = `M ${w} ${ry - ringR} A ${ringR} ${ringR} 0 0 0 ${w} ${ry + ringR}`;\n return (\n <g key={`dst-${idx}`}>\n {halfRing ? (\n <>\n <path d={arc} fill={fill} />\n <path\n d={arc}\n stroke={border}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </>\n ) : (\n <>\n <circle cx={w} cy={ry} r={ringR} fill={fill} />\n <circle\n cx={w}\n cy={ry}\n r={ringR}\n stroke={border}\n strokeWidth={bw}\n fill=\"none\"\n />\n </>\n )}\n <circle cx={w} cy={ry} r=\"2\" fill={dot} />\n </g>\n );\n })\n ) : (\n <g>\n {halfRing ? (\n <>\n <path d={dstArc} fill={dstFill} />\n <path\n d={dstArc}\n stroke={dstBorder}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </>\n ) : (\n <>\n <circle cx={w} cy={ty} r={ringR} fill={dstFill} />\n <circle\n cx={w}\n cy={ty}\n r={ringR}\n stroke={dstBorder}\n strokeWidth={bw}\n fill=\"none\"\n />\n </>\n )}\n <circle cx={w} cy={ty} r=\"2\" fill={dstDot} />\n </g>\n )}\n\n {/* ── Animated dots ────────────────────────────────────── */}\n {animated &&\n (isMultiTarget\n ? (() => {\n // Fan-out: one bezier-path dot set per ACTIVE target lane\n return rightAnchors!.map((ry, idx) => {\n const laneState = rightAnchorStates[idx] ?? state;\n const laneActive = laneState === \"flowing\";\n if (!laneActive) return null;\n\n // Approximate arc length: horizontal span + half the vertical delta (bezier correction)\n const actualLen = w - 2 * ringR + Math.abs(ry - sy) * 0.5;\n const numDots = Math.max(\n 1,\n Math.ceil(actualLen / dotSpacing),\n );\n const virtualLen = numDots * dotSpacing;\n const pathDur = numDots * DOT_GAP;\n const overflow = Math.max(0, virtualLen - actualLen);\n\n // Same bezier as the visual line; append a short L for overflow fade-out\n const pathData =\n ry === sy\n ? `M ${ringR} ${sy} L ${w - ringR + overflow} ${sy}`\n : `M ${ringR} ${sy} C ${fanOutCx} ${sy}, ${fanOutCx} ${ry}, ${w - ringR} ${ry} L ${w - ringR + overflow} ${ry}`;\n\n const fadeOutEnd = actualLen / virtualLen;\n const fadeOutStart = Math.max(\n 0,\n fadeOutEnd - 10 / virtualLen,\n );\n const fadeInEnd = Math.min(fadeOutStart, 4 / virtualLen);\n const opTimes = `0;${fadeInEnd.toFixed(4)};${fadeOutStart.toFixed(4)};${fadeOutEnd.toFixed(4)};1`;\n\n const tone = rightAnchorTones[idx] ?? targetTone;\n const tok = getTreeColorTokens(tone);\n const dotFill = tok.connDot[ci];\n\n return Array.from({ length: numDots }, (_, di) => (\n <circle\n key={`dot-fan-${idx}-${di}`}\n r=\"3\"\n fill={dotFill}\n opacity=\"0\"\n >\n <animateMotion\n path={pathData}\n dur={`${pathDur}s`}\n begin={`${(-di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;0.9;0.9;0;0\"\n keyTimes={opTimes}\n dur={`${pathDur}s`}\n begin={`${(-di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n </circle>\n ));\n });\n })()\n : !isActive\n ? null\n : isMultiSource\n ? // One bezier path per source lane: branch bezier → feed bezier → target\n leftAnchors!.map((ay, idx) => {\n // Approximate length: branch segment + feed segment\n const branchLen = trunkX + Math.abs(ay - sy) * 0.5;\n const feedH = w - trunkX - ringR;\n const feedV = sy !== ty ? Math.abs(ty - sy) * 0.5 : 0;\n const actualLen = branchLen + feedH + feedV;\n\n const numDots = Math.max(\n 1,\n Math.ceil(actualLen / dotSpacing),\n );\n const virtualLen = numDots * dotSpacing;\n const pathDur = numDots * DOT_GAP;\n const overflow = Math.max(0, virtualLen - actualLen);\n\n // Branch bezier mirrors visual path; feed bezier matches feed line\n const cx = (trunkX + w) / 2;\n const feedEndX = w - ringR + overflow;\n const branchSeg =\n ay === sy\n ? `M 0 ${ay} L ${trunkX} ${sy}`\n : `M 0 ${ay} C ${trunkX / 2} ${ay}, ${trunkX / 2} ${sy}, ${trunkX} ${sy}`;\n const feedSeg =\n sy === ty\n ? ` L ${feedEndX} ${ty}`\n : ` C ${cx} ${sy}, ${cx} ${ty}, ${feedEndX} ${ty}`;\n const pathData = `${branchSeg}${feedSeg}`;\n\n const fadeOutEnd = actualLen / virtualLen;\n const fadeOutStart = Math.max(\n 0,\n fadeOutEnd - 10 / virtualLen,\n );\n const fadeInEnd = Math.min(fadeOutStart, 4 / virtualLen);\n const opTimes = `0;${fadeInEnd.toFixed(4)};${fadeOutStart.toFixed(4)};${fadeOutEnd.toFixed(4)};1`;\n\n return Array.from({ length: numDots }, (_, di) => (\n <circle\n key={`dot-${idx}-${di}`}\n r=\"3\"\n fill={animDotColor}\n opacity=\"0\"\n >\n <animateMotion\n path={pathData}\n dur={`${pathDur}s`}\n begin={`${(-di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;0.9;0.9;0;0\"\n keyTimes={opTimes}\n dur={`${pathDur}s`}\n begin={`${(-di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n </circle>\n ));\n })\n : (() => {\n const actualLen = w - 2 * ringR;\n const simpleNumDots = Math.max(\n 1,\n Math.ceil(actualLen / dotSpacing),\n );\n const virtualLen = simpleNumDots * dotSpacing;\n const simpleDur = simpleNumDots * DOT_GAP;\n const overflow = Math.max(0, virtualLen - actualLen);\n\n const fadeOutEnd = actualLen / virtualLen;\n const fadeOutStart = Math.max(\n 0,\n fadeOutEnd - 10 / virtualLen,\n );\n const fadeInEnd = Math.min(fadeOutStart, 4 / virtualLen);\n const opTimes = `0;${fadeInEnd.toFixed(4)};${fadeOutStart.toFixed(4)};${fadeOutEnd.toFixed(4)};1`;\n\n // When source and target are at different Y positions use animateMotion\n // along the same bezier path as the visible line so dots track it exactly.\n const isAngled = Math.abs(ty - sy) > 1;\n const motionPath = isAngled\n ? `M ${ringR} ${sy} C ${w / 2} ${sy}, ${w / 2} ${ty}, ${w - ringR + overflow} ${ty}`\n : undefined;\n\n return Array.from({ length: simpleNumDots }, (_, i) => (\n <circle\n key={`dot-${i}`}\n r=\"3\"\n fill={animDotColor}\n opacity=\"0\"\n {...(!isAngled && { cy: sy })}\n >\n {isAngled ? (\n <animateMotion\n path={motionPath}\n dur={`${simpleDur}s`}\n begin={`${(-i * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n ) : (\n <animate\n attributeName=\"cx\"\n values={`${ringR};${w - ringR + overflow}`}\n keyTimes=\"0;1\"\n dur={`${simpleDur}s`}\n begin={`${(-i * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n )}\n <animate\n attributeName=\"opacity\"\n values=\"0;0.9;0.9;0;0\"\n keyTimes={opTimes}\n dur={`${simpleDur}s`}\n begin={`${(-i * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n </circle>\n ));\n })())}\n </svg>\n\n {/* Optional middle icon (single-source only) */}\n {!isMultiSource &&\n middleIcon &&\n (fullWidth ? (\n <div\n className=\"absolute z-20 flex items-center justify-center bg-white dark:bg-neutral-900 rounded-full p-0.5\"\n style={{\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n }}\n >\n {middleIcon}\n </div>\n ) : (\n <div className=\"relative z-20 flex items-center justify-center bg-white dark:bg-neutral-900 rounded-full p-0.5 mt-auto mb-auto\">\n {middleIcon}\n </div>\n ))}\n </div>\n );\n};\n\nexport { ConnectionFlowConnector };\nexport type { ConnectionState, ConnectionFlowConnectorConfig };\nexport default ConnectionFlowConnector;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport TreeItemCard from \"../TreeView/TreeItemCard\";\nimport TreeFlowSvg, { INDENT_PX } from \"../TreeView/TreeFlowSvg\";\nimport type { TreeTone } from \"../TreeView/types\";\nimport type { ConnectionFlowItem } from \"./types\";\n\n// ── Geometry reported by a column ─────────────────────────────────────────────\n\nexport interface ColumnGeometry {\n /** Total rendered height of the whole column (parent + gap + all children). */\n totalHeight: number;\n /**\n * Y offsets (from the TOP of the column) to the centre of each source card.\n * anchors[0] = parent card, anchors[1..] = child cards (or parallel items).\n */\n anchors: number[];\n /** True when this geometry represents a parallel group (not a single-item column). */\n isParallelGroup?: boolean;\n}\n\n// ── useElementHeight ──────────────────────────────────────────────────────────\n\nfunction useElementHeight(ref: React.RefObject<HTMLElement | null>): number {\n const [h, setH] = useState(0);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n let raf: number;\n const ro = new ResizeObserver(() => {\n raf = requestAnimationFrame(() => {\n if (el) setH(el.getBoundingClientRect().height);\n });\n });\n ro.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n };\n }, [ref]);\n return h;\n}\n\n// ── ChildRow ─────────────────────────────────────────────────────────────────\n\ninterface ChildRowProps {\n item: ConnectionFlowItem;\n index: number;\n globalTone?: TreeTone;\n hoverable?: boolean;\n onHeightChange: (h: number) => void;\n onAnchorChange: (a: number) => void;\n onToneChange: (t: TreeTone) => void;\n onActiveChange: (v: boolean) => void;\n}\n\nconst ChildRow: React.FC<ChildRowProps> = ({\n item,\n index,\n globalTone,\n hoverable = false,\n onHeightChange,\n onAnchorChange,\n onToneChange,\n onActiveChange,\n}) => {\n const rowRef = useRef<HTMLDivElement>(null);\n const rowH = useElementHeight(rowRef);\n const minHRef = useRef<number | null>(null);\n\n const resolvedTone: TreeTone = item.tone ?? globalTone ?? \"neutral\";\n const isActive = item.active ?? false;\n\n useEffect(() => {\n if (rowH > 0) {\n onHeightChange(rowH);\n if (minHRef.current === null || rowH < minHRef.current) {\n minHRef.current = rowH;\n onAnchorChange(rowH / 2);\n }\n }\n }, [rowH, onHeightChange, onAnchorChange]);\n\n useEffect(() => {\n onToneChange(resolvedTone);\n }, [resolvedTone, onToneChange]);\n useEffect(() => {\n onActiveChange(isActive);\n }, [isActive, onActiveChange]);\n\n return (\n <div ref={rowRef} className=\"mb-2 min-w-0\">\n <TreeItemCard\n icon={item.icon}\n iconClassName={item.iconClassName}\n title={item.title}\n titleClassName={item.titleClassName}\n titleWrap={item.titleWrap}\n titleScroll={item.titleScroll}\n subtitle={item.subtitle}\n subtitleClassName={item.subtitleClassName}\n description={item.description}\n descriptionClassName={item.descriptionClassName}\n badge={item.badge}\n tone={resolvedTone}\n body={item.body}\n defaultExpanded={item.defaultExpanded}\n actions={item.actions}\n hoverActions={item.hoverActions}\n hoverable={hoverable}\n activePulse={item.activePulse}\n index={index}\n />\n </div>\n );\n};\n\n// ── ConnectionFlowColumn ──────────────────────────────────────────────────────\n\nexport interface ConnectionFlowColumnProps {\n item: ConnectionFlowItem;\n globalTone?: TreeTone;\n childIndent?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n childRowGap?: number;\n animated?: boolean;\n showLine?: boolean;\n connectorHalf?: boolean;\n connectorBorderSize?: \"fit\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\n dotSpacing?: number;\n itemWidth?: number | string;\n /** Reports geometry so ConnectionFlow can build a multi-source connector. */\n onGeometryChange?: (geo: ColumnGeometry) => void;\n /** When true, forces all child branches to animate (mirrors parent connection state). */\n flowActive?: boolean;\n /** When true, cards show a hover lift effect. */\n hoverable?: boolean;\n}\n\n// Gap between parent card bottom and first child card top (mt-2)\nconst CHILD_GAP_TOP = 8;\n// mb-2 gap after each ChildRow\nconst CHILD_ROW_MB = 8;\n\nconst ConnectionFlowColumn: React.FC<ConnectionFlowColumnProps> = ({\n item,\n globalTone,\n childIndent = \"xs\",\n childRowGap = CHILD_ROW_MB,\n animated = true,\n showLine = true,\n connectorHalf = true,\n connectorBorderSize = \"xs\",\n dotSpacing = 50,\n itemWidth,\n onGeometryChange,\n flowActive = false,\n hoverable = false,\n}) => {\n const hasChildren = !!(item.children && item.children.length > 0);\n const resolvedTone: TreeTone = item.tone ?? globalTone ?? \"neutral\";\n const childCount = item.children?.length ?? 0;\n\n // ── Refs & heights ────────────────────────────────────────────────────────\n const columnRef = useRef<HTMLDivElement>(null);\n const parentCardRef = useRef<HTMLDivElement>(null);\n const parentCardH = useElementHeight(parentCardRef);\n const columnH = useElementHeight(columnRef);\n\n // Per-child measurements\n const [cardHeights, setCardHeights] = useState<number[]>(() =>\n Array(childCount).fill(0),\n );\n const [cardAnchors, setCardAnchors] = useState<number[]>(() =>\n Array(childCount).fill(0),\n );\n const [toneList, setToneList] = useState<TreeTone[]>(() =>\n Array(childCount).fill(globalTone ?? \"neutral\"),\n );\n const [activeList, setActiveList] = useState<boolean[]>(() =>\n Array(childCount).fill(false),\n );\n\n // Reset arrays when child count changes\n useEffect(() => {\n setCardHeights(Array(childCount).fill(0));\n setCardAnchors(Array(childCount).fill(0));\n setToneList(Array(childCount).fill(globalTone ?? \"neutral\"));\n setActiveList(Array(childCount).fill(false));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [childCount]);\n\n const updH = useCallback(\n (i: number, h: number) =>\n setCardHeights((p) => {\n if (p[i] === h) return p;\n const n = [...p];\n n[i] = h;\n return n;\n }),\n [],\n );\n const updA = useCallback(\n (i: number, a: number) =>\n setCardAnchors((p) => {\n if (p[i] === a) return p;\n const n = [...p];\n n[i] = a;\n return n;\n }),\n [],\n );\n const updT = useCallback(\n (i: number, t: TreeTone) =>\n setToneList((p) => {\n if (p[i] === t) return p;\n const n = [...p];\n n[i] = t;\n return n;\n }),\n [],\n );\n const updAc = useCallback(\n (i: number, v: boolean) =>\n setActiveList((p) => {\n if (p[i] === v) return p;\n const n = [...p];\n n[i] = v;\n return n;\n }),\n [],\n );\n\n // ── Geometry → ConnectionFlow ─────────────────────────────────────────────\n useEffect(() => {\n if (!onGeometryChange || parentCardH === 0 || columnH === 0) return;\n\n const anchors: number[] = [parentCardH / 2];\n\n if (\n hasChildren &&\n cardHeights.length > 0 &&\n cardHeights.every((h) => h > 0)\n ) {\n // Children start after: parentCard + mt-2 (CHILD_GAP_TOP)\n const childBlockTop = parentCardH + CHILD_GAP_TOP;\n let rowTop = childBlockTop;\n cardHeights.forEach((h, idx) => {\n anchors.push(rowTop + (cardAnchors[idx] ?? h / 2));\n rowTop += h + childRowGap;\n });\n }\n\n onGeometryChange({ totalHeight: columnH, anchors });\n }, [\n parentCardH,\n columnH,\n cardHeights,\n cardAnchors,\n hasChildren,\n childRowGap,\n onGeometryChange,\n ]);\n\n // Force-active merging for TreeFlowSvg\n const mergedActiveList = flowActive ? activeList.map(() => true) : activeList;\n\n return (\n <div\n ref={columnRef}\n className={classNames(\n \"flex flex-col relative\",\n itemWidth ? \"shrink-0\" : \"flex-1 min-w-0\",\n )}\n style={itemWidth ? { width: itemWidth } : undefined}\n >\n {/* Parent card — full width */}\n <div ref={parentCardRef}>\n <TreeItemCard\n icon={item.icon}\n iconClassName={item.iconClassName}\n title={item.title}\n titleClassName={item.titleClassName}\n titleWrap={item.titleWrap}\n titleScroll={item.titleScroll}\n subtitle={item.subtitle}\n subtitleClassName={item.subtitleClassName}\n description={item.description}\n descriptionClassName={item.descriptionClassName}\n badge={item.badge}\n tone={resolvedTone}\n body={item.body}\n defaultExpanded={item.defaultExpanded}\n actions={item.actions}\n hoverActions={item.hoverActions}\n hoverable={hoverable}\n activePulse={item.activePulse}\n />\n </div>\n\n {/* Children — full width, NO paddingLeft */}\n {hasChildren && (\n <div className=\"mt-2 flex-1\">\n {item.children!.map((child, i) => (\n <ChildRow\n key={child.id}\n item={child}\n index={i}\n globalTone={globalTone}\n hoverable={hoverable}\n onHeightChange={(h) => updH(i, h)}\n onAnchorChange={(a) => updA(i, a)}\n onToneChange={(t) => updT(i, t)}\n onActiveChange={(v) => updAc(i, v)}\n />\n ))}\n </div>\n )}\n\n {/* Column-level SVG: positioned to the left of the column\n and draws the [ shape connecting parent left edge to children's left edges */}\n {hasChildren && parentCardH > 0 && cardHeights.every((h) => h > 0) && (\n <TreeFlowSvg\n mode=\"bracket\"\n parentAnchorY={parentCardH - 16}\n cardHeights={cardHeights}\n cardAnchors={cardAnchors}\n toneList={toneList}\n activeList={mergedActiveList}\n rootTone={resolvedTone}\n rootActive={item.active || flowActive}\n rowGap={childRowGap}\n stubHeight={parentCardH + CHILD_GAP_TOP}\n indent={childIndent}\n showLine={showLine}\n showConnectors\n connectorHalf={connectorHalf}\n connectorBorderSize={connectorBorderSize}\n dotSpacing={dotSpacing}\n animated={animated}\n style={{\n position: \"absolute\",\n left: -INDENT_PX[childIndent],\n top: 0,\n pointerEvents: \"none\",\n }}\n />\n )}\n </div>\n );\n};\n\nexport default ConnectionFlowColumn;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { getTreeColorTokens } from \"./toneColors\";\nimport type { TreeItemCardProps } from \"./types\";\nimport TooltipWrapper from \"../TooltipWrapper\";\nimport { IconButton } from \"../..\";\n\n// ── TreeItemCard ─────────────────────────────────────────────────────────────\n//\n// Generic collapsible card for use in tree layouts.\n// - tone drives all colors (bg, border, text) automatically\n// - body enables an expand toggle; when absent, no toggle is shown\n// - actions: always-visible slot (before expand toggle)\n// - hoverActions: rendered with opacity-0 / group-hover:opacity-100\n\nconst TreeItemCard: React.FC<TreeItemCardProps> = ({\n icon,\n iconClassName,\n title,\n titleClassName,\n titleWrap = false,\n titleScroll = false,\n subtitle,\n subtitleClassName,\n description,\n descriptionClassName,\n tone,\n body,\n defaultExpanded = false,\n expanded,\n onToggleExpanded,\n forceToggle = false,\n badge,\n actions,\n hoverActions,\n dragHandle,\n isDragging = false,\n index = 0,\n className,\n hoverable = false,\n activePulse = false,\n}) => {\n const tokens = getTreeColorTokens(tone);\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n const isExpanded = expanded ?? internalExpanded;\n const canExpand = forceToggle || (body !== undefined && body !== null);\n\n // ── Clamp detection (only when titleWrap is active, not titleScroll) ────────\n const titleRef = useRef<HTMLDivElement>(null);\n const [isTitleClamped, setIsTitleClamped] = useState(false);\n\n useEffect(() => {\n if (!titleWrap || titleScroll) {\n setIsTitleClamped(false);\n return;\n }\n const el = titleRef.current;\n if (!el) return;\n const check = () => setIsTitleClamped(el.scrollHeight > el.clientHeight);\n check();\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [titleWrap, titleScroll, title]);\n\n const handleToggle = () => {\n if (onToggleExpanded) {\n onToggleExpanded();\n return;\n }\n setInternalExpanded((v) => !v);\n };\n\n // ── Title element (shared between wrapped, scrolled, and truncated paths) ──\n // titleScroll → single line, scrollable horizontally\n // titleWrap → word-boundary wrapping, max 10 lines (via CSS -webkit-line-clamp)\n // default → single line, ellipsis truncation\n const titleEl = title ? (\n <div\n ref={titleRef}\n className={classNames(\n \"text-sm font-semibold mb-0.5\",\n titleScroll\n ? \"whitespace-nowrap overflow-x-auto\"\n : titleWrap\n ? \"overflow-hidden\"\n : \"truncate\",\n tokens.headerText,\n titleClassName,\n )}\n style={\n titleWrap && !titleScroll\n ? {\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: 10,\n }\n : undefined\n }\n >\n {title}\n </div>\n ) : null;\n\n return (\n <div\n className={classNames(\n \"relative transition-[transform,opacity,box-shadow] duration-200 ease-out\",\n isDragging && \"opacity-70\",\n hoverable && \"hover:-translate-y-0.5 hover:shadow-md cursor-pointer\",\n className,\n )}\n style={\n index > 0\n ? {\n animation: \"fadeIn 0.3s ease both\",\n animationDelay: `${index * 0.05}s`,\n }\n : undefined\n }\n >\n <div\n className={classNames(\n \"relative overflow-hidden rounded-xl border group/tree-card flex flex-col h-full\",\n tokens.border,\n )}\n >\n {/* Pulsing background layer — sits behind the header so text is unaffected */}\n {activePulse && (\n <div\n className={classNames(\n \"absolute inset-0 pointer-events-none animate-pulse\",\n tokens.pulseBg,\n )}\n />\n )}\n\n {/* Header row — bg-transparent when pulsing so the layer behind shows through */}\n <div\n className={classNames(\n \"relative flex items-stretch gap-1.5 p-3 flex-1\",\n activePulse ? \"bg-transparent\" : tokens.bg,\n )}\n >\n {/* Icon slot */}\n {icon && (\n <div\n className={classNames(\n \"w-10 h-10 shrink-0 self-center\",\n tokens.labelText,\n iconClassName,\n )}\n >\n {icon}\n </div>\n )}\n\n {/* Text content */}\n <div className=\"flex-1 min-w-0\">\n {titleEl &&\n (titleWrap && isTitleClamped && typeof title === \"string\" ? (\n <TooltipWrapper text={title}>{titleEl}</TooltipWrapper>\n ) : (\n titleEl\n ))}\n {subtitle && (\n <div\n className={classNames(\n \"text-sm font-mono truncate\",\n tokens.headerText,\n subtitleClassName,\n )}\n >\n {subtitle}\n </div>\n )}\n {description && (\n <div\n className={classNames(\n \"text-[10px] mt-0.5\",\n tokens.labelText,\n descriptionClassName,\n )}\n >\n {description}\n </div>\n )}\n {badge && (\n <div className=\"flex flex-wrap items-center gap-1 mt-1\">\n {badge}\n </div>\n )}\n </div>\n\n {/* Hover actions */}\n {hoverActions && (\n <div className=\"flex items-center gap-0.5 opacity-0 group-hover/tree-card:opacity-100 transition-opacity duration-150 shrink-0 self-start\">\n {hoverActions}\n </div>\n )}\n\n {/* Always-visible actions */}\n {actions && (\n <div className=\"flex items-center gap-0.5 shrink-0 self-start\">\n {actions}\n </div>\n )}\n\n {/* Drag handle */}\n {dragHandle && (\n <div className=\"flex items-center shrink-0 self-start\">\n {dragHandle}\n </div>\n )}\n\n {/* Expand toggle */}\n {canExpand && (\n <div className=\"flex items-center shrink-0 self-start\">\n <IconButton\n icon={isExpanded ? \"ArrowDown\" : \"ArrowChevronRight\"}\n onClick={handleToggle}\n tooltip={isExpanded ? \"Collapse\" : \"Expand\"}\n variant=\"ghost\"\n size=\"xs\"\n color=\"slate\"\n />\n </div>\n )}\n </div>\n\n {/* Expandable body panel */}\n {body !== undefined && body !== null && (\n <div\n className={classNames(\n \"grid transition-[grid-template-rows,opacity] duration-300 ease-in-out\",\n isExpanded\n ? \"grid-rows-[1fr] opacity-100\"\n : \"grid-rows-[0fr] opacity-0\",\n )}\n >\n <div className=\"min-h-0 bg-white dark:bg-neutral-900 rounded-b-xl\">\n <div className=\"border-t border-neutral-200 dark:border-neutral-700\" />\n {body}\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default TreeItemCard;\n","import React, { useEffect, useState } from \"react\";\nimport { getTreeColorTokens, NEUTRAL_TOKENS } from \"./toneColors\";\nimport type { TreeFlowSvgProps } from \"./types\";\n\n// ── useIsDark — detects Tailwind dark class strategy on <html> ────────────────\n\nfunction useIsDark(): boolean {\n const detectDark = (): boolean => {\n if (typeof document === \"undefined\") return false;\n const probe = document.createElement(\"div\");\n probe.className = \"hidden dark:block\";\n document.body.appendChild(probe);\n const darkActive = window.getComputedStyle(probe).display === \"block\";\n probe.remove();\n return darkActive;\n };\n\n const [isDark, setIsDark] = useState<boolean>(() => detectDark());\n\n useEffect(() => {\n const update = () => setIsDark(detectDark());\n const obs = new MutationObserver(update);\n obs.observe(document.documentElement, { attributeFilter: [\"class\"] });\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\");\n media.addEventListener(\"change\", update);\n update();\n return () => {\n media.removeEventListener(\"change\", update);\n obs.disconnect();\n };\n }, []);\n return isDark;\n}\n\n// ── Constants ────────────────────────────────────────────────────────────────\n\nconst INDENT_PX: Record<\"xs\" | \"sm\" | \"md\" | \"lg\", number> = {\n xs: 24,\n sm: 36,\n md: 52,\n lg: 72,\n};\n\nconst CONNECTOR_BORDER_WIDTH: Record<\n \"fit\" | \"xs\" | \"sm\" | \"md\" | \"lg\",\n number\n> = {\n fit: 1,\n xs: 1.5,\n sm: 2,\n md: 2.5,\n lg: 3,\n};\n\n// ── TreeFlowSvg ──────────────────────────────────────────────────────────────\n//\n// Single SVG spanning all items at one tree level.\n// Position: absolute, left:0, top:-stubHeight — extends above the items container\n// to visually connect from the root/parent card down through the stub gap.\n//\n// Layout contract (enforced by parent container):\n// position:relative, paddingLeft:indentPx\n// This SVG: position:absolute, left:0, top:-stubHeight\n// Route rows: normal flow at x=indentPx\n// rendered LAST so it paints on top of card borders without z-index\n\nconst TreeFlowSvg: React.FC<TreeFlowSvgProps> = ({\n mode = \"tree\",\n parentAnchorY = 0,\n parentOffset = 0,\n depth = 0,\n rootChildIndentExtra = 0,\n cardHeights,\n cardAnchors,\n toneList,\n activeList,\n rootTone,\n rootActive = false,\n rowGap,\n stubHeight = 12,\n indent = \"xs\",\n showLine = true,\n showConnectors = true,\n connectorStyle = \"rings\",\n branchColorMode = \"item\",\n junctionStyle = \"rounded\",\n showCenterDot = true,\n connectorHalf = false,\n connectorBorderSize = \"xs\",\n dotSpacing = 50,\n animated = true,\n style,\n className,\n}) => {\n const isDark = useIsDark();\n const indentPx = INDENT_PX[indent];\n const branchDepthExtra = depth === 1 ? rootChildIndentExtra : 0;\n const branchEndX =\n connectorStyle === \"dots\"\n ? indentPx + 2 + branchDepthExtra\n : indentPx + branchDepthExtra;\n\n // ── Compute midYs (connector Y positions) ─────────────────────────────────\n const midYs: number[] = [];\n let cumY = stubHeight;\n for (let i = 0; i < cardHeights.length; i++) {\n const h = cardHeights[i] ?? 0;\n const anchor = (cardAnchors?.[i] ?? 0) > 0 ? cardAnchors![i] : h / 2;\n midYs.push(cumY + anchor);\n cumY += h + rowGap;\n }\n const totalHeight = cumY;\n const lastMidY = midYs[midYs.length - 1] ?? 0;\n\n const isBracket = mode === \"bracket\";\n const hasParentStub = !isBracket && stubHeight > 0;\n const normalizedParentOffset = Math.max(0, parentOffset);\n const rootInset = hasParentStub ? -2.8 : 0;\n const branchCorner = 3;\n const rootConnectorY = isBracket\n ? parentAnchorY\n : hasParentStub\n ? Math.max(-6, stubHeight - normalizedParentOffset + rootInset)\n : 0;\n const trunkTop = isBracket ? parentAnchorY : rootConnectorY;\n\n if (lastMidY <= stubHeight || totalHeight <= stubHeight) return null;\n\n // ── Color helpers ─────────────────────────────────────────────────────────\n\n const ci = isDark ? 1 : 0;\n\n const rootTokens = getTreeColorTokens(rootTone);\n const trunkColor = rootActive\n ? rootTokens.connBorder[ci]\n : NEUTRAL_TOKENS.connBorder[ci];\n\n const branchLineColor = (i: number): string => {\n if (!activeList[i]) return NEUTRAL_TOKENS.connBorder[ci];\n return (getTreeColorTokens(toneList[i]) ?? rootTokens).connBorder[ci];\n };\n const branchUsesParentTone = branchColorMode === \"parent\" && hasParentStub;\n const resolvedTrunkColor = trunkColor;\n const resolvedBranchLineColor = (i: number): string =>\n branchUsesParentTone ? trunkColor : branchLineColor(i);\n\n const cFill = (i: number): string =>\n (getTreeColorTokens(toneList[i]) ?? rootTokens).connFill[ci];\n const cBorder = (i: number): string =>\n (getTreeColorTokens(toneList[i]) ?? rootTokens).connBorder[ci];\n const cDot = (i: number): string =>\n (getTreeColorTokens(toneList[i]) ?? rootTokens).connDot[ci];\n\n const rootFill = rootTokens.connFill[ci];\n const rootBorder = rootTokens.connBorder[ci];\n const rootDot = rootTokens.connDot[ci];\n\n // ── Ring arc paths ─────────────────────────────────────────────────────────\n const ringR = 5.5;\n const bw = CONNECTOR_BORDER_WIDTH[connectorBorderSize];\n\n // Entry ring → LEFT semicircle (top→bottom, sweep=0 CCW) — sits in gutter\n const entryArc = (cx: number, cy: number) =>\n `M ${cx} ${cy - ringR} A ${ringR} ${ringR} 0 0 0 ${cx} ${cy + ringR}`;\n // Root ring → BOTTOM semicircle (left→right, sweep=0) — sits below root card\n const rootArc = (cx: number) =>\n `M ${cx - ringR} 0 A ${ringR} ${ringR} 0 0 0 ${cx + ringR} 0`;\n\n // ── Dot animation ─────────────────────────────────────────────────────────\n const isFlowing = animated && (rootActive || activeList.some(Boolean));\n const dotColor = isDark ? \"#d4d4d4\" : \"#737373\"; // neutral-300 / neutral-500 as fallback\n // Use root token dot color when flowing\n const animDotColor = isFlowing ? rootTokens.connDot[ci] : dotColor;\n\n const DOT_VELOCITY = 35;\n const actualTrunkLen = isBracket\n ? indentPx - 12 + lastMidY - parentAnchorY\n : Math.max(0, lastMidY - trunkTop);\n const numDots = Math.max(1, Math.ceil(actualTrunkLen / dotSpacing));\n const virtualTrunkLen = numDots * dotSpacing;\n const DOT_GAP = dotSpacing / DOT_VELOCITY;\n const DUR = numDots * DOT_GAP;\n const overflow = Math.max(0, virtualTrunkLen - actualTrunkLen);\n\n const actualBranchLen = Math.max(0, branchEndX - 12);\n const branchFrac = actualBranchLen / virtualTrunkLen;\n\n return (\n <svg\n width={indentPx}\n height={totalHeight}\n viewBox={`0 0 ${indentPx} ${totalHeight}`}\n overflow=\"visible\"\n className={className}\n style={{\n position: \"absolute\",\n left: 0,\n top: -stubHeight,\n pointerEvents: \"none\",\n ...style,\n }}\n >\n {/* Vertical trunk */}\n {showLine && (\n <path\n d={`M 12 ${trunkTop} L 12 ${lastMidY}`}\n stroke={resolvedTrunkColor}\n strokeWidth={connectorStyle === \"dots\" ? 2.25 : 2.1}\n strokeLinecap={junctionStyle === \"rounded\" ? \"butt\" : \"round\"}\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n )}\n\n {/* Parent line for bracket mode (horizontal from parent to trunk) */}\n {showLine && isBracket && (\n <path\n d={`M ${indentPx} ${parentAnchorY} L 12 ${parentAnchorY}`}\n stroke={resolvedTrunkColor}\n strokeWidth={2}\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n )}\n\n {/* Per-item horizontal branches */}\n {showLine &&\n midYs.map((my, i) => (\n <path\n key={`branch-${i}`}\n d={\n junctionStyle === \"rounded\"\n ? `M 12 ${my - branchCorner} L 12 ${my} L ${branchEndX} ${my}`\n : `M 12 ${my} L ${branchEndX} ${my}`\n }\n stroke={resolvedBranchLineColor(i)}\n strokeWidth={connectorStyle === \"dots\" ? 2.75 : 2.1}\n strokeLinecap={junctionStyle === \"rounded\" ? \"butt\" : \"round\"}\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n ))}\n\n {/* Connector decorators — rendered after lines so they sit on top */}\n {showConnectors && connectorStyle === \"rings\" && (\n <>\n {/* Root connector */}\n {isBracket ? (\n <g>\n {junctionStyle === \"dot\" && (\n <>\n <circle cx=\"12\" cy={parentAnchorY} r=\"4.5\" fill={rootFill} />\n <circle\n cx=\"12\"\n cy={parentAnchorY}\n r=\"4.5\"\n stroke={rootBorder}\n strokeWidth={bw}\n fill=\"none\"\n />\n {showCenterDot && (\n <circle cx=\"12\" cy={parentAnchorY} r=\"2\" fill={rootDot} />\n )}\n </>\n )}\n <circle\n cx={indentPx}\n cy={parentAnchorY}\n r={ringR}\n fill={rootFill}\n />\n {connectorHalf ? (\n <path\n d={entryArc(indentPx, parentAnchorY)}\n stroke={rootBorder}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n ) : (\n <circle\n cx={indentPx}\n cy={parentAnchorY}\n r={ringR}\n stroke={rootBorder}\n strokeWidth={bw}\n fill=\"none\"\n />\n )}\n {showCenterDot && (\n <circle cx={indentPx} cy={parentAnchorY} r=\"2\" fill={rootDot} />\n )}\n </g>\n ) : hasParentStub ? (\n <g>\n {/* Junction marker entering the child level (half ring by default). */}\n {connectorHalf ? (\n <>\n <path\n d={rootArc(12)}\n fill={rootFill}\n transform={`translate(0, ${rootConnectorY})`}\n />\n <path\n d={rootArc(12)}\n stroke={rootBorder}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n transform={`translate(0, ${rootConnectorY})`}\n />\n </>\n ) : (\n <>\n <circle\n cx=\"12\"\n cy={rootConnectorY}\n r={ringR}\n fill={rootFill}\n />\n <circle\n cx=\"12\"\n cy={rootConnectorY}\n r={ringR}\n stroke={rootBorder}\n strokeWidth={bw}\n fill=\"none\"\n />\n </>\n )}\n {showCenterDot && (\n <circle cx=\"12\" cy={rootConnectorY} r=\"2\" fill={rootDot} />\n )}\n </g>\n ) : (\n <>\n <circle cx=\"12\" cy={rootConnectorY} r={ringR} fill={rootFill} />\n {connectorHalf ? (\n <path\n d={rootArc(12)}\n stroke={rootBorder}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n transform={`translate(0, ${rootConnectorY})`}\n />\n ) : (\n <circle\n cx=\"12\"\n cy={rootConnectorY}\n r={ringR}\n stroke={rootBorder}\n strokeWidth={bw}\n fill=\"none\"\n />\n )}\n {showCenterDot && (\n <circle cx=\"12\" cy={rootConnectorY} r=\"2\" fill={rootDot} />\n )}\n </>\n )}\n\n {/* Per-item: junction dot on trunk + entry ring on card edge */}\n {midYs.map((my, i) => (\n <g key={`conn-${i}`}>\n {junctionStyle === \"dot\" && (\n <>\n <circle cx=\"12\" cy={my} r=\"4.5\" fill={cFill(i)} />\n <circle\n cx=\"12\"\n cy={my}\n r=\"4.5\"\n stroke={resolvedBranchLineColor(i)}\n strokeWidth={bw}\n fill=\"none\"\n />\n {showCenterDot && (\n <circle cx=\"12\" cy={my} r=\"2\" fill={cDot(i)} />\n )}\n </>\n )}\n <circle cx={branchEndX} cy={my} r={ringR} fill={cFill(i)} />\n {connectorHalf ? (\n <path\n d={entryArc(branchEndX, my)}\n stroke={cBorder(i)}\n strokeWidth={bw}\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n ) : (\n <circle\n cx={branchEndX}\n cy={my}\n r={ringR}\n stroke={cBorder(i)}\n strokeWidth={bw}\n fill=\"none\"\n />\n )}\n {showCenterDot && (\n <circle cx={branchEndX} cy={my} r=\"2\" fill={cDot(i)} />\n )}\n </g>\n ))}\n </>\n )}\n\n {/* Lightweight connector dots (for cleaner tree style) */}\n {showConnectors && connectorStyle === \"dots\" && (\n <>\n <circle\n cx=\"12\"\n cy={rootConnectorY}\n r=\"4.5\"\n fill={resolvedTrunkColor}\n />\n {midYs.map((my, i) => (\n <g key={`dot-conn-${i}`}>\n <path\n d={`M 12 ${my - 6} L 12 ${my + 6}`}\n stroke={resolvedBranchLineColor(i)}\n strokeWidth={2.75}\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n <circle\n cx=\"12\"\n cy={my}\n r=\"4.5\"\n fill={resolvedBranchLineColor(i)}\n />\n <circle\n cx={branchEndX}\n cy={my}\n r=\"4.5\"\n fill={resolvedBranchLineColor(i)}\n />\n </g>\n ))}\n </>\n )}\n\n {/* Trunk dots */}\n {isFlowing &&\n Array.from({ length: numDots }, (_, i) => {\n const isB = isBracket;\n const trPath = isB\n ? `M ${indentPx} ${parentAnchorY} L 12 ${parentAnchorY} L 12 ${lastMidY + overflow}`\n : `M 12 ${trunkTop} L 12 ${lastMidY + overflow}`;\n\n // Fix WebKit animateMotion pacing bugs by manually specifying linear distances\n const l1 = isB ? indentPx - 12 : lastMidY + overflow - trunkTop;\n const l2 = isB ? lastMidY - parentAnchorY + overflow : 0;\n const total = l1 + l2;\n const p1 = total > 0 ? (l1 / total).toFixed(4) : \"1\";\n const motionProps = isB\n ? {\n calcMode: \"linear\",\n keyPoints: `0;${p1};1`,\n keyTimes: `0;${p1};1`,\n }\n : {};\n\n const fadeOutEnd = actualTrunkLen / virtualTrunkLen;\n const fadeOutStart = Math.max(0, fadeOutEnd - 10 / virtualTrunkLen);\n const fadeInEnd = Math.min(fadeOutStart, 4 / virtualTrunkLen);\n const opTimes = `0;${fadeInEnd.toFixed(4)};${fadeOutStart.toFixed(4)};${fadeOutEnd.toFixed(4)};1`;\n\n return (\n <circle key={`trunk-${i}`} r=\"3\" fill={animDotColor} opacity=\"0\">\n <animateMotion\n path={trPath}\n dur={`${DUR}s`}\n begin={`${(-i * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n {...motionProps}\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;0.9;0.9;0;0\"\n keyTimes={opTimes}\n dur={`${DUR}s`}\n begin={`${(-i * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n </circle>\n );\n })}\n\n {/* Branch dots — one set per active item */}\n {isFlowing &&\n midYs.map((my, ri) => {\n if (!activeList[ri]) return null;\n const pathToMy = isBracket\n ? indentPx - 12 + my - parentAnchorY\n : Math.max(0, my - trunkTop);\n const branchBeginBase = (pathToMy / virtualTrunkLen) * DUR;\n const bf = branchFrac;\n\n // Fixed-distance opacity fading ensures dots don't vanish prematurely on short branches\n const bFadeIn = Math.min(bf, 4 / virtualTrunkLen);\n const bFadeOutStart = Math.max(bFadeIn, bf - 10 / virtualTrunkLen);\n const bOpKT = `0;${bFadeIn.toFixed(4)};${bFadeOutStart.toFixed(4)};${bf.toFixed(4)};1`;\n\n return Array.from({ length: numDots }, (_, di) => (\n <circle\n key={`branch-${ri}-${di}`}\n cx=\"12\"\n cy={my}\n r=\"3\"\n fill={animDotColor}\n opacity=\"0\"\n >\n <animate\n attributeName=\"cx\"\n values={`12;${branchEndX};${branchEndX}`}\n keyTimes={`0;${bf.toFixed(4)};1`}\n dur={`${DUR}s`}\n begin={`${(branchBeginBase - di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0;0.9;0.9;0;0\"\n keyTimes={bOpKT}\n dur={`${DUR}s`}\n begin={`${(branchBeginBase - di * DOT_GAP).toFixed(3)}s`}\n repeatCount=\"indefinite\"\n />\n </circle>\n ));\n })}\n </svg>\n );\n};\n\nexport { INDENT_PX };\nexport default TreeFlowSvg;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport classNames from \"classnames\";\nimport TreeItemCard from \"../TreeView/TreeItemCard\";\nimport type { TreeTone } from \"../TreeView/types\";\nimport type { ConnectionFlowItem } from \"./types\";\nimport type { ColumnGeometry } from \"./ConnectionFlowColumn\";\n\n// Gap between parallel item cards\nconst GROUP_ROW_GAP = 8;\n\nfunction useElementHeight(ref: React.RefObject<HTMLElement | null>): number {\n const [h, setH] = useState(0);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n let raf: number;\n const ro = new ResizeObserver(() => {\n raf = requestAnimationFrame(() => {\n if (el) setH(el.getBoundingClientRect().height);\n });\n });\n ro.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n };\n }, [ref]);\n return h;\n}\n\nexport interface ConnectionFlowParallelGroupProps {\n items: ConnectionFlowItem[];\n globalTone?: TreeTone;\n itemWidth?: number | string;\n hoverable?: boolean;\n onGeometryChange?: (geo: ColumnGeometry) => void;\n}\n\nconst ConnectionFlowParallelGroup: React.FC<\n ConnectionFlowParallelGroupProps\n> = ({ items, globalTone, itemWidth, hoverable = false, onGeometryChange }) => {\n const groupRef = useRef<HTMLDivElement>(null);\n const groupH = useElementHeight(groupRef);\n const itemCount = items.length;\n\n // Per-item height measurements via individual refs\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const [itemHeights, setItemHeights] = useState<number[]>(() =>\n Array(itemCount).fill(0),\n );\n\n // Reset when item count changes\n useEffect(() => {\n setItemHeights(Array(itemCount).fill(0));\n itemRefs.current = itemRefs.current.slice(0, itemCount);\n }, [itemCount]);\n\n // Register a ResizeObserver per item\n useEffect(() => {\n const observers: ResizeObserver[] = [];\n const rafs: number[] = [];\n itemRefs.current.forEach((el, i) => {\n if (!el) return;\n const ro = new ResizeObserver(() => {\n const raf = requestAnimationFrame(() => {\n if (!el) return;\n const h = el.getBoundingClientRect().height;\n setItemHeights((prev) => {\n if (prev[i] === h) return prev;\n const n = [...prev];\n n[i] = h;\n return n;\n });\n });\n rafs.push(raf);\n });\n ro.observe(el);\n observers.push(ro);\n });\n return () => {\n rafs.forEach(cancelAnimationFrame);\n observers.forEach((ro) => ro.disconnect());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [itemCount]);\n\n // Report geometry: anchor at the vertical centre of each item card\n useEffect(() => {\n if (!onGeometryChange || groupH === 0) return;\n if (itemHeights.some((h) => h === 0)) return;\n\n const anchors: number[] = [];\n let y = 0;\n itemHeights.forEach((h) => {\n anchors.push(y + h / 2);\n y += h + GROUP_ROW_GAP;\n });\n\n onGeometryChange({ totalHeight: groupH, anchors, isParallelGroup: true });\n }, [groupH, itemHeights, onGeometryChange]);\n\n return (\n <div\n ref={groupRef}\n className={classNames(\n \"flex flex-col\",\n itemWidth ? \"flex-shrink-0\" : \"flex-1 min-w-0\",\n )}\n style={{\n gap: GROUP_ROW_GAP,\n ...(itemWidth ? { width: itemWidth } : undefined),\n }}\n >\n {items.map((item, i) => {\n const tone: TreeTone = item.tone ?? globalTone ?? \"neutral\";\n return (\n <div\n key={item.id}\n ref={(el) => {\n itemRefs.current[i] = el;\n }}\n >\n <TreeItemCard\n icon={item.icon}\n iconClassName={item.iconClassName}\n title={item.title}\n titleClassName={item.titleClassName}\n titleWrap={item.titleWrap}\n titleScroll={item.titleScroll}\n subtitle={item.subtitle}\n subtitleClassName={item.subtitleClassName}\n description={item.description}\n descriptionClassName={item.descriptionClassName}\n badge={item.badge}\n tone={tone}\n body={item.body}\n defaultExpanded={item.defaultExpanded}\n actions={item.actions}\n hoverActions={item.hoverActions}\n hoverable={hoverable}\n activePulse={item.activePulse}\n />\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default ConnectionFlowParallelGroup;\n","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport classNames from \"classnames\";\nimport TreeItemCard from \"./TreeItemCard\";\nimport TreeFlowSvg, { INDENT_PX } from \"./TreeFlowSvg\";\nimport Loader from \"../Loader\";\nimport EmptyState from \"../EmptyState\";\nimport type { TreeItemData, TreeTone, TreeViewProps } from \"./types\";\nimport IconButton from \"../IconButton\";\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\ntype DropPosition = \"before\" | \"after\";\n\ninterface DropTarget {\n index: number;\n position: DropPosition;\n}\n\nfunction buildOrderKey(items: TreeItemData[]): string {\n return items.map((item) => item.id).join(\"::\");\n}\n\nfunction mergeItemsByExistingOrder(\n current: TreeItemData[],\n incoming: TreeItemData[],\n): TreeItemData[] {\n const incomingById = new Map(incoming.map((item) => [item.id, item]));\n const next: TreeItemData[] = [];\n\n for (const item of current) {\n const incomingItem = incomingById.get(item.id);\n if (incomingItem) {\n next.push(incomingItem);\n incomingById.delete(item.id);\n }\n }\n\n for (const item of incoming) {\n if (incomingById.has(item.id)) {\n next.push(item);\n incomingById.delete(item.id);\n }\n }\n\n return next;\n}\n\nfunction moveItem<T>(list: T[], from: number, to: number): T[] {\n const next = [...list];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n return next;\n}\n\n// ── useElementHeight ─────────────────────────────────────────────────────────\n\nfunction useElementHeight(ref: React.RefObject<HTMLElement | null>): number {\n const [h, setH] = useState(0);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const ro = new ResizeObserver(([e]) => setH(e.contentRect.height));\n ro.observe(el);\n return () => ro.disconnect();\n }, [ref]);\n return h;\n}\n\n// ── TreeItemRow — wraps a card + optional sub-tree, reports height/anchor ────\n\ninterface TreeItemRowProps {\n item: TreeItemData;\n globalTone?: TreeTone;\n depth: number;\n index: number;\n // SVG config forwarded to sub-tree\n svgProps: Omit<TreeViewProps, \"root\" | \"items\" | \"tone\" | \"className\">;\n // Reordering\n reorderable: boolean;\n isDragging: boolean;\n dropIndicator: DropPosition | null;\n onRowElement: (el: HTMLDivElement | null) => void;\n onDragStart?: (event: React.DragEvent<HTMLDivElement>) => void;\n onDragOver?: (event: React.DragEvent<HTMLDivElement>) => void;\n onDrop?: (event: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (event: React.DragEvent<HTMLDivElement>) => void;\n // Callbacks for parent TrunkSvg\n onHeightChange: (height: number) => void;\n onAnchorChange: (anchor: number) => void;\n onToneChange: (tone: TreeTone) => void;\n onActiveChange: (active: boolean) => void;\n}\n\nconst TreeItemRow: React.FC<TreeItemRowProps> = ({\n item,\n globalTone,\n depth,\n index,\n svgProps,\n reorderable,\n isDragging,\n dropIndicator,\n onRowElement,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n onHeightChange,\n onAnchorChange,\n onToneChange,\n onActiveChange,\n}) => {\n const rowRef = useRef<HTMLDivElement>(null);\n const cardRef = useRef<HTMLDivElement>(null);\n const childLevelWrapRef = useRef<HTMLDivElement>(null);\n const rowHeight = useElementHeight(rowRef);\n const cardHeight = useElementHeight(cardRef);\n const [childLevelOffset, setChildLevelOffset] = useState(0);\n\n const resolvedTone: TreeTone = item.tone ?? globalTone ?? \"neutral\";\n const isActive = item.active ?? false;\n const hasChildren = Boolean(item.children && item.children.length > 0);\n const [childrenExpanded, setChildrenExpanded] = useState(\n item.defaultExpanded ?? true,\n );\n\n const setRowElement = useCallback(\n (el: HTMLDivElement | null) => {\n rowRef.current = el;\n onRowElement(el);\n },\n [onRowElement],\n );\n\n // Report full row height (card + nested subtree) for level layout spacing.\n useEffect(() => {\n if (rowHeight > 0) {\n onHeightChange(rowHeight);\n }\n }, [rowHeight, onHeightChange]);\n\n // Anchor must be based on card height only (not children), otherwise expanded\n // branches drift downward and no longer align with their own cards.\n useEffect(() => {\n if (cardHeight > 0) {\n onAnchorChange(cardHeight / 2);\n }\n }, [cardHeight, onAnchorChange]);\n\n // Measure actual gap between the parent card border and nested TreeLevel\n // container. This keeps parent->child connector anchoring correct across\n // responsive layout changes and varying row densities.\n useEffect(() => {\n const cardEl = cardRef.current;\n const childWrapEl = childLevelWrapRef.current;\n\n if (!cardEl || !childWrapEl || !hasChildren || !childrenExpanded) {\n setChildLevelOffset(0);\n return;\n }\n\n const computeOffset = () => {\n const cardRect = cardEl.getBoundingClientRect();\n const childRect = childWrapEl.getBoundingClientRect();\n setChildLevelOffset(Math.max(0, childRect.top - cardRect.bottom));\n };\n\n computeOffset();\n const ro = new ResizeObserver(computeOffset);\n ro.observe(cardEl);\n ro.observe(childWrapEl);\n window.addEventListener(\"resize\", computeOffset);\n\n return () => {\n ro.disconnect();\n window.removeEventListener(\"resize\", computeOffset);\n };\n }, [childrenExpanded, hasChildren]);\n\n // Report tone and active\n useEffect(() => {\n onToneChange(resolvedTone);\n }, [resolvedTone, onToneChange]);\n useEffect(() => {\n onActiveChange(isActive);\n }, [isActive, onActiveChange]);\n\n return (\n <div\n ref={setRowElement}\n className={classNames(\n \"relative mb-2 min-w-0 transition-[transform,opacity] duration-200 ease-out\",\n reorderable && \"cursor-grab active:cursor-grabbing\",\n isDragging && \"opacity-70\",\n )}\n draggable={reorderable}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n >\n {dropIndicator && (\n <div\n className={classNames(\n \"pointer-events-none absolute left-0 right-0 z-20 h-0.5 rounded-full bg-sky-400/90\",\n dropIndicator === \"before\" ? \"-top-1\" : \"-bottom-1\",\n )}\n />\n )}\n <div ref={cardRef}>\n <TreeItemCard\n icon={item.icon}\n iconClassName={item.iconClassName}\n title={item.title}\n titleClassName={item.titleClassName}\n subtitle={item.subtitle}\n subtitleClassName={item.subtitleClassName}\n description={item.description}\n descriptionClassName={item.descriptionClassName}\n badge={item.badge}\n tone={resolvedTone}\n body={item.body}\n defaultExpanded={item.defaultExpanded}\n expanded={hasChildren ? childrenExpanded : undefined}\n onToggleExpanded={\n hasChildren ? () => setChildrenExpanded((v) => !v) : undefined\n }\n forceToggle={hasChildren}\n actions={item.actions}\n hoverActions={item.hoverActions}\n dragHandle={\n reorderable ? (\n <IconButton\n size=\"xs\"\n variant=\"ghost\"\n color=\"neutral\"\n icon=\"Drag\"\n aria-label=\"Drag to reorder\"\n tooltip=\"Drag to reorder\"\n />\n ) : undefined\n }\n isDragging={isDragging}\n index={index}\n />\n </div>\n {/* Recursive sub-tree for children */}\n {hasChildren && childrenExpanded && item.children && (\n <div ref={childLevelWrapRef} className=\"mt-1\">\n <TreeLevel\n items={item.children}\n globalTone={globalTone}\n svgProps={svgProps}\n parentTone={resolvedTone}\n parentActive={isActive}\n parentOffset={childLevelOffset}\n depth={depth + 1}\n />\n </div>\n )}\n </div>\n );\n};\n\n// ── TreeLevel — renders a list of items + their TrunkSvg ─────────────────────\n\ninterface TreeLevelProps {\n items: TreeItemData[];\n globalTone?: TreeTone;\n svgProps: Omit<TreeViewProps, \"root\" | \"items\" | \"tone\" | \"className\">;\n parentTone?: TreeTone;\n parentActive?: boolean;\n stubHeight?: number;\n parentOffset?: number;\n depth?: number;\n}\n\nconst TreeLevel: React.FC<TreeLevelProps> = ({\n items,\n globalTone,\n svgProps,\n parentTone,\n parentActive = false,\n stubHeight,\n parentOffset,\n depth = 0,\n}) => {\n const resolvedStubHeight = stubHeight ?? svgProps.stubHeight ?? 12;\n const resolvedIndent = svgProps.indent ?? \"xs\";\n const resolvedRowGap = svgProps.rowGap ?? 8;\n const indentPx = INDENT_PX[resolvedIndent];\n\n const isReorderEnabled = Boolean(svgProps.reorderable && items.length > 1);\n\n const [orderedItems, setOrderedItems] = useState<TreeItemData[]>(items);\n const prevIncomingOrderKeyRef = useRef(buildOrderKey(items));\n const hasLocalOrderOverride = useRef(false);\n\n // Keep local order when parent re-renders unchanged order while async save is in-flight.\n useEffect(() => {\n const incomingKey = buildOrderKey(items);\n setOrderedItems((prev) => {\n if (!hasLocalOrderOverride.current) {\n return items;\n }\n if (incomingKey !== prevIncomingOrderKeyRef.current) {\n hasLocalOrderOverride.current = false;\n return items;\n }\n return mergeItemsByExistingOrder(prev, items);\n });\n prevIncomingOrderKeyRef.current = incomingKey;\n }, [items]);\n\n // Per-item state for the SVG (tracked by id, then projected to arrays)\n const [cardHeightById, setCardHeightById] = useState<Record<string, number>>(\n {},\n );\n const [cardAnchorById, setCardAnchorById] = useState<Record<string, number>>(\n {},\n );\n const [toneById, setToneById] = useState<Record<string, TreeTone>>({});\n const [activeById, setActiveById] = useState<Record<string, boolean>>({});\n\n const rowElementsRef = useRef<Record<string, HTMLDivElement | null>>({});\n const previousTopByIdRef = useRef<Record<string, number>>({});\n\n const dragStartRef = useRef<{ id: string; index: number } | null>(null);\n const dropTargetRef = useRef<DropTarget | null>(null);\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n\n useEffect(() => {\n const validIds = new Set(orderedItems.map((item) => item.id));\n\n const prune = <T,>(prev: Record<string, T>): Record<string, T> => {\n let dirty = false;\n const next: Record<string, T> = {};\n for (const [id, value] of Object.entries(prev)) {\n if (validIds.has(id)) {\n next[id] = value;\n } else {\n dirty = true;\n }\n }\n return dirty ? next : prev;\n };\n\n setCardHeightById(prune);\n setCardAnchorById(prune);\n setToneById(prune);\n setActiveById(prune);\n }, [orderedItems]);\n\n const updateHeight = useCallback((id: string, h: number) => {\n setCardHeightById((prev) => (prev[id] === h ? prev : { ...prev, [id]: h }));\n }, []);\n\n const updateAnchor = useCallback((id: string, a: number) => {\n setCardAnchorById((prev) => (prev[id] === a ? prev : { ...prev, [id]: a }));\n }, []);\n\n const updateTone = useCallback((id: string, t: TreeTone) => {\n setToneById((prev) => (prev[id] === t ? prev : { ...prev, [id]: t }));\n }, []);\n\n const updateActive = useCallback((id: string, active: boolean) => {\n setActiveById((prev) =>\n prev[id] === active ? prev : { ...prev, [id]: active },\n );\n }, []);\n\n const setRowElement = useCallback((id: string, el: HTMLDivElement | null) => {\n if (el) {\n rowElementsRef.current[id] = el;\n return;\n }\n delete rowElementsRef.current[id];\n delete previousTopByIdRef.current[id];\n }, []);\n\n const clearDragState = useCallback(() => {\n dragStartRef.current = null;\n dropTargetRef.current = null;\n setDraggingId(null);\n setDropTarget(null);\n }, []);\n\n const commitDrop = useCallback(() => {\n if (!isReorderEnabled) {\n clearDragState();\n return;\n }\n\n const dragStart = dragStartRef.current;\n const target = dropTargetRef.current;\n if (!dragStart || !target) {\n clearDragState();\n return;\n }\n\n const fromIndex = orderedItems.findIndex(\n (item) => item.id === dragStart.id,\n );\n if (fromIndex === -1) {\n clearDragState();\n return;\n }\n\n let nextIndex =\n target.position === \"after\" ? target.index + 1 : target.index;\n if (nextIndex > fromIndex) {\n nextIndex -= 1;\n }\n nextIndex = Math.max(0, Math.min(nextIndex, orderedItems.length - 1));\n\n if (nextIndex !== fromIndex) {\n hasLocalOrderOverride.current = true;\n setOrderedItems(moveItem(orderedItems, fromIndex, nextIndex));\n svgProps.onReorder?.({\n id: dragStart.id,\n oldOrder: fromIndex,\n newOrder: nextIndex,\n });\n }\n\n clearDragState();\n }, [clearDragState, isReorderEnabled, orderedItems, svgProps]);\n\n // FLIP animation so sibling cards move smoothly when order changes.\n useLayoutEffect(() => {\n const nextTopById: Record<string, number> = {};\n\n for (const item of orderedItems) {\n const rowEl = rowElementsRef.current[item.id];\n if (!rowEl) continue;\n\n const nextTop = rowEl.offsetTop;\n nextTopById[item.id] = nextTop;\n\n const prevTop = previousTopByIdRef.current[item.id];\n if (prevTop === undefined || prevTop === nextTop) continue;\n\n const deltaY = prevTop - nextTop;\n rowEl.style.transition = \"none\";\n rowEl.style.transform = `translateY(${deltaY}px)`;\n rowEl.style.willChange = \"transform\";\n\n requestAnimationFrame(() => {\n rowEl.style.transition =\n \"transform 220ms cubic-bezier(0.22, 1, 0.36, 1)\";\n rowEl.style.transform = \"translateY(0)\";\n });\n }\n\n previousTopByIdRef.current = nextTopById;\n }, [orderedItems]);\n\n const cardHeights = orderedItems.map((item) => cardHeightById[item.id] ?? 0);\n const cardAnchors = orderedItems.map((item) => cardAnchorById[item.id] ?? 0);\n const toneList = orderedItems.map(\n (item) => toneById[item.id] ?? item.tone ?? globalTone ?? \"neutral\",\n );\n const activeList = orderedItems.map(\n (item) => activeById[item.id] ?? Boolean(item.active),\n );\n\n const handleLevelDragOver = useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n if (!isReorderEnabled || !dragStartRef.current) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (orderedItems.length === 0) return;\n\n const firstId = orderedItems[0]?.id;\n const lastId = orderedItems[orderedItems.length - 1]?.id;\n const firstRow = firstId ? rowElementsRef.current[firstId] : null;\n const lastRow = lastId ? rowElementsRef.current[lastId] : null;\n\n if (!firstRow || !lastRow) return;\n\n let nextTarget: DropTarget | null = null;\n const firstRect = firstRow.getBoundingClientRect();\n const lastRect = lastRow.getBoundingClientRect();\n\n if (event.clientY <= firstRect.top) {\n nextTarget = { index: 0, position: \"before\" };\n } else if (event.clientY >= lastRect.bottom) {\n nextTarget = { index: orderedItems.length - 1, position: \"after\" };\n }\n\n if (nextTarget) {\n const prevTarget = dropTargetRef.current;\n if (\n !prevTarget ||\n prevTarget.index !== nextTarget.index ||\n prevTarget.position !== nextTarget.position\n ) {\n dropTargetRef.current = nextTarget;\n setDropTarget(nextTarget);\n }\n }\n\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"move\";\n }\n },\n [isReorderEnabled, orderedItems],\n );\n\n const handleLevelDrop = useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n if (!isReorderEnabled) return;\n event.preventDefault();\n event.stopPropagation();\n commitDrop();\n },\n [commitDrop, isReorderEnabled],\n );\n\n return (\n <div className=\"relative\" style={{ paddingLeft: indentPx }}>\n <div onDragOver={handleLevelDragOver} onDrop={handleLevelDrop}>\n {orderedItems.map((item, i) => (\n <TreeItemRow\n key={item.id}\n item={item}\n globalTone={globalTone}\n depth={depth}\n index={i}\n svgProps={svgProps}\n reorderable={isReorderEnabled}\n isDragging={draggingId === item.id}\n dropIndicator={\n dropTarget && dropTarget.index === i && draggingId !== item.id\n ? dropTarget.position\n : null\n }\n onRowElement={(el) => setRowElement(item.id, el)}\n onDragStart={\n isReorderEnabled\n ? (event) => {\n event.stopPropagation();\n dragStartRef.current = { id: item.id, index: i };\n dropTargetRef.current = { index: i, position: \"before\" };\n setDraggingId(item.id);\n setDropTarget({ index: i, position: \"before\" });\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", item.id);\n }\n }\n : undefined\n }\n onDragOver={\n isReorderEnabled\n ? (event) => {\n if (!dragStartRef.current) return;\n event.preventDefault();\n event.stopPropagation();\n\n const rect = event.currentTarget.getBoundingClientRect();\n const position: DropPosition =\n event.clientY < rect.top + rect.height / 2\n ? \"before\"\n : \"after\";\n const nextTarget: DropTarget = { index: i, position };\n\n const prevTarget = dropTargetRef.current;\n if (\n !prevTarget ||\n prevTarget.index !== nextTarget.index ||\n prevTarget.position !== nextTarget.position\n ) {\n dropTargetRef.current = nextTarget;\n setDropTarget(nextTarget);\n }\n\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"move\";\n }\n }\n : undefined\n }\n onDrop={\n isReorderEnabled\n ? (event) => {\n event.preventDefault();\n event.stopPropagation();\n commitDrop();\n }\n : undefined\n }\n onDragEnd={\n isReorderEnabled\n ? (event) => {\n event.stopPropagation();\n clearDragState();\n }\n : undefined\n }\n onHeightChange={(h) => updateHeight(item.id, h)}\n onAnchorChange={(a) => updateAnchor(item.id, a)}\n onToneChange={(t) => updateTone(item.id, t)}\n onActiveChange={(v) => updateActive(item.id, v)}\n />\n ))}\n </div>\n {/* TrunkSvg rendered AFTER card rows so it paints on top of borders */}\n <TreeFlowSvg\n cardHeights={cardHeights}\n cardAnchors={cardAnchors}\n toneList={toneList}\n activeList={activeList}\n rootTone={parentTone}\n rootActive={parentActive}\n rowGap={resolvedRowGap}\n stubHeight={resolvedStubHeight}\n parentOffset={parentOffset}\n depth={depth}\n rootChildIndentExtra={svgProps.rootChildIndentExtra}\n indent={resolvedIndent}\n showLine={svgProps.showLine}\n showConnectors={svgProps.showConnectors}\n connectorStyle={svgProps.connectorStyle}\n branchColorMode={svgProps.branchColorMode}\n junctionStyle={svgProps.junctionStyle}\n showCenterDot={svgProps.showCenterDot}\n connectorHalf={svgProps.connectorHalf}\n connectorBorderSize={svgProps.connectorBorderSize}\n dotSpacing={svgProps.dotSpacing}\n animated={svgProps.animated}\n />\n </div>\n );\n};\n\n// ── TreeView — top-level component ───────────────────────────────────────────\n\nconst TreeView: React.FC<TreeViewProps> = ({\n root,\n items,\n tone,\n rootTone,\n rootActive = false,\n animated = true,\n showLine = true,\n showConnectors = true,\n connectorStyle = \"rings\",\n branchColorMode = \"item\",\n junctionStyle = \"rounded\",\n showCenterDot = true,\n connectorHalf = false,\n connectorBorderSize = \"xs\",\n dotSpacing = 50,\n indent = \"xs\",\n rootChildIndentExtra = 0,\n rowGap = 8,\n stubHeight = 12,\n loading = false,\n loadingState,\n emptyState,\n error,\n errorState,\n onRetry,\n reorderable = false,\n onReorder,\n className,\n}) => {\n const resolvedRootTone: TreeTone =\n root?.tone ?? rootTone ?? tone ?? \"neutral\";\n const resolvedRootActive = root?.active ?? rootActive;\n // Show stub gap when root item OR standalone rootTone/rootActive is provided\n const hasRootContext = !!(root || rootTone !== undefined || rootActive);\n\n const svgProps: Omit<\n TreeViewProps,\n | \"root\"\n | \"items\"\n | \"tone\"\n | \"rootTone\"\n | \"rootActive\"\n | \"className\"\n | \"loading\"\n | \"loadingState\"\n | \"emptyState\"\n | \"error\"\n | \"errorState\"\n | \"onRetry\"\n > = {\n animated,\n showLine,\n showConnectors,\n connectorStyle,\n branchColorMode,\n junctionStyle,\n showCenterDot,\n connectorHalf,\n connectorBorderSize,\n dotSpacing,\n indent,\n rootChildIndentExtra,\n rowGap,\n stubHeight,\n reorderable,\n onReorder,\n };\n\n // ── Loading state ────────────────────────────────────────────────────────\n if (loading) {\n return (\n <div\n className={classNames(\n \"flex items-center justify-center py-8\",\n className,\n )}\n >\n {loadingState ?? <Loader size=\"md\" label=\"Loading...\" />}\n </div>\n );\n }\n\n // ── Error state ──────────────────────────────────────────────────────────\n if (error) {\n return (\n <div\n className={classNames(\n \"flex items-center justify-center py-8\",\n className,\n )}\n >\n {errorState ?? (\n <EmptyState\n icon=\"Error\"\n title=\"Something went wrong\"\n subtitle={\n typeof error === \"string\"\n ? error\n : \"An unexpected error occurred.\"\n }\n tone=\"rose\"\n showIcon\n actionLabel={onRetry ? \"Retry\" : undefined}\n onAction={onRetry}\n />\n )}\n </div>\n );\n }\n\n return (\n <div className={classNames(\"flex flex-col\", className)}>\n {/* Root item */}\n {root && (\n <TreeItemCard\n icon={root.icon}\n iconClassName={root.iconClassName}\n title={root.title}\n titleClassName={root.titleClassName}\n subtitle={root.subtitle}\n subtitleClassName={root.subtitleClassName}\n description={root.description}\n descriptionClassName={root.descriptionClassName}\n badge={root.badge}\n tone={resolvedRootTone}\n body={root.body}\n defaultExpanded={root.defaultExpanded}\n actions={root.actions}\n hoverActions={root.hoverActions}\n />\n )}\n\n {/* Items list with SVG tree */}\n {items.length > 0 ? (\n <div className={root ? \"mt-1\" : undefined}>\n <TreeLevel\n items={items}\n globalTone={tone}\n svgProps={svgProps}\n parentTone={resolvedRootTone}\n parentActive={resolvedRootActive}\n stubHeight={hasRootContext ? stubHeight : 0}\n depth={0}\n />\n </div>\n ) : emptyState ? (\n <div className={root ? \"mt-3\" : undefined}>{emptyState}</div>\n ) : null}\n\n {/* Root children (sub-tree under root, separate from items) */}\n {root?.children && root.children.length > 0 && (\n <div className=\"mt-1\">\n <TreeLevel\n items={root.children}\n globalTone={tone}\n svgProps={svgProps}\n parentTone={resolvedRootTone}\n parentActive={root.active ?? false}\n stubHeight={0}\n depth={0}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport { TreeLevel };\nexport default TreeView;\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport classNames from \"classnames\";\nimport { IconButton } from \"../components\";\n\nimport {\n BottomSheetContextValue,\n BottomSheetControls,\n BottomSheetOptions,\n BottomSheetRenderable,\n} from \"../types/BottomSheetContext\";\n\nconst BottomSheetContext = createContext<BottomSheetContextValue | null>(null);\n\nconst TRANSITION_MS = 260;\n\nconst renderSlot = (\n slot: BottomSheetRenderable | undefined,\n controls: BottomSheetControls,\n): ReactNode => {\n if (!slot) {\n return null;\n }\n return typeof slot === \"function\" ? slot(controls) : slot;\n};\n\nexport const BottomSheetProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [sheet, setSheet] = useState<BottomSheetOptions | null>(null);\n const [isVisible, setIsVisible] = useState(false);\n const pendingCloseRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const dismissSheet = useCallback(() => {\n setIsVisible(false);\n }, []);\n\n const presentSheet = useCallback((options: BottomSheetOptions) => {\n if (pendingCloseRef.current) {\n clearTimeout(pendingCloseRef.current);\n pendingCloseRef.current = null;\n }\n setSheet(options);\n const animateIn = () => setIsVisible(true);\n if (\n typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ) {\n window.requestAnimationFrame(animateIn);\n } else {\n setTimeout(animateIn, 0);\n }\n }, []);\n\n useEffect(() => {\n if (!isVisible && sheet) {\n pendingCloseRef.current = setTimeout(() => {\n sheet.onClose?.();\n setSheet(null);\n }, TRANSITION_MS);\n return () => {\n if (pendingCloseRef.current) {\n clearTimeout(pendingCloseRef.current);\n pendingCloseRef.current = null;\n }\n };\n }\n return undefined;\n }, [isVisible, sheet]);\n\n useEffect(\n () => () => {\n if (pendingCloseRef.current) {\n clearTimeout(pendingCloseRef.current);\n }\n },\n [],\n );\n\n const controls = useMemo<BottomSheetControls>(\n () => ({\n dismiss: dismissSheet,\n }),\n [dismissSheet],\n );\n\n const contextValue = useMemo<BottomSheetContextValue>(\n () => ({\n presentSheet,\n dismissSheet,\n isOpen: Boolean(sheet) && isVisible,\n currentSheet: sheet,\n }),\n [presentSheet, dismissSheet, sheet, isVisible],\n );\n\n const overlayNode =\n typeof document !== \"undefined\" && sheet\n ? createPortal(\n <div className=\"pointer-events-none fixed inset-0 z-[70] flex items-end justify-center\">\n <div\n className={classNames(\n \"absolute inset-0 bg-neutral-900/40 transition-opacity duration-300\",\n isVisible ? \"opacity-100 pointer-events-auto\" : \"opacity-0\",\n )}\n aria-hidden=\"true\"\n onClick={\n sheet.backdropDismiss === false\n ? undefined\n : () => {\n dismissSheet();\n }\n }\n />\n <div className=\"relative w-full max-w-4xl px-4 pb-4 sm:px-8\">\n <section\n role=\"dialog\"\n aria-modal=\"true\"\n className={classNames(\n \"pointer-events-auto ml-auto flex w-full flex-col rounded-t-3xl border border-slate-200 bg-white shadow-2xl transition-transform duration-300 dark:border-slate-700 dark:bg-slate-900\",\n sheet.className,\n isVisible ? \"translate-y-0\" : \"translate-y-full\",\n )}\n style={{ minHeight: \"25vh\", maxHeight: \"85vh\" }}\n >\n <header className=\"flex items-start justify-between gap-3 border-b border-slate-200 px-6 py-4 dark:border-slate-800\">\n <div className=\"space-y-1\">\n {sheet.title && (\n <div className=\"text-base font-semibold text-slate-900 dark:text-slate-100\">\n {sheet.title}\n </div>\n )}\n {sheet.description && (\n <p className=\"text-sm text-slate-500 dark:text-slate-300\">\n {sheet.description}\n </p>\n )}\n </div>\n {(sheet.showCloseButton ?? true) && (\n <IconButton\n icon=\"Close\"\n variant=\"ghost\"\n size=\"sm\"\n accent\n aria-label=\"Close feedback\"\n onClick={dismissSheet}\n />\n )}\n </header>\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n {renderSlot(sheet.content, controls) ?? (\n <p className=\"text-sm text-slate-500\">\n No content provided.\n </p>\n )}\n </div>\n {sheet.actions && (\n <div className=\"flex flex-wrap items-center justify-end gap-3 border-t border-slate-200 px-6 py-4 dark:border-slate-800\">\n {renderSlot(sheet.actions, controls)}\n </div>\n )}\n </section>\n </div>\n </div>,\n document.body,\n )\n : null;\n\n return (\n <BottomSheetContext.Provider value={contextValue}>\n {children}\n {overlayNode}\n </BottomSheetContext.Provider>\n );\n};\n\nexport const useBottomSheet = () => {\n const context = useContext(BottomSheetContext);\n if (!context) {\n throw new Error(\"useBottomSheet must be used within a BottomSheetProvider\");\n }\n return context;\n};\n","/**\n * Utility functions for handling focus events with intelligent reconnection logic\n */\n\nexport interface FocusHandlerOptions {\n debounceMs?: number;\n checkConnection?: () => boolean;\n onReconnect?: () => void;\n onSkip?: () => void;\n}\n\n/**\n * Creates a debounced focus handler that only triggers reconnection when necessary\n * @param options Configuration options for the focus handler\n * @returns A function that can be used as an event listener\n */\nexport function createIntelligentFocusHandler(\n options: FocusHandlerOptions = {},\n) {\n const {\n debounceMs = 500,\n checkConnection = () => true,\n onReconnect = () => {},\n onSkip = () => {},\n } = options;\n\n const enableDebugLogging = false;\n\n let focusTimeout: ReturnType<typeof setTimeout> | null = null;\n\n return () => {\n if (enableDebugLogging) {\n console.info(\"Window focused - checking connection status\");\n }\n\n // Clear any existing timeout\n if (focusTimeout) {\n clearTimeout(focusTimeout);\n }\n\n // Debounce the focus event to avoid rapid reconnections\n focusTimeout = setTimeout(() => {\n // Only reconnect if the connection check fails\n if (!checkConnection()) {\n if (enableDebugLogging) {\n console.info(\"Connection lost, attempting to reconnect...\");\n }\n onReconnect();\n } else {\n if (enableDebugLogging) {\n console.info(\"Already connected, no need to reconnect\");\n }\n onSkip();\n }\n }, debounceMs);\n };\n}\n\n/**\n * Cleanup function for focus handlers\n * @param handler The focus handler function\n * @param timeoutRef Reference to the timeout\n */\nexport function cleanupFocusHandler(\n handler: () => void,\n timeoutRef: ReturnType<typeof setTimeout> | null,\n) {\n window.removeEventListener(\"focus\", handler);\n if (timeoutRef) {\n clearTimeout(timeoutRef);\n }\n}\n\n/**\n * Hook for managing focus events with intelligent reconnection\n * @param options Configuration options\n * @returns Cleanup function\n */\nexport function useIntelligentFocusHandler(options: FocusHandlerOptions = {}) {\n const handler = createIntelligentFocusHandler(options);\n\n return () => {\n window.removeEventListener(\"focus\", handler);\n };\n}\n","export function toBoolean(value: string | undefined): boolean {\n if (value === undefined) {\n return false;\n }\n return (\n value.toLowerCase() === \"true\" ||\n value === \"1\" ||\n value === \"yes\" ||\n value === \"on\" ||\n value === \"enabled\" ||\n value === \"y\" ||\n value === \"t\"\n );\n}\n\nexport function normalizeString(subject: string): string {\n return subject.replace(/[^A-Z0-9]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\nexport function normalizeStringToUpper(name: string): string {\n return normalizeString(name.toUpperCase());\n}\n\nexport function isDevelopment(environment: string): boolean {\n return (\n environment === \"development\" ||\n environment === \"staging\" ||\n environment === \"beta\"\n );\n}\n\nexport function formatDate(iso?: string | null): string {\n if (!iso) return \"—\";\n try {\n return new Date(iso).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nexport function formatLogTime(iso: string): string {\n try {\n return new Date(iso).toLocaleTimeString(undefined, {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n } catch {\n return iso.slice(11, 19);\n }\n}\n\nexport function formatMB(mb?: number): string {\n if (mb == null) return \"—\";\n if (mb >= 1024 * 1024) return `${(mb / (1024 * 1024)).toFixed(1)} TB`;\n if (mb >= 1024) return `${Math.round(mb / 1024)} GB`;\n return `${mb} MB`;\n}\n","/**\n * Duration formatting utilities.\n * All functions operate on whole minutes as the base unit.\n */\n\n// ── Constants ──────────────────────────────────────────────────────────────────\n\n/** Approximate minutes per calendar month (30 days). */\nconst MINUTES_PER_MONTH = 43_200; // 30 * 24 * 60\n\nconst DURATION_UNITS = [\n { singular: \"year\", plural: \"years\", minutes: 525_960 }, // 365.25 * 24 * 60\n { singular: \"month\", plural: \"months\", minutes: MINUTES_PER_MONTH },\n { singular: \"day\", plural: \"days\", minutes: 1_440 },\n { singular: \"hour\", plural: \"hours\", minutes: 60 },\n { singular: \"minute\", plural: \"minutes\", minutes: 1 },\n] as const;\n\n// ── Options ────────────────────────────────────────────────────────────────────\n\nexport interface FormatDurationOptions {\n /**\n * Maximum number of unit parts to include in the output.\n * e.g. maxParts=2 → \"1 day and 5 hours\" (minutes dropped)\n * Defaults to 3.\n */\n maxParts?: number;\n\n /**\n * String to return when the input is zero or negative.\n * Defaults to \"0 minutes\".\n */\n zeroLabel?: string;\n}\n\n// ── Core formatter ─────────────────────────────────────────────────────────────\n\n/**\n * Converts a number of minutes into a human-readable duration string.\n *\n * @example\n * formatDuration(1) // \"1 minute\"\n * formatDuration(45) // \"45 minutes\"\n * formatDuration(60) // \"1 hour\"\n * formatDuration(85) // \"1 hour and 25 minutes\"\n * formatDuration(1440) // \"1 day\"\n * formatDuration(1525) // \"1 day and 25 minutes\"\n * formatDuration(1860) // \"1 day and 7 hours\" (maxParts=2 default trims minutes)\n * formatDuration(7785) // \"5 days, 9 hours and 45 minutes\"\n * formatDuration(46080) // \"1 month and 2 days\"\n * formatDuration(530985) // \"1 year, 1 month and 2 days\"\n * formatDuration(0) // \"0 minutes\"\n * formatDuration(-5) // \"0 minutes\"\n */\nexport function formatDuration(\n totalMinutes: number,\n options?: FormatDurationOptions,\n): string {\n const { maxParts = 3, zeroLabel = \"0 minutes\" } = options ?? {};\n\n const minutes = Math.floor(totalMinutes);\n if (minutes <= 0) return zeroLabel;\n\n const parts: string[] = [];\n let remaining = minutes;\n\n for (const unit of DURATION_UNITS) {\n if (remaining < unit.minutes) continue;\n\n const count = Math.floor(remaining / unit.minutes);\n remaining -= count * unit.minutes;\n\n parts.push(`${count} ${count === 1 ? unit.singular : unit.plural}`);\n\n if (parts.length >= maxParts) break;\n }\n\n if (parts.length === 0) return zeroLabel;\n if (parts.length === 1) return parts[0];\n\n // \"a, b and c\" or \"a and b\"\n return `${parts.slice(0, -1).join(\", \")} and ${parts[parts.length - 1]}`;\n}\n\n// ── Convenience wrappers ───────────────────────────────────────────────────────\n\n/**\n * Like `formatDuration` but accepts seconds instead of minutes.\n * Values under 60 seconds are shown as \"less than a minute\" by default.\n */\nexport function formatDurationFromSeconds(\n totalSeconds: number,\n options?: FormatDurationOptions & { subMinuteLabel?: string },\n): string {\n const { subMinuteLabel = \"less than a minute\", ...rest } = options ?? {};\n const mins = Math.floor(totalSeconds / 60);\n if (mins < 1 && totalSeconds > 0) return subMinuteLabel;\n return formatDuration(mins, rest);\n}\n\n/**\n * Like `formatDuration` but accepts milliseconds instead of minutes.\n * Values under 60 000 ms are shown as \"less than a minute\" by default.\n */\nexport function formatDurationFromMs(\n totalMs: number,\n options?: FormatDurationOptions & { subMinuteLabel?: string },\n): string {\n return formatDurationFromSeconds(Math.floor(totalMs / 1000), options);\n}\n","/**\n * Byte / data-size formatting utilities.\n *\n * All functions that accept a unit parameter use `DataSizeUnit` which maps\n * directly to the `action_value_unit` field returned by the API.\n */\n\nexport type DataSizeUnit = \"B\" | \"KB\" | \"MB\" | \"GB\" | \"TB\";\n\n/** Maps common full names and abbreviations (any case) to a canonical DataSizeUnit. */\nconst UNIT_ALIASES: Record<string, DataSizeUnit> = {\n b: \"B\",\n byte: \"B\",\n bytes: \"B\",\n kb: \"KB\",\n kilobyte: \"KB\",\n kilobytes: \"KB\",\n mb: \"MB\",\n megabyte: \"MB\",\n megabytes: \"MB\",\n gb: \"GB\",\n gigabyte: \"GB\",\n gigabytes: \"GB\",\n tb: \"TB\",\n terabyte: \"TB\",\n terabytes: \"TB\",\n};\n\n/**\n * Normalize a raw unit string from the API (e.g. `\"bytes\"`, `\"MB\"`, `\"Gigabytes\"`)\n * to a canonical `DataSizeUnit`. Falls back to `'B'` for unknown values.\n */\nexport function normalizeDataSizeUnit(raw: string | undefined): DataSizeUnit {\n if (!raw) return \"B\";\n return UNIT_ALIASES[raw.trim().toLowerCase()] ?? \"B\";\n}\n\n/** Conversion factors relative to bytes. */\nconst BYTES_PER_UNIT: Record<DataSizeUnit, number> = {\n B: 1,\n KB: 1_024,\n MB: 1_048_576,\n GB: 1_073_741_824,\n TB: 1_099_511_627_776,\n};\n\n/** Ordered from largest to smallest — used when picking the best display unit. */\nconst DISPLAY_ORDER: DataSizeUnit[] = [\"TB\", \"GB\", \"MB\", \"KB\", \"B\"];\n\n/**\n * Convert a value from `fromUnit` to bytes.\n */\nfunction toBytes(value: number, fromUnit: DataSizeUnit): number {\n return value * BYTES_PER_UNIT[fromUnit];\n}\n\n/**\n * Pick the largest unit in which `referenceBytes` is >= 1.\n * Falls back to 'B' when the value is 0 or less.\n */\nexport function pickBestUnit(referenceBytes: number): DataSizeUnit {\n for (const unit of DISPLAY_ORDER) {\n if (referenceBytes >= BYTES_PER_UNIT[unit]) return unit;\n }\n return \"B\";\n}\n\n/**\n * Format a raw byte value using the given display unit, up to `decimals`\n * significant decimal places (trailing zeros are stripped).\n */\nexport function formatBytesAs(\n bytes: number,\n unit: DataSizeUnit,\n decimals = 2,\n): string {\n const converted = bytes / BYTES_PER_UNIT[unit];\n // Round to the requested precision then strip trailing zeros.\n const rounded = parseFloat(converted.toFixed(decimals));\n return `${rounded}`;\n}\n\n/**\n * Format `value` and `total` — both expressed in `inputUnit` — using the\n * same human-friendly display unit derived from `total`.\n *\n * @example\n * // total = 1.5 GB → picks GB\n * formatProgressBytes(0.45, 1.5, 'GB')\n * // → { valueLabel: '0.45', totalLabel: '1.5', unit: 'GB', line: '0.45 / 1.5 GB' }\n *\n * // total = 1_500_000_000 bytes → picks GB\n * formatProgressBytes(450_000_000, 1_500_000_000, 'B')\n * // → { valueLabel: '0.42', totalLabel: '1.4', unit: 'GB', line: '0.42 / 1.4 GB' }\n */\nexport function formatProgressBytes(\n value: number,\n total: number,\n inputUnit: DataSizeUnit = \"B\",\n decimals = 2,\n): {\n valueLabel: string;\n totalLabel: string;\n unit: DataSizeUnit;\n line: string;\n} {\n const totalBytes = toBytes(total, inputUnit);\n const unit = pickBestUnit(totalBytes);\n\n const valueLabel = formatBytesAs(toBytes(value, inputUnit), unit, decimals);\n const totalLabel = formatBytesAs(totalBytes, unit, decimals);\n\n return {\n valueLabel,\n totalLabel,\n unit,\n line: `${valueLabel} / ${totalLabel} ${unit}`,\n };\n}\n\n/**\n * Format a single byte value to the most appropriate unit, with up to\n * `decimals` decimal places.\n *\n * @example\n * formatBytes(1_500_000) // \"1.43 MB\"\n * formatBytes(2_684_354_560) // \"2.5 GB\"\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes <= 0) return `0 B`;\n const unit = pickBestUnit(bytes);\n return `${formatBytesAs(bytes, unit, decimals)} ${unit}`;\n}\n","export interface DependencyCondition {\n field_name: string;\n field_value: string;\n operator: string;\n condition?: \"and\" | \"or\";\n}\n\nexport interface FileUploadData {\n files: File | File[];\n names: string;\n count: number;\n}\n\nexport interface FormData {\n [key: string]:\n | string\n | boolean\n | Array<{ key: string; value: string }>\n | string[]\n | FileUploadData;\n}\n\n/**\n * Evaluates if a field should be visible based on its dependencies\n * @param fieldName - The name of the field being evaluated\n * @param dependencies - Array of dependency conditions\n * @param formData - Current form data\n * @returns boolean indicating if the field should be visible\n */\nexport function evaluateFieldVisibility(\n _fieldName: string,\n dependencies: DependencyCondition[],\n formData: FormData,\n): boolean {\n if (!dependencies || dependencies.length === 0) {\n return true; // No dependencies = always visible\n }\n\n // console.info(`🔍 Evaluating visibility for field: ${fieldName}`);\n // console.info(`📋 Dependencies:`, dependencies);\n\n // Group dependencies by condition (and/or)\n const andDependencies: DependencyCondition[] = [];\n const orDependencies: DependencyCondition[] = [];\n\n dependencies.forEach((dep, index) => {\n if (index === 0 || dep.condition === \"and\") {\n andDependencies.push(dep);\n } else if (dep.condition === \"or\") {\n orDependencies.push(dep);\n }\n });\n\n // console.info(`🔗 AND dependencies:`, andDependencies);\n // console.info(`🔗 OR dependencies:`, orDependencies);\n\n // Evaluate AND dependencies first\n let andResult = true;\n if (andDependencies.length > 0) {\n andResult = andDependencies.every((dep) =>\n evaluateSingleDependency(dep, formData),\n );\n // console.info(`✅ AND dependencies result: ${andResult}`);\n }\n\n // Evaluate OR dependencies\n let orResult = false;\n if (orDependencies.length > 0) {\n orResult = orDependencies.some((dep) =>\n evaluateSingleDependency(dep, formData),\n );\n // console.info(`✅ OR dependencies result: ${orResult}`);\n }\n\n // Combine results: if there are OR dependencies, use OR logic; otherwise use AND result\n const finalResult =\n orDependencies.length > 0 ? andResult && orResult : andResult;\n\n // console.info(`🎯 Final visibility result for ${fieldName}: ${finalResult}`);\n return finalResult;\n}\n\n/**\n * Evaluates a single dependency condition\n * @param dependency - The dependency condition to evaluate\n * @param formData - Current form data\n * @returns boolean indicating if the condition is met\n */\nfunction evaluateSingleDependency(\n dependency: DependencyCondition,\n formData: FormData,\n): boolean {\n const { field_name, field_value, operator } = dependency;\n const actualField = formData[field_name];\n\n // console.info(`🔍 Evaluating dependency: ${field_name} ${operator} ${field_value}`);\n // console.info(`📊 Actual value: ${JSON.stringify(actualField)} (type: ${typeof actualField})`);\n\n // Handle file upload data - use the names property for evaluation\n let actualValue = actualField;\n if (\n actualField &&\n typeof actualField === \"object\" &&\n \"names\" in actualField\n ) {\n actualValue = actualField.names;\n }\n\n let isArray = false;\n if (Array.isArray(actualValue)) {\n isArray = true;\n }\n let isString = false;\n if (typeof actualValue === \"string\") {\n isString = true;\n }\n\n // Convert actual value to string for comparison\n const safeActualValue = actualValue || \"\";\n const actualValueStr =\n typeof safeActualValue === \"object\"\n ? JSON.stringify(safeActualValue)\n : String(safeActualValue);\n\n const safeFieldValue = field_value || \"\";\n const expectedValueStr =\n typeof safeFieldValue === \"object\"\n ? JSON.stringify(safeFieldValue)\n : String(safeFieldValue);\n\n // console.info(`🔍 Actual value: ${actualValueStr} (type: ${typeof actualValueStr})`);\n // console.info(`🔍 Expected value: ${expectedValueStr} (type: ${typeof expectedValueStr})`);\n\n let result = false;\n\n switch (operator) {\n case \"eq\":\n if (isString) {\n result =\n actualValueStr.toLowerCase() === expectedValueStr.toLowerCase();\n } else {\n result = actualValueStr === expectedValueStr;\n }\n break;\n case \"nq\":\n if (isString) {\n result =\n actualValueStr.toLowerCase() !== expectedValueStr.toLowerCase();\n } else {\n result = actualValueStr !== expectedValueStr;\n }\n break;\n case \"gt\":\n if (isArray) {\n result =\n (actualValue as Array<{ key: string; value: string }>).length >\n parseInt(expectedValueStr);\n } else if (\n actualField &&\n typeof actualField === \"object\" &&\n \"count\" in actualField\n ) {\n result = actualField.count > parseInt(expectedValueStr);\n } else {\n result = parseFloat(actualValueStr) > parseFloat(expectedValueStr);\n }\n break;\n case \"lt\":\n if (isArray) {\n result =\n (actualValue as Array<{ key: string; value: string }>).length <\n parseInt(expectedValueStr);\n } else if (\n actualField &&\n typeof actualField === \"object\" &&\n \"count\" in actualField\n ) {\n result = actualField.count < parseInt(expectedValueStr);\n } else {\n result = parseFloat(actualValueStr) < parseFloat(expectedValueStr);\n }\n break;\n case \"gte\":\n if (isArray) {\n result =\n (actualValue as Array<{ key: string; value: string }>).length >=\n parseInt(expectedValueStr);\n } else if (\n actualField &&\n typeof actualField === \"object\" &&\n \"count\" in actualField\n ) {\n result = actualField.count >= parseInt(expectedValueStr);\n } else {\n result = parseFloat(actualValueStr) >= parseFloat(expectedValueStr);\n }\n break;\n case \"lte\":\n if (isArray) {\n result =\n (actualValue as Array<{ key: string; value: string }>).length <=\n parseInt(expectedValueStr);\n } else if (\n actualField &&\n typeof actualField === \"object\" &&\n \"count\" in actualField\n ) {\n result = actualField.count <= parseInt(expectedValueStr);\n } else {\n result = parseFloat(actualValueStr) <= parseFloat(expectedValueStr);\n }\n break;\n case \"contains\":\n if (isArray) {\n result = (actualValue as Array<{ key: string; value: string }>).some(\n (item) =>\n item.value.toLowerCase().includes(expectedValueStr.toLowerCase()),\n );\n } else {\n if (isString) {\n result = actualValueStr\n .toLowerCase()\n .includes(expectedValueStr.toLowerCase());\n } else {\n result = actualValueStr.includes(expectedValueStr);\n }\n }\n break;\n case \"starts_with\":\n if (isArray) {\n result = (actualValue as Array<{ key: string; value: string }>).some(\n (item) =>\n item.value.toLowerCase().startsWith(expectedValueStr.toLowerCase()),\n );\n } else {\n if (isString) {\n result = actualValueStr\n .toLowerCase()\n .startsWith(expectedValueStr.toLowerCase());\n } else {\n result = actualValueStr.startsWith(expectedValueStr);\n }\n }\n break;\n case \"empty\":\n if (isArray) {\n result =\n (actualValue as Array<{ key: string; value: string }>).length === 0;\n } else if (\n actualField &&\n typeof actualField === \"object\" &&\n \"count\" in actualField\n ) {\n result = actualField.count === 0;\n } else {\n if (isString) {\n result = actualValueStr.trim() === \"\";\n } else {\n result = actualValueStr.trim() === \"\";\n }\n }\n break;\n case \"not_empty\":\n if (isArray) {\n result =\n (actualValue as Array<{ key: string; value: string }>).length > 0;\n } else if (\n actualField &&\n typeof actualField === \"object\" &&\n \"count\" in actualField\n ) {\n result = actualField.count > 0;\n } else {\n if (isString) {\n result = actualValueStr.trim() !== \"\";\n } else {\n result = actualValueStr.trim() !== \"\";\n }\n }\n break;\n default:\n console.warn(`⚠️ Unknown operator: ${operator}`);\n result = false;\n }\n\n // console.info(`✅ Dependency result: ${result} (${field_name} ${operator} ${field_value})`);\n return result;\n}\n\n/**\n * Evaluates visibility for all fields in a form\n * @param parameters - Array of parameters with dependencies\n * @param formData - Current form data\n * @returns Object mapping field names to visibility states\n */\nexport function evaluateAllFieldVisibility(\n parameters: Array<{ key: string; dependencies?: DependencyCondition[] }>,\n formData: FormData,\n): Record<string, boolean> {\n const visibilityMap: Record<string, boolean> = {};\n\n parameters.forEach((param) => {\n visibilityMap[param.key] = evaluateFieldVisibility(\n param.key,\n param.dependencies || [],\n formData,\n );\n });\n\n return visibilityMap;\n}\n","// crypto-js types are available in react/node_modules/@types/crypto-js/\n// but not resolvable from the shared common/ directory. We declare the\n// minimal shape we need to avoid the TS2307 module resolution error.\ndeclare const CryptoJS: {\n MD5(message: string): { toString(): string };\n};\n\n/**\n * Returns a Gravatar URL for the given email.\n *\n * @param email - The user's email address.\n * @param size - Image size in pixels (default 200).\n * @param defaultImage - Gravatar fallback when no image exists.\n * Common values: `'404'` (return HTTP 404), `'mp'` (mystery-person silhouette),\n * `'identicon'` (geometric pattern), `'retro'` (8-bit style).\n * Defaults to `'mp'` so a valid image is always returned.\n */\nexport const getGravatarUrl = (\n email: string,\n size: number = 200,\n defaultImage: string = \"mp\",\n): string => {\n const trimmedEmail = email.trim().toLowerCase();\n const hash = CryptoJS.MD5(trimmedEmail).toString();\n return `https://www.gravatar.com/avatar/${hash}?s=${size}&d=${defaultImage}`;\n};\n","import { Toast } from \"../types/Toast\";\n\nexport function getToastTimestamp(toast: Toast): number {\n return toast._updateTimestamp || Date.now();\n}\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport { Progress, SpinnerColor } from \"./index\";\n\nexport interface MetricBarProps extends React.HTMLAttributes<HTMLDivElement> {\n label: string;\n value: string;\n percentage: number;\n color?: SpinnerColor;\n showShimmer?: boolean;\n}\n\nexport const MetricBar: React.FC<MetricBarProps> = ({\n label,\n value,\n percentage,\n color = \"blue\",\n showShimmer = false,\n className,\n ...rest\n}) => {\n return (\n <div\n className={classNames(\"flex flex-col gap-1.5 w-full\", className)}\n {...rest}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400\">\n {label}\n </span>\n <span className=\"text-xs text-neutral-600 dark:text-neutral-300\">\n {value}\n </span>\n </div>\n <Progress\n value={percentage}\n size=\"sm\"\n color={color}\n showShimmer={showShimmer}\n />\n </div>\n );\n};\n\nMetricBar.displayName = \"MetricBar\";\nexport default MetricBar;\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAOC;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC5aO,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB,IAAI,WAAsC;AACxE,QAAM,SAAmB,CAAC;AAE1B,QAAM,WAAW,CAAC,UAAkB;AAClC,QAAI,gBAAgB,KAAK,KAAK,GAAG;AAC/B,eAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC9C,YAAI,gBAAgB,KAAK,OAAO,CAAC,CAAC,GAAG;AACnC,iBAAO,OAAO,GAAG,CAAC;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,KAAK,KAAK,GAAG;AAChC,eAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC9C,YAAI,iBAAiB,KAAK,OAAO,CAAC,CAAC,GAAG;AACpC,iBAAO,OAAO,GAAG,CAAC;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SACG,OAAO,OAAO,EACd,QAAQ,CAAC,UAAU,MAAO,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE,QAAQ,QAAQ,CAAC;AAE3E,SAAO,OAAO,KAAK,GAAG;AACxB;AAEO,IAAM,kBAAkB,CAAC,UAC9B,QAAQ,KAAK,KAAK,2BAA2B,KAAK,KAAe;;;A9IuD7D,IAAAC,wBAAA;AA7DN,IAAM,iBAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA,MAAM;AAAA,EACN,aAAa;AAAA,EACb,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AACF,MAAM;AACJ,QAAM,gBAAgB,aAAa,IAAI;AAEvC,QAAM,gBAAY,yBAAQ,MAAM;AAC9B,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO,GAAG,UAAU;AAAA,IACtB;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,gBAAY,yBAAQ,MAAM;AAC9B,UAAM,QAA6B,CAAC;AACpC,QAAI,WAAW;AACb,YAAM,QAAQ;AACd,YAAM,SAAS;AAAA,IACjB;AACA,QAAI,SAAS,CAAC,SAAS;AACrB,MAAC,MAAiC,cAAc,IAAI;AAAA,IACtD;AACA,QAAI,cAAc,CAAC,SAAS;AAC1B,MAAC,MAAiC,oBAAoB,IAAI;AAAA,IAC5D;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,OAAO,YAAY,OAAO,CAAC;AAE1C,QAAM,oBACJ,CAAC,aAAa,CAAC,gBAAgB,SAAS,IACpC,eAAe,IAAI,IACnB;AAEN,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,CAAC,UAAU,iBAAiB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,eAAe;AAClB,YAAQ,KAAK,+BAA+B,IAAI,EAAE;AAClD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,kJAAkJ,SAAS;AAAA,QACtK,OAAO;AAAA,QACP;AAAA,QAEC,gBAAM,OAAO,CAAC,KAAK;AAAA;AAAA,IACtB;AAAA,EAEJ;AAEA,SACE,+CAAC,UAAK,WAAW,WAAW,OAAO,WAAW,SAC5C,yDAAC,iBAAc,WAAU,iBAAgB,cAAY,KAAK,GAC5D;AAEJ;AAEA,IAAO,qBAAQ;;;ADMT,IAAAC,wBAAA;AArEN,IAAM,eAA0C;AAAA,EAC9C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AAIA,IAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,kBAAoD;AAAA,EACxD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,aAA0C;AAAA,EAC9C,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAIA,IAAM,OAA4B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,aAAa,eAAe,YAAY,eAAe;AAC7D,QAAM,eAAe,eAAe,cAAc,eAAe;AAEjE,QAAM,WAAW,OACf,OAAO,SAAS,WACd,+CAAC,cAAW,MAAwB,WAAU,sBAAqB,IAEnE,OAEA;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,aAAa,IAAI;AAAA,QACjB,WAAW,OAAO;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAGH;AAAA,sBACC,kFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAID,gBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACd;AAAA,QAID,YACC,+CAAC,SAAI,WAAU,4IACZ,oBACH;AAAA,QAIF,gDAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,aAAa,SAAS;AAAA,cACxB;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACC,YACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,gBAAgB,YAAY;AAAA,cAC9B;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,eAAQ;;;AgJ5JJ,IAAAC,wBAAA;AApBX,IAAM,cAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACF,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AAEnC,MAAI,CAAC,QAAQ;AACX,WAAO,iFAAG,UAAAA,YAAW,QAAQ,IAAI,GAAE;AAAA,EACrC;AAEA,MAAI,OAAO,YAAY,EAAE,SAAS,wBAAwB,GAAG;AAC3D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,CAAC,OAAO,YAAY,EAAE,SAAS,4BAA4B,GAAG;AAChE,WAAO,iFAAG,UAAAA,YAAW,QAAQ,IAAI,GAAE;AAAA,EACrC;AAEA,QAAM,aAAa,KAAK,OAAO,QAAQ,iCAAiC,EAAE,CAAC;AAE3E,QAAM,YAAY,WACf,QAAQ,eAAe,SAAS,QAAQ,cAAc,GAAG,EACzD,QAAQ,iBAAiB,WAAW,UAAU,cAAc,GAAG;AAElE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,0JAA0J,YAAY,IAAI,CAAC,IAAI,aAAa,EAAE;AAAA,MACzM;AAAA,MACA;AAAA,MACA,yBAAyB,EAAE,QAAQ,UAAU;AAAA;AAAA,EAC/C;AAEJ;AAEA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;;;ACtEf,IAAAC,kBAA4D;AAC5D,IAAAC,sBAAuB;;;ACDvB,IAAAC,kBAOO;AACP,IAAAC,oBAA6B;AAC7B,IAAAC,sBAAuB;AA8XP,IAAAC,wBAAA;AApWhB,IAAM,cAAc,OAAO,aAAa,cAAc,SAAS,OAAO;AAWtE,IAAM,iBAAiB,OAAmB;AAAA,EACxC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO,OAAO;AAAA,EACd,QAAQ,OAAO;AAAA,EACf,OAAO,OAAO;AAAA,EACd,QAAQ,OAAO;AACjB;AAEA,IAAM,mBAAmB,CAAC,YAAkC;AAC1D,QAAM,QAAQ,OAAO,iBAAiB,OAAO;AAC7C,QAAM,SAAS,CAAC,MAAM,UAAU,MAAM,WAAW,MAAM,SAAS,EAAE,KAAK,GAAG;AAC1E,SAAO,4BAA4B,KAAK,MAAM;AAChD;AAEA,IAAM,wBAAwB,CAAC,WAAoC;AACjE,MAAI,OAA2B,OAAO;AAEtC,SAAO,QAAQ,SAAS,SAAS,MAAM;AACrC,QAAI,iBAAiB,IAAI,GAAG;AAC1B,YAAM,OAAO,KAAK,sBAAsB;AACxC,aAAO;AAAA,QACL,KAAK,KAAK;AAAA,QACV,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,eAAe;AACxB;AAEA,IAAM,2BAA2B,CAAC,WAAgC;AAChE,MAAI,OAA2B;AAC/B,MAAI,UAAyB;AAE7B,SAAO,QAAQ,SAAS,SAAS,MAAM;AACrC,UAAM,SAAS,OAAO,iBAAiB,IAAI,EAAE;AAC7C,QAAI,UAAU,WAAW,QAAQ;AAC/B,YAAM,SAAS,OAAO,MAAM;AAC5B,UAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,kBAAU,YAAY,OAAO,SAAS,KAAK,IAAI,SAAS,MAAM;AAAA,MAChE;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,OAAO,WAAW;AACxB,SAAO,KAAK,IAAI,GAAG,OAAO,CAAC;AAC7B;AAEO,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,cAAU,wBAAuB,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAA8B;AACxD,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,0BAAiB,SAAS;AAE5E,QAAM,mBAAe;AAAA,IACnB,CAAC,SAA6B;AAC5B,UAAI,KAAK,UAAU;AACjB;AAAA,MACF;AACA,iBAAW,IAAI;AACf,cAAQ;AAAA,IACV;AAAA,IACA,CAAC,SAAS,QAAQ;AAAA,EACpB;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,gBAAgB,CAAC,UAAsB;AAC3C,UACE,QAAQ,SAAS,SAAS,MAAM,MAAc,KAC9C,UAAU,SAAS,SAAS,MAAM,MAAc,GAChD;AACA;AAAA,MACF;AACA,cAAQ;AAAA,IACV;AAEA,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,UAAU;AAC1B,cAAM,gBAAgB;AACtB,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,aAAS,iBAAiB,eAAe,aAAa;AACtD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,aAAa;AACzD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,SAAS,CAAC;AAE7B,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,eAAS,MAAS;AAClB,2BAAqB,SAAS;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,WAAW,IAAI,CAAC;AAEpB,QAAM,qBAAiB,6BAAY,MAAM;AACvC,QAAI,CAAC,QAAQ,CAAC,UAAU,WAAW,CAAC,QAAQ,SAAS;AACnD;AAAA,IACF;AAEA,UAAM,aAAa,UAAU,QAAQ,sBAAsB;AAC3D,UAAM,eAAe,UAAU,QAAQ;AAAA,MACrC;AAAA,IACF;AACA,UAAM,qBACJ,cAAc,sBAAsB,KAAK;AAC3C,UAAM,WAAW,QAAQ,QAAQ,sBAAsB;AACvD,UAAM,WAAW,sBAAsB,UAAU,OAAO;AACxD,UAAM,SAAS,yBAAyB,UAAU,OAAO;AACzD,UAAM,SAAS;AACf,UAAM,YAAY;AAElB,UAAM,kBAAkB,KAAK,IAAI,KAAK,SAAS,QAAQ,YAAY,CAAC;AACpE,UAAM,iBACJ,OAAO,UAAU,WACb,QACA,UAAU,YACR,KAAK,IAAI,WAAW,OAAO,SAAS,KAAK,IACzC,SAAS;AACjB,UAAM,gBAAgB,KAAK,IAAI,gBAAgB,eAAe;AAC9D,UAAM,iBAAiB,SAAS;AAEhC,UAAM,WAAW,WAAW,SAAS;AACrC,UAAM,WAAW,WAAW,MAAM,SAAS;AAE3C,UAAM,iBAAiB,CAAC,QAAwB;AAC9C,YAAM,cAAc,KAAK,IAAI,GAAG,SAAS,MAAM,YAAY,GAAG;AAC9D,YAAM,iBAAiB,KAAK;AAAA,QAC1B;AAAA,QACA,MAAM,kBAAkB,SAAS,SAAS;AAAA,MAC5C;AACA,aAAO,cAAc;AAAA,IACvB;AAEA,UAAM,YAAY,MAA2C;AAC3D,UAAI,SAAS,MAAO,QAAO,EAAE,KAAK,UAAU,WAAW,KAAK;AAC5D,UAAI,SAAS,SAAU,QAAO,EAAE,KAAK,UAAU,WAAW,MAAM;AAEhE,YAAM,gBAAgB,eAAe,QAAQ;AAC7C,YAAM,gBAAgB,eAAe,QAAQ;AAC7C,UAAI,gBAAgB;AAClB,eAAO,EAAE,KAAK,UAAU,WAAW,KAAK;AAC1C,aAAO,EAAE,KAAK,UAAU,WAAW,MAAM;AAAA,IAC3C;AAEA,UAAM,iBAAiB,UAAU;AACjC,UAAM,aAAa,KAAK;AAAA,MACtB,KAAK,IAAI,eAAe,KAAK,SAAS,MAAM,SAAS;AAAA,MACrD,KAAK;AAAA,QACH,SAAS,MAAM;AAAA,QACf,SAAS,SAAS,iBAAiB;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK;AAAA,MAC1B;AAAA,MACA,SAAS,SAAS,YAAY;AAAA,IAChC;AACA,UAAM,iBAAiB,KAAK;AAAA,MAC1B;AAAA,MACA,WAAW,MAAM,UAAU,SAAS,MAAM;AAAA,IAC5C;AACA,UAAM,gBAAgB,KAAK;AAAA,MACzB;AAAA,MACA,KAAK;AAAA,QACH;AAAA,QACA,eAAe,YAAY,iBAAiB;AAAA,MAC9C;AAAA,IACF;AAEA,UAAM,YAAY,mBAAmB;AACrC,UAAM,UAAU,mBAAmB,QAAQ;AAC3C,UAAM,kBAAkB,CAAC,SAAyB;AAChD,YAAM,eAAe,KAAK,IAAI,GAAG,SAAS,OAAO,YAAY,IAAI;AACjE,YAAM,gBAAgB,KAAK;AAAA,QACzB;AAAA,QACA,OAAO,iBAAiB,SAAS,QAAQ;AAAA,MAC3C;AACA,aAAO,eAAe;AAAA,IACxB;AAEA,UAAM,gBAAgB,UAAU,UAAU,YAAY;AACtD,UAAM,gBAAgB,UAAU,UAAU,UAAU;AACpD,UAAM,gBACJ,gBAAgB,aAAa,KAAK,gBAAgB,aAAa,IAC3D,gBACA;AACN,UAAM,cAAc,KAAK;AAAA,MACvB,KAAK,IAAI,eAAe,SAAS,OAAO,SAAS;AAAA,MACjD,KAAK;AAAA,QACH,SAAS,OAAO;AAAA,QAChB,SAAS,QAAQ,gBAAgB;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,YAAiC;AAAA,MACrC,KAAK,GAAG,UAAU;AAAA,MAClB,MAAM,GAAG,WAAW;AAAA,MACpB,UAAU,GAAG,eAAe;AAAA,MAC5B;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B,gBAAU,QAAQ;AAAA,IACpB,WAAW,UAAU,WAAW;AAC9B,gBAAU,WAAW;AAAA,IACvB;AAEA,yBAAqB,aAAa;AAClC,aAAS,CAAC,SAAS;AACjB,YAAM,UAAU,OAAO,MAAM,QAAQ,WAAW,KAAK,MAAM;AAC3D,YAAM,WAAW,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC9D,YAAM,YACJ,OAAO,MAAM,UAAU,WAAW,KAAK,QAAQ;AACjD,YAAM,eACJ,OAAO,MAAM,aAAa,WAAW,KAAK,WAAW;AACvD,YAAM,eACJ,OAAO,MAAM,aAAa,WAAW,KAAK,WAAW;AACvD,YAAM,aACJ,OAAO,MAAM,WAAW,WAAW,KAAK,SAAS;AAEnD,UACE,YAAY,UAAU,OACtB,aAAa,UAAU,QACvB,cAAc,UAAU,SACxB,iBAAiB,UAAU,YAC3B,iBAAiB,UAAU,YAC3B,eAAe,UAAU,QACzB;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,WAAW,WAAW,MAAM,MAAM,KAAK,CAAC;AAEnD,uCAAgB,MAAM;AACpB,mBAAe;AAAA,EACjB,GAAG,CAAC,cAAc,CAAC;AAEnB,iCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAEX,QAAI,QAAQ;AACZ,UAAM,iBAAiB,MAAM;AAC3B,UAAI,MAAO,sBAAqB,KAAK;AACrC,cAAQ,sBAAsB,MAAM;AAClC,uBAAe;AACf,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,MAAM,eAAe;AAC1C,UAAM,eAAe,MAAM,eAAe;AAE1C,WAAO,iBAAiB,UAAU,YAAY;AAC9C,WAAO,iBAAiB,UAAU,cAAc,IAAI;AAEpD,UAAM,iBACJ,OAAO,mBAAmB,cACtB,IAAI,eAAe,MAAM,eAAe,CAAC,IACzC;AAEN,QAAI,gBAAgB;AAClB,UAAI,UAAU,QAAS,gBAAe,QAAQ,UAAU,OAAO;AAC/D,UAAI,QAAQ,QAAS,gBAAe,QAAQ,QAAQ,OAAO;AAAA,IAC7D;AAEA,mBAAe;AAEf,WAAO,MAAM;AACX,UAAI,MAAO,sBAAqB,KAAK;AACrC,aAAO,oBAAoB,UAAU,YAAY;AACjD,aAAO,oBAAoB,UAAU,cAAc,IAAI;AACvD,sBAAgB,WAAW;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,WAAW,MAAM,cAAc,CAAC;AAEpC,MAAI,CAAC,QAAQ,CAAC,aAAa;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,EAAE,YAAY,SAAS;AAEtD,aAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAK;AAAA,QACL,eAAW,oBAAAC;AAAA,UACT;AAAA,UACA,CAAC,SAAS;AAAA,UACV;AAAA,QACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,WAAW,kBAAkB;AAAA,YACtC,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,YAEzC,gBAAM,IAAI,CAAC,SACV,+CAAC,QACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,UAAU,KAAK;AAAA,gBACf,SAAS,CAAC,UAAU;AAClB,wBAAM,gBAAgB;AACtB,+BAAa,IAAI;AAAA,gBACnB;AAAA,gBACA,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,KAAK,WACD,kCACA,KAAK,SACH,gFACA;AAAA,kBACN;AAAA,gBACF;AAAA,gBAEC;AAAA,uBAAK,QACJ,+CAAC,UAAK,WAAU,0FACb,iBAAO,KAAK,SAAS,WAClBD,YAAW,KAAK,MAAM,IAAI,IAC1B,KAAK,MACX;AAAA,kBAEF,gDAAC,UAAK,WAAU,gCACd;AAAA,mEAAC,UAAK,WAAU,+DACb,eAAK,OACR;AAAA,oBACC,KAAK,eACJ,+CAAC,UAAK,WAAU,kDACb,eAAK,aACR;AAAA,qBAEJ;AAAA;AAAA;AAAA,YACF,KApCO,KAAK,KAqCd,CACD;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,aAAa,cAAc;AAE3B,IAAO,uBAAQ;;;AD5TX,IAAAE,wBAAA;AAxEG,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,+BAA+B;AAAA,EAC/B,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,QAAI,0BAAS,KAAK;AACtC,QAAM,eAAW,wBAA0B,IAAI;AAC/C,QAAM,gBAAY,wBAAuB,IAAI;AAC7C,QAAM,uBAAmB,oBAAAC;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,WAAiC;AACrD,qBAAiB,MAAM;AACvB,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,EAAE,SAAS,aAAa,GAAG,gBAAgB,IAAI;AAErD,QAAM,qBAAqB,CAAC,UAA+C;AACzE,kBAAc,KAAK;AACnB,qBAAiB,KAAK;AAAA,EACxB;AAEA,QAAM,oBAAoB,CAAC,UAA+C;AACxE,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,YAAQ,CAAC,SAAS,CAAC,IAAI;AAAA,EACzB;AAEA,QAAM,kBAAc,yBAAQ,MAAM,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1D,QAAM,aAAa,YAAY,SAAS;AACxC,QAAM,YAAY,cAAc,CAAC;AAEjC,iCAAU,MAAM;AACd,QAAI,CAAC,cAAc,MAAM;AACvB,cAAQ,KAAK;AAAA,IACf;AAAA,EACF,GAAG,CAAC,YAAY,IAAI,CAAC;AAErB,QAAM,gBAA4C;AAAA,IAChD,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAEA,QAAM,oBAAgD;AAAA,IACpD,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAEA,QAAM,oBAAoB,MACxB;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAQ;AAAA,MACR,cAAW;AAAA,MACX,aAAa;AAAA,MACb,uBAAmB;AAAA,MACnB,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,SAAS,cAAc,IAAI;AAAA,QAC3B,kBAAkB,IAAI;AAAA,MACxB;AAAA,MACA,SAAS;AAAA,MACT,UAAU,YAAY,QAAQ,WAAW;AAAA;AAAA,EAC3C;AAGF,QAAM,aACJ;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAW,oBAAAA;AAAA,QACT,SAAS,aAAa;AAAA,QACtB,YAAY,WAAW;AAAA,MACzB;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACR,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAGF,SACE,gDAAC,SAAI,KAAK,WAAW,WAAW,kBAC7B;AAAA;AAAA,IACA,YAAY,kBAAkB,IAAI;AAAA,IACnC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,QAAQ,cAAc;AAAA,QAC5B,SAAS,MAAM,QAAQ,KAAK;AAAA,QAC5B,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAM;AAAA,QACN,MAAK;AAAA,QACL,WAAW;AAAA;AAAA,IACb;AAAA,KACF;AAEJ;AAEA,eAAe,cAAc;AAE7B,IAAO,yBAAQ;;;AEjKf,IAAAC,kBAAwC;AACxC,IAAAC,oBAA6B;AAC7B,IAAAC,sBAAuB;AA4BH,IAAAC,wBAAA;AAZpB,IAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAW,wBAA6C,IAAI;AAClE,QAAM,iBAAa,wBAAuB,IAAI;AAC9C,QAAM,CAAC,SAAS,UAAU,QAAI,0BAAS,KAAK;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAA0C,IAAI;AAE1E,MAAI,CAAC,KAAM,QAAO,iFAAG,UAAS;AAE9B,QAAM,OAAO,MAAM;AACjB,aAAS,UAAU,WAAW,MAAM;AAClC,UAAI,WAAW,SAAS;AACtB,cAAM,OAAO,WAAW,QAAQ,sBAAsB;AACtD,kBAAU;AAAA,UACR,GAAG,KAAK,OAAO,KAAK,QAAQ;AAAA,UAC5B,GAAG,aAAa,QAAQ,KAAK,MAAM,KAAK;AAAA,QAC1C,CAAC;AAAA,MACH;AACA,iBAAW,IAAI;AAAA,IACjB,GAAG,KAAK;AAAA,EACV;AAEA,QAAM,OAAO,MAAM;AACjB,QAAI,SAAS,SAAS;AACpB,mBAAa,SAAS,OAAO;AAC7B,eAAS,UAAU;AAAA,IACrB;AACA,eAAW,KAAK;AAChB,cAAU,IAAI;AAAA,EAChB;AAEA,QAAM,QAAQ,aAAa;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAC,SAAW,wBAAwB,gBAAgB;AAAA,MAC9D,cAAc;AAAA,MACd,cAAc;AAAA,MAEb;AAAA;AAAA,QACA,WACC,cACA;AAAA,UACE;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAM,OAAO;AAAA,gBACb,KAAK,OAAO;AAAA,gBACZ,WAAW,QACP,uCACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,gBAED;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,QACI,4DACA;AAAA,oBACN;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA;AAAA;AAAA,EACJ;AAEJ;AAEA,IAAO,kBAAQ;;;AC/Ff,IAAAC,sBAAuB;AACvB,IAAAC,kBAIO;AAiQI,IAAAC,wBAAA;AAzPX,IAAMC,cAWF;AAAA,EACF,IAAI;AAAA,IACF,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;AAUA,IAAM,aAA0D;AAAA,EAC9D,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WACE;AAAA,IACF,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EAAI,MAAM;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AAAE;AAEJ,IAAM,gBAAwE;AAAA,EAC5E,OACE;AAAA,EACF,SACE;AACJ;AAEA,IAAM,wBAGF;AAAA,EACF,OAAO;AAAA,EACP,SAAS;AACX;AAEA,IAAM,kBACJ;AAYF,IAAM,gBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,UACE;AAAA,EACF,OACE;AAAA,EACF,WACE;AACJ;AAoBA,IAAM,YAAQ,4BAAyC,SAASC,OAC9D;AAAA,EACE,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,aAAa;AAAA,EACb,GAAG;AACL,GACA,KACA;AACA,QAAMC,cAAa,gBAAgB;AACnC,QAAM,YAAYF,YAAW,IAAI,KAAKA,YAAW;AACjD,QAAM,SAAU,WAAW,IAAI,KAAK,WAAW;AAC/C,QAAM,iBAAiB,QAAQ,WAAW;AAC1C,QAAM,kBAAkB,QAAQ,YAAY;AAC5C,QAAM,aAAa;AAEnB,QAAM,eAAe,CAAC,QAAsB,kBAA0B;AACpE,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAOE,YAAW,QAAQ,QAAW,aAAa;AAAA,IACpD;AACA,QAAI,gBAAAC,QAAM,eAAuC,MAAM,GAAG;AACxD,aAAO,gBAAAA,QAAM,aAAa,QAAQ;AAAA,QAChC,eAAW,oBAAAC,SAAW,eAAe,OAAO,MAAM,SAAS;AAAA,MAC7D,CAAC;AAAA,IACH;AACA,WAAO,+CAAC,UAAK,WAAW,eAAgB,kBAAO;AAAA,EACjD;AAEA,QAAM,uBAAmB,oBAAAA;AAAA,IACvB;AAAA,IACA,UAAU;AAAA,IACV,CAAC,cAAc,cAAc,OAAO;AAAA,IACpC;AAAA,IACA,kBAAkB,UAAU;AAAA,IAC5B,mBAAmB,UAAU;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,kBAAkB,iBACpB,oBAAAA;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,kBAAkB,UAAU;AAAA,IAC5B,mBAAmB,UAAU;AAAA,EAC/B,IACA;AAEJ,QAAM,cACJ,qBAAqB,SACjB,aACE,sBAAsB,gBAAgB,IACtC,cAAc,gBAAgB,IAChC;AAEN,QAAM,yBAAqB,oBAAAA;AAAA,IACzB,aAAa,kBAAkB;AAAA,IAC/B,CAAC,eACE,YAAY,cAAc,OAAO,cAAc,OAAO;AAAA,IACzD,cAAc;AAAA,EAChB;AAEA,QAAM,oBAAoB,CACxB,QACA,UACA,YACG;AACH,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,UAAM,gBACJ,aAAa,SAAS,UAAU,WAAW,UAAU;AACvD,QAAI,SAAS;AACX,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV;AAAA,UACA,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,OAAO;AAAA,YACP,qBAAqB,WAAW;AAAA,YAChC,qBAAqB,aACnB;AAAA,YACF;AAAA,UACF;AAAA,UAEC,uBAAa,QAAQ,UAAU,QAAQ;AAAA;AAAA,MAC1C;AAAA,IAEJ;AACA,UAAM,oBAAgB,oBAAAA;AAAA,MACpB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,MACP,qBAAqB,WAAW;AAAA,MAChC,qBAAqB,aACnB;AAAA,IACJ;AACA,WACE,+CAAC,UAAK,WAAW,eACd,uBAAa,QAAQ,UAAU,QAAQ,GAC1C;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MAEC;AAAA,uBAAe,kBAAkB,aAAa,MAAM;AAAA,QACrD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,eAAW,oBAAAA,SAAW,oBAAoB,WAAW;AAAA,YACrD;AAAA,YACA,gBACE,qBAAqB,UAAU,SAAS,KAAK,cAAc;AAAA,YAE5D,GAAG;AAAA;AAAA,QACN;AAAA,QACC,gBACC,kBAAkB,cAAc,SAAS,mBAAmB;AAAA;AAAA;AAAA,EAChE;AAEJ,CAAC;AAED,MAAM,cAAc;AAEnB,MAA8C,aAAa;AAI5D,IAAO,gBAAQ;;;ACxXf,IAAAC,kBAAwD;AAqB5C,IAAAC,wBAAA;AAXZ,IAAM,oBAAgB;AAAA,EACpB,SAASC,eAAc,OAAO,KAAqC;AACjE,UAAM,CAAC,cAAc,eAAe,QAAI,0BAAS,KAAK;AAEtD,WACE;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA,MAAM,eAAe,SAAS;AAAA,QAC9B,cACE,eACE,+CAAC,aAAU,WAAU,WAAU,IAE/B,+CAAC,WAAQ,WAAU,WAAU;AAAA,QAGjC,qBAAqB,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAAA;AAAA,IACtD;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;AAE5B,IAAO,wBAAQ;;;AClCf,IAAAC,sBAAuB;AACvB,IAAAC,kBAMO;AA2JD,IAAAC,wBAAA;AApJN,IAAMC,cAGF;AAAA,EACF,IAAI,EAAE,SAAS,aAAa,MAAM,WAAW,WAAW,eAAe;AAAA,EACvE,IAAI,EAAE,SAAS,iBAAiB,MAAM,WAAW,WAAW,eAAe;AAAA,EAC3E,IAAI,EAAE,SAAS,aAAa,MAAM,aAAa,WAAW,eAAe;AAC3E;AAUA,IAAMC,cAAqD;AAAA,EACzD,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AAAA,EAAI,SAAS;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AACF;AAEA,IAAMC,iBAGF;AAAA,EACF,OACE;AAAA,EACF,SACE;AACJ;AAEA,IAAMC,mBACJ;AAWF,IAAM,gBAAgD;AAAA,EACpD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,MAAM;AACR;AAEA,IAAM,eAAW;AAAA,EACf,SAASC,UACP;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,mBAAmB;AAAA,IACnB;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,YAAYJ,YAAW,IAAI,KAAKA,YAAW;AACjD,UAAM,SAAUC,YAAW,IAAI,KAAKA,YAAW;AAC/C,UAAM,cAAc,cAAc,MAAM,KAAK,cAAc;AAE3D,UAAM,cAAU;AAAA,MACd,UACE,oBAAAI;AAAA,QACE;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACPF;AAAA,QACA;AAAA,QACA,qBAAqB,SAASD,eAAc,gBAAgB,IAAI;AAAA,QAChE;AAAA,MACF;AAAA,MACF;AAAA,QACE;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WACE,+CAAC,cAAS,KAAU,WAAW,SAAS,UAAqB,GAAG,MAAM;AAAA,EAE1E;AACF;AAEA,SAAS,cAAc;AAEtB,SAAiD,aAAa;AAE/D,IAAO,mBAAQ;;;AC3Kf,IAAAI,sBAAuB;AACvB,IAAAC,kBAMO;AA4LI,IAAAC,wBAAA;AArLX,IAAMC,cAOF;AAAA,EACF,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;AAOA,IAAMC,cAA2D;AAAA,EAC/D,KAAK;AAAA,IACH,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EAAI,MAAM;AAAA,IACR,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,WACE;AAAA,IACF,MAAM;AAAA,EACR;AACF;AAEA,IAAMC,iBAAyE;AAAA,EAC7E,OACE;AAAA,EACF,SACE;AACJ;AAEA,IAAMC,mBACJ;AAaF,IAAM,aAAS,4BAA2C,SAASC,QACjE;AAAA,EACE,OAAO;AAAA,EACP,OAAO;AAAA,EACP,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAMC,cAAa,gBAAgB;AACnC,QAAM,YAAYL,YAAW,IAAI,KAAKA,YAAW;AACjD,QAAM,SAAUC,YAAW,IAAI,KAAKA,YAAW;AAC/C,QAAM,iBAAiB,QAAQ,WAAW;AAC1C,QAAM,YAAY,CAAC,aAAa,CAAC;AAEjC,QAAM,eAAe,CACnB,QACA,kBACG;AACH,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAOI,YAAW,QAAQ,QAAW,aAAa;AAAA,IACpD;AACA,QAAI,gBAAAC,QAAM,eAAuC,MAAM,GAAG;AACxD,aAAO,gBAAAA,QAAM,aAAa,QAAQ;AAAA,QAChC,eAAW,oBAAAC,SAAW,eAAe,OAAO,MAAM,SAAS;AAAA,MAC7D,CAAC;AAAA,IACH;AACA,WAAO,+CAAC,UAAK,WAAW,eAAgB,kBAAO;AAAA,EACjD;AAEA,QAAMC,mBAAc,oBAAAD;AAAA,IAClB;AAAA,IACA,WAAW,cAAc,UAAU;AAAA,IACnC,CAAC,YACC;AAAA,IACFJ;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cACJ,qBAAqB,UAAU,CAAC,WAC5BD,eAAc,gBAAgB,IAC9B;AAEN,QAAM,aAAa,CAAC,WAChB,OAAO,YACP;AAEJ,QAAM,eAAW,oBAAAK;AAAA,IACfC;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd;AAEA,QAAM,YAAQ;AAAA,IACZ,MACE,YACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAD;AAAA,UACT;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,QACT;AAAA,QAEC,UAAAF,YAAW,aAAa,QAAW,UAAU,QAAQ;AAAA;AAAA,IACxD,IACE;AAAA,IACN;AAAA,MACE;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,OAAO;AAAA,MACPA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,iBACd,+CAAC,UAAK,WAAU,0GACb,uBAAa,aAAa,UAAU,QAAQ,GAC/C,IACE;AAEJ,SACE,gDAAC,UAAK,WAAU,qCACb;AAAA;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,eAAW,oBAAAE;AAAA,UACT;AAAA,UACA,kBAAkB,CAAC,YAAY;AAAA,UAC/B,aAAa,CAAC,YAAY;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,gBACE,qBAAqB,UAAU,SAAS,KAAK,cAAc;AAAA,QAE5D,GAAG;AAAA,QAEH;AAAA,0BAAgB,UACf,+CAAC,YAAO,OAAM,IAAG,UAAQ,MAAC,QAAM,MAC7B,uBACH;AAAA,UAED;AAAA;AAAA;AAAA,IACH;AAAA,IACC;AAAA,KACH;AAEJ,CAAC;AAED,OAAO,cAAc;AAEpB,OAAgD,cAAc;AAE/D,IAAO,iBAAQ;;;AC3Rf,IAAAE,kBAA4D;AAC5D,IAAAC,sBAAuB;AAiQf,IAAAC,wBAAA;AA5PR,IAAMC,cAGF;AAAA,EACF,KAAK;AAAA,IACH,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACH,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,WACE;AAAA,IACF,aACE;AAAA,IACF,gBACE;AAAA,EACJ;AAAE;AAcG,IAAM,WAAoC,CAAC;AAAA,EAChD,QAAQ;AAAA,EACR;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,QAAQ;AACV,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAS,EAAE;AACvC,QAAM,mBAAe,wBAAuB,IAAI;AAChD,QAAM,eAAW,wBAAyB,IAAI;AAC9C,QAAMC,eAAcF,YAAW,KAAK,KAAKA,YAAW;AAEpD,iCAAU,MAAM;AACd,cAAU,KAAK;AAAA,EACjB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,sBAAkB,yBAAQ,MAAM;AACpC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,cAAc,OAAO,YAAY;AACvC,WAAO,QAAQ,OAAO,CAAC,QAAQ,IAAI,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,EACxE,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,iCAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UACE,aAAa,WACb,CAAC,aAAa,QAAQ,SAAS,MAAM,MAAc,GACnD;AACA,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,CAAC,MAA2C;AACpE,UAAM,WAAW,EAAE,OAAO;AAC1B,cAAU,QAAQ;AAClB,aAAS,QAAQ;AACjB,cAAU,IAAI;AAAA,EAChB;AAEA,QAAM,oBAAoB,CAAC,WAAmB;AAC5C,aAAS,MAAM;AACf,cAAU,MAAM;AAChB,cAAU,KAAK;AAAA,EACjB;AAEA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,UAAU;AACb,gBAAU,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAG,SAAW,mBAAmB,SAAS;AAAA,MAElD;AAAA,wDAAC,SAAI,WAAU,YACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,cACT;AAAA,cACA;AAAA,cACA,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,QACI,2DACA,mBAAmBD,aAAY,SAAS;AAAA,cAC9C;AAAA;AAAA,UACF;AAAA,UACA,gDAAC,SAAI,WAAU,qDACZ;AAAA,sBAAU,CAAC,YACV;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM;AACb,2BAAS,EAAE;AACX,4BAAU,EAAE;AACZ,2BAAS,SAAS,MAAM;AAAA,gBAC1B;AAAA,gBACA,cAAW;AAAA;AAAA,YACb;AAAA,YAEF,+CAAC,SAAI,WAAU,0CACZ,UAAAD,YAAW,aAAa,MAAM,SAAS,GAC1C;AAAA,aACF;AAAA,WACF;AAAA,QAEC,UAAU,CAAC,YACV,+CAAC,SAAI,WAAU,kJACZ,0BAAgB,SAAS,IACxB,gBAAgB,IAAI,CAAC,QAAQ,UAC3B;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,kBAAkB,MAAM;AAAA,YACvC,eAAW,oBAAAE;AAAA,cACT,oCAAoCD,aAAY,WAAW;AAAA,cAC3D,WAAW,QACP,GAAGA,aAAY,cAAc,iBAC7B;AAAA,YACN;AAAA,YAEC;AAAA;AAAA,UATI;AAAA,QAUP,CACD,IAED,+CAAC,SAAI,WAAU,6DACZ,wBACH,GAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;ACpUf,IAAAE,kBAOO;AACP,IAAAC,oBAA6B;AAC7B,IAAAC,sBAAuB;AA+jBT,IAAAC,wBAAA;AA1jBd,IAAMC,cASF;AAAA,EACF,KAAK;AAAA,IACH,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,SAAS;AAAA,IACP,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,KAAK;AAAA,IACH,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,SAAS;AAAA,IACP,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EAAI,MAAM;AAAA,IACR,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,SAAS;AAAA,IACP,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,cACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB;AAAE;AAaJ,IAAMC,kBAAiB,OAAmB;AAAA,EACxC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO,OAAO;AAAA,EACd,QAAQ,OAAO;AAAA,EACf,OAAO,OAAO;AAAA,EACd,QAAQ,OAAO;AACjB;AAEA,IAAMC,oBAAmB,CAAC,OACxB,4BAA4B;AAAA,EAC1B;AAAA,IACE,iBAAiB,EAAE,EAAE;AAAA,IACrB,iBAAiB,EAAE,EAAE;AAAA,IACrB,iBAAiB,EAAE,EAAE;AAAA,EACvB,EAAE,KAAK,GAAG;AACZ;AAEF,IAAMC,yBAAwB,CAAC,WAAoC;AACjE,MAAI,OAA2B,OAAO;AACtC,SAAO,QAAQ,SAAS,SAAS,MAAM;AACrC,QAAID,kBAAiB,IAAI,GAAG;AAC1B,YAAM,IAAI,KAAK,sBAAsB;AACrC,aAAO;AAAA,QACL,KAAK,EAAE;AAAA,QACP,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACZ;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAOD,gBAAe;AACxB;AAEA,IAAM,gBAAgB,CAAC,WAAgC;AACrD,MAAI,OAA2B;AAC/B,MAAI,UAAyB;AAC7B,SAAO,QAAQ,SAAS,SAAS,MAAM;AACrC,UAAM,IAAI,iBAAiB,IAAI,EAAE;AACjC,QAAI,KAAK,MAAM,QAAQ;AACrB,YAAM,IAAI,OAAO,CAAC;AAClB,UAAI,OAAO,SAAS,CAAC;AACnB,kBAAU,YAAY,OAAO,IAAI,KAAK,IAAI,SAAS,CAAC;AAAA,IACxD;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,IAAI,IAAI,WAAW,MAAM,CAAC;AACxC;AAEA,IAAMG,eAAc,OAAO,aAAa,cAAc,SAAS,OAAO;AACtE,IAAM,sBAAsB;AA6E5B,IAAM,SAAgC,CAAC;AAAA,EACrC;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AACf,MAAM;AACJ,QAAM,iBAAa,wBAA0B,IAAI;AACjD,QAAM,kBAAc,wBAAuB,IAAI;AAC/C,QAAM,gBAAY,wBAAyB,IAAI;AAE/C,QAAM,CAAC,MAAM,OAAO,QAAI,0BAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAS,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAA8B;AACxD,QAAM,CAAC,mBAAmB,oBAAoB,QAC5C,0BAAS,mBAAmB;AAC9B,QAAMC,eAAcL,YAAW,KAAK,KAAKA,YAAW;AAGpD,QAAM,2BAAuB;AAAA,IAC3B,MAAO,QAAS,mBAAmB,CAAC,IAAK,aAAa,CAAC,UAAU,IAAI,CAAC;AAAA,IACtE,CAAC,OAAO,iBAAiB,UAAU;AAAA,EACrC;AAEA,QAAM,mBAAe;AAAA,IACnB,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAAA,IAC3C,CAAC,OAAO,UAAU;AAAA,EACpB;AAEA,QAAM,gBAAY;AAAA,IAChB,MACE,gBAAgB,gBACZ,MAAM,OAAO,cAAc,SAAS,IACpC;AAAA,IACN,CAAC,OAAO,cAAc,aAAa;AAAA,EACrC;AAEA,QAAM,eAAW,yBAAQ,MAAM;AAC7B,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,UAAU;AAAA,MACf,CAAC,SACC,KAAK,MAAM,YAAY,EAAE,SAAS,CAAC,MAClC,KAAK,YAAY,IAAI,YAAY,EAAE,SAAS,CAAC,MAC7C,KAAK,eAAe,IAAI,YAAY,EAAE,SAAS,CAAC,MAChD,KAAK,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAIrB,QAAM,qBAAiB,6BAAY,MAAM;AACvC,QAAI,CAAC,QAAQ,CAAC,WAAW,WAAW,CAAC,YAAY,QAAS;AAE1D,UAAM,aAAa,WAAW,QAAQ,sBAAsB;AAC5D,UAAM,WAAW,YAAY,QAAQ,sBAAsB;AAC3D,UAAM,WAAW,iBACbC,gBAAe,IACfE,uBAAsB,WAAW,OAAO;AAC5C,UAAM,SAAS,cAAc,WAAW,OAAO;AAC/C,UAAM,SAAS;AACf,UAAM,YAAY;AAElB,UAAM,gBAAgB,KAAK;AAAA,MACzB,KAAK,IAAI,WAAW,OAAO,SAAS,KAAK;AAAA,MACzC,SAAS,QAAQ,YAAY;AAAA,IAC/B;AACA,UAAM,iBAAiB,SAAS;AAEhC,UAAM,WAAW,WAAW,SAAS;AACrC,UAAM,WAAW,WAAW,MAAM,SAAS;AAE3C,UAAM,cAAc,CAAC,QACnB,KAAK,IAAI,GAAG,SAAS,MAAM,YAAY,GAAG,IAC1C,KAAK,IAAI,GAAG,MAAM,kBAAkB,SAAS,SAAS,UAAU;AAElE,UAAM,YAAY,YAAY,QAAQ,IAAI,YAAY,QAAQ;AAC9D,UAAM,SAAS,YAAY,WAAW;AACtC,UAAM,aAAa,KAAK;AAAA,MACtB,KAAK,IAAI,QAAQ,SAAS,MAAM,SAAS;AAAA,MACzC,KAAK;AAAA,QACH,SAAS,MAAM;AAAA,QACf,SAAS,SAAS,iBAAiB;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,iBAAiB,YACnB,KAAK,IAAI,KAAK,WAAW,MAAM,UAAU,SAAS,MAAM,UAAU,IAClE,KAAK,IAAI,KAAK,SAAS,SAAS,YAAY,QAAQ;AACxD,UAAM,gBAAgB,KAAK,IAAI,qBAAqB,cAAc;AAElE,UAAM,YAAY,WAAW;AAC7B,UAAM,cAAc,KAAK;AAAA,MACvB,KAAK,IAAI,WAAW,SAAS,OAAO,SAAS;AAAA,MAC7C,KAAK;AAAA,QACH,SAAS,OAAO;AAAA,QAChB,SAAS,QAAQ,gBAAgB;AAAA,MACnC;AAAA,IACF;AAEA,yBAAqB,KAAK,IAAI,KAAK,aAAa,CAAC;AACjD,aAAS;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,IAAI,CAAC;AAET,uCAAgB,MAAM;AACpB,mBAAe;AAAA,EACjB,GAAG,CAAC,cAAc,CAAC;AAEnB,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,eAAS,MAAS;AAClB;AAAA,IACF;AAEA,QAAI,QAAQ;AACZ,UAAM,WAAW,MAAM;AACrB,UAAI,MAAO,sBAAqB,KAAK;AACrC,cAAQ,sBAAsB,MAAM;AAClC,uBAAe;AACf,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,UAAM,KACJ,OAAO,mBAAmB,cACtB,IAAI,eAAe,QAAQ,IAC3B;AACN,QAAI,IAAI;AACN,UAAI,WAAW,QAAS,IAAG,QAAQ,WAAW,OAAO;AACrD,UAAI,YAAY,QAAS,IAAG,QAAQ,YAAY,OAAO;AAAA,IACzD;AACA,aAAS;AAET,WAAO,MAAM;AACX,UAAI,MAAO,sBAAqB,KAAK;AACrC,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,UAAI,WAAW;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,CAAC;AAIzB,iCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,MAAkB;AACvC,UACE,YAAY,SAAS,SAAS,EAAE,MAAc,KAC9C,WAAW,SAAS,SAAS,EAAE,MAAc;AAE7C;AACF,cAAQ,KAAK;AACb,eAAS,EAAE;AAAA,IACb;AACA,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,gBAAgB;AAClB,gBAAQ,KAAK;AACb,iBAAS,EAAE;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,aAAa;AACzD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,iCAAU,MAAM;AACd,QAAI,KAAM,uBAAsB,MAAM,UAAU,SAAS,MAAM,CAAC;AAAA,EAClE,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,eAAe,CAAC,SAAqB;AACzC,QAAI,OAAO;AACT,YAAM,OAAO,qBAAqB,SAAS,KAAK,EAAE,IAC9C,qBAAqB,OAAO,CAAC,OAAO,OAAO,KAAK,EAAE,IAClD,CAAC,GAAG,sBAAsB,KAAK,EAAE;AACrC,sBAAgB,IAAI;AAAA,IAEtB,OAAO;AACL,iBAAW,IAAI;AACf,cAAQ,KAAK;AACb,eAAS,EAAE;AAAA,IACb;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM;AAC7B,oBAAgB,CAAC,CAAC;AAAA,EACpB;AAIA,QAAM,4BACJ,sBACC,gBACG,eACE,UAAU,cAAc,MAAM,YAAY,CAAC,iBAC3C,2BACF;AAIN,QAAM,WACJ,QAAQC,mBACJ;AAAA,IACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO,SAAS,EAAE,YAAY,SAAS;AAAA,QACvC,eAAW,oBAAAE;AAAA,UACT;AAAA,UACA,CAAC,SAAS;AAAA,QACZ;AAAA,QAGA;AAAA,0DAAC,SAAI,WAAU,yFACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,aAAa;AAAA,gBAEb;AAAA,iEAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,kBAC9B,+CAAC,UAAK,eAAc,SAAQ,GAAE,oBAAmB;AAAA;AAAA;AAAA,YACnD;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,gBACxC,WAAW,CAAC,MACV,EAAE,QAAQ,aAAa,QAAQ,KAAK,GAAG,SAAS,EAAE;AAAA,gBAEpD,aAAa;AAAA,gBACb,WAAU;AAAA;AAAA,YACZ;AAAA,YACC,SACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,gBACrC,SAAS,MAAM,SAAS,EAAE;AAAA,gBAC1B,WAAU;AAAA,gBAEV;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,aAAa;AAAA,oBAEb,yDAAC,UAAK,eAAc,SAAQ,GAAE,wBAAuB;AAAA;AAAA,gBACvD;AAAA;AAAA,YACF;AAAA,YAED,iBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,gBACrC,SAAS,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAAA,gBACxC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,eACID,aAAY,eACZ;AAAA,gBACN;AAAA,gBAEC,yBAAe,cAAc,QAAQ;AAAA;AAAA,YACxC;AAAA,aAEJ;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,WAAW,kBAAkB;AAAA,cAGrC;AAAA,yBAAS,qBAAqB,SAAS,KACtC;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,oBACrC,SAAS;AAAA,oBACT,WAAU;AAAA,oBAEV;AAAA,sEAAC,UAAM;AAAA,6CAAqB;AAAA,wBAAO;AAAA,yBAAS;AAAA,sBAC5C,+CAAC,UAAK,WAAU,oDAAmD,mBAEnE;AAAA;AAAA;AAAA,gBACF;AAAA,gBAED,SAAS,WAAW,IACnB,+CAAC,QAAG,WAAU,wEACX,oBAAU,WAAW,IAClB,eACA,+BACN,IAEA,SAAS,IAAI,CAAC,SAAS;AACrB,wBAAM,aAAa,qBAAqB,SAAS,KAAK,EAAE;AACxD,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,sBACrC,SAAS,MAAM,aAAa,IAAI;AAAA,sBAChC,eAAW,oBAAAC;AAAA,wBACT;AAAA,wBACA,aACID,aAAY,mBACZ;AAAA,sBACN;AAAA,sBAGC;AAAA,gCACC;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAC;AAAA,8BACT;AAAA,8BACA,iBACI,oBAAAA;AAAA,gCACED,aAAY;AAAA,gCACZ;AAAA,gCACAA,aAAY;AAAA,8BACd,IACA;AAAA,4BACN;AAAA,4BAEC,wBACC;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAW,oBAAAC;AAAA,kCACT;AAAA,kCACAD,aAAY;AAAA,gCACd;AAAA,gCACA,SAAQ;AAAA,gCACR,MAAK;AAAA,gCACL,QAAO;AAAA,gCACP,aAAa;AAAA,gCAEb;AAAA,kCAAC;AAAA;AAAA,oCACC,eAAc;AAAA,oCACd,gBAAe;AAAA,oCACf,GAAE;AAAA;AAAA,gCACJ;AAAA;AAAA,4BACF;AAAA;AAAA,wBAEJ,IACE,aACF,+CAAC,UAAK,WAAU,qDACd;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAC;AAAA,8BACT;AAAA,8BACAD,aAAY;AAAA,4BACd;AAAA,4BACA,SAAQ;AAAA,4BACR,MAAK;AAAA,4BACL,QAAO;AAAA,4BACP,aAAa;AAAA,4BAEb;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAc;AAAA,gCACd,gBAAe;AAAA,gCACf,GAAE;AAAA;AAAA,4BACJ;AAAA;AAAA,wBACF,GACF,IACE;AAAA,wBAGH,KAAK,QACJ;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAC;AAAA,8BACT;AAAA,8BACA,aACID,aAAY,qBACZ;AAAA,4BACN;AAAA,4BAEC,eAAK;AAAA;AAAA,wBACR;AAAA,wBAIF,gDAAC,SAAI,WAAU,kBACb;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,eAAW,oBAAAC;AAAA,gCACT;AAAA,gCACA,aACID,aAAY,qBACZ;AAAA,8BACN;AAAA,8BAEC,eAAK;AAAA;AAAA,0BACR;AAAA,0BACC,KAAK,YACJ,+CAAC,OAAE,WAAU,2DACV,eAAK,UACR;AAAA,0BAED,KAAK,eACJ,+CAAC,OAAE,WAAU,kEACV,eAAK,aACR;AAAA,2BAEJ;AAAA,wBAGC,KAAK,QAAQ,KAAK,KAAK,SAAS,KAC/B,+CAAC,SAAI,WAAU,iCACZ,eAAK,KAAK,IAAI,CAAC,KAAK,OACnB;AAAA,0BAAC;AAAA;AAAA,4BAEC,MAAK;AAAA,4BACL,MAAM,IAAI,QAAQ;AAAA,4BAClB,SAAQ;AAAA,4BAEP,cAAI;AAAA;AAAA,0BALA;AAAA,wBAMP,CACD,GACH;AAAA;AAAA;AAAA,oBAnHG,KAAK;AAAA,kBAqHZ;AAAA,gBAEJ,CAAC;AAAA;AAAA;AAAA,UAEL;AAAA;AAAA;AAAA,IACF;AAAA,IACAD;AAAA,EACF,IACA;AAIN,QAAM,KAAK,SAAS;AACpB,QAAM,iBAAiB,KAAK,cAAc;AAC1C,QAAM,cAAc,KAAK,YAAY;AACrC,QAAM,aAAa,KAAK,YAAY;AACpC,QAAM,gBAAgB;AACtB,QAAM,cAAc,KAAK,YAAY;AAIrC,QAAM,sBAAsB,SACvB,MAAM;AACL,QAAI,qBAAqB,WAAW,GAAG;AACrC,aACE;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAE;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,IAEJ;AACA,UAAM,aAAa,qBAAqB,MAAM,GAAG,aAAa;AAC9D,UAAM,WAAW,qBAAqB,SAAS,WAAW;AAC1D,WACE,gDAAC,SAAI,WAAU,uCACZ;AAAA,iBAAW,IAAI,CAAC,OAAO;AACtB,cAAM,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACxC,YAAI,CAAC,GAAI,QAAO;AAChB,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,KAAK,gBAAgB;AAAA,cACrBD,aAAY;AAAA,YACd;AAAA,YAEC,aAAG;AAAA;AAAA,UAPC;AAAA,QAQP;AAAA,MAEJ,CAAC;AAAA,MACA,WAAW,KACV;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAC;AAAA,YACT;AAAA,YACA,KAAK,gBAAgB;AAAA,YACrB;AAAA,UACF;AAAA,UACD;AAAA;AAAA,YACG;AAAA;AAAA;AAAA,MACJ;AAAA,OAEJ;AAAA,EAEJ,GAAG,IACH;AAIJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT,YAAY,WAAW;AAAA,QACvB,cAAc;AAAA,MAChB;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,SAAS,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI;AAAA,YACtC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,cAAc;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,OACID,aAAY,cACZ;AAAA,cACJ;AAAA,YACF;AAAA,YAEC;AAAA,wBACC,kFACE;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,SAAQ;AAAA,oBACR,MAAK;AAAA,oBAEL;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,IAAG;AAAA,0BACH,IAAG;AAAA,0BACH,GAAE;AAAA,0BACF,QAAO;AAAA,0BACP,aAAY;AAAA;AAAA,sBACd;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAU;AAAA,0BACV,MAAK;AAAA,0BACL,GAAE;AAAA;AAAA,sBACJ;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,+CAAC,UAAK,eAAW,oBAAAC,SAAW,aAAa,kBAAkB,GACxD,0BACH;AAAA,iBACF,IACE,QACF,sBACE,eACF,kFACG;AAAA,6BAAa,QACZ,+CAAC,UAAK,WAAU,mDACb,uBAAa,MAChB;AAAA,gBAEF,gDAAC,SAAI,WAAU,kBACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA;AAAA,sBACF;AAAA,sBAEC,uBAAa;AAAA;AAAA,kBAChB;AAAA,kBACC,aAAa,YACZ,+CAAC,UAAK,WAAU,iEACb,uBAAa,UAChB;AAAA,mBAEJ;AAAA,gBACC,aAAa,QAAQ,aAAa,KAAK,SAAS,KAC/C,+CAAC,SAAI,WAAU,iCACZ,uBAAa,KAAK,IAAI,CAAC,KAAK,OAC3B;AAAA,kBAAC;AAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,MAAM,IAAI,QAAQ;AAAA,oBAClB,SAAQ;AAAA,oBAEP,cAAI;AAAA;AAAA,kBALA;AAAA,gBAMP,CACD,GACH;AAAA,iBAEJ,IAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cAIF;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA;AAAA,oBACA,QAAQ;AAAA,kBACV;AAAA,kBACA,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,aAAa;AAAA,kBAEb,yDAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,gBAAe;AAAA;AAAA,cACtE;AAAA;AAAA;AAAA,QACF;AAAA,QAEC;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,OAAO,cAAc;AAGrB,IAAO,iBAAQ;;;ACx9Bf,IAAAC,kBAQO;AACP,IAAAC,oBAA6B;AAC7B,IAAAC,sBAAuB;AA6pBT,IAAAC,wBAAA;AAtpBd,IAAMC,cAWF;AAAA,EACF,KAAK;AAAA,IACH,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACP,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,KAAK;AAAA,IACH,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACP,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EAAI,MAAM;AAAA,IACR,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACP,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,aACE;AAAA,IACF,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AACF;AAaA,IAAMC,kBAAiB,OAAmB;AAAA,EACxC,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO,OAAO;AAAA,EACd,QAAQ,OAAO;AAAA,EACf,OAAO,OAAO;AAAA,EACd,QAAQ,OAAO;AACjB;AAEA,IAAMC,oBAAmB,CAAC,OACxB,4BAA4B;AAAA,EAC1B;AAAA,IACE,iBAAiB,EAAE,EAAE;AAAA,IACrB,iBAAiB,EAAE,EAAE;AAAA,IACrB,iBAAiB,EAAE,EAAE;AAAA,EACvB,EAAE,KAAK,GAAG;AACZ;AAEF,IAAMC,yBAAwB,CAAC,WAAoC;AACjE,MAAI,OAA2B,OAAO;AACtC,SAAO,QAAQ,SAAS,SAAS,MAAM;AACrC,QAAID,kBAAiB,IAAI,GAAG;AAC1B,YAAM,IAAI,KAAK,sBAAsB;AACrC,aAAO;AAAA,QACL,KAAK,EAAE;AAAA,QACP,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACZ;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAOD,gBAAe;AACxB;AAEA,IAAMG,iBAAgB,CAAC,WAAgC;AACrD,MAAI,OAA2B;AAC/B,MAAI,UAAyB;AAC7B,SAAO,QAAQ,SAAS,SAAS,MAAM;AACrC,UAAM,IAAI,iBAAiB,IAAI,EAAE;AACjC,QAAI,KAAK,MAAM,QAAQ;AACrB,YAAM,IAAI,OAAO,CAAC;AAClB,UAAI,OAAO,SAAS,CAAC;AACnB,kBAAU,YAAY,OAAO,IAAI,KAAK,IAAI,SAAS,CAAC;AAAA,IACxD;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,IAAI,IAAI,WAAW,MAAM,CAAC;AACxC;AAEA,IAAMC,eAAc,OAAO,aAAa,cAAc,SAAS,OAAO;AACtE,IAAMC,uBAAsB;AAgF5B,IAAM,YAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,eAAe;AAAA,EACf;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AACF,MAAM;AACJ,QAAM,UAAM,uBAAM;AAClB,QAAM,iBAAa,wBAA0B,IAAI;AACjD,QAAM,kBAAc,wBAAuB,IAAI;AAC/C,QAAM,gBAAY,wBAAyB,IAAI;AAE/C,QAAM,CAAC,MAAM,OAAO,QAAI,0BAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAS,EAAE;AACnD,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAA8B;AACxD,QAAM,CAAC,mBAAmB,oBAAoB,QAC5C,0BAASA,oBAAmB;AAC9B,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAS,KAAK;AAEpD,QAAMC,eAAcP,YAAW,KAAK,KAAKA,YAAW;AACpD,MAAI,CAAC,WAAW;AACd,gBAAY;AAAA,EACd;AAIA,QAAM,sBAAkB,wBAAoB,IAAI,IAAI,KAAK,CAAC;AAE1D,QAAM,sBAAkB;AAAA,IACtB,MACE,eACI,IAAI,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,gBAAgB,QAAQ,IAAI,CAAC,CAAC,CAAC,IAC5D,oBAAI,IAAY;AAAA,IACtB,CAAC,OAAO,YAAY;AAAA,EACtB;AAIA,QAAM,kBAAc,yBAAQ,MAAM,IAAI,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC;AAEzD,QAAM,eAAW;AAAA,IACf,CAAC,MAAsB,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;AAAA,IAC/D,CAAC,KAAK;AAAA,EACR;AAEA,QAAM,eAAW,yBAAQ,MAAM;AAC7B,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,MAAM;AAAA,MACX,CAAC,SACC,KAAK,MAAM,YAAY,EAAE,SAAS,CAAC,MAClC,KAAK,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,QAAM,iBAAa,yBAAQ,MAAM;AAC/B,QAAI,CAAC,eAAe,CAAC,MAAM,KAAK,EAAG,QAAO;AAC1C,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,WACE,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,MAAM,YAAY,MAAM,CAAC,KACpD,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC;AAAA,EAEhC,GAAG,CAAC,aAAa,OAAO,OAAO,KAAK,CAAC;AAErC,QAAM,gBAAgB,SAAS,SAAS,KAAK,aAAa,IAAI;AAI9D,QAAM,qBAAiB,6BAAY,MAAM;AACvC,QAAI,CAAC,QAAQ,CAAC,WAAW,WAAW,CAAC,YAAY,QAAS;AAE1D,UAAM,aAAa,WAAW,QAAQ,sBAAsB;AAC5D,UAAM,WAAW,YAAY,QAAQ,sBAAsB;AAC3D,UAAM,WAAW,iBACbC,gBAAe,IACfE,uBAAsB,WAAW,OAAO;AAC5C,UAAM,SAASC,eAAc,WAAW,OAAO;AAC/C,UAAM,SAAS;AACf,UAAM,YAAY;AAKlB,UAAM,KAAKH,gBAAe;AAE1B,UAAM,gBAAgB,KAAK;AAAA,MACzB,KAAK,IAAI,WAAW,OAAO,SAAS,KAAK;AAAA,MACzC,KAAK,IAAI,SAAS,OAAO,GAAG,KAAK,IAAI,YAAY;AAAA,IACnD;AAGA,UAAM,iBAAiB,SAAS,UAAUK;AAE1C,UAAM,WAAW,WAAW,SAAS;AACrC,UAAM,WAAW,WAAW,MAAM,SAAS;AAE3C,UAAM,cAAc,CAAC,QACnB,KAAK,IAAI,GAAG,GAAG,MAAM,YAAY,GAAG,IACpC,KAAK,IAAI,GAAG,MAAM,kBAAkB,GAAG,SAAS,UAAU;AAE5D,UAAM,YAAY,YAAY,QAAQ,IAAI,YAAY,QAAQ;AAC9D,UAAM,SAAS,YAAY,WAAW;AACtC,UAAM,aAAa,KAAK;AAAA,MACtB,KAAK,IAAI,QAAQ,GAAG,MAAM,SAAS;AAAA,MACnC,KAAK,IAAI,GAAG,MAAM,WAAW,GAAG,SAAS,iBAAiB,SAAS;AAAA,IACrE;AAEA,UAAM,iBAAiB,YACnB,KAAK,IAAI,KAAK,WAAW,MAAM,UAAU,GAAG,MAAM,UAAU,IAC5D,KAAK,IAAI,KAAK,GAAG,SAAS,YAAY,QAAQ;AAElD,UAAM,YAAY,WAAW;AAC7B,UAAM,cAAc,KAAK;AAAA,MACvB,KAAK,IAAI,WAAW,SAAS,OAAO,SAAS;AAAA,MAC7C,KAAK;AAAA,QACH,SAAS,OAAO;AAAA,QAChB,SAAS,QAAQ,gBAAgB;AAAA,MACnC;AAAA,IACF;AAEA;AAAA,MACE,KAAK,IAAI,KAAK,KAAK,IAAIA,sBAAqB,cAAc,CAAC;AAAA,IAC7D;AACA,aAAS;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,cAAc,CAAC;AAEzB,uCAAgB,MAAM;AACpB,mBAAe;AAAA,EACjB,GAAG,CAAC,cAAc,CAAC;AAEnB,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,eAAS,MAAS;AAClB;AAAA,IACF;AAEA,QAAI,QAAQ;AACZ,UAAM,WAAW,MAAM;AACrB,UAAI,MAAO,sBAAqB,KAAK;AACrC,cAAQ,sBAAsB,MAAM;AAClC,uBAAe;AACf,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,UAAM,KACJ,OAAO,mBAAmB,cACtB,IAAI,eAAe,QAAQ,IAC3B;AACN,QAAI,IAAI;AACN,UAAI,WAAW,QAAS,IAAG,QAAQ,WAAW,OAAO;AACrD,UAAI,YAAY,QAAS,IAAG,QAAQ,YAAY,OAAO;AAAA,IACzD;AACA,aAAS;AAET,WAAO,MAAM;AACX,UAAI,MAAO,sBAAqB,KAAK;AACrC,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,UAAI,WAAW;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,CAAC;AAIzB,iCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,MAAkB;AACvC,UACE,YAAY,SAAS,SAAS,EAAE,MAAc,KAC9C,WAAW,SAAS,SAAS,EAAE,MAAc;AAE7C;AACF,cAAQ,KAAK;AACb,eAAS,EAAE;AAAA,IACb;AACA,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,gBAAgB;AAClB,gBAAQ,KAAK;AACb,iBAAS,EAAE;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,aAAa;AACzD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,iCAAU,MAAM;AACd,QAAI,KAAM,uBAAsB,MAAM,UAAU,SAAS,MAAM,CAAC;AAAA,EAClE,GAAG,CAAC,IAAI,CAAC;AAET,iCAAU,MAAM;AACd,oBAAgB,EAAE;AAAA,EACpB,GAAG,CAAC,KAAK,CAAC;AAIV,QAAM,gBAAY;AAAA,IAChB,CAAC,MAAe,iBAAiB,eAAe,CAAC,IAAI;AAAA,IACrD,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,SAAwB;AACvB,YAAM,KAAK,UAAU,KAAK,EAAE;AAC5B,UAAI,CAAC,OAAO;AACV,iBAAS,CAAC,EAAE,CAAC;AACb,gBAAQ,KAAK;AACb,iBAAS,EAAE;AACX;AAAA,MACF;AACA,UAAI,YAAY,IAAI,KAAK,EAAE,GAAG;AAC5B,iBAAS,MAAM,OAAO,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC;AAAA,MAC7C,OAAO;AACL,iBAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,OAAO,WAAW,UAAU,aAAa,KAAK;AAAA,EACjD;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,MAAc,SAAS,MAAM,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC;AAAA,IACpD,CAAC,UAAU,KAAK;AAAA,EAClB;AAEA,QAAM,mBAAe,6BAAY,MAAM;AACrC,UAAM,QAAQ,UAAU,MAAM,KAAK,CAAC;AACpC,QAAI,CAAC,MAAO;AACZ,QAAI,cAAc;AAChB,mBAAa,KAAK;AAAA,IACpB,WAAW,CAAC,OAAO;AACjB,eAAS,CAAC,KAAK,CAAC;AAChB,cAAQ,KAAK;AAAA,IACf,OAAO;AACL,eAAS,CAAC,GAAG,OAAO,KAAK,CAAC;AAAA,IAC5B;AACA,aAAS,EAAE;AAAA,EACb,GAAG,CAAC,OAAO,WAAW,cAAc,OAAO,UAAU,KAAK,CAAC;AAE3D,QAAM,gBAAgB,CAAC,MAA6C;AAClE,QAAI,EAAE,QAAQ,aAAa;AACzB,QAAE,eAAe;AACjB,sBAAgB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,aAAa,CAAC;AAAA,IAC7D,WAAW,EAAE,QAAQ,WAAW;AAC9B,QAAE,eAAe;AACjB,sBAAgB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,IACjD,WAAW,EAAE,QAAQ,SAAS;AAC5B,QAAE,eAAe;AACjB,UAAI,gBAAgB,KAAK,eAAe,SAAS,QAAQ;AACvD,qBAAa,SAAS,YAAY,CAAC;AAAA,MACrC,WAAW,cAAc,iBAAiB,SAAS,QAAQ;AACzD,qBAAa;AAAA,MACf,WAAW,MAAM,KAAK,GAAG;AACvB,YAAI,SAAS,SAAS,EAAG,cAAa,SAAS,CAAC,CAAC;AAAA,iBACxC,WAAY,cAAa;AAAA,MACpC;AAAA,IACF,WAAW,EAAE,QAAQ,eAAe,CAAC,SAAS,MAAM,SAAS,KAAK,OAAO;AACvE,eAAS,MAAM,MAAM,GAAG,EAAE,CAAC;AAAA,IAC7B;AAAA,EACF;AAIA,QAAM,WACJ,QAAQD,mBACJ;AAAA,IACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO,SAAS,EAAE,YAAY,SAAS;AAAA,QACvC,eAAW,oBAAAG;AAAA,UACT;AAAA,UACA,CAAC,SAAS;AAAA,QACZ;AAAA,QAGA;AAAA,0DAAC,SAAI,WAAU,yFACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,aAAa;AAAA,gBAEb;AAAA,iEAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,kBAC9B,+CAAC,UAAK,eAAc,SAAQ,GAAE,oBAAmB;AAAA;AAAA;AAAA,YACnD;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,IAAI,GAAG,GAAG;AAAA,gBACV,MAAK;AAAA,gBACL,iBAAe;AAAA,gBACf,iBAAe,GAAG,GAAG;AAAA,gBACrB,qBAAkB;AAAA,gBAClB,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,gBACxC,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,WAAU;AAAA;AAAA,YACZ;AAAA,YACC,SACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,gBACrC,SAAS,MAAM,SAAS,EAAE;AAAA,gBAC1B,WAAU;AAAA,gBAEV;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,aAAa;AAAA,oBAEb,yDAAC,UAAK,eAAc,SAAQ,GAAE,wBAAuB;AAAA;AAAA,gBACvD;AAAA;AAAA,YACF;AAAA,aAEJ;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,GAAG,GAAG;AAAA,cACV,MAAK;AAAA,cACL,wBAAsB;AAAA,cACtB,WAAU;AAAA,cACV,OAAO,EAAE,WAAW,kBAAkB;AAAA,cAErC;AAAA,0BACC,gDAAC,QAAG,WAAU,mGACZ;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,MAAK;AAAA,sBAEL;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAU;AAAA,4BACV,IAAG;AAAA,4BACH,IAAG;AAAA,4BACH,GAAE;AAAA,4BACF,QAAO;AAAA,4BACP,aAAY;AAAA;AAAA,wBACd;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAU;AAAA,4BACV,MAAK;AAAA,4BACL,GAAE;AAAA;AAAA,wBACJ;AAAA;AAAA;AAAA,kBACF;AAAA,kBACC;AAAA,mBACH,IACE,SAAS,WAAW,KAAK,CAAC,aAC5B,+CAAC,QAAG,WAAU,wEACX,gBAAM,WAAW,IACd,eACA,+BACN,IAEA,SAAS,IAAI,CAAC,MAAM,UAAU;AAC5B,wBAAM,aAAa,YAAY,IAAI,KAAK,EAAE;AAC1C,wBAAM,YAAY,UAAU;AAC5B,wBAAM,QAAQ,gBAAgB,IAAI,KAAK,EAAE;AACzC,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,MAAK;AAAA,sBACL,iBAAe;AAAA,sBACf,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,sBACrC,cAAc,MAAM,gBAAgB,KAAK;AAAA,sBACzC,SAAS,MAAM;AACb,4BAAI,CAAC,SAAU,cAAa,IAAI;AAAA,sBAClC;AAAA,sBACA,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,aACI,QACE,yCACAD,aAAY,mBACd,YACEA,aAAY,YACZ;AAAA,sBACR;AAAA,sBAGA;AAAA,uEAAC,UAAK,WAAU,qDACb,wBACC;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAC;AAAA,8BACT;AAAA,8BACA,QACI,2CACAD,aAAY;AAAA,4BAClB;AAAA,4BACA,SAAQ;AAAA,4BACR,MAAK;AAAA,4BACL,QAAO;AAAA,4BACP,aAAa;AAAA,4BAEb;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAc;AAAA,gCACd,gBAAe;AAAA,gCACf,GAAE;AAAA;AAAA,4BACJ;AAAA;AAAA,wBACF,GAEJ;AAAA,wBAGC,KAAK,QACJ;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAC;AAAA,8BACT;AAAA,8BACA,aACI,QACE,2CACAD,aAAY,qBACd;AAAA,4BACN;AAAA,4BAEC,eAAK;AAAA;AAAA,wBACR;AAAA,wBAIF;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAC;AAAA,8BACT;AAAA,8BACA,aACI,QACE,2CACAD,aAAY,qBACd;AAAA,4BACN;AAAA,4BAEC,eAAK;AAAA;AAAA,wBACR;AAAA,wBAGC,SACC,+CAAC,UAAK,WAAU,sKAAqK,iBAErL;AAAA,wBAID,KAAK,QAAQ,KAAK,KAAK,SAAS,KAC/B,+CAAC,SAAI,WAAU,iCACZ,eAAK,KAAK,IAAI,CAAC,KAAK,OACnB;AAAA,0BAAC;AAAA;AAAA,4BAEC,MAAK;AAAA,4BACL,MAAM,IAAI,QAAQ;AAAA,4BAClB,SAAQ;AAAA,4BAEP,cAAI;AAAA;AAAA,0BALA;AAAA,wBAMP,CACD,GACH;AAAA;AAAA;AAAA,oBA7FG,KAAK;AAAA,kBA+FZ;AAAA,gBAEJ,CAAC;AAAA,gBAIF,cACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,iBAAe;AAAA,oBACf,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,oBACrC,cAAc,MAAM,gBAAgB,SAAS,MAAM;AAAA,oBACnD,SAAS;AAAA,oBACT,eAAW,oBAAAC;AAAA,sBACT;AAAA,sBACA,iBAAiB,SAAS,SACtBD,aAAY,YACZ;AAAA,oBACN;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,eAAW,oBAAAC;AAAA,4BACT;AAAA,4BACAD,aAAY;AAAA,0BACd;AAAA,0BACA,SAAQ;AAAA,0BACR,MAAK;AAAA,0BACL,QAAO;AAAA,0BACP,aAAa;AAAA,0BAEb;AAAA,4BAAC;AAAA;AAAA,8BACC,eAAc;AAAA,8BACd,gBAAe;AAAA,8BACf,GAAE;AAAA;AAAA,0BACJ;AAAA;AAAA,sBACF;AAAA,sBACA,gDAAC,UAAK,WAAU,0CAAyC;AAAA;AAAA,wBAChD;AAAA,wBACP;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAC;AAAA,8BACT;AAAA,8BACAD,aAAY;AAAA,4BACd;AAAA,4BACA,OAAO,MAAM,KAAK;AAAA,4BACnB;AAAA;AAAA,8BACS,MAAM,KAAK;AAAA,8BAAE;AAAA;AAAA;AAAA,wBACvB;AAAA,yBACF;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UAEJ;AAAA;AAAA;AAAA,IACF;AAAA,IACAF;AAAA,EACF,IACA;AAIN,SACE,kFACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL;AAAA,QACA,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,OAAO,GAAG,GAAG,aAAa;AAAA,QACzC,SAAS,MAAM;AACb,cAAI,CAAC,YAAY,CAAC,SAAU,SAAQ,CAAC,SAAS,CAAC,IAAI;AAAA,QACrD;AAAA,QACA,eAAW,oBAAAG;AAAA,UACT;AAAA,UACA;AAAA,UACA,OACID,aAAY,cACZ;AAAA,UACJ,YAAY;AAAA,UACZ,YACE;AAAA,UACF;AAAA,QACF;AAAA,QAEC;AAAA,oBACC,kFACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACR,MAAK;AAAA,gBAEL;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,IAAG;AAAA,sBACH,IAAG;AAAA,sBACH,GAAE;AAAA,sBACF,QAAO;AAAA,sBACP,aAAY;AAAA;AAAA,kBACd;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,MAAK;AAAA,sBACL,GAAE;AAAA;AAAA,kBACJ;AAAA;AAAA;AAAA,YACF;AAAA,YACA,+CAAC,UAAK,WAAU,4BAA4B,0BAAe;AAAA,aAC7D,IACE,MAAM,SAAS,IACjB,gDAAC,UAAK,WAAU,8CACZ;AAAA,sBAAS,WAAW,KAAK,CAAC,cACxB,MAAM,MAAM,GAAG,QAAQ,IACvB,OACF,IAAI,CAAC,MACL,gDAAC,UAAa,WAAU,4BACtB;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MACE,gBAAgB,IAAI,CAAC,IAAI,YAAa,aAAa;AAAA,kBAErD,SAAQ;AAAA,kBAEP,mBAAS,CAAC;AAAA;AAAA,cACb;AAAA,cACC,SAAS,CAAC,YACT;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAY,UAAU,SAAS,CAAC,CAAC;AAAA,kBACjC,eAAe,CAAC,MAAM;AACpB,sBAAE,eAAe;AACjB,sBAAE,gBAAgB;AAAA,kBACpB;AAAA,kBACA,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AAClB,iCAAa,CAAC;AAAA,kBAChB;AAAA,kBACA,WAAU;AAAA,kBAEV;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,aAAa;AAAA,sBACb,WAAU;AAAA,sBAEV,yDAAC,UAAK,eAAc,SAAQ,GAAE,wBAAuB;AAAA;AAAA,kBACvD;AAAA;AAAA,cACF;AAAA,iBAjCO,CAmCX,CACD;AAAA,YACA,SACC,WAAW,KACX,MAAM,SAAS,YACf,CAAC,eACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,eAAe,CAAC,MAAM;AACpB,oBAAE,eAAe;AACjB,oBAAE,gBAAgB;AAAA,gBACpB;AAAA,gBACA,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,iCAAe,IAAI;AAAA,gBACrB;AAAA,gBACA,WAAU;AAAA,gBACV,cAAY,QAAQ,MAAM,SAAS,QAAQ;AAAA,gBAE3C,0DAAC,gBAAK,MAAK,MAAK,MAAK,WAAU,SAAQ,QAAO;AAAA;AAAA,kBAC1C,MAAM,SAAS;AAAA,mBACnB;AAAA;AAAA,YACF;AAAA,YAEH,SACC,WAAW,KACX,eACA,MAAM,SAAS,YACb;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,eAAe,CAAC,MAAM;AACpB,oBAAE,eAAe;AACjB,oBAAE,gBAAgB;AAAA,gBACpB;AAAA,gBACA,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,iCAAe,KAAK;AAAA,gBACtB;AAAA,gBACA,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,aAEN,IAEA,+CAAC,UAAK,WAAU,yDACb,uBACH;AAAA,UAIF;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAC;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cACV;AAAA,cACA,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAa;AAAA,cAEb,yDAAC,UAAK,eAAc,SAAQ,gBAAe,SAAQ,GAAE,gBAAe;AAAA;AAAA,UACtE;AAAA;AAAA;AAAA,IACF;AAAA,IAEC;AAAA,KACH;AAEJ;AAEA,UAAU,cAAc;AAGxB,IAAO,oBAAQ;;;ACzjCf,IAAAC,kBAAgC;AAChC,IAAAC,sBAAuB;;;ACAvB,IAAAC,sBAAuB;AAwJf,IAAAC,wBAAA;AA/ER,IAAMC,cAA6C;AAAA,EACjD,IAAI;AAAA,IACF,eAAe;AAAA,IACf,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,eAAe;AAAA,IACf,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,eAAe;AAAA,IACf,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,eAAe;AAAA,IACf,OAAO;AAAA,IACP,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAGA,IAAM,qBAAqD;AAAA,EACzD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WACE;AAAA,EACF,UAAU;AAAA,EACV,QAAQ;AACV;AAGA,IAAM,sBAAsD;AAAA,EAC1D,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACV;AAIO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,SAASA,YAAW,IAAI;AAE9B,SACE,gDAAC,SAAI,eAAW,oBAAAC,SAAW,iBAAiB,SAAS,GAEnD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAA;AAAA,UACT;AAAA,UACA,YAAY,mBAAmB,OAAO;AAAA,UACtC,oBAAoB,OAAO;AAAA,UAC3B;AAAA,QACF;AAAA,QAEA;AAAA,0DAAC,SAAI,WAAU,iCACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT,aAAa,OAAO;AAAA,kBACpB,mBAAmB,OAAO;AAAA,kBAC1B;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,YACC,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT,gBAAgB,OAAO;AAAA,kBACvB,iBAAiB;AAAA,kBACjB;AAAA,gBACF;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,aAEJ;AAAA,UAEC,WACC,+CAAC,SAAI,WAAU,oCAAoC,mBAAQ;AAAA;AAAA;AAAA,IAE/D;AAAA,IAGC,YACC,+CAAC,SAAI,eAAW,oBAAAA,SAAW,OAAO,MAAM,aAAa,GAAI,UAAS;AAAA,KAEtE;AAEJ;AAEA,IAAO,kBAAQ;;;AD9GP,IAAAC,wBAAA;AAvBD,IAAM,WAAoC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,UAAU,WAAW,QAAI,0BAAS,KAAK;AAE9C,QAAM,UAAU,WAAW,KAAK,CAAC,YAAY,KAAK,SAAS;AAC3D,QAAM,UAAU,UAAU,KAAK,MAAM,GAAG,QAAQ,IAAI;AACpD,QAAM,gBAAgB,KAAK,SAAS;AAEpC,SACE,gDAAC,SAAI,eAAW,oBAAAC,SAAW,iBAAiB,SAAS,GAClD;AAAA,aAAS,QACR;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAA;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC,eAAK,WAAW,IACf,aACE,iFAAG,sBAAW,IAEd,+CAAC,UAAK,WAAU,yDAAwD,qBAExE,IAGF,kFACG;AAAA,kBAAQ,IAAI,CAAC,KAAK,MACjB;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,IAAI,QAAQ;AAAA,cAClB,SAAS,IAAI,WAAW;AAAA,cACxB,MAAM,IAAI,QAAQ;AAAA,cAClB,MAAM,IAAI;AAAA,cAET,cAAI,YAAY,IAAI;AAAA;AAAA,YANhB,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAAA,UAOlC,CACD;AAAA,UAEA,WACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,YAAY,IAAI;AAAA,cAC/B,cAAY,QAAQ,aAAa;AAAA,cACjC,WAAU;AAAA,cAEV,0DAAC,QAAK,MAAM,cAAc,SAAQ,QAAO,MAAY;AAAA;AAAA,gBACjD;AAAA,iBACJ;AAAA;AAAA,UACF;AAAA,UAGD,YAAY,WAAW,KAAK,KAAK,SAAS,YACzC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,YAAY,KAAK;AAAA,cAChC,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WAEJ;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;AAEA,IAAO,mBAAQ;;;AEnJf,IAAAC,kBAQO;AACP,IAAAC,sBAAuB;AAmMf,IAAAC,wBAAA;AA9IR,IAAMC,cAUF;AAAA,EACF,IAAI;AAAA,IACF,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,IAAI;AAAA,IACF,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,IAAI;AAAA,IACF,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,IAAI;AAAA,IACF,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,IAAI;AAAA,IACF,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,KAAK;AAAA,IACH,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AAAA,EACA,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,EAClB;AACF;AAKA,IAAM,eAAW;AAAA,EACf,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,IACvB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,iBACG;AACH,UAAM,kBAAc,uBAAM;AAC1B,UAAM,YAAY,MAAM;AACxB,UAAM,gBAAgB,cAAc,GAAG,SAAS,iBAAiB;AACjE,UAAM,eAAW,wBAAyB,IAAI;AAE9C,mCAAU,MAAM;AACd,UAAI,CAAC,SAAS,QAAS;AACvB,eAAS,QAAQ,gBAAgB,QAAQ,aAAa;AAAA,IACxD,GAAG,CAAC,aAAa,CAAC;AAElB,UAAM,cAAU;AAAA,MACd,CAAC,SAAkC;AACjC,iBAAS,UAAU;AACnB,YAAI,OAAO,iBAAiB,YAAY;AACtC,uBAAa,IAAI;AAAA,QACnB,WAAW,cAAc;AACvB,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAAA,MACA,CAAC,YAAY;AAAA,IACf;AAEA,UAAMC,cAAaD,YAAW,IAAI,KAAKA,YAAW;AAClD,UAAM,cAAc,wBAAwB,KAAK;AAEjD,UAAM,kBAAkB,cACtB,yBAAyB,WACvB;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,eAAW,oBAAAE;AAAA,UACTD,YAAW;AAAA,UACX;AAAA,UACA,YAAY;AAAA,QACd;AAAA,QAEC;AAAA;AAAA,IACH,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,eAAW,oBAAAC;AAAA,UACTD,YAAW;AAAA,UACXA,YAAW;AAAA,UACX;AAAA,UACA,YAAY;AAAA,QACd;AAAA,QAEC;AAAA;AAAA,IACH,IAEA;AAEJ,UAAM,cACJ;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,MAAK;AAAA,QACL,oBAAkB;AAAA,QAClB;AAAA,QACA,eAAW,oBAAAC;AAAA,UACT,QAAQD,YAAW,cAAc;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACAA,YAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAGF,UAAM,WACJ,SAAS,kBACP;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAC;AAAA,UACT;AAAA,UACA,yBAAyB,YACvB,QAAQ,KAAK,KACb;AAAA,UACF,yBAAyB,YAAY,CAAC,SAAS;AAAA,QACjD;AAAA,QAEC;AAAA,mBACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACTD,YAAW;AAAA,gBACX;AAAA,gBACA,YAAY;AAAA,cACd;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UAED;AAAA;AAAA;AAAA,IACH,IACE;AAEN,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAC;AAAA,UACT;AAAA,UACA,iBAAiB,WAAW;AAAA,UAC5BD,YAAW;AAAA,UACX,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,CAAC,YAAY;AAAA,UACb;AAAA,QACF;AAAA,QAEC;AAAA;AAAA,UACA;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;;;ACzSf,IAAAE,kBAOO;AACP,IAAAC,sBAAuB;AAqLf,IAAAC,wBAAA;AAlKR,IAAM,gBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAgCA,IAAMC,cAWF;AAAA,EACF,IAAI;AAAA,IACF,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAEA,IAAM,eAA2C;AAAA,EAC/C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,aAAS;AAAA,EACb,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,IACvB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,GAAG;AAAA,EACL,GACA,iBACG;AACH,UAAMC,cAAa,gBAAgB;AACnC,UAAM,kBAAc,uBAAM;AAC1B,UAAM,WAAW,MAAM;AACvB,UAAM,gBAAgB,cAAc,GAAG,QAAQ,iBAAiB;AAChE,UAAM,eAAW,wBAAyB,IAAI;AAE9C,UAAM,gBAAY;AAAA,MAChB,CAAC,SAAkC;AACjC,iBAAS,UAAU;AACnB,YAAI,OAAO,iBAAiB,YAAY;AACtC,uBAAa,IAAI;AAAA,QACnB,WAAW,cAAc;AACvB,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAAA,MACA,CAAC,YAAY;AAAA,IACf;AAEA,UAAMC,cAAaF,YAAW,IAAI,KAAKA,YAAW;AAClD,UAAM,cAAc,sBAAsB,KAAK;AAE/C,UAAM,qBAAqB,QACvB,mBAAmB,YAAY,IAC/B;AAEJ,UAAM,SACJ;AAAA,MAAC;AAAA;AAAA,QACC,cAAY;AAAA,QACZ,eAAW,oBAAAG;AAAA,UACT;AAAA,UACA,eAAe,SAAS,qBAAqB;AAAA,UAC7CD,YAAW;AAAA,UACX,cAAc,OAAO;AAAA,UACrB,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,WAAW,YAAY,CAAC,YAAY;AAAA,UACpC,CAAC,YAAY,CAAC,WAAW,YAAY;AAAA,UACrC;AAAA,QACF;AAAA,QACA,SAAS,CAAC,MAAM;AACd,cAAI,WAAW,UAAU;AACvB,cAAE,eAAe;AAAA,UACnB;AACA,cAAI,CAAC,YAAY,CAAC,WAAW,YAAY,UAAU;AACjD,kBAAM,aAAa,CAAC,SAAS,SAAS;AACtC,qBAAS,EAAE,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAQ;AAAA,UACrD;AAAA,QACF;AAAA,QAEA;AAAA,0DAAC,UAAK,WAAU,iCACd;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,eAAW,oBAAAC;AAAA,kBACT;AAAA,kBACA,WACI,uBACA,WAAW,WACT,mBACA;AAAA,gBACR;AAAA,gBACA,oBAAkB;AAAA,gBAClB;AAAA,gBACA;AAAA,gBACA,SAAS,CAAC,MAAM;AACd,sBAAI,WAAW,UAAU;AACvB,sBAAE,eAAe;AAAA,kBACnB;AAAA,gBACF;AAAA,gBACC,GAAG;AAAA;AAAA,YACN;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACAD,YAAW;AAAA,kBACX,YACI,oBAAAC;AAAA,oBACE;AAAA,oBACA,kBAAkB,OAAO,YAAY;AAAA,oBACrC,sBAAsB,QAAQ;AAAA,oBAC9B;AAAA,kBACF,IACA;AAAA,kBACJ,YAAY;AAAA,gBACd;AAAA;AAAA,YACF;AAAA,YAEC,sBACC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YAGD,WACC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,aAAa,IAAI;AAAA,kBACjB;AAAA,gBACF;AAAA,gBAEC,UAAAF,YAAW,SAAS,IAAI;AAAA;AAAA,YAC3B;AAAA,YAGD,UACC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAE;AAAA,kBACT;AAAA,kBACA,aAAa,IAAI;AAAA,kBACjB;AAAA,gBACF;AAAA,gBAEC,UAAAF,YAAW,QAAQ,IAAI;AAAA;AAAA,YAC1B;AAAA,YAGF;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAE;AAAA,kBACT;AAAA,kBACA;AAAA,kBACAD,YAAW;AAAA,kBACXA,YAAW;AAAA,kBACXA,YAAW;AAAA,gBACb;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UACC,SACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,eAAW,oBAAAC;AAAA,gBACT;AAAA,gBACA,yBAAyB,WACrB,6EACA;AAAA,cACN;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACTD,YAAW;AAAA,sBACX;AAAA,sBACA,YAAY;AAAA,oBACd;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA,gBACC,eACC;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI;AAAA,oBACJ,eAAW,oBAAAC;AAAA,sBACTD,YAAW;AAAA,sBACX;AAAA,sBACA,yBAAyB,aAAa;AAAA,sBACtC,YAAY;AAAA,oBACd;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA;AAAA,UAEJ;AAAA,UAED,CAAC,SAAS,eACT;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,eAAW,oBAAAC;AAAA,gBACTD,YAAW;AAAA,gBACX;AAAA,gBACA,yBAAyB,aAAa;AAAA,gBACtC,YAAY;AAAA,cACd;AAAA,cAEC;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IAEJ;AAGF,QAAI,SAAS;AACX,aACE,+CAAC,0BAAe,MAAM,SAAS,UAAU,iBACtC,kBACH;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT;AACF;AAEA,OAAO,cAAc;AAErB,IAAO,iBAAQ;;;ACnVf,IAAAE,kBAQO;AACP,IAAAC,sBAAuB;AAugBf,IAAAC,wBAAA;AArdR,IAAMC,cAGF;AAAA,EACF,KAAK;AAAA,IACH,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,KAAK;AAAA,IACH,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EAAI,MAAM;AAAA,IACR,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAE;AAEJ,IAAMC,cAWF;AAAA,EACF,IAAI;AAAA,IACF,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,+BAA+B;AACrC,IAAM,mBAAmB;AAEzB,IAAM,eAAe,CAAC,iBAAyB;AAC7C,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,eAAe,eAAe;AACpC,SAAO,KAAK,IAAI,kBAAkB,YAAY;AAChD;AAEA,IAAM,iBAAiB,CAAC,UAAuD;AAC7E,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,GAAG,KAAK;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AAAA,EACA,sBAAsB;AAAA,EACtB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,mBAAe,wBAA8B,IAAI;AACvD,QAAM,iBAAa,wBAAwC,CAAC,CAAC;AAC7D,QAAM,sBAAkB,wBAAqC,CAAC,CAAC;AAC/D,QAAM,kBACJ,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,MAAS;AACtE,QAAM,CAAC,sBAAsB,uBAAuB,QAClD,0BAA8B;AAChC,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAiB;AAC7D,QAAM,uBAAuB,eAAe,cAAc;AAC1D,QAAM,uBAAuB,mBAAmB,wBAAwB;AACxE,QAAM,iBACJ,YAAY,SACR,KACA,YAAY,OACV,eACA,YAAY,OACV,eACA,YAAY,OACV,eACA,YAAY,OACV,eACA,YAAY,OACV,eACA;AAIhB,QAAM,mBACJ,YAAY,UAAU,YAAY,OAC9B,KACA,YAAY,OACV,eACA,YAAY,OACV,eACA,YAAY,OACV,eACA,YAAY,OACV,eACA;AAEd,QAAM,cAAc,QAAQ,UAAU;AACtC,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,IACA,QAAQ,UAAU,CAAC,WAAW,OAAO,UAAU,KAAK;AAAA,EACtD;AACA,QAAMC,cAAaF,YAAW,IAAI,KAAKA,YAAW;AAClD,QAAM,cAAcD,YAAW,KAAK,KAAKA,YAAW;AACpD,QAAM,gBAAgB,4BAA4B,KAAK;AACvD,QAAM,gBAAgB,YAAY,WAAW,YAAY;AACzD,QAAM,kBAAkB,cACpB,gBACE,4BAA4B,WAAW,EAAE,cACxCA,YAAW,WAAW,KAAKA,YAAW,SAAS,aAClD,gBACE,cAAc,aACd,YAAY;AAClB,QAAM,oBAAoB,CAAC,mBAAmB,CAAC;AAC/C,aAAW,QAAQ,SAAS;AAC5B,kBAAgB,QAAQ,SAAS;AAEjC,QAAM,qBAAiB,yBAAQ,MAAM;AACnC,UAAM,oBAAoB,WAAW,+BAA+B,CAAC,SAAS,WAAW;AACzF,UAAM,SAAS;AAEf,QAAI,mBAAmB;AACrB,aAAO;AAAA,QACL,OAAO,QAAQ,iBAAiB,MAAM,SAAS,CAAC;AAAA,QAChD,WAAW,mBAAmB,4BAA4B,QAAQ,WAAW,OAAO,iBAAiB,OAAO,MAAM;AAAA,MACpH;AAAA,IACF;AAEA,UAAM,eAAe,MAAM;AAC3B,WAAO;AAAA,MACL,OAAO,QAAQ,YAAY,OAAO,SAAS,CAAC;AAAA,MAC5C,WAAW,mBAAmB,WAAW,cAAc,WAAW,OAAO,MAAM;AAAA,IACjF;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,iBAAiB,CAAC;AAEhD,QAAM,8BAA0B,6BAAY,MAAM;AAChD,UAAM,YAAY,aAAa;AAC/B,UAAM,eAAe,WAAW,QAAQ,WAAW;AAEnD,QAAI,CAAC,aAAa,CAAC,cAAc;AAC/B;AAAA,IACF;AAEA,UAAM,kBAAkB,OAAO,iBAAiB,SAAS;AACzD,UAAM,cAAc,WAAW,iBAAiB,eAAe,GAAG,KAAK;AACvE,UAAM,eAAe,WAAW,iBAAiB,gBAAgB,GAAG,KAAK;AACzE,UAAM,sBAAsB,KAAK;AAAA,MAC/B;AAAA,MACA,UAAU,cAAc,cAAc;AAAA,IACxC;AAEA,QAAI,mBAAmB;AACrB,YAAM,eAAe,sBAAsB;AAC3C,YAAMI,SAAQ,aAAa,YAAY;AACvC,YAAMC,kBAAiB,KAAK,IAAI,GAAG,eAAeD,SAAQ,CAAC;AAC3D,YAAME,UAAS,cAAc,cAAc,eAAeF;AAC1D,8BAAwB;AAAA,QACtB,OAAO,GAAGC,eAAc;AAAA,QACxB,WAAW,cAAcC,OAAM;AAAA,MACjC,CAAC;AACD;AAAA,IACF;AAEA,UAAM,YACJ,wBAAwB,iBACpB,iBACA,aAAa;AACnB,UAAM,QAAQ,aAAa,SAAS;AACpC,UAAM,iBAAiB,KAAK;AAAA,MAC1B;AAAA,MACA,KAAK,IAAI,WAAW,mBAAmB,IAAI,QAAQ;AAAA,IACrD;AAGA,QAAI,SAAS,aAAa,aAAa;AACvC,UAAM,YAAY,KAAK;AAAA,MACrB;AAAA,MACA,UAAU,cAAc,iBAAiB;AAAA,IAC3C;AACA,aAAS,KAAK,IAAI,KAAK,IAAI,QAAQ,KAAK,GAAG,SAAS;AAEpD,4BAAwB;AAAA,MACtB,OAAO,GAAG,cAAc;AAAA,MACxB,WAAW,cAAc,MAAM;AAAA,IACjC,CAAC;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,uBAAmB;AAAA,IACvB,MACE,QACG,IAAI,CAAC,WAAW;AACf,YAAM,iBACJ,OAAO,OAAO,UAAU,WACpB,OAAO,QACP,OAAO,UAAU,SACf,SACA;AACR,aAAO,GAAG,OAAO,KAAK,IAAI,OAAO,SAAS,EAAE,IAAI,cAAc;AAAA,IAChE,CAAC,EACA,KAAK,GAAG;AAAA,IACb,CAAC,OAAO;AAAA,EACV;AAEA,uCAAgB,MAAM;AACpB,QAAI,CAAC,sBAAsB;AACzB,wBAAkB,MAAS;AAC3B;AAAA,IACF;AAEA,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,UAAM,kBAAkB,OAAO,iBAAiB,SAAS;AACzD,UAAM,cAAc,WAAW,iBAAiB,eAAe,GAAG,KAAK;AACvE,UAAM,eAAe,WAAW,iBAAiB,gBAAgB,GAAG,KAAK;AACzE,UAAM,sBAAsB,KAAK;AAAA,MAC/B;AAAA,MACA,UAAU,cAAc,cAAc;AAAA,IACxC;AAEA,UAAM,SAAS,gBAAgB,QAAQ;AAAA,MACrC,CAAC,SAAS,MAAM,eAAe;AAAA,IACjC;AACA,UAAM,eAAe,OAAO;AAAA,MAC1B,CAAC,YAAY,UAAW,QAAQ,aAAa,QAAQ;AAAA,MACrD;AAAA,IACF;AACA,UAAM,mBAAmB,KAAK,IAAI,cAAc,mBAAmB;AAEnE,sBAAkB,oBAAoB,MAAS;AAAA,EACjD,GAAG,CAAC,sBAAsB,kBAAkB,MAAM,cAAc,CAAC;AAEjE,uCAAgB,MAAM;AACpB,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AAEA,4BAAwB;AAExB,UAAM,qBAAqB,MAAM;AAC/B,8BAAwB;AAAA,IAC1B;AAEA,QAAI;AAEJ,QAAI,OAAO,mBAAmB,aAAa;AACzC,uBAAiB,IAAI,eAAe,MAAM;AACxC,gCAAwB;AAAA,MAC1B,CAAC;AAED,UAAI,aAAa,SAAS;AACxB,uBAAe,QAAQ,aAAa,OAAO;AAAA,MAC7C;AAEA,iBAAW,QAAQ,QAAQ,CAAC,WAAW;AACrC,YAAI,QAAQ;AACV,0BAAgB,QAAQ,MAAM;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,iBAAiB,UAAU,kBAAkB;AAEpD,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,kBAAkB;AACvD,sBAAgB,WAAW;AAAA,IAC7B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,oBAAoB;AAC3C,QAAM,yBAAyB,wBAAwB;AAEvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,gBACI,uCACA;AAAA,QACJ;AAAA,QACAJ,YAAW;AAAA,QACX,aAAa;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,MACA,MAAK;AAAA,MACL,iBAAe;AAAA,MAEf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAI;AAAA,cACT;AAAA,cACAJ,YAAW;AAAA,cACXA,YAAW;AAAA,YACb;AAAA,YACA,OAAO,0BAA0B;AAAA,YAEjC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAI;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA,YAAY,WAAW;AAAA,kBACvB,YAAY,UAAU,cAAc;AAAA,kBACpC,YAAY,WAAW,YAAY;AAAA,gBACrC;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEC,wBACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,YACX,OAAO;AAAA,cACL,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ;AAAA,YAEC,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,oBAAM,mBAAwC,CAAC;AAC/C,kBAAI,OAAO,SAAS,OAAO,UAAU,QAAQ;AAC3C,sBAAM,cAAc,eAAe,OAAO,KAAK;AAC/C,oBAAI,aAAa;AACf,mCAAiB,QAAQ;AAAA,gBAC3B;AAAA,cACF;AACA,kBAAI,sBAAsB;AACxB,iCAAiB,WAAW;AAAA,cAC9B;AAEA,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,KAAK,CAAC,SAAS;AACb,oCAAgB,QAAQ,KAAK,IAAI;AAAA,kBACnC;AAAA,kBACA,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACAJ,YAAW;AAAA,oBACXA,YAAW;AAAA,kBACb;AAAA,kBACA,OAAO;AAAA,kBAEP;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAI;AAAA,wBACT;AAAA,wBACAJ,YAAW;AAAA,sBACb;AAAA,sBAEC;AAAA,+BAAO,QACND,YAAW,OAAO,MAAM,MAAkBC,YAAW,IAAI;AAAA,wBAC1D,OAAO,SACN,+CAAC,UAAK,eAAW,oBAAAI,SAAWJ,YAAW,OAAO,SAAS,GACpD,iBAAO,OACV;AAAA;AAAA;AAAA,kBAEJ;AAAA;AAAA,gBAxBK,WAAW,OAAO,KAAK;AAAA,cAyB9B;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA,QAGD,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,gBAAM,WAAW,OAAO,SAAS;AACjC,gBAAM,iBAAiB,YAAY,OAAO;AAC1C,gBAAM,mBACJ,oBAAoB,CAAC,uBAAuB;AAC9C,gBAAM,mBACJ,OAAO,UAAU,SACb,OAAO,QACP,iBAAiB,mBACf,SACA;AACR,cAAI;AAEJ,cAAI,kBAAkB;AACpB,0BAAc;AAAA,cACZ,MAAM;AAAA,cACN,UAAU;AAAA,YACZ;AAEA,gBAAI,oBAAoB,qBAAqB,QAAQ;AACnD,oBAAM,cAAc,eAAe,gBAAgB;AACnD,kBAAI,aAAa;AACf,4BAAY,OAAO;AACnB,4BAAY,QAAQ;AAAA,cACtB;AAAA,YACF;AAEA,gBAAI,sBAAsB;AACxB,0BAAY,WAAW;AAAA,YACzB;AAAA,UACF;AAEA,cAAI,wBAAwB,YAAY,gBAAgB;AACtD,gBAAI,CAAC,aAAa;AAChB,4BAAc;AAAA,gBACZ,MAAM;AAAA,gBACN,UAAU;AAAA,cACZ;AAAA,YACF,OAAO;AACL,0BAAY,OAAO;AAAA,YACrB;AACA,wBAAY,QAAQ,GAAG,cAAc;AACrC,gBAAI,sBAAsB;AACxB,0BAAY,WAAW;AAAA,YACzB;AAAA,UACF;AAEA,gBAAM,cACJ,qBAAqB,cACjB;AAAA,YACE,GAAI,qBAAqB,CAAC;AAAA,YAC1B,GAAI,eAAe,CAAC;AAAA,UACtB,IACA;AAEN,iBACE;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,CAAC,SAAS;AACb,2BAAW,QAAQ,KAAK,IAAI;AAAA,cAC9B;AAAA,cAEA,MAAK;AAAA,cACL,eAAW,oBAAAI;AAAA,gBACT;AAAA,gBACA;AAAA,gBACAJ,YAAW;AAAA,gBACXA,YAAW;AAAA,gBACX,kBAAkB,cAAc;AAAA,gBAChC,iBACI,kEACA,oBAAAI;AAAA,kBACE;AAAA,kBACA,WACI,kBACA;AAAA,kBACJ,gBAAgB,cAAc,QAAQ,YAAY;AAAA,gBACpD;AAAA,cACN;AAAA,cACA,SAAS,MAAM;AACb,oBAAI,kBAAkB,OAAO,UAAU,OAAO;AAC5C;AAAA,gBACF;AACA,yBAAS,OAAO,KAAK;AAAA,cACvB;AAAA,cACA,UAAU;AAAA,cACV,gBAAc;AAAA,cACd,MAAK;AAAA,cACL,gBAAc;AAAA,cACd,UAAU,iBAAiB,KAAK,WAAW,IAAI;AAAA,cAC/C,OAAO;AAAA,cACN,GAAG;AAAA,cAEJ;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACAJ,YAAW;AAAA,kBACb;AAAA,kBAEC;AAAA,2BAAO,QACND,YAAW,OAAO,MAAM,MAAkBC,YAAW,IAAI;AAAA,oBAC1D,OAAO,UAAU,CAAC,uBAAuB,aACxC;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAI;AAAA,0BACTJ,YAAW;AAAA,0BACX;AAAA,0BACA,iBAAiB,aAAa;AAAA,wBAChC;AAAA,wBACA,OACE,kBAAkB,OAAO,OAAO,UAAU,WACtC,OAAO,QACP;AAAA,wBAGL,iBAAO;AAAA;AAAA,oBACV;AAAA;AAAA;AAAA,cAEJ;AAAA;AAAA,YAxDK,OAAO;AAAA,UAyDd;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,YAAY,cAAc;AAE1B,IAAO,sBAAQ;;;ACltBf,IAAAK,kBAA6B;AAC7B,IAAAC,sBAAuB;AA6Qf,IAAAC,wBAAA;AA3NR,IAAM,eAAkD;AAAA,EACtD,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AACF;AAIA,IAAM,YAA2C;AAAA,EAC/C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAIO,SAAS,eACd,OACoB;AACpB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,WAAW;AAAA,EACb,IAAI;AAEJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,cAAU,uBAAM;AACtB,QAAM,SAAS,aAAa,KAAK,KAAK,aAAa;AAEnD,QAAM,aAAa,CAAC,MAClB,MAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,CAAC,IAAI,UAAU;AAEvD,QAAM,cAAc,CAAC,GAAM,iBAA0B;AACnD,QAAI,YAAY,aAAc;AAC9B,QAAI,SAAS,UAAU;AACrB,eAAS,CAAC;AAAA,IACZ,OAAO;AACL,YAAM,MAAM,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC9D,eAAS,IAAI,SAAS,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,SACE,gDAAC,SAAI,eAAW,oBAAAC,SAAW,iBAAiB,SAAS,GAClD;AAAA,aACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,WAAU;AAAA,QAET;AAAA;AAAA,IACH;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAA,SAAW,QAAQ,UAAU,IAAI,GAAG,GAAG;AAAA,QAClD,MAAM,SAAS,WAAW,eAAe;AAAA,QACzC,mBAAiB,QAAQ,UAAU;AAAA,QAElC,kBAAQ,IAAI,CAAC,QAAQ;AACpB,gBAAM,WAAW,WAAW,IAAI,KAAK;AACrC,gBAAM,eAAe,YAAY,CAAC,CAAC,IAAI;AAEvC,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAM,SAAS,WAAW,UAAU;AAAA,cACpC,gBAAc;AAAA,cACd,UAAU;AAAA,cACV,SAAS,MAAM,YAAY,IAAI,OAAO,CAAC,CAAC,IAAI,QAAQ;AAAA,cACpD,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA,gBAAgB;AAAA,gBAChB,WACI,CAAC,OAAO,QAAQ,OAAO,EAAE,IACzB;AAAA,cACN;AAAA,cAGC;AAAA,oBAAI,QACH;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,WACI,OAAO,OACP;AAAA,oBACN;AAAA,oBAEC,UAAAD,YAAW,IAAI,MAAM,QAAQ;AAAA;AAAA,gBAChC;AAAA,gBAIF,gDAAC,SAAI,WAAU,kBACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAC;AAAA,wBACT;AAAA,wBACA,WACI,OAAO,QACP;AAAA,sBACN;AAAA,sBAEC,cAAI;AAAA;AAAA,kBACP;AAAA,kBACC,IAAI,eACH,+CAAC,OAAE,WAAU,6EACV,cAAI,aACP;AAAA,mBAEJ;AAAA,gBAGA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,WACI,CAAC,OAAO,aAAa,OAAO,eAAe,IAC3C;AAAA,oBACN;AAAA,oBACA,eAAY;AAAA,oBAEX,sBACC,+CAAC,SAAI,WAAU,qCAAoC;AAAA;AAAA,gBAEvD;AAAA;AAAA;AAAA,YA7DK,IAAI;AAAA,UA8DX;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEA,IAAO,yBAAQ;;;ACvWf,IAAAC,sBAAuB;AACvB,IAAAC,kBAA6C;AAgH/B,IAAAC,wBAAA;AAzFd,IAAM,mBAAmB;AACzB,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,eAAe;AAErB,IAAM,YAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,MAAM;AACJ,QAAM,cAAU,uBAAM;AAOtB,QAAM,eAAe,gBAAAC,QAAM,eAAe,QAAQ,IAC7C,WACD;AAEJ,QAAM,YAAY,YAAY,cAAc,OAAO,MAAM,SAAS,OAAO;AAEzE,QAAM,gBAAgB,cAAc,GAAG,SAAS,iBAAiB;AACjE,QAAM,SAAS,OAAO,GAAG,SAAS,UAAU;AAC5C,QAAM,UAAU,QAAQ,GAAG,SAAS,WAAW;AAC/C,QAAM,SAAS,WAAW,GAAG,SAAS,UAAU;AAEhD,QAAM,cAAc,CAAC,eAAe,QAAQ,SAAS,MAAM,EACxD,OAAO,OAAO,EACd,KAAK,GAAG,EACR,KAAK;AAER,QAAM,QACJ,gBAAgB,cACZ,gBAAAA,QAAM,aAAa,cAAc;AAAA,IAC/B,IAAI;AAAA,IACJ,wBAAoB,oBAAAC;AAAA,MAClB,aAAa,MAAM,kBAAkB;AAAA,MACrC;AAAA,IACF;AAAA,IACA,gBACE,qBAAqB,UACjB,SACC,aAAa,MAAM,cAAc,KAAK;AAAA,EAC/C,CAAC,IACD;AAEN,QAAM,gBACJ,WAAW,WACP,mDACA;AAEN,QAAM,eAAe,UAAU,SAAS,WAAW;AAEnD,QAAM,sBACJ,WAAW,WACP,gCACA;AAEN,QAAM,wBACJ,WAAW,WACP,+BACA;AAEN,QAAM,cACJ,qBAAqB,UACjB,aACA,qBAAqB,YACnB,eACA;AAER,SACE,gDAAC,SAAI,eAAW,oBAAAA,SAAW,eAAe,cAAc,SAAS,GAC/D;AAAA,oDAAC,SAAI,WAAW,qBACZ;AAAA,gBAAS,kBACT,gDAAC,SAAI,WAAU,2BACZ;AAAA,iBACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YAET;AAAA;AAAA,cACA,YACC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAY;AAAA,kBACb;AAAA;AAAA,cAED;AAAA;AAAA;AAAA,QAEJ;AAAA,QAED,CAAC,YAAY,iBACZ,+CAAC,UAAK,WAAU,kDACb,yBACH;AAAA,SAEJ;AAAA,MAED,eACC;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,eAAW,oBAAAA,SAAW,gBAAgB,gBAAgB;AAAA,UAErD;AAAA;AAAA,MACH;AAAA,MAED,eAAe,+CAAC,SAAI,WAAU,gBAAgB,uBAAY;AAAA,OAC7D;AAAA,IAEA,gDAAC,SAAI,eAAW,oBAAAA,SAAW,UAAU,qBAAqB,GACxD;AAAA,qDAAC,SAAI,WAAU,mCAAmC,iBAAM;AAAA,MACvD,YACC,+CAAC,OAAE,IAAI,QAAQ,eAAW,oBAAAA,SAAW,WAAW,SAAS,GACtD,oBACH;AAAA,MAED,QACC,+CAAC,OAAE,IAAI,SAAS,eAAW,oBAAAA,SAAW,WAAW,UAAU,GACxD,iBACH,IACE,OACF,+CAAC,OAAE,IAAI,QAAQ,eAAW,oBAAAA,SAAW,WAAW,WAAW,GACxD,gBACH,IACE;AAAA,OACN;AAAA,KACF;AAEJ;AAEA,IAAO,oBAAQ;;;ACvKf,IAAAC,sBAAuB;AA6CrB,IAAAC,wBAAA;AAvCF,IAAM,gBAAmD;AAAA,EACvD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,aAA4C;AAAA,EAChD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,yBAAwD;AAAA,EAC5D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAUA,IAAM,oBAAuD;AAAA,EAC3D,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAM,aAAwC,CAAC;AAAA,EAC7C,UAAU;AAAA,EACV,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,MACE;AAAA,EAAC;AAAA;AAAA,IACC,eAAW,oBAAAC;AAAA,MACT;AAAA,MACA,uBAAuB,eAAe;AAAA,MACtC,kBAAkB,OAAO;AAAA,MACzB,cAAc,OAAO;AAAA,MACrB,WAAW,GAAG;AAAA,MACd;AAAA,IACF;AAAA,IAEC;AAAA;AACH;AAGF,IAAO,qBAAQ;;;AC3Df,IAAAC,sBAAuB;AAwDb,IAAAC,wBAAA;AA5CV,IAAMC,cAGF;AAAA,EACF,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AACZ,MAAM;AACJ,QAAM,MAAMA,YAAW,OAAO;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEE;AAAA,kBAAS,gBACT;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,IAAI;AAAA,YACN;AAAA,YAEA,0DAAC,SACE;AAAA,uBACC,+CAAC,QAAG,WAAU,4EACX,iBACH;AAAA,cAED,eACC,+CAAC,OAAE,WAAU,uDACV,uBACH;AAAA,eAEJ;AAAA;AAAA,QACF;AAAA,QAEF,+CAAC,SAAI,eAAW,oBAAAA,SAAW,aAAa,IAAI,IAAI,GAAI,UAAS;AAAA,QAC5D,UACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,IAAI;AAAA,YACN;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,sBAAQ;;;ACrFf,IAAAC,sBAAuB;AACvB,IAAAC,kBAIO;AA6MD,IAAAC,wBAAA;AAvMN,IAAMC,cAMF;AAAA,EACF,IAAI;AAAA,IACF,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAgBA,IAAMC,cAAuD;AAAA,EAC3D,QAAQ;AAAA,IACN,WAAW;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EACA,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAE;AAEJ,IAAM,aAGF;AAAA,EACF,OACE;AAAA,EACF,SACE;AACJ;AAEA,IAAM,oBAAoB,CAAC,UAAqB;AAC9C,MAAI,KAAC,gCAAe,KAAK,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM;AACnB,SAAO,QAAQ,SAAS,KAAK,cAAc,KAAK,YAAY;AAC9D;AAEA,IAAM,mBAAmB,CACvB,OACA,MACA,SACc;AACd,MAAI,KAAC,gCAAe,KAAK,KAAK,CAAC,kBAAkB,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,QAAM,QAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ;AAEA,SAAO,gBAAAC,QAAM,aAAa,OAAuB,KAAK;AACxD;AAaA,IAAM,mBACJ;AAEF,IAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA,mBAAmB;AAAA,EACnB,WAAW;AACb,MAAM;AACJ,QAAM,YAAaD,YAAW,IAAI,KAAKA,YAAW;AAClD,QAAM,YAAYD,YAAW,IAAI,KAAKA,YAAW;AAEjD,QAAM,cACJ,qBAAqB,aACjB,oBAAAG;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,IACA,WAAW,gBAAgB;AAEjC,QAAM,mBAAe,oBAAAA;AAAA,IACnB;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,UACJ,iBAAiB,SACf;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,IACE;AAEN,QAAM,WACJ,kBAAkB,SAChB;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,IACE;AAEN,QAAM,mBAAmB,gBAAAD,QAAM,SAAS;AAAA,IAAI;AAAA,IAAU,CAAC,UACrD,iBAAiB,OAAO,MAAM,IAAI;AAAA,EACpC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,iBAAe;AAAA,MACf,eAAa;AAAA,MAEZ;AAAA;AAAA,QACD,+CAAC,SAAI,WAAU,oCAAoC,4BAAiB;AAAA,QACnE;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,qBAAQ;;;ACzQf,IAAAE,kBAA2D;AAmRnD,IAAAC,wBAAA;AAzMR,IAAMC,WAAU;AAAA,EACd,IAAI,EAAE,MAAM,WAAW,SAAS,YAAY;AAAA,EAC5C,IAAI,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,EAC9C,MAAM,EAAE,MAAM,aAAa,SAAS,YAAY;AAAA,EAChD,IAAI,EAAE,MAAM,WAAW,SAAS,cAAc;AAChD;AAEA,IAAMC,cAAa;AAAA,EACjB,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AACR;AAEA,IAAM,SAAS;AAAA,EACb,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,IAAM,cAAqE;AAAA,EACzE,KAAK;AAAA,IACH,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EAAI,MAAM;AAAA,IACR,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,UACE;AAAA,IACF,MAAM;AAAA,EACR;AAAE;AAIJ,IAAM,mBAAoD,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,gBAAgB;AAClB,MAAM;AACJ,QAAM,kBAAc,uBAAM;AAC1B,QAAM,eAAe,UAAU;AAE/B,QAAM,CAAC,kBAAkB,mBAAmB,QAC1C,0BAAmB,YAAY;AAEjC,iCAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,wBAAoB,SAAS,CAAC,CAAC;AAAA,EACjC,GAAG,CAAC,cAAc,KAAK,CAAC;AAExB,iCAAU,MAAM;AACd,QAAI,aAAc;AAClB,wBAAoB,YAAY;AAAA,EAClC,GAAG,CAAC,cAAc,YAAY,CAAC;AAE/B,QAAM,qBAAiB;AAAA,IACrB,MAAO,eAAgB,SAAS,CAAC,IAAK;AAAA,IACtC,CAAC,cAAc,OAAO,gBAAgB;AAAA,EACxC;AACA,QAAM,kBAAc,yBAAQ,MAAM,IAAI,IAAI,cAAc,GAAG,CAAC,cAAc,CAAC;AAE3E,QAAMC,eAAcF,SAAQ,IAAI;AAChC,QAAM,eAAeC,YAAW,OAAO;AACvC,QAAM,WAAW,OAAO,GAAG;AAC3B,QAAM,eAAe,YAAY,KAAK,KAAK,YAAY;AAEvD,QAAM,eAAe,CACnB,aACA,mBACG;AACH,QAAI,YAAY,eAAgB;AAEhC,UAAM,oBAAoB,YAAY,IAAI,WAAW;AACrD,QAAI;AAEJ,QAAI,kBAAkB,UAAU;AAC9B,qBAAe,oBAAoB,CAAC,IAAI,CAAC,WAAW;AAAA,IACtD,OAAO;AACL,qBAAe,oBACX,eAAe,OAAO,CAAC,SAAS,SAAS,WAAW,IACpD,CAAC,GAAG,gBAAgB,WAAW;AAAA,IACrC;AAEA,QAAI,CAAC,aAAc,qBAAoB,YAAY;AACnD,eAAW,YAAY;AAAA,EACzB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,iBAAiB,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtE;AAAA,MAEC;AAAA,kBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,8DAA8D,CAAC,cAAc,SAAS,EAAE;AAAA,YAElG;AAAA;AAAA,QACH;AAAA,QAED,eACC,+CAAC,OAAE,WAAU,uDACV,uBACH;AAAA,QAGF,+CAAC,SAAI,WAAW,kBAAkB,QAAQ,IACvC,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,gBAAM,WAAW,GAAG,WAAW,IAAI,IAAI,IAAI,KAAK;AAChD,gBAAM,aAAa,YAAY,IAAI,OAAO,KAAK;AAC/C,gBAAM,mBAAmB,OAAO,YAAY;AAE5C,iBACE,gDAAC,gBAAAE,QAAM,UAAN,EACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,IAAI;AAAA,gBACJ,MAAM,GAAG,IAAI;AAAA,gBACb,OAAO,OAAO;AAAA,gBACd,SAAS;AAAA,gBACT,UAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,UAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,aAAa,OAAO,OAAO,OAAO,QAAQ;AAAA,gBACzD,WAAW;AAAA,kBACT;AAAA,kBACAD,aAAY;AAAA,kBACZA,aAAY;AAAA,kBACZ;AAAA,kBACA,aACI,aAAa,WACb;AAAA,kBACJ,YAAY,mBACR,kCACA;AAAA,kBACJ,aAAa;AAAA,gBACf,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBACX,gBAAc;AAAA,gBACd,iBAAe,YAAY;AAAA,gBAC3B,UAAU,YAAY;AAAA,gBAErB;AAAA,yBAAO;AAAA,kBACP,OAAO,eACN,+CAAC,UAAK,WAAU,uDACb,iBAAO,aACV;AAAA;AAAA;AAAA,YAEJ;AAAA,eAvCmB,OAAO,KAwC5B;AAAA,QAEJ,CAAC,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,iBAAiB,cAAc;AAE/B,IAAO,2BAAQ;;;ACxVf,IAAAE,kBAAgE;AAChE,IAAAC,sBAAuB;AAsXnB,IAAAC,wBAAA;AA/WJ,IAAMC,gBAUF;AAAA,EACF,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EAAI,MAAM;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UACE;AAAA,EACJ;AACF;AAEA,IAAM,iBAAiBA,cAAa;AAEpC,SAAS,UAAU,OAAkB;AACnC,SAAOA,cAAa,KAAK,KAAK;AAChC;AAKA,IAAM,eAA6D;AAAA,EACjE,MAAM,CAAC,WAAW,SAAS;AAAA,EAC3B,QAAQ,CAAC,WAAW,SAAS;AAAA,EAC7B,QAAQ,CAAC,WAAW,SAAS;AAAA,EAC7B,QAAQ,CAAC,WAAW,SAAS;AAAA,EAC7B,SAAS,CAAC,WAAW,SAAS;AAAA,EAAI,MAAM,CAAC,WAAW,SAAS;AAAA,EAC7D,KAAK,CAAC,WAAW,SAAS;AAAA,EAC1B,QAAQ,CAAC,WAAW,SAAS;AAAA,EAC7B,OAAO,CAAC,WAAW,SAAS;AAAA,EAC5B,QAAQ,CAAC,WAAW,SAAS;AAAA,EAC7B,MAAM,CAAC,WAAW,SAAS;AAAA,EAC3B,OAAO,CAAC,WAAW,SAAS;AAAA,EAC5B,SAAS,CAAC,WAAW,SAAS;AAAA,EAC9B,MAAM,CAAC,WAAW,SAAS;AAAA,EAC3B,MAAM,CAAC,WAAW,SAAS;AAAA,EAC3B,KAAK,CAAC,WAAW,SAAS;AAAA,EAC1B,OAAO,CAAC,WAAW,SAAS;AAAA,EAC5B,MAAM,CAAC,WAAW,SAAS;AAAA,EAC3B,MAAM,CAAC,WAAW,SAAS;AAAA,EAC3B,SAAS,CAAC,WAAW,SAAS;AAAA,EAC9B,OAAO,CAAC,WAAW,SAAS;AAC9B;AAEA,SAAS,gBACP,OACA,MACA,IACkB;AAClB,QAAM,OAAO,aAAa,KAAK,KAAK,aAAa;AACjD,SAAO,CAAC,QAAQ,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC;AACxC;AAwCO,IAAM,YAAsC,CAAC;AAAA,EAClD,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,MAAM;AACJ,QAAM,CAAC,cAAc,UAAU,IAAI;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,IACA,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,EACF;AACA,QAAM,OAAO,WAAW,aAAa;AACrC,QAAM,SAAS,UAAU,KAAK;AAE9B,QAAMC,cAAa,gBAAgB;AACnC,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAS,YAAY;AAC/C,QAAM,CAAC,SAAS,UAAU,QAAI,0BAAS,KAAK;AAC5C,QAAM,kBAAc,wBAA6C,IAAI;AACrE,QAAM,eAAW,wBAA+B,IAAI;AACpD,QAAM,eAAW,wBAAyB,IAAI;AAC9C,QAAM,oBAAgB,wBAAO,CAAC;AAC9B,QAAM,kBAAc,wBAAO,QAAQ;AAEnC,iCAAU,MAAM;AACd,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,qBAAqB,MAAM;AAC/B,QAAI,YAAY,SAAS;AACvB,mBAAa,YAAY,OAAO;AAChC,kBAAY,UAAU;AAAA,IACxB;AACA,QAAI,SAAS,SAAS;AACpB,eAAS,QAAQ,MAAM;AACvB,eAAS,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,UAAkB;AACvC,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,SAAS;AACZ,kBAAY,QAAQ,EAAE;AACtB;AAAA,IACF;AACA,aAAS,UAAU,IAAI,gBAAgB;AACvC,gBAAY,QAAQ,SAAS,SAAS,SAAS,MAAM;AAAA,EACvD;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,uBAAmB;AACnB,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,kBAAY,QAAQ,EAAE;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,EAAE,cAAc;AACrC,gBAAY,UAAU,WAAW,MAAM;AACrC,UAAI,iBAAiB,cAAc,SAAS;AAC1C;AAAA,MACF;AACA,oBAAc,KAAK;AAAA,IACrB,GAAG,UAAU;AAEb,WAAO,MAAM,mBAAmB;AAAA,EAClC,GAAG,CAAC,OAAO,YAAY,UAAU,CAAC;AAElC,QAAM,kBAAc;AAAA,IAClB,CAAC,UAA+C;AAC9C,eAAS,MAAM,OAAO,KAAK;AAC3B,UAAI,CAAC,MAAM,OAAO,OAAO;AACvB,2BAAmB;AACnB,oBAAY,QAAQ,EAAE;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,kBAAc,6BAAY,MAAM;AACpC,uBAAmB;AACnB,aAAS,EAAE;AACX,cAAU;AACV,aAAS,SAAS,MAAM;AAAA,EAC1B,GAAG,CAAC,OAAO,CAAC;AAEZ,iCAAU,MAAM;AACd,QAAI,aAAa;AACf,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,aAAa,WAAW,CAAC;AAE7B,QAAM,oBAAgB;AAAA,IACpB,CAAC,UAAiD;AAChD,UAAI,MAAM,QAAQ,UAAU;AAC1B,oBAAY;AAAA,MACd;AACA,UAAI,MAAM,QAAQ,SAAS;AACzB,2BAAmB;AACnB,sBAAc,WAAW;AACzB,sBAAc,MAAM,cAAc,KAAK;AAAA,MACzC;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAIA,QAAM,YAAY,CAAC,EAAE,SAAS,CAAC;AAE/B,QAAM,WAAW,YACf;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO,KAAK,QAAQ,iBAAiB,gBAAgB;AAAA,QACrD;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA,cAAW;AAAA,MAEV,UAAAD,YAAW,SAAS,IAAI;AAAA;AAAA,EAC3B,IACE;AAEJ,QAAM,mBAAmB,YACvB;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO,KAAK,QAAQ,iBAAiB,gBAAgB;AAAA,QACrD;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MACA,cAAW;AAAA,MAEV,UAAAD,YAAW,SAAS,IAAI;AAAA;AAAA,EAC3B,IACE;AAGJ,MAAI,YAAY,YAAY;AAC1B,WACE,gDAAC,SAAI,eAAW,oBAAAC,SAAW,yBAAyB,SAAS,GAC3D;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AAAA,UACA,OAAO;AAAA,YACL,YAAY,6BAA6B,YAAY,KAAK,UAAU;AAAA,YACpE,SAAS,UAAU,KAAK,eAAe,KAAK;AAAA,UAC9C;AAAA,UACA,eAAW;AAAA;AAAA,MACb;AAAA,MACA,gDAAC,SAAI,WAAU,6JACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,OAAO;AAAA,YACT;AAAA,YAEC,UAAAD,YAAW,aAAa,IAAI;AAAA;AAAA,QAC/B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAW;AAAA,YACX,SAAS,MAAM,WAAW,IAAI;AAAA,YAC9B,QAAQ,MAAM,WAAW,KAAK;AAAA,YAC9B;AAAA,YACA;AAAA,YACA,WAAU;AAAA;AAAA,QACZ;AAAA,QACC;AAAA,SACH;AAAA,OACF;AAAA,EAEJ;AAGA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,MAEA;AAAA,uDAAC,UAAK,WAAU,6EACb,UAAAD,YAAW,aAAa,IAAI,GAC/B;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAW;AAAA,YACX;AAAA,YACA;AAAA,YACA,WAAU;AAAA;AAAA,QACZ;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,oBAAQ;;;ACjef,IAAAE,sBAAuB;AA+EnB,IAAAC,wBAAA;AArCJ,IAAM,kBAAkD,CAAC;AAAA,EACvD,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AAEJ,QAAM,IAAI;AACV,QAAM,IAAI,kBAAkB,qBAAqB,KAAK;AACtD,QAAM,IAAI,aAAa,gBAAgB,KAAK;AAG5C,QAAM,eAAkD;AAAA,IACtD,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,IAAI;AAAA,EACN;AAGA,QAAM,gBAAgB;AAAA,IACpB,EAAE,KAAK,QAAQ,MAAM,QAAQ,MAAM,cAAc;AAAA,IACjD,EAAE,QAAQ,QAAQ,OAAO,QAAQ,MAAM,cAAc;AAAA,EACvD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT,aAAa,UAAU,sBAAsB;AAAA,QAC7C;AAAA,MACF;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAGJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,gBAAgB,eAAe,CAAC;AAAA,cAChC,eAAe,eAAe,CAAC;AAAA,cAC/B,cAAc,eAAe,CAAC;AAAA,cAC9B,iBAAiB,aAAa,SAAS;AAAA,YACzC;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,gBAAgB,eAAe,CAAC;AAAA,cAChC,eAAe,eAAe,CAAC;AAAA,cAC/B,cAAc,eAAe,CAAC;AAAA,cAC9B,iBAAiB,aAAa,SAAS;AAAA,YACzC;AAAA;AAAA,QACF;AAAA,QAGC,WACC,+CAAC,SAAI,WAAU,wDACZ,wBAAc,IAAI,CAAC,KAAK,QACvB;AAAA,UAAC;AAAA;AAAA,YAEC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,IAAI;AAAA,cACJ,MAAM,CAAC,mBAAmB,CAAC;AAAA,YAC7B;AAAA,YACA,OAAO;AAAA;AAAA,UANF;AAAA,QAOP,CACD,GACH;AAAA,QAID,WACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL,YACE;AAAA,YACJ;AAAA,YACA,eAAY;AAAA;AAAA,QACd;AAAA,QAIF,+CAAC,SAAI,WAAU,iBAAiB,UAAS;AAAA;AAAA;AAAA,EAC3C;AAEJ;AASA,SAAS,qBAAqB,OAA6B;AAGzD,QAAM,YAAuC;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACA,SAAO,UAAU,KAAK,KAAK;AAC7B;AAKA,SAAS,gBAAgB,OAA6B;AACpD,QAAM,UAAqC;AAAA,IACzC,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACA,SAAO,QAAQ,KAAK,KAAK;AAC3B;AAEA,IAAO,0BAAQ;;;AC7Mf,IAAAC,kBAAmD;AA0D7C,IAAAC,wBAAA;AAnCN,IAAM,gBAA8C,CAAC;AAAA,EACnD;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,IAAI,MAAM;AAAA,EACV,kBAAkB;AAAA,EAClB,YAAY;AACd,MAAM;AACJ,QAAM,UAAM,wBAAoB,IAAI;AACpC,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,KAAK;AAEhD,iCAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AAGT,UAAM,QAAQ,MAAM;AAClB,UAAI,GAAG,YAAa,cAAa,GAAG,cAAc,GAAG,WAAW;AAAA,IAClE;AACA,UAAM,WAAW,IAAI,eAAe,KAAK;AACzC,aAAS,QAAQ,EAAE;AACnB,UAAM;AACN,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,IAAI,CAAC;AAMT,QAAM,QACJ;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,YAAY,OAAO;AAAA,MACzB;AAAA,MACA,UAAU;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UAKA,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAE1D;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAGF,MAAI,UAAW,QAAO;AAEtB,SAAO,+CAAC,SAAI,WAAU,WAAW,iBAAM;AACzC;AAEA,IAAO,wBAAQ;;;AC5Ef,IAAAC,kBAAwC;AACxC,IAAAC,sBAAuB;AA+JrB,IAAAC,wBAAA;AA3CF,IAAMC,cAA6C;AAAA,EACjD,IAAI;AAAA,IACF,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,MAAM;AAAA,EACR;AACF;AAIA,IAAM,gBAAgD;AAAA,EACpD,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AACT;AAIA,IAAM,WAA6C,CAAC,EAAE,UAAU,MAC9D;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAc;AAAA,IACd,gBAAe;AAAA,IAEf;AAAA,qDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,MAChD,+CAAC,UAAK,GAAE,2DAA0D;AAAA;AAAA;AACpE;AAGF,IAAM,YAA8C,CAAC,EAAE,UAAU,MAC/D;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAc;AAAA,IACd,gBAAe;AAAA,IAEf,yDAAC,cAAS,QAAO,kBAAiB;AAAA;AACpC;AAWF,SAAS,eAAe,OAAyC;AAC/D,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,WAAO,EAAE,SAAS,MAAM,UAAU,MAAM,SAAS,KAAK;AAAA,EACxD;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,UAAM,OAAO,QAAQ,QAAQ;AAC7B,WAAO,EAAE,SAAS,MAAM,UAAU,MAAM,SAAS,MAAM;AAAA,EACzD;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,WAAO,EAAE,SAAS,OAAO,UAAU,OAAO,KAAK,GAAG,SAAS,MAAM;AAAA,EACnE;AACA,SAAO,EAAE,SAAS,OAAO,UAAU,MAAM,SAAS,MAAM;AAC1D;AAIA,IAAM,eAA2C,CAAC,EAAE,KAAK,MACvD;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL,eAAW,oBAAAC;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,IAEC;AAAA;AAAA,MAED;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA;AAAA;AACF;AAKK,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAS,KAAK;AAC1C,QAAM,CAAC,gBAAgB,UAAU,QAAI,0BAAS,KAAK;AACnD,QAAM,eAAW,wBAAwB,IAAI;AAE7C,QAAM,EAAE,SAAS,UAAU,QAAQ,IAAI,eAAe,KAAK;AAE3D,MAAI,WAAW,YAAa,QAAO;AAEnC,QAAM,SAASD,YAAW,IAAI;AAC9B,QAAM,cAAcA,YAAW,aAAa,IAAI;AAChD,QAAM,cAAcA,YAAW,aAAa,IAAI;AAChD,QAAM,aACJ,YAAY,SAAY,cAAc,OAAO,IAAI,OAAO;AAC1D,QAAM,WAAW,YAAY,aAAa,QAAQ,CAAC;AACnD,QAAM,aAAa,qBAAqB,CAAC,QAAQ,aAAa;AAG9D,QAAM,iBAAiB,eAAe;AAEtC,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,YAAY,OAAQ;AACzB,SAAK,UAAU,UAAU,UAAU,QAAQ,EAAE,KAAK,MAAM;AACtD,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,IACzC,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,cAAc,CAAC,SAAS,QAAS;AACtC,QAAI,SAAS,QAAQ,cAAc,SAAS,QAAQ,aAAa;AAC/D,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAM,WAAW,KAAK;AAE/C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA,CAAC,aAAa,OAAO;AAAA,QACrB,aAAa;AAAA,QACb,aACE,CAAC,UACD;AAAA,QACF,CAAC,YACC,CAAC,aACD;AAAA,QACF,UAAU;AAAA,QACV,UAAU,aAAa;AAAA,QACvB;AAAA,MACF;AAAA,MAGA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT,YAAY;AAAA,cACZ;AAAA,cACA,iBACI,8BACA,iBAAiB,cAAc,OAAO,iBAAiB;AAAA,cAC3D;AAAA,YACF;AAAA,YACA,OAAO,iBAAiB,EAAE,UAAU,MAAM,IAAI;AAAA,YAE7C;AAAA;AAAA,QACH;AAAA,QAGA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,cAAc;AAAA,YACd,cAAc;AAAA,YAEd;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,eAAW,oBAAAA;AAAA,oBACT,YAAY;AAAA,oBACZ;AAAA,oBACA,OAAO,iDAAiD;AAAA,oBACxD,UACI,2CACA;AAAA,oBACJ,QAAQ;AAAA,oBACR;AAAA,kBACF;AAAA,kBAEC,oBAAU,YAAY;AAAA;AAAA,cACzB;AAAA,cAEC,kBAAkB,YAAY,+CAAC,gBAAa,MAAM,UAAU;AAAA,cAE5D,YACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,OAAO,SAAS,YAAY;AAAA,kBAC5B,cAAY,SAAS,YAAY;AAAA,kBACjC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA,SACI;AAAA,sBACE;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF,IACA;AAAA,sBACE;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF;AAAA,kBACN;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,SAAS,cAAc;AAAA,sBACzB;AAAA,sBAEC,mBACC,+CAAC,aAAU,WAAU,eAAc,IAEnC,+CAAC,YAAS,WAAU,eAAc;AAAA;AAAA,kBAEtC;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kBAAQ;;;ACxYf,IAAAC,sBAAuB;AA+Ef,IAAAC,wBAAA;AAhDR,IAAMC,iBAAoD;AAAA,EACxD,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAAA,EACV,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAAA,EACV,QAAQ,CAAC,wCAAwC,YAAY,EAAE,KAAK,GAAG;AAAA,EACvE,MAAM;AACR;AAEA,IAAMC,eAAwE;AAAA,EAC5E,IAAI,EAAE,QAAQ,sBAAsB,MAAM,YAAY;AAAA,EACtD,IAAI,EAAE,QAAQ,kBAAkB,MAAM,YAAY;AAAA,EAClD,IAAI,EAAE,QAAQ,kBAAkB,MAAM,YAAY;AACpD;AAIO,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,QAAQ,KAAK,IAAIA,aAAW,IAAI;AAExC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACAF,eAAc,OAAO;AAAA,QACrB;AAAA,MACF;AAAA,MAGA;AAAA,uDAAC,SAAI,WAAW,QACd,0DAAC,SAAI,WAAU,qCACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAE;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UACC,WAAW,+CAAC,SAAK,mBAAQ;AAAA,WAC5B,GACF;AAAA,QAGA,+CAAC,SAAI,eAAW,oBAAAA,SAAW,MAAM,QAAQ,WAAW,aAAa,GAC9D,UACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,sBAAQ;;;ACtGf,IAAAC,kBAAgC;AAChC,IAAAC,sBAAuB;;;ACAvB,IAAAC,sBAAuB;AAkZjB,IAAAC,wBAAA;AAvQN,IAAM,oBAAkD;AAAA,EACtD,UACE;AAAA,EACF,UACE;AAAA,EACF,QACE;AAAA,EACF,OACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AAAA,EACF,gBACE;AAAA,EACF,QACE;AACJ;AAEO,IAAMC,iBAA8C;AAAA,EACzD,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,eAA4C;AAAA,EAChD,SAAS;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,oBAAuD;AAAA,EAC3D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,IAAM,sBAAyD;AAAA,EAC7D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,IAAM,qBAAgC;AAEtC,IAAM,QAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,WAAW;AAAA,EACX,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,UAAU,mBAAmB,IAAI;AACvC,QAAM,eAAe,QAAQ,mBAAmB,KAAK,IAAI;AACzD,QAAM,cAAc,aAAa,QAAQ,KAAK,OAAO;AAErD,QAAM,wBAA2C,MAAM;AACrD,QAAI,iBAAiB,OAAW,QAAO;AACvC,QAAI,sBAAsB,MAAO,QAAO;AACxC,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,sBACJ,eAAe,SAAS,UAAU,YAAY,QAAQ;AACxD,QAAM,iBAAiB,sBACnB,sBACA;AAEJ,QAAM,gBAAgB,cAClB,mBAAmB,WAAW,IAC9B;AACJ,QAAM,uBAAuB,eAAe;AAE5C,QAAM,YAAY,kBACd,mBAAmB,eAAe,IAClC;AAEJ,QAAM,oBAAoB,MAAM;AAC9B,QAAI,CAAC,gBAAiB,QAAO;AAC7B,QAAI,oBAAoB,UAAW,QAAO;AAC1C,QAAI,WAAW;AACb,UAAI,YAAY,QAAS,QAAO,UAAU;AAC1C,UAAI,YAAY,SAAU,QAAO,UAAU;AAC3C,UAAI,YAAY,SAAU,QAAO,UAAU;AAC3C,UAAI,YAAY,QAAS,QAAO,UAAU;AAE1C,aAAO,UAAU;AAAA,IACnB;AACA,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,YAAY,mBAAmB,aAAa,QAAQ,KAAK;AAC/D,QAAM,WAAW,QAAQ,KAAK;AAE9B,QAAM,yBACJ,CAAC,cAAc,eAAe,cAAc,eAAe;AAC7D,QAAM,uBACJ,CAAC,cAAc,eAAe,YAAY,eAAe;AAE3D,QAAM,iBAAsC,MAAM;AAChD,UAAM,SAA8B,EAAE,GAAG,MAAM;AAC/C,QAAI,aAAa,QAAW;AAC1B,aAAO,WACL,OAAO,aAAa,WAAW,GAAG,QAAQ,OAAO;AAAA,IACrD;AACA,QAAI,cAAc,QAAW;AAC3B,aAAO,YACL,OAAO,cAAc,WAAW,GAAG,SAAS,OAAO;AAAA,IACvD;AACA,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,iBAAiB,MAAM;AAC3B,QAAI,OAAO,aAAa,SAAU,QAAO;AACzC,QAAI,aAAa,MAAO,QAAO;AAC/B,QAAI,aAAa,SAAU,QAAO;AAClC,QAAI,aAAa,OAAQ,QAAO;AAChC,WAAO;AAAA,EACT,GAAG;AACH,QAAM,gBAAgB,sBAAsB,aAAa;AAEzD,QAAM,kBAAkB,MAAM;AAC5B,UAAM,cAAc,MAAM;AACxB,UAAI,OAAO,iBAAiB,SAAU,QAAO,KAAK,MAAO,eAA0B,GAAG;AACtF,UAAI,iBAAiB,UAAW,QAAO;AACvC,UAAI,iBAAiB,QAAS,QAAO;AACrC,UAAI,iBAAiB,QAAS,QAAO;AACrC,aAAO;AAAA,IACT,GAAG;AACH,UAAM,cAAc,MAAM;AACxB,UAAI,OAAO,iBAAiB,SAAU,QAAO,KAAK,IAAI,KAAK,MAAO,eAA0B,EAAE,GAAG,EAAE;AACnG,UAAI,iBAAiB,UAAW,QAAO;AACvC,UAAI,iBAAiB,QAAS,QAAO;AACrC,UAAI,iBAAiB,QAAS,QAAO;AACrC,aAAO;AAAA,IACT,GAAG;AACH,UAAM,OAAO;AACb,WAAO,MAAM,IAAI,OAAO,UAAU,YAAY,IAAI,QAAQ,UAAU;AAAA,EACtE,GAAG;AAEH,QAAMC,mBAAkB,MAAM;AAC5B,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,mBAAO,oBAAAC;AAAA,UACL,kBAAkB;AAAA,UAClB,wBAAwB,QAAQ;AAAA,QAClC;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,kBAAkB;AAAA,UAClB,wBAAwB,QAAQ;AAAA,UAChC,oBAAoB,QAAQ;AAAA,QAC9B;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,kBAAkB;AAAA,UAClB,oBAAoB,QAAQ;AAAA,UAC5B;AAAA,QACF;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,kBAAkB;AAAA,UAClB,wBAAwB;AAAA,QAC1B;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,kBAAkB;AAAA,UAClB;AAAA,UACA,wBAAwB,aAAa;AAAA,UACrC,oBAAoB,QAAQ;AAAA,QAC9B;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAwB,QAAQ;AAAA,UAChC,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,kBAAkB;AAAA,UAClB,oBAAoB,QAAQ;AAAA,UAC5B;AAAA,QACF;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,CAAC,oBAAoB,kBAAkB;AAAA,UACvC,oBACE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACE,mBAAO,oBAAAA;AAAA,UACL,CAAC,oBAAoB,kBAAkB;AAAA,UACvC,oBACE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,IACJ;AAAA,EACF,GAAG;AAEH,QAAM,iBAAiB,YACnB,yDACA;AAEJ,QAAM,eAAe,YACjB,eACA,YAAY,iBACV,QAAQ,gBACR,QAAQ;AACd,QAAM,gBAAgB,YAAY,kBAAkB,QAAQ;AAC5D,QAAM,mBAAmB,YAAY,kBAAkB,QAAQ;AAC/D,QAAM,YACJ,OAAO,UAAU,WACf;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,YACI,+CACA,QAAQ;AAAA,MACd;AAAA,MAEC;AAAA;AAAA,EACH,IAEA;AAGJ,QAAM,YACJ,OAAO,UAAU,WACf;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,IAEA;AAGJ,QAAM,eACJ,OAAO,aAAa,WAClB;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,IAEA;AAGJ,QAAM,kBACJ,OAAO,gBAAgB,WACrB;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH,IAEA;AAGJ,QAAM,gBACJ,aAAa,aAAa,gBAAgB,kBACxC,gDAAC,SAAI,WAAW,YAAY,WAAW,mBAAmB,EAAE,IACzD;AAAA,aAAS,+CAAC,SAAK,qBAAU;AAAA,IACzB,SAAS,+CAAC,SAAI,WAAU,aAAa,qBAAU;AAAA,IAC/C,YAAY,+CAAC,SAAK,wBAAa;AAAA,IAC/B,eAAe,+CAAC,SAAK,2BAAgB;AAAA,KACxC,IACE;AAEN,QAAM,cAAc,WAClB;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT,YAAY,SAAS,KAAK;AAAA,QAC1B,WAAW,gCAAgC;AAAA,QAC3C,YAAY,kBAAkB;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MAEN;AAAA;AAAA,EACH,IACE;AAEJ,QAAM,cAAc,cAClB;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT,WAAW,gCAAgC;AAAA,QAC3C;AAAA,QACA,aACI,2UACA;AAAA,QACJ,YAAY,SAAS,KAAK;AAAA,MAC5B;AAAA,MAEC;AAAA;AAAA,EACH,IACE;AAEJ,QAAM,iBACJ,WAAW,QAAQ,SAAS,IAC1B;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,oBAAoB,YAAY;AAAA,QAChC,cAAc,YAAY;AAAA,MAC5B;AAAA,MAEC,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC9B,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,OAAAC;AAAA,UACA;AAAA,UACA,GAAG;AAAA,QACL,IAAI;AACJ,cAAM,MAAM,MAAM,GAAG,KAAK;AAC1B,cAAM,kBAAkB,kBAAkB,YAAY;AAEtD,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,OAAOA,UAAS;AAAA,YAChB,MAAM,QAAQ;AAAA,YACd,eAAW,oBAAAD,SAAW,iBAAiB,eAAe;AAAA,YACrD,GAAG;AAAA,YAEH;AAAA;AAAA,UANI;AAAA,QAOP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH,IACE;AAEN,QAAM,eACJ,YAAY,mBAAmB,QAC7B,+CAAC,SAAI,WAAU,mBAAmB,iBAAM,IACtC;AAEN,QAAM,gBACJ,aAAa,mBAAmB,WAAW,mBAAmB,SAC5D,+CAAC,SAAI,WAAU,0GACZ,iBACH,IACE;AAEN,QAAM,kBAAkB,MAAM;AAC5B,QAAI,mBAAmB,WAAW,mBAAmB,OAAO;AAC1D,aACE;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA,mBAAmB,QAAQ,wBAAwB;AAAA,YACnD,WAAW,mBAAmB;AAAA,UAChC;AAAA,UAEC;AAAA;AAAA,YACD,gDAAC,SAAI,WAAU,sCACZ;AAAA;AAAA,cACA;AAAA,cACA;AAAA,eACH;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,WACE,gDAAC,SAAI,WAAU,sCACZ;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,OACH;AAAA,EAEJ,GAAG;AAEH,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACAD;AAAA,QACAD,eAAc,OAAO;AAAA,QACrB,aAAa,MAAM;AAAA,QACnB,YAAY,WAAW;AAAA,QACvB,YAAY,iBAAiB;AAAA,QAC7B,eACE;AAAA,QACF,eAAe;AAAA,QACf,eACE,kBACA,YAAY,cAAc,qBAAqB,cAAc;AAAA,QAC/D;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MACP,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA,qBACC,kFACE;AAAA,yDAAC,SAAI,WAAU,oCACb,yDAAC,SAAI,WAAU,iBAAiB,iBAAM,GACxC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAE;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cACV;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAED,0BACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,QAAQ;AAAA,cACR,eACE;AAAA,YACJ;AAAA,YACA,eAAY;AAAA;AAAA,QACd;AAAA,QAED,wBACC,kFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,gBACR,eACE;AAAA,cACJ;AAAA,cACA,eAAY;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,gBACR,eACE;AAAA,cACJ;AAAA,cACA,eAAY;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,gBACR,eACE;AAAA,cACJ;AAAA,cACA,eAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA,QAED,eAAe,CAAC,kBACf;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QACd;AAAA,QAED,YAAY,kBAAkB,yBAAyB,UACtD,kFACG;AAAA,mCAAyB,aACxB;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA,eAAY;AAAA;AAAA,UACd;AAAA,UAED,yBAAyB,UACxB,kFAEE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,eAAY;AAAA;AAAA,YACd;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,eAAY;AAAA;AAAA,YACd;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,eAAY;AAAA;AAAA,YACd;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,eAAY;AAAA;AAAA,YACd;AAAA,aACF;AAAA,WAEJ;AAAA,QAEF;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,aAAa;AAAA,YACf;AAAA,YAEC;AAAA,0BACC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,eAAY;AAAA;AAAA,cACd;AAAA,cAED;AAAA;AAAA;AAAA,QACH;AAAA,QACC,WACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAO;AAAA,YACP,SAAS;AAAA,YACT,OAAO;AAAA,YACP,OAAO;AAAA,YACP,UAAU;AAAA,YACV,OAAO;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,gBAAQ;;;AD3qBX,IAAAE,wBAAA;AAlBJ,IAAM,SAID,CAAC,EAAE,WAAW,UAAU,QAAQ,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,MAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAY,cAAc,SAAS,kBAAkB;AAAA,IACrD,eAAW,oBAAAC;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,cAAc,SAAS,qBAAqB;AAAA,QAClD,MAAK;AAAA;AAAA,IACP;AAAA;AACF;AAKF,IAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,QAAI,0BAAS,CAAC;AACxC,QAAM,QAAQ,MAAM;AACpB,QAAM,UAAU,QAAQ;AAGxB,QAAM,cAAc,QAAQ,IAAI,KAAK,IAAI,SAAS,QAAQ,CAAC,IAAI;AAC/D,MAAI,gBAAgB,QAAS,YAAW,WAAW;AAGnD,QAAM,gBAAgB,MAAM,QAAQ,KAAK,IAAI,MAAM,WAAW,IAAI;AAClE,QAAM,aAAa,iBAAiB,QAAQ,YAAY,QAAQ;AAEhE,QAAM,SAAS,cACb,gDAAC,SAAI,WAAU,yFAEb;AAAA,mDAAC,SAAI,WAAU,gBACZ,qBACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,YAAY;AAAA,QACtB,SAAS,MAAM,WAAW,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA;AAAA,IACrD,GAEJ;AAAA,IAGA,gDAAC,SAAI,WAAU,8BACZ;AAAA,uBAAiB,QAChB,+CAAC,SAAI,WAAU,sFACZ,yBACH;AAAA,MAED,YAAY,QACX,+CAAC,SAAI,WAAU,kEACZ,oBACH;AAAA,MAED,WACC,gDAAC,SAAI,WAAU,0EACZ;AAAA,sBAAc;AAAA,QAAE;AAAA,QAAI;AAAA,SACvB;AAAA,OAEJ;AAAA,IAGA,+CAAC,SAAI,WAAU,gBACZ,qBACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,YAAY,QAAQ;AAAA,QAC9B,SAAS,MAAM,WAAW,CAAC,MAAM,KAAK,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC;AAAA;AAAA,IAC7D,GAEJ;AAAA,KACF;AAGF,QAAM,UACJ,+CAAC,SAAI,WAAU,sDACZ,kBACC,+CAAC,OAAE,WAAU,4CAA4C,iBAAM,IAC7D,UAAU,KAAK,CAAC,KAAK,UACvB,+CAAC,OAAE,WAAU,kDAAiD,gCAE9D,IAEA,MAAM,WAAW,GAErB;AAGF,MAAI,MAAM;AACR,WACE,gDAAC,SAAI,eAAW,oBAAAA,SAAW,4BAA4B,KAAK,SAAS,GAClE;AAAA;AAAA,MACA;AAAA,OACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAe,UAAU,KAAK,CAAC,KAAK,UAAU,WAAW;AAAA,MACzD,eAAW,oBAAAA,SAAW,4BAA4B,KAAK,SAAS;AAAA,MAE/D;AAAA;AAAA,QACA;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,qBAAQ;;;AE3Jf,IAAAC,kBAAgC;AAChC,IAAAC,sBAAuB;AA2Gb,IAAAC,wBAAA;AAjFV,IAAM,mBAAoD,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,GAAG;AACL,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAS,eAAe;AACxE,QAAM,eAAe,OAAO,aAAa;AACzC,QAAM,aAAa,eAAe,WAAW;AAE7C,QAAM,eAAe,MAAM;AACzB,QAAI,SAAU;AACd,UAAM,OAAO,CAAC;AACd,QAAI,CAAC,aAAc,qBAAoB,IAAI;AAC3C,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,QAAE,eAAe;AACjB,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,2BAA2B,OAAO,oBAAoB,GAAG;AAC/D,QAAM,kBAAkBC,eAAc,OAAO,KAAKA,eAAc;AAEhE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,cAAc,aAAa,0BAA0B;AAAA,QACrD;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACX,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA,cAAc,cAAc;AAAA,UAC9B;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU,WAAW,KAAK;AAAA,gBAC1B,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA,WACI,kCACA;AAAA,gBACN;AAAA,gBACA,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,iBAAe;AAAA,gBACf,iBAAc;AAAA,gBAEd;AAAA,kEAAC,SAAI,WAAU,gCACb;AAAA,mEAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,oBAC9C,YAAY,+CAAC,UAAK,WAAU,sBAAsB,oBAAS;AAAA,qBAC9D;AAAA,kBAEC,WAAW,+CAAC,SAAI,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAI,mBAAQ;AAAA,kBAE/D;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,aAAa,eAAe;AAAA,sBAC9B;AAAA,sBAEC,UAAAF,YAAW,aAAa,IAAI;AAAA;AAAA,kBAC/B;AAAA;AAAA;AAAA,YACF;AAAA,YAGA;AAAA,cAAC;AAAA;AAAA,gBAAI,IAAG;AAAA,gBAA4B,MAAK;AAAA,gBAAS,cAAW;AAAA,gBAC3D,eAAW,oBAAAE;AAAA,kBACT;AAAA,kBACA,cAAc,cAAc;AAAA,kBAC5B,aAAa,gBAAgB;AAAA,gBAC/B;AAAA,gBACA,OAAO;AAAA,kBACL,WACE,cAAc,CAAC,aACX,QAAQ,wBAAwB,MAAM,OAAO,sBAAsB,WAAW,oBAAoB,OAAO,qBAAqB,KAAK,aACnI,aACE,SACA;AAAA,gBACV;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,cAAc,CAAC,aACX,6UACA;AAAA,sBACJ;AAAA,oBACF;AAAA,oBACA,OAAO;AAAA,sBACL,WACE,cAAc,CAAC,aACX,2BACA;AAAA,sBACN,WAAW,aAAa,oBAAoB;AAAA,oBAC9C;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,2BAAQ;;;ACxIT,IAAAC,wBAAA;AAxBC,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA,YAAY;AACd,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgBP,SAAS;AAAA,MAEb,yDAAC,SAAI,WAAU,0BAA0B,UAAS;AAAA;AAAA,EACpD;AAEJ;AAEA,YAAY,cAAc;AAE1B,IAAO,sBAAQ;;;ACtCf,IAAAC,kBAAgD;AA2DlC,IAAAC,wBAAA;AA5Cd,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,YAAY;AAAA,EACZ,kBAAkB;AACpB,MAAM;AACJ,QAAM,CAAC,UAAU,WAAW,QAAI,0BAAS,eAAe;AAExD,QAAM,aAAa,CAAC,CAAC;AAErB,QAAM,qBAAqB,CAAC,MAAwB;AAClD,QAAI,YAAY;AACd,QAAE,gBAAgB;AAClB,kBAAY,CAAC,SAAS,CAAC,IAAI;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,MAAwB;AAC3C,QAAI,SAAS;AACX,QAAE,gBAAgB;AAClB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,gCAAgC,WAAW,aAAa,EAAE,IAAI,SAAS;AAAA,MAClF,SAAS;AAAA,MAET;AAAA,wDAAC,SAAI,WAAU,6DACZ;AAAA,wBACC,+CAAC,SAAI,WAAU,iBACb;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS;AAAA,cACT,iBAAe;AAAA,cACf,cAAY,WAAW,qBAAqB;AAAA,cAE5C;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,wFAAwF,WAAW,aAAa,UAAU;AAAA,kBAEpI,qBAAW,WAAM;AAAA;AAAA,cACpB;AAAA;AAAA,UACF,GACF;AAAA,UAEF,gDAAC,SAAI,WAAU,uCACb;AAAA,2DAAC,SAAI,WAAU,gEACZ,iBACH;AAAA,YACC,YACC,+CAAC,SAAI,WAAU,gEACZ,oBACH;AAAA,YAED,eACC,+CAAC,SAAI,WAAU,kDACZ,uBACH;AAAA,YAED,mBAAmB,YAClB,+CAAC,SAAI,WAAU,sCAAsC,kBAAO;AAAA,YAE7D,mBAAmB,gBAClB,+CAAC,SAAI,WAAU,oCAAoC,kBAAO;AAAA,aAE9D;AAAA,UAEC,mBAAmB,WAClB,+CAAC,SAAI,WAAU,oCAAoC,kBAAO;AAAA,WAE9D;AAAA,QAEC,cAAc,YACb,+CAAC,SAAI,WAAU,kFACZ,UACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,eAAe,cAAc;AAE7B,IAAO,yBAAQ;;;ACzGf,IAAAC,kBAAgE;AAChE,IAAAC,sBAAuB;AAkInB,IAAAC,wBAAA;AA7GG,SAAS,oBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAAgC;AAC9B,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAS,KAAK;AACxD,QAAM,mBAAe,wBAAuB,IAAI;AAChD,QAAM,wBAAoB,wBAAuB,IAAI;AACrD,QAAM,eAAW,wBAAqC,CAAC,CAAC;AACxD,QAAM,iBAAa,wBAAuB,IAAI;AAC9C,QAAM,yBAAqB,wBAA6C,IAAI;AAC5E,QAAM,yBAAqB,wBAAyB,CAAC,CAAC;AACtD,QAAM,eAAW,wBAAsB,IAAI;AAC3C,QAAM,sBAAkB,wBAA6C,IAAI;AACzE,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAiB,CAAC;AAExD,QAAM,qBAAiB,6BAAY,YAAY;AAC7C,QAAI,iBAAiB,CAAC,QAAS;AAE/B,qBAAiB,IAAI;AACrB,QAAI;AACF,YAAM,WAAW;AAAA,IACnB,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAAA,IAClD,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,eAAe,SAAS,UAAU,CAAC;AAEvC,QAAM,mBAAe,6BAAY,MAAM;AACrC,QAAI,mBAAmB,SAAS;AAC9B,mBAAa,mBAAmB,OAAO;AAAA,IACzC;AAEA,uBAAmB,UAAU,WAAW,MAAM;AAC5C,UAAI,CAAC,aAAa,WAAW,CAAC,WAAW,QAAS;AAElD,YAAM,YAAY,aAAa;AAC/B,YAAM,iBAAiB,WAAW;AAClC,YAAM,gBAAgB,UAAU,sBAAsB;AACtD,YAAM,cAAc,eAAe,sBAAsB;AAEzD,YAAM,YACJ,YAAY,OAAO,cAAc,SAAS,YAAY;AAExD,UAAI,aAAa,WAAW,CAAC,iBAAiB,CAAC,WAAW;AACxD,aAAK,eAAe;AAAA,MACtB;AAAA,IACF,GAAG,UAAU;AAAA,EACf,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,iCAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAEhB,cAAU,iBAAiB,UAAU,YAAY;AACjD,WAAO,iBAAiB,UAAU,YAAY;AAE9C,WAAO,MAAM;AACX,gBAAU,oBAAoB,UAAU,YAAY;AACpD,aAAO,oBAAoB,UAAU,YAAY;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,iCAAU,MAAM;AACd,QACE,MAAM,SAAS,KACf,MAAM,SAAS,aACf,WACA,CAAC,iBACD,CAAC,WACD;AACA,WAAK,eAAe;AAAA,IACtB;AAAA,EACF,GAAG;AAAA,IACD,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,iCAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,eAAe;AAChC,mBAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,WAAW,eAAe,MAAM,QAAQ,YAAY,CAAC;AAEzD,QAAM,0BACJ,gDAAC,SAAI,WAAU,mDACb;AAAA,mDAAC,mBAAQ,WAAU,SAAQ,OAAM,QAAO,MAAK,MAAK,SAAQ,YAAW;AAAA,IACrE,+CAAC,UAAK,WAAU,WAAU,6BAAe;AAAA,KAC3C;AAGF,QAAM,wBACJ,+CAAC,SAAI,WAAU,sGACb,yDAAC,UAAK,4BAAc,GACtB;AAGF,QAAM,4BAAwB,6BAAY,MAAM;AAC9C,UAAM,OAAO,kBAAkB;AAC/B,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,OAAO,iBAAiB,IAAI;AAC7C,UAAM,SAAS,WAAW,SAAS,UAAU,GAAG;AAChD,UAAM,YAAY;AAAA,MAChB,SAAS,iBAAiB,sBAAsB,KAAK;AAAA,IACvD;AAEA,aAAS,QAAQ,QAAQ,CAAC,OAAO;AAC/B,UAAI,CAAC,GAAI;AACT,YAAM,gBAAgB,GAAG,sBAAsB,EAAE;AACjD,YAAM,UAAU,KAAK;AAAA,QACnB;AAAA,QACA,KAAK,MAAM,gBAAgB,WAAW,YAAY,OAAO;AAAA,MAC3D;AACA,YAAM,UAAU,GAAG,MAAM;AACzB,YAAM,OAAO,QAAQ,OAAO;AAC5B,UAAI,YAAY,MAAM;AACpB,WAAG,MAAM,aAAa;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAoB;AAAA,IACxB,CAAC,UAAkB,OAAO;AACxB,UAAI,gBAAgB,SAAS;AAC3B,qBAAa,gBAAgB,OAAO;AACpC,wBAAgB,UAAU;AAAA,MAC5B;AACA,sBAAgB,UAAU,WAAW,MAAM;AACzC,YAAI,SAAS,SAAS;AACpB,+BAAqB,SAAS,OAAO;AAAA,QACvC;AACA,iBAAS,UAAU,sBAAsB,MAAM;AAC7C,gCAAsB;AACtB,mBAAS,UAAU;AAAA,QACrB,CAAC;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,CAAC,qBAAqB;AAAA,EACxB;AAEA,iCAAU,MAAM;AACd,QAAI,gBAAiB;AACrB,uBAAmB,QAAQ,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC;AAC1D,uBAAmB,UAAU,CAAC;AAE9B,aAAS,QAAQ,QAAQ,CAAC,OAAO;AAC/B,UAAI,CAAC,GAAI;AACT,YAAM,KAAK,IAAI,eAAe,MAAM,kBAAkB,CAAC;AACvD,SAAG,QAAQ,EAAE;AACb,yBAAmB,QAAQ,KAAK,EAAE;AAAA,IACpC,CAAC;AAED,sBAAkB,CAAC;AAEnB,UAAM,UAAU,MAAM,kBAAkB,CAAC;AACzC,WAAO,iBAAiB,UAAU,OAAO;AACzC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,OAAO;AAC5C,yBAAmB,QAAQ,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC;AAC1D,yBAAmB,UAAU,CAAC;AAC9B,UAAI,SAAS,SAAS;AACpB,6BAAqB,SAAS,OAAO;AACrC,iBAAS,UAAU;AAAA,MACrB;AACA,UAAI,gBAAgB,SAAS;AAC3B,qBAAa,gBAAgB,OAAO;AACpC,wBAAgB,UAAU;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,mBAAmB,eAAe,CAAC;AAE9C,iCAAU,MAAM;AACd,QAAI,CAAC,gBAAiB;AACtB,UAAM,iBAAiB,MAAM;AAC3B,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,UAAW;AAChB,YAAM,MAAM;AACZ,YAAM,QAAQ,UAAU;AACxB,YAAM,OAAO,KAAK;AAAA,QAChB;AAAA,QACA,KAAK,OAAO,QAAQ,QAAQ,mBAAmB,IAAI;AAAA,MACrD;AACA,qBAAe,aAAa,KAAK,IAAI,MAAM,UAAU,IAAI,IAAI;AAAA,IAC/D;AACA,mBAAe;AACf,WAAO,iBAAiB,UAAU,cAAc;AAChD,WAAO,MAAM,OAAO,oBAAoB,UAAU,cAAc;AAAA,EAClE,GAAG,CAAC,iBAAiB,kBAAkB,UAAU,CAAC;AAElD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC,gBAAM,WAAW,KAAK,CAAC,YACtB,kBAAkB,wBAElB,kFACG;AAAA,0BACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,gBAAgB,KAAK;AAAA,cACrB,gBAAgB,KAAK;AAAA,cACrB,gBAAgB,KAAK;AAAA,cACrB,gBAAgB,KAAK;AAAA,cACrB,eAAe,KAAK;AAAA,YACtB;AAAA,YAEC,gBAAM,KAAK,EAAE,QAAQ,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,WAC3C,+CAAC,SAAiB,WAAU,uBACzB,gBACE,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,MAAM,EAAE,EACtC,OAAO,CAAC,EAAE,MAAM,MAAM,QAAQ,gBAAgB,MAAM,EACpD,IAAI,CAAC,EAAE,MAAM,MAAM,MAClB;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBAET,qBAAW,MAAM,KAAK;AAAA;AAAA,cAHlB;AAAA,YAIP,CACD,KAXK,MAYV,CACD;AAAA;AAAA,QACH,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,WACE;AAAA,YACJ;AAAA,YACA,OAAO;AAAA,cACL,qBAAqB;AAAA,YACvB;AAAA,YAEC,gBAAM,IAAI,CAAC,MAAM,UAChB;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,KAAK,CAAC,OAAO;AACX,2BAAS,QAAQ,KAAK,IAAI;AAAA,gBAC5B;AAAA,gBAEC,qBAAW,MAAM,KAAK;AAAA;AAAA,cANlB;AAAA,YAOP,CACD;AAAA;AAAA,QACH;AAAA,QAGD,MAAM,SAAS,MAAM,WAAW,kBAC/B;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAW,sBAAsB,CAAC,mBAAmB,qCAAqC,EAAE;AAAA,YAE3F,8BAAoB;AAAA;AAAA,QACvB;AAAA,SAEJ;AAAA;AAAA,EAEJ;AAEJ;AAEA,oBAAoB,cAAc;AAElC,IAAO,8BAAQ;;;AC/Tf,IAAAC,kBAAgC;AAChC,IAAAC,sBAAuB;AAsHjB,IAAAC,wBAAA;AArGN,IAAMC,cAYF;AAAA,EACF,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WACE;AAAA,IACF,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AACF;AAEA,IAAM,WAAW,CAAC,OAAe,UAAkB;AACjD,MAAI,MAAM,UAAU,OAAO;AACzB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC;AACxC;AAEO,IAAM,sBAA0D,CAAC;AAAA,EACtE;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,YAAY,MAAM,KAAK,KAAK;AAClC,QAAM,kBAAkB,UAAU,SAAS;AAC3C,QAAM,CAAC,UAAU,WAAW,QAAI,0BAAS,KAAK;AAE9C,QAAMC,eAAcF,YAAW,IAAI,KAAKA,YAAW;AACnD,QAAM,cACJ,YAAY,CAAC,kBAAkB,YAAY,SAAS,WAAW,SAAS;AAE1E,QAAM,cAAc,iBAClB,eAAe,WAAW,IAE1B,+CAAC,SAAI,WAAU,2FACb,yDAAC,OAAG,uBAAY,GAClB;AAGF,QAAM,gBACJ,kFACG;AAAA,gBACC;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAG;AAAA,UACT;AAAA,UACAD,aAAY;AAAA,UACZA,aAAY;AAAA,QACd;AAAA,QAEC,UAAAD,YAAW,MAAM,MAAM,cAAc;AAAA;AAAA,IACxC;AAAA,IAEF,gDAAC,SAAI,WAAU,wCACZ;AAAA,eACC,+CAAC,OAAE,eAAW,oBAAAE,SAAW,yBAAyBD,aAAY,IAAI,GAC/D,iBACH;AAAA,MAED;AAAA,OACH;AAAA,IACC,mBACC;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAC;AAAA,UACT;AAAA,UACAD,aAAY;AAAA,QACd;AAAA,QACA,eAAY;AAAA,QAEX,UAAAD;AAAA,UACC;AAAA,UACA;AAAA,cACA,oBAAAE;AAAA,YACE;AAAA,YACA,YAAY;AAAA,UACd;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ;AAGF,QAAM,uBAAmB,oBAAAA;AAAA,IACvB;AAAA,IACA,YAAY,aACR,oBAAAA;AAAA,MACE;AAAA,MACAD,aAAY;AAAA,IACd,IACA;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,qBAAiB,oBAAAC;AAAA,IACrB;AAAA,IACA,YAAY,WAAW;AAAA,IACvBD,aAAY;AAAA,IACZA,aAAY;AAAA,EACd;AAEA,SACE,gDAAC,SAAI,WAAW,kBAAmB,GAAG,MACnC;AAAA,sBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,SAAS,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI;AAAA,QAC1C,iBAAe;AAAA,QAEd;AAAA;AAAA,IACH,IAEA,+CAAC,SAAI,WAAU,0BAA0B,yBAAc;AAAA,IAExD,YACC,+CAAC,SAAI,WAAU,mDACZ,UACH;AAAA,KAEJ;AAEJ;AAEA,oBAAoB,cAAc;AAElC,IAAO,8BAAQ;;;AChNf,IAAAE,kBAAoC;AAgD5B,IAAAC,wBAAA;AA/BD,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AACZ,MAAuB;AACrB,QAAMC,cAAa,gBAAgB;AACnC,QAAM,CAAC,UAAU,WAAW,QAAI,0BAAS,KAAK;AAC9C,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAwB,IAAI;AAExD,iCAAU,MAAM;AACd,gBAAY,KAAK;AACjB,QAAI,MAAM,WAAW;AACnB,gBAAU,KAAK,SAAS;AAAA,IAC1B,OAAO;AACL,gBAAU,IAAI;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,MAAM,WAAW,IAAI,CAAC;AAE1B,QAAM,eACJ,YAAY,WACR,iBACA,YAAY,YACV,eACA;AACR,QAAMC,eAAc,6EAA6E,YAAY,IAAI,SAAS;AAE1H,QAAM,iBAAiB,MAAM;AAC3B,UAAM,aAAa,MAAM,QAAQ,MAAM,YAAY,MAAM;AACzD,QAAI,YAAY;AACd,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,6GAA6G,YAAY;AAAA,UAEnI,qBAAW,CAAC,EAAE,YAAY;AAAA;AAAA,MAC7B;AAAA,IAEJ;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,6GAA6G,YAAY;AAAA,QAEnI,UAAAD,YAAW,QAAQ,IAAI;AAAA;AAAA,IAC1B;AAAA,EAEJ;AAEA,MAAI,CAAC,QAAQ,CAAC,KAAK,WAAW;AAC5B,WACE,+CAAC,SAAI,WAAWC,cAAa,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK,GAC7D,yBAAe,GAClB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAGA,YAAW;AAAA,MACzB,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,MAElC,WAAC,YAAY,SACZ;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK,MAAM,QAAQ,MAAM,YAAY;AAAA,UACrC,WAAW,8BAA8B,YAAY;AAAA,UACrD,SAAS,MAAM,YAAY,IAAI;AAAA;AAAA,MACjC,IAEA,eAAe;AAAA;AAAA,EAEnB;AAEJ;AAEA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;;;AC7Ff,IAAAC,kBAA+B;AAC/B,IAAAC,sBAAuB;;;ACDvB,IAAAC,kBAA+C;AAkBxC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AACF,IAAyB,CAAC,GAAuB;AAC/C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI;AAAA,IAC5C,kBAAkB,CAAC;AAAA,EACrB;AAEA,QAAM,kBAAkB,qBAAqB;AAE7C,QAAM,iBAAa;AAAA,IACjB,CAAC,SAAmB;AAClB,UAAI,CAAC,mBAAmB;AACtB,2BAAmB,IAAI;AAAA,MACzB;AACA,iBAAW,IAAI;AAAA,IACjB;AAAA,IACA,CAAC,mBAAmB,QAAQ;AAAA,EAC9B;AAEA,QAAM,aAAS;AAAA,IACb,CAAC,OAAe;AACd,YAAM,kBAAkB,gBAAgB,SAAS,EAAE;AAEnD,UAAI,iBAAiB;AACnB,mBAAW,gBAAgB,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;AACxD;AAAA,MACF;AAEA,UAAI,UAAU;AACZ,mBAAW,CAAC,GAAG,iBAAiB,EAAE,CAAC;AAAA,MACrC,OAAO;AACL,mBAAW,CAAC,EAAE,CAAC;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,UAAU,eAAe;AAAA,EACxC;AAEA,QAAM,WAAO;AAAA,IACX,CAAC,OAAe;AACd,UAAI,gBAAgB,SAAS,EAAE,GAAG;AAChC;AAAA,MACF;AACA,UAAI,UAAU;AACZ,mBAAW,CAAC,GAAG,iBAAiB,EAAE,CAAC;AAAA,MACrC,OAAO;AACL,mBAAW,CAAC,EAAE,CAAC;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,UAAU,eAAe;AAAA,EACxC;AAEA,QAAM,YAAQ;AAAA,IACZ,CAAC,OAAe;AACd,UAAI,CAAC,gBAAgB,SAAS,EAAE,GAAG;AACjC;AAAA,MACF;AACA,iBAAW,gBAAgB,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;AAAA,IAC1D;AAAA,IACA,CAAC,YAAY,eAAe;AAAA,EAC9B;AAEA,QAAM,UAAM;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,CAAC,OAAe,gBAAgB,SAAS,EAAE;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd;AAAA,IACA,CAAC,iBAAiB,QAAQ,MAAM,OAAO,UAAU;AAAA,EACnD;AAEA,SAAO;AACT;;;ADoKc,IAAAC,wBAAA;AA3Md,IAAMC,eAWF;AAAA,EACF,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,IAAI;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,iBAQF;AAAA,EACF,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QACE;AAAA,IACF,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QACE;AAAA,IACF,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QACE;AAAA,IACF,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QACE;AAAA,IACF,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QACE;AAAA,IACF,SAAS;AAAA,EACX;AACF;AAEA,IAAM,cAKF;AAAA,EACF,SAAS;AAAA,IACP,QACE;AAAA,IACF,WAAW;AAAA,IACX,MAAM;AAAA,IACN,OACE;AAAA,EACJ;AACF;AAEA,IAAM,mBAAmE;AAAA,EACvE,SAAS;AAAA,EACT,OAAO;AAAA,EACP,cAAc;AAAA,EACd,MAAM;AACR;AAEA,IAAM,yBAA6D;AAAA,EACjE,SAAS;AAAA,EACT,OAAO;AAAA,EACP,cAAc;AAAA,EACd,MAAM;AACR;AAEA,IAAM,yBAAyB;AAExB,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,YAAY,aAAa;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,YAAYD,aAAW,IAAI;AACjC,QAAM,eAAe,eAAe,OAAO;AAC3C,QAAM,YAAa,YAAY,IAAI,KAAK,YAAY;AAEpD,QAAM,gBAAgB,iBAAiB,SAAS;AAChD,QAAM,gBAAgB,cAAc;AAEpC,QAAM,oBAAgB,yBAAQ,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AAExD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAE;AAAA,QACT;AAAA,QACA,aAAa;AAAA,QACb,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA;AAAA,MACA,aAAW;AAAA,MACX,MAAK;AAAA,MACJ,GAAG;AAAA,MAEJ;AAAA,uDAAC,SAAI,MAAK,SAAQ,cAAY,WAAW,WAAU,iBAChD,wBAAc,IAAI,CAAC,SAAS;AAC3B,gBAAM,SAAS,UAAU,OAAO,KAAK,EAAE;AACvC,gBAAM,aAAa,QAAQ,KAAK,QAAQ;AACxC,gBAAM,YAAY,QAAQ,KAAK,OAAO;AAEtC,gBAAM,oBACJ,cAAc,eACV,SACE,cACA,KACF,SACE,gBACA;AAER,gBAAM,cAAc,iBAAiB;AACrC,gBAAM,sBAAsB,SAAS,OACjC,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG,IAClC,SAAS,OACP,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG,IAClC,EAAE,OAAO,IAAI,QAAQ,IAAI,MAAM,GAAG;AAExC,gBAAM,mBAAmB,cAErB;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT,eAAe,oBAAoB,MAAM,MAAM,oBAAoB,KAAK;AAAA,gBACxE;AAAA,gBACA,UAAU;AAAA,gBACV,uBAAuB,SAAS;AAAA,gBAChC;AAAA,cACF;AAAA,cACA,eAAY;AAAA,cACZ,UAAU;AAAA,cAET,UAAAD,YAAW,eAAe,IAAI;AAAA;AAAA,UACjC,IAEA;AAEJ,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,gBAAc,KAAK;AAAA,cACnB,eAAW,oBAAAC;AAAA,gBACT;AAAA,gBACA,aAAa;AAAA,gBACb,cAAc;AAAA,gBACd;AAAA,cACF;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,UAAU,aAAa,KAAK;AAAA,oBAC5B,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,UAAU;AAAA,sBACV,aAAa;AAAA,sBACb,UAAU;AAAA,sBACV;AAAA,sBACA,cAAc;AAAA,oBAChB;AAAA,oBACA,iBAAe;AAAA,oBACf,iBAAe,GAAG,KAAK,EAAE;AAAA,oBACzB,IAAI,GAAG,KAAK,EAAE;AAAA,oBACd,SAAS,MAAM;AACb,gCAAU,OAAO,KAAK,EAAE;AACxB,qCAAe,KAAK,IAAI,CAAC,MAAM;AAAA,oBACjC;AAAA,oBACA,WAAW,CAAC,MAAM;AAChB,0BAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,0BAAE,eAAe;AACjB,kCAAU,OAAO,KAAK,EAAE;AACxB,uCAAe,KAAK,IAAI,CAAC,MAAM;AAAA,sBACjC;AAAA,oBACF;AAAA,oBAEC;AAAA,2CAAqB,UAAU,mBAC9B,+CAAC,SAAI,WAAU,0BACZ,4BACH,IACE;AAAA,sBACJ,gDAAC,SAAI,WAAU,iCACZ;AAAA,6BAAK,OACJ;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAA;AAAA,8BACT;AAAA,8BACA,UAAU;AAAA,8BACV;AAAA,4BACF;AAAA,4BAEC,UAAAD,YAAW,KAAK,MAAM,IAAI;AAAA;AAAA,wBAC7B,IACE;AAAA,wBACJ,gDAAC,SAAI,WAAU,sCACb;AAAA,0EAAC,SAAI,WAAU,qCACb;AAAA,2EAAC,UAAK,WAAW,UAAU,OAAQ,eAAK,OAAM;AAAA,4BAC7C,KAAK,QACJ;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAW,oBAAAC;AAAA,kCACT;AAAA,kCACA,UAAU;AAAA,kCACV,UAAU;AAAA,gCACZ;AAAA,gCAEC,eAAK;AAAA;AAAA,4BACR,IACE;AAAA,6BACN;AAAA,0BACC,KAAK,WACJ,+CAAC,SAAI,eAAW,oBAAAA,SAAW,UAAU,QAAQ,GAC1C,eAAK,UACR,IACE;AAAA,0BACH,KAAK,cACJ,+CAAC,SAAI,eAAW,oBAAAA,SAAW,UAAU,WAAW,GAC7C,eAAK,aACR,IACE;AAAA,2BACN;AAAA,yBACF;AAAA,sBACC,KAAK,UACJ,+CAAC,SAAI,WAAU,2EACZ,eAAK,SACR,IACE;AAAA,sBACH,qBAAqB,WAAW,mBAC/B,+CAAC,SAAI,WAAU,0BACZ,4BACH,IACE;AAAA;AAAA;AAAA,gBACN;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI,GAAG,KAAK,EAAE;AAAA,oBACd,MAAK;AAAA,oBACL,mBAAiB,GAAG,KAAK,EAAE;AAAA,oBAC3B,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,YAAY;AAAA,sBACZ;AAAA,sBACA,YAAY,aAAa,YAAY;AAAA,oBACvC;AAAA,oBACA,OAAO,WAAW,EAAE,WAAW,OAAU,IAAI;AAAA,oBAC7C,aAAW;AAAA,oBAEX;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,SACI,gCACA;AAAA,wBACN;AAAA,wBAEA,yDAAC,SAAI,eAAW,oBAAAA,SAAW,WAAW,aAAa,OAAO,GACxD;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAA;AAAA,8BACT;AAAA,8BACA,UAAU;AAAA,8BACV;AAAA,4BACF;AAAA,4BAEC,eAAK;AAAA;AAAA,wBACR,GACF;AAAA;AAAA,oBACF;AAAA;AAAA,gBACF;AAAA,gBACC,aACC;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAO;AAAA,oBACP,OAAM;AAAA,oBACN,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,OAAM;AAAA;AAAA,gBACR;AAAA;AAAA;AAAA,YAnIG,KAAK;AAAA,UAqIZ;AAAA,QAEJ,CAAC,GACH;AAAA,QACC,WACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAO;AAAA,YACP,OAAO;AAAA,YACP,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAO;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,UAAU,cAAc;AAExB,IAAO,oBAAQ;;;AE9af,IAAAC,kBAAoE;AACpE,IAAAC,sBAAuB;AA0VZ,IAAAC,wBAAA;AArRX,IAAM,cAAc,IAAI,UACtB,MAAM,OAAO,OAAO,EAAE,KAAK,GAAG;AAEhC,IAAM,iBACJ;AAEF,IAAM,cACJ;AAEF,IAAM,YAAY,CAAC,UAAqB,mBAAmB,KAAK,EAAE;AAElE,IAAMC,cAGF;AAAA,EACF,IAAI;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAcA,IAAM,sBAAsB;AAE5B,IAAM,qBAAqB,CACzB,SACA,OACA,aACA,2BACkB;AAClB,QAAM,SAAS,mBAAmB,KAAK;AACvC,QAAM,kBAAkB,OAAO;AAC/B,QAAM,mBAAmB,OAAO;AAChC,QAAM,iBAAiB,OAAO;AAC9B,QAAM,iBAAiB,OAAO;AAC9B,QAAM,WAAW,OAAO;AACxB,QAAM,gBAAgB,OAAO;AAC7B,QAAM,cAAc,OAAO;AAC3B,QAAM,cAAc,OAAO;AAC3B,QAAM,gBAAgB,OAAO;AAC7B,QAAM,kBAAkB,OAAO;AAC/B,QAAM,qBAAqB,OAAO;AAElC,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,gBAAgB,aAAa,UAAU;AAAA,QACzC;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ,YAAY,aAAa,gBAAgB,cAAc;AAAA,QAC/D,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,WAAW;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,WAAW,YAAY,qBAAqB,kBAAkB;AAAA,QAC9D,UAAM,oBAAAC;AAAA,UACJ;AAAA,UACA,gBAAgB,aAAa,aAAa;AAAA,QAC5C;AAAA,QACA,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB,eACZ,sBACA;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAU,YAAY,kBAAkB,aAAa;AAAA,QACrD,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,WAAW;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ,YAAY,kBAAkB,cAAc;AAAA,QACpD,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA,IACF,KAAK;AAAA,IACL;AACE,aAAO;AAAA,QACL,WAAW,yBAAyB,SAAY;AAAA,QAChD,UAAM,oBAAAA,SAAW,SAAS,gBAAgB,cAAc,OAAO;AAAA,QAC/D,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA,EACJ;AACF;AAEA,IAAM,OAA4B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,yBAAyB;AAAA,EACzB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,iBAAiB;AACnB,MAAM;AACJ,QAAMC,cAAa,gBAAgB;AACnC,QAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,IACxC,gBAAgB,MAAM,CAAC,GAAG;AAAA,EAC5B;AACA,QAAM,WAAW,SAAS;AAE1B,iCAAU,MAAM;AACd,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AACA,QAAI,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,aAAa,GAAG;AACpD,uBAAiB,MAAM,CAAC,GAAG,EAAE;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,aAAa,CAAC;AAEhC,QAAM,aAAS;AAAA,IACb,MACE,mBAAmB,SAAS,OAAO,aAAa,sBAAsB;AAAA,IACxE,CAAC,SAAS,OAAO,aAAa,sBAAsB;AAAA,EACtD;AAEA,QAAM,aAAaF,YAAW,IAAI,KAAKA,YAAW;AAClD,QAAM,kBAAc,oBAAAC,SAAW,iBAAiB,WAAW,IAAI;AAE/D,QAAM,qBACJ,iBAAiB,YAAY,eAAe,YAAY;AAC1D,QAAM,eAAW,oBAAAA;AAAA,IACf;AAAA,IACA,gBAAgB,aAAa,aAAa;AAAA,IAC1C,YAAY,YAAY,gBAAgB,gBAAgB;AAAA,IACxD,YAAY,SAAS,gBAAgB,gBAAgB;AAAA,IACrD,YAAY,aACV,gBAAgB,gBAChB;AAAA,IACF,aAAa;AAAA,IACb,OAAO;AAAA,IACP,sBAAsB;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,oBACJ,uBAAuB,SAAY,qBAAqB,OAAO;AAEjE,QAAM,gBAAY,oBAAAA;AAAA,IAChB;AAAA,IACA;AAAA,IACA,gBAAgB,aAAa,oBAAoB;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAMA,QAAM,gBAAgB,CAAC,SAAkD;AACvE,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAOC,YAAW,MAAM,QAAW,WAAW;AAAA,IAChD;AAEA,QAAI,gBAAAC,QAAM,eAAuC,IAAI,GAAG;AACtD,aAAO,gBAAAA,QAAM,aAAa,MAAM;AAAA,QAC9B,eAAW,oBAAAF,SAAW,aAAa,KAAK,MAAM,SAAS;AAAA,MACzD,CAAC;AAAA,IACH;AAEA,WAAO,+CAAC,UAAK,WAAW,aAAc,gBAAK;AAAA,EAC7C;AAEA,SACE,gDAAC,SAAI,WAAW,WACd;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,oBAAkB;AAAA,QAClB,eAAW,oBAAAA,SAAW,UAAU,oBAAoB;AAAA,QAEnD;AAAA,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,kBAAM,WAAW,KAAK,OAAO;AAC7B,kBAAM,aAAa,KAAK;AACxB,kBAAM,aAAa,GAAG,aAAa,IAAI,KAAK,EAAE;AAC9C,kBAAM,yBAAqB,oBAAAA;AAAA,cACzB;AAAA,cACA,WAAW;AAAA,cACX,WAAW;AAAA,cACX,WAAW;AAAA,cACX,UAAU,KAAK;AAAA,cACf;AAAA,cACA,OAAO;AAAA,cACP,WAAW,OAAO,SAAS,OAAO;AAAA,cAClC,cAAc,OAAO;AAAA,cACrB,aAAa;AAAA,YACf;AACA,kBAAM,mBACJ,sBAAsB,QAAQ,MAAM,SAAS;AAE/C,mBACE,gDAAC,gBAAAE,QAAM,UAAN,EACC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,IAAI,OAAO,KAAK,EAAE;AAAA,kBAClB,iBAAe;AAAA,kBACf,iBAAe;AAAA,kBACf,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,SAAS,MAAM;AACb,wBAAI,YAAY;AACd;AAAA,oBACF;AACA,wBAAI,CAAC,iBAAiB,KAAK,OAAO,UAAU;AAC1C;AAAA,oBACF;AACA,wBAAI,UAAU,QAAW;AACvB,uCAAiB,KAAK,EAAE;AAAA,oBAC1B;AACA,+BAAW,KAAK,IAAI,IAAI;AAAA,kBAC1B;AAAA,kBACA,UAAU,WAAW,IAAI;AAAA,kBAExB;AAAA,kCAAc,KAAK,IAAI;AAAA,oBACxB,gDAAC,UAAK,WAAU,mCACd;AAAA,qEAAC,UAAK,WAAU,YAAY,eAAK,OAAM;AAAA,sBACtC,KAAK,cACJ,+CAAC,UAAK,WAAU,mDACb,eAAK,aACR,IACE;AAAA,uBACN;AAAA,oBACC,KAAK,QACJ,+CAAC,iBAAM,OAAO,KAAK,OAAO,MAAM,KAAK,YAAY,IAC/C;AAAA;AAAA;AAAA,cACN;AAAA,cACC,mBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,eAAW,oBAAAF;AAAA,oBACT;AAAA,oBACA,gBAAgB,aACZ,6EACA;AAAA,kBACN;AAAA;AAAA,cACF,IACE;AAAA,iBA9Ce,KAAK,EA+C1B;AAAA,UAEJ,CAAC;AAAA,UACD,+CAAC,SAAI,WAAU,aAAY;AAAA,UAC3B;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,WAAU;AAAA,cAET,gBACE,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,GAClC,SAAS;AAAA,gBAAI,CAAC,QAAQ,QACtB,OAAO,OACL,+CAAC,gBAAAE,QAAM,UAAN,EACE,iBAAO,QADW,OAAO,MAAM,cAAc,GAAG,EAEnD,IACE,OAAO,OACT;AAAA,kBAAC;AAAA;AAAA,oBAEC,QAAQ;AAAA,oBACR,OAAO,OAAO,SAAS;AAAA,oBACvB,aAAa,OAAO,SAAS;AAAA,oBAC7B,MAAM,OAAO;AAAA,oBACb;AAAA,oBACA,gBAAc,OAAO,UAAU;AAAA,oBAC/B,cACE,OAAO,OAAO,UAAU,WACpB,OAAO,QACP,UAAU,MAAM,CAAC;AAAA,oBAEvB,SAAS,OAAO,YAAY,MAAM;AAAA,oBAClC,eAAW,oBAAAF;AAAA,sBACT,GAAG,OAAO,UAAU,iBAAiB,OAAO,SAAS,KAAK,CAAC;AAAA,oBAC7D;AAAA;AAAA,kBAfK,OAAO,MAAM,cAAc,GAAG;AAAA,gBAgBrC,IACE;AAAA,cACN;AAAA;AAAA,UACJ;AAAA;AAAA;AAAA,IACF;AAAA,IACC,MAAM,IAAI,CAAC,SAAS;AACnB,UAAI,KAAK,UAAU,QAAW;AAC5B,eAAO;AAAA,MACT;AACA,YAAM,aAAa,GAAG,aAAa,IAAI,KAAK,EAAE;AAC9C,YAAM,WAAW,KAAK,OAAO;AAC7B,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,IAAI;AAAA,UACJ,mBAAiB,OAAO,KAAK,EAAE;AAAA,UAC/B,QAAQ,CAAC;AAAA,UACT,eAAa,CAAC;AAAA,UACd,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA,aACI,6BACA;AAAA,YACJ,WAAW,iBAAiB;AAAA,UAC9B;AAAA,UAEC,uBACC,kFACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,gBACX,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YACA,+CAAC,SAAI,WAAU,uCACZ,eAAK,OACR;AAAA,aACF,IAEA,KAAK;AAAA;AAAA,QA5BF;AAAA,MA8BP;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,KAAK,cAAc;AAEnB,IAAO,eAAQ;;;AC7ff,IAAAG,sBAAuB;AACvB,IAAAC,kBAQO;AACP,IAAAC,oBAA6B;;;ACV7B,IAAAC,kBAAoC;AAc9B,IAAAC,wBAAA;AATC,IAAM,aAA2B,CAAC,MAAM,MAAM,cAAc;AACjE,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,eAAyB,QAAQ;AAEvC,MAAI,OAAO,SAAS,UAAU;AAC5B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAM;AAAA;AAAA,IACR;AAAA,EAEJ;AAEA,MAAI,gBAAAC,QAAM,eAAuC,IAAI,GAAG;AACtD,eAAO,8BAAa,MAAM;AAAA,MACxB,WAAW,iBAAiB,KAAK,MAAM,WAAW,SAAS;AAAA,IAC7D,CAAC;AAAA,EACH;AAEA,SAAO,gDAAC,UAAK,WAAsB;AAAA;AAAA,IAAE;AAAA,IAAK;AAAA,KAAC;AAC7C;;;ADkDI,IAAAC,wBAAA;AApDJ,IAAM,cAMF;AAAA,EACF,IAAI,EAAE,OAAO,KAAK,WAAW,mBAAmB;AAAA,EAChD,IAAI,EAAE,OAAO,KAAK,WAAW,mBAAmB;AAAA,EAChD,IAAI,EAAE,OAAO,KAAK,WAAW,mBAAmB;AAAA,EAChD,IAAI,EAAE,OAAO,KAAK,WAAW,mBAAmB;AAAA,EAChD,IAAI,EAAE,OAAO,KAAM,WAAW,oBAAoB;AAAA,EAClD,KAAK,EAAE,OAAO,MAAM,WAAW,oBAAoB;AAAA,EACnD,OAAO,EAAE,OAAO,MAAM,WAAW,oBAAoB;AAAA,EACrD,MAAM,EAAE,OAAO,MAAM,WAAW,oBAAoB;AAAA,EACpD,OAAO,EAAE,OAAO,MAAM,WAAW,oBAAoB;AAAA,EACrD,MAAM,EAAE,WAAW,0BAA0B;AAC/C;AAEA,IAAMC,kBAAiB,CAAC,UAAgD;AACtE,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,SAAO;AACT;AAEA,IAAM,YACJ,OAAO,WAAW,eAAe,OAAO,aAAa;AAQvD,IAAM,oBAAuD;AAAA,EAC3D,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AACX;AAEA,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA,QAAQ;AAAA,EACR;AACF,MAAM;AACJ,QAAMC,kBAAiB,kBAAkB,KAAK,KAAK,kBAAkB;AACrE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACAD;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AA4CA,IAAM,QAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,SAAS;AACf,QAAM,iBAAa,wBAAuB,IAAI;AAC9C,QAAM,qBAAiB,wBAA0B,IAAI;AACrD,QAAM,2BAAuB,wBAA2B,IAAI;AAE5D,QAAM,gBAAY,uBAAM;AACxB,QAAM,aAAS,uBAAM;AAErB,QAAM,gBAAgB,eAAe,gBAAgB;AACrD,QAAM,gBAAgB,UAAU;AAChC,QAAM,yBAAyB,iBAAiB,kBAAkB,CAAC;AAEnE,QAAM,iBAAa,yBAAQ,MAAM;AAC/B,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,gBACJ,OAAO,SAAS,WAAW,YAAY,IAAI,IAAI;AACjD,QAAM,iBAAiB,YAAY;AACnC,QAAM,iBAAiB,iBAAiB;AACxC,QAAM,cAAc,SAAS;AAC7B,QAAM,eACJ,OAAO,SAAS,YACf,OAAO,SAAS,YAAY,kBAAkB,UAAa,CAAC;AAC/D,QAAM,YAAY,CAAC,eAAe,eAAe,YAAY;AAC7D,QAAM,cACJ,CAAC,gBAAgB,CAAC,cAAc,eAAe,QAAQ;AACzD,QAAM,mBAAmB,cACrBD,gBAAe,WAAW,IAC1B;AACJ,QAAM,qBAAqB,eACvBA,gBAAe,IAAuB,IACtC;AACJ,QAAM,mBACJ,aAAa,SACTA,gBAAe,QAAQ,IACvB,cACE,SACC,sBAAsB;AAC/B,QAAM,gBAAgB,cAClB,SACA,qBACE,aAAa,kBAAkB,MAC/B,mBACE,aAAa,gBAAgB,MAC7B;AAER,QAAM,qBAAiB,oBAAAE;AAAA,IACrB;AAAA,IACA,gBAAgB,sBAAsB;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,qBAAiB,oBAAAA;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,yBAAyB,oBAC3B,8DACA;AAEJ,QAAM,eAAoC;AAAA,IACxC,GAAI,gBAAgB,EAAE,OAAO,cAAc,IAAI;AAAA,IAC/C,GAAI,mBAAmB,EAAE,UAAU,iBAAiB,IAAI;AAAA,IACxD,GAAI,aAAa,SACb,EAAE,UAAUF,gBAAe,QAAQ,EAAE,IACrC;AAAA,IACJ,GAAI,cAAc,SACd,EAAE,WAAWA,gBAAe,SAAS,EAAE,IACvC;AAAA,IACJ,GAAG;AAAA,EACL;AAEA,QAAM,iBACJ,cAAc,OAAO,UAAU,WAAW,QAAQ;AACpD,QAAM,iBAAiB,iBAAiB,SAAY;AACpD,QAAM,kBAAkB,eAAe,aAAa,SAAS;AAE7D,QAAM,oBAAgB;AAAA,IACpB,CAAC,UAAyB;AACxB,UAAI,cAAc,MAAM,QAAQ,UAAU;AACxC,cAAM,eAAe;AACrB,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,CAAC,YAAY,OAAO;AAAA,EACtB;AAGA,iCAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,2BAAqB,UACnB,SAAS;AAEX,YAAM,cACJ,iBAAiB,YAChB,CAAC,kBAAkB,eAAe,UAAU,SAC5C,WAAW;AAGd,YAAM,aAAa,sBAAsB,MAAM;AAC7C,qBAAa,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,MAC5C,CAAC;AAED,aAAO,MAAM;AACX,6BAAqB,UAAU;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,iBAAiB,eAAe,CAAC;AAGrD,iCAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,UAAI,YAAY;AACd,iBAAS,iBAAiB,WAAW,aAAa;AAAA,MACpD;AAEA,UAAI,eAAe;AACjB,cAAM,mBAAmB,SAAS,KAAK,MAAM;AAC7C,iBAAS,KAAK,MAAM,WAAW;AAE/B,eAAO,MAAM;AACX,mBAAS,oBAAoB,WAAW,aAAa;AACrD,mBAAS,KAAK,MAAM,WAAW;AAAA,QACjC;AAAA,MACF;AAEA,aAAO,MAAM;AACX,iBAAS,oBAAoB,WAAW,aAAa;AAAA,MACvD;AAAA,IACF;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,aAAa;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,YAAY,eAAe,QAAQ,QAAQ,aAAa,CAAC;AAE7D,iCAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,qBAAqB,SAAS;AAC3C,YAAM,OAAO,qBAAqB;AAClC,2BAAqB,UAAU;AAC/B,WAAK,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,QAAM,8BAA0B;AAAA,IAC9B,CAAC,UAA4C;AAC3C,UAAI,CAAC,sBAAsB;AACzB;AAAA,MACF;AACA,UAAI,MAAM,WAAW,MAAM,eAAe;AACxC,cAAM,gBAAgB;AACtB,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,CAAC,sBAAsB,OAAO;AAAA,EAChC;AAEA,QAAM,6BAAyB;AAAA,IAC7B,CAAC,UAA4C;AAC3C,YAAM,gBAAgB;AACtB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,yBAAqB;AAAA,IACzB,CAAC,UAA4C;AAC3C,YAAM,gBAAgB;AACtB,gBAAU,KAAK;AAAA,IACjB;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,UAA+C;AAC9C,kBAAY,KAAK;AAAA,IACnB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,MAAI,CAAC,UAAU,CAAC,QAAQ;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,UACJ,+CAAC,SAAI,WAAW,gBAAgB,aAAa,yBAC3C;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,MACX,OAAO;AAAA,MACP;AAAA,MACA,cAAW;AAAA,MACX,mBAAiB;AAAA,MACjB,cAAY;AAAA,MACZ,oBAAkB;AAAA,MAClB,aAAW,UAAU,SAAS;AAAA,MAC9B,UAAU;AAAA,MACV,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACV,GAAG;AAAA,MAEJ;AAAA,wDAAC,SAAI,WAAU,4HACZ;AAAA,oBACC,+CAAC,SAAI,WAAU,0CACb;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,MAAK;AAAA,cACL,SAAS;AAAA,cACT,iBAAgB;AAAA,cAChB,cAAY;AAAA,cACZ,SAAS;AAAA;AAAA,UACX,GACF;AAAA,UAEF,gDAAC,SAAI,WAAU,sCACb;AAAA,4DAAC,SAAI,WAAU,mCACZ;AAAA,sBACC,+CAAC,SAAI,WAAU,oFACZ,qBAAW,MAAM,IAAI,GACxB;AAAA,cAEF,+CAAC,SAAI,WAAU,WACb;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,WAAU;AAAA,kBAET;AAAA;AAAA,cACH,GACF;AAAA,eACF;AAAA,YACC,eACC,+CAAC,OAAE,WAAU,kDACV,uBACH;AAAA,aAEJ;AAAA,UACA,gDAAC,SAAI,WAAU,oCACZ;AAAA,mCAAuB,IAAI,CAAC,QAAQ,UACnC,+CAAC,kBAA6C,GAAG,UAApC,uBAAuB,KAAK,EAAgB,CAC1D;AAAA,YACA,CAAC,mBACA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAAS;AAAA;AAAA,YACX;AAAA,aAEJ;AAAA,WACF;AAAA,QAEC,cACC,+CAAC,SAAI,WAAU,gFACb;AAAA,UAAC;AAAA;AAAA,YACE,GAAG;AAAA,YACJ,eAAW,oBAAAE;AAAA,cACT;AAAA,cACA,WAAW;AAAA,YACb;AAAA;AAAA,QACF,GACF;AAAA,QAGD,cACC,gDAAC,SAAI,WAAU,qHACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA,QAEF,gDAAC,SAAI,WAAU,qFACZ;AAAA,qBACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAO;AAAA,cACP,OAAO;AAAA,cACP,OAAO;AAAA,cACP,WAAU;AAAA;AAAA,UACZ;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,WAAW;AAAA,cACb;AAAA,cAEA,yDAAC,SAAI,WAAU,uBAAuB,UAAS;AAAA;AAAA,UACjD;AAAA,WACF;AAAA,QACC,iBACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ,GACF;AAGF,aAAO,gCAAa,SAAS,SAAS,IAAI;AAC5C;AAqBA,IAAM,eAA4C,CAAC;AAAA,EACjD,eAAe;AAAA,EACf,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,QACE,gDAAC,gBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS;AAAA,YACR,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO,MAAM,gBAAgB;AAAA,YAC7B,SAAS;AAAA,YACT,UAAU;AAAA,YACT,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MAGD;AAAA;AAAA,EACH;AAEJ;AAcA,IAAM,qBAAwD,CAAC;AAAA,EAC7D;AAAA,EACA,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,EAAE;AAC/C,QAAM,eAAW,wBAAyB,IAAI;AAC9C,QAAM,UAAU,eAAe;AAE/B,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM,OAAQ,eAAc,EAAE;AAAA,EACrC,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,MAAK;AAAA,MACL,iBAAiB;AAAA,MACjB,QACE,gDAAC,gBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS;AAAA,YACR,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU,CAAC,WAAW;AAAA,YACrB,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MAGD;AAAA;AAAA,QACD,gDAAC,SAAI,WAAU,4BACb;AAAA,0DAAC,WAAM,WAAU,kDAAiD;AAAA;AAAA,YACtD;AAAA,YAAmB;AAAA,YAC7B,+CAAC,UAAK,WAAU,kEACb,wBACH;AAAA,YAAQ;AAAA,YAAI;AAAA,aAEd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,WAAW,CAAC,kBAAmB,WAAU;AAAA,cACpE;AAAA,cACA,aAAa;AAAA,cACb,WAAU;AAAA,cACV,cAAa;AAAA,cACb,YAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAcA,IAAM,oBAAsD,CAAC;AAAA,EAC3D;AAAA,EACA,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,EAAE;AAC/C,QAAM,eAAW,wBAAyB,IAAI;AAC9C,QAAM,UAAU,eAAe;AAE/B,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM,OAAQ,eAAc,EAAE;AAAA,EACrC,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,MAAK;AAAA,MACL,iBAAiB;AAAA,MACjB,QACE,gDAAC,gBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS;AAAA,YACR,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU,CAAC,WAAW;AAAA,YACrB,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MAGD;AAAA;AAAA,QACD,gDAAC,SAAI,WAAU,4BACb;AAAA,0DAAC,WAAM,WAAU,kDAAiD;AAAA;AAAA,YACtD;AAAA,YAAmB;AAAA,YAC7B,+CAAC,UAAK,WAAU,kEACb,wBACH;AAAA,YAAQ;AAAA,YAAI;AAAA,aAEd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,WAAW,CAAC,kBAAmB,WAAU;AAAA,cACpE;AAAA,cACA,aAAa;AAAA,cACb,WAAU;AAAA,cACV,cAAa;AAAA,cACb,YAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AASC,MAA6B,UAAU;AACvC,MAA6B,UAAU;AACvC,MAA6B,gBAAgB;AAC7C,MAA6B,eAAe;AAQ7C,IAAO,gBAAQ;;;AE9vBf,IAAAC,sBAAuB;AACvB,IAAAC,kBAQO;AAmVC,IAAAC,wBAAA;AApUR,IAAMC,eACJ;AAAA,EACE,IAAI,EAAE,UAAU,SAAS,WAAW,gBAAgB;AAAA,EACpD,IAAI,EAAE,UAAU,SAAS,WAAW,gBAAgB;AAAA,EACpD,IAAI,EAAE,UAAU,SAAS,WAAW,gBAAgB;AAAA,EACpD,IAAI,EAAE,UAAU,SAAS,WAAW,gBAAgB;AAAA,EACpD,IAAI,EAAE,UAAU,UAAU,WAAW,iBAAiB;AAAA,EACtD,KAAK,EAAE,UAAU,UAAU,WAAW,iBAAiB;AAAA,EACvD,OAAO,EAAE,UAAU,UAAU,WAAW,iBAAiB;AAAA,EACzD,MAAM,EAAE,UAAU,UAAU,WAAW,iBAAiB;AAAA,EACxD,OAAO,EAAE,UAAU,UAAU,WAAW,iBAAiB;AAAA,EACzD,MAAM,EAAE,WAAW,oBAAoB;AACzC;AAwFF,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,CAAC;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,iBAAa,wBAAuB,IAAI;AAC9C,QAAM,qBAAiB,wBAA0B,IAAI;AACrD,QAAM,2BAAuB,wBAA2B,IAAI;AAC5D,QAAM,kBAAc,wBAAO,MAAM;AAEjC,QAAM,gBAAY,uBAAM;AACxB,QAAM,aAAS,uBAAM;AAIrB,QAAM,CAAC,SAAS,UAAU,QAAI,0BAAS,MAAM;AAE7C,iCAAU,MAAM;AACd,QAAI,UAAU,CAAC,YAAY,SAAS;AAClC,iBAAW,IAAI;AAAA,IACjB;AACA,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,0BAAsB;AAAA,IAC1B,CAAC,MAA6C;AAE5C,UAAI,EAAE,WAAW,EAAE,cAAe;AAClC,UAAI,CAAC,OAAQ,YAAW,KAAK;AAAA,IAC/B;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAIA,iCAAU,MAAM;AACd,QAAI,QAAQ;AACV,2BAAqB,UACnB,SAAS;AACX,YAAM,cACJ,iBAAiB,YAChB,CAAC,kBAAkB,eAAe,UAAU,SAC7C,WAAW;AACb,YAAM,QAAQ;AAAA,QAAsB,MAClC,aAAa,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,MAC5C;AACA,aAAO,MAAM,qBAAqB,KAAK;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,QAAQ,iBAAiB,eAAe,CAAC;AAE7C,iCAAU,MAAM;AACd,QAAI,CAAC,UAAU,qBAAqB,SAAS;AAC3C,YAAM,OAAO,qBAAqB;AAClC,2BAAqB,UAAU;AAC/B,WAAK,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAIX,iCAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,WAAY;AAC5B,UAAM,UAAU,CAAC,MAAqB;AAEpC,UAAI,EAAE,QAAQ,YAAY,CAAC,EAAE,kBAAkB;AAC7C,UAAE,eAAe;AACjB,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,OAAO;AAC5C,WAAO,MAAM,SAAS,oBAAoB,WAAW,OAAO;AAAA,EAC9D,GAAG,CAAC,QAAQ,YAAY,OAAO,CAAC;AAIhC,iCAAU,MAAM;AACd,QAAI,QAAQ,IAAI,aAAa,gBAAgB,UAAU,WAAW,SAAS;AACzE,YAAM,SAAS,WAAW,QAAQ;AAClC,UAAI,QAAQ;AACV,cAAM,EAAE,SAAS,IAAI,iBAAiB,MAAM;AAC5C,YAAI,aAAa,UAAU;AACzB,kBAAQ;AAAA,YACN;AAAA,UAGF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAIX,QAAM,yBAAqB,yBAAQ,MAAM;AACvC,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAIX,QAAM,iBACJ;AAEF,QAAM,2BAAuB,yBAAQ,MAAM;AACzC,QAAI,WAAW,QAAQ;AACrB,aAAO,SAAS,gBAAgB;AAAA,IAClC;AACA,QAAI,WAAW,OAAO;AACpB,aAAO,SACH,8BACA;AAAA,IACN;AACA,QAAI,WAAW,UAAU;AACvB,aAAO,SACH,8BACA;AAAA,IACN;AAEA,WAAO,SACH,0BACA;AAAA,EACN,GAAG,CAAC,QAAQ,MAAM,CAAC;AAInB,QAAM,SAASA,aAAY,IAAI,KAAKA,aAAY;AAChD,QAAM,SAAS,WAAW;AAC1B,QAAM,WAAW,WAAW;AAE5B,QAAM,gBAAgB,SAAS,kBAAkB,OAAO;AAExD,QAAM,YAAiC;AAAA,IACrC,GAAI,aAAa,SACb,EAAE,UAAU,OAAO,aAAa,WAAW,GAAG,QAAQ,OAAO,SAAS,IACtE,CAAC,SACC,EAAE,UAAU,OAAO,SAAS,IAC5B;AAAA,IACN,GAAI,aAAa,SACb,EAAE,UAAU,OAAO,aAAa,WAAW,GAAG,QAAQ,OAAO,SAAS,IACtE;AAAA,IACJ,GAAI,WAAW,SACX,EAAE,QAAQ,OAAO,WAAW,WAAW,GAAG,MAAM,OAAO,OAAO,IAC9D;AAAA,IACJ,GAAI,cAAc,SACd;AAAA,MACE,WACE,OAAO,cAAc,WAAW,GAAG,SAAS,OAAO;AAAA,IACvD,IACA;AAAA,IACJ,GAAI,cAAc,SACd;AAAA,MACE,WACE,OAAO,cAAc,WAAW,GAAG,SAAS,OAAO;AAAA,IACvD,IACA;AAAA,IACJ,GAAG;AAAA,EACL;AAEA,QAAM,gBAAgB,UAAU;AAChC,QAAM,yBAAyB,oBAC3B,8DACA;AAEJ,QAAM,iBACJ,cAAc,OAAO,UAAU,WAAW,QAAQ;AACpD,QAAM,iBAAiB,iBAAiB,SAAY;AACpD,QAAM,kBAAkB,eAAe,aAAa,SAAS;AAE7D,MAAI,CAAC,QAAS,QAAO;AAErB;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAC;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,EAAE,OAAO;AAAA,QAChB,iBAAiB;AAAA,QAGhB;AAAA,WAAC,UAAU,gBACV;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cACV,aAAa,uBAAuB,UAAU;AAAA;AAAA,UAChD;AAAA,UAIF;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,SACI,oCACA,WACE,+BACA;AAAA,gBACN;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA,OAAO;AAAA,cACP;AAAA,cACA,cAAW;AAAA,cACX,mBAAiB;AAAA,cACjB,cAAY;AAAA,cACZ,oBAAkB;AAAA,cAClB,aAAW,UAAU,SAAS;AAAA,cAC9B,UAAU;AAAA,cACT,GAAG;AAAA,cAGJ;AAAA,gEAAC,SAAI,WAAU,4HACZ;AAAA,4BACC,+CAAC,SAAI,WAAU,0CACb;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,OAAM;AAAA,sBACN,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,iBAAgB;AAAA,sBAChB,cAAY;AAAA,sBACZ,SAAS;AAAA;AAAA,kBACX,GACF;AAAA,kBAEF,gDAAC,SAAI,WAAU,sCACb;AAAA,oEAAC,SAAI,WAAU,mCACZ;AAAA,8BACC,+CAAC,SAAI,WAAU,oFACZ,qBAAW,MAAM,IAAI,GACxB;AAAA,sBAEF,+CAAC,SAAI,WAAU,WACb;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAI;AAAA,0BACJ,WAAU;AAAA,0BAET;AAAA;AAAA,sBACH,GACF;AAAA,uBACF;AAAA,oBACC,eACC,+CAAC,OAAE,WAAU,kDACV,uBACH;AAAA,qBAEJ;AAAA,kBACA,gDAAC,SAAI,WAAU,oCACZ;AAAA,kCAAc,IAAI,CAAC,QAAQ,MAC1B,+CAAC,kBAAyC,GAAG,UAAhC,uBAAuB,CAAC,EAAgB,CACtD;AAAA,oBACA,CAAC,mBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,OAAM;AAAA,wBACN,MAAK;AAAA,wBACL,cAAW;AAAA,wBACX,SAAS;AAAA;AAAA,oBACX;AAAA,qBAEJ;AAAA,mBACF;AAAA,gBAGC,cACC;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI;AAAA,oBACJ,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,gBAIF,gDAAC,SAAI,WAAU,qFACZ;AAAA,6BACC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAO;AAAA,sBACP,OAAO;AAAA,sBACP,OAAO;AAAA,sBACP,WAAU;AAAA;AAAA,kBACZ;AAAA,kBAEF;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI,aAAa,SAAY;AAAA,sBAC7B,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA,WAAW;AAAA,sBACb;AAAA,sBAEA,yDAAC,SAAI,WAAU,uBAAuB,UAAS;AAAA;AAAA,kBACjD;AAAA,mBACF;AAAA,gBAGC,iBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA;AAAA,oBACF;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA;AAAA,UAEJ;AAAA;AAAA;AAAA,IACF;AAAA;AAEJ;AAEA,YAAY,cAAc;AAenB,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACE,GAAG;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAK;AAAA,IACL,SACE,kFACE;AAAA,qDAAC,kBAAO,SAAQ,QAAO,OAAM,SAAQ,MAAK,MAAK,SAAS,SACrD,uBACH;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAK;AAAA,UACL,UAAU;AAAA,UACV,SAAS;AAAA,UAER;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAGD,sBAAY;AAAA;AACf;AAGF,mBAAmB,cAAc;AAgB1B,IAAM,2BAET,CAAC;AAAA,EACH;AAAA,EACA,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,EAAE;AAC/C,QAAM,eAAW,wBAAyB,IAAI;AAC9C,QAAM,UAAU,eAAe;AAE/B,iCAAU,MAAM;AACd,QAAI,CAAC,MAAM,OAAQ,eAAc,EAAE;AAAA,EACrC,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAe;AAAA,MACf,cAAa;AAAA,MACb,mBAAmB,CAAC,WAAW;AAAA,MAC/B,iBAAiB;AAAA,MAEhB;AAAA;AAAA,QACD,gDAAC,SAAI,WAAU,4BACb;AAAA,0DAAC,WAAM,WAAU,kDAAiD;AAAA;AAAA,YACtD;AAAA,YAAmB;AAAA,YAC7B,+CAAC,UAAK,WAAU,kEACb,wBACH;AAAA,YAAQ;AAAA,YAAI;AAAA,aAEd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,cAC7C,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,WAAW,CAAC,kBAAmB,WAAU;AAAA,cACpE;AAAA,cACA,aAAa;AAAA,cACb,WAAU;AAAA,cACV,cAAa;AAAA,cACb,YAAY;AAAA;AAAA,UACd;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,yBAAyB,cAAc;AAGvC,IAAO,sBAAQ;;;AC5mBf,8BAAkC;AAClC,IAAAC,kBAAyC;AA0brC,IAAAC,wBAAA;AA5TJ,IAAM,yBAAyB,CAAC,UAAqB;AACnD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WACE;AAAA,MACJ;AAAA,IAAM,KAAK;AACX,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF;AACE,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,EACJ;AACF;AAEO,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,oBAAoB,CAAC;AAAA,EACrB,QAAQ;AACV,MAAqB;AACnB,QAAM,eAAW,qCAAY;AAC7B,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,0BAAS,KAAK;AAEhE,QAAM,cAAc,mBAAmB,YAAY;AACnD,QAAM,iBACJ,qBAAqB,MAAM,qBAAqB,CAAC,iBAAiB;AAEpE,QAAM,WAAW,CAAC,SAAiB;AACjC,QAAI,SAAS,IAAK,QAAO,SAAS,aAAa;AAC/C,WAAO,SAAS,SAAS,WAAW,IAAI;AAAA,EAC1C;AAEA,QAAM,mBAAe,yBAAQ,MAAM;AACjC,UAAM,iBAAiB,CAAC,CAAC,oBAAoB,qBAAqB;AAElE,UAAM,yBAAyB,CAAC,WAAyC;AACvE,UAAI,CAAC,kBAAkB,kBAAkB,WAAW,EAAG,QAAO;AAC9D,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,SAAS,UAAU;AAE3B,cACE,kBAAkB,SAAS,MAAM,MAAM,KACvC,MAAM,WAAW;AAEjB,mBAAO;AAAA,QACX,WAAW,MAAM,SAAS,aAAa;AAErC,gBAAM,qBAAqB,MAAM,QAAQ;AAAA,YAAO,CAAC,MAC/C,kBAAkB,SAAS,CAAC;AAAA,UAC9B;AACA,cACE,mBAAmB,SAAS,KAC5B,CAAC,mBAAmB,SAAS,gBAAiB;AAE9C,mBAAO;AAAA,QACX;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,CAAC,SAAgC;AACnD,UAAI,KAAK,OAAQ,QAAO;AACxB,UAAI,KAAK,QAAQ,QAAQ;AACvB,YAAI,CAAC,uBAAuB,KAAK,MAAM,EAAG,QAAO;AACjD,YAAI,eAAgB,QAAO,eAAe,KAAK,MAAM;AAAA,MACvD;AACA,aAAO;AAAA,IACT;AAGA,UAAM,yBAAyB,oBAAI,IAAY;AAC/C,UAAM,QAAQ,CAAC,SAAS;AACtB,UACE,KAAK,SAAS,WACd,KAAK,SAAS,aACd,YAAY,IAAI,GAChB;AACA,cAAM,OAAO;AACb,YAAI,KAAK,UAAW,wBAAuB,IAAI,KAAK,SAAS;AAAA,MAC/D;AAAA,IACF,CAAC;AAED,WAAO,MAAM,OAAO,CAAC,SAAS;AAC5B,UAAI,CAAC,YAAY,IAAI,EAAG,QAAO;AAC/B,UAAI,KAAK,SAAS,QAAS,QAAO,uBAAuB,IAAI,KAAK,IAAI;AAEtE,UAAI,KAAK,SAAS;AAChB,eAAO,CAAC,KAAK,aAAa,uBAAuB,IAAI,KAAK,SAAS;AACrE,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,OAAO,gBAAgB,kBAAkB,iBAAiB,CAAC;AAG/D,QAAM,gBAAgB;AAAA;AAAA,MAElB,aAAa,kBAAkB,mBAAmB;AAAA;AAOtD,QAAM,iBAAiB;AAAA,qDAC4B,aAAa,WAAW,oCAAoC;AAAA;AAAA;AAAA,MAG3G,cAAc,aAAa,MAAM;AAAA;AAGrC,QAAM,eAAe,YAAY,aAC/B;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,gIAAgI,cAAc,mBAAmB,EAAE;AAAA,MAE7K;AAAA,oBAAY,+CAAC,SAAI,WAAU,YAAY,oBAAS;AAAA,QAChD,YACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,+CAA+C,cAAc,uBAAuB,yBAAyB;AAAA,YAExH,yDAAC,SAAI,WAAU,qBAAqB,oBAAS;AAAA;AAAA,QAC/C;AAAA;AAAA;AAAA,EAEJ;AAGF,QAAM,gBAAgB,CAAC,aACrB,kFAGG;AAAA,KAAC,YACA,+CAAC,SAAI,WAAU,6FAA4F;AAAA,IAG7G;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,iBAAiB;AAAA,QACnB;AAAA;AAAA,IACF;AAAA,IACA,gDAAC,SAAI,WAAU,wCAEZ;AAAA;AAAA,OAGC,SAAS,aACT;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,oCAAoC,eAAe,CAAC,WAAW,wBAAwB,iBAAiB;AAAA,UAElH;AAAA,qBAAS,EAAE,eAAe,CAAC,aAC1B,+CAAC,QAAG,WAAU,wGACX,iBACH;AAAA,YAGD,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBAEV,yDAAC,sBAAW,MAAK,SAAQ,WAAU,WAAU;AAAA;AAAA,YAC/C;AAAA;AAAA;AAAA,MAEJ;AAAA,MAIF,+CAAC,SAAI,WAAU,oWACb,yDAAC,SAAI,WAAU,oBACZ,uBAAa,IAAI,CAAC,MAAM,UAAU;AAEjC,YAAI,KAAK,SAAS,WAAW;AAC3B,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,+DAA+D,eAAe,CAAC,WAAW,SAAS,MAAM;AAAA;AAAA,YAD/G,WAAW,KAAK;AAAA,UAEvB;AAAA,QAEJ;AAGA,YAAI,KAAK,SAAS,SAAS;AACzB,cAAI,eAAe,CAAC,SAAU,QAAO;AACrC,iBACE,gDAAC,gBAAAC,QAAM,UAAN,EACE;AAAA,iBAAK,cACJ;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,oCAAoC,eAAe,CAAC,WAAW,SAAS,MAAM;AAAA;AAAA,YAC3F;AAAA,YAEF;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,qGAAqG,UAAU,IAAI,SAAS,MAAM;AAAA,gBAE5I,eAAK;AAAA;AAAA,YACR;AAAA,eAVmB,SAAS,KAAK,IAAI,KAAK,KAAK,EAWjD;AAAA,QAEJ;AAGA,cAAM,WAAW;AACjB,cAAM,SAAS,SAAS,SAAS,IAAI;AACrC,cAAM,YAAY,SAAS,SAAS;AACpC,cAAM,SAAS,uBAAuB,SAAS;AAE/C,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI,SAAS;AAAA,YACb,SAAS,MAAM,cAAc,gBAAgB;AAAA,YAC7C,OAAO,eAAe,CAAC,WAAW,SAAS,QAAQ;AAAA,YACnD,WAAW,2GACT,SACI,GAAG,OAAO,EAAE,IAAI,OAAO,IAAI,eAC3B,uCAAuC,OAAO,OAAO,IAAI,OAAO,SAAS,EAC/E,IAAI,eAAe,CAAC,WAAW,mBAAmB,EAAE;AAAA,YAEnD;AAAA,uBAAS,QACR;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,sDAAsD,eAAe,CAAC,WAAW,KAAK,MAAM;AAAA,kBAEvG;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAM,SAAS;AAAA,wBACf,WAAW,0CAA0C,SAAS,OAAO,aAAa,uCAAuC,OAAO,SAAS,EAAE;AAAA;AAAA,oBAC7I;AAAA,oBAEC,eAAe,CAAC,YAAY,SAAS,SACpC,+CAAC,UAAK,WAAU,4BACb,mBAAS,OACZ;AAAA;AAAA;AAAA,cAEJ;AAAA,cAED,EAAE,eAAe,CAAC,aACjB,+CAAC,UAAK,WAAU,0DACb,mBAAS,OACZ;AAAA,cAGD,EAAE,eAAe,CAAC,aAAa,SAAS,SACvC,+CAAC,UAAK,WAAU,yBACb,mBAAS,OACZ;AAAA;AAAA;AAAA,UAnCG,SAAS;AAAA,QAqChB;AAAA,MAEJ,CAAC,GACH,GACF;AAAA,MAGC,CAAC,YACA,+CAAC,SAAI,WAAU,6EACb;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAW,0NACT,cAAc,mBAAmB,EACnC;AAAA,UACA,OAAO,cAAc,mBAAmB;AAAA,UAExC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,cAAc,sBAAsB;AAAA,gBAC1C,WAAU;AAAA;AAAA,YACZ;AAAA,YACC,CAAC,eACA,+CAAC,UAAK,WAAU,0BAAyB,sBAAQ;AAAA;AAAA;AAAA,MAErD,GACF;AAAA,OAEJ;AAAA,KACF;AAGF,SACE,kFAEG;AAAA,kBACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,SAAS;AAAA;AAAA,IACX;AAAA,IAIF,+CAAC,WAAM,WAAW,GAAG,aAAa,IAAI,SAAS,IAC5C,wBAAc,IAAI,GACrB;AAAA,IAGA,+CAAC,WAAM,WAAW,GAAG,cAAc,IAAI,SAAS,IAC7C,wBAAc,KAAK,GACtB;AAAA,KACF;AAEJ;AAEA,IAAO,mBAAQ;;;ACpnBf,IAAAC,kBAAgC;AAChC,IAAAC,sBAAuB;;;ACDvB,IAAAC,kBAAwE;AAkDpE,IAAAC,wBAAA;AArCJ,IAAM,OAAO,MAAM;AAAC;AAEpB,IAAM,6BAAyB,+BAA2C;AAAA,EACxE,oBAAoB;AAAA,EACpB,qBAAqB;AACvB,CAAC;AAQM,IAAM,0BAET,CAAC,EAAE,wBAAwB,yBAAyB,SAAS,MAAM;AACrE,QAAM,CAAC,iBAAiB,uBAAuB,QAAI;AAAA,IACjD;AAAA,EACF;AACA,QAAM,CAAC,kBAAkB,wBAAwB,QAC/C,0BAA0B,uBAAuB;AAEnD,QAAM,yBAAqB;AAAA,IACzB,CAAC,YAAyC;AACxC,8BAAwB,OAAO;AAAA,IACjC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,YAAyC;AACxC,+BAAyB,OAAO;AAAA,IAClC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC,uBAAuB;AAAA,IAAvB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEO,IAAM,qBAAqB,UAChC,4BAAW,sBAAsB;;;ADgB3B,IAAAC,wBAAA;AAjDD,IAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,cAAc,aAAa,KAAK;AAC3E,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,KAAK;AAElD,QAAM,uBAAuB,MAAM;AACjC,QAAI,cAAc,kBAAkB;AAClC,oBAAc,iBAAiB;AAAA,IACjC,OAAO;AACL,mBAAa,CAAC,SAAS,CAAC,IAAI;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,cAAc,cAAc,mBAC7B,cAAc,aAAa,QAC5B;AAEJ,QAAM,oBAAoB,MAAM;AAC9B,QAAI,cAAc,eAAe;AAC/B,oBAAc,cAAc;AAAA,IAC9B,OAAO;AACL,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,eAAe,cAAc,gBAC9B,cAAc,cAAc,QAC7B;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,wBAAwB;AAAA,MACxB,yBAAyB;AAAA,MAEzB;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAC;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACE,GAAG;AAAA,gBACJ,WAAW;AAAA,gBACX,kBAAkB;AAAA,gBAClB,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,YAAU;AAAA;AAAA,YACZ;AAAA,YAGA,gDAAC,SAAI,WAAU,uCAEb;AAAA,6DAAC,SAAI,WAAU,2EACb;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,MAAM,cAAc,IAAI;AAAA,kBACjC,WAAU;AAAA,kBACV,cAAW;AAAA,kBAEX,yDAAC,sBAAW,MAAK,YAAW,WAAU,WAAU;AAAA;AAAA,cAClD,GACF;AAAA,cAGC,UACC,+CAAC,SAAI,eAAW,oBAAAA,SAAW,iBAAiB,eAAe,GACxD,kBACH;AAAA,cAIF,+CAAC,UAAK,eAAW,oBAAAA,SAAW,0BAA0B,aAAa,GAChE,UACH;AAAA,eACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,yBAAQ;;;AEvHf,IAAAC,kBAMO;AACP,IAAAC,sBAAuB;;;ACPvB,IAAAC,kBAAyD;AAmClD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,WAAW;AAAA,EACX,UAAU,cAAc;AAAA,EACxB;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAA4C;AAC1C,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAS,YAAY;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,KAAK;AAClD,QAAM,gBAAY,wBAAO,CAAC;AAC1B,QAAM,oBAAgB,wBAAO,CAAC;AAE9B,QAAM,kBAAc,6BAAY,MAAM;AACpC,WAAO,OAAO,gBAAgB,aAAa,YAAY,IAAI;AAAA,EAC7D,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,YAAQ;AAAA,IACZ,CAAC,UAAkB,KAAK,IAAI,UAAU,KAAK,IAAI,YAAY,GAAG,KAAK,CAAC;AAAA,IACpE,CAAC,UAAU,WAAW;AAAA,EACxB;AAEA,iCAAU,MAAM;AACd,QAAI,CAAC,WAAY;AAEjB,UAAM,oBAAoB,CAAC,MAAoB;AAC7C,YAAM,QAAQ,EAAE,UAAU,UAAU;AACpC,YAAM,WAAW,MAAM,cAAc,UAAU,KAAK;AACpD,eAAS,QAAQ;AACjB,iBAAW,QAAQ;AAAA,IACrB;AAEA,UAAM,kBAAkB,MAAM;AAC5B,oBAAc,KAAK;AACnB,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AACjC,eAAS,CAAC,MAAM;AACd,sBAAc,CAAC;AACf,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AAEjC,aAAS,iBAAiB,eAAe,iBAAiB;AAC1D,aAAS,iBAAiB,aAAa,eAAe;AAEtD,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,iBAAiB;AAC7D,eAAS,oBAAoB,aAAa,eAAe;AACzD,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,YAAY,OAAO,UAAU,WAAW,CAAC;AAE7C,QAAM,oBAAgB;AAAA,IACpB,CAAC,MAA0B;AACzB,UAAI,CAAC,QAAS;AACd,QAAE,eAAe;AACjB,gBAAU,UAAU,EAAE;AACtB,oBAAc,UAAU;AACxB,oBAAc,IAAI;AAAA,IACpB;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,EACjB;AAEA,QAAM,gBAAY;AAAA,IAChB,CAAC,MAA2B;AAC1B,UAAI,CAAC,QAAS;AACd,YAAM,OAAO;AACb,UAAI,WAAW;AACf,UAAI,EAAE,QAAQ,cAAc;AAC1B,mBAAW,MAAM,QAAQ,IAAI;AAAA,MAC/B,WAAW,EAAE,QAAQ,aAAa;AAChC,mBAAW,MAAM,QAAQ,IAAI;AAAA,MAC/B,OAAO;AACL;AAAA,MACF;AACA,QAAE,eAAe;AACjB,eAAS,QAAQ;AACjB,iBAAW,QAAQ;AACnB,oBAAc,QAAQ;AAAA,IACxB;AAAA,IACA,CAAC,SAAS,OAAO,OAAO,UAAU,WAAW;AAAA,EAC/C;AAEA,QAAM,cAAc,YAAY;AAEhC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,UAAU,UAAU,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;AC1IA,IAAAC,kBAAgE;AAChE,IAAAC,oBAA6B;AAC7B,4BAA0B;AAC1B,wBAAsB;AAEtB,IAAAC,sBAAuB;AAuHnB,IAAAC,wBAAA;AA3EJ,IAAM,UAAkD;AAAA,EACtD,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,eAA2B;AAAA,EAC/B,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV;AAMA,IAAM,eAA2B;AAAA,EAC/B,GAAG,CAAC,EAAE,MAAM,SAAS,MACnB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAU;AAAA,MAET;AAAA;AAAA,EACH;AAAA,EAEF,GAAG,CAAC,EAAE,SAAS,MACb,+CAAC,OAAE,WAAU,iFACV,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,mFACX,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,mFACX,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,qFACX,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,+FACX,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,kGACX,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MAAM,+CAAC,QAAG,WAAU,mBAAmB,UAAS;AAAA,EAChE,YAAY,CAAC,EAAE,SAAS,MACtB,+CAAC,gBAAW,WAAU,qHACnB,UACH;AAAA,EAEF,IAAI,MAAM,+CAAC,QAAG,WAAU,mDAAkD;AAAA,EAC1E,QAAQ,CAAC,EAAE,SAAS,MAClB,+CAAC,YAAO,WAAU,wDACf,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,iDACX,UACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,MAAM,CAAC,EAAE,WAAW,SAAS,MAAM;AACjC,UAAM,UAAU,QAAQ,SAAS;AACjC,QAAI,SAAS;AACX,aACE,+CAAC,UAAK,WAAU,mJACb,UACH;AAAA,IAEJ;AACA,WACE,+CAAC,UAAK,WAAU,qHACb,UACH;AAAA,EAEJ;AAAA,EACA,KAAK,CAAC,EAAE,SAAS,MACf,+CAAC,SAAI,WAAU,mCAAmC,UAAS;AAAA;AAAA,EAG7D,OAAO,CAAC,EAAE,SAAS,MACjB,+CAAC,SAAI,WAAU,qFACb,yDAAC,WAAM,WAAU,0EACd,UACH,GACF;AAAA,EAEF,OAAO,CAAC,EAAE,SAAS,MACjB,+CAAC,WAAM,WAAU,sCAAsC,UAAS;AAAA,EAElE,OAAO,CAAC,EAAE,SAAS,MACjB,+CAAC,WAAM,WAAU,0DACd,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,mFACX,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,sGACX,UACH;AAAA,EAEF,IAAI,CAAC,EAAE,SAAS,MACd,+CAAC,QAAG,WAAU,oDACX,UACH;AAEJ;AAMA,IAAM,mBAAmB;AACzB,IAAM,MAAM;AAEZ,SAAS,uBACP,MACA,WACA,UAIA;AACA,QAAM,MAAM,OAAO;AACnB,QAAM,MAAM,OAAO;AACnB,QAAM,IAAI,KAAK,IAAI,UAAU,MAAM,EAAE;AAErC,QAAM,aAAa,MAAM,KAAK,SAAS;AACvC,QAAM,aAAa,KAAK,MAAM;AAE9B,MAAI;AACJ,MAAI,cAAc,UAAU,cAAc,UAAU;AAClD,eACE,cAAc,oBAAoB,cAAc,aAC5C,WACA;AAAA,EACR,WAAW,cAAc,OAAO;AAC9B,eACE,cAAc,oBAAoB,cAAc,aAC5C,QACA;AAAA,EACR,OAAO;AACL,eAAW;AAAA,EACb;AAEA,QAAM,QAA6B,EAAE,OAAO,EAAE;AAE9C,MAAI,aAAa,UAAU;AACzB,UAAM,MAAM,KAAK,SAAS;AAC1B,UAAM,OAAO,KAAK;AAAA,MAChB;AAAA,MACA,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF,WAAW,aAAa,OAAO;AAE7B,UAAM,SAAS,MAAM,KAAK,MAAM;AAChC,UAAM,OAAO,KAAK;AAAA,MAChB;AAAA,MACA,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF,WAAW,aAAa,SAAS;AAC/B,UAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI,CAAC;AACnD,UAAM,MAAM,KAAK;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,KAAK,MAAM,KAAK,SAAS,IAAI,mBAAmB;AAAA,QAChD,MAAM,mBAAmB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG;AAC5C,UAAM,MAAM,KAAK;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,KAAK,MAAM,KAAK,SAAS,IAAI,mBAAmB;AAAA,QAChD,MAAM,mBAAmB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,mBAAmB,SAAS;AAC9C;AAEA,IAAM,cAAmE;AAAA,EACvE,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AACT;AAMA,IAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AACF,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,QAAI,0BAAS,KAAK;AACtC,QAAM,CAAC,cAAc,eAAe,QAAI,0BAA8B,CAAC,CAAC;AACxE,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,0BAEhD,QAAQ;AAEV,QAAM,gBAAY,wBAA0B,IAAI;AAChD,QAAM,eAAW,wBAAuB,IAAI;AAE5C,QAAM,gBAAY,6BAAY,MAAM;AAClC,QAAI,CAAC,UAAU,QAAS;AACxB,UAAM,OAAO,UAAU,QAAQ,sBAAsB;AACrD,UAAM,EAAE,OAAO,mBAAmB,GAAG,IAAI;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,oBAAgB,KAAK;AACrB,yBAAqB,EAAE;AAAA,EACzB,GAAG,CAAC,WAAW,QAAQ,CAAC;AAExB,QAAM,aAAS,6BAAY,MAAM;AAC/B,QAAI,CAAC,KAAM,WAAU;AACrB,YAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,EACnB,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,YAAQ,6BAAY,MAAM;AAC9B,YAAQ,KAAK;AACb,cAAU,SAAS,MAAM;AAAA,EAC3B,GAAG,CAAC,CAAC;AAGL,iCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,CAAC,MAAkB;AACjC,UACE,CAAC,UAAU,SAAS,SAAS,EAAE,MAAc,KAC7C,CAAC,SAAS,SAAS,SAAS,EAAE,MAAc,GAC5C;AACA,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,OAAO;AAC9C,WAAO,MAAM,SAAS,oBAAoB,aAAa,OAAO;AAAA,EAChE,GAAG,CAAC,IAAI,CAAC;AAGT,iCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,UAAU,CAAC,MAAqB;AACpC,UAAI,EAAE,QAAQ,SAAU,OAAM;AAAA,IAChC;AACA,aAAS,iBAAiB,WAAW,OAAO;AAC5C,WAAO,MAAM,SAAS,oBAAoB,WAAW,OAAO;AAAA,EAC9D,GAAG,CAAC,MAAM,KAAK,CAAC;AAGhB,iCAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,WAAO,iBAAiB,UAAU,WAAW,IAAI;AACjD,WAAO,iBAAiB,UAAU,SAAS;AAC3C,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,WAAW,IAAI;AACpD,aAAO,oBAAoB,UAAU,SAAS;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,QAAM,aAAa,OAAO,YAAY;AAEtC,SACE,gDAAC,UAAK,eAAW,oBAAAC,SAAW,4BAA4B,SAAS,GAE/D;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,SAAQ;AAAA,QACR;AAAA,QACA,SAAS;AAAA,QACT,cAAW;AAAA,QACX,iBAAe;AAAA,QACf,iBAAc;AAAA;AAAA,IAChB;AAAA,QAGC;AAAA,MACC;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,cAAW;AAAA,UACX,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,UAChD,OAAO,EAAE,GAAG,cAAc,UAAU,QAAQ;AAAA,UAC5C,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA;AAAA,YAEA;AAAA,YACA,YAAY,iBAAiB;AAAA,YAC7B,OACI,8CACA;AAAA,UACN;AAAA,UAGA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,KAAK;AAAA,gBACP;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,KAAK;AAAA,sBACP;AAAA,sBAEA;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAA;AAAA,8BACT;AAAA,8BACA,KAAK;AAAA,4BACP;AAAA,4BAEA,yDAAC,sBAAW,MAAK,QAAO,WAAU,WAAU;AAAA;AAAA,wBAC9C;AAAA,wBACA,+CAAC,UAAK,WAAU,kCACb,mBAAS,QACZ;AAAA;AAAA;AAAA,kBACF;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,OAAM;AAAA,sBACN,SAAS;AAAA,sBACT,cAAW;AAAA;AAAA,kBACb;AAAA;AAAA;AAAA,YACF;AAAA,YAGA,+CAAC,SAAI,WAAU,sHACZ,uBACC;AAAA,cAAC,sBAAAC;AAAA,cAAA;AAAA,gBACC,eAAe,CAAC,kBAAAC,OAAS;AAAA,gBACzB,YAAY;AAAA,gBAEX;AAAA;AAAA,YACH,IAEA,+CAAC,SAAI,WAAU,kEACZ,mBACH,GAEJ;AAAA;AAAA;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,KACF;AAEJ;AAEA,WAAW,cAAc;AAEzB,IAAO,qBAAQ;;;AF6GT,IAAAC,wBAAA;AA5YN,IAAMC,eAGF;AAAA,EACF,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AACF;AAEA,IAAM,kBAAiD;AAAA,EACrD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAWA,IAAM,gBAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAEA,IAAM,eAAqD;AAAA,EACzD,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EAAI,MAAM;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,EACT,OAAO;AACT;AAIA,IAAM,mBAAoC;AAAA,EACxC,IAAI;AAAA,EACJ,KAAK;AACP;AAGA,IAAM,kBAAsD;AAAA,EAC1D,KAAK,EAAE,IAAI,iCAAiC,KAAK,aAAa;AAAA,EAC9D,QAAQ,EAAE,IAAI,uCAAuC,KAAK,gBAAgB;AAAA,EAC1E,OAAO,EAAE,IAAI,qCAAqC,KAAK,eAAe;AAAA,EACtE,QAAQ,EAAE,IAAI,uCAAuC,KAAK,gBAAgB;AAAA,EAC1E,MAAM,EAAE,IAAI,mCAAmC,KAAK,cAAc;AAAA,EAClE,OAAO,EAAE,IAAI,qCAAqC,KAAK,eAAe;AAAA,EACtE,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,KAAK;AAAA,EACP;AAAA,EACA,MAAM,EAAE,IAAI,mCAAmC,KAAK,cAAc;AAAA,EAClE,MAAM,EAAE,IAAI,mCAAmC,KAAK,cAAc;AAAA,EAClE,KAAK,EAAE,IAAI,iCAAiC,KAAK,aAAa;AAAA,EAC9D,MAAM,EAAE,IAAI,mCAAmC,KAAK,cAAc;AAAA,EAClE,QAAQ,EAAE,IAAI,uCAAuC,KAAK,gBAAgB;AAAA,EAC1E,QAAQ,EAAE,IAAI,uCAAuC,KAAK,gBAAgB;AAAA,EAC1E,QAAQ,EAAE,IAAI,uCAAuC,KAAK,gBAAgB;AAAA,EAC1E,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,KAAK;AAAA,EACP;AAAA,EACA,MAAM,EAAE,IAAI,mCAAmC,KAAK,cAAc;AAAA,EAClE,OAAO,EAAE,IAAI,qCAAqC,KAAK,eAAe;AAAA,EACtE,MAAM,EAAE,IAAI,mCAAmC,KAAK,cAAc;AAAA,EAClE,MAAM,EAAE,IAAI,mCAAmC,KAAK,cAAc;AAAA,EAClE,SAAS;AAAA,EACT,OAAO;AACT;AAMA,IAAM,YAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,MAAM;AACJ,QAAM,mBAAe,yBAAQ,MAAM,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC;AAC1E,QAAM,sBAAsB,aAAa,WAAW;AACpD,QAAM,mBAAmB,aAAa,WAAW;AAEjD,QAAM,iBACJ,uBACC,gBAAgB,aAAa,WAAW,KACzC;AACF,QAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,IACxC,gBAAgB,aAAa,CAAC,GAAG;AAAA,EACnC;AACA,QAAM,WAAW,SAAS;AAI1B,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,0BAElD,aAAc,gBAAgB,aAAa,CAAC,GAAG,KAAM,MAAS;AAChE,QAAM,aAAa,aACf,WACC,iBAAiB;AAEtB,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAS,EAAE;AAGvC,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,0BAAS,gBAAgB;AAC3E,QAAM,wBAAwB,OAAO,wBAAwB;AAC7D,QAAM,cACJ,eACA,CAAC,mBACA,wBAAwB,sBAAsB;AAEjD,QAAM,sBAAkB,6BAAY,MAAM;AACxC,UAAM,OAAO,CAAC;AACd,QAAI,CAAC,sBAAuB,sBAAqB,IAAI;AACrD,wBAAoB,IAAI;AAAA,EAC1B,GAAG,CAAC,aAAa,uBAAuB,iBAAiB,CAAC;AAG1D,QAAM,mBAAe,wBAAuB,IAAI;AAEhD,QAAM,kBAAc,6BAAY,MAAM;AACpC,QAAI,iBAAkB,QAAO;AAC7B,QAAI,aAAa;AACf,aAAO,KAAK,MAAM,aAAa,QAAQ,cAAc,GAAG;AAC1D,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,iBAAiB,YAAY,SAAS,WAAW,EAAE,IAAI;AAC7D,QAAM,oBAAoB,MAAM,cAAc,IAAI,MAAM;AAExD,QAAM;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF,IAAI,aAAa;AAAA,IACf,cAAc;AAAA,IACd,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS,aAAa,CAAC,eAAe,CAAC;AAAA,EACzC,CAAC;AAGD,iCAAU,MAAM;AACd,QAAI,UAAU,OAAW;AACzB,QAAI,CAAC,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,aAAa,GAAG;AACrD,uBAAiB,aAAa,CAAC,GAAG,EAAE;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,aAAa,CAAC;AAEvC,iCAAU,MAAM;AACd,QAAI,kBAAkB,aAAa,CAAC,KAAK,aAAa,aAAa,CAAC,EAAE,IAAI;AACxE,UAAI,UAAU,QAAW;AACvB,yBAAiB,aAAa,CAAC,EAAE,EAAE;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,gBAAgB,cAAc,UAAU,KAAK,CAAC;AAElD,QAAM,oBAAgB,yBAAQ,MAAM;AAClC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,OAAO,YAAY;AACjC,WAAO,aAAa,OAAO,CAAC,SAAS;AACnC,YAAM,YAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAChE,YAAM,eACJ,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AACtD,aACE,UAAU,YAAY,EAAE,SAAS,KAAK,KACtC,aAAa,YAAY,EAAE,SAAS,KAAK;AAAA,IAE7C,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,MAAM,CAAC;AAIzB,QAAM,aAAa,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAE7D,QAAM,SAASA,aAAW,IAAI;AAC9B,QAAM,SAAS,aAAa,KAAK;AACjC,QAAM,kBAAkB,gBAAgB,KAAK;AAC7C,QAAM,eAAe,OAAO;AAE5B,QAAM,eAAe,CAAC,SAAwB;AAC5C,QAAI,KAAK,SAAU;AACnB,QAAI,UAAU,QAAW;AACvB,uBAAiB,KAAK,EAAE;AAAA,IAC1B;AACA,eAAW,KAAK,IAAI,IAAI;AAAA,EAC1B;AAEA,QAAM,eAAe,CAAC,SAAwB;AAC5C,QAAI,KAAK,SAAU;AACnB,UAAM,oBAAoB,eAAe,KAAK;AAC9C,QAAI,mBAAmB;AAErB,UAAI,kBAAkB,OAAW,uBAAsB,MAAS;AAChE,iBAAW,KAAK,IAAI,IAAI;AACxB;AAAA,IACF;AAEA,QAAI,UAAU,OAAW,kBAAiB,KAAK,EAAE;AACjD,eAAW,KAAK,IAAI,IAAI;AACxB,QAAI,kBAAkB,OAAW,uBAAsB,KAAK,EAAE;AAC9D,eAAW,KAAK,IAAI,IAAI;AAAA,EAC1B;AAEA,QAAM,iBAAiB,aAAa;AAEpC,QAAM,cAAc,CAAC,OAA2B,QAAgB;AAC9D,UAAM,aAAa;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,MAAM,WAAW;AAAA,IACnB;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,eAAW,oBAAAC;AAAA,UACT;AAAA,UACA,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,QAEC,gBAAM;AAAA;AAAA,MARF;AAAA,IASP;AAAA,EAEJ;AAEA,QAAM,oBAAoB,CACxB,MACA,SACkB;AAClB,QAAI,OAAO,SAAS,YAAY;AAC9B,aAAQ,KAA0C,IAAI;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,CAC1B,MACA,YACG;AACH,QAAI,qBAAqB,OAAW,QAAO;AAE3C,UAAM,cACJ,OAAO,qBAAqB,aACxB,iBAAiB,IAAI,IACrB;AACN,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,OAAO,kBAAkB,YAAY,MAAM,IAAI;AACrD,UAAM,QAAQ,kBAAkB,YAAY,OAAO,IAAI,KAAK,KAAK;AACjE,UAAM,WAAW,kBAAkB,YAAY,UAAU,IAAI;AAC7D,UAAM,OAAO,kBAAkB,YAAY,MAAM,IAAI;AACrD,UAAM,SAAS,kBAAkB,YAAY,QAAQ,IAAI;AACzD,UAAM,SAAS,kBAAkB,YAAY,QAAQ,IAAI;AACzD,UAAM,gBAAgB,kBAAkB,YAAY,eAAe,IAAI;AACvE,UAAM,gBAAgB,kBAAkB,YAAY,eAAe,IAAI;AACvE,UAAM,gBAAgB,kBAAkB,YAAY,SAAS,IAAI;AACjE,UAAM,kBAAkB,SAAS,qBAC7B,KAAK,UACL;AACJ,UAAM,sBAAsB,SAAS,qBACjC,cACA;AACJ,UAAM,gBACJ,iBAAiB,mBAAmB,sBAClC,kFACG;AAAA;AAAA,MACA;AAAA,MACA;AAAA,OACH,IACE;AACN,UAAM,SAAS,YAAY,UAAU;AACrC,UAAM,iBACJ,eAAe,WAAW,eAAe,YAAY;AACvD,UAAM,oBACJ,eAAe,cAAc,eAAe,eAAe;AAC7D,UAAM,cAAc,eAAe,QAAQ;AAC3C,UAAM,sBACJ,eAAe,eAAe,UAC9B,eAAe,eAAe;AAChC,UAAM,0BAA0B;AAAA,MAC9B,uBACE,eAAe,SACf,eAAe,YACf,eAAe,eACf,eAAe;AAAA,IACnB;AACA,UAAM,oBAAoB,eAAe,YAAY;AAErD,WACE,gDAAC,SAAI,eAAW,oBAAAA,SAAW,aAAa,QAAQ,YAAY,SAAS,GACnE;AAAA,sDAAC,SAAI,WAAU,qCACZ;AAAA,gBAAQ,+CAAC,SAAI,WAAU,YAAY,gBAAK;AAAA,QACzC,gDAAC,SAAI,WAAU,kBACb;AAAA,0DAAC,QAAG,WAAU,iGACZ;AAAA,2DAAC,UAAM,iBAAM;AAAA,YACZ,UAAU,+CAAC,sBAAY,GAAG,QAAQ;AAAA,aACrC;AAAA,UACC,YACC,+CAAC,OAAE,WAAU,kEACV,oBACH;AAAA,WAEJ;AAAA,QACC,QAAQ,+CAAC,SAAI,WAAU,YAAY,gBAAK;AAAA,QACxC,UACC,+CAAC,SAAI,eAAW,oBAAAA,SAAW,YAAY,YAAY,WAAW,GAC3D,kBACH;AAAA,QAED,iBACC,+CAAC,SAAI,WAAU,oCACZ,yBACH;AAAA,SAEJ;AAAA,MACC,iBACC,+CAAC,SAAI,WAAU,iDACZ,yBACH;AAAA,MAED,iBAAiB,2BAChB;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT,qBACE;AAAA,UACJ;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,QAAO;AAAA,cACP,SAAQ;AAAA,cACR,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,cAAc;AAAA,cAChB;AAAA,cAEC,gCACC,cAAc,aAEd,gDAAC,SAAI,WAAU,0CACb;AAAA,gEAAC,SAAI,WAAU,WACZ;AAAA,gCAAc,SACb,+CAAC,SAAI,WAAU,gGACZ,wBAAc,OACjB;AAAA,kBAED,cAAc,YACb,+CAAC,SAAI,WAAU,qEACZ,wBAAc,UACjB;AAAA,kBAED,cAAc,eACb,+CAAC,SAAI,WAAU,2DACZ,wBAAc,aACjB;AAAA,mBAEJ;AAAA,gBACC,cAAc,QACb,+CAAC,SAAI,WAAU,iDACZ,wBAAc,MACjB;AAAA,iBAEJ;AAAA;AAAA,UAEJ;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,oBAAoB,CACxB,MACA,YACG;AACH,QAAI,qBAAqB,QAAW;AAClC,aAAO,oBAAoB,MAAM,OAAO;AAAA,IAC1C;AACA,QAAI,CAAC,YAAa,QAAO;AACzB,WAAO,OAAO,gBAAgB,aAAa,YAAY,IAAI,IAAI;AAAA,EACjE;AACA,QAAM,aAAa,iBAAiB,aAAa,CAAC,IAAI;AACtD,QAAM,eAAe,aACjB,kBAAkB,YAAY,EAAE,oBAAoB,KAAK,CAAC,IAC1D;AACJ,QAAM,eAAe,aACjB,kBAAkB,YAAY,EAAE,oBAAoB,MAAM,CAAC,IAC3D;AAGJ,QAAM,iBAAkD,cACpD,EAAE,OAAO,GAAG,IACZ,YACE,EAAE,OAAO,eAAe,IACxB;AAEN,QAAM,sBACJ,eAAe,YAAY,SAAY;AAGzC,QAAM,gBAAgB,MAAM;AAC1B,QAAI,SAAS;AACX,aACE,+CAAC,SAAI,WAAU,gIACZ,0BACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAM;AAAA,UACN;AAAA,UACA,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,kBAAiB;AAAA,UACjB,gBAAe;AAAA;AAAA,MACjB,GAEJ;AAAA,IAEJ;AACA,QAAI,OAAO;AACT,aACE,+CAAC,SAAI,WAAU,oIACZ,wBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAM;AAAA,UACN,UACE,OAAO,UAAU,WACb,QACA;AAAA,UAEN,UAAQ;AAAA,UACR,aAAa,UAAU,UAAU;AAAA,UACjC,UAAU;AAAA,UACV,eAAc;AAAA,UACd,aAAa;AAAA,UACb,eAAa;AAAA,UACb,uBAAqB;AAAA,UACrB,WAAU;AAAA,UACV,MAAK;AAAA;AAAA,MACP,GAEJ;AAAA,IAEJ;AACA,WAAO;AAAA,EACT;AAGA,MAAI,gBAAgB;AAClB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAA;AAAA,UACT;AAAA,UACA,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QAEC;AAAA,wBAAc;AAAA,UACf;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cAEC,uBACC,kFACG;AAAA,+BACC,+CAAC,SAAI,WAAU,YAAY,wBAAa,IACtC,cACF,+CAAC,SAAI,WAAU,8GACZ,uBACH,IACE;AAAA,gBACJ;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,kBAAkB,oBAAoB;AAAA,oBACxC;AAAA,oBAEC,qBAAW;AAAA;AAAA,gBACd;AAAA,iBACF,IAEA,oBAAoB,QAClB,+CAAC,SAAI,WAAU,+CACZ,6BACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAM;AAAA,kBACN,UAAS;AAAA,kBACT,UAAQ;AAAA,kBACR,eAAa;AAAA,kBACb;AAAA;AAAA,cACF,GAEJ;AAAA;AAAA,UAGN;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MAEC;AAAA,sBAAc;AAAA,QAEf;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,eAAe;AAAA,cACf;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,cAEC,+CAAC,SAAI,WAAU,yCACb;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR;AAAA,kBACA,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,cAAW;AAAA;AAAA,cACb,GACF;AAAA,gBAEA,kFAEI;AAAA,4BAAa,eAAe,gBAC5B,gDAAC,SAAI,WAAU,mEACZ;AAAA,6BACC,+CAAC,QAAG,WAAU,mFACX,qBACH;AAAA,gBAEF,gDAAC,SAAI,WAAU,mCACZ;AAAA;AAAA,kBACA,eACC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR;AAAA,sBACA,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,cAAW;AAAA;AAAA,kBACb;AAAA,mBAEJ;AAAA,iBACF;AAAA,cAID,aAAa,SAAS,KACrB,+CAAC,SAAI,WAAU,2BACb;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAa;AAAA,kBACb,SAAQ;AAAA,kBACR,eAAc;AAAA,kBACd;AAAA,kBACA,UAAU;AAAA;AAAA,cACZ,GACF;AAAA,cAIF,+CAAC,SAAI,WAAU,0BACZ,wBAAc,WAAW,IACxB,+CAAC,SAAI,WAAU,kEACZ,wBAAc,kBACjB,IAEA,cAAc,IAAI,CAAC,SAAS;AAC1B,sBAAM,WAAW,KAAK,OAAO;AAC7B,sBAAM,aAAa,KAAK,OAAO;AAC/B,sBAAM,mBACJ,CAAC,cAAc,KAAK,eAAe;AACrC,uBACE,gDAAC,SAEC;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,UAAU,KAAK,WAAW,KAAK;AAAA,sBAC/B,iBAAe,KAAK;AAAA,sBACpB,SAAS,MAAM;AACb,4BAAI,CAAC,KAAK,SAAU,cAAa,IAAI;AAAA,sBACvC;AAAA,sBACA,WAAW,CAAC,MAAM;AAChB,4BACE,CAAC,KAAK,aACL,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAChC;AACA,4BAAE,eAAe;AACjB,uCAAa,IAAI;AAAA,wBACnB;AAAA,sBACF;AAAA,sBACA,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,KAAK,YACH;AAAA,wBACF,OAAO;AAAA,wBACP,eACI,oBAAAA;AAAA,0BACE,OAAO;AAAA,0BACP,OAAO;AAAA,0BACP;AAAA,wBACF,IACA,KAAK,gBACH,oBAAAA;AAAA,0BACE,gBAAgB;AAAA,0BAChB,OAAO;AAAA,0BACP;AAAA,wBACF,IACA;AAAA,sBACR;AAAA,sBAEA,0DAAC,SAAI,WAAU,kCAEb;AAAA,uEAAC,SAAI,WAAU,kBACb,0DAAC,SAAI,WAAU,kCACZ;AAAA,+BAAK,QACJ,+CAAC,SAAI,WAAU,oBACb;AAAA,4BAAC;AAAA;AAAA,8BACC,MAAM,KAAK;AAAA,8BACX,eAAW,oBAAAA;AAAA,gCACT;AAAA,gCACA,gBAAgB,IAAI;AAAA,8BACtB;AAAA;AAAA,0BACF,GACF;AAAA,0BAEF,gDAAC,SAAI,WAAU,kBACb;AAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAW,oBAAAA;AAAA,kCACT;AAAA,kCACA,OAAO;AAAA,kCACP,YAAY,KAAK,YACb,OAAO,OACP;AAAA,gCACN;AAAA,gCAEC,eAAK;AAAA;AAAA,4BACR;AAAA,4BACC,KAAK,YACJ;AAAA,8BAAC;AAAA;AAAA,gCACC,eAAW,oBAAAA;AAAA,kCACT;AAAA,kCACA,OAAO;AAAA,kCACP,WACI,OAAO,WACP;AAAA,gCACN;AAAA,gCAEC,eAAK;AAAA;AAAA,4BACR;AAAA,4BAED,KAAK,UAAU,KAAK,OAAO,SAAS,KACnC,+CAAC,SAAI,WAAU,iCACZ,eAAK,OAAO;AAAA,8BAAI,CAAC,OAAO,QACvB,YAAY,OAAO,GAAG;AAAA,4BACxB,GACF;AAAA,6BAEJ;AAAA,2BACF,GACF;AAAA,yBAEE,KAAK,WACL,oBACA,KAAK,cACL,gDAAC,SAAI,WAAU,sCACZ;AAAA,+BAAK,WACJ;AAAA,4BAAC;AAAA;AAAA,8BACC,WAAU;AAAA,8BACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,8BAClC,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,8BAErC,eAAK;AAAA;AAAA,0BACR;AAAA,0BAED,KAAK,aACJ;AAAA,4BAAC;AAAA;AAAA,8BACC,eAAW,oBAAAA;AAAA,gCACT;AAAA,gCACA,gBAAgB;AAAA,gCAChB,CAAC,YAAY;AAAA,8BACf;AAAA;AAAA,0BACF;AAAA,0BAGD,oBACC;AAAA,4BAAC;AAAA;AAAA,8BACC,WAAU;AAAA,8BACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,8BAClC,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,8BAEtC;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,UAAU,KAAK;AAAA,kCACf,SAAS,MAAM,aAAa,IAAI;AAAA,kCAChC,OACE,aACI,qBACA;AAAA,kCAEN,cACE,aACI,qBACA;AAAA,kCAEN,iBAAe;AAAA,kCACf,eAAW,oBAAAA;AAAA,oCACT;AAAA,oCACA,iBACI,oBAAAA,SAAW,OAAO,MAAM,aAAa,IACrC;AAAA,kCACN;AAAA,kCAEA;AAAA,oCAAC;AAAA;AAAA,sCACC,eAAW,oBAAAA;AAAA,wCACT;AAAA,wCACA,aAAa,cAAc;AAAA,sCAC7B;AAAA,sCACA,SAAQ;AAAA,sCACR,MAAK;AAAA,sCACL,QAAO;AAAA,sCACP,aAAa;AAAA,sCAEb;AAAA,wCAAC;AAAA;AAAA,0CACC,eAAc;AAAA,0CACd,gBAAe;AAAA,0CACf,GAAE;AAAA;AAAA,sCACJ;AAAA;AAAA,kCACF;AAAA;AAAA,8BACF;AAAA;AAAA,0BACF;AAAA,2BAEJ;AAAA,yBAEJ;AAAA;AAAA,kBACF;AAAA,kBACC,KAAK,eAAe,UACnB;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA;AAAA;AAAA,yBAGC,aAAa,WAAW,cACrB,gCACA;AAAA,sBACN;AAAA,sBAEA,yDAAC,SAAI,WAAU,mBACb;AAAA,wBAAC;AAAA;AAAA,0BACC,eAAW,oBAAAA;AAAA,4BACT;AAAA,6BACC,aAAa,WAAW,cACrB,OAAO,SACP;AAAA,0BACN;AAAA,0BAEC,eAAK;AAAA;AAAA,sBACR,GACF;AAAA;AAAA,kBACF;AAAA,qBA1LM,KAAK,EA4Lf;AAAA,cAEJ,CAAC,GAEL;AAAA,eACF;AAAA;AAAA,QAEJ;AAAA,QAGC,aAAa,CAAC,eACb;AAAA,UAAC;AAAA;AAAA,YACE,GAAG;AAAA,YACJ,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA;AAAA,cACA,aACI,gBACA;AAAA,YACN;AAAA;AAAA,QACF;AAAA,QAIF;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC,uBACC,kFAEG;AAAA,8BAAgB,+CAAC,SAAI,WAAU,YAAY,wBAAa;AAAA,cAEzD;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA,kBAAkB,oBAAoB;AAAA,kBACxC;AAAA,kBAEC,qBAAW;AAAA;AAAA,cACd;AAAA,eACF,IAEA,oBAAoB,QAClB,+CAAC,SAAI,WAAU,+CACZ,6BACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,UAAS;AAAA,gBACT,UAAQ;AAAA,gBACR,eAAa;AAAA,gBACb;AAAA;AAAA,YACF,GAEJ;AAAA;AAAA,QAGN;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,UAAU,cAAc;AAExB,IAAO,oBAAQ;;;AGxtCf,IAAAC,kBAAmD;;;ACAnD,IAAAC,kBAAyC;;;ACYlC,IAAM,mBAAoC;AAAA,EAC/C;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA;AAAA,EAEA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA;AAAA,EAEA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;;;ACpFO,IAAM,kBACX;AAEK,IAAM,qBAAqB,CAAC,UAAwC;AAEzE,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAO;AAAA,IACL,WAAW;AAAA,IACX,MAAM,MAAM,CAAC;AAAA,IACb,QAAQ,MAAM,CAAC;AAAA,IACf,MAAM,MAAM,CAAC;AAAA,EACf;AACF;AAEO,IAAM,mBAAmB,CAC9B,MACA,QACA,SACG;AACH,SAAO,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI;AACvC;AAKO,IAAM,mBAAmB,CAAC,SAAkC;AACjE,QAAM,YAA6B,CAAC;AACpC,QAAM,OAAO,oBAAI,IAAY;AAE7B,MAAI;AAGJ,QAAM,QAAQ,IAAI,OAAO,eAAe;AAExC,UAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAC1C,UAAM,YAAY,MAAM,CAAC;AACzB,QAAI,CAAC,KAAK,IAAI,SAAS,GAAG;AACxB,WAAK,IAAI,SAAS;AAClB,gBAAU,KAAK;AAAA,QACb;AAAA,QACA,MAAM,MAAM,CAAC;AAAA,QACb,QAAQ,MAAM,CAAC;AAAA,QACf,MAAM,MAAM,CAAC;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAaO,IAAM,kBAAkB,CAC7B,OACA,QAC+D;AAE/D,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,EACF;AACA,MAAI,CAAC,MAAO,QAAO,EAAE,OAAO,YAAY,OAAO,WAAW,MAAM;AAEhE,QAAM,CAAC,EAAE,EAAE,QAAQ,IAAI,IAAI;AAE3B,MAAI,WAAW,YAAY,WAAW,OAAO;AAC3C,QAAI,QAAQ,IAAI,kBAAkB,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI;AAC5D,QAAI,CAAC,OAAO;AAEV,cAAQ,IAAI,kBAAkB;AAAA,QAC5B,CAAC,MAAM,EAAE,IAAI,YAAY,MAAM,KAAK,YAAY;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,OAAO;AACT,YAAM,MAAM,MAAM,WAAW,MAAM;AACnC,aAAO;AAAA,QACL,OAAO,MAAM,OAAO,GAAG,IAAI;AAAA,QAC3B,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,OAAO,IAAI,YAAY,OAAO,WAAW,MAAM;AAAA,EAC1D;AACA,MAAI,WAAW,WAAW;AACxB,WAAO,EAAE,OAAO,MAAM,YAAY,MAAM,WAAW,MAAM;AAAA,EAC3D;AACA,MAAI,WAAW,UAAU;AACvB,UAAM,YAAY,KAAK,YAAY;AAEnC,QAAI,cAAc,cAAc;AAC9B,aAAO;AAAA,QACL,OAAO,IAAI,SAAS,QAAQ;AAAA,QAC5B,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,cAAc,UAAU;AAC1B,aAAO,EAAE,OAAO,qBAAqB,YAAY,MAAM,WAAW,MAAM;AAAA,IAC1E;AACA,QAAI,cAAc,YAAY;AAC5B,YAAM,WAAW,IAAI,SAAS,eAAe,UAAU;AACvD,YAAM,SAAS;AACf,YAAM,MAAM,IAAI,SAAS,QAAQ;AACjC,UAAI,KAAK;AACP,eAAO;AAAA,UACL,OAAO,GAAG,QAAQ,MAAM,GAAG,IAAI,MAAM;AAAA,UACrC,YAAY;AAAA,UACZ,WAAW;AAAA,QACb;AAAA,MACF;AACA,aAAO,EAAE,OAAO,IAAI,YAAY,OAAO,WAAW,MAAM;AAAA,IAC1D;AAGA,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAO,EAAE,OAAO,IAAI,SAAS,KAAK,YAAY,MAAM,WAAW,KAAK;AAAA,IACtE;AAGA,WAAO,EAAE,OAAO,YAAY,IAAI,KAAK,YAAY,MAAM,WAAW,KAAK;AAAA,EACzE;AACA,SAAO,EAAE,OAAO,IAAI,YAAY,OAAO,WAAW,MAAM;AAC1D;;;AF7FQ,IAAAC,wBAAA;AAhDD,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,EAAE;AAC/C,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,QAAQ;AAEnD,QAAM,iBAA8B,yBAAQ,MAAM;AAChD,WAAO,iBAAiB,IAAI,CAAC,OAAO;AAAA,MAClC,WAAW;AAAA,QACT,EAAE,SAAS,QAAQ,QAAQ;AAAA,QAC3B;AAAA,QACA,EAAE;AAAA,MACJ;AAAA,MACA,MAAM,EAAE,SAAS,QAAQ,QAAQ;AAAA,MACjC,QAAQ;AAAA,MACR,MAAM,EAAE;AAAA,MACR,aAAa,EAAE,QAAQ,EAAE;AAAA,MACzB,cAAc,EAAE;AAAA,IAClB,EAAE;AAAA,EACJ,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,kBAA+B,yBAAQ,MAAM;AACjD,WAAO,aAAa,IAAI,CAAC,UAAU;AAAA,MACjC,WAAW,iBAAiB,OAAO,WAAW,IAAI;AAAA,MAClD,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,aAAa,yBAAyB,IAAI;AAAA,IAC5C,EAAE;AAAA,EACJ,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,aAAa,CAAC,SAA0B;AAC5C,QAAI,CAAC,WAAY,QAAO;AACxB,UAAM,QAAQ,WAAW,YAAY;AACrC,WAAO,KAAK;AAAA,MACV,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,KAClC,EAAE,eAAe,EAAE,YAAY,YAAY,EAAE,SAAS,KAAK;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,MAAuB,aAAqB;AAC9D,UAAM,WAAW,WAAW,IAAI;AAChC,QAAI,SAAS,WAAW,GAAG;AACzB,aACE,+CAAC,SAAI,WAAU,yCAAyC,oBAAS;AAAA,IAErE;AACA,WACE,+CAAC,SAAI,WAAU,2BACZ,mBAAS,IAAI,CAAC,MACb;AAAA,MAAC;AAAA;AAAA,QAEC,SAAS,MAAM,SAAS,CAAC;AAAA,QACzB,WAAU;AAAA,QAEV;AAAA,0DAAC,SAAI,WAAU,kCACb;AAAA,2DAAC,UAAK,WAAU,yGACb,YAAE,MACL;AAAA,YACC,EAAE,gBACD,gDAAC,UAAK,WAAU,yDAAwD;AAAA;AAAA,cAChE,EAAE;AAAA,eACV;AAAA,aAEJ;AAAA,UACC,EAAE,eACD,+CAAC,UAAK,WAAU,uEACb,YAAE,aACL;AAAA,UAEF,+CAAC,UAAK,WAAU,wEACb,YAAE,WACL;AAAA;AAAA;AAAA,MArBK,EAAE;AAAA,IAsBT,CACD,GACH;AAAA,EAEJ;AAEA,QAAM,OAAkB;AAAA,IACtB;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OACE,+CAAC,SAAI,WAAU,wBACZ,qBAAW,YAAY,6BAA6B,GACvD;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OACE,+CAAC,SAAI,WAAU,wBACZ,qBAAW,kBAAkB,4BAA4B,GAC5D;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OACE,+CAAC,SAAI,WAAU,wBACZ,qBAAW,aAAa,oBAAoB,GAC/C;AAAA,IAEJ;AAAA,EACF;AAEA,SACE,gDAAC,SAAI,WAAU,iGACb;AAAA,oDAAC,SAAI,WAAU,+EACb;AAAA,qDAAC,QAAG,WAAU,wCAAuC,6BAErD;AAAA,MACC,WACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,SAAS;AAAA;AAAA,MACX;AAAA,OAEJ;AAAA,IAEA,+CAAC,SAAI,WAAU,iCACb;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,QAC7C,WAAS;AAAA,QACT,WAAU;AAAA;AAAA,IACZ,GACF;AAAA,IAEA,+CAAC,SAAI,WAAU,UACb;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAQ;AAAA,QACR,WAAU;AAAA;AAAA,IACZ,GACF;AAAA,KACF;AAEJ;AAEA,IAAO,yBAAQ;;;ADlKf,IAAAC,oBAA6B;AAsMrB,IAAAC,wBAAA;AAtLD,IAAM,aAAwC,CAAC;AAAA,EACpD,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,mBAAmB,CAAC;AAAA,EACpB,eAAe,CAAC;AAAA,EAChB,UAAU,CAAC;AAAA;AAEb,MAAM;AACJ,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,QAAI,0BAA4B,OAAO;AACnE,QAAM,mBAAe,wBAAuB,IAAI;AAChD,QAAM,eAAW,wBAAyB,IAAI;AAC9C,QAAM,gBAAY,wBAAuB,IAAI;AAG7C,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;AAE9D,QAAM,eAAe,gBAAAC,QAAM,QAAQ,MAAM;AACvC,UAAM,QAAQ,IAAI,OAAO,eAAe;AACxC,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,uBAAuB,MAAM;AACjC,iBAAa,IAAI;AAAA,EACnB;AAEA,QAAM,aAAa,CAAC,MAAwB;AAE1C,QACE,CAAC,aAAa,SAAS,SAAS,EAAE,aAAqB,KACvD,CAAC,UAAU,SAAS,SAAS,EAAE,aAAqB,GACpD;AACA,mBAAa,KAAK;AAClB,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,MAAwB;AAC5C,MAAE,gBAAgB;AAClB,QAAI,YAAY;AACd,oBAAc,KAAK;AAAA,IACrB,OAAO;AACL,UAAI,aAAa,SAAS;AACxB,cAAM,OAAO,aAAa,QAAQ,sBAAsB;AACxD,qBAAa;AAAA,UACX,KAAK,KAAK,SAAS,OAAO,UAAU;AAAA,UACpC,MAAM,KAAK,OAAO,OAAO;AAAA,QAC3B,CAAC;AAAA,MACH;AACA,oBAAc,IAAI;AAClB,mBAAa,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,uBAAuB,CAAC,aAA4B;AAExD,UAAM,QAAQ,SAAS;AACvB,QAAI,WAAW;AAEf,QAAI,OAAO;AACT,YAAM,QAAQ,MAAM,kBAAkB;AACtC,YAAM,MAAM,MAAM,gBAAgB;AAClC,iBACE,MAAM,UAAU,GAAG,KAAK,IAAI,SAAS,YAAY,MAAM,UAAU,GAAG;AAAA,IAKxE,OAAO;AACL,kBAAY,SAAS;AAAA,IACvB;AAEA,aAAS,QAAQ;AACjB,kBAAc,KAAK;AAEnB,WAAO,MAAM;AAAA,EACf;AAEA,iCAAU,MAAM;AACd,QAAI,aAAa,SAAS,SAAS;AACjC,eAAS,QAAQ,MAAM;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,iCAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UACE,cACA,UAAU,WACV,CAAC,UAAU,QAAQ,SAAS,MAAM,MAAc,KAChD,aAAa,WACb,CAAC,aAAa,QAAQ,SAAS,MAAM,MAAc,GACnD;AACA,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAMC,mBAAkB,CACtB,MACA,QACA,SACgE;AAChE,QAAI,WAAW,YAAY,WAAW,OAAO;AAM3C,UAAI,QAAQ,iBAAiB,KAAK,CAAC,MAAM,EAAE,QAAQ,IAAI;AACvD,UAAI,CAAC,OAAO;AAEV,gBAAQ,iBAAiB;AAAA,UACvB,CAAC,MAAM,EAAE,IAAI,YAAY,MAAM,KAAK,YAAY;AAAA,QAClD;AAAA,MACF;AAEA,UAAI,OAAO;AAET,YAAI,MAAM,SAAS,MAAM;AACvB,iBAAO,EAAE,OAAO,IAAI,YAAY,MAAM;AAAA,QACxC;AACA,eAAO,EAAE,OAAO,MAAM,iBAAiB,IAAI,YAAY,KAAK;AAAA,MAC9D;AACA,aAAO,EAAE,OAAO,IAAI,YAAY,MAAM;AAAA,IACxC;AACA,QAAI,WAAW,WAAW;AACxB,aAAO,EAAE,OAAO,MAAM,YAAY,KAAK;AAAA,IACzC;AACA,QAAI,WAAW,UAAU;AACvB,YAAM,YAAY,KAAK,YAAY;AAEnC,UAAI,cAAc,cAAc;AAC9B,eAAO,EAAE,OAAO,QAAQ,QAAQ,IAAI,YAAY,KAAK;AAAA,MACvD;AACA,UAAI,cAAc,UAAU;AAC1B,eAAO,EAAE,OAAO,qBAAqB,YAAY,KAAK;AAAA,MACxD;AACA,UAAI,cAAc,YAAY;AAC5B,cAAM,WAAW,QAAQ,eAAe,UAAU;AAClD,cAAM,SAAS;AACf,cAAM,MAAM,QAAQ,QAAQ;AAC5B,YAAI,KAAK;AACP,iBAAO,EAAE,OAAO,GAAG,QAAQ,MAAM,GAAG,IAAI,MAAM,IAAI,YAAY,KAAK;AAAA,QACrE;AACA,eAAO,EAAE,OAAO,IAAI,YAAY,MAAM;AAAA,MACxC;AAGA,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,eAAO,EAAE,OAAO,IAAI,SAAS,KAAK,YAAY,MAAM,WAAW,KAAK;AAAA,MACtE;AAGA,aAAO,EAAE,OAAO,YAAY,IAAI,KAAK,YAAY,MAAM,WAAW,KAAK;AAAA,IACzE;AACA,WAAO,EAAE,OAAO,IAAI,YAAY,MAAM;AAAA,EACxC;AAGA,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,OAAO;AACV,aACE,+CAAC,UAAK,WAAU,yBAAyB,yBAAe,SAAQ;AAAA,IAEpE;AAEA,UAAM,QAAQ,CAAC;AACf,QAAI,YAAY;AAChB,QAAI;AAEJ,UAAM,QAAQ,IAAI,OAAO,iBAAiB,IAAI;AAE9C,YAAQ,QAAQ,MAAM,KAAK,KAAK,OAAO,MAAM;AAE3C,UAAI,MAAM,QAAQ,WAAW;AAC3B,cAAM;AAAA,UACJ,+CAAC,UACE,gBAAM,UAAU,WAAW,MAAM,KAAK,KAD9B,QAAQ,SAAS,EAE5B;AAAA,QACF;AAAA,MACF;AAIA,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,SAAS,MAAM,CAAC;AACtB,YAAM,OAAO,MAAM,CAAC;AAEpB,UAAI,aAAa,SAAS;AACxB,cAAM;AAAA,UACJ,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QACF,IAAIA,iBAAgB,MAAM,QAAQ,IAAI;AACtC,cAAM,UAAU,CAAC;AAEjB,YAAI,aAAa;AACjB,YAAI,SAAS;AACX,uBAAa;AAAA,QACf;AAEA,YAAI,cAAc,WAAW;AAC3B,uBAAa;AAAA,QACf,WAAW,WAAW,YAAY,CAAC,SAAS;AAE1C,uBAAa;AAAA,QACf;AAEA,cAAM;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,kFAAkF,UAAU;AAAA,cACvG,OAAO,aAAa,UAAU,WAAW,KAAK;AAAA,cAE7C,oBAAU,UAAU;AAAA;AAAA,YAJhB,SAAS,MAAM,KAAK;AAAA,UAK3B;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,aAAa;AACjB,YAAI,WAAW,UAAU;AACvB,cAAI,SAAS,OAAO;AAClB,yBAAa;AAAA,UACf,WAAW,SAAS,OAAO;AACzB,yBAAa;AAAA,UACf,OAAO;AACL,yBAAa;AAAA,UACf;AAAA,QACF;AACA,YAAI,WAAW;AACb,uBAAa;AACf,YAAI,WAAW;AACb,uBAAa;AAEf,YAAI,cAAc;AAClB,YAAI,WAAW,UAAU;AACvB,wBAAc,SAAS,QAAQ,QAAQ;AAAA,QACzC,WAAW,WAAW,UAAU;AAC9B,wBAAc;AAAA,QAChB,WAAW,WAAW,WAAW;AAC/B,wBAAc;AAAA,QAChB;AAEA,cAAM;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,kFAAkF,UAAU;AAAA,cACvG,OAAO,GAAG,IAAI,KAAK,MAAM;AAAA,cAExB;AAAA;AAAA,gBAAY;AAAA,gBAAE;AAAA;AAAA;AAAA,YAJV,SAAS,MAAM,KAAK;AAAA,UAK3B;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,MAAM;AAAA,IACpB;AAGA,QAAI,YAAY,MAAM,QAAQ;AAC5B,YAAM;AAAA,QACJ,+CAAC,UAAgC,gBAAM,UAAU,SAAS,KAA/C,QAAQ,SAAS,EAAgC;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO,+CAAC,SAAI,WAAU,YAAY,iBAAM;AAAA,EAC1C;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,sEAAsE,YAAY,4CAA4C,yCAAyC,IAAI,SAAS;AAAA,MAE9L;AAAA,oBACC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,QAAQ;AAAA,YACR,WAAU;AAAA,YACV;AAAA,YACA,cAAa;AAAA;AAAA,QACf,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YAET,qBAAW;AAAA;AAAA,QACd;AAAA,QAGF,gDAAC,SAAI,WAAU,8DACZ;AAAA,0BACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,aAAa,UAAU,YAAa;AAAA,cAC1C,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AAClB,6BAAa,KAAK;AAClB,4BAAY,CAAC,SAAU,SAAS,UAAU,UAAU,OAAQ;AAAA,cAC9D;AAAA,cACA,WAAU;AAAA,cACV,OAAO,aAAa,UAAU,gBAAgB;AAAA;AAAA,UAChD;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WACE,aACI,6BACA;AAAA,cAEN,OAAM;AAAA;AAAA,UACR;AAAA,WACF;AAAA,QAGC,kBACC;AAAA,UACE;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK,UAAU;AAAA,gBACf,MAAM,UAAU;AAAA,gBAChB,QAAQ;AAAA,cACV;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,UAAU;AAAA,kBACV,SAAS,MAAM,cAAc,KAAK;AAAA,kBAClC;AAAA,kBACA;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA;AAAA;AAAA,EACJ;AAEJ;AAEA,IAAO,qBAAQ;;;AIlYf,IAAAC,kBAAgC;AA4CtB,IAAAC,wBAAA;AA5BH,IAAM,aAAwC,CAAC;AAAA,EACpD,QAAQ;AAAA,EACR,mBAAmB,CAAC;AAAA,EACpB,eAAe,CAAC;AAAA,EAChB,UAAU,CAAC;AAAA,EACX,YAAY;AACd,MAAM;AACJ,QAAM,CAAC,UAAU,WAAW,QAAI,0BAA4B,OAAO;AAGnE,QAAM,QAAQ,IAAI,OAAO,iBAAiB,IAAI;AAC9C,QAAM,eAAe,MAAM,KAAK,KAAK;AAGrC,QAAM,YAAY;AAElB,QAAM,cAAc,MAAM;AACxB,UAAM,QAAQ,CAAC;AACf,QAAI,YAAY;AAChB,QAAI;AAGJ,UAAM,YAAY;AAElB,YAAQ,QAAQ,MAAM,KAAK,KAAK,OAAO,MAAM;AAE3C,UAAI,MAAM,QAAQ,WAAW;AAC3B,cAAM;AAAA,UACJ,+CAAC,UACE,gBAAM,UAAU,WAAW,MAAM,KAAK,KAD9B,QAAQ,SAAS,EAE5B;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,MAAM,CAAC;AACzB,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,SAAS,MAAM,CAAC;AACtB,YAAM,OAAO,MAAM,CAAC;AAEpB,UAAI,aAAa,SAAS;AACxB,cAAM,MAAM,EAAE,kBAAkB,cAAc,QAAQ;AAGtD,cAAM;AAAA,UACJ,OAAO;AAAA,UACP;AAAA,UACA;AAAA,QACF,IAAI,gBAAgB,WAAW,GAAG;AAClC,cAAM,UAAU,CAAC;AAEjB,YAAI,aAAa;AACjB,YAAI,SAAS;AACX,uBAAa;AAAA,QACf;AAEA,YAAI,cAAc,WAAW;AAC3B,uBAAa;AAAA,QACf,WAAW,WAAW,YAAY,CAAC,SAAS;AAC1C,uBAAa;AAAA,QACf;AAEA,cAAM;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,kFAAkF,UAAU;AAAA,cACvG,OAAO,aAAa,UAAU,WAAW,KAAK;AAAA,cAE7C,oBAAU,UAAU;AAAA;AAAA,YAJhB,SAAS,MAAM,KAAK;AAAA,UAK3B;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,aAAa;AACjB,YAAI,WAAW;AACb,uBAAa;AACf,YAAI,WAAW;AACb,uBAAa;AACf,YAAI,WAAW;AACb,uBAAa;AAEf,cAAM;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,kFAAkF,UAAU;AAAA,cACvG,OAAO,GAAG,IAAI,KAAK,MAAM;AAAA,cAExB;AAAA,2BAAW,WAAW,MAAM,WAAW,WAAW,MAAM;AAAA,gBAAM;AAAA,gBAC9D;AAAA;AAAA;AAAA,YALI,SAAS,MAAM,KAAK;AAAA,UAM3B;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,MAAM;AAAA,IACpB;AAGA,QAAI,YAAY,MAAM,QAAQ;AAC5B,YAAM;AAAA,QACJ,+CAAC,UAAgC,gBAAM,UAAU,SAAS,KAA/C,QAAQ,SAAS,EAAgC;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO,+CAAC,UAAK,WAAuB,iBAAM;AAAA,EAC5C;AAEA,SACE,gDAAC,SAAI,WAAW,gCAAgC,SAAS,IACvD;AAAA,mDAAC,SAAI,WAAU,mFACZ,sBAAY,GACf;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,aAAa,UAAU,YAAY;AAAA,QACzC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,sBAAY,CAAC,SAAU,SAAS,UAAU,UAAU,OAAQ;AAAA,QAC9D;AAAA,QACA,WAAU;AAAA,QACV,OAAO,aAAa,UAAU,gBAAgB;AAAA;AAAA,IAChD;AAAA,KACF;AAEJ;AAEA,IAAO,qBAAQ;;;AChJf,IAAAC,kBAAoD;AACpD,IAAAC,sBAAuB;AAkIb,IAAAC,wBAAA;AA9GV,IAAMC,eAeF;AAAA,EACF,IAAI;AAAA,IACF,eAAe;AAAA,IACf,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,UAAU;AAAA,IACV,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,eAAe;AAAA,IACf,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,UAAU;AAAA,IACV,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,aAAa;AAAA,EACf;AAAA,EACA,IAAI;AAAA,IACF,eAAe;AAAA,IACf,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,UAAU;AAAA,IACV,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,aAAa;AAAA,EACf;AACF;AAEA,IAAM,gBAUF;AAAA,EACF,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAEA,IAAM,mBAAmB,CACvB,QACA,cACuB;AACvB,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aACE,+CAAC,SAAI,SAAQ,aAAY,WAAW,WAAW,eAAY,QACzD,yDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,gBAAe,GACpD;AAAA,IAEJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,eAAW,oBAAAC,SAAW,WAAW,cAAc;AAAA,UAC/C,eAAY;AAAA,UAEZ;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,IAAG;AAAA,gBACH,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,aAAY;AAAA,gBACZ,iBAAgB;AAAA,gBAChB,eAAc;AAAA,gBACd,MAAK;AAAA,gBACL,WAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,aAAY;AAAA,gBACZ,eAAc;AAAA,gBACd,MAAK;AAAA;AAAA,YACP;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ,KAAK;AACH,aACE,+CAAC,SAAI,SAAQ,aAAY,WAAW,WAAW,eAAY,QACzD;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB,GACF;AAAA,IAEJ,KAAK;AAAA,IACL;AACE,aACE,+CAAC,SAAI,SAAQ,aAAY,WAAW,WAAW,eAAY,QACzD;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB,GACF;AAAA,EAEN;AACF;AAEA,IAAM,0BAA0B,CAAC,UAC/B,MAAM,iBACN,MAAM,UAAU,kBAChB,MAAM,eACN,MAAM,gBACN;AAIF,IAAM,mBAGF;AAAA,EACF,UAAU,EAAE,MAAM,qCAAqC;AAAA,EACvD,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,OAAO,EAAE,MAAM,+BAA+B;AAAA,EAC9C,SAAS,EAAE,MAAM,qCAAqC;AACxD;AAEA,IAAM,mBAAmB,CAAC,UAAwC;AAChE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW,SAAS;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW,aAAa;AAChC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW,eAAe;AAClC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,sBAA0D,CAAC;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AACT,MAAM;AACJ,QAAM,oBAAgB,yBAAQ,MAAM,OAAO,OAAO,OAAO,GAAG,CAAC,MAAM,CAAC;AACpE,QAAM,YAAYD,aAAY,IAAI,KAAKA,aAAY;AAEnD,QAAM,qBAAiB,yBAAQ,MAAM;AACnC,QAAI,gBAAgB;AAClB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,cAAc;AAAA,MAC/B,CAAC,UAAU,MAAM,WAAW;AAAA,IAC9B;AACA,QAAI,YAAY;AACd,aAAO,WAAW;AAAA,IACpB;AACA,UAAM,UAAU,cAAc,KAAK,CAAC,UAAU,MAAM,WAAW,SAAS;AACxE,WAAO,SAAS,MAAM,cAAc,CAAC,GAAG;AAAA,EAC1C,GAAG,CAAC,gBAAgB,aAAa,CAAC;AAElC,QAAM,CAAC,iBAAiB,kBAAkB,QAAI;AAAA,IAC5C;AAAA,EACF;AACA,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAS,kBAAkB;AACjE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAS,KAAK;AAE9D,iCAAU,MAAM;AACd,uBAAmB,CAAC,SAAS;AAC3B,UAAI,CAAC,gBAAgB;AACnB,eAAO;AAAA,MACT;AACA,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AAEA,UAAI,SAAS,gBAAgB;AAC3B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,CAAC;AAEnB,iCAAU,MAAM;AACd,wBAAoB,KAAK;AAAA,EAC3B,GAAG,CAAC,eAAe,CAAC;AAEpB,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,gBACJ,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,eAAe,KAC1D,cAAc,CAAC;AACjB,QAAM,iBAAiB,cAAc,cAAc,MAAM;AACzD,QAAM,oBAAoB,cAAc;AAAA,IAAO,CAAC,UAC9C,CAAC,SAAS,WAAW,EAAE,SAAS,MAAM,MAAM;AAAA,EAC9C;AACA,QAAM,cAAc,qBAAqB,kBAAkB,SAAS;AACpE,QAAM,eAAe,cAAc,WAAW;AAC9C,QAAM,sBAAsB;AAAA,IAC1B,cAAc,gBAAgB,cAAc;AAAA,EAC9C;AACA,QAAM,gBAAgB,eAClB,uEACA;AACJ,QAAM,oBACJ,YAAY,UACR,eACE,sDACA,4DACF,eACE,sDACA;AACR,QAAM,mBACJ,YAAY,UACR,yHACA;AAEN,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,wDAAC,SAAI,WAAU,2CACb;AAAA,0DAAC,SACC;AAAA,2DAAC,OAAE,WAAU,wFACV,iBACH;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT,UAAU;AAAA,kBACV;AAAA,gBACF;AAAA,gBAEC,wBAAc;AAAA;AAAA,YACjB;AAAA,aACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,UAAU;AAAA,gBACV,eAAe;AAAA,gBACf,eAAe;AAAA,cACjB;AAAA,cAEC,yBAAe;AAAA;AAAA,UAClB;AAAA,WACF;AAAA,QAEA,+CAAC,SAAI,WAAU,yBACb;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA,YACZ;AAAA,YAEC,wBAAc,IAAI,CAAC,OAAO,UAAU;AACnC,oBAAM,QAAQ,cAAc,MAAM,MAAM;AACxC,oBAAM,WAAW,MAAM,OAAO,cAAc;AAC5C,oBAAM,gBAAgB,iBAAiB,cAAc,QAAQ,CAAC,CAAC;AAC/D,qBACE,gDAAC,gBAAAC,QAAM,UAAN,EACE;AAAA,wBAAQ,KACP;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAD;AAAA,sBACT;AAAA,sBACA,UAAU;AAAA,sBACV,iBAAiB,aAAa,EAAE;AAAA,sBAChC,iBAAiB,aAAa,EAAE,YAC9B;AAAA,oBACJ;AAAA;AAAA,gBACF;AAAA,gBAEF;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,MAAM;AAAA,oBACb,cAAY,MAAM;AAAA,oBAClB,SAAS,MAAM;AACb,yCAAmB,MAAM,EAAE;AAC3B,sCAAgB,KAAK;AAAA,oBACvB;AAAA,oBACA,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,UAAU;AAAA,sBACV,UAAU;AAAA,sBACV,MAAM;AAAA,sBACN;AAAA,wBACE,sFACE,MAAM,WAAW;AAAA,wBACnB,sEACE,MAAM,WAAW;AAAA,wBACnB,0EACE,MAAM,WAAW;AAAA,wBACnB,2EACE,MAAM,WAAW;AAAA,wBACnB,yCAAyC;AAAA,sBAC3C;AAAA,oBACF;AAAA,oBACA,gBAAc;AAAA,oBAEb;AAAA;AAAA,wBACC,MAAM;AAAA,4BACN,oBAAAA,SAAW,gBAAgB,UAAU,IAAI;AAAA,sBAC3C;AAAA,sBACA,gDAAC,UAAK,WAAU,WACb;AAAA,8BAAM;AAAA,wBAAM;AAAA,wBAAI,MAAM;AAAA,yBACzB;AAAA;AAAA;AAAA,gBACF;AAAA,mBA9CmB,MAAM,EA+C3B;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH,GACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA,cACV;AAAA,YACF;AAAA,YAEA;AAAA,6DAAC,OAAG,kCAAwB,aAAa,GAAE;AAAA,cAE1C,OAAO,cAAc,UAAU,eAAe,YAC7C,gDAAC,SAAI,WAAU,QACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,cAAc,SAAS;AAAA,oBAC9B,OAAM;AAAA;AAAA,gBACR;AAAA,gBACC,cAAc,UAAU,WACvB,+CAAC,OAAE,WAAU,+FACV,wBAAc,SAAS,SAC1B;AAAA,iBAEJ;AAAA,cAGD,cAAc,eAAe,UAC5B,cAAc,kBAAkB,UAChC,cAAc,aAAa,KACzB,gDAAC,OAAE,WAAU,6FAA4F;AAAA;AAAA,gBAChG,cAAc;AAAA,gBAAW;AAAA,gBAAK,cAAc;AAAA,iBACrD;AAAA,cAGH,gBAAgB,uBACf,gDAAC,SAAI,WAAU,2JACb;AAAA,gEAAC,SAAI,WAAU,2CACb;AAAA,kEAAC,SACC;AAAA,mEAAC,OAAE,WAAU,kFAAiF,+BAE9F;AAAA,oBACC,CAAC,oBACA,+CAAC,OAAE,WAAU,kDAAiD,2CAE9D;AAAA,qBAEJ;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM,oBAAoB,CAAC,SAAS,CAAC,IAAI;AAAA,sBAClD,iBAAe;AAAA,sBAEd,6BAAmB,SAAS;AAAA;AAAA,kBAC/B;AAAA,mBACF;AAAA,gBACC,oBACC,gDAAC,SAAI,WAAU,kBACZ;AAAA,gCAAc,gBACb,+CAAC,SAAI,WAAU,kIACZ,wBAAc,cACjB;AAAA,kBAED,cAAc,aACb,gDAAC,OAAE,WAAU,kFAAiF;AAAA;AAAA,oBACrF,cAAc;AAAA,qBACvB;AAAA,mBAEJ;AAAA,iBAEJ;AAAA;AAAA;AAAA,QAEJ;AAAA,QAEC,eACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,UAAU;AAAA,YACZ;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA,UAAU;AAAA,kBACZ;AAAA,kBACA,SAAS,MAAM,eAAe,CAAC,SAAS,CAAC,IAAI;AAAA,kBAE7C;AAAA,oEAAC,UAAK;AAAA;AAAA,sBACY;AAAA,sBAChB,gDAAC,UAAK,WAAU,sDAAqD;AAAA;AAAA,wBACjE,kBAAkB;AAAA,wBAAO;AAAA,yBAC7B;AAAA,uBACF;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,cAAc,eAAe;AAAA,wBAC/B;AAAA,wBACA,eAAY;AAAA,wBAEZ,yDAAC,SAAI,SAAQ,aAAY,WAAU,iBACjC;AAAA,0BAAC;AAAA;AAAA,4BACC,GAAE;AAAA,4BACF,MAAK;AAAA,4BACL,QAAO;AAAA,4BACP,aAAY;AAAA,4BACZ,eAAc;AAAA,4BACd,gBAAe;AAAA;AAAA,wBACjB,GACF;AAAA;AAAA,oBACF;AAAA;AAAA;AAAA,cACF;AAAA,cACC,eACC;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA,UAAU;AAAA,kBACZ;AAAA,kBAEC,4BAAkB,IAAI,CAAC,UAAU;AAChC,0BAAM,QAAQ,cAAc,MAAM,MAAM;AACxC,2BACE;AAAA,sBAAC;AAAA;AAAA,wBAEC,WAAU;AAAA,wBAEV;AAAA,yEAAC,UAAK,WAAU,sDACb,gBAAM,OACT;AAAA,0BACA;AAAA,4BAAC;AAAA;AAAA,8BACC,eAAW,oBAAAA;AAAA,gCACT;AAAA,gCACA,MAAM;AAAA,8BACR;AAAA,8BAEC,gBAAM;AAAA;AAAA,0BACT;AAAA;AAAA;AAAA,sBAbK,MAAM;AAAA,oBAcb;AAAA,kBAEJ,CAAC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,8BAAQ;;;ACvjBf,IAAAE,kBAAyC;AACzC,IAAAC,sBAAuB;;;ACAvB,IAAAC,sBAAuB;AAoHf,IAAAC,wBAAA;AA7DR,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAAS,wBAAwB,KAAK;AAC5C,QAAM,iBAAiB,kBAAkB,CAAC,CAAC;AAC3C,QAAM,qBAAqB,aAAa;AAGxC,QAAM,oBAAoB,MAAM;AAC9B,QAAI,WAAW;AACb,aAAO,QAAQ,SAAS,kBAAkB,SAAS;AAAA,IACrD;AACA,QAAI,OAAO;AACT,UAAI,MAAM,cAAc,MAAM;AAC5B,eAAO;AAAA,MACT,WAAW,MAAM,cAAc,QAAQ;AACrC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,UACE,kBAAkB,CAAC,CAAC;AAAA,UACpB,mBAAmB,CAAC,CAAC,WAAW,CAAC;AAAA,UACjC,wCAAwC;AAAA,QAC1C;AAAA,MACF;AAAA,MACA;AAAA,MAGC;AAAA,mBACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO;AAAA,YACP,MAAK;AAAA,YACL,OAAO,gBAAgB;AAAA,YACvB,gBAAgB,kBAAkB;AAAA,YAClC,kBAAkB,oBAAoB;AAAA,YACtC,SAAQ;AAAA;AAAA,QACV;AAAA,QAID,kBACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,OAAO;AAAA,YACT;AAAA,YAEC,kBACC,+CAAC,SAAI,eAAW,oBAAAA,SAAW,oBAAoB,OAAO,SAAS,GAC7D,yDAAC,cAAW,MAAY,MAAK,MAAK,GACpC;AAAA;AAAA,QAEJ;AAAA,QAIF,gDAAC,SAAI,WAAU,0CACX;AAAA,YAAC,QAAQ,SAAS,YAClB;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,CAAC,iBACG,+BAA+B,kBAAkB,oBAAoB,kBAAkB,SACvF;AAAA,cACN;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,iBAAiB,UAAU;AAAA,oBAC7B;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,YACI,QAAQ,SAAS,kBAAkB,SAAS,SAC5C;AAAA,wBACN;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA;AAAA,gBACF;AAAA,gBACC,WAAW,+CAAC,SAAI,WAAU,mBAAmB,mBAAQ;AAAA;AAAA;AAAA,UACxD;AAAA,UAID,QACC,gDAAC,SAAI,WAAU,wEACZ;AAAA,kBAAM,QACL,+CAAC,SAAI,WAAU,sBACb,yDAAC,cAAW,MAAM,MAAM,MAAM,MAAK,MAAK,GAC1C;AAAA,YAEF;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,MAAM,UAAU,SAAS;AAAA,gBAC3B;AAAA,gBAEC,gBAAM,WAAW;AAAA;AAAA,YACpB;AAAA,YACC,MAAM,WACL;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,wBAAM,UAAU;AAAA,gBAClB;AAAA,gBACA,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,aAEJ,IACE,OACF,OAEA,kFACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,UACI,4BACA;AAAA,gBACN;AAAA,gBAEA;AAAA,kEAAC,SAAI,WAAU,6BACb;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,kBAAkB;AAAA,wBACpB;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA,oBACC,SACC;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,MAAM,cAAc,OAChB,gFACA,MAAM,cAAc,SAClB,oEACA;AAAA,wBACR;AAAA,wBAEA;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,MACG,MAAM,cAAc,OACjB,YACA,MAAM,cAAc,SAClB,cACA;AAAA,8BAER,MAAK;AAAA;AAAA,0BACP;AAAA,0BACA,+CAAC,UAAK,WAAU,uBAAuB,gBAAM,OAAM;AAAA;AAAA;AAAA,oBACrD;AAAA,qBAEJ;AAAA,kBACC,OAAO,SACN,+CAAC,SAAI,WAAU,uDACZ,gBAAM,OACT;AAAA,kBAED,YACC,+CAAC,SAAI,WAAU,uDACZ,oBACH;AAAA;AAAA;AAAA,YAEJ;AAAA,YAGC,aAAa,UACZ,gDAAC,SAAI,WAAU,gBACb;AAAA,8DAAC,SAAI,WAAU,uCACb;AAAA,+DAAC,UAAK,WAAU,sDACb,mBAAS,SAAS,YACrB;AAAA,gBACA,gDAAC,UAAK,WAAU,oBAAoB;AAAA,2BAAS;AAAA,kBAAM;AAAA,mBAAC;AAAA,iBACtD;AAAA,cACA,+CAAC,SAAI,WAAU,gFACb;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA;AAAA,oBAEA,SAAS,UAAU,SACf,gBACA,SAAS,QACP,MAAM,SAAS,KAAK,SACpB,MAAM,KAAK;AAAA,kBACnB;AAAA,kBACA,OAAO;AAAA,oBACL,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,SAAS,KAAK,CAAC,CAAC;AAAA,kBACtD;AAAA;AAAA,cACF,GACF;AAAA,eACF;AAAA,aAIA,QAAQ,WACR,gDAAC,SAAI,eAAW,oBAAAA,SAAW,sBAAsB,OAAO,OAAO,GAC5D;AAAA,sBACC,+CAAC,SAAI,WAAU,wBACZ,eAAK,IAAI,CAAC,MAAM,QACf;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAU;AAAA,kBAET;AAAA,yBAAK,QACJ;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAM,KAAK;AAAA,wBACX,MAAK;AAAA,wBACL,WAAU;AAAA;AAAA,oBACZ;AAAA,oBAED,KAAK;AAAA;AAAA;AAAA,gBAVD;AAAA,cAWP,CACD,GACH;AAAA,cAED,UAAU,+CAAC,SAAI,WAAU,QAAQ,kBAAO;AAAA,eAC3C;AAAA,aAEJ;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,mBAAQ;;;AD/NL,IAAAC,wBAAA;AAtEV,IAAM,gBAA8C,CAAC,EAAE,MAAM,GAAG,MAAM,MAAM;AAC1E,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAS,CAAC;AAClD,QAAM,iBAAiB,KAAK,YAAY;AAExC,QAAM,oBAAgB,yBAAQ,MAAM;AAClC,UAAM,UAAU,qBAAqB,eAAe,MAAM,MAAM;AAChE,WAAO,eAAe,MAAM,IAAI,CAAC,MAAM,OAAO;AAAA,MAC5C,GAAG;AAAA,MACH,OAAQ,KAAK,SAAS,QAAQ,CAAC;AAAA,IACjC,EAAE;AAAA,EACJ,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,YAAQ;AAAA,IACZ,MAAM,eAAe,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC;AAAA,IACpE,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,eAAe,GAAG;AACpB,sBAAgB,eAAe,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,eAAe,KAAK,SAAS,GAAG;AAClC,sBAAgB,eAAe,CAAC;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,OAAO;AACb,QAAM,cAAc;AACpB,QAAM,UAAU,OAAO,eAAe,IAAI;AAC1C,QAAM,gBAAgB,SAAS,IAAI,KAAK;AAGxC,MAAI,oBAAoB;AACxB,QAAM,WACJ,UAAU,IACN;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW;AAAA,MACX,WAAW,GAAG,aAAa,IAAI,aAAa;AAAA,MAC5C,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF,IACA,cAAc,IAAI,CAAC,SAAS;AAC1B,UAAM,UAAU,KAAK,QAAQ;AAC7B,UAAM,YAAY,GAAG,gBAAgB,OAAO,IAAI,aAAa;AAC7D,UAAM,aAAa,CAAC,gBAAgB;AACpC,yBAAqB;AACrB,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAEP,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAwB,IAAI;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,MACE,gDAAC,SAAI,WAAU,wBAEb;AAAA,wDAAC,SAAI,WAAU,+CACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU,iBAAiB;AAAA,cAC3B,eAAW,oBAAAC;AAAA,gBACT;AAAA,gBACA,iBAAiB,IACb,wCACA;AAAA,gBACJ,KAAK,UAAU,KAAK;AAAA,cACtB;AAAA,cAEA,yDAAC,cAAW,MAAK,oBAAmB,MAAK,MAAK;AAAA;AAAA,UAChD;AAAA,UAEA,+CAAC,UAAK,WAAU,iEACb,yBAAe,OAClB;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU,iBAAiB,KAAK,SAAS;AAAA,cACzC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,iBAAiB,KAAK,SAAS,IAC3B,wCACA;AAAA,gBACJ,KAAK,UAAU,KAAK;AAAA,cACtB;AAAA,cAEA,yDAAC,cAAW,MAAK,qBAAoB,MAAK,MAAK;AAAA;AAAA,UACjD;AAAA,WACF;AAAA,QAGA,gDAAC,SAAI,WAAU,6DACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,OAAO,IAAI,IAAI,IAAI;AAAA,cAG5B;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV;AAAA,oBACA,QAAO;AAAA,oBACP,MAAK;AAAA,oBACL,GAAG;AAAA,oBACH,IAAI,OAAO;AAAA,oBACX,IAAI,OAAO;AAAA;AAAA,gBACb;AAAA,gBAGC,SAAS,IAAI,CAAC,SAAS,QAAQ;AAC9B,sBAAI,QAAQ,gBAAgB,QAAQ,EAAG,QAAO;AAC9C,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,eAAW,oBAAAA;AAAA,wBACT,QAAQ,QAAQ,KAAK,IAAI,QAAQ,aAAa,KAAK;AAAA,wBACnD,QAAQ,KACN;AAAA,sBACJ;AAAA,sBACA;AAAA,sBACA,iBAAiB,QAAQ;AAAA,sBACzB,kBAAkB,QAAQ;AAAA,sBAC1B,eAAe,QAAQ,IAAI,UAAU;AAAA,sBACrC,QAAO;AAAA,sBACP,MAAK;AAAA,sBACL,GAAG;AAAA,sBACH,IAAI,OAAO;AAAA,sBACX,IAAI,OAAO;AAAA,sBACX,cAAc,MAAM,QAAQ,KAAK,gBAAgB,GAAG;AAAA,sBACpD,cAAc,MAAM,gBAAgB,IAAI;AAAA,sBACxC,SAAS,CAAC,MAAM;AACd,4BAAI,QAAQ,KAAK,QAAQ,SAAS;AAChC,4BAAE,gBAAgB;AAClB,kCAAQ,QAAQ;AAAA,wBAClB;AAAA,sBACF;AAAA,sBAEC,kBAAQ,KACP,gDAAC,WACE;AAAA,gCAAQ;AAAA,wBAAM;AAAA,wBAAG,QAAQ;AAAA,yBAC5B;AAAA;AAAA,oBA3BG;AAAA,kBA6BP;AAAA,gBAEJ,CAAC;AAAA,gBAGA,iBAAiB,QAChB,QAAQ,KACR,SAAS,YAAY,MACpB,MAAM;AACL,wBAAM,UAAU,SAAS,YAAY;AACrC,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,eAAW,oBAAAA;AAAA,wBACT,QAAQ,QAAQ,KAAK,IAAI,QAAQ,aAAa,KAAK;AAAA,sBACrD;AAAA,sBACA;AAAA,sBACA,iBAAiB,QAAQ;AAAA,sBACzB,kBAAkB,QAAQ;AAAA,sBAC1B,eAAc;AAAA,sBACd,QAAO;AAAA,sBACP,MAAK;AAAA,sBACL,GAAG;AAAA,sBACH,IAAI,OAAO;AAAA,sBACX,IAAI,OAAO;AAAA,sBACX,cAAc,MAAM,gBAAgB,YAAY;AAAA,sBAChD,cAAc,MAAM,gBAAgB,IAAI;AAAA,sBACxC,SAAS,CAAC,MAAM;AACd,4BAAI,QAAQ,SAAS;AACnB,4BAAE,gBAAgB;AAClB,kCAAQ,QAAQ;AAAA,wBAClB;AAAA,sBACF;AAAA,sBAEA,0DAAC,WACE;AAAA,gCAAQ;AAAA,wBAAM;AAAA,wBAAG,QAAQ;AAAA,yBAC5B;AAAA;AAAA,oBAxBK;AAAA,kBAyBP;AAAA,gBAEJ,GAAG;AAAA;AAAA;AAAA,UACP;AAAA,UAGA,gDAAC,SAAI,WAAU,2EACb;AAAA,2DAAC,UAAK,WAAU,yEACb,iBACH;AAAA,YACA,+CAAC,UAAK,WAAU,4EACb,yBAAe,aAClB;AAAA,aACF;AAAA,WACF;AAAA,QAGC,QAAQ,KACP,+CAAC,SAAI,WAAU,8CACZ,wBAAc,IAAI,CAAC,MAAM,QACxB;AAAA,UAAC;AAAA;AAAA,YAEC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,KAAK,UACD,uFACA;AAAA,YACN;AAAA,YACA,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK;AAAA,YACnC,SAAS,MAAM,KAAK,WAAW,KAAK,QAAQ;AAAA,YAE5C;AAAA,8DAAC,SAAI,WAAU,kCACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,yCAAyC,KAAK,KAAK;AAAA;AAAA,gBAChE;AAAA,gBACA,+CAAC,UAAK,WAAU,sIACb,eAAK,OACR;AAAA,iBACF;AAAA,cACA,+CAAC,UAAK,WAAU,gEACb,eAAK,OACR;AAAA;AAAA;AAAA,UApBK;AAAA,QAqBP,CACD,GACH;AAAA,SAEJ;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,wBAAQ;;;AEhRf,IAAAC,sBAAuB;AA2Ef,IAAAC,wBAAA;AAxCD,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAAS,wBAAwB,KAAK;AAC5C,QAAM,iBAAiB,kBAAkB,CAAC,CAAC;AAC3C,QAAM,qBAAqB,aAAa;AAExC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,UACE,kBAAkB,CAAC,CAAC;AAAA,UACpB,mBAAmB,CAAC,CAAC,WAAW,CAAC;AAAA,UACjC,wCAAwC;AAAA,QAC1C;AAAA,MACF;AAAA,MACA;AAAA,MAGC;AAAA,mBACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO;AAAA,YACP,MAAK;AAAA,YACL,OAAO,gBAAgB;AAAA,YACvB,gBAAgB,kBAAkB;AAAA,YAClC,kBAAkB,oBAAoB;AAAA,YACtC,SAAQ;AAAA;AAAA,QACV;AAAA,QAID,kBACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,OAAO;AAAA,YACT;AAAA,YAEC,kBACC,+CAAC,SAAI,eAAW,oBAAAA,SAAW,oBAAoB,OAAO,SAAS,GAC7D,yDAAC,cAAW,MAAY,MAAK,MAAK,GACpC;AAAA;AAAA,QAEJ;AAAA,QAIF,gDAAC,SAAI,WAAU,0CAEb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,CAAC,iBACG,+BAA+B,kBAAkB,oBAAoB,kBAAkB,SACvF;AAAA,cACN;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA,iBAAiB,UAAU;AAAA,kBAC7B;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,YACI,QAAQ,SAAS,kBAAkB,SAAS,SAC5C;AAAA,sBACN;AAAA,sBAEC;AAAA;AAAA,kBACH;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UAGC,QACC,gDAAC,SAAI,WAAU,wEACZ;AAAA,kBAAM,QACL,+CAAC,SAAI,WAAU,sBACb,yDAAC,cAAW,MAAM,MAAM,MAAM,MAAK,MAAK,GAC1C;AAAA,YAEF;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,MAAM,UAAU,SAAS;AAAA,gBAC3B;AAAA,gBAEC,gBAAM,WAAW;AAAA;AAAA,YACpB;AAAA,YACC,MAAM,WACL;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,wBAAM,UAAU;AAAA,gBAClB;AAAA,gBACA,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,aAEJ,IAEA,kFACE;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,UACI,4BACA;AAAA,gBACN;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,YACI,QAAQ,SAAS,kBAAkB,SAAS,SAC5C;AAAA,oBACN;AAAA,oBAEC;AAAA;AAAA,gBACH;AAAA;AAAA,YACF;AAAA,YAGC,aAAa,UAAU,SAAS,KAC/B,+CAAC,SAAI,WAAU,qBACZ,oBAAU,IAAI,CAAC,MAAM,QACpB;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBAEV;AAAA,iEAAC,UAAK,WAAU,sDACb,eAAK,OACR;AAAA,kBACA,+CAAC,SAAI,WAAU,2BACb;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,KAAK,QACD,QAAQ,KAAK,KAAK,kBAAkB,KAAK,KAAK,SAC9C;AAAA,sBACN;AAAA,sBAEC,eAAK;AAAA;AAAA,kBACR,GACF;AAAA;AAAA;AAAA,cAjBK;AAAA,YAkBP,CACD,GACH;AAAA,aAEJ;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,wBAAQ;;;ACzNf,IAAAC,kBAA+B;AAC/B,IAAAC,sBAAuB;AA0CjB,IAAAC,wBAAA;AApBN,IAAM,mBAMD,CAAC,EAAE,OAAO,OAAO,MAAM,OAAO,IAAI,cAAc,EAAE,MAAM;AAC3D,QAAM,UAAU,OAAO,eAAe,IAAI;AAC1C,QAAM,gBAAgB,SAAS,IAAI,KAAK;AACxC,QAAM,SAAS,gBAAiB,QAAQ,MAAO;AAM/C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,MAEnC;AAAA,wDAAC,SAAI,WAAU,uDAEb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV;AAAA,cACA,QAAO;AAAA,cACP,MAAK;AAAA,cACL,GAAG;AAAA,cACH,IAAI,OAAO;AAAA,cACX,IAAI,OAAO;AAAA;AAAA,UACb;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAC;AAAA,gBACT,QAAQ,KAAK;AAAA,cACf;AAAA,cACA;AAAA,cACA,iBAAiB;AAAA,cACjB,kBAAkB;AAAA,cAClB,eAAc;AAAA,cACd,QAAO;AAAA,cACP,MAAK;AAAA,cACL,GAAG;AAAA,cACH,IAAI,OAAO;AAAA,cACX,IAAI,OAAO;AAAA;AAAA,UACb;AAAA,WACF;AAAA,QACA,+CAAC,SAAI,eAAW,oBAAAA,SAAW,iBAAiB,KAAK,MAAM,GACrD,yDAAC,cAAW,MAAY,MAAK,MAAK,GACpC;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,eAA4C,CAAC,EAAE,OAAO,GAAG,MAAM,MAAM;AACzE,QAAM,oBAAgB,yBAAQ,MAAM;AAClC,UAAM,UAAU,qBAAqB,MAAM,MAAM;AACjD,WAAO,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,MAC1B,GAAG;AAAA,MACH,OAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA,IAC9B,EAAE;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AAEV,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,MACE,+CAAC,SAAI,WAAU,uCACZ,wBAAc,IAAI,CAAC,MAAM,QACxB,gDAAC,gBAAAC,QAAM,UAAN,EACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,KAAK;AAAA,YAEZ;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,KAAK;AAAA,kBACZ,OAAO,KAAK;AAAA,kBACZ,MAAM,KAAK;AAAA;AAAA,cACb;AAAA,cACA,gDAAC,SAAI,WAAU,iBACb;AAAA,gEAAC,UAAK,WAAU,oEACb;AAAA,uBAAK;AAAA,kBAAM;AAAA,mBACd;AAAA,gBACA,+CAAC,UAAK,WAAU,mEACb,eAAK,OACR;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QACC,MAAM,MAAM,SAAS,KACpB,+CAAC,SAAI,WAAU,uDAAsD;AAAA,WApBpD,GAsBrB,CACD,GACH;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,uBAAQ;;;AC1Hf,IAAAC,kBAMO;AACP,IAAAC,qBAA6B;AAC7B,sBAUO;AA6EK,IAAAC,wBAAA;AAxBZ,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,CAAC,WAAW,QAAQ,QAAQ,WAAW,EAAG,QAAO;AAErD,aAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,KAAK,QAAQ;AAAA,UACb,WAAW;AAAA,QACb;AAAA,QAEA;AAAA,yDAAC,SAAI,WAAU,+KACZ,kBAAQ,QAAQ,IAAI,CAAC,UAAe;AACnC,kBAAM,IAAI,OAAO,KAAK,CAACC,OAAMA,GAAE,QAAQ,MAAM,OAAO;AACpD,mBACE,gDAAC,SAAwB,WAAU,2BACjC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,iBAAiB,MAAM,QAAQ,SAAS,GAAG,SAAS,MAAM;AAAA,kBAC5D;AAAA;AAAA,cACF;AAAA,cACA,+CAAC,UAAK,WAAU,iBAAiB,gBAAM,OAAM;AAAA,cAC5C,KACC,+CAAC,UAAK,WAAU,0CACb,YAAE,OACL;AAAA,iBAXM,MAAM,OAahB;AAAA,UAEJ,CAAC,GACH;AAAA,UAEA,+CAAC,SAAI,WAAU,2IAA0I;AAAA;AAAA;AAAA,IAC3J;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAGA,SAAS,uBAAuB;AAC9B,SAAO;AACT;AAIA,IAAM,gBAA8C,CAAC;AAAA,EACnD;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAAA,EACd,UAAU,CAAC,GAAG,MAAM;AAAA,EACpB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,QAAI,0BAA8B,IAAI;AAChE,QAAM,iBAAa,wBAAuB,IAAI;AAC9C,QAAM,sBAAkB,wBAAsB,IAAI;AAClD,QAAM,yBAAqB,wBAA+B,IAAI;AAE9D,iCAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,gBAAgB,WAAW,MAAM;AACnC,6BAAqB,gBAAgB,OAAO;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,eAAW,6BAAY,CAAC,UAAkB;AAClD,UAAM,WAAmC;AAAA;AAAA,MAErC,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AACE,WAAO,SAAS,KAAK,KAAK;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,yBAAQ,MAAM;AACnC,UAAM,UAAU,qBAAqB,OAAO,MAAM;AAClD,WAAO,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MAC3B,GAAG;AAAA,MACH,OAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA,IAC9B,EAAE;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,gBAAY,yBAAQ,MAAM;AAC9B,QAAI,CAAC,iBAAiB,iBAAiB,KAAK,KAAK,UAAU;AACzD,aAAO;AACT,WAAO,KAAK,MAAM,CAAC,aAAa;AAAA,EAClC,GAAG,CAAC,MAAM,aAAa,CAAC;AAExB,QAAM,yBAAqB,6BAAY,CAAC,SAA8B;AACpE,QAAI,gBAAgB,WAAW,MAAM;AACnC,2BAAqB,gBAAgB,OAAO;AAAA,IAC9C;AAEA,oBAAgB,UAAU,sBAAsB,MAAM;AACpD,sBAAgB,UAAU;AAE1B,UAAI,CAAC,MAAM;AACT,YAAI,mBAAmB,YAAY,KAAM;AACzC,2BAAmB,UAAU;AAC7B,mBAAW,IAAI;AACf;AAAA,MACF;AAEA,YAAM,WAA4B;AAAA,QAChC,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK,QACR,IAAI,CAAC,UAAe,OAAO,MAAM,WAAW,EAAE,CAAC,EAC/C,KAAK,GAAG;AAAA,QACX,QAAQ,KAAK,QACV,IAAI,CAAC,UAAe,OAAO,MAAM,SAAS,EAAE,CAAC,EAC7C,KAAK,GAAG;AAAA,MACb;AAEA,YAAM,OAAO,mBAAmB;AAChC,UACE,QACA,KAAK,MAAM,SAAS,KACpB,KAAK,MAAM,SAAS,KACpB,KAAK,UAAU,SAAS,SACxB,KAAK,SAAS,SAAS,QACvB,KAAK,WAAW,SAAS,QACzB;AACA;AAAA,MACF;AAEA,yBAAmB,UAAU;AAC7B,iBAAW,IAAI;AAAA,IACjB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAGL,QAAM,6BAAyB;AAAA,IAC7B,CAAC,EAAE,QAAQ,SAAS,OAAO,WAAW,MAAW;AAC/C,UAAI,CAAC,YAAa,QAAO;AACzB,UAAI,UAAU,WAAW,QAAQ,SAAS,KAAK,YAAY;AACzD,cAAM,YAAY,WAAW;AAC7B,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,sBAAsB;AAC7C,gBAAM,OAAO,KAAK,QAAQ,WAAW,KAAK;AAC1C,gBAAM,OAAO,KAAK,OAAO,WAAW,KAAK;AACzC,6BAAmB,EAAE,GAAG,MAAM,GAAG,MAAM,SAAS,OAAO,SAAS,GAAG,CAAC;AAAA,QACtE;AAAA,MACF,OAAO;AACL,2BAAmB,IAAI;AAAA,MACzB;AACA,aAAO,+CAAC,wBAAqB;AAAA,IAC/B;AAAA,IACA,CAAC,aAAa,kBAAkB;AAAA,EAClC;AAGA,QAAM,oBAAgB,yBAAQ,MAAM;AAClC,QAAI,CAAC,cAAc,YAAY,MAAO,QAAO;AAC7C,WACE,+CAAC,SAAI,WAAU,+BACZ,yBAAe,IAAI,CAAC,MACnB,gDAAC,SAAgB,WAAU,qBACzB;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB,SAAS,EAAE,KAAK,EAAE;AAAA;AAAA,MAC9C;AAAA,MACA,+CAAC,UAAK,WAAU,8DACb,YAAE,OACL;AAAA,SAPQ,EAAE,GAQZ,CACD,GACH;AAAA,EAEJ,GAAG,CAAC,YAAY,SAAS,gBAAgB,QAAQ,CAAC;AAElD,QAAM,YAAY;AAClB,QAAM,YAAY;AAElB,QAAM,cAAc,MAAM;AACxB,QAAI,YAAY,OAAO;AACrB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAc,MAAM,mBAAmB,IAAI;AAAA,UAE3C;AAAA,2DAAC,uCAAoB,OAAM,QAAO,QAChC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,QAAQ,EAAE,KAAK,IAAI,OAAO,GAAG,MAAM,KAAK,QAAQ,EAAE;AAAA,gBAEjD;AAAA,8BACC;AAAA,oBAAC;AAAA;AAAA,sBACC,iBAAgB;AAAA,sBAChB,UAAU;AAAA,sBACV,QAAQ;AAAA,sBACR,SAAS;AAAA;AAAA,kBACX;AAAA,kBAED,YACC,kFACE;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,UAAU;AAAA,wBACV,MAAM,EAAE,MAAM,WAAW,UAAU,GAAG;AAAA,wBACtC,IAAI;AAAA;AAAA,oBACN;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,UAAU;AAAA,wBACV,UAAU;AAAA,wBACV,MAAM,EAAE,MAAM,WAAW,UAAU,GAAG;AAAA;AAAA,oBACxC;AAAA,qBACF;AAAA,kBAEF;AAAA,oBAAC,gBAAAC;AAAA,oBAAA;AAAA,sBACC,SAAS;AAAA,sBACT,QAAQ,EAAE,MAAM,yBAAyB;AAAA,sBACzC,mBAAmB;AAAA;AAAA,kBACrB;AAAA,kBACC,eAAe,IAAI,CAAC,MACnB;AAAA,oBAAC;AAAA;AAAA,sBAEC,SAAS,EAAE;AAAA,sBACX,MAAM,SAAS,EAAE,KAAK;AAAA,sBACtB,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,sBACnB,mBAAmB;AAAA,sBACnB,mBACE,iBAAiB,yBAAyB;AAAA;AAAA,oBANvC,EAAE;AAAA,kBAQT,CACD;AAAA;AAAA;AAAA,YACH,GACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,QAAI,YAAY,aAAa;AAC3B,aACE;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAc,MAAM,mBAAmB,IAAI;AAAA,UAE3C;AAAA,2DAAC,uCAAoB,OAAM,QAAO,QAAQ,IACxC,0DAAC,6BAAU,MAAM,WACf;AAAA,6DAAC,yBAAM,QAAQ,SAAS,MAAI,MAAC;AAAA,cAC7B;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,eAAe,CAAC,EAAE;AAAA,kBAC3B,QAAQ,SAAS,eAAe,CAAC,EAAE,KAAK;AAAA,kBACxC,aAAa;AAAA,kBACb,KAAK;AAAA,kBACL,WAAW,EAAE,GAAG,GAAG,aAAa,EAAE;AAAA,kBAClC,mBAAmB;AAAA,kBACnB,mBAAmB,iBAAiB,yBAAyB;AAAA;AAAA,cAC/D;AAAA,cACC,eACC;AAAA,gBAAC,gBAAAA;AAAA,gBAAA;AAAA,kBACC,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,mBAAmB;AAAA;AAAA,cACrB;AAAA,eAEJ,GACF;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AACA,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,SAAS,iBAAiB,MAAM;AAAA,MAChC,MACE,gDAAC,SAAI,WAAU,+BACZ;AAAA,oBAAY,eACX,gDAAC,SAAI,WAAU,kBACZ;AAAA,sBAAY;AAAA,UACb,gDAAC,SAAI,WAAU,QACb;AAAA,2DAAC,SAAI,WAAU,uDACZ,gBAAM,OACT;AAAA,YACC,MAAM,YACL,+CAAC,SAAI,WAAU,uDACZ,gBAAM,UACT;AAAA,aAEJ;AAAA,WACF;AAAA,QAED,YAAY,SAAS,+CAAC,SAAI,WAAU,QAAQ,sBAAY,GAAE;AAAA,SAC7D;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,wBAAQ;;;AClaf,IAAAC,kBAAkE;AAClE,IAAAC,sBAAuB;;;ACFvB,IAAAC,kBAA+C;AAwBxC,SAAS,WACd,OACA;AAAA,EACE,sBAAsB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAuB,CAAC,GACH;AACrB,QAAM,0BAAsB,6BAAY,MAAM;AAC5C,QAAI,OAAO,iBAAiB,UAAU;AACpC,aAAO;AAAA,IACT;AACA,QAAI,eAAe;AACjB,YAAM,cAAc,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,aAAa;AACvE,UAAI,gBAAgB,IAAI;AACtB,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,sBAAsB;AACxB,YAAM,cAAc,MAAM;AAAA,QACxB,CAAC,SAAS,KAAK,OAAO;AAAA,MACxB;AACA,UAAI,gBAAgB,IAAI;AACtB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,KAAK;AAAA,MACV,KAAK,IAAI,qBAAqB,CAAC;AAAA,MAC/B,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC;AAAA,IAC9B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAS,mBAAmB;AAEtE,QAAM,gBACJ,OAAO,iBAAiB,WAAW,eAAe;AAEpD,QAAM,qBAAiB,yBAAQ,MAAM;AACnC,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AACA,UAAM,OAAO,MAAM,aAAa;AAChC,WAAO,MAAM;AAAA,EACf,GAAG,CAAC,eAAe,OAAO,aAAa,CAAC;AAExC,QAAM,iBAAa;AAAA,IACjB,CAAC,cAAsB;AACrB,YAAM,eAAe,KAAK;AAAA,QACxB,KAAK,IAAI,WAAW,CAAC;AAAA,QACrB,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC;AAAA,MAC9B;AACA,UAAI,OAAO,iBAAiB,UAAU;AACpC,yBAAiB,YAAY;AAAA,MAC/B;AACA,YAAM,OAAO,MAAM,YAAY;AAC/B,iBAAW,cAAc,MAAM,EAAE;AAAA,IACnC;AAAA,IACA,CAAC,cAAc,UAAU,KAAK;AAAA,EAChC;AAEA,QAAM,gBAAY;AAAA,IAChB,CAAC,UAAkB;AACjB,iBAAW,KAAK;AAAA,IAClB;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,eAAW;AAAA,IACf,CAAC,OAAe;AACd,YAAM,MAAM,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,EAAE;AACpD,UAAI,QAAQ,IAAI;AACd,mBAAW,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK;AAAA,EACpB;AAEA,QAAM,eAAW,6BAAY,MAAM;AACjC,eAAW,gBAAgB,CAAC;AAAA,EAC9B,GAAG,CAAC,YAAY,aAAa,CAAC;AAE9B,QAAM,eAAW,6BAAY,MAAM;AACjC,eAAW,gBAAgB,CAAC;AAAA,EAC9B,GAAG,CAAC,YAAY,aAAa,CAAC;AAE9B,QAAM,mBAAe;AAAA,IACnB,MAAM,IAAI,IAAI,oBAAoB,CAAC,CAAC;AAAA,IACpC,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,sBAAkB,yBAAQ,MAAM;AACpC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,mBAClB,iBAAiB,SACjB,KAAK,IAAI,eAAe,CAAC;AAE7B,UAAM,UAAU,KAAK,IAAI,eAAe,MAAM,MAAM;AACpD,WAAQ,UAAU,MAAM,SAAU;AAAA,EACpC,GAAG,CAAC,kBAAkB,eAAe,MAAM,MAAM,CAAC;AAElD,QAAM,eAAW;AAAA,IACf,CAAC,IAAY,UAAkB;AAC7B,UAAI,eAAe;AACjB,eAAO,kBAAkB;AAAA,MAC3B;AACA,aAAO,kBAAkB;AAAA,IAC3B;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,EAC/B;AAEA,QAAM,kBAAc;AAAA,IAClB,CAAC,IAAY,UAAkB;AAC7B,UAAI,aAAa,OAAO,GAAG;AACzB,eAAO,aAAa,IAAI,EAAE;AAAA,MAC5B;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,IACd,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvKA,IAAAC,kBAAqD;AAIrD,IAAM,cAAc;AAQpB,SAAS,iBAA4B;AACnC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,MAAI,WAAW,WAAW,WAAW,UAAU,WAAW,UAAU;AAClE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,eAAwB;AAC/B,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,OAAO,WAAW,8BAA8B,EAAE;AAC3D;AAUA,SAAS,WAAW,MAAuB;AACzC,MAAI,OAAO,aAAa,YAAa;AACrC,QAAM,SAAS,SAAS,WAAW,aAAa,IAAI,SAAS;AAC7D,QAAM,OAAO,SAAS;AACtB,OAAK,UAAU,OAAO,QAAQ,MAAM;AACpC,MAAI,OAAO,iBAAiB,aAAa;AACvC,QAAI;AACF,mBAAa,QAAQ,aAAa,IAAI;AAAA,IACxC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAkBO,SAAS,WAAW;AACzB,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAoB,cAAc;AAC5D,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAA2B,MAAM;AAC3E,UAAM,IAAI,eAAe;AACzB,WAAO,MAAM,WAAY,aAAa,IAAI,SAAS,UAAW;AAAA,EAChE,CAAC;AAGD,uCAAgB,MAAM;AACpB,eAAW,KAAK;AAAA,EAClB,GAAG,CAAC,KAAK,CAAC;AAGV,iCAAU,MAAM;AACd,sBAAkB,UAAU,WAAY,aAAa,IAAI,SAAS,UAAW,KAAK;AAAA,EACpF,GAAG,CAAC,KAAK,CAAC;AAGV,iCAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,QAAI,UAAU,SAAU;AAExB,UAAM,MAAM,OAAO,WAAW,8BAA8B;AAC5D,UAAM,WAAW,MAAM;AACrB,YAAM,SAAS,IAAI;AACnB,eAAS,gBAAgB,UAAU,OAAO,QAAQ,MAAM;AACxD,wBAAkB,SAAS,SAAS,OAAO;AAAA,IAC7C;AAEA,QAAI,iBAAiB,UAAU,QAAQ;AACvC,WAAO,MAAM,IAAI,oBAAoB,UAAU,QAAQ;AAAA,EACzD,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,EAAE,OAAO,gBAAgB,SAAS;AAC3C;;;AF+RY,IAAAC,wBAAA;AAtTZ,IAAMC,eAYF;AAAA,EACF,IAAI;AAAA,IACF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,IACV,KAAK;AAAA,IACL,iBAAiB;AAAA,EACnB;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,IACV,KAAK;AAAA,IACL,iBAAiB;AAAA,EACnB;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,IACV,KAAK;AAAA,IACL,iBAAiB;AAAA,EACnB;AACF;AAEA,IAAM,gBAQF;AAAA,EACF,MAAM;AAAA,IACJ,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,eAAe;AAAA,EACjB;AACF;AAEA,IAAM,aAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AACT;AAEA,IAAM,cAAc,CAAC,UACnB,MACG,MAAM,GAAG,EACT,IAAI,CAAC,UAAU;AACd,MAAI,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,UAAU,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,WAAO,MAAM,QAAQ,WAAW,KAAK;AAAA,EACvC;AACA,MAAI,MAAM,WAAW,cAAc,GAAG;AACpC,WAAO,MAAM,QAAQ,gBAAgB,UAAU;AAAA,EACjD;AACA,SAAO;AACT,CAAC,EACA,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,IAAM,YAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,qBAAkD;AAAA,EACtD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,6BAA0D;AAAA,EAC9D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AACO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,QAAQ,WAAW,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,eAAW,wBAAsD,CAAC,CAAC;AACzE,QAAM,2BAAuB,wBAA8B,IAAI;AAC/D,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAmB,CAAC,CAAC;AAErE,QAAM,UAAU,sBAAsB,IAAI;AAC1C,QAAM,YAAYA,aAAW,IAAI;AACjC,QAAM,0BAA0B,mBAAmB,IAAI;AACvD,QAAM,kCAAkC,2BAA2B,IAAI;AACvE,QAAM,eAAe,cAAc,OAAO;AAC1C,QAAM,gBAAgB,eAAe,CAAC;AACtC,QAAM,gBAAY;AAAA,IAChB,MAAM,IAAI,IAAI,iBAAiB,CAAC,CAAC;AAAA,IACjC,CAAC,aAAa;AAAA,EAChB;AACA,QAAM,uBAAuB,YAAY,QAAQ,aAAa;AAC9D,QAAM,yBAAyB,YAAY,QAAQ,QAAQ;AAE3D,QAAM,kBAAkB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,MAAM,eAAe,CAAC;AACxE,QAAM,oBACJ,KAAK,MAAM,kBAAkB,KAAK,IAAI,IAAI,iBAAiB,CAAC,IAC5D,KAAK,IAAI,IAAI,iBAAiB;AAEhC,QAAM,aAAa,MAAM,MAAM,YAAY;AAE3C,QAAM,WAAW,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1C,UAAM,aAAa,KAAK,MAAM,OAAO,KAAK;AAC1C,UAAM,gBAAgB,MAAM,SAAS,YAAY,KAAK;AACtD,UAAM,mBAAmB,MAAM,YAAY,YAAY,KAAK;AAC5D,UAAM,SACJ,KAAK,WACJ,gBAAgB,WAAW,mBAAmB,cAAc;AAI/D,UAAM,eACH,KAAK,SAAS,KAAK,WAAW,cAAc,qBAC7C,CAAC;AAEH,UAAM,gBACJ,YAAY,YACR,iGACA;AAEN,UAAM,kBAAc,oBAAAC;AAAA,MAClB;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,KAAK,YAAY;AAAA,MACjB,WAAW,YAAY;AAAA,QACrB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA,WAAW,eAAe;AAAA,QACxB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,MACA,WAAW,aAAa;AAAA,QACtB;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,MACA,WAAW,WACT;AAAA,IACJ;AAEA,UAAM,mBACJ,cAAc,aACV,oBAAAA;AAAA,MACE;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,IACA;AAEN,UAAM,YACJ,kBAAkB,SACd;AAAA,MACE,WACE,OAAO,kBAAkB,WACrB,GAAG,aAAa,OAChB;AAAA,IACR,IACA;AAEN,UAAM,WAAW,KAAK,QAAQ,WAAW,MAAM;AAC/C,UAAM,gBAAgB,UAAU,IAAI,UAAU;AAE9C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACD,WAAS,QAAQ,SAAS,SAAS;AAEnC,uCAAgB,MAAM;AACpB,QAAI,gBAAgB,YAAY;AAC9B,UAAI,iBAAiB,WAAW,GAAG;AACjC,4BAAoB,CAAC,CAAC;AAAA,MACxB;AACA;AAAA,IACF;AAEA,UAAM,UAAU,MAAM;AACpB,YAAM,YAAY,qBAAqB;AACvC,UAAI,CAAC,UAAW;AAChB,YAAM,QAAQ,SAAS;AACvB,UAAI,MAAM,SAAS,GAAG;AACpB,4BAAoB,CAAC,CAAC;AACtB;AAAA,MACF;AACA,YAAM,gBAAgB,UAAU,sBAAsB;AACtD,YAAM,UAAoB,CAAC;AAC3B,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AACA,cAAM,OAAO,KAAK,sBAAsB;AACxC,gBAAQ,KAAK,KAAK,MAAM,KAAK,SAAS,IAAI,cAAc,GAAG;AAAA,MAC7D;AACA,YAAM,WAAW,QACd,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,OAAO,QAAQ,QAAQ,MAAM,CAAC,IAAI,KAAK;AAC/C,0BAAoB,CAAC,SAAS;AAC5B,YACE,KAAK,WAAW,SAAS,UACzB,KAAK,MAAM,CAAC,OAAO,QAAQ,UAAU,SAAS,GAAG,CAAC,GAClD;AACA,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,YAAQ;AACR,WAAO,iBAAiB,UAAU,OAAO;AACzC,WAAO,MAAM,OAAO,oBAAoB,UAAU,OAAO;AAAA,EAC3D,GAAG,CAAC,aAAa,OAAO,kBAAkB,eAAe,MAAM,YAAY,CAAC;AAE5E,QAAM,gBACJ,mBAAmB,sBACjB,gDAAC,SAAI,WAAU,mCACZ;AAAA,2BACC,gDAAC,SAAI,WAAU,gGACb;AAAA,qDAAC,UAAM,2BAAiB,YAAW;AAAA,MACnC,gDAAC,UAAM;AAAA;AAAA,QAAkB;AAAA,SAAC;AAAA,OAC5B;AAAA,IAED,mBACC,+CAAC,SAAI,WAAU,uFACb;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAA;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,QACA,OAAO,EAAE,OAAO,GAAG,eAAe,IAAI;AAAA;AAAA,IACxC,GACF;AAAA,KAEJ,IACE;AAEN,QAAM,gBAAgB,MAAM;AAC1B,UAAM,cAAc,eAAe,UAAU;AAC7C,UAAM,aAAa,UAAU,IAAI;AACjC,QAAI,iBAAiB,cAAc,UAAU;AAC7C,QAAI,gBACF,mBAAmB,SACf,mBACA,mBAAmB,UACjB,GAAG,aAAa,CAAC,OACjB,IAAI,UAAU;AACtB,QAAI,iBACF,mBAAmB,SACf,UACA,mBAAmB,UACjB,mBACA,IAAI,UAAU;AAEtB,WACE,+CAAC,SAAI,eAAW,oBAAAA,SAAW,qBAAqB,WAAW,GACxD,mBAAS,IAAI,CAAC,MAAM,QAAQ;AAC3B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,YAAM,UAAU,iBAAiB,CAAC,KAAK,WAAW,WAAW;AAE7D,YAAM,cAAc,MAAM;AACxB,YAAI,CAAC,iBAAiB,KAAK,SAAU;AACrC,cAAM,UAAU,GAAG;AACnB,sBAAc,MAAM,GAAG;AAAA,MACzB;AAEA,UAAI,WAAW,gBAAgB,cAAc,UAAU,MAAM;AAC7D,UAAI,YACF,gBAAgB,cAAc,UAAU,MAAM,SAAS,SAAS;AAClE,UAAI,cAAc;AAClB,UAAI,CAAC,cAAc;AACjB,YAAI,mBAAmB,QAAQ;AAC7B,sBAAY;AACZ,qBAAW;AACX,wBAAc;AACd,0BAAgB;AAAA,QAClB;AACA,YAAI,mBAAmB,UAAU;AAC/B,qBAAW,cAAc,UAAU,MAAM;AACzC,sBAAY,cAAc,UAAU,MAAM,SAAS,SAAS;AAC5D,2BAAiB,cAAc,UAAU;AACzC,2BAAiB;AAAA,QACnB;AACA,YAAI,mBAAmB,SAAS;AAC9B,qBAAW,cAAc,UAAU,MAAM;AACzC,sBAAY;AAGZ,0BAAgB;AAChB,2BAAiB,eAAe,aAAa,CAAC;AAAA,QAChD;AAAA,MACF;AACA,YAAM,eAAe,SAAS,MAAM,CAAC;AACrC,YAAM,oBAAoB,cAAc,eAAe;AACvD,YAAM,mBAAmB;AAEzB,YAAM,kBACJ,CAAC,gBACD,cAAc,UACd,mBAAmB,WACnB,MAAM,SAAS,SAAS;AAC1B,YAAM,qBAAqB;AAE3B,YAAM,mBAAmB,kBACvB,+CAAC,SAAI,WAAW,sBAAsB,WAAW,IAC/C;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UAEC,wBAAc,cACb;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cACA,OAAO,EAAE,OAAO,qBAAqB,SAAS,KAAK;AAAA;AAAA,UACrD;AAAA;AAAA,MAEJ,GACF,IACE;AAEJ,YAAM,gBAAgB,WACpB;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA;AAAA,YACA,cAAc,cAAc,oBACxB,yBACA;AAAA,UACN;AAAA,UACA,OAAO,EAAE,MAAM,GAAG,aAAa,IAAI,OAAO,eAAe;AAAA;AAAA,MAC3D,IACE;AAEJ,YAAM,iBAAiB,YACrB;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA;AAAA,YACA,cAAc,cAAc,mBACxB,yBACA;AAAA,UACN;AAAA,UACA,OAAO,EAAE,OAAO,GAAG,cAAc,IAAI,OAAO,eAAe;AAAA;AAAA,MAC7D,IACE;AAEJ,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,yBAAyB,mBAAmB,SAAS,iBAAiB,mBAAmB,UAAU,6BAA6B,6BAA6B;AAAA,UAEvK;AAAA;AAAA,YACD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,YAAY,WAAW,WAAW;AAAA,gBACxC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA,YAAY,YACV,CAAC,KAAK,YACN;AAAA,kBACF,YAAY,YACV,KAAK,YACL;AAAA,gBACJ;AAAA,gBACA,SAAS;AAAA,gBACT,gBACE,MAAM,SAAS,YAAY,GAAG,IAAI,SAAS;AAAA,gBAE7C,UAAU,KAAK;AAAA,gBAEd;AAAA,6BAAW,WAAW,UAAU,IAAI,IAAI,MAAM;AAAA,kBAC9C,iBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAO;AAAA,sBACP,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,OAAO;AAAA,sBACP,OAAO;AAAA;AAAA,kBACT;AAAA;AAAA;AAAA,YAEJ;AAAA,YACC;AAAA,YACA;AAAA;AAAA;AAAA,QAnCI,GAAG,UAAU;AAAA,MAoCpB;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AAEA,QAAM,mBAAmB,MAAM;AAC7B,UAAM,cAAc,KAAK,IAAI,GAAG,MAAM,MAAM;AAE5C,WACE,gDAAC,SAAI,eAAW,oBAAAA,SAAW,0BAA0B,eAAe,GACjE;AAAA,oBAAc;AAAA,MACf;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,qBAAqB,UAAU,WAAW;AAAA,UAC5C;AAAA,UAEC,mBAAS,IAAI,CAAC,SAAS;AACtB,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,IAAI;AACJ,kBAAM,UAAU,iBAAiB,CAAC,KAAK,WAAW,WAAW;AAE7D,kBAAM,cAAc,MAAM;AACxB,kBAAI,CAAC,iBAAiB,KAAK,SAAU;AACrC,oBAAM,UAAU,KAAK;AACrB,4BAAc,MAAM,KAAK;AAAA,YAC3B;AAEA,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAM,YAAY,WAAW,WAAW;AAAA,gBACxC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,KAAK,YAAY;AAAA,kBACjB,iBACE,CAAC,KAAK,YACN;AAAA,gBACJ;AAAA,gBACA,SAAS;AAAA,gBACT,gBACE,MAAM,SAAS,YAAY,KAAK,IAAI,SAAS;AAAA,gBAE/C,UAAU,KAAK;AAAA,gBAEf;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO;AAAA,sBAEP;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAA;AAAA,8BACT,UAAU;AAAA,8BACV,aAAa,wBACX,WAAW,YACX;AAAA,4BACJ;AAAA,4BAEC,eAAK;AAAA;AAAA,wBACR;AAAA,wBACC,KAAK,YACJ,+CAAC,SAAI,WAAW,UAAU,UAAW,eAAK,UAAS;AAAA,wBAEpD,aAAa,mBAAmB,KAAK,cACpC,+CAAC,SAAI,WAAW,UAAU,aACvB,eAAK,aACR,IACE;AAAA;AAAA;AAAA,kBACN;AAAA,kBACA,gDAAC,SAAI,WAAU,4BACZ;AAAA,yBAAK,gBACJ,+CAAC,SAAI,WAAW,UAAU,UACvB,eAAK,eACR,IACE;AAAA,oBACH,cAAc,WACZ,qBAAqB,aAAa,kBACjC,+CAAC,SAAI,WAAW,kBAAkB;AAAA,qBAExC;AAAA;AAAA;AAAA,cAhDK,GAAG,UAAU;AAAA,YAiDpB;AAAA,UAEJ,CAAC;AAAA;AAAA,MACH;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,iBAAiB,MACrB;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAA,SAAW,gCAAgC,eAAe;AAAA,MAEpE,mBAAS,IAAI,CAAC,MAAM,UAAU;AAC7B,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,IAAI;AACJ,cAAM,UAAU,iBAAiB,CAAC,KAAK,WAAW,WAAW;AAC7D,cAAM,UAAU,iBAAiB,CAAC,KAAK,WAAW,WAAW;AAC7D,cAAM,gBAAgB,iBAAiB,KAAK,KAAK;AACjD,cAAM,gBACJ,cAAc,UACd,QAAQ,SAAS,SAAS,KAC1B,gBAAgB;AAElB,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,UAAU,KAAK;AAAA,cACf,UAAU,SAAS,SAAS,KAAK;AAAA,cACjC;AAAA,YACF;AAAA,YAEA;AAAA,8DAAC,SAAI,WAAU,uCACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,KAAK,CAAC,OAAO;AACX,0BAAI,gBAAgB,YAAY;AAC9B,iCAAS,QAAQ,KAAK,IAAI;AAAA,sBAC5B;AAAA,oBACF;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAM,YAAY,WAAW,WAAW;AAAA,wBACxC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA;AAAA,0BACA,YAAY,YACV,CAAC,KAAK,YACN;AAAA,0BACF,YAAY,YACV,KAAK,YACL;AAAA,wBACJ;AAAA,wBACA,SAAS,MAAM;AACb,8BAAI,CAAC,iBAAiB,KAAK,SAAU;AACrC,gCAAM,UAAU,KAAK;AACrB,wCAAc,MAAM,KAAK;AAAA,wBAC3B;AAAA,wBACA,gBACE,MAAM,SAAS,YAAY,KAAK,IAAI,SAAS;AAAA,wBAE/C,UAAU,KAAK;AAAA,wBAEd;AAAA,qCAAW,WAAW,UAAU,IAAI,IAAI,QAAQ;AAAA,0BAChD,iBACC;AAAA,4BAAC;AAAA;AAAA,8BACC,SAAO;AAAA,8BACP,SAAQ;AAAA,8BACR,MAAK;AAAA,8BACL,WAAU;AAAA,8BACV,OAAO;AAAA,8BACP,OAAO;AAAA;AAAA,0BACT;AAAA;AAAA;AAAA,oBAEJ;AAAA;AAAA,gBACF;AAAA,gBACC,iBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF;AAAA,oBACA,OAAO;AAAA,sBACL,KAAK,GAAG,UAAU,IAAI,CAAC;AAAA,sBACvB,QAAQ,GAAG,aAAa;AAAA,oBAC1B;AAAA,oBAEC,wBAAc,cAAc,eAC3B;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA;AAAA,wBACF;AAAA;AAAA,oBACF;AAAA;AAAA,gBAEJ;AAAA,iBAEJ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,YAAY,WAAW,WAAW;AAAA,kBACxC,WAAU;AAAA,kBACV,SAAS,MAAM;AACb,wBAAI,CAAC,iBAAiB,KAAK,SAAU;AACrC,0BAAM,UAAU,KAAK;AACrB,kCAAc,MAAM,KAAK;AAAA,kBAC3B;AAAA,kBACA,gBACE,MAAM,SAAS,YAAY,KAAK,IAAI,SAAS;AAAA,kBAE/C,UAAU,KAAK;AAAA,kBAEf;AAAA,mEAAC,SAAI,WAAW,UAAU,OAAO,OAAO,WACrC,eAAK,OACR;AAAA,oBACC,KAAK,YACJ,+CAAC,SAAI,WAAW,UAAU,UAAW,eAAK,UAAS;AAAA,oBAEpD,KAAK,eACJ,+CAAC,SAAI,WAAW,UAAU,aAAc,eAAK,aAAY;AAAA,oBAE1D,KAAK,iBACJ,+CAAC,SAAI,WAAW,UAAU,UAAW,eAAK,eAAc;AAAA;AAAA;AAAA,cAE5D;AAAA;AAAA;AAAA,UApGK;AAAA,QAqGP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAGF,QAAM,aAAa,gBAAgB;AAEnC,QAAM,UAAU,YAAY,WAC1B,+CAAC,SAAI,WAAU,4DACZ,sBAAY,aACf;AAGF,QAAM,uBACJ,mBAAmB,SACf,YACA,mBAAmB,UACjB,YACA;AAER,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,aAAa,UAAU;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,aAAW;AAAA,MACX;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,qBACC,kFACG;AAAA,2BAAiB;AAAA,UACjB;AAAA,WACH,IAEA,kFACG;AAAA,yBAAe;AAAA,UACf;AAAA,WACH;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAEC,WACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAO;AAAA,YACP,OAAO;AAAA,YACP,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAO;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,kBAAQ;;;AGp1Bf,IAAAC,kBAA4D;AAC5D,IAAAC,sBAAuB;AA6rBjB,IAAAC,wBAAA;AArcN,IAAM,uBAAuB,CAAC,SAA4B;AACxD,MAAI,SAAS,aAAa,SAAS,WAAW,SAAS,UAAU,SAAS,UAAU,SAAS,SAAS;AACpG,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,YAAY,IAAI,gBAAgB,IAAI,qBAAqB,IAAI,eAAe,IAAI,oBAAoB,IAAI;AAC3H;AAGA,SAAS,iBAAiB,OAA0B;AAClD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IAAqB,KAAK;AACjC,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,eAAe,OAA0B;AAChD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IAAiD,KAAK;AAC7D,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,oBAAoB,OAA0B;AACrD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IAAsF,KAAK;AAClG,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qBAAqB,OAA0B;AACtD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IAA4C,KAAK;AACxD,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,wBAAwB,OAA0B;AACzD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IAA2B,KAAK;AACvC,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,0BAA0B,OAA0B;AAC3D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IAAuE,KAAK;AACnF,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,qBAAmD;AAAA,EACvD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,IAAM,qBAGF;AAAA,EACF,SAAS,EAAE,MAAM,QAAQ,OAAO,QAAQ,iBAAiB,SAAS;AAAA,EAClE,SAAS,EAAE,MAAM,QAAQ,OAAO,QAAQ,iBAAiB,OAAO;AAAA,EAChE,SAAS,EAAE,MAAM,QAAQ,OAAO,QAAQ,iBAAiB,SAAS;AAAA,EAClE,UAAU,EAAE,MAAM,QAAQ,OAAO,QAAQ,iBAAiB,SAAS;AAAA,EACnE,MAAM,EAAE,MAAM,QAAQ,OAAO,QAAQ,iBAAiB,SAAS;AACjE;AAEA,IAAM,mBAAiD;AAAA,EACrD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAEA,IAAM,qBAAmD;AAAA,EACvD,SACE;AAAA,EACF,SACE;AAAA,EACF,SACE;AAAA,EACF,UACE;AAAA,EACF,MAAM;AACR;AAEA,IAAM,iBAGF;AAAA,EACF,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,qBAGF;AAAA,EACF,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,UACxB,QAAQ,eAAe,KAAK,IAAI;AAClC,IAAM,uBAAuB,CAAC,UAC5B,QAAQ,mBAAmB,KAAK,IAAI;AAEtC,IAAM,cAA4D;AAAA,EAChE,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AACX;AAEA,SAAS,aACP,KACA,QACA,OACiB;AACjB,MAAI,OAAO,QAAQ;AACjB,WAAO,OAAO,OAAO,KAAK,KAAK;AAAA,EACjC;AAEA,MAAI,OAAO,UAAU;AACnB,QAAI,OAAO,OAAO,aAAa,YAAY;AACzC,aAAO,OAAO,SAAS,KAAK,KAAK;AAAA,IACnC;AAEA,WAAQ,IACN,OAAO,QACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cACP,KACA,OACA,QACiB;AACjB,MAAI,QAAQ;AACV,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AAEA,MAAI,OAAQ,IAAgC,OAAO,aAAa;AAC9D,WAAO,OAAQ,IAAgC,EAAE;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,OACA,UACA,UACA;AACA,MAAI,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,QAA6B,CAAC;AACpC,MAAI,UAAU;AACZ,UAAM,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAC3D,MAAI,aAAa;AACf,UAAM,WAAW,OAAO,aAAa,WAAW,GAAG,QAAQ,OAAO;AACpE,MAAI,aAAa,QAAW;AAC1B,UAAM,WAAW,OAAO,aAAa,WAAW,GAAG,QAAQ,OAAO;AAElE,QAAI,CAAC,OAAO;AACV,YAAM,QAAQ,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAwC;AACpE,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAGA,SAAS,WAAW,EAAE,SAAS,GAA0B;AACvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACP,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MACA,eAAY;AAAA,MAEZ;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,eAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB;AAAA,EACA,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,GAAkB;AAChB,QAAM,6BAA6B,CAAC,WAA2B;AAC7D,QAAI,OAAO,aAAa,OAAO;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,kBAAkB;AAAA,EAClC;AAEA,QAAM,iBAAiB,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC;AAC9C,QAAM,sBACJ,eAAe,cACf,gBACC,iBAAiB,UAAU,YAAY,UAAU;AACpD,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,CAAC,cAAc,eAAe,QAAI;AAAA,IACtC,eAAe;AAAA,EACjB;AAEA,QAAM,eAAe,aAAa;AAGlC,QAAM,CAAC,eAAe,gBAAgB,QAAI;AAAA,IACxC,MAAM;AACJ,YAAM,OAAgC,CAAC;AACvC,YAAM,SAAS,eAAe,oBAAoB;AAClD,iBAAW,OAAO,WAAW,CAAC,GAAG;AAC/B,aAAK,IAAI,EAAE,IAAI,SAAS,IAAI,EAAE,KAAK,2BAA2B,GAAG;AAAA,MACnE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,iCAAU,MAAM;AACd,UAAM,SAAS,eAAe,oBAAoB;AAClD,QAAI,CAAC,OAAQ;AACb,qBAAiB,CAAC,SAAS;AACzB,YAAM,OAAO,EAAE,GAAG,KAAK;AACvB,iBAAW,OAAO,WAAW,CAAC,GAAG;AAC/B,aAAK,IAAI,EAAE,IACT,OAAO,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,2BAA2B,GAAG;AAAA,MACpE;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EAEH,GAAG,CAAC,sBAAsB,eAAe,gBAAgB,CAAC;AAE1D,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAS,KAAK;AACtD,QAAM,kBAAc,wBAAuB,IAAI;AAG/C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,0BAEhD,MAAM;AACN,UAAM,OAA+B,CAAC;AACtC,UAAM,cAAc,eAAe,gBAAgB;AACnD,QAAI,aAAa;AACf,aAAO,OAAO,MAAM,WAAW;AAAA,IACjC,OAAO;AACL,iBAAW,OAAO,WAAW,CAAC,GAAG;AAC/B,YAAI,OAAO,IAAI,UAAU,UAAU;AACjC,eAAK,IAAI,EAAE,IAAI,IAAI;AAAA,QACrB,WACE,OAAO,IAAI,UAAU,YACrB,kBAAkB,KAAK,IAAI,KAAK,GAChC;AACA,eAAK,IAAI,EAAE,IAAI,WAAW,IAAI,KAAK;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAGD,iCAAU,MAAM;AACd,UAAM,cAAc,eAAe,gBAAgB;AACnD,QAAI,CAAC,YAAa;AAClB,yBAAqB,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,YAAY,EAAE;AAAA,EAE9D,GAAG,CAAC,kBAAkB,eAAe,YAAY,CAAC;AAGlD,QAAM,aAAS,wBAAoD,CAAC,CAAC;AACrE,QAAM,kBAAc,wBAIV,IAAI;AACd,QAAM,4BAAwB,wBAA+B,CAAC,CAAC;AAG/D,iCAAU,MAAM;AACd,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoB,CACxB,GACA,OACA,gBACG;AACH,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAIlB,QAAI,gBAAgB,EAAE,GAAG,kBAAkB;AAC3C,QAAI,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AAC3C,iBAAW,OAAO,gBAAgB;AAChC,cAAM,KAAK,OAAO,QAAQ,IAAI,EAAE;AAChC,YAAI,GAAI,eAAc,IAAI,EAAE,IAAI,GAAG;AAAA,MACrC;AACA,2BAAqB,aAAa;AAAA,IACpC;AAEA,UAAM,aACJ,cAAc,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG,eAAe;AAChE,gBAAY,UAAU,EAAE,OAAO,QAAQ,EAAE,SAAS,WAAW;AAC7D,0BAAsB,UAAU,EAAE,GAAG,cAAc;AAEnD,UAAM,cAAc,CAAC,YAAwB;AAC3C,UAAI,CAAC,YAAY,QAAS;AAC1B,YAAM,WAAW,KAAK;AAAA,QACpB;AAAA,QACA,YAAY,QAAQ,cACjB,QAAQ,UAAU,YAAY,QAAQ;AAAA,MAC3C;AACA,4BAAsB,UAAU;AAAA,QAC9B,GAAG,sBAAsB;AAAA,QACzB,CAAC,YAAY,QAAQ,KAAK,GAAG;AAAA,MAC/B;AACA,2BAAqB,EAAE,GAAG,sBAAsB,QAAQ,CAAC;AAAA,IAC3D;AAEA,UAAM,YAAY,MAAM;AACtB,eAAS,oBAAoB,aAAa,WAAW;AACrD,eAAS,oBAAoB,WAAW,SAAS;AACjD,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AACjC,4BAAsB,sBAAsB,OAAO;AACnD,8BAAwB;AAAA,QACtB,GAAG,oBAAoB;AAAA,QACvB,cAAc,sBAAsB;AAAA,MACtC,CAAC;AACD,kBAAY,UAAU;AAAA,IACxB;AAEA,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AACjC,aAAS,iBAAiB,aAAa,WAAW;AAClD,aAAS,iBAAiB,WAAW,SAAS;AAAA,EAChD;AAIA,QAAM,iBACJ,oBAAoB,OAAO,KAAK,iBAAiB,EAAE,SAAS;AAG9D,QAAM,CAAC,uBAAuB,wBAAwB,QAAI,0BAExD,eAAe,iBAAiB,wBAAwB,CAAC,CAAC;AAC5D,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,0BAAS,KAAK;AAC5D,QAAM,qBAAiB,wBAAuB,IAAI;AAIlD,QAAM,0BAAsB,wBAAsB,CAAC,CAAC;AAEpD,QAAM,qBAAqB,CAAC,OAAe,QAAiC;AAC1E,6BAAyB,CAAC,SAAS;AACjC,YAAM,OAAO,EAAE,GAAG,KAAK;AACvB,UAAI,QAAQ,KAAM,QAAO,KAAK,KAAK;AAAA,UAC9B,MAAK,KAAK,IAAI;AACnB,8BAAwB,IAAI;AAC5B,8BAAwB;AAAA,QACtB,GAAG,oBAAoB;AAAA,QACvB,eAAe;AAAA,MACjB,CAAC;AACD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,OAAO,KAAK,qBAAqB,EAAE,SAAS;AAGrE,QAAM,CAAC,iBAAiB,kBAAkB,QAAI;AAAA,IAC5C,eAAe,WAAW,kBAAkB;AAAA,EAC9C;AACA,QAAM,CAAC,gBAAgB,iBAAiB,QAAI;AAAA,IAC1C,CAAC;AAAA,EACH;AACA,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAS,KAAK;AAC1D,QAAM,CAAC,sBAAsB,uBAAuB,QAAI;AAAA,IACtD,eAAe,mBAAmB,mBAAmB;AAAA,EACvD;AACA,QAAM,oBAAgB,wBAAuB,IAAI;AAEjD,QAAM,kBAAkB,WAAW;AACnC,QAAM,0BAA0B,mBAAmB;AAKnD,sBAAoB,UAAU;AAAA,IAC5B,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAGA,QAAM,sBAAkB,yBAAQ,MAAM;AACpC,QAAI,CAAC,iBAAiB,cAAc,WAAW,EAAG,QAAO;AAEzD,UAAM,SAAS,oBAAI,IAAa;AAChC,kBAAc,QAAQ,CAAC,SAAS;AAE9B,aAAO,IAAI,IAAI;AAGf,UAAI,QAAQ;AAGV,eAAO,IAAI,OAAO,MAAM,EAAE,CAAC;AAAA,MAC7B,WAAW,OAAQ,KAAiC,OAAO,aAAa;AACtE,cAAM,QAAS,KAAiC;AAChD,eAAO,IAAI,OAAO,KAAK,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,MAAM,CAAC;AAG1B,iCAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,UAAM,UAAU,CAAC,MAAkB;AACjC,UACE,YAAY,WACZ,CAAC,YAAY,QAAQ,SAAS,EAAE,MAAc,GAC9C;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,OAAO;AAC9C,WAAO,MAAM,SAAS,oBAAoB,aAAa,OAAO;AAAA,EAChE,GAAG,CAAC,YAAY,CAAC;AAEjB,iCAAU,MAAM;AACd,QAAI,CAAC,eAAgB;AACrB,UAAM,UAAU,CAAC,MAAkB;AACjC,UACE,cAAc,WACd,CAAC,cAAc,QAAQ,SAAS,EAAE,MAAc,GAChD;AACA,0BAAkB,KAAK;AAAA,MACzB;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,OAAO;AAC9C,WAAO,MAAM,SAAS,oBAAoB,aAAa,OAAO;AAAA,EAChE,GAAG,CAAC,cAAc,CAAC;AAEnB,iCAAU,MAAM;AACd,QAAI,CAAC,gBAAiB;AACtB,UAAM,UAAU,CAAC,MAAkB;AACjC,UACE,eAAe,WACf,CAAC,eAAe,QAAQ,SAAS,EAAE,MAAc,GACjD;AACA,2BAAmB,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,aAAS,iBAAiB,aAAa,OAAO;AAC9C,WAAO,MAAM,SAAS,oBAAoB,aAAa,OAAO;AAAA,EAChE,GAAG,CAAC,eAAe,CAAC;AAGpB,QAAM,mBAAmB,CAAC,WAA2B;AACnD,QAAI,CAAC,OAAO,UAAU;AACpB;AAAA,IACF;AAEA,UAAM,gBAAgB;AAAA,MACpB,cAAc,aAAa,OAAO,KAAK,aAAa,YAAY;AAAA,IAClE;AAEA,UAAM,WAAW,gBACb,EAAE,UAAU,OAAO,IAAI,WAAW,cAAc,IAChD;AAEJ,QAAI,CAAC,WAAW;AACd,sBAAgB,QAAQ;AAAA,IAC1B;AAEA,QAAI,cAAc;AAChB,mBAAa,QAAQ;AAAA,IACvB;AAAA,EACF;AAGA,QAAM,oBAAoB,CAAC,aAA4B;AACrD,uBAAmB,QAAQ;AAC3B,sBAAkB,CAAC,CAAC;AACpB,sBAAkB,QAAQ;AAC1B,4BAAwB;AAAA,MACtB,GAAG,oBAAoB;AAAA,MACvB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,iBAAa,yBAAQ,MAAM;AAC/B,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,SAAS,KAAK,CAAC,QAAQ,IAAI,OAAO,aAAa,QAAQ;AAEtE,QAAI,CAAC,UAAW,CAAC,OAAO,YAAY,CAAC,OAAO,UAAU,CAAC,OAAO,WAAY;AACxE,aAAO;AAAA,IACT;AAKA,UAAM,WAAW,OAAO,YACpB,CAAC,QAAW,OAAO,UAAW,GAAG,IACjC,OAAO,WACL,CAAC,KAAQ,UAAkB;AACzB,UAAI,OAAO,OAAO,aAAa;AAC7B,eAAO,OAAO,SAAS,KAAK,KAAK;AACnC,aAAQ,IAAgC,OAAO,QAAkB;AAAA,IACnE,IACA,CAAC,KAAQ,UACP,OAAO,SAAS,OAAO,OAAO,KAAK,KAAK,IAAI;AAEpD,UAAM,SAAS,CAAC,GAAG,IAAI;AACvB,WAAO,KAAK,CAAC,GAAG,MAAM;AACpB,YAAM,SAAS,SAAS,GAAG,KAAK,QAAQ,CAAC,CAAC;AAC1C,YAAM,SAAS,SAAS,GAAG,KAAK,QAAQ,CAAC,CAAC;AAE1C,UAAI,WAAW,QAAQ;AACrB,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,CAAC,QAAiC;AACnD,YAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,YAAI,OAAO,QAAQ,SAAU,QAAO,OAAO,GAAG;AAC9C,YAAI,OAAO,QAAQ,UAAW,QAAO,OAAO,GAAG;AAC/C,eAAO;AAAA,MACT;AAEA,YAAM,cACJ,OAAO,WAAW,WACd,SACA,WAAW,MAAyB,EAAE,YAAY;AACxD,YAAM,cACJ,OAAO,WAAW,WACd,SACA,WAAW,MAAyB,EAAE,YAAY;AAExD,UAAI,cAAc,aAAa;AAC7B,eAAO,aAAa,cAAc,QAAQ,KAAK;AAAA,MACjD;AAEA,aAAO,aAAa,cAAc,QAAQ,IAAI;AAAA,IAChD,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,SAAS,MAAM,aAAa,CAAC;AAG/C,QAAM,mBAAmB,WAAW,CAAC;AACrC,QAAM,cAAc,iBAAiB,OAAO,CAAC,QAAQ,CAAC,IAAI,eAAe;AAGzE,QAAM,kBACJ,cAAc,QACd,CAAC,WACD,YAAY,KAAK,CAAC,QAAQ,IAAI,cAAc,KAAK;AAGnD,QAAM,iBAAiB,iBAAiB;AAAA,IACtC,CAAC,QAAQ,cAAc,IAAI,EAAE,MAAM,SAAS,IAAI,OAAO;AAAA,EACzD;AACA,QAAM,qBAAqB,YAAY,KAAK,CAAC,QAAQ,IAAI,aAAa,KAAK;AAQ3E,QAAM,4BAAwB,yBAAQ,MAAwB;AAC5D,UAAM,OAAyB,CAAC;AAChC,UAAM,SAA2B,CAAC;AAClC,UAAM,QAA0B,CAAC;AACjC,mBAAe,QAAQ,CAAC,KAAK,MAAM;AACjC,YAAM,YAAY,sBAAsB,IAAI,EAAE,KAAK,IAAI;AACvD,UAAI,cAAc,QAAQ;AACxB,aAAK,KAAK,GAAG;AAAA,MACf,WACE,cAAc,WACb,iBAAiB,MAAM,eAAe,SAAS,GAChD;AACA,cAAM,KAAK,GAAG;AAAA,MAChB,OAAO;AACL,eAAO,KAAK,GAAG;AAAA,MACjB;AAAA,IACF,CAAC;AACD,WAAO,CAAC,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK;AAAA,EACtC,GAAG,CAAC,gBAAgB,uBAAuB,aAAa,CAAC;AAGzD,QAAM,kBAAc,yBAAQ,MAA8B;AACxD,QAAI,CAAC,gBAAiB,QAAO;AAC7B,UAAM,SAAS,iBAAiB,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe;AACpE,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,SAA0B,CAAC;AACjC,UAAM,WAAW,oBAAI,IAAoB;AAEzC,eAAW,QAAQ,CAAC,KAAK,QAAQ;AAE/B,UAAI,UAAU;AACd,UAAI,OAAO,YAAY;AACrB,kBAAU,OAAO,WAAW,GAAG;AAAA,MACjC,WAAW,OAAO,UAAU;AAC1B,cAAM,SACJ,OAAO,OAAO,aAAa,aACvB,OAAO,SAAS,KAAK,GAAG,IACvB,IAAgC,OAAO,QAAkB;AAChE,YAAI,OAAO,WAAW,SAAU,WAAU;AAAA,iBACjC,OAAO,WAAW,SAAU,WAAU,OAAO,MAAM;AAAA,MAC9D,WAAW,OAAO,WAAW;AAC3B,cAAM,KAAK,OAAO,UAAU,GAAG;AAC/B,kBAAU,OAAO,EAAE;AAAA,MACrB,OAAO;AACL,cAAM,WAAW,aAAa,KAAK,QAAQ,GAAG;AAC9C,YAAI,OAAO,aAAa,SAAU,WAAU;AAAA,iBACnC,OAAO,aAAa,SAAU,WAAU,OAAO,QAAQ;AAAA,MAElE;AACA,YAAM,MAAM,QAAQ,YAAY;AAEhC,UAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,iBAAS,IAAI,KAAK,OAAO,MAAM;AAC/B,eAAO,KAAK,EAAE,KAAK,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,MACxC;AACA,aAAO,SAAS,IAAI,GAAG,CAAE,EAAE,KAAK,KAAK,EAAE,KAAK,eAAe,IAAI,CAAC;AAAA,IAClE,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,iBAAiB,kBAAkB,UAAU,CAAC;AAGlD,iCAAU,MAAM;AACd,QAAI,CAAC,YAAa;AAClB,sBAAkB,CAAC,SAAS;AAC1B,YAAM,OAAO,EAAE,GAAG,KAAK;AACvB,UAAI,UAAU;AACd,iBAAW,KAAK,aAAa;AAC3B,YAAI,EAAE,EAAE,OAAO,OAAO;AACpB,eAAK,EAAE,GAAG,IAAI,yBAAyB;AACvC,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,aAAO,UAAU,OAAO;AAAA,IAC1B,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,oBAAoB,CAAC;AAEtC,QAAM,cAAc,CAAC,QAAgB;AACnC,sBAAkB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE;AAAA,EAC9D;AAGA,QAAM,gBAAY,yBAAQ,MAAM;AAC9B,QAAI,CAAC,mBAAoB,QAAO;AAChC,UAAM,OAAO,oBAAI,IAAqB;AACtC,WAAO,WAAW,OAAO,CAAC,QAAQ;AAChC,YAAM,MAAM,mBAAmB,GAAG;AAClC,UAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,WAAK,IAAI,GAAG;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,kBAAkB,CAAC;AAInC,QAAM,qBAAqB,CAAC,EAAE,mBAAmB;AAKjD,QAAM,qBAAqB,CACzB,QAEA,sBAAsB,IAAI,EAAE,KAAK,IAAI,UAAU;AAIjD,QAAM,sBAAsB,sBAAsB;AAAA,IAChD,CAAC,QAAQ,mBAAmB,GAAG,MAAM;AAAA,EACvC;AAOA,QAAM,yBAAqB,yBAAQ,MAA0C;AAC3E,UAAM,UAA8C,CAAC;AACrD,QAAI,aAAa;AACjB,aAAS,IAAI,sBAAsB,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1D,YAAM,MAAM,sBAAsB,CAAC;AACnC,YAAM,YAAY,sBAAsB,IAAI,EAAE,KAAK,IAAI;AACvD,YAAM,WACJ,cAAc,WACb,iBAAiB,MAAM,sBAAsB,SAAS;AACzD,UAAI,CAAC,SAAU;AACf,cAAQ,IAAI,EAAE,IAAI;AAClB,YAAM,IACJ,kBAAkB,IAAI,EAAE,MACvB,OAAO,IAAI,UAAU,WAAW,IAAI,QAAQ,YAC5C,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AACrD,UAAI,MAAM,OAAW,eAAc;AAAA,IACrC;AACA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,qBAAiB,oBAAAA;AAAA,IACrB;AAAA,IACA,mBAAmB,OAAO;AAAA,IAC1B,WACE;AAAA,IACF,cAAc;AAAA,IACd;AAAA,EACF;AACA,QAAM,mBAAe,oBAAAA,SAAW,iBAAiB,OAAO,GAAG,cAAc;AAEzE,QAAM,cAAc,mBAAmB,OAAO;AAC9C,QAAM,oBAAoB,mBAAmB,OAAO;AAEpD,QAAM,oBACJ,YAAY,SACR,mHACA,qBAAqB,IAAI;AAC/B,QAAM,oBACJ;AAEF,QAAM,mBAAe,oBAAAA;AAAA,IACnB;AAAA,KACC,WAAW,cAAc;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,uBAAuB,YACzB;AAAA,IACE,WAAW,OAAO,cAAc,WAAW,GAAG,SAAS,OAAO;AAAA,EAChE,IACA;AAEJ,QAAM,UAAU,WAAW,SAAS;AAGpC,QAAM,gBACH,qBAAqB,eAAe,SAAS,IAAI,eAAe,WACjE;AAEF,QAAM,mBAAmB,MACvB,+CAAC,QACC;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,eAAW,oBAAAA;AAAA,QACT;AAAA,MACF;AAAA,MAEC,wBAAc;AAAA;AAAA,EACjB,GACF;AAGF,QAAM,wBAAwB,MAC5B,+CAAC,SAAI,WAAU,qFACZ,wBAAc,sBACjB;AAIF,QAAM,YAAY,CAChB,KACA,eACA,kBAAkB,UACf;AACH,UAAM,MAAM,cAAc,KAAK,eAAe,MAAM;AAGpD,UAAM,aAAa,iBAAiB,IAAI,GAAG,KAAK,iBAAiB,IAAI,GAAG;AACxE,UAAM,gBACJ,CAAC,eAAe,eAAe,KAAK,aAAa,KAAK;AAExD,UAAM,gBAAgB,aAAa,oBAAoB,KAAK,IAAI;AAChE,UAAM,oBAAoB,gBAAgB,qBAAqB,KAAK,IAAI;AACxE,UAAM,iBACJ,WAAW,gBAAgB,MAAM,IAC7B,0CACA;AAGN,UAAM,oBACJ,CAAC,cAAc,CAAC,iBAAiB,YAC7B,WAAW,gBAAgB,MAAM,IAC/B,+DACA,+DACF;AACN,UAAM,uBACJ,CAAC,cAAc,CAAC,iBAAiB,YAC7B,WAAW,gBAAgB,MAAM,IAC/B,iEACA,iEACF;AACN,UAAM,iBAAa,oBAAAA;AAAA,MACjB;AAAA,MACA;AAAA,MACA,aACI,gBACA,gBACE,oBACA,WACA,gBAAgB,MAAM,KACtB;AAAA,MACN,iBAAiB,aAAa;AAAA,MAC9B;AAAA,MACA,aAAa,mBAAmB;AAAA,MAChC,eAAe,aAAa,KAAK,aAAa,IAAI;AAAA,IACpD;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW;AAAA,QACX,SAAS,aAAa,MAAM,WAAW,KAAK,aAAa,IAAI;AAAA,QAG5D;AAAA,gCACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA;AAAA;AAAA,gBAGA,wBACG,aACG,oBAAoB,KAAK,IACzB,gBACE,qBAAqB,KAAK,IAC1B;AAAA;AAAA,gBAER,sBAAsB,uBAAuB;AAAA,cAC/C;AAAA,cACA,eAAY;AAAA,cAEZ,yDAAC,SAAI,WAAU,iBAAgB;AAAA;AAAA,UACjC;AAAA,UAGD,mBAAmB,CAAC,sBACnB,+CAAC,QAAG,WAAU,OAAM,eAAY,QAAO;AAAA,UAExC,sBAAsB,IAAI,CAAC,QAAQ,aAAa;AAC/C,kBAAM,YAAY,aAAa,KAAK,QAAQ,aAAa;AAGzD,kBAAM,aACJ,OAAO,cAAc,YAAY,OAAO,cAAc;AAExD,kBAAM,gBAAgB,kBAAkB,OAAO,EAAE;AACjD,kBAAM,kBAAkB,mBAAmB,MAAM;AACjD,kBAAM,eAAe,oBAAoB;AACzC,kBAAM,gBACJ,oBAAoB,WACnB,iBAAiB,aAAa,sBAAsB,SAAS;AAChE,kBAAM,cAAc,gBAChB,mBAAmB,OAAO,EAAE,IAC5B;AACJ,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,eAAW,oBAAAA;AAAA,kBACT;AAAA,mBACC,gBAAgB,kBAAkB;AAAA,kBACnC,iBAAiB,qBAAqB,YAAY;AAAA;AAAA,kBAElD,iBAAiB,CAAC,eAAe;AAAA,mBAChC,gBAAgB,kBAAkB;AAAA,mBAClC,gBAAgB,mBACd,aACG,oBAAoB,KAAK,IACzB,gBACE,qBAAqB,KAAK,IAC1B,WAAW,gBAAgB,MAAM,IAC/B,0CACC,OAAO,qBAAqB,KAAK,aAAa,KAC/C,OAAO,oBACP;AAAA;AAAA;AAAA,kBAGV,gBAAgB,gBACZ,uBACA;AAAA,mBACH,gBAAgB,kBACf,iBACA,aACA;AAAA,kBACF,iBAAiB,OAAO,KAAK;AAAA,kBAC7B,aAAa,KAAK,kBAAkB;AAAA,kBACpC,aAAa,sBAAsB,SAAS,KAC1C,kBAAkB;AAAA;AAAA,kBAEpB,aAAa,KACX,qBACA,oBAAAA;AAAA,oBACE;AAAA,oBACA,wBAAwB,KAAK;AAAA,kBAC/B;AAAA,kBACF,iBACE,oBAAoB,WACpB,CAAC,aACD;AAAA,kBACF,OAAO;AAAA,gBACT;AAAA,gBACA,OAAO;AAAA,kBACL,GAAI,gBACA;AAAA,oBACE,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,UAAU;AAAA,kBACZ,IACA;AAAA,oBACE,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,OAAO;AAAA,kBACT;AAAA,kBACJ,GAAI,iBAAiB,gBAAgB,SACjC,EAAE,OAAO,YAAY,IACrB,CAAC;AAAA,gBACP;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA;AAAA,sBACA,kBAAkB;AAAA,sBAClB,qBAAqB,OAAO,KAAK;AAAA;AAAA,sBAEjC,CAAC,cAAc,OAAO,YAAY;AAAA;AAAA,sBAElC,mBAAmB,aAAa,KAAK;AAAA,oBACvC;AAAA,oBAEC,uBACC;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAM,OAAO,SAAS;AAAA,wBACtB,IAAG;AAAA,wBACH,OAAO;AAAA,wBACP,WAAS;AAAA,wBACT,WAAU;AAAA;AAAA,oBACZ,IAEA;AAAA;AAAA,gBAEJ;AAAA;AAAA,cApFK,OAAO;AAAA,YAqFd;AAAA,UAEJ,CAAC;AAAA;AAAA;AAAA,MAtII;AAAA,IAuIP;AAAA,EAEJ;AAGA,QAAM,iBAAiB,CAAC,QACtB,OAAO,IAAI,WAAW,WAAW,IAAI,SAAS,IAAI;AAEpD,SACE,+CAAC,SAAI,WAAW,gBAAgB,OAC9B;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,cAAc;AAAA,MAChB;AAAA,MAGE;AAAA,0BACA,kBACC,sBAAsB,sBACvB,mBACA,sBACA,gDAAC,SAAI,WAAU,mGACZ;AAAA,yBACC,+CAAC,SAAI,WAAU,gEACZ,uBACH;AAAA,UAEF,+CAAC,SAAI,WAAU,UAAS;AAAA,UACxB,gDAAC,SAAI,WAAU,2BAEZ;AAAA,8BACC,kFACE;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR;AAAA,kBACA,SAAQ;AAAA,kBACR,iBAAgB;AAAA,kBAChB,UAAU,eAAe;AAAA,kBACzB,gBAAc,eAAe;AAAA,kBAC7B,SAAS,MAAM;AACb,kCAAc,OAAO;AACrB,mCAAe,OAAO;AACtB,4CAAwB;AAAA,sBACtB,GAAG,oBAAoB;AAAA,sBACvB,YAAY;AAAA,oBACd,CAAC;AAAA,kBACH;AAAA,kBACA,cAAW;AAAA;AAAA,cACb;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR;AAAA,kBACA,SAAQ;AAAA,kBACR,iBAAgB;AAAA,kBAChB,UAAU,eAAe;AAAA,kBACzB,gBAAc,eAAe;AAAA,kBAC7B,SAAS,MAAM;AACb,kCAAc,OAAO;AACrB,mCAAe,OAAO;AACtB,4CAAwB;AAAA,sBACtB,GAAG,oBAAoB;AAAA,sBACvB,YAAY;AAAA,oBACd,CAAC;AAAA,kBACH;AAAA,kBACA,cAAW;AAAA;AAAA,cACb;AAAA,eACF;AAAA,YAID,sBACC,sBACA,eAAe,WACb,gDAAC,SAAI,WAAU,YAAW,KAAK,aAC7B;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR;AAAA,kBACA,SAAQ;AAAA,kBACR,iBAAgB;AAAA,kBAChB,gBAAc;AAAA,kBACd,SAAS,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAAA,kBACxC,cAAW;AAAA;AAAA,cACb;AAAA,cACC,gBACC,gDAAC,SAAI,WAAU,yJACb;AAAA,+DAAC,SAAI,WAAU,sJAAqJ,qBAEpK;AAAA,gBACA,+CAAC,SAAI,WAAU,iCACZ,sBAAY,IAAI,CAAC,QAAQ;AACxB,wBAAM,WAAW,IAAI,aAAa;AAClC,wBAAM,UAAU,cAAc,IAAI,EAAE,MAAM;AAC1C,wBAAM,QACJ,OAAO,IAAI,WAAW,WAClB,IAAI,SACJ,IAAI;AACV,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,WACI,oEACA;AAAA,sBACN;AAAA,sBAEA;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,SAAS;AAAA,4BACT,UAAU,CAAC;AAAA,4BACX,UAAU,MAAM;AACd,oCAAM,OAAO;AAAA,gCACX,GAAG;AAAA,gCACH,CAAC,IAAI,EAAE,GAAG,CAAC;AAAA,8BACb;AACA,+CAAiB,IAAI;AACrB,yDAA2B,IAAI;AAC/B,sDAAwB;AAAA,gCACtB,GAAG,oBAAoB;AAAA,gCACvB,kBAAkB;AAAA,8BACpB,CAAC;AAAA,4BACH;AAAA,4BACA,eAAW,oBAAAA;AAAA,8BACT;AAAA,8BACA,eAAe,KAAK;AAAA,4BACtB;AAAA;AAAA,wBACF;AAAA,wBACA,+CAAC,UAAK,WAAU,0CACb,iBACH;AAAA;AAAA;AAAA,oBA/BK,IAAI;AAAA,kBAgCX;AAAA,gBAEJ,CAAC,GACH;AAAA,gBACA,+CAAC,SAAI,WAAU,iEACb;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR;AAAA,oBACA,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,4BAAM,QAAiC,CAAC;AACxC,iCAAW,OAAO,kBAAkB;AAClC,8BAAM,IAAI,EAAE,IAAI,2BAA2B,GAAG;AAAA,sBAChD;AACA,uCAAiB,KAAK;AACtB,iDAA2B,KAAK;AAChC,8CAAwB;AAAA,wBACtB,GAAG,oBAAoB;AAAA,wBACvB,kBAAkB;AAAA,sBACpB,CAAC;AAAA,oBACH;AAAA,oBACD;AAAA;AAAA,gBAED,GACF;AAAA,iBACF;AAAA,eAEJ;AAAA,YAIH,mBAAmB,eAAe,WACjC,gDAAC,SAAI,WAAU,YAAW,KAAK,eAE7B;AAAA,8DAAC,SAAI,WAAU,wBACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR;AAAA,oBACA,SAAQ;AAAA,oBACR,iBAAgB;AAAA,oBAChB,gBAAc,kBAAkB,CAAC,CAAC;AAAA,oBAClC,SAAS,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAAA,oBAC1C,cAAW;AAAA;AAAA,gBACb;AAAA,gBAEC,mBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,iBAAiB,KAAK;AAAA,oBACxB;AAAA,oBACA,eAAY;AAAA;AAAA,gBACd;AAAA,iBAEJ;AAAA,cAEC,kBACC,gDAAC,SAAI,WAAU,yJAEb;AAAA,gEAAC,SAAI,WAAU,mGACb;AAAA,iEAAC,UAAK,WAAU,wFAAuF,sBAEvG;AAAA,kBACC,mBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,kBAAkB,IAAI;AAAA,sBACrC,WAAU;AAAA,sBACX;AAAA;AAAA,kBAED;AAAA,mBAEJ;AAAA,gBAGA,gDAAC,SAAI,WAAU,iCACb;AAAA,kEAAC,WAAM,WAAU,6HACf;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,SAAS,CAAC;AAAA,wBACV,UAAU,MAAM,kBAAkB,IAAI;AAAA,wBACtC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,eAAe,KAAK;AAAA,wBACtB;AAAA;AAAA,oBACF;AAAA,oBACA,+CAAC,UAAK,WAAU,iDAAgD,kBAEhE;AAAA,qBACF;AAAA,kBACC,YACE,OAAO,CAAC,QAAQ,IAAI,cAAc,KAAK,EACvC,IAAI,CAAC,QACJ;AAAA,oBAAC;AAAA;AAAA,sBAEC,WAAU;AAAA,sBAEV;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAK;AAAA,4BACL,MAAK;AAAA,4BACL,SAAS,oBAAoB,IAAI;AAAA,4BACjC,UAAU,MAAM,kBAAkB,IAAI,EAAE;AAAA,4BACxC,eAAW,oBAAAA;AAAA,8BACT;AAAA,8BACA,eAAe,KAAK;AAAA,4BACtB;AAAA;AAAA,wBACF;AAAA,wBACA,+CAAC,UAAK,WAAU,0CACb,yBAAe,GAAG,GACrB;AAAA,wBAEC,cAAc,IAAI,EAAE,MAAM,SACzB,+CAAC,UAAK,WAAU,0DAAyD,oBAEzE;AAAA;AAAA;AAAA,oBApBG,IAAI;AAAA,kBAsBX,CACD;AAAA,mBACL;AAAA,gBAGA,+CAAC,SAAI,WAAU,mEACb,0DAAC,WAAM,WAAU,gEACf;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,MAAM;AACd,gDAAwB,CAAC,MAAM;AAC7B,gCAAM,OAAO,CAAC;AACd,kDAAwB;AAAA,4BACtB,GAAG,oBAAoB;AAAA,4BACvB,iBAAiB;AAAA,0BACnB,CAAC;AACD,iCAAO;AAAA,wBACT,CAAC;AAAA,sBACH;AAAA,sBACA,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,eAAe,KAAK;AAAA,sBACtB;AAAA;AAAA,kBACF;AAAA,kBACA,+CAAC,UAAK,WAAU,0CAAyC,+BAEzD;AAAA,mBACF,GACF;AAAA,iBACF;AAAA,eAEJ;AAAA,YAID,qBAAqB,eAAe,WACnC,gDAAC,SAAI,WAAU,YAAW,KAAK,gBAC7B;AAAA,8DAAC,SAAI,WAAU,wBACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR;AAAA,oBACA,SAAQ;AAAA,oBACR,iBAAgB;AAAA,oBAChB,gBAAc,mBAAmB;AAAA,oBACjC,SAAS,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAAA,oBAC3C,cAAW;AAAA;AAAA,gBACb;AAAA,gBACC,oBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW,oBAAAA;AAAA,sBACT;AAAA,sBACA,iBAAiB,KAAK;AAAA,oBACxB;AAAA,oBACA,eAAY;AAAA;AAAA,gBACd;AAAA,iBAEJ;AAAA,cAEC,mBACC,gDAAC,SAAI,WAAU,yJAEb;AAAA,gEAAC,SAAI,WAAU,mGACb;AAAA,iEAAC,UAAK,WAAU,wFAAuF,4BAEvG;AAAA,kBACC,oBACC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM;AACb,iDAAyB,CAAC,CAAC;AAC3B,gDAAwB,CAAC,CAAC;AAAA,sBAC5B;AAAA,sBACA,WAAU;AAAA,sBACX;AAAA;AAAA,kBAED;AAAA,mBAEJ;AAAA,gBAGA,+CAAC,SAAI,WAAU,iCACZ,sBAAY,IAAI,CAAC,QAAQ;AACxB,wBAAM,QAAQ,eAAe,GAAG;AAChC,wBAAM,UAAU,sBAAsB,IAAI,EAAE,KAAK;AACjD,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,WAAU;AAAA,sBAEV;AAAA,uEAAC,UAAK,WAAU,0DACb,iBACH;AAAA,wBAEA,+CAAC,SAAI,WAAU,0GACX,WAAC,QAAQ,MAAM,OAAO,EAAY;AAAA,0BAClC,CAAC,SACC;AAAA,4BAAC;AAAA;AAAA,8BAEC,MAAK;AAAA,8BACL,SAAS,MACP,mBAAmB,IAAI,IAAI,IAAI;AAAA,8BAEjC,eAAW,oBAAAA;AAAA,gCACT;AAAA,gCACA,YAAY,OACR,4FACA;AAAA,8BACN;AAAA,8BAEC,mBAAS,SACN,WACA,SAAS,UACP,WACA;AAAA;AAAA,4BAhBD,OAAO,IAAI;AAAA,0BAiBlB;AAAA,wBAEJ,GACF;AAAA;AAAA;AAAA,oBA/BK,IAAI;AAAA,kBAgCX;AAAA,gBAEJ,CAAC,GACH;AAAA,gBAGA,+CAAC,SAAI,WAAU,iEACb,yDAAC,UAAK,WAAU,kDAAiD,mFAGjE,GACF;AAAA,iBACF;AAAA,eAEJ;AAAA,YAGD;AAAA,aACH;AAAA,WACF;AAAA,QAID,eAAe,WAAW,eAAe,SAAS,KACjD;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA,SAAW,YAAY,cAAc,gBAAgB;AAAA,YAEhE;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,aAAa,2BAA2B;AAAA,kBACxC,CAAC,cAAc,aAAa;AAAA,gBAC9B;AAAA,gBACA,OAAO,CAAC,aAAa,uBAAuB;AAAA,gBAE5C;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAW;AAAA,sBACX,OACE,iBACI,EAAE,aAAa,SAAS,OAAO,OAAO,IACtC;AAAA,sBAIL;AAAA,0CACC,gDAAC,cACE;AAAA,gDAAsB,+CAAC,SAAI,OAAO,EAAE,OAAO,SAAS,GAAG;AAAA,0BACvD,mBAAmB,CAAC,sBACnB,+CAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAAG;AAAA,0BAEhC,sBAAsB,IAAI,CAAC,QAAQ;AAClC,kCAAM,WAAW,kBAAkB,IAAI,EAAE;AACzC,gCAAI;AACF,qCACE;AAAA,gCAAC;AAAA;AAAA,kCAEC,OAAO;AAAA,oCACL,OAAO,GAAG,QAAQ;AAAA,oCAClB,UAAU,GAAG,QAAQ;AAAA,kCACvB;AAAA;AAAA,gCAJK,IAAI;AAAA,8BAKX;AAGJ,kCAAM,YACJ,IAAI,UAAU,SACV,OAAO,IAAI,UAAU,WACnB,IAAI,QACJ,IAAI,QACN;AACN,kCAAM,cACJ,IAAI,aAAa,SACb,OAAO,IAAI,aAAa,WACtB,IAAI,WACJ,IAAI,WACN;AACN,kCAAM,OAAO,aAAa;AAC1B,mCACE;AAAA,8BAAC;AAAA;AAAA,gCAEC,OACE,SAAS,SACL;AAAA,kCACE,OACE,OAAO,SAAS,WACZ,GAAG,IAAI,OACP;AAAA,kCACN,UACE,OAAO,SAAS,WACZ,GAAG,IAAI,OACP;AAAA,gCACR,IACA;AAAA;AAAA,8BAbD,IAAI;AAAA,4BAeX;AAAA,0BAEJ,CAAC;AAAA,2BACH;AAAA,wBAEF,+CAAC,WACC;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAW,oBAAAA;AAAA,8BACT;AAAA,8BACA;AAAA,4BACF;AAAA,4BAGC;AAAA,oDACC;AAAA,gCAAC;AAAA;AAAA,kCACC,OAAM;AAAA,kCACN,eAAW,oBAAAA;AAAA,oCACT;AAAA,oCACA;AAAA,oCACA,gBAAgB;AAAA,oCAChB,eAAe,SAAS;AAAA,oCACxB;AAAA,kCACF;AAAA,kCACA,eAAY;AAAA,kCAEZ,yDAAC,SAAI,WAAU,iBAAgB;AAAA;AAAA,8BACjC;AAAA,8BAGD,mBAAmB,CAAC,sBACnB,+CAAC,QAAG,OAAM,OAAM,WAAU,OAAM,eAAY,QAAO;AAAA,8BAEpD,sBAAsB,IAAI,CAAC,QAAQ,aAAa;AAC/C,sCAAM,WAAW,cAAc,aAAa,OAAO;AACnD,sCAAM,gBAAgB,WAClB,cAAc,YACd;AAEJ,sCAAM,cACJ,oBAAoB,OAAO,cAAc;AAC3C,sCAAM,cAAc,kBAAkB,OAAO,EAAE;AAC/C,sCAAM,oBAAoB,mBAAmB,MAAM;AACnD,sCAAM,eAAe,sBAAsB;AAC3C,sCAAM,gBACJ,sBAAsB,WACrB,iBACC,aAAa,sBAAsB,SAAS;AAChD,sCAAM,cAAc,gBAChB,mBAAmB,OAAO,EAAE,IAC5B;AAEJ,uCACE;AAAA,kCAAC;AAAA;AAAA,oCAEC,KAAK,CAAC,OAAO;AACX,6CAAO,QAAQ,OAAO,EAAE,IAAI;AAAA,oCAC9B;AAAA,oCACA,OAAM;AAAA,oCACN,eAAW,oBAAAA;AAAA,sCACT;AAAA,sCACA;AAAA,sCACA;AAAA,sCACA,gBAAgB;AAAA,uCACf,gBAAgB,kBAAkB;AAAA,sCACnC,iBACG,qBAAqB,YAAY;AAAA;AAAA,sCAEpC,iBAAiB,CAAC,eAAe;AAAA,sCACjC,iBAAiB,gBAAgB,iBAC7B,SACA,eACE,SACA,gBAAgB,gBACd,SACA;AAAA,sCACR,iBAAiB,OAAO,KAAK;AAAA,sCAC7B;AAAA,sCACA,eAAe;AAAA,sCACf,iBACE,sBAAsB,WACtB,CAAC,aACD;AAAA,sCACF,OAAO;AAAA,oCACT;AAAA,oCACA,OAAO;AAAA,sCACL,GAAI,cACA;AAAA,wCACE,OAAO;AAAA,wCACP,UAAU;AAAA,wCACV,UAAU;AAAA,sCACZ,IACA;AAAA,wCACE,OAAO;AAAA,wCACP,OAAO;AAAA,wCACP,OAAO;AAAA,sCACT;AAAA,sCACJ,GAAI,iBAAiB,gBAAgB,SACjC,EAAE,OAAO,YAAY,IACrB,CAAC;AAAA,oCACP;AAAA,oCACA,aACE,gBACI,kBAAkB,QAChB,cACA,eACF;AAAA,oCAEN,OAAO,OAAO;AAAA,oCAEd;AAAA;AAAA,wCAAC;AAAA;AAAA,0CACC,eAAW,oBAAAA;AAAA,4CACT;AAAA,4CACA,OAAO,UAAU,UACb,gBACA,OAAO,UAAU,WACf,mBACA;AAAA,0CACR;AAAA,0CAEA;AAAA,2FAAC,UAAK,WAAU,2BACb,iBAAO,QACV;AAAA,4CACC,OAAO,WACN;AAAA,8CAAC;AAAA;AAAA,gDACC,MACE,gBACI,YAAY,aAAa,IACzB,YAAY;AAAA,gDAElB,MAAK;AAAA,gDACL,SAAQ;AAAA,gDACR,OAAO,WAAW,QAAQ;AAAA,gDAC1B,SAAQ;AAAA,gDACR,QAAQ;AAAA,gDACR,SACE,kBAAkB,QACd,oBACA,kBAAkB,SAChB,eACA;AAAA,gDAER,iBAAgB;AAAA,gDAChB,eAAW,oBAAAA;AAAA,kDACT;AAAA,kDACA,CAAC,YACC;AAAA,gDACJ;AAAA,gDACA,SAAS,MAAM,iBAAiB,MAAM;AAAA,gDACtC,cAAW;AAAA;AAAA,4CACb,IACE;AAAA;AAAA;AAAA,sCACN;AAAA,sCAEC,eACC;AAAA,wCAAC;AAAA;AAAA,0CACC,MAAK;AAAA,0CACL,eAAY;AAAA,0CACZ,WAAU;AAAA,0CACV,aAAa,CAAC,MAAM;AAClB,kDAAM,OACJ,OAAO,aAAa,SAChB,OAAO,OAAO,aAAa,WACzB,OAAO,WACP,SAAS,OAAO,UAAU,EAAE,IAC9B;AACN;AAAA,8CACE;AAAA,8CACA,OAAO;AAAA,8CACP,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI;AAAA,4CACtC;AAAA,0CACF;AAAA,0CAEA;AAAA,4CAAC;AAAA;AAAA,8CACC,eAAW,oBAAAA;AAAA,gDACT;AAAA,gDACA,0BAA0B,KAAK;AAAA,8CACjC;AAAA;AAAA,0CACF;AAAA;AAAA,sCACF;AAAA;AAAA;AAAA,kCA7HG,OAAO;AAAA,gCA+Hd;AAAA,8BAEJ,CAAC;AAAA;AAAA;AAAA,wBACH,GACF;AAAA,wBACA,+CAAC,WAAM,WAAW,cAEf,wBACG,UACE,YAAY,IAAI,CAAC,UAAU;AACzB,gCAAM,aACJ,eAAe,MAAM,GAAG,MAAM;AAChC,iCACE,gDAAC,gBAAAC,QAAM,UAAN,EAEE;AAAA,uDACC;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAU;AAAA,gCACV,SAAS,MAAM,YAAY,MAAM,GAAG;AAAA,gCAEpC;AAAA,kCAAC;AAAA;AAAA,oCACC,SAAS,eAAe,SAAS;AAAA,oCACjC,WAAU;AAAA,oCAEV;AAAA,sCAAC;AAAA;AAAA,wCACC,eAAW,oBAAAD;AAAA,0CACT;AAAA,0CACA,kBAAkB;AAAA,wCACpB;AAAA,wCAEA;AAAA;AAAA,4CAAC;AAAA;AAAA,8CACC,eAAW,oBAAAA;AAAA,gDACT;AAAA,8CACF;AAAA,8CAEA,yDAAC,cAAW,UAAU,YAAY;AAAA;AAAA,0CACpC;AAAA,0CACA,+CAAC,UAAK,WAAU,gEACb,gBAAM,WACL,+CAAC,UAAK,WAAU,iDAAgD,mBAEhE,GAEJ;AAAA,0CACA;AAAA,4CAAC;AAAA;AAAA,8CACC,OAAO,MAAM,KAAK;AAAA,8CAClB,MAAM;AAAA;AAAA,0CACR;AAAA;AAAA;AAAA,oCACF;AAAA;AAAA,gCACF;AAAA;AAAA,4BACF;AAAA,6BAGA,cAAc,CAAC,4BACf,MAAM,KAAK;AAAA,8BAAI,CAAC,EAAE,KAAK,cAAc,MACnC,UAAU,KAAK,eAAe,IAAI;AAAA,4BACpC;AAAA,+BA3CiB,SAAS,MAAM,GAAG,EA4CvC;AAAA,wBAEJ,CAAC,IACD,iBAAiB;AAAA;AAAA,0BAEnB,UACE,WAAW;AAAA,4BAAI,CAAC,KAAK,aACnB,UAAU,KAAK,UAAU,KAAK;AAAA,0BAChC,IACA,iBAAiB;AAAA,2BACzB;AAAA;AAAA;AAAA,kBACF;AAAA,kBACC,WACC;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAO;AAAA,sBACP,SAAS;AAAA,sBACT,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,WAAU;AAAA;AAAA,kBACZ;AAAA;AAAA;AAAA,YAEJ;AAAA;AAAA,QACF;AAAA,QAID,eAAe,WAAW,aACzB;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,aAAa,iCAAiC;AAAA,YAChD;AAAA,YACA,OAAO,CAAC,aAAa,uBAAuB;AAAA,YAE3C;AAAA,yBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAO;AAAA,kBACP,SAAS;AAAA,kBACT,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,WAAU;AAAA;AAAA,cACZ;AAAA,cAED,UACC;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW,oBAAAA;AAAA,oBACT;AAAA,oBACA,qBAAqB;AAAA;AAAA;AAAA,0BAGjB,oBAAAA,SAAW,QAAQ,kBAAkB;AAAA;AAAA;AAAA,sBAEpC,sBACC;AAAA;AAAA,kBACR;AAAA,kBACA,OACE,qBAAqB,QAChB,MAAM;AACL,0BAAM,OACJ,OAAO,sBAAsB,WACzB,GAAG,iBAAiB,OACpB;AACN,0BAAM,OACJ,qBAAqB,OACjB,OAAO,OAAO,sBAAsB,WAAW,GAAG,iBAAiB,OAAO,iBAAiB,WAC3F;AACN,2BAAO;AAAA,sBACL,qBAAqB,gCAAgC,IAAI,YAAY,IAAI;AAAA,sBACzE,KACE,YAAY,OACR,OAAO,aAAa,WAClB,GAAG,QAAQ,OACX,WACF;AAAA,oBACR;AAAA,kBACF,GAAG,IACH;AAAA,kBAGL,oBAAU,IAAI,CAAC,KAAK,aACnB,+CAAC,gBAAAC,QAAM,UAAN,EACE,oBAAU,KAAK,QAAQ,KADL,cAAc,KAAK,UAAU,MAAM,CAExD,CACD;AAAA;AAAA,cACH,IAEA,sBAAsB;AAAA;AAAA;AAAA,QAE1B;AAAA,SAIA,UAAW,cAAc,WAAW,QAAQ,MAC5C,+CAAC,SAAI,WAAU,qJACZ,mBACG,SACA,cACE,gDAAC,SAAI,WAAU,4CACb;AAAA,0DAAC,SAAI,WAAU,2BACb;AAAA,4DAAC,UAAK,WAAU,kDAAiD;AAAA;AAAA,cACvD;AAAA,eACN,WAAW,OAAO,KAAK,WAAW,WAAW;AAAA,cAAE;AAAA,cAAI;AAAA,cACpD,KAAK;AAAA,gBACJ,WAAW,OAAO,WAAW;AAAA,gBAC7B,WAAW;AAAA,cACb;AAAA,cAAG;AAAA,cAAI;AAAA,cACH,WAAW;AAAA,cAAM;AAAA,eACvB;AAAA,YACA,+CAAC,SAAI,WAAU,aACb;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,WAAW;AAAA,gBAClB,UAAU,CAAC,MAAM;AACf,6BAAW,iBAAiB,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,gBACpD;AAAA,gBACA,MAAK;AAAA,gBAEL;AAAA,iEAAC,YAAO,OAAO,IAAI,yBAAW;AAAA,kBAC9B,+CAAC,YAAO,OAAO,IAAI,yBAAW;AAAA,kBAC9B,+CAAC,YAAO,OAAO,KAAK,0BAAY;AAAA;AAAA;AAAA,YAClC,GACF;AAAA,aACF;AAAA,UACA,gDAAC,SAAI,WAAU,2BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR;AAAA,gBACA,MAAK;AAAA,gBACL,UAAU,WAAW,SAAS,KAAK;AAAA,gBACnC,SAAS,MACP,WAAW;AAAA,kBACT,KAAK,IAAI,GAAG,WAAW,OAAO,CAAC;AAAA,gBACjC;AAAA,gBAEF,aAAY;AAAA,gBACb;AAAA;AAAA,YAED;AAAA,YACA,gDAAC,UAAK,WAAU,8DAA6D;AAAA;AAAA,cACrE,WAAW;AAAA,cAAK;AAAA,cAAI;AAAA,cACzB,KAAK,KAAK,WAAW,QAAQ,WAAW,QAAQ;AAAA,eACnD;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR;AAAA,gBACA,MAAK;AAAA,gBACL,UACE,WAAW,QACT,KAAK,KAAK,WAAW,QAAQ,WAAW,QAAQ,KAClD;AAAA,gBAEF,SAAS,MACP,WAAW;AAAA,kBACT,KAAK;AAAA,oBACH,KAAK,KAAK,WAAW,QAAQ,WAAW,QAAQ;AAAA,oBAChD,WAAW,OAAO;AAAA,kBACpB;AAAA,gBACF;AAAA,gBAEF,cAAa;AAAA,gBACd;AAAA;AAAA,YAED;AAAA,aACF;AAAA,WACF,GAER;AAAA;AAAA;AAAA,EAEJ,GACF;AAEJ;AAEO,SAAS,MAAS,OAA0C;AACjE,SAAO,+CAAC,kBAAgB,GAAG,OAAO;AACpC;AAEA,IAAO,gBAAQ;;;ACl5Ef,IAAAC,kBAAyC;AACzC,IAAAC,sBAAuB;AAuDjB,IAAAC,wBAAA;AAVN,SAASC,YAAW,EAAE,SAAS,GAA0B;AACvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,QAAO;AAAA,MACP,WAAW,+DAA+D,WAAW,eAAe,EAAE;AAAA,MACtG,eAAY;AAAA,MAEZ;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,cAAwB,MAC5B,+CAAC,UAAK,WAAU,oCAAmC,cAAW,WAC5D,0DAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,WAAU,4BAC7C;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,gBAAe,aAAY,QAAO;AAAA,EACrE;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AAAA,GACF,GACF;AAGF,IAAM,eAAyB,MAC7B,+CAAC,UAAK,WAAU,oCAAmC,cAAW,YAC5D;AAAA,EAAC;AAAA;AAAA,IACC,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,WAAU;AAAA,IAEV;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA;AACF,GACF;AAGF,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,CAAC,UAAU,WAAW,QAAI,0BAAS,KAAK;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI;AAAA,IAC5C,oBAAI,IAAI;AAAA,EACV;AAGA,QAAM,cAAU,yBAAQ,MAAM;AAC5B,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,SAAmB,CAAC;AAC1B,eAAW,KAAK,aAAa;AAC3B,UAAI,CAAC,KAAK,IAAI,EAAE,MAAM,GAAG;AACvB,aAAK,IAAI,EAAE,MAAM;AACjB,eAAO,KAAK,EAAE,MAAM;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAGhB,QAAM,gBAAY,yBAAQ,MAAM;AAC9B,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,SAAmB,CAAC;AAC1B,eAAW,KAAK,aAAa;AAC3B,UAAI,CAAC,KAAK,IAAI,EAAE,KAAK,GAAG;AACtB,aAAK,IAAI,EAAE,KAAK;AAChB,eAAO,KAAK,EAAE,KAAK;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,gBAAgB,WAAW,YAAY,UAAU,MAAM,GAAG,KAAK;AACrE,QAAM,cAAc,UAAU,SAAS;AAGvC,QAAM,WAAO,yBAAQ,MAAmB;AACtC,UAAM,SAAS,oBAAI,IAAqB;AACxC,eAAW,KAAK,aAAa;AAC3B,aAAO,IAAI,GAAG,EAAE,KAAK,KAAK,EAAE,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO;AAAA,IAChE;AAEA,UAAM,iBAAiB,oBAAI,IAAsB;AACjD,eAAW,KAAK,aAAa;AAC3B,UAAI,CAAC,eAAe,IAAI,EAAE,KAAK,EAAG,gBAAe,IAAI,EAAE,OAAO,CAAC,CAAC;AAChE,YAAM,MAAM,eAAe,IAAI,EAAE,KAAK;AACtC,UAAI,CAAC,IAAI,SAAS,EAAE,QAAQ,EAAG,KAAI,KAAK,EAAE,QAAQ;AAAA,IACpD;AAEA,UAAM,SAAsB,CAAC;AAC7B,eAAW,SAAS,eAAe;AACjC,YAAM,YAAY,eAAe,IAAI,KAAK,KAAK,CAAC;AAGhD,aAAO,KAAK;AAAA,QACV,MAAM,YAAY,KAAK;AAAA,QACvB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,aAAa,UAAU;AAAA,MACzB,CAAC;AAGD,UAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG;AAC/B,mBAAW,YAAY,WAAW;AAChC,gBAAM,MAAiB;AAAA,YACrB,MAAM,GAAG,KAAK,KAAK,QAAQ;AAAA,YAC3B,QAAQ;AAAA,YACR,WAAW;AAAA,UACb;AACA,qBAAW,UAAU,SAAS;AAC5B,gBAAI,MAAM,IACR,OAAO,IAAI,GAAG,KAAK,KAAK,QAAQ,KAAK,MAAM,EAAE,KAAK;AAAA,UACtD;AACA,iBAAO,KAAK,GAAG;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,eAAe,SAAS,eAAe,CAAC;AAGzD,QAAM,gBAAY,yBAAQ,MAAM;AAC9B,UAAM,MAAM,oBAAI,IAAqB;AACrC,QAAI,MAAM;AACV,eAAW,OAAO,MAAM;AACtB,UAAI,IAAI,gBAAgB;AACtB,cAAM;AAAA,MACR,OAAO;AACL,YAAI,IAAI,IAAI,MAAM,MAAM,MAAM,CAAC;AAC/B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,cAAc,CAAC,UAAkB;AACrC,uBAAmB,CAAC,SAAS;AAC3B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,KAAK,EAAG,MAAK,OAAO,KAAK;AAAA,UACjC,MAAK,IAAI,KAAK;AACnB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,cAAU,yBAAQ,MAAgC;AAEtD,UAAM,cAAsC;AAAA,MAC1C,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,oBAAoB,CAAC,QACnB,IAAI,iBAAiB,yCAAyC;AAAA,MAChE,QAAQ,CAAC,QAAQ;AACf,YAAI,IAAI,gBAAgB;AACtB,iBACE,gDAAC,UAAK,WAAU,kCACd;AAAA,2DAACA,aAAA,EAAW,UAAU,CAAC,gBAAgB,IAAI,IAAI,MAAM,GAAG;AAAA,YACxD,+CAAC,UAAK,WAAU,wDACb,cAAI,WACP;AAAA,YACA,+CAAC,iBAAM,OAAO,IAAI,aAAuB,MAAY;AAAA,aACvD;AAAA,QAEJ;AACA,eACE,+CAAC,UAAK,WAAU,uDACb,cAAI,WACP;AAAA,MAEJ;AAAA,IACF;AAGA,UAAM,aAAuC,QAAQ,IAAI,CAAC,YAAY;AAAA,MACpE,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,QAAQ,CAAC,QAAmB;AAC1B,YAAI,IAAI,eAAgB,QAAO;AAC/B,eAAO,IAAI,MAAM,MAAM,OAAO,+CAAC,eAAY,IAAK,+CAAC,gBAAa;AAAA,MAChE;AAAA,IACF,EAAE;AAEF,WAAO,CAAC,aAAa,GAAG,UAAU;AAAA,EAEpC,GAAG,CAAC,SAAS,kBAAkB,MAAM,eAAe,CAAC;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC,SAAW,cAAc,wBAAwB,SAAS;AAAA,MAErE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,QAAQ,CAAC,QAAQ,IAAI;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW,aAAa,mBAAmB;AAAA,YAC3C,cAAY;AAAA,YACZ,YAAY,CAAC,QAAQ;AACnB,kBAAI,IAAI,eAAgB,aAAY,IAAI,MAAM;AAAA,YAChD;AAAA,YACA,cAAc,CAAC,QAAQ;AACrB,kBAAI,IAAI,gBAAgB;AACtB,uBAAO;AAAA,cACT;AACA,qBAAO,WAAW,UAAU,IAAI,IAAI,IAAI,IACpC,0CACA;AAAA,YACN;AAAA;AAAA,QACF;AAAA,QACC,cAAc,KACb,+CAAC,SAAI,WAAU,4BACb;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,MAAK;AAAA,YACL,cAAc,WAAW,YAAY;AAAA,YACrC,SAAS,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI;AAAA,YAEzC,qBACG,cACA,QAAQ,WAAW,SAAS,gBAAgB,IAAI,UAAU,QAAQ;AAAA;AAAA,QACxE,GACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,uBAAQ;;;ACxTf,IAAAC,kBAA2C;AAiErC,IAAAC,wBAAA;AA9CN,IAAM,qBAAwD,CAAC;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAS,SAAS,CAAC,CAAC;AAE9C,iCAAU,MAAM;AACd,aAAS,SAAS,CAAC,CAAC;AAAA,EACtB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,gBAAgB,MAAM;AAC1B,UAAM,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,IAAI,OAAO,GAAG,CAAC;AACnD,aAAS,SAAS;AAClB,aAAS,SAAS;AAAA,EACpB;AAEA,QAAM,mBAAmB,CAAC,UAAkB;AAC1C,UAAM,YAAY,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AACpD,aAAS,SAAS;AAClB,aAAS,SAAS;AAAA,EACpB;AAEA,QAAM,mBAAmB,CACvB,OACA,OACA,eACG;AACH,UAAM,YAAY,MAAM;AAAA,MAAI,CAAC,MAAM,MACjC,MAAM,QAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,WAAW,IAAI;AAAA,IACnD;AACA,aAAS,SAAS;AAClB,aAAS,SAAS;AAAA,EACpB;AAEA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SACE,gDAAC,SAAI,WAAU,4HACb;AAAA,oDAAC,SAAI,WAAU,uBACb;AAAA,qDAAC,UAAK,WAAU,4DACb,iBACH;AAAA,MACC,QACC,+CAAC,UAAK,WAAU,8CACb,gBACH;AAAA,OAEJ;AAAA,IACC,QACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,MAAK;AAAA,QACL,WAAW;AAAA,QACX,UAAQ;AAAA;AAAA,IACV;AAAA,IAEF,+CAAC,SAAI,WAAU,aACZ,gBAAM,IAAI,CAAC,MAAM,UAChB,gDAAC,SAAiC,WAAU,wBAC1C;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,OAAO,KAAK;AAAA,UACZ,UAAU,CAAC,UACT,iBAAiB,OAAO,OAAO,MAAM,OAAO,KAAK;AAAA;AAAA,MAErD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,OAAO,KAAK;AAAA,UACZ,UAAU,CAAC,UACT,iBAAiB,OAAO,SAAS,MAAM,OAAO,KAAK;AAAA;AAAA,MAEvD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,MAAK;AAAA,UACL,SAAS,MAAM,iBAAiB,KAAK;AAAA,UACrC,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,SA3BQ,GAAG,KAAK,GAAG,IAAI,KAAK,EA4B9B,CACD,GACH;AAAA,IACA,+CAAC,kBAAO,SAAQ,WAAU,OAAM,QAAO,MAAK,MAAK,SAAS,eACvD,sBAAY,OAAO,KAAK,IAC3B;AAAA,IACC,SAAS,+CAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,KAC3D;AAEJ;AAEA,IAAO,6BAAQ;;;ACjGX,IAAAC,wBAAA;AAZJ,IAAM,gBAA8C,CAAC;AAAA,EACnD;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,GAAG;AACL,MAAM;AACJ,MAAI,CAAC,QAAS,QAAO;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAK;AAAA,MACL,UAAU;AAAA,MACV,aAAa,UAAU,aAAa;AAAA,MACpC;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAO,wBAAQ;;;ACxCf,IAAAC,kBAA+B;;;ACAxB,IAAK,4BAAL,kBAAKC,+BAAL;AACL,EAAAA,2BAAA,YAAS;AACT,EAAAA,2BAAA,SAAM;AACN,EAAAA,2BAAA,aAAU;AACV,EAAAA,2BAAA,YAAS;AACT,EAAAA,2BAAA,UAAO;AACP,EAAAA,2BAAA,SAAM;AANI,SAAAA;AAAA,GAAA;;;ADIZ,IAAAC,sBAAuB;AAgFjB,IAAAC,wBAAA;AA9DN,IAAM,mBAAmB,CACvB,YACwD;AACxD,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AACA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,QAAQ,IAAI,CAAC,QAAQ,UAAU;AACpC,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,IAAI,OAAO,KAAK,IAAI,MAAM;AAAA,UAC1B,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,QACL,IAAI,OAAO,KAAK,IAAI,OAAO,OAAO,OAAO,KAAK;AAAA,QAC9C,OAAO,OAAO,OAAO,SAAS,OAAO,OAAO,EAAE;AAAA,QAC9C,OAAO,OAAO,OAAO,OAAO,OAAO,SAAS,EAAE;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,WAAW;AAAA,IAC3D,IAAI,OAAO,KAAK,IAAI,GAAG;AAAA,IACvB,OAAO,OAAO,KAAK;AAAA,IACnB,OAAO;AAAA,EACT,EAAE;AACJ;AAEA,IAAM,mBAAoD,CAAC;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,EAAE,MAAM,KAAK,MAAM,aAAa,SAAS,WAAW,KAAK,IAAI;AACnE,QAAM,wBAAoB,yBAAQ,MAAM,iBAAiB,OAAO,GAAG,CAAC,OAAO,CAAC;AAE5E,QAAM,eAAe,CAAC,YAA0B,YAAsB;AACpE;AAAA,MACE,UAAU,gBAAgB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,UAAM,kBACJ,UAAU,cAAc,UAAU,WAAW,SAAS;AACxD,QACE,mBACA,UAAU,sCACV;AACA,mBAAa,OAAO,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,SACvB,gDAAC,SAAI,eAAW,oBAAAC,SAAW,oBAAoB,SAAS,GACtD;AAAA,oDAAC,WAAM,WAAU,oEACd;AAAA;AAAA,MACA,eAAe,+CAAC,UAAK,WAAU,sBAAqB,eAAC;AAAA,OACxD;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV;AAAA,QACA,OAAO,OAAO,SAAS,EAAE;AAAA,QACzB,UAAU,CAAC,UAA+C,aAAa,MAAM,OAAO,KAAK;AAAA,QACzF,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,kBAAkB,QAAQ,UAAU;AAAA;AAAA,IACtC;AAAA,KACE,SAAS,SACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,WAAW,QAAQ,kBAAkB,kBAAkB;AAAA,QAEjE,mBAAS;AAAA;AAAA,IACZ;AAAA,KAEJ;AAGF,QAAM,cAAc,MAAM;AACxB,YAAQ,UAAU,YAAY;AAAA,MAC5B;AACE,eAAO,gBAAgB,YAAY,aAAa,MAAM;AAAA,MACxD;AACE,eAAO,gBAAgB,QAAQ;AAAA,MACjC;AACE,eACE;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,QAAQ,KAAK;AAAA,YACtB,UAAU,CAAC,UAA+C,aAAa,MAAM,OAAO,OAAO;AAAA,YAC3F,OAAO;AAAA,YACP,aAAa;AAAA;AAAA,QACf;AAAA,MAEJ;AACE,eACE,gDAAC,SAAI,WAAU,oBACb;AAAA,0DAAC,WAAM,WAAU,oEACd;AAAA;AAAA,YACA,eAAe,+CAAC,UAAK,WAAU,sBAAqB,eAAC;AAAA,aACxD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,SAAS,EAAE;AAAA,cACzB,UAAU,CAAC,UAAgD,aAAa,MAAM,OAAO,SAAS,EAAE;AAAA,cAChG,UAAU;AAAA,cACV,kBAAkB,QAAQ,UAAU;AAAA,cAEnC,4BAAkB,IAAI,CAAC,WACtB,+CAAC,YAAuB,OAAO,OAAO,OACnC,iBAAO,SADG,OAAO,EAEpB,CACD;AAAA;AAAA,UACH;AAAA,WACE,SAAS,SACT;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,WAAW,QAAQ,kBAAkB,kBAAkB;AAAA,cAEjE,mBAAS;AAAA;AAAA,UACZ;AAAA,WAEJ;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU,YAAY;AACzB,WAAO;AAAA,EACT;AAEA,SACE,gDAAC,SAAI,WAAU,sIACZ;AAAA,gBAAY;AAAA,IACZ,QACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAK;AAAA,QACL,WAAW;AAAA,QACX,UAAQ;AAAA;AAAA,IACV;AAAA,KAEJ;AAEJ;AAEA,IAAO,2BAAQ;;;AE5GP,IAAAC,wBAAA;AAnDR,IAAM,aAGF;AAAA,EACF,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,MAAM,EAAE,MAAM,QAAQ,OAAO,QAAQ,YAAY,gBAAgB;AACnE;AAEO,IAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAAS,WAAW,IAAI;AAE9B,QAAM,eAAe,MAAM;AACzB,QAAI,UAAU;AACZ,eAAS;AAAA,IACX,OAAO;AACL,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAK;AAAA,MACL,MAAM,OAAO;AAAA,MACb,SACE,gDAAC,cAAM,SAAN,EACE;AAAA,gCACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS,qBAAqB;AAAA,YAE7B;AAAA;AAAA,QACH;AAAA,QAEF,+CAAC,kBAAO,SAAS,cAAc,OAAO,OAAO,OAC1C,uBACH;AAAA,SACF;AAAA,MAGF,yDAAC,SAAI,WAAW,yBAA0B,mBAAQ;AAAA;AAAA,EACpD;AAEJ;AAEA,IAAO,4BAAQ;;;AC3Ff,IAAAC,kBAAgE;AAChE,IAAAC,sBAAuB;AAkJb,IAAAC,wBAAA;AAnGH,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AACV,MAAM;AAGJ,QAAM,CAAC,SAAS,UAAU,QAAI,0BAAS,MAAM;AAC7C,QAAM,kBAAc,wBAAO,MAAM;AAEjC,iCAAU,MAAM;AACd,QAAI,UAAU,CAAC,YAAY,SAAS;AAClC,iBAAW,IAAI;AAAA,IACjB;AACA,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,sBAAsB,MAAM;AAChC,QAAI,CAAC,OAAQ,YAAW,KAAK;AAAA,EAC/B;AAGA,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAS,KAAK;AACtD,QAAM,oBAAgB,wBAAO,KAAK;AAClC,QAAM,gBAAY,wBAAO,CAAC;AAC1B,QAAM,oBAAgB,wBAAO,CAAC;AAG9B,iCAAU,MAAM;AACd,QAAI,CAAC,cAAc,QAAS,iBAAgB,KAAK;AAAA,EACnD,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,kBAAc;AAAA,IAClB,CAAC,MAAwB;AACvB,UAAI,CAAC,UAAW;AAChB,QAAE,eAAe;AACjB,oBAAc,UAAU;AACxB,gBAAU,UAAU,EAAE;AACtB,oBAAc,UAAU;AAExB,YAAM,cAAc,CAAC,OAAmB;AACtC,cAAM,QAAQ,UAAU,UAAU,GAAG;AACrC,cAAM,OAAO,KAAK;AAAA,UAChB;AAAA,UACA,KAAK,IAAI,UAAU,cAAc,UAAU,KAAK;AAAA,QAClD;AACA,wBAAgB,IAAI;AAAA,MACtB;AACA,eAAS,KAAK,MAAM,aAAa;AACjC,eAAS,KAAK,MAAM,SAAS;AAC7B,YAAM,YAAY,MAAM;AACtB,sBAAc,UAAU;AACxB,iBAAS,KAAK,MAAM,aAAa;AACjC,iBAAS,KAAK,MAAM,SAAS;AAC7B,eAAO,oBAAoB,aAAa,WAAW;AACnD,eAAO,oBAAoB,WAAW,SAAS;AAAA,MACjD;AACA,aAAO,iBAAiB,aAAa,WAAW;AAChD,aAAO,iBAAiB,WAAW,SAAS;AAAA,IAC9C;AAAA,IACA,CAAC,WAAW,cAAc,UAAU,QAAQ;AAAA,EAC9C;AAEA,QAAM,gBAAgB,YAAY,eAAe;AAEjD,MAAI,CAAC,QAAS,QAAO;AAErB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QAEA,CAAC,cAAc,WAAW;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,OAAO,SAAS,gBAAgB,EAAE;AAAA,MAC3C,iBAAiB;AAAA,MAGhB;AAAA,qBACC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAU;AAAA,YAGV;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,iEAAiE,KAAK,+BAA+B,KAAK,qBAAqB,KAAK,0BAA0B,KAAK;AAAA;AAAA,YAChL;AAAA;AAAA,QACF;AAAA,QAIF;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YACA,OAAO,EAAE,OAAO,cAAc;AAAA,YAG9B;AAAA,8DAAC,SAAI,WAAU,mHACZ;AAAA,wBAAQ,+CAAC,SAAI,WAAU,mBAAmB,gBAAK;AAAA,gBAChD,gDAAC,SAAI,WAAU,kBACZ;AAAA,2BACC,+CAAC,QAAG,WAAU,yEACX,iBACH;AAAA,kBAED,YACC,+CAAC,OAAE,WAAU,kEACV,oBACH;AAAA,mBAEJ;AAAA,gBACA,gDAAC,SAAI,WAAU,2CACZ;AAAA;AAAA,kBACA,WACC;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,MAAM;AAAA,sBACN,SAAQ;AAAA,sBACR,OAAM;AAAA,sBACN,SAAS;AAAA,sBACT,cAAW;AAAA;AAAA,kBACb;AAAA,mBAEJ;AAAA,iBACF;AAAA,cAGA,+CAAC,SAAI,WAAU,kCAAkC,UAAS;AAAA,cAGzD,UACC,+CAAC,SAAI,WAAU,2EACZ,kBACH;AAAA;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,oBAAQ;;;AC7Mf,IAAAC,kBAMO;AACP,IAAAC,sBAAuB;;;ACahB,IAAM,iBAAkC;AAAA,EAC7C,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO,CAAC,WAAW,SAAS;AAAA,EAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,EAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,EACjC,SAAS,CAAC,WAAW,SAAS;AAChC;AAQA,IAAM,cAA+C;AAAA,EACnD,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,KAAK;AAAA,IACH,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AAAA,EACA,SAAS;AAAA,EACT,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO,CAAC,WAAW,SAAS;AAAA,IAC5B,UAAU,CAAC,WAAW,SAAS;AAAA,IAC/B,YAAY,CAAC,WAAW,SAAS;AAAA,IACjC,SAAS,CAAC,WAAW,SAAS;AAAA,EAChC;AACF;AAIA,SAAS,iBAAiB,OAA0B;AAClD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,mBACd,MACiB;AACjB,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,iBAAiB,IAAI;AAClC,SAAO,YAAY,IAAI,KAAK;AAC9B;;;ADhJQ,IAAAC,wBAAA;AAtIR,SAAS,YAAqB;AAC5B,QAAM,SAAS,MAAe;AAC5B,QAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,aAAS,KAAK,YAAY,KAAK;AAC/B,UAAM,OAAO,OAAO,iBAAiB,KAAK,EAAE,YAAY;AACxD,UAAM,OAAO;AACb,WAAO;AAAA,EACT;AACA,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAkB,MAAM,OAAO,CAAC;AAC5D,iCAAU,MAAM;AACd,UAAM,SAAS,MAAM,UAAU,OAAO,CAAC;AACvC,UAAM,MAAM,IAAI,iBAAiB,MAAM;AACvC,QAAI,QAAQ,SAAS,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;AACpE,UAAM,QAAQ,OAAO,WAAW,8BAA8B;AAC9D,UAAM,iBAAiB,UAAU,MAAM;AACvC,WAAO;AACP,WAAO,MAAM;AACX,YAAM,oBAAoB,UAAU,MAAM;AAC1C,UAAI,WAAW;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAKA,IAAM,QAAQ;AAEd,IAAM,UAAU;AAMhB,IAAM,gBAAgB;AAEtB,IAAM,SAAS;AAEf,IAAM,aAAa;AAEnB,IAAM,QAAQ;AAEd,IAAM,cAAc;AAEpB,IAAM,KAAK;AAsBX,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,mBAAmB,IAAI;AAEnC,QAAM,aAAa,IAAI,MAAM,EAAE;AAC/B,QAAM,cAAc,IAAI,MAAM,EAAE;AAChC,QAAM,WAAW,IAAI,QAAQ,EAAE;AAC/B,QAAM,aAAa,IAAI,MAAM,EAAE;AAC/B,QAAM,UAAU,IAAI,SAAS,EAAE;AAC/B,QAAM,UAAU,IAAI,SAAS,EAAE;AAC/B,QAAM,YAAY,IAAI,MAAM,EAAE;AAG9B,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,KAAK,OAAO,IAAI,CAAC;AACvB,YAAQ;AAAA,EACV;AAEA,QAAM,YAAY;AAElB,MAAI,cAAc,KAAK,MAAM,WAAW,EAAG,QAAO;AAKlD,QAAM,YAAY,MACf;AAAA,IAAI,CAAC,IAAI,SACP,GAAG,SAAS,OAAO,KAAK,GAAG,UAAU,GAAG,YAAY,MAAM;AAAA,EAC7D,EACC,OAAO,CAAC,QAAQ,OAAO,CAAC;AAI3B,QAAM,aAAa,cAAc;AACjC,QAAM,aAAa,MAAM,UAAU,CAAC,OAAO,GAAG,SAAS;AACvD,QAAM,gBAAgB,UAAU,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,SAAS,MAAM;AAC/D,UAAM,QAAQ,UAAU,IAAI,CAAC;AAC7B,UAAM,SAAS,cAAc,KAAK,WAAW;AAC7C,WAAO;AAAA,MACL,IAAI,MAAM,OAAO,IAAI;AAAA,MACrB,IAAI,MAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,OAAO,KAAK,IAAI,SAAS;AAAA,MAClC,UAAS;AAAA,MACT,eAAY;AAAA,MACZ,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,KAAK,GAAG,eAAe,OAAO;AAAA,MAGrE;AAAA,sBAAc,IAAI,CAAC,EAAE,IAAI,IAAI,OAAO,GAAG,MACtC;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI;AAAA,YACJ;AAAA,YACA,IAAI;AAAA,YACJ;AAAA,YACA,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,eAAc;AAAA,YACb,GAAI,SAAS,EAAE,iBAAiB,MAAM,IAAI,CAAC;AAAA;AAAA,UARvC;AAAA,QASP,CACD;AAAA,QAGA,iBACC,MAAM,IAAI,CAAC,IAAI,MAAM;AACnB,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI,CAAC,QAAQ,KAAK,UAAU,KAAK,UAAW,QAAO;AACnD,gBAAM,UAAU,aAAa,KAAK,IAAI;AACtC,cAAI,CAAC,QAAS,QAAO;AACrB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,GAAG;AAAA,cACH,MAAM;AAAA;AAAA,YAJD,MAAM,KAAK,EAAE;AAAA,UAKpB;AAAA,QAEJ,CAAC;AAAA,QAGF,MAAM,IAAI,CAAC,IAAI,MAAM;AACpB,gBAAM,OAAO,MAAM,CAAC;AACpB,cAAI,CAAC,KAAM,QAAO;AAElB,cAAI,KAAK,QAAQ;AAGf,kBAAM,SACJ,IAAI,MAAM,SAAS,IAAI,YAAY,KAAK,cAAc;AACxD,mBACE,gDAAC,OACC;AAAA,6DAAC,YAAO,IAAI,SAAS,IAAI,IAAI,GAAG,aAAa,MAAM,UAAU;AAAA,cAC7D;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,MAAK;AAAA;AAAA,cACP;AAAA,cACA,+CAAC,YAAO,IAAI,SAAS,IAAI,IAAI,GAAE,OAAM,MAAM,SAAS;AAAA,cACnD,KAAK,aACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,IAAI,KAAK,cAAc;AAAA,kBACvB,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,eAAc;AAAA,kBACd,iBAAgB;AAAA;AAAA,cAClB;AAAA,iBArBI,KAAK,EAuBb;AAAA,UAEJ;AAEA,cAAI,KAAK,WAAW;AAClB,kBAAM,gBAAgB,IAAI,MAAM,SAAS;AACzC,kBAAM,SAAS,gBAAgB,YAAY,KAAK,cAAc;AAC9D,kBAAM,WAAW,KAAK,IAAI,KAAK,SAAS,GAAG,CAAC;AAC5C,gBAAIC,SAAuB;AAC3B,gBAAI,WAAW,GAAG;AAChB,oBAAMC,MAAK,SAAS,WAAW,KAAK,gBAAgB,SAAS;AAC7D,kBAAI,cAAc,IAAI;AACtB,qBACE,cAAc,MACb,MAAM,WAAW,GAAG,SAAS,KAAK;AAEnC;AACF,oBAAMC,aAAY,MAAM,WAAW,IAC9B,MAAM,WAAW,EAAE,SAAS,IAC7B;AACJ,oBAAMC,UACJD,aAAY,WAAW,SAAS,IAAI,QAAQ,CAAC;AAC/C,oBAAME,SAAQ,MAAM,WAAW,KAAK,MAAMD;AAC1C,oBAAME,UAAS,QAAQ,WAAW,gBAAgB;AAClD,oBAAMC,WAAU,KAAK,IAAIF,OAAM,KAAK,UAAU;AAC9C,cAAAJ,SAAQ;AAAA,gBACN,KAAKC,GAAE,IAAIG,KAAI;AAAA,gBACf,KAAKH,GAAE,IAAIK,QAAO;AAAA,gBAClB,KAAK,UAAU,IAAI,UAAU,UAAUL,MAAK,UAAU,IAAI,EAAE;AAAA,gBAC5D,KAAKI,OAAM,IAAI,EAAE;AAAA,cACnB,EAAE,KAAK,GAAG;AAAA,YACZ;AACA,mBACE,gDAAC,OACC;AAAA,6DAAC,YAAO,IAAI,SAAS,IAAI,IAAI,GAAG,aAAa,MAAM,SAAS;AAAA,cAC5D;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,MAAK;AAAA;AAAA,cACP;AAAA,cACCL,UACC;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAGA;AAAA,kBACH,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,eAAc;AAAA,kBACd,MAAK;AAAA;AAAA,cACP;AAAA,cAEF;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAI;AAAA,kBACJ,IAAI,KAAK,cAAc;AAAA,kBACvB,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,eAAc;AAAA,kBACd,iBAAgB;AAAA;AAAA,cAClB;AAAA,iBA5BM,KAAK,EA6Bb;AAAA,UAEJ;AAKA,gBAAM,QAAQ,KAAK,IAAI,KAAK,SAAS,GAAG,CAAC;AACzC,cAAI,UAAU,EAAG,QAAO;AAGxB,gBAAM,KAAK,SAAS,QAAQ,KAAK,gBAAgB,SAAS;AAG1D,cAAI,aAAa,IAAI;AACrB,iBAAO,aAAa,MAAM,MAAM,UAAU,GAAG,SAAS,KAAK;AACzD;AACF,gBAAM,YAAY,MAAM,UAAU,IAC7B,MAAM,UAAU,EAAE,SAAS,IAC5B;AACJ,gBAAM,SAAS,YAAY,QAAQ,SAAS,IAAI,QAAQ,CAAC;AACzD,gBAAM,QAAQ,MAAM,UAAU,KAAK,MAAM;AACzC,gBAAM,SAAS,QAAQ,QAAQ,gBAAgB;AAC/C,gBAAM,UAAU,KAAK,IAAI,MAAM,KAAK,UAAU;AAE9C,gBAAM,QAAQ;AAAA,YACZ,KAAK,EAAE,IAAI,IAAI;AAAA,YACf,KAAK,EAAE,IAAI,OAAO;AAAA,YAClB,KAAK,UAAU,IAAI,UAAU,UAAU,KAAK,UAAU,IAAI,EAAE;AAAA,YAC5D,KAAK,MAAM,IAAI,EAAE;AAAA,UACnB,EAAE,KAAK,GAAG;AAEV,iBACE,+CAAC,OACC;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,QAAQ;AAAA,cACR,aAAa;AAAA,cACb,eAAc;AAAA,cACd,MAAK;AAAA;AAAA,UACP,KAPM,KAAK,EAQb;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;AAIA,IAAM,qBAAmD;AAAA,EACvD,UACE;AAAA,EACF,UACE;AAAA,EACF,QACE;AAAA,EACF,OACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AAAA,EACF,gBACE;AAAA,EACF,QACE;AACJ;AAEA,IAAMO,gBAA4C;AAAA,EAChD,SAAS;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,MAAM;AACR;AASA,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,MAAM,OAAO,QAAI,0BAAS,KAAK;AACtC,QAAM,UAAM,wBAA0B,IAAI;AAC1C,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SACE,kFACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAChC,WAAU;AAAA,QAEV;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,QAAO;AAAA,YACP,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,eAAY;AAAA,YAEZ;AAAA,6DAAC,YAAO,IAAG,OAAM,IAAG,KAAI,GAAE,OAAM;AAAA,cAChC,+CAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM;AAAA,cAC9B,+CAAC,YAAO,IAAG,QAAO,IAAG,KAAI,GAAE,OAAM;AAAA;AAAA;AAAA,QACnC;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX;AAAA,QACA,SAAS,MAAM,QAAQ,KAAK;AAAA,QAC5B,OAAO;AAAA,QACP,UAAU,CAAC,QAAQ;AACjB,mBAAS,GAAG;AACZ,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,OAAM;AAAA,QACN,OAAO;AAAA;AAAA,IACT;AAAA,KACF;AAEJ;AAWA,IAAM,kBAAkD,CAAC;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,KAAK,IAAI,KAAK,SAAS,GAAG,CAAC;AACzC,QAAM,UAAU,QAAQ;AAExB,QAAM,mBACJ,KAAK,mBAAmB,CAAC,GACzB,IAAI,CAAC,OAAO;AAAA,IACZ,OAAO,EAAE;AAAA,IACT,OAAO,EAAE;AAAA,IACT,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,UAAU,EAAE;AAAA,EACd,EAAE;AAEF,QAAM,uBAAuB,CAAC,WAA+B;AAC3D,SAAK,iBAAiB,KAAK,CAAC,MAAM,EAAE,UAAU,OAAO,KAAK,GAAG,UAAU;AAAA,EACzE;AAEA,QAAM,uBAAmB,oBAAAC;AAAA,IACvB,KAAK,iBAAiB,mBAAmB,KAAK,SAAS;AAAA,EACzD;AAEA;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,QAAQ,QAAQ;AAAA,QAGtC;AAAA,0DAAC,SAAI,WAAU,0CAEZ;AAAA,iBAAK,QACJ;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA;AAAA,gBACF;AAAA,gBAEC,eAAK;AAAA;AAAA,YACR;AAAA,YAGF,gDAAC,SAAI,WAAU,kBACb;AAAA,6DAAC,SAAI,WAAU,uEACZ,eAAK,OACR;AAAA,cACC,KAAK,YACJ,+CAAC,SAAI,WAAU,kEACZ,eAAK,UACR;AAAA,eAEJ;AAAA,aACF;AAAA,WAGG,KAAK,YAAY,UAClB,KAAK,YAAY,SAChB,CAAC,MAAM,QAAQ,KAAK,OAAO,KACzB,KAAK,QAAkC,SAAS,MACnD,gBAAgB,SAAS,MACzB,gDAAC,SAAI,WAAU,sCACZ;AAAA,kBAAM,QAAQ,KAAK,OAAO,IACtB,KAAK,QAAkC,IAAI,CAAC,QAAQ,QACnD;AAAA,cAAC;AAAA;AAAA,gBAEC,SAAS,OAAO,WAAW;AAAA,gBAC3B,OAAO,OAAO,SAAS;AAAA,gBACvB,MAAM,OAAO,QAAQ,cAAc;AAAA,gBACnC,SAAS,OAAO;AAAA,gBAChB,UAAU,OAAO;AAAA,gBACjB,SAAS,OAAO;AAAA,gBAEf,iBAAO;AAAA;AAAA,cARH;AAAA,YASP,CACD,IACA,KAAK;AAAA,YACV;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,UAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA;AAAA;AAAA,IAEJ;AAAA;AAEJ;AAEA,SAAS,qBAAqB,GAA4C;AACxE,SACE,OAAO,MAAM,YACb,MAAM,QACN,CAAC,gBAAAC,QAAM,eAAe,CAAC,KACvB,WAAW;AAEf;AAIA,IAAM,gBAA8C,CAAC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,MAAM;AACJ,QAAM,SAAS,UAAU;AACzB,QAAM,UAAU,mBAAmB,IAAI;AAGvC,QAAM,cAAU,wBAAkC,CAAC,CAAC;AACpD,QAAM,CAAC,aAAa,cAAc,QAAI,0BAAmB,CAAC,CAAC;AAE3D,QAAM,qBAAiB,6BAAY,MAAM;AACvC,UAAM,UAAU,QAAQ,QAAQ,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;AACjE;AAAA,MAAe,CAAC,SACd,KAAK,WAAW,QAAQ,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM,MAAM,QAAQ,CAAC,CAAC,IACnE,OACA;AAAA,IACN;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,uCAAgB,MAAM;AAGpB,YAAQ,UAAU,QAAQ,QAAQ,MAAM,GAAG,MAAM,MAAM;AACvD,mBAAe;AACf,UAAM,KAAK,IAAI,eAAe,cAAc;AAC5C,YAAQ,QAAQ,QAAQ,CAAC,OAAO,MAAM,GAAG,QAAQ,EAAE,CAAC;AACpD,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,gBAAgB,KAAK,CAAC;AAG1B,QAAM,gBAAgB,MAAM;AAC1B,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,mBAAO,oBAAAD,SAAW,mBAAmB,UAAU,QAAQ,MAAM;AAAA,MAC/D,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,mBAAmB;AAAA,UACnB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA,SAAW,mBAAmB,OAAO,QAAQ,OAAO;AAAA,MAC7D,KAAK;AACH,mBAAO,oBAAAA;AAAA,UACL,mBAAmB;AAAA,UACnB;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF,KAAK;AACH,mBAAO,oBAAAA,SAAW,mBAAmB,MAAM;AAAA,MAC7C;AACE,eAAO,mBAAmB,OAAO,KAAK,mBAAmB;AAAA,IAC7D;AAAA,EACF,GAAG;AAEH,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACAE,eAAc,OAAuB;AAAA,QACrC;AAAA,QACAH,cAAa,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,MACA,aAAW;AAAA,MAGT;AAAA,kBAAS,iBACT,gDAAC,SAAI,eAAW,oBAAAC,SAAW,yCAAyC,GACjE;AAAA,mBACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,oBAAAA;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cACV;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UAED,iBACE,MAAM;AACL,gBAAI,qBAAqB,YAAY,GAAG;AACtC,qBACE;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS,aAAa,WAAW;AAAA,kBACjC,OAAO,aAAa,SAAS;AAAA,kBAC7B,MAAM,aAAa,QAAQ;AAAA,kBAC3B,SAAS,aAAa;AAAA,kBACtB,UAAU,aAAa;AAAA,kBACvB,SAAS,aAAa;AAAA,kBACtB,aAAa,aAAa;AAAA,kBAC1B,QAAO;AAAA,kBAEN,uBAAa;AAAA;AAAA,cAChB;AAAA,YAEJ;AACA,mBACE,+CAAC,SAAI,WAAU,uBACZ,wBACH;AAAA,UAEJ,GAAG;AAAA,WACP;AAAA,QAIF,+CAAC,SAAI,WAAU,YACZ,qBAAW,MAAM,WAAW;AAAA;AAAA,UAE3B,+CAAC,SAAI,WAAU,2DACb;AAAA,YAAC;AAAA;AAAA,cACC,kBAAkB,aAAa;AAAA,cAC/B,OAAO;AAAA,cACP,OAAO,aAAa;AAAA,cACpB,oBAAoB,aAAa;AAAA,cACjC,OAAO,aAAa;AAAA,cACpB,MAAM,aAAa;AAAA,cACnB,gBAAgB,aAAa;AAAA,cAC7B,OAAO,aAAa;AAAA,cACpB,SAAS,aAAa;AAAA;AAAA,UACxB,GACF;AAAA,YACE,MAAM,WAAW,KAAK,aACxB,+CAAC,SAAI,WAAU,QAAQ,sBAAW,IAElC,gDAAC,SAAI,WAAU,YAEZ;AAAA,sBAAY,WAAW,MAAM,UAAU,MAAM,SAAS,KACrD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UAGF,+CAAC,SAAI,eAAW,oBAAAA,SAAW,WAAW,qBAAqB,GACxD,gBAAM,IAAI,CAAC,MAAM,MAChB;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO;AAAA,cACP;AAAA,cACA,SAAS,CAAC,OAAO;AACf,wBAAQ,QAAQ,CAAC,IAAI;AAAA,cACvB;AAAA,cACA,YAAW;AAAA;AAAA,YANN,KAAK;AAAA,UAOZ,CACD,GACH;AAAA,UAGC,WACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAO;AAAA,cACP,OAAK;AAAA,cACL,OAAO;AAAA,cACP,kBAAkB,aAAa;AAAA,cAC/B,oBAAoB,aAAa,sBAAsB;AAAA,cACvD,OAAO,aAAa;AAAA,cACpB,MAAM,aAAa;AAAA,cACnB,gBAAgB,aAAa;AAAA,cAC7B,OAAO,aAAa;AAAA,cACpB,SAAS,aAAa;AAAA,cACtB,WAAU;AAAA;AAAA,UACZ;AAAA,WAEJ,GAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,cAAc,cAAc;AAE5B,IAAO,wBAAQ;;;AE7sBf,IAAAG,kBAOO;AACP,IAAAC,sBAAuB;;;ACRvB,IAAAC,kBAAoE;AA+PxD,IAAAC,wBAAA;AAxPZ,SAASC,aAAqB;AAC5B,QAAM,aAAa,MAAe;AAChC,QAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,aAAS,KAAK,YAAY,KAAK;AAC/B,UAAM,aAAa,OAAO,iBAAiB,KAAK,EAAE,YAAY;AAC9D,UAAM,OAAO;AACb,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAkB,MAAM,WAAW,CAAC;AAEhE,iCAAU,MAAM;AACd,UAAM,SAAS,MAAM,UAAU,WAAW,CAAC;AAC3C,UAAM,MAAM,IAAI,iBAAiB,MAAM;AACvC,QAAI,QAAQ,SAAS,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;AACpE,UAAM,QAAQ,OAAO,WAAW,8BAA8B;AAC9D,UAAM,iBAAiB,UAAU,MAAM;AACvC,WAAO;AACP,WAAO,MAAM;AACX,YAAM,oBAAoB,UAAU,MAAM;AAC1C,UAAI,WAAW;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAIA,IAAM,eAAkE;AAAA,EACtE,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAgFA,IAAM,0BAAkE,CAAC;AAAA,EACvE,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB,CAAC;AAAA,EACpB;AAAA,EACA,mBAAmB,CAAC;AAAA,EACpB,oBAAoB,CAAC;AAAA,EACrB,mBAAmB;AAAA,EACnB,YAAY;AACd,MAAM;AACJ,QAAM,SAASA,WAAU;AAGzB,QAAM,mBAAe,wBAAuB,IAAI;AAChD,QAAM,CAAC,eAAe,gBAAgB,QAAI,0BAAS,KAAK;AAExD,uCAAgB,MAAM;AACpB,QAAI,CAAC,WAAW;AACd,uBAAiB,KAAK;AACtB;AAAA,IACF;AACA,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AACT,UAAM,KAAK,IAAI,eAAe,MAAM;AAClC,YAAMC,KAAI,GAAG;AACb,UAAIA,KAAI,EAAG,kBAAiBA,EAAC;AAAA,IAC/B,CAAC;AACD,OAAG,QAAQ,EAAE;AACb,UAAM,UAAU,GAAG;AACnB,QAAI,UAAU,EAAG,kBAAiB,OAAO;AACzC,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,WAAW,KAAK,CAAC;AACrB,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,KAAK,aAAa,UAAU;AAClC,QAAM,QAAQ;AAGd,QAAM,WACJ,UAAU,aAAc,oBAAoB,UAAU;AAExD,QAAM,WAAW,UAAU;AAG3B,QAAM,YAAY,mBAAmB,UAAU;AAC/C,QAAM,YAAY,mBAAmB,UAAU;AAE/C,QAAM,UAAU,cAAc,UAAU,SAAS,EAAE;AACnD,QAAM,YAAY,gBAAgB,UAAU,WAAW,EAAE;AACzD,QAAM,SAAS,aAAa,UAAU,QAAQ,EAAE;AAChD,QAAM,UACJ,eACC,WAAW,UAAU,SAAS,EAAE,IAAI,eAAe,SAAS,EAAE;AACjE,QAAM,YACJ,iBACC,WAAW,UAAU,WAAW,EAAE,IAAI,eAAe,WAAW,EAAE;AACrE,QAAM,SACJ,cACC,WAAW,UAAU,QAAQ,EAAE,IAAI,eAAe,QAAQ,EAAE;AAE/D,QAAM,YAAY,WACd,UAAU,WAAW,EAAE,IACvB,eAAe,WAAW,EAAE;AAChC,QAAM,eACJ,gBACC,WAAW,UAAU,QAAQ,EAAE,IAAI,eAAe,QAAQ,EAAE;AAG/D,QAAM,gBAAgB,CAAC,EAAE,eAAe,YAAY,SAAS;AAC7D,QAAM,gBAAgB,CAAC,EAAE,gBAAgB,aAAa,SAAS;AAE/D,QAAM,OAAO,mBAAmB,QAAQ,IAAI;AAE5C,QAAM,KAAK,cAAc,CAAC,KAAK,OAAO;AAEtC,QAAM,KAAK,gBAAgB;AAE3B,QAAM,KAAK;AAGX,QAAM,IAAI,YAAY,gBAAgB;AAGtC,QAAM,WAAW,IAAI;AAGrB,QAAM,eAAe;AACrB,QAAM,UAAU,aAAa;AAI7B,QAAM,SAAS,CAAC,MACd,OAAO,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,YAAY,IAAI,KAAK;AAE3D,QAAM,SAAS,KAAK,CAAC,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,CAAC,IAAI,KAAK,KAAK;AAGhF,QAAM,SAAS,IAAI;AAEnB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,0DAA0D,YAAY,oBAAoB,WAAW;AAAA,MAChH,OAAO,YAAY,EAAE,QAAQ,KAAK,IAAI,EAAE,OAAO,GAAG,QAAQ,KAAK;AAAA,MAE/D;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS,OAAO,CAAC,IAAI,IAAI;AAAA,YACzB,UAAS;AAAA,YACT,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,KAAK,GAAG,eAAe,OAAO;AAAA,YAGrE;AAAA,2BACE,gBACC,kFAEG;AAAA,4BAAa,IAAI,CAAC,IAAI,QACrB;AAAA,kBAAC;AAAA;AAAA,oBAEC,GACE,OAAO,KACH,OAAO,EAAE,MAAM,MAAM,IAAI,EAAE,KAC3B,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE;AAAA,oBAE3E,QAAQ;AAAA,oBACR,aAAa,QAAQ,IAAI,IAAI;AAAA,oBAC7B,eAAc;AAAA,oBACd,iBAAiB,UAAU,aAAa,QAAQ;AAAA,oBAChD,eAAe,QAAQ,IAAI,IAAI;AAAA,oBAC/B,MAAK;AAAA;AAAA,kBAXA,aAAa,GAAG;AAAA,gBAYvB,CACD;AAAA,gBAED;AAAA,kBAAC;AAAA;AAAA,oBACC,GACE,OAAO,KACH,KAAK,MAAM,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,KACtC,KAAK,MAAM,IAAI,EAAE,OAAO,SAAS,KAAK,CAAC,IAAI,EAAE,MAAM,SAAS,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE;AAAA,oBAElG,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,eAAc;AAAA,oBACd,iBAAiB,UAAU,aAAa,QAAQ;AAAA,oBAChD,MAAK;AAAA;AAAA,gBACP;AAAA,iBACF,IACE,gBACF,iFAEG,uBAAc,IAAI,CAAC,IAAI,QACtB;AAAA,gBAAC;AAAA;AAAA,kBAEC,GACE,OAAO,KACH,KAAK,KAAK,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,KACrC,KAAK,KAAK,IAAI,EAAE,MAAM,QAAQ,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE;AAAA,kBAEjF,QAAQ;AAAA,kBACR,aAAa,QAAQ,IAAI,IAAI;AAAA,kBAC7B,eAAc;AAAA,kBACd,iBAAiB,UAAU,aAAa,QAAQ;AAAA,kBAChD,eAAe,QAAQ,IAAI,IAAI;AAAA,kBAC/B,MAAK;AAAA;AAAA,gBAXA,gBAAgB,GAAG;AAAA,cAY1B,CACD,GACH,IAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,GACE,OAAO,KACH,KAAK,KAAK,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,KACrC,KAAK,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE;AAAA,kBAE3E,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,eAAc;AAAA,kBACd,MAAK;AAAA,kBACL,iBAAiB,UAAU,aAAa,QAAQ;AAAA;AAAA,cAClD;AAAA,cAIH,gBACC,YAAa,IAAI,CAAC,IAAI,QAAQ;AAC5B,sBAAM,OACJ,QAAQ,IACJ,aACC,iBAAiB,MAAM,CAAC,KAAK;AACpC,sBAAM,MAAM,mBAAmB,IAAI;AACnC,sBAAM,OAAO,QAAQ,IAAI,UAAU,IAAI,SAAS,EAAE;AAClD,sBAAM,SAAS,QAAQ,IAAI,YAAY,IAAI,WAAW,EAAE;AACxD,sBAAM,MAAM,QAAQ,IAAI,SAAS,IAAI,QAAQ,EAAE;AAC/C,uBACE,gDAAC,OACE;AAAA,6BACC,kFACE;AAAA,mEAAC,UAAK,GAAG,OAAO,EAAE,GAAG,MAAY;AAAA,oBACjC;AAAA,sBAAC;AAAA;AAAA,wBACC,GAAG,OAAO,EAAE;AAAA,wBACZ,QAAQ;AAAA,wBACR,aAAa;AAAA,wBACb,MAAK;AAAA,wBACL,eAAc;AAAA;AAAA,oBAChB;AAAA,qBACF,IAEA,kFACE;AAAA,mEAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAG,OAAO,MAAY;AAAA,oBAC7C;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,GAAG;AAAA,wBACH,QAAQ;AAAA,wBACR,aAAa;AAAA,wBACb,MAAK;AAAA;AAAA,oBACP;AAAA,qBACF;AAAA,kBAEF,+CAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAE,KAAI,MAAM,KAAK;AAAA,qBAzBlC,OAAO,GAAG,EA0BlB;AAAA,cAEJ,CAAC,IAED,gDAAC,OACE;AAAA,2BACC,kFACE;AAAA,iEAAC,UAAK,GAAG,OAAO,EAAE,GAAG,MAAM,SAAS;AAAA,kBACpC;AAAA,oBAAC;AAAA;AAAA,sBACC,GAAG,OAAO,EAAE;AAAA,sBACZ,QAAQ;AAAA,sBACR,aAAa;AAAA,sBACb,MAAK;AAAA,sBACL,eAAc;AAAA;AAAA,kBAChB;AAAA,mBACF,IAEA,kFACE;AAAA,iEAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAG,OAAO,MAAM,SAAS;AAAA,kBAChD;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,GAAG;AAAA,sBACH,QAAQ;AAAA,sBACR,aAAa;AAAA,sBACb,MAAK;AAAA;AAAA,kBACP;AAAA,mBACF;AAAA,gBAEF,+CAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAE,KAAI,MAAM,QAAQ;AAAA,iBAC7C;AAAA,cAID,gBACC,aAAc,IAAI,CAAC,IAAI,QAAQ;AAC7B,sBAAM,OAAO,iBAAiB,GAAG,KAAK;AACtC,sBAAM,MAAM,mBAAmB,IAAI;AACnC,sBAAM,YAAY,kBAAkB,GAAG,KAAK;AAC5C,sBAAM,WAAW,cAAc;AAC/B,sBAAM,OAAO,WACT,IAAI,SAAS,EAAE,IACf,eAAe,SAAS,EAAE;AAC9B,sBAAM,SAAS,WACX,IAAI,WAAW,EAAE,IACjB,eAAe,WAAW,EAAE;AAChC,sBAAM,MAAM,WAAW,IAAI,QAAQ,EAAE,IAAI,eAAe,QAAQ,EAAE;AAClE,sBAAM,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,CAAC,IAAI,KAAK,KAAK;AAC7E,uBACE,gDAAC,OACE;AAAA,6BACC,kFACE;AAAA,mEAAC,UAAK,GAAG,KAAK,MAAY;AAAA,oBAC1B;AAAA,sBAAC;AAAA;AAAA,wBACC,GAAG;AAAA,wBACH,QAAQ;AAAA,wBACR,aAAa;AAAA,wBACb,MAAK;AAAA,wBACL,eAAc;AAAA;AAAA,oBAChB;AAAA,qBACF,IAEA,kFACE;AAAA,mEAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAG,OAAO,MAAY;AAAA,oBAC7C;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAI;AAAA,wBACJ,IAAI;AAAA,wBACJ,GAAG;AAAA,wBACH,QAAQ;AAAA,wBACR,aAAa;AAAA,wBACb,MAAK;AAAA;AAAA,oBACP;AAAA,qBACF;AAAA,kBAEF,+CAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAE,KAAI,MAAM,KAAK;AAAA,qBAzBlC,OAAO,GAAG,EA0BlB;AAAA,cAEJ,CAAC,IAED,gDAAC,OACE;AAAA,2BACC,kFACE;AAAA,iEAAC,UAAK,GAAG,QAAQ,MAAM,SAAS;AAAA,kBAChC;AAAA,oBAAC;AAAA;AAAA,sBACC,GAAG;AAAA,sBACH,QAAQ;AAAA,sBACR,aAAa;AAAA,sBACb,MAAK;AAAA,sBACL,eAAc;AAAA;AAAA,kBAChB;AAAA,mBACF,IAEA,kFACE;AAAA,iEAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAG,OAAO,MAAM,SAAS;AAAA,kBAChD;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI;AAAA,sBACJ,IAAI;AAAA,sBACJ,GAAG;AAAA,sBACH,QAAQ;AAAA,sBACR,aAAa;AAAA,sBACb,MAAK;AAAA;AAAA,kBACP;AAAA,mBACF;AAAA,gBAEF,+CAAC,YAAO,IAAI,GAAG,IAAI,IAAI,GAAE,KAAI,MAAM,QAAQ;AAAA,iBAC7C;AAAA,cAID,aACE,iBACI,MAAM;AAEL,uBAAO,aAAc,IAAI,CAAC,IAAI,QAAQ;AACpC,wBAAM,YAAY,kBAAkB,GAAG,KAAK;AAC5C,wBAAM,aAAa,cAAc;AACjC,sBAAI,CAAC,WAAY,QAAO;AAGxB,wBAAM,YAAY,IAAI,IAAI,QAAQ,KAAK,IAAI,KAAK,EAAE,IAAI;AACtD,wBAAM,UAAU,KAAK;AAAA,oBACnB;AAAA,oBACA,KAAK,KAAK,YAAY,UAAU;AAAA,kBAClC;AACA,wBAAM,aAAa,UAAU;AAC7B,wBAAM,UAAU,UAAU;AAC1B,wBAAM,WAAW,KAAK,IAAI,GAAG,aAAa,SAAS;AAGnD,wBAAM,WACJ,OAAO,KACH,KAAK,KAAK,IAAI,EAAE,MAAM,IAAI,QAAQ,QAAQ,IAAI,EAAE,KAChD,KAAK,KAAK,IAAI,EAAE,MAAM,QAAQ,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,MAAM,IAAI,QAAQ,QAAQ,IAAI,EAAE;AAEjH,wBAAM,aAAa,YAAY;AAC/B,wBAAM,eAAe,KAAK;AAAA,oBACxB;AAAA,oBACA,aAAa,KAAK;AAAA,kBACpB;AACA,wBAAM,YAAY,KAAK,IAAI,cAAc,IAAI,UAAU;AACvD,wBAAM,UAAU,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAI,aAAa,QAAQ,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC;AAE7F,wBAAM,OAAO,iBAAiB,GAAG,KAAK;AACtC,wBAAM,MAAM,mBAAmB,IAAI;AACnC,wBAAM,UAAU,IAAI,QAAQ,EAAE;AAE9B,yBAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,OACzC;AAAA,oBAAC;AAAA;AAAA,sBAEC,GAAE;AAAA,sBACF,MAAM;AAAA,sBACN,SAAQ;AAAA,sBAER;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAM;AAAA,4BACN,KAAK,GAAG,OAAO;AAAA,4BACf,OAAO,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,4BACpC,aAAY;AAAA;AAAA,wBACd;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAc;AAAA,4BACd,QAAO;AAAA,4BACP,UAAU;AAAA,4BACV,KAAK,GAAG,OAAO;AAAA,4BACf,OAAO,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,4BACpC,aAAY;AAAA;AAAA,wBACd;AAAA;AAAA;AAAA,oBAlBK,WAAW,GAAG,IAAI,EAAE;AAAA,kBAmB3B,CACD;AAAA,gBACH,CAAC;AAAA,cACH,GAAG,IACH,CAAC,WACC,OACA;AAAA;AAAA,gBAEE,YAAa,IAAI,CAAC,IAAI,QAAQ;AAE5B,wBAAM,YAAY,SAAS,KAAK,IAAI,KAAK,EAAE,IAAI;AAC/C,wBAAM,QAAQ,IAAI,SAAS;AAC3B,wBAAM,QAAQ,OAAO,KAAK,KAAK,IAAI,KAAK,EAAE,IAAI,MAAM;AACpD,wBAAM,YAAY,YAAY,QAAQ;AAEtC,wBAAM,UAAU,KAAK;AAAA,oBACnB;AAAA,oBACA,KAAK,KAAK,YAAY,UAAU;AAAA,kBAClC;AACA,wBAAM,aAAa,UAAU;AAC7B,wBAAM,UAAU,UAAU;AAC1B,wBAAM,WAAW,KAAK,IAAI,GAAG,aAAa,SAAS;AAGnD,wBAAM,MAAM,SAAS,KAAK;AAC1B,wBAAM,WAAW,IAAI,QAAQ;AAC7B,wBAAM,YACJ,OAAO,KACH,OAAO,EAAE,MAAM,MAAM,IAAI,EAAE,KAC3B,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE;AAC3E,wBAAM,UACJ,OAAO,KACH,MAAM,QAAQ,IAAI,EAAE,KACpB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE;AACpD,wBAAM,WAAW,GAAG,SAAS,GAAG,OAAO;AAEvC,wBAAM,aAAa,YAAY;AAC/B,wBAAM,eAAe,KAAK;AAAA,oBACxB;AAAA,oBACA,aAAa,KAAK;AAAA,kBACpB;AACA,wBAAM,YAAY,KAAK,IAAI,cAAc,IAAI,UAAU;AACvD,wBAAM,UAAU,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAI,aAAa,QAAQ,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC;AAE7F,yBAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,OACzC;AAAA,oBAAC;AAAA;AAAA,sBAEC,GAAE;AAAA,sBACF,MAAM;AAAA,sBACN,SAAQ;AAAA,sBAER;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAM;AAAA,4BACN,KAAK,GAAG,OAAO;AAAA,4BACf,OAAO,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,4BACpC,aAAY;AAAA;AAAA,wBACd;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,eAAc;AAAA,4BACd,QAAO;AAAA,4BACP,UAAU;AAAA,4BACV,KAAK,GAAG,OAAO;AAAA,4BACf,OAAO,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,4BACpC,aAAY;AAAA;AAAA,wBACd;AAAA;AAAA;AAAA,oBAlBK,OAAO,GAAG,IAAI,EAAE;AAAA,kBAmBvB,CACD;AAAA,gBACH,CAAC;AAAA,mBACA,MAAM;AACL,sBAAM,YAAY,IAAI,IAAI;AAC1B,sBAAM,gBAAgB,KAAK;AAAA,kBACzB;AAAA,kBACA,KAAK,KAAK,YAAY,UAAU;AAAA,gBAClC;AACA,sBAAM,aAAa,gBAAgB;AACnC,sBAAM,YAAY,gBAAgB;AAClC,sBAAM,WAAW,KAAK,IAAI,GAAG,aAAa,SAAS;AAEnD,sBAAM,aAAa,YAAY;AAC/B,sBAAM,eAAe,KAAK;AAAA,kBACxB;AAAA,kBACA,aAAa,KAAK;AAAA,gBACpB;AACA,sBAAM,YAAY,KAAK,IAAI,cAAc,IAAI,UAAU;AACvD,sBAAM,UAAU,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAI,aAAa,QAAQ,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC;AAI7F,sBAAM,WAAW,KAAK,IAAI,KAAK,EAAE,IAAI;AACrC,sBAAM,aAAa,WACf,KAAK,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,QAAQ,QAAQ,IAAI,EAAE,KAChF;AAEJ,uBAAO,MAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,CAAC,GAAG,MAC/C;AAAA,kBAAC;AAAA;AAAA,oBAEC,GAAE;AAAA,oBACF,MAAM;AAAA,oBACN,SAAQ;AAAA,oBACP,GAAI,CAAC,YAAY,EAAE,IAAI,GAAG;AAAA,oBAE1B;AAAA,iCACC;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAM;AAAA,0BACN,KAAK,GAAG,SAAS;AAAA,0BACjB,OAAO,IAAI,CAAC,IAAI,SAAS,QAAQ,CAAC,CAAC;AAAA,0BACnC,aAAY;AAAA;AAAA,sBACd,IAEA;AAAA,wBAAC;AAAA;AAAA,0BACC,eAAc;AAAA,0BACd,QAAQ,GAAG,KAAK,IAAI,IAAI,QAAQ,QAAQ;AAAA,0BACxC,UAAS;AAAA,0BACT,KAAK,GAAG,SAAS;AAAA,0BACjB,OAAO,IAAI,CAAC,IAAI,SAAS,QAAQ,CAAC,CAAC;AAAA,0BACnC,aAAY;AAAA;AAAA,sBACd;AAAA,sBAEF;AAAA,wBAAC;AAAA;AAAA,0BACC,eAAc;AAAA,0BACd,QAAO;AAAA,0BACP,UAAU;AAAA,0BACV,KAAK,GAAG,SAAS;AAAA,0BACjB,OAAO,IAAI,CAAC,IAAI,SAAS,QAAQ,CAAC,CAAC;AAAA,0BACnC,aAAY;AAAA;AAAA,sBACd;AAAA;AAAA;AAAA,kBA9BK,OAAO,CAAC;AAAA,gBA+Bf,CACD;AAAA,cACH,GAAG;AAAA;AAAA;AAAA,QACf;AAAA,QAGC,CAAC,iBACA,eACC,YACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,MAAM;AAAA,cACN,KAAK;AAAA,cACL,WAAW;AAAA,YACb;AAAA,YAEC;AAAA;AAAA,QACH,IAEA,+CAAC,SAAI,WAAU,kHACZ,sBACH;AAAA;AAAA;AAAA,EAEN;AAEJ;AAIA,IAAO,kCAAQ;;;AC3qBf,IAAAC,kBAAgE;AAChE,IAAAC,sBAAuB;;;ACDvB,IAAAC,kBAAmD;AACnD,IAAAC,sBAAuB;AA6EnB,IAAAC,wBAAA;AA/DJ,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAChB,MAAM;AACJ,QAAM,SAAS,mBAAmB,IAAI;AACtC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAS,eAAe;AACxE,QAAM,aAAa,YAAY;AAC/B,QAAM,YAAY,eAAgB,SAAS,UAAa,SAAS;AAGjE,QAAM,eAAW,wBAAuB,IAAI;AAC5C,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,0BAAS,KAAK;AAE1D,iCAAU,MAAM;AACd,QAAI,CAAC,aAAa,aAAa;AAC7B,wBAAkB,KAAK;AACvB;AAAA,IACF;AACA,UAAM,KAAK,SAAS;AACpB,QAAI,CAAC,GAAI;AACT,UAAM,QAAQ,MAAM,kBAAkB,GAAG,eAAe,GAAG,YAAY;AACvE,UAAM;AACN,UAAM,KAAK,IAAI,eAAe,KAAK;AACnC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,WAAW,aAAa,KAAK,CAAC;AAElC,QAAM,eAAe,MAAM;AACzB,QAAI,kBAAkB;AACpB,uBAAiB;AACjB;AAAA,IACF;AACA,wBAAoB,CAAC,MAAM,CAAC,CAAC;AAAA,EAC/B;AAMA,QAAM,UAAU,QACd;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,cACI,sCACA,YACE,oBACA;AAAA,QACN,OAAO;AAAA,QACP;AAAA,MACF;AAAA,MACA,OACE,aAAa,CAAC,cACV;AAAA,QACE,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,MACnB,IACA;AAAA,MAGL;AAAA;AAAA,EACH,IACE;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,cAAc;AAAA,QACd,aAAa;AAAA,QACb;AAAA,MACF;AAAA,MACA,OACE,QAAQ,IACJ;AAAA,QACE,WAAW;AAAA,QACX,gBAAgB,GAAG,QAAQ,IAAI;AAAA,MACjC,IACA;AAAA,MAGN;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA,OAAO;AAAA,UACT;AAAA,UAGC;AAAA,2BACC;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,OAAO;AAAA,gBACT;AAAA;AAAA,YACF;AAAA,YAIF;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,cAAc,mBAAmB,OAAO;AAAA,gBAC1C;AAAA,gBAGC;AAAA,0BACC;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAW,oBAAAA;AAAA,wBACT;AAAA,wBACA,OAAO;AAAA,wBACP;AAAA,sBACF;AAAA,sBAEC;AAAA;AAAA,kBACH;AAAA,kBAIF,gDAAC,SAAI,WAAU,kBACZ;AAAA,gCACE,aAAa,kBAAkB,OAAO,UAAU,WAC/C,+CAAC,0BAAe,MAAM,OAAQ,mBAAQ,IAEtC;AAAA,oBAEH,YACC;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,OAAO;AAAA,0BACP;AAAA,wBACF;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA,oBAED,eACC;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW,oBAAAA;AAAA,0BACT;AAAA,0BACA,OAAO;AAAA,0BACP;AAAA,wBACF;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA,oBAED,SACC,+CAAC,SAAI,WAAU,0CACZ,iBACH;AAAA,qBAEJ;AAAA,kBAGC,gBACC,+CAAC,SAAI,WAAU,6HACZ,wBACH;AAAA,kBAID,WACC,+CAAC,SAAI,WAAU,iDACZ,mBACH;AAAA,kBAID,cACC,+CAAC,SAAI,WAAU,yCACZ,sBACH;AAAA,kBAID,aACC,+CAAC,SAAI,WAAU,yCACb;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAM,aAAa,cAAc;AAAA,sBACjC,SAAS;AAAA,sBACT,SAAS,aAAa,aAAa;AAAA,sBACnC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,OAAM;AAAA;AAAA,kBACR,GACF;AAAA;AAAA;AAAA,YAEJ;AAAA,YAGC,SAAS,UAAa,SAAS,QAC9B;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW,oBAAAA;AAAA,kBACT;AAAA,kBACA,aACI,gCACA;AAAA,gBACN;AAAA,gBAEA,0DAAC,SAAI,WAAU,qDACb;AAAA,iEAAC,SAAI,WAAU,uDAAsD;AAAA,kBACpE;AAAA,mBACH;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MAEJ;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,uBAAQ;;;AC3Pf,IAAAC,kBAA2C;AA4MnC,IAAAC,wBAAA;AAtMR,SAASC,aAAqB;AAC5B,QAAM,aAAa,MAAe;AAChC,QAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,aAAS,KAAK,YAAY,KAAK;AAC/B,UAAM,aAAa,OAAO,iBAAiB,KAAK,EAAE,YAAY;AAC9D,UAAM,OAAO;AACb,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAkB,MAAM,WAAW,CAAC;AAEhE,iCAAU,MAAM;AACd,UAAM,SAAS,MAAM,UAAU,WAAW,CAAC;AAC3C,UAAM,MAAM,IAAI,iBAAiB,MAAM;AACvC,QAAI,QAAQ,SAAS,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;AACpE,UAAM,QAAQ,OAAO,WAAW,8BAA8B;AAC9D,UAAM,iBAAiB,UAAU,MAAM;AACvC,WAAO;AACP,WAAO,MAAM;AACX,YAAM,oBAAoB,UAAU,MAAM;AAC1C,UAAI,WAAW;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAIA,IAAM,YAAuD;AAAA,EAC3D,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,yBAGF;AAAA,EACF,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAcA,IAAM,cAA0C,CAAC;AAAA,EAC/C,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAASA,WAAU;AACzB,QAAM,WAAW,UAAU,MAAM;AACjC,QAAM,mBAAmB,UAAU,IAAI,uBAAuB;AAC9D,QAAM,aACJ,mBAAmB,SACf,WAAW,IAAI,mBACf,WAAW;AAGjB,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,UAAM,IAAI,YAAY,CAAC,KAAK;AAC5B,UAAM,UAAU,cAAc,CAAC,KAAK,KAAK,IAAI,YAAa,CAAC,IAAI,IAAI;AACnE,UAAM,KAAK,OAAO,MAAM;AACxB,YAAQ,IAAI;AAAA,EACd;AACA,QAAM,cAAc;AACpB,QAAM,WAAW,MAAM,MAAM,SAAS,CAAC,KAAK;AAE5C,QAAM,YAAY,SAAS;AAC3B,QAAM,gBAAgB,CAAC,aAAa,aAAa;AACjD,QAAM,yBAAyB,KAAK,IAAI,GAAG,YAAY;AACvD,QAAM,YAAY,gBAAgB,OAAO;AACzC,QAAM,eAAe;AACrB,QAAM,iBAAiB,YACnB,gBACA,gBACE,KAAK,IAAI,IAAI,aAAa,yBAAyB,SAAS,IAC5D;AACN,QAAM,WAAW,YAAY,gBAAgB;AAE7C,MAAI,YAAY,cAAc,eAAe,WAAY,QAAO;AAIhE,QAAM,KAAK,SAAS,IAAI;AAExB,QAAM,aAAa,mBAAmB,QAAQ;AAC9C,QAAM,aAAa,aACf,WAAW,WAAW,EAAE,IACxB,eAAe,WAAW,EAAE;AAEhC,QAAM,kBAAkB,CAAC,MAAsB;AAC7C,QAAI,CAAC,WAAW,CAAC,EAAG,QAAO,eAAe,WAAW,EAAE;AACvD,YAAQ,mBAAmB,SAAS,CAAC,CAAC,KAAK,YAAY,WAAW,EAAE;AAAA,EACtE;AACA,QAAM,uBAAuB,oBAAoB,YAAY;AAC7D,QAAM,qBAAqB;AAC3B,QAAM,0BAA0B,CAAC,MAC/B,uBAAuB,aAAa,gBAAgB,CAAC;AAEvD,QAAM,QAAQ,CAAC,OACZ,mBAAmB,SAAS,CAAC,CAAC,KAAK,YAAY,SAAS,EAAE;AAC7D,QAAM,UAAU,CAAC,OACd,mBAAmB,SAAS,CAAC,CAAC,KAAK,YAAY,WAAW,EAAE;AAC/D,QAAM,OAAO,CAAC,OACX,mBAAmB,SAAS,CAAC,CAAC,KAAK,YAAY,QAAQ,EAAE;AAE5D,QAAM,WAAW,WAAW,SAAS,EAAE;AACvC,QAAM,aAAa,WAAW,WAAW,EAAE;AAC3C,QAAM,UAAU,WAAW,QAAQ,EAAE;AAGrC,QAAM,QAAQ;AACd,QAAM,KAAK,uBAAuB,mBAAmB;AAGrD,QAAM,WAAW,CAAC,IAAY,OAC5B,KAAK,EAAE,IAAI,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,EAAE,IAAI,KAAK,KAAK;AAErE,QAAM,UAAU,CAAC,OACf,KAAK,KAAK,KAAK,QAAQ,KAAK,IAAI,KAAK,UAAU,KAAK,KAAK;AAG3D,QAAM,YAAY,aAAa,cAAc,WAAW,KAAK,OAAO;AACpE,QAAM,WAAW,SAAS,YAAY;AAEtC,QAAM,eAAe,YAAY,WAAW,QAAQ,EAAE,IAAI;AAE1D,QAAM,eAAe;AACrB,QAAM,iBAAiB,YACnB,WAAW,KAAK,WAAW,gBAC3B,KAAK,IAAI,GAAG,WAAW,QAAQ;AACnC,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,iBAAiB,UAAU,CAAC;AAClE,QAAM,kBAAkB,UAAU;AAClC,QAAM,UAAU,aAAa;AAC7B,QAAM,MAAM,UAAU;AACtB,QAAM,WAAW,KAAK,IAAI,GAAG,kBAAkB,cAAc;AAE7D,QAAM,kBAAkB,KAAK,IAAI,GAAG,aAAa,EAAE;AACnD,QAAM,aAAa,kBAAkB;AAErC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,OAAO,QAAQ,IAAI,WAAW;AAAA,MACvC,UAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,KAAK,CAAC;AAAA,QACN,eAAe;AAAA,QACf,GAAG;AAAA,MACL;AAAA,MAGC;AAAA,oBACC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,QAAQ,QAAQ,SAAS,QAAQ;AAAA,YACpC,QAAQ;AAAA,YACR,aAAa,mBAAmB,SAAS,OAAO;AAAA,YAChD,eAAe,kBAAkB,YAAY,SAAS;AAAA,YACtD,gBAAe;AAAA,YACf,MAAK;AAAA;AAAA,QACP;AAAA,QAID,YAAY,aACX;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,KAAK,QAAQ,IAAI,aAAa,SAAS,aAAa;AAAA,YACvD,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,eAAc;AAAA,YACd,MAAK;AAAA;AAAA,QACP;AAAA,QAID,YACC,MAAM,IAAI,CAAC,IAAI,MACb;AAAA,UAAC;AAAA;AAAA,YAEC,GACE,kBAAkB,YACd,QAAQ,KAAK,YAAY,SAAS,EAAE,MAAM,UAAU,IAAI,EAAE,KAC1D,QAAQ,EAAE,MAAM,UAAU,IAAI,EAAE;AAAA,YAEtC,QAAQ,wBAAwB,CAAC;AAAA,YACjC,aAAa,mBAAmB,SAAS,OAAO;AAAA,YAChD,eAAe,kBAAkB,YAAY,SAAS;AAAA,YACtD,gBAAe;AAAA,YACf,MAAK;AAAA;AAAA,UAVA,UAAU,CAAC;AAAA,QAWlB,CACD;AAAA,QAGF,kBAAkB,mBAAmB,WACpC,kFAEG;AAAA,sBACC,gDAAC,OACE;AAAA,8BAAkB,SACjB,kFACE;AAAA,6DAAC,YAAO,IAAG,MAAK,IAAI,eAAe,GAAE,OAAM,MAAM,UAAU;AAAA,cAC3D;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,IAAI;AAAA,kBACJ,GAAE;AAAA,kBACF,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,MAAK;AAAA;AAAA,cACP;AAAA,cACC,iBACC,+CAAC,YAAO,IAAG,MAAK,IAAI,eAAe,GAAE,KAAI,MAAM,SAAS;AAAA,eAE5D;AAAA,YAEF;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,GAAG;AAAA,gBACH,MAAM;AAAA;AAAA,YACR;AAAA,YACC,gBACC;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG,SAAS,UAAU,aAAa;AAAA,gBACnC,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,MAAK;AAAA,gBACL,eAAc;AAAA;AAAA,YAChB,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,GAAG;AAAA,gBACH,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,MAAK;AAAA;AAAA,YACP;AAAA,YAED,iBACC,+CAAC,YAAO,IAAI,UAAU,IAAI,eAAe,GAAE,KAAI,MAAM,SAAS;AAAA,aAElE,IACE,gBACF,gDAAC,OAEE;AAAA,4BACC,kFACE;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG,QAAQ,EAAE;AAAA,kBACb,MAAM;AAAA,kBACN,WAAW,gBAAgB,cAAc;AAAA;AAAA,cAC3C;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG,QAAQ,EAAE;AAAA,kBACb,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,MAAK;AAAA,kBACL,eAAc;AAAA,kBACd,WAAW,gBAAgB,cAAc;AAAA;AAAA,cAC3C;AAAA,eACF,IAEA,kFACE;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,IAAI;AAAA,kBACJ,GAAG;AAAA,kBACH,MAAM;AAAA;AAAA,cACR;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,IAAI;AAAA,kBACJ,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb,MAAK;AAAA;AAAA,cACP;AAAA,eACF;AAAA,YAED,iBACC,+CAAC,YAAO,IAAG,MAAK,IAAI,gBAAgB,GAAE,KAAI,MAAM,SAAS;AAAA,aAE7D,IAEA,kFACE;AAAA,2DAAC,YAAO,IAAG,MAAK,IAAI,gBAAgB,GAAG,OAAO,MAAM,UAAU;AAAA,YAC7D,gBACC;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG,QAAQ,EAAE;AAAA,gBACb,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,MAAK;AAAA,gBACL,eAAc;AAAA,gBACd,WAAW,gBAAgB,cAAc;AAAA;AAAA,YAC3C,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,IAAI;AAAA,gBACJ,GAAG;AAAA,gBACH,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,MAAK;AAAA;AAAA,YACP;AAAA,YAED,iBACC,+CAAC,YAAO,IAAG,MAAK,IAAI,gBAAgB,GAAE,KAAI,MAAM,SAAS;AAAA,aAE7D;AAAA,UAID,MAAM,IAAI,CAAC,IAAI,MACd,gDAAC,OACE;AAAA,8BAAkB,SACjB,kFACE;AAAA,6DAAC,YAAO,IAAG,MAAK,IAAI,IAAI,GAAE,OAAM,MAAM,MAAM,CAAC,GAAG;AAAA,cAChD;AAAA,gBAAC;AAAA;AAAA,kBACC,IAAG;AAAA,kBACH,IAAI;AAAA,kBACJ,GAAE;AAAA,kBACF,QAAQ,wBAAwB,CAAC;AAAA,kBACjC,aAAa;AAAA,kBACb,MAAK;AAAA;AAAA,cACP;AAAA,cACC,iBACC,+CAAC,YAAO,IAAG,MAAK,IAAI,IAAI,GAAE,KAAI,MAAM,KAAK,CAAC,GAAG;AAAA,eAEjD;AAAA,YAEF,+CAAC,YAAO,IAAI,YAAY,IAAI,IAAI,GAAG,OAAO,MAAM,MAAM,CAAC,GAAG;AAAA,YACzD,gBACC;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG,SAAS,YAAY,EAAE;AAAA,gBAC1B,QAAQ,QAAQ,CAAC;AAAA,gBACjB,aAAa;AAAA,gBACb,MAAK;AAAA,gBACL,eAAc;AAAA;AAAA,YAChB,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,GAAG;AAAA,gBACH,QAAQ,QAAQ,CAAC;AAAA,gBACjB,aAAa;AAAA,gBACb,MAAK;AAAA;AAAA,YACP;AAAA,YAED,iBACC,+CAAC,YAAO,IAAI,YAAY,IAAI,IAAI,GAAE,KAAI,MAAM,KAAK,CAAC,GAAG;AAAA,eArCjD,QAAQ,CAAC,EAuCjB,CACD;AAAA,WACH;AAAA,QAID,kBAAkB,mBAAmB,UACpC,kFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,IAAI;AAAA,cACJ,GAAE;AAAA,cACF,MAAM;AAAA;AAAA,UACR;AAAA,UACC,MAAM,IAAI,CAAC,IAAI,MACd,gDAAC,OACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG,QAAQ,KAAK,CAAC,SAAS,KAAK,CAAC;AAAA,gBAChC,QAAQ,wBAAwB,CAAC;AAAA,gBACjC,aAAa;AAAA,gBACb,eAAc;AAAA,gBACd,MAAK;AAAA;AAAA,YACP;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,IAAI;AAAA,gBACJ,GAAE;AAAA,gBACF,MAAM,wBAAwB,CAAC;AAAA;AAAA,YACjC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,IAAI;AAAA,gBACJ,GAAE;AAAA,gBACF,MAAM,wBAAwB,CAAC;AAAA;AAAA,YACjC;AAAA,eAnBM,YAAY,CAAC,EAoBrB,CACD;AAAA,WACH;AAAA,QAID,aACC,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,MAAM;AACxC,gBAAM,MAAM;AACZ,gBAAM,SAAS,MACX,KAAK,QAAQ,IAAI,aAAa,SAAS,aAAa,SAAS,WAAW,QAAQ,KAChF,QAAQ,QAAQ,SAAS,WAAW,QAAQ;AAGhD,gBAAM,KAAK,MAAM,WAAW,KAAK,WAAW,WAAW;AACvD,gBAAM,KAAK,MAAM,WAAW,gBAAgB,WAAW;AACvD,gBAAM,QAAQ,KAAK;AACnB,gBAAM,KAAK,QAAQ,KAAK,KAAK,OAAO,QAAQ,CAAC,IAAI;AACjD,gBAAM,cAAc,MAChB;AAAA,YACE,UAAU;AAAA,YACV,WAAW,KAAK,EAAE;AAAA,YAClB,UAAU,KAAK,EAAE;AAAA,UACnB,IACA,CAAC;AAEL,gBAAM,aAAa,iBAAiB;AACpC,gBAAM,eAAe,KAAK,IAAI,GAAG,aAAa,KAAK,eAAe;AAClE,gBAAM,YAAY,KAAK,IAAI,cAAc,IAAI,eAAe;AAC5D,gBAAM,UAAU,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAI,aAAa,QAAQ,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC;AAE7F,iBACE,gDAAC,YAA0B,GAAE,KAAI,MAAM,cAAc,SAAQ,KAC3D;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM;AAAA,gBACN,KAAK,GAAG,GAAG;AAAA,gBACX,OAAO,IAAI,CAAC,IAAI,SAAS,QAAQ,CAAC,CAAC;AAAA,gBACnC,aAAY;AAAA,gBACX,GAAG;AAAA;AAAA,YACN;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAc;AAAA,gBACd,QAAO;AAAA,gBACP,UAAU;AAAA,gBACV,KAAK,GAAG,GAAG;AAAA,gBACX,OAAO,IAAI,CAAC,IAAI,SAAS,QAAQ,CAAC,CAAC;AAAA,gBACnC,aAAY;AAAA;AAAA,YACd;AAAA,eAfW,SAAS,CAAC,EAgBvB;AAAA,QAEJ,CAAC;AAAA,QAGF,aACC,MAAM,IAAI,CAAC,IAAI,OAAO;AACpB,cAAI,CAAC,WAAW,EAAE,EAAG,QAAO;AAC5B,gBAAM,WAAW,YACb,WAAW,KAAK,KAAK,gBACrB,KAAK,IAAI,GAAG,KAAK,QAAQ;AAC7B,gBAAM,kBAAmB,WAAW,kBAAmB;AACvD,gBAAM,KAAK;AAGX,gBAAM,UAAU,KAAK,IAAI,IAAI,IAAI,eAAe;AAChD,gBAAM,gBAAgB,KAAK,IAAI,SAAS,KAAK,KAAK,eAAe;AACjE,gBAAM,QAAQ,KAAK,QAAQ,QAAQ,CAAC,CAAC,IAAI,cAAc,QAAQ,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAElF,iBAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,OACzC;AAAA,YAAC;AAAA;AAAA,cAEC,IAAG;AAAA,cACH,IAAI;AAAA,cACJ,GAAE;AAAA,cACF,MAAM;AAAA,cACN,SAAQ;AAAA,cAER;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAc;AAAA,oBACd,QAAQ,MAAM,UAAU,IAAI,UAAU;AAAA,oBACtC,UAAU,KAAK,GAAG,QAAQ,CAAC,CAAC;AAAA,oBAC5B,KAAK,GAAG,GAAG;AAAA,oBACX,OAAO,IAAI,kBAAkB,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,oBACrD,aAAY;AAAA;AAAA,gBACd;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAc;AAAA,oBACd,QAAO;AAAA,oBACP,UAAU;AAAA,oBACV,KAAK,GAAG,GAAG;AAAA,oBACX,OAAO,IAAI,kBAAkB,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,oBACrD,aAAY;AAAA;AAAA,gBACd;AAAA;AAAA;AAAA,YAtBK,UAAU,EAAE,IAAI,EAAE;AAAA,UAuBzB,CACD;AAAA,QACH,CAAC;AAAA;AAAA;AAAA,EACL;AAEJ;AAGA,IAAO,sBAAQ;;;AF9bT,IAAAC,wBAAA;AArEN,SAAS,iBAAiB,KAAkD;AAC1E,QAAM,CAAC,GAAG,IAAI,QAAI,0BAAS,CAAC;AAC5B,iCAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,QAAI;AACJ,UAAM,KAAK,IAAI,eAAe,MAAM;AAClC,YAAM,sBAAsB,MAAM;AAChC,YAAI,GAAI,MAAK,GAAG,sBAAsB,EAAE,MAAM;AAAA,MAChD,CAAC;AAAA,IACH,CAAC;AACD,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM;AACX,2BAAqB,GAAG;AACxB,SAAG,WAAW;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACR,SAAO;AACT;AAeA,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAS,wBAAuB,IAAI;AAC1C,QAAM,OAAO,iBAAiB,MAAM;AACpC,QAAM,cAAU,wBAAsB,IAAI;AAE1C,QAAM,eAAyB,KAAK,QAAQ,cAAc;AAC1D,QAAM,WAAW,KAAK,UAAU;AAEhC,iCAAU,MAAM;AACd,QAAI,OAAO,GAAG;AACZ,qBAAe,IAAI;AACnB,UAAI,QAAQ,YAAY,QAAQ,OAAO,QAAQ,SAAS;AACtD,gBAAQ,UAAU;AAClB,uBAAe,OAAO,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,gBAAgB,cAAc,CAAC;AAEzC,iCAAU,MAAM;AACd,iBAAa,YAAY;AAAA,EAC3B,GAAG,CAAC,cAAc,YAAY,CAAC;AAC/B,iCAAU,MAAM;AACd,mBAAe,QAAQ;AAAA,EACzB,GAAG,CAAC,UAAU,cAAc,CAAC;AAE7B,SACE,+CAAC,SAAI,KAAK,QAAQ,WAAU,gBAC1B;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,KAAK;AAAA,MACX,eAAe,KAAK;AAAA,MACpB,OAAO,KAAK;AAAA,MACZ,gBAAgB,KAAK;AAAA,MACrB,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,MACf,mBAAmB,KAAK;AAAA,MACxB,aAAa,KAAK;AAAA,MAClB,sBAAsB,KAAK;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,iBAAiB,KAAK;AAAA,MACtB,SAAS,KAAK;AAAA,MACd,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,aAAa,KAAK;AAAA,MAClB;AAAA;AAAA,EACF,GACF;AAEJ;AAwBA,IAAM,gBAAgB;AAEtB,IAAM,eAAe;AAErB,IAAM,uBAA4D,CAAC;AAAA,EACjE;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,YAAY;AACd,MAAM;AACJ,QAAM,cAAc,CAAC,EAAE,KAAK,YAAY,KAAK,SAAS,SAAS;AAC/D,QAAM,eAAyB,KAAK,QAAQ,cAAc;AAC1D,QAAM,aAAa,KAAK,UAAU,UAAU;AAG5C,QAAM,gBAAY,wBAAuB,IAAI;AAC7C,QAAM,oBAAgB,wBAAuB,IAAI;AACjD,QAAM,cAAc,iBAAiB,aAAa;AAClD,QAAM,UAAU,iBAAiB,SAAS;AAG1C,QAAM,CAAC,aAAa,cAAc,QAAI;AAAA,IAAmB,MACvD,MAAM,UAAU,EAAE,KAAK,CAAC;AAAA,EAC1B;AACA,QAAM,CAAC,aAAa,cAAc,QAAI;AAAA,IAAmB,MACvD,MAAM,UAAU,EAAE,KAAK,CAAC;AAAA,EAC1B;AACA,QAAM,CAAC,UAAU,WAAW,QAAI;AAAA,IAAqB,MACnD,MAAM,UAAU,EAAE,KAAK,cAAc,SAAS;AAAA,EAChD;AACA,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAAoB,MACtD,MAAM,UAAU,EAAE,KAAK,KAAK;AAAA,EAC9B;AAGA,iCAAU,MAAM;AACd,mBAAe,MAAM,UAAU,EAAE,KAAK,CAAC,CAAC;AACxC,mBAAe,MAAM,UAAU,EAAE,KAAK,CAAC,CAAC;AACxC,gBAAY,MAAM,UAAU,EAAE,KAAK,cAAc,SAAS,CAAC;AAC3D,kBAAc,MAAM,UAAU,EAAE,KAAK,KAAK,CAAC;AAAA,EAE7C,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,WAAO;AAAA,IACX,CAAC,GAAW,MACV,eAAe,CAAC,MAAM;AACpB,UAAI,EAAE,CAAC,MAAM,EAAG,QAAO;AACvB,YAAM,IAAI,CAAC,GAAG,CAAC;AACf,QAAE,CAAC,IAAI;AACP,aAAO;AAAA,IACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACA,QAAM,WAAO;AAAA,IACX,CAAC,GAAW,MACV,eAAe,CAAC,MAAM;AACpB,UAAI,EAAE,CAAC,MAAM,EAAG,QAAO;AACvB,YAAM,IAAI,CAAC,GAAG,CAAC;AACf,QAAE,CAAC,IAAI;AACP,aAAO;AAAA,IACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACA,QAAM,WAAO;AAAA,IACX,CAAC,GAAW,MACV,YAAY,CAAC,MAAM;AACjB,UAAI,EAAE,CAAC,MAAM,EAAG,QAAO;AACvB,YAAM,IAAI,CAAC,GAAG,CAAC;AACf,QAAE,CAAC,IAAI;AACP,aAAO;AAAA,IACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACA,QAAM,YAAQ;AAAA,IACZ,CAAC,GAAW,MACV,cAAc,CAAC,MAAM;AACnB,UAAI,EAAE,CAAC,MAAM,EAAG,QAAO;AACvB,YAAM,IAAI,CAAC,GAAG,CAAC;AACf,QAAE,CAAC,IAAI;AACP,aAAO;AAAA,IACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,iCAAU,MAAM;AACd,QAAI,CAAC,oBAAoB,gBAAgB,KAAK,YAAY,EAAG;AAE7D,UAAM,UAAoB,CAAC,cAAc,CAAC;AAE1C,QACE,eACA,YAAY,SAAS,KACrB,YAAY,MAAM,CAAC,MAAM,IAAI,CAAC,GAC9B;AAEA,YAAM,gBAAgB,cAAc;AACpC,UAAI,SAAS;AACb,kBAAY,QAAQ,CAAC,GAAG,QAAQ;AAC9B,gBAAQ,KAAK,UAAU,YAAY,GAAG,KAAK,IAAI,EAAE;AACjD,kBAAU,IAAI;AAAA,MAChB,CAAC;AAAA,IACH;AAEA,qBAAiB,EAAE,aAAa,SAAS,QAAQ,CAAC;AAAA,EACpD,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,mBAAmB,aAAa,WAAW,IAAI,MAAM,IAAI,IAAI;AAEnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,YAAY,aAAa;AAAA,MAC3B;AAAA,MACA,OAAO,YAAY,EAAE,OAAO,UAAU,IAAI;AAAA,MAG1C;AAAA,uDAAC,SAAI,KAAK,eACR;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,eAAe,KAAK;AAAA,YACpB,OAAO,KAAK;AAAA,YACZ,gBAAgB,KAAK;AAAA,YACrB,WAAW,KAAK;AAAA,YAChB,aAAa,KAAK;AAAA,YAClB,UAAU,KAAK;AAAA,YACf,mBAAmB,KAAK;AAAA,YACxB,aAAa,KAAK;AAAA,YAClB,sBAAsB,KAAK;AAAA,YAC3B,OAAO,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,MAAM,KAAK;AAAA,YACX,iBAAiB,KAAK;AAAA,YACtB,SAAS,KAAK;AAAA,YACd,cAAc,KAAK;AAAA,YACnB;AAAA,YACA,aAAa,KAAK;AAAA;AAAA,QACpB,GACF;AAAA,QAGC,eACC,+CAAC,SAAI,WAAU,eACZ,eAAK,SAAU,IAAI,CAAC,OAAO,MAC1B;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM;AAAA,YACN,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,gBAAgB,CAAC,MAAM,KAAK,GAAG,CAAC;AAAA,YAChC,gBAAgB,CAAC,MAAM,KAAK,GAAG,CAAC;AAAA,YAChC,cAAc,CAAC,MAAM,KAAK,GAAG,CAAC;AAAA,YAC9B,gBAAgB,CAAC,MAAM,MAAM,GAAG,CAAC;AAAA;AAAA,UAR5B,MAAM;AAAA,QASb,CACD,GACH;AAAA,QAKD,eAAe,cAAc,KAAK,YAAY,MAAM,CAAC,MAAM,IAAI,CAAC,KAC/D;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,eAAe,cAAc;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,YAAY,KAAK,UAAU;AAAA,YAC3B,QAAQ;AAAA,YACR,YAAY,cAAc;AAAA,YAC1B,QAAQ;AAAA,YACR;AAAA,YACA,gBAAc;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,cACL,UAAU;AAAA,cACV,MAAM,CAAC,UAAU,WAAW;AAAA,cAC5B,KAAK;AAAA,cACL,eAAe;AAAA,YACjB;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,+BAAQ;;;AG/Vf,IAAAC,kBAAmD;AACnD,IAAAC,sBAAuB;AAyHX,IAAAC,wBAAA;AAlHZ,IAAM,gBAAgB;AAEtB,SAASC,kBAAiB,KAAkD;AAC1E,QAAM,CAAC,GAAG,IAAI,QAAI,0BAAS,CAAC;AAC5B,iCAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,QAAI;AACJ,UAAM,KAAK,IAAI,eAAe,MAAM;AAClC,YAAM,sBAAsB,MAAM;AAChC,YAAI,GAAI,MAAK,GAAG,sBAAsB,EAAE,MAAM;AAAA,MAChD,CAAC;AAAA,IACH,CAAC;AACD,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM;AACX,2BAAqB,GAAG;AACxB,SAAG,WAAW;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AACR,SAAO;AACT;AAUA,IAAM,8BAEF,CAAC,EAAE,OAAO,YAAY,WAAW,YAAY,OAAO,iBAAiB,MAAM;AAC7E,QAAM,eAAW,wBAAuB,IAAI;AAC5C,QAAM,SAASA,kBAAiB,QAAQ;AACxC,QAAM,YAAY,MAAM;AAGxB,QAAM,eAAW,wBAAkC,CAAC,CAAC;AACrD,QAAM,CAAC,aAAa,cAAc,QAAI;AAAA,IAAmB,MACvD,MAAM,SAAS,EAAE,KAAK,CAAC;AAAA,EACzB;AAGA,iCAAU,MAAM;AACd,mBAAe,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC;AACvC,aAAS,UAAU,SAAS,QAAQ,MAAM,GAAG,SAAS;AAAA,EACxD,GAAG,CAAC,SAAS,CAAC;AAGd,iCAAU,MAAM;AACd,UAAM,YAA8B,CAAC;AACrC,UAAM,OAAiB,CAAC;AACxB,aAAS,QAAQ,QAAQ,CAAC,IAAI,MAAM;AAClC,UAAI,CAAC,GAAI;AACT,YAAM,KAAK,IAAI,eAAe,MAAM;AAClC,cAAM,MAAM,sBAAsB,MAAM;AACtC,cAAI,CAAC,GAAI;AACT,gBAAM,IAAI,GAAG,sBAAsB,EAAE;AACrC,yBAAe,CAAC,SAAS;AACvB,gBAAI,KAAK,CAAC,MAAM,EAAG,QAAO;AAC1B,kBAAM,IAAI,CAAC,GAAG,IAAI;AAClB,cAAE,CAAC,IAAI;AACP,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AACD,aAAK,KAAK,GAAG;AAAA,MACf,CAAC;AACD,SAAG,QAAQ,EAAE;AACb,gBAAU,KAAK,EAAE;AAAA,IACnB,CAAC;AACD,WAAO,MAAM;AACX,WAAK,QAAQ,oBAAoB;AACjC,gBAAU,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC;AAAA,IAC3C;AAAA,EAEF,GAAG,CAAC,SAAS,CAAC;AAGd,iCAAU,MAAM;AACd,QAAI,CAAC,oBAAoB,WAAW,EAAG;AACvC,QAAI,YAAY,KAAK,CAAC,MAAM,MAAM,CAAC,EAAG;AAEtC,UAAM,UAAoB,CAAC;AAC3B,QAAI,IAAI;AACR,gBAAY,QAAQ,CAAC,MAAM;AACzB,cAAQ,KAAK,IAAI,IAAI,CAAC;AACtB,WAAK,IAAI;AAAA,IACX,CAAC;AAED,qBAAiB,EAAE,aAAa,QAAQ,SAAS,iBAAiB,KAAK,CAAC;AAAA,EAC1E,GAAG,CAAC,QAAQ,aAAa,gBAAgB,CAAC;AAE1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,YAAY,kBAAkB;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,QACL,KAAK;AAAA,QACL,GAAI,YAAY,EAAE,OAAO,UAAU,IAAI;AAAA,MACzC;AAAA,MAEC,gBAAM,IAAI,CAAC,MAAM,MAAM;AACtB,cAAM,OAAiB,KAAK,QAAQ,cAAc;AAClD,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,KAAK,CAAC,OAAO;AACX,uBAAS,QAAQ,CAAC,IAAI;AAAA,YACxB;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,KAAK;AAAA,gBACX,eAAe,KAAK;AAAA,gBACpB,OAAO,KAAK;AAAA,gBACZ,gBAAgB,KAAK;AAAA,gBACrB,WAAW,KAAK;AAAA,gBAChB,aAAa,KAAK;AAAA,gBAClB,UAAU,KAAK;AAAA,gBACf,mBAAmB,KAAK;AAAA,gBACxB,aAAa,KAAK;AAAA,gBAClB,sBAAsB,KAAK;AAAA,gBAC3B,OAAO,KAAK;AAAA,gBACZ;AAAA,gBACA,MAAM,KAAK;AAAA,gBACX,iBAAiB,KAAK;AAAA,gBACtB,SAAS,KAAK;AAAA,gBACd,cAAc,KAAK;AAAA,gBACnB;AAAA,gBACA,aAAa,KAAK;AAAA;AAAA,YACpB;AAAA;AAAA,UAxBK,KAAK;AAAA,QAyBZ;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,sCAAQ;;;ALyUL,IAAAC,wBAAA;AAtcV,SAASC,aAAqB;AAC5B,QAAM,SAAS,MAAe;AAC5B,QAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,aAAS,KAAK,YAAY,KAAK;AAC/B,UAAM,OAAO,OAAO,iBAAiB,KAAK,EAAE,YAAY;AACxD,UAAM,OAAO;AACb,WAAO;AAAA,EACT;AACA,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAkB,MAAM,OAAO,CAAC;AAC5D,iCAAU,MAAM;AACd,UAAM,SAAS,MAAM,UAAU,OAAO,CAAC;AACvC,UAAM,MAAM,IAAI,iBAAiB,MAAM;AACvC,QAAI,QAAQ,SAAS,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;AACpE,UAAM,QAAQ,OAAO,WAAW,8BAA8B;AAC9D,UAAM,iBAAiB,UAAU,MAAM;AACvC,WAAO;AACP,WAAO,MAAM;AACX,YAAM,oBAAoB,UAAU,MAAM;AAC1C,UAAI,WAAW;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AACL,SAAO;AACT;AAuBA,IAAM,cAAc;AAEpB,IAAM,kBAAkB;AAExB,IAAM,oBAAoB;AAE1B,IAAM,eAAe;AAerB,SAAS,YAAY,OAA4C;AAC/D,QAAM,SAAwB,CAAC;AAC/B,MAAI,IAAI;AACR,SAAO,IAAI,MAAM,QAAQ;AACvB,QAAI,MAAM,CAAC,EAAE,UAAU;AACrB,YAAM,QAA8B,CAAC;AACrC,aAAO,IAAI,MAAM,UAAU,MAAM,CAAC,EAAE,UAAU;AAC5C,cAAM,KAAK,MAAM,CAAC,CAAC;AACnB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,YAAY,OAAO,MAAM,CAAC;AAAA,IAChD,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAC9C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,SAAS,GAAwB;AACxC,SAAO,EAAE,SAAS,WAAW,EAAE,KAAK,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,GAAG,EAAE,EAAE,KAAK,GAAG;AAC9E;AAGA,SAAS,WAAW,GAAyB;AAC3C,SAAO,EAAE,SAAS,WACb,EAAE,KAAK,YAAY,QACnB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC,GAAG,YAAY;AAChD;AAGA,SAAS,eAAe,GAAyB;AAC/C,SAAO,EAAE,SAAS,WACb,EAAE,KAAK,WAAW,QACnB,EAAE,MAAM,MAAM,CAAC,OAAO,GAAG,WAAW,KAAK;AAC/C;AAGA,SAAS,cAAc,GAA0B;AAC/C,UAAQ,EAAE,SAAS,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,CAAC,GAAG,SAAS;AACnE;AAIA,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,sBAAsB;AACxB,MAAM;AACJ,QAAM,SAASA,WAAU;AAGzB,QAAM,CAAC,QAAQ,SAAS,QAAI,0BAAyC,CAAC,CAAC;AAEvE,QAAM,gBAAY,6BAAY,CAAC,KAAa,QAAwB;AAClE,cAAU,CAAC,SAAS;AAClB,YAAM,MAAM,KAAK,GAAG;AACpB,UACE,OACA,IAAI,gBAAgB,IAAI,eACxB,IAAI,oBAAoB,IAAI,mBAC5B,IAAI,QAAQ,WAAW,IAAI,QAAQ,UACnC,IAAI,QAAQ,MAAM,CAAC,GAAG,MAAM,MAAM,IAAI,QAAQ,CAAC,CAAC;AAEhD,eAAO;AACT,aAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI;AAAA,IAC/B,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAGL,QAAM,mBAAe,wBAAuB,IAAI;AAChD,QAAM,iBAAa,wBAAuB,IAAI;AAC9C,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAS,CAAC;AACpC,QAAM,CAAC,cAAc,eAAe,QAAI;AAAA,IACtC;AAAA,EACF;AAEA,uCAAgB,MAAM;AACpB,QAAI,CAAC,WAAW;AACd,eAAS,CAAC;AACV,sBAAgB,MAAS;AACzB;AAAA,IACF;AAEA,UAAM,YAAY,aAAa;AAC/B,UAAMC,WAAU,WAAW;AAC3B,QAAI,CAAC,aAAa,CAACA,SAAS;AAE5B,UAAM,UAAU,MAAM;AAEpB,MAAAA,SAAQ,MAAM,YAAY;AAC1B,YAAM,aAAa,UAAU;AAC7B,YAAM,WAAWA,SAAQ;AACzB,YAAM,WAAWA,SAAQ;AACzB,UAAI,CAAC,cAAc,CAAC,SAAU;AAE9B,YAAM,MAAM,aAAa;AACzB,YAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,GAAG,CAAC;AAC7C,eAAS,CAAC;AACV,sBAAgB,IAAI,IAAI,KAAK,KAAK,WAAW,CAAC,IAAI,MAAS;AAAA,IAC7D;AAEA,YAAQ;AAER,UAAM,KAAK,IAAI,eAAe,OAAO;AACrC,OAAG,QAAQ,SAAS;AACpB,WAAO,MAAM,GAAG,WAAW;AAAA,EAE7B,GAAG,CAAC,WAAW,UAAU,KAAK,CAAC;AAI/B,QAAM,mBAAe,wBAAkC,CAAC,CAAC;AACzD,QAAM,CAAC,YAAY,aAAa,QAAI,0BAA0B,CAAC,CAAC;AAGhE,QAAM,SAAS,YAAY,KAAK;AAQhC,QAAM,qBAAiB,yBAAQ,MAAM;AACnC,UAAM,MAAM,oBAAI,IAAY;AAC5B,QAAI,CAAC,mBAAoB,QAAO;AAChC,UAAM,OAAO,YAAY,KAAK;AAC9B,SAAK,QAAQ,CAAC,GAAG,OAAO;AACtB,UAAI,cAAc,CAAC,MAAM,UAAW;AAGpC,YAAM,uBACJ,EAAE,SAAS,WACP,EAAE,KAAK,YAAY,QACnB,EAAE,MAAM,KAAK,CAAC,OAAO,GAAG,YAAY,KAAK;AAC/C,UAAI,qBAAsB;AAC1B,YAAM,qBAAqB,KACxB,MAAM,KAAK,CAAC,EACZ,KAAK,CAAC,OAAO,cAAc,EAAE,MAAM,SAAS;AAC/C,UAAI,mBAAoB,KAAI,IAAI,EAAE;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,EAET,GAAG,CAAC,OAAO,kBAAkB,CAAC;AAK9B,QAAM,wBAAoB,6BAAY,MAAM;AAC1C,QAAI,CAAC,WAAW,QAAS;AACzB,UAAM,YAAY,WAAW;AAC7B,UAAM,cAAc,UAAU,sBAAsB;AACpD,QAAI,CAAC,YAAY,MAAO;AAExB,UAAM,OAAO,YAAY,KAAK;AAC9B,UAAM,OAAwB,CAAC;AAC/B,QAAI,YAAY;AAEhB,aAAS,KAAK,GAAG,MAAM,KAAK,QAAQ,MAAM;AACxC,YAAM,UACJ,KAAK,KAAK,WACT,eAAe,KAAK,EAAE,CAAC,KAAK,eAAe,IAAI,EAAE;AAEpD,UAAI,WAAW,cAAc,IAAI;AAC/B,oBAAY;AAAA,MACd,WAAW,CAAC,WAAW,cAAc,IAAI;AAEvC,cAAM,SAAS,aAAa,QAAQ,YAAY,CAAC;AACjD,cAAM,SAAS,aAAa,QAAQ,EAAE;AAEtC,YAAI,UAAU,QAAQ;AACpB,gBAAM,WAAW,OAAO,sBAAsB;AAC9C,gBAAM,WAAW,OAAO,sBAAsB;AAI9C,gBAAM,MACH,SAAS,QAAQ,oBAAoB,YAAY,QAAQ;AAC5D,gBAAM,MAAM,SAAS,MAAM,YAAY,OAAO;AAC9C,gBAAM,MACH,SAAS,OAAO,oBAAoB,YAAY,QAAQ;AAC3D,gBAAM,MAAM,SAAS,MAAM,YAAY,OAAO;AAE9C,gBAAM,YAAY,KAAK,YAAY,CAAC;AACpC,gBAAM,UAAoB,aACpB,UAAU,SAAS,WACjB,UAAU,KAAK,OACf,UAAU,MAAM,CAAC,GAAG,SAAS,YACjC;AACJ,gBAAM,WAAW,KAAK,EAAE;AACxB,gBAAM,UAAoB,YACpB,SAAS,SAAS,WAChB,SAAS,KAAK,OACd,SAAS,MAAM,CAAC,GAAG,SAAS,YAChC;AACJ,gBAAM,aAAa,WACf,SAAS,SAAS,WACf,SAAS,KAAK,UAAU,QACzB,SAAS,MAAM,KAAK,CAAC,OAAO,GAAG,UAAU,KAAK,IAChD;AAEJ,eAAK,KAAK;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY;AAAA,YACZ,UAAU;AAAA,YACV;AAAA,UACF,CAAC;AAAA,QACH;AACA,oBAAY;AAAA,MACd;AAAA,IACF;AAEA,kBAAc,IAAI;AAAA,EAEpB,GAAG,CAAC,OAAO,OAAO,cAAc,CAAC;AAEjC,uCAAgB,MAAM;AACpB,sBAAkB;AAClB,UAAM,KAAK,IAAI,eAAe,iBAAiB;AAC/C,QAAI,WAAW,QAAS,IAAG,QAAQ,WAAW,OAAO;AACrD,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,iBAAiB,CAAC;AAEtB,MAAI,OAAO,WAAW,EAAG,QAAO;AAGhC,QAAM,iBAAiB,OAAO;AAAA,IAC5B,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,KAAK,OAAO,SAAS;AAAA,EACpD;AAIA,QAAM,cAAc,aAAa,SAAS;AAE1C,QAAM,iBAAa,oBAAAC;AAAA,IACjB,YAAY,oBAAoB;AAAA,IAChC,CAAC,aAAa,uBAAuB;AAAA,IACrC,CAAC,aAAa,eAAe;AAAA,IAC7B,eAAe;AAAA,IACf,CAAC,aAAa,CAAC,eAAe,CAAC,eAAe;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,eACJ,aAAa,QAAQ,IACjB,EAAE,WAAW,SAAS,KAAK,KAAK,iBAAiB,WAAW,IAC5D;AAEN,QAAM,UACJ;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAA;AAAA,QACT;AAAA,QACA,uBAAuB;AAAA,MACzB;AAAA,MACA,OAAO;AAAA,MAEN;AAAA,eAAO,IAAI,CAAC,OAAO,OAAO;AACzB,gBAAM,YAAY,OAAO,KAAK,CAAC;AAC/B,gBAAM,UAAU,OAAO;AACvB,gBAAM,kBACJ,CAAC,YAAY,YAAY,eAAe,KAAK,CAAC,IAAI;AAGpD,gBAAM,eACJ,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM,MAAM,CAAC;AACtD,gBAAM,UAAU,aAAa;AAG7B,gBAAM,QACJ,SAAS,UACR,sBAAsB,YACnB,cAAc,SAAS,MAAM,YAC3B,YACA,aACF;AACN,gBAAM,OAAO,SAAS,QAAQ;AAC9B,gBAAM,SAAS,SAAS,SAAS;AACjC,gBAAM,YAAY,SAAS,YAAY;AACvC,gBAAM,YAAY,SAAS,cAAc;AACzC,gBAAM,UAAU,SAAS,cAAc;AACvC,gBAAM,QAAQ,SAAS,YAAY;AACnC,gBAAM,YAAY,SAAS,YAAY;AAIvC,gBAAM,mBACJ,eAAe,KAAK,KAAK,eAAe,IAAI,EAAE;AAChD,gBAAM,mBACJ,KAAK,MACJ,eAAe,OAAO,KAAK,CAAC,CAAC,KAAK,eAAe,IAAI,KAAK,CAAC;AAC9D,gBAAM,oBACJ,oBAAoB,mBAChB,QACC,SAAS,oBAAoB;AAGpC,gBAAM,gBAAgB,YAClB,UAAU,SAAS,WACjB,UAAU,OACV,UAAU,MAAM,CAAC,IACnB;AACJ,gBAAM,UACJ,SAAS,cAAc,eAAe,QAAQ;AAGhD,gBAAM,UACJ,SAAS,cAAc,aAAa,QAAQ;AAE9C,gBAAM,UAAU,OAAO,KAAK,CAAC;AAC7B,gBAAM,SAAS,OAAO,EAAE;AAGxB,gBAAM,cAAc,SAAS;AAG7B,gBAAM,eACJ,QAAQ,mBAAmB,OAAO,QAAQ,SAAS,IAC/C,OAAO,UACP;AAGN,gBAAM,eAAe,eAAe,SAAY,QAAQ,QAAQ,CAAC;AAGjE,gBAAM,kBACJ,WAAW,SACP,KAAK,IAAI,QAAQ,aAAa,OAAO,WAAW,IAC/C,SAAS,eAAe,QAAQ;AAGvC,gBAAM,mBACJ,WAAW,SAAS,aAChB,UAAU,MAAM,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,QAAQ,SAAS,IACzD,WAAW,SAAS,WACjB,UAAU,KAAK,UAAU;AAAA,YACxB,CAAC,MAAM,EAAE,WAAW,cAAc,EAAE,QAAQ;AAAA,UAC9C,KAAK,CAAC,IACN,CAAC;AAGT,gBAAM,mBAA+B,eAE/B,MACA,MAAM,IAAI,CAAC,OAAO,GAAG,QAAQ,SAAS,IACxC,CAAC;AAGL,gBAAM,oBAAoB,eAEpB,MACA,MAAM,IAAI,CAAC,OAAwB;AACnC,gBAAI,GAAG,WAAW,UAAU,OAAW,QAAO,GAAG,UAAU;AAC3D,gBAAI,oBAAoB;AACtB,kBAAI,GAAG,OAAQ,QAAO;AACtB,oBAAM,OAAO,GAAG,QAAQ;AACxB,qBAAO,SAAS,YAAY,YAAY;AAAA,YAC1C;AACA,mBAAO;AAAA,UACT,CAAC,IACD,CAAC;AAEL,iBACE,gDAAC,gBAAAC,QAAM,UAAN,EAEE;AAAA,+BACC;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,YAAY,SAAS;AAAA,gBACrB,cAAc,SAAS;AAAA,gBACvB,WAAW,SAAS;AAAA,gBACpB,YAAY,SAAS;AAAA,gBACrB,cAAc,SAAS;AAAA,gBACvB,WAAW,SAAS;AAAA,gBACpB,UAAU,SAAS;AAAA,gBACnB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,kBAAkB;AAAA,gBAClB,WAAW;AAAA;AAAA,YACb;AAAA,YAIF;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,CAAC,OAAO;AACX,+BAAa,QAAQ,EAAE,IAAI;AAAA,gBAC7B;AAAA,gBACA,WACE,aAAa,sBAAsB,aAAa;AAAA,gBAElD,OACE,YACI;AAAA,kBACE,OACE,OAAO,cAAc,WACjB,GAAG,SAAS,OACZ;AAAA,gBACR,IACA;AAAA,gBAGL,gBAAM,SAAS,WACd;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,MAAM;AAAA,oBACZ;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,YAAY,UAAU;AAAA,oBACtB,kBAAkB,CAAC,QAAQ,UAAU,IAAI,GAAG;AAAA,oBAC5C;AAAA,oBACA;AAAA;AAAA,gBACF,IAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO,MAAM;AAAA,oBACb;AAAA,oBACA;AAAA,oBACA,kBAAkB,CAAC,QAAQ,UAAU,IAAI,GAAG;AAAA;AAAA,gBAC9C;AAAA;AAAA,YAEJ;AAAA,eA3EmB,SAAS,KAAK,CA4EnC;AAAA,QAEJ,CAAC;AAAA,QAEA,eACC,+CAAC,SAAI,WAAU,8CACZ,uBACH;AAAA,QAID,WAAW,SAAS,KACnB;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,UAAU,UAAU;AAAA,YAE3D,qBAAW,IAAI,CAAC,KAAK,MAAM;AAC1B,oBAAM,KAAK,SAAS,IAAI;AACxB,oBAAM,YAAY,mBAAmB,IAAI,UAAU;AACnD,oBAAM,YAAY,mBAAmB,IAAI,QAAQ;AACjD,oBAAM,YAAY,UAAU,WAAW,EAAE;AACzC,oBAAM,UAAU,UAAU,QAAQ,EAAE;AAIpC,oBAAM,QAAQ,IAAI,KAAK;AACvB,oBAAM,QAAQ,IAAI,KAAK;AAIvB,oBAAM,SAAS,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI;AAC1C,oBAAM,KAAK;AACX,oBAAM,IAAI;AAAA,gBACR,KAAK,IAAI,EAAE,IAAI,KAAK;AAAA,gBACpB,KAAK,SAAS,EAAE;AAAA,gBAChB,KAAK,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE,IAAI,MAAM;AAAA,gBAC9C,KAAK,IAAI,KAAK,EAAE;AAAA,gBAChB,KAAK,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE,IAAI,SAAS,EAAE;AAAA,gBAC9C,KAAK,KAAK;AAAA,cACZ,EAAE,KAAK,GAAG;AAGV,oBAAM,QAAQ,KAAK,IAAI,QAAQ,SAAS,EAAE;AAC1C,oBAAM,OAAO,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE;AACjD,oBAAM,QAAQ,KAAK,IAAI,QAAQ,SAAS,EAAE;AAC1C,oBAAM,UAAU,KAAK,KAAK,MAAM,KAAK;AACrC,oBAAM,UAAU,QAAQ,OAAO,QAAQ;AAEvC,oBAAM,eAAe;AACrB,oBAAM,UAAU,aAAa;AAC7B,oBAAM,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,UAAU,UAAU,CAAC;AAC3D,oBAAM,aAAa,UAAU;AAC7B,oBAAM,MAAM,UAAU;AAOtB,oBAAM,WAAW,KAAK,IAAI,GAAG,aAAa,OAAO;AACjD,oBAAM,UACJ,WAAW,IACP;AAAA,gBACE,KAAK,IAAI,EAAE,IAAI,KAAK;AAAA,gBACpB,KAAK,SAAS,EAAE;AAAA,gBAChB,KAAK,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE,IAAI,MAAM;AAAA,gBAC9C,KAAK,IAAI,KAAK,EAAE;AAAA,gBAChB,KAAK,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE,IAAI,SAAS,EAAE;AAAA,gBAC9C,KAAK,KAAK;AAAA,gBACV,KAAK,QAAQ;AAAA,cACf,EAAE,KAAK,GAAG,IACV;AAEN,oBAAM,aAAa,UAAU;AAC7B,oBAAM,eAAe,KAAK,IAAI,GAAG,aAAa,KAAK,UAAU;AAC7D,oBAAM,YAAY,KAAK,IAAI,cAAc,IAAI,UAAU;AACvD,oBAAM,UAAU,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAI,aAAa,QAAQ,CAAC,CAAC,IAAI,WAAW,QAAQ,CAAC,CAAC;AAG7F,oBAAM,QAAQ;AACd,oBAAM,KAAK;AAIX,oBAAM,UAAU,UAAU,SAAS,EAAE;AACrC,oBAAM,YAAY,UAAU,WAAW,EAAE;AACzC,oBAAM,SAAS,UAAU,QAAQ,EAAE;AACnC,oBAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,IAAI,KAAK,KAAK,IAAI,KAAK;AAGjG,oBAAM,UAAU,UAAU,SAAS,EAAE;AACrC,oBAAM,YAAY,UAAU,WAAW,EAAE;AACzC,oBAAM,SAAS,UAAU,QAAQ,EAAE;AACnC,oBAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,UAAU,IAAI,KAAK,KAAK,IAAI,KAAK;AAEjG,qBACE,gDAAC,OAEC;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,MAAK;AAAA,oBACL,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,eAAc;AAAA,oBACd,gBAAe;AAAA;AAAA,gBACjB;AAAA,gBAGA,+CAAC,UAAK,GAAG,SAAS,MAAM,SAAS;AAAA,gBACjC;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAG;AAAA,oBACH,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,MAAK;AAAA,oBACL,eAAc;AAAA;AAAA,gBAChB;AAAA,gBACA,+CAAC,YAAO,IAAI,IAAI,IAAI,IAAI,OAAO,GAAE,KAAI,MAAM,QAAQ;AAAA,gBAGnD,+CAAC,UAAK,GAAG,SAAS,MAAM,SAAS;AAAA,gBACjC;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAG;AAAA,oBACH,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb,MAAK;AAAA,oBACL,eAAc;AAAA;AAAA,gBAChB;AAAA,gBACA,+CAAC,YAAO,IAAI,IAAI,IAAI,IAAI,OAAO,GAAE,KAAI,MAAM,QAAQ;AAAA,iBAKjD,MAAM;AAGN,wBAAM,YACJ,IAAI,eAAe,cAClB,IAAI,aAAa,aAAa,IAAI;AACrC,wBAAM,eACJ,IAAI,eAAe,aACnB,IAAI,aAAa,aACjB,CAAC,IAAI;AACP,yBACE,aACC,aAAc,oBAAoB;AAAA,gBAEvC,GAAG,KACD,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,OAClC,gDAAC,YAAgB,GAAE,KAAI,MAAM,SAAS,SAAQ,KAC5C;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAM;AAAA,sBACN,KAAK,GAAG,GAAG;AAAA,sBACX,OAAO,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,sBACpC,aAAY;AAAA;AAAA,kBACd;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAc;AAAA,sBACd,QAAO;AAAA,sBACP,UAAU;AAAA,sBACV,KAAK,GAAG,GAAG;AAAA,sBACX,OAAO,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAC,CAAC;AAAA,sBACpC,aAAY;AAAA;AAAA,kBACd;AAAA,qBAdW,EAeb,CACD;AAAA,mBApEG,CAqER;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAGF,MAAI,WAAW;AACb,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW;AAAA,QACX,OACE,iBAAiB,SAAY,EAAE,QAAQ,aAAa,IAAI;AAAA,QAGzD;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SAAO,+CAAC,SAAI,WAAW,YAAa,mBAAQ;AAC9C;AAEA,IAAO,yBAAQ;;;AMxuBf,IAAAC,kBAMO;AACP,IAAAC,sBAAuB;AA2LnB,IAAAC,wBAAA;AA1KJ,SAAS,cAAc,OAA+B;AACpD,SAAO,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,EAAE,KAAK,IAAI;AAC/C;AAEA,SAAS,0BACP,SACA,UACgB;AAChB,QAAM,eAAe,IAAI,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACpE,QAAM,OAAuB,CAAC;AAE9B,aAAW,QAAQ,SAAS;AAC1B,UAAM,eAAe,aAAa,IAAI,KAAK,EAAE;AAC7C,QAAI,cAAc;AAChB,WAAK,KAAK,YAAY;AACtB,mBAAa,OAAO,KAAK,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,aAAW,QAAQ,UAAU;AAC3B,QAAI,aAAa,IAAI,KAAK,EAAE,GAAG;AAC7B,WAAK,KAAK,IAAI;AACd,mBAAa,OAAO,KAAK,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAY,MAAW,MAAc,IAAiB;AAC7D,QAAM,OAAO,CAAC,GAAG,IAAI;AACrB,QAAM,CAAC,KAAK,IAAI,KAAK,OAAO,MAAM,CAAC;AACnC,OAAK,OAAO,IAAI,GAAG,KAAK;AACxB,SAAO;AACT;AAIA,SAASC,kBAAiB,KAAkD;AAC1E,QAAM,CAAC,GAAG,IAAI,QAAI,0BAAS,CAAC;AAC5B,iCAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AACT,UAAM,KAAK,IAAI,eAAe,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,YAAY,MAAM,CAAC;AACjE,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,GAAG,CAAC;AACR,SAAO;AACT;AA2BA,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAS,wBAAuB,IAAI;AAC1C,QAAM,cAAU,wBAAuB,IAAI;AAC3C,QAAM,wBAAoB,wBAAuB,IAAI;AACrD,QAAM,YAAYA,kBAAiB,MAAM;AACzC,QAAM,aAAaA,kBAAiB,OAAO;AAC3C,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,0BAAS,CAAC;AAE1D,QAAM,eAAyB,KAAK,QAAQ,cAAc;AAC1D,QAAM,WAAW,KAAK,UAAU;AAChC,QAAM,cAAc,QAAQ,KAAK,YAAY,KAAK,SAAS,SAAS,CAAC;AACrE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI;AAAA,IAC9C,KAAK,mBAAmB;AAAA,EAC1B;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,OAA8B;AAC7B,aAAO,UAAU;AACjB,mBAAa,EAAE;AAAA,IACjB;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAGA,iCAAU,MAAM;AACd,QAAI,YAAY,GAAG;AACjB,qBAAe,SAAS;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,WAAW,cAAc,CAAC;AAI9B,iCAAU,MAAM;AACd,QAAI,aAAa,GAAG;AAClB,qBAAe,aAAa,CAAC;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,YAAY,cAAc,CAAC;AAK/B,iCAAU,MAAM;AACd,UAAM,SAAS,QAAQ;AACvB,UAAM,cAAc,kBAAkB;AAEtC,QAAI,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,kBAAkB;AAChE,0BAAoB,CAAC;AACrB;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM;AAC1B,YAAM,WAAW,OAAO,sBAAsB;AAC9C,YAAM,YAAY,YAAY,sBAAsB;AACpD,0BAAoB,KAAK,IAAI,GAAG,UAAU,MAAM,SAAS,MAAM,CAAC;AAAA,IAClE;AAEA,kBAAc;AACd,UAAM,KAAK,IAAI,eAAe,aAAa;AAC3C,OAAG,QAAQ,MAAM;AACjB,OAAG,QAAQ,WAAW;AACtB,WAAO,iBAAiB,UAAU,aAAa;AAE/C,WAAO,MAAM;AACX,SAAG,WAAW;AACd,aAAO,oBAAoB,UAAU,aAAa;AAAA,IACpD;AAAA,EACF,GAAG,CAAC,kBAAkB,WAAW,CAAC;AAGlC,iCAAU,MAAM;AACd,iBAAa,YAAY;AAAA,EAC3B,GAAG,CAAC,cAAc,YAAY,CAAC;AAC/B,iCAAU,MAAM;AACd,mBAAe,QAAQ;AAAA,EACzB,GAAG,CAAC,UAAU,cAAc,CAAC;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAW,oBAAAC;AAAA,QACT;AAAA,QACA,eAAe;AAAA,QACf,cAAc;AAAA,MAChB;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA,yBACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,oBAAAA;AAAA,cACT;AAAA,cACA,kBAAkB,WAAW,WAAW;AAAA,YAC1C;AAAA;AAAA,QACF;AAAA,QAEF,+CAAC,SAAI,KAAK,SACR;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,eAAe,KAAK;AAAA,YACpB,OAAO,KAAK;AAAA,YACZ,gBAAgB,KAAK;AAAA,YACrB,UAAU,KAAK;AAAA,YACf,mBAAmB,KAAK;AAAA,YACxB,aAAa,KAAK;AAAA,YAClB,sBAAsB,KAAK;AAAA,YAC3B,OAAO,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,MAAM,KAAK;AAAA,YACX,iBAAiB,KAAK;AAAA,YACtB,UAAU,cAAc,mBAAmB;AAAA,YAC3C,kBACE,cAAc,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI;AAAA,YAEvD,aAAa;AAAA,YACb,SAAS,KAAK;AAAA,YACd,cAAc,KAAK;AAAA,YACnB,YACE,cACE;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAAQ;AAAA;AAAA,YACV,IACE;AAAA,YAEN;AAAA,YACA;AAAA;AAAA,QACF,GACF;AAAA,QAEC,eAAe,oBAAoB,KAAK,YACvC,+CAAC,SAAI,KAAK,mBAAmB,WAAU,QACrC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ;AAAA,YACA;AAAA,YACA,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,cAAc;AAAA,YACd,OAAO,QAAQ;AAAA;AAAA,QACjB,GACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAeA,IAAM,YAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,QAAQ;AACV,MAAM;AACJ,QAAM,qBAAqB,cAAc,SAAS,cAAc;AAChE,QAAM,iBAAiB,SAAS,UAAU;AAC1C,QAAM,iBAAiB,SAAS,UAAU;AAC1C,QAAM,WAAW,UAAU,cAAc;AAEzC,QAAM,mBAAmB,QAAQ,SAAS,eAAe,MAAM,SAAS,CAAC;AAEzE,QAAM,CAAC,cAAc,eAAe,QAAI,0BAAyB,KAAK;AACtE,QAAM,8BAA0B,wBAAO,cAAc,KAAK,CAAC;AAC3D,QAAM,4BAAwB,wBAAO,KAAK;AAG1C,iCAAU,MAAM;AACd,UAAM,cAAc,cAAc,KAAK;AACvC,oBAAgB,CAAC,SAAS;AACxB,UAAI,CAAC,sBAAsB,SAAS;AAClC,eAAO;AAAA,MACT;AACA,UAAI,gBAAgB,wBAAwB,SAAS;AACnD,8BAAsB,UAAU;AAChC,eAAO;AAAA,MACT;AACA,aAAO,0BAA0B,MAAM,KAAK;AAAA,IAC9C,CAAC;AACD,4BAAwB,UAAU;AAAA,EACpC,GAAG,CAAC,KAAK,CAAC;AAGV,QAAM,CAAC,gBAAgB,iBAAiB,QAAI;AAAA,IAC1C,CAAC;AAAA,EACH;AACA,QAAM,CAAC,gBAAgB,iBAAiB,QAAI;AAAA,IAC1C,CAAC;AAAA,EACH;AACA,QAAM,CAAC,UAAU,WAAW,QAAI,0BAAmC,CAAC,CAAC;AACrE,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAkC,CAAC,CAAC;AAExE,QAAM,qBAAiB,wBAA8C,CAAC,CAAC;AACvE,QAAM,yBAAqB,wBAA+B,CAAC,CAAC;AAE5D,QAAM,mBAAe,wBAA6C,IAAI;AACtE,QAAM,oBAAgB,wBAA0B,IAAI;AACpD,QAAM,CAAC,YAAY,aAAa,QAAI,0BAAwB,IAAI;AAChE,QAAM,CAAC,YAAY,aAAa,QAAI,0BAA4B,IAAI;AAEpE,iCAAU,MAAM;AACd,UAAM,WAAW,IAAI,IAAI,aAAa,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAE5D,UAAM,QAAQ,CAAK,SAA+C;AAChE,UAAI,QAAQ;AACZ,YAAM,OAA0B,CAAC;AACjC,iBAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC9C,YAAI,SAAS,IAAI,EAAE,GAAG;AACpB,eAAK,EAAE,IAAI;AAAA,QACb,OAAO;AACL,kBAAQ;AAAA,QACV;AAAA,MACF;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAEA,sBAAkB,KAAK;AACvB,sBAAkB,KAAK;AACvB,gBAAY,KAAK;AACjB,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,mBAAe,6BAAY,CAAC,IAAY,MAAc;AAC1D,sBAAkB,CAAC,SAAU,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,CAAE;AAAA,EAC5E,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,6BAAY,CAAC,IAAY,MAAc;AAC1D,sBAAkB,CAAC,SAAU,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,CAAE;AAAA,EAC5E,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,6BAAY,CAAC,IAAY,MAAgB;AAC1D,gBAAY,CAAC,SAAU,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,CAAE;AAAA,EACtE,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,6BAAY,CAAC,IAAY,WAAoB;AAChE;AAAA,MAAc,CAAC,SACb,KAAK,EAAE,MAAM,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAgB,6BAAY,CAAC,IAAY,OAA8B;AAC3E,QAAI,IAAI;AACN,qBAAe,QAAQ,EAAE,IAAI;AAC7B;AAAA,IACF;AACA,WAAO,eAAe,QAAQ,EAAE;AAChC,WAAO,mBAAmB,QAAQ,EAAE;AAAA,EACtC,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,6BAAY,MAAM;AACvC,iBAAa,UAAU;AACvB,kBAAc,UAAU;AACxB,kBAAc,IAAI;AAClB,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,6BAAY,MAAM;AACnC,QAAI,CAAC,kBAAkB;AACrB,qBAAe;AACf;AAAA,IACF;AAEA,UAAM,YAAY,aAAa;AAC/B,UAAM,SAAS,cAAc;AAC7B,QAAI,CAAC,aAAa,CAAC,QAAQ;AACzB,qBAAe;AACf;AAAA,IACF;AAEA,UAAM,YAAY,aAAa;AAAA,MAC7B,CAAC,SAAS,KAAK,OAAO,UAAU;AAAA,IAClC;AACA,QAAI,cAAc,IAAI;AACpB,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,YACF,OAAO,aAAa,UAAU,OAAO,QAAQ,IAAI,OAAO;AAC1D,QAAI,YAAY,WAAW;AACzB,mBAAa;AAAA,IACf;AACA,gBAAY,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,aAAa,SAAS,CAAC,CAAC;AAEpE,QAAI,cAAc,WAAW;AAC3B,4BAAsB,UAAU;AAChC,sBAAgB,SAAS,cAAc,WAAW,SAAS,CAAC;AAC5D,eAAS,YAAY;AAAA,QACnB,IAAI,UAAU;AAAA,QACd,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,mBAAe;AAAA,EACjB,GAAG,CAAC,gBAAgB,kBAAkB,cAAc,QAAQ,CAAC;AAG7D,uCAAgB,MAAM;AACpB,UAAM,cAAsC,CAAC;AAE7C,eAAW,QAAQ,cAAc;AAC/B,YAAM,QAAQ,eAAe,QAAQ,KAAK,EAAE;AAC5C,UAAI,CAAC,MAAO;AAEZ,YAAM,UAAU,MAAM;AACtB,kBAAY,KAAK,EAAE,IAAI;AAEvB,YAAM,UAAU,mBAAmB,QAAQ,KAAK,EAAE;AAClD,UAAI,YAAY,UAAa,YAAY,QAAS;AAElD,YAAM,SAAS,UAAU;AACzB,YAAM,MAAM,aAAa;AACzB,YAAM,MAAM,YAAY,cAAc,MAAM;AAC5C,YAAM,MAAM,aAAa;AAEzB,4BAAsB,MAAM;AAC1B,cAAM,MAAM,aACV;AACF,cAAM,MAAM,YAAY;AAAA,MAC1B,CAAC;AAAA,IACH;AAEA,uBAAmB,UAAU;AAAA,EAC/B,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,cAAc,aAAa,IAAI,CAAC,SAAS,eAAe,KAAK,EAAE,KAAK,CAAC;AAC3E,QAAM,cAAc,aAAa,IAAI,CAAC,SAAS,eAAe,KAAK,EAAE,KAAK,CAAC;AAC3E,QAAM,WAAW,aAAa;AAAA,IAC5B,CAAC,SAAS,SAAS,KAAK,EAAE,KAAK,KAAK,QAAQ,cAAc;AAAA,EAC5D;AACA,QAAM,aAAa,aAAa;AAAA,IAC9B,CAAC,SAAS,WAAW,KAAK,EAAE,KAAK,QAAQ,KAAK,MAAM;AAAA,EACtD;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,UAA2C;AAC1C,UAAI,CAAC,oBAAoB,CAAC,aAAa,QAAS;AAEhD,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,UAAI,aAAa,WAAW,EAAG;AAE/B,YAAM,UAAU,aAAa,CAAC,GAAG;AACjC,YAAM,SAAS,aAAa,aAAa,SAAS,CAAC,GAAG;AACtD,YAAM,WAAW,UAAU,eAAe,QAAQ,OAAO,IAAI;AAC7D,YAAM,UAAU,SAAS,eAAe,QAAQ,MAAM,IAAI;AAE1D,UAAI,CAAC,YAAY,CAAC,QAAS;AAE3B,UAAI,aAAgC;AACpC,YAAM,YAAY,SAAS,sBAAsB;AACjD,YAAM,WAAW,QAAQ,sBAAsB;AAE/C,UAAI,MAAM,WAAW,UAAU,KAAK;AAClC,qBAAa,EAAE,OAAO,GAAG,UAAU,SAAS;AAAA,MAC9C,WAAW,MAAM,WAAW,SAAS,QAAQ;AAC3C,qBAAa,EAAE,OAAO,aAAa,SAAS,GAAG,UAAU,QAAQ;AAAA,MACnE;AAEA,UAAI,YAAY;AACd,cAAM,aAAa,cAAc;AACjC,YACE,CAAC,cACD,WAAW,UAAU,WAAW,SAChC,WAAW,aAAa,WAAW,UACnC;AACA,wBAAc,UAAU;AACxB,wBAAc,UAAU;AAAA,QAC1B;AAAA,MACF;AAEA,UAAI,MAAM,cAAc;AACtB,cAAM,aAAa,aAAa;AAAA,MAClC;AAAA,IACF;AAAA,IACA,CAAC,kBAAkB,YAAY;AAAA,EACjC;AAEA,QAAM,sBAAkB;AAAA,IACtB,CAAC,UAA2C;AAC1C,UAAI,CAAC,iBAAkB;AACvB,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,iBAAW;AAAA,IACb;AAAA,IACA,CAAC,YAAY,gBAAgB;AAAA,EAC/B;AAEA,SACE,gDAAC,SAAI,WAAU,YAAW,OAAO,EAAE,aAAa,SAAS,GACvD;AAAA,mDAAC,SAAI,YAAY,qBAAqB,QAAQ,iBAC3C,uBAAa,IAAI,CAAC,MAAM,MACvB;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,aAAa;AAAA,QACb,YAAY,eAAe,KAAK;AAAA,QAChC,eACE,cAAc,WAAW,UAAU,KAAK,eAAe,KAAK,KACxD,WAAW,WACX;AAAA,QAEN,cAAc,CAAC,OAAO,cAAc,KAAK,IAAI,EAAE;AAAA,QAC/C,aACE,mBACI,CAAC,UAAU;AACT,gBAAM,gBAAgB;AACtB,uBAAa,UAAU,EAAE,IAAI,KAAK,IAAI,OAAO,EAAE;AAC/C,wBAAc,UAAU,EAAE,OAAO,GAAG,UAAU,SAAS;AACvD,wBAAc,KAAK,EAAE;AACrB,wBAAc,EAAE,OAAO,GAAG,UAAU,SAAS,CAAC;AAC9C,cAAI,MAAM,cAAc;AACtB,kBAAM,aAAa,gBAAgB;AACnC,kBAAM,aAAa,QAAQ,cAAc,KAAK,EAAE;AAAA,UAClD;AAAA,QACF,IACA;AAAA,QAEN,YACE,mBACI,CAAC,UAAU;AACT,cAAI,CAAC,aAAa,QAAS;AAC3B,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AAEtB,gBAAM,OAAO,MAAM,cAAc,sBAAsB;AACvD,gBAAM,WACJ,MAAM,UAAU,KAAK,MAAM,KAAK,SAAS,IACrC,WACA;AACN,gBAAM,aAAyB,EAAE,OAAO,GAAG,SAAS;AAEpD,gBAAM,aAAa,cAAc;AACjC,cACE,CAAC,cACD,WAAW,UAAU,WAAW,SAChC,WAAW,aAAa,WAAW,UACnC;AACA,0BAAc,UAAU;AACxB,0BAAc,UAAU;AAAA,UAC1B;AAEA,cAAI,MAAM,cAAc;AACtB,kBAAM,aAAa,aAAa;AAAA,UAClC;AAAA,QACF,IACA;AAAA,QAEN,QACE,mBACI,CAAC,UAAU;AACT,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,qBAAW;AAAA,QACb,IACA;AAAA,QAEN,WACE,mBACI,CAAC,UAAU;AACT,gBAAM,gBAAgB;AACtB,yBAAe;AAAA,QACjB,IACA;AAAA,QAEN,gBAAgB,CAAC,MAAM,aAAa,KAAK,IAAI,CAAC;AAAA,QAC9C,gBAAgB,CAAC,MAAM,aAAa,KAAK,IAAI,CAAC;AAAA,QAC9C,cAAc,CAAC,MAAM,WAAW,KAAK,IAAI,CAAC;AAAA,QAC1C,gBAAgB,CAAC,MAAM,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA,MA/EzC,KAAK;AAAA,IAgFZ,CACD,GACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,sBAAsB,SAAS;AAAA,QAC/B,QAAQ;AAAA,QACR,UAAU,SAAS;AAAA,QACnB,gBAAgB,SAAS;AAAA,QACzB,gBAAgB,SAAS;AAAA,QACzB,iBAAiB,SAAS;AAAA,QAC1B,eAAe,SAAS;AAAA,QACxB,eAAe,SAAS;AAAA,QACxB,eAAe,SAAS;AAAA,QACxB,qBAAqB,SAAS;AAAA,QAC9B,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA;AAAA,IACrB;AAAA,KACF;AAEJ;AAIA,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AACF,MAAM;AACJ,QAAM,mBACJ,MAAM,QAAQ,YAAY,QAAQ;AACpC,QAAM,qBAAqB,MAAM,UAAU;AAE3C,QAAM,iBAAiB,CAAC,EAAE,QAAQ,aAAa,UAAa;AAE5D,QAAM,WAcF;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAA;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC,0BAAgB,+CAAC,kBAAO,MAAK,MAAK,OAAM,cAAa;AAAA;AAAA,IACxD;AAAA,EAEJ;AAGA,MAAI,OAAO;AACT,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,oBAAAA;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC,wBACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAM;AAAA,YACN,UACE,OAAO,UAAU,WACb,QACA;AAAA,YAEN,MAAK;AAAA,YACL,UAAQ;AAAA,YACR,aAAa,UAAU,UAAU;AAAA,YACjC,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,SACE,gDAAC,SAAI,eAAW,oBAAAA,SAAW,iBAAiB,SAAS,GAElD;AAAA,YACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,eAAe,KAAK;AAAA,QACpB,OAAO,KAAK;AAAA,QACZ,gBAAgB,KAAK;AAAA,QACrB,UAAU,KAAK;AAAA,QACf,mBAAmB,KAAK;AAAA,QACxB,aAAa,KAAK;AAAA,QAClB,sBAAsB,KAAK;AAAA,QAC3B,OAAO,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,QACX,iBAAiB,KAAK;AAAA,QACtB,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA;AAAA,IACrB;AAAA,IAID,MAAM,SAAS,IACd,+CAAC,SAAI,WAAW,OAAO,SAAS,QAC9B;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,YAAY,iBAAiB,aAAa;AAAA,QAC1C,OAAO;AAAA;AAAA,IACT,GACF,IACE,aACF,+CAAC,SAAI,WAAW,OAAO,SAAS,QAAY,sBAAW,IACrD;AAAA,IAGH,MAAM,YAAY,KAAK,SAAS,SAAS,KACxC,+CAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,KAAK;AAAA,QACZ,YAAY;AAAA,QACZ;AAAA,QACA,YAAY;AAAA,QACZ,cAAc,KAAK,UAAU;AAAA,QAC7B,YAAY;AAAA,QACZ,OAAO;AAAA;AAAA,IACT,GACF;AAAA,KAEJ;AAEJ;AAGA,IAAO,mBAAQ;;;AChzBf,IAAAC,kBASO;AACP,IAAAC,qBAA6B;AAC7B,IAAAC,sBAAuB;AAkGX,IAAAC,wBAAA;AAxFZ,IAAM,yBAAqB,+BAA8C,IAAI;AAE7E,IAAM,gBAAgB;AAEtB,IAAM,aAAa,CACjB,MACA,aACc;AACd,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO,OAAO,SAAS,aAAa,KAAK,QAAQ,IAAI;AACvD;AAEO,IAAM,sBAA+D,CAAC;AAAA,EAC3E;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,QAAI,0BAAoC,IAAI;AAClE,QAAM,CAAC,WAAW,YAAY,QAAI,0BAAS,KAAK;AAChD,QAAM,sBAAkB,wBAA6C,IAAI;AAEzE,QAAM,mBAAe,6BAAY,MAAM;AACrC,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,6BAAY,CAAC,YAAgC;AAChE,QAAI,gBAAgB,SAAS;AAC3B,mBAAa,gBAAgB,OAAO;AACpC,sBAAgB,UAAU;AAAA,IAC5B;AACA,aAAS,OAAO;AAChB,UAAM,YAAY,MAAM,aAAa,IAAI;AACzC,QACE,OAAO,WAAW,eAClB,OAAO,OAAO,0BAA0B,YACxC;AACA,aAAO,sBAAsB,SAAS;AAAA,IACxC,OAAO;AACL,iBAAW,WAAW,CAAC;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,iCAAU,MAAM;AACd,QAAI,CAAC,aAAa,OAAO;AACvB,sBAAgB,UAAU,WAAW,MAAM;AACzC,cAAM,UAAU;AAChB,iBAAS,IAAI;AAAA,MACf,GAAG,aAAa;AAChB,aAAO,MAAM;AACX,YAAI,gBAAgB,SAAS;AAC3B,uBAAa,gBAAgB,OAAO;AACpC,0BAAgB,UAAU;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,KAAK,CAAC;AAErB;AAAA,IACE,MAAM,MAAM;AACV,UAAI,gBAAgB,SAAS;AAC3B,qBAAa,gBAAgB,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,eAAW;AAAA,IACf,OAAO;AAAA,MACL,SAAS;AAAA,IACX;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,mBAAe;AAAA,IACnB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,KAAK,KAAK;AAAA,MAC1B,cAAc;AAAA,IAChB;AAAA,IACA,CAAC,cAAc,cAAc,OAAO,SAAS;AAAA,EAC/C;AAEA,QAAM,cACJ,OAAO,aAAa,eAAe,YAC/B;AAAA,IACE,gDAAC,SAAI,WAAU,0EACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,oBAAAC;AAAA,YACT;AAAA,YACA,YAAY,oCAAoC;AAAA,UAClD;AAAA,UACA,eAAY;AAAA,UACZ,SACE,MAAM,oBAAoB,QACtB,SACA,MAAM;AACJ,yBAAa;AAAA,UACf;AAAA;AAAA,MAER;AAAA,MACA,+CAAC,SAAI,WAAU,+CACb;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,eAAW,oBAAAA;AAAA,YACT;AAAA,YACA,MAAM;AAAA,YACN,YAAY,kBAAkB;AAAA,UAChC;AAAA,UACA,OAAO,EAAE,WAAW,QAAQ,WAAW,OAAO;AAAA,UAE9C;AAAA,4DAAC,YAAO,WAAU,oGAChB;AAAA,8DAAC,SAAI,WAAU,aACZ;AAAA,sBAAM,SACL,+CAAC,SAAI,WAAU,8DACZ,gBAAM,OACT;AAAA,gBAED,MAAM,eACL,+CAAC,OAAE,WAAU,8CACV,gBAAM,aACT;AAAA,iBAEJ;AAAA,eACE,MAAM,mBAAmB,SACzB;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,QAAM;AAAA,kBACN,cAAW;AAAA,kBACX,SAAS;AAAA;AAAA,cACX;AAAA,eAEJ;AAAA,YACA,+CAAC,SAAI,WAAU,oCACZ,qBAAW,MAAM,SAAS,QAAQ,KACjC,+CAAC,OAAE,WAAU,0BAAyB,kCAEtC,GAEJ;AAAA,YACC,MAAM,WACL,+CAAC,SAAI,WAAU,2GACZ,qBAAW,MAAM,SAAS,QAAQ,GACrC;AAAA;AAAA;AAAA,MAEJ,GACF;AAAA,OACF;AAAA,IACA,SAAS;AAAA,EACX,IACA;AAEN,SACE,gDAAC,mBAAmB,UAAnB,EAA4B,OAAO,cACjC;AAAA;AAAA,IACA;AAAA,KACH;AAEJ;AAEO,IAAM,iBAAiB,MAAM;AAClC,QAAM,cAAU,4BAAW,kBAAkB;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO;AACT;;;AC/KO,SAAS,8BACd,UAA+B,CAAC,GAChC;AACA,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,kBAAkB,MAAM;AAAA,IACxB,cAAc,MAAM;AAAA,IAAC;AAAA,IACrB,SAAS,MAAM;AAAA,IAAC;AAAA,EAClB,IAAI;AAEJ,QAAM,qBAAqB;AAE3B,MAAI,eAAqD;AAEzD,SAAO,MAAM;AACX,QAAI,oBAAoB;AACtB,cAAQ,KAAK,6CAA6C;AAAA,IAC5D;AAGA,QAAI,cAAc;AAChB,mBAAa,YAAY;AAAA,IAC3B;AAGA,mBAAe,WAAW,MAAM;AAE9B,UAAI,CAAC,gBAAgB,GAAG;AACtB,YAAI,oBAAoB;AACtB,kBAAQ,KAAK,6CAA6C;AAAA,QAC5D;AACA,oBAAY;AAAA,MACd,OAAO;AACL,YAAI,oBAAoB;AACtB,kBAAQ,KAAK,yCAAyC;AAAA,QACxD;AACA,eAAO;AAAA,MACT;AAAA,IACF,GAAG,UAAU;AAAA,EACf;AACF;AAOO,SAAS,oBACd,SACA,YACA;AACA,SAAO,oBAAoB,SAAS,OAAO;AAC3C,MAAI,YAAY;AACd,iBAAa,UAAU;AAAA,EACzB;AACF;AAOO,SAAS,2BAA2B,UAA+B,CAAC,GAAG;AAC5E,QAAM,UAAU,8BAA8B,OAAO;AAErD,SAAO,MAAM;AACX,WAAO,oBAAoB,SAAS,OAAO;AAAA,EAC7C;AACF;;;ACpFO,SAAS,UAAU,OAAoC;AAC5D,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SACE,MAAM,YAAY,MAAM,UACxB,UAAU,OACV,UAAU,SACV,UAAU,QACV,UAAU,aACV,UAAU,OACV,UAAU;AAEd;AAEO,SAAS,gBAAgB,SAAyB;AACvD,SAAO,QAAQ,QAAQ,eAAe,GAAG,EAAE,QAAQ,YAAY,EAAE;AACnE;AAEO,SAAS,uBAAuB,MAAsB;AAC3D,SAAO,gBAAgB,KAAK,YAAY,CAAC;AAC3C;AAEO,SAAS,cAAc,aAA8B;AAC1D,SACE,gBAAgB,iBAChB,gBAAgB,aAChB,gBAAgB;AAEpB;AAEO,SAAS,WAAW,KAA6B;AACtD,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,WAAO,IAAI,KAAK,GAAG,EAAE,mBAAmB,QAAW;AAAA,MACjD,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,KAAqB;AACjD,MAAI;AACF,WAAO,IAAI,KAAK,GAAG,EAAE,mBAAmB,QAAW;AAAA,MACjD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,IAAI,MAAM,IAAI,EAAE;AAAA,EACzB;AACF;AAEO,SAAS,SAAS,IAAqB;AAC5C,MAAI,MAAM,KAAM,QAAO;AACvB,MAAI,MAAM,OAAO,KAAM,QAAO,IAAI,MAAM,OAAO,OAAO,QAAQ,CAAC,CAAC;AAChE,MAAI,MAAM,KAAM,QAAO,GAAG,KAAK,MAAM,KAAK,IAAI,CAAC;AAC/C,SAAO,GAAG,EAAE;AACd;;;ACtDA,IAAM,oBAAoB;AAE1B,IAAM,iBAAiB;AAAA,EACrB,EAAE,UAAU,QAAQ,QAAQ,SAAS,SAAS,OAAQ;AAAA;AAAA,EACtD,EAAE,UAAU,SAAS,QAAQ,UAAU,SAAS,kBAAkB;AAAA,EAClE,EAAE,UAAU,OAAO,QAAQ,QAAQ,SAAS,KAAM;AAAA,EAClD,EAAE,UAAU,QAAQ,QAAQ,SAAS,SAAS,GAAG;AAAA,EACjD,EAAE,UAAU,UAAU,QAAQ,WAAW,SAAS,EAAE;AACtD;AAsCO,SAAS,eACd,cACA,SACQ;AACR,QAAM,EAAE,WAAW,GAAG,YAAY,YAAY,IAAI,WAAW,CAAC;AAE9D,QAAM,UAAU,KAAK,MAAM,YAAY;AACvC,MAAI,WAAW,EAAG,QAAO;AAEzB,QAAM,QAAkB,CAAC;AACzB,MAAI,YAAY;AAEhB,aAAW,QAAQ,gBAAgB;AACjC,QAAI,YAAY,KAAK,QAAS;AAE9B,UAAM,QAAQ,KAAK,MAAM,YAAY,KAAK,OAAO;AACjD,iBAAa,QAAQ,KAAK;AAE1B,UAAM,KAAK,GAAG,KAAK,IAAI,UAAU,IAAI,KAAK,WAAW,KAAK,MAAM,EAAE;AAElE,QAAI,MAAM,UAAU,SAAU;AAAA,EAChC;AAEA,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AAGtC,SAAO,GAAG,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,QAAQ,MAAM,MAAM,SAAS,CAAC,CAAC;AACxE;AAQO,SAAS,0BACd,cACA,SACQ;AACR,QAAM,EAAE,iBAAiB,sBAAsB,GAAG,KAAK,IAAI,WAAW,CAAC;AACvE,QAAM,OAAO,KAAK,MAAM,eAAe,EAAE;AACzC,MAAI,OAAO,KAAK,eAAe,EAAG,QAAO;AACzC,SAAO,eAAe,MAAM,IAAI;AAClC;AAMO,SAAS,qBACd,SACA,SACQ;AACR,SAAO,0BAA0B,KAAK,MAAM,UAAU,GAAI,GAAG,OAAO;AACtE;;;ACnGA,IAAM,eAA6C;AAAA,EACjD,GAAG;AAAA,EACH,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,WAAW;AACb;AAMO,SAAS,sBAAsB,KAAuC;AAC3E,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,aAAa,IAAI,KAAK,EAAE,YAAY,CAAC,KAAK;AACnD;AAGA,IAAM,iBAA+C;AAAA,EACnD,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,IAAM,gBAAgC,CAAC,MAAM,MAAM,MAAM,MAAM,GAAG;AAKlE,SAAS,QAAQ,OAAe,UAAgC;AAC9D,SAAO,QAAQ,eAAe,QAAQ;AACxC;AAMO,SAAS,aAAa,gBAAsC;AACjE,aAAW,QAAQ,eAAe;AAChC,QAAI,kBAAkB,eAAe,IAAI,EAAG,QAAO;AAAA,EACrD;AACA,SAAO;AACT;AAMO,SAAS,cACd,OACA,MACA,WAAW,GACH;AACR,QAAM,YAAY,QAAQ,eAAe,IAAI;AAE7C,QAAM,UAAU,WAAW,UAAU,QAAQ,QAAQ,CAAC;AACtD,SAAO,GAAG,OAAO;AACnB;AAeO,SAAS,oBACd,OACA,OACA,YAA0B,KAC1B,WAAW,GAMX;AACA,QAAM,aAAa,QAAQ,OAAO,SAAS;AAC3C,QAAM,OAAO,aAAa,UAAU;AAEpC,QAAM,aAAa,cAAc,QAAQ,OAAO,SAAS,GAAG,MAAM,QAAQ;AAC1E,QAAM,aAAa,cAAc,YAAY,MAAM,QAAQ;AAE3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,GAAG,UAAU,MAAM,UAAU,IAAI,IAAI;AAAA,EAC7C;AACF;AAUO,SAAS,YAAY,OAAe,WAAW,GAAW;AAC/D,MAAI,SAAS,EAAG,QAAO;AACvB,QAAM,OAAO,aAAa,KAAK;AAC/B,SAAO,GAAG,cAAc,OAAO,MAAM,QAAQ,CAAC,IAAI,IAAI;AACxD;;;ACvGO,SAAS,wBACd,YACA,cACA,UACS;AACT,MAAI,CAAC,gBAAgB,aAAa,WAAW,GAAG;AAC9C,WAAO;AAAA,EACT;AAMA,QAAM,kBAAyC,CAAC;AAChD,QAAM,iBAAwC,CAAC;AAE/C,eAAa,QAAQ,CAAC,KAAK,UAAU;AACnC,QAAI,UAAU,KAAK,IAAI,cAAc,OAAO;AAC1C,sBAAgB,KAAK,GAAG;AAAA,IAC1B,WAAW,IAAI,cAAc,MAAM;AACjC,qBAAe,KAAK,GAAG;AAAA,IACzB;AAAA,EACF,CAAC;AAMD,MAAI,YAAY;AAChB,MAAI,gBAAgB,SAAS,GAAG;AAC9B,gBAAY,gBAAgB;AAAA,MAAM,CAAC,QACjC,yBAAyB,KAAK,QAAQ;AAAA,IACxC;AAAA,EAEF;AAGA,MAAI,WAAW;AACf,MAAI,eAAe,SAAS,GAAG;AAC7B,eAAW,eAAe;AAAA,MAAK,CAAC,QAC9B,yBAAyB,KAAK,QAAQ;AAAA,IACxC;AAAA,EAEF;AAGA,QAAM,cACJ,eAAe,SAAS,IAAI,aAAa,WAAW;AAGtD,SAAO;AACT;AAQA,SAAS,yBACP,YACA,UACS;AACT,QAAM,EAAE,YAAY,aAAa,SAAS,IAAI;AAC9C,QAAM,cAAc,SAAS,UAAU;AAMvC,MAAI,cAAc;AAClB,MACE,eACA,OAAO,gBAAgB,YACvB,WAAW,aACX;AACA,kBAAc,YAAY;AAAA,EAC5B;AAEA,MAAI,UAAU;AACd,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,cAAU;AAAA,EACZ;AACA,MAAI,WAAW;AACf,MAAI,OAAO,gBAAgB,UAAU;AACnC,eAAW;AAAA,EACb;AAGA,QAAM,kBAAkB,eAAe;AACvC,QAAM,iBACJ,OAAO,oBAAoB,WACvB,KAAK,UAAU,eAAe,IAC9B,OAAO,eAAe;AAE5B,QAAM,iBAAiB,eAAe;AACtC,QAAM,mBACJ,OAAO,mBAAmB,WACtB,KAAK,UAAU,cAAc,IAC7B,OAAO,cAAc;AAK3B,MAAI,SAAS;AAEb,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,UAAI,UAAU;AACZ,iBACE,eAAe,YAAY,MAAM,iBAAiB,YAAY;AAAA,MAClE,OAAO;AACL,iBAAS,mBAAmB;AAAA,MAC9B;AACA;AAAA,IACF,KAAK;AACH,UAAI,UAAU;AACZ,iBACE,eAAe,YAAY,MAAM,iBAAiB,YAAY;AAAA,MAClE,OAAO;AACL,iBAAS,mBAAmB;AAAA,MAC9B;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBACG,YAAsD,SACvD,SAAS,gBAAgB;AAAA,MAC7B,WACE,eACA,OAAO,gBAAgB,YACvB,WAAW,aACX;AACA,iBAAS,YAAY,QAAQ,SAAS,gBAAgB;AAAA,MACxD,OAAO;AACL,iBAAS,WAAW,cAAc,IAAI,WAAW,gBAAgB;AAAA,MACnE;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBACG,YAAsD,SACvD,SAAS,gBAAgB;AAAA,MAC7B,WACE,eACA,OAAO,gBAAgB,YACvB,WAAW,aACX;AACA,iBAAS,YAAY,QAAQ,SAAS,gBAAgB;AAAA,MACxD,OAAO;AACL,iBAAS,WAAW,cAAc,IAAI,WAAW,gBAAgB;AAAA,MACnE;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBACG,YAAsD,UACvD,SAAS,gBAAgB;AAAA,MAC7B,WACE,eACA,OAAO,gBAAgB,YACvB,WAAW,aACX;AACA,iBAAS,YAAY,SAAS,SAAS,gBAAgB;AAAA,MACzD,OAAO;AACL,iBAAS,WAAW,cAAc,KAAK,WAAW,gBAAgB;AAAA,MACpE;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBACG,YAAsD,UACvD,SAAS,gBAAgB;AAAA,MAC7B,WACE,eACA,OAAO,gBAAgB,YACvB,WAAW,aACX;AACA,iBAAS,YAAY,SAAS,SAAS,gBAAgB;AAAA,MACzD,OAAO;AACL,iBAAS,WAAW,cAAc,KAAK,WAAW,gBAAgB;AAAA,MACpE;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBAAU,YAAsD;AAAA,UAC9D,CAAC,SACC,KAAK,MAAM,YAAY,EAAE,SAAS,iBAAiB,YAAY,CAAC;AAAA,QACpE;AAAA,MACF,OAAO;AACL,YAAI,UAAU;AACZ,mBAAS,eACN,YAAY,EACZ,SAAS,iBAAiB,YAAY,CAAC;AAAA,QAC5C,OAAO;AACL,mBAAS,eAAe,SAAS,gBAAgB;AAAA,QACnD;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBAAU,YAAsD;AAAA,UAC9D,CAAC,SACC,KAAK,MAAM,YAAY,EAAE,WAAW,iBAAiB,YAAY,CAAC;AAAA,QACtE;AAAA,MACF,OAAO;AACL,YAAI,UAAU;AACZ,mBAAS,eACN,YAAY,EACZ,WAAW,iBAAiB,YAAY,CAAC;AAAA,QAC9C,OAAO;AACL,mBAAS,eAAe,WAAW,gBAAgB;AAAA,QACrD;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBACG,YAAsD,WAAW;AAAA,MACtE,WACE,eACA,OAAO,gBAAgB,YACvB,WAAW,aACX;AACA,iBAAS,YAAY,UAAU;AAAA,MACjC,OAAO;AACL,YAAI,UAAU;AACZ,mBAAS,eAAe,KAAK,MAAM;AAAA,QACrC,OAAO;AACL,mBAAS,eAAe,KAAK,MAAM;AAAA,QACrC;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,UAAI,SAAS;AACX,iBACG,YAAsD,SAAS;AAAA,MACpE,WACE,eACA,OAAO,gBAAgB,YACvB,WAAW,aACX;AACA,iBAAS,YAAY,QAAQ;AAAA,MAC/B,OAAO;AACL,YAAI,UAAU;AACZ,mBAAS,eAAe,KAAK,MAAM;AAAA,QACrC,OAAO;AACL,mBAAS,eAAe,KAAK,MAAM;AAAA,QACrC;AAAA,MACF;AACA;AAAA,IACF;AACE,cAAQ,KAAK,kCAAwB,QAAQ,EAAE;AAC/C,eAAS;AAAA,EACb;AAGA,SAAO;AACT;AAQO,SAAS,2BACd,YACA,UACyB;AACzB,QAAM,gBAAyC,CAAC;AAEhD,aAAW,QAAQ,CAAC,UAAU;AAC5B,kBAAc,MAAM,GAAG,IAAI;AAAA,MACzB,MAAM;AAAA,MACN,MAAM,gBAAgB,CAAC;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACrSO,IAAM,iBAAiB,CAC5B,OACA,OAAe,KACf,eAAuB,SACZ;AACX,QAAM,eAAe,MAAM,KAAK,EAAE,YAAY;AAC9C,QAAM,OAAO,SAAS,IAAI,YAAY,EAAE,SAAS;AACjD,SAAO,mCAAmC,IAAI,MAAM,IAAI,MAAM,YAAY;AAC5E;;;ACvBO,SAAS,kBAAkB,OAAsB;AACtD,SAAO,MAAM,oBAAoB,KAAK,IAAI;AAC5C;;;ACHA,IAAAC,sBAAuB;AAyBjB,IAAAC,wBAAA;AAdC,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW,oBAAAC,SAAW,gCAAgC,SAAS;AAAA,MAC9D,GAAG;AAAA,MAEJ;AAAA,wDAAC,SAAI,WAAU,qCACb;AAAA,yDAAC,UAAK,WAAU,8DACb,iBACH;AAAA,UACA,+CAAC,UAAK,WAAU,kDACb,iBACH;AAAA,WACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,MAAK;AAAA,YACL;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,UAAU,cAAc;","names":["import_react","renderIcon","import_jsx_runtime","React","renderIcon","classNames","import_jsx_runtime","import_classnames","import_jsx_runtime","classNames","import_classnames","import_react","import_classnames","import_react","import_classnames","import_react","import_jsx_runtime","React","sizeStyles","classNames","colors","import_react","import_classnames","import_jsx_runtime","React","classNames","import_jsx_runtime","sizeTokens","renderIcon","classNames","import_jsx_runtime","classNames","import_classnames","import_jsx_runtime","toneTokens","classNames","import_react","import_classnames","import_jsx_runtime","React","classNames","import_react","import_react_dom","import_classnames","import_jsx_runtime","classNames","import_classnames","import_react","import_jsx_runtime","React","classNames","import_classnames","import_jsx_runtime","classNames","import_classnames","import_react","import_react","import_classnames","import_jsx_runtime","baseClasses","sizeStyles","renderIcon","classNames","import_jsx_runtime","renderIcon","classNames","React","import_classnames","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Error","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Error","import_jsx_runtime","import_jsx_runtime","classNames","import_jsx_runtime","renderIcon","import_react","import_classnames","import_react","import_react_dom","import_classnames","import_jsx_runtime","renderIcon","classNames","import_jsx_runtime","classNames","import_react","import_react_dom","import_classnames","import_jsx_runtime","classNames","import_classnames","import_react","import_jsx_runtime","sizeStyles","Input","renderIcon","React","classNames","import_react","import_jsx_runtime","PasswordInput","import_classnames","import_react","import_jsx_runtime","sizeTokens","toneTokens","statusClasses","disabledClasses","Textarea","classNames","import_classnames","import_react","import_jsx_runtime","sizeStyles","toneTokens","statusClasses","disabledClasses","Select","renderIcon","React","classNames","baseClasses","import_react","import_classnames","import_jsx_runtime","toneTokens","renderIcon","colorTokens","classNames","import_react","import_react_dom","import_classnames","import_jsx_runtime","toneTokens","viewportBounds","isClippingParent","resolveBoundaryBounds","PORTAL_ROOT","colorTokens","classNames","import_react","import_react_dom","import_classnames","import_jsx_runtime","toneTokens","viewportBounds","isClippingParent","resolveBoundaryBounds","resolveZIndex","PORTAL_ROOT","MAX_DROPDOWN_HEIGHT","colorTokens","classNames","import_react","import_classnames","import_classnames","import_jsx_runtime","sizeTokens","classNames","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","sizeTokens","sizeStyles","classNames","import_react","import_classnames","import_jsx_runtime","sizeTokens","renderIcon","sizeStyles","classNames","import_react","import_classnames","import_jsx_runtime","toneTokens","sizeTokens","renderIcon","sizeStyles","inset","indicatorWidth","offset","classNames","import_react","import_classnames","import_jsx_runtime","renderIcon","classNames","import_classnames","import_react","import_jsx_runtime","React","classNames","import_classnames","import_jsx_runtime","classNames","import_classnames","import_jsx_runtime","paddingMap","classNames","import_classnames","import_react","import_jsx_runtime","sizeTokens","toneTokens","React","classNames","import_react","import_jsx_runtime","sizeMap","roundedMap","sizeClasses","React","import_react","import_classnames","import_jsx_runtime","COLOR_TOKENS","renderIcon","classNames","import_classnames","import_jsx_runtime","classNames","import_react","import_jsx_runtime","import_react","import_classnames","import_jsx_runtime","sizeTokens","classNames","import_classnames","import_jsx_runtime","variantStyles","sizeTokens","classNames","import_react","import_classnames","import_classnames","import_jsx_runtime","paddingStyles","variantClasses","classNames","color","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","renderIcon","paddingStyles","classNames","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_classnames","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","toneTokens","renderIcon","colorTokens","classNames","import_react","import_jsx_runtime","renderIcon","baseClasses","import_react","import_classnames","import_react","import_jsx_runtime","sizeTokens","renderIcon","classNames","import_react","import_classnames","import_jsx_runtime","sizeStyles","classNames","renderIcon","React","import_classnames","import_react","import_react_dom","import_react","import_jsx_runtime","React","import_jsx_runtime","toCssDimension","alignmentClass","classNames","import_classnames","import_react","import_jsx_runtime","sizePresets","classNames","import_react","import_jsx_runtime","React","import_react","import_classnames","import_react","import_jsx_runtime","import_jsx_runtime","classNames","import_react","import_classnames","import_react","import_react","import_react_dom","import_classnames","import_jsx_runtime","classNames","ReactMarkdown","remarkGfm","import_jsx_runtime","sizeTokens","classNames","import_react","import_react","import_jsx_runtime","import_react_dom","import_jsx_runtime","React","resolveVariable","import_react","import_jsx_runtime","import_react","import_classnames","import_jsx_runtime","SIZE_TOKENS","classNames","React","import_react","import_classnames","import_classnames","import_jsx_runtime","classNames","import_jsx_runtime","classNames","import_classnames","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","classNames","React","import_react","import_react_dom","import_jsx_runtime","s","RechartsTooltip","import_react","import_classnames","import_react","import_react","import_jsx_runtime","sizeTokens","classNames","import_react","import_classnames","import_jsx_runtime","classNames","React","import_react","import_classnames","import_jsx_runtime","ChevronSvg","classNames","import_react","import_jsx_runtime","import_jsx_runtime","import_react","CapsuleBlueprintValueType","import_classnames","import_jsx_runtime","classNames","import_jsx_runtime","import_react","import_classnames","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","lPath","lx","prevDepth","topGap","topY","rightX","cornerY","cornerStyles","classNames","React","paddingStyles","import_react","import_classnames","import_react","import_jsx_runtime","useIsDark","w","import_react","import_classnames","import_react","import_classnames","import_jsx_runtime","classNames","import_react","import_jsx_runtime","useIsDark","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","useElementHeight","classNames","import_jsx_runtime","useIsDark","content","classNames","React","import_react","import_classnames","import_jsx_runtime","useElementHeight","classNames","import_react","import_react_dom","import_classnames","import_jsx_runtime","classNames","import_classnames","import_jsx_runtime","classNames"]}
|