@pstdio/ui 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/chat-ui.js.map +1 -1
  2. package/dist/components/chat-ui/components/chat-panel.d.ts +4 -0
  3. package/dist/components/data-renderer/data-renderer-content.d.ts +22 -0
  4. package/dist/components/data-renderer/data-renderer-helpers.d.ts +2 -0
  5. package/dist/components/data-renderer/data-renderer-list.d.ts +11 -1
  6. package/dist/components/data-renderer/data-renderer-story-fixtures.d.ts +13 -0
  7. package/dist/components/data-renderer/data-renderer.d.ts +11 -0
  8. package/dist/components/data-renderer/use-data-renderer-store.d.ts +3 -0
  9. package/dist/components/diff-viewer/diff-drawer-empty-state.d.ts +1 -0
  10. package/dist/components/diff-viewer/diff-drawer-height.d.ts +10 -0
  11. package/dist/components/diff-viewer/diff-drawer-scroll.d.ts +47 -0
  12. package/dist/components/diff-viewer/diff-drawer.d.ts +2 -7
  13. package/dist/components/diff-viewer/use-selected-diff-scroll.d.ts +19 -0
  14. package/dist/components/empty-state.d.ts +4 -0
  15. package/dist/components/icon-color-picker.d.ts +17 -1
  16. package/dist/components/list-row/list-row.types.d.ts +10 -0
  17. package/dist/components/palette.d.ts +1 -0
  18. package/dist/components/param-editor/index.d.ts +2 -0
  19. package/dist/components/param-editor/param-editor-read-only-value.d.ts +8 -0
  20. package/dist/components/resource-context-menu.d.ts +2 -0
  21. package/dist/components/sidebar/sidebar.types.d.ts +3 -0
  22. package/dist/components/tag-editor/index.d.ts +4 -0
  23. package/dist/components/tag-editor/tag-editor-row.d.ts +19 -0
  24. package/dist/components/tag-editor/tag-editor.d.ts +2 -0
  25. package/dist/components/{status-option-editor/status-option-editor.types.d.ts → tag-editor/tag-editor.types.d.ts} +14 -9
  26. package/dist/components/tag-editor/tag-settings-panel.d.ts +28 -0
  27. package/dist/components/tree-list/tree-list.d.ts +11 -0
  28. package/dist/components/tree-list/tree-list.types.d.ts +6 -0
  29. package/dist/index.d.ts +4 -5
  30. package/dist/index.js +4643 -4184
  31. package/dist/index.js.map +1 -1
  32. package/dist/radio-DJtQY9po.js.map +1 -1
  33. package/dist/theme/recipes/button.d.ts +1 -0
  34. package/dist/theme/recipes/editable.d.ts +46 -1
  35. package/dist/{theme-qP4YOZ2R.js → theme-BnpFnY9v.js} +65 -18
  36. package/dist/theme-BnpFnY9v.js.map +1 -0
  37. package/dist/theme.js +1 -1
  38. package/package.json +4 -4
  39. package/dist/components/layout.d.ts +0 -13
  40. package/dist/components/panel-sidebar-registration-context.d.ts +0 -12
  41. package/dist/components/status-option-editor/index.d.ts +0 -2
  42. package/dist/components/status-option-editor/status-option-editor.d.ts +0 -2
  43. package/dist/components/status-option-editor/status-option-row.d.ts +0 -16
  44. package/dist/theme-qP4YOZ2R.js.map +0 -1
  45. /package/dist/components/{param-editor-color-input.d.ts → param-editor/color-input.d.ts} +0 -0
  46. /package/dist/components/{param-editor-date-input.d.ts → param-editor/date-input.d.ts} +0 -0
  47. /package/dist/components/{param-editor-horizontal-text-input.d.ts → param-editor/horizontal-text-input.d.ts} +0 -0
  48. /package/dist/components/{param-editor-input-group.d.ts → param-editor/input-group.d.ts} +0 -0
  49. /package/dist/components/{param-editor-number-input.d.ts → param-editor/number-input.d.ts} +0 -0
  50. /package/dist/components/{param-editor-horizontal.d.ts → param-editor/param-editor-horizontal.d.ts} +0 -0
  51. /package/dist/components/{param-editor-label.d.ts → param-editor/param-editor-label.d.ts} +0 -0
  52. /package/dist/components/{param-editor.d.ts → param-editor/param-editor.d.ts} +0 -0
  53. /package/dist/components/{param-editor.types.d.ts → param-editor/param-editor.types.d.ts} +0 -0
  54. /package/dist/components/{param-editor-selection-input.d.ts → param-editor/selection-input.d.ts} +0 -0
  55. /package/dist/components/{param-editor-text-input.d.ts → param-editor/text-input.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"chat-ui.js","sources":["../src/components/chat-ui/components/ai-conversation.tsx","../src/components/chat-ui/components/ai-message.tsx","../src/components/chat-ui/components/approval-prompt.tsx","../src/components/chat-ui/components/auto-scroll.tsx","../src/components/chat-ui/components/chat-input-actions.ts","../src/components/chat-ui/components/timeline-tool-blocks.tsx","../src/components/chat-ui/components/chat-input-question-prompt.tsx","../src/components/chat-ui/components/send-button.tsx","../src/components/chat-ui/components/chat-input.tsx","../src/components/chat-ui/utils/editor-state.ts","../src/components/chat-ui/components/chat-panel-sticky-user-message.ts","../src/components/chat-ui/components/message-action-panel.tsx","../src/components/chat-ui/components/ai-response.tsx","../src/components/chat-ui/utils/tool-name.ts","../src/components/chat-ui/utils/get-icon.ts","../src/components/chat-ui/utils/diff.ts","../src/components/chat-ui/tool-rendering/shared.ts","../src/components/chat-ui/tool-rendering/apply-patch-renderer.ts","../src/components/chat-ui/tool-rendering/edit-renderer.ts","../src/components/chat-ui/tool-rendering/question-renderer.ts","../src/components/chat-ui/tool-rendering/standard-renderers.ts","../src/components/chat-ui/tool-rendering/todowrite-renderer.ts","../src/components/chat-ui/tool-rendering/default-renderers.ts","../src/components/chat-ui/tool-rendering/build-timeline.ts","../src/components/chat-ui/components/timeline.tsx","../src/components/chat-ui/components/tool-invocation-timeline.tsx","../src/components/chat-ui/components/message-parts-renderer.tsx","../src/components/chat-ui/components/message-types.ts","../src/components/chat-ui/components/chat-message-list.tsx","../src/components/chat-ui/components/chat-panel.tsx","../src/components/chat-ui/components/chat-skeleton.tsx","../src/components/chat-ui/components/workspace-hub.tsx"],"sourcesContent":["import type { HTMLChakraProps, IconButtonProps } from \"@chakra-ui/react\";\nimport { AbsoluteCenter, chakra, IconButton } from \"@chakra-ui/react\";\nimport { ArrowDownIcon } from \"lucide-react\";\nimport { StickToBottom as StickToBottomEl, useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ScrollArea } from \"@/components/scroll-area\";\n\nexport type ConversationRootProps = HTMLChakraProps<\"div\", React.ComponentProps<typeof StickToBottomEl>>;\n\nexport const conversationRootDefaultProps = {\n \"aria-roledescription\": \"conversation\",\n initial: \"instant\",\n resize: \"instant\",\n role: \"log\",\n} as const;\n\nexport const ConversationRoot = chakra(\n StickToBottomEl,\n {\n base: {\n position: \"relative\",\n flex: 1,\n overflow: \"hidden\",\n height: \"full\",\n },\n },\n {\n forwardProps: [\"initial\", \"resize\"],\n defaultProps: conversationRootDefaultProps,\n },\n);\n\nexport type ConversationContentProps = Omit<React.ComponentProps<typeof ScrollArea>, \"contentProps\" | \"viewportRef\">;\n\nexport const ConversationContent = (props: ConversationContentProps) => {\n const { children, ...rest } = props;\n const { contentRef, scrollRef } = useStickToBottomContext();\n\n return (\n <ScrollArea\n {...rest}\n height=\"full\"\n width=\"full\"\n showHorizontalScrollbar={false}\n viewportRef={scrollRef as React.Ref<HTMLDivElement>}\n contentRef={contentRef as React.Ref<HTMLDivElement>}\n verticalScrollbarProps={{ zIndex: 2 }}\n contentProps={{\n py: \"sm\",\n \"aria-live\": \"polite\",\n role: \"list\",\n }}\n >\n {children}\n </ScrollArea>\n );\n};\n\nexport type ConversationScrollButtonProps = IconButtonProps;\n\nexport const conversationScrollButtonContainerDefaultProps = {\n axis: \"horizontal\",\n bottom: \"md\",\n zIndex: 2,\n} as const;\n\nexport const ConversationScrollButton = (props: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n return (\n !isAtBottom && (\n <AbsoluteCenter {...conversationScrollButtonContainerDefaultProps}>\n <IconButton rounded=\"full\" onClick={() => scrollToBottom()} variant=\"outline\" size=\"xs\" {...props}>\n <ArrowDownIcon size={16} />\n </IconButton>\n </AbsoluteCenter>\n )\n );\n};\n\nexport const ChatPrimitives = {\n Root: ConversationRoot,\n Viewport: ConversationContent,\n ScrollToBottom: ConversationScrollButton,\n} as const;\n","import type { HTMLChakraProps, RecipeVariantProps } from \"@chakra-ui/react\";\nimport { createSlotRecipeContext, defineSlotRecipe } from \"@chakra-ui/react\";\n\nconst recipe = defineSlotRecipe({\n className: \"ai-message\",\n slots: [\"root\", \"content\"],\n base: {\n root: {\n display: \"flex\",\n width: \"full\",\n alignItems: \"end\",\n justifyContent: \"end\",\n gap: \"sm\",\n animationName: \"message-fade-in\",\n animationDuration: \"200ms\",\n animationTimingFunction: \"ease-out\",\n \"&:has(+ [data-scope='ai-message'][data-part='root'])\": {\n mb: 0,\n },\n },\n content: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"sm\",\n textStyle: \"sm\",\n overflow: \"hidden\",\n borderRadius: \"0\",\n },\n },\n variants: {\n from: {\n user: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n },\n content: {\n borderTopWidth: \"1px\",\n borderRightWidth: \"1px\",\n borderBottomWidth: \"1px\",\n borderLeftWidth: \"1px\",\n borderColor: \"border.muted\",\n bg: \"bg.subtle\",\n px: \"xs\",\n py: \"xs\",\n width: \"full\",\n borderRadius: \"0\",\n },\n },\n assistant: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n justifyContent: \"start\",\n },\n content: {\n width: \"full\",\n px: \"xs\",\n },\n },\n developer: {\n root: {\n width: \"full\",\n flexDirection: \"row-reverse\",\n },\n content: {\n width: \"full\",\n },\n },\n },\n size: {\n sm: {\n root: { gap: \"xs\" },\n content: { textStyle: \"xs\" },\n },\n md: {},\n lg: {\n root: { gap: \"md\" },\n content: { textStyle: \"md\" },\n },\n },\n shape: {\n rounded: {\n content: { rounded: \"0\" },\n },\n pill: {\n content: { rounded: \"0\" },\n },\n square: {\n content: { rounded: \"0\" },\n },\n },\n },\n defaultVariants: {\n from: \"user\",\n size: \"md\",\n shape: \"rounded\",\n },\n});\n\nconst { withProvider, withContext } = createSlotRecipeContext({ recipe });\n\ntype VariantProps = RecipeVariantProps<typeof recipe>;\n\nexport interface MessageRootProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageRoot = withProvider<HTMLDivElement, MessageRootProps>(\"div\", \"root\");\n\nexport interface MessageContentProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageContent = withContext<HTMLDivElement, MessageContentProps>(\"div\", \"content\");\n\nexport const ChatMessage = {\n Root: MessageRoot,\n Content: MessageContent,\n} as const;\n","import { Box, Button, Code, Flex, HStack, Text } from \"@chakra-ui/react\";\nimport { ShieldCheck, ShieldX } from \"lucide-react\";\nimport { ScrollArea } from \"@/components/scroll-area\";\n\ninterface ApprovalPromptProps {\n toolName: string;\n toolInput?: unknown;\n onApprove: () => void;\n onDeny: () => void;\n}\n\nconst formatToolInput = (input: unknown) => {\n if (input == null) return null;\n\n const text = typeof input === \"string\" ? input : JSON.stringify(input, null, 2);\n if (text.length === 0) return null;\n\n const truncated = text.length > 200 ? `${text.slice(0, 200)}...` : text;\n return truncated;\n};\n\nexport const ApprovalPrompt = (props: ApprovalPromptProps) => {\n const { toolName, toolInput, onApprove, onDeny } = props;\n const formattedInput = formatToolInput(toolInput);\n\n return (\n <Box px=\"sm\" py=\"xs\" mx=\"sm\" borderWidth=\"1px\" borderColor=\"border.warning\" borderRadius=\"lg\" bg=\"bg.warning\">\n <Flex direction=\"column\" gap=\"xs\">\n <Text textStyle=\"label/S/medium\" color=\"fg\">\n Allow <Code size=\"sm\">{toolName}</Code>?\n </Text>\n\n {formattedInput ? (\n <ScrollArea maxH=\"6rem\">\n <Code size=\"sm\" whiteSpace=\"pre-wrap\" display=\"block\" width=\"100%\">\n {formattedInput}\n </Code>\n </ScrollArea>\n ) : null}\n\n <HStack gap=\"xs\" justifyContent=\"flex-end\">\n <Button size=\"xs\" variant=\"outline\" onClick={onDeny}>\n <ShieldX size={14} />\n Deny\n </Button>\n <Button size=\"xs\" colorPalette=\"green\" onClick={onApprove}>\n <ShieldCheck size={14} />\n Allow\n </Button>\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport interface AutoScrollProps {\n userMessageCount: number;\n}\n\ninterface ShouldAutoScrollArgs {\n previousUserMessageCount: number;\n userMessageCount: number;\n}\n\nexport const shouldAutoScroll = (args: ShouldAutoScrollArgs) => {\n const { previousUserMessageCount, userMessageCount } = args;\n\n if (previousUserMessageCount === 0) {\n return false;\n }\n\n return userMessageCount > previousUserMessageCount;\n};\n\nexport function AutoScroll(props: AutoScrollProps) {\n const { userMessageCount } = props;\n const { scrollToBottom } = useStickToBottomContext();\n const previousCountRef = useRef(userMessageCount);\n\n useEffect(() => {\n if (\n shouldAutoScroll({\n previousUserMessageCount: previousCountRef.current,\n userMessageCount,\n })\n ) {\n scrollToBottom();\n }\n\n previousCountRef.current = userMessageCount;\n }, [userMessageCount, scrollToBottom]);\n\n return null;\n}\n","interface ChatInputActionState {\n canInterrupt: boolean;\n isDisabled: boolean;\n streaming: boolean;\n text: string;\n}\n\nexport type ChatInputAction = \"interrupt\" | \"none\" | \"submit\";\n\nconst hasMessageText = (text: string) => text.trim().length > 0;\n\nexport const resolveChatInputKeyboardAction = (state: ChatInputActionState): ChatInputAction => {\n const { isDisabled, streaming, text } = state;\n if (isDisabled || streaming || !hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n\nexport const resolveChatInputButtonAction = (state: ChatInputActionState): ChatInputAction => {\n const { canInterrupt, isDisabled, streaming, text } = state;\n if (isDisabled) return \"none\";\n if (streaming) return canInterrupt ? \"interrupt\" : \"none\";\n if (!hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n","import { Box, Stack, Text, Textarea } from \"@chakra-ui/react\";\nimport type { FormEvent } from \"react\";\nimport { Checkbox } from \"@/components/checkbox\";\nimport { Radio, RadioGroup } from \"@/components/radio\";\nimport type { QuestionFormBlockQuestion, TodoListBlockItem } from \"./timeline\";\n\nconst preventSubmit = (event: FormEvent) => {\n event.preventDefault();\n};\n\ninterface QuestionFormBlockViewProps {\n questions: QuestionFormBlockQuestion[];\n editable?: boolean;\n selectedOptionsByQuestion?: Record<string, string[]>;\n customAnswersByQuestion?: Record<string, string>;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange?: (question: QuestionFormBlockQuestion, questionIndex: number, answer: string) => void;\n}\n\nconst QuestionOptionContent = (props: { option: QuestionFormBlockQuestion[\"options\"][number] }) => {\n const { option } = props;\n\n return (\n <Stack gap=\"0\" minWidth=\"0\">\n <Text textStyle=\"label/S/regular\" color=\"fg\">\n {option.label}\n </Text>\n {option.description ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {option.description}\n </Text>\n ) : null}\n </Stack>\n );\n};\n\nconst QuestionCheckboxOptionRow = (props: {\n option: QuestionFormBlockQuestion[\"options\"][number];\n name: string;\n checked: boolean;\n editable: boolean;\n onToggle: () => void;\n}) => {\n const { option, name, checked, editable, onToggle } = props;\n\n return (\n <Checkbox\n name={name}\n checked={checked}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n onCheckedChange={editable ? onToggle : undefined}\n >\n <QuestionOptionContent option={option} />\n </Checkbox>\n );\n};\n\nconst QuestionRadioOptions = (props: {\n question: QuestionFormBlockQuestion;\n questionIndex: number;\n name: string;\n selectedOption?: string;\n editable: boolean;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n}) => {\n const { question, questionIndex, name, selectedOption, editable, onToggleOption } = props;\n\n return (\n <RadioGroup\n name={name}\n value={selectedOption ?? null}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"xs\"\n onValueChange={\n editable\n ? (details) => {\n if (details.value) onToggleOption?.(question, questionIndex, details.value);\n }\n : undefined\n }\n >\n {question.options.map((option) => (\n <Radio\n key={option.label}\n value={option.label}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n >\n <QuestionOptionContent option={option} />\n </Radio>\n ))}\n </RadioGroup>\n );\n};\n\nexport const TodoListBlockView = (props: { items: TodoListBlockItem[] }) => {\n const { items } = props;\n\n return (\n <Stack as=\"ul\" gap=\"0\" listStyleType=\"none\" margin=\"0\" padding=\"0\">\n {items.map((item, index) => (\n <Box as=\"li\" key={`${item.label}-${index}`}>\n <Checkbox checked={item.checked} readOnly aria-readonly=\"true\" inputProps={{ tabIndex: -1 }} size=\"xs\">\n <Text textStyle=\"label/XS/regular\" color=\"fg\">\n {item.label}\n </Text>\n </Checkbox>\n </Box>\n ))}\n </Stack>\n );\n};\n\nexport const QuestionFormBlockView = (props: QuestionFormBlockViewProps) => {\n const {\n questions,\n editable = false,\n selectedOptionsByQuestion = {},\n customAnswersByQuestion = {},\n onToggleOption,\n onCustomAnswerChange,\n } = props;\n\n return (\n <Stack as=\"form\" gap=\"sm\" onSubmit={preventSubmit} aria-label=\"Question form\">\n {questions.map((question, questionIndex) => {\n const name = question.id ?? `question-${questionIndex}`;\n const inputType = question.multiple ? \"checkbox\" : \"radio\";\n const selectedOptions = selectedOptionsByQuestion[name] ?? [];\n\n return (\n <Stack\n as=\"fieldset\"\n key={name}\n gap=\"xs\"\n borderWidth=\"1px\"\n borderColor=\"border.muted\"\n borderRadius=\"sm\"\n padding=\"sm\"\n minWidth=\"0\"\n >\n <Text as=\"legend\" textStyle=\"label/S/medium\" color=\"fg\" paddingX=\"2xs\">\n {question.question}\n </Text>\n {inputType === \"radio\" ? (\n <QuestionRadioOptions\n question={question}\n questionIndex={questionIndex}\n name={name}\n selectedOption={selectedOptions[0]}\n editable={editable}\n onToggleOption={onToggleOption}\n />\n ) : (\n question.options.map((option) => (\n <QuestionCheckboxOptionRow\n key={option.label}\n option={option}\n name={name}\n checked={selectedOptions.includes(option.label)}\n editable={editable}\n onToggle={() => onToggleOption?.(question, questionIndex, option.label)}\n />\n ))\n )}\n {question.allowCustomAnswer ? (\n <Textarea\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n value={customAnswersByQuestion[name] ?? \"\"}\n placeholder={editable ? \"Answer...\" : \"Custom answer\"}\n aria-label={question.question}\n rows={2}\n borderWidth=\"1px\"\n borderColor=\"border.muted\"\n borderRadius=\"sm\"\n padding=\"xs\"\n resize={editable ? \"vertical\" : \"none\"}\n color=\"fg\"\n onChange={(event) => onCustomAnswerChange?.(question, questionIndex, event.currentTarget.value)}\n />\n ) : null}\n </Stack>\n );\n })}\n </Stack>\n );\n};\n","import { Button, HStack, Stack } from \"@chakra-ui/react\";\nimport { Check } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Tooltip } from \"@/components/tooltip\";\nimport { QuestionFormBlockView } from \"./timeline-tool-blocks\";\n\nexport interface ChatInputQuestionOption {\n label: string;\n description?: string;\n}\n\nexport interface ChatInputQuestion {\n id?: string;\n question: string;\n options: ChatInputQuestionOption[];\n multiple?: boolean;\n required?: boolean;\n allowCustomAnswer?: boolean;\n}\n\nexport interface ChatInputQuestionPrompt {\n questions: ChatInputQuestion[];\n}\n\nexport interface ChatInputQuestionResponse {\n answers: string[][];\n}\n\nexport type ChatInputQuestionCustomAnswers = Record<string, string>;\n\ninterface QuestionPromptControlsProps {\n questionPrompt: ChatInputQuestionPrompt;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onToggleOption: (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange: (question: ChatInputQuestion, questionIndex: number, answer: string) => void;\n}\n\ninterface QuestionPromptStepperProps extends QuestionPromptControlsProps {\n questions: ReturnType<typeof toQuestionFormQuestions>;\n}\n\nexport const getQuestionSelectionKey = (question: ChatInputQuestion, index: number) =>\n question.id ?? `question-${index}`;\n\nexport const getQuestionPromptSignature = (questionPrompt: ChatInputQuestionPrompt | undefined) => {\n if (!questionPrompt) return \"\";\n\n return JSON.stringify(\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n options: question.options.map((option) => ({\n label: option.label,\n description: option.description ?? \"\",\n })),\n })),\n );\n};\n\nconst getQuestionAnswerLines = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const lines: string[] = [];\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n const answers = customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n if (answers.length === 0) continue;\n\n lines.push(`${question.question}: ${answers.join(\", \")}`);\n }\n\n return lines;\n};\n\nconst isCustomAnswersByQuestion = (\n value: ChatInputQuestionCustomAnswers | string,\n): value is ChatInputQuestionCustomAnswers => typeof value !== \"string\";\n\nconst toCustomAnswersByQuestion = (\n questionPrompt: ChatInputQuestionPrompt,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (isCustomAnswersByQuestion(answerInput)) return answerInput;\n\n const trimmed = answerInput.trim();\n if (trimmed.length === 0) return {};\n\n const answers: ChatInputQuestionCustomAnswers = {};\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.allowCustomAnswer) continue;\n answers[getQuestionSelectionKey(question, index)] = trimmed;\n }\n\n return answers;\n};\n\nexport const buildQuestionResponse = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n const lines = getQuestionAnswerLines(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion);\n const legacyText = typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n const hasCustomQuestions = questionPrompt.questions.some((question) => question.allowCustomAnswer);\n\n if (legacyText.length > 0 && !hasCustomQuestions) {\n lines.push(`Additional response: ${legacyText}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const buildQuestionAnswerValues = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n return questionPrompt.questions.map((question, index) => {\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n return customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n });\n};\n\nexport const hasMissingRequiredQuestionAnswer = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return false;\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.required) continue;\n\n const key = getQuestionSelectionKey(question, index);\n const hasSelectedOption = (selectedOptionsByQuestion[key] ?? []).length > 0;\n if (hasSelectedOption) continue;\n if (question.allowCustomAnswer && customAnswersByQuestion[key]?.trim()) continue;\n\n return true;\n }\n\n return false;\n};\n\nconst toQuestionFormQuestions = (questionPrompt: ChatInputQuestionPrompt) =>\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n options: question.options,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n }));\n\ntype QuestionFormQuestion = ReturnType<typeof toQuestionFormQuestions>[number];\n\ninterface QuestionStepTabProps {\n question: QuestionFormQuestion;\n sourceQuestion: ChatInputQuestion;\n questionIndex: number;\n isActive: boolean;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onSelectStep: (questionIndex: number) => void;\n}\n\nconst hasQuestionAnswer = (\n question: ChatInputQuestion,\n questionIndex: number,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n return (selectedOptionsByQuestion[key] ?? []).length > 0 || Boolean(customAnswersByQuestion[key]?.trim());\n};\n\nconst QuestionStepTab = (props: QuestionStepTabProps) => {\n const {\n question,\n sourceQuestion,\n questionIndex,\n isActive,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n onSelectStep,\n } = props;\n const isAnswered = hasQuestionAnswer(\n sourceQuestion,\n questionIndex,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const stepStateLabel = isAnswered ? \"answered\" : \"not answered\";\n const tabVariant = isActive ? \"outline\" : \"ghost\";\n\n return (\n <Tooltip content={question.question} showArrow>\n <Button\n id={`question-step-tab-${question.id}`}\n role=\"tab\"\n aria-label={`${question.question} (${stepStateLabel})`}\n aria-selected={isActive}\n aria-controls={`question-step-panel-${question.id}`}\n size=\"xs\"\n variant={tabVariant}\n minW=\"8\"\n onClick={() => onSelectStep(questionIndex)}\n >\n {isAnswered ? <Check aria-hidden=\"true\" /> : questionIndex + 1}\n </Button>\n </Tooltip>\n );\n};\n\nconst QuestionPromptStepper = (props: QuestionPromptStepperProps) => {\n const { questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion, onToggleOption, onCustomAnswerChange } =\n props;\n const { questions } = props;\n const [activeQuestionIndex, setActiveQuestionIndex] = useState(0);\n const renderQuestionIndex = Math.min(activeQuestionIndex, questions.length - 1);\n const activeQuestion = questions[renderQuestionIndex];\n const hasMultipleQuestions = questions.length > 1;\n\n return (\n <Stack gap=\"xs\" pb=\"sm\">\n {hasMultipleQuestions ? (\n <HStack role=\"tablist\" aria-label=\"Question steps\" gap=\"1\" minWidth=\"0\">\n {questions.map((question, questionIndex) => (\n <QuestionStepTab\n key={question.id}\n question={question}\n sourceQuestion={questionPrompt.questions[questionIndex]}\n questionIndex={questionIndex}\n isActive={questionIndex === renderQuestionIndex}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onSelectStep={setActiveQuestionIndex}\n />\n ))}\n </HStack>\n ) : null}\n <Stack\n id={`question-step-panel-${activeQuestion.id}`}\n role={hasMultipleQuestions ? \"tabpanel\" : undefined}\n aria-labelledby={hasMultipleQuestions ? `question-step-tab-${activeQuestion.id}` : undefined}\n gap=\"0\"\n >\n <QuestionFormBlockView\n questions={[activeQuestion]}\n editable\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={(_question, _questionIndex, optionLabel) => {\n onToggleOption(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, optionLabel);\n }}\n onCustomAnswerChange={(_question, _questionIndex, answer) => {\n onCustomAnswerChange(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, answer);\n }}\n />\n </Stack>\n </Stack>\n );\n};\n\nexport const QuestionPromptControls = (props: QuestionPromptControlsProps) => {\n const { questionPrompt } = props;\n const questions = toQuestionFormQuestions(questionPrompt);\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n return <QuestionPromptStepper key={questionPromptSignature} {...props} questions={questions} />;\n};\n","import { IconButton, type IconButtonProps, Kbd, Portal, Tooltip } from \"@chakra-ui/react\";\nimport { ArrowUp, Square } from \"lucide-react\";\n\nexport interface SendButtonProps extends IconButtonProps {\n shortcut?: string;\n title?: string;\n canInterrupt: boolean;\n}\n\nexport const SendButton = (props: SendButtonProps) => {\n const { title, shortcut, canInterrupt, ...rest } = props;\n const ariaLabel = rest[\"aria-label\"] ?? title;\n\n const icon = canInterrupt ? (\n <Square size={16} strokeWidth={2} fill=\"currentColor\" />\n ) : (\n <ArrowUp size={16} strokeWidth={2} />\n );\n\n const button = (\n <IconButton\n data-testid=\"send-message-button\"\n size=\"sm\"\n variant=\"solid\"\n borderRadius=\"full\"\n colorPalette=\"primary\"\n aria-label={ariaLabel}\n title={title}\n {...rest}\n >\n {icon}\n </IconButton>\n );\n\n if (title) {\n const tooltipContent = shortcut ? (\n <>\n {title} <Kbd fontSize=\"xs\">{shortcut}</Kbd>\n </>\n ) : (\n title\n );\n\n return (\n <Tooltip.Root closeDelay={50} openDelay={100}>\n <Tooltip.Trigger asChild>{button}</Tooltip.Trigger>\n <Portal>\n <Tooltip.Positioner>\n <Tooltip.Content>{tooltipContent}</Tooltip.Content>\n </Tooltip.Positioner>\n </Portal>\n </Tooltip.Root>\n );\n }\n\n return button;\n};\n","import { Box, Flex, HStack, Spacer, Text } from \"@chakra-ui/react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { ScrollArea } from \"@/components/scroll-area\";\nimport { getTextFromSerializedEditorState, PromptEditor } from \"../../rich-text\";\nimport {\n type ChatInputAction,\n resolveChatInputButtonAction,\n resolveChatInputKeyboardAction,\n} from \"./chat-input-actions\";\nimport {\n buildQuestionAnswerValues,\n buildQuestionResponse,\n type ChatInputQuestion,\n type ChatInputQuestionCustomAnswers,\n type ChatInputQuestionPrompt,\n type ChatInputQuestionResponse,\n getQuestionPromptSignature,\n getQuestionSelectionKey,\n hasMissingRequiredQuestionAnswer,\n QuestionPromptControls,\n} from \"./chat-input-question-prompt\";\nimport { SendButton } from \"./send-button\";\n\ninterface ChatInputProps {\n defaultState: string;\n placeholder?: string;\n onSubmit?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => void;\n onInterrupt?: () => void;\n streaming?: boolean;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n isDisabled?: boolean;\n onChange?: (text: string) => void;\n attachmentList?: ReactNode;\n actions?: ReactNode;\n attachedToTop?: boolean;\n questionPrompt?: ChatInputQuestionPrompt;\n autoFocus?: boolean;\n}\n\nexport const ChatInput = (props: ChatInputProps) => {\n const {\n defaultState,\n onSubmit = () => {},\n onInterrupt,\n streaming = false,\n attachedResources = [],\n onClearAttachments,\n isDisabled = false,\n onChange,\n placeholder,\n attachmentList,\n actions,\n attachedToTop = false,\n questionPrompt,\n autoFocus = false,\n } = props;\n\n const [isSelected, setIsSelected] = useState(false);\n const [editorState, setEditorState] = useState(defaultState);\n const [editorKey, setEditorKey] = useState(0);\n const [text, setText] = useState(() => getTextFromSerializedEditorState(defaultState));\n const [selectedOptionsByQuestion, setSelectedOptionsByQuestion] = useState<Record<string, string[]>>({});\n const [customAnswersByQuestion, setCustomAnswersByQuestion] = useState<ChatInputQuestionCustomAnswers>({});\n const containerRef = useRef<HTMLDivElement | null>(null);\n const onChangeRef = useRef(onChange);\n const previousQuestionPromptSignatureRef = useRef(getQuestionPromptSignature(questionPrompt));\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n const resetText = getTextFromSerializedEditorState(defaultState);\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n }, [defaultState]);\n\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n useEffect(() => {\n if (previousQuestionPromptSignatureRef.current === questionPromptSignature) return;\n previousQuestionPromptSignatureRef.current = questionPromptSignature;\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n }, [questionPromptSignature]);\n\n const focusEditor = () => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n };\n\n useEffect(() => {\n if (!autoFocus) return;\n const handle = requestAnimationFrame(() => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n setIsSelected(true);\n });\n return () => cancelAnimationFrame(handle);\n }, [autoFocus]);\n\n const handleContainerClick = () => {\n setIsSelected(true);\n focusEditor();\n };\n\n const resetEditor = (shouldFocus = false) => {\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n const resetText = getTextFromSerializedEditorState(defaultState);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n\n if (shouldFocus) {\n requestAnimationFrame(() => {\n focusEditor();\n });\n }\n };\n\n const canInterrupt = streaming && Boolean(onInterrupt);\n const responseText = questionPrompt\n ? buildQuestionResponse(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion)\n : text.trim();\n const hasMissingRequiredSelection = hasMissingRequiredQuestionAnswer(\n questionPrompt,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const actionState = {\n canInterrupt,\n isDisabled: isDisabled || hasMissingRequiredSelection,\n streaming,\n text: responseText,\n };\n const buttonAction = resolveChatInputButtonAction(actionState);\n\n const submitMessage = () => {\n if (!responseText) return;\n\n const questionResponse = questionPrompt\n ? {\n answers: buildQuestionAnswerValues(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion),\n }\n : undefined;\n\n onSubmit(responseText, attachedResources, questionResponse);\n resetEditor(true);\n onClearAttachments?.();\n };\n\n const runAction = (action: ChatInputAction) => {\n if (action === \"interrupt\") {\n onInterrupt?.();\n return;\n }\n\n if (action === \"submit\") {\n submitMessage();\n }\n };\n\n const handleKeyboardSubmit = () => {\n runAction(resolveChatInputKeyboardAction(actionState));\n };\n\n const handleButtonClick = () => {\n runAction(buttonAction);\n };\n\n const toggleQuestionOption = (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n\n setSelectedOptionsByQuestion((current) => {\n const selected = current[key] ?? [];\n const alreadySelected = selected.includes(optionLabel);\n\n if (question.multiple) {\n return {\n ...current,\n [key]: alreadySelected ? selected.filter((label) => label !== optionLabel) : [...selected, optionLabel],\n };\n }\n\n return {\n ...current,\n [key]: alreadySelected ? [] : [optionLabel],\n };\n });\n };\n\n const updateQuestionCustomAnswer = (question: ChatInputQuestion, questionIndex: number, answer: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n setCustomAnswersByQuestion((current) => ({\n ...current,\n [key]: answer,\n }));\n };\n\n const placeholderNode = placeholder ? (\n <Text textStyle=\"label/M/regular\" color=\"fg.subtle\" pointerEvents=\"none\" position=\"absolute\" top=\"0\">\n {placeholder}\n </Text>\n ) : undefined;\n\n return (\n <Box\n ref={containerRef}\n position=\"relative\"\n width=\"100%\"\n paddingX=\"xs\"\n paddingY=\"md\"\n mt={attachedToTop ? \"-1px\" : undefined}\n bg=\"bg\"\n borderRadius=\"md\"\n borderTopRadius={attachedToTop ? \"0\" : undefined}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isSelected ? \"blue.border\" : \"border.muted\"}\n boxShadow={isSelected ? \"mid\" : \"low\"}\n zIndex={isSelected ? 1 : 0}\n transition=\"box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\"\n _hover={{\n borderColor: isSelected ? \"blue.border\" : \"border\",\n boxShadow: \"mid\",\n zIndex: 1,\n }}\n _focusWithin={{\n borderColor: \"blue.border\",\n boxShadow: \"mid\",\n zIndex: 1,\n }}\n onClick={handleContainerClick}\n onBlur={() => setIsSelected(false)}\n >\n <Flex direction=\"column\" color=\"fg\">\n {attachmentList}\n {questionPrompt ? (\n <QuestionPromptControls\n questionPrompt={questionPrompt}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={toggleQuestionOption}\n onCustomAnswerChange={updateQuestionCustomAnswer}\n />\n ) : (\n <ScrollArea maxH=\"10rem\" showHorizontalScrollbar={false} contentProps={{ pr: \"2xs\" }}>\n <PromptEditor\n key={editorKey}\n defaultState={editorState}\n isEditable={!isDisabled}\n placeholder={placeholderNode}\n onChange={(t) => {\n setText(t);\n onChange?.(t);\n }}\n onSubmit={handleKeyboardSubmit}\n />\n </ScrollArea>\n )}\n <HStack gap=\"1\" mt=\"md\">\n {actions}\n <Spacer />\n <SendButton\n canInterrupt={canInterrupt}\n title={canInterrupt ? \"Stop Response\" : \"Message Sending\"}\n shortcut={streaming ? undefined : \"Enter\"}\n onClick={handleButtonClick}\n disabled={buttonAction === \"none\"}\n />\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import { generateEditorStateFromString } from \"../../rich-text\";\n\nexport const createSerializedPromptState = (input = \"\") => {\n return JSON.stringify(generateEditorStateFromString(input));\n};\n","import type { SessionMessage } from \"./message-types\";\n\nexport const STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD = 360;\nexport const STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD = 4;\nexport const STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT = \"min(10vh, 4rem)\";\nexport const STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT = \"min(70dvh, calc(100dvh - 12rem), 22rem)\";\n\nconst SCROLL_BOUNDARY_EPSILON = 1;\n\ninterface StickyUserMessageScrollElement {\n clientHeight: number;\n scrollHeight: number;\n scrollTop: number;\n}\n\nconst getMessageTextMetrics = (message: SessionMessage) => {\n return message.parts.reduce(\n (metrics, part) => {\n if (part.type !== \"text\") return metrics;\n\n return {\n lineCount: metrics.lineCount + part.text.split(/\\r\\n|\\r|\\n/).length,\n textLength: metrics.textLength + part.text.length,\n };\n },\n { lineCount: 0, textLength: 0 },\n );\n};\n\nexport const isStickyUserMessageCollapsible = (message: SessionMessage) => {\n if (message.role !== \"user\") return false;\n\n const { lineCount, textLength } = getMessageTextMetrics(message);\n\n return (\n textLength > STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD || lineCount > STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD\n );\n};\n\nexport const shouldStopStickyUserMessageWheel = (element: StickyUserMessageScrollElement, deltaY: number) => {\n const maxScrollTop = Math.max(0, element.scrollHeight - element.clientHeight);\n\n if (deltaY === 0 || maxScrollTop <= SCROLL_BOUNDARY_EPSILON) return false;\n if (deltaY < 0) return element.scrollTop > SCROLL_BOUNDARY_EPSILON;\n\n return element.scrollTop < maxScrollTop - SCROLL_BOUNDARY_EPSILON;\n};\n","import { Box, HStack, IconButton, Text } from \"@chakra-ui/react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../../tooltip\";\nimport type { SessionMessage, SessionMessagePart } from \"./message-types\";\n\ninterface MessageActionPanelProps {\n message: SessionMessage;\n alwaysVisible?: boolean;\n copyAlwaysVisible?: boolean;\n}\n\nconst isCopyablePart = (part: SessionMessagePart): part is Extract<SessionMessagePart, { type: \"text\" }> => {\n return part.type === \"text\";\n};\n\nexport const getMessageCopyText = (message: SessionMessage) => {\n return (message.parts ?? [])\n .filter(isCopyablePart)\n .map((part) => part.text.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n};\n\nexport const getMessageTimestampLabel = (message: SessionMessage, locale?: string, timeZone?: string) => {\n if (!message.createdAt) return \"\";\n\n return new Intl.DateTimeFormat(locale, {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n }).format(new Date(message.createdAt));\n};\n\nexport const MessageActionPanel = (props: MessageActionPanelProps) => {\n const { message, alwaysVisible = false, copyAlwaysVisible = alwaysVisible } = props;\n const [isCopied, setIsCopied] = useState(false);\n const copyResetTimeoutRef = useRef<number | null>(null);\n const copyText = getMessageCopyText(message);\n const timestampLabel = getMessageTimestampLabel(message);\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n const copyMessage = async () => {\n if (!copyText) return;\n\n try {\n await navigator.clipboard.writeText(copyText);\n setIsCopied(true);\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n copyResetTimeoutRef.current = window.setTimeout(() => setIsCopied(false), 1200);\n } catch {\n setIsCopied(false);\n }\n };\n\n if (!copyText && !timestampLabel) return null;\n\n return (\n <HStack\n data-chat-message-action-panel=\"true\"\n gap=\"2xs\"\n minH=\"6\"\n opacity={alwaysVisible ? \"1\" : \"0\"}\n pointerEvents={alwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n {timestampLabel ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {timestampLabel}\n </Text>\n ) : null}\n {copyText ? (\n <Box\n opacity={copyAlwaysVisible ? \"1\" : \"0\"}\n pointerEvents={copyAlwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n <Tooltip content={isCopied ? \"Copied\" : \"Copy message\"}>\n <IconButton\n aria-label={isCopied ? \"Copied\" : \"Copy message\"}\n variant=\"ghost\"\n size=\"2xs\"\n onClick={copyMessage}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n </IconButton>\n </Tooltip>\n </Box>\n ) : null}\n </HStack>\n );\n};\n\nconst messageActionPanelHoverStyles = {\n \"[data-chat-message-with-actions]:hover &, [data-chat-message-with-actions]:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \".ai-message__root:hover &, .ai-message__root:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \"[data-scope='ai-message'][data-part='root']:hover &, [data-scope='ai-message'][data-part='root']:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n};\n","import type { BoxProps } from \"@chakra-ui/react\";\nimport { Box } from \"@chakra-ui/react\";\nimport { RichMessage } from \"@/components/rich-text\";\n\nexport interface ChatRichContentProps extends Omit<BoxProps, \"children\"> {\n children: string;\n}\n\nexport const ChatRichContent = (props: ChatRichContentProps) => {\n const { children, ...rest } = props;\n\n return (\n <Box {...rest}>\n <RichMessage defaultState={children} fullWidth />\n </Box>\n );\n};\n\nexport const Response = ChatRichContent;\n","export const normalizeToolName = (value: string) => {\n return value\n .replace(/^tool-/i, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .toLowerCase();\n};\n\nexport const getToolNameLookupKeys = (value: string) => {\n const normalized = normalizeToolName(value);\n const compact = normalized.replace(/_/g, \"\");\n return [...new Set([value, normalized, compact])];\n};\n","import type { LucideIcon } from \"lucide-react\";\nimport {\n AlertTriangle,\n CircleQuestionMark,\n DotIcon,\n File,\n FileDiff,\n FileDown,\n FilePen,\n FileText,\n FileUp,\n Globe,\n ListTodo,\n ListTree,\n Move,\n Search,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport { normalizeToolName } from \"./tool-name\";\n\nconst toolIconMap = {\n shell: Terminal,\n ls: ListTree,\n read_file: FileText,\n write_file: FilePen,\n delete_file: Trash2,\n patch: FileDiff,\n upload_files: FileUp,\n download_file: FileDown,\n move_file: Move,\n} as const satisfies Record<string, LucideIcon>;\n\nconst iconMap = {\n dot: DotIcon,\n danger: AlertTriangle,\n search: Search,\n browser: Globe,\n file: File,\n question: CircleQuestionMark,\n todo: ListTodo,\n terminal: Terminal,\n ...toolIconMap,\n} as const satisfies Record<string, LucideIcon>;\n\nexport type IconName = keyof typeof iconMap;\nexport type ToolIconName = keyof typeof toolIconMap;\n\nconst DEFAULT_TOOL_ICON: IconName = \"dot\";\n\nconst isToolIconName = (value: string): value is ToolIconName => Object.hasOwn(toolIconMap, value);\n\nexport const getIconComponent = (name: IconName): LucideIcon => {\n return iconMap[name];\n};\n\nexport const toolTypeToIconName = (type?: string): IconName => {\n if (!type) return DEFAULT_TOOL_ICON;\n\n const normalized = normalizeToolName(type);\n if (isToolIconName(normalized)) return normalized;\n\n const compact = normalized.replace(/_/g, \"\");\n\n switch (normalized) {\n case \"read\":\n return \"file\";\n case \"bash\":\n return \"terminal\";\n case \"edit\":\n return \"write_file\";\n case \"apply_patch\":\n return \"patch\";\n case \"grep\":\n return \"search\";\n case \"glob\":\n return \"file\";\n case \"todowrite\":\n return \"todo\";\n case \"search\":\n return \"search\";\n case \"browser\":\n return \"browser\";\n case \"question\":\n return \"question\";\n case \"fs\":\n case \"file\":\n return \"file\";\n default:\n return compact === \"todowrite\" || compact === \"todo\" ? \"todo\" : DEFAULT_TOOL_ICON;\n }\n};\n\nexport { getFileTypeIcon } from \"../../../utils/get-file-type-icon\";\n","import type { TitleSegment } from \"../components/timeline\";\n\nexport type FileChange = { filePath: string; additions: number; deletions: number };\n\nexport function basenameSafe(path: string) {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(idx + 1) : path;\n}\n\nfunction normalizeHeaderPath(input?: string | null) {\n if (!input) return null;\n\n const token = input.split(\"\\t\")[0].trim();\n if (token === \"/dev/null\") return null;\n\n let normalized = token;\n if (normalized.startsWith(\"a/\") || normalized.startsWith(\"b/\")) {\n normalized = normalized.slice(2);\n }\n\n return normalized.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nconst isMinusHeader = (line: string) => line.startsWith(\"--- \");\nconst isPlusHeader = (line: string) => line.startsWith(\"+++ \");\nconst isHunkHeader = (line: string) => line.startsWith(\"@@\");\nconst isAddedLine = (line: string) => line.startsWith(\"+\") && !(isPlusHeader(line) || line === \"+++\");\nconst isDeletedLine = (line: string) => line.startsWith(\"-\") && !(isMinusHeader(line) || line === \"---\");\n\nconst ensureFileChange = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n if (!changes.has(filePath)) {\n changes.set(filePath, { additions: 0, deletions: 0 });\n }\n};\n\nconst incrementAdditions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.additions += 1;\n};\n\nconst incrementDeletions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.deletions += 1;\n};\n\ntype UnifiedDiffState = {\n currentPath: string | null;\n lastMinusHeader: string | null;\n inHunk: boolean;\n};\n\nconst processUnifiedDiffLine = (\n line: string,\n state: UnifiedDiffState,\n changes: Map<string, { additions: number; deletions: number }>,\n) => {\n if (isMinusHeader(line)) {\n return { ...state, lastMinusHeader: normalizeHeaderPath(line.slice(4)), inHunk: false };\n }\n\n if (isPlusHeader(line)) {\n const plusPath = normalizeHeaderPath(line.slice(4));\n const currentPath = plusPath ?? state.lastMinusHeader;\n if (currentPath) ensureFileChange(changes, currentPath);\n return { ...state, currentPath, inHunk: false };\n }\n\n if (!state.currentPath) return state;\n\n if (isHunkHeader(line)) {\n return { ...state, inHunk: true };\n }\n\n if (!state.inHunk) return state;\n\n if (isAddedLine(line)) {\n incrementAdditions(changes, state.currentPath);\n return state;\n }\n\n if (isDeletedLine(line)) {\n incrementDeletions(changes, state.currentPath);\n }\n\n return state;\n};\n\nexport function parseUnifiedDiff(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileChange[];\n\n const changes = new Map<string, { additions: number; deletions: number }>();\n let state: UnifiedDiffState = {\n currentPath: null,\n lastMinusHeader: null,\n inHunk: false,\n };\n\n const lines = diffText.split(/\\r?\\n/);\n for (const line of lines) {\n state = processUnifiedDiffLine(line, state, changes);\n }\n\n return Array.from(changes.entries()).map(([filePath, { additions, deletions }]) => ({\n filePath,\n additions,\n deletions,\n }));\n}\n\nexport function buildDiffTitleSegments(diffText?: string) {\n return parseUnifiedDiff(diffText).map(\n (file) =>\n ({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n }) satisfies TitleSegment,\n );\n}\n\nexport function extractDiffFilePaths(diffText?: string) {\n return parseUnifiedDiff(diffText).map((file) => file.filePath);\n}\n\nexport type FileDiffPreview = { filePath: string; original: string; modified: string };\n\nconst isDiffFileBoundary = (line: string) => isMinusHeader(line) || line.startsWith(\"diff --git \");\n\nconst isInvalidHunkBodyLine = (line: string) => {\n if (line.startsWith(\" \")) return false;\n if (line.startsWith(\"+\")) return false;\n if (line.startsWith(\"-\")) return false;\n return line.trim() !== \"\";\n};\n\nconst appendHunkLine = (line: string, original: string[], modified: string[]) => {\n if (line.startsWith(\" \")) {\n const text = line.slice(1);\n original.push(text);\n modified.push(text);\n return;\n }\n\n if (line.startsWith(\"-\")) {\n original.push(line.slice(1));\n return;\n }\n\n if (line.startsWith(\"+\")) {\n modified.push(line.slice(1));\n }\n};\n\nconst parseHunkBody = (lines: string[], startIndex: number, original: string[], modified: string[]) => {\n let index = startIndex;\n\n while (index < lines.length) {\n const line = lines[index] || \"\";\n if (isDiffFileBoundary(line) || isHunkHeader(line) || isInvalidHunkBodyLine(line)) {\n break;\n }\n\n appendHunkLine(line, original, modified);\n index += 1;\n }\n\n if (original.length > 0 || modified.length > 0) {\n original.push(\"\");\n modified.push(\"\");\n }\n\n return index;\n};\n\nconst parsePreview = (lines: string[], startIndex: number) => {\n const oldHeader = normalizeHeaderPath((lines[startIndex] || \"\").slice(4));\n const next = lines[startIndex + 1] || \"\";\n if (!isPlusHeader(next)) return { nextIndex: startIndex + 1 } as const;\n\n const newHeader = normalizeHeaderPath(next.slice(4));\n const filePath = newHeader ?? oldHeader ?? \"\";\n const original: string[] = [];\n const modified: string[] = [];\n\n let index = startIndex + 2;\n while (index < lines.length) {\n const current = lines[index] || \"\";\n if (isDiffFileBoundary(current)) break;\n\n if (!isHunkHeader(current)) {\n index += 1;\n continue;\n }\n\n index = parseHunkBody(lines, index + 1, original, modified);\n }\n\n return {\n nextIndex: index,\n preview: { filePath, original: original.join(\"\\n\"), modified: modified.join(\"\\n\") } satisfies FileDiffPreview,\n } as const;\n};\n\nexport function buildFileDiffPreviews(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileDiffPreview[];\n\n const lines = diffText.split(/\\r?\\n/);\n const previews: FileDiffPreview[] = [];\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i] || \"\";\n if (!isMinusHeader(line)) {\n i += 1;\n continue;\n }\n\n const { nextIndex, preview } = parsePreview(lines, i);\n if (preview) previews.push(preview);\n i = Math.max(nextIndex, i + 1);\n }\n\n return previews;\n}\n","import type { ToolPart } from \"../agent-types\";\nimport type { Block, TitleSegment } from \"../components/timeline\";\nimport { basenameSafe, buildDiffTitleSegments, buildFileDiffPreviews, extractDiffFilePaths } from \"../utils/diff\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\n\nconst TOOL_LABELS: Record<string, string> = {\n apply_patch: \"Apply patch\",\n bash: \"Run command\",\n edit: \"Edit file\",\n glob: \"Find files\",\n grep: \"Search files\",\n read: \"Read file\",\n skill: \"Load skill\",\n todowrite: \"Update todos\",\n};\n\nconst STATE_LABELS: Record<string, string> = {\n pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n input_streaming: \"running\",\n input_available: \"queued\",\n running: \"running\",\n completed: \"completed\",\n failed: \"failed\",\n};\n\nexport type ApplyPatchMetadataFile = {\n filePath: string;\n additions: number;\n deletions: number;\n diff?: string;\n before?: string;\n after?: string;\n};\n\nexport const normalizeToolType = (value: string) => value.replace(/^tool-/, \"\").toLowerCase();\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nexport const getToolType = (invocation: ToolPart) => normalizeToolType(invocation.tool ?? \"tool\");\n\nexport const getToolLabel = (value: string) => {\n const normalized = normalizeToolType(value);\n return TOOL_LABELS[normalized] ?? toTitleCase(normalized.replace(/_/g, \" \"));\n};\n\nexport const getStateLabel = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n if (!state || typeof state !== \"string\") return null;\n\n const normalized = state.replace(/-/g, \"_\");\n if (STATE_LABELS[normalized]) return STATE_LABELS[normalized];\n if (normalized.includes(\"stream\")) return \"running\";\n return null;\n};\n\nexport const isErrorState = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n return state === \"error\" || state === \"output-error\" || state === \"failed\";\n};\n\nexport const buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return { type: \"icon\", icon: toolTypeToIconName(getToolType(invocation)) } as const;\n};\n\nexport const buildBaseTitle = (invocation: ToolPart, detail?: string, labelOverride?: string) => {\n const label = labelOverride ?? getToolLabel(invocation.tool ?? \"tool\");\n const title: TitleSegment[] = [{ kind: \"text\", text: label, bold: true }];\n\n if (detail) {\n title.push({ kind: \"text\", text: detail, muted: true });\n }\n\n const stateLabel = getStateLabel(invocation);\n if (stateLabel && stateLabel !== \"completed\") {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return title;\n};\n\nexport const getInputObject = (invocation: ToolPart) => {\n const input = invocation.state?.input;\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return null;\n return input as Record<string, unknown>;\n};\n\nexport const getOutputObject = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (!output || typeof output !== \"object\" || Array.isArray(output)) return null;\n return output as Record<string, unknown>;\n};\n\nexport const getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nexport const getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nexport const getStateObject = (invocation: ToolPart, key: string) => {\n const state = getObjectValue(invocation.state);\n if (!state) return null;\n return getObjectValue(state[key]);\n};\n\nconst normalizeFilePath = (value: string) => value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n\nconst isUnifiedDiff = (value: string) => value.includes(\"--- \") && value.includes(\"+++ \") && value.includes(\"@@\");\n\nconst getApplyPatchMetadataObjects = (invocation: ToolPart) => {\n const output = getOutputObject(invocation);\n return [getStateObject(invocation, \"metadata\"), getObjectValue(output?.metadata)].filter(Boolean) as Array<\n Record<string, unknown>\n >;\n};\n\nconst parseApplyPatchMetadataFile = (entry: unknown) => {\n const record = getObjectValue(entry);\n if (!record) return null;\n\n const rawPath = getStringValue(record.filePath) ?? getStringValue(record.relativePath) ?? getStringValue(record.path);\n if (!rawPath) return null;\n\n return {\n filePath: normalizeFilePath(rawPath),\n additions: typeof record.additions === \"number\" ? record.additions : 0,\n deletions: typeof record.deletions === \"number\" ? record.deletions : 0,\n diff: getStringValue(record.diff) ?? undefined,\n before: getStringValue(record.before) ?? undefined,\n after: getStringValue(record.after) ?? undefined,\n } satisfies ApplyPatchMetadataFile;\n};\n\nexport const getApplyPatchMetadataFiles = (invocation: ToolPart) => {\n const files: ApplyPatchMetadataFile[] = [];\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const entries = Array.isArray(metadata.files) ? metadata.files : [];\n\n for (const entry of entries) {\n const parsedFile = parseApplyPatchMetadataFile(entry);\n if (!parsedFile) continue;\n files.push(parsedFile);\n }\n }\n\n return files;\n};\n\nexport const getApplyPatchDiffText = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n const inputDiff = getStringValue(input?.diff);\n if (inputDiff) return inputDiff;\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const metadataDiff = getStringValue(metadata.diff);\n if (metadataDiff) return metadataDiff;\n }\n\n const fileDiffs = getApplyPatchMetadataFiles(invocation)\n .map((file) => file.diff)\n .filter((diff): diff is string => Boolean(diff));\n if (fileDiffs.length > 0) return fileDiffs.join(\"\\n\");\n\n const patchText = getStringValue(input?.patchText);\n if (patchText && isUnifiedDiff(patchText)) return patchText;\n\n return null;\n};\n\nexport const buildApplyPatchMetadataTitleSegments = (files: ApplyPatchMetadataFile[]) => {\n const seen = new Set<string>();\n const segments: TitleSegment[] = [];\n\n for (const file of files) {\n if (seen.has(file.filePath)) continue;\n seen.add(file.filePath);\n\n segments.push({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n });\n }\n\n return segments;\n};\n\nexport const getApplyPatchMetadataReferences = (files: ApplyPatchMetadataFile[]) => {\n return Array.from(new Set(files.map((file) => file.filePath)));\n};\n\nexport const getOutputText = (invocation: ToolPart) => {\n const outputObject = getOutputObject(invocation);\n\n return (\n getStringValue(invocation.state?.output) ??\n getStringValue(outputObject?.returnDisplay) ??\n getStringValue(outputObject?.preview) ??\n getStringValue(outputObject?.stdout) ??\n getStringValue(outputObject?.content)\n );\n};\n\nexport const parseSkillContentBlock = (value: string) => {\n const match = value.match(/<skill_content(?:\\s+name=\"([^\"]+)\")?>([\\s\\S]*?)<\\/skill_content>/);\n if (!match) return null;\n\n return {\n skillName: getStringValue(match[1]) ?? undefined,\n content: getStringValue(match[2]) ?? \"\",\n };\n};\n\nexport const getSkillName = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n return (\n getStringValue(input?.name) ??\n getStringValue(input?.skillName) ??\n getStringValue(input?.skill) ??\n getStringValue(input?.skill_name) ??\n undefined\n );\n};\n\nexport const buildFileLinkSegment = (filePath: string): TitleSegment => {\n return {\n kind: \"link\",\n text: basenameSafe(filePath),\n filePath,\n };\n};\n\nexport const prependErrorBlock = (invocation: ToolPart, blocks: Block[]): Block[] => {\n if (!isErrorState(invocation) || !invocation.state?.errorText) return blocks;\n const errorBlock: Block = { type: \"comment\", text: invocation.state.errorText };\n return [errorBlock, ...blocks];\n};\n\nexport const getDiffBlocks = (diffText?: string | null) => {\n return buildFileDiffPreviews(diffText ?? undefined).map((preview) => ({\n type: \"diff\",\n language: \"diff\",\n original: preview.original,\n modified: preview.modified,\n sideBySide: false,\n })) satisfies Block[];\n};\n\nexport const getDiffTitleSegments = (diffText?: string | null) => buildDiffTitleSegments(diffText ?? undefined);\n\nexport const getDiffReferences = (diffText?: string | null) => extractDiffFilePaths(diffText ?? undefined);\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildApplyPatchMetadataTitleSegments,\n buildBaseTitle,\n buildIndicator,\n getApplyPatchDiffText,\n getApplyPatchMetadataFiles,\n getApplyPatchMetadataReferences,\n getDiffBlocks,\n getDiffReferences,\n getDiffTitleSegments,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderApplyPatch: ToolRenderer = (invocation) => {\n const diffText = getApplyPatchDiffText(invocation);\n const metadataFiles = getApplyPatchMetadataFiles(invocation);\n\n const title = buildBaseTitle(invocation, undefined, \"Apply patch\");\n const diffSegments = getDiffTitleSegments(diffText);\n if (diffSegments.length > 0) {\n title.push(...diffSegments);\n } else {\n title.push(...buildApplyPatchMetadataTitleSegments(metadataFiles));\n }\n\n const blocks: Block[] = [...getDiffBlocks(diffText)];\n\n if (blocks.length === 0) {\n for (const file of metadataFiles) {\n if (!file.before && !file.after) continue;\n blocks.push({\n type: \"diff\",\n language: \"diff\",\n original: file.before ?? \"\",\n modified: file.after ?? \"\",\n sideBySide: false,\n });\n }\n }\n\n if (blocks.length === 0) {\n const references = getDiffReferences(diffText);\n if (references.length === 0) {\n references.push(...getApplyPatchMetadataReferences(metadataFiles));\n }\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getDiffBlocks,\n getInputObject,\n getOutputObject,\n getStringValue,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nconst buildEditDiff = (original: string, modified: string) => {\n return [\n {\n type: \"diff\",\n language: \"text\",\n original,\n modified,\n sideBySide: false,\n },\n ] satisfies Block[];\n};\n\nexport const renderEdit: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(output?.filePath) ??\n undefined;\n\n const original = getStringValue(output?.oldString) ?? getStringValue(input?.old_string) ?? undefined;\n const modified = getStringValue(output?.newString) ?? getStringValue(input?.new_string) ?? undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Edit file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n const diffBlocks =\n original !== undefined && modified !== undefined\n ? buildEditDiff(original, modified)\n : getDiffBlocks(getStringValue(output?.diff));\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, diffBlocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../agent-types\";\nimport type {\n Block,\n Item,\n QuestionFormBlockOption,\n QuestionFormBlockQuestion,\n TitleSegment,\n} from \"../components/timeline\";\nimport type { ToolRenderer } from \"./types\";\n\ntype QuestionRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst parseJsonObjectText = (value: string) => {\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst toInputRecord = (input: unknown) => {\n if (isRecord(input)) return input;\n\n if (typeof input === \"string\" && input.trim().length > 0) {\n return parseJsonObjectText(input);\n }\n\n return null;\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getResponseText = (value: unknown): string | null => {\n const stringValue = getStringValue(value);\n if (stringValue) return stringValue;\n\n if (Array.isArray(value)) {\n const lines = value.map(getResponseText).filter((line): line is string => line !== null);\n return lines.length > 0 ? lines.join(\"\\n\") : null;\n }\n\n if (!isRecord(value)) return null;\n\n return (\n getResponseText(value.response) ??\n getResponseText(value.answer) ??\n getResponseText(value.text) ??\n getResponseText(value.answers)\n );\n};\n\nconst parseQuestionOption = (value: unknown): QuestionFormBlockOption | null => {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return { label: value, description: undefined };\n }\n\n if (!isRecord(value)) return null;\n const label = getStringValue(value.label);\n if (!label) return null;\n\n return {\n label,\n description: getStringValue(value.description) ?? undefined,\n };\n};\n\nconst parseQuestion = (value: unknown, index: number): QuestionFormBlockQuestion | null => {\n if (!isRecord(value)) return null;\n\n const question = getStringValue(value.question);\n if (!question) return null;\n\n const options = Array.isArray(value.options)\n ? value.options.map(parseQuestionOption).filter((option): option is QuestionFormBlockOption => option !== null)\n : [];\n const type = getStringValue(value.type);\n const allowCustomAnswer =\n typeof value.custom === \"boolean\"\n ? value.custom\n : typeof value.allowCustomAnswer === \"boolean\"\n ? value.allowCustomAnswer\n : type === \"freeform\" || type === \"text\";\n\n if (options.length === 0 && !allowCustomAnswer) return null;\n\n return {\n id: getStringValue(value.id) ?? `question-${index}`,\n question,\n options,\n multiple:\n typeof value.multiple === \"boolean\" ? value.multiple : type === \"multi_choice\" || type === \"multiple_choice\",\n required: typeof value.required === \"boolean\" ? value.required : false,\n allowCustomAnswer,\n };\n};\n\nconst parseQuestionBlock = (input: unknown) => {\n const record = toInputRecord(input);\n if (!record || !Array.isArray(record.questions)) return null;\n\n const questions = record.questions.map(parseQuestion).filter((question): question is QuestionFormBlockQuestion => {\n return question !== null;\n });\n if (questions.length === 0) return null;\n\n return {\n type: \"question-form\",\n questions,\n } satisfies Block;\n};\n\nexport const createQuestionRenderer = (deps: QuestionRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const responseText = getResponseText(invocation.state?.output) ?? getResponseText(invocation.state?.metadata);\n const block = parseQuestionBlock(invocation.state?.input);\n if (!responseText && !block) return null;\n\n const fieldLabel = block ? `${block.questions.length} field${block.questions.length === 1 ? \"\" : \"s\"}` : undefined;\n const blocks = responseText ? [] : [block!];\n\n return {\n indicator: buildIndicator(invocation),\n title: buildBaseTitle(invocation, fieldLabel, \"Question\"),\n blocks: prependErrorBlock(invocation, blocks),\n expandable: false,\n } satisfies Item;\n };\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getInputObject,\n getOutputObject,\n getOutputText,\n getSkillName,\n getStringValue,\n parseSkillContentBlock,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderRead: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(input?.file) ??\n getStringValue(output?.filePath) ??\n getStringValue(output?.file) ??\n getStringValue(output?.path) ??\n undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Read file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, []),\n } satisfies Item;\n};\n\nexport const renderBash: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n const command = getStringValue(input?.command) ?? undefined;\n\n const title = buildBaseTitle(invocation, command, \"Run command\");\n const blocks: Block[] = [];\n\n const outputText = getOutputText(invocation);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: outputText });\n }\n\n const stderr = getStringValue(output?.stderr);\n if (stderr && stderr !== outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: stderr });\n }\n\n if (typeof output?.exitCode === \"number\") {\n blocks.push({ type: \"text\", text: `Exit code: ${output.exitCode}` });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderGrep: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const query = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, query, \"Search files\");\n const blocks: Block[] = outputText ? [{ type: \"code\", language: \"text\", code: outputText }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderGlob: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const pattern = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, pattern, \"Find files\");\n const blocks: Block[] = [];\n\n if (outputText) {\n const references = outputText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderSkill: ToolRenderer = (invocation) => {\n const outputText = getOutputText(invocation);\n const parsedOutput = outputText ? parseSkillContentBlock(outputText) : null;\n\n const skillName = getSkillName(invocation) ?? parsedOutput?.skillName;\n const title = buildBaseTitle(invocation, skillName, \"Load skill\");\n\n const renderedContent = parsedOutput?.content ?? outputText;\n const blocks: Block[] = renderedContent ? [{ type: \"code\", language: \"markdown\", code: renderedContent }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../agent-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport type { ToolRenderer } from \"./types\";\n\ntype TodoItem = {\n label: string;\n checked: boolean;\n};\n\ntype TodowriteRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nconst parseTodoItem = (value: unknown): TodoItem | null => {\n const todo = getObjectValue(value);\n if (!todo) return null;\n\n const content = getStringValue(todo.content) ?? getStringValue(todo.title);\n if (!content) return null;\n const status = getStringValue(todo.status);\n\n return {\n label: content,\n checked: status === \"completed\",\n };\n};\n\nconst parseTodoItems = (value: unknown) => {\n if (!value) return { items: [], explicit: false };\n\n const listSource = (() => {\n if (Array.isArray(value)) return value;\n const objectValue = getObjectValue(value);\n if (!objectValue || !Array.isArray(objectValue.todos)) return null;\n return objectValue.todos;\n })();\n\n if (!listSource) return { items: [], explicit: false };\n\n return {\n items: listSource.map(parseTodoItem).filter((todo): todo is TodoItem => todo !== null),\n explicit: true,\n };\n};\n\nexport const createTodowriteRenderer = (deps: TodowriteRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const inputTodos = parseTodoItems(invocation.state?.input);\n const outputTodos = parseTodoItems(invocation.state?.output);\n const todoState = outputTodos.explicit ? outputTodos : inputTodos;\n if (!todoState.explicit) return null;\n\n const todos = todoState.items;\n const countLabel = `${todos.length} item${todos.length === 1 ? \"\" : \"s\"}`;\n const title = buildBaseTitle(invocation, countLabel, \"Update todos\");\n\n if (todos.length === 0) {\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, [{ type: \"comment\", text: \"No todos\" }]),\n } satisfies Item;\n }\n\n const blocks: Block[] = [\n {\n type: \"todo-list\",\n items: todos,\n },\n ];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n };\n};\n","import { renderApplyPatch } from \"./apply-patch-renderer\";\nimport { renderEdit } from \"./edit-renderer\";\nimport { createQuestionRenderer } from \"./question-renderer\";\nimport { buildBaseTitle, buildIndicator, prependErrorBlock } from \"./shared\";\nimport { renderBash, renderGlob, renderGrep, renderRead, renderSkill } from \"./standard-renderers\";\nimport { createTodowriteRenderer } from \"./todowrite-renderer\";\nimport type { ToolRenderersMap } from \"./types\";\n\nconst renderQuestion = createQuestionRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nconst renderTodowrite = createTodowriteRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nexport const createDefaultToolRenderers = () => {\n return {\n apply_patch: renderApplyPatch,\n bash: renderBash,\n edit: renderEdit,\n glob: renderGlob,\n grep: renderGrep,\n question: renderQuestion,\n read: renderRead,\n skill: renderSkill,\n todo_write: renderTodowrite,\n todowrite: renderTodowrite,\n } satisfies ToolRenderersMap;\n};\n","import type { ToolPart } from \"../agent-types\";\nimport type { Block, TitleSegment } from \"../components/timeline\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\nimport { getToolNameLookupKeys, normalizeToolName } from \"../utils/tool-name\";\nimport { createDefaultToolRenderers } from \"./default-renderers\";\nimport type { ToolRenderersMap, ToolTimelineBuilderOptions } from \"./types\";\n\nconst STATE_LABELS: Record<string, string> = {\n pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n \"input-streaming\": \"running\",\n \"input-available\": \"queued\",\n};\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nconst getToolLabel = (tool?: string) => {\n const normalized = normalizeToolName(tool ?? \"tool\").replace(/_/g, \" \");\n return toTitleCase(normalized);\n};\n\nconst isErrorState = (state?: string) => state === \"error\" || state === \"output-error\";\n\nconst buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation.state?.status)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return { type: \"icon\", icon: toolTypeToIconName(invocation.tool ?? \"tool\") } as const;\n};\n\nconst getStateLabel = (state?: unknown) => {\n if (!state || typeof state !== \"string\") return null;\n if (STATE_LABELS[state]) return STATE_LABELS[state];\n if (state.includes(\"stream\")) return \"running\";\n return null;\n};\n\nconst stringifyValue = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return null;\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return null;\n }\n};\n\nconst buildGenericBlocks = (invocation: ToolPart): Block[] => {\n const blocks: Block[] = [];\n\n if (isErrorState(invocation.state?.status) && invocation.state?.errorText) {\n blocks.push({ type: \"comment\", text: invocation.state.errorText });\n }\n\n const inputText = stringifyValue(invocation.state?.input);\n if (inputText) {\n blocks.push({ type: \"code\", language: \"json\", code: inputText });\n }\n\n const outputText = stringifyValue(invocation.state?.output);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"json\", code: outputText });\n }\n\n return blocks;\n};\n\nconst createGenericItem = (invocation: ToolPart) => {\n const title: TitleSegment[] = [{ kind: \"text\", text: getToolLabel(invocation.tool), bold: true }];\n const stateLabel = getStateLabel(invocation.state?.status);\n if (stateLabel) {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: buildGenericBlocks(invocation),\n };\n};\n\nconst mergeToolRenderers = (overrides?: ToolRenderersMap) => {\n if (!overrides) return createDefaultToolRenderers();\n return { ...createDefaultToolRenderers(), ...overrides } satisfies ToolRenderersMap;\n};\n\nconst getRenderer = (invocation: ToolPart, toolRenderers: ToolRenderersMap) => {\n const rawTool = invocation.tool ?? \"tool\";\n for (const key of getToolNameLookupKeys(rawTool)) {\n const renderer = toolRenderers[key];\n if (renderer) return renderer;\n }\n\n return undefined;\n};\n\nconst renderInvocation = (\n invocation: ToolPart,\n toolRenderers: ToolRenderersMap,\n options?: ToolTimelineBuilderOptions,\n) => {\n const renderer = getRenderer(invocation, toolRenderers);\n if (renderer) {\n const rendered = renderer(invocation, options);\n if (rendered) return rendered;\n }\n\n return createGenericItem(invocation);\n};\n\nexport const buildTimelineDocFromInvocations = (invocations: ToolPart[], options?: ToolTimelineBuilderOptions) => {\n const toolRenderers = mergeToolRenderers(options?.toolRenderers);\n const items = invocations.map((invocation) => renderInvocation(invocation, toolRenderers, options));\n\n return { items };\n};\n\nexport const createToolTimelineBuilder = (toolRenderers: ToolRenderersMap) => {\n return (invocations: ToolPart[], options?: ToolTimelineBuilderOptions) => {\n return buildTimelineDocFromInvocations(invocations, { ...options, toolRenderers });\n };\n};\n","import { Avatar, Box, Button, Card, Timeline as ChakraTimeline, Link, Span, Stack, Text } from \"@chakra-ui/react\";\nimport { ChevronUpIcon } from \"lucide-react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\nimport { DiffEditor } from \"@/components/diff-viewer/diff-editor\";\nimport { ResourceBadge } from \"@/components/resource-badge\";\nimport { ScrollArea } from \"@/components/scroll-area\";\nimport type { IconName } from \"../utils/get-icon\";\nimport { getIconComponent } from \"../utils/get-icon\";\nimport { QuestionFormBlockView, TodoListBlockView } from \"./timeline-tool-blocks\";\n\nexport const Timeline = ChakraTimeline;\n\nexport type TimelineDoc = {\n items: Item[];\n};\n\nexport type Item = {\n id?: string;\n timestamp?: string;\n indicator?: Indicator;\n title: TitleSegment[];\n blocks?: Block[];\n expandable?: boolean;\n};\n\nexport type Indicator =\n | { type: \"icon\"; icon: IconName; color?: string }\n | { type: \"avatar\"; src: string; alt?: string }\n | { type: \"none\" };\n\nexport type TitleSegment =\n | { kind: \"text\"; text: string; bold?: boolean; muted?: boolean }\n | { kind: \"avatar\"; src: string; alt?: string }\n | { kind: \"diff\"; fileName: string; filePath?: string; additions?: number; deletions?: number }\n | {\n kind: \"link\";\n text: string;\n href?: string;\n filePath?: string;\n bold?: boolean;\n muted?: boolean;\n variant?: \"default\" | \"bubble\";\n };\n\nexport type TodoListBlockItem = {\n label: string;\n checked: boolean;\n};\n\nexport type QuestionFormBlockOption = {\n label: string;\n description?: string;\n};\n\nexport type QuestionFormBlockQuestion = {\n id?: string;\n question: string;\n options: QuestionFormBlockOption[];\n multiple: boolean;\n required: boolean;\n allowCustomAnswer: boolean;\n};\n\nexport type Block =\n | { type: \"comment\"; text: string; reactions?: { clap?: number } }\n | { type: \"code\"; language: string; code: string; editable?: boolean }\n | { type: \"diff\"; language?: string; original: string; modified: string; sideBySide?: boolean }\n | { type: \"input\"; placeholder?: string }\n | { type: \"text\"; text: string }\n | { type: \"todo-list\"; items: TodoListBlockItem[] }\n | { type: \"question-form\"; questions: QuestionFormBlockQuestion[] }\n | { type: \"references\"; references: string[] }\n | { type: \"component\"; render: (ctx: { onOpenFile?: (filePath: string) => void }) => ReactNode };\n\nconst handleTitleLinkClick = (\n event: MouseEvent<HTMLAnchorElement>,\n seg: Extract<TitleSegment, { kind: \"link\" }>,\n onOpenFile?: (filePath: string) => void,\n stopPropagation = false,\n) => {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n if (!seg.href) {\n event.preventDefault();\n }\n if (seg.filePath) {\n onOpenFile?.(seg.filePath);\n }\n};\n\nfunction AvatarTitleSegment({ seg }: { seg: Extract<TitleSegment, { kind: \"avatar\" }> }) {\n return (\n <Avatar.Root width=\"1.5rem\" height=\"1.5rem\">\n <Avatar.Image src={seg.src} alt={seg.alt} />\n <Avatar.Fallback />\n </Avatar.Root>\n );\n}\n\nfunction DiffTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"diff\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <DiffBubble\n fileName={seg.fileName}\n additions={seg.additions ?? 0}\n deletions={seg.deletions ?? 0}\n onClickFileLink={() => {\n const path = seg.filePath ?? seg.fileName;\n onOpenFile?.(path);\n }}\n />\n );\n}\n\nfunction BubbleLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n const isInteractive = Boolean(seg.href || seg.filePath);\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"fg.muted\"}\n textDecoration=\"none\"\n cursor={isInteractive ? \"pointer\" : \"default\"}\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile, true)}\n _hover={{\n textDecoration: \"underline\",\n color: seg.muted ? \"fg.muted\" : \"fg.blue-dark\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction DefaultLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"accent.primary\"}\n textDecoration=\"underline\"\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile)}\n _hover={{\n color: seg.muted ? \"fg.muted\" : \"accent.primary\",\n textDecoration: \"underline\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction TextTitleSegment({\n seg,\n isClickable,\n}: {\n seg: Extract<TitleSegment, { kind: \"text\" }>;\n isClickable?: boolean;\n}) {\n return (\n <Span\n fontWeight={seg.bold ? \"medium\" : undefined}\n color=\"fg.muted\"\n _groupHover={{\n color: isClickable && !seg.muted ? \"fg\" : \"fg.muted\",\n }}\n >\n {seg.text}\n </Span>\n );\n}\n\nfunction TitleInline({\n seg,\n isClickable,\n onOpenFile,\n}: {\n seg: TitleSegment;\n isClickable?: boolean;\n onOpenFile?: (filePath: string) => void;\n}) {\n switch (seg.kind) {\n case \"avatar\":\n return <AvatarTitleSegment seg={seg} />;\n case \"diff\":\n return <DiffTitleSegment seg={seg} onOpenFile={onOpenFile} />;\n case \"link\":\n return seg.variant === \"bubble\" ? (\n <BubbleLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n ) : (\n <DefaultLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n );\n case \"text\":\n return <TextTitleSegment seg={seg} isClickable={isClickable} />;\n default:\n return null;\n }\n}\n\nfunction IndicatorView({ ind }: { ind?: Indicator }) {\n if (!ind || ind.type === \"none\") return null;\n\n if (ind.type === \"icon\") {\n const IndicatorIcon = getIconComponent(ind.icon);\n return (\n <Timeline.Indicator outline=\"none\" shadow=\"none\" border=\"none\" background=\"bg\" color=\"fg\">\n <Span display=\"inline-flex\" alignItems=\"center\">\n <IndicatorIcon size={14} strokeWidth={1} />\n </Span>\n </Timeline.Indicator>\n );\n }\n\n return (\n <Timeline.Indicator>\n <Avatar.Root boxSize=\"full\">\n <Avatar.Image src={ind.src} alt={ind.alt} />\n <Avatar.Fallback />\n </Avatar.Root>\n </Timeline.Indicator>\n );\n}\n\nfunction CodeBlock({ code, language }: { code: string; language?: string }) {\n return (\n <ScrollArea background=\"bg.code\" color=\"fg\" borderRadius=\"md\" showHorizontalScrollbar showVerticalScrollbar={false}>\n <Box\n as=\"pre\"\n padding=\"sm\"\n fontFamily=\"mono\"\n fontSize=\"xs\"\n lineHeight=\"shorter\"\n whiteSpace=\"pre\"\n aria-label={language ? `${language} code block` : \"code block\"}\n >\n <Box as=\"code\">{code}</Box>\n </Box>\n </ScrollArea>\n );\n}\n\nfunction BlockView({ b, onOpenFile }: { b: Block; onOpenFile?: (filePath: string) => void }) {\n switch (b.type) {\n case \"comment\":\n return (\n <Card.Root>\n <Card.Body>{b.text}</Card.Body>\n {b.reactions?.clap ? (\n <Card.Footer>\n <Button>👏 {b.reactions.clap}</Button>\n </Card.Footer>\n ) : null}\n </Card.Root>\n );\n case \"code\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <CodeBlock language={b.language} code={b.code} />\n </Card.Body>\n </Card.Root>\n );\n case \"diff\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <Box height=\"240px\" minW=\"320px\" overflow=\"hidden\">\n <DiffEditor\n original={b.original}\n modified={b.modified}\n language={b.language}\n sideBySide={b.sideBySide ?? false}\n disableScroll={true}\n />\n </Box>\n </Card.Body>\n </Card.Root>\n );\n case \"text\":\n return (\n <Card.Root background=\"transparent\">\n <Card.Body padding=\"sm\">\n <Text textStyle=\"label/S/regular\">{b.text}</Text>\n </Card.Body>\n </Card.Root>\n );\n case \"todo-list\":\n return <TodoListBlockView items={b.items} />;\n case \"question-form\":\n return <QuestionFormBlockView questions={b.questions} />;\n case \"references\":\n return (\n <Stack mt=\"xs\" gap=\"xs\" flexDir=\"row\" flexWrap=\"wrap\">\n {b.references.map((ref) => (\n <ResourceBadge key={ref} fileName={ref} />\n ))}\n </Stack>\n );\n case \"component\":\n return <>{b.render({ onOpenFile })}</>;\n }\n}\n\nfunction TimelineItemRow({\n item,\n itemKey,\n isOpen,\n canExpand,\n hasBlocks,\n onToggle,\n onOpenFile,\n}: {\n item: Item;\n itemKey: string;\n isOpen: boolean;\n canExpand: boolean;\n hasBlocks: boolean;\n onToggle: (key: string) => void;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <Timeline.Item gap=\"xs\" key={itemKey}>\n <Timeline.Connector>\n <Timeline.Separator />\n <IndicatorView ind={item.indicator} />\n </Timeline.Connector>\n <Timeline.Content pb=\"xs\" h={isOpen ? \"auto\" : \"20px\"} overflow=\"hidden\">\n {item.title.length > 0 && (\n <Timeline.Title\n className=\"group\"\n fontWeight=\"normal\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n cursor={canExpand ? \"pointer\" : \"default\"}\n onClick={canExpand ? () => onToggle(itemKey) : undefined}\n >\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"sm\" flexWrap=\"wrap\">\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"xs\" flexWrap=\"wrap\">\n {item.title.map((seg, i) => (\n <TitleInline key={i} seg={seg} isClickable={canExpand} onOpenFile={onOpenFile} />\n ))}\n </Span>\n {canExpand ? (\n <Span\n display=\"inline-flex\"\n alignItems=\"center\"\n transition=\"transform 200ms ease, color 200ms ease\"\n transform={isOpen ? \"rotate(0deg)\" : \"rotate(-180deg)\"}\n color=\"transparent\"\n _groupHover={{ color: \"fg\" }}\n >\n <ChevronUpIcon size={12} />\n </Span>\n ) : null}\n </Span>\n </Timeline.Title>\n )}\n {hasBlocks ? (\n <Box display=\"grid\" gridTemplateRows={isOpen ? \"1fr\" : \"0fr\"} transition=\"grid-template-rows 220ms ease\">\n {isOpen ? (\n <Box\n overflow=\"hidden\"\n opacity={1}\n transform=\"translateY(0)\"\n transition=\"opacity 200ms ease, transform 200ms ease\"\n >\n {item.blocks!.map((block, i) => (\n <Box key={i}>\n <BlockView b={block} onOpenFile={onOpenFile} />\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n ) : null}\n </Timeline.Content>\n </Timeline.Item>\n );\n}\n\nexport function TimelineFromJSON({ data, onOpenFile }: { data: TimelineDoc; onOpenFile?: (filePath: string) => void }) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const getKey = (it: Item, idx: number) => (it.id ? `id:${it.id}` : `idx:${idx}`);\n\n const toggle = (key: string) => {\n setExpanded((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n return (\n <Timeline.Root>\n {data.items.map((item, idx) => {\n const key = getKey(item, idx);\n const hasBlocks = (item.blocks?.length ?? 0) > 0;\n const canExpand = (item.expandable ?? true) && hasBlocks;\n const isOpen = canExpand ? (expanded[key] ?? false) : hasBlocks;\n\n return (\n <TimelineItemRow\n key={key}\n item={item}\n itemKey={key}\n isOpen={isOpen}\n canExpand={canExpand}\n hasBlocks={hasBlocks}\n onToggle={toggle}\n onOpenFile={onOpenFile}\n />\n );\n })}\n </Timeline.Root>\n );\n}\n","import { buildTimelineDocFromInvocations } from \"../tool-rendering\";\nimport { normalizeToolName } from \"../utils/tool-name\";\nimport type { ToolPart } from \"./message-types\";\nimport { TimelineFromJSON } from \"./timeline\";\n\nexport interface ToolInvocationTimelineProps {\n invocations: ToolPart[];\n labeledBlocks?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n}\n\nconst isQuestionTool = (invocation: ToolPart) =>\n normalizeToolName(invocation.tool ?? \"\").replace(/_/g, \"\") === \"question\";\n\nconst hasToolOutput = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (typeof output === \"string\") return output.trim().length > 0;\n if (Array.isArray(output)) return output.length > 0;\n if (output && typeof output === \"object\") return Object.keys(output).length > 0;\n return output !== undefined && output !== null;\n};\n\nexport function ToolInvocationTimeline(props: ToolInvocationTimelineProps) {\n const { invocations, labeledBlocks, hideQuestionForms = false, onOpenFile } = props;\n const visibleInvocations = hideQuestionForms\n ? invocations.filter((invocation) => !isQuestionTool(invocation) || hasToolOutput(invocation))\n : invocations;\n\n if (visibleInvocations.length === 0) return null;\n\n const data = buildTimelineDocFromInvocations(visibleInvocations, { labeledBlocks });\n\n return <TimelineFromJSON data={data} onOpenFile={onOpenFile} />;\n}\n","import { Box, Spinner, Text } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { AlertMessage } from \"@/components/alert\";\nimport { RichMessage } from \"@/components/rich-text\";\nimport type { AlertPart, ErrorPart, SessionMessage, SessionMessagePart, ToolPart } from \"../agent-types\";\nimport { Response } from \"./ai-response\";\nimport { ToolInvocationTimeline, type ToolInvocationTimelineProps } from \"./tool-invocation-timeline\";\n\ntype ToolInvocationTimelineComponent = (props: ToolInvocationTimelineProps) => ReactNode;\n\nexport interface MessagePartsProps {\n message: SessionMessage;\n streaming?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n toolInvocationTimeline?: ToolInvocationTimelineComponent;\n}\n\nconst isToolPart = (part: SessionMessagePart): part is ToolPart => {\n return part.type === \"tool\";\n};\n\nconst formatTokenCount = (count: number) => {\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;\n return String(count);\n};\n\nconst getErrorMessage = (part: ErrorPart) => {\n if (part.message && part.message.trim().length > 0) {\n return part.message;\n }\n\n const { errorType } = part;\n switch (errorType) {\n case \"timeout\":\n return \"Session timed out.\";\n case \"crash\":\n return \"Session crashed unexpectedly.\";\n case \"permission\":\n return \"Permission denied.\";\n default:\n return \"An error occurred.\";\n }\n};\n\nconst ALERT_COLOR_PALETTE: Record<AlertPart[\"status\"], string> = {\n info: \"blue\",\n warning: \"orange\",\n error: \"red\",\n success: \"green\",\n loading: \"blue\",\n};\n\nconst collectToolInvocations = (parts: SessionMessagePart[], startIndex: number) => {\n const invocations: ToolPart[] = [];\n let lookahead = startIndex;\n\n while (lookahead < parts.length) {\n const nextPart = parts[lookahead];\n if (!isToolPart(nextPart)) break;\n invocations.push(nextPart);\n lookahead += 1;\n }\n\n return { invocations, nextIndex: lookahead - 1 };\n};\n\nexport function MessagePartsRenderer(props: MessagePartsProps) {\n const { message, hideQuestionForms = false, onOpenFile, toolInvocationTimeline } = props;\n const RenderToolInvocationTimeline = toolInvocationTimeline ?? ToolInvocationTimeline;\n const parts = message.parts ?? [];\n const nodes: ReactNode[] = [];\n\n for (let partIndex = 0; partIndex < parts.length; partIndex += 1) {\n const part = parts[partIndex];\n const key = `${message.id}-${partIndex}`;\n\n switch (part.type) {\n case \"text\":\n nodes.push(\n <div key={key}>\n <Response>{part.text}</Response>\n </div>,\n );\n break;\n case \"reasoning\":\n nodes.push(\n <Box\n key={key}\n padding=\"0\"\n css={{\n \"& .rich-text, & .rich-text *\": {\n color: \"fg.subtle !important\",\n fontSize: \".75rem !important\",\n fontWeight: \"normal !important\",\n },\n }}\n >\n <RichMessage defaultState={part.text} fullWidth />\n </Box>,\n );\n break;\n case \"tool\": {\n const { invocations, nextIndex } = collectToolInvocations(parts, partIndex);\n partIndex = nextIndex;\n nodes.push(\n <Box key={key} width=\"full\">\n <RenderToolInvocationTimeline\n invocations={invocations}\n labeledBlocks\n hideQuestionForms={hideQuestionForms}\n onOpenFile={onOpenFile}\n />\n </Box>,\n );\n break;\n }\n case \"error\":\n nodes.push(\n <Box key={key} py=\"2\" width=\"full\">\n <AlertMessage borderRadius=\"xs\" status=\"error\" colorPalette=\"red\" title={getErrorMessage(part)} size=\"sm\" />\n </Box>,\n );\n break;\n case \"token_usage\":\n nodes.push(\n <Box key={key}>\n <Text fontSize=\"xs\" color=\"fg.subtle\">\n Tokens: {formatTokenCount(part.inputTokens)} in / {formatTokenCount(part.outputTokens)} out\n {part.cacheReadTokens ? ` / ${formatTokenCount(part.cacheReadTokens)} cache read` : \"\"}\n </Text>\n </Box>,\n );\n break;\n case \"alert\":\n nodes.push(\n <Box key={key} width=\"full\">\n <AlertMessage\n borderRadius=\"xs\"\n status={part.status === \"loading\" ? \"info\" : part.status}\n colorPalette={ALERT_COLOR_PALETTE[part.status]}\n title={part.title}\n icon={part.status === \"loading\" ? <Spinner size=\"sm\" /> : undefined}\n size=\"sm\"\n >\n {part.message}\n </AlertMessage>\n </Box>,\n );\n break;\n default:\n nodes.push(null);\n }\n }\n\n return <>{nodes}</>;\n}\n","import type { SessionMessage, SessionMessagePart, ToolPart } from \"../agent-types\";\n\nexport type { SessionMessage, SessionMessagePart, ToolPart };\n\nexport type MessageOrigin = \"user\" | \"assistant\" | \"developer\";\n\nexport const getMessageOrigin = (role: string): MessageOrigin => {\n if (role === \"user\" || role === \"assistant\" || role === \"developer\") return role;\n return \"assistant\";\n};\n\nexport const isReasoningToolOnlyMessage = (message: SessionMessage) => {\n const parts = message.parts ?? [];\n if (parts.length === 0) return false;\n\n const hasTextPart = parts.some((part) => part.type === \"text\" && \"text\" in part);\n if (hasTextPart) return false;\n\n return parts.some((part) => part.type === \"reasoning\" || part.type === \"tool\");\n};\n\nexport const mergeReasoningToolOnlyMessages = (messages: SessionMessage[]) => {\n const merged: SessionMessage[] = [];\n\n for (const message of messages) {\n const previous = merged[merged.length - 1];\n\n if (previous && previous.role === message.role && isReasoningToolOnlyMessage(message)) {\n previous.parts = [...(previous.parts ?? []), ...(message.parts ?? [])];\n continue;\n }\n\n merged.push({\n ...message,\n parts: [...(message.parts ?? [])],\n });\n }\n\n return merged;\n};\n\nexport interface MessageGroup {\n userMessage: SessionMessage;\n responses: SessionMessage[];\n}\n\n// Groups messages into turns: each group starts with a user message\n// followed by all non-user messages until the next user message.\nexport const groupMessagesByTurn = (messages: SessionMessage[]) => {\n const groups: MessageGroup[] = [];\n const leadingResponses: SessionMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"user\") {\n groups.push({ userMessage: message, responses: [] });\n } else if (groups.length > 0) {\n groups[groups.length - 1].responses.push(message);\n } else {\n leadingResponses.push(message);\n }\n }\n\n return { groups, leadingResponses };\n};\n","import { Box, Button, Flex } from \"@chakra-ui/react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { type ReactNode, useEffect, useRef, type WheelEvent } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ChatMessage } from \"./ai-message\";\nimport {\n isStickyUserMessageCollapsible,\n STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT,\n STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT,\n shouldStopStickyUserMessageWheel,\n} from \"./chat-panel-sticky-user-message\";\nimport { MessageActionPanel } from \"./message-action-panel\";\nimport { MessagePartsRenderer } from \"./message-parts-renderer\";\nimport { getMessageOrigin, type MessageGroup, type SessionMessage } from \"./message-types\";\n\ninterface ChatMessageListProps {\n leadingResponses: SessionMessage[];\n groups: MessageGroup[];\n streaming: boolean;\n hideActiveQuestionForms: boolean;\n expandedStickyMessageIds: Set<string>;\n onToggleStickyMessage: (messageId: string) => void;\n onReady?: () => void;\n}\n\ninterface StickyMessageToggleProps {\n label: string;\n onClick: () => void;\n actionPanel?: ReactNode;\n}\n\ninterface StickyMessageGroupProps {\n group: MessageGroup;\n streaming: boolean;\n hideQuestionForms: boolean;\n isExpanded: boolean;\n onToggleStickyMessage: (messageId: string) => void;\n}\n\ntype ChatMessageListItem =\n | {\n type: \"leading-response\";\n key: string;\n message: SessionMessage;\n }\n | {\n type: \"group\";\n key: string;\n group: MessageGroup;\n groupIndex: number;\n };\n\nconst ESTIMATED_TURN_HEIGHT = 720;\nconst INITIAL_TAIL_VIEWPORT_HEIGHT = 1;\nconst TAIL_READY_STABLE_FRAME_COUNT = 3;\nconst TAIL_READY_FRAME_LIMIT = 20;\nconst TAIL_READY_PIXEL_EPSILON = 1;\nconst VIRTUAL_LIST_OVERSCAN = 4;\nconst VIRTUAL_LIST_GAP = 8;\n\nconst buildMessageListItems = (leadingResponses: SessionMessage[], groups: MessageGroup[]) => [\n ...leadingResponses.map((message) => ({\n type: \"leading-response\" as const,\n key: message.id,\n message,\n })),\n ...groups.map((group, groupIndex) => ({\n type: \"group\" as const,\n key: group.userMessage.id,\n group,\n groupIndex,\n })),\n];\n\nconst getEstimatedTailOffset = (count: number, viewportHeight: number) => {\n if (count === 0) return 0;\n\n const estimatedTotalSize = count * ESTIMATED_TURN_HEIGHT + (count - 1) * VIRTUAL_LIST_GAP;\n return Math.max(estimatedTotalSize - viewportHeight, 0);\n};\n\nconst getInitialViewportHeight = (scrollElement: HTMLElement | null) =>\n scrollElement?.clientHeight || INITIAL_TAIL_VIEWPORT_HEIGHT;\n\ninterface TailLayoutSnapshot {\n scrollTop: number;\n totalSize: number;\n}\n\nconst isTailLayoutStable = (current: TailLayoutSnapshot, previous: TailLayoutSnapshot) =>\n Math.abs(current.scrollTop - previous.scrollTop) <= TAIL_READY_PIXEL_EPSILON &&\n Math.abs(current.totalSize - previous.totalSize) <= TAIL_READY_PIXEL_EPSILON;\n\nconst readTailLayoutSnapshot = (scrollElement: HTMLElement | null, totalSize: number): TailLayoutSnapshot => ({\n scrollTop: scrollElement?.scrollTop ?? 0,\n totalSize,\n});\n\nconst useTailReady = (input: {\n itemCount: number;\n onReady?: () => void;\n scrollRef: { current: HTMLElement | null };\n totalSize: number;\n}) => {\n const { itemCount, onReady, scrollRef, totalSize } = input;\n const onReadyRef = useRef(onReady);\n\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n\n useEffect(() => {\n if (itemCount === 0 || typeof requestAnimationFrame === \"undefined\") {\n onReadyRef.current?.();\n return;\n }\n\n let frameId = 0;\n let checkedFrameCount = 0;\n let stableFrameCount = 0;\n let previousSnapshot: TailLayoutSnapshot | null = null;\n\n const waitForStableTail = () => {\n checkedFrameCount += 1;\n\n const nextSnapshot = readTailLayoutSnapshot(scrollRef.current, totalSize);\n stableFrameCount =\n previousSnapshot && isTailLayoutStable(nextSnapshot, previousSnapshot) ? stableFrameCount + 1 : 0;\n previousSnapshot = nextSnapshot;\n\n if (stableFrameCount >= TAIL_READY_STABLE_FRAME_COUNT || checkedFrameCount >= TAIL_READY_FRAME_LIMIT) {\n onReadyRef.current?.();\n return;\n }\n\n frameId = requestAnimationFrame(waitForStableTail);\n };\n\n frameId = requestAnimationFrame(waitForStableTail);\n\n return () => cancelAnimationFrame(frameId);\n }, [itemCount, scrollRef, totalSize]);\n};\n\nconst StickyMessageToggle = (props: StickyMessageToggleProps) => {\n const { label, onClick, actionPanel } = props;\n\n return (\n <Flex\n position=\"absolute\"\n bottom=\"0\"\n left=\"0\"\n right=\"0\"\n justifyContent={actionPanel ? \"space-between\" : \"flex-end\"}\n alignItems=\"flex-end\"\n px=\"xs\"\n pb=\"xs\"\n pt=\"lg\"\n bgGradient=\"to-t\"\n gradientFrom=\"bg.subtle\"\n gradientTo=\"transparent\"\n borderBottomRadius=\"xs\"\n pointerEvents=\"none\"\n >\n {actionPanel}\n <Button size=\"2xs\" variant=\"solid\" pointerEvents=\"auto\" onClick={onClick}>\n {label}\n </Button>\n </Flex>\n );\n};\n\nconst renderMessage = (message: SessionMessage, streaming: boolean, hideQuestionForms = false) => {\n const from = getMessageOrigin(message.role);\n\n return (\n <ChatMessage.Root from={from}>\n <ChatMessage.Content from={from}>\n <MessagePartsRenderer message={message} streaming={streaming} hideQuestionForms={hideQuestionForms} />\n {from === \"assistant\" || from === \"user\" ? (\n <MessageActionPanel message={message} alwaysVisible={from === \"user\"} copyAlwaysVisible={from !== \"user\"} />\n ) : null}\n </ChatMessage.Content>\n </ChatMessage.Root>\n );\n};\n\nconst handleExpandedStickyMessageWheel = (event: WheelEvent<HTMLElement>) => {\n if (shouldStopStickyUserMessageWheel(event.currentTarget, event.deltaY)) {\n event.stopPropagation();\n }\n};\n\nconst getStickyMessageMaxHeight = (isCollapsible: boolean, isExpanded: boolean) => {\n if (!isCollapsible) return undefined;\n if (isExpanded) return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n\n return STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT;\n};\n\nconst getStickyMessageBodyMaxHeight = (isExpandedCollapsible: boolean) => {\n if (!isExpandedCollapsible) return undefined;\n\n return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n};\n\nconst StickyMessageGroup = (props: StickyMessageGroupProps) => {\n const { group, streaming, hideQuestionForms, isExpanded, onToggleStickyMessage } = props;\n const isCollapsible = isStickyUserMessageCollapsible(group.userMessage);\n const isExpandedCollapsible = isCollapsible && isExpanded;\n const stickyMessageMaxHeight = getStickyMessageMaxHeight(isCollapsible, isExpanded);\n const toggleStickyMessage = () => onToggleStickyMessage(group.userMessage.id);\n\n return (\n <Box>\n <Box position=\"sticky\" top=\"0\" zIndex={1}>\n <ChatMessage.Root from=\"user\">\n <ChatMessage.Content\n from=\"user\"\n maxH={stickyMessageMaxHeight}\n overflow=\"hidden\"\n p={isCollapsible ? \"0\" : undefined}\n position={isCollapsible ? \"relative\" : undefined}\n >\n <Box\n data-sticky-user-message-content={isCollapsible ? (isExpanded ? \"expanded\" : \"collapsed\") : undefined}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"sm\"\n maxH={getStickyMessageBodyMaxHeight(isExpandedCollapsible)}\n minH=\"0\"\n overflowY={isExpandedCollapsible ? \"auto\" : \"visible\"}\n px={isCollapsible ? \"xs\" : undefined}\n py={isCollapsible ? \"xs\" : undefined}\n pb={isExpandedCollapsible ? \"3rem\" : undefined}\n onWheel={isExpandedCollapsible ? handleExpandedStickyMessageWheel : undefined}\n >\n <MessagePartsRenderer message={group.userMessage} streaming={streaming} />\n </Box>\n {isCollapsible ? (\n <StickyMessageToggle\n label={isExpanded ? \"Show less\" : \"Show more\"}\n onClick={toggleStickyMessage}\n actionPanel={<MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />}\n />\n ) : (\n <MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />\n )}\n </ChatMessage.Content>\n </ChatMessage.Root>\n </Box>\n {group.responses.map((message) => (\n <Box key={message.id}>{renderMessage(message, streaming, hideQuestionForms)}</Box>\n ))}\n </Box>\n );\n};\n\nconst renderListItem = (\n item: ChatMessageListItem,\n props: Pick<\n ChatMessageListProps,\n \"groups\" | \"streaming\" | \"hideActiveQuestionForms\" | \"expandedStickyMessageIds\" | \"onToggleStickyMessage\"\n >,\n) => {\n const { groups, streaming, hideActiveQuestionForms, expandedStickyMessageIds, onToggleStickyMessage } = props;\n\n if (item.type === \"leading-response\") {\n return renderMessage(item.message, streaming, groups.length > 0 || hideActiveQuestionForms);\n }\n\n return (\n <StickyMessageGroup\n group={item.group}\n streaming={streaming}\n hideQuestionForms={item.groupIndex < groups.length - 1 || hideActiveQuestionForms}\n isExpanded={expandedStickyMessageIds.has(item.group.userMessage.id)}\n onToggleStickyMessage={onToggleStickyMessage}\n />\n );\n};\n\nexport const ChatMessageList = (props: ChatMessageListProps) => {\n const {\n leadingResponses,\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n onToggleStickyMessage,\n onReady,\n } = props;\n const { scrollRef } = useStickToBottomContext();\n const items = buildMessageListItems(leadingResponses, groups);\n const initialViewportHeight = getInitialViewportHeight(scrollRef.current);\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLDivElement>({\n count: items.length,\n getScrollElement: () => scrollRef.current as HTMLDivElement | null,\n estimateSize: () => ESTIMATED_TURN_HEIGHT,\n getItemKey: (index) => items[index]?.key ?? index,\n overscan: VIRTUAL_LIST_OVERSCAN,\n gap: VIRTUAL_LIST_GAP,\n initialRect: { width: 0, height: initialViewportHeight },\n initialOffset: () => getEstimatedTailOffset(items.length, initialViewportHeight),\n });\n const totalSize = virtualizer.getTotalSize();\n\n useTailReady({\n itemCount: items.length,\n onReady,\n scrollRef,\n totalSize,\n });\n\n return (\n <Box px=\"xs\">\n <Box position=\"relative\" width=\"100%\" style={{ height: totalSize }}>\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const item = items[virtualItem.index];\n if (!item) return null;\n\n return (\n <Box\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n data-chat-message-list-item={item.type}\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n width=\"100%\"\n style={{ top: virtualItem.start }}\n >\n {renderListItem(item, {\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n onToggleStickyMessage,\n })}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import { Flex, HStack, Spinner, Stack, Text } from \"@chakra-ui/react\";\nimport { MessageCircleIcon } from \"lucide-react\";\nimport { type ReactNode, useState } from \"react\";\nimport { EmptyState } from \"@/components/empty-state\";\nimport { createSerializedPromptState } from \"../utils/editor-state\";\nimport { ChatPrimitives } from \"./ai-conversation\";\nimport { AutoScroll } from \"./auto-scroll\";\nimport { ChatInput } from \"./chat-input\";\nimport type { ChatInputQuestionPrompt, ChatInputQuestionResponse } from \"./chat-input-question-prompt\";\nimport { ChatMessageList } from \"./chat-message-list\";\nimport { groupMessagesByTurn, mergeReasoningToolOnlyMessages, type SessionMessage } from \"./message-types\";\n\ninterface ChatPanelProps {\n conversationKey?: string;\n messages: SessionMessage[];\n loading?: boolean;\n streaming?: boolean;\n emptyStateTitle: string;\n emptyStateDescription: string;\n emptyStateContent?: ReactNode;\n loaderComponent?: ReactNode;\n chatInputPlaceholder: string;\n chatInputDefaultValue?: string;\n onSubmitMessage?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => void;\n onInterrupt?: () => void;\n onChatInputChange?: (text: string) => void;\n actions?: ReactNode;\n repoMenu?: ReactNode;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n attachmentList?: ReactNode;\n approvalPrompt?: ReactNode;\n workspaceHub?: ReactNode;\n workspaceInitializing?: boolean;\n inputDisabled?: boolean;\n chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputAutoFocus?: boolean;\n}\n\nexport const ChatPanel = (props: ChatPanelProps) => {\n const {\n conversationKey,\n messages,\n loading = false,\n streaming = false,\n emptyStateTitle,\n emptyStateDescription,\n emptyStateContent,\n loaderComponent,\n chatInputPlaceholder,\n chatInputDefaultValue = \"\",\n onSubmitMessage,\n onInterrupt,\n onChatInputChange,\n actions,\n repoMenu,\n attachedResources,\n onClearAttachments,\n attachmentList,\n approvalPrompt,\n workspaceHub,\n workspaceInitializing = false,\n inputDisabled = false,\n chatInputQuestionPrompt,\n chatInputAutoFocus = false,\n } = props;\n\n const merged = mergeReasoningToolOnlyMessages(messages);\n const hasMessages = merged.length > 0;\n const messageListKey = conversationKey ?? merged[0]?.id;\n const messageListIdentity = hasMessages ? (messageListKey ?? \"active-conversation\") : null;\n const userMessageCount = merged.reduce((count, message) => count + (message.role === \"user\" ? 1 : 0), 0);\n const { groups, leadingResponses } = groupMessagesByTurn(merged);\n const [expandedStickyMessageIds, setExpandedStickyMessageIds] = useState(() => new Set<string>());\n const [readyMessageListKey, setReadyMessageListKey] = useState<string | null>(null);\n const showLoadingState = !hasMessages && loading;\n const defaultEmptyContent = (\n <EmptyState\n icon={<MessageCircleIcon size={48} strokeWidth={1.5} />}\n title={emptyStateTitle}\n description={emptyStateDescription}\n />\n );\n const emptyContent = showLoadingState ? loaderComponent : (emptyStateContent ?? defaultEmptyContent);\n const hasWorkspaceHub = Boolean(workspaceHub);\n const hideActiveQuestionForms = Boolean(chatInputQuestionPrompt);\n const showThinkingIndicator = streaming && hasMessages && !workspaceInitializing;\n const isMessageViewportReady = !messageListIdentity || readyMessageListKey === messageListIdentity;\n\n const toggleStickyMessageExpanded = (messageId: string) => {\n setExpandedStickyMessageIds((current) => {\n const next = new Set(current);\n if (next.has(messageId)) {\n next.delete(messageId);\n } else {\n next.add(messageId);\n }\n\n return next;\n });\n };\n\n return (\n <Flex position=\"relative\" direction=\"column\" w=\"full\" h=\"full\" overflow=\"hidden\">\n <ChatPrimitives.Root>\n <AutoScroll userMessageCount={userMessageCount} />\n <ChatPrimitives.Viewport visibility={isMessageViewportReady ? \"visible\" : \"hidden\"}>\n {hasMessages ? (\n <ChatMessageList\n key={messageListIdentity}\n leadingResponses={leadingResponses}\n groups={groups}\n streaming={streaming}\n hideActiveQuestionForms={hideActiveQuestionForms}\n expandedStickyMessageIds={expandedStickyMessageIds}\n onToggleStickyMessage={toggleStickyMessageExpanded}\n onReady={() => setReadyMessageListKey(messageListIdentity)}\n />\n ) : (\n emptyContent\n )}\n </ChatPrimitives.Viewport>\n {isMessageViewportReady ? <ChatPrimitives.ScrollToBottom aria-label=\"Scroll to latest message\" /> : null}\n </ChatPrimitives.Root>\n {approvalPrompt}\n {showThinkingIndicator ? (\n <HStack gap=\"xs\" px=\"sm\" py=\"2xs\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n Working...\n </Text>\n </HStack>\n ) : null}\n <Stack px=\"xs\" gap={hasWorkspaceHub ? \"0\" : \"xs\"}>\n {workspaceHub}\n <ChatInput\n placeholder={chatInputPlaceholder}\n defaultState={createSerializedPromptState(chatInputDefaultValue)}\n streaming={streaming}\n onSubmit={onSubmitMessage}\n onInterrupt={onInterrupt}\n onChange={onChatInputChange}\n actions={actions}\n attachedResources={attachedResources}\n onClearAttachments={onClearAttachments}\n attachmentList={attachmentList}\n isDisabled={inputDisabled}\n attachedToTop={hasWorkspaceHub}\n questionPrompt={chatInputQuestionPrompt}\n autoFocus={chatInputAutoFocus}\n />\n </Stack>\n <Flex p=\"2xs\" justifyContent=\"flex-end\">\n {repoMenu}\n </Flex>\n </Flex>\n );\n};\n","import { Skeleton, Stack } from \"@chakra-ui/react\";\nimport { ChatMessage } from \"./ai-message\";\n\nconst renderSkeletonLines = (widths: string[]) => (\n <Stack gap=\"xs\" w=\"full\">\n {widths.map((width, index) => (\n <Skeleton key={`${width}-${index}`} height=\"3\" width={width} borderRadius=\"xs\" />\n ))}\n </Stack>\n);\n\nexport const ChatSkeleton = () => {\n return (\n <Stack minH=\"full\" py=\"xs\" gap=\"0\">\n <ChatMessage.Root from=\"user\">\n <ChatMessage.Content from=\"user\">{renderSkeletonLines([\"72%\", \"46%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n <ChatMessage.Root from=\"assistant\">\n <ChatMessage.Content from=\"assistant\">{renderSkeletonLines([\"76%\", \"62%\", \"40%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n </Stack>\n );\n};\n","import { Flex, HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\n\ntype WorkspaceHubStatus = \"ready\" | \"loading\" | \"error\";\n\ninterface ChatWorkspaceHubProps {\n changesLabel: string;\n additions: number;\n deletions: number;\n action?: ReactNode;\n status?: WorkspaceHubStatus;\n statusLabel?: string;\n}\n\nexport const ChatWorkspaceHub = (props: ChatWorkspaceHubProps) => {\n const { changesLabel, additions, deletions, action, status = \"ready\", statusLabel } = props;\n const hasChanges = additions > 0 || deletions > 0;\n\n return (\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap=\"sm\"\n minW=\"0\"\n px=\"sm\"\n py=\"xs\"\n borderWidth=\"1px\"\n borderColor={status === \"error\" ? \"border.error\" : \"border.muted\"}\n borderRadius=\"xs\"\n borderBottomRadius=\"0\"\n bg={status === \"error\" ? \"bg.error\" : \"bg.subtle\"}\n >\n {status === \"loading\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {statusLabel ?? \"Setting up workspace...\"}\n </Text>\n </HStack>\n ) : status === \"error\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <AlertTriangle size={14} color=\"var(--chakra-colors-fg-error)\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.error\" truncate>\n {statusLabel ?? \"Workspace setup failed\"}\n </Text>\n </HStack>\n ) : hasChanges ? (\n <DiffBubble\n label={changesLabel}\n additions={additions}\n deletions={deletions}\n variant=\"ghost\"\n size=\"small\"\n _hover={{ background: \"transparent\" }}\n />\n ) : (\n <Flex flex=\"1\" />\n )}\n {action ? (\n <Flex flexShrink={0} ml=\"auto\">\n {action}\n </Flex>\n ) : null}\n </Flex>\n );\n};\n"],"names":["conversationRootDefaultProps","initial","resize","role","ConversationRoot","chakra","StickToBottomEl","base","position","flex","overflow","height","forwardProps","defaultProps","ConversationContent","props","$","_c","children","rest","contentRef","scrollRef","useStickToBottomContext","t0","t1","t2","t3","Symbol","for","zIndex","py","t4","ScrollArea","conversationScrollButtonContainerDefaultProps","axis","bottom","ConversationScrollButton","isAtBottom","scrollToBottom","jsx","AbsoluteCenter","IconButton","ArrowDownIcon","ChatPrimitives","Root","Viewport","ScrollToBottom","recipe","defineSlotRecipe","className","slots","root","display","width","alignItems","justifyContent","gap","animationName","animationDuration","animationTimingFunction","mb","content","flexDirection","textStyle","borderRadius","variants","from","user","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderColor","bg","px","assistant","developer","size","sm","md","lg","shape","rounded","pill","square","defaultVariants","withProvider","withContext","createSlotRecipeContext","MessageRoot","MessageContent","ChatMessage","Content","formatToolInput","input","text","JSON","stringify","length","slice","ApprovalPrompt","toolName","toolInput","onApprove","onDeny","formattedInput","jsxs","Text","Code","ShieldX","Button","t5","ShieldCheck","t6","t7","HStack","t8","Box","Flex","shouldAutoScroll","args","previousUserMessageCount","userMessageCount","AutoScroll","previousCountRef","useRef","current","useEffect","hasMessageText","trim","resolveChatInputKeyboardAction","state","isDisabled","streaming","resolveChatInputButtonAction","canInterrupt","preventSubmit","event","preventDefault","QuestionOptionContent","option","label","description","Stack","QuestionCheckboxOptionRow","name","checked","editable","onToggle","undefined","tabIndex","Checkbox","QuestionRadioOptions","question","questionIndex","selectedOption","onToggleOption","details","value","options","Radio","map","RadioGroup","TodoListBlockView","items","_temp","QuestionFormBlockView","questions","selectedOptionsByQuestion","customAnswersByQuestion","onCustomAnswerChange","id","inputType","multiple","selectedOptions","includes","allowCustomAnswer","Textarea","currentTarget","item","index","getQuestionSelectionKey","getQuestionPromptSignature","questionPrompt","Boolean","required","getQuestionAnswerLines","lines","key","selectedLabels","customAnswer","answers","push","join","isCustomAnswersByQuestion","toCustomAnswersByQuestion","answerInput","trimmed","buildQuestionResponse","legacyText","hasCustomQuestions","some","buildQuestionAnswerValues","hasMissingRequiredQuestionAnswer","toQuestionFormQuestions","hasQuestionAnswer","QuestionStepTab","sourceQuestion","isActive","onSelectStep","isAnswered","stepStateLabel","tabVariant","Check","Tooltip","QuestionPromptStepper","activeQuestionIndex","setActiveQuestionIndex","useState","renderQuestionIndex","Math","min","activeQuestion","hasMultipleQuestions","_question","_questionIndex","optionLabel","_question_0","_questionIndex_0","answer","t9","QuestionPromptControls","questionPromptSignature","SendButton","shortcut","title","ariaLabel","Square","ArrowUp","icon","button","Fragment","Kbd","tooltipContent","Portal","ChatInput","defaultState","onSubmit","onInterrupt","attachedResources","onClearAttachments","onChange","placeholder","attachmentList","actions","attachedToTop","autoFocus","isSelected","setIsSelected","editorState","setEditorState","editorKey","setEditorKey","getTextFromSerializedEditorState","setText","setSelectedOptionsByQuestion","setCustomAnswersByQuestion","containerRef","onChangeRef","t10","previousQuestionPromptSignatureRef","t11","t12","t13","t14","resetText","_temp2","t15","t16","t17","t18","querySelector","HTMLElement","focus","focusEditor","t19","t20","handle","requestAnimationFrame","editable_0","cancelAnimationFrame","t21","handleContainerClick","t22","t23","shouldFocus","_temp3","resetText_0","resetEditor","actionState","responseText","hasMissingRequiredSelection","buttonAction","t24","questionResponse","submitMessage","t25","action","runAction","t26","handleKeyboardSubmit","t27","handleButtonClick","t28","key_1","selected","alreadySelected","filter","toggleQuestionOption","t29","question_0","questionIndex_0","key_2","current_0","updateQuestionCustomAnswer","t30","placeholderNode","t31","t32","t33","t34","t35","t36","t37","boxShadow","t38","t39","t40","pr","PromptEditor","t","t41","Spacer","t42","t43","t44","t45","t46","t47","t48","key_0","createSerializedPromptState","generateEditorStateFromString","STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT","STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT","SCROLL_BOUNDARY_EPSILON","getMessageTextMetrics","message","parts","reduce","metrics","part","type","lineCount","split","textLength","isStickyUserMessageCollapsible","shouldStopStickyUserMessageWheel","element","deltaY","maxScrollTop","max","scrollHeight","clientHeight","scrollTop","isCopyablePart","getMessageCopyText","getMessageTimestampLabel","locale","timeZone","createdAt","Intl","DateTimeFormat","hour","minute","format","Date","MessageActionPanel","alwaysVisible","copyAlwaysVisible","isCopied","setIsCopied","copyResetTimeoutRef","copyText","timestampLabel","window","clearTimeout","navigator","clipboard","writeText","setTimeout","copyMessage","messageActionPanelHoverStyles","Copy","opacity","pointerEvents","ChatRichContent","RichMessage","Response","normalizeToolName","replace","toLowerCase","getToolNameLookupKeys","normalized","compact","Set","toolIconMap","shell","Terminal","ls","ListTree","read_file","FileText","write_file","FilePen","delete_file","Trash2","patch","FileDiff","upload_files","FileUp","download_file","FileDown","move_file","Move","iconMap","dot","DotIcon","danger","AlertTriangle","search","Search","browser","Globe","file","File","CircleQuestionMark","todo","ListTodo","terminal","DEFAULT_TOOL_ICON","isToolIconName","Object","hasOwn","getIconComponent","toolTypeToIconName","basenameSafe","path","idx","lastIndexOf","normalizeHeaderPath","token","startsWith","isMinusHeader","line","isPlusHeader","isHunkHeader","isAddedLine","isDeletedLine","ensureFileChange","changes","filePath","has","set","additions","deletions","incrementAdditions","get","incrementDeletions","processUnifiedDiffLine","lastMinusHeader","inHunk","currentPath","parseUnifiedDiff","diffText","Map","Array","entries","buildDiffTitleSegments","kind","fileName","extractDiffFilePaths","isDiffFileBoundary","isInvalidHunkBodyLine","appendHunkLine","original","modified","parseHunkBody","startIndex","parsePreview","oldHeader","next","nextIndex","preview","buildFileDiffPreviews","previews","i","TOOL_LABELS","apply_patch","bash","edit","glob","grep","read","skill","todowrite","STATE_LABELS","pending","error","input_streaming","input_available","running","completed","failed","normalizeToolType","toTitleCase","toUpperCase","getToolType","invocation","tool","getToolLabel","getStateLabel","status","isErrorState","buildIndicator","buildBaseTitle","detail","labelOverride","bold","muted","stateLabel","getInputObject","isArray","getOutputObject","output","getStringValue","getObjectValue","getStateObject","normalizeFilePath","isUnifiedDiff","getApplyPatchMetadataObjects","metadata","parseApplyPatchMetadataFile","entry","record","rawPath","relativePath","diff","before","after","getApplyPatchMetadataFiles","files","parsedFile","getApplyPatchDiffText","inputDiff","metadataDiff","fileDiffs","patchText","buildApplyPatchMetadataTitleSegments","seen","segments","add","getApplyPatchMetadataReferences","getOutputText","outputObject","returnDisplay","stdout","parseSkillContentBlock","match","skillName","getSkillName","skill_name","buildFileLinkSegment","prependErrorBlock","blocks","errorText","getDiffBlocks","language","sideBySide","getDiffTitleSegments","getDiffReferences","renderApplyPatch","metadataFiles","diffSegments","references","indicator","buildEditDiff","renderEdit","file_path","oldString","old_string","newString","new_string","diffBlocks","isRecord","parseJsonObjectText","parsed","parse","toInputRecord","getResponseText","stringValue","response","parseQuestionOption","parseQuestion","custom","parseQuestionBlock","createQuestionRenderer","deps","block","fieldLabel","expandable","renderRead","renderBash","command","outputText","code","stderr","exitCode","renderGrep","query","pattern","renderGlob","renderSkill","parsedOutput","renderedContent","parseTodoItem","parseTodoItems","explicit","listSource","objectValue","todos","createTodowriteRenderer","inputTodos","outputTodos","todoState","countLabel","renderQuestion","renderTodowrite","createDefaultToolRenderers","todo_write","stringifyValue","buildGenericBlocks","inputText","createGenericItem","mergeToolRenderers","overrides","getRenderer","toolRenderers","rawTool","renderer","renderInvocation","rendered","buildTimelineDocFromInvocations","invocations","Timeline","ChakraTimeline","handleTitleLinkClick","seg","onOpenFile","stopPropagation","href","AvatarTitleSegment","alt","src","Avatar","DiffTitleSegment","DiffBubble","BubbleLinkTitleSegment","fontWeight","isInteractive","textDecoration","color","Link","DefaultLinkTitleSegment","TextTitleSegment","isClickable","Span","TitleInline","variant","IndicatorView","ind","IndicatorIcon","CodeBlock","BlockView","b","reactions","clap","Card","DiffEditor","render","ref","ResourceBadge","TimelineItemRow","itemKey","isOpen","canExpand","hasBlocks","ChevronUpIcon","i_0","TimelineFromJSON","data","expanded","setExpanded","getKey","prev","toggle","idx_0","it","isQuestionTool","hasToolOutput","keys","ToolInvocationTimeline","labeledBlocks","hideQuestionForms","bb0","visibleInvocations","isToolPart","formatTokenCount","count","toFixed","String","getErrorMessage","errorType","ALERT_COLOR_PALETTE","info","warning","success","loading","collectToolInvocations","lookahead","nextPart","MessagePartsRenderer","toolInvocationTimeline","RenderToolInvocationTimeline","nodes","partIndex","fontSize","AlertMessage","inputTokens","outputTokens","cacheReadTokens","Spinner","getMessageOrigin","isReasoningToolOnlyMessage","mergeReasoningToolOnlyMessages","messages","merged","previous","groupMessagesByTurn","groups","leadingResponses","userMessage","responses","ESTIMATED_TURN_HEIGHT","INITIAL_TAIL_VIEWPORT_HEIGHT","TAIL_READY_STABLE_FRAME_COUNT","TAIL_READY_FRAME_LIMIT","TAIL_READY_PIXEL_EPSILON","VIRTUAL_LIST_OVERSCAN","VIRTUAL_LIST_GAP","buildMessageListItems","group","groupIndex","getEstimatedTailOffset","viewportHeight","estimatedTotalSize","getInitialViewportHeight","scrollElement","isTailLayoutStable","abs","totalSize","readTailLayoutSnapshot","useTailReady","itemCount","onReady","onReadyRef","frameId","checkedFrameCount","stableFrameCount","previousSnapshot","waitForStableTail","nextSnapshot","StickyMessageToggle","onClick","actionPanel","renderMessage","handleExpandedStickyMessageWheel","getStickyMessageMaxHeight","isCollapsible","isExpanded","getStickyMessageBodyMaxHeight","isExpandedCollapsible","StickyMessageGroup","onToggleStickyMessage","stickyMessageMaxHeight","toggleStickyMessage","renderListItem","hideActiveQuestionForms","expandedStickyMessageIds","ChatMessageList","initialViewportHeight","virtualizer","useVirtualizer","getScrollElement","estimateSize","getItemKey","overscan","initialRect","initialOffset","getTotalSize","getVirtualItems","virtualItem","measureElement","top","start","ChatPanel","conversationKey","emptyStateTitle","emptyStateDescription","emptyStateContent","loaderComponent","chatInputPlaceholder","chatInputDefaultValue","onSubmitMessage","onChatInputChange","repoMenu","approvalPrompt","workspaceHub","workspaceInitializing","inputDisabled","chatInputQuestionPrompt","chatInputAutoFocus","hasMessages","messageListIdentity","messageListKey","setExpandedStickyMessageIds","readyMessageListKey","setReadyMessageListKey","showLoadingState","MessageCircleIcon","EmptyState","emptyContent","hasWorkspaceHub","showThinkingIndicator","isMessageViewportReady","messageId","delete","toggleStickyMessageExpanded","renderSkeletonLines","widths","Skeleton","ChatSkeleton","ChatWorkspaceHub","changesLabel","statusLabel","hasChanges","background"],"mappings":"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"}
1
+ {"version":3,"file":"chat-ui.js","sources":["../src/components/chat-ui/components/ai-conversation.tsx","../src/components/chat-ui/components/ai-message.tsx","../src/components/chat-ui/components/approval-prompt.tsx","../src/components/chat-ui/components/auto-scroll.tsx","../src/components/chat-ui/components/chat-input-actions.ts","../src/components/chat-ui/components/timeline-tool-blocks.tsx","../src/components/chat-ui/components/chat-input-question-prompt.tsx","../src/components/chat-ui/components/send-button.tsx","../src/components/chat-ui/components/chat-input.tsx","../src/components/chat-ui/utils/editor-state.ts","../src/components/chat-ui/components/chat-panel-sticky-user-message.ts","../src/components/chat-ui/components/message-action-panel.tsx","../src/components/chat-ui/components/ai-response.tsx","../src/components/chat-ui/utils/tool-name.ts","../src/components/chat-ui/utils/get-icon.ts","../src/components/chat-ui/utils/diff.ts","../src/components/chat-ui/tool-rendering/shared.ts","../src/components/chat-ui/tool-rendering/apply-patch-renderer.ts","../src/components/chat-ui/tool-rendering/edit-renderer.ts","../src/components/chat-ui/tool-rendering/question-renderer.ts","../src/components/chat-ui/tool-rendering/standard-renderers.ts","../src/components/chat-ui/tool-rendering/todowrite-renderer.ts","../src/components/chat-ui/tool-rendering/default-renderers.ts","../src/components/chat-ui/tool-rendering/build-timeline.ts","../src/components/chat-ui/components/timeline.tsx","../src/components/chat-ui/components/tool-invocation-timeline.tsx","../src/components/chat-ui/components/message-parts-renderer.tsx","../src/components/chat-ui/components/message-types.ts","../src/components/chat-ui/components/chat-message-list.tsx","../src/components/chat-ui/components/chat-panel.tsx","../src/components/chat-ui/components/chat-skeleton.tsx","../src/components/chat-ui/components/workspace-hub.tsx"],"sourcesContent":["import type { HTMLChakraProps, IconButtonProps } from \"@chakra-ui/react\";\nimport { AbsoluteCenter, chakra, IconButton } from \"@chakra-ui/react\";\nimport { ArrowDownIcon } from \"lucide-react\";\nimport { StickToBottom as StickToBottomEl, useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ScrollArea } from \"@/components/scroll-area\";\n\nexport type ConversationRootProps = HTMLChakraProps<\"div\", React.ComponentProps<typeof StickToBottomEl>>;\n\nexport const conversationRootDefaultProps = {\n \"aria-roledescription\": \"conversation\",\n initial: \"instant\",\n resize: \"instant\",\n role: \"log\",\n} as const;\n\nexport const ConversationRoot = chakra(\n StickToBottomEl,\n {\n base: {\n position: \"relative\",\n flex: 1,\n overflow: \"hidden\",\n height: \"full\",\n },\n },\n {\n forwardProps: [\"initial\", \"resize\"],\n defaultProps: conversationRootDefaultProps,\n },\n);\n\nexport type ConversationContentProps = Omit<React.ComponentProps<typeof ScrollArea>, \"contentProps\" | \"viewportRef\">;\n\nexport const ConversationContent = (props: ConversationContentProps) => {\n const { children, ...rest } = props;\n const { contentRef, scrollRef } = useStickToBottomContext();\n\n return (\n <ScrollArea\n {...rest}\n height=\"full\"\n width=\"full\"\n showHorizontalScrollbar={false}\n viewportRef={scrollRef as React.Ref<HTMLDivElement>}\n contentRef={contentRef as React.Ref<HTMLDivElement>}\n verticalScrollbarProps={{ zIndex: 2 }}\n contentProps={{\n py: \"sm\",\n \"aria-live\": \"polite\",\n role: \"list\",\n }}\n >\n {children}\n </ScrollArea>\n );\n};\n\nexport type ConversationScrollButtonProps = IconButtonProps;\n\nexport const conversationScrollButtonContainerDefaultProps = {\n axis: \"horizontal\",\n bottom: \"md\",\n zIndex: 2,\n} as const;\n\nexport const ConversationScrollButton = (props: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n return (\n !isAtBottom && (\n <AbsoluteCenter {...conversationScrollButtonContainerDefaultProps}>\n <IconButton rounded=\"full\" onClick={() => scrollToBottom()} variant=\"outline\" size=\"xs\" {...props}>\n <ArrowDownIcon size={16} />\n </IconButton>\n </AbsoluteCenter>\n )\n );\n};\n\nexport const ChatPrimitives = {\n Root: ConversationRoot,\n Viewport: ConversationContent,\n ScrollToBottom: ConversationScrollButton,\n} as const;\n","import type { HTMLChakraProps, RecipeVariantProps } from \"@chakra-ui/react\";\nimport { createSlotRecipeContext, defineSlotRecipe } from \"@chakra-ui/react\";\n\nconst recipe = defineSlotRecipe({\n className: \"ai-message\",\n slots: [\"root\", \"content\"],\n base: {\n root: {\n display: \"flex\",\n width: \"full\",\n alignItems: \"end\",\n justifyContent: \"end\",\n gap: \"sm\",\n animationName: \"message-fade-in\",\n animationDuration: \"200ms\",\n animationTimingFunction: \"ease-out\",\n \"&:has(+ [data-scope='ai-message'][data-part='root'])\": {\n mb: 0,\n },\n },\n content: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"sm\",\n textStyle: \"sm\",\n overflow: \"hidden\",\n borderRadius: \"0\",\n },\n },\n variants: {\n from: {\n user: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n },\n content: {\n borderTopWidth: \"1px\",\n borderRightWidth: \"1px\",\n borderBottomWidth: \"1px\",\n borderLeftWidth: \"1px\",\n borderColor: \"border.muted\",\n bg: \"bg.subtle\",\n px: \"xs\",\n py: \"xs\",\n width: \"full\",\n borderRadius: \"0\",\n },\n },\n assistant: {\n root: {\n mb: \"md\",\n flexDirection: \"row\",\n justifyContent: \"start\",\n },\n content: {\n width: \"full\",\n px: \"xs\",\n },\n },\n developer: {\n root: {\n width: \"full\",\n flexDirection: \"row-reverse\",\n },\n content: {\n width: \"full\",\n },\n },\n },\n size: {\n sm: {\n root: { gap: \"xs\" },\n content: { textStyle: \"xs\" },\n },\n md: {},\n lg: {\n root: { gap: \"md\" },\n content: { textStyle: \"md\" },\n },\n },\n shape: {\n rounded: {\n content: { rounded: \"0\" },\n },\n pill: {\n content: { rounded: \"0\" },\n },\n square: {\n content: { rounded: \"0\" },\n },\n },\n },\n defaultVariants: {\n from: \"user\",\n size: \"md\",\n shape: \"rounded\",\n },\n});\n\nconst { withProvider, withContext } = createSlotRecipeContext({ recipe });\n\ntype VariantProps = RecipeVariantProps<typeof recipe>;\n\nexport interface MessageRootProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageRoot = withProvider<HTMLDivElement, MessageRootProps>(\"div\", \"root\");\n\nexport interface MessageContentProps extends HTMLChakraProps<\"div\">, VariantProps {}\nexport const MessageContent = withContext<HTMLDivElement, MessageContentProps>(\"div\", \"content\");\n\nexport const ChatMessage = {\n Root: MessageRoot,\n Content: MessageContent,\n} as const;\n","import { Box, Button, Code, Flex, HStack, Text } from \"@chakra-ui/react\";\nimport { ShieldCheck, ShieldX } from \"lucide-react\";\nimport { ScrollArea } from \"@/components/scroll-area\";\n\ninterface ApprovalPromptProps {\n toolName: string;\n toolInput?: unknown;\n onApprove: () => void;\n onDeny: () => void;\n}\n\nconst formatToolInput = (input: unknown) => {\n if (input == null) return null;\n\n const text = typeof input === \"string\" ? input : JSON.stringify(input, null, 2);\n if (text.length === 0) return null;\n\n const truncated = text.length > 200 ? `${text.slice(0, 200)}...` : text;\n return truncated;\n};\n\nexport const ApprovalPrompt = (props: ApprovalPromptProps) => {\n const { toolName, toolInput, onApprove, onDeny } = props;\n const formattedInput = formatToolInput(toolInput);\n\n return (\n <Box px=\"sm\" py=\"xs\" mx=\"sm\" borderWidth=\"1px\" borderColor=\"border.warning\" borderRadius=\"lg\" bg=\"bg.warning\">\n <Flex direction=\"column\" gap=\"xs\">\n <Text textStyle=\"label/S/medium\" color=\"fg\">\n Allow <Code size=\"sm\">{toolName}</Code>?\n </Text>\n\n {formattedInput ? (\n <ScrollArea maxH=\"6rem\">\n <Code size=\"sm\" whiteSpace=\"pre-wrap\" display=\"block\" width=\"100%\">\n {formattedInput}\n </Code>\n </ScrollArea>\n ) : null}\n\n <HStack gap=\"xs\" justifyContent=\"flex-end\">\n <Button size=\"xs\" variant=\"outline\" onClick={onDeny}>\n <ShieldX size={14} />\n Deny\n </Button>\n <Button size=\"xs\" colorPalette=\"green\" onClick={onApprove}>\n <ShieldCheck size={14} />\n Allow\n </Button>\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport interface AutoScrollProps {\n userMessageCount: number;\n}\n\ninterface ShouldAutoScrollArgs {\n previousUserMessageCount: number;\n userMessageCount: number;\n}\n\nexport const shouldAutoScroll = (args: ShouldAutoScrollArgs) => {\n const { previousUserMessageCount, userMessageCount } = args;\n\n if (previousUserMessageCount === 0) {\n return false;\n }\n\n return userMessageCount > previousUserMessageCount;\n};\n\nexport function AutoScroll(props: AutoScrollProps) {\n const { userMessageCount } = props;\n const { scrollToBottom } = useStickToBottomContext();\n const previousCountRef = useRef(userMessageCount);\n\n useEffect(() => {\n if (\n shouldAutoScroll({\n previousUserMessageCount: previousCountRef.current,\n userMessageCount,\n })\n ) {\n scrollToBottom();\n }\n\n previousCountRef.current = userMessageCount;\n }, [userMessageCount, scrollToBottom]);\n\n return null;\n}\n","interface ChatInputActionState {\n canInterrupt: boolean;\n isDisabled: boolean;\n streaming: boolean;\n text: string;\n}\n\nexport type ChatInputAction = \"interrupt\" | \"none\" | \"submit\";\n\nconst hasMessageText = (text: string) => text.trim().length > 0;\n\nexport const resolveChatInputKeyboardAction = (state: ChatInputActionState): ChatInputAction => {\n const { isDisabled, streaming, text } = state;\n if (isDisabled || streaming || !hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n\nexport const resolveChatInputButtonAction = (state: ChatInputActionState): ChatInputAction => {\n const { canInterrupt, isDisabled, streaming, text } = state;\n if (isDisabled) return \"none\";\n if (streaming) return canInterrupt ? \"interrupt\" : \"none\";\n if (!hasMessageText(text)) return \"none\";\n return \"submit\";\n};\n","import { Box, Stack, Text, Textarea } from \"@chakra-ui/react\";\nimport type { FormEvent } from \"react\";\nimport { Checkbox } from \"@/components/checkbox\";\nimport { Radio, RadioGroup } from \"@/components/radio\";\nimport type { QuestionFormBlockQuestion, TodoListBlockItem } from \"./timeline\";\n\nconst preventSubmit = (event: FormEvent) => {\n event.preventDefault();\n};\n\ninterface QuestionFormBlockViewProps {\n questions: QuestionFormBlockQuestion[];\n editable?: boolean;\n selectedOptionsByQuestion?: Record<string, string[]>;\n customAnswersByQuestion?: Record<string, string>;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange?: (question: QuestionFormBlockQuestion, questionIndex: number, answer: string) => void;\n}\n\nconst QuestionOptionContent = (props: { option: QuestionFormBlockQuestion[\"options\"][number] }) => {\n const { option } = props;\n\n return (\n <Stack gap=\"0\" minWidth=\"0\">\n <Text textStyle=\"label/S/regular\" color=\"fg\">\n {option.label}\n </Text>\n {option.description ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {option.description}\n </Text>\n ) : null}\n </Stack>\n );\n};\n\nconst QuestionCheckboxOptionRow = (props: {\n option: QuestionFormBlockQuestion[\"options\"][number];\n name: string;\n checked: boolean;\n editable: boolean;\n onToggle: () => void;\n}) => {\n const { option, name, checked, editable, onToggle } = props;\n\n return (\n <Checkbox\n name={name}\n checked={checked}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n onCheckedChange={editable ? onToggle : undefined}\n >\n <QuestionOptionContent option={option} />\n </Checkbox>\n );\n};\n\nconst QuestionRadioOptions = (props: {\n question: QuestionFormBlockQuestion;\n questionIndex: number;\n name: string;\n selectedOption?: string;\n editable: boolean;\n onToggleOption?: (question: QuestionFormBlockQuestion, questionIndex: number, optionLabel: string) => void;\n}) => {\n const { question, questionIndex, name, selectedOption, editable, onToggleOption } = props;\n\n return (\n <RadioGroup\n name={name}\n value={selectedOption ?? null}\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"xs\"\n onValueChange={\n editable\n ? (details) => {\n if (details.value) onToggleOption?.(question, questionIndex, details.value);\n }\n : undefined\n }\n >\n {question.options.map((option) => (\n <Radio\n key={option.label}\n value={option.label}\n inputProps={editable ? undefined : { tabIndex: -1 }}\n alignItems=\"flex-start\"\n >\n <QuestionOptionContent option={option} />\n </Radio>\n ))}\n </RadioGroup>\n );\n};\n\nexport const TodoListBlockView = (props: { items: TodoListBlockItem[] }) => {\n const { items } = props;\n\n return (\n <Stack as=\"ul\" gap=\"0\" listStyleType=\"none\" margin=\"0\" padding=\"0\">\n {items.map((item, index) => (\n <Box as=\"li\" key={`${item.label}-${index}`}>\n <Checkbox checked={item.checked} readOnly aria-readonly=\"true\" inputProps={{ tabIndex: -1 }} size=\"xs\">\n <Text textStyle=\"label/XS/regular\" color=\"fg\">\n {item.label}\n </Text>\n </Checkbox>\n </Box>\n ))}\n </Stack>\n );\n};\n\nexport const QuestionFormBlockView = (props: QuestionFormBlockViewProps) => {\n const {\n questions,\n editable = false,\n selectedOptionsByQuestion = {},\n customAnswersByQuestion = {},\n onToggleOption,\n onCustomAnswerChange,\n } = props;\n\n return (\n <Stack as=\"form\" gap=\"sm\" onSubmit={preventSubmit} aria-label=\"Question form\">\n {questions.map((question, questionIndex) => {\n const name = question.id ?? `question-${questionIndex}`;\n const inputType = question.multiple ? \"checkbox\" : \"radio\";\n const selectedOptions = selectedOptionsByQuestion[name] ?? [];\n\n return (\n <Stack\n as=\"fieldset\"\n key={name}\n gap=\"xs\"\n borderWidth=\"1px\"\n borderColor=\"border.muted\"\n borderRadius=\"sm\"\n padding=\"sm\"\n minWidth=\"0\"\n >\n <Text as=\"legend\" textStyle=\"label/S/medium\" color=\"fg\" paddingX=\"2xs\">\n {question.question}\n </Text>\n {inputType === \"radio\" ? (\n <QuestionRadioOptions\n question={question}\n questionIndex={questionIndex}\n name={name}\n selectedOption={selectedOptions[0]}\n editable={editable}\n onToggleOption={onToggleOption}\n />\n ) : (\n question.options.map((option) => (\n <QuestionCheckboxOptionRow\n key={option.label}\n option={option}\n name={name}\n checked={selectedOptions.includes(option.label)}\n editable={editable}\n onToggle={() => onToggleOption?.(question, questionIndex, option.label)}\n />\n ))\n )}\n {question.allowCustomAnswer ? (\n <Textarea\n readOnly={!editable}\n aria-readonly={editable ? undefined : \"true\"}\n value={customAnswersByQuestion[name] ?? \"\"}\n placeholder={editable ? \"Answer...\" : \"Custom answer\"}\n aria-label={question.question}\n rows={2}\n borderWidth=\"1px\"\n borderColor=\"border.muted\"\n borderRadius=\"sm\"\n padding=\"xs\"\n resize={editable ? \"vertical\" : \"none\"}\n color=\"fg\"\n onChange={(event) => onCustomAnswerChange?.(question, questionIndex, event.currentTarget.value)}\n />\n ) : null}\n </Stack>\n );\n })}\n </Stack>\n );\n};\n","import { Button, HStack, Stack } from \"@chakra-ui/react\";\nimport { Check } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Tooltip } from \"@/components/tooltip\";\nimport { QuestionFormBlockView } from \"./timeline-tool-blocks\";\n\nexport interface ChatInputQuestionOption {\n label: string;\n description?: string;\n}\n\nexport interface ChatInputQuestion {\n id?: string;\n question: string;\n options: ChatInputQuestionOption[];\n multiple?: boolean;\n required?: boolean;\n allowCustomAnswer?: boolean;\n}\n\nexport interface ChatInputQuestionPrompt {\n questions: ChatInputQuestion[];\n}\n\nexport interface ChatInputQuestionResponse {\n answers: string[][];\n}\n\nexport type ChatInputQuestionCustomAnswers = Record<string, string>;\n\ninterface QuestionPromptControlsProps {\n questionPrompt: ChatInputQuestionPrompt;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onToggleOption: (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => void;\n onCustomAnswerChange: (question: ChatInputQuestion, questionIndex: number, answer: string) => void;\n}\n\ninterface QuestionPromptStepperProps extends QuestionPromptControlsProps {\n questions: ReturnType<typeof toQuestionFormQuestions>;\n}\n\nexport const getQuestionSelectionKey = (question: ChatInputQuestion, index: number) =>\n question.id ?? `question-${index}`;\n\nexport const getQuestionPromptSignature = (questionPrompt: ChatInputQuestionPrompt | undefined) => {\n if (!questionPrompt) return \"\";\n\n return JSON.stringify(\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n options: question.options.map((option) => ({\n label: option.label,\n description: option.description ?? \"\",\n })),\n })),\n );\n};\n\nconst getQuestionAnswerLines = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const lines: string[] = [];\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n const answers = customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n if (answers.length === 0) continue;\n\n lines.push(`${question.question}: ${answers.join(\", \")}`);\n }\n\n return lines;\n};\n\nconst isCustomAnswersByQuestion = (\n value: ChatInputQuestionCustomAnswers | string,\n): value is ChatInputQuestionCustomAnswers => typeof value !== \"string\";\n\nconst toCustomAnswersByQuestion = (\n questionPrompt: ChatInputQuestionPrompt,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (isCustomAnswersByQuestion(answerInput)) return answerInput;\n\n const trimmed = answerInput.trim();\n if (trimmed.length === 0) return {};\n\n const answers: ChatInputQuestionCustomAnswers = {};\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.allowCustomAnswer) continue;\n answers[getQuestionSelectionKey(question, index)] = trimmed;\n }\n\n return answers;\n};\n\nexport const buildQuestionResponse = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n const lines = getQuestionAnswerLines(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion);\n const legacyText = typeof answerInput === \"string\" ? answerInput.trim() : \"\";\n const hasCustomQuestions = questionPrompt.questions.some((question) => question.allowCustomAnswer);\n\n if (legacyText.length > 0 && !hasCustomQuestions) {\n lines.push(`Additional response: ${legacyText}`);\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const buildQuestionAnswerValues = (\n questionPrompt: ChatInputQuestionPrompt,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n return questionPrompt.questions.map((question, index) => {\n const key = getQuestionSelectionKey(question, index);\n const selectedLabels = selectedOptionsByQuestion[key] ?? [];\n const customAnswer = customAnswersByQuestion[key]?.trim();\n return customAnswer ? [...selectedLabels, customAnswer] : selectedLabels;\n });\n};\n\nexport const hasMissingRequiredQuestionAnswer = (\n questionPrompt: ChatInputQuestionPrompt | undefined,\n selectedOptionsByQuestion: Record<string, string[]>,\n answerInput: ChatInputQuestionCustomAnswers | string,\n) => {\n if (!questionPrompt) return false;\n\n const customAnswersByQuestion = toCustomAnswersByQuestion(questionPrompt, answerInput);\n\n for (let index = 0; index < questionPrompt.questions.length; index += 1) {\n const question = questionPrompt.questions[index];\n if (!question.required) continue;\n\n const key = getQuestionSelectionKey(question, index);\n const hasSelectedOption = (selectedOptionsByQuestion[key] ?? []).length > 0;\n if (hasSelectedOption) continue;\n if (question.allowCustomAnswer && customAnswersByQuestion[key]?.trim()) continue;\n\n return true;\n }\n\n return false;\n};\n\nconst toQuestionFormQuestions = (questionPrompt: ChatInputQuestionPrompt) =>\n questionPrompt.questions.map((question, index) => ({\n id: getQuestionSelectionKey(question, index),\n question: question.question,\n options: question.options,\n multiple: Boolean(question.multiple),\n required: Boolean(question.required),\n allowCustomAnswer: Boolean(question.allowCustomAnswer),\n }));\n\ntype QuestionFormQuestion = ReturnType<typeof toQuestionFormQuestions>[number];\n\ninterface QuestionStepTabProps {\n question: QuestionFormQuestion;\n sourceQuestion: ChatInputQuestion;\n questionIndex: number;\n isActive: boolean;\n selectedOptionsByQuestion: Record<string, string[]>;\n customAnswersByQuestion: ChatInputQuestionCustomAnswers;\n onSelectStep: (questionIndex: number) => void;\n}\n\nconst hasQuestionAnswer = (\n question: ChatInputQuestion,\n questionIndex: number,\n selectedOptionsByQuestion: Record<string, string[]>,\n customAnswersByQuestion: ChatInputQuestionCustomAnswers,\n) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n return (selectedOptionsByQuestion[key] ?? []).length > 0 || Boolean(customAnswersByQuestion[key]?.trim());\n};\n\nconst QuestionStepTab = (props: QuestionStepTabProps) => {\n const {\n question,\n sourceQuestion,\n questionIndex,\n isActive,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n onSelectStep,\n } = props;\n const isAnswered = hasQuestionAnswer(\n sourceQuestion,\n questionIndex,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const stepStateLabel = isAnswered ? \"answered\" : \"not answered\";\n const tabVariant = isActive ? \"outline\" : \"ghost\";\n\n return (\n <Tooltip content={question.question} showArrow>\n <Button\n id={`question-step-tab-${question.id}`}\n role=\"tab\"\n aria-label={`${question.question} (${stepStateLabel})`}\n aria-selected={isActive}\n aria-controls={`question-step-panel-${question.id}`}\n size=\"xs\"\n variant={tabVariant}\n minW=\"8\"\n onClick={() => onSelectStep(questionIndex)}\n >\n {isAnswered ? <Check aria-hidden=\"true\" /> : questionIndex + 1}\n </Button>\n </Tooltip>\n );\n};\n\nconst QuestionPromptStepper = (props: QuestionPromptStepperProps) => {\n const { questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion, onToggleOption, onCustomAnswerChange } =\n props;\n const { questions } = props;\n const [activeQuestionIndex, setActiveQuestionIndex] = useState(0);\n const renderQuestionIndex = Math.min(activeQuestionIndex, questions.length - 1);\n const activeQuestion = questions[renderQuestionIndex];\n const hasMultipleQuestions = questions.length > 1;\n\n return (\n <Stack gap=\"xs\" pb=\"sm\">\n {hasMultipleQuestions ? (\n <HStack role=\"tablist\" aria-label=\"Question steps\" gap=\"1\" minWidth=\"0\">\n {questions.map((question, questionIndex) => (\n <QuestionStepTab\n key={question.id}\n question={question}\n sourceQuestion={questionPrompt.questions[questionIndex]}\n questionIndex={questionIndex}\n isActive={questionIndex === renderQuestionIndex}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onSelectStep={setActiveQuestionIndex}\n />\n ))}\n </HStack>\n ) : null}\n <Stack\n id={`question-step-panel-${activeQuestion.id}`}\n role={hasMultipleQuestions ? \"tabpanel\" : undefined}\n aria-labelledby={hasMultipleQuestions ? `question-step-tab-${activeQuestion.id}` : undefined}\n gap=\"0\"\n >\n <QuestionFormBlockView\n questions={[activeQuestion]}\n editable\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={(_question, _questionIndex, optionLabel) => {\n onToggleOption(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, optionLabel);\n }}\n onCustomAnswerChange={(_question, _questionIndex, answer) => {\n onCustomAnswerChange(questionPrompt.questions[renderQuestionIndex], renderQuestionIndex, answer);\n }}\n />\n </Stack>\n </Stack>\n );\n};\n\nexport const QuestionPromptControls = (props: QuestionPromptControlsProps) => {\n const { questionPrompt } = props;\n const questions = toQuestionFormQuestions(questionPrompt);\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n return <QuestionPromptStepper key={questionPromptSignature} {...props} questions={questions} />;\n};\n","import { IconButton, type IconButtonProps, Kbd, Portal, Tooltip } from \"@chakra-ui/react\";\nimport { ArrowUp, Square } from \"lucide-react\";\n\nexport interface SendButtonProps extends IconButtonProps {\n shortcut?: string;\n title?: string;\n canInterrupt: boolean;\n}\n\nexport const SendButton = (props: SendButtonProps) => {\n const { title, shortcut, canInterrupt, ...rest } = props;\n const ariaLabel = rest[\"aria-label\"] ?? title;\n\n const icon = canInterrupt ? (\n <Square size={16} strokeWidth={2} fill=\"currentColor\" />\n ) : (\n <ArrowUp size={16} strokeWidth={2} />\n );\n\n const button = (\n <IconButton\n data-testid=\"send-message-button\"\n size=\"sm\"\n variant=\"solid\"\n borderRadius=\"full\"\n colorPalette=\"primary\"\n aria-label={ariaLabel}\n title={title}\n {...rest}\n >\n {icon}\n </IconButton>\n );\n\n if (title) {\n const tooltipContent = shortcut ? (\n <>\n {title} <Kbd fontSize=\"xs\">{shortcut}</Kbd>\n </>\n ) : (\n title\n );\n\n return (\n <Tooltip.Root closeDelay={50} openDelay={100}>\n <Tooltip.Trigger asChild>{button}</Tooltip.Trigger>\n <Portal>\n <Tooltip.Positioner>\n <Tooltip.Content>{tooltipContent}</Tooltip.Content>\n </Tooltip.Positioner>\n </Portal>\n </Tooltip.Root>\n );\n }\n\n return button;\n};\n","import { Box, Flex, HStack, Spacer, Text } from \"@chakra-ui/react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { ScrollArea } from \"@/components/scroll-area\";\nimport { getTextFromSerializedEditorState, PromptEditor } from \"../../rich-text\";\nimport {\n type ChatInputAction,\n resolveChatInputButtonAction,\n resolveChatInputKeyboardAction,\n} from \"./chat-input-actions\";\nimport {\n buildQuestionAnswerValues,\n buildQuestionResponse,\n type ChatInputQuestion,\n type ChatInputQuestionCustomAnswers,\n type ChatInputQuestionPrompt,\n type ChatInputQuestionResponse,\n getQuestionPromptSignature,\n getQuestionSelectionKey,\n hasMissingRequiredQuestionAnswer,\n QuestionPromptControls,\n} from \"./chat-input-question-prompt\";\nimport { SendButton } from \"./send-button\";\n\ninterface ChatInputProps {\n defaultState: string;\n placeholder?: string;\n onSubmit?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => void;\n onInterrupt?: () => void;\n streaming?: boolean;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n isDisabled?: boolean;\n onChange?: (text: string) => void;\n attachmentList?: ReactNode;\n actions?: ReactNode;\n attachedToTop?: boolean;\n questionPrompt?: ChatInputQuestionPrompt;\n autoFocus?: boolean;\n}\n\nexport const ChatInput = (props: ChatInputProps) => {\n const {\n defaultState,\n onSubmit = () => {},\n onInterrupt,\n streaming = false,\n attachedResources = [],\n onClearAttachments,\n isDisabled = false,\n onChange,\n placeholder,\n attachmentList,\n actions,\n attachedToTop = false,\n questionPrompt,\n autoFocus = false,\n } = props;\n\n const [isSelected, setIsSelected] = useState(false);\n const [editorState, setEditorState] = useState(defaultState);\n const [editorKey, setEditorKey] = useState(0);\n const [text, setText] = useState(() => getTextFromSerializedEditorState(defaultState));\n const [selectedOptionsByQuestion, setSelectedOptionsByQuestion] = useState<Record<string, string[]>>({});\n const [customAnswersByQuestion, setCustomAnswersByQuestion] = useState<ChatInputQuestionCustomAnswers>({});\n const containerRef = useRef<HTMLDivElement | null>(null);\n const onChangeRef = useRef(onChange);\n const previousQuestionPromptSignatureRef = useRef(getQuestionPromptSignature(questionPrompt));\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n const resetText = getTextFromSerializedEditorState(defaultState);\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n }, [defaultState]);\n\n const questionPromptSignature = getQuestionPromptSignature(questionPrompt);\n\n useEffect(() => {\n if (previousQuestionPromptSignatureRef.current === questionPromptSignature) return;\n previousQuestionPromptSignatureRef.current = questionPromptSignature;\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n }, [questionPromptSignature]);\n\n const focusEditor = () => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n };\n\n useEffect(() => {\n if (!autoFocus) return;\n const handle = requestAnimationFrame(() => {\n const editable = containerRef.current?.querySelector('[contenteditable=\"true\"]');\n if (editable instanceof HTMLElement) {\n editable.focus();\n }\n setIsSelected(true);\n });\n return () => cancelAnimationFrame(handle);\n }, [autoFocus]);\n\n const handleContainerClick = () => {\n setIsSelected(true);\n focusEditor();\n };\n\n const resetEditor = (shouldFocus = false) => {\n setEditorState(defaultState);\n setEditorKey((key) => key + 1);\n const resetText = getTextFromSerializedEditorState(defaultState);\n setText(resetText);\n setSelectedOptionsByQuestion({});\n setCustomAnswersByQuestion({});\n onChangeRef.current?.(resetText);\n\n if (shouldFocus) {\n requestAnimationFrame(() => {\n focusEditor();\n });\n }\n };\n\n const canInterrupt = streaming && Boolean(onInterrupt);\n const responseText = questionPrompt\n ? buildQuestionResponse(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion)\n : text.trim();\n const hasMissingRequiredSelection = hasMissingRequiredQuestionAnswer(\n questionPrompt,\n selectedOptionsByQuestion,\n customAnswersByQuestion,\n );\n const actionState = {\n canInterrupt,\n isDisabled: isDisabled || hasMissingRequiredSelection,\n streaming,\n text: responseText,\n };\n const buttonAction = resolveChatInputButtonAction(actionState);\n\n const submitMessage = () => {\n if (!responseText) return;\n\n const questionResponse = questionPrompt\n ? {\n answers: buildQuestionAnswerValues(questionPrompt, selectedOptionsByQuestion, customAnswersByQuestion),\n }\n : undefined;\n\n onSubmit(responseText, attachedResources, questionResponse);\n resetEditor(true);\n onClearAttachments?.();\n };\n\n const runAction = (action: ChatInputAction) => {\n if (action === \"interrupt\") {\n onInterrupt?.();\n return;\n }\n\n if (action === \"submit\") {\n submitMessage();\n }\n };\n\n const handleKeyboardSubmit = () => {\n runAction(resolveChatInputKeyboardAction(actionState));\n };\n\n const handleButtonClick = () => {\n runAction(buttonAction);\n };\n\n const toggleQuestionOption = (question: ChatInputQuestion, questionIndex: number, optionLabel: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n\n setSelectedOptionsByQuestion((current) => {\n const selected = current[key] ?? [];\n const alreadySelected = selected.includes(optionLabel);\n\n if (question.multiple) {\n return {\n ...current,\n [key]: alreadySelected ? selected.filter((label) => label !== optionLabel) : [...selected, optionLabel],\n };\n }\n\n return {\n ...current,\n [key]: alreadySelected ? [] : [optionLabel],\n };\n });\n };\n\n const updateQuestionCustomAnswer = (question: ChatInputQuestion, questionIndex: number, answer: string) => {\n const key = getQuestionSelectionKey(question, questionIndex);\n setCustomAnswersByQuestion((current) => ({\n ...current,\n [key]: answer,\n }));\n };\n\n const placeholderNode = placeholder ? (\n <Text textStyle=\"label/M/regular\" color=\"fg.subtle\" pointerEvents=\"none\" position=\"absolute\" top=\"0\">\n {placeholder}\n </Text>\n ) : undefined;\n\n return (\n <Box\n ref={containerRef}\n position=\"relative\"\n width=\"100%\"\n paddingX=\"xs\"\n paddingY=\"md\"\n mt={attachedToTop ? \"-1px\" : undefined}\n bg=\"bg\"\n borderRadius=\"md\"\n borderTopRadius={attachedToTop ? \"0\" : undefined}\n borderWidth=\"1px\"\n borderStyle=\"solid\"\n borderColor={isSelected ? \"blue.border\" : \"border.muted\"}\n boxShadow={isSelected ? \"mid\" : \"low\"}\n zIndex={isSelected ? 1 : 0}\n transition=\"box-shadow 0.2s ease-in-out, border-color 0.2s ease-in-out\"\n _hover={{\n borderColor: isSelected ? \"blue.border\" : \"border\",\n boxShadow: \"mid\",\n zIndex: 1,\n }}\n _focusWithin={{\n borderColor: \"blue.border\",\n boxShadow: \"mid\",\n zIndex: 1,\n }}\n onClick={handleContainerClick}\n onBlur={() => setIsSelected(false)}\n >\n <Flex direction=\"column\" color=\"fg\">\n {attachmentList}\n {questionPrompt ? (\n <QuestionPromptControls\n questionPrompt={questionPrompt}\n selectedOptionsByQuestion={selectedOptionsByQuestion}\n customAnswersByQuestion={customAnswersByQuestion}\n onToggleOption={toggleQuestionOption}\n onCustomAnswerChange={updateQuestionCustomAnswer}\n />\n ) : (\n <ScrollArea maxH=\"10rem\" showHorizontalScrollbar={false} contentProps={{ pr: \"2xs\" }}>\n <PromptEditor\n key={editorKey}\n defaultState={editorState}\n isEditable={!isDisabled}\n placeholder={placeholderNode}\n onChange={(t) => {\n setText(t);\n onChange?.(t);\n }}\n onSubmit={handleKeyboardSubmit}\n />\n </ScrollArea>\n )}\n <HStack gap=\"1\" mt=\"md\">\n {actions}\n <Spacer />\n <SendButton\n canInterrupt={canInterrupt}\n title={canInterrupt ? \"Stop Response\" : \"Message Sending\"}\n shortcut={streaming ? undefined : \"Enter\"}\n onClick={handleButtonClick}\n disabled={buttonAction === \"none\"}\n />\n </HStack>\n </Flex>\n </Box>\n );\n};\n","import { generateEditorStateFromString } from \"../../rich-text\";\n\nexport const createSerializedPromptState = (input = \"\") => {\n return JSON.stringify(generateEditorStateFromString(input));\n};\n","import type { SessionMessage } from \"./message-types\";\n\nexport const STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD = 360;\nexport const STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD = 4;\nexport const STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT = \"min(10vh, 4rem)\";\nexport const STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT = \"min(70dvh, calc(100dvh - 12rem), 22rem)\";\n\nconst SCROLL_BOUNDARY_EPSILON = 1;\n\ninterface StickyUserMessageScrollElement {\n clientHeight: number;\n scrollHeight: number;\n scrollTop: number;\n}\n\nconst getMessageTextMetrics = (message: SessionMessage) => {\n return message.parts.reduce(\n (metrics, part) => {\n if (part.type !== \"text\") return metrics;\n\n return {\n lineCount: metrics.lineCount + part.text.split(/\\r\\n|\\r|\\n/).length,\n textLength: metrics.textLength + part.text.length,\n };\n },\n { lineCount: 0, textLength: 0 },\n );\n};\n\nexport const isStickyUserMessageCollapsible = (message: SessionMessage) => {\n if (message.role !== \"user\") return false;\n\n const { lineCount, textLength } = getMessageTextMetrics(message);\n\n return (\n textLength > STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD || lineCount > STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD\n );\n};\n\nexport const shouldStopStickyUserMessageWheel = (element: StickyUserMessageScrollElement, deltaY: number) => {\n const maxScrollTop = Math.max(0, element.scrollHeight - element.clientHeight);\n\n if (deltaY === 0 || maxScrollTop <= SCROLL_BOUNDARY_EPSILON) return false;\n if (deltaY < 0) return element.scrollTop > SCROLL_BOUNDARY_EPSILON;\n\n return element.scrollTop < maxScrollTop - SCROLL_BOUNDARY_EPSILON;\n};\n","import { Box, HStack, IconButton, Text } from \"@chakra-ui/react\";\nimport { Check, Copy } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../../tooltip\";\nimport type { SessionMessage, SessionMessagePart } from \"./message-types\";\n\ninterface MessageActionPanelProps {\n message: SessionMessage;\n alwaysVisible?: boolean;\n copyAlwaysVisible?: boolean;\n}\n\nconst isCopyablePart = (part: SessionMessagePart): part is Extract<SessionMessagePart, { type: \"text\" }> => {\n return part.type === \"text\";\n};\n\nexport const getMessageCopyText = (message: SessionMessage) => {\n return (message.parts ?? [])\n .filter(isCopyablePart)\n .map((part) => part.text.trim())\n .filter(Boolean)\n .join(\"\\n\\n\");\n};\n\nexport const getMessageTimestampLabel = (message: SessionMessage, locale?: string, timeZone?: string) => {\n if (!message.createdAt) return \"\";\n\n return new Intl.DateTimeFormat(locale, {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n }).format(new Date(message.createdAt));\n};\n\nexport const MessageActionPanel = (props: MessageActionPanelProps) => {\n const { message, alwaysVisible = false, copyAlwaysVisible = alwaysVisible } = props;\n const [isCopied, setIsCopied] = useState(false);\n const copyResetTimeoutRef = useRef<number | null>(null);\n const copyText = getMessageCopyText(message);\n const timestampLabel = getMessageTimestampLabel(message);\n\n useEffect(() => {\n return () => {\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n };\n }, []);\n\n const copyMessage = async () => {\n if (!copyText) return;\n\n try {\n await navigator.clipboard.writeText(copyText);\n setIsCopied(true);\n if (copyResetTimeoutRef.current !== null) {\n window.clearTimeout(copyResetTimeoutRef.current);\n }\n copyResetTimeoutRef.current = window.setTimeout(() => setIsCopied(false), 1200);\n } catch {\n setIsCopied(false);\n }\n };\n\n if (!copyText && !timestampLabel) return null;\n\n return (\n <HStack\n data-chat-message-action-panel=\"true\"\n gap=\"2xs\"\n minH=\"6\"\n opacity={alwaysVisible ? \"1\" : \"0\"}\n pointerEvents={alwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n {timestampLabel ? (\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {timestampLabel}\n </Text>\n ) : null}\n {copyText ? (\n <Box\n opacity={copyAlwaysVisible ? \"1\" : \"0\"}\n pointerEvents={copyAlwaysVisible ? \"auto\" : \"none\"}\n transition=\"opacity 120ms ease\"\n css={messageActionPanelHoverStyles}\n >\n <Tooltip content={isCopied ? \"Copied\" : \"Copy message\"}>\n <IconButton\n aria-label={isCopied ? \"Copied\" : \"Copy message\"}\n variant=\"ghost\"\n size=\"2xs\"\n onClick={copyMessage}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n </IconButton>\n </Tooltip>\n </Box>\n ) : null}\n </HStack>\n );\n};\n\nconst messageActionPanelHoverStyles = {\n \"[data-chat-message-with-actions]:hover &, [data-chat-message-with-actions]:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \".ai-message__root:hover &, .ai-message__root:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \"[data-scope='ai-message'][data-part='root']:hover &, [data-scope='ai-message'][data-part='root']:focus-within &\": {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n};\n","import type { BoxProps } from \"@chakra-ui/react\";\nimport { Box } from \"@chakra-ui/react\";\nimport { RichMessage } from \"@/components/rich-text\";\n\nexport interface ChatRichContentProps extends Omit<BoxProps, \"children\"> {\n children: string;\n}\n\nexport const ChatRichContent = (props: ChatRichContentProps) => {\n const { children, ...rest } = props;\n\n return (\n <Box {...rest}>\n <RichMessage defaultState={children} fullWidth />\n </Box>\n );\n};\n\nexport const Response = ChatRichContent;\n","export const normalizeToolName = (value: string) => {\n return value\n .replace(/^tool-/i, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .toLowerCase();\n};\n\nexport const getToolNameLookupKeys = (value: string) => {\n const normalized = normalizeToolName(value);\n const compact = normalized.replace(/_/g, \"\");\n return [...new Set([value, normalized, compact])];\n};\n","import type { LucideIcon } from \"lucide-react\";\nimport {\n AlertTriangle,\n CircleQuestionMark,\n DotIcon,\n File,\n FileDiff,\n FileDown,\n FilePen,\n FileText,\n FileUp,\n Globe,\n ListTodo,\n ListTree,\n Move,\n Search,\n Terminal,\n Trash2,\n} from \"lucide-react\";\nimport { normalizeToolName } from \"./tool-name\";\n\nconst toolIconMap = {\n shell: Terminal,\n ls: ListTree,\n read_file: FileText,\n write_file: FilePen,\n delete_file: Trash2,\n patch: FileDiff,\n upload_files: FileUp,\n download_file: FileDown,\n move_file: Move,\n} as const satisfies Record<string, LucideIcon>;\n\nconst iconMap = {\n dot: DotIcon,\n danger: AlertTriangle,\n search: Search,\n browser: Globe,\n file: File,\n question: CircleQuestionMark,\n todo: ListTodo,\n terminal: Terminal,\n ...toolIconMap,\n} as const satisfies Record<string, LucideIcon>;\n\nexport type IconName = keyof typeof iconMap;\nexport type ToolIconName = keyof typeof toolIconMap;\n\nconst DEFAULT_TOOL_ICON: IconName = \"dot\";\n\nconst isToolIconName = (value: string): value is ToolIconName => Object.hasOwn(toolIconMap, value);\n\nexport const getIconComponent = (name: IconName): LucideIcon => {\n return iconMap[name];\n};\n\nexport const toolTypeToIconName = (type?: string): IconName => {\n if (!type) return DEFAULT_TOOL_ICON;\n\n const normalized = normalizeToolName(type);\n if (isToolIconName(normalized)) return normalized;\n\n const compact = normalized.replace(/_/g, \"\");\n\n switch (normalized) {\n case \"read\":\n return \"file\";\n case \"bash\":\n return \"terminal\";\n case \"edit\":\n return \"write_file\";\n case \"apply_patch\":\n return \"patch\";\n case \"grep\":\n return \"search\";\n case \"glob\":\n return \"file\";\n case \"todowrite\":\n return \"todo\";\n case \"search\":\n return \"search\";\n case \"browser\":\n return \"browser\";\n case \"question\":\n return \"question\";\n case \"fs\":\n case \"file\":\n return \"file\";\n default:\n return compact === \"todowrite\" || compact === \"todo\" ? \"todo\" : DEFAULT_TOOL_ICON;\n }\n};\n\nexport { getFileTypeIcon } from \"../../../utils/get-file-type-icon\";\n","import type { TitleSegment } from \"../components/timeline\";\n\nexport type FileChange = { filePath: string; additions: number; deletions: number };\n\nexport function basenameSafe(path: string) {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(idx + 1) : path;\n}\n\nfunction normalizeHeaderPath(input?: string | null) {\n if (!input) return null;\n\n const token = input.split(\"\\t\")[0].trim();\n if (token === \"/dev/null\") return null;\n\n let normalized = token;\n if (normalized.startsWith(\"a/\") || normalized.startsWith(\"b/\")) {\n normalized = normalized.slice(2);\n }\n\n return normalized.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nconst isMinusHeader = (line: string) => line.startsWith(\"--- \");\nconst isPlusHeader = (line: string) => line.startsWith(\"+++ \");\nconst isHunkHeader = (line: string) => line.startsWith(\"@@\");\nconst isAddedLine = (line: string) => line.startsWith(\"+\") && !(isPlusHeader(line) || line === \"+++\");\nconst isDeletedLine = (line: string) => line.startsWith(\"-\") && !(isMinusHeader(line) || line === \"---\");\n\nconst ensureFileChange = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n if (!changes.has(filePath)) {\n changes.set(filePath, { additions: 0, deletions: 0 });\n }\n};\n\nconst incrementAdditions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.additions += 1;\n};\n\nconst incrementDeletions = (changes: Map<string, { additions: number; deletions: number }>, filePath: string) => {\n const current = changes.get(filePath);\n if (!current) return;\n current.deletions += 1;\n};\n\ntype UnifiedDiffState = {\n currentPath: string | null;\n lastMinusHeader: string | null;\n inHunk: boolean;\n};\n\nconst processUnifiedDiffLine = (\n line: string,\n state: UnifiedDiffState,\n changes: Map<string, { additions: number; deletions: number }>,\n) => {\n if (isMinusHeader(line)) {\n return { ...state, lastMinusHeader: normalizeHeaderPath(line.slice(4)), inHunk: false };\n }\n\n if (isPlusHeader(line)) {\n const plusPath = normalizeHeaderPath(line.slice(4));\n const currentPath = plusPath ?? state.lastMinusHeader;\n if (currentPath) ensureFileChange(changes, currentPath);\n return { ...state, currentPath, inHunk: false };\n }\n\n if (!state.currentPath) return state;\n\n if (isHunkHeader(line)) {\n return { ...state, inHunk: true };\n }\n\n if (!state.inHunk) return state;\n\n if (isAddedLine(line)) {\n incrementAdditions(changes, state.currentPath);\n return state;\n }\n\n if (isDeletedLine(line)) {\n incrementDeletions(changes, state.currentPath);\n }\n\n return state;\n};\n\nexport function parseUnifiedDiff(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileChange[];\n\n const changes = new Map<string, { additions: number; deletions: number }>();\n let state: UnifiedDiffState = {\n currentPath: null,\n lastMinusHeader: null,\n inHunk: false,\n };\n\n const lines = diffText.split(/\\r?\\n/);\n for (const line of lines) {\n state = processUnifiedDiffLine(line, state, changes);\n }\n\n return Array.from(changes.entries()).map(([filePath, { additions, deletions }]) => ({\n filePath,\n additions,\n deletions,\n }));\n}\n\nexport function buildDiffTitleSegments(diffText?: string) {\n return parseUnifiedDiff(diffText).map(\n (file) =>\n ({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n }) satisfies TitleSegment,\n );\n}\n\nexport function extractDiffFilePaths(diffText?: string) {\n return parseUnifiedDiff(diffText).map((file) => file.filePath);\n}\n\nexport type FileDiffPreview = { filePath: string; original: string; modified: string };\n\nconst isDiffFileBoundary = (line: string) => isMinusHeader(line) || line.startsWith(\"diff --git \");\n\nconst isInvalidHunkBodyLine = (line: string) => {\n if (line.startsWith(\" \")) return false;\n if (line.startsWith(\"+\")) return false;\n if (line.startsWith(\"-\")) return false;\n return line.trim() !== \"\";\n};\n\nconst appendHunkLine = (line: string, original: string[], modified: string[]) => {\n if (line.startsWith(\" \")) {\n const text = line.slice(1);\n original.push(text);\n modified.push(text);\n return;\n }\n\n if (line.startsWith(\"-\")) {\n original.push(line.slice(1));\n return;\n }\n\n if (line.startsWith(\"+\")) {\n modified.push(line.slice(1));\n }\n};\n\nconst parseHunkBody = (lines: string[], startIndex: number, original: string[], modified: string[]) => {\n let index = startIndex;\n\n while (index < lines.length) {\n const line = lines[index] || \"\";\n if (isDiffFileBoundary(line) || isHunkHeader(line) || isInvalidHunkBodyLine(line)) {\n break;\n }\n\n appendHunkLine(line, original, modified);\n index += 1;\n }\n\n if (original.length > 0 || modified.length > 0) {\n original.push(\"\");\n modified.push(\"\");\n }\n\n return index;\n};\n\nconst parsePreview = (lines: string[], startIndex: number) => {\n const oldHeader = normalizeHeaderPath((lines[startIndex] || \"\").slice(4));\n const next = lines[startIndex + 1] || \"\";\n if (!isPlusHeader(next)) return { nextIndex: startIndex + 1 } as const;\n\n const newHeader = normalizeHeaderPath(next.slice(4));\n const filePath = newHeader ?? oldHeader ?? \"\";\n const original: string[] = [];\n const modified: string[] = [];\n\n let index = startIndex + 2;\n while (index < lines.length) {\n const current = lines[index] || \"\";\n if (isDiffFileBoundary(current)) break;\n\n if (!isHunkHeader(current)) {\n index += 1;\n continue;\n }\n\n index = parseHunkBody(lines, index + 1, original, modified);\n }\n\n return {\n nextIndex: index,\n preview: { filePath, original: original.join(\"\\n\"), modified: modified.join(\"\\n\") } satisfies FileDiffPreview,\n } as const;\n};\n\nexport function buildFileDiffPreviews(diffText?: string) {\n if (!diffText || typeof diffText !== \"string\") return [] as FileDiffPreview[];\n\n const lines = diffText.split(/\\r?\\n/);\n const previews: FileDiffPreview[] = [];\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i] || \"\";\n if (!isMinusHeader(line)) {\n i += 1;\n continue;\n }\n\n const { nextIndex, preview } = parsePreview(lines, i);\n if (preview) previews.push(preview);\n i = Math.max(nextIndex, i + 1);\n }\n\n return previews;\n}\n","import type { ToolPart } from \"../agent-types\";\nimport type { Block, TitleSegment } from \"../components/timeline\";\nimport { basenameSafe, buildDiffTitleSegments, buildFileDiffPreviews, extractDiffFilePaths } from \"../utils/diff\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\n\nconst TOOL_LABELS: Record<string, string> = {\n apply_patch: \"Apply patch\",\n bash: \"Run command\",\n edit: \"Edit file\",\n glob: \"Find files\",\n grep: \"Search files\",\n read: \"Read file\",\n skill: \"Load skill\",\n todowrite: \"Update todos\",\n};\n\nconst STATE_LABELS: Record<string, string> = {\n pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n input_streaming: \"running\",\n input_available: \"queued\",\n running: \"running\",\n completed: \"completed\",\n failed: \"failed\",\n};\n\nexport type ApplyPatchMetadataFile = {\n filePath: string;\n additions: number;\n deletions: number;\n diff?: string;\n before?: string;\n after?: string;\n};\n\nexport const normalizeToolType = (value: string) => value.replace(/^tool-/, \"\").toLowerCase();\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nexport const getToolType = (invocation: ToolPart) => normalizeToolType(invocation.tool ?? \"tool\");\n\nexport const getToolLabel = (value: string) => {\n const normalized = normalizeToolType(value);\n return TOOL_LABELS[normalized] ?? toTitleCase(normalized.replace(/_/g, \" \"));\n};\n\nexport const getStateLabel = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n if (!state || typeof state !== \"string\") return null;\n\n const normalized = state.replace(/-/g, \"_\");\n if (STATE_LABELS[normalized]) return STATE_LABELS[normalized];\n if (normalized.includes(\"stream\")) return \"running\";\n return null;\n};\n\nexport const isErrorState = (invocation: ToolPart) => {\n const state = invocation.state?.status ?? invocation.status;\n return state === \"error\" || state === \"output-error\" || state === \"failed\";\n};\n\nexport const buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return { type: \"icon\", icon: toolTypeToIconName(getToolType(invocation)) } as const;\n};\n\nexport const buildBaseTitle = (invocation: ToolPart, detail?: string, labelOverride?: string) => {\n const label = labelOverride ?? getToolLabel(invocation.tool ?? \"tool\");\n const title: TitleSegment[] = [{ kind: \"text\", text: label, bold: true }];\n\n if (detail) {\n title.push({ kind: \"text\", text: detail, muted: true });\n }\n\n const stateLabel = getStateLabel(invocation);\n if (stateLabel && stateLabel !== \"completed\") {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return title;\n};\n\nexport const getInputObject = (invocation: ToolPart) => {\n const input = invocation.state?.input;\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return null;\n return input as Record<string, unknown>;\n};\n\nexport const getOutputObject = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (!output || typeof output !== \"object\" || Array.isArray(output)) return null;\n return output as Record<string, unknown>;\n};\n\nexport const getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nexport const getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nexport const getStateObject = (invocation: ToolPart, key: string) => {\n const state = getObjectValue(invocation.state);\n if (!state) return null;\n return getObjectValue(state[key]);\n};\n\nconst normalizeFilePath = (value: string) => value.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n\nconst isUnifiedDiff = (value: string) => value.includes(\"--- \") && value.includes(\"+++ \") && value.includes(\"@@\");\n\nconst getApplyPatchMetadataObjects = (invocation: ToolPart) => {\n const output = getOutputObject(invocation);\n return [getStateObject(invocation, \"metadata\"), getObjectValue(output?.metadata)].filter(Boolean) as Array<\n Record<string, unknown>\n >;\n};\n\nconst parseApplyPatchMetadataFile = (entry: unknown) => {\n const record = getObjectValue(entry);\n if (!record) return null;\n\n const rawPath = getStringValue(record.filePath) ?? getStringValue(record.relativePath) ?? getStringValue(record.path);\n if (!rawPath) return null;\n\n return {\n filePath: normalizeFilePath(rawPath),\n additions: typeof record.additions === \"number\" ? record.additions : 0,\n deletions: typeof record.deletions === \"number\" ? record.deletions : 0,\n diff: getStringValue(record.diff) ?? undefined,\n before: getStringValue(record.before) ?? undefined,\n after: getStringValue(record.after) ?? undefined,\n } satisfies ApplyPatchMetadataFile;\n};\n\nexport const getApplyPatchMetadataFiles = (invocation: ToolPart) => {\n const files: ApplyPatchMetadataFile[] = [];\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const entries = Array.isArray(metadata.files) ? metadata.files : [];\n\n for (const entry of entries) {\n const parsedFile = parseApplyPatchMetadataFile(entry);\n if (!parsedFile) continue;\n files.push(parsedFile);\n }\n }\n\n return files;\n};\n\nexport const getApplyPatchDiffText = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n const inputDiff = getStringValue(input?.diff);\n if (inputDiff) return inputDiff;\n\n for (const metadata of getApplyPatchMetadataObjects(invocation)) {\n const metadataDiff = getStringValue(metadata.diff);\n if (metadataDiff) return metadataDiff;\n }\n\n const fileDiffs = getApplyPatchMetadataFiles(invocation)\n .map((file) => file.diff)\n .filter((diff): diff is string => Boolean(diff));\n if (fileDiffs.length > 0) return fileDiffs.join(\"\\n\");\n\n const patchText = getStringValue(input?.patchText);\n if (patchText && isUnifiedDiff(patchText)) return patchText;\n\n return null;\n};\n\nexport const buildApplyPatchMetadataTitleSegments = (files: ApplyPatchMetadataFile[]) => {\n const seen = new Set<string>();\n const segments: TitleSegment[] = [];\n\n for (const file of files) {\n if (seen.has(file.filePath)) continue;\n seen.add(file.filePath);\n\n segments.push({\n kind: \"diff\",\n fileName: basenameSafe(file.filePath),\n filePath: file.filePath,\n additions: file.additions,\n deletions: file.deletions,\n });\n }\n\n return segments;\n};\n\nexport const getApplyPatchMetadataReferences = (files: ApplyPatchMetadataFile[]) => {\n return Array.from(new Set(files.map((file) => file.filePath)));\n};\n\nexport const getOutputText = (invocation: ToolPart) => {\n const outputObject = getOutputObject(invocation);\n\n return (\n getStringValue(invocation.state?.output) ??\n getStringValue(outputObject?.returnDisplay) ??\n getStringValue(outputObject?.preview) ??\n getStringValue(outputObject?.stdout) ??\n getStringValue(outputObject?.content)\n );\n};\n\nexport const parseSkillContentBlock = (value: string) => {\n const match = value.match(/<skill_content(?:\\s+name=\"([^\"]+)\")?>([\\s\\S]*?)<\\/skill_content>/);\n if (!match) return null;\n\n return {\n skillName: getStringValue(match[1]) ?? undefined,\n content: getStringValue(match[2]) ?? \"\",\n };\n};\n\nexport const getSkillName = (invocation: ToolPart) => {\n const input = getInputObject(invocation);\n return (\n getStringValue(input?.name) ??\n getStringValue(input?.skillName) ??\n getStringValue(input?.skill) ??\n getStringValue(input?.skill_name) ??\n undefined\n );\n};\n\nexport const buildFileLinkSegment = (filePath: string): TitleSegment => {\n return {\n kind: \"link\",\n text: basenameSafe(filePath),\n filePath,\n };\n};\n\nexport const prependErrorBlock = (invocation: ToolPart, blocks: Block[]): Block[] => {\n if (!isErrorState(invocation) || !invocation.state?.errorText) return blocks;\n const errorBlock: Block = { type: \"comment\", text: invocation.state.errorText };\n return [errorBlock, ...blocks];\n};\n\nexport const getDiffBlocks = (diffText?: string | null) => {\n return buildFileDiffPreviews(diffText ?? undefined).map((preview) => ({\n type: \"diff\",\n language: \"diff\",\n original: preview.original,\n modified: preview.modified,\n sideBySide: false,\n })) satisfies Block[];\n};\n\nexport const getDiffTitleSegments = (diffText?: string | null) => buildDiffTitleSegments(diffText ?? undefined);\n\nexport const getDiffReferences = (diffText?: string | null) => extractDiffFilePaths(diffText ?? undefined);\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildApplyPatchMetadataTitleSegments,\n buildBaseTitle,\n buildIndicator,\n getApplyPatchDiffText,\n getApplyPatchMetadataFiles,\n getApplyPatchMetadataReferences,\n getDiffBlocks,\n getDiffReferences,\n getDiffTitleSegments,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderApplyPatch: ToolRenderer = (invocation) => {\n const diffText = getApplyPatchDiffText(invocation);\n const metadataFiles = getApplyPatchMetadataFiles(invocation);\n\n const title = buildBaseTitle(invocation, undefined, \"Apply patch\");\n const diffSegments = getDiffTitleSegments(diffText);\n if (diffSegments.length > 0) {\n title.push(...diffSegments);\n } else {\n title.push(...buildApplyPatchMetadataTitleSegments(metadataFiles));\n }\n\n const blocks: Block[] = [...getDiffBlocks(diffText)];\n\n if (blocks.length === 0) {\n for (const file of metadataFiles) {\n if (!file.before && !file.after) continue;\n blocks.push({\n type: \"diff\",\n language: \"diff\",\n original: file.before ?? \"\",\n modified: file.after ?? \"\",\n sideBySide: false,\n });\n }\n }\n\n if (blocks.length === 0) {\n const references = getDiffReferences(diffText);\n if (references.length === 0) {\n references.push(...getApplyPatchMetadataReferences(metadataFiles));\n }\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getDiffBlocks,\n getInputObject,\n getOutputObject,\n getStringValue,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nconst buildEditDiff = (original: string, modified: string) => {\n return [\n {\n type: \"diff\",\n language: \"text\",\n original,\n modified,\n sideBySide: false,\n },\n ] satisfies Block[];\n};\n\nexport const renderEdit: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(output?.filePath) ??\n undefined;\n\n const original = getStringValue(output?.oldString) ?? getStringValue(input?.old_string) ?? undefined;\n const modified = getStringValue(output?.newString) ?? getStringValue(input?.new_string) ?? undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Edit file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n const diffBlocks =\n original !== undefined && modified !== undefined\n ? buildEditDiff(original, modified)\n : getDiffBlocks(getStringValue(output?.diff));\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, diffBlocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../agent-types\";\nimport type {\n Block,\n Item,\n QuestionFormBlockOption,\n QuestionFormBlockQuestion,\n TitleSegment,\n} from \"../components/timeline\";\nimport type { ToolRenderer } from \"./types\";\n\ntype QuestionRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst parseJsonObjectText = (value: string) => {\n try {\n const parsed: unknown = JSON.parse(value);\n return isRecord(parsed) ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst toInputRecord = (input: unknown) => {\n if (isRecord(input)) return input;\n\n if (typeof input === \"string\" && input.trim().length > 0) {\n return parseJsonObjectText(input);\n }\n\n return null;\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getResponseText = (value: unknown): string | null => {\n const stringValue = getStringValue(value);\n if (stringValue) return stringValue;\n\n if (Array.isArray(value)) {\n const lines = value.map(getResponseText).filter((line): line is string => line !== null);\n return lines.length > 0 ? lines.join(\"\\n\") : null;\n }\n\n if (!isRecord(value)) return null;\n\n return (\n getResponseText(value.response) ??\n getResponseText(value.answer) ??\n getResponseText(value.text) ??\n getResponseText(value.answers)\n );\n};\n\nconst parseQuestionOption = (value: unknown): QuestionFormBlockOption | null => {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return { label: value, description: undefined };\n }\n\n if (!isRecord(value)) return null;\n const label = getStringValue(value.label);\n if (!label) return null;\n\n return {\n label,\n description: getStringValue(value.description) ?? undefined,\n };\n};\n\nconst parseQuestion = (value: unknown, index: number): QuestionFormBlockQuestion | null => {\n if (!isRecord(value)) return null;\n\n const question = getStringValue(value.question);\n if (!question) return null;\n\n const options = Array.isArray(value.options)\n ? value.options.map(parseQuestionOption).filter((option): option is QuestionFormBlockOption => option !== null)\n : [];\n const type = getStringValue(value.type);\n const allowCustomAnswer =\n typeof value.custom === \"boolean\"\n ? value.custom\n : typeof value.allowCustomAnswer === \"boolean\"\n ? value.allowCustomAnswer\n : type === \"freeform\" || type === \"text\";\n\n if (options.length === 0 && !allowCustomAnswer) return null;\n\n return {\n id: getStringValue(value.id) ?? `question-${index}`,\n question,\n options,\n multiple:\n typeof value.multiple === \"boolean\" ? value.multiple : type === \"multi_choice\" || type === \"multiple_choice\",\n required: typeof value.required === \"boolean\" ? value.required : false,\n allowCustomAnswer,\n };\n};\n\nconst parseQuestionBlock = (input: unknown) => {\n const record = toInputRecord(input);\n if (!record || !Array.isArray(record.questions)) return null;\n\n const questions = record.questions.map(parseQuestion).filter((question): question is QuestionFormBlockQuestion => {\n return question !== null;\n });\n if (questions.length === 0) return null;\n\n return {\n type: \"question-form\",\n questions,\n } satisfies Block;\n};\n\nexport const createQuestionRenderer = (deps: QuestionRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const responseText = getResponseText(invocation.state?.output) ?? getResponseText(invocation.state?.metadata);\n const block = parseQuestionBlock(invocation.state?.input);\n if (!responseText && !block) return null;\n\n const fieldLabel = block ? `${block.questions.length} field${block.questions.length === 1 ? \"\" : \"s\"}` : undefined;\n const blocks = responseText ? [] : [block!];\n\n return {\n indicator: buildIndicator(invocation),\n title: buildBaseTitle(invocation, fieldLabel, \"Question\"),\n blocks: prependErrorBlock(invocation, blocks),\n expandable: false,\n } satisfies Item;\n };\n};\n","import type { Block, Item } from \"../components/timeline\";\nimport {\n buildBaseTitle,\n buildFileLinkSegment,\n buildIndicator,\n getInputObject,\n getOutputObject,\n getOutputText,\n getSkillName,\n getStringValue,\n parseSkillContentBlock,\n prependErrorBlock,\n} from \"./shared\";\nimport type { ToolRenderer } from \"./types\";\n\nexport const renderRead: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n\n const filePath =\n getStringValue(input?.filePath) ??\n getStringValue(input?.file_path) ??\n getStringValue(input?.file) ??\n getStringValue(output?.filePath) ??\n getStringValue(output?.file) ??\n getStringValue(output?.path) ??\n undefined;\n\n const title = buildBaseTitle(invocation, undefined, \"Read file\");\n if (filePath) {\n title.push(buildFileLinkSegment(filePath));\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, []),\n } satisfies Item;\n};\n\nexport const renderBash: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const output = getOutputObject(invocation);\n const command = getStringValue(input?.command) ?? undefined;\n\n const title = buildBaseTitle(invocation, command, \"Run command\");\n const blocks: Block[] = [];\n\n const outputText = getOutputText(invocation);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: outputText });\n }\n\n const stderr = getStringValue(output?.stderr);\n if (stderr && stderr !== outputText) {\n blocks.push({ type: \"code\", language: \"text\", code: stderr });\n }\n\n if (typeof output?.exitCode === \"number\") {\n blocks.push({ type: \"text\", text: `Exit code: ${output.exitCode}` });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderGrep: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const query = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, query, \"Search files\");\n const blocks: Block[] = outputText ? [{ type: \"code\", language: \"text\", code: outputText }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderGlob: ToolRenderer = (invocation) => {\n const input = getInputObject(invocation);\n const outputText = getOutputText(invocation);\n const pattern = getStringValue(input?.pattern) ?? undefined;\n\n const title = buildBaseTitle(invocation, pattern, \"Find files\");\n const blocks: Block[] = [];\n\n if (outputText) {\n const references = outputText\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (references.length > 0) {\n blocks.push({ type: \"references\", references });\n }\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n\nexport const renderSkill: ToolRenderer = (invocation) => {\n const outputText = getOutputText(invocation);\n const parsedOutput = outputText ? parseSkillContentBlock(outputText) : null;\n\n const skillName = getSkillName(invocation) ?? parsedOutput?.skillName;\n const title = buildBaseTitle(invocation, skillName, \"Load skill\");\n\n const renderedContent = parsedOutput?.content ?? outputText;\n const blocks: Block[] = renderedContent ? [{ type: \"code\", language: \"markdown\", code: renderedContent }] : [];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n};\n","import type { ToolPart } from \"../agent-types\";\nimport type { Block, Item, TitleSegment } from \"../components/timeline\";\nimport type { ToolRenderer } from \"./types\";\n\ntype TodoItem = {\n label: string;\n checked: boolean;\n};\n\ntype TodowriteRendererDependencies = {\n buildBaseTitle: (invocation: ToolPart, detail?: string, labelOverride?: string) => TitleSegment[];\n buildIndicator: (invocation: ToolPart) => Item[\"indicator\"];\n prependErrorBlock: (invocation: ToolPart, blocks: Block[]) => Block[];\n};\n\nconst getStringValue = (value: unknown) => {\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n return null;\n};\n\nconst getObjectValue = (value: unknown) => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n};\n\nconst parseTodoItem = (value: unknown): TodoItem | null => {\n const todo = getObjectValue(value);\n if (!todo) return null;\n\n const content = getStringValue(todo.content) ?? getStringValue(todo.title);\n if (!content) return null;\n const status = getStringValue(todo.status);\n\n return {\n label: content,\n checked: status === \"completed\",\n };\n};\n\nconst parseTodoItems = (value: unknown) => {\n if (!value) return { items: [], explicit: false };\n\n const listSource = (() => {\n if (Array.isArray(value)) return value;\n const objectValue = getObjectValue(value);\n if (!objectValue || !Array.isArray(objectValue.todos)) return null;\n return objectValue.todos;\n })();\n\n if (!listSource) return { items: [], explicit: false };\n\n return {\n items: listSource.map(parseTodoItem).filter((todo): todo is TodoItem => todo !== null),\n explicit: true,\n };\n};\n\nexport const createTodowriteRenderer = (deps: TodowriteRendererDependencies): ToolRenderer => {\n const { buildBaseTitle, buildIndicator, prependErrorBlock } = deps;\n\n return (invocation) => {\n const inputTodos = parseTodoItems(invocation.state?.input);\n const outputTodos = parseTodoItems(invocation.state?.output);\n const todoState = outputTodos.explicit ? outputTodos : inputTodos;\n if (!todoState.explicit) return null;\n\n const todos = todoState.items;\n const countLabel = `${todos.length} item${todos.length === 1 ? \"\" : \"s\"}`;\n const title = buildBaseTitle(invocation, countLabel, \"Update todos\");\n\n if (todos.length === 0) {\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, [{ type: \"comment\", text: \"No todos\" }]),\n } satisfies Item;\n }\n\n const blocks: Block[] = [\n {\n type: \"todo-list\",\n items: todos,\n },\n ];\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: prependErrorBlock(invocation, blocks),\n } satisfies Item;\n };\n};\n","import { renderApplyPatch } from \"./apply-patch-renderer\";\nimport { renderEdit } from \"./edit-renderer\";\nimport { createQuestionRenderer } from \"./question-renderer\";\nimport { buildBaseTitle, buildIndicator, prependErrorBlock } from \"./shared\";\nimport { renderBash, renderGlob, renderGrep, renderRead, renderSkill } from \"./standard-renderers\";\nimport { createTodowriteRenderer } from \"./todowrite-renderer\";\nimport type { ToolRenderersMap } from \"./types\";\n\nconst renderQuestion = createQuestionRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nconst renderTodowrite = createTodowriteRenderer({\n buildBaseTitle,\n buildIndicator,\n prependErrorBlock,\n});\n\nexport const createDefaultToolRenderers = () => {\n return {\n apply_patch: renderApplyPatch,\n bash: renderBash,\n edit: renderEdit,\n glob: renderGlob,\n grep: renderGrep,\n question: renderQuestion,\n read: renderRead,\n skill: renderSkill,\n todo_write: renderTodowrite,\n todowrite: renderTodowrite,\n } satisfies ToolRenderersMap;\n};\n","import type { ToolPart } from \"../agent-types\";\nimport type { Block, TitleSegment } from \"../components/timeline\";\nimport { toolTypeToIconName } from \"../utils/get-icon\";\nimport { getToolNameLookupKeys, normalizeToolName } from \"../utils/tool-name\";\nimport { createDefaultToolRenderers } from \"./default-renderers\";\nimport type { ToolRenderersMap, ToolTimelineBuilderOptions } from \"./types\";\n\nconst STATE_LABELS: Record<string, string> = {\n pending: \"queued\",\n error: \"failed\",\n \"output-error\": \"failed\",\n \"input-streaming\": \"running\",\n \"input-available\": \"queued\",\n};\n\nconst toTitleCase = (value: string) => {\n return value\n .split(\" \")\n .filter((token) => token.length > 0)\n .map((token) => token[0].toUpperCase() + token.slice(1))\n .join(\" \");\n};\n\nconst getToolLabel = (tool?: string) => {\n const normalized = normalizeToolName(tool ?? \"tool\").replace(/_/g, \" \");\n return toTitleCase(normalized);\n};\n\nconst isErrorState = (state?: string) => state === \"error\" || state === \"output-error\";\n\nconst buildIndicator = (invocation: ToolPart) => {\n if (isErrorState(invocation.state?.status)) {\n return { type: \"icon\", icon: \"danger\" } as const;\n }\n\n return { type: \"icon\", icon: toolTypeToIconName(invocation.tool ?? \"tool\") } as const;\n};\n\nconst getStateLabel = (state?: unknown) => {\n if (!state || typeof state !== \"string\") return null;\n if (STATE_LABELS[state]) return STATE_LABELS[state];\n if (state.includes(\"stream\")) return \"running\";\n return null;\n};\n\nconst stringifyValue = (value: unknown) => {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return null;\n\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return null;\n }\n};\n\nconst buildGenericBlocks = (invocation: ToolPart): Block[] => {\n const blocks: Block[] = [];\n\n if (isErrorState(invocation.state?.status) && invocation.state?.errorText) {\n blocks.push({ type: \"comment\", text: invocation.state.errorText });\n }\n\n const inputText = stringifyValue(invocation.state?.input);\n if (inputText) {\n blocks.push({ type: \"code\", language: \"json\", code: inputText });\n }\n\n const outputText = stringifyValue(invocation.state?.output);\n if (outputText) {\n blocks.push({ type: \"code\", language: \"json\", code: outputText });\n }\n\n return blocks;\n};\n\nconst createGenericItem = (invocation: ToolPart) => {\n const title: TitleSegment[] = [{ kind: \"text\", text: getToolLabel(invocation.tool), bold: true }];\n const stateLabel = getStateLabel(invocation.state?.status);\n if (stateLabel) {\n title.push({ kind: \"text\", text: stateLabel, muted: true });\n }\n\n return {\n indicator: buildIndicator(invocation),\n title,\n blocks: buildGenericBlocks(invocation),\n };\n};\n\nconst mergeToolRenderers = (overrides?: ToolRenderersMap) => {\n if (!overrides) return createDefaultToolRenderers();\n return { ...createDefaultToolRenderers(), ...overrides } satisfies ToolRenderersMap;\n};\n\nconst getRenderer = (invocation: ToolPart, toolRenderers: ToolRenderersMap) => {\n const rawTool = invocation.tool ?? \"tool\";\n for (const key of getToolNameLookupKeys(rawTool)) {\n const renderer = toolRenderers[key];\n if (renderer) return renderer;\n }\n\n return undefined;\n};\n\nconst renderInvocation = (\n invocation: ToolPart,\n toolRenderers: ToolRenderersMap,\n options?: ToolTimelineBuilderOptions,\n) => {\n const renderer = getRenderer(invocation, toolRenderers);\n if (renderer) {\n const rendered = renderer(invocation, options);\n if (rendered) return rendered;\n }\n\n return createGenericItem(invocation);\n};\n\nexport const buildTimelineDocFromInvocations = (invocations: ToolPart[], options?: ToolTimelineBuilderOptions) => {\n const toolRenderers = mergeToolRenderers(options?.toolRenderers);\n const items = invocations.map((invocation) => renderInvocation(invocation, toolRenderers, options));\n\n return { items };\n};\n\nexport const createToolTimelineBuilder = (toolRenderers: ToolRenderersMap) => {\n return (invocations: ToolPart[], options?: ToolTimelineBuilderOptions) => {\n return buildTimelineDocFromInvocations(invocations, { ...options, toolRenderers });\n };\n};\n","import { Avatar, Box, Button, Card, Timeline as ChakraTimeline, Link, Span, Stack, Text } from \"@chakra-ui/react\";\nimport { ChevronUpIcon } from \"lucide-react\";\nimport type { MouseEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\nimport { DiffEditor } from \"@/components/diff-viewer/diff-editor\";\nimport { ResourceBadge } from \"@/components/resource-badge\";\nimport { ScrollArea } from \"@/components/scroll-area\";\nimport type { IconName } from \"../utils/get-icon\";\nimport { getIconComponent } from \"../utils/get-icon\";\nimport { QuestionFormBlockView, TodoListBlockView } from \"./timeline-tool-blocks\";\n\nexport const Timeline = ChakraTimeline;\n\nexport type TimelineDoc = {\n items: Item[];\n};\n\nexport type Item = {\n id?: string;\n timestamp?: string;\n indicator?: Indicator;\n title: TitleSegment[];\n blocks?: Block[];\n expandable?: boolean;\n};\n\nexport type Indicator =\n | { type: \"icon\"; icon: IconName; color?: string }\n | { type: \"avatar\"; src: string; alt?: string }\n | { type: \"none\" };\n\nexport type TitleSegment =\n | { kind: \"text\"; text: string; bold?: boolean; muted?: boolean }\n | { kind: \"avatar\"; src: string; alt?: string }\n | { kind: \"diff\"; fileName: string; filePath?: string; additions?: number; deletions?: number }\n | {\n kind: \"link\";\n text: string;\n href?: string;\n filePath?: string;\n bold?: boolean;\n muted?: boolean;\n variant?: \"default\" | \"bubble\";\n };\n\nexport type TodoListBlockItem = {\n label: string;\n checked: boolean;\n};\n\nexport type QuestionFormBlockOption = {\n label: string;\n description?: string;\n};\n\nexport type QuestionFormBlockQuestion = {\n id?: string;\n question: string;\n options: QuestionFormBlockOption[];\n multiple: boolean;\n required: boolean;\n allowCustomAnswer: boolean;\n};\n\nexport type Block =\n | { type: \"comment\"; text: string; reactions?: { clap?: number } }\n | { type: \"code\"; language: string; code: string; editable?: boolean }\n | { type: \"diff\"; language?: string; original: string; modified: string; sideBySide?: boolean }\n | { type: \"input\"; placeholder?: string }\n | { type: \"text\"; text: string }\n | { type: \"todo-list\"; items: TodoListBlockItem[] }\n | { type: \"question-form\"; questions: QuestionFormBlockQuestion[] }\n | { type: \"references\"; references: string[] }\n | { type: \"component\"; render: (ctx: { onOpenFile?: (filePath: string) => void }) => ReactNode };\n\nconst handleTitleLinkClick = (\n event: MouseEvent<HTMLAnchorElement>,\n seg: Extract<TitleSegment, { kind: \"link\" }>,\n onOpenFile?: (filePath: string) => void,\n stopPropagation = false,\n) => {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n if (!seg.href) {\n event.preventDefault();\n }\n if (seg.filePath) {\n onOpenFile?.(seg.filePath);\n }\n};\n\nfunction AvatarTitleSegment({ seg }: { seg: Extract<TitleSegment, { kind: \"avatar\" }> }) {\n return (\n <Avatar.Root width=\"1.5rem\" height=\"1.5rem\">\n <Avatar.Image src={seg.src} alt={seg.alt} />\n <Avatar.Fallback />\n </Avatar.Root>\n );\n}\n\nfunction DiffTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"diff\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <DiffBubble\n fileName={seg.fileName}\n additions={seg.additions ?? 0}\n deletions={seg.deletions ?? 0}\n onClickFileLink={() => {\n const path = seg.filePath ?? seg.fileName;\n onOpenFile?.(path);\n }}\n />\n );\n}\n\nfunction BubbleLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n const isInteractive = Boolean(seg.href || seg.filePath);\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"fg.muted\"}\n textDecoration=\"none\"\n cursor={isInteractive ? \"pointer\" : \"default\"}\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile, true)}\n _hover={{\n textDecoration: \"underline\",\n color: seg.muted ? \"fg.muted\" : \"fg.blue-dark\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction DefaultLinkTitleSegment({\n seg,\n onOpenFile,\n}: {\n seg: Extract<TitleSegment, { kind: \"link\" }>;\n onOpenFile?: (filePath: string) => void;\n}) {\n const fontWeight = seg.bold ? \"medium\" : undefined;\n\n return (\n <Link\n href={seg.href ?? \"#\"}\n fontWeight={fontWeight}\n color={seg.muted ? \"fg.muted\" : \"accent.primary\"}\n textDecoration=\"underline\"\n onClick={(event) => handleTitleLinkClick(event, seg, onOpenFile)}\n _hover={{\n color: seg.muted ? \"fg.muted\" : \"accent.primary\",\n textDecoration: \"underline\",\n }}\n >\n {seg.text}\n </Link>\n );\n}\n\nfunction TextTitleSegment({\n seg,\n isClickable,\n}: {\n seg: Extract<TitleSegment, { kind: \"text\" }>;\n isClickable?: boolean;\n}) {\n return (\n <Span\n fontWeight={seg.bold ? \"medium\" : undefined}\n color=\"fg.muted\"\n _groupHover={{\n color: isClickable && !seg.muted ? \"fg\" : \"fg.muted\",\n }}\n >\n {seg.text}\n </Span>\n );\n}\n\nfunction TitleInline({\n seg,\n isClickable,\n onOpenFile,\n}: {\n seg: TitleSegment;\n isClickable?: boolean;\n onOpenFile?: (filePath: string) => void;\n}) {\n switch (seg.kind) {\n case \"avatar\":\n return <AvatarTitleSegment seg={seg} />;\n case \"diff\":\n return <DiffTitleSegment seg={seg} onOpenFile={onOpenFile} />;\n case \"link\":\n return seg.variant === \"bubble\" ? (\n <BubbleLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n ) : (\n <DefaultLinkTitleSegment seg={seg} onOpenFile={onOpenFile} />\n );\n case \"text\":\n return <TextTitleSegment seg={seg} isClickable={isClickable} />;\n default:\n return null;\n }\n}\n\nfunction IndicatorView({ ind }: { ind?: Indicator }) {\n if (!ind || ind.type === \"none\") return null;\n\n if (ind.type === \"icon\") {\n const IndicatorIcon = getIconComponent(ind.icon);\n return (\n <Timeline.Indicator outline=\"none\" shadow=\"none\" border=\"none\" background=\"bg\" color=\"fg\">\n <Span display=\"inline-flex\" alignItems=\"center\">\n <IndicatorIcon size={14} strokeWidth={1} />\n </Span>\n </Timeline.Indicator>\n );\n }\n\n return (\n <Timeline.Indicator>\n <Avatar.Root boxSize=\"full\">\n <Avatar.Image src={ind.src} alt={ind.alt} />\n <Avatar.Fallback />\n </Avatar.Root>\n </Timeline.Indicator>\n );\n}\n\nfunction CodeBlock({ code, language }: { code: string; language?: string }) {\n return (\n <ScrollArea background=\"bg.code\" color=\"fg\" borderRadius=\"md\" showHorizontalScrollbar showVerticalScrollbar={false}>\n <Box\n as=\"pre\"\n padding=\"sm\"\n fontFamily=\"mono\"\n fontSize=\"xs\"\n lineHeight=\"shorter\"\n whiteSpace=\"pre\"\n aria-label={language ? `${language} code block` : \"code block\"}\n >\n <Box as=\"code\">{code}</Box>\n </Box>\n </ScrollArea>\n );\n}\n\nfunction BlockView({ b, onOpenFile }: { b: Block; onOpenFile?: (filePath: string) => void }) {\n switch (b.type) {\n case \"comment\":\n return (\n <Card.Root>\n <Card.Body>{b.text}</Card.Body>\n {b.reactions?.clap ? (\n <Card.Footer>\n <Button>👏 {b.reactions.clap}</Button>\n </Card.Footer>\n ) : null}\n </Card.Root>\n );\n case \"code\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <CodeBlock language={b.language} code={b.code} />\n </Card.Body>\n </Card.Root>\n );\n case \"diff\":\n return (\n <Card.Root border=\"0\" padding=\"0\">\n <Card.Body padding=\"0\">\n <Box height=\"240px\" minW=\"320px\" overflow=\"hidden\">\n <DiffEditor\n original={b.original}\n modified={b.modified}\n language={b.language}\n sideBySide={b.sideBySide ?? false}\n disableScroll={true}\n />\n </Box>\n </Card.Body>\n </Card.Root>\n );\n case \"text\":\n return (\n <Card.Root background=\"transparent\">\n <Card.Body padding=\"sm\">\n <Text textStyle=\"label/S/regular\">{b.text}</Text>\n </Card.Body>\n </Card.Root>\n );\n case \"todo-list\":\n return <TodoListBlockView items={b.items} />;\n case \"question-form\":\n return <QuestionFormBlockView questions={b.questions} />;\n case \"references\":\n return (\n <Stack mt=\"xs\" gap=\"xs\" flexDir=\"row\" flexWrap=\"wrap\">\n {b.references.map((ref) => (\n <ResourceBadge key={ref} fileName={ref} />\n ))}\n </Stack>\n );\n case \"component\":\n return <>{b.render({ onOpenFile })}</>;\n }\n}\n\nfunction TimelineItemRow({\n item,\n itemKey,\n isOpen,\n canExpand,\n hasBlocks,\n onToggle,\n onOpenFile,\n}: {\n item: Item;\n itemKey: string;\n isOpen: boolean;\n canExpand: boolean;\n hasBlocks: boolean;\n onToggle: (key: string) => void;\n onOpenFile?: (filePath: string) => void;\n}) {\n return (\n <Timeline.Item gap=\"xs\" key={itemKey}>\n <Timeline.Connector>\n <Timeline.Separator />\n <IndicatorView ind={item.indicator} />\n </Timeline.Connector>\n <Timeline.Content pb=\"xs\" h={isOpen ? \"auto\" : \"20px\"} overflow=\"hidden\">\n {item.title.length > 0 && (\n <Timeline.Title\n className=\"group\"\n fontWeight=\"normal\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n cursor={canExpand ? \"pointer\" : \"default\"}\n onClick={canExpand ? () => onToggle(itemKey) : undefined}\n >\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"sm\" flexWrap=\"wrap\">\n <Span display=\"inline-flex\" alignItems=\"center\" gap=\"xs\" flexWrap=\"wrap\">\n {item.title.map((seg, i) => (\n <TitleInline key={i} seg={seg} isClickable={canExpand} onOpenFile={onOpenFile} />\n ))}\n </Span>\n {canExpand ? (\n <Span\n display=\"inline-flex\"\n alignItems=\"center\"\n transition=\"transform 200ms ease, color 200ms ease\"\n transform={isOpen ? \"rotate(0deg)\" : \"rotate(-180deg)\"}\n color=\"transparent\"\n _groupHover={{ color: \"fg\" }}\n >\n <ChevronUpIcon size={12} />\n </Span>\n ) : null}\n </Span>\n </Timeline.Title>\n )}\n {hasBlocks ? (\n <Box display=\"grid\" gridTemplateRows={isOpen ? \"1fr\" : \"0fr\"} transition=\"grid-template-rows 220ms ease\">\n {isOpen ? (\n <Box\n overflow=\"hidden\"\n opacity={1}\n transform=\"translateY(0)\"\n transition=\"opacity 200ms ease, transform 200ms ease\"\n >\n {item.blocks!.map((block, i) => (\n <Box key={i}>\n <BlockView b={block} onOpenFile={onOpenFile} />\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n ) : null}\n </Timeline.Content>\n </Timeline.Item>\n );\n}\n\nexport function TimelineFromJSON({ data, onOpenFile }: { data: TimelineDoc; onOpenFile?: (filePath: string) => void }) {\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n\n const getKey = (it: Item, idx: number) => (it.id ? `id:${it.id}` : `idx:${idx}`);\n\n const toggle = (key: string) => {\n setExpanded((prev) => ({ ...prev, [key]: !prev[key] }));\n };\n\n return (\n <Timeline.Root>\n {data.items.map((item, idx) => {\n const key = getKey(item, idx);\n const hasBlocks = (item.blocks?.length ?? 0) > 0;\n const canExpand = (item.expandable ?? true) && hasBlocks;\n const isOpen = canExpand ? (expanded[key] ?? false) : hasBlocks;\n\n return (\n <TimelineItemRow\n key={key}\n item={item}\n itemKey={key}\n isOpen={isOpen}\n canExpand={canExpand}\n hasBlocks={hasBlocks}\n onToggle={toggle}\n onOpenFile={onOpenFile}\n />\n );\n })}\n </Timeline.Root>\n );\n}\n","import { buildTimelineDocFromInvocations } from \"../tool-rendering\";\nimport { normalizeToolName } from \"../utils/tool-name\";\nimport type { ToolPart } from \"./message-types\";\nimport { TimelineFromJSON } from \"./timeline\";\n\nexport interface ToolInvocationTimelineProps {\n invocations: ToolPart[];\n labeledBlocks?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n}\n\nconst isQuestionTool = (invocation: ToolPart) =>\n normalizeToolName(invocation.tool ?? \"\").replace(/_/g, \"\") === \"question\";\n\nconst hasToolOutput = (invocation: ToolPart) => {\n const output = invocation.state?.output;\n if (typeof output === \"string\") return output.trim().length > 0;\n if (Array.isArray(output)) return output.length > 0;\n if (output && typeof output === \"object\") return Object.keys(output).length > 0;\n return output !== undefined && output !== null;\n};\n\nexport function ToolInvocationTimeline(props: ToolInvocationTimelineProps) {\n const { invocations, labeledBlocks, hideQuestionForms = false, onOpenFile } = props;\n const visibleInvocations = hideQuestionForms\n ? invocations.filter((invocation) => !isQuestionTool(invocation) || hasToolOutput(invocation))\n : invocations;\n\n if (visibleInvocations.length === 0) return null;\n\n const data = buildTimelineDocFromInvocations(visibleInvocations, { labeledBlocks });\n\n return <TimelineFromJSON data={data} onOpenFile={onOpenFile} />;\n}\n","import { Box, Spinner, Text } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\nimport { AlertMessage } from \"@/components/alert\";\nimport { RichMessage } from \"@/components/rich-text\";\nimport type { AlertPart, ErrorPart, SessionMessage, SessionMessagePart, ToolPart } from \"../agent-types\";\nimport { Response } from \"./ai-response\";\nimport { ToolInvocationTimeline, type ToolInvocationTimelineProps } from \"./tool-invocation-timeline\";\n\ntype ToolInvocationTimelineComponent = (props: ToolInvocationTimelineProps) => ReactNode;\n\nexport interface MessagePartsProps {\n message: SessionMessage;\n streaming?: boolean;\n hideQuestionForms?: boolean;\n onOpenFile?: (filePath: string) => void;\n toolInvocationTimeline?: ToolInvocationTimelineComponent;\n}\n\nconst isToolPart = (part: SessionMessagePart): part is ToolPart => {\n return part.type === \"tool\";\n};\n\nconst formatTokenCount = (count: number) => {\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;\n return String(count);\n};\n\nconst getErrorMessage = (part: ErrorPart) => {\n if (part.message && part.message.trim().length > 0) {\n return part.message;\n }\n\n const { errorType } = part;\n switch (errorType) {\n case \"timeout\":\n return \"Session timed out.\";\n case \"crash\":\n return \"Session crashed unexpectedly.\";\n case \"permission\":\n return \"Permission denied.\";\n default:\n return \"An error occurred.\";\n }\n};\n\nconst ALERT_COLOR_PALETTE: Record<AlertPart[\"status\"], string> = {\n info: \"blue\",\n warning: \"orange\",\n error: \"red\",\n success: \"green\",\n loading: \"blue\",\n};\n\nconst collectToolInvocations = (parts: SessionMessagePart[], startIndex: number) => {\n const invocations: ToolPart[] = [];\n let lookahead = startIndex;\n\n while (lookahead < parts.length) {\n const nextPart = parts[lookahead];\n if (!isToolPart(nextPart)) break;\n invocations.push(nextPart);\n lookahead += 1;\n }\n\n return { invocations, nextIndex: lookahead - 1 };\n};\n\nexport function MessagePartsRenderer(props: MessagePartsProps) {\n const { message, hideQuestionForms = false, onOpenFile, toolInvocationTimeline } = props;\n const RenderToolInvocationTimeline = toolInvocationTimeline ?? ToolInvocationTimeline;\n const parts = message.parts ?? [];\n const nodes: ReactNode[] = [];\n\n for (let partIndex = 0; partIndex < parts.length; partIndex += 1) {\n const part = parts[partIndex];\n const key = `${message.id}-${partIndex}`;\n\n switch (part.type) {\n case \"text\":\n nodes.push(\n <div key={key}>\n <Response>{part.text}</Response>\n </div>,\n );\n break;\n case \"reasoning\":\n nodes.push(\n <Box\n key={key}\n padding=\"0\"\n css={{\n \"& .rich-text, & .rich-text *\": {\n color: \"fg.subtle !important\",\n fontSize: \".75rem !important\",\n fontWeight: \"normal !important\",\n },\n }}\n >\n <RichMessage defaultState={part.text} fullWidth />\n </Box>,\n );\n break;\n case \"tool\": {\n const { invocations, nextIndex } = collectToolInvocations(parts, partIndex);\n partIndex = nextIndex;\n nodes.push(\n <Box key={key} width=\"full\">\n <RenderToolInvocationTimeline\n invocations={invocations}\n labeledBlocks\n hideQuestionForms={hideQuestionForms}\n onOpenFile={onOpenFile}\n />\n </Box>,\n );\n break;\n }\n case \"error\":\n nodes.push(\n <Box key={key} py=\"2\" width=\"full\">\n <AlertMessage borderRadius=\"xs\" status=\"error\" colorPalette=\"red\" title={getErrorMessage(part)} size=\"sm\" />\n </Box>,\n );\n break;\n case \"token_usage\":\n nodes.push(\n <Box key={key}>\n <Text fontSize=\"xs\" color=\"fg.subtle\">\n Tokens: {formatTokenCount(part.inputTokens)} in / {formatTokenCount(part.outputTokens)} out\n {part.cacheReadTokens ? ` / ${formatTokenCount(part.cacheReadTokens)} cache read` : \"\"}\n </Text>\n </Box>,\n );\n break;\n case \"alert\":\n nodes.push(\n <Box key={key} width=\"full\">\n <AlertMessage\n borderRadius=\"xs\"\n status={part.status === \"loading\" ? \"info\" : part.status}\n colorPalette={ALERT_COLOR_PALETTE[part.status]}\n title={part.title}\n icon={part.status === \"loading\" ? <Spinner size=\"sm\" /> : undefined}\n size=\"sm\"\n >\n {part.message}\n </AlertMessage>\n </Box>,\n );\n break;\n default:\n nodes.push(null);\n }\n }\n\n return <>{nodes}</>;\n}\n","import type { SessionMessage, SessionMessagePart, ToolPart } from \"../agent-types\";\n\nexport type { SessionMessage, SessionMessagePart, ToolPart };\n\nexport type MessageOrigin = \"user\" | \"assistant\" | \"developer\";\n\nexport const getMessageOrigin = (role: string): MessageOrigin => {\n if (role === \"user\" || role === \"assistant\" || role === \"developer\") return role;\n return \"assistant\";\n};\n\nexport const isReasoningToolOnlyMessage = (message: SessionMessage) => {\n const parts = message.parts ?? [];\n if (parts.length === 0) return false;\n\n const hasTextPart = parts.some((part) => part.type === \"text\" && \"text\" in part);\n if (hasTextPart) return false;\n\n return parts.some((part) => part.type === \"reasoning\" || part.type === \"tool\");\n};\n\nexport const mergeReasoningToolOnlyMessages = (messages: SessionMessage[]) => {\n const merged: SessionMessage[] = [];\n\n for (const message of messages) {\n const previous = merged[merged.length - 1];\n\n if (previous && previous.role === message.role && isReasoningToolOnlyMessage(message)) {\n previous.parts = [...(previous.parts ?? []), ...(message.parts ?? [])];\n continue;\n }\n\n merged.push({\n ...message,\n parts: [...(message.parts ?? [])],\n });\n }\n\n return merged;\n};\n\nexport interface MessageGroup {\n userMessage: SessionMessage;\n responses: SessionMessage[];\n}\n\n// Groups messages into turns: each group starts with a user message\n// followed by all non-user messages until the next user message.\nexport const groupMessagesByTurn = (messages: SessionMessage[]) => {\n const groups: MessageGroup[] = [];\n const leadingResponses: SessionMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"user\") {\n groups.push({ userMessage: message, responses: [] });\n } else if (groups.length > 0) {\n groups[groups.length - 1].responses.push(message);\n } else {\n leadingResponses.push(message);\n }\n }\n\n return { groups, leadingResponses };\n};\n","import { Box, Button, Flex } from \"@chakra-ui/react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { type ReactNode, useEffect, useRef, type WheelEvent } from \"react\";\nimport { useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { ChatMessage } from \"./ai-message\";\nimport {\n isStickyUserMessageCollapsible,\n STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT,\n STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT,\n shouldStopStickyUserMessageWheel,\n} from \"./chat-panel-sticky-user-message\";\nimport { MessageActionPanel } from \"./message-action-panel\";\nimport { MessagePartsRenderer } from \"./message-parts-renderer\";\nimport { getMessageOrigin, type MessageGroup, type SessionMessage } from \"./message-types\";\n\ninterface ChatMessageListProps {\n leadingResponses: SessionMessage[];\n groups: MessageGroup[];\n streaming: boolean;\n hideActiveQuestionForms: boolean;\n expandedStickyMessageIds: Set<string>;\n onToggleStickyMessage: (messageId: string) => void;\n onReady?: () => void;\n}\n\ninterface StickyMessageToggleProps {\n label: string;\n onClick: () => void;\n actionPanel?: ReactNode;\n}\n\ninterface StickyMessageGroupProps {\n group: MessageGroup;\n streaming: boolean;\n hideQuestionForms: boolean;\n isExpanded: boolean;\n onToggleStickyMessage: (messageId: string) => void;\n}\n\ntype ChatMessageListItem =\n | {\n type: \"leading-response\";\n key: string;\n message: SessionMessage;\n }\n | {\n type: \"group\";\n key: string;\n group: MessageGroup;\n groupIndex: number;\n };\n\nconst ESTIMATED_TURN_HEIGHT = 720;\nconst INITIAL_TAIL_VIEWPORT_HEIGHT = 1;\nconst TAIL_READY_STABLE_FRAME_COUNT = 3;\nconst TAIL_READY_FRAME_LIMIT = 20;\nconst TAIL_READY_PIXEL_EPSILON = 1;\nconst VIRTUAL_LIST_OVERSCAN = 4;\nconst VIRTUAL_LIST_GAP = 8;\n\nconst buildMessageListItems = (leadingResponses: SessionMessage[], groups: MessageGroup[]) => [\n ...leadingResponses.map((message) => ({\n type: \"leading-response\" as const,\n key: message.id,\n message,\n })),\n ...groups.map((group, groupIndex) => ({\n type: \"group\" as const,\n key: group.userMessage.id,\n group,\n groupIndex,\n })),\n];\n\nconst getEstimatedTailOffset = (count: number, viewportHeight: number) => {\n if (count === 0) return 0;\n\n const estimatedTotalSize = count * ESTIMATED_TURN_HEIGHT + (count - 1) * VIRTUAL_LIST_GAP;\n return Math.max(estimatedTotalSize - viewportHeight, 0);\n};\n\nconst getInitialViewportHeight = (scrollElement: HTMLElement | null) =>\n scrollElement?.clientHeight || INITIAL_TAIL_VIEWPORT_HEIGHT;\n\ninterface TailLayoutSnapshot {\n scrollTop: number;\n totalSize: number;\n}\n\nconst isTailLayoutStable = (current: TailLayoutSnapshot, previous: TailLayoutSnapshot) =>\n Math.abs(current.scrollTop - previous.scrollTop) <= TAIL_READY_PIXEL_EPSILON &&\n Math.abs(current.totalSize - previous.totalSize) <= TAIL_READY_PIXEL_EPSILON;\n\nconst readTailLayoutSnapshot = (scrollElement: HTMLElement | null, totalSize: number): TailLayoutSnapshot => ({\n scrollTop: scrollElement?.scrollTop ?? 0,\n totalSize,\n});\n\nconst useTailReady = (input: {\n itemCount: number;\n onReady?: () => void;\n scrollRef: { current: HTMLElement | null };\n totalSize: number;\n}) => {\n const { itemCount, onReady, scrollRef, totalSize } = input;\n const onReadyRef = useRef(onReady);\n\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n\n useEffect(() => {\n if (itemCount === 0 || typeof requestAnimationFrame === \"undefined\") {\n onReadyRef.current?.();\n return;\n }\n\n let frameId = 0;\n let checkedFrameCount = 0;\n let stableFrameCount = 0;\n let previousSnapshot: TailLayoutSnapshot | null = null;\n\n const waitForStableTail = () => {\n checkedFrameCount += 1;\n\n const nextSnapshot = readTailLayoutSnapshot(scrollRef.current, totalSize);\n stableFrameCount =\n previousSnapshot && isTailLayoutStable(nextSnapshot, previousSnapshot) ? stableFrameCount + 1 : 0;\n previousSnapshot = nextSnapshot;\n\n if (stableFrameCount >= TAIL_READY_STABLE_FRAME_COUNT || checkedFrameCount >= TAIL_READY_FRAME_LIMIT) {\n onReadyRef.current?.();\n return;\n }\n\n frameId = requestAnimationFrame(waitForStableTail);\n };\n\n frameId = requestAnimationFrame(waitForStableTail);\n\n return () => cancelAnimationFrame(frameId);\n }, [itemCount, scrollRef, totalSize]);\n};\n\nconst StickyMessageToggle = (props: StickyMessageToggleProps) => {\n const { label, onClick, actionPanel } = props;\n\n return (\n <Flex\n position=\"absolute\"\n bottom=\"0\"\n left=\"0\"\n right=\"0\"\n justifyContent={actionPanel ? \"space-between\" : \"flex-end\"}\n alignItems=\"flex-end\"\n px=\"xs\"\n pb=\"xs\"\n pt=\"lg\"\n bgGradient=\"to-t\"\n gradientFrom=\"bg.subtle\"\n gradientTo=\"transparent\"\n borderBottomRadius=\"xs\"\n pointerEvents=\"none\"\n >\n {actionPanel}\n <Button size=\"2xs\" variant=\"solid\" pointerEvents=\"auto\" onClick={onClick}>\n {label}\n </Button>\n </Flex>\n );\n};\n\nconst renderMessage = (message: SessionMessage, streaming: boolean, hideQuestionForms = false) => {\n const from = getMessageOrigin(message.role);\n\n return (\n <ChatMessage.Root from={from}>\n <ChatMessage.Content from={from}>\n <MessagePartsRenderer message={message} streaming={streaming} hideQuestionForms={hideQuestionForms} />\n {from === \"assistant\" || from === \"user\" ? (\n <MessageActionPanel message={message} alwaysVisible={from === \"user\"} copyAlwaysVisible={from !== \"user\"} />\n ) : null}\n </ChatMessage.Content>\n </ChatMessage.Root>\n );\n};\n\nconst handleExpandedStickyMessageWheel = (event: WheelEvent<HTMLElement>) => {\n if (shouldStopStickyUserMessageWheel(event.currentTarget, event.deltaY)) {\n event.stopPropagation();\n }\n};\n\nconst getStickyMessageMaxHeight = (isCollapsible: boolean, isExpanded: boolean) => {\n if (!isCollapsible) return undefined;\n if (isExpanded) return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n\n return STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT;\n};\n\nconst getStickyMessageBodyMaxHeight = (isExpandedCollapsible: boolean) => {\n if (!isExpandedCollapsible) return undefined;\n\n return STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT;\n};\n\nconst StickyMessageGroup = (props: StickyMessageGroupProps) => {\n const { group, streaming, hideQuestionForms, isExpanded, onToggleStickyMessage } = props;\n const isCollapsible = isStickyUserMessageCollapsible(group.userMessage);\n const isExpandedCollapsible = isCollapsible && isExpanded;\n const stickyMessageMaxHeight = getStickyMessageMaxHeight(isCollapsible, isExpanded);\n const toggleStickyMessage = () => onToggleStickyMessage(group.userMessage.id);\n\n return (\n <Box>\n <Box position=\"sticky\" top=\"0\" zIndex={1}>\n <ChatMessage.Root from=\"user\">\n <ChatMessage.Content\n from=\"user\"\n maxH={stickyMessageMaxHeight}\n overflow=\"hidden\"\n p={isCollapsible ? \"0\" : undefined}\n position={isCollapsible ? \"relative\" : undefined}\n >\n <Box\n data-sticky-user-message-content={isCollapsible ? (isExpanded ? \"expanded\" : \"collapsed\") : undefined}\n display=\"flex\"\n flexDirection=\"column\"\n gap=\"sm\"\n maxH={getStickyMessageBodyMaxHeight(isExpandedCollapsible)}\n minH=\"0\"\n overflowY={isExpandedCollapsible ? \"auto\" : \"visible\"}\n px={isCollapsible ? \"xs\" : undefined}\n py={isCollapsible ? \"xs\" : undefined}\n pb={isExpandedCollapsible ? \"3rem\" : undefined}\n onWheel={isExpandedCollapsible ? handleExpandedStickyMessageWheel : undefined}\n >\n <MessagePartsRenderer message={group.userMessage} streaming={streaming} />\n </Box>\n {isCollapsible ? (\n <StickyMessageToggle\n label={isExpanded ? \"Show less\" : \"Show more\"}\n onClick={toggleStickyMessage}\n actionPanel={<MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />}\n />\n ) : (\n <MessageActionPanel message={group.userMessage} alwaysVisible copyAlwaysVisible={false} />\n )}\n </ChatMessage.Content>\n </ChatMessage.Root>\n </Box>\n {group.responses.map((message) => (\n <Box key={message.id}>{renderMessage(message, streaming, hideQuestionForms)}</Box>\n ))}\n </Box>\n );\n};\n\nconst renderListItem = (\n item: ChatMessageListItem,\n props: Pick<\n ChatMessageListProps,\n \"groups\" | \"streaming\" | \"hideActiveQuestionForms\" | \"expandedStickyMessageIds\" | \"onToggleStickyMessage\"\n >,\n) => {\n const { groups, streaming, hideActiveQuestionForms, expandedStickyMessageIds, onToggleStickyMessage } = props;\n\n if (item.type === \"leading-response\") {\n return renderMessage(item.message, streaming, groups.length > 0 || hideActiveQuestionForms);\n }\n\n return (\n <StickyMessageGroup\n group={item.group}\n streaming={streaming}\n hideQuestionForms={item.groupIndex < groups.length - 1 || hideActiveQuestionForms}\n isExpanded={expandedStickyMessageIds.has(item.group.userMessage.id)}\n onToggleStickyMessage={onToggleStickyMessage}\n />\n );\n};\n\nexport const ChatMessageList = (props: ChatMessageListProps) => {\n const {\n leadingResponses,\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n onToggleStickyMessage,\n onReady,\n } = props;\n const { scrollRef } = useStickToBottomContext();\n const items = buildMessageListItems(leadingResponses, groups);\n const initialViewportHeight = getInitialViewportHeight(scrollRef.current);\n\n const virtualizer = useVirtualizer<HTMLDivElement, HTMLDivElement>({\n count: items.length,\n getScrollElement: () => scrollRef.current as HTMLDivElement | null,\n estimateSize: () => ESTIMATED_TURN_HEIGHT,\n getItemKey: (index) => items[index]?.key ?? index,\n overscan: VIRTUAL_LIST_OVERSCAN,\n gap: VIRTUAL_LIST_GAP,\n initialRect: { width: 0, height: initialViewportHeight },\n initialOffset: () => getEstimatedTailOffset(items.length, initialViewportHeight),\n });\n const totalSize = virtualizer.getTotalSize();\n\n useTailReady({\n itemCount: items.length,\n onReady,\n scrollRef,\n totalSize,\n });\n\n return (\n <Box px=\"xs\">\n <Box position=\"relative\" width=\"100%\" style={{ height: totalSize }}>\n {virtualizer.getVirtualItems().map((virtualItem) => {\n const item = items[virtualItem.index];\n if (!item) return null;\n\n return (\n <Box\n key={virtualItem.key}\n ref={virtualizer.measureElement}\n data-index={virtualItem.index}\n data-chat-message-list-item={item.type}\n position=\"absolute\"\n top=\"0\"\n left=\"0\"\n width=\"100%\"\n style={{ top: virtualItem.start }}\n >\n {renderListItem(item, {\n groups,\n streaming,\n hideActiveQuestionForms,\n expandedStickyMessageIds,\n onToggleStickyMessage,\n })}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n","import { Flex, HStack, Spinner, Stack, Text } from \"@chakra-ui/react\";\nimport { MessageCircleIcon } from \"lucide-react\";\nimport { type ReactNode, useState } from \"react\";\nimport { EmptyState } from \"@/components/empty-state\";\nimport { createSerializedPromptState } from \"../utils/editor-state\";\nimport { ChatPrimitives } from \"./ai-conversation\";\nimport { AutoScroll } from \"./auto-scroll\";\nimport { ChatInput } from \"./chat-input\";\nimport type { ChatInputQuestionPrompt, ChatInputQuestionResponse } from \"./chat-input-question-prompt\";\nimport { ChatMessageList } from \"./chat-message-list\";\nimport { groupMessagesByTurn, mergeReasoningToolOnlyMessages, type SessionMessage } from \"./message-types\";\n\n/** Full conversation shell for agent sessions, including messages, input, attachments, and host-provided slots. */\ninterface ChatPanelProps {\n /** Stable conversation identity used to reset ready state when switching sessions. */\n conversationKey?: string;\n messages: SessionMessage[];\n loading?: boolean;\n streaming?: boolean;\n emptyStateTitle: string;\n emptyStateDescription: string;\n emptyStateContent?: ReactNode;\n loaderComponent?: ReactNode;\n chatInputPlaceholder: string;\n chatInputDefaultValue?: string;\n onSubmitMessage?: (text: string, attachments: string[], questionResponse?: ChatInputQuestionResponse) => void;\n onInterrupt?: () => void;\n onChatInputChange?: (text: string) => void;\n /** Extra controls rendered near the chat input. */\n actions?: ReactNode;\n repoMenu?: ReactNode;\n attachedResources?: string[];\n onClearAttachments?: () => void;\n attachmentList?: ReactNode;\n approvalPrompt?: ReactNode;\n /** Optional workspace status/control surface rendered above the conversation viewport. */\n workspaceHub?: ReactNode;\n workspaceInitializing?: boolean;\n inputDisabled?: boolean;\n chatInputQuestionPrompt?: ChatInputQuestionPrompt;\n chatInputAutoFocus?: boolean;\n}\n\nexport const ChatPanel = (props: ChatPanelProps) => {\n const {\n conversationKey,\n messages,\n loading = false,\n streaming = false,\n emptyStateTitle,\n emptyStateDescription,\n emptyStateContent,\n loaderComponent,\n chatInputPlaceholder,\n chatInputDefaultValue = \"\",\n onSubmitMessage,\n onInterrupt,\n onChatInputChange,\n actions,\n repoMenu,\n attachedResources,\n onClearAttachments,\n attachmentList,\n approvalPrompt,\n workspaceHub,\n workspaceInitializing = false,\n inputDisabled = false,\n chatInputQuestionPrompt,\n chatInputAutoFocus = false,\n } = props;\n\n const merged = mergeReasoningToolOnlyMessages(messages);\n const hasMessages = merged.length > 0;\n const messageListKey = conversationKey ?? merged[0]?.id;\n const messageListIdentity = hasMessages ? (messageListKey ?? \"active-conversation\") : null;\n const userMessageCount = merged.reduce((count, message) => count + (message.role === \"user\" ? 1 : 0), 0);\n const { groups, leadingResponses } = groupMessagesByTurn(merged);\n const [expandedStickyMessageIds, setExpandedStickyMessageIds] = useState(() => new Set<string>());\n const [readyMessageListKey, setReadyMessageListKey] = useState<string | null>(null);\n const showLoadingState = !hasMessages && loading;\n const defaultEmptyContent = (\n <EmptyState\n icon={<MessageCircleIcon size={48} strokeWidth={1.5} />}\n title={emptyStateTitle}\n description={emptyStateDescription}\n />\n );\n const emptyContent = showLoadingState ? loaderComponent : (emptyStateContent ?? defaultEmptyContent);\n const hasWorkspaceHub = Boolean(workspaceHub);\n const hideActiveQuestionForms = Boolean(chatInputQuestionPrompt);\n const showThinkingIndicator = streaming && hasMessages && !workspaceInitializing;\n const isMessageViewportReady = !messageListIdentity || readyMessageListKey === messageListIdentity;\n\n const toggleStickyMessageExpanded = (messageId: string) => {\n setExpandedStickyMessageIds((current) => {\n const next = new Set(current);\n if (next.has(messageId)) {\n next.delete(messageId);\n } else {\n next.add(messageId);\n }\n\n return next;\n });\n };\n\n return (\n <Flex position=\"relative\" direction=\"column\" w=\"full\" h=\"full\" overflow=\"hidden\">\n <ChatPrimitives.Root>\n <AutoScroll userMessageCount={userMessageCount} />\n <ChatPrimitives.Viewport visibility={isMessageViewportReady ? \"visible\" : \"hidden\"}>\n {hasMessages ? (\n <ChatMessageList\n key={messageListIdentity}\n leadingResponses={leadingResponses}\n groups={groups}\n streaming={streaming}\n hideActiveQuestionForms={hideActiveQuestionForms}\n expandedStickyMessageIds={expandedStickyMessageIds}\n onToggleStickyMessage={toggleStickyMessageExpanded}\n onReady={() => setReadyMessageListKey(messageListIdentity)}\n />\n ) : (\n emptyContent\n )}\n </ChatPrimitives.Viewport>\n {isMessageViewportReady ? <ChatPrimitives.ScrollToBottom aria-label=\"Scroll to latest message\" /> : null}\n </ChatPrimitives.Root>\n {approvalPrompt}\n {showThinkingIndicator ? (\n <HStack gap=\"xs\" px=\"sm\" py=\"2xs\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n Working...\n </Text>\n </HStack>\n ) : null}\n <Stack px=\"xs\" gap={hasWorkspaceHub ? \"0\" : \"xs\"}>\n {workspaceHub}\n <ChatInput\n placeholder={chatInputPlaceholder}\n defaultState={createSerializedPromptState(chatInputDefaultValue)}\n streaming={streaming}\n onSubmit={onSubmitMessage}\n onInterrupt={onInterrupt}\n onChange={onChatInputChange}\n actions={actions}\n attachedResources={attachedResources}\n onClearAttachments={onClearAttachments}\n attachmentList={attachmentList}\n isDisabled={inputDisabled}\n attachedToTop={hasWorkspaceHub}\n questionPrompt={chatInputQuestionPrompt}\n autoFocus={chatInputAutoFocus}\n />\n </Stack>\n <Flex p=\"2xs\" justifyContent=\"flex-end\">\n {repoMenu}\n </Flex>\n </Flex>\n );\n};\n","import { Skeleton, Stack } from \"@chakra-ui/react\";\nimport { ChatMessage } from \"./ai-message\";\n\nconst renderSkeletonLines = (widths: string[]) => (\n <Stack gap=\"xs\" w=\"full\">\n {widths.map((width, index) => (\n <Skeleton key={`${width}-${index}`} height=\"3\" width={width} borderRadius=\"xs\" />\n ))}\n </Stack>\n);\n\nexport const ChatSkeleton = () => {\n return (\n <Stack minH=\"full\" py=\"xs\" gap=\"0\">\n <ChatMessage.Root from=\"user\">\n <ChatMessage.Content from=\"user\">{renderSkeletonLines([\"72%\", \"46%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n <ChatMessage.Root from=\"assistant\">\n <ChatMessage.Content from=\"assistant\">{renderSkeletonLines([\"76%\", \"62%\", \"40%\"])}</ChatMessage.Content>\n </ChatMessage.Root>\n </Stack>\n );\n};\n","import { Flex, HStack, Spinner, Text } from \"@chakra-ui/react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { DiffBubble } from \"@/components/diff-viewer/diff-bubble\";\n\ntype WorkspaceHubStatus = \"ready\" | \"loading\" | \"error\";\n\ninterface ChatWorkspaceHubProps {\n changesLabel: string;\n additions: number;\n deletions: number;\n action?: ReactNode;\n status?: WorkspaceHubStatus;\n statusLabel?: string;\n}\n\nexport const ChatWorkspaceHub = (props: ChatWorkspaceHubProps) => {\n const { changesLabel, additions, deletions, action, status = \"ready\", statusLabel } = props;\n const hasChanges = additions > 0 || deletions > 0;\n\n return (\n <Flex\n align=\"center\"\n justify=\"space-between\"\n gap=\"sm\"\n minW=\"0\"\n px=\"sm\"\n py=\"xs\"\n borderWidth=\"1px\"\n borderColor={status === \"error\" ? \"border.error\" : \"border.muted\"}\n borderRadius=\"xs\"\n borderBottomRadius=\"0\"\n bg={status === \"error\" ? \"bg.error\" : \"bg.subtle\"}\n >\n {status === \"loading\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <Spinner size=\"xs\" color=\"fg.muted\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {statusLabel ?? \"Setting up workspace...\"}\n </Text>\n </HStack>\n ) : status === \"error\" ? (\n <HStack gap=\"xs\" minW=\"0\">\n <AlertTriangle size={14} color=\"var(--chakra-colors-fg-error)\" />\n <Text textStyle=\"label/S/regular\" color=\"fg.error\" truncate>\n {statusLabel ?? \"Workspace setup failed\"}\n </Text>\n </HStack>\n ) : hasChanges ? (\n <DiffBubble\n label={changesLabel}\n additions={additions}\n deletions={deletions}\n variant=\"ghost\"\n size=\"small\"\n _hover={{ background: \"transparent\" }}\n />\n ) : (\n <Flex flex=\"1\" />\n )}\n {action ? (\n <Flex flexShrink={0} ml=\"auto\">\n {action}\n </Flex>\n ) : null}\n </Flex>\n );\n};\n"],"names":["conversationRootDefaultProps","initial","resize","role","ConversationRoot","chakra","StickToBottomEl","base","position","flex","overflow","height","forwardProps","defaultProps","ConversationContent","props","$","_c","children","rest","contentRef","scrollRef","useStickToBottomContext","t0","t1","t2","t3","Symbol","for","zIndex","py","t4","ScrollArea","conversationScrollButtonContainerDefaultProps","axis","bottom","ConversationScrollButton","isAtBottom","scrollToBottom","jsx","AbsoluteCenter","IconButton","ArrowDownIcon","ChatPrimitives","Root","Viewport","ScrollToBottom","recipe","defineSlotRecipe","className","slots","root","display","width","alignItems","justifyContent","gap","animationName","animationDuration","animationTimingFunction","mb","content","flexDirection","textStyle","borderRadius","variants","from","user","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderColor","bg","px","assistant","developer","size","sm","md","lg","shape","rounded","pill","square","defaultVariants","withProvider","withContext","createSlotRecipeContext","MessageRoot","MessageContent","ChatMessage","Content","formatToolInput","input","text","JSON","stringify","length","slice","ApprovalPrompt","toolName","toolInput","onApprove","onDeny","formattedInput","jsxs","Text","Code","ShieldX","Button","t5","ShieldCheck","t6","t7","HStack","t8","Box","Flex","shouldAutoScroll","args","previousUserMessageCount","userMessageCount","AutoScroll","previousCountRef","useRef","current","useEffect","hasMessageText","trim","resolveChatInputKeyboardAction","state","isDisabled","streaming","resolveChatInputButtonAction","canInterrupt","preventSubmit","event","preventDefault","QuestionOptionContent","option","label","description","Stack","QuestionCheckboxOptionRow","name","checked","editable","onToggle","undefined","tabIndex","Checkbox","QuestionRadioOptions","question","questionIndex","selectedOption","onToggleOption","details","value","options","Radio","map","RadioGroup","TodoListBlockView","items","_temp","QuestionFormBlockView","questions","selectedOptionsByQuestion","customAnswersByQuestion","onCustomAnswerChange","id","inputType","multiple","selectedOptions","includes","allowCustomAnswer","Textarea","currentTarget","item","index","getQuestionSelectionKey","getQuestionPromptSignature","questionPrompt","Boolean","required","getQuestionAnswerLines","lines","key","selectedLabels","customAnswer","answers","push","join","isCustomAnswersByQuestion","toCustomAnswersByQuestion","answerInput","trimmed","buildQuestionResponse","legacyText","hasCustomQuestions","some","buildQuestionAnswerValues","hasMissingRequiredQuestionAnswer","toQuestionFormQuestions","hasQuestionAnswer","QuestionStepTab","sourceQuestion","isActive","onSelectStep","isAnswered","stepStateLabel","tabVariant","Check","Tooltip","QuestionPromptStepper","activeQuestionIndex","setActiveQuestionIndex","useState","renderQuestionIndex","Math","min","activeQuestion","hasMultipleQuestions","_question","_questionIndex","optionLabel","_question_0","_questionIndex_0","answer","t9","QuestionPromptControls","questionPromptSignature","SendButton","shortcut","title","ariaLabel","Square","ArrowUp","icon","button","Fragment","Kbd","tooltipContent","Portal","ChatInput","defaultState","onSubmit","onInterrupt","attachedResources","onClearAttachments","onChange","placeholder","attachmentList","actions","attachedToTop","autoFocus","isSelected","setIsSelected","editorState","setEditorState","editorKey","setEditorKey","getTextFromSerializedEditorState","setText","setSelectedOptionsByQuestion","setCustomAnswersByQuestion","containerRef","onChangeRef","t10","previousQuestionPromptSignatureRef","t11","t12","t13","t14","resetText","_temp2","t15","t16","t17","t18","querySelector","HTMLElement","focus","focusEditor","t19","t20","handle","requestAnimationFrame","editable_0","cancelAnimationFrame","t21","handleContainerClick","t22","t23","shouldFocus","_temp3","resetText_0","resetEditor","actionState","responseText","hasMissingRequiredSelection","buttonAction","t24","questionResponse","submitMessage","t25","action","runAction","t26","handleKeyboardSubmit","t27","handleButtonClick","t28","key_1","selected","alreadySelected","filter","toggleQuestionOption","t29","question_0","questionIndex_0","key_2","current_0","updateQuestionCustomAnswer","t30","placeholderNode","t31","t32","t33","t34","t35","t36","t37","boxShadow","t38","t39","t40","pr","PromptEditor","t","t41","Spacer","t42","t43","t44","t45","t46","t47","t48","key_0","createSerializedPromptState","generateEditorStateFromString","STICKY_USER_MESSAGE_COLLAPSE_TEXT_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSE_LINE_THRESHOLD","STICKY_USER_MESSAGE_COLLAPSED_MAX_HEIGHT","STICKY_USER_MESSAGE_EXPANDED_MAX_HEIGHT","SCROLL_BOUNDARY_EPSILON","getMessageTextMetrics","message","parts","reduce","metrics","part","type","lineCount","split","textLength","isStickyUserMessageCollapsible","shouldStopStickyUserMessageWheel","element","deltaY","maxScrollTop","max","scrollHeight","clientHeight","scrollTop","isCopyablePart","getMessageCopyText","getMessageTimestampLabel","locale","timeZone","createdAt","Intl","DateTimeFormat","hour","minute","format","Date","MessageActionPanel","alwaysVisible","copyAlwaysVisible","isCopied","setIsCopied","copyResetTimeoutRef","copyText","timestampLabel","window","clearTimeout","navigator","clipboard","writeText","setTimeout","copyMessage","messageActionPanelHoverStyles","Copy","opacity","pointerEvents","ChatRichContent","RichMessage","Response","normalizeToolName","replace","toLowerCase","getToolNameLookupKeys","normalized","compact","Set","toolIconMap","shell","Terminal","ls","ListTree","read_file","FileText","write_file","FilePen","delete_file","Trash2","patch","FileDiff","upload_files","FileUp","download_file","FileDown","move_file","Move","iconMap","dot","DotIcon","danger","AlertTriangle","search","Search","browser","Globe","file","File","CircleQuestionMark","todo","ListTodo","terminal","DEFAULT_TOOL_ICON","isToolIconName","Object","hasOwn","getIconComponent","toolTypeToIconName","basenameSafe","path","idx","lastIndexOf","normalizeHeaderPath","token","startsWith","isMinusHeader","line","isPlusHeader","isHunkHeader","isAddedLine","isDeletedLine","ensureFileChange","changes","filePath","has","set","additions","deletions","incrementAdditions","get","incrementDeletions","processUnifiedDiffLine","lastMinusHeader","inHunk","currentPath","parseUnifiedDiff","diffText","Map","Array","entries","buildDiffTitleSegments","kind","fileName","extractDiffFilePaths","isDiffFileBoundary","isInvalidHunkBodyLine","appendHunkLine","original","modified","parseHunkBody","startIndex","parsePreview","oldHeader","next","nextIndex","preview","buildFileDiffPreviews","previews","i","TOOL_LABELS","apply_patch","bash","edit","glob","grep","read","skill","todowrite","STATE_LABELS","pending","error","input_streaming","input_available","running","completed","failed","normalizeToolType","toTitleCase","toUpperCase","getToolType","invocation","tool","getToolLabel","getStateLabel","status","isErrorState","buildIndicator","buildBaseTitle","detail","labelOverride","bold","muted","stateLabel","getInputObject","isArray","getOutputObject","output","getStringValue","getObjectValue","getStateObject","normalizeFilePath","isUnifiedDiff","getApplyPatchMetadataObjects","metadata","parseApplyPatchMetadataFile","entry","record","rawPath","relativePath","diff","before","after","getApplyPatchMetadataFiles","files","parsedFile","getApplyPatchDiffText","inputDiff","metadataDiff","fileDiffs","patchText","buildApplyPatchMetadataTitleSegments","seen","segments","add","getApplyPatchMetadataReferences","getOutputText","outputObject","returnDisplay","stdout","parseSkillContentBlock","match","skillName","getSkillName","skill_name","buildFileLinkSegment","prependErrorBlock","blocks","errorText","getDiffBlocks","language","sideBySide","getDiffTitleSegments","getDiffReferences","renderApplyPatch","metadataFiles","diffSegments","references","indicator","buildEditDiff","renderEdit","file_path","oldString","old_string","newString","new_string","diffBlocks","isRecord","parseJsonObjectText","parsed","parse","toInputRecord","getResponseText","stringValue","response","parseQuestionOption","parseQuestion","custom","parseQuestionBlock","createQuestionRenderer","deps","block","fieldLabel","expandable","renderRead","renderBash","command","outputText","code","stderr","exitCode","renderGrep","query","pattern","renderGlob","renderSkill","parsedOutput","renderedContent","parseTodoItem","parseTodoItems","explicit","listSource","objectValue","todos","createTodowriteRenderer","inputTodos","outputTodos","todoState","countLabel","renderQuestion","renderTodowrite","createDefaultToolRenderers","todo_write","stringifyValue","buildGenericBlocks","inputText","createGenericItem","mergeToolRenderers","overrides","getRenderer","toolRenderers","rawTool","renderer","renderInvocation","rendered","buildTimelineDocFromInvocations","invocations","Timeline","ChakraTimeline","handleTitleLinkClick","seg","onOpenFile","stopPropagation","href","AvatarTitleSegment","alt","src","Avatar","DiffTitleSegment","DiffBubble","BubbleLinkTitleSegment","fontWeight","isInteractive","textDecoration","color","Link","DefaultLinkTitleSegment","TextTitleSegment","isClickable","Span","TitleInline","variant","IndicatorView","ind","IndicatorIcon","CodeBlock","BlockView","b","reactions","clap","Card","DiffEditor","render","ref","ResourceBadge","TimelineItemRow","itemKey","isOpen","canExpand","hasBlocks","ChevronUpIcon","i_0","TimelineFromJSON","data","expanded","setExpanded","getKey","prev","toggle","idx_0","it","isQuestionTool","hasToolOutput","keys","ToolInvocationTimeline","labeledBlocks","hideQuestionForms","bb0","visibleInvocations","isToolPart","formatTokenCount","count","toFixed","String","getErrorMessage","errorType","ALERT_COLOR_PALETTE","info","warning","success","loading","collectToolInvocations","lookahead","nextPart","MessagePartsRenderer","toolInvocationTimeline","RenderToolInvocationTimeline","nodes","partIndex","fontSize","AlertMessage","inputTokens","outputTokens","cacheReadTokens","Spinner","getMessageOrigin","isReasoningToolOnlyMessage","mergeReasoningToolOnlyMessages","messages","merged","previous","groupMessagesByTurn","groups","leadingResponses","userMessage","responses","ESTIMATED_TURN_HEIGHT","INITIAL_TAIL_VIEWPORT_HEIGHT","TAIL_READY_STABLE_FRAME_COUNT","TAIL_READY_FRAME_LIMIT","TAIL_READY_PIXEL_EPSILON","VIRTUAL_LIST_OVERSCAN","VIRTUAL_LIST_GAP","buildMessageListItems","group","groupIndex","getEstimatedTailOffset","viewportHeight","estimatedTotalSize","getInitialViewportHeight","scrollElement","isTailLayoutStable","abs","totalSize","readTailLayoutSnapshot","useTailReady","itemCount","onReady","onReadyRef","frameId","checkedFrameCount","stableFrameCount","previousSnapshot","waitForStableTail","nextSnapshot","StickyMessageToggle","onClick","actionPanel","renderMessage","handleExpandedStickyMessageWheel","getStickyMessageMaxHeight","isCollapsible","isExpanded","getStickyMessageBodyMaxHeight","isExpandedCollapsible","StickyMessageGroup","onToggleStickyMessage","stickyMessageMaxHeight","toggleStickyMessage","renderListItem","hideActiveQuestionForms","expandedStickyMessageIds","ChatMessageList","initialViewportHeight","virtualizer","useVirtualizer","getScrollElement","estimateSize","getItemKey","overscan","initialRect","initialOffset","getTotalSize","getVirtualItems","virtualItem","measureElement","top","start","ChatPanel","conversationKey","emptyStateTitle","emptyStateDescription","emptyStateContent","loaderComponent","chatInputPlaceholder","chatInputDefaultValue","onSubmitMessage","onChatInputChange","repoMenu","approvalPrompt","workspaceHub","workspaceInitializing","inputDisabled","chatInputQuestionPrompt","chatInputAutoFocus","hasMessages","messageListIdentity","messageListKey","setExpandedStickyMessageIds","readyMessageListKey","setReadyMessageListKey","showLoadingState","MessageCircleIcon","EmptyState","emptyContent","hasWorkspaceHub","showThinkingIndicator","isMessageViewportReady","messageId","delete","toggleStickyMessageExpanded","renderSkeletonLines","widths","Skeleton","ChatSkeleton","ChatWorkspaceHub","changesLabel","statusLabel","hasChanges","background"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQO,MAAMA,KAA+B;AAAA,EAC1C,wBAAwB;AAAA,EACxBC,SAAS;AAAA,EACTC,QAAQ;AAAA,EACRC,MAAM;AACR,GAEaC,KAAmBC,GAC9BC,IACA;AAAA,EACEC,MAAM;AAAA,IACJC,UAAU;AAAA,IACVC,MAAM;AAAA,IACNC,UAAU;AAAA,IACVC,QAAQ;AAAA,EAAA;AAEZ,GACA;AAAA,EACEC,cAAc,CAAC,WAAW,QAAQ;AAAA,EAClCC,cAAcb;AAChB,CACF,GAIac,KAAsBC,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAA,MAAAC,GAAAC;AAAA,EAAAH,SAAAD,KACjC;AAAA,IAAAG,UAAAA;AAAAA,IAAA,GAAAC;AAAAA,EAAAA,IAA8BJ,GAAMC,OAAAD,GAAAC,OAAAE,GAAAF,OAAAG,MAAAD,IAAAF,EAAA,CAAA,GAAAG,IAAAH,EAAA,CAAA;AACpC,QAAA;AAAA,IAAAI,YAAAA;AAAAA,IAAAC,WAAAA;AAAAA,EAAAA,IAAkCC,GAAAA,GAQjBC,IAAAF,GACDG,IAAAJ;AAAuC,MAAAK,GAAAC;AAAA,EAAAV,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAC3BH,IAAA;AAAA,IAAAI,QAAU;AAAA,EAAA,GACpBH,IAAA;AAAA,IAAAI,IACR;AAAA,IAAI,aACK;AAAA,IAAQ3B,MACf;AAAA,EAAA,GACPa,OAAAS,GAAAT,OAAAU,MAAAD,IAAAT,EAAA,CAAA,GAAAU,IAAAV,EAAA,CAAA;AAAA,MAAAe;AAAA,SAAAf,EAAA,CAAA,MAAAE,KAAAF,EAAA,CAAA,MAAAG,KAAAH,EAAA,CAAA,MAAAO,KAAAP,SAAAQ,KAZHO,sBAACC,IAAA,EAAU,GACLb,GACG,QAAA,QACD,OAAA,QACmB,yBAAA,IACZ,aAAAI,GACD,YAAAC,GACY,wBAAAC,GACV,cAAAC,GAMbR,UAAAA,GACH,GAAaF,OAAAE,GAAAF,OAAAG,GAAAH,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAe,KAAAA,IAAAf,EAAA,CAAA,GAfbe;AAea,GAMJE,KAAgD;AAAA,EAC3DC,MAAM;AAAA,EACNC,QAAQ;AAAA,EACRN,QAAQ;AACV,GAEaO,KAA2BrB,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACtC;AAAA,IAAAoB,YAAAA;AAAAA,IAAAC,gBAAAA;AAAAA,EAAAA,IAAuChB,GAAAA;AAA0B,MAAAC;AAAA,SAAAP,EAAA,CAAA,MAAAqB,KAAArB,SAAAD,KAAAC,EAAA,CAAA,MAAAsB,KAG/Df,IAAA,CAACc,KACC,gBAAAE,EAACC,IAAA,EAAc,GAAKP,IAClB,UAAA,gBAAAM,EAACE,IAAA,EAAmB,SAAA,QAAgB,SAAA,MAAMH,KAA0B,SAAA,WAAe,MAAA,MAAI,GAAKvB,GAC1F,UAAA,gBAAAwB,EAACG,IAAA,EAAoB,UAAE,EAAA,CACzB,EAAA,CACF,GACD1B,OAAAqB,GAAArB,OAAAD,GAAAC,OAAAsB,GAAAtB,OAAAO,KAAAA,IAAAP,EAAA,CAAA,GANDO;AAMC,GAIQoB,KAAiB;AAAA,EAC5BC,MAAMxC;AAAAA,EACNyC,UAAU/B;AAAAA,EACVgC,gBAAgBV;AAClB,GChFMW,KAASC,GAAiB;AAAA,EAC9BC,WAAW;AAAA,EACXC,OAAO,CAAC,QAAQ,SAAS;AAAA,EACzB3C,MAAM;AAAA,IACJ4C,MAAM;AAAA,MACJC,SAAS;AAAA,MACTC,OAAO;AAAA,MACPC,YAAY;AAAA,MACZC,gBAAgB;AAAA,MAChBC,KAAK;AAAA,MACLC,eAAe;AAAA,MACfC,mBAAmB;AAAA,MACnBC,yBAAyB;AAAA,MACzB,wDAAwD;AAAA,QACtDC,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEFC,SAAS;AAAA,MACPT,SAAS;AAAA,MACTU,eAAe;AAAA,MACfN,KAAK;AAAA,MACLO,WAAW;AAAA,MACXrD,UAAU;AAAA,MACVsD,cAAc;AAAA,IAAA;AAAA,EAChB;AAAA,EAEFC,UAAU;AAAA,IACRC,MAAM;AAAA,MACJC,MAAM;AAAA,QACJhB,MAAM;AAAA,UACJS,IAAI;AAAA,UACJE,eAAe;AAAA,QAAA;AAAA,QAEjBD,SAAS;AAAA,UACPO,gBAAgB;AAAA,UAChBC,kBAAkB;AAAA,UAClBC,mBAAmB;AAAA,UACnBC,iBAAiB;AAAA,UACjBC,aAAa;AAAA,UACbC,IAAI;AAAA,UACJC,IAAI;AAAA,UACJ5C,IAAI;AAAA,UACJuB,OAAO;AAAA,UACPW,cAAc;AAAA,QAAA;AAAA,MAChB;AAAA,MAEFW,WAAW;AAAA,QACTxB,MAAM;AAAA,UACJS,IAAI;AAAA,UACJE,eAAe;AAAA,UACfP,gBAAgB;AAAA,QAAA;AAAA,QAElBM,SAAS;AAAA,UACPR,OAAO;AAAA,UACPqB,IAAI;AAAA,QAAA;AAAA,MACN;AAAA,MAEFE,WAAW;AAAA,QACTzB,MAAM;AAAA,UACJE,OAAO;AAAA,UACPS,eAAe;AAAA,QAAA;AAAA,QAEjBD,SAAS;AAAA,UACPR,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IACF;AAAA,IAEFwB,MAAM;AAAA,MACJC,IAAI;AAAA,QACF3B,MAAM;AAAA,UAAEK,KAAK;AAAA,QAAA;AAAA,QACbK,SAAS;AAAA,UAAEE,WAAW;AAAA,QAAA;AAAA,MAAK;AAAA,MAE7BgB,IAAI,CAAA;AAAA,MACJC,IAAI;AAAA,QACF7B,MAAM;AAAA,UAAEK,KAAK;AAAA,QAAA;AAAA,QACbK,SAAS;AAAA,UAAEE,WAAW;AAAA,QAAA;AAAA,MAAK;AAAA,IAC7B;AAAA,IAEFkB,OAAO;AAAA,MACLC,SAAS;AAAA,QACPrB,SAAS;AAAA,UAAEqB,SAAS;AAAA,QAAA;AAAA,MAAI;AAAA,MAE1BC,MAAM;AAAA,QACJtB,SAAS;AAAA,UAAEqB,SAAS;AAAA,QAAA;AAAA,MAAI;AAAA,MAE1BE,QAAQ;AAAA,QACNvB,SAAS;AAAA,UAAEqB,SAAS;AAAA,QAAA;AAAA,MAAI;AAAA,IAC1B;AAAA,EACF;AAAA,EAEFG,iBAAiB;AAAA,IACfnB,MAAM;AAAA,IACNW,MAAM;AAAA,IACNI,OAAO;AAAA,EAAA;AAEX,CAAC,GAEK;AAAA,EAAEK,cAAAA;AAAAA,EAAcC,aAAAA;AAAY,IAAIC,GAAwB;AAAA,EAAEzC,QAAAA;AAAO,CAAC,GAK3D0C,KAAcH,GAA+C,OAAO,MAAM,GAG1EI,KAAiBH,GAAiD,OAAO,SAAS,GAElFI,KAAc;AAAA,EACzB/C,MAAM6C;AAAAA,EACNG,SAASF;AACX,GCtGMG,KAAkBA,CAACC,MAAmB;AAC1C,MAAIA,KAAS,KAAM,QAAO;AAE1B,QAAMC,IAAO,OAAOD,KAAU,WAAWA,IAAQE,KAAKC,UAAUH,GAAO,MAAM,CAAC;AAC9E,SAAIC,EAAKG,WAAW,IAAU,OAEZH,EAAKG,SAAS,MAAM,GAAGH,EAAKI,MAAM,GAAG,GAAG,CAAC,QAAQJ;AAErE,GAEaK,KAAiBrF,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAC5B;AAAA,IAAAoF,UAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAAC,QAAAA;AAAAA,EAAAA,IAAmDzF;AAAM,MAAAQ;AAAA,EAAAP,SAAAsF,KAClC/E,IAAAsE,GAAgBS,CAAS,GAACtF,OAAAsF,GAAAtF,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAAjD,QAAAyF,IAAuBlF;AAA2B,MAAAC;AAAA,EAAAR,SAAAqF,KAK5C7E,IAAA,gBAAAkF,EAACC,GAAA,EAAe,WAAA,kBAAuB,OAAA,MAAK,UAAA;AAAA,IAAA;AAAA,IACpC,gBAAApE,EAACqE,IAAA,EAAU,MAAA,MAAMP,UAAAA,GAAS;AAAA,IAAO;AAAA,EAAA,GACzC,GAAOrF,OAAAqF,GAAArF,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAA,MAAAS;AAAA,EAAAT,SAAAyF,KAENhF,IAAAgF,IACC,gBAAAlE,EAACP,IAAA,EAAgB,MAAA,QACf,4BAAC4E,IAAA,EAAU,MAAA,MAAgB,YAAA,YAAmB,SAAA,SAAc,OAAA,QACzDH,UAAAA,EAAAA,CACH,GACF,IALD,MAMOzF,OAAAyF,GAAAzF,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAU;AAAA,EAAAV,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAIJF,sBAACmF,IAAA,EAAc,MAAA,GAAA,CAAE,GAAI7F,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAe;AAAA,EAAAf,SAAAwF,KADvBzE,sBAAC+E,IAAA,EAAY,MAAA,MAAa,SAAA,WAAmBN,SAAAA,GAC3C9E,UAAAA;AAAAA,IAAAA;AAAAA,IAAqB;AAAA,EAAA,GAEvB,GAASV,OAAAwF,GAAAxF,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAAA,MAAA+F;AAAA,EAAA/F,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAEPmF,sBAACC,IAAA,EAAkB,MAAA,GAAA,CAAE,GAAIhG,OAAA+F,KAAAA,IAAA/F,EAAA,CAAA;AAAA,MAAAiG;AAAA,EAAAjG,UAAAuF,KAD3BU,sBAACH,IAAA,EAAY,MAAA,MAAkB,cAAA,SAAiBP,SAAAA,GAC9CQ,UAAAA;AAAAA,IAAAA;AAAAA,IAAyB;AAAA,EAAA,GAE3B,GAAS/F,QAAAuF,GAAAvF,QAAAiG,KAAAA,IAAAjG,EAAA,EAAA;AAAA,MAAAkG;AAAA,EAAAlG,EAAA,EAAA,MAAAe,KAAAf,UAAAiG,KARXC,sBAACC,IAAA,EAAW,KAAA,MAAoB,gBAAA,YAC9BpF,UAAAA;AAAAA,IAAAA;AAAAA,IAIAkF;AAAAA,EAAAA,GAIF,GAASjG,QAAAe,GAAAf,QAAAiG,GAAAjG,QAAAkG,KAAAA,IAAAlG,EAAA,EAAA;AAAA,MAAAoG;AAAA,SAAApG,EAAA,EAAA,MAAAQ,KAAAR,UAAAS,KAAAT,EAAA,EAAA,MAAAkG,KAvBbE,IAAA,gBAAA7E,EAAC8E,KAAO,IAAA,MAAQ,IAAA,MAAQ,IAAA,MAAiB,aAAA,OAAkB,aAAA,kBAA8B,cAAA,MAAQ,IAAA,cAC/F,4BAACC,IAAA,EAAe,WAAA,UAAa,KAAA,MAC3B9F,UAAAA;AAAAA,IAAAA;AAAAA,IAICC;AAAAA,IAQDyF;AAAAA,EAAAA,EAAAA,CAUF,EAAA,CACF,GAAMlG,QAAAQ,GAAAR,QAAAS,GAAAT,QAAAkG,GAAAlG,QAAAoG,KAAAA,IAAApG,EAAA,EAAA,GAzBNoG;AAyBM,GCvCGG,KAAmBA,CAACC,MAA+B;AAC9D,QAAM;AAAA,IAAEC,0BAAAA;AAAAA,IAA0BC,kBAAAA;AAAAA,EAAAA,IAAqBF;AAEvD,SAAIC,MAA6B,IACxB,KAGFC,IAAmBD;AAC5B;AAEO,SAAAE,GAAA5G,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAyG,kBAAAA;AAAAA,EAAAA,IAA6B3G,GAC7B;AAAA,IAAAuB,gBAAAA;AAAAA,EAAAA,IAA2BhB,GAAAA,GAC3BsG,IAAyBC,GAAOH,CAAgB;AAAE,MAAAnG,GAAAC;AAAA,SAAAR,EAAA,CAAA,MAAAsB,KAAAtB,SAAA0G,KAExCnG,IAAAA,MAAA;AACR,IACEgG,GAAiB;AAAA,MAAAE,0BACWG,EAAgBE;AAAAA,MAAQJ,kBAAAA;AAAAA,IAAAA,CAEnD,KAEDpF,EAAAA,GAGFsF,EAAgBE,UAAWJ;AAAAA,EAAH,GACvBlG,IAAA,CAACkG,GAAkBpF,CAAc,GAACtB,OAAAsB,GAAAtB,OAAA0G,GAAA1G,OAAAO,GAAAP,OAAAQ,MAAAD,IAAAP,EAAA,CAAA,GAAAQ,IAAAR,EAAA,CAAA,IAXrC+G,GAAUxG,GAWPC,CAAkC,GAE9B;AAAI;AC/Bb,MAAMwG,KAAiBA,CAACjC,MAAiBA,EAAKkC,KAAAA,EAAO/B,SAAS,GAEjDgC,KAAiCA,CAACC,MAAiD;AAC9F,QAAM;AAAA,IAAEC,YAAAA;AAAAA,IAAYC,WAAAA;AAAAA,IAAWtC,MAAAA;AAAAA,EAAAA,IAASoC;AACxC,SAAIC,KAAcC,KAAa,CAACL,GAAejC,CAAI,IAAU,SACtD;AACT,GAEauC,KAA+BA,CAACH,MAAiD;AAC5F,QAAM;AAAA,IAAEI,cAAAA;AAAAA,IAAcH,YAAAA;AAAAA,IAAYC,WAAAA;AAAAA,IAAWtC,MAAAA;AAAAA,EAAAA,IAASoC;AACtD,SAAIC,IAAmB,SACnBC,IAAkBE,IAAe,cAAc,SAC9CP,GAAejC,CAAI,IACjB,WAD2B;AAEpC,GCjBMyC,KAAgBA,CAACC,MAAqB;AAC1CA,EAAAA,EAAMC,eAAAA;AACR,GAWMC,KAAwB5H,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAC5B;AAAA,IAAA2H,QAAAA;AAAAA,EAAAA,IAAmB7H;AAAM,MAAAQ;AAAA,EAAAP,EAAA,CAAA,MAAA4H,EAAAC,SAIrBtH,sBAACoF,GAAA,EAAe,WAAA,mBAAwB,OAAA,MACrCiC,YAAMC,MAAAA,CACT,GAAO7H,EAAA,CAAA,IAAA4H,EAAAC,OAAA7H,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAAA,MAAAQ;AAAA,EAAAR,EAAA,CAAA,MAAA4H,EAAAE,eACNtH,IAAAoH,EAAME,cACL,gBAAAvG,EAACoE,GAAA,EAAe,WAAA,oBAAyB,OAAA,YACtCiC,UAAAA,EAAME,YAAAA,CACT,IAHD,MAIO9H,EAAA,CAAA,IAAA4H,EAAAE,aAAA9H,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAA,MAAAS;AAAA,SAAAT,EAAA,CAAA,MAAAO,KAAAP,SAAAQ,KARVC,sBAACsH,GAAA,EAAU,KAAA,KAAa,UAAA,KACtBxH,UAAAA;AAAAA,IAAAA;AAAAA,IAGCC;AAAAA,EAAAA,GAKH,GAAQR,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAS,KAAAA,IAAAT,EAAA,CAAA,GATRS;AASQ,GAINuH,KAA4BjI,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAOhC;AAAA,IAAA2H,QAAAA;AAAAA,IAAAK,MAAAA;AAAAA,IAAAC,SAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAC,UAAAA;AAAAA,EAAAA,IAAsDrI,GAMxCQ,KAAC4H,GACI3H,IAAA2H,IAAAE,SAAA;AAA6B,MAAA5H;AAAA,EAAAT,SAAAmI,KAChC1H,IAAA0H,IAAAE,SAAA;AAAA,IAAAC,UAAmC;AAAA,EAAA,GAAItI,OAAAmI,GAAAnI,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAElC,QAAAU,IAAAyH,IAAAC,IAAAC;AAA+B,MAAAtH;AAAA,EAAAf,SAAA4H,KAEhD7G,sBAAC4G,MAA8BC,QAAAA,EAAAA,CAAM,GAAI5H,OAAA4H,GAAA5H,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAAA,MAAA+F;AAAA,SAAA/F,EAAA,CAAA,MAAAkI,KAAAlI,EAAA,CAAA,MAAAiI,KAAAjI,EAAA,CAAA,MAAAO,KAAAP,SAAAQ,KAAAR,EAAA,CAAA,MAAAS,KAAAT,EAAA,CAAA,MAAAU,KAAAV,EAAA,EAAA,MAAAe,KAT3CgF,IAAA,gBAAAxE,EAACgH,IAAA,EACON,MAAAA,GACGC,SAAAA,GACC,UAAA3H,GACK,iBAAAC,GACH,YAAAC,GACD,YAAA,cACM,iBAAAC,GAEjBK,UAAAA,GACF,GAAWf,OAAAkI,GAAAlI,OAAAiI,GAAAjI,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAS,GAAAT,OAAAU,GAAAV,QAAAe,GAAAf,QAAA+F,KAAAA,IAAA/F,EAAA,EAAA,GAVX+F;AAUW,GAITyC,KAAuBzI,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAQ3B;AAAA,IAAAwI,UAAAA;AAAAA,IAAAC,eAAAA;AAAAA,IAAAT,MAAAA;AAAAA,IAAAU,gBAAAA;AAAAA,IAAAR,UAAAA;AAAAA,IAAAS,gBAAAA;AAAAA,EAAAA,IAAoF7I,GAKzEQ,IAAAoI,KAAA,MACGnI,KAAC2H,GACI1H,IAAA0H,IAAAE,SAAA;AAA6B,MAAA3H;AAAA,EAAAV,EAAA,CAAA,MAAAmI,KAAAnI,EAAA,CAAA,MAAA4I,KAAA5I,EAAA,CAAA,MAAAyI,KAAAzI,SAAA0I,KAK1ChI,IAAAyH,IAAAU,CAAAA,MAAA;AAEM,IAAIA,EAAOC,SAAQF,IAAiBH,GAAUC,GAAeG,EAAOC,KAAM;AAAA,EAAE,IAFlFT,QAIarI,OAAAmI,GAAAnI,OAAA4I,GAAA5I,OAAAyI,GAAAzI,OAAA0I,GAAA1I,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAe;AAAA,MAAAf,SAAAmI,KAAAnI,EAAA,CAAA,MAAAyI,EAAAM,SAAA;AAAA,QAAAhD;AAAA,IAAA/F,SAAAmI,KAGOpC,IAAA6B,OACpB,gBAAArG,EAACyH,IAAA,EAEQ,OAAApB,EAAMC,OACD,YAAAM,IAAAE,SAAA;AAAA,MAAAC,UAAmC;AAAA,IAAA,GACpC,YAAA,cAEX,UAAA,gBAAA/G,EAACoG,MAA8BC,QAAAA,GAAM,EAAA,GALhCA,EAAMC,KAMb,GACD7H,OAAAmI,GAAAnI,OAAA+F,KAAAA,IAAA/F,EAAA,CAAA,GATAe,IAAA0H,EAAQM,QAAQE,IAAKlD,CASrB,GAAC/F,OAAAmI,GAAAnI,EAAA,CAAA,IAAAyI,EAAAM,SAAA/I,OAAAe;AAAAA,EAAA;AAAAA,IAAAA,IAAAf,EAAA,CAAA;AAAA,MAAA+F;AAAA,SAAA/F,UAAAiI,KAAAjI,EAAA,EAAA,MAAAO,KAAAP,EAAA,EAAA,MAAAQ,KAAAR,EAAA,EAAA,MAAAS,KAAAT,UAAAU,KAAAV,EAAA,EAAA,MAAAe,KAzBJgF,sBAACmD,IAAA,EACOjB,MAAAA,GACC,OAAA1H,GACG,UAAAC,GACK,iBAAAC,GACP,SAAA,QACM,eAAA,UACV,KAAA,MAEF,eAAAC,GAODK,UAAAA,GAUH,GAAaf,QAAAiI,GAAAjI,QAAAO,GAAAP,QAAAQ,GAAAR,QAAAS,GAAAT,QAAAU,GAAAV,QAAAe,GAAAf,QAAA+F,KAAAA,IAAA/F,EAAA,EAAA,GA1Bb+F;AA0Ba,GAIJoD,KAAoBpJ,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAC/B;AAAA,IAAAmJ,OAAAA;AAAAA,EAAAA,IAAkBrJ;AAAM,MAAAQ;AAAA,EAAAP,SAAAoJ,KAInB7I,IAAA6I,EAAKH,IAAKI,EAQV,GAACrJ,OAAAoJ,GAAApJ,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAAA,MAAAQ;AAAA,SAAAR,SAAAO,KATJC,IAAA,gBAAAe,EAACwG,GAAA,EAAS,IAAA,MAAS,KAAA,KAAkB,eAAA,QAAc,QAAA,KAAY,SAAA,KAC5DxH,UAAAA,GASH,GAAQP,OAAAO,GAAAP,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GAVRQ;AAUQ,GAIC8I,KAAwBvJ,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACnC;AAAA,IAAAsJ,WAAAA;AAAAA,IAAApB,UAAA5H;AAAAA,IAAAiJ,2BAAAhJ;AAAAA,IAAAiJ,yBAAAhJ;AAAAA,IAAAmI,gBAAAA;AAAAA,IAAAc,sBAAAA;AAAAA,EAAAA,IAOI3J,GALFoI,IAAA5H,MAAA8H,SAAA,KAAA9H;AAAgB,MAAAG;AAAA,EAAAV,SAAAQ,KAChBE,IAAAF,MAAA6H,SAAA,CAAA,IAAA7H,GAA8BR,OAAAQ,GAAAR,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAA9B,QAAAwJ,IAAA9I;AAA8B,MAAAK;AAAA,EAAAf,SAAAS,KAC9BM,IAAAN,MAAA4H,SAAA,CAAA,IAAA5H,GAA4BT,OAAAS,GAAAT,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAA5B,QAAAyJ,IAAA1I;AAA4B,MAAAgF;AAAA,MAAA/F,SAAAyJ,KAAAzJ,EAAA,CAAA,MAAAmI,KAAAnI,EAAA,CAAA,MAAA0J,KAAA1J,EAAA,CAAA,MAAA4I,KAAA5I,SAAAuJ,KAAAvJ,EAAA,CAAA,MAAAwJ,GAAA;AAAA,QAAAvD;AAAA,IAAAjG,EAAA,EAAA,MAAAyJ,KAAAzJ,EAAA,EAAA,MAAAmI,KAAAnI,EAAA,EAAA,MAAA0J,KAAA1J,EAAA,EAAA,MAAA4I,KAAA5I,UAAAwJ,KAOXvD,IAAAA,CAAAwC,GAAAC,MAAA;AACb,YAAAT,IAAaQ,EAAQkB,MAAR,YAA2BjB,CAAa,IACrDkB,IAAkBnB,EAAQoB,WAAR,aAAA,SAClBC,IAAwBN,EAA0BvB,CAAI,KAA9B,CAAA;AAAsC,aAG5D,gBAAAvC,EAACqC,GAAA,EACI,IAAA,YAEC,KAAA,MACQ,aAAA,OACA,aAAA,gBACC,cAAA,MACL,SAAA,MACC,UAAA,KAET,UAAA;AAAA,QAAA,gBAAAxG,EAACoE,GAAA,EAAQ,IAAA,UAAmB,WAAA,kBAAuB,OAAA,MAAc,UAAA,OAC9D8C,UAAAA,EAAQA,SAAAA,CACX;AAAA,QACCmB,MAAc,UACb,gBAAArI,EAACiH,IAAA,EACWC,UAAAA,GACKC,eAAAA,GACTT,MAAAA,GACU,gBAAA6B,MACN3B,UAAAA,GACMS,gBAAAA,GAAc,IAGhCH,EAAQM,QAAQE,IAAKrB,CAAAA,MACnB,gBAAArG,EAACyG,IAAA,EAESJ,QAAAA,GACFK,MAAAA,GACG,SAAA6B,EAAeC,SAAUnC,EAAMC,KAAM,GACpCM,UAAAA,GACA,UAAA,MAAMS,IAAiBH,GAAUC,GAAed,EAAMC,KAAM,EAAA,GALjED,EAAMC,KAK4D,CAG7E;AAAA,QACCY,EAAQuB,oBACP,gBAAAzI,EAAC0I,IAAA,EACW,UAAA,CAAC9B,GACI,iBAAAA,IAAAE,SAAA,QACR,OAAAoB,EAAwBxB,CAAI,KAA5B,IACM,aAAAE,IAAA,cAAA,iBACD,cAAAM,EAAQA,UACd,MAAA,GACM,aAAA,OACA,aAAA,gBACC,cAAA,MACL,SAAA,MACA,QAAAN,IAAA,aAAA,QACF,OAAA,MACI,UAAAV,OAAWiC,IAAuBjB,GAAUC,GAAejB,EAAKyC,cAAcpB,KAAM,EAAA,CAAC,IAdlG;AAAA,MAAA,EAAA,GAhCIb,CAiDP;AAAA,IAAQ,GAEXjI,QAAAyJ,GAAAzJ,QAAAmI,GAAAnI,QAAA0J,GAAA1J,QAAA4I,GAAA5I,QAAAwJ,GAAAxJ,QAAAiG,KAAAA,IAAAjG,EAAA,EAAA,GA3DA+F,IAAAwD,EAASN,IAAKhD,CA2Dd,GAACjG,OAAAyJ,GAAAzJ,OAAAmI,GAAAnI,OAAA0J,GAAA1J,OAAA4I,GAAA5I,OAAAuJ,GAAAvJ,OAAAwJ,GAAAxJ,QAAA+F;AAAAA,EAAA;AAAAA,IAAAA,IAAA/F,EAAA,EAAA;AAAA,MAAAiG;AAAA,SAAAjG,UAAA+F,KA5DJE,IAAA,gBAAA1E,EAACwG,GAAA,EAAS,IAAA,QAAW,KAAA,MAAeP,UAAAA,IAA0B,cAAA,iBAC3DzB,UAAAA,EAAAA,CA4DH,GAAQ/F,QAAA+F,GAAA/F,QAAAiG,KAAAA,IAAAjG,EAAA,EAAA,GA7DRiG;AA6DQ;AA1FqB,SAAAoD,GAAAc,GAAAC,GAAA;AAAA,SAMzB,gBAAA7I,EAAC8E,GAAA,EAAO,IAAA,MACN,UAAA,gBAAA9E,EAACgH,IAAA,EAAkB,SAAA4B,EAAIjC,SAAU,UAAA,IAAuB,iBAAA,QAAmB,YAAA;AAAA,IAAAI,UAAY;AAAA,EAAA,GAAW,MAAA,MAChG,4BAAC3C,GAAA,EAAe,WAAA,oBAAyB,OAAA,MACtCwE,UAAAA,EAAItC,MAAAA,CACP,GACF,KALgB,GAAGsC,EAAItC,KAAM,IAAIuC,CAAK,EAMxC;AAAM;ACvEP,MAAMC,KAA0BA,CAAC5B,GAA6B2B,MACnE3B,EAASkB,MAAM,YAAYS,CAAK,IAErBE,KAA6BA,CAACC,MACpCA,IAEEvF,KAAKC,UACVsF,EAAehB,UAAUN,IAAI,CAACR,GAAU2B,OAAW;AAAA,EACjDT,IAAIU,GAAwB5B,GAAU2B,CAAK;AAAA,EAC3C3B,UAAUA,EAASA;AAAAA,EACnBoB,UAAUW,EAAQ/B,EAASoB;AAAAA,EAC3BY,UAAUD,EAAQ/B,EAASgC;AAAAA,EAC3BT,mBAAmBQ,EAAQ/B,EAASuB;AAAAA,EACpCjB,SAASN,EAASM,QAAQE,IAAKrB,CAAAA,OAAY;AAAA,IACzCC,OAAOD,EAAOC;AAAAA,IACdC,aAAaF,EAAOE,eAAe;AAAA,EAAA,EACnC;AAAA,EACF,CACJ,IAd4B,IAiBxB4C,KAAyBA,CAC7BH,GACAf,GACAC,MACG;AACH,QAAMkB,IAAkB,CAAA;AAExB,WAASP,IAAQ,GAAGA,IAAQG,EAAehB,UAAUrE,QAAQkF,KAAS,GAAG;AACvE,UAAM3B,IAAW8B,EAAehB,UAAUa,CAAK,GACzCQ,IAAMP,GAAwB5B,GAAU2B,CAAK,GAC7CS,IAAiBrB,EAA0BoB,CAAG,KAAK,CAAA,GACnDE,IAAerB,EAAwBmB,CAAG,GAAG3D,KAAAA,GAC7C8D,IAAUD,IAAe,CAAC,GAAGD,GAAgBC,CAAY,IAAID;AACnE,IAAIE,EAAQ7F,WAAW,KAEvByF,EAAMK,KAAK,GAAGvC,EAASA,QAAQ,KAAKsC,EAAQE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC1D;AAEA,SAAON;AACT,GAEMO,KAA4BA,CAChCpC,MAC4C,OAAOA,KAAU,UAEzDqC,KAA4BA,CAChCZ,GACAa,MACG;AACH,MAAIF,GAA0BE,CAAW,EAAG,QAAOA;AAEnD,QAAMC,IAAUD,EAAYnE,KAAAA;AAC5B,MAAIoE,EAAQnG,WAAW,EAAG,QAAO,CAAA;AAEjC,QAAM6F,IAA0C,CAAA;AAChD,WAASX,IAAQ,GAAGA,IAAQG,EAAehB,UAAUrE,QAAQkF,KAAS,GAAG;AACvE,UAAM3B,IAAW8B,EAAehB,UAAUa,CAAK;AAC/C,IAAK3B,EAASuB,sBACde,EAAQV,GAAwB5B,GAAU2B,CAAK,CAAC,IAAIiB;AAAAA,EACtD;AAEA,SAAON;AACT,GAEaO,KAAwBA,CACnCf,GACAf,GACA4B,MACG;AACH,MAAI,CAACb,EAAgB,QAAO,OAAOa,KAAgB,WAAWA,EAAYnE,SAAS;AAEnF,QAAMwC,IAA0B0B,GAA0BZ,GAAgBa,CAAW,GAC/ET,IAAQD,GAAuBH,GAAgBf,GAA2BC,CAAuB,GACjG8B,IAAa,OAAOH,KAAgB,WAAWA,EAAYnE,SAAS,IACpEuE,IAAqBjB,EAAehB,UAAUkC,KAAMhD,CAAAA,MAAaA,EAASuB,iBAAiB;AAEjG,SAAIuB,EAAWrG,SAAS,KAAK,CAACsG,KAC5Bb,EAAMK,KAAK,wBAAwBO,CAAU,EAAE,GAG1CZ,EAAMM,KAAK;AAAA,CAAI;AACxB,GAEaS,KAA4BA,CACvCnB,GACAf,GACA4B,MACG;AACH,QAAM3B,IAA0B0B,GAA0BZ,GAAgBa,CAAW;AAErF,SAAOb,EAAehB,UAAUN,IAAI,CAACR,GAAU2B,MAAU;AACvD,UAAMQ,IAAMP,GAAwB5B,GAAU2B,CAAK,GAC7CS,IAAiBrB,EAA0BoB,CAAG,KAAK,CAAA,GACnDE,IAAerB,EAAwBmB,CAAG,GAAG3D,KAAAA;AACnD,WAAO6D,IAAe,CAAC,GAAGD,GAAgBC,CAAY,IAAID;AAAAA,EAC5D,CAAC;AACH,GAEac,KAAmCA,CAC9CpB,GACAf,GACA4B,MACG;AACH,MAAI,CAACb,EAAgB,QAAO;AAE5B,QAAMd,IAA0B0B,GAA0BZ,GAAgBa,CAAW;AAErF,WAAShB,IAAQ,GAAGA,IAAQG,EAAehB,UAAUrE,QAAQkF,KAAS,GAAG;AACvE,UAAM3B,IAAW8B,EAAehB,UAAUa,CAAK;AAC/C,QAAI,CAAC3B,EAASgC,SAAU;AAExB,UAAMG,IAAMP,GAAwB5B,GAAU2B,CAAK;AAEnD,QAD2BZ,GAAAA,EAA0BoB,CAAG,KAAK,CAAA,GAAI1F,SAAS,MAEtEuD,EAAAA,EAASuB,qBAAqBP,EAAwBmB,CAAG,GAAG3D;AAEhE,aAAO;AAAA,EACT;AAEA,SAAO;AACT,GAEM2E,KAA0BA,CAACrB,MAC/BA,EAAehB,UAAUN,IAAI,CAACR,GAAU2B,OAAW;AAAA,EACjDT,IAAIU,GAAwB5B,GAAU2B,CAAK;AAAA,EAC3C3B,UAAUA,EAASA;AAAAA,EACnBM,SAASN,EAASM;AAAAA,EAClBc,UAAUW,EAAQ/B,EAASoB;AAAAA,EAC3BY,UAAUD,EAAQ/B,EAASgC;AAAAA,EAC3BT,mBAAmBQ,EAAQ/B,EAASuB;AACtC,EAAE,GAcE6B,KAAoBA,CACxBpD,GACAC,GACAc,GACAC,MACG;AACH,QAAMmB,IAAMP,GAAwB5B,GAAUC,CAAa;AAC3D,UAAQc,EAA0BoB,CAAG,KAAK,CAAA,GAAI1F,SAAS,KAAKsF,EAAQf,EAAwBmB,CAAG,GAAG3D,KAAAA;AACpG,GAEM6E,KAAkB/L,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACtB;AAAA,IAAAwI,UAAAA;AAAAA,IAAAsD,gBAAAA;AAAAA,IAAArD,eAAAA;AAAAA,IAAAsD,UAAAA;AAAAA,IAAAxC,2BAAAA;AAAAA,IAAAC,yBAAAA;AAAAA,IAAAwC,cAAAA;AAAAA,EAAAA,IAQIlM;AAAM,MAAAQ;AAAA,EAAAP,EAAA,CAAA,MAAAyJ,KAAAzJ,EAAA,CAAA,MAAA0I,KAAA1I,EAAA,CAAA,MAAAwJ,KAAAxJ,SAAA+L,KACSxL,IAAAsL,GACjBE,GACArD,GACAc,GACAC,CACF,GAACzJ,OAAAyJ,GAAAzJ,OAAA0I,GAAA1I,OAAAwJ,GAAAxJ,OAAA+L,GAAA/L,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AALD,QAAAkM,IAAmB3L,GAMnB4L,IAAuBD,IAAA,aAAA,gBACvBE,IAAmBJ,IAAA,YAAA,SAKTxL,IAAA,qBAAqBiI,EAAQkB,EAAG,IAExBlJ,IAAA,GAAGgI,EAAQA,QAAS,KAAK0D,CAAc,KAEpCzL,IAAA,uBAAuB+H,EAAQkB,EAAG;AAAE,MAAA5I;AAAA,EAAAf,EAAA,CAAA,MAAAiM,KAAAjM,SAAA0I,KAI1C3H,IAAAA,MAAMkL,EAAavD,CAAa,GAAC1I,OAAAiM,GAAAjM,OAAA0I,GAAA1I,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAAA,MAAA+F;AAAA,EAAA/F,EAAA,CAAA,MAAAkM,KAAAlM,SAAA0I,KAEzC3C,IAAAmG,IAAa,gBAAA3K,EAAC8K,IAAA,EAAkB,eAAA,OAAA,CAAM,IAAM3D,IAAgB,GAAC1I,OAAAkM,GAAAlM,OAAA0I,GAAA1I,QAAA+F,KAAAA,IAAA/F,EAAA,EAAA;AAAA,MAAAiG;AAAA,EAAAjG,EAAA,EAAA,MAAAgM,KAAAhM,EAAA,EAAA,MAAAQ,KAAAR,EAAA,EAAA,MAAAS,KAAAT,UAAAU,KAAAV,EAAA,EAAA,MAAAe,KAAAf,EAAA,EAAA,MAAA+F,KAAA/F,EAAA,EAAA,MAAAoM,KAXhEnG,IAAA,gBAAA1E,EAACuE,MACK,IAAAtF,GACC,MAAA,OACO,cAAAC,GACGuL,iBAAAA,GACA,iBAAAtL,GACV,MAAA,MACI0L,SAAAA,GACJ,MAAA,KACI,SAAArL,GAERgF,UAAAA,EAAAA,CACH,GAAS/F,QAAAgM,GAAAhM,QAAAQ,GAAAR,QAAAS,GAAAT,QAAAU,GAAAV,QAAAe,GAAAf,QAAA+F,GAAA/F,QAAAoM,GAAApM,QAAAiG,KAAAA,IAAAjG,EAAA,EAAA;AAAA,MAAAkG;AAAA,SAAAlG,UAAAyI,EAAAA,YAAAzI,UAAAiG,KAbXC,sBAACoG,IAAA,EAAiB,SAAA7D,EAAQA,UAAW,eACnCxC,UAAAA,EAAAA,CAaF,GAAUjG,EAAA,EAAA,IAAAyI,EAAAA,UAAAzI,QAAAiG,GAAAjG,QAAAkG,KAAAA,IAAAlG,EAAA,EAAA,GAdVkG;AAcU,GAIRqG,KAAwBxM,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAC5B;AAAA,IAAAsK,gBAAAA;AAAAA,IAAAf,2BAAAA;AAAAA,IAAAC,yBAAAA;AAAAA,IAAAb,gBAAAA;AAAAA,IAAAc,sBAAAA;AAAAA,EAAAA,IACE3J,GACF;AAAA,IAAAwJ,WAAAA;AAAAA,EAAAA,IAAsBxJ,GACtB,CAAAyM,GAAAC,CAAA,IAAsDC,EAAS,CAAC,GAChEC,IAA4BC,KAAIC,IAAKL,GAAqBjD,EAASrE,SAAU,CAAC,GAC9E4H,IAAuBvD,EAAUoD,CAAmB,GACpDI,IAA6BxD,EAASrE,SAAU;AAAE,MAAA3E;AAAA,EAAAP,EAAA,CAAA,MAAAyJ,KAAAzJ,SAAA+M,KAAA/M,EAAA,CAAA,MAAAuK,EAAAhB,aAAAvJ,EAAA,CAAA,MAAAuJ,KAAAvJ,SAAA2M,KAAA3M,EAAA,CAAA,MAAAwJ,KAI7CjJ,IAAAwM,IACC,gBAAAxL,EAAC4E,IAAA,EAAY,MAAA,WAAqB,cAAA,kBAAqB,KAAA,KAAa,UAAA,KACjEoD,UAAAA,EAASN,IAAK,CAAAR,GAAAC,MACb,gBAAAnH,EAACuK,IAAA,EAEWrD,UAAAA,GACM,gBAAA8B,EAAchB,UAAWb,CAAa,GACvCA,eAAAA,GACL,UAAAA,MAAkBiE,GACDnD,2BAAAA,GACFC,yBAAAA,GACXgD,cAAAA,EAAAA,GAPThE,EAAQkB,EAOuB,CAEvC,GACH,IAdD,MAeO3J,OAAAyJ,GAAAzJ,OAAA+M,GAAA/M,EAAA,CAAA,IAAAuK,EAAAhB,WAAAvJ,OAAAuJ,GAAAvJ,OAAA2M,GAAA3M,OAAAwJ,GAAAxJ,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAEF,QAAAQ,IAAA,uBAAuBsM,EAAcnD,EAAG,IACtClJ,IAAAsM,IAAA,aAAA1E,QACW3H,IAAAqM,IAAA,qBAA4CD,EAAcnD,EAAG,KAA7DtB;AAA2E,MAAAtH;AAAA,EAAAf,SAAA8M,KAI/E/L,IAAA,CAAC+L,CAAc,GAAC9M,OAAA8M,GAAA9M,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAAA,MAAA+F;AAAA,EAAA/F,EAAA,CAAA,MAAA4I,KAAA5I,EAAA,EAAA,MAAAuK,EAAAhB,aAAAvJ,EAAA,EAAA,MAAA2M,KAIX5G,IAAAA,CAAAiH,GAAAC,GAAAC,MAAA;AACdtE,IAAAA,EAAe2B,EAAchB,UAAWoD,CAAmB,GAAGA,GAAqBO,CAAW;AAAA,EAAC,GAChGlN,OAAA4I,GAAA5I,EAAA,EAAA,IAAAuK,EAAAhB,WAAAvJ,QAAA2M,GAAA3M,QAAA+F,KAAAA,IAAA/F,EAAA,EAAA;AAAA,MAAAiG;AAAA,EAAAjG,EAAA,EAAA,MAAA0J,KAAA1J,EAAA,EAAA,MAAAuK,EAAAhB,aAAAvJ,EAAA,EAAA,MAAA2M,KACqB1G,IAAAA,CAAAkH,GAAAC,GAAAC,MAAA;AACpB3D,IAAAA,EAAqBa,EAAchB,UAAWoD,CAAmB,GAAGA,GAAqBU,CAAM;AAAA,EAAC,GACjGrN,QAAA0J,GAAA1J,EAAA,EAAA,IAAAuK,EAAAhB,WAAAvJ,QAAA2M,GAAA3M,QAAAiG,KAAAA,IAAAjG,EAAA,EAAA;AAAA,MAAAkG;AAAA,EAAAlG,EAAA,EAAA,MAAAyJ,KAAAzJ,EAAA,EAAA,MAAAwJ,KAAAxJ,EAAA,EAAA,MAAAe,KAAAf,EAAA,EAAA,MAAA+F,KAAA/F,UAAAiG,KAVHC,IAAA,gBAAA3E,EAAC+H,IAAA,EACY,WAAAvI,GACX,UAAA,IAC2ByI,2BAAAA,GACFC,yBAAAA,GACT,gBAAA1D,GAGM,sBAAAE,EAAAA,CAErB,GACDjG,QAAAyJ,GAAAzJ,QAAAwJ,GAAAxJ,QAAAe,GAAAf,QAAA+F,GAAA/F,QAAAiG,GAAAjG,QAAAkG,KAAAA,IAAAlG,EAAA,EAAA;AAAA,MAAAoG;AAAA,EAAApG,EAAA,EAAA,MAAAQ,KAAAR,EAAA,EAAA,MAAAS,KAAAT,EAAA,EAAA,MAAAU,KAAAV,UAAAkG,KAjBJE,IAAA,gBAAA7E,EAACwG,GAAA,EACK,IAAAvH,GACE,MAAAC,GACW,mBAAAC,GACb,KAAA,KAEJwF,UAAAA,EAAAA,CAYF,GAAQlG,QAAAQ,GAAAR,QAAAS,GAAAT,QAAAU,GAAAV,QAAAkG,GAAAlG,QAAAoG,KAAAA,IAAApG,EAAA,EAAA;AAAA,MAAAsN;AAAA,SAAAtN,EAAA,EAAA,MAAAO,KAAAP,UAAAoG,KAnCVkH,sBAACvF,GAAA,EAAU,KAAA,MAAQ,IAAA,MAChBxH,UAAAA;AAAAA,IAAAA;AAAAA,IAgBD6F;AAAAA,EAAAA,GAmBF,GAAQpG,QAAAO,GAAAP,QAAAoG,GAAApG,QAAAsN,KAAAA,IAAAtN,EAAA,EAAA,GApCRsN;AAoCQ,GAICC,KAAyBxN,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACpC;AAAA,IAAAsK,gBAAAA;AAAAA,EAAAA,IAA2BxK;AAAM,MAAAQ;AAAA,EAAAP,SAAAuK,KACfhK,IAAAqL,GAAwBrB,CAAc,GAACvK,OAAAuK,GAAAvK,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAAzD,QAAAuJ,IAAkBhJ;AAAwC,MAAAC;AAAA,EAAAR,SAAAuK,KAC1B/J,IAAA8J,GAA2BC,CAAc,GAACvK,OAAAuK,GAAAvK,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAA1E,QAAAwN,IAAgChN;AAA2C,MAAAC;AAAA,SAAAT,EAAA,CAAA,MAAAD,KAAAC,SAAAwN,KAAAxN,EAAA,CAAA,MAAAuJ,KAEpE9I,IAAA,gBAAAc,EAACgL,IAAA,EAAkD,GAAMxM,GAAkBwJ,WAAAA,KAA/CiE,CAAwD,GAAIxN,OAAAD,GAAAC,OAAAwN,GAAAxN,OAAAuJ,GAAAvJ,OAAAS,KAAAA,IAAAT,EAAA,CAAA,GAAxFS;AAAwF,GCzRpFgN,KAAa1N,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA;AAAA,MAAAsH,GAAApH,GAAAuN,GAAAC;AAAA,EAAA3N,SAAAD,KACxB;AAAA,IAAA4N,OAAAA;AAAAA,IAAAD,UAAAA;AAAAA,IAAAnG,cAAAA;AAAAA,IAAA,GAAApH;AAAAA,EAAAA,IAAmDJ,GAAMC,OAAAD,GAAAC,OAAAuH,GAAAvH,OAAAG,GAAAH,OAAA0N,GAAA1N,OAAA2N,MAAApG,IAAAvH,EAAA,CAAA,GAAAG,IAAAH,EAAA,CAAA,GAAA0N,IAAA1N,EAAA,CAAA,GAAA2N,IAAA3N,EAAA,CAAA;AACzD,QAAA4N,IAAkBzN,EAAK,YAAY,KAAjBwN;AAA4B,MAAApN;AAAA,EAAAP,SAAAuH,KAEjChH,IAAAgH,IACX,gBAAAhG,EAACsM,IAAA,EAAa,MAAA,IAAiB,aAAA,GAAQ,MAAA,gBAAc,IAErD,gBAAAtM,EAACuM,IAAA,EAAc,MAAA,IAAiB,gBAAC,GAClC9N,OAAAuH,GAAAvH,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAJD,QAAA+N,IAAaxN;AAIX,MAAAC;AAAA,EAAAR,EAAA,CAAA,MAAA4N,KAAA5N,EAAA,CAAA,MAAA+N,KAAA/N,EAAA,CAAA,MAAAG,KAAAH,UAAA2N,KAGAnN,sBAACiB,IAAA,EACa,eAAA,uBACP,MAAA,MACG,SAAA,SACK,cAAA,QACA,cAAA,WACDmM,cAAAA,GACLD,OAAAA,MACHxN,gBAGN,GAAaH,OAAA4N,GAAA5N,OAAA+N,GAAA/N,OAAAG,GAAAH,QAAA2N,GAAA3N,QAAAQ,KAAAA,IAAAR,EAAA,EAAA;AAZf,QAAAgO,IACExN;AAcF,MAAImN,GAAK;AAAA,QAAAlN;AAAA,IAAAT,EAAA,EAAA,MAAA0N,KAAA1N,UAAA2N,KACgBlN,IAAAiN,IAAA,gBAAAhI,EAAAuI,IAAA;;MAEZ;AAAA,MAAC,gBAAA1M,EAAC2M,IAAA,EAAa,UAAA,MAAMR,UAAAA,EAAAA,CAAS;AAAA,IAAA,EAAA,CAAM,IAFxBC,GAMtB3N,QAAA0N,GAAA1N,QAAA2N,GAAA3N,QAAAS,KAAAA,IAAAT,EAAA,EAAA;AAND,UAAAmO,IAAuB1N;AAMrB,QAAAC;AAAA,IAAAV,UAAAgO,KAIEtN,sBAAA4L,GAAA,SAAA,EAAiB,SAAA,IAAS0B,UAAAA,GAAO,GAAkBhO,QAAAgO,GAAAhO,QAAAU,KAAAA,IAAAV,EAAA,EAAA;AAAA,QAAAe;AAAA,IAAAf,UAAAmO,KACnDpN,IAAA,gBAAAQ,EAAC6M,IAAA,EACC,UAAA,gBAAA7M,EAAA+K,GAAA,YAAA,EACE,UAAA,gBAAA/K,EAAA+K,GAAA,SAAA,EAAkB6B,UAAAA,EAAAA,CAAe,EAAA,CACnC,GACF,GAASnO,QAAAmO,GAAAnO,QAAAe,KAAAA,IAAAf,EAAA,EAAA;AAAA,QAAA+F;AAAA,WAAA/F,EAAA,EAAA,MAAAU,KAAAV,UAAAe,KANXgF,iCAA0B,YAAA,IAAe,WAAA,KACvCrF,UAAAA;AAAAA,MAAAA;AAAAA,MACAK;AAAAA,IAAAA,GAKF,GAAef,QAAAU,GAAAV,QAAAe,GAAAf,QAAA+F,KAAAA,IAAA/F,EAAA,EAAA,GAPf+F;AAAAA,EAOe;AAElB,SAEMiI;AAAM,GCfFK,KAAYtO,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACvB;AAAA,IAAAqO,cAAAA;AAAAA,IAAAC,UAAAhO;AAAAA,IAAAiO,aAAAA;AAAAA,IAAAnH,WAAA7G;AAAAA,IAAAiO,mBAAAhO;AAAAA,IAAAiO,oBAAAA;AAAAA,IAAAtH,YAAA1G;AAAAA,IAAAiO,UAAAA;AAAAA,IAAAC,aAAAA;AAAAA,IAAAC,gBAAAA;AAAAA,IAAAC,SAAAA;AAAAA,IAAAC,eAAAhO;AAAAA,IAAAwJ,gBAAAA;AAAAA,IAAAyE,WAAAjJ;AAAAA,EAAAA,IAeIhG,GAbFwO,IAAAhO,MAAA8H,SAAAgB,KAAA9I,GAEA8G,IAAA7G,MAAA6H,SAAA,KAAA7H;AAAiB,MAAAyF;AAAA,EAAAjG,SAAAS,KACjBwF,IAAAxF,MAAA4H,SAAA,CAAA,IAAA5H,GAAsBT,OAAAS,GAAAT,OAAAiG,KAAAA,IAAAjG,EAAA,CAAA;AAAtB,QAAAyO,IAAAxI,GAEAmB,IAAA1G,MAAA2H,SAAA,KAAA3H,GAKAqO,IAAAhO,MAAAsH,SAAA,KAAAtH,GAEAiO,IAAAjJ,MAAAsC,SAAA,KAAAtC,GAGF,CAAAkJ,GAAAC,CAAA,IAAoCxC,EAAS,EAAK,GAClD,CAAAyC,GAAAC,CAAA,IAAsC1C,EAAS4B,CAAY,GAC3D,CAAAe,GAAAC,CAAA,IAAkC5C,EAAS,CAAC;AAAE,MAAAxG;AAAA,EAAAlG,SAAAsO,KACbpI,KAAAA,MAAMqJ,GAAiCjB,CAAY,GAACtO,OAAAsO,GAAAtO,OAAAkG,MAAAA,KAAAlG,EAAA,CAAA;AAArF,QAAA,CAAA+E,IAAAyK,EAAA,IAAwB9C,EAASxG,EAAoD;AAAE,MAAAE;AAAA,EAAApG,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KACcwF,QAAEpG,OAAAoG,KAAAA,IAAApG,EAAA,CAAA;AAAvG,QAAA,CAAAwJ,GAAAiG,EAAA,IAAkE/C,EAAmCtG,CAAE;AAAE,MAAAkH;AAAA,EAAAtN,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KACF0M,QAAEtN,OAAAsN,KAAAA,IAAAtN,EAAA,CAAA;AAAzG,QAAA,CAAAyJ,GAAAiG,EAAA,IAA8DhD,EAAyCY,CAAE,GACzGqC,KAAqB9I,GAA8B,IAAI,GACvD+I,KAAoB/I,GAAO8H,CAAQ;AAAE,MAAAkB;AAAA,EAAA7P,SAAAuK,KACasF,KAAAvF,GAA2BC,CAAc,GAACvK,OAAAuK,GAAAvK,OAAA6P,MAAAA,KAAA7P,EAAA,CAAA;AAA5F,QAAA8P,KAA2CjJ,GAAOgJ,EAA0C;AAAE,MAAAE,IAAAC;AAAA,EAAAhQ,SAAA2O,KAEpFoB,KAAAA,MAAA;AACRH,IAAAA,GAAW9I,UAAW6H;AAAAA,EAAH,GAClBqB,KAAA,CAACrB,CAAQ,GAAC3O,OAAA2O,GAAA3O,OAAA+P,IAAA/P,QAAAgQ,OAAAD,KAAA/P,EAAA,CAAA,GAAAgQ,KAAAhQ,EAAA,EAAA,IAFb+G,GAAUgJ,IAEPC,EAAU;AAAC,MAAAC,IAAAC;AAAA,EAAAlQ,UAAAsO,KAEJ2B,KAAAA,MAAA;AACR,UAAAE,IAAkBZ,GAAiCjB,CAAY;AAC/Dc,IAAAA,EAAed,CAAY,GAC3BgB,EAAac,EAAgB,GAC7BZ,GAAQW,CAAS,GACjBV,GAA6B,CAAA,CAAE,GAC/BC,GAA2B,CAAA,CAAE,GAC7BE,GAAW9I,UAAWqJ,CAAS;AAAA,EAAC,GAC/BD,KAAA,CAAC5B,CAAY,GAACtO,QAAAsO,GAAAtO,QAAAiQ,IAAAjQ,QAAAkQ,OAAAD,KAAAjQ,EAAA,EAAA,GAAAkQ,KAAAlQ,EAAA,EAAA,IARjB+G,GAAUkJ,IAQPC,EAAc;AAAC,MAAAG;AAAA,EAAArQ,UAAAuK,KAEc8F,KAAA/F,GAA2BC,CAAc,GAACvK,QAAAuK,GAAAvK,QAAAqQ,MAAAA,KAAArQ,EAAA,EAAA;AAA1E,QAAAwN,IAAgC6C;AAA2C,MAAAC,IAAAC;AAAA,EAAAvQ,UAAAwN,KAEjE8C,KAAAA,MAAA;AACR,IAAIR,GAAkChJ,YAAa0G,MACnDsC,GAAkChJ,UAAW0G,GAC7CiC,GAA6B,CAAA,CAAE,GAC/BC,GAA2B,CAAA,CAAE;AAAA,EAAC,GAC7Ba,KAAA,CAAC/C,CAAuB,GAACxN,QAAAwN,GAAAxN,QAAAsQ,IAAAtQ,QAAAuQ,OAAAD,KAAAtQ,EAAA,EAAA,GAAAuQ,KAAAvQ,EAAA,EAAA,IAL5B+G,GAAUuJ,IAKPC,EAAyB;AAAC,MAAAC;AAAA,EAAAxQ,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAET4P,KAAAA,MAAA;AAClB,UAAArI,IAAiBwH,GAAY7I,SAAuB2J,cAAC,0BAA0B;AAC/E,IAAItI,aAAoBuI,eACtBvI,EAAQwI,MAAAA;AAAAA,EACT,GACF3Q,QAAAwQ,MAAAA,KAAAxQ,EAAA,EAAA;AALD,QAAA4Q,KAAoBJ;AAKlB,MAAAK,IAAAC;AAAA,EAAA9Q,UAAAgP,KAEQ6B,KAAAA,MAAA;AACR,QAAI,CAAC7B;AAAS;AACd,UAAA+B,IAAeC,sBAAsB,MAAA;AACnC,YAAAC,KAAiBtB,GAAY7I,SAAuB2J,cAAC,0BAA0B;AAC/E,MAAItI,cAAoBuI,eACtBvI,GAAQwI,MAAAA,GAEVzB,EAAc,EAAI;AAAA,IAAC,CACpB;AAAE,WACI,MAAMgC,qBAAqBH,CAAM;AAAA,EAAC,GACxCD,IAAA,CAAC9B,CAAS,GAAChP,QAAAgP,GAAAhP,QAAA6Q,IAAA7Q,QAAA8Q,MAAAD,KAAA7Q,EAAA,EAAA,GAAA8Q,IAAA9Q,EAAA,EAAA,IAVd+G,GAAU8J,IAUPC,CAAW;AAAC,MAAAK;AAAA,EAAAnR,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAEcuQ,KAAAA,MAAA;AAC3BjC,IAAAA,EAAc,EAAI,GAClB0B,GAAAA;AAAAA,EAAa,GACd5Q,QAAAmR,MAAAA,KAAAnR,EAAA,EAAA;AAHD,QAAAoR,KAA6BD;AAG3B,MAAAE;AAAA,EAAArR,UAAAsO,KAEkB+C,IAAAC,CAAAA,MAAA;AAAC,UAAAC,KAAAD,MAAAjJ,SAAA,KAAAiJ;AACnBlC,IAAAA,EAAed,CAAY,GAC3BgB,EAAakC,EAAgB;AAC7B,UAAAC,KAAkBlC,GAAiCjB,CAAY;AAC/DkB,IAAAA,GAAQW,EAAS,GACjBV,GAA6B,CAAA,CAAE,GAC/BC,GAA2B,CAAA,CAAE,GAC7BE,GAAW9I,UAAWqJ,EAAS,GAE3BoB,MACFP,sBAAsB,MAAA;AACpBJ,MAAAA,GAAAA;AAAAA,IAAa,CACd;AAAA,EACF,GACF5Q,QAAAsO,GAAAtO,QAAAqR,KAAAA,IAAArR,EAAA,EAAA;AAdD,QAAA0R,IAAoBL,GAgBpB9J,IAAqBF,KAAamD,EAAQgE;AAAa,MAAAmD,GAAAC,GAAAN;AAAA,MAAAtR,EAAA,EAAA,MAAAuH,KAAAvH,EAAA,EAAA,MAAAyJ,KAAAzJ,EAAA,EAAA,MAAAoH,KAAApH,UAAAuK,KAAAvK,EAAA,EAAA,MAAAwJ,KAAAxJ,EAAA,EAAA,MAAAqH,KAAArH,EAAA,EAAA,MAAA+E,IAAA;AACvD6M,IAAAA,IAAqBrH,IACjBe,GAAsBf,GAAgBf,GAA2BC,CACvD,IAAV1E,GAAIkC,KAAAA;AACR,UAAA4K,IAAoClG,GAClCpB,GACAf,GACAC,CACF;AACAkI,IAAAA,IAAoB;AAAA,MAAApK,cAAAA;AAAAA,MAAAH,YAENA,KAAAyK;AAAAA,MAAyCxK,WAAAA;AAAAA,MAAAtC,MAE/C6M;AAAAA,IAAAA,GAEaN,IAAAhK,GAA6BqK,CAAW,GAAC3R,QAAAuH,GAAAvH,QAAAyJ,GAAAzJ,QAAAoH,GAAApH,QAAAuK,GAAAvK,QAAAwJ,GAAAxJ,QAAAqH,GAAArH,QAAA+E,IAAA/E,QAAA2R,GAAA3R,QAAA4R,GAAA5R,QAAAsR;AAAAA,EAAA;AAAAK,IAAAA,IAAA3R,EAAA,EAAA,GAAA4R,IAAA5R,EAAA,EAAA,GAAAsR,IAAAtR,EAAA,EAAA;AAA9D,QAAA8R,IAAqBR;AAA0C,MAAAS;AAAA,EAAA/R,EAAA,EAAA,MAAAyO,KAAAzO,EAAA,EAAA,MAAAyJ,KAAAzJ,EAAA,EAAA,MAAA0O,KAAA1O,EAAA,EAAA,MAAAuO,KAAAvO,EAAA,EAAA,MAAAuK,KAAAvK,EAAA,EAAA,MAAA0R,KAAA1R,EAAA,EAAA,MAAA4R,KAAA5R,UAAAwJ,KAEzCuI,IAAAA,MAAA;AACpB,QAAI,CAACH;AAAY;AAEjB,UAAAI,IAAyBzH,IAAA;AAAA,MAAAQ,SAEVW,GAA0BnB,GAAgBf,GAA2BC,CAAuB;AAAA,IAAA,IAFlFpB;AAMzBkG,IAAAA,EAASqD,GAAcnD,GAAmBuD,CAAgB,GAC1DN,EAAY,EAAI,GAChBhD,IAAAA;AAAAA,EAAsB,GACvB1O,QAAAyO,GAAAzO,QAAAyJ,GAAAzJ,QAAA0O,GAAA1O,QAAAuO,GAAAvO,QAAAuK,GAAAvK,QAAA0R,GAAA1R,QAAA4R,GAAA5R,QAAAwJ,GAAAxJ,QAAA+R,KAAAA,IAAA/R,EAAA,EAAA;AAZD,QAAAiS,IAAsBF;AAYpB,MAAAG;AAAA,EAAAlS,EAAA,EAAA,MAAAwO,KAAAxO,UAAAiS,KAEgBC,KAAAC,CAAAA,MAAA;AAChB,QAAIA,MAAW,aAAW;AACxB3D,MAAAA,IAAAA;AAAe;AAAA,IAAA;AAIjB,IAAI2D,MAAW,YACbF,EAAAA;AAAAA,EACD,GACFjS,QAAAwO,GAAAxO,QAAAiS,GAAAjS,QAAAkS,MAAAA,KAAAlS,EAAA,EAAA;AATD,QAAAoS,IAAkBF;AAShB,MAAAG;AAAA,EAAArS,EAAA,EAAA,MAAA2R,KAAA3R,UAAAoS,KAE2BC,KAAAA,MAAA;AAC3BD,IAAAA,EAAUlL,GAA+ByK,CAAW,CAAC;AAAA,EAAC,GACvD3R,QAAA2R,GAAA3R,QAAAoS,GAAApS,QAAAqS,MAAAA,KAAArS,EAAA,EAAA;AAFD,QAAAsS,KAA6BD;AAE3B,MAAAE;AAAA,EAAAvS,EAAA,EAAA,MAAA8R,KAAA9R,UAAAoS,KAEwBG,KAAAA,MAAA;AACxBH,IAAAA,EAAUN,CAAY;AAAA,EAAC,GACxB9R,QAAA8R,GAAA9R,QAAAoS,GAAApS,QAAAuS,MAAAA,KAAAvS,EAAA,EAAA;AAFD,QAAAwS,KAA0BD;AAExB,MAAAE;AAAA,EAAAzS,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAE2B6R,KAAAA,CAAAhK,GAAAC,IAAAwE,OAAA;AAC3B,UAAAwF,KAAYrI,GAAwB5B,GAAUC,EAAa;AAE3D+G,IAAAA,GAA6B3I,CAAAA,OAAA;AAC3B,YAAA6L,KAAiB7L,GAAQ8D,EAAG,KAAX,CAAA,GACjBgI,KAAwBD,GAAQ5I,SAAUmD,EAAW;AAErD,aAAIzE,EAAQoB,WACH;AAAA,QAAA,GACF/C;AAAAA,QAAO,CACT8D,EAAG,GAAGgI,KAAkBD,GAAQE,OAAQhL,CAAAA,OAAWA,OAAUqF,EAAwC,IAA/F,CAAA,GAA0EyF,IAAUzF,EAAW;AAAA,MAAA,IAInG;AAAA,QAAA,GACFpG;AAAAA,QAAO,CACT8D,EAAG,GAAGgI,KAAA,CAAA,IAAA,CAAwB1F,EAAW;AAAA,MAAA;AAAA,IAC3C,CACF;AAAA,EAAC,GACHlN,QAAAyS,MAAAA,KAAAzS,EAAA,EAAA;AAnBD,QAAA8S,KAA6BL;AAmB3B,MAAAM;AAAA,EAAA/S,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAEiCmS,KAAAA,CAAAC,GAAAC,IAAA5F,OAAA;AACjC,UAAA6F,KAAY7I,GAAwB5B,GAAUC,EAAa;AAC3DgH,IAAAA,GAA2ByD,CAAAA,QAAc;AAAA,MAAA,GACpCrM;AAAAA,MAAO,CACT8D,EAAG,GAAGyC;AAAAA,IAAAA,EACP;AAAA,EAAC,GACJrN,QAAA+S,MAAAA,KAAA/S,EAAA,EAAA;AAND,QAAAoT,KAAmCL;AAMjC,MAAAM;AAAA,EAAArT,UAAA4O,KAEsByE,KAAAzE,IACtB,gBAAArN,EAACoE,GAAA,EAAe,WAAA,mBAAwB,OAAA,aAA0B,eAAA,QAAgB,UAAA,YAAe,KAAA,KAC9FiJ,aACH,IAHsBvG,QAIXrI,QAAA4O,GAAA5O,QAAAqT,MAAAA,KAAArT,EAAA,EAAA;AAJb,QAAAsT,KAAwBD,IAahBE,KAAAxE,IAAA,SAAA1G,QAGamL,KAAAzE,IAAA,MAAA1G,QAGJoL,KAAAxE,IAAA,gBAAA,gBACFyE,KAAAzE,IAAA,QAAA,OACH0E,KAAA1E,IAAA,IAAA,GAGO2E,KAAA3E,IAAA,gBAAA;AAAqC,MAAA4E;AAAA,EAAA7T,UAAA4T,MAD5CC,KAAA;AAAA,IAAArQ,aACOoQ;AAAAA,IAAqCE,WACvC;AAAA,IAAKjT,QACR;AAAA,EAAA,GACTb,QAAA4T,IAAA5T,QAAA6T,MAAAA,KAAA7T,EAAA,EAAA;AAAA,MAAA+T;AAAA,EAAA/T,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KACamT,KAAA;AAAA,IAAAvQ,aACC;AAAA,IAAasQ,WACf;AAAA,IAAKjT,QACR;AAAA,EAAA,GACTb,QAAA+T,MAAAA,KAAA/T,EAAA,EAAA;AAAA,MAAAgU;AAAA,EAAAhU,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAEOoT,KAAAA,MAAM9E,EAAc,EAAK,GAAClP,QAAAgU,MAAAA,KAAAhU,EAAA,EAAA;AAAA,MAAAiU;AAAA,EAAAjU,EAAA,EAAA,MAAAyJ,KAAAzJ,EAAA,EAAA,MAAAqP,KAAArP,UAAAmP,KAAAnP,EAAA,EAAA,MAAAsS,MAAAtS,EAAA,EAAA,MAAAoH,KAAApH,EAAA,EAAA,MAAA2O,KAAA3O,EAAA,EAAA,MAAAsT,MAAAtT,EAAA,EAAA,MAAAuK,KAAAvK,UAAAwJ,KAI/ByK,KAAA1J,IACC,gBAAAhJ,EAACgM,IAAA,EACiBhD,gBAAAA,GACWf,2BAAAA,GACFC,yBAAAA,GACTqJ,gBAAAA,IACMM,0BAA0B,IAGlD,gBAAA7R,EAACP,IAAA,EAAgB,MAAA,SAAiC,yBAAA,IAAqB,cAAA;AAAA,IAAAkT,IAAM;AAAA,EAAA,GAC3E,UAAA,gBAAA3S,EAAC4S,IAAA,EAEehF,cAAAA,GACF,YAAA,CAAC/H,GACAkM,aAAAA,IACH,UAAAc,CAAAA,MAAA;AACR5E,IAAAA,GAAQ4E,CAAC,GACTzF,IAAWyF,CAAC;AAAA,EAAC,GAEL9B,gBARLjD,CAQyB,EAAA,CAElC,GACDrP,QAAAyJ,GAAAzJ,QAAAqP,GAAArP,QAAAmP,GAAAnP,QAAAsS,IAAAtS,QAAAoH,GAAApH,QAAA2O,GAAA3O,QAAAsT,IAAAtT,QAAAuK,GAAAvK,QAAAwJ,GAAAxJ,QAAAiU,MAAAA,KAAAjU,EAAA,EAAA;AAAA,MAAAqU;AAAA,EAAArU,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAGCyT,uBAACC,IAAA,EAAM,GAAGtU,QAAAqU,MAAAA,KAAArU,EAAA,EAAA;AAGD,QAAAuU,KAAAhN,IAAA,kBAAA,mBACGiN,KAAAnN,IAAAgB,SAAA,SAEAoM,KAAA3C,MAAiB;AAAM,MAAA4C;AAAA,EAAA1U,EAAA,EAAA,MAAAuH,KAAAvH,EAAA,EAAA,MAAAwS,MAAAxS,EAAA,EAAA,MAAAuU,MAAAvU,EAAA,EAAA,MAAAwU,MAAAxU,UAAAyU,MALnCC,KAAA,gBAAAnT,EAACkM,IAAA,EACelG,cAAAA,GACP,OAAAgN,IACG,UAAAC,IACDhC,SAAAA,IACC,UAAAiC,GAAAA,CAAuB,GACjCzU,QAAAuH,GAAAvH,QAAAwS,IAAAxS,QAAAuU,IAAAvU,QAAAwU,IAAAxU,QAAAyU,IAAAzU,QAAA0U,MAAAA,KAAA1U,EAAA,EAAA;AAAA,MAAA2U;AAAA,EAAA3U,EAAA,EAAA,MAAA8O,KAAA9O,UAAA0U,MATJC,KAAA,gBAAAjP,EAACS,IAAA,EAAW,KAAA,KAAO,IAAA,MAChB2I,UAAAA;AAAAA,IAAAA;AAAAA,IACDuF;AAAAA,IACAK;AAAAA,EAAAA,GAOF,GAAS1U,QAAA8O,GAAA9O,QAAA0U,IAAA1U,QAAA2U,MAAAA,KAAA3U,EAAA,EAAA;AAAA,MAAA4U;AAAA,EAAA5U,EAAA,EAAA,MAAA6O,KAAA7O,UAAAiU,MAAAjU,EAAA,EAAA,MAAA2U,MAnCXC,KAAA,gBAAAlP,EAACY,IAAA,EAAe,WAAA,UAAe,OAAA,MAC5BuI,UAAAA;AAAAA,IAAAA;AAAAA,IACAoF;AAAAA,IAuBDU;AAAAA,EAAAA,GAWF,GAAO3U,QAAA6O,GAAA7O,QAAAiU,IAAAjU,QAAA2U,IAAA3U,QAAA4U,MAAAA,KAAA5U,EAAA,EAAA;AAAA,MAAA6U;AAAA,SAAA7U,EAAA,EAAA,MAAAuT,MAAAvT,EAAA,EAAA,MAAAwT,MAAAxT,EAAA,EAAA,MAAAyT,MAAAzT,UAAA0T,MAAA1T,EAAA,EAAA,MAAA2T,MAAA3T,EAAA,EAAA,MAAA6T,MAAA7T,EAAA,EAAA,MAAA4U,MAjETC,uBAACxO,GAAA,EACMsJ,KAAAA,IACI,UAAA,YACH,OAAA,QACG,UAAA,MACA,UAAA,MACL,IAAA4D,IACD,IAAA,MACU,cAAA,MACI,iBAAAC,IACL,aAAA,OACA,aAAA,SACC,aAAAC,IACF,WAAAC,IACH,QAAAC,IACG,YAAA,8DACH,QAAAE,IAKM,cAAAE,IAKL3C,SAAAA,IACD,QAAA4C,IAERY,UAAAA,IAqCF,GAAM5U,QAAAuT,IAAAvT,QAAAwT,IAAAxT,QAAAyT,IAAAzT,QAAA0T,IAAA1T,QAAA2T,IAAA3T,QAAA6T,IAAA7T,QAAA4U,IAAA5U,QAAA6U,MAAAA,KAAA7U,EAAA,EAAA,GAlEN6U;AAkEM;AAnPe,SAAAxL,KAAA;AAAA;AAAA,SAAA+G,GAAAxF,GAAA;AAAA,SAmCCA,IAAM;AAAC;AAnCR,SAAA4G,GAAAsD,GAAA;AAAA,SA6EClK,IAAM;AAAC;ACnH1B,MAAMmK,KAA8BA,CAACjQ,IAAQ,OAC3CE,KAAKC,UAAU+P,GAA8BlQ,CAAK,CAAC,GCD/CmQ,KAA8C,KAC9CC,KAA8C,GAC9CC,KAA2C,mBAC3CC,KAA0C,2CAEjDC,KAA0B,GAQ1BC,KAAwBA,CAACC,MACtBA,EAAQC,MAAMC,OACnB,CAACC,GAASC,MACJA,EAAKC,SAAS,SAAeF,IAE1B;AAAA,EACLG,WAAWH,EAAQG,YAAYF,EAAK5Q,KAAK+Q,MAAM,YAAY,EAAE5Q;AAAAA,EAC7D6Q,YAAYL,EAAQK,aAAaJ,EAAK5Q,KAAKG;AAAAA,GAG/C;AAAA,EAAE2Q,WAAW;AAAA,EAAGE,YAAY;AAAA,CAC9B,GAGWC,KAAiCA,CAACT,MAA4B;AACzE,MAAIA,EAAQpW,SAAS,OAAQ,QAAO;AAEpC,QAAM;AAAA,IAAE0W,WAAAA;AAAAA,IAAWE,YAAAA;AAAAA,EAAAA,IAAeT,GAAsBC,CAAO;AAE/D,SACEQ,IAAad,MAA+CY,IAAYX;AAE5E,GAEae,KAAmCA,CAACC,GAAyCC,MAAmB;AAC3G,QAAMC,IAAexJ,KAAKyJ,IAAI,GAAGH,EAAQI,eAAeJ,EAAQK,YAAY;AAE5E,SAAIJ,MAAW,KAAKC,KAAgBf,KAAgC,KAChEc,IAAS,IAAUD,EAAQM,YAAYnB,KAEpCa,EAAQM,YAAYJ,IAAef;AAC5C,GClCMoB,KAAiBA,CAACd,MACfA,EAAKC,SAAS,QAGVc,KAAqBA,CAACnB,OACzBA,EAAQC,SAAS,CAAA,GACtB3C,OAAO4D,EAAc,EACrBxN,IAAK0M,CAAAA,MAASA,EAAK5Q,KAAKkC,MAAM,EAC9B4L,OAAOrI,OAAO,EACdS,KAAK;AAAA;AAAA,CAAM,GAGH0L,KAA2BA,CAACpB,GAAyBqB,GAAiBC,MAC5EtB,EAAQuB,YAEN,IAAIC,KAAKC,eAAeJ,GAAQ;AAAA,EACrCK,MAAM;AAAA,EACNC,QAAQ;AAAA,EACRL,UAAAA;AAAAA,CACD,EAAEM,OAAO,IAAIC,KAAK7B,EAAQuB,SAAS,CAAC,IANN,IASpBO,KAAqBtX,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAChC;AAAA,IAAAsV,SAAAA;AAAAA,IAAA+B,eAAA/W;AAAAA,IAAAgX,mBAAA/W;AAAAA,EAAAA,IAA8ET,GAA7DuX,IAAA/W,MAAA8H,SAAA,KAAA9H,GAAuBgX,IAAA/W,MAAA6H,SAAAiP,IAAA9W,GACxC,CAAAgX,GAAAC,CAAA,IAAgC/K,EAAS,EAAK,GAC9CgL,IAA4B7Q,GAAsB,IAAI;AAAE,MAAApG;AAAA,EAAAT,SAAAuV,KACvC9U,IAAAiW,GAAmBnB,CAAO,GAACvV,OAAAuV,GAAAvV,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAA5C,QAAA2X,IAAiBlX;AAA4B,MAAAC;AAAA,EAAAV,SAAAuV,KACtB7U,IAAAiW,GAAyBpB,CAAO,GAACvV,OAAAuV,GAAAvV,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAxD,QAAA4X,IAAuBlX;AAAkC,MAAAK,GAAAgF;AAAA,EAAA/F,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAE/CG,IAAAA,MACD,MAAA;AACL,IAAI2W,EAAmB5Q,YAAa,QAClC+Q,OAAMC,aAAcJ,EAAmB5Q,OAAQ;AAAA,EAChD,GAEFf,IAAA,CAAA,GAAE/F,OAAAe,GAAAf,OAAA+F,MAAAhF,IAAAf,EAAA,CAAA,GAAA+F,IAAA/F,EAAA,CAAA,IANL+G,GAAUhG,GAMPgF,CAAE;AAAC,MAAAE;AAAA,EAAAjG,SAAA2X,KAEc1R,gBAAA;AAClB,QAAK0R;AAEL,UAAA;AACE,cAAMI,UAASC,UAAUC,UAAWN,CAAQ,GAC5CF,EAAY,EAAI,GACZC,EAAmB5Q,YAAa,QAClC+Q,OAAMC,aAAcJ,EAAmB5Q,OAAQ,GAEjD4Q,EAAmB5Q,UAAW+Q,OAAMK,WAAY,MAAMT,EAAY,EAAK,GAAG,IAAI;AAAA,MAAnD,QAAA;AAE3BA,QAAAA,EAAY,EAAK;AAAA,MAAC;AAAA,EACnB,GACFzX,OAAA2X,GAAA3X,OAAAiG,KAAAA,IAAAjG,EAAA,CAAA;AAbD,QAAAmY,IAAoBlS;AAepB,MAAI,CAAC0R,KAAD,CAAcC;AAAc,WAAS;AAO5B,QAAA1R,IAAAoR,IAAA,MAAA,KACMlR,IAAAkR,IAAA,SAAA;AAA+B,MAAAhK;AAAA,EAAAtN,SAAA4X,KAI7CtK,IAAAsK,sBACEjS,GAAA,EAAe,WAAA,oBAAyB,OAAA,YACtCiS,aACH,IAHD,MAIO5X,OAAA4X,GAAA5X,OAAAsN,KAAAA,IAAAtN,EAAA,CAAA;AAAA,MAAA6P;AAAA,EAAA7P,EAAA,EAAA,MAAAuX,KAAAvX,EAAA,EAAA,MAAAmY,KAAAnY,EAAA,EAAA,MAAA2X,KAAA3X,UAAAwX,KACP3H,IAAA8H,sBACEtR,GAAA,EACU,SAAAkR,IAAA,MAAA,KACM,eAAAA,IAAA,SAAA,QACJ,YAAA,sBACNa,KAAAA,IAEL,UAAA,gBAAA7W,EAAC+K,MAAiB,SAAAkL,IAAA,WAAA,gBAChB,UAAA,gBAAAjW,EAACE,IAAA,EACa,cAAA+V,IAAA,WAAA,gBACJ,SAAA,SACH,MAAA,OACIW,SAAAA,GAERX,UAAAA,IAAW,gBAAAjW,EAAC8K,MAAY,MAAA,GAAA,CAAE,IAAO,gBAAA9K,EAAC8W,IAAA,EAAW,MAAA,GAAA,IAChD,GACF,EAAA,CACF,IAjBD,MAkBOrY,QAAAuX,GAAAvX,QAAAmY,GAAAnY,QAAA2X,GAAA3X,QAAAwX,GAAAxX,QAAA6P,KAAAA,IAAA7P,EAAA,EAAA;AAAA,MAAA+P;AAAA,SAAA/P,EAAA,EAAA,MAAA6P,KAAA7P,EAAA,EAAA,MAAAkG,KAAAlG,EAAA,EAAA,MAAAoG,KAAApG,UAAAsN,KAhCVyC,IAAA,gBAAArK,EAACS,IAAA,EACgC,kCAAA,QAC3B,KAAA,OACC,MAAA,KACI,SAAAD,GACM,eAAAE,GACJ,YAAA,sBACNgS,KAAAA,IAEJ9K,UAAAA;AAAAA,IAAAA;AAAAA,IAKAuC;AAAAA,EAAAA,GAmBH,GAAS7P,QAAA6P,GAAA7P,QAAAkG,GAAAlG,QAAAoG,GAAApG,QAAAsN,GAAAtN,QAAA+P,KAAAA,IAAA/P,EAAA,EAAA,GAjCT+P;AAiCS,GAIPqI,KAAgC;AAAA,EACpC,6FAA6F;AAAA,IAC3FE,SAAS;AAAA,IACTC,eAAe;AAAA,EAAA;AAAA,EAEjB,+DAA+D;AAAA,IAC7DD,SAAS;AAAA,IACTC,eAAe;AAAA,EAAA;AAAA,EAEjB,mHAAmH;AAAA,IACjHD,SAAS;AAAA,IACTC,eAAe;AAAA,EAAA;AAEnB,GC7GaC,KAAkBzY,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA;AAAA,MAAAC,GAAAC;AAAA,EAAAH,SAAAD,KAC7B;AAAA,IAAAG,UAAAA;AAAAA,IAAA,GAAAC;AAAAA,EAAAA,IAA8BJ,GAAMC,OAAAD,GAAAC,OAAAE,GAAAF,OAAAG,MAAAD,IAAAF,EAAA,CAAA,GAAAG,IAAAH,EAAA,CAAA;AAAA,MAAAO;AAAA,EAAAP,SAAAE,KAIhCK,IAAA,gBAAAgB,EAACkX,IAAA,EAA0BvY,cAAAA,GAAU,WAAA,IAAS,GAAGF,OAAAE,GAAAF,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAAA,MAAAQ;AAAA,SAAAR,EAAA,CAAA,MAAAG,KAAAH,SAAAO,KADnDC,IAAA,gBAAAe,EAAC8E,GAAA,EAAG,GAAKlG,GACPI,UAAAA,GACF,GAAMP,OAAAG,GAAAH,OAAAO,GAAAP,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GAFNQ;AAEM,GAIGkY,KAAWF,IClBXG,KAAoBA,CAAC7P,MACzBA,EACJ8P,QAAQ,WAAW,EAAE,EACrBA,QAAQ,sBAAsB,OAAO,EACrCA,QAAQ,WAAW,GAAG,EACtBC,YAAAA,GAGQC,KAAwBA,CAAChQ,MAAkB;AACtD,QAAMiQ,IAAaJ,GAAkB7P,CAAK,GACpCkQ,IAAUD,EAAWH,QAAQ,MAAM,EAAE;AAC3C,SAAO,CAAC,GAAG,oBAAIK,IAAI,CAACnQ,GAAOiQ,GAAYC,CAAO,CAAC,CAAC;AAClD,GCSME,KAAc;AAAA,EAClBC,OAAOC;AAAAA,EACPC,IAAIC;AAAAA,EACJC,WAAWC;AAAAA,EACXC,YAAYC;AAAAA,EACZC,aAAaC;AAAAA,EACbC,OAAOC;AAAAA,EACPC,cAAcC;AAAAA,EACdC,eAAeC;AAAAA,EACfC,WAAWC;AACb,GAEMC,KAAU;AAAA,EACdC,KAAKC;AAAAA,EACLC,QAAQC;AAAAA,EACRC,QAAQC;AAAAA,EACRC,SAASC;AAAAA,EACTC,MAAMC;AAAAA,EACNtS,UAAUuS;AAAAA,EACVC,MAAMC;AAAAA,EACNC,UAAU/B;AAAAA,EACV,GAAGF;AACL,GAKMkC,KAA8B,OAE9BC,KAAiBA,CAACvS,MAAyCwS,OAAOC,OAAOrC,IAAapQ,CAAK,GAEpF0S,KAAmBA,CAACvT,MACxBoS,GAAQpS,CAAI,GAGRwT,KAAqBA,CAAC7F,MAA4B;AAC7D,MAAI,CAACA,EAAM,QAAOwF;AAElB,QAAMrC,IAAaJ,GAAkB/C,CAAI;AACzC,MAAIyF,GAAetC,CAAU,EAAG,QAAOA;AAEvC,QAAMC,IAAUD,EAAWH,QAAQ,MAAM,EAAE;AAE3C,UAAQG,GAAAA;AAAAA,IACN,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;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAOC,MAAY,eAAeA,MAAY,SAAS,SAASoC;AAAAA,EAAAA;AAEtE;ACvFO,SAASM,GAAaC,GAAc;AACzC,QAAMC,IAAMD,EAAKE,YAAY,GAAG;AAChC,SAAOD,KAAO,IAAID,EAAKxW,MAAMyW,IAAM,CAAC,IAAID;AAC1C;AAEA,SAASG,GAAoBhX,GAAuB;AAClD,MAAI,CAACA,EAAO,QAAO;AAEnB,QAAMiX,IAAQjX,EAAMgR,MAAM,GAAI,EAAE,CAAC,EAAE7O,KAAAA;AACnC,MAAI8U,MAAU,YAAa,QAAO;AAElC,MAAIhD,IAAagD;AACjB,UAAIhD,EAAWiD,WAAW,IAAI,KAAKjD,EAAWiD,WAAW,IAAI,OAC3DjD,IAAaA,EAAW5T,MAAM,CAAC,IAG1B4T,EAAWH,QAAQ,QAAQ,EAAE,EAAEA,QAAQ,OAAO,GAAG;AAC1D;AAEA,MAAMqD,KAAgBA,CAACC,MAAiBA,EAAKF,WAAW,MAAM,GACxDG,KAAeA,CAACD,MAAiBA,EAAKF,WAAW,MAAM,GACvDI,KAAeA,CAACF,MAAiBA,EAAKF,WAAW,IAAI,GACrDK,KAAcA,CAACH,MAAiBA,EAAKF,WAAW,GAAG,KAAK,EAAEG,GAAaD,CAAI,KAAKA,MAAS,QACzFI,KAAgBA,CAACJ,MAAiBA,EAAKF,WAAW,GAAG,KAAK,EAAEC,GAAcC,CAAI,KAAKA,MAAS,QAE5FK,KAAmBA,CAACC,GAAgEC,MAAqB;AAC7G,EAAKD,EAAQE,IAAID,CAAQ,KACvBD,EAAQG,IAAIF,GAAU;AAAA,IAAEG,WAAW;AAAA,IAAGC,WAAW;AAAA,EAAA,CAAG;AAExD,GAEMC,KAAqBA,CAACN,GAAgEC,MAAqB;AAC/G,QAAM3V,IAAU0V,EAAQO,IAAIN,CAAQ;AACpC,EAAK3V,MACLA,EAAQ8V,aAAa;AACvB,GAEMI,KAAqBA,CAACR,GAAgEC,MAAqB;AAC/G,QAAM3V,IAAU0V,EAAQO,IAAIN,CAAQ;AACpC,EAAK3V,MACLA,EAAQ+V,aAAa;AACvB,GAQMI,KAAyBA,CAC7Bf,GACA/U,GACAqV,MACG;AACH,MAAIP,GAAcC,CAAI;AACpB,WAAO;AAAA,MAAE,GAAG/U;AAAAA,MAAO+V,iBAAiBpB,GAAoBI,EAAK/W,MAAM,CAAC,CAAC;AAAA,MAAGgY,QAAQ;AAAA,IAAA;AAGlF,MAAIhB,GAAaD,CAAI,GAAG;AAEtB,UAAMkB,IADWtB,GAAoBI,EAAK/W,MAAM,CAAC,CAAC,KAClBgC,EAAM+V;AACtC,WAAIE,KAAab,GAAiBC,GAASY,CAAW,GAC/C;AAAA,MAAE,GAAGjW;AAAAA,MAAOiW,aAAAA;AAAAA,MAAaD,QAAQ;AAAA,IAAA;AAAA,EAC1C;AAEA,SAAKhW,EAAMiW,cAEPhB,GAAaF,CAAI,IACZ;AAAA,IAAE,GAAG/U;AAAAA,IAAOgW,QAAQ;AAAA,EAAA,IAGxBhW,EAAMgW,SAEPd,GAAYH,CAAI,KAClBY,GAAmBN,GAASrV,EAAMiW,WAAW,GACtCjW,MAGLmV,GAAcJ,CAAI,KACpBc,GAAmBR,GAASrV,EAAMiW,WAAW,GAGxCjW,KAXmBA,IANKA;AAkBjC;AAEO,SAASkW,GAAiBC,GAAmB;AAClD,MAAI,CAACA,KAAY,OAAOA,KAAa,iBAAiB,CAAA;AAEtD,QAAMd,wBAAce,IAAAA;AACpB,MAAIpW,IAA0B;AAAA,IAC5BiW,aAAa;AAAA,IACbF,iBAAiB;AAAA,IACjBC,QAAQ;AAAA,EAAA;AAGV,QAAMxS,IAAQ2S,EAASxH,MAAM,OAAO;AACpC,aAAWoG,KAAQvR;AACjBxD,IAAAA,IAAQ8V,GAAuBf,GAAM/U,GAAOqV,CAAO;AAGrD,SAAOgB,MAAMta,KAAKsZ,EAAQiB,QAAAA,CAAS,EAAExU,IAAI,CAAC,CAACwT,GAAU;AAAA,IAAEG,WAAAA;AAAAA,IAAWC,WAAAA;AAAAA,EAAAA,CAAW,OAAO;AAAA,IAClFJ,UAAAA;AAAAA,IACAG,WAAAA;AAAAA,IACAC,WAAAA;AAAAA,EAAAA,EACA;AACJ;AAEO,SAASa,GAAuBJ,GAAmB;AACxD,SAAOD,GAAiBC,CAAQ,EAAErU,IAC/B6R,CAAAA,OACE;AAAA,IACC6C,MAAM;AAAA,IACNC,UAAUlC,GAAaZ,EAAK2B,QAAQ;AAAA,IACpCA,UAAU3B,EAAK2B;AAAAA,IACfG,WAAW9B,EAAK8B;AAAAA,IAChBC,WAAW/B,EAAK+B;AAAAA,EAAAA,EAEtB;AACF;AAEO,SAASgB,GAAqBP,GAAmB;AACtD,SAAOD,GAAiBC,CAAQ,EAAErU,IAAK6R,CAAAA,MAASA,EAAK2B,QAAQ;AAC/D;AAIA,MAAMqB,KAAqBA,CAAC5B,MAAiBD,GAAcC,CAAI,KAAKA,EAAKF,WAAW,aAAa,GAE3F+B,KAAwBA,CAAC7B,MACzBA,EAAKF,WAAW,GAAG,KACnBE,EAAKF,WAAW,GAAG,KACnBE,EAAKF,WAAW,GAAG,IAAU,KAC1BE,EAAKjV,WAAW,IAGnB+W,KAAiBA,CAAC9B,GAAc+B,GAAoBC,MAAuB;AAC/E,MAAIhC,EAAKF,WAAW,GAAG,GAAG;AACxB,UAAMjX,IAAOmX,EAAK/W,MAAM,CAAC;AACzB8Y,IAAAA,EAASjT,KAAKjG,CAAI,GAClBmZ,EAASlT,KAAKjG,CAAI;AAClB;AAAA,EACF;AAEA,MAAImX,EAAKF,WAAW,GAAG,GAAG;AACxBiC,IAAAA,EAASjT,KAAKkR,EAAK/W,MAAM,CAAC,CAAC;AAC3B;AAAA,EACF;AAEA,EAAI+W,EAAKF,WAAW,GAAG,KACrBkC,EAASlT,KAAKkR,EAAK/W,MAAM,CAAC,CAAC;AAE/B,GAEMgZ,KAAgBA,CAACxT,GAAiByT,GAAoBH,GAAoBC,MAAuB;AACrG,MAAI9T,IAAQgU;AAEZ,SAAOhU,IAAQO,EAAMzF,UAAQ;AAC3B,UAAMgX,IAAOvR,EAAMP,CAAK,KAAK;AAC7B,QAAI0T,GAAmB5B,CAAI,KAAKE,GAAaF,CAAI,KAAK6B,GAAsB7B,CAAI;AAC9E;AAGF8B,IAAAA,GAAe9B,GAAM+B,GAAUC,CAAQ,GACvC9T,KAAS;AAAA,EACX;AAEA,UAAI6T,EAAS/Y,SAAS,KAAKgZ,EAAShZ,SAAS,OAC3C+Y,EAASjT,KAAK,EAAE,GAChBkT,EAASlT,KAAK,EAAE,IAGXZ;AACT,GAEMiU,KAAeA,CAAC1T,GAAiByT,MAAuB;AAC5D,QAAME,IAAYxC,IAAqBnR,EAAMyT,CAAU,KAAK,IAAIjZ,MAAM,CAAC,CAAC,GAClEoZ,IAAO5T,EAAMyT,IAAa,CAAC,KAAK;AACtC,MAAI,CAACjC,GAAaoC,CAAI,EAAG,QAAO;AAAA,IAAEC,WAAWJ,IAAa;AAAA,EAAA;AAG1D,QAAM3B,IADYX,GAAoByC,EAAKpZ,MAAM,CAAC,CAAC,KACrBmZ,KAAa,IACrCL,IAAqB,CAAA,GACrBC,IAAqB,CAAA;AAE3B,MAAI9T,IAAQgU,IAAa;AACzB,SAAOhU,IAAQO,EAAMzF,UAAQ;AAC3B,UAAM4B,IAAU6D,EAAMP,CAAK,KAAK;AAChC,QAAI0T,GAAmBhX,CAAO,EAAG;AAEjC,QAAI,CAACsV,GAAatV,CAAO,GAAG;AAC1BsD,MAAAA,KAAS;AACT;AAAA,IACF;AAEAA,IAAAA,IAAQ+T,GAAcxT,GAAOP,IAAQ,GAAG6T,GAAUC,CAAQ;AAAA,EAC5D;AAEA,SAAO;AAAA,IACLM,WAAWpU;AAAAA,IACXqU,SAAS;AAAA,MAAEhC,UAAAA;AAAAA,MAAUwB,UAAUA,EAAShT,KAAK;AAAA,CAAI;AAAA,MAAGiT,UAAUA,EAASjT,KAAK;AAAA,CAAI;AAAA,IAAA;AAAA,EAAE;AAEtF;AAEO,SAASyT,GAAsBpB,GAAmB;AACvD,MAAI,CAACA,KAAY,OAAOA,KAAa,iBAAiB,CAAA;AAEtD,QAAM3S,IAAQ2S,EAASxH,MAAM,OAAO,GAC9B6I,IAA8B,CAAA;AAEpC,MAAIC,IAAI;AACR,SAAOA,IAAIjU,EAAMzF,UAAQ;AACvB,UAAMgX,IAAOvR,EAAMiU,CAAC,KAAK;AACzB,QAAI,CAAC3C,GAAcC,CAAI,GAAG;AACxB0C,MAAAA,KAAK;AACL;AAAA,IACF;AAEA,UAAM;AAAA,MAAEJ,WAAAA;AAAAA,MAAWC,SAAAA;AAAAA,IAAAA,IAAYJ,GAAa1T,GAAOiU,CAAC;AACpD,IAAIH,KAASE,EAAS3T,KAAKyT,CAAO,GAClCG,IAAIhS,KAAKyJ,IAAImI,GAAWI,IAAI,CAAC;AAAA,EAC/B;AAEA,SAAOD;AACT;AC9NA,MAAME,KAAsC;AAAA,EAC1CC,aAAa;AAAA,EACbC,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,OAAO;AAAA,EACPC,WAAW;AACb,GAEMC,KAAuC;AAAA,EAC3CC,SAAS;AAAA,EACTC,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChBC,iBAAiB;AAAA,EACjBC,iBAAiB;AAAA,EACjBC,SAAS;AAAA,EACTC,WAAW;AAAA,EACXC,QAAQ;AACV,GAWaC,KAAoBA,CAAChX,MAAkBA,EAAM8P,QAAQ,UAAU,EAAE,EAAEC,YAAAA,GAE1EkH,KAAcA,CAACjX,MACZA,EACJgN,MAAM,GAAG,EACTjD,OAAQkJ,CAAAA,MAAUA,EAAM7W,SAAS,CAAC,EAClC+D,IAAK8S,OAAUA,EAAM,CAAC,EAAEiE,gBAAgBjE,EAAM5W,MAAM,CAAC,CAAC,EACtD8F,KAAK,GAAG,GAGAgV,KAAcA,CAACC,MAAyBJ,GAAkBI,EAAWC,QAAQ,MAAM,GAEnFC,KAAeA,CAACtX,MAAkB;AAC7C,QAAMiQ,IAAa+G,GAAkBhX,CAAK;AAC1C,SAAO+V,GAAY9F,CAAU,KAAKgH,GAAYhH,EAAWH,QAAQ,MAAM,GAAG,CAAC;AAC7E,GAEayH,KAAgBA,CAACH,MAAyB;AACrD,QAAM/Y,IAAQ+Y,EAAW/Y,OAAOmZ,UAAUJ,EAAWI;AACrD,MAAI,CAACnZ,KAAS,OAAOA,KAAU,SAAU,QAAO;AAEhD,QAAM4R,IAAa5R,EAAMyR,QAAQ,MAAM,GAAG;AAC1C,SAAI0G,GAAavG,CAAU,IAAUuG,GAAavG,CAAU,IACxDA,EAAWhP,SAAS,QAAQ,IAAU,YACnC;AACT,GAEawW,KAAeA,CAACL,MAAyB;AACpD,QAAM/Y,IAAQ+Y,EAAW/Y,OAAOmZ,UAAUJ,EAAWI;AACrD,SAAOnZ,MAAU,WAAWA,MAAU,kBAAkBA,MAAU;AACpE,GAEaqZ,KAAiBA,CAACN,MACzBK,GAAaL,CAAU,IAClB;AAAA,EAAEtK,MAAM;AAAA,EAAQ7H,MAAM;AAAA,IAGxB;AAAA,EAAE6H,MAAM;AAAA,EAAQ7H,MAAM0N,GAAmBwE,GAAYC,CAAU,CAAC;AAAA,GAG5DO,KAAiBA,CAACP,GAAsBQ,GAAiBC,MAA2B;AAE/F,QAAMhT,IAAwB,CAAC;AAAA,IAAEgQ,MAAM;AAAA,IAAQ5Y,MADjC4b,KAAiBP,GAAaF,EAAWC,QAAQ,MAAM;AAAA,IACTS,MAAM;AAAA,EAAA,CAAM;AAExE,EAAIF,KACF/S,EAAM3C,KAAK;AAAA,IAAE2S,MAAM;AAAA,IAAQ5Y,MAAM2b;AAAAA,IAAQG,OAAO;AAAA,EAAA,CAAM;AAGxD,QAAMC,IAAaT,GAAcH,CAAU;AAC3C,SAAIY,KAAcA,MAAe,eAC/BnT,EAAM3C,KAAK;AAAA,IAAE2S,MAAM;AAAA,IAAQ5Y,MAAM+b;AAAAA,IAAYD,OAAO;AAAA,EAAA,CAAM,GAGrDlT;AACT,GAEaoT,KAAiBA,CAACb,MAAyB;AACtD,QAAMpb,IAAQob,EAAW/Y,OAAOrC;AAChC,SAAI,CAACA,KAAS,OAAOA,KAAU,YAAY0Y,MAAMwD,QAAQlc,CAAK,IAAU,OACjEA;AACT,GAEamc,KAAkBA,CAACf,MAAyB;AACvD,QAAMgB,IAAShB,EAAW/Y,OAAO+Z;AACjC,SAAI,CAACA,KAAU,OAAOA,KAAW,YAAY1D,MAAMwD,QAAQE,CAAM,IAAU,OACpEA;AACT,GAEaC,IAAiBA,CAACrY,MACzB,OAAOA,KAAU,YAAYA,EAAM7B,OAAO/B,SAAS,IAAU4D,IAC1D,MAGIsY,KAAiBA,CAACtY,MACzB,CAACA,KAAS,OAAOA,KAAU,YAAY0U,MAAMwD,QAAQlY,CAAK,IAAU,OACjEA,GAGIuY,KAAiBA,CAACnB,GAAsBtV,MAAgB;AACnE,QAAMzD,IAAQia,GAAelB,EAAW/Y,KAAK;AAC7C,SAAKA,IACEia,GAAeja,EAAMyD,CAAG,CAAC,IADb;AAErB,GAEM0W,KAAoBA,CAACxY,MAAkBA,EAAM8P,QAAQ,OAAO,GAAG,EAAEA,QAAQ,QAAQ,EAAE,GAEnF2I,KAAgBA,CAACzY,MAAkBA,EAAMiB,SAAS,MAAM,KAAKjB,EAAMiB,SAAS,MAAM,KAAKjB,EAAMiB,SAAS,IAAI,GAE1GyX,KAA+BA,CAACtB,MAAyB;AAC7D,QAAMgB,IAASD,GAAgBf,CAAU;AACzC,SAAO,CAACmB,GAAenB,GAAY,UAAU,GAAGkB,GAAeF,GAAQO,QAAQ,CAAC,EAAE5O,OAAOrI,OAAO;AAGlG,GAEMkX,KAA8BA,CAACC,MAAmB;AACtD,QAAMC,IAASR,GAAeO,CAAK;AACnC,MAAI,CAACC,EAAQ,QAAO;AAEpB,QAAMC,IAAUV,EAAeS,EAAOnF,QAAQ,KAAK0E,EAAeS,EAAOE,YAAY,KAAKX,EAAeS,EAAOjG,IAAI;AACpH,SAAKkG,IAEE;AAAA,IACLpF,UAAU6E,GAAkBO,CAAO;AAAA,IACnCjF,WAAW,OAAOgF,EAAOhF,aAAc,WAAWgF,EAAOhF,YAAY;AAAA,IACrEC,WAAW,OAAO+E,EAAO/E,aAAc,WAAW+E,EAAO/E,YAAY;AAAA,IACrEkF,MAAMZ,EAAeS,EAAOG,IAAI,KAAK1Z;AAAAA,IACrC2Z,QAAQb,EAAeS,EAAOI,MAAM,KAAK3Z;AAAAA,IACzC4Z,OAAOd,EAAeS,EAAOK,KAAK,KAAK5Z;AAAAA,EAAAA,IARpB;AAUvB,GAEa6Z,KAA6BA,CAAChC,MAAyB;AAClE,QAAMiC,IAAkC,CAAA;AAExC,aAAWV,KAAYD,GAA6BtB,CAAU,GAAG;AAC/D,UAAMzC,IAAUD,MAAMwD,QAAQS,EAASU,KAAK,IAAIV,EAASU,QAAQ,CAAA;AAEjE,eAAWR,KAASlE,GAAS;AAC3B,YAAM2E,IAAaV,GAA4BC,CAAK;AACpD,MAAKS,KACLD,EAAMnX,KAAKoX,CAAU;AAAA,IACvB;AAAA,EACF;AAEA,SAAOD;AACT,GAEaE,KAAwBA,CAACnC,MAAyB;AAC7D,QAAMpb,IAAQic,GAAeb,CAAU,GACjCoC,IAAYnB,EAAerc,GAAOid,IAAI;AAC5C,MAAIO,EAAW,QAAOA;AAEtB,aAAWb,KAAYD,GAA6BtB,CAAU,GAAG;AAC/D,UAAMqC,IAAepB,EAAeM,EAASM,IAAI;AACjD,QAAIQ,EAAc,QAAOA;AAAAA,EAC3B;AAEA,QAAMC,IAAYN,GAA2BhC,CAAU,EACpDjX,IAAK6R,CAAAA,MAASA,EAAKiH,IAAI,EACvBlP,OAAO,CAACkP,MAAyBvX,EAAQuX,CAAK;AACjD,MAAIS,EAAUtd,SAAS,EAAG,QAAOsd,EAAUvX,KAAK;AAAA,CAAI;AAEpD,QAAMwX,IAAYtB,EAAerc,GAAO2d,SAAS;AACjD,SAAIA,KAAalB,GAAckB,CAAS,IAAUA,IAE3C;AACT,GAEaC,KAAuCA,CAACP,MAAoC;AACvF,QAAMQ,wBAAW1J,IAAAA,GACX2J,IAA2B,CAAA;AAEjC,aAAW9H,KAAQqH;AACjB,IAAIQ,EAAKjG,IAAI5B,EAAK2B,QAAQ,MAC1BkG,EAAKE,IAAI/H,EAAK2B,QAAQ,GAEtBmG,EAAS5X,KAAK;AAAA,MACZ2S,MAAM;AAAA,MACNC,UAAUlC,GAAaZ,EAAK2B,QAAQ;AAAA,MACpCA,UAAU3B,EAAK2B;AAAAA,MACfG,WAAW9B,EAAK8B;AAAAA,MAChBC,WAAW/B,EAAK+B;AAAAA,IAAAA,CACjB;AAGH,SAAO+F;AACT,GAEaE,KAAkCA,CAACX,MACvC3E,MAAMta,KAAK,IAAI+V,IAAIkJ,EAAMlZ,IAAK6R,CAAAA,MAASA,EAAK2B,QAAQ,CAAC,CAAC,GAGlDsG,KAAgBA,CAAC7C,MAAyB;AACrD,QAAM8C,IAAe/B,GAAgBf,CAAU;AAE/C,SACEiB,EAAejB,EAAW/Y,OAAO+Z,MAAM,KACvCC,EAAe6B,GAAcC,aAAa,KAC1C9B,EAAe6B,GAAcvE,OAAO,KACpC0C,EAAe6B,GAAcE,MAAM,KACnC/B,EAAe6B,GAAcngB,OAAO;AAExC,GAEasgB,KAAyBA,CAACra,MAAkB;AACvD,QAAMsa,IAAQta,EAAMsa,MAAM,kEAAkE;AAC5F,SAAKA,IAEE;AAAA,IACLC,WAAWlC,EAAeiC,EAAM,CAAC,CAAC,KAAK/a;AAAAA,IACvCxF,SAASse,EAAeiC,EAAM,CAAC,CAAC,KAAK;AAAA,EAAA,IAJpB;AAMrB,GAEaE,KAAeA,CAACpD,MAAyB;AACpD,QAAMpb,IAAQic,GAAeb,CAAU;AACvC,SACEiB,EAAerc,GAAOmD,IAAI,KAC1BkZ,EAAerc,GAAOue,SAAS,KAC/BlC,EAAerc,GAAOsa,KAAK,KAC3B+B,EAAerc,GAAOye,UAAU,KAChClb;AAEJ,GAEamb,KAAuBA,CAAC/G,OAC5B;AAAA,EACLkB,MAAM;AAAA,EACN5Y,MAAM2W,GAAae,CAAQ;AAAA,EAC3BA,UAAAA;AAAAA,IAISgH,KAAoBA,CAACvD,GAAsBwD,MAClD,CAACnD,GAAaL,CAAU,KAAK,CAACA,EAAW/Y,OAAOwc,YAAkBD,IAE/D,CADmB;AAAA,EAAE9N,MAAM;AAAA,EAAW7Q,MAAMmb,EAAW/Y,MAAMwc;AAAAA,GAChD,GAAGD,CAAM,GAGlBE,KAAgBA,CAACtG,MACrBoB,GAAsBpB,KAAYjV,MAAS,EAAEY,IAAKwV,CAAAA,OAAa;AAAA,EACpE7I,MAAM;AAAA,EACNiO,UAAU;AAAA,EACV5F,UAAUQ,EAAQR;AAAAA,EAClBC,UAAUO,EAAQP;AAAAA,EAClB4F,YAAY;AAAA,EACZ,GAGSC,KAAuBA,CAACzG,MAA6BI,GAAuBJ,KAAYjV,MAAS,GAEjG2b,KAAoBA,CAAC1G,MAA6BO,GAAqBP,KAAYjV,MAAS,GC7P5F4b,KAAkC/D,CAAAA,MAAe;AAC5D,QAAM5C,IAAW+E,GAAsBnC,CAAU,GAC3CgE,IAAgBhC,GAA2BhC,CAAU,GAErDvS,IAAQ8S,GAAeP,GAAY7X,QAAW,aAAa,GAC3D8b,IAAeJ,GAAqBzG,CAAQ;AAClD,EAAI6G,EAAajf,SAAS,IACxByI,EAAM3C,KAAK,GAAGmZ,CAAY,IAE1BxW,EAAM3C,KAAK,GAAG0X,GAAqCwB,CAAa,CAAC;AAGnE,QAAMR,IAAkB,CAAC,GAAGE,GAActG,CAAQ,CAAC;AAEnD,MAAIoG,EAAOxe,WAAW;AACpB,eAAW4V,KAAQoJ;AACjB,MAAI,CAACpJ,EAAKkH,UAAU,CAAClH,EAAKmH,SAC1ByB,EAAO1Y,KAAK;AAAA,QACV4K,MAAM;AAAA,QACNiO,UAAU;AAAA,QACV5F,UAAUnD,EAAKkH,UAAU;AAAA,QACzB9D,UAAUpD,EAAKmH,SAAS;AAAA,QACxB6B,YAAY;AAAA,MAAA,CACb;AAIL,MAAIJ,EAAOxe,WAAW,GAAG;AACvB,UAAMkf,IAAaJ,GAAkB1G,CAAQ;AAC7C,IAAI8G,EAAWlf,WAAW,KACxBkf,EAAWpZ,KAAK,GAAG8X,GAAgCoB,CAAa,CAAC,GAE/DE,EAAWlf,SAAS,KACtBwe,EAAO1Y,KAAK;AAAA,MAAE4K,MAAM;AAAA,MAAcwO,YAAAA;AAAAA,IAAAA,CAAY;AAAA,EAElD;AAEA,SAAO;AAAA,IACLC,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQD,GAAkBvD,GAAYwD,CAAM;AAAA,EAAA;AAEhD,GC5CMY,KAAgBA,CAACrG,GAAkBC,MAChC,CACL;AAAA,EACEtI,MAAM;AAAA,EACNiO,UAAU;AAAA,EACV5F,UAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACA4F,YAAY;AAAA,CACb,GAIQS,KAA4BrE,CAAAA,MAAe;AACtD,QAAMpb,IAAQic,GAAeb,CAAU,GACjCgB,IAASD,GAAgBf,CAAU,GAEnCzD,IACJ0E,EAAerc,GAAO2X,QAAQ,KAC9B0E,EAAerc,GAAO0f,SAAS,KAC/BrD,EAAeD,GAAQzE,QAAQ,KAC/BpU,QAEI4V,IAAWkD,EAAeD,GAAQuD,SAAS,KAAKtD,EAAerc,GAAO4f,UAAU,KAAKrc,QACrF6V,IAAWiD,EAAeD,GAAQyD,SAAS,KAAKxD,EAAerc,GAAO8f,UAAU,KAAKvc,QAErFsF,IAAQ8S,GAAeP,GAAY7X,QAAW,WAAW;AAC/D,EAAIoU,KACF9O,EAAM3C,KAAKwY,GAAqB/G,CAAQ,CAAC;AAG3C,QAAMoI,IACJ5G,MAAa5V,UAAa6V,MAAa7V,SACnCic,GAAcrG,GAAUC,CAAQ,IAChC0F,GAAczC,EAAeD,GAAQa,IAAI,CAAC;AAEhD,SAAO;AAAA,IACLsC,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQD,GAAkBvD,GAAY2E,CAAU;AAAA,EAAA;AAEpD,GCrCMC,KAAWA,CAAChc,MACT,OAAOA,KAAU,YAAYA,MAAU,QAAQ,CAAC0U,MAAMwD,QAAQlY,CAAK,GAGtEic,KAAsBA,CAACjc,MAAkB;AAC7C,MAAI;AACF,UAAMkc,IAAkBhgB,KAAKigB,MAAMnc,CAAK;AACxC,WAAOgc,GAASE,CAAM,IAAIA,IAAS;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAEME,KAAgBA,CAACpgB,MACjBggB,GAAShgB,CAAK,IAAUA,IAExB,OAAOA,KAAU,YAAYA,EAAMmC,KAAAA,EAAO/B,SAAS,IAC9C6f,GAAoBjgB,CAAK,IAG3B,MAGHqc,KAAiBA,CAACrY,MAClB,OAAOA,KAAU,YAAYA,EAAM7B,OAAO/B,SAAS,IAAU4D,IAC1D,MAGHqc,KAAkBA,CAACrc,MAAkC;AACzD,QAAMsc,IAAcjE,GAAerY,CAAK;AACxC,MAAIsc,EAAa,QAAOA;AAExB,MAAI5H,MAAMwD,QAAQlY,CAAK,GAAG;AACxB,UAAM6B,IAAQ7B,EAAMG,IAAIkc,EAAe,EAAEtS,OAAO,CAACqJ,MAAyBA,MAAS,IAAI;AACvF,WAAOvR,EAAMzF,SAAS,IAAIyF,EAAMM,KAAK;AAAA,CAAI,IAAI;AAAA,EAC/C;AAEA,SAAK6Z,GAAShc,CAAK,IAGjBqc,GAAgBrc,EAAMuc,QAAQ,KAC9BF,GAAgBrc,EAAMuE,MAAM,KAC5B8X,GAAgBrc,EAAM/D,IAAI,KAC1BogB,GAAgBrc,EAAMiC,OAAO,IANF;AAQ/B,GAEMua,KAAsBA,CAACxc,MAAmD;AAC9E,MAAI,OAAOA,KAAU,YAAYA,EAAM7B,KAAAA,EAAO/B,SAAS;AACrD,WAAO;AAAA,MAAE2C,OAAOiB;AAAAA,MAAOhB,aAAaO;AAAAA,IAAAA;AAGtC,MAAI,CAACyc,GAAShc,CAAK,EAAG,QAAO;AAC7B,QAAMjB,IAAQsZ,GAAerY,EAAMjB,KAAK;AACxC,SAAKA,IAEE;AAAA,IACLA,OAAAA;AAAAA,IACAC,aAAaqZ,GAAerY,EAAMhB,WAAW,KAAKO;AAAAA,EAAAA,IAJjC;AAMrB,GAEMkd,KAAgBA,CAACzc,GAAgBsB,MAAoD;AACzF,MAAI,CAAC0a,GAAShc,CAAK,EAAG,QAAO;AAE7B,QAAML,IAAW0Y,GAAerY,EAAML,QAAQ;AAC9C,MAAI,CAACA,EAAU,QAAO;AAEtB,QAAMM,IAAUyU,MAAMwD,QAAQlY,EAAMC,OAAO,IACvCD,EAAMC,QAAQE,IAAIqc,EAAmB,EAAEzS,OAAO,CAACjL,MAA8CA,MAAW,IAAI,IAC5G,CAAA,GACEgO,IAAOuL,GAAerY,EAAM8M,IAAI,GAChC5L,IACJ,OAAOlB,EAAM0c,UAAW,YACpB1c,EAAM0c,SACN,OAAO1c,EAAMkB,qBAAsB,YACjClB,EAAMkB,oBACN4L,MAAS,cAAcA,MAAS;AAExC,SAAI7M,EAAQ7D,WAAW,KAAK,CAAC8E,IAA0B,OAEhD;AAAA,IACLL,IAAIwX,GAAerY,EAAMa,EAAE,KAAK,YAAYS,CAAK;AAAA,IACjD3B,UAAAA;AAAAA,IACAM,SAAAA;AAAAA,IACAc,UACE,OAAOf,EAAMe,YAAa,YAAYf,EAAMe,WAAW+L,MAAS,kBAAkBA,MAAS;AAAA,IAC7FnL,UAAU,OAAO3B,EAAM2B,YAAa,YAAY3B,EAAM2B,WAAW;AAAA,IACjET,mBAAAA;AAAAA,EAAAA;AAEJ,GAEMyb,KAAqBA,CAAC3gB,MAAmB;AAC7C,QAAM8c,IAASsD,GAAcpgB,CAAK;AAClC,MAAI,CAAC8c,KAAU,CAACpE,MAAMwD,QAAQY,EAAOrY,SAAS,EAAG,QAAO;AAExD,QAAMA,IAAYqY,EAAOrY,UAAUN,IAAIsc,EAAa,EAAE1S,OAAO,CAACpK,MACrDA,MAAa,IACrB;AACD,SAAIc,EAAUrE,WAAW,IAAU,OAE5B;AAAA,IACL0Q,MAAM;AAAA,IACNrM,WAAAA;AAAAA,EAAAA;AAEJ,GAEamc,KAAyBA,CAACC,MAAqD;AAC1F,QAAM;AAAA,IAAElF,gBAAAA;AAAAA,IAAgBD,gBAAAA;AAAAA,IAAgBiD,mBAAAA;AAAAA,EAAAA,IAAsBkC;AAE9D,SAAQzF,CAAAA,MAAe;AACrB,UAAMtO,IAAeuT,GAAgBjF,EAAW/Y,OAAO+Z,MAAM,KAAKiE,GAAgBjF,EAAW/Y,OAAOsa,QAAQ,GACtGmE,IAAQH,GAAmBvF,EAAW/Y,OAAOrC,KAAK;AACxD,QAAI,CAAC8M,KAAgB,CAACgU,EAAO,QAAO;AAEpC,UAAMC,IAAaD,IAAQ,GAAGA,EAAMrc,UAAUrE,MAAM,SAAS0gB,EAAMrc,UAAUrE,WAAW,IAAI,KAAK,GAAG,KAAKmD,QACnGqb,IAAS9R,IAAe,CAAA,IAAK,CAACgU,CAAM;AAE1C,WAAO;AAAA,MACLvB,WAAW7D,EAAeN,CAAU;AAAA,MACpCvS,OAAO8S,EAAeP,GAAY2F,GAAY,UAAU;AAAA,MACxDnC,QAAQD,EAAkBvD,GAAYwD,CAAM;AAAA,MAC5CoC,YAAY;AAAA,IAAA;AAAA,EAEhB;AACF,GC9HaC,KAA4B7F,CAAAA,MAAe;AACtD,QAAMpb,IAAQic,GAAeb,CAAU,GACjCgB,IAASD,GAAgBf,CAAU,GAEnCzD,IACJ0E,EAAerc,GAAO2X,QAAQ,KAC9B0E,EAAerc,GAAO0f,SAAS,KAC/BrD,EAAerc,GAAOgW,IAAI,KAC1BqG,EAAeD,GAAQzE,QAAQ,KAC/B0E,EAAeD,GAAQpG,IAAI,KAC3BqG,EAAeD,GAAQvF,IAAI,KAC3BtT,QAEIsF,IAAQ8S,GAAeP,GAAY7X,QAAW,WAAW;AAC/D,SAAIoU,KACF9O,EAAM3C,KAAKwY,GAAqB/G,CAAQ,CAAC,GAGpC;AAAA,IACL4H,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQD,GAAkBvD,GAAY,CAAA,CAAE;AAAA,EAAA;AAE5C,GAEa8F,KAA4B9F,CAAAA,MAAe;AACtD,QAAMpb,IAAQic,GAAeb,CAAU,GACjCgB,IAASD,GAAgBf,CAAU,GACnC+F,IAAU9E,EAAerc,GAAOmhB,OAAO,KAAK5d,QAE5CsF,IAAQ8S,GAAeP,GAAY+F,GAAS,aAAa,GACzDvC,IAAkB,CAAA,GAElBwC,IAAanD,GAAc7C,CAAU;AAC3C,EAAIgG,KACFxC,EAAO1Y,KAAK;AAAA,IAAE4K,MAAM;AAAA,IAAQiO,UAAU;AAAA,IAAQsC,MAAMD;AAAAA,EAAAA,CAAY;AAGlE,QAAME,IAASjF,EAAeD,GAAQkF,MAAM;AAC5C,SAAIA,KAAUA,MAAWF,KACvBxC,EAAO1Y,KAAK;AAAA,IAAE4K,MAAM;AAAA,IAAQiO,UAAU;AAAA,IAAQsC,MAAMC;AAAAA,EAAAA,CAAQ,GAG1D,OAAOlF,GAAQmF,YAAa,YAC9B3C,EAAO1Y,KAAK;AAAA,IAAE4K,MAAM;AAAA,IAAQ7Q,MAAM,cAAcmc,EAAOmF,QAAQ;AAAA,EAAA,CAAI,GAG9D;AAAA,IACLhC,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQD,GAAkBvD,GAAYwD,CAAM;AAAA,EAAA;AAEhD,GAEa4C,KAA4BpG,CAAAA,MAAe;AACtD,QAAMpb,IAAQic,GAAeb,CAAU,GACjCgG,IAAanD,GAAc7C,CAAU,GACrCqG,IAAQpF,EAAerc,GAAO0hB,OAAO,KAAKne,QAE1CsF,IAAQ8S,GAAeP,GAAYqG,GAAO,cAAc,GACxD7C,IAAkBwC,IAAa,CAAC;AAAA,IAAEtQ,MAAM;AAAA,IAAQiO,UAAU;AAAA,IAAQsC,MAAMD;AAAAA,EAAAA,CAAY,IAAI,CAAA;AAE9F,SAAO;AAAA,IACL7B,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQD,GAAkBvD,GAAYwD,CAAM;AAAA,EAAA;AAEhD,GAEa+C,KAA4BvG,CAAAA,MAAe;AACtD,QAAMpb,IAAQic,GAAeb,CAAU,GACjCgG,IAAanD,GAAc7C,CAAU,GACrCsG,IAAUrF,EAAerc,GAAO0hB,OAAO,KAAKne,QAE5CsF,IAAQ8S,GAAeP,GAAYsG,GAAS,YAAY,GACxD9C,IAAkB,CAAA;AAExB,MAAIwC,GAAY;AACd,UAAM9B,IAAa8B,EAChBpQ,MAAM,OAAO,EACb7M,IAAKiT,CAAAA,MAASA,EAAKjV,KAAAA,CAAM,EACzB4L,OAAQqJ,CAAAA,MAASA,EAAKhX,SAAS,CAAC;AAEnC,IAAIkf,EAAWlf,SAAS,KACtBwe,EAAO1Y,KAAK;AAAA,MAAE4K,MAAM;AAAA,MAAcwO,YAAAA;AAAAA,IAAAA,CAAY;AAAA,EAElD;AAEA,SAAO;AAAA,IACLC,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQD,GAAkBvD,GAAYwD,CAAM;AAAA,EAAA;AAEhD,GAEagD,KAA6BxG,CAAAA,MAAe;AACvD,QAAMgG,IAAanD,GAAc7C,CAAU,GACrCyG,IAAeT,IAAa/C,GAAuB+C,CAAU,IAAI,MAEjE7C,IAAYC,GAAapD,CAAU,KAAKyG,GAActD,WACtD1V,IAAQ8S,GAAeP,GAAYmD,GAAW,YAAY,GAE1DuD,IAAkBD,GAAc9jB,WAAWqjB,GAC3CxC,IAAkBkD,IAAkB,CAAC;AAAA,IAAEhR,MAAM;AAAA,IAAQiO,UAAU;AAAA,IAAYsC,MAAMS;AAAAA,EAAAA,CAAiB,IAAI,CAAA;AAE5G,SAAO;AAAA,IACLvC,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQD,GAAkBvD,GAAYwD,CAAM;AAAA,EAAA;AAEhD,GC9GMvC,KAAiBA,CAACrY,MAClB,OAAOA,KAAU,YAAYA,EAAM7B,OAAO/B,SAAS,IAAU4D,IAC1D,MAGHsY,KAAiBA,CAACtY,MAClB,CAACA,KAAS,OAAOA,KAAU,YAAY0U,MAAMwD,QAAQlY,CAAK,IAAU,OACjEA,GAGH+d,KAAgBA,CAAC/d,MAAoC;AACzD,QAAMmS,IAAOmG,GAAetY,CAAK;AACjC,MAAI,CAACmS,EAAM,QAAO;AAElB,QAAMpY,IAAUse,GAAelG,EAAKpY,OAAO,KAAKse,GAAelG,EAAKtN,KAAK;AACzE,MAAI,CAAC9K,EAAS,QAAO;AACrB,QAAMyd,IAASa,GAAelG,EAAKqF,MAAM;AAEzC,SAAO;AAAA,IACLzY,OAAOhF;AAAAA,IACPqF,SAASoY,MAAW;AAAA,EAAA;AAExB,GAEMwG,KAAiBA,CAAChe,MAAmB;AACzC,MAAI,CAACA,EAAO,QAAO;AAAA,IAAEM,OAAO,CAAA;AAAA,IAAI2d,UAAU;AAAA,EAAA;AAE1C,QAAMC,KAAc,MAAM;AACxB,QAAIxJ,MAAMwD,QAAQlY,CAAK,EAAG,QAAOA;AACjC,UAAMme,IAAc7F,GAAetY,CAAK;AACxC,WAAI,CAACme,KAAe,CAACzJ,MAAMwD,QAAQiG,EAAYC,KAAK,IAAU,OACvDD,EAAYC;AAAAA,EACrB,GAAA;AAEA,SAAKF,IAEE;AAAA,IACL5d,OAAO4d,EAAW/d,IAAI4d,EAAa,EAAEhU,OAAO,CAACoI,MAA2BA,MAAS,IAAI;AAAA,IACrF8L,UAAU;AAAA,EAAA,IAJY;AAAA,IAAE3d,OAAO,CAAA;AAAA,IAAI2d,UAAU;AAAA,EAAA;AAMjD,GAEaI,KAA0BA,CAACxB,MAAsD;AAC5F,QAAM;AAAA,IAAElF,gBAAAA;AAAAA,IAAgBD,gBAAAA;AAAAA,IAAgBiD,mBAAAA;AAAAA,EAAAA,IAAsBkC;AAE9D,SAAQzF,CAAAA,MAAe;AACrB,UAAMkH,IAAaN,GAAe5G,EAAW/Y,OAAOrC,KAAK,GACnDuiB,IAAcP,GAAe5G,EAAW/Y,OAAO+Z,MAAM,GACrDoG,IAAYD,EAAYN,WAAWM,IAAcD;AACvD,QAAI,CAACE,EAAUP,SAAU,QAAO;AAEhC,UAAMG,IAAQI,EAAUle,OAClBme,IAAa,GAAGL,EAAMhiB,MAAM,QAAQgiB,EAAMhiB,WAAW,IAAI,KAAK,GAAG,IACjEyI,IAAQ8S,EAAeP,GAAYqH,GAAY,cAAc;AAEnE,QAAIL,EAAMhiB,WAAW;AACnB,aAAO;AAAA,QACLmf,WAAW7D,EAAeN,CAAU;AAAA,QACpCvS,OAAAA;AAAAA,QACA+V,QAAQD,EAAkBvD,GAAY,CAAC;AAAA,UAAEtK,MAAM;AAAA,UAAW7Q,MAAM;AAAA,QAAA,CAAY,CAAC;AAAA,MAAA;AAIjF,UAAM2e,IAAkB,CACtB;AAAA,MACE9N,MAAM;AAAA,MACNxM,OAAO8d;AAAAA,IAAAA,CACR;AAGH,WAAO;AAAA,MACL7C,WAAW7D,EAAeN,CAAU;AAAA,MACpCvS,OAAAA;AAAAA,MACA+V,QAAQD,EAAkBvD,GAAYwD,CAAM;AAAA,IAAA;AAAA,EAEhD;AACF,GCnFM8D,KAAiB9B,GAAuB;AAAA,EAC5CjF,gBAAAA;AAAAA,EAAAA,gBACAD;AAAAA,EACAiD,mBAAAA;AACF,CAAC,GAEKgE,KAAkBN,GAAwB;AAAA,EAC9C1G,gBAAAA;AAAAA,EAAAA,gBACAD;AAAAA,EACAiD,mBAAAA;AACF,CAAC,GAEYiE,KAA6BA,OACjC;AAAA,EACL5I,aAAamF;AAAAA,EACblF,MAAMiH;AAAAA,EACNhH,MAAMuF;AAAAA,EACNtF,MAAMwH;AAAAA,EACNvH,MAAMoH;AAAAA,EACN7d,UAAU+e;AAAAA,EACVrI,MAAM4G;AAAAA,EACN3G,OAAOsH;AAAAA,EACPiB,YAAYF;AAAAA,EACZpI,WAAWoI;AAAAA,ICxBTnI,KAAuC;AAAA,EAC3CC,SAAS;AAAA,EACTC,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AACrB,GAEMO,KAAcA,CAACjX,MACZA,EACJgN,MAAM,GAAG,EACTjD,OAAQkJ,CAAAA,MAAUA,EAAM7W,SAAS,CAAC,EAClC+D,IAAK8S,OAAUA,EAAM,CAAC,EAAEiE,gBAAgBjE,EAAM5W,MAAM,CAAC,CAAC,EACtD8F,KAAK,GAAG,GAGPmV,KAAeA,CAACD,MAAkB;AACtC,QAAMpH,IAAaJ,GAAkBwH,KAAQ,MAAM,EAAEvH,QAAQ,MAAM,GAAG;AACtE,SAAOmH,GAAYhH,CAAU;AAC/B,GAEMwH,KAAeA,CAACpZ,MAAmBA,MAAU,WAAWA,MAAU,gBAElEqZ,KAAiBA,CAACN,MAClBK,GAAaL,EAAW/Y,OAAOmZ,MAAM,IAChC;AAAA,EAAE1K,MAAM;AAAA,EAAQ7H,MAAM;AAAA,IAGxB;AAAA,EAAE6H,MAAM;AAAA,EAAQ7H,MAAM0N,GAAmByE,EAAWC,QAAQ,MAAM;AAAA,GAGrEE,KAAgBA,CAAClZ,MACjB,CAACA,KAAS,OAAOA,KAAU,WAAiB,OAC5CmY,GAAanY,CAAK,IAAUmY,GAAanY,CAAK,IAC9CA,EAAM4C,SAAS,QAAQ,IAAU,YAC9B,MAGH6d,KAAiBA,CAAC9e,MAAmB;AACzC,MAAI,OAAOA,KAAU,SAAU,QAAOA;AACtC,MAAIA,KAAU,KAA6B,QAAO;AAElD,MAAI;AACF,WAAO9D,KAAKC,UAAU6D,GAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAEM+e,KAAqBA,CAAC3H,MAAkC;AAC5D,QAAMwD,IAAkB,CAAA;AAExB,EAAInD,GAAaL,EAAW/Y,OAAOmZ,MAAM,KAAKJ,EAAW/Y,OAAOwc,aAC9DD,EAAO1Y,KAAK;AAAA,IAAE4K,MAAM;AAAA,IAAW7Q,MAAMmb,EAAW/Y,MAAMwc;AAAAA,EAAAA,CAAW;AAGnE,QAAMmE,IAAYF,GAAe1H,EAAW/Y,OAAOrC,KAAK;AACxD,EAAIgjB,KACFpE,EAAO1Y,KAAK;AAAA,IAAE4K,MAAM;AAAA,IAAQiO,UAAU;AAAA,IAAQsC,MAAM2B;AAAAA,EAAAA,CAAW;AAGjE,QAAM5B,IAAa0B,GAAe1H,EAAW/Y,OAAO+Z,MAAM;AAC1D,SAAIgF,KACFxC,EAAO1Y,KAAK;AAAA,IAAE4K,MAAM;AAAA,IAAQiO,UAAU;AAAA,IAAQsC,MAAMD;AAAAA,EAAAA,CAAY,GAG3DxC;AACT,GAEMqE,KAAoBA,CAAC7H,MAAyB;AAClD,QAAMvS,IAAwB,CAAC;AAAA,IAAEgQ,MAAM;AAAA,IAAQ5Y,MAAMqb,GAAaF,EAAWC,IAAI;AAAA,IAAGS,MAAM;AAAA,EAAA,CAAM,GAC1FE,IAAaT,GAAcH,EAAW/Y,OAAOmZ,MAAM;AACzD,SAAIQ,KACFnT,EAAM3C,KAAK;AAAA,IAAE2S,MAAM;AAAA,IAAQ5Y,MAAM+b;AAAAA,IAAYD,OAAO;AAAA,EAAA,CAAM,GAGrD;AAAA,IACLwD,WAAW7D,GAAeN,CAAU;AAAA,IACpCvS,OAAAA;AAAAA,IACA+V,QAAQmE,GAAmB3H,CAAU;AAAA,EAAA;AAEzC,GAEM8H,KAAqBA,CAACC,MACrBA,IACE;AAAA,EAAE,GAAGP,GAAAA;AAAAA,EAA8B,GAAGO;AAAAA,IADtBP,GAAAA,GAInBQ,KAAcA,CAAChI,GAAsBiI,MAAoC;AAC7E,QAAMC,IAAUlI,EAAWC,QAAQ;AACnC,aAAWvV,KAAOkO,GAAsBsP,CAAO,GAAG;AAChD,UAAMC,IAAWF,EAAcvd,CAAG;AAClC,QAAIyd,EAAU,QAAOA;AAAAA,EACvB;AAGF,GAEMC,KAAmBA,CACvBpI,GACAiI,GACApf,MACG;AACH,QAAMsf,IAAWH,GAAYhI,GAAYiI,CAAa;AACtD,MAAIE,GAAU;AACZ,UAAME,IAAWF,EAASnI,GAAYnX,CAAO;AAC7C,QAAIwf,EAAU,QAAOA;AAAAA,EACvB;AAEA,SAAOR,GAAkB7H,CAAU;AACrC,GAEasI,KAAkCA,CAACC,GAAyB1f,MAAyC;AAChH,QAAMof,IAAgBH,GAAmBjf,GAASof,aAAa;AAG/D,SAAO;AAAA,IAAE/e,OAFKqf,EAAYxf,IAAKiX,CAAAA,MAAeoI,GAAiBpI,GAAYiI,GAAepf,CAAO,CAAC;AAAA,EAEzFK;AACX,GChHasf,KAAWC,IAgElBC,KAAuBA,CAC3BnhB,GACAohB,GACAC,GACAC,IAAkB,OACf;AACH,EAAIA,KACFthB,EAAMshB,gBAAAA,GAGHF,EAAIG,QACPvhB,EAAMC,eAAAA,GAEJmhB,EAAIpM,YACNqM,IAAaD,EAAIpM,QAAQ;AAE7B;AAEA,SAAAwM,GAAA1oB,GAAA;AAAA,QAAAP,IAAAC,EAAA,CAAA,GAA4B;AAAA,IAAA4oB,KAAAA;AAAAA,EAAAA,IAAAtoB;AAA2D,MAAAC;AAAA,EAAAR,EAAA,CAAA,MAAA6oB,EAAAK,OAAAlpB,EAAA,CAAA,MAAA6oB,EAAAM,OAGjF3oB,kCAAmB,KAAAqoB,EAAGM,KAAW,KAAAN,EAAGK,IAAAA,CAAI,GAAIlpB,EAAA,CAAA,IAAA6oB,EAAAK,KAAAlpB,EAAA,CAAA,IAAA6oB,EAAAM,KAAAnpB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAA,MAAAS;AAAA,EAAAT,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAC5CH,IAAA,gBAAAc,EAAA6nB,GAAA,UAAA,CAAA,CAAA,GAAmBppB,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAU;AAAA,SAAAV,SAAAQ,KAFrBE,sBAAA0oB,GAAA,MAAA,EAAmB,OAAA,UAAgB,QAAA,UACjC5oB,UAAAA;AAAAA,IAAAA;AAAAA,IACAC;AAAAA,EAAAA,GACF,GAAcT,OAAAQ,GAAAR,OAAAU,KAAAA,IAAAV,EAAA,CAAA,GAHdU;AAGc;AAIlB,SAAA2oB,GAAA9oB,GAAA;AAAA,QAAAP,IAAAC,EAAA,CAAA,GAA0B;AAAA,IAAA4oB,KAAAA;AAAAA,IAAAC,YAAAA;AAAAA,EAAAA,IAAAvoB,GAUTC,IAAAqoB,EAAGjM,aAAH,GACAnc,IAAAooB,EAAGhM,aAAH;AAAkB,MAAAnc;AAAA,EAAAV,EAAA,CAAA,MAAA8oB,KAAA9oB,EAAA,CAAA,MAAA6oB,EAAAjL,YAAA5d,EAAA,CAAA,MAAA6oB,EAAApM,YACZ/b,IAAAA,MAAA;AACf,UAAAib,IAAakN,EAAGpM,YAAaoM,EAAGjL;AAChCkL,IAAAA,IAAanN,CAAI;AAAA,EAAC,GACnB3b,OAAA8oB,GAAA9oB,EAAA,CAAA,IAAA6oB,EAAAjL,UAAA5d,EAAA,CAAA,IAAA6oB,EAAApM,UAAAzc,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAe;AAAA,SAAAf,EAAA,CAAA,MAAA6oB,EAAAjL,YAAA5d,EAAA,CAAA,MAAAQ,KAAAR,EAAA,CAAA,MAAAS,KAAAT,SAAAU,KAPHK,IAAA,gBAAAQ,EAAC+nB,IAAA,EACW,UAAAT,EAAGjL,UACF,WAAApd,GACA,WAAAC,GACM,iBAAAC,EAAAA,CAGhB,GACDV,EAAA,CAAA,IAAA6oB,EAAAjL,UAAA5d,OAAAQ,GAAAR,OAAAS,GAAAT,OAAAU,GAAAV,OAAAe,KAAAA,IAAAf,EAAA,CAAA,GARFe;AAQE;AAIN,SAAAwoB,GAAAhpB,GAAA;AAAA,QAAAP,IAAAC,EAAA,EAAA,GAAgC;AAAA,IAAA4oB,KAAAA;AAAAA,IAAAC,YAAAA;AAAAA,EAAAA,IAAAvoB,GAO9BipB,IAAmBX,EAAGjI,OAAH,WAAAvY,QACnBohB,IAAsBjf,GAAQqe,EAAGG,QAASH,EAAGpM,WAInCjc,IAAAqoB,EAAGG,QAAH,KAECvoB,KAAAooB,EAAGhI,OAAH,aAECngB,IAAA+oB,IAAA,YAAA;AAAqC,MAAA1oB;AAAA,EAAAf,EAAA,CAAA,MAAA8oB,KAAA9oB,SAAA6oB,KACpC9nB,IAAA0G,CAAAA,MAAWmhB,GAAqBnhB,GAAOohB,GAAKC,GAAY,EAAI,GAAC9oB,OAAA8oB,GAAA9oB,OAAA6oB,GAAA7oB,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAG7D,QAAA+F,IAAA8iB,EAAGhI,QAAH,aAAA;AAAuC,MAAA5a;AAAA,EAAAjG,SAAA+F,KAFxCE,IAAA;AAAA,IAAAyjB,gBACU;AAAA,IAAWC,OACpB5jB;AAAAA,EAAAA,GACR/F,OAAA+F,GAAA/F,OAAAiG,KAAAA,IAAAjG,EAAA,CAAA;AAAA,MAAAkG;AAAA,SAAAlG,EAAA,CAAA,MAAAwpB,KAAAxpB,EAAA,CAAA,MAAA6oB,EAAA9jB,QAAA/E,EAAA,CAAA,MAAAQ,KAAAR,EAAA,CAAA,MAAAS,KAAAT,EAAA,CAAA,MAAAU,KAAAV,EAAA,EAAA,MAAAe,KAAAf,EAAA,EAAA,MAAAiG,KAVHC,sBAAC0jB,IAAA,EACO,MAAAppB,GACMgpB,YAAAA,GACL,OAAA/oB,GACQ,gBAAA,QACP,QAAAC,GACC,SAAAK,GACD,QAAAkF,GAKP4iB,YAAG9jB,MACN,GAAO/E,OAAAwpB,GAAAxpB,EAAA,CAAA,IAAA6oB,EAAA9jB,MAAA/E,OAAAQ,GAAAR,OAAAS,GAAAT,OAAAU,GAAAV,QAAAe,GAAAf,QAAAiG,GAAAjG,QAAAkG,KAAAA,IAAAlG,EAAA,EAAA,GAbPkG;AAaO;AAIX,SAAA2jB,GAAAtpB,GAAA;AAAA,QAAAP,IAAAC,EAAA,EAAA,GAAiC;AAAA,IAAA4oB,KAAAA;AAAAA,IAAAC,YAAAA;AAAAA,EAAAA,IAAAvoB,GAO/BipB,IAAmBX,EAAGjI,OAAH,WAAAvY,QAIT7H,IAAAqoB,EAAGG,QAAH,KAECvoB,IAAAooB,EAAGhI,QAAH,aAAA;AAAyC,MAAAngB;AAAA,EAAAV,EAAA,CAAA,MAAA8oB,KAAA9oB,SAAA6oB,KAEvCnoB,IAAA+G,CAAAA,MAAWmhB,GAAqBnhB,GAAOohB,GAAKC,CAAU,GAAC9oB,OAAA8oB,GAAA9oB,OAAA6oB,GAAA7oB,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAEvD,QAAAe,IAAA8nB,EAAGhI,QAAH,aAAA;AAAyC,MAAA9a;AAAA,EAAA/F,SAAAe,KAD1CgF,IAAA;AAAA,IAAA4jB,OACC5oB;AAAAA,IAAyC2oB,gBAChC;AAAA,EAAA,GACjB1pB,OAAAe,GAAAf,OAAA+F,KAAAA,IAAA/F,EAAA,CAAA;AAAA,MAAAiG;AAAA,SAAAjG,EAAA,CAAA,MAAAwpB,KAAAxpB,SAAA6oB,EAAA9jB,QAAA/E,EAAA,CAAA,MAAAQ,KAAAR,EAAA,CAAA,MAAAS,KAAAT,SAAAU,KAAAV,EAAA,EAAA,MAAA+F,KATHE,sBAAC2jB,IAAA,EACO,MAAAppB,GACMgpB,YAAAA,GACL,OAAA/oB,GACQ,gBAAA,aACN,SAAAC,GACD,QAAAqF,GAKP8iB,YAAG9jB,MACN,GAAO/E,OAAAwpB,GAAAxpB,EAAA,CAAA,IAAA6oB,EAAA9jB,MAAA/E,OAAAQ,GAAAR,OAAAS,GAAAT,OAAAU,GAAAV,QAAA+F,GAAA/F,QAAAiG,KAAAA,IAAAjG,EAAA,EAAA,GAZPiG;AAYO;AAIX,SAAA6jB,GAAAvpB,GAAA;AAAA,QAAAP,IAAAC,EAAA,CAAA,GAA0B;AAAA,IAAA4oB,KAAAA;AAAAA,IAAAkB,aAAAA;AAAAA,EAAAA,IAAAxpB,GASRC,IAAAqoB,EAAGjI,OAAH,WAAAvY,QAGH5H,IAAAspB,KAAA,CAAgBlB,EAAGhI,QAAnB,OAAA;AAA6C,MAAAngB;AAAA,EAAAV,SAAAS,KADzCC,IAAA;AAAA,IAAAipB,OACJlpB;AAAAA,EAAAA,GACRT,OAAAS,GAAAT,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAe;AAAA,SAAAf,EAAA,CAAA,MAAA6oB,EAAA9jB,QAAA/E,EAAA,CAAA,MAAAQ,KAAAR,EAAA,CAAA,MAAAU,KALHK,IAAA,gBAAAQ,EAACyoB,MACa,YAAAxpB,GACN,OAAA,YACO,aAAAE,GAIZmoB,UAAAA,EAAG9jB,KAAAA,CACN,GAAO/E,EAAA,CAAA,IAAA6oB,EAAA9jB,MAAA/E,OAAAQ,GAAAR,OAAAU,GAAAV,OAAAe,KAAAA,IAAAf,EAAA,CAAA,GARPe;AAQO;AAIX,SAAAkpB,GAAA1pB,GAAA;AAAA,QAAAP,IAAAC,EAAA,EAAA,GAAqB;AAAA,IAAA4oB,KAAAA;AAAAA,IAAAkB,aAAAA;AAAAA,IAAAjB,YAAAA;AAAAA,EAAAA,IAAAvoB;AASnB,UAAQsoB,EAAGlL,MAAAA;AAAAA,IAAK,KACT,UAAQ;AAAA,UAAAnd;AAAA,aAAAR,SAAA6oB,KACJroB,sBAACyoB,MAAwBJ,KAAAA,EAAAA,CAAG,GAAI7oB,OAAA6oB,GAAA7oB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GAAhCQ;AAAAA,IAAgC;AAAA,IAAA,KACpC,QAAM;AAAA,UAAAA;AAAA,aAAAR,EAAA,CAAA,MAAA8oB,KAAA9oB,SAAA6oB,KACFroB,IAAA,gBAAAe,EAAC8nB,IAAA,EAAsBR,KAAAA,GAAiBC,YAAAA,EAAAA,CAAU,GAAI9oB,OAAA8oB,GAAA9oB,OAAA6oB,GAAA7oB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GAAtDQ;AAAAA,IAAsD;AAAA,IAAA,KAC1D,QAAM;AAAA,UAAAA;AAAA,aAAAR,EAAA,CAAA,MAAA8oB,KAAA9oB,SAAA6oB,KACFroB,IAAAqoB,EAAGqB,YAAa,WACrB,gBAAA3oB,EAACgoB,IAAA,EAA4BV,KAAAA,GAAiBC,YAAAA,EAAAA,CAAU,IAExD,gBAAAvnB,EAACsoB,IAAA,EAA6BhB,KAAAA,GAAiBC,YAAAA,EAAAA,CAAU,GAC1D9oB,OAAA8oB,GAAA9oB,OAAA6oB,GAAA7oB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GAJMQ;AAAAA,IAIN;AAAA,IAAA,KACE,QAAM;AAAA,UAAAA;AAAA,aAAAR,EAAA,CAAA,MAAA+pB,KAAA/pB,SAAA6oB,KACFroB,IAAA,gBAAAe,EAACuoB,IAAA,EAAsBjB,KAAAA,GAAkBkB,aAAAA,EAAAA,CAAW,GAAI/pB,OAAA+pB,GAAA/pB,OAAA6oB,GAAA7oB,QAAAQ,KAAAA,IAAAR,EAAA,EAAA,GAAxDQ;AAAAA,IAAwD;AAAA,IAAA;AAAA,aAExD;AAAA,EAAI;AACd;AAGH,SAAA2pB,GAAA5pB,GAAA;AAAA,QAAAP,IAAAC,EAAA,EAAA,GAAuB;AAAA,IAAAmqB,KAAAA;AAAAA,EAAAA,IAAA7pB;AACrB,MAAI,CAAC6pB,KAAOA,EAAGxU,SAAU;AAAM,WAAS;AAExC,MAAIwU,EAAGxU,SAAU,QAAM;AAAA,QAAApV;AAAA,IAAAR,EAAA,CAAA,MAAAoqB,EAAArc,QACCvN,IAAAgb,GAAiB4O,EAAGrc,IAAK,GAAC/N,EAAA,CAAA,IAAAoqB,EAAArc,MAAA/N,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAhD,UAAAqqB,IAAsB7pB;AAA2B,QAAAC;AAAA,WAAAT,SAAAqqB,KAE/C5pB,IAAA,gBAAAc,EAAAmnB,GAAA,WAAA,EAA4B,SAAA,QAAc,QAAA,QAAc,QAAA,QAAkB,YAAA,MAAW,OAAA,MACnF,UAAA,gBAAAnnB,EAACyoB,IAAA,EAAa,SAAA,eAAyB,YAAA,UACrC,UAAA,gBAAAzoB,EAAC8oB,GAAA,EAAoB,MAAA,IAAiB,gBAAC,EAAA,CACzC,GACF,GAAqBrqB,OAAAqqB,GAAArqB,OAAAS,KAAAA,IAAAT,EAAA,CAAA,GAJrBS;AAAAA,EAIqB;AAExB,MAAAD;AAAA,EAAAR,EAAA,CAAA,MAAAoqB,EAAAlB,OAAAlpB,EAAA,CAAA,MAAAoqB,EAAAjB,OAKK3oB,kCAAmB,KAAA4pB,EAAGjB,KAAW,KAAAiB,EAAGlB,IAAAA,CAAI,GAAIlpB,EAAA,CAAA,IAAAoqB,EAAAlB,KAAAlpB,EAAA,CAAA,IAAAoqB,EAAAjB,KAAAnpB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAA,MAAAS;AAAA,EAAAT,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAC5CH,IAAA,gBAAAc,EAAA6nB,GAAA,UAAA,CAAA,CAAA,GAAmBppB,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAU;AAAA,SAAAV,SAAAQ,KAHvBE,IAAA,gBAAAa,EAAAmnB,GAAA,WAAA,EACE,4BAAAU,GAAA,MAAA,EAAqB,SAAA,QACnB5oB,UAAAA;AAAAA,IAAAA;AAAAA,IACAC;AAAAA,EAAAA,EAAAA,CACF,EAAA,CACF,GAAqBT,OAAAQ,GAAAR,OAAAU,KAAAA,IAAAV,EAAA,CAAA,GALrBU;AAKqB;AAIzB,SAAA4pB,GAAA/pB,GAAA;AAAA,QAAAP,IAAAC,EAAA,CAAA,GAAmB;AAAA,IAAAkmB,MAAAA;AAAAA,IAAAtC,UAAAA;AAAAA,EAAAA,IAAAtjB,GAUCC,IAAAqjB,IAAA,GAAcA,CAAQ,gBAAtB;AAAkD,MAAApjB;AAAA,EAAAT,SAAAmmB,KAE9D1lB,IAAA,gBAAAc,EAAC8E,GAAA,EAAO,IAAA,QAAQ8f,UAAAA,GAAK,GAAMnmB,OAAAmmB,GAAAnmB,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAU;AAAA,SAAAV,EAAA,CAAA,MAAAQ,KAAAR,SAAAS,KAV/BC,IAAA,gBAAAa,EAACP,IAAA,EAAsB,YAAA,WAAgB,OAAA,MAAkB,cAAA,MAAK,yBAAA,IAA+C,uBAAA,IAC3G,UAAA,gBAAAO,EAAC8E,GAAA,EACI,IAAA,OACK,SAAA,MACG,YAAA,QACF,UAAA,MACE,YAAA,WACA,YAAA,OACC,cAAA7F,GAEZC,aACF,GACF,GAAaT,OAAAQ,GAAAR,OAAAS,GAAAT,OAAAU,KAAAA,IAAAV,EAAA,CAAA,GAZbU;AAYa;AAIjB,SAAA6pB,GAAAhqB,GAAA;AAAA,QAAAP,IAAAC,EAAA,EAAA,GAAmB;AAAA,IAAAuqB,GAAAA;AAAAA,IAAA1B,YAAAA;AAAAA,EAAAA,IAAAvoB;AACjB,UAAQiqB,EAAC5U,MAAAA;AAAAA,IAAK,KACP,WAAS;AAAA,UAAApV;AAAA,MAAAR,EAAA,CAAA,MAAAwqB,EAAAzlB,QAGRvE,iCAAYgqB,YAACzlB,MAAM,GAAY/E,EAAA,CAAA,IAAAwqB,EAAAzlB,MAAA/E,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAA,UAAAS;AAAA,MAAAT,EAAA,CAAA,MAAAwqB,EAAAC,aAC9BhqB,IAAA+pB,EAACC,WAAgBC,OAChB,gBAAAnpB,EAAAopB,GAAA,QAAA,EACE,4BAAC7kB,IAAA,EAAO,UAAA;AAAA,QAAA;AAAA,QAAI0kB,EAACC,UAAUC;AAAAA,MAAAA,EAAAA,CAAM,GAC/B,IAHD,MAIO1qB,EAAA,CAAA,IAAAwqB,EAAAC,WAAAzqB,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,UAAAU;AAAA,aAAAV,EAAA,CAAA,MAAAQ,KAAAR,SAAAS,KANVC,iCACEF,UAAAA;AAAAA,QAAAA;AAAAA,QACCC;AAAAA,MAAAA,GAKH,GAAYT,OAAAQ,GAAAR,OAAAS,GAAAT,OAAAU,KAAAA,IAAAV,EAAA,CAAA,GAPZU;AAAAA,IAOY;AAAA,IAAA,KAEX,QAAM;AAAA,UAAAF;AAAA,aAAAR,EAAA,CAAA,MAAAwqB,EAAArE,QAAAnmB,EAAA,CAAA,MAAAwqB,EAAA3G,YAEPrjB,IAAA,gBAAAe,EAAAopB,GAAA,MAAA,EAAkB,QAAA,KAAY,SAAA,KAC5B,UAAA,gBAAAppB,aAAmB,SAAA,KACjB,UAAA,gBAAAA,EAAC+oB,IAAA,EAAoB,UAAAE,EAAC3G,UAAiB,MAAA2G,EAACrE,KAAAA,CAAK,EAAA,CAC/C,EAAA,CACF,GAAYnmB,EAAA,CAAA,IAAAwqB,EAAArE,MAAAnmB,EAAA,CAAA,IAAAwqB,EAAA3G,UAAA7jB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GAJZQ;AAAAA,IAIY;AAAA,IAAA,KAEX,QAAM;AASa,YAAAA,IAAAgqB,EAAC1G,cAAD;AAAqB,UAAArjB;AAAA,aAAAT,UAAAwqB,EAAA3G,YAAA7jB,UAAAwqB,EAAAtM,YAAAle,UAAAwqB,EAAAvM,YAAAje,UAAAQ,KAPzCC,sBAAAkqB,GAAA,MAAA,EAAkB,QAAA,KAAY,SAAA,KAC5B,UAAA,gBAAAppB,EAAAopB,GAAA,MAAA,EAAmB,SAAA,KACjB,UAAA,gBAAAppB,EAAC8E,GAAA,EAAW,QAAA,SAAa,MAAA,SAAiB,UAAA,UACxC,UAAA,gBAAA9E,EAACqpB,IAAA,EACW,UAAAJ,EAACvM,UACD,UAAAuM,EAACtM,UACD,UAAAsM,EAAC3G,UACC,YAAArjB,GACG,eAAA,IAAI,EAAA,CAEvB,GACF,GACF,GAAYR,EAAA,EAAA,IAAAwqB,EAAA3G,UAAA7jB,EAAA,EAAA,IAAAwqB,EAAAtM,UAAAle,EAAA,EAAA,IAAAwqB,EAAAvM,UAAAje,QAAAQ,GAAAR,QAAAS,KAAAA,IAAAT,EAAA,EAAA,GAZZS;AAAAA,IAYY;AAAA,IAAA,KAEX,QAAM;AAAA,UAAAD;AAAA,aAAAR,EAAA,EAAA,MAAAwqB,EAAAzlB,QAEPvE,sBAAAmqB,GAAA,MAAA,EAAsB,YAAA,eACpB,4BAAAA,GAAA,MAAA,EAAmB,SAAA,MACjB,4BAAChlB,GAAA,EAAe,WAAA,mBAAmB6kB,UAAAA,EAACzlB,MAAM,GAC5C,EAAA,CACF,GAAY/E,EAAA,EAAA,IAAAwqB,EAAAzlB,MAAA/E,QAAAQ,KAAAA,IAAAR,EAAA,EAAA,GAJZQ;AAAAA,IAIY;AAAA,IAAA,KAEX,aAAW;AAAA,UAAAA;AAAA,aAAAR,EAAA,EAAA,MAAAwqB,EAAAphB,SACP5I,IAAA,gBAAAe,EAAC4H,IAAA,EAAyB,OAAAqhB,EAACphB,OAAM,GAAIpJ,EAAA,EAAA,IAAAwqB,EAAAphB,OAAApJ,QAAAQ,KAAAA,IAAAR,EAAA,EAAA,GAArCQ;AAAAA,IAAqC;AAAA,IAAA,KACzC,iBAAe;AAAA,UAAAA;AAAA,aAAAR,EAAA,EAAA,MAAAwqB,EAAAjhB,aACX/I,IAAA,gBAAAe,EAAC+H,IAAA,EAAiC,WAAAkhB,EAACjhB,WAAU,GAAIvJ,EAAA,EAAA,IAAAwqB,EAAAjhB,WAAAvJ,QAAAQ,KAAAA,IAAAR,EAAA,EAAA,GAAjDQ;AAAAA,IAAiD;AAAA,IAAA,KACrD,cAAY;AAAA,UAAAA;AAAA,MAAAR,EAAA,EAAA,MAAAwqB,EAAApG,cAGV5jB,IAAAgqB,EAACpG,WAAWnb,IAAKI,EAEjB,GAACrJ,EAAA,EAAA,IAAAwqB,EAAApG,YAAApkB,QAAAQ,KAAAA,IAAAR,EAAA,EAAA;AAAA,UAAAS;AAAA,aAAAT,UAAAQ,KAHJC,IAAA,gBAAAc,EAACwG,GAAA,EAAS,IAAA,MAAS,KAAA,MAAa,SAAA,OAAe,UAAA,QAC5CvH,UAAAA,EAAAA,CAGH,GAAQR,QAAAQ,GAAAR,QAAAS,KAAAA,IAAAT,EAAA,EAAA,GAJRS;AAAAA,IAIQ;AAAA,IAAA,KAEP,aAAW;AAAA,UAAAD;AAAA,MAAAR,EAAA,EAAA,MAAAwqB,KAAAxqB,UAAA8oB,KACJtoB,IAAAgqB,EAACK,OAAQ;AAAA,QAAA/B,YAAAA;AAAAA,MAAAA,CAAc,GAAC9oB,QAAAwqB,GAAAxqB,QAAA8oB,GAAA9oB,QAAAQ,KAAAA,IAAAR,EAAA,EAAA;AAAA,UAAAS;AAAA,aAAAT,UAAAQ,KAA3BC,4BAAGD,UAAAA,EAAAA,CAAwB,GAAIR,QAAAQ,GAAAR,QAAAS,KAAAA,IAAAT,EAAA,EAAA,GAA/BS;AAAAA,IAA+B;AAAA,EAAA;AACzC;AA3DH,SAAA4I,GAAAyhB,GAAA;AAAA,SAqDY,gBAAAvpB,EAACwpB,IAAA,EAAkCD,UAAAA,EAAAA,GAAfA,CAAkB;AAAI;AAStD,SAAAE,GAAAzqB,GAAA;AAAA,QAAAP,IAAAC,EAAA,EAAA,GAAyB;AAAA,IAAAkK,MAAAA;AAAAA,IAAA8gB,SAAAA;AAAAA,IAAAC,QAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAAhjB,UAAAA;AAAAA,IAAA0gB,YAAAA;AAAAA,EAAAA,IAAAvoB;AAgBxB,MAAAC;AAAA,EAAAR,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAIOJ,IAAA,gBAAAe,EAAAmnB,GAAA,WAAA,CAAA,CAAA,GAAsB1oB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAA,MAAAS;AAAA,EAAAT,EAAA,CAAA,MAAAmK,EAAAka,aADxB5jB,IAAA,gBAAAiF,EAAAgjB,GAAA,WAAA,EACEloB,UAAAA;AAAAA,IAAAA;AAAAA,IACA,gBAAAe,EAAC4oB,IAAA,EAAmB,KAAAhgB,EAAIka,UAAAA;KAC1B,GAAqBrkB,EAAA,CAAA,IAAAmK,EAAAka,WAAArkB,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AACQ,QAAAU,IAAAwqB,IAAA,SAAA;AAAwB,MAAAnqB;AAAA,EAAAf,EAAA,CAAA,MAAAmrB,KAAAnrB,SAAAkrB,KAAAlrB,EAAA,CAAA,MAAAmK,EAAAwD,SAAA3N,EAAA,CAAA,MAAAirB,KAAAjrB,SAAA8oB,KAAA9oB,EAAA,CAAA,MAAAoI,KAClDrH,IAAAoJ,EAAIwD,MAAMzI,SAAU,KACnB,gBAAA3D,EAAAmnB,GAAA,OAAA,EACY,WAAA,SACC,YAAA,UACH,SAAA,QACG,YAAA,UACI,gBAAA,iBACP,QAAAyC,IAAA,YAAA,WACC,SAAAA,IAAA,MAAkB/iB,EAAS6iB,CAAO,IAAlC5iB,QAET,UAAA,gBAAA3C,EAACskB,IAAA,EAAa,SAAA,eAAyB,YAAA,UAAa,KAAA,MAAc,UAAA,QAChE,UAAA;AAAA,IAAA,gBAAAzoB,EAACyoB,IAAA,EAAa,SAAA,eAAyB,YAAA,UAAa,KAAA,MAAc,UAAA,QAC/D7f,UAAAA,EAAIwD,MAAM1E,IAAK,CAAA4f,GAAAjK,MACd,gBAAArd,EAAC0oB,IAAA,EAAyBpB,KAAAA,GAAkBsC,aAAAA,GAAuBrC,YAAAA,EAAAA,GAAjDlK,EACnB,EAAA,CACH;AAAA,IACCuM,IACC,gBAAA5pB,EAACyoB,IAAA,EACS,SAAA,eACG,YAAA,UACA,YAAA,0CACA,WAAAkB,IAAA,iBAAA,mBACL,OAAA,eACO,aAAA;AAAA,MAAAvB,OAAS;AAAA,IAAA,GAEtB,UAAA,gBAAApoB,EAAC8pB,IAAA,EAAoB,UAAE,GACzB,IAVD;AAAA,EAAA,EAAA,CAYH,EAAA,CACF,GACDrrB,OAAAmrB,GAAAnrB,OAAAkrB,GAAAlrB,EAAA,CAAA,IAAAmK,EAAAwD,OAAA3N,OAAAirB,GAAAjrB,OAAA8oB,GAAA9oB,OAAAoI,GAAApI,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAAA,MAAA+F;AAAA,EAAA/F,EAAA,EAAA,MAAAorB,KAAAprB,UAAAkrB,KAAAlrB,EAAA,EAAA,MAAAmK,EAAAuZ,UAAA1jB,UAAA8oB,KACA/iB,IAAAqlB,IACC,gBAAA7pB,EAAC8E,GAAA,EAAY,SAAA,QAAyB,kBAAA6kB,IAAA,QAAA,OAAmC,YAAA,iCACtEA,cACC,gBAAA3pB,EAAC8E,GAAA,EACU,UAAA,UACA,SAAA,GACC,WAAA,iBACC,YAAA,4CAEV8D,YAAIuZ,OAAOza,IAAM,CAAA2c,GAAA0F,wBACfjlB,GAAA,EACC,UAAA,gBAAA9E,EAACgpB,MAAa3E,GAAmBkD,YAAAA,GAAU,EAAA,GADnClK,CAEV,CACD,EAAA,CACH,IAZD,MAcH,IAhBD,MAiBO5e,QAAAorB,GAAAprB,QAAAkrB,GAAAlrB,EAAA,EAAA,IAAAmK,EAAAuZ,QAAA1jB,QAAA8oB,GAAA9oB,QAAA+F,KAAAA,IAAA/F,EAAA,EAAA;AAAA,MAAAiG;AAAA,EAAAjG,EAAA,EAAA,MAAAU,KAAAV,UAAAe,KAAAf,EAAA,EAAA,MAAA+F,KAjDVE,IAAA,gBAAAP,EAAAgjB,GAAA,SAAA,EAAqB,IAAA,MAAQ,GAAAhoB,GAAmC,UAAA,UAC7DK,UAAAA;AAAAA,IAAAA;AAAAA,IA+BAgF;AAAAA,EAAAA,GAkBH,GAAmB/F,QAAAU,GAAAV,QAAAe,GAAAf,QAAA+F,GAAA/F,QAAAiG,KAAAA,IAAAjG,EAAA,EAAA;AAAA,MAAAkG;AAAA,SAAAlG,EAAA,EAAA,MAAAirB,KAAAjrB,UAAAS,KAAAT,EAAA,EAAA,MAAAiG,KAvDrBC,iCAAmB,KAAA,MACjBzF,UAAAA;AAAAA,IAAAA;AAAAA,IAIAwF;AAAAA,EAAAA,EAAAA,GAL2BglB,CAwD7B,GAAgBjrB,QAAAirB,GAAAjrB,QAAAS,GAAAT,QAAAiG,GAAAjG,QAAAkG,KAAAA,IAAAlG,EAAA,EAAA,GAxDhBkG;AAwDgB;AAIb,SAAAqlB,GAAAhrB,GAAA;AAAA,QAAAP,IAAAC,EAAA,EAAA,GAA0B;AAAA,IAAAurB,MAAAA;AAAAA,IAAA1C,YAAAA;AAAAA,EAAAA,IAAAvoB;AAAoF,MAAAC;AAAA,EAAAR,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KACjDJ,QAAER,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAApE,QAAA,CAAAyrB,GAAAC,CAAA,IAAgChf,EAAkClM,CAAE,GAEpEmrB,IAAevb;AAAkE,MAAA3P;AAAA,EAAAT,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAElEH,IAAAmK,CAAAA,MAAA;AACb8gB,IAAAA,EAAYE,CAAAA,OAAW;AAAA,MAAA,GAAKA;AAAAA,MAAI,CAAGhhB,CAAG,GAAG,CAACghB,EAAKhhB,CAAG;AAAA,IAAA,EAAI;AAAA,EAAC,GACxD5K,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAFD,QAAA6rB,IAAeprB;AAEb,MAAAC;AAAA,MAAAV,EAAA,CAAA,MAAAwrB,EAAApiB,SAAApJ,EAAA,CAAA,MAAAyrB,KAAAzrB,EAAA,CAAA,MAAA8oB,GAAA;AAAA,QAAA/nB;AAAA,IAAAf,EAAA,CAAA,MAAAyrB,KAAAzrB,SAAA8oB,KAIkB/nB,IAAAA,CAAAoJ,GAAA2hB,MAAA;AACd,YAAAhX,IAAY6W,EAAOxhB,GAAMyR,CAAG,GAC5BwP,KAAmBjhB,EAAIuZ,QAAexe,UAAnB,KAA4B,GAC/CimB,KAAmBhhB,EAAI2b,cAAJ,OAADsF,GAClBF,IAAeC,IAAaM,EAAS7gB,CAAG,KAAZ,KAAbwgB;AAAiD,aAG9D,gBAAA7pB,EAACypB,IAAA,EAEO7gB,MAAAA,GACGS,YACDsgB,QAAAA,GACGC,WAAAA,GACAC,WAAAA,GACDS,aACE/C,YAAAA,EAAAA,GAPPle,CAOiB;AAAA,IACtB,GAEL5K,OAAAyrB,GAAAzrB,OAAA8oB,GAAA9oB,OAAAe,KAAAA,IAAAf,EAAA,CAAA,GAlBAU,IAAA8qB,EAAIpiB,MAAMH,IAAKlI,CAkBf,GAACf,EAAA,CAAA,IAAAwrB,EAAApiB,OAAApJ,OAAAyrB,GAAAzrB,OAAA8oB,GAAA9oB,OAAAU;AAAAA,EAAA;AAAAA,IAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAe;AAAA,SAAAf,SAAAU,KAnBJK,IAAA,gBAAAQ,EAAAmnB,GAAA,MAAA,EACGhoB,UAAAA,GAmBH,GAAgBV,OAAAU,GAAAV,QAAAe,KAAAA,IAAAf,EAAA,EAAA,GApBhBe;AAoBgB;AA9Bb,SAAAqP,GAAA2b,GAAAnQ,GAAA;AAAA,SAGsCmQ,EAAEpiB,KAAF,MAAcoiB,EAAEpiB,EAAG,KAAnB,OAA+BiS,CAAG;AAAE;AC7YjF,MAAMoQ,KAAiBA,CAAC9L,MACtBvH,GAAkBuH,EAAWC,QAAQ,EAAE,EAAEvH,QAAQ,MAAM,EAAE,MAAM,YAE3DqT,KAAgBA,CAAC/L,MAAyB;AAC9C,QAAMgB,IAAShB,EAAW/Y,OAAO+Z;AACjC,SAAI,OAAOA,KAAW,WAAiBA,EAAOja,KAAAA,EAAO/B,SAAS,IAC1DsY,MAAMwD,QAAQE,CAAM,IAAUA,EAAOhc,SAAS,IAC9Cgc,KAAU,OAAOA,KAAW,WAAiB5F,OAAO4Q,KAAKhL,CAAM,EAAEhc,SAAS,IAC/Cgc,KAAW;AAC5C;AAEO,SAAAiL,GAAApsB,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAwoB,aAAAA;AAAAA,IAAA2D,eAAAA;AAAAA,IAAAC,mBAAA9rB;AAAAA,IAAAuoB,YAAAA;AAAAA,EAAAA,IAA8E/oB,GAA1CssB,IAAA9rB,MAAA8H,SAAA,KAAA9H;AAAyB,MAAAC,GAAAC;AAAA,MAAAT,EAAA,CAAA,MAAAqsB,KAAArsB,SAAAyoB,KAAAzoB,EAAA,CAAA,MAAAosB,GAAA;AAKjB3rB,IAAAA,IAAAE,uBAAIC,IAAJ,6BAAG;AAAC0rB,IAAAA,GAAA;AAJhD,YAAAC,IAA2BF,IACvB5D,EAAW5V,OAAQxJ,EACT,IAFaof;AAI3B,UAAI8D,EAAkBrnB,WAAY,GAAC;AAASzE,QAAAA,IAAA;AAAA,cAAA6rB;AAAAA,MAAI;AAEnC9rB,MAAAA,IAAAgoB,GAAgC+D,GAAoB;AAAA,QAAAH,eAAAA;AAAAA,MAAAA,CAAiB;AAAA,IAAC;AAAApsB,IAAAA,OAAAqsB,GAAArsB,OAAAyoB,GAAAzoB,OAAAosB,GAAApsB,OAAAQ,GAAAR,OAAAS;AAAAA,EAAA;AAAAD,IAAAA,IAAAR,EAAA,CAAA,GAAAS,IAAAT,EAAA,CAAA;AAAA,MAAAS,MAAAE,uBAAAC,IAAA,6BAAA;AAAA,WAAAH;AAAnF,QAAA+qB,IAAahrB;AAAuE,MAAAE;AAAA,SAAAV,EAAA,CAAA,MAAAwrB,KAAAxrB,SAAA8oB,KAE7EpoB,IAAA,gBAAAa,EAACgqB,IAAA,EAAuBC,MAAAA,GAAkB1C,YAAAA,EAAAA,CAAU,GAAI9oB,OAAAwrB,GAAAxrB,OAAA8oB,GAAA9oB,OAAAU,KAAAA,IAAAV,EAAA,CAAA,GAAxDU;AAAwD;AAV1D,SAAA2I,GAAA6W,GAAA;AAAA,SAGkC,CAAC8L,GAAe9L,CAAU,KAAK+L,GAAc/L,CAAU;AAAC;ACRjG,MAAMsM,KAAaA,CAAC7W,MACXA,EAAKC,SAAS,QAGjB6W,KAAmBA,CAACC,MACpBA,KAAS,MAAa,IAAIA,IAAQ,KAAMC,QAAQ,CAAC,CAAC,MAC/CC,OAAOF,CAAK,GAGfG,KAAkBA,CAAClX,MAAoB;AAC3C,MAAIA,EAAKJ,WAAWI,EAAKJ,QAAQtO,KAAAA,EAAO/B,SAAS;AAC/C,WAAOyQ,EAAKJ;AAGd,QAAM;AAAA,IAAEuX,WAAAA;AAAAA,EAAAA,IAAcnX;AACtB,UAAQmX,GAAAA;AAAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb,GAEMC,KAA2D;AAAA,EAC/DC,MAAM;AAAA,EACNC,SAAS;AAAA,EACTzN,OAAO;AAAA,EACP0N,SAAS;AAAA,EACTC,SAAS;AACX,GAEMC,KAAyBA,CAAC5X,GAA6B4I,MAAuB;AAClF,QAAMqK,IAA0B,CAAA;AAChC,MAAI4E,IAAYjP;AAEhB,SAAOiP,IAAY7X,EAAMtQ,UAAQ;AAC/B,UAAMooB,IAAW9X,EAAM6X,CAAS;AAChC,QAAI,CAACb,GAAWc,CAAQ,EAAG;AAC3B7E,IAAAA,EAAYzd,KAAKsiB,CAAQ,GACzBD,KAAa;AAAA,EACf;AAEA,SAAO;AAAA,IAAE5E,aAAAA;AAAAA,IAAajK,WAAW6O,IAAY;AAAA,EAAA;AAC/C;AAEO,SAAAE,GAAAxtB,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GACL;AAAA,IAAAsV,SAAAA;AAAAA,IAAA8W,mBAAA9rB;AAAAA,IAAAuoB,YAAAA;AAAAA,IAAA0E,wBAAAA;AAAAA,EAAAA,IAAmFztB,GAAlEssB,IAAA9rB,MAAA8H,SAAA,KAAA9H,GACjBktB,IAAqCD,KAAArB;AAAiD,MAAA3rB;AAAA,EAAAR,EAAA,CAAA,MAAAuV,EAAAC,SACxEhV,IAAA+U,EAAOC,SAAP,CAAA,GAAmBxV,EAAA,CAAA,IAAAuV,EAAAC,OAAAxV,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAjC,QAAAwV,IAAchV;AAAoB,MAAAC;AAAA,MAAAT,SAAAytB,KAAAztB,EAAA,CAAA,MAAAqsB,KAAArsB,EAAA,CAAA,MAAAuV,EAAA5L,MAAA3J,EAAA,CAAA,MAAA8oB,KAAA9oB,SAAAwV,GAAA;AAClC,UAAAkY,IAA2B,CAAA;AAE3B,aAAAC,IAAqB,GAAGA,IAAYnY,EAAKtQ,QAAzCyoB,IAAkDA,IAAa,GAAbA,GAgFjD;AA/EC,YAAAhY,IAAaH,EAAMmY,CAAS,GAC5B/iB,IAAY,GAAG2K,EAAO5L,EAAG,IAAIgkB,CAAS;AAAGrB,MAAAA,EAEzC,SAAQ3W,EAAIC,MAAAA;AAAAA,QAAK,KACV,QAAM;AACT8X,UAAAA,EAAK1iB,uBACH,OAAA,EACE,UAAA,gBAAAzJ,EAACmX,MAAU/C,UAAAA,EAAI5Q,KAAAA,CAAM,EAAA,GADb6F,CAEV,CACF;AACA,gBAAA0hB;AAAAA,QAAM;AAAA,QAAA,KACH,aAAW;AACdoB,UAAAA,EAAK1iB,KACH,gBAAAzJ,EAAC8E,GAAA,EAES,SAAA,KACH,KAAA;AAAA,YAAA,gCAC6B;AAAA,cAAAsjB,OACvB;AAAA,cAAsBiE,UACnB;AAAA,cAAmBpE,YACjB;AAAA,YAAA;AAAA,UACd,GAGF,UAAA,gBAAAjoB,EAACkX,IAAA,EAA0B,cAAA9C,EAAI5Q,MAAO,WAAA,GAAA,MAVjC6F,CAWP,CACF;AACA,gBAAA0hB;AAAAA,QAAM;AAAA,QAAA,KACH,QAAM;AACT,gBAAA;AAAA,YAAA7D,aAAAA;AAAAA,YAAAjK,WAAAA;AAAAA,UAAAA,IAAmC4O,GAAuB5X,GAAOmY,CAAS;AAC1EA,UAAAA,IAAYnP,GACZkP,EAAK1iB,KACH,gBAAAzJ,EAAC8E,GAAA,EAAoB,OAAA,QACnB,UAAA,gBAAA9E,EAACksB,GAAA,EACchF,aAAAA,GACb,mBACmB4D,mBAAAA,GACPvD,YAAAA,QALNle,CAOV,CACF;AACA,gBAAA0hB;AAAAA,QAAM;AAAA,QAAA,KAEH,SAAO;AACVoB,UAAAA,EAAK1iB,uBACF3E,GAAA,EAAiB,IAAA,KAAU,OAAA,QAC1B,UAAA,gBAAA9E,EAACssB,IAAA,EAA0B,cAAA,MAAY,QAAA,SAAqB,cAAA,OAAa,OAAAhB,GAAgBlX,CAAI,GAAQ,MAAA,KAAA,CAAI,EAAA,GADjG/K,CAEV,CACF;AACA,gBAAA0hB;AAAAA,QAAM;AAAA,QAAA,KACH,eAAa;AAChBoB,UAAAA,EAAK1iB,uBACF3E,GAAA,EACC,UAAA,gBAAAX,EAACC,KAAc,UAAA,MAAW,OAAA,aAAY,UAAA;AAAA,YAAA;AAAA,YAC3B8mB,GAAiB9W,EAAImY,WAAY;AAAA,YAAE;AAAA,YAAOrB,GAAiB9W,EAAIoY,YAAa;AAAA,YAAE;AAAA,YACtFpY,EAAIqY,kBAAJ,MAA6BvB,GAAiB9W,EAAIqY,eAAgB,CAAC,gBAAnE;AAAA,UAAA,GACH,EAAA,GAJQpjB,CAKV,CACF;AACA,gBAAA0hB;AAAAA,QAAM;AAAA,QAAA,KACH,SAAO;AACVoB,UAAAA,EAAK1iB,KACH,gBAAAzJ,EAAC8E,GAAA,EAAoB,OAAA,QACnB,UAAA,gBAAA9E,EAACssB,MACc,cAAA,MACL,QAAAlY,EAAI2K,WAAY,YAAhB,SAAqC3K,EAAI2K,QACnC,cAAAyM,GAAoBpX,EAAI2K,MAAO,GACtC,OAAA3K,EAAIhI,OACL,MAAAgI,EAAI2K,WAAY,8BAAa2N,IAAA,EAAa,MAAA,KAAA,CAAI,IAA9C5lB,QACD,MAAA,MAEJsN,YAAIJ,QAAAA,CACP,KAVQ3K,CAWV,CACF;AACA,gBAAA0hB;AAAAA,QAAM;AAAA,QAAA;AAENoB,UAAAA,EAAK1iB,KAAM,IAAI;AAAA,MAAC;AAAA,IACnB;AAGIvK,IAAAA,4BAAGitB,UAAAA,EAAAA,CAAK,GAAI1tB,OAAAytB,GAAAztB,OAAAqsB,GAAArsB,EAAA,CAAA,IAAAuV,EAAA5L,IAAA3J,OAAA8oB,GAAA9oB,OAAAwV,GAAAxV,OAAAS;AAAAA,EAAA;AAAAA,IAAAA,IAAAT,EAAA,CAAA;AAAA,SAAZS;AAAY;ACrJd,MAAMytB,KAAmBA,CAAC/uB,MAC3BA,MAAS,UAAUA,MAAS,eAAeA,MAAS,cAAoBA,IACrE,aAGIgvB,KAA6BA,CAAC5Y,MAA4B;AACrE,QAAMC,IAAQD,EAAQC,SAAS,CAAA;AAI/B,SAHIA,EAAMtQ,WAAW,KAEDsQ,EAAM/J,KAAMkK,CAAAA,MAASA,EAAKC,SAAS,UAAU,UAAUD,CAAI,IACvD,KAEjBH,EAAM/J,KAAMkK,CAAAA,MAASA,EAAKC,SAAS,eAAeD,EAAKC,SAAS,MAAM;AAC/E,GAEawY,KAAiCA,CAACC,MAA+B;AAC5E,QAAMC,IAA2B,CAAA;AAEjC,aAAW/Y,KAAW8Y,GAAU;AAC9B,UAAME,IAAWD,EAAOA,EAAOppB,SAAS,CAAC;AAEzC,QAAIqpB,KAAYA,EAASpvB,SAASoW,EAAQpW,QAAQgvB,GAA2B5Y,CAAO,GAAG;AACrFgZ,MAAAA,EAAS/Y,QAAQ,CAAC,GAAI+Y,EAAS/Y,SAAS,CAAA,GAAK,GAAID,EAAQC,SAAS,EAAG;AACrE;AAAA,IACF;AAEA8Y,IAAAA,EAAOtjB,KAAK;AAAA,MACV,GAAGuK;AAAAA,MACHC,OAAO,CAAC,GAAID,EAAQC,SAAS,CAAA,CAAG;AAAA,IAAA,CACjC;AAAA,EACH;AAEA,SAAO8Y;AACT,GASaE,KAAsBA,CAACH,MAA+B;AACjE,QAAMI,IAAyB,CAAA,GACzBC,IAAqC,CAAA;AAE3C,aAAWnZ,KAAW8Y;AACpB,IAAI9Y,EAAQpW,SAAS,SACnBsvB,EAAOzjB,KAAK;AAAA,MAAE2jB,aAAapZ;AAAAA,MAASqZ,WAAW,CAAA;AAAA,IAAA,CAAI,IAC1CH,EAAOvpB,SAAS,IACzBupB,EAAOA,EAAOvpB,SAAS,CAAC,EAAE0pB,UAAU5jB,KAAKuK,CAAO,IAEhDmZ,EAAiB1jB,KAAKuK,CAAO;AAIjC,SAAO;AAAA,IAAEkZ,QAAAA;AAAAA,IAAQC,kBAAAA;AAAAA,EAAAA;AACnB,GCXMG,KAAwB,KACxBC,KAA+B,GAC/BC,KAAgC,GAChCC,KAAyB,IACzBC,KAA2B,GAC3BC,KAAwB,GACxBC,KAAmB,GAEnBC,KAAwBA,CAACV,GAAoCD,MAA2B,CAC5F,GAAGC,EAAiBzlB,IAAKsM,CAAAA,OAAa;AAAA,EACpCK,MAAM;AAAA,EACNhL,KAAK2K,EAAQ5L;AAAAA,EACb4L,SAAAA;AACF,EAAE,GACF,GAAGkZ,EAAOxlB,IAAI,CAAComB,GAAOC,OAAgB;AAAA,EACpC1Z,MAAM;AAAA,EACNhL,KAAKykB,EAAMV,YAAYhlB;AAAAA,EACvB0lB,OAAAA;AAAAA,EACAC,YAAAA;AACF,EAAE,CAAC,GAGCC,KAAyBA,CAAC7C,GAAe8C,MAA2B;AACxE,MAAI9C,MAAU,EAAG,QAAO;AAExB,QAAM+C,IAAqB/C,IAAQmC,MAAyBnC,IAAQ,KAAKyC;AACzE,SAAOviB,KAAKyJ,IAAIoZ,IAAqBD,GAAgB,CAAC;AACxD,GAEME,KAA2BA,CAACC,MAChCA,GAAepZ,gBAAgBuY,IAO3Bc,KAAqBA,CAAC9oB,GAA6BynB,MACvD3hB,KAAKijB,IAAI/oB,EAAQ0P,YAAY+X,EAAS/X,SAAS,KAAKyY,MACpDriB,KAAKijB,IAAI/oB,EAAQgpB,YAAYvB,EAASuB,SAAS,KAAKb,IAEhDc,KAAyBA,CAACJ,GAAmCG,OAA2C;AAAA,EAC5GtZ,WAAWmZ,GAAenZ,aAAa;AAAA,EACvCsZ,WAAAA;AACF,IAEME,KAAelrB,CAAAA,MAAA;AAAA,QAAA9E,IAAAC,EAAA,CAAA,GAMnB;AAAA,IAAAgwB,WAAAA;AAAAA,IAAAC,SAAAA;AAAAA,IAAA7vB,WAAAA;AAAAA,IAAAyvB,WAAAA;AAAAA,EAAAA,IAAqDhrB,GACrDqrB,IAAmBtpB,GAAOqpB,CAAO;AAAE,MAAA3vB,GAAAC;AAAA,EAAAR,SAAAkwB,KAEzB3vB,IAAAA,MAAA;AACR4vB,IAAAA,EAAUrpB,UAAWopB;AAAAA,EAAH,GACjB1vB,IAAA,CAAC0vB,CAAO,GAAClwB,OAAAkwB,GAAAlwB,OAAAO,GAAAP,OAAAQ,MAAAD,IAAAP,EAAA,CAAA,GAAAQ,IAAAR,EAAA,CAAA,IAFZ+G,GAAUxG,GAEPC,CAAS;AAAC,MAAAC,GAAAC;AAAA,EAAAV,EAAA,CAAA,MAAAiwB,KAAAjwB,SAAAK,KAAAL,EAAA,CAAA,MAAA8vB,KAEHrvB,IAAAA,MAAA;AACR,QAAIwvB,MAAc,KAAK,OAAOjf,wBAA0B,KAAW;AACjEmf,MAAAA,EAAUrpB,UAAAA;AAAY;AAAA,IAAA;AAIxB,QAAAspB,IAAc,GACdC,IAAwB,GACxBC,IAAuB,GACvBC,IAAkD;AAElD,UAAAC,IAA0BA,MAAA;AACxBH,MAAAA,IAAAA,IAAqB;AAErB,YAAAI,IAAqBV,GAAuB1vB,EAASyG,SAAUgpB,CAAS;AAKxE,UAJAQ,IACEA,KAAoBV,GAAmBa,GAAcF,CAAgB,IAAID,IAAmB,IAA5F,GACFC,IAAmBE,GAEfH,KAAoBvB,MAAiCsB,KAAqBrB,IAAsB;AAClGmB,QAAAA,EAAUrpB,UAAAA;AAAY;AAAA,MAAA;AAIxBspB,MAAAA,IAAUpf,sBAAsBwf,CAAiB;AAAA,IAA1C;AAGTJ,WAAAA,IAAUpf,sBAAsBwf,CAAiB,GAE1C,MAAMtf,qBAAqBkf,CAAO;AAAA,EAAC,GACzC1vB,KAACuvB,GAAW5vB,GAAWyvB,CAAS,GAAC9vB,OAAAiwB,GAAAjwB,OAAAK,GAAAL,OAAA8vB,GAAA9vB,OAAAS,GAAAT,OAAAU,MAAAD,IAAAT,EAAA,CAAA,GAAAU,IAAAV,EAAA,CAAA,IA9BpC+G,GAAUtG,GA8BPC,CAAiC;AAAC,GAGjCgwB,KAAsB3wB,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAC1B;AAAA,IAAA4H,OAAAA;AAAAA,IAAA8oB,SAAAA;AAAAA,IAAAC,aAAAA;AAAAA,EAAAA,IAAwC7wB,GAQpBQ,IAAAqwB,IAAA,kBAAA;AAA0C,MAAApwB;AAAA,EAAAR,EAAA,CAAA,MAAA6H,KAAA7H,SAAA2wB,KAY1DnwB,IAAA,gBAAAe,EAACuE,MAAY,MAAA,OAAc,SAAA,SAAsB,eAAA,QAAgB6qB,SAAAA,GAC9D9oB,UAAAA,EAAAA,CACH,GAAS7H,OAAA6H,GAAA7H,OAAA2wB,GAAA3wB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAAA,MAAAS;AAAA,SAAAT,EAAA,CAAA,MAAA4wB,KAAA5wB,SAAAO,KAAAP,EAAA,CAAA,MAAAQ,KAnBXC,IAAA,gBAAAiF,EAACY,IAAA,EACU,UAAA,YACF,QAAA,KACF,MAAA,KACC,OAAA,KACU,gBAAA/F,GACL,YAAA,YACR,IAAA,MACA,IAAA,MACA,IAAA,MACQ,YAAA,QACE,cAAA,aACF,YAAA,eACQ,oBAAA,MACL,eAAA,QAEbqwB,UAAAA;AAAAA,IAAAA;AAAAA,IACDpwB;AAAAA,EAAAA,GAGF,GAAOR,OAAA4wB,GAAA5wB,OAAAO,GAAAP,OAAAQ,GAAAR,OAAAS,KAAAA,IAAAT,EAAA,CAAA,GApBPS;AAoBO,GAILowB,KAAgBA,CAACtb,GAAyBlO,GAAoBglB,IAAoB,OAAU;AAChG,QAAMnpB,IAAOgrB,GAAiB3Y,EAAQpW,IAAI;AAE1C,SACE,gBAAAoC,EAACoD,GAAY,MAAZ,EAAiB,MAAAzB,GAChB,UAAA,gBAAAwC,EAACf,GAAY,SAAZ,EAAoB,MAAAzB,GACnB,UAAA;AAAA,IAAA,gBAAA3B,EAACgsB,IAAA,EAAqB,SAAAhY,GAAkB,WAAAlO,GAAsB,mBAAAglB,EAAA,CAAqC;AAAA,IAClGnpB,MAAS,eAAeA,MAAS,SAChC,gBAAA3B,EAAC8V,IAAA,EAAmB,SAAA9B,GAAkB,eAAerS,MAAS,QAAQ,mBAAmBA,MAAS,QAAO,IACvG;AAAA,EAAA,EAAA,CACN,EAAA,CACF;AAEJ,GAEM4tB,KAAmCA,CAACrpB,MAAmC;AAC3E,EAAIwO,GAAiCxO,EAAMyC,eAAezC,EAAM0O,MAAM,KACpE1O,EAAMshB,gBAAAA;AAEV,GAEMgI,KAA4BA,CAACC,GAAwBC,MAAwB;AACjF,MAAKD;AACL,WAAIC,IAAmB7b,KAEhBD;AACT,GAEM+b,KAAgCA,CAACC,MAAmC;AACxE,MAAKA;AAEL,WAAO/b;AACT,GAEMgc,KAAqBrxB,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACzB;AAAA,IAAAovB,OAAAA;AAAAA,IAAAhoB,WAAAA;AAAAA,IAAAglB,mBAAAA;AAAAA,IAAA4E,YAAAA;AAAAA,IAAAI,uBAAAA;AAAAA,EAAAA,IAAmFtxB;AAAM,MAAAixB,GAAAG,GAAA5wB;AAAA,EAAAP,SAAAqvB,EAAAV,eAAA3uB,SAAAixB,KACzFD,IAAsBhb,GAA+BqZ,EAAKV,WAAY,GACtEwC,IAA8BH,KAAAC,GACC1wB,IAAAwwB,GAA0BC,GAAeC,CAAU,GAACjxB,EAAA,CAAA,IAAAqvB,EAAAV,aAAA3uB,OAAAixB,GAAAjxB,OAAAgxB,GAAAhxB,OAAAmxB,GAAAnxB,OAAAO,MAAAywB,IAAAhxB,EAAA,CAAA,GAAAmxB,IAAAnxB,EAAA,CAAA,GAAAO,IAAAP,EAAA,CAAA;AAAnF,QAAAsxB,IAA+B/wB;AAAqD,MAAAC;AAAA,EAAAR,EAAA,CAAA,MAAAqvB,EAAAV,YAAAhlB,MAAA3J,EAAA,CAAA,MAAAqxB,KACxD7wB,IAAAA,MAAM6wB,EAAsBhC,EAAKV,YAAYhlB,EAAG,GAAC3J,EAAA,CAAA,IAAAqvB,EAAAV,YAAAhlB,IAAA3J,OAAAqxB,GAAArxB,OAAAQ,KAAAA,IAAAR,EAAA,CAAA;AAA7E,QAAAuxB,IAA4B/wB,GAUfC,IAAAuwB,IAAA,MAAA3oB,QACO3H,IAAAswB,IAAA,aAAA3oB,QAG0BtH,IAAAiwB,IAAiBC,IAAA,aAAA,cAAjB5oB;AAAmE,MAAAtC;AAAA,EAAA/F,SAAAmxB,KAI/FprB,IAAAmrB,GAA8BC,CAAqB,GAACnxB,OAAAmxB,GAAAnxB,OAAA+F,KAAAA,IAAA/F,EAAA,CAAA;AAE/C,QAAAiG,IAAAkrB,IAAA,SAAA,WACPjrB,IAAA8qB,IAAA,OAAA3oB,QACAjC,IAAA4qB,IAAA,OAAA3oB,QACAiF,IAAA6jB,IAAA,SAAA9oB,QACKwH,IAAAshB,IAAAL,KAAAzoB;AAAoE,MAAA0H;AAAA,EAAA/P,UAAAqvB,EAAAV,eAAA3uB,UAAAqH,KAE7E0I,IAAA,gBAAAxO,EAACgsB,IAAA,EAA8B,SAAA8B,EAAKV,aAAyBtnB,WAAAA,GAAS,GAAIrH,EAAA,EAAA,IAAAqvB,EAAAV,aAAA3uB,QAAAqH,GAAArH,QAAA+P,KAAAA,IAAA/P,EAAA,EAAA;AAAA,MAAAgQ;AAAA,EAAAhQ,EAAA,EAAA,MAAA6P,KAAA7P,EAAA,EAAA,MAAA+P,KAAA/P,EAAA,EAAA,MAAAe,KAAAf,EAAA,EAAA,MAAA+F,KAAA/F,EAAA,EAAA,MAAAiG,KAAAjG,EAAA,EAAA,MAAAkG,KAAAlG,EAAA,EAAA,MAAAoG,KAAApG,UAAAsN,KAb5E0C,IAAA,gBAAAzO,EAAC8E,GAAA,EACmC,oCAAAtF,GAC1B,SAAA,QACM,eAAA,UACV,KAAA,MACE,MAAAgF,GACD,MAAA,KACM,WAAAE,GACP,IAAAC,GACA,IAAAE,GACA,IAAAkH,GACK,SAAAuC,GAETE,UAAAA,EAAAA,CACF,GAAM/P,QAAA6P,GAAA7P,QAAA+P,GAAA/P,QAAAe,GAAAf,QAAA+F,GAAA/F,QAAAiG,GAAAjG,QAAAkG,GAAAlG,QAAAoG,GAAApG,QAAAsN,GAAAtN,QAAAgQ,KAAAA,IAAAhQ,EAAA,EAAA;AAAA,MAAAiQ;AAAA,EAAAjQ,EAAA,EAAA,MAAAqvB,EAAAV,eAAA3uB,EAAA,EAAA,MAAAgxB,KAAAhxB,EAAA,EAAA,MAAAixB,KAAAjxB,UAAAuxB,KACLthB,IAAA+gB,IACC,gBAAAzvB,EAACmvB,IAAA,EACQ,OAAAO,IAAA,cAAA,aACEM,SAAAA,GACI,aAAA,gBAAAhwB,EAAC8V,IAAA,EAA4B,SAAAgY,EAAKV,aAAc,eAAA,IAAiC,mBAAA,GAAA,CAAK,EAAA,CAAI,IAGzG,gBAAAptB,EAAC8V,IAAA,EAA4B,SAAAgY,EAAKV,aAAc,eAAA,IAAiC,mBAAA,IAAK,GACvF3uB,EAAA,EAAA,IAAAqvB,EAAAV,aAAA3uB,QAAAgxB,GAAAhxB,QAAAixB,GAAAjxB,QAAAuxB,GAAAvxB,QAAAiQ,KAAAA,IAAAjQ,EAAA,EAAA;AAAA,MAAAkQ;AAAA,EAAAlQ,EAAA,EAAA,MAAAsxB,KAAAtxB,EAAA,EAAA,MAAAgQ,KAAAhQ,EAAA,EAAA,MAAAiQ,KAAAjQ,EAAA,EAAA,MAAAS,KAAAT,UAAAU,KAhCPwP,IAAA,gBAAA3O,EAAC8E,GAAA,EAAa,UAAA,UAAa,KAAA,KAAY,WACrC,UAAA,gBAAA9E,EAAAoD,GAAA,MAAA,EAAuB,MAAA,QACrB,UAAA,gBAAAe,EAAAf,GAAA,SAAA,EACO,MAAA,QACC2sB,MAAAA,GACG,UAAA,UACN,GAAA7wB,GACO,UAAAC,GAEVsP,UAAAA;AAAAA,IAAAA;AAAAA,IAeCC;AAAAA,EAAAA,EAAAA,CASH,GACF,GACF,GAAMjQ,QAAAsxB,GAAAtxB,QAAAgQ,GAAAhQ,QAAAiQ,GAAAjQ,QAAAS,GAAAT,QAAAU,GAAAV,QAAAkQ,KAAAA,IAAAlQ,EAAA,EAAA;AAAA,MAAAqQ;AAAA,MAAArQ,EAAA,EAAA,MAAAqvB,EAAAT,aAAA5uB,EAAA,EAAA,MAAAqsB,KAAArsB,EAAA,EAAA,MAAAqH,GAAA;AAAA,QAAAiJ;AAAA,IAAAtQ,EAAA,EAAA,MAAAqsB,KAAArsB,UAAAqH,KACeiJ,IAAAiF,CAAAA,OACnB,gBAAAhU,EAAC8E,GAAA,EAAsBwqB,UAAAA,GAActb,IAASlO,GAAWglB,CAAiB,EAAA,GAAhE9W,GAAO5L,EAA2D,GAC7E3J,QAAAqsB,GAAArsB,QAAAqH,GAAArH,QAAAsQ,KAAAA,IAAAtQ,EAAA,EAAA,GAFAqQ,IAAAgf,EAAKT,UAAU3lB,IAAKqH,CAEpB,GAACtQ,EAAA,EAAA,IAAAqvB,EAAAT,WAAA5uB,QAAAqsB,GAAArsB,QAAAqH,GAAArH,QAAAqQ;AAAAA,EAAA;AAAAA,IAAAA,IAAArQ,EAAA,EAAA;AAAA,MAAAsQ;AAAA,SAAAtQ,EAAA,EAAA,MAAAkQ,KAAAlQ,UAAAqQ,KAvCJC,sBAACjK,GAAA,EACC6J,UAAAA;AAAAA,IAAAA;AAAAA,IAoCCG;AAAAA,EAAAA,GAGH,GAAMrQ,QAAAkQ,GAAAlQ,QAAAqQ,GAAArQ,QAAAsQ,KAAAA,IAAAtQ,EAAA,EAAA,GAxCNsQ;AAwCM,GAIJkhB,KAAiBA,CACrBrnB,GACApK,MAIG;AACH,QAAM;AAAA,IAAE0uB,QAAAA;AAAAA,IAAQpnB,WAAAA;AAAAA,IAAWoqB,yBAAAA;AAAAA,IAAyBC,0BAAAA;AAAAA,IAA0BL,uBAAAA;AAAAA,EAAAA,IAA0BtxB;AAExG,SAAIoK,EAAKyL,SAAS,qBACTib,GAAc1mB,EAAKoL,SAASlO,GAAWonB,EAAOvpB,SAAS,KAAKusB,CAAuB,IAI1F,gBAAAlwB,EAAC6vB,MACC,OAAOjnB,EAAKklB,OACZ,WAAAhoB,GACA,mBAAmB8C,EAAKmlB,aAAab,EAAOvpB,SAAS,KAAKusB,GAC1D,YAAYC,EAAyBhV,IAAIvS,EAAKklB,MAAMV,YAAYhlB,EAAE,GAClE,uBAAA0nB,EAAA,CAA6C;AAGnD,GAEaM,KAAkBA,CAAC5xB,MAAgC;AAC9D,QAAM;AAAA,IACJ2uB,kBAAAA;AAAAA,IACAD,QAAAA;AAAAA,IACApnB,WAAAA;AAAAA,IACAoqB,yBAAAA;AAAAA,IACAC,0BAAAA;AAAAA,IACAL,uBAAAA;AAAAA,IACAnB,SAAAA;AAAAA,EAAAA,IACEnwB,GACE;AAAA,IAAEM,WAAAA;AAAAA,EAAAA,IAAcC,GAAAA,GAChB8I,IAAQgmB,GAAsBV,GAAkBD,CAAM,GACtDmD,IAAwBlC,GAAyBrvB,EAAUyG,OAAO,GAElE+qB,IAAcC,GAA+C;AAAA,IACjEpF,OAAOtjB,EAAMlE;AAAAA,IACb6sB,kBAAkBA,MAAM1xB,EAAUyG;AAAAA,IAClCkrB,cAAcA,MAAMnD;AAAAA,IACpBoD,YAAa7nB,CAAAA,MAAUhB,EAAMgB,CAAK,GAAGQ,OAAOR;AAAAA,IAC5C8nB,UAAUhD;AAAAA,IACV1sB,KAAK2sB;AAAAA,IACLgD,aAAa;AAAA,MAAE9vB,OAAO;AAAA,MAAG1C,QAAQiyB;AAAAA,IAAAA;AAAAA,IACjCQ,eAAeA,MAAM7C,GAAuBnmB,EAAMlE,QAAQ0sB,CAAqB;AAAA,EAAA,CAChF,GACK9B,IAAY+B,EAAYQ,aAAAA;AAE9BrC,SAAAA,GAAa;AAAA,IACXC,WAAW7mB,EAAMlE;AAAAA,IACjBgrB,SAAAA;AAAAA,IACA7vB,WAAAA;AAAAA,IACAyvB,WAAAA;AAAAA,EAAAA,CACD,GAGC,gBAAAvuB,EAAC8E,GAAA,EAAI,IAAG,MACN,UAAA,gBAAA9E,EAAC8E,KAAI,UAAS,YAAW,OAAM,QAAO,OAAO;AAAA,IAAE1G,QAAQmwB;AAAAA,EAAAA,GACpD+B,UAAAA,EAAYS,gBAAAA,EAAkBrpB,IAAKspB,CAAAA,MAAgB;AAClD,UAAMpoB,IAAOf,EAAMmpB,EAAYnoB,KAAK;AACpC,WAAKD,sBAGF9D,GAAA,EAEC,KAAKwrB,EAAYW,gBACjB,cAAYD,EAAYnoB,OACxB,+BAA6BD,EAAKyL,MAClC,UAAS,YACT,KAAI,KACJ,MAAK,KACL,OAAM,QACN,OAAO;AAAA,MAAE6c,KAAKF,EAAYG;AAAAA,IAAAA,GAEzBlB,aAAernB,GAAM;AAAA,MACpBskB,QAAAA;AAAAA,MACApnB,WAAAA;AAAAA,MACAoqB,yBAAAA;AAAAA,MACAC,0BAAAA;AAAAA,MACAL,uBAAAA;AAAAA,IAAAA,CACD,EAAA,GAhBIkB,EAAY3nB,GAiBnB,IArBgB;AAAA,EAuBpB,CAAC,GACH,GACF;AAEJ,GChTa+nB,KAAY5yB,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GACvB;AAAA,IAAA2yB,iBAAAA;AAAAA,IAAAvE,UAAAA;AAAAA,IAAAlB,SAAA5sB;AAAAA,IAAA8G,WAAA7G;AAAAA,IAAAqyB,iBAAAA;AAAAA,IAAAC,uBAAAA;AAAAA,IAAAC,mBAAAA;AAAAA,IAAAC,iBAAAA;AAAAA,IAAAC,sBAAAA;AAAAA,IAAAC,uBAAAzyB;AAAAA,IAAA0yB,iBAAAA;AAAAA,IAAA3kB,aAAAA;AAAAA,IAAA4kB,mBAAAA;AAAAA,IAAAtkB,SAAAA;AAAAA,IAAAukB,UAAAA;AAAAA,IAAA5kB,mBAAAA;AAAAA,IAAAC,oBAAAA;AAAAA,IAAAG,gBAAAA;AAAAA,IAAAykB,gBAAAA;AAAAA,IAAAC,cAAAA;AAAAA,IAAAC,uBAAA9yB;AAAAA,IAAA+yB,eAAA1yB;AAAAA,IAAA2yB,yBAAAA;AAAAA,IAAAC,oBAAA5tB;AAAAA,EAAAA,IAyBIhG,GAtBFotB,IAAA5sB,MAAA8H,SAAA,KAAA9H,GACA8G,IAAA7G,MAAA6H,SAAA,KAAA7H,GAMA0yB,IAAAzyB,MAAA4H,SAAA,KAAA5H,GAWA+yB,KAAA9yB,MAAA2H,SAAA,KAAA3H,GACA+yB,KAAA1yB,MAAAsH,SAAA,KAAAtH,GAEA4yB,KAAA5tB,MAAAsC,SAAA,KAAAtC;AAA0B,MAAA6tB,GAAAC,GAAA5tB,IAAAS;AAAA,MAAA1G,EAAA,CAAA,MAAA4yB,KAAA5yB,SAAAquB,GAAA;AAG5B,UAAAC,IAAeF,GAA+BC,CAAQ;AACtDuF,IAAAA,IAAoBtF,EAAMppB,SAAU;AACpC,UAAA4uB,KAAuBlB,KAAmBtE,EAAM,CAAA,GAAO3kB;AACvDkqB,IAAAA,IAA4BD,IAAeE,MAAA,wBAAf,MAC5BptB,IAAyB4nB,EAAM7Y,OAAQpM,IAA+D,CAAC,GAClEpD,KAAAuoB,GAAoBF,CAAM,GAACtuB,OAAA4yB,GAAA5yB,OAAAquB,GAAAruB,OAAA4zB,GAAA5zB,OAAA6zB,GAAA7zB,OAAAiG,IAAAjG,OAAA0G;AAAAA,EAAA;AAAAktB,IAAAA,IAAA5zB,EAAA,CAAA,GAAA6zB,IAAA7zB,EAAA,CAAA,GAAAiG,KAAAjG,EAAA,CAAA,GAAA0G,IAAA1G,EAAA,CAAA;AAAhE,QAAA;AAAA,IAAAyuB,QAAAA;AAAAA,IAAAC,kBAAAA;AAAAA,EAAAA,IAAqCzoB,IACrC,CAAAyrB,IAAAqC,EAAA,IAAgErnB,EAAS0D,EAAuB,GAChG,CAAA4jB,IAAAC,EAAA,IAAsDvnB,EAAwB,IAAI,GAClFwnB,KAAyB,CAACN,KAADzG;AAAwB,MAAAjnB;AAAA,EAAAlG,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAGvCsF,KAAA,gBAAA3E,EAAC4yB,IAAA,EAAwB,MAAA,IAAiB,aAAA,KAAG,GAAIn0B,OAAAkG,MAAAA,KAAAlG,EAAA,CAAA;AAAA,MAAAoG;AAAA,EAAApG,EAAA,CAAA,MAAA8yB,KAAA9yB,SAAA6yB,KADzDzsB,uBAACguB,IAAA,EACO,MAAAluB,IACC2sB,UACMC,aAAAA,GAAqB,GAClC9yB,OAAA8yB,GAAA9yB,OAAA6yB,GAAA7yB,OAAAoG,MAAAA,KAAApG,EAAA,CAAA;AAEJ,QAAAq0B,KAAqBH,KAAAlB,IAAsCD,KANzD3sB,IAOFkuB,IAAwB9pB,EAAQ+oB,GAChC9B,KAAgCjnB,EAAQkpB,GACxCa,KAA8BltB,KAAAusB,KAAA,CAA6BJ,IAC3DgB,KAA+B,CAACX,KAAuBG,OAAwBH;AAAoB,MAAAvmB;AAAA,EAAAtN,EAAA,EAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAE/D0M,KAAAmnB,CAAAA,MAAA;AAClCV,IAAAA,GAA4BjtB,CAAAA,OAAA;AAC1B,YAAAyX,KAAa,IAAItF,IAAInS,EAAO;AAC5B,aAAIyX,GAAI7B,IAAK+X,CAAS,IACpBlW,GAAImW,OAAQD,CAAS,IAErBlW,GAAIsE,IAAK4R,CAAS,GAGblW;AAAAA,IAAI,CACZ;AAAA,EAAC,GACHve,QAAAsN,MAAAA,KAAAtN,EAAA,EAAA;AAXD,QAAA20B,KAAoCrnB;AAWlC,MAAAuC;AAAA,EAAA7P,UAAA0G,KAKImJ,sBAAClJ,MAA6BD,kBAAAA,EAAAA,CAAgB,GAAI1G,QAAA0G,GAAA1G,QAAA6P,KAAAA,IAAA7P,EAAA,EAAA;AACb,QAAA+P,KAAAykB,KAAA,YAAA;AAA6C,MAAAxkB;AAAA,EAAAhQ,EAAA,EAAA,MAAAq0B,MAAAr0B,EAAA,EAAA,MAAA0xB,MAAA1xB,EAAA,EAAA,MAAAyuB,KAAAzuB,EAAA,EAAA,MAAA4zB,KAAA5zB,EAAA,EAAA,MAAAyxB,MAAAzxB,EAAA,EAAA,MAAA0uB,MAAA1uB,EAAA,EAAA,MAAA6zB,KAAA7zB,UAAAqH,KAC/E2I,KAAA4jB,IACC,gBAAAryB,EAACowB,IAAA,EAEmBjD,kBAAAA,IACVD,QAAAA,GACGpnB,WAAAA,GACcoqB,yBAAAA,IACCC,0BAAAA,IACHiD,2BACd,SAAA,MAAMV,GAAuBJ,CAAmB,EAAA,GAPpDA,CAOqD,IAT7DQ,IAaAr0B,QAAAq0B,IAAAr0B,QAAA0xB,IAAA1xB,QAAAyuB,GAAAzuB,QAAA4zB,GAAA5zB,QAAAyxB,IAAAzxB,QAAA0uB,IAAA1uB,QAAA6zB,GAAA7zB,QAAAqH,GAAArH,QAAAgQ,MAAAA,KAAAhQ,EAAA,EAAA;AAAA,MAAAiQ;AAAA,EAAAjQ,EAAA,EAAA,MAAA+P,MAAA/P,UAAAgQ,MAdHC,sBAAAtO,GAAA,UAAA,EAAqC,YAAAoO,IAClCC,UAAAA,IAcH,GAA0BhQ,QAAA+P,IAAA/P,QAAAgQ,IAAAhQ,QAAAiQ,KAAAA,IAAAjQ,EAAA,EAAA;AAAA,MAAAkQ;AAAA,EAAAlQ,UAAAw0B,MACzBtkB,IAAAskB,KAAyB,gBAAAjzB,EAAAI,GAAA,gBAAA,EAA0C,cAAA,4BAA0B,IAA7F,MAAuG3B,QAAAw0B,IAAAx0B,QAAAkQ,KAAAA,IAAAlQ,EAAA,EAAA;AAAA,MAAAqQ;AAAA,EAAArQ,EAAA,EAAA,MAAA6P,KAAA7P,UAAAiQ,KAAAjQ,EAAA,EAAA,MAAAkQ,KAlB1GG,IAAA,gBAAA3K,EAAA/D,GAAA,MAAA,EACEkO,UAAAA;AAAAA,IAAAA;AAAAA,IACAI;AAAAA,IAgBCC;AAAAA,EAAAA,GACH,GAAsBlQ,QAAA6P,GAAA7P,QAAAiQ,GAAAjQ,QAAAkQ,GAAAlQ,QAAAqQ,KAAAA,IAAArQ,EAAA,EAAA;AAAA,MAAAsQ;AAAA,EAAAtQ,UAAAu0B,MAErBjkB,IAAAikB,uBACEpuB,IAAA,EAAW,KAAA,MAAQ,IAAA,MAAQ,IAAA,OAC1B,UAAA;AAAA,IAAA,gBAAA5E,EAAC0sB,IAAA,EAAa,MAAA,MAAW,OAAA,YAAU;AAAA,sBAClCtoB,GAAA,EAAe,WAAA,oBAAyB,OAAA,YAAW,UAAA,aAAA,CAEpD;AAAA,EAAA,EAAA,CACF,IAND,MAOO3F,QAAAu0B,IAAAv0B,QAAAsQ,KAAAA,IAAAtQ,EAAA,EAAA;AACY,QAAAuQ,IAAA+jB,IAAA,MAAA;AAA4B,MAAA9jB;AAAA,EAAAxQ,UAAAkzB,KAI9B1iB,IAAAuE,GAA4Bme,CAAqB,GAAClzB,QAAAkzB,GAAAlzB,QAAAwQ,KAAAA,IAAAxQ,EAAA,EAAA;AAAA,MAAA6Q;AAAA,EAAA7Q,EAAA,EAAA,MAAA8O,KAAA9O,UAAAyO,KAAAzO,EAAA,EAAA,MAAA6O,KAAA7O,EAAA,EAAA,MAAA2zB,MAAA3zB,EAAA,EAAA,MAAAizB,KAAAjzB,EAAA,EAAA,MAAA0zB,KAAA1zB,EAAA,EAAA,MAAAs0B,KAAAt0B,EAAA,EAAA,MAAAyzB,MAAAzzB,EAAA,EAAA,MAAAozB,KAAApzB,EAAA,EAAA,MAAA0O,KAAA1O,UAAAwO,KAAAxO,EAAA,EAAA,MAAAmzB,KAAAnzB,EAAA,EAAA,MAAAqH,KAAArH,EAAA,EAAA,MAAAwQ,KAFlEK,IAAA,gBAAAtP,EAAC8M,MACc4kB,aAAAA,GACC,cAAAziB,GACHnJ,WAAAA,GACD8rB,UAAAA,GACG3kB,aAAAA,GACH4kB,UAAAA,GACDtkB,SAAAA,GACUL,mBAAAA,GACCC,oBAAAA,GACJG,gBAAAA,GACJ4kB,YAAAA,IACGa,eAAAA,GACCZ,gBAAAA,GACLC,WAAAA,GAAAA,CAAkB,GAC7B3zB,QAAA8O,GAAA9O,QAAAyO,GAAAzO,QAAA6O,GAAA7O,QAAA2zB,IAAA3zB,QAAAizB,GAAAjzB,QAAA0zB,GAAA1zB,QAAAs0B,GAAAt0B,QAAAyzB,IAAAzzB,QAAAozB,GAAApzB,QAAA0O,GAAA1O,QAAAwO,GAAAxO,QAAAmzB,GAAAnzB,QAAAqH,GAAArH,QAAAwQ,GAAAxQ,QAAA6Q,KAAAA,IAAA7Q,EAAA,EAAA;AAAA,MAAA8Q;AAAA,EAAA9Q,EAAA,EAAA,MAAAuQ,KAAAvQ,UAAA6Q,KAAA7Q,EAAA,EAAA,MAAAuzB,KAjBJziB,IAAA,gBAAApL,EAACqC,GAAA,EAAS,IAAA,MAAU,KAAAwI;;IAElBM;AAAAA,EAAAA,GAgBF,GAAQ7Q,QAAAuQ,GAAAvQ,QAAA6Q,GAAA7Q,QAAAuzB,GAAAvzB,QAAA8Q,KAAAA,IAAA9Q,EAAA,EAAA;AAAA,MAAAmR;AAAA,EAAAnR,UAAAqzB,KACRliB,sBAAC7K,IAAA,EAAO,GAAA,OAAqB,gBAAA,YAC1B+sB,UAAAA,GACH,GAAOrzB,QAAAqzB,GAAArzB,QAAAmR,KAAAA,IAAAnR,EAAA,EAAA;AAAA,MAAAqR;AAAA,SAAArR,EAAA,EAAA,MAAAszB,KAAAtzB,EAAA,EAAA,MAAAqQ,KAAArQ,EAAA,EAAA,MAAAsQ,KAAAtQ,EAAA,EAAA,MAAA8Q,KAAA9Q,UAAAmR,KAnDTE,uBAAC/K,IAAA,EAAc,UAAA,YAAqB,WAAA,UAAW,GAAA,QAAS,GAAA,QAAgB,UAAA,UACtE+J,UAAAA;AAAAA,IAAAA;AAAAA,IAoBCijB;AAAAA,IACAhjB;AAAAA,IAQDQ;AAAAA,IAmBAK;AAAAA,EAAAA,GAGF,GAAOnR,QAAAszB,GAAAtzB,QAAAqQ,GAAArQ,QAAAsQ,GAAAtQ,QAAA8Q,GAAA9Q,QAAAmR,GAAAnR,QAAAqR,MAAAA,KAAArR,EAAA,EAAA,GApDPqR;AAoDO;AApHc,SAAAhI,GAAAqjB,GAAAnX,GAAA;AAAA,SAgCoCmX,KAASnX,EAAOpW,SAAU,SAAjB,IAAA;AAAgC;AAhC7E,SAAAiR,KAAA;AAAA,6BAkC4D6I,IAAAA;AAAa;AC1ElG,MAAM2b,KAAsBA,CAACC,MAC3B,gBAAAtzB,EAACwG,GAAA,EAAM,KAAI,MAAK,GAAE,QACf8sB,UAAAA,EAAO5rB,IAAI,CAAC5G,GAAO+H,MAClB,gBAAA7I,EAACuzB,IAAA,EAAmC,QAAO,KAAI,OAAAzyB,GAAc,cAAa,KAAA,GAA3D,GAAGA,CAAK,IAAI+H,CAAK,GACjC,EAAA,CACH,GAGW2qB,KAAeA,MAAA;AAAA,QAAA/0B,IAAAC,EAAA,CAAA;AAAA,MAAAM;AAAA,EAAAP,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAGtBL,sBAAAoE,GAAA,MAAA,EAAuB,MAAA,QACrB,4BAAAA,GAAA,SAAA,EAA0B,MAAA,QAAQiwB,UAAAA,GAAoB,CAAC,OAAO,KAAK,CAAC,GAAE,GACxE,GAAmB50B,OAAAO,KAAAA,IAAAP,EAAA,CAAA;AAAA,MAAAQ;AAAA,SAAAR,EAAA,CAAA,MAAAW,uBAAAC,IAAA,2BAAA,KAHrBJ,sBAACuH,GAAA,EAAW,MAAA,QAAU,IAAA,MAAS,KAAA,KAC7BxH,UAAAA;AAAAA,IAAAA;AAAAA,iCAGuB,MAAA,aACrB,4BAAAoE,GAAA,SAAA,EAA0B,MAAA,aAAaiwB,aAAoB,CAAC,OAAO,OAAO,KAAK,CAAC,GAAE,EAAA,CACpF;AAAA,EAAA,GACF,GAAQ50B,OAAAQ,KAAAA,IAAAR,EAAA,CAAA,GAPRQ;AAOQ,GCJCw0B,KAAmBj1B,CAAAA,MAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAC9B;AAAA,IAAAg1B,cAAAA;AAAAA,IAAArY,WAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAA1K,QAAAA;AAAAA,IAAAmO,QAAA/f;AAAAA,IAAA20B,aAAAA;AAAAA,EAAAA,IAAsFn1B,GAAlCugB,IAAA/f,MAAA8H,SAAA,UAAA9H,GACpD40B,IAAmBvY,IAAY,KAAKC,IAAY,GAW/Brc,IAAA8f,MAAW,UAAX,iBAAA,gBAGT7f,IAAA6f,MAAW,UAAX,aAAA;AAA6C,MAAA5f;AAAA,EAAAV,SAAA4c,KAAA5c,EAAA,CAAA,MAAAi1B,KAAAj1B,EAAA,CAAA,MAAA6c,KAAA7c,EAAA,CAAA,MAAAm1B,KAAAn1B,SAAAsgB,KAAAtgB,EAAA,CAAA,MAAAk1B,KAEhDx0B,IAAA4f,MAAW,YACV,gBAAA5a,EAACS,MAAW,KAAA,MAAU,MAAA,KACpB,UAAA;AAAA,IAAA,gBAAA5E,EAAC0sB,IAAA,EAAa,MAAA,MAAW,OAAA,YAAU;AAAA,IACnC,gBAAA1sB,EAACoE,KAAe,WAAA,mBAAwB,OAAA,YAAW,UAAA,IAChDuvB,UAAAA,KAAA,0BAAA,CACH;AAAA,EAAA,EAAA,CACF,IACE5U,MAAW,UACb,gBAAA5a,EAACS,MAAW,KAAA,MAAU,MAAA,KACpB,UAAA;AAAA,IAAA,gBAAA5E,EAACkZ,IAAA,EAAoB,UAAU,OAAA,iCAA+B;AAAA,IAC9D,gBAAAlZ,EAACoE,KAAe,WAAA,mBAAwB,OAAA,YAAW,UAAA,IAChDuvB,UAAAA,KAAA,yBAAA,CACH;AAAA,EAAA,EAAA,CACF,IACEC,IACF,gBAAA5zB,EAAC+nB,IAAA,EACQ2L,OAAAA,GACIrY,WAAAA,GACAC,WAAAA,GACH,SAAA,SACH,MAAA,SACG,QAAA;AAAA,IAAAuY,YAAc;AAAA,EAAA,EAAc,CAAC,IAGvC,gBAAA7zB,EAAC+E,IAAA,EAAU,MAAA,IAAA,CAAG,GACftG,OAAA4c,GAAA5c,OAAAi1B,GAAAj1B,OAAA6c,GAAA7c,OAAAm1B,GAAAn1B,OAAAsgB,GAAAtgB,OAAAk1B,GAAAl1B,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAe;AAAA,EAAAf,SAAAmS,KACApR,IAAAoR,sBACE7L,IAAA,EAAiB,YAAA,GAAM,IAAA,QACrB6L,aACH,IAHD,MAIOnS,OAAAmS,GAAAnS,OAAAe,KAAAA,IAAAf,EAAA,CAAA;AAAA,MAAA+F;AAAA,SAAA/F,EAAA,CAAA,MAAAQ,KAAAR,EAAA,EAAA,MAAAS,KAAAT,EAAA,EAAA,MAAAU,KAAAV,UAAAe,KA3CVgF,IAAA,gBAAAL,EAACY,MACO,OAAA,UACE,SAAA,iBACJ,KAAA,MACC,MAAA,KACF,IAAA,MACA,IAAA,MACS,aAAA,OACC,aAAA9F,GACA,cAAA,MACM,oBAAA,KACf,IAAAC,GAEHC,UAAAA;AAAAA,IAAAA;AAAAA,IA0BAK;AAAAA,EAAAA,GAKH,GAAOf,OAAAQ,GAAAR,QAAAS,GAAAT,QAAAU,GAAAV,QAAAe,GAAAf,QAAA+F,KAAAA,IAAA/F,EAAA,EAAA,GA5CP+F;AA4CO;"}