@datatechsolutions/ui 2.7.116 → 2.7.117

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 (53) hide show
  1. package/dist/chunk-2HUN5ZXT.js +5 -0
  2. package/dist/chunk-2HUN5ZXT.js.map +1 -0
  3. package/dist/chunk-2KZEO34C.mjs +6645 -0
  4. package/dist/chunk-2KZEO34C.mjs.map +1 -0
  5. package/dist/chunk-5YIUJXPD.js +279 -0
  6. package/dist/chunk-5YIUJXPD.js.map +1 -0
  7. package/dist/chunk-A3B3A43Y.mjs +4 -0
  8. package/dist/chunk-A3B3A43Y.mjs.map +1 -0
  9. package/dist/chunk-D2JF6C3E.mjs +46 -0
  10. package/dist/chunk-D2JF6C3E.mjs.map +1 -0
  11. package/dist/chunk-FAAXHLWI.js +170 -0
  12. package/dist/chunk-FAAXHLWI.js.map +1 -0
  13. package/dist/chunk-MGR7H5X2.mjs +163 -0
  14. package/dist/chunk-MGR7H5X2.mjs.map +1 -0
  15. package/dist/chunk-NJ6PBGQM.js +44 -0
  16. package/dist/chunk-NJ6PBGQM.js.map +1 -0
  17. package/dist/chunk-OQAZ2BIC.mjs +276 -0
  18. package/dist/chunk-OQAZ2BIC.mjs.map +1 -0
  19. package/dist/chunk-UBCSCLUW.mjs +39 -0
  20. package/dist/chunk-UBCSCLUW.mjs.map +1 -0
  21. package/dist/chunk-URTWMG3V.mjs +14742 -0
  22. package/dist/chunk-URTWMG3V.mjs.map +1 -0
  23. package/dist/chunk-UZ3CMNUJ.js +49 -0
  24. package/dist/chunk-UZ3CMNUJ.js.map +1 -0
  25. package/dist/chunk-UZHWA7CM.js +6714 -0
  26. package/dist/chunk-UZHWA7CM.js.map +1 -0
  27. package/dist/chunk-YRY7HFKG.js +15128 -0
  28. package/dist/chunk-YRY7HFKG.js.map +1 -0
  29. package/dist/index.js +1441 -15235
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +2 -14853
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/use-haptic-RDQNJYBE.js +17 -0
  34. package/dist/use-haptic-RDQNJYBE.js.map +1 -0
  35. package/dist/use-haptic-TCMOLPGA.mjs +4 -0
  36. package/dist/use-haptic-TCMOLPGA.mjs.map +1 -0
  37. package/dist/workflow/graph-node.js +19 -37
  38. package/dist/workflow/graph-node.js.map +1 -1
  39. package/dist/workflow/graph-node.mjs +2 -36
  40. package/dist/workflow/graph-node.mjs.map +1 -1
  41. package/dist/workflow/index.js +509 -11060
  42. package/dist/workflow/index.js.map +1 -1
  43. package/dist/workflow/index.mjs +33 -10743
  44. package/dist/workflow/index.mjs.map +1 -1
  45. package/dist/workflow/utils.js +18 -436
  46. package/dist/workflow/utils.js.map +1 -1
  47. package/dist/workflow/utils.mjs +2 -432
  48. package/dist/workflow/utils.mjs.map +1 -1
  49. package/dist/workflow/workflow-canvas.js +8 -10221
  50. package/dist/workflow/workflow-canvas.js.map +1 -1
  51. package/dist/workflow/workflow-canvas.mjs +5 -10197
  52. package/dist/workflow/workflow-canvas.mjs.map +1 -1
  53. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/use-haptic.ts","../../src/workflow/store/workflow-store.ts","../../src/workflow/store/drawer-store.ts","../../src/workflow/constants/workflow-constants.ts","../../src/workflow/components/canvas/edge-insert-popup.tsx","../../src/workflow/components/canvas/conditional-edge.tsx","../../src/workflow/components/canvas/custom-connection-line.tsx","../../src/workflow/components/canvas/draggable-command-bar.tsx","../../src/workflow/constants/entity-colors.ts","../../src/workflow/utils/logic-node-defaults.ts","../../src/workflow/utils/layout-engine.ts","../../src/workflow/components/icons/agent-framework-icons.tsx","../../src/workflow/components/nodes/node-card.tsx","../../src/workflow/components/nodes/graph-node-primitives.tsx","../../src/workflow/components/nodes/node-card-primitives.tsx","../../src/workflow/components/nodes/node-handles.tsx","../../src/workflow/components/nodes/node-running-indicator.tsx","../../src/workflow/components/nodes/agent-flow-node.tsx","../../src/workflow/components/nodes/tool-flow-node.tsx","../../src/workflow/components/nodes/rule-flow-node.tsx","../../src/workflow/components/nodes/entity-flow-node.tsx","../../src/workflow/components/nodes/start-flow-node.tsx","../../src/workflow/components/nodes/end-flow-node.tsx","../../src/workflow/components/nodes/if-else-flow-node.tsx","../../src/workflow/components/nodes/code-flow-node.tsx","../../src/workflow/components/nodes/http-request-flow-node.tsx","../../src/workflow/components/nodes/template-transform-flow-node.tsx","../../src/workflow/components/nodes/iteration-flow-node.tsx","../../src/workflow/components/nodes/knowledge-base-flow-node.tsx","../../src/workflow/components/nodes/answer-flow-node.tsx","../../src/workflow/components/nodes/question-classifier-flow-node.tsx","../../src/workflow/components/nodes/parameter-extractor-flow-node.tsx","../../src/workflow/components/nodes/variable-assigner-flow-node.tsx","../../src/workflow/components/nodes/variable-aggregator-flow-node.tsx","../../src/workflow/components/nodes/document-extractor-flow-node.tsx","../../src/workflow/components/nodes/list-operator-flow-node.tsx","../../src/workflow/components/nodes/iteration-start-flow-node.tsx","../../src/workflow/components/nodes/note-flow-node.tsx","../../src/workflow/components/nodes/group-flow-node.tsx","../../src/components/link.tsx","../../src/components/button.tsx","../../src/lib/animations.ts","../../src/components/button-styles.ts","../../src/components/card.tsx","../../src/components/input.tsx","../../src/components/select.tsx","../../src/components/sheet.tsx","../../src/components/wheel-picker.tsx","../../src/components/toggle-switch.tsx","../../src/components/active-filter-chips.tsx","../../src/components/search-bar.tsx","../../src/components/pill.tsx","../../src/components/segmented-control.tsx","../../src/components/page-indicator.tsx","../../src/components/action-menu.tsx","../../src/components/swipe-action.tsx","../../src/hooks/use-pull-to-refresh.tsx","../../src/components/table.tsx","../../src/components/empty-state.tsx","../../src/components/dynamic-island.tsx","../../src/components/notifications.tsx","../../src/components/container.tsx","../../src/components/form-field.tsx","../../src/components/form-section.tsx","../../src/components/item-summary.tsx","../../src/components/list-item.tsx","../../src/components/status-badge.tsx","../../src/components/form-modal.tsx","../../src/components/context-menu.tsx","../../src/components/form-input.tsx","../../src/components/form.tsx","../../src/components/launchpad-grid.tsx","../../src/components/dock.tsx","../../src/components/avatar.tsx","../../src/components/badge.tsx","../../src/components/dynamic-island-confirm.tsx","../../src/components/catalyst/textarea.tsx","../../src/components/otp-input.tsx","../../src/components/backup-code-grid.tsx","../../src/index.ts","../../src/components/geo-map/use-geo-map-state.ts","../../src/components/geo-map/geo-map-canvas.tsx","../../src/components/geo-map/map-zoom-controls.tsx","../../src/components/geo-map/interactive-geo-map.tsx","../../src/components/geo-map/geo-map-legend.tsx","../../src/components/entity-drawer.tsx","../../src/components/catalyst/link.tsx","../../src/components/catalyst/button.tsx","../../src/components/catalyst/input.tsx","../../src/components/catalyst/select.tsx","../../src/components/catalyst/label.tsx","../../src/components/catalyst/card.tsx","../../src/components/catalyst/progress.tsx","../../src/components/catalyst/password-input.tsx","../../src/components/catalyst/tabs.tsx","../../src/components/catalyst/contact-card.tsx","../../src/components/catalyst/page-header.tsx","../../src/stores/platform-shell-store.ts","../../src/workflow/components/drawers/workspace-drawer.tsx","../../src/workflow/components/config-forms/start-node-config-form.tsx","../../src/workflow/components/config-forms/end-node-config-form.tsx","../../src/workflow/components/config-forms/config-form-actions.tsx","../../src/workflow/components/config-forms/if-else-node-config-form.tsx","../../src/workflow/components/config-forms/code-node-config-form.tsx","../../src/workflow/components/config-forms/http-request-node-config-form.tsx","../../src/workflow/components/config-forms/template-transform-node-config-form.tsx","../../src/workflow/components/config-forms/iteration-node-config-form.tsx","../../src/workflow/components/config-forms/knowledge-base-node-config-form.tsx","../../src/workflow/components/config-forms/answer-node-config-form.tsx","../../src/workflow/components/config-forms/question-classifier-node-config-form.tsx","../../src/workflow/components/config-forms/parameter-extractor-node-config-form.tsx","../../src/workflow/components/config-forms/variable-assigner-node-config-form.tsx","../../src/workflow/components/config-forms/variable-aggregator-node-config-form.tsx","../../src/workflow/components/config-forms/document-extractor-node-config-form.tsx","../../src/workflow/components/config-forms/list-operator-node-config-form.tsx","../../src/workflow/components/config-forms/iteration-start-node-config-form.tsx","../../src/workflow/components/config-forms/entity-node-config-form.tsx","../../src/workflow/components/config-forms/group-node-config-form.tsx","../../src/workflow/components/drawers/logic-node-drawer.tsx","../../src/workflow/components/context-menus/node-context-menu.tsx","../../src/workflow/components/context-menus/panel-context-menu.tsx","../../src/workflow/components/context-menus/selection-context-menu.tsx","../../src/workflow/components/canvas/workflow-canvas.tsx","../../src/workflow/workflow-provider.tsx","../../src/workflow/workflow-canvas.tsx","../../src/workflow/components/icons/model-provider-icons.tsx","../../src/workflow/components/drawers/agent-drawer.tsx","../../src/workflow/store/subworkflow-store.ts","../../src/workflow/components/drawers/subworkflow-drawer.tsx","../../src/workflow/components/drawers/pipeline-settings-drawer.tsx","../../src/workflow/components/panels/node-palette.tsx","../../src/workflow/components/panels/workflow-list-bar.tsx","../../src/workflow/components/panels/version-history-panel.tsx","../../src/workflow/components/panels/run-panel.tsx","../../src/workflow/components/panels/variable-inspector.tsx","../../src/workflow/components/panels/run-input-dialog.tsx","../../src/workflow/components/panels/preview-panel.tsx","../../src/workflow/components/panels/save-status-badge.tsx","../../src/workflow/components/panels/auto-save-workspace.tsx","../../src/workflow/components/modals/dynamic-island-confirm.tsx","../../src/workflow/components/modals/dsl-export-modal.tsx","../../src/workflow/components/modals/dsl-import-modal.tsx","../../src/workflow/store/selectors.ts","../../src/workflow/hooks/use-undo-redo.ts","../../src/workflow/hooks/use-clipboard.ts","../../src/workflow/hooks/use-canvas-shortcuts.ts","../../src/workflow/hooks/use-help-lines.ts","../../src/workflow/utils/workflow-validator.ts","../../src/workflow/components/nodes/agent-tool-flow-node.tsx"],"names":["create","useState","jsxs","jsx","PlusIcon","memo","getBezierPath","DraggableCommandBar","useRef","useCallback","useEffect","ArrowsRightLeftIcon","Fragment","CircleStackIcon","AgentFlowNode","useTranslations","Position","TrashIcon","ToolFlowNode","ExclamationTriangleIcon","WrenchScrewdriverIcon","RuleFlowNode","EntityFlowNode","StartFlowNode","PlayIcon","EndFlowNode","StopIcon","IfElseFlowNode","ArrowsPointingOutIcon","CodeFlowNode","CodeBracketIcon","HttpRequestFlowNode","GlobeAltIcon","TemplateTransformFlowNode","DocumentTextIcon","IterationFlowNode","ArrowPathIcon","KnowledgeBaseFlowNode","BookOpenIcon","AnswerFlowNode","ChatBubbleLeftRightIcon","QuestionClassifierFlowNode","QuestionMarkCircleIcon","ParameterExtractorFlowNode","AdjustmentsVerticalIcon","VariableAssignerFlowNode","VariableAggregatorFlowNode","Square3Stack3DIcon","DocumentExtractorFlowNode","DocumentMagnifyingGlassIcon","ListOperatorFlowNode","ListBulletIcon","IterationStartFlowNode","PlayCircleIcon","NoteFlowNode","PencilSquareIcon","GroupFlowNode","RectangleGroupIcon","Link","forwardRef","Button","HeadlessButton","onDragStart","motion","AnimatePresence","EyeSlashIcon","EyeIcon","XMarkIcon","useTransform","useMotionValue","ChevronDownIcon","createContext","React","clsx","CONTAINER_STYLES","StatusBadge","resolvedLabel","DialogTitle","Dialog","DialogPanel","createPortal","LaunchpadIcon","DockItem","AvatarButton","Headless3","BadgeButton","Headless4","React12","useMemo","colors","NextLink","styles","TouchTarget","Headless7","Input","Headless8","Select","Headless9","Label","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","StatCard","React22","PasswordInput","React24","ContactCard","OfficeCard","ContactSection","PageHeader","PageSectionHeader","CardSectionHeader","ClipboardDocumentIcon","CursorArrowRaysIcon","DocumentDuplicateIcon","DEFAULT_NODE_WIDTH","DEFAULT_NODE_HEIGHT","useReactFlow","INPUT_TAGS","isInputFocused","useContext","CpuChipIcon","ChevronRightIcon","graph","MaximizeIcon","ArrowsPointingInIcon","ClockIcon","CheckIcon","SectionHeader","CommandLineIcon","ArrowPathRoundedSquareIcon","AdjustmentsHorizontalIcon","BoltIcon","formatTimestamp","CheckCircleIcon","XCircleIcon","formatDuration","ExclamationCircleIcon","AutoSaveWorkspace","DynamicIslandConfirm","ArrowDownTrayIcon","AgentToolFlowNode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDO,SAAS,aAAA,CAAc,UAAyB,OAAA,EAAS;AAC9D,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,EAAE,SAAA,IAAa,YAAY,OAAO,KAAA;AAE1E,EAAA,IAAI;AACF,IAAA,SAAA,CAAU,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAzDA,IAQM,QAAA;AARN,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AAQA,IAAM,QAAA,GAAqD;AAAA,MACzD,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,KAAA,EAAO,EAAA;AAAA,MACP,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,MACpB,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,MACpB,KAAA,EAAO,CAAC,EAAA,EAAI,GAAA,EAAK,EAAE,CAAA;AAAA,MACnB,SAAA,EAAW;AAAA,KACb;AAAA,EAAA;AAAA,CAAA,CAAA;AC6DA,IAAM,oBAAA,GAAuB,EAAA;AAEtB,IAAM,gBAAA,GAAmB,MAAA,CAAsB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA;AAAA;AAAA;AAAA,EAKnE,OAAO,EAAC;AAAA,EACR,OAAO,EAAC;AAAA,EACR,MAAM,EAAC;AAAA,EACP,QAAQ,EAAC;AAAA,EACT,SAAA,EAAW,IAAA;AAAA,EACX,aAAA,EAAe,IAAA;AAAA,EACf,WAAA,EAAa,IAAA;AAAA,EACb,WAAA,EAAa,SAAA;AAAA,EACb,eAAA,EAAiB,MAAA;AAAA,EACjB,qBAAA,EAAuB,KAAA;AAAA,EACvB,kBAAA,EAAoB,KAAA;AAAA,EACpB,YAAA,EAAc,KAAA;AAAA,EACd,SAAA,EAAW,KAAA;AAAA,EACX,aAAa,EAAC;AAAA,EACd,aAAA,EAAe,IAAA;AAAA,EACf,gBAAA,EAAkB,KAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,OAAO,OAAO,OAAA,KAAY,aAAa,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GAAI;AAAA,KAChE,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,QAAA,EAAU,CAAC,OAAA,KAAY;AACrB,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,OAAO,OAAO,OAAA,KAAY,aAAa,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GAAI;AAAA,KAChE,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,cAAc,MAAM;AAClB,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,KAAS,GAAA,EAAI;AACnC,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC9B,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MAChE,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAC1C;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAuB,CAAA;AACtD,IAAA,GAAA,CAAI;AAAA,MACF,IAAA,EAAM,CAAC,GAAG,WAAA,EAAa,QAAQ,CAAA;AAAA,MAC/B,QAAQ;AAAC,KACV,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,MAAM,MAAM;AACV,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,KAAU,GAAA,EAAI;AACnC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEtC,IAAA,MAAM,eAAA,GAAiC;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MAChE,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAC1C;AAEA,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,IAAA,EAAM,aAAA;AAAA,MACN,MAAA,EAAQ,CAAC,GAAG,KAAA,CAAM,QAAQ,eAAe;AAAA,KAC3C,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,MAAM,MAAM;AACV,IAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,KAAU,GAAA,EAAI;AACrC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAE1C,IAAA,MAAM,eAAA,GAAiC;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MAChE,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAC1C;AAEA,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAA,EAAQ,eAAA;AAAA,MACR,IAAA,EAAM,CAAC,GAAG,KAAA,CAAM,MAAM,eAAe;AAAA,KACvC,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,MAAM,MAAM;AACV,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,GAAA,EAAI;AAC7B,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AAC1D,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAEhC,IAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AACpE,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA;AAAA,MAC1B,CAAC,IAAA,KAAS,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IAAK,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,MAAM;AAAA,KAC/E;AAEA,IAAA,GAAA,CAAI;AAAA,MACF,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,aAAA,CAAc,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,QACxE,KAAA,EAAO,cAAc,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA;AAClD,KACD,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,KAAA,EAAO,CAAC,MAAA,GAAS,oBAAA,KAAyB;AACxC,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,GAAA,EAAI;AAC1B,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA,EAAG;AAEhD,IAAA,GAAA,GAAM,YAAA,EAAa;AAEnB,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,IAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,KAAA,EAAO;AAClC,MAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,MAAA,CAAO,YAAY,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,WAAA,GAAsB,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACzD,GAAG,IAAA;AAAA,MACH,IAAI,SAAA,CAAU,GAAA,CAAI,KAAK,EAAE,CAAA,IAAK,OAAO,UAAA,EAAW;AAAA,MAChD,QAAA,EAAU;AAAA,QACR,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,MAAA;AAAA,QACrB,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI;AAAA,OACvB;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA;AAAK,KACvB,CAAE,CAAA;AAEF,IAAA,MAAM,WAAA,GAAsB,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACzD,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,QAAQ,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAM,KAAK,IAAA,CAAK,MAAA;AAAA,MAC3C,QAAQ,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAM,KAAK,IAAA,CAAK;AAAA,KAC7C,CAAE,CAAA;AAEF,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,KAAA,EAAO;AAAA,QACL,GAAG,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM,CAAE,CAAA;AAAA,QAC3D,GAAG;AAAA,OACL;AAAA,MACA,OAAO,CAAC,GAAG,KAAA,CAAM,KAAA,EAAO,GAAG,WAAW,CAAA;AAAA,MACtC,SAAA,EAAW;AAAA,QACT,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,QACtE,KAAA,EAAO,YAAY,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA;AAChD,KACF,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,WAAW,MAAM;AACf,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK,CAAE;AAAA,KAChE,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,aAAa,MAAM;AACjB,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM,CAAE;AAAA,KACjE,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,gBAAA,EAAkB,CAAC,MAAA,KAAW;AAC5B,IAAA,GAAA,CAAI,EAAE,aAAA,EAAe,MAAA,EAAQ,CAAA;AAAA,EAC/B,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,IAAA,KAAS;AACxB,IAAA,GAAA,CAAI,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,EAC3B,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,IAAA,KAAS;AACxB,IAAA,GAAA,CAAI,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,EAC3B,CAAA;AAAA,EAEA,kBAAA,EAAoB,CAAC,SAAA,KAAc;AACjC,IAAA,GAAA,CAAI,EAAE,eAAA,EAAiB,SAAA,EAAW,CAAA;AAAA,EACpC,CAAA;AAAA,EAEA,yBAAyB,MAAM;AAC7B,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,uBAAuB,CAAC,KAAA,CAAM,uBAAsB,CAAE,CAAA;AAAA,EAC1E,CAAA;AAAA,EAEA,sBAAsB,MAAM;AAC1B,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,oBAAoB,CAAC,KAAA,CAAM,oBAAmB,CAAE,CAAA;AAAA,EACpE,CAAA;AAAA,EAEA,gBAAgB,MAAM;AACpB,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,cAAc,CAAC,KAAA,CAAM,cAAa,CAAE,CAAA;AAAA,EACxD,CAAA;AAAA,EAEA,YAAA,EAAc,CAAC,OAAA,KAAY;AACzB,IAAA,GAAA,CAAI,EAAE,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,EAC5B,CAAA;AAAA,EAEA,aAAA,EAAe,CAAC,MAAA,EAAQ,MAAA,KAAW;AACjC,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACd,WAAA,EAAa,EAAE,GAAG,KAAA,CAAM,aAAa,CAAC,MAAM,GAAG,MAAA;AAAO,KACxD,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,kBAAkB,MAAM;AACtB,IAAA,GAAA,CAAI,EAAE,WAAA,EAAa,EAAC,EAAG,SAAA,EAAW,OAAO,CAAA;AAAA,EAC3C,CAAA;AAAA,EAEA,gBAAA,EAAkB,CAAC,KAAA,KAAU;AAC3B,IAAA,GAAA,CAAI,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAAA,EAC9B,CAAA;AAAA,EAEA,oBAAoB,MAAM;AACxB,IAAA,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,kBAAkB,CAAC,KAAA,CAAM,kBAAiB,CAAE,CAAA;AAAA,EAChE,CAAA;AAAA,EAEA,OAAO,MAAM;AACX,IAAA,GAAA,CAAI;AAAA,MACF,OAAO,EAAC;AAAA,MACR,OAAO,EAAC;AAAA,MACR,MAAM,EAAC;AAAA,MACP,QAAQ,EAAC;AAAA,MACT,SAAA,EAAW,IAAA;AAAA,MACX,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa,IAAA;AAAA,MACb,WAAA,EAAa,SAAA;AAAA,MACb,qBAAA,EAAuB,KAAA;AAAA,MACvB,kBAAA,EAAoB,KAAA;AAAA,MACpB,YAAA,EAAc,KAAA;AAAA,MACd,SAAA,EAAW,KAAA;AAAA,MACX,aAAa,EAAC;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAAA,EACH;AACF,CAAA,CAAE;AClQK,IAAM,cAAA,GAAiBA,MAAAA,CAAoB,CAAC,GAAA,MAAS;AAAA,EAC1D,YAAA,EAAc,IAAA;AAAA,EACd,SAAA,EAAW,IAAA;AAAA,EACX,eAAA,EAAiB,IAAA;AAAA,EACjB,aAAA,EAAe,IAAA;AAAA,EACf,oBAAA,EAAsB,IAAA;AAAA,EAEtB,iBAAiB,CAAC,KAAA,EAAO,MAAA,EAAQ,YAAA,GAAe,UAAU,GAAA,CAAI;AAAA,IAC5D,YAAA,EAAc,OAAA;AAAA,IACd,SAAA,EAAW,EAAE,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAa;AAAA,IACzC,eAAA,EAAiB,IAAA;AAAA,IACjB,aAAA,EAAe,IAAA;AAAA,IACf,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAAA,EAED,qBAAA,EAAuB,CAAC,IAAA,KAAS,GAAA,CAAI;AAAA,IACnC,YAAA,EAAc,aAAA;AAAA,IACd,eAAA,EAAiB,EAAE,IAAA,EAAK;AAAA,IACxB,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAAA,EAED,mBAAA,EAAqB,CAAC,MAAA,EAAQ,SAAA,EAAW,WAAW,GAAA,CAAI;AAAA,IACtD,YAAA,EAAc,YAAA;AAAA,IACd,aAAA,EAAe,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO;AAAA,IAC3C,SAAA,EAAW,IAAA;AAAA,IACX,eAAA,EAAiB,IAAA;AAAA,IACjB,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAAA,EAED,0BAAA,EAA4B,CAAC,IAAA,EAAM,WAAA,KAAgB,GAAA,CAAI;AAAA,IACrD,YAAA,EAAc,mBAAA;AAAA,IACd,oBAAA,EAAsB,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,IAC1C,SAAA,EAAW,IAAA;AAAA,IACX,eAAA,EAAiB,IAAA;AAAA,IACjB,aAAA,EAAe;AAAA,GAChB,CAAA;AAAA,EAED,WAAA,EAAa,MAAM,GAAA,CAAI;AAAA,IACrB,YAAA,EAAc,IAAA;AAAA,IACd,SAAA,EAAW,IAAA;AAAA,IACX,eAAA,EAAiB,IAAA;AAAA,IACjB,aAAA,EAAe,IAAA;AAAA,IACf,oBAAA,EAAsB;AAAA,GACvB;AACH,CAAA,CAAE;ACzEK,IAAM,uBAAA,GAA0B,SAAA;AAChC,IAAM,qBAAA,GAAwB,SAAA;AAC9B,IAAM,sBAAA,GAAyB,SAAA;AAG/B,IAAM,QAAA,GAAwE;AAAA,EACnF,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,eAAA,GAA0C;AAAA,EACrD,MAAA,EAAQ,+BAAA;AAAA,EACR,IAAA,EAAM,2BAAA;AAAA,EACN,UAAA,EAAY,+BAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,oBAAA,GAA+C;AAAA,EAC1D,MAAA,EAAQ,8EAAA;AAAA,EACR,IAAA,EAAM,kEAAA;AAAA,EACN,UAAA,EAAY,0EAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,mBAAA,GAA8C;AAAA,EACzD,UAAA,EAAY,+BAAA;AAAA,EACZ,KAAA,EAAO,2BAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,eAAA,GAA0C;AAAA,EACrD,UAAA,EAAY,0EAAA;AAAA,EACZ,KAAA,EAAO,kEAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAMO,IAAM,oBAAA,GAA+C;AAAA,EAC1D,KAAA,EAAO,+BAAA;AAAA,EACP,GAAA,EAAK,0BAAA;AAAA,EACL,OAAA,EAAS,8BAAA;AAAA,EACT,IAAA,EAAM,0BAAA;AAAA,EACN,YAAA,EAAc,8BAAA;AAAA,EACd,kBAAA,EAAoB,2BAAA;AAAA,EACpB,SAAA,EAAW,+BAAA;AAAA,EACX,cAAA,EAAgB,8BAAA;AAAA,EAChB,MAAA,EAAQ,6BAAA;AAAA,EACR,mBAAA,EAAqB,gCAAA;AAAA,EACrB,mBAAA,EAAqB,+BAAA;AAAA,EACrB,iBAAA,EAAmB,0BAAA;AAAA,EACnB,mBAAA,EAAqB,+BAAA;AAAA,EACrB,kBAAA,EAAoB,2BAAA;AAAA,EACpB,aAAA,EAAe,4BAAA;AAAA,EACf,eAAA,EAAiB,6BAAA;AAAA,EACjB,IAAA,EAAM,8BAAA;AAAA,EACN,MAAA,EAAQ,2BAAA;AAAA,EACR,KAAA,EAAO;AACT;AAEO,IAAM,uBAAA,GAAkD;AAAA,EAC7D,KAAA,EAAO,sEAAA;AAAA,EACP,GAAA,EAAK,8DAAA;AAAA,EACL,OAAA,EAAS,sEAAA;AAAA,EACT,IAAA,EAAM,kEAAA;AAAA,EACN,YAAA,EAAc,0EAAA;AAAA,EACd,kBAAA,EAAoB,kEAAA;AAAA,EACpB,SAAA,EAAW,0EAAA;AAAA,EACX,cAAA,EAAgB,8EAAA;AAAA,EAChB,MAAA,EAAQ,kEAAA;AAAA,EACR,mBAAA,EAAqB,0EAAA;AAAA,EACrB,mBAAA,EAAqB,8EAAA;AAAA,EACrB,iBAAA,EAAmB,8DAAA;AAAA,EACnB,mBAAA,EAAqB,0EAAA;AAAA,EACrB,kBAAA,EAAoB,kEAAA;AAAA,EACpB,aAAA,EAAe,kEAAA;AAAA,EACf,eAAA,EAAiB,0EAAA;AAAA,EACjB,IAAA,EAAM,0EAAA;AAAA,EACN,MAAA,EAAQ,kEAAA;AAAA,EACR,KAAA,EAAO;AACT;AAEO,IAAM,4BAAA,GAAuD;AAAA,EAClE,KAAA,EAAO,qEAAA;AAAA,EACP,GAAA,EAAK,6DAAA;AAAA,EACL,OAAA,EAAS,qEAAA;AAAA,EACT,IAAA,EAAM,iEAAA;AAAA,EACN,YAAA,EAAc,yEAAA;AAAA,EACd,kBAAA,EAAoB,iEAAA;AAAA,EACpB,SAAA,EAAW,yEAAA;AAAA,EACX,cAAA,EAAgB,6EAAA;AAAA,EAChB,MAAA,EAAQ,iEAAA;AAAA,EACR,mBAAA,EAAqB,yEAAA;AAAA,EACrB,mBAAA,EAAqB,6EAAA;AAAA,EACrB,iBAAA,EAAmB,6DAAA;AAAA,EACnB,mBAAA,EAAqB,yEAAA;AAAA,EACrB,kBAAA,EAAoB,iEAAA;AAAA,EACpB,aAAA,EAAe,iEAAA;AAAA,EACf,eAAA,EAAiB,yEAAA;AAAA,EACjB,IAAA,EAAM,yEAAA;AAAA,EACN,MAAA,EAAQ,iEAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,cAAA,GAA8E;AAAA,EACzF,KAAA,EAAO,QAAA;AAAA,EACP,GAAA,EAAK,QAAA;AAAA,EACL,OAAA,EAAS,qBAAA;AAAA,EACT,IAAA,EAAM,eAAA;AAAA,EACN,YAAA,EAAc,YAAA;AAAA,EACd,kBAAA,EAAoB,gBAAA;AAAA,EACpB,SAAA,EAAW,aAAA;AAAA,EACX,cAAA,EAAgB,YAAA;AAAA,EAChB,MAAA,EAAQ,uBAAA;AAAA,EACR,mBAAA,EAAqB,sBAAA;AAAA,EACrB,mBAAA,EAAqB,uBAAA;AAAA,EACrB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,mBAAA,EAAqB,kBAAA;AAAA,EACrB,kBAAA,EAAoB,2BAAA;AAAA,EACpB,aAAA,EAAe,cAAA;AAAA,EACf,eAAA,EAAiB,cAAA;AAAA,EACjB,IAAA,EAAM,gBAAA;AAAA,EACN,MAAA,EAAQ,eAAA;AAAA,EACR,KAAA,EAAO;AACT;AAQO,IAAM,mBAAA,GAAsB,oBAAA;AAI5B,IAAM,gBAAA,GAAmB,iBAAA;AAGzB,IAAM,kBAAA,GAA6C;AAAA,EACxD,KAAA,EAAO,4CAAA;AAAA,EACP,IAAA,EAAM,4CAAA;AAAA,EACN,UAAA,EAAY,8CAAA;AAAA,EACZ,MAAA,EAAQ,4CAAA;AAAA,EACR,IAAA,EAAM,4CAAA;AAAA,EACN,KAAA,EAAO,8CAAA;AAAA,EACP,GAAA,EAAK,0CAAA;AAAA,EACL,OAAA,EAAS,8CAAA;AAAA,EACT,IAAA,EAAM,4CAAA;AAAA,EACN,YAAA,EAAc,gDAAA;AAAA,EACd,kBAAA,EAAoB,4CAAA;AAAA,EACpB,SAAA,EAAW,gDAAA;AAAA,EACX,eAAA,EAAiB,gDAAA;AAAA,EACjB,cAAA,EAAgB,kDAAA;AAAA,EAChB,MAAA,EAAQ,4CAAA;AAAA,EACR,mBAAA,EAAqB,gDAAA;AAAA,EACrB,mBAAA,EAAqB,kDAAA;AAAA,EACrB,iBAAA,EAAmB,0CAAA;AAAA,EACnB,mBAAA,EAAqB,gDAAA;AAAA,EACrB,kBAAA,EAAoB,4CAAA;AAAA,EACpB,aAAA,EAAe,4CAAA;AAAA,EACf,IAAA,EAAM;AACR,CAAA;AAOO,SAAS,iBAAA,CACd,QAAA,EACA,QAAA,EACA,YAAA,EACQ;AACR,EAAA,IAAI,UAAU,OAAO,mBAAA;AACrB,EAAA,MAAM,SAAS,YAAA,KAAiB,QAAA,GAAW,mBAAmB,QAAQ,CAAA,GAAI,WAAc,kBAAA,CAAmB,KAAA;AAC3G,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA;AACtC;AAMO,IAAM,mBAAA,GAA8C;AAAA,EACzD,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,UAAA,EAAY,SAAA;AAAA,EACZ,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,GAAA,EAAK,SAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,YAAA,EAAc,SAAA;AAAA,EACd,kBAAA,EAAoB,SAAA;AAAA,EACpB,SAAA,EAAW,SAAA;AAAA,EACX,cAAA,EAAgB,SAAA;AAAA,EAChB,MAAA,EAAQ,SAAA;AAAA,EACR,mBAAA,EAAqB,SAAA;AAAA,EACrB,mBAAA,EAAqB,SAAA;AAAA,EACrB,iBAAA,EAAmB,SAAA;AAAA,EACnB,mBAAA,EAAqB,SAAA;AAAA,EACrB,kBAAA,EAAoB,SAAA;AAAA,EACpB,aAAA,EAAe,SAAA;AAAA,EACf,eAAA,EAAiB,SAAA;AAAA,EACjB,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO;AACT;AAEO,IAAM,wBAAA,GAAmD;AAAA,EAC9D,KAAA,EAAO,eAAA;AAAA,EACP,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,IAAA,EAAM,cAAA;AAAA,EACN,YAAA,EAAc,gBAAA;AAAA,EACd,kBAAA,EAAoB,cAAA;AAAA,EACpB,SAAA,EAAW,gBAAA;AAAA,EACX,cAAA,EAAgB,iBAAA;AAAA,EAChB,MAAA,EAAQ,cAAA;AAAA,EACR,mBAAA,EAAqB,gBAAA;AAAA,EACrB,mBAAA,EAAqB,iBAAA;AAAA,EACrB,iBAAA,EAAmB,aAAA;AAAA,EACnB,mBAAA,EAAqB,gBAAA;AAAA,EACrB,kBAAA,EAAoB,cAAA;AAAA,EACpB,aAAA,EAAe,cAAA;AAAA,EACf,eAAA,EAAiB,gBAAA;AAAA,EACjB,IAAA,EAAM,gBAAA;AAAA,EACN,MAAA,EAAQ,cAAA;AAAA,EACR,KAAA,EAAO;AACT;AC5OA,IAAM,gBAAA,GAAyC;AAAA,EAC7C,EAAE,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,aAAa,SAAA,EAAU;AAAA,EACrE,EAAE,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,eAAA,EAAiB,aAAa,SAAA,EAAU;AAAA,EAC1E,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,aAAa,MAAA,EAAO;AAAA,EAC7D,EAAE,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,iBAAA,EAAmB,aAAa,MAAA,EAAO;AAAA,EAC5E,EAAE,QAAA,EAAU,oBAAA,EAAsB,OAAA,EAAS,uBAAA,EAAyB,aAAa,MAAA,EAAO;AAAA,EACxF,EAAE,QAAA,EAAU,mBAAA,EAAqB,OAAA,EAAS,sBAAA,EAAwB,aAAa,MAAA,EAAO;AAAA,EACtF,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,wBAAA,EAA0B,aAAa,MAAA,EAAO;AAAA,EAC1F,EAAE,QAAA,EAAU,eAAA,EAAiB,OAAA,EAAS,kBAAA,EAAoB,aAAa,MAAA,EAAO;AAAA,EAC9E,EAAE,QAAA,EAAU,oBAAA,EAAsB,OAAA,EAAS,uBAAA,EAAyB,aAAa,MAAA,EAAO;AAAA,EACxF,EAAE,QAAA,EAAU,gBAAA,EAAkB,OAAA,EAAS,mBAAA,EAAqB,aAAa,IAAA,EAAK;AAAA,EAC9E,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,YAAA,EAAc,aAAa,IAAA,EAAK;AAAA,EAC/D,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,wBAAA,EAA0B,aAAa,IAAA,EAAK;AAAA,EACxF,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,wBAAA,EAA0B,aAAa,IAAA;AACrF,CAAA;AAQA,SAAS,wBAAA,CAAyB,EAAE,QAAA,EAAU,QAAA,EAAU,SAAQ,EAAyB;AACvF,EAAA,MAAM,SAAA,GAAY,gBAAgB,iBAAiB,CAAA;AACnD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,OAAuB,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAG9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAS,mBAAmB,KAAA,EAAmB;AAC7C,MAAA,IAAI,QAAA,CAAS,WAAW,CAAC,QAAA,CAAS,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAqB,CAAA,EAAG;AAC/E,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,EAC3E,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAS,cAAc,KAAA,EAAsB;AAC3C,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IACtC;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,IAAA,EAAK,GACnC,gBAAA,CAAiB,MAAA;AAAA,IAAO,CAAC,IAAA,KACvB,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,WAAA,CAAY,WAAA,EAAa;AAAA,GAC1E,GACA,gBAAA;AAEJ,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,QAAA,KAA+B;AAC/D,IAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAEtB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,gDAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,WAAW,CAAA,gCAAA,EAAmC,QAAA,CAAS,CAAC,CAAA,IAAA,EAAO,SAAS,CAAC,CAAA,GAAA;AAAA,OAC3E;AAAA,MAEA,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EAEb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YACtD,WAAA,EAAa,UAAU,eAAe,CAAA;AAAA,YACtC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACZ,QAAA,EAAA;AAAA,UAAA,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS;AAC3B,YAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAClD,YAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,CAAK,QAAQ,CAAA,IAAK,2BAAA;AAExD,YAAA,uBACE,IAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAAA,gBACzC,SAAA,EAAU,+HAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,sEAAA,EAAyE,QAAQ,CAAA,UAAA,CAAA,EAC9F,2CAAiB,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAClE,CAAA;AAAA,sCACC,MAAA,EAAA,EAAK,SAAA,EAAU,qEACb,QAAA,EAAA,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EACzB;AAAA;AAAA,eAAA;AAAA,cAVK,IAAA,CAAK;AAAA,aAWZ;AAAA,UAEJ,CAAC,CAAA;AAAA,UACA,aAAA,CAAc,WAAW,CAAA,oBACxB,GAAA,CAAC,OAAE,SAAA,EAAU,+DAAA,EACV,QAAA,EAAA,SAAA,CAAU,cAAc,CAAA,EAC3B;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAEO,IAAM,eAAA,GAAkB,KAAK,wBAAwB,CAAA;ACxH5D,IAAM,YAAA,GAA2C;AAAA,EAC/C,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,cAAA;AAAA,IACZ,IAAA,EAAM,gBAAA;AAAA,IACN,cAAA,EAAgB,sBAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,YAAA;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,cAAA,EAAgB,oBAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,eAAA;AAAA,IACZ,IAAA,EAAM,iBAAA;AAAA,IACN,cAAA,EAAgB,uBAAA;AAAA,IAChB,QAAA,EAAU;AAAA;AAEd,CAAA;AAGA,IAAM,mBAAA,GAAkC;AAAA,EACtC,UAAA,EAAY,eAAA;AAAA,EACZ,IAAA,EAAM,iBAAA;AAAA,EACN,cAAA,EAAgB,uBAAA;AAAA,EAChB,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,wBAAA,CAAyB;AAAA,EAChC,EAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAQ,EAAC;AAAA,EACT,SAAA;AAAA,EACA;AACF,CAAA,EAAc;AACZ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,YAAA,EAAa;AAElC,EAAA,MAAM,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,IAAI,aAAA,CAAc;AAAA,IAC/C,OAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,IAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,QAAA,EAAU,KAAA,KAClB,cAAA,KAAmB,UAAA,GAAa,MAAA,GAAS,MAAA,CAAA,KACzC,cAAA,KAAmB,WAAA,GAAc,OAAA,GAAU,MAAA,CAAA,KAC3C,cAAA,KAAmB,aAAa,MAAA,GAAS,MAAA,CAAA;AAE/C,EAAA,MAAM,UAAA,GAAa,KAAA,GAAS,YAAA,CAAa,KAAK,KAAK,mBAAA,GAAuB,MAAA;AAC1E,EAAA,MAAM,eAAe,QAAA,IAAY,SAAA;AAEjC,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAA4B;AACpD,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,QAAA,CAAS,CAAC,iBAAiB,YAAA,CAAa,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EAC1E,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA4B;AACrD,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,CAAC,QAAA,KAA+B;AAE7D,IAAA,MAAM,SAAA,GAAA,CAAa,UAAU,OAAA,IAAW,CAAA;AACxC,IAAA,MAAM,SAAA,GAAA,CAAa,UAAU,OAAA,IAAW,CAAA;AAExC,IAAA,QAAA,EAAU,YAAA,GAAe,IAAI,QAAA,EAAU,EAAE,GAAG,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA;AACrE,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC1B,CAAA;AAIA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,IAAS,UAAU,CAAA;AAC5C,EAAA,MAAM,kBAAA,GAAqB,WAAW,GAAA,GAAM,CAAA;AAC5C,EAAA,MAAM,qBAAqB,QAAA,GAAY,eAAA,GAAkB,GAAA,GAAM,GAAA,GAAQ,kBAAkB,GAAA,GAAM,GAAA;AAE/F,EAAA,uBACEC,KAAA,QAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,QAAA;AAAA,QACH,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,EAAA;AAAA,QACb,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,QACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACtC,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAQ,IAAA,EAAM,QAAA,EAAU,WAAsB,KAAA,EAAc,CAAA;AAAA,oBAEtED,KAAC,iBAAA,EAAA,EAEE,QAAA,EAAA;AAAA,MAAA,QAAA,IAAY,8BACXC,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA,6FAAA,EAAgG,UAAA,CAAW,UAAU,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAA,EAAI,UAAA,CAAW,cAAc,CAAA,CAAA,EAAI,UAAA,CAAW,QAAQ,CAAA,CAAA;AAAA,UACvM,KAAA,EAAO;AAAA,YACL,SAAA,EAAW,CAAA,gCAAA,EAAmC,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,GAAA;AAAA,WAClE;AAAA,UACA,aAAA,EAAa,cAAc,EAAE,CAAA,CAAA;AAAA,UAE5B,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,MAID,YAAA,IAAgB,CAAC,eAAA,oBAChBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,2PAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,SAAA,EAAW,CAAA,gCAAA,EAAmC,MAAM,CAAA,GAAA,EAAM,SAAS,kBAAkB,CAAA,GAAA;AAAA,WACvF;AAAA,UACA,OAAA,EAAS,iBAAA;AAAA,UACT,YAAA,EAAW,aAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAACC,UAAA,EAAA,EAAS,SAAA,EAAU,0CAAA,EAA2C;AAAA;AAAA,OACjE;AAAA,MAID,mCACCD,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,UAAU,EAAE,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAS,kBAAA,EAAmB;AAAA,UACtD,QAAA,EAAU,sBAAA;AAAA,UACV,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAK;AAAA;AAAA,OACzC;AAAA,MAID,gCACCA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,uPAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,SAAA,EAAW,CAAA,gCAAA,EAAmC,MAAM,CAAA,GAAA,EAAM,SAAS,kBAAkB,CAAA,GAAA;AAAA,WACvF;AAAA,UACA,OAAA,EAAS,gBAAA;AAAA,UACT,YAAA,EAAW,mBAAA;AAAA,UAEX,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,wCAAA,EAAyC;AAAA;AAAA;AAChE,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,IAAM,eAAA,GAAkBE,KAAK,wBAAwB,CAAA;AClLrD,SAAS,oBAAA,CAAqB;AAAA,EACnC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,CAAC,IAAI,CAAA,GAAIC,aAAAA,CAAc;AAAA,IAC3B,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS,KAAA;AAAA,IACT,cAAA,EAAgB,YAAA;AAAA,IAChB,OAAA,EAAS,GAAA;AAAA,IACT,OAAA,EAAS,GAAA;AAAA,IACT,cAAA,EAAgB;AAAA,GACjB,CAAA;AAED,EAAA,uBACEJ,KAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,IAAA;AAAA,QACH,IAAA,EAAK,MAAA;AAAA,QACL,MAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa,CAAA;AAAA,QACb,eAAA,EAAgB,KAAA;AAAA,QAChB,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,GAAA;AAAA,QACJ,EAAA,EAAI,GAAA;AAAA,QACJ,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAK,SAAA;AAAA,QACL,MAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAa;AAAA;AAAA;AACf,GAAA,EACF,CAAA;AAEJ;ACGA,IAAM,WAAA,GAAc,gBAAA;AAEb,IAAM,mBAAA,GAAsBE,IAAAA,CAAK,SAASE,oBAAAA,CAAoB;AAAA,EACnE,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,uBAAA;AAAA,EACA,eAAA;AAAA,EACA,uBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIN,QAAAA,CAAS,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAA,EAAK,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAaO,OAAO,KAAK,CAAA;AAC/B,EAAA,MAAM,aAAaA,MAAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACxC,EAAA,MAAM,MAAA,GAASA,OAAuB,IAAI,CAAA;AAE1C,EAAA,MAAM,iBAAA,GAAoBC,WAAAA,CAAY,CAAC,KAAA,KAA8B;AACnE,IAAA,IAAK,KAAA,CAAM,MAAA,CAAuB,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,UAAA,CAAW,OAAA,GAAU;AAAA,MACnB,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,QAAA,CAAS,CAAA;AAAA,MAC5B,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,QAAA,CAAS;AAAA,KAC9B;AACA,IAAA,MAAA,CAAO,OAAA,EAAS,iBAAA,CAAkB,KAAA,CAAM,SAAS,CAAA;AACjD,IAAA,KAAA,CAAM,cAAA,EAAe;AAAA,EACvB,GAAG,CAAC,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3B,EAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,KAAA,KAA8B;AACnE,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,CAAA;AAChD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,CAAA;AAChD,IAAA,WAAA,CAAY,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,WAAAA,CAAY,CAAC,KAAA,KAA8B;AACjE,IAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AACrB,IAAA,MAAA,CAAO,OAAA,EAAS,qBAAA,CAAsB,KAAA,CAAM,SAAS,CAAA;AAAA,EACvD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyB;AAC9C,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,gBAAA,EAAiB;AAAA,IAC/C,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,aAAA,EAAe,gBAAgB,CAAC,CAAA;AAEpC,EAAA,MAAM,eAAA,GAAkB,yJAAA;AACxB,EAAA,MAAM,qBAAA,GAAwB,kHAAA;AAC9B,EAAA,MAAM,uBAAA,GAA0B,8GAAA;AAChC,EAAA,MAAM,gBAAA,GAAmB,iDAAA;AAEzB,EAAA,uBACEP,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAe,iBAAA;AAAA,MACf,aAAA,EAAe,iBAAA;AAAA,MACf,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,CAAA,SAAA,EAAY,aAAA,GAAgB,SAAA,GAAY,OAAO,CAAA,YAAA,CAAA;AAAA,MAC1D,KAAA,EAAO;AAAA,QACL,MAAM,QAAA,CAAS,CAAA;AAAA,QACf,MAAA,EAAQ,SAAS,CAAA,GAAI,CAAA,GAAI,SAAY,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAAA,QACxD,GAAA,EAAK,QAAA,CAAS,CAAA,GAAI,CAAA,GAAI,SAAS,CAAA,GAAI,MAAA;AAAA,QACnC,MAAA,EAAQ,UAAA,CAAW,OAAA,GAAU,UAAA,GAAa;AAAA,OAC5C;AAAA,MAEA,QAAA,kBAAAD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,GAAG,WAAW,CAAA,kDAAA,CAAA;AAAA,UAGzB,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,oEAAA,EACb,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,oDAAA,EAAqD,CAAA,EAC5E,CAAA;AAAA,4BAGAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,SAAS,CAAA;AAAA,gBAC5C,KAAA,EAAO,UAAU,aAAa,CAAA;AAAA,gBAC9B,SAAA,EAAW,WAAA,KAAgB,SAAA,GAAY,qBAAA,GAAwB,uBAAA;AAAA,gBAE/D,QAAA,kBAAAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAC3C;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,MAAM,CAAA;AAAA,gBACzC,KAAA,EAAO,UAAU,UAAU,CAAA;AAAA,gBAC3B,SAAA,EAAW,WAAA,KAAgB,MAAA,GAAS,qBAAA,GAAwB,uBAAA;AAAA,gBAE5D,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aACtC;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gBAAA,EAAkB,CAAA;AAAA,4BAGlCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,OAAA,EAAS,MAAM,MAAA,EAAO,EAAG,KAAA,EAAM,SAAA,EAAU,WAAW,eAAA,EACxE,QAAA,kBAAAA,IAAC,uBAAA,EAAA,EAAwB,SAAA,EAAU,WAAU,CAAA,EAC/C,CAAA;AAAA,4BACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,OAAA,EAAS,MAAM,OAAA,EAAQ,EAAG,KAAA,EAAM,UAAA,EAAW,WAAW,eAAA,EAC1E,QAAA,kBAAAA,IAAC,wBAAA,EAAA,EAAyB,SAAA,EAAU,WAAU,CAAA,EAChD,CAAA;AAAA,4BACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,OAAA,EAAS,WAAW,KAAA,EAAO,SAAA,CAAU,SAAS,CAAA,EAAG,WAAW,eAAA,EAChF,QAAA,kBAAAA,IAAC,oBAAA,EAAA,EAAqB,SAAA,EAAU,WAAU,CAAA,EAC5C,CAAA;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gBAAA,EAAkB,CAAA;AAAA,4BAGlCA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAA;AAAA,gBACT,UAAU,CAAC,OAAA;AAAA,gBACX,KAAA,EAAO,UAAU,MAAM,CAAA;AAAA,gBACvB,SAAA,EAAW,GAAG,eAAe,CAAA,kDAAA,CAAA;AAAA,gBAE7B,QAAA,kBAAAA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAC1C;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAA;AAAA,gBACT,UAAU,CAAC,OAAA;AAAA,gBACX,KAAA,EAAO,UAAU,MAAM,CAAA;AAAA,gBACvB,SAAA,EAAW,GAAG,eAAe,CAAA,kDAAA,CAAA;AAAA,gBAE7B,QAAA,kBAAAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAC3C;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gBAAA,EAAkB,CAAA;AAAA,4BAGlCA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,eAAA;AAAA,gBACT,KAAA,EAAO,UAAU,eAAe,CAAA;AAAA,gBAChC,SAAA,EAAW,cAAc,qBAAA,GAAwB,uBAAA;AAAA,gBAEjD,QAAA,kBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aAC/B;AAAA,4BACAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,uBAAA;AAAA,gBACT,KAAA,EAAO,UAAU,uBAAuB,CAAA;AAAA,gBACxC,SAAA,EAAW,eAAA,KAAoB,SAAA,GAAY,qBAAA,GAAwB,uBAAA;AAAA,gBAEnE,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,aACtC;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gBAAA,EAAkB,CAAA;AAAA,4BAGlCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAS,MAAM;AACb,oBAAA,MAAM,KAAA,GAA2B,CAAC,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AACpD,oBAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA;AAClD,oBAAA,MAAM,aAAA,GAAgB,KAAA,CAAA,CAAO,YAAA,GAAe,CAAA,IAAK,MAAM,MAAM,CAAA;AAC7D,oBAAA,uBAAA,CAAwB,aAAa,CAAA;AAAA,kBACvC,CAAA;AAAA,kBACA,KAAA,EAAO,UAAU,YAAY,CAAA;AAAA,kBAC7B,SAAA,EAAW,eAAA,KAAoB,MAAA,GAAS,qBAAA,GAAwB,eAAA;AAAA,kBAEhE,QAAA,kBAAAA,GAAAA,CAACQ,mBAAAA,EAAA,EAAoB,WAAU,SAAA,EAAU;AAAA;AAAA,eAC3C;AAAA,cACC,oBAAoB,MAAA,oBACnBR,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sKACb,QAAA,EAAA,eAAA,EACH;AAAA,aAAA,EAEJ,CAAA;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gBAAA,EAAkB,CAAA;AAAA,4BAGlCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,iBAAA;AAAA,kBACT,KAAA,EAAO,UAAU,WAAW,CAAA;AAAA,kBAC5B,SAAA,EAAW,gBAAgB,qBAAA,GAAwB,uBAAA;AAAA,kBAEnD,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,eACvC;AAAA,cACC,aAAA,oBACCD,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAT,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,mCAAA;AAAA,oBACV,OAAA,EAAS,gBAAA;AAAA,oBACT,aAAA,EAAe,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,oBAChD,aAAA,EAAY;AAAA;AAAA,iBACd;AAAA,gCACAD,IAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,GAAG,WAAW,CAAA,oFAAA,CAAA;AAAA,oBACzB,OAAA,EAAS,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,oBAC1C,aAAA,EAAe,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,oBAEhD,QAAA,EAAA;AAAA,sCAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0FAAA,EACV,QAAA,EAAA,SAAA,CAAU,WAAW,CAAA,EACxB,CAAA;AAAA,sCACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,wBACC,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,SAAA,CAAU,aAAa,CAAA,EAAE;AAAA,wBAC7C,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,SAAA,CAAU,UAAU,CAAA,EAAE;AAAA,wBAC1C,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,MAAM,CAAA,EAAE;AAAA,wBACxC,EAAE,IAAA,EAAM,iBAAA,EAAS,KAAA,EAAO,SAAA,CAAU,MAAM,CAAA,EAAE;AAAA,wBAC1C,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,cAAc,CAAA,EAAE;AAAA,wBAChD,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,eAAe,CAAA,EAAE;AAAA,wBACjD,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,mBAAmB,CAAA,EAAE;AAAA,wBACrD,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,mBAAmB,CAAA,EAAE;AAAA,wBACrD,EAAE,IAAA,EAAM,iBAAA,EAAS,KAAA,EAAO,SAAA,CAAU,SAAS,CAAA,EAAE;AAAA,wBAC7C,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,iBAAiB,CAAA,EAAE;AAAA,wBACnD,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,gBAAgB,CAAA,EAAE;AAAA,wBAClD,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,iBAAiB,CAAA,EAAE;AAAA,wBACnD,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,iBAAiB,CAAA,EAAE;AAAA,wBACnD,EAAE,IAAA,EAAM,UAAA,EAAO,KAAA,EAAO,SAAA,CAAU,gBAAgB,CAAA,EAAE;AAAA,wBAClD,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,SAAA,CAAU,kBAAkB,CAAA,EAAE;AAAA,wBACpD,EAAE,IAAA,EAAM,QAAA,EAAK,KAAA,EAAO,SAAA,CAAU,gBAAgB,CAAA,EAAE;AAAA,wBAChD,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,SAAA,CAAU,YAAY,CAAA;AAAE,uBAC9C,CAAE,IAAI,CAAC,QAAA,qBACLD,IAAAA,CAAC,KAAA,EAAA,EAAwB,WAAU,mCAAA,EACjC,QAAA,EAAA;AAAA,wCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EACb,mBAAS,KAAA,EACZ,CAAA;AAAA,wCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,wBAC7BA,GAAAA;AAAA,0BAAC,KAAA;AAAA,0BAAA;AAAA,4BAEC,SAAA,EAAU,qOAAA;AAAA,4BAET,QAAA,EAAA;AAAA,2BAAA;AAAA,0BAHI;AAAA,yBAKR,CAAA,EACH;AAAA,uBAAA,EAAA,EAbQ,QAAA,CAAS,IAcnB,CACD,CAAA,EACH;AAAA;AAAA;AAAA;AACF,eAAA,EACF;AAAA,aAAA,EAEJ;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ,CAAC,CAAA;ACxRD,IAAM,oBAAA,GAAuB;AAAA,EAC3B;AAAA,IACE,QAAA,EAAU,2BAAA;AAAA,IACV,UAAA,EAAY,kEAAA;AAAA,IACZ,WAAA,EAAa,cAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,QAAA,EAAU,+BAAA;AAAA,IACV,UAAA,EAAY,0EAAA;AAAA,IACZ,WAAA,EAAa,gBAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,QAAA,EAAU,8BAAA;AAAA,IACV,UAAA,EAAY,sEAAA;AAAA,IACZ,WAAA,EAAa,eAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,QAAA,EAAU,8BAAA;AAAA,IACV,UAAA,EAAY,8EAAA;AAAA,IACZ,WAAA,EAAa,iBAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,QAAA,EAAU,0BAAA;AAAA,IACV,UAAA,EAAY,kEAAA;AAAA,IACZ,WAAA,EAAa,cAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,QAAA,EAAU,2BAAA;AAAA,IACV,UAAA,EAAY,kEAAA;AAAA,IACZ,WAAA,EAAa,cAAA;AAAA,IACb,YAAA,EAAc;AAAA;AAElB,CAAA;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,IAAA,GAAA,CAAQ,IAAA,IAAQ,CAAA,IAAK,IAAA,GAAO,KAAA,CAAM,WAAW,KAAK,CAAA;AAClD,IAAA,IAAA,IAAQ,CAAA;AAAA,EACV;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACtB;AAEA,SAAS,mBAAmB,SAAA,EAAuC;AACjE,EAAA,OAAA,CAAQ,SAAA,IAAa,QAAA,EAAU,IAAA,EAAK,CAAE,aAAY,IAAK,QAAA;AACzD;AAEA,SAAS,cAAc,SAAA,EAA+B;AACpD,EAAA,MAAM,UAAA,GAAa,mBAAmB,SAAS,CAAA;AAC/C,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,UAAU,CAAA,GAAI,oBAAA,CAAqB,MAAA;AAClE,EAAA,OAAO,qBAAqB,WAAW,CAAA;AACzC;AAEA,IAAM,eAAA,GAA+E;AAAA,EACnF,QAAA,EAAU,sBAAA;AAAA,EACV,KAAA,EAAO,SAAA;AAAA,EACP,WAAA,EAAa,eAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,SAAA,EAAW,0BAAA;AAAA,EACX,KAAA,EAAO,eAAA;AAAA,EACP,cAAA,EAAgB,kBAAA;AAAA,EAChB,iBAAA,EAAmB,kBAAA;AAAA,EACnB,YAAA,EAAc,YAAA;AAAA,EACd,eAAA,EAAiB,wBAAA;AAAA,EACjB,QAAA,EAAUU;AACZ,CAAA;AAEO,SAAS,cAAc,SAAA,EAA4E;AACxG,EAAA,MAAM,UAAA,GAAa,mBAAmB,SAAS,CAAA;AAC/C,EAAA,OAAO,eAAA,CAAgB,UAAU,CAAA,IAAKA,eAAAA;AACxC;AAEO,SAAS,kBAAkB,SAAA,EAAuC;AACvE,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,CAAE,QAAA;AAClC;AAEO,SAAS,oBAAoB,SAAA,EAAuC;AACzE,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,CAAE,UAAA;AAClC;AAEO,SAAS,qBAAqB,SAAA,EAAuC;AAC1E,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,CAAE,WAAA;AAClC;AAEO,SAAS,sBAAsB,SAAA,EAAuC;AAC3E,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,CAAE,YAAA;AAClC;;;ACvGO,SAAS,6BAA6B,QAAA,EAAoD;AAC/F,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,cAAA,EAAgB,EAAC,EAAE;AAAA,IAC7C,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,eAAA,EAAiB,EAAC,EAAE;AAAA,IAC5C,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,UAAA,EAAY,CAAC,EAAE,QAAA,EAAU,IAAI,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,EAAA,EAAI,CAAA;AAAA,QAC5D,eAAA,EAAiB;AAAA,OACnB;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,YAAA,EAAc,MAAM,EAAA,EAAG;AAAA,IAC1D,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACR,GAAA,EAAK,EAAA;AAAA,QACL,SAAS,EAAC;AAAA,QACV,IAAA,EAAM,EAAA;AAAA,QACN,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,oBAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,oBAAA,EAAsB,QAAA,EAAU,EAAA,EAAI,gBAAgB,EAAA,EAAG;AAAA,IACxE,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,gBAAA,EAAkB,EAAA,EAAI,eAAe,GAAA,EAAI;AAAA,IACvE,KAAK,gBAAA;AACH,MAAA,OAAO,EAAE,MAAM,gBAAA,EAAkB,QAAA,EAAU,IAAI,IAAA,EAAM,CAAA,EAAG,qBAAqB,GAAA,EAAI;AAAA,IACnF,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,gBAAgB,EAAA,EAAI,eAAA,EAAiB,EAAC,EAAE;AAAA,IACnE,KAAK,qBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,YAAA,EAAc,EAAA;AAAA,QACd,UAAA,EAAY;AAAA,UACV,EAAE,IAAI,MAAA,CAAO,UAAA,IAAc,IAAA,EAAM,EAAA,EAAI,aAAa,EAAA,EAAG;AAAA,UACrD,EAAE,IAAI,MAAA,CAAO,UAAA,IAAc,IAAA,EAAM,EAAA,EAAI,aAAa,EAAA;AAAG;AACvD,OACF;AAAA,IACF,KAAK,qBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,UAAA,EAAY,CAAC,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM;AAAA,OAC5E;AAAA,IACF,KAAK,mBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,mBAAA;AAAA,QACN,aAAa,CAAC,EAAE,QAAQ,EAAA,EAAI,MAAA,EAAQ,IAAI;AAAA,OAC1C;AAAA,IACF,KAAK,qBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,qBAAA;AAAA,QACN,gBAAgB,EAAC;AAAA,QACjB,cAAA,EAAgB,EAAA;AAAA,QAChB,eAAA,EAAiB;AAAA,OACnB;AAAA,IACF,KAAK,oBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,oBAAA;AAAA,QACN,cAAA,EAAgB,MAAA;AAAA,QAChB,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF,KAAK,eAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,eAAA;AAAA,QACN,SAAA,EAAW,QAAA;AAAA,QACX,aAAA,EAAe,EAAA;AAAA,QACf,cAAA,EAAgB,EAAA;AAAA,QAChB,SAAA,EAAW;AAAA,OACb;AAAA,IACF,KAAK,iBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,iBAAA;AAAA,QACN,gBAAA,EAAkB,EAAA;AAAA,QAClB,YAAA,EAAc,MAAA;AAAA,QACd,aAAA,EAAe;AAAA,OACjB;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,KAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACV;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,IAAA;AAAA,QACZ,KAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAQ,GAAA;AAAA,QACR,cAAA,EAAgB,GAAA;AAAA,QAChB,eAAA,EAAiB;AAAA,OACnB;AAAA,IACF;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;ACjGA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,mBAAA,GAAsB,EAAA;AAE5B,SAAS,YAAY,IAAA,EAA+C;AAClE,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAU,KAAA,IAAS,kBAAA;AAAA,IAC1B,MAAA,EAAQ,UAAU,MAAA,IAAU;AAAA,GAC9B;AACF;AAOO,SAAS,gBAAA,CACd,KAAA,EACA,KAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,qBAAA,GAAwB,EAAA;AAC9B,EAAA,MAAM,mBAAA,GAAsB,EAAA;AAG5B,EAAA,MAAM,cAAc,KAAA,CAAM,MAAA;AAAA,IACxB,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,QAAA,IAAY,KAAK,IAAA,KAAS;AAAA,GAC5C;AAGA,EAAA,MAAM,UAAA,GAAa,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,EAAE,QAAA,EAAU,MAAM,CAAA;AAC9D,EAAA,UAAA,CAAW,mBAAA,CAAoB,OAAO,EAAC,CAAE,CAAA;AAEzC,EAAA,MAAM,eAAe,SAAA,KAAc,IAAA;AACnC,EAAA,UAAA,CAAW,QAAA,CAAS;AAAA,IAClB,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,eAAe,mBAAA,GAAsB,qBAAA;AAAA,IAC9C,OAAA,EAAS,eAAe,qBAAA,GAAwB,mBAAA;AAAA,IAChD,OAAA,EAAS,EAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,WAAA,CAAY,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAEhE,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,YAAY,IAAI,CAAA;AAC1C,IAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,EAAA,EAAI,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC/C;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,aAAA,CAAc,IAAI,IAAA,CAAK,MAAM,KAAK,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AACpE,MAAA,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,OAAO,UAAU,CAAA;AAGvB,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsC;AAC9D,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,YAAY,IAAI,CAAA;AAC1C,IAAA,WAAA,CAAY,GAAA,CAAI,KAAK,EAAA,EAAI;AAAA,MACvB,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,MACzB,CAAA,EAAG,SAAA,CAAU,CAAA,GAAI,MAAA,GAAS;AAAA,KAC3B,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAC3C,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,WAAA,EAAY;AAAA,EAC1C,CAAC,CAAA;AACH;AC/EO,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAAuB;AAC/D,EAAA,uBACEV,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,KAAA,EAAM,SAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,cAAW,WAAA,EACvF,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,myFAAkyF,CAAA,EAC5yF,CAAA;AAEJ;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAuB;AAC5D,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,KAAA,EAAM,SAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,cAAW,QAAA,EACvF,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0oBAAyoB,CAAA,EACnpB,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAAuB;AAC/D,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,KAAA,EAAM,SAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,cAAW,WAAA,EACvF,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4KAA2K,CAAA,EACrL,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAAuB;AAC/D,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,SAAA,EAAsB,YAAA,EAAW,YAAA,EAEpE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAK,CAAA,EAAE,sGAAA,EAAuG,QAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,IAAA,EAAK,MAAA,EAAO,CAAA;AAAA,oBAC5JA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gCAAA,EAAiC,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,IAAA,EAAK,MAAA,EAAO,CAAA;AAAA,oBAC5GA,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,MAAA,EAAO,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,oBAChDA,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,MAAA,EAAO,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,oBAEjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAA,EAAmB,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA;AAAA,oBACzGA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,CAAA;AAAA,oBAC1GA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ;AAAA,GAAA,EAC/G,CAAA;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAAuB;AAC7D,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,eAAc,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,YAAA,EAAW,SAAA,EAC9E,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,saAAA,EAAua,SAAQ,KAAA,EAAM,CAAA;AAAA,oBAC7bA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gZAAA,EAAiZ;AAAA,GAAA,EAC3Z,CAAA;AAEJ;AAEO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAuB;AAC5D,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,YAAA,EAAW,UAC5E,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,88CAA68C,CAAA,EACv9C,CAAA;AAEJ;AAGO,IAAM,cAAA,GAKR;AAAA,EACH,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,8EAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,8DAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,kEAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,sEAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,0EAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,kEAAA;AAAA,IACZ,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,0EAAA;AAAA,IACZ,aAAA,EAAe,CAAC,EAAE,SAAA,uBAChBA,GAAAA,CAAC,SAAI,OAAA,EAAQ,WAAA,EAAY,MAAK,cAAA,EAAe,SAAA,EAAsB,cAAW,QAAA,EAC5E,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yHAAwH,CAAA,EAClI;AAAA;AAGN;AAGO,SAAS,iBAAiB,SAAA,EAA+B;AAC9D,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,cAAA,CAAe,MAAA;AACtC,EAAA,OAAO,cAAA,CAAe,SAA2B,CAAA,IAAK,cAAA,CAAe,MAAA;AACvE;AAUA,IAAM,2BAAA,GAAwE;AAAA,EAC5E,SAAA,EAAW,CAAC,WAAW,CAAA;AAAA,EACvB,YAAA,EAAc,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,EACpC,MAAA,EAAQ,CAAC,QAAQ,CAAA;AAAA,EACjB,OAAA,EAAS,KAAA;AAAA,EACT,SAAA,EAAW,KAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAGO,SAAS,8BAAA,CAA+B,SAAiB,SAAA,EAAoC;AAClG,EAAA,MAAM,OAAA,GAAU,4BAA4B,SAAS,CAAA;AACrD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,KAAA,EAAO,OAAO,IAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACrC,EAAA,OAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAClC;AAGO,SAAS,mBAAA,CAA8C,QAAa,SAAA,EAAgC;AACzG,EAAA,MAAM,OAAA,GAAU,4BAA4B,SAAS,CAAA;AACrD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,KAAA,EAAO,OAAO,MAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU;AAC9B,IAAA,MAAM,WAAW,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACtC,IAAA,OAAO,OAAA,CAAQ,SAAS,QAAQ,CAAA;AAAA,EAClC,CAAC,CAAA;AACH;AAGO,SAAS,4BAA4B,OAAA,EAAiC;AAC3E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACrC,EAAA,IAAI,QAAA,KAAa,aAAa,OAAO,WAAA;AACrC,EAAA,IAAI,QAAA,KAAa,UAAU,OAAO,YAAA;AAClC,EAAA,OAAO,WAAA;AACT;ACpIO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,WAAA;AAAA,EACR,YAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,SAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,EAAG,KAAK,CAAA,oEAAA,EAAuE,OAAA,GAAU,kBAAA,GAAqB,KAAK,CAAA,8CAAA,EAAiD,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,QAC/M,KAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,eAAA,EAAkB,KAAK,qCAAqC,OAAA,GAAU,kBAAA,GAAqB,KAAK,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAA,EAAU,QAAA,EAAU,YAAY,CAAC,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,SAAS,KAAK,EAAE,CAAA,CAAA;AAAA,MACpN,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACtEO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAU,SAAA,GAAY,IAAG,EAA6B;AAC1F,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,gEAAA,EAAmE,SAAS,IACzF,QAAA,EACH,CAAA;AAEJ;AAUO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV;AACF,CAAA,EAAyB;AACvB,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,aAAA,EAAgB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBACrCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC1E,CAAC,WAAW,WAAA,oBAAeA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAmD,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAC1G;AAAA,GAAA,EACF,CAAA;AAEJ;AAOO,SAAS,aAAA,CAAc,EAAE,OAAA,GAAU,KAAA,EAAO,UAAS,EAAuB;AAC/E,EAAA,IAAI,SAAS,OAAO,IAAA;AACpB,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAA0C,QAAA,EAAS,CAAA;AAC3E;AAOO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,SAAA,EAAU,EAAwB;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WACE,SAAA,IACG,kJAAA;AAAA,MAGJ;AAAA;AAAA,GACH;AAEJ;AChDO,SAAS,mBAAA,CAAoB;AAAA,EAClC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,SAAA,GAAY,0BAAA;AAAA,EACZ;AACF,CAAA,EAA6B;AAC3B,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,OAAA,EAAS,MAAM,MAAA,GAAS,MAAM,CAAA;AAAA,MAC9B,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,IAAI,MAAM,GAAA,KAAQ,OAAA,IAAW,MAAM,GAAA,KAAQ,GAAA,WAAc,MAAM,CAAA;AAAA,MACjE,CAAA;AAAA,MACA,SAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAOO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAS,EAAwB;AACtE,EAAA,uBACEA,IAAC,mBAAA,EAAA,EAAoB,SAAA,EAAW,qBAAqB,oBAAA,CAAqB,IAAI,CAAC,CAAA,CAAA,EAC5E,QAAA,EACH,CAAA;AAEJ;AAUO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,KAAA,EAAO,aAAa,OAAA,GAAU,KAAA,EAAO,eAAc,EAAwB;AAChH,EAAA,uBAAOA,GAAAA,CAAC,eAAA,EAAA,EAAgB,MAAY,KAAA,EAAc,WAAA,EAA0B,SAAkB,aAAA,EAA8B,CAAA;AAC9H;AAOO,SAAS,YAAA,CAAa,EAAE,OAAA,GAAU,KAAA,EAAO,UAAS,EAAsB;AAC7E,EAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAA,EAAmB,QAAA,EAAS,CAAA;AACpD;AASO,SAAS,cAAc,EAAE,QAAA,EAAU,WAAW,IAAA,EAAM,IAAA,GAAO,OAAM,EAAuB;AAC7F,EAAA,MAAM,SAAA,GAAY,OACd,IAAA,GACE,4BAAA,CAA6B,IAAI,CAAA,GACjC,uBAAA,CAAwB,IAAI,CAAA,GAC9B,EAAA;AAEJ,EAAA,uBAAOA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAW,SAAA,IAAa,CAAA,8DAAA,EAAiE,IAAA,GAAO,aAAA,GAAgB,eAAe,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAK,QAAA,EAAS,CAAA;AACnL;AAOO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA8B;AACpF,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,QAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,QAAA,QAAA,CAAS,MAAM,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,QAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC9C,UAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,UAAA,QAAA,CAAS,MAAM,CAAA;AAAA,QACjB;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAU,kIAAA;AAAA,MACV,YAAA,EAAW,QAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,4CAAA,EAA6C;AAAA;AAAA,GACpE;AAEJ;AAOO,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAU,SAAA,EAAU,EAA6B;AACrF,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAS,CAAA;AAC/C;ACpIA,IAAM,iBAAA,GAAoB,yDAAA;AAQ1B,SAAS,oBAAoB,QAAA,EAA8B;AACzD,EAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AACjE,EAAA,IAAI,eAAA,KAAoB,MAAM,OAAO,QAAA;AAGrC,EAAA,IAAI,QAAA,KAAa,QAAA,CAAS,IAAA,EAAM,OAAO,QAAA,CAAS,GAAA;AAChD,EAAA,IAAI,QAAA,KAAa,QAAA,CAAS,KAAA,EAAO,OAAO,QAAA,CAAS,MAAA;AACjD,EAAA,OAAO,QAAA;AACT;AAWO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAU,IAAI,UAAA,EAAY,SAAA,EAAW,OAAM,EAAwB;AACxG,EAAA,MAAM,gBAAA,GAAmB,oBAAoB,QAAQ,CAAA;AACrD,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,QAAA,EAAU,gBAAA;AAAA,MACV,EAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,UAAU,GAAG,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA;AAAA,GAClF;AAEJ;AAQO,SAAS,4BAAA,CAA6B,EAAE,KAAA,EAAO,QAAA,EAAU,YAAW,EAAsC;AAC/G,EAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AACjE,EAAA,MAAM,OAAO,eAAA,KAAoB,IAAA;AACjC,EAAA,MAAM,cAAA,GAAiB,IAAA,GAAO,QAAA,CAAS,GAAA,GAAM,QAAA,CAAS,IAAA;AAEtD,EAAA,uBACEA,GAAAA,CAAAS,QAAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,CAAC,CAAA,EAAG,0BACjCT,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,cAAA;AAAA,MACV,EAAA,EAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,MACxB,UAAA;AAAA,MACA,KAAA,EAAO,OACH,EAAE,IAAA,EAAM,IAAK,KAAA,GAAQ,CAAA,KAAM,QAAQ,CAAA,CAAA,GAAM,GAAG,KAAI,GAChD,EAAE,KAAK,CAAA,EAAA,CAAK,KAAA,GAAQ,MAAM,KAAA,GAAQ,CAAA,CAAA,GAAM,GAAG,CAAA,CAAA,CAAA;AAAI,KAAA;AAAA,IAP9C,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,GAU5B,CAAA,EACH,CAAA;AAEJ;AAWO,SAAS,sBAAA,CAAuB;AAAA,EACrC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AACjE,EAAA,MAAM,OAAO,eAAA,KAAoB,IAAA;AACjC,EAAA,MAAM,gBAAA,GAAmB,IAAA,GACpB,QAAA,KAAa,QAAA,CAAS,IAAA,GAAO,QAAA,CAAS,GAAA,GAAM,QAAA,KAAa,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,MAAA,GAAS,QAAA,GAC7F,QAAA;AAEJ,EAAA,uBACEA,GAAAA,CAAAS,QAAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,CAAC,CAAA,EAAG,0BACjCT,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MAEC,IAAA;AAAA,MACA,QAAA,EAAU,gBAAA;AAAA,MACV,EAAA,EAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,MACxB,UAAA;AAAA,MACA,KAAA,EAAO,OACH,EAAE,IAAA,EAAM,IAAK,KAAA,GAAQ,CAAA,KAAM,QAAQ,CAAA,CAAA,GAAM,GAAG,KAAI,GAChD,EAAE,KAAK,CAAA,EAAA,CAAK,KAAA,GAAQ,MAAM,KAAA,GAAQ,CAAA,CAAA,GAAM,GAAG,CAAA,CAAA,CAAA;AAAI,KAAA;AAAA,IAP9C,SAAS,KAAK,CAAA,IAAK,CAAA,EAAG,QAAQ,IAAI,KAAK,CAAA;AAAA,GAU/C,CAAA,EACH,CAAA;AAEJ;AClGA,SAAS,6BAAA,CAA8B,EAAE,MAAA,EAAO,EAA8B;AAC5E,EAAA,MAAM,aAAa,gBAAA,CAAiB,CAAC,UAAU,KAAA,CAAM,WAAA,CAAY,MAAM,CAAC,CAAA;AAExE,EAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AAExB,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAI,UAAA;AAE/B,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACZ,QAAA,EAAA;AAAA,IAAA,MAAA,KAAW,SAAA,oBACVC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uIAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EAAoD,CAAA,EACtE,CAAA;AAAA,IAGD,MAAA,KAAW,SAAA,oBACVA,GAAAA,CAAC,UAAK,SAAA,EAAU,uIAAA,EACd,QAAA,kBAAAD,IAAAA,CAAC,SAAI,SAAA,EAAU,oCAAA,EAAqC,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAC3E,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,YAAA,EAAa,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,CAAA;AAAA,sBAC5FA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAa,IAAA,EAAK,cAAA,EAAe,GAAE,iHAAA,EAAkH;AAAA,KAAA,EACvK,CAAA,EACF,CAAA;AAAA,IAGD,MAAA,KAAW,SAAA,oBACVA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gJAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,OAAA,EAAQ,aAAY,IAAA,EAAK,cAAA,EACnF,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,CAAA,EAAE,oHAAA,EAAqH,QAAA,EAAS,SAAA,EAAU,CAAA,EACrK,CAAA,EACF,CAAA;AAAA,IAGD,MAAA,KAAW,OAAA,oBACVA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wIAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,OAAA,EAAQ,aAAY,IAAA,EAAK,cAAA,EAC/E,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAS,SAAA,EAAU,CAAA,EAAE,oMAAA,EAAqM,QAAA,EAAS,SAAA,EAAU,CAAA,EACrP,CAAA,EACF,CAAA;AAAA,IAAA,CAIA,MAAA,KAAW,aAAa,MAAA,KAAW,OAAA,KAAY,eAAe,MAAA,oBAC9DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2HAAA,EACb,uBAAa,GAAA,GAAO,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA,GAAO,CAAA,EAAA,CAAI,aAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EAC5E;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,IAAM,oBAAA,GAAuBE,KAAK,6BAA6B,CAAA;ACvD/D,IAAM,aAAA,GAAgBA,KAAK,SAASS,cAAAA,CAAc,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA4D;AACxI,EAAA,MAAM,CAAA,GAAIC,gBAAgB,QAAQ,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAGvC,EAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM;AACrB,IAAA,MAAM,aAAc,IAAA,CAA4B,KAAA;AAChD,IAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,sBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gCAAA,EAAiC,CAAA;AAAA,sBAChHb,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,GAAA,EAAK,EAAA,EAAG,QAAA,EAAS,UAAA,EAAW,gCAAA,EAAiC,CAAA;AAAA,sBAC9Gb,IAAC,QAAA,EAAA,EAAS,OAAA,EAAQ,SAAQ,QAAA,EAAS,OAAA,EAAQ,KAAA,EAAM,WAAA,EAC/C,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,IAAA,kBAAMA,GAAAA,CAAC,uBAAA,EAAA,EAAwB,WAAU,oBAAA,EAAqB,CAAA;AAAA,UAC9D,OAAO,UAAA,IAAc,OAAA;AAAA,UACrB,WAAA,EAAa,EAAE,eAAe,CAAA;AAAA,UAC9B,aAAA,EAAc;AAAA;AAAA,OAChB,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,cAAA,EAAe,CAAA;AAAA,sBACjGb,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAG,YAAA,EAAa,UAAA,EAAW,cAAA,EAAe;AAAA,KAAA,EACrG,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,IAAM,KAAK,KAAA,CAAM,OAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAkB,IAAA,CAAK,KAAA,CAAkC,SAA+B,CAAA;AAC9G,EAAA,uBACEd,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAElCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gCAAA,EAAiC,CAAA;AAAA,oBAChHb,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,GAAA,EAAK,EAAA,EAAG,QAAA,EAAS,UAAA,EAAW,gCAAA,EAAiC,CAAA;AAAA,oBAE9Gb,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG,WAAU,kBAAA,EACrE,QAAA,kBAAAD,KAAC,QAAA,EAAA,EAAS,OAAA,EAAS,WAAW,QAAA,EAAoB,QAAA,EAAS,OAAA,EAAQ,KAAA,EAAM,WAAA,EACvE,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,CAAM,MAAA,mBACVC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAkB,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,WAAU,uGAAA,EAAwG,CAAA,mBAE/KA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yIAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,8CAAA,EAA+C,CAAA,EACxE,CAAA;AAAA,0BAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0IAAA,EACb,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,wBAAA,EAAyB,CAAA,EAClD;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8DAAA,EAAgE,QAAA,EAAA,IAAA,CAAK,MAAM,IAAA,EAAK,CAAA;AAAA,UAC7F,CAAC,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAAA,SAAA,EACnG;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,IAAC,YAAA,EAAA,EAAa,OAAA,EAAS,WACrB,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,6HAAA,EAA8H,QAAA,EAAA,OAAA,EAEvJ,CAAA;AAAA,wBACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,WAAW,CAAA,gFAAA,EAAmF,aAAA,CAAc,UAAU,CAAA,CAAA,EACnI,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,aAAA,CAAc,aAAA,EAAd,EAA4B,WAAU,SAAA,EAAU,CAAA;AAAA,UAChD,aAAA,CAAc;AAAA,SAAA,EACjB,CAAA;AAAA,wBACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAU,kHAAA,EACtB,QAAA,EAAA,IAAA,CAAK,MAAM,OAAA,EACd,CAAA;AAAA,wBACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,gHAAA,EAAiH,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UACpI,KAAK,KAAA,CAAM;AAAA,SAAA,EACjB,CAAA;AAAA,wBACAA,IAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,gHAAA,EAAiH,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UACtI,KAAK,KAAA,CAAM;AAAA,SAAA,EACf,CAAA;AAAA,QAEC,IAAA,CAAK,sCACJC,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAA;AAAA,YACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,cAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,IAAA,CAAK,mBAAoB,EAAE,CAAA;AAAA,YAC7B,CAAA;AAAA,YACA,SAAA,EAAU,0IAAA;AAAA,YACV,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,YAEhC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE,OAAA,EAEJ,CAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,cAAA,EAAe,CAAA;AAAA,oBACjGb,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAG,YAAA,EAAa,UAAA,EAAW,cAAA,EAAe,CAAA;AAAA,oBACnGb,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,UAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,UAAA,EAAW,OAAO,EAAE,GAAA,EAAK,KAAA,EAAM,EAAG,YAAW,gBAAA,EAAiB;AAAA,GAAA,EAC3H,CAAA;AAEJ,CAAC;ACrGM,IAAM,YAAA,GAAeX,KAAK,SAASa,aAAAA,CAAa,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA2D;AACrI,EAAA,MAAM,CAAA,GAAIH,gBAAgB,aAAa,CAAA;AACvC,EAAA,MAAM,EAAE,IAAA,EAAM,kBAAA,EAAmB,GAAI,IAAA;AACrC,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAGvC,EAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,IAAA,MAAM,YAAa,IAAA,CAA4B,KAAA;AAC/C,IAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,sBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,cAAA,EAAe,CAAA;AAAA,sBAC9Fd,IAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAQ,OAAA,EAAQ,UAAS,MAAA,EACjC,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,sBAAMA,GAAAA,CAACgB,uBAAAA,EAAA,EAAwB,WAAU,oBAAA,EAAqB,CAAA;AAAA,YAC9D,KAAA,EAAO,SAAA,IAAa,CAAA,CAAE,UAAU,CAAA;AAAA,YAChC,WAAA,EAAa,EAAE,cAAc,CAAA;AAAA,YAC7B,aAAA,EAAc;AAAA;AAAA,SAChB;AAAA,QACC,sCACChB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAA;AAAA,YACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,cAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,YACvB,CAAA;AAAA,YACA,SAAA,EAAU,mFAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA,SACpE,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,cAAA,EAAe;AAAA,KAAA,EACnG,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,IAAA;AAC7B,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,IAAKI,qBAAAA;AACnD,EAAA,MAAM,WAAA,GAAe,KAAK,QAAA,IAAY,UAAA;AACtC,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,IAAS,eAAA,CAAgB,WAAW,KAAK,eAAA,CAAgB,QAAA;AAC/E,EAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,WAAW,CAAA,IAAK,oBAAA,CAAqB,QAAA;AAE/E,EAAA,uBACElB,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAElCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gCAAA,EAAiC,CAAA;AAAA,oBAEhHb,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,MAAA,GAAS,IAAI,CAAA;AAAA,QAC5B,SAAA,EAAU,kBAAA;AAAA,QAEV,0BAAAD,IAAAA,CAAC,QAAA,EAAA,EAAS,SAAS,SAAA,EAAW,QAAA,EAAoB,UAAS,MAAA,EACzD,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wEAAA,EAA2E,QAAQ,CAAA,UAAA,CAAA,EACjG,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAChD,CAAA;AAAA,8BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,eAAK,IAAA,EAAK,CAAA;AAAA,gBAC9E,CAAC,SAAA,oBAAaA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DAAA,EAAgE,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA,EAAE;AAAA,eAAA,EAC7H;AAAA,aAAA,EACF,CAAA;AAAA,YAEC,4BACCA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,gBAAc,IAAA,CAAK,OAAA;AAAA,gBACnB,YAAA,EAAY,IAAA,CAAK,OAAA,GAAU,SAAA,GAAY,UAAA;AAAA,gBACvC,SAAA,EAAW,CAAA,yNAAA,EACT,IAAA,CAAK,OAAA,GAAU,mBAAmB,sCACpC,CAAA,CAAA;AAAA,gBACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,kBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,kBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,kBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,gBACf,CAAA;AAAA,gBAEA,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,2GACf,IAAA,CAAK,OAAA,GACD,qFAAA,GACA,eACN,CAAA,CAAA,EAAI;AAAA;AAAA;AACN,WAAA,EAEJ,CAAA;AAAA,0BAEAD,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,SAAA,EAAU,8IAAA,EACtB,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EACf,CAAA;AAAA,8BACAA,IAAC,aAAA,EAAA,EAAc,SAAA,EAAW,6EAA6E,YAAY,CAAA,CAAA,EAChH,eAAK,QAAA,EACR,CAAA;AAAA,8BACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA;AAAA,gBAAA,MAAA,CAAO,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,gBAAE;AAAA,eAAA,EAAE;AAAA,aAAA,EACjG,CAAA;AAAA,YAEC,sCACCC,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,CAAA;AAAA,gBACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,kBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,kBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,kBAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,gBACvB,CAAA;AAAA,gBACA,SAAA,EAAU,kIAAA;AAAA,gBACV,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,gBAEhC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA;AAAA,KACF;AAAA,oBAGAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,cAAA,EAAe;AAAA,GAAA,EACnG,CAAA;AAEJ,CAAC;AC/HM,IAAM,YAAA,GAAeX,KAAK,SAASgB,aAAAA,CAAa,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA2D;AACrI,EAAA,MAAM,CAAA,GAAIN,gBAAgB,aAAa,CAAA;AACvC,EAAA,MAAM,EAAE,IAAA,EAAM,kBAAA,EAAmB,GAAI,IAAA;AACrC,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAGvC,EAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,IAAA,MAAM,aAAc,IAAA,CAAqC,MAAA;AACzD,IAAA,MAAM,YAAa,IAAA,CAA4B,KAAA;AAG/C,IAAA,IAAI,UAAA,EAAY,SAAS,MAAA,EAAQ;AAC/B,MAAA,MAAM,oBAAA,GAAuB,WAAW,gBAAA,GAAmB,MAAA,CAAO,KAAK,UAAA,CAAW,gBAAgB,EAAE,MAAA,GAAS,CAAA;AAC7G,MAAA,MAAM,cAAe,IAAA,CAA+C,MAAA;AAEpE,MAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,wBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gBAAA,EAAiB,CAAA;AAAA,wBAEhGb,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,WAAA,GAAc,EAAE,CAAA;AAAA,YAC/B,SAAA,EAAU,kBAAA;AAAA,YAEV,0BAAAD,IAAAA,CAAC,QAAA,EAAA,EAAS,SAAS,SAAA,EAAW,QAAA,EAAoB,UAAS,MAAA,EACzD,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,iHAAA,EACb,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC5C,CAAA;AAAA,gCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uDACX,QAAA,EAAA,SAAA,IAAa,CAAA,CAAE,YAAY,CAAA,EAC9B,CAAA;AAAA,kCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iDAAA,EAAmD,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAAE;AAAA,iBAAA,EAC7F;AAAA,eAAA,EACF,CAAA;AAAA,cAEC,CAAC,SAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACf,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sJAAA,EACb,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EACjB,CAAA;AAAA,kBACC,uBAAuB,CAAA,oBACtBD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,oBAAA,oBAAA;AAAA,oBAAqB;AAAA,mBAAA,EACxB,CAAA;AAAA,kBAED,WAAW,cAAA,oBACVA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EAA+C,QAAA,EAAA;AAAA,oBAAA,SAAA;AAAA,oBAC1D,UAAA,CAAW;AAAA,mBAAA,EAChB;AAAA,iBAAA,EAEJ,CAAA;AAAA,gBAEC,sCACCC,GAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,QAAA,EAAU,CAAA;AAAA,oBACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,sBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,sBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,sBAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,oBACvB,CAAA;AAAA,oBACA,SAAA,EAAU,kIAAA;AAAA,oBACV,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,oBAEhC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE,eAAA,EAEF;AAAA,aAAA,EAEJ;AAAA;AAAA,SACF;AAAA,wBAEAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,gBAAA,EAAiB;AAAA,OAAA,EACrG,CAAA;AAAA,IAEJ;AAGA,IAAA,uBACEd,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,sBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gBAAA,EAAiB,CAAA;AAAA,sBAChGb,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAS,MAAA,EACjC,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gHAAA,EACb,QAAA,kBAAAA,IAACgB,uBAAAA,EAAA,EAAwB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC1D,CAAA;AAAA,wBACAjB,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uDACX,QAAA,EAAA,SAAA,IAAa,CAAA,CAAE,UAAU,CAAA,EAC5B,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mDAAA,EAAqD,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EAAE;AAAA,SAAA,EACtF;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,gBAAA,EAAiB;AAAA,KAAA,EACrG,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,SAAU,IAAA,CAAgD,MAAA;AAChE,EAAA,MAAM,WAAY,IAAA,CAAkD,QAAA;AAEpE,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,EAAQ,cAAA,IAAkB,YAAY,CAAA;AACpE,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,EAAQ,eAAA,IAAmB,CAAC,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,cAAc,CAAA,IAAK,mBAAA,CAAoB,UAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,cAAc,CAAA,IAAK,eAAA,CAAgB,UAAA;AAEpE,EAAA,MAAM,iBAAA,GAAoB,mBAAmB,YAAA,GACzC,CAAA,EAAG,kBAAkB,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,eAAe,MACnD,cAAA,KAAmB,OAAA,GACjB,GAAG,eAAA,GAAkB,CAAA,GAAI,MAAM,EAAE,CAAA,EAAG,eAAe,CAAA,CAAA,GACnD,SAAA;AAEN,EAAA,uBACEd,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAElCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gBAAA,EAAiB,CAAA;AAAA,oBAEhGb,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,MAAA,GAAS,IAAI,CAAA;AAAA,QAC5B,SAAA,EAAU,kBAAA;AAAA,QAEV,0BAAAD,IAAAA,CAAC,QAAA,EAAA,EAAS,SAAS,SAAA,EAAW,QAAA,EAAoB,UAAS,MAAA,EACzD,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wEAAA,EAA2E,QAAQ,CAAA,UAAA,CAAA,EACjG,QAAA,kBAAAA,GAAAA,CAAC,yBAAA,EAAA,EAA0B,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC5D,CAAA;AAAA,8BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,eAAK,IAAA,EAAK,CAAA;AAAA,gCAC/EA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+DAA+D,QAAA,EAAA,iBAAA,EAAkB;AAAA,eAAA,EAChG;AAAA,aAAA,EACF,CAAA;AAAA,YAEC,4BACCA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,gBAAc,IAAA,CAAK,OAAA;AAAA,gBACnB,YAAA,EAAY,IAAA,CAAK,OAAA,GAAU,SAAA,GAAY,UAAA;AAAA,gBACvC,SAAA,EAAW,CAAA,yNAAA,EACT,IAAA,CAAK,OAAA,GAAU,mBAAmB,sCACpC,CAAA,CAAA;AAAA,gBACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,kBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,kBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,kBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,gBACf,CAAA;AAAA,gBAEA,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,2GACf,IAAA,CAAK,OAAA,GACD,qFAAA,GACA,eACN,CAAA,CAAA,EAAI;AAAA;AAAA;AACN,WAAA,EAEJ,CAAA;AAAA,UAEC,CAAC,SAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACf,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sJAAA,EACb,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EACf,CAAA;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,0EAAA,EAA6E,QAAQ,IACnG,QAAA,EAAA,cAAA,EACH,CAAA;AAAA,8BACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EAA+C,QAAA,EAAA;AAAA,gBAAA,GAAA;AAAA,gBAAE,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE;AAAA,eAAA,EAAE,CAAA;AAAA,cAC5F,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,SAAS,CAAA,oBAC7EA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,UAAU,SAAA,CAAU,MAAA;AAAA,gBAAO;AAAA,eAAA,EACnC;AAAA,aAAA,EAEJ,CAAA;AAAA,YAEC,sCACCC,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,CAAA;AAAA,gBACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,kBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,kBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,kBAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,gBACvB,CAAA;AAAA,gBACA,SAAA,EAAU,kIAAA;AAAA,gBACV,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,gBAEhC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE,WAAA,EAEF;AAAA,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,oBAGAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,gBAAA,EAAiB;AAAA,GAAA,EACrG,CAAA;AAEJ,CAAC;AC/MM,IAAM,cAAA,GAAiBX,KAAK,SAASiB,eAAAA,CAAe,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA6D;AAC3I,EAAA,MAAM,CAAA,GAAIP,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,oBAAmB,GAAI,IAAA;AACtD,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAGvC,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AACvC,IAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,sBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,cAAA,EAAe,CAAA;AAAA,sBAC9Fb,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAQ,OAAA,EAAQ,QAAA,EAAS,UACjC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,sBAAMA,GAAAA,CAACgB,uBAAAA,EAAA,EAAwB,WAAU,oBAAA,EAAqB,CAAA;AAAA,UAC9D,KAAA,EAAO,KAAA,IAAS,CAAA,CAAE,gBAAgB,CAAA;AAAA,UAClC,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,UACpC,aAAA,EAAc;AAAA;AAAA,OAChB,EACF,CAAA;AAAA,sBACAhB,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,cAAA,EAAe;AAAA,KAAA,EACnG,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,cAAA,IAAkB,IAAA,CAAK,MAAA,EAAQ,EAAA;AACxD,EAAA,MAAM,aAAa,MAAA,CAAO,cAAA,EAAgB,UAAU,IAAA,CAAK,MAAA,EAAQ,OAAO,MAAA,IAAU,CAAA;AAClF,EAAA,MAAM,WAAA,GAAc,OAAO,eAAA,GAAkB,MAAA,CAAO,KAAK,MAAA,CAAO,eAAe,EAAE,MAAA,GAAS,CAAA;AAC1F,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,SAAS,CAAA,IAAKH,eAAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,kBAAkB,SAAS,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,oBAAoB,SAAS,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,qBAAqB,SAAS,CAAA;AAElD,EAAA,uBACEX,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAY,WAAA,EAAa,CAAA;AAAA,oBAE7Fb,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,MAAA,GAAS,EAAE,CAAA;AAAA,QAC1B,SAAA,EAAU,kBAAA;AAAA,QAEV,0BAAAD,IAAAA,CAAC,QAAA,EAAA,EAAS,SAAS,SAAA,EAAW,QAAA,EAAoB,UAAS,QAAA,EACzD,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wEAAA,EAA2E,QAAQ,CAAA,UAAA,CAAA,EACjG,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC7C,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,cAC1E,CAAC,SAAA,oBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDAAA,EAAmD,QAAA,EAAA,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,MAAA,CAAO,cAAA,EAAe;AAAA,aAAA,EAEhH;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAD,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,iBAAc,SAAA,EAAW,CAAA,4EAAA,EAA+E,UAAU,CAAA,CAAA,EAChH,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EACrB,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAW,CAAA,0EAAA,EAA6E,UAAU,CAAA,CAAA,EAC9G,QAAA,EAAA;AAAA,gBAAA,UAAA;AAAA,gBAAW,GAAA;AAAA,gBAAE,EAAE,cAAc;AAAA,eAAA,EAChC,CAAA;AAAA,cACC,MAAA,CAAO,KAAA,GAAQ,CAAA,oBACdC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA,CAAA,CAAE,eAAe,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA,EAC3C,CAAA;AAAA,cAED,cAAc,CAAA,oBACbD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,gBAAA,WAAA;AAAA,gBAAY,GAAA;AAAA,gBAAE,EAAE,eAAe;AAAA,eAAA,EAClC;AAAA,aAAA,EAEJ,CAAA;AAAA,YAEC,sCACCC,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,CAAA;AAAA,gBACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,kBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,kBAAA,KAAA,CAAM,cAAA,EAAe;AACrB,kBAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,gBACvB,CAAA;AAAA,gBACA,SAAA,EAAU,kIAAA;AAAA,gBACV,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,gBAEhC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA;AAAA,KACF;AAAA,oBAEAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAY,WAAA,EAAa;AAAA,GAAA,EAClG,CAAA;AAEJ,CAAC;ACnGM,IAAM,aAAA,GAAgBX,KAAK,SAASkB,cAAAA,CAAc,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA4D;AACxI,EAAA,MAAM,CAAA,GAAIR,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,cAAA,EAAgB,MAAA,IAAU,CAAA;AAExD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCD,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,OAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,OAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACqB,QAAAA,EAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC3C,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,sBAAsB,CAAA;AAAA,cACrC,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAtB,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,OAAA,EACjB,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAChB,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,OAAA,EAAQ,MAAI,IAAA,EAC7B,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,gBAAgB,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EAC1B;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,eAAA,EAAgB;AAAA,GAAA,EACpG,CAAA;AAEJ,CAAC;AC7CM,IAAM,WAAA,GAAcX,KAAK,SAASoB,YAAAA,CAAY,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA0D;AAClI,EAAA,MAAM,CAAA,GAAIV,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,eAAA,EAAiB,MAAA,IAAU,CAAA;AAEzD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,aAAA,EAAc,CAAA;AAAA,oBAE7Fd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,KAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACuB,QAAAA,EAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC3C,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,oBAAoB,CAAA;AAAA,cACnC,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAxB,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,KAAA,EACjB,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EACd,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,KAAA,EAAM,MAAI,IAAA,EAC3B,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,iBAAiB,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EAC3B;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAC;AC7CM,IAAM,cAAA,GAAiBE,KAAK,SAASsB,eAAAA,CAAe,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA6D;AAC3I,EAAA,MAAM,CAAA,GAAIZ,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,UAAA,EAAY,MAAA,IAAU,CAAA;AAErD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,eAAA,EAAgB,CAAA;AAAA,oBAE/Fd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,SAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,SAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACyB,qBAAAA,EAAA,EAAsB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EACxD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,uBAAuB,CAAA;AAAA,cACtC,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEA1B,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,SAAA,EACjB,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EACjB,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,SAAA,EAAU,MAAI,IAAA,EAC/B,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,YAAY,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EACtB,CAAA;AAAA,8BACAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDACb,QAAA,EAAA,MAAA,CAAO,eAAA,CAAgB,aAAY,EACtC;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD,CAAA;AAAA,0BAEAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,WAAU,mMAAA,EAC5B,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB,CAAA;AAAA,0BACAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,WAAU,mMAAA,EAC5B,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EACtB;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,UAAA,EAAW,UAAA,EAAW,eAAA,EAAgB,CAAA;AAAA,oBACjGb,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,aAAA,EAAc;AAAA,GAAA,EACnG,CAAA;AAEJ,CAAC;ACzDM,IAAM,YAAA,GAAeX,KAAK,SAASwB,aAAAA,CAAa,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA2D;AACrI,EAAA,MAAM,CAAA,GAAId,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,WAAA,GAAc,OAAO,IAAA,GAAO,MAAA,CAAO,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAE7D,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,cAAA,EAAe,CAAA;AAAA,oBAE9Fd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,MAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,MAAA,EACnB,QAAA,kBAAAA,GAAAA,CAAC2B,eAAAA,EAAA,EAAgB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAClD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,cACpC,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEA5B,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,MAAA,EACjB,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EACf,CAAA;AAAA,8BACAA,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,QAAO,IAAA,EAAI,IAAA,EAC5B,iBAAO,QAAA,EACV,CAAA;AAAA,cACC,WAAA,oBACCD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uDAAA,EACb,QAAA,EAAA;AAAA,gBAAA,WAAA;AAAA,gBAAY;AAAA,eAAA,EACf;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,cAAA,EAAe;AAAA,GAAA,EACnG,CAAA;AAEJ,CAAC;ACnDM,IAAM,mBAAA,GAAsBX,KAAK,SAAS0B,oBAAAA,CAAoB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAkE;AAC1J,EAAA,MAAM,CAAA,GAAIhB,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,UAAA,GAAa,OAAO,GAAA,GAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAE1D,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gBAAA,EAAiB,CAAA;AAAA,oBAEhGd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,cAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,cAAA,EACnB,QAAA,kBAAAA,GAAAA,CAAC6B,YAAAA,EAAA,EAAa,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC/C,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,4BAA4B,CAAA;AAAA,cAC3C,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEA9B,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,cAAA,EACjB,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EACtB,CAAA;AAAA,8BACAA,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,gBAAe,IAAA,EAAI,IAAA,EACpC,iBAAO,MAAA,EACV,CAAA;AAAA,cACC,8BACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDACb,QAAA,EAAA,UAAA,EACH;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,gBAAA,EAAiB;AAAA,GAAA,EACrG,CAAA;AAEJ,CAAC;ACnDM,IAAM,yBAAA,GAA4BX,KAAK,SAAS4B,0BAAAA,CAA0B,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAwE;AAC5K,EAAA,MAAM,CAAA,GAAIlB,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAEvC,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,cAAA,EAAe,CAAA;AAAA,oBAE9Fd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,oBAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,oBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAAC+B,gBAAAA,EAAA,EAAiB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EACnD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,kCAAkC,CAAA;AAAA,cACjD,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAhC,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,oBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B,CAAA;AAAA,cACC,MAAA,CAAO,cAAA,oBACNA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAK,oBAAA,EAAqB,IAAA,EAAI,IAAA,EAC1C,QAAA,EAAA,MAAA,CAAO,cAAA,EACV;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,cAAA,EAAe;AAAA,GAAA,EACnG,CAAA;AAEJ,CAAC;AC/CM,IAAM,iBAAA,GAAoBX,KAAK,SAAS8B,kBAAAA,CAAkB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAgE;AACpJ,EAAA,MAAM,CAAA,GAAIpB,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAEvC,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,gBAAA,EAAiB,CAAA;AAAA,oBAEhGd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,WAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,WAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACiC,aAAAA,EAAA,EAAc,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAChD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,0BAA0B,CAAA;AAAA,cACzC,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAlC,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,WAAA,EACjB,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,WAAA,EAAY,MAAI,IAAA,EACjC,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,eAAe,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG,QAAQ,aAAA,IAAiB;AAAA,eAAA,EAClD,CAAA;AAAA,cACC,MAAA,EAAQ,oCACPC,GAAAA,CAAC,UAAK,SAAA,EAAU,8CAAA,EACb,iBAAO,gBAAA,EACV;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,gBAAA,EAAiB,CAAA;AAAA,oBACnGb,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,MAAA,EAAQ,EAAA,EAAG,UAAA,EAAW,UAAA,EAAW,gBAAA,EAAiB;AAAA,GAAA,EACrG,CAAA;AAEJ,CAAC;ACnDM,IAAM,qBAAA,GAAwBX,KAAK,SAASgC,sBAAAA,CAAsB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAoE;AAChK,EAAA,MAAM,CAAA,GAAItB,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAEvC,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,iBAAA,EAAkB,CAAA;AAAA,oBAEjGd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,gBAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,gBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACmC,YAAAA,EAAA,EAAa,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC/C,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,8BAA8B,CAAA;AAAA,cAC7C,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEApC,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,gBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EACxB,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,gBAAA,EAAiB,MAAI,IAAA,EACtC,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,MAAM,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG,MAAA,CAAO;AAAA,eAAA,EACvB,CAAA;AAAA,8BACAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,YAAY,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG,MAAA,CAAO;AAAA,eAAA,EAC7B;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,iBAAA,EAAkB;AAAA,GAAA,EACtG,CAAA;AAEJ,CAAC;AC/CM,IAAM,cAAA,GAAiBX,KAAK,SAASkC,eAAAA,CAAe,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA6D;AAC3I,EAAA,MAAM,CAAA,GAAIxB,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,eAAA,EAAiB,MAAA,IAAU,CAAA;AAEzD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAY,wBAAA,CAAyB,MAAA,EAAQ,CAAA;AAAA,oBAEjHd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,QAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACqC,uBAAAA,EAAA,EAAwB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC1D,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,uBAAuB,CAAA;AAAA,cACtC,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAtC,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,QAAA,EACjB,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EACjB,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,QAAA,EAAS,MAAI,IAAA,EAC9B,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,WAAW,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EACrB;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAC;AC7CM,IAAM,0BAAA,GAA6BE,KAAK,SAASoC,2BAAAA,CAA2B,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAyE;AAC/K,EAAA,MAAM,CAAA,GAAI1B,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,UAAA,EAAY,MAAA,IAAU,CAAA;AAEpD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAY,wBAAA,CAAyB,mBAAA,EAAqB,CAAA;AAAA,oBAE9Hd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,qBAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,qBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACuC,sBAAAA,EAAA,EAAuB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EACzD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,mCAAmC,CAAA;AAAA,cAClD,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAxC,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,qBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,qBAAA,EAAsB,MAAI,IAAA,EAC3C,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,YAAY,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EACtB;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAGAA,GAAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAS,UAAA;AAAA,QACT,IAAA,EAAK,QAAA;AAAA,QACL,UAAUa,QAAAA,CAAS,KAAA;AAAA,QACnB,YAAY,wBAAA,CAAyB,mBAAA;AAAA,QACrC,MAAA,EAAA,CAAS,QAAQ,UAAA,IAAc,IAAI,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,EAAE;AAAA;AAAA;AAClE,GAAA,EACF,CAAA;AAEJ,CAAC;ACvDM,IAAM,0BAAA,GAA6BX,KAAK,SAASsC,2BAAAA,CAA2B,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAyE;AAC/K,EAAA,MAAM,CAAA,GAAI5B,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,UAAA,EAAY,MAAA,IAAU,CAAA;AAErD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAY,wBAAA,CAAyB,mBAAA,EAAqB,CAAA;AAAA,oBAE9Hd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,qBAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,qBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACyC,uBAAAA,EAAA,EAAwB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC1D,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,mCAAmC,CAAA;AAAA,cAClD,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEA1C,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,qBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,qBAAA,EAAsB,MAAI,IAAA,EAC3C,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,YAAY,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EACtB;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAY,wBAAA,CAAyB,mBAAA,EAAqB;AAAA,GAAA,EACnI,CAAA;AAEJ,CAAC;AC/CM,IAAM,wBAAA,GAA2BX,KAAK,SAASwC,yBAAAA,CAAyB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAuE;AACzK,EAAA,MAAM,CAAA,GAAI9B,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,eAAA,GAAkB,MAAA,EAAQ,WAAA,EAAa,MAAA,IAAU,CAAA;AAEvD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAElCA,IAAC,4BAAA,EAAA,EAA6B,KAAA,EAAO,iBAAiB,QAAA,EAAS,YAAA,EAAa,UAAA,EAAY,wBAAA,CAAyB,iBAAA,EAAmB,CAAA;AAAA,oBAEpID,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,mBAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,mBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACQ,mBAAAA,EAAA,EAAoB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EACtD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,iCAAiC,CAAA;AAAA,cAChD,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAT,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,mBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,mBAAA,EAAoB,MAAI,IAAA,EACzC,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,aAAa,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EACvB;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAY,wBAAA,CAAyB,iBAAA,EAAmB;AAAA,GAAA,EACjI,CAAA;AAEJ,CAAC;AChDM,IAAM,0BAAA,GAA6BX,KAAK,SAASyC,2BAAAA,CAA2B,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAyE;AAC/K,EAAA,MAAM,CAAA,GAAI/B,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,UAAA,GAAa,MAAA,EAAQ,cAAA,EAAgB,MAAA,IAAU,CAAA;AAErD,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAElCA,IAAC,4BAAA,EAAA,EAA6B,KAAA,EAAO,YAAY,QAAA,EAAS,OAAA,EAAQ,UAAA,EAAY,wBAAA,CAAyB,mBAAA,EAAqB,CAAA;AAAA,oBAE5HD,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,qBAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,qBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAAC4C,kBAAAA,EAAA,EAAmB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EACrD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,mCAAmC,CAAA;AAAA,cAClD,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEA7C,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,qBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,8BACAD,IAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,qBAAA,EAAsB,MAAI,IAAA,EAC3C,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAE,QAAQ,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG;AAAA,eAAA,EAClB;AAAA,aAAA,EACF,CAAA;AAAA,4BACAC,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAY,wBAAA,CAAyB,mBAAA,EAAqB;AAAA,GAAA,EACnI,CAAA;AAEJ,CAAC;AChDM,IAAM,yBAAA,GAA4BX,KAAK,SAAS2C,0BAAAA,CAA0B,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAwE;AAC5K,EAAA,MAAM,CAAA,GAAIjC,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,iBAAiB,MAAA,CAAO,cAAA;AAE9B,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAY,wBAAA,CAAyB,kBAAA,EAAoB,CAAA;AAAA,oBAE7Hd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,oBAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,oBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAAC8C,2BAAAA,EAAA,EAA4B,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC9D,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,kCAAkC,CAAA;AAAA,cACjD,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEA/C,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,oBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B,CAAA;AAAA,8BACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAK,oBAAA,EAAqB,IAAA,EAAI,MAC1C,QAAA,EAAA,cAAA,EACH;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAY,wBAAA,CAAyB,kBAAA,EAAoB;AAAA,GAAA,EAClI,CAAA;AAEJ,CAAC;AC/CM,IAAM,oBAAA,GAAuBX,KAAK,SAAS6C,qBAAAA,CAAqB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAmE;AAC7J,EAAA,MAAM,CAAA,GAAInC,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,gBAAgB,MAAA,CAAO,SAAA;AAE7B,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAY,wBAAA,CAAyB,aAAA,EAAe,CAAA;AAAA,oBAExHd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,eAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,eAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACgD,cAAAA,EAAA,EAAe,SAAA,EAAU,oBAAA,EAAqB,CAAA,EACjD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,6BAA6B,CAAA;AAAA,cAC5C,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAjD,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,eAAA,EACjB,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EACvB,CAAA;AAAA,8BACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAK,eAAA,EAAgB,IAAA,EAAI,MACrC,QAAA,EAAA,aAAA,EACH;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAY,wBAAA,CAAyB,aAAA,EAAe;AAAA,GAAA,EAC7H,CAAA;AAEJ,CAAC;AC/CM,IAAM,sBAAA,GAAyBX,KAAK,SAAS+C,uBAAAA,CAAuB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAqE;AACnK,EAAA,MAAM,CAAA,GAAIrC,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,IAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AACvC,EAAA,MAAM,mBAAmB,MAAA,CAAO,gBAAA;AAEhC,EAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAY,wBAAA,CAAyB,eAAA,EAAiB,CAAA;AAAA,oBAE1Hd,IAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,SAAA;AAAA,QACT,QAAA;AAAA,QACA,QAAA,EAAS,iBAAA;AAAA,QACT,KAAA,EAAM,WAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,IAAA,kBACEA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,iBAAA,EACnB,QAAA,kBAAAA,GAAAA,CAACkD,cAAAA,EAAA,EAAe,SAAA,EAAU,oBAAA,EAAqB,CAAA,EACjD,CAAA;AAAA,cAEF,KAAA,EAAO,KAAA;AAAA,cACP,WAAA,EAAa,EAAE,+BAA+B,CAAA;AAAA,cAC9C,OAAA,EAAS,SAAA;AAAA,cACT,aAAA,EAAc;AAAA;AAAA,WAChB;AAAA,0BAEAnD,IAAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAS,SAAA,EACrB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,aAAA,EAAA,EAAc,IAAA,EAAK,iBAAA,EACjB,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB,CAAA;AAAA,8BACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,iBAAA,EAAkB,MAAI,IAAA,EACvC,QAAA,EAAA,gBAAA,IAAoB,CAAA,CAAE,YAAY,CAAA,EACrC;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,IAAI,QAAA,EAAoB;AAAA,WAAA,EACxD;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAY,wBAAA,CAAyB,eAAA,EAAiB;AAAA,GAAA,EAC/H,CAAA;AAEJ,CAAC;ACnDD,IAAM,sBAAA,GAA0E;AAAA,EAC9E,MAAA,EAAQ,EAAE,KAAA,EAAO,cAAA,EAAgB,MAAM,uBAAA,EAAwB;AAAA,EAC/D,IAAA,EAAM,EAAE,KAAA,EAAO,YAAA,EAAc,MAAM,qBAAA,EAAsB;AAAA,EACzD,KAAA,EAAO,EAAE,KAAA,EAAO,aAAA,EAAe,MAAM,sBAAA,EAAuB;AAAA,EAC5D,IAAA,EAAM,EAAE,KAAA,EAAO,YAAA,EAAc,MAAM,qBAAA,EAAsB;AAAA,EACzD,MAAA,EAAQ,EAAE,KAAA,EAAO,cAAA,EAAgB,MAAM,uBAAA;AACzC,CAAA;AAEA,IAAM,kBAAA,GAA6C;AAAA,EACjD,MAAA,EAAQ,gDAAA;AAAA,EACR,IAAA,EAAM,4CAAA;AAAA,EACN,KAAA,EAAO,8CAAA;AAAA,EACP,IAAA,EAAM,4CAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,gBAAA,GAA2C;AAAA,EAC/C,MAAA,EAAQ,sCAAA;AAAA,EACR,IAAA,EAAM,kCAAA;AAAA,EACN,KAAA,EAAO,oCAAA;AAAA,EACP,IAAA,EAAM,kCAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEO,IAAM,eAAeX,IAAAA,CAAK,SAASiD,cAAa,EAAE,IAAA,EAAM,UAAS,EAA2D;AACjI,EAAA,MAAM,CAAA,GAAIvC,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AACnB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAS,OAAO,IAAI,CAAA;AACpD,EAAA,MAAM,iBAAA,GAAoBO,OAA4B,IAAI,CAAA;AAE1D,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,IAAS,QAAA;AAClC,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,IAAS,GAAA;AAClC,EAAA,MAAM,UAAA,GAAa,OAAO,MAAA,IAAU,GAAA;AAEpC,EAAA,MAAM,gBAAA,GAAmB,sBAAA,CAAuB,SAAS,CAAA,IAAK,sBAAA,CAAuB,MAAA;AACrF,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,SAAS,CAAA,IAAK,kBAAA,CAAmB,MAAA;AACxE,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,SAAS,CAAA,IAAK,gBAAA,CAAiB,MAAA;AAElE,EAAA,MAAM,iBAAA,GAAoBC,YAAY,MAAM;AAC1C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,iBAAA,CAAkB,SAAS,KAAA,EAAM;AAAA,IACnC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,CAAC,KAAA,KAAkD;AACtF,IAAA,WAAA,CAAY,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,WAAAA,CAAY,CAAC,KAAA,KAAoD;AACrF,IAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,iBAAA,CAAkB,SAAS,IAAA,EAAK;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEP,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,EAAG,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAC,CAAA,CAAA,EAAI,SAAA,GAAY,cAAA,GAAiB,EAAE,+BAA+B,WAAW,CAAA,CAAA,EAAI,iBAAiB,KAAK,CAAA,CAAA,EAAI,iBAAiB,IAAI,CAAA,6BAAA,CAAA;AAAA,MACjL,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,WAAW,UAAA,EAAW;AAAA,MACjD,aAAA,EAAe,iBAAA;AAAA,MAGf,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAACoD,gBAAAA,EAAA,EAAiB,SAAA,EAAW,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA,EAAI,CAAA;AAAA,0BACzDpD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,2BAA2B,SAAS,CAAA,CAAA,EAAK,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EAAE;AAAA,SAAA,EAC1E,CAAA;AAAA,QAGC,4BACCA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,iBAAA;AAAA,YACL,KAAA,EAAO,QAAA;AAAA,YACP,QAAA,EAAU,gBAAA;AAAA,YACV,MAAA,EAAQ,UAAA;AAAA,YACR,SAAA,EAAW,aAAA;AAAA,YACX,SAAA,EAAU,8JAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAW,UAAA,GAAa,EAAA,EAAG;AAAA,YACpC,WAAA,EAAa,EAAE,qBAAqB;AAAA;AAAA,4BAGtCA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,0EAAA;AAAA,YACV,KAAA,EAAO,EAAE,SAAA,EAAW,UAAA,GAAa,EAAA,EAAG;AAAA,YAEnC,QAAA,EAAA,QAAA,oBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yCAAA,EAA2C,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE;AAAA;AAAA;AAExF;AAAA;AAAA,GAEJ;AAEJ,CAAC;AC7ED,IAAM,YAAA,GAAiD;AAAA,EACrD,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,gDAAA;AAAA,IACR,MAAA,EAAQ,+BAAA;AAAA,IACR,EAAA,EAAI,uCAAA;AAAA,IACJ,IAAA,EAAM,sCAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAU,wCAAA;AAAA,IACV,YAAA,EAAc,yDAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,4CAAA;AAAA,IACR,MAAA,EAAQ,2BAAA;AAAA,IACR,EAAA,EAAI,mCAAA;AAAA,IACJ,IAAA,EAAM,kCAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAU,oCAAA;AAAA,IACV,YAAA,EAAc,qDAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,8CAAA;AAAA,IACR,MAAA,EAAQ,6BAAA;AAAA,IACR,EAAA,EAAI,qCAAA;AAAA,IACJ,IAAA,EAAM,oCAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAU,sCAAA;AAAA,IACV,YAAA,EAAc,uDAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,4CAAA;AAAA,IACR,MAAA,EAAQ,2BAAA;AAAA,IACR,EAAA,EAAI,mCAAA;AAAA,IACJ,IAAA,EAAM,kCAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAU,oCAAA;AAAA,IACV,YAAA,EAAc,qDAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,8CAAA;AAAA,IACR,MAAA,EAAQ,4BAAA;AAAA,IACR,EAAA,EAAI,qCAAA;AAAA,IACJ,IAAA,EAAM,oCAAA;AAAA,IACN,WAAA,EAAa,SAAA;AAAA,IACb,QAAA,EAAU,sCAAA;AAAA,IACV,YAAA,EAAc,uDAAA;AAAA,IACd,QAAA,EAAU;AAAA;AAEd,CAAA;AAEO,IAAM,aAAA,GAAgBE,KAAK,SAASmD,cAAAA,CAAc,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAA4D;AACxI,EAAA,MAAM,YAAA,GAAezC,gBAAgB,iBAAiB,CAAA;AACtD,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,oBAAmB,GAAI,IAAA;AACtE,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAA,CAAO,KAAK,KAAK,YAAA,CAAa,KAAA;AAE/D,EAAA,MAAM,kBAAA,GAAqBN,WAAAA;AAAA,IACzB,CAAC,KAAA,KAA4B;AAC3B,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,cAAA,GAAiB,EAAE,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,IAAI,cAAc;AAAA,GACrB;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,KAAA,KAA4B;AAC3B,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,kBAAA,GAAqB,EAAE,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,CAAC,IAAI,kBAAkB;AAAA,GACzB;AAEA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,KAAA,KAA4B;AAC3B,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,MAAA,GAAS,EAAE,CAAA;AAAA,IACb,CAAA;AAAA,IACA,CAAC,IAAI,MAAM;AAAA,GACb;AAEA,EAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AAEtB,IAAA,uBACEP,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,sBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,eAAA,EAAgB,CAAA;AAAA,sBAE/Fd,IAAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAoB,QAAA,EAAS,OAAA,EAAQ,YAAA,EAAc,WAAA,CAAY,MAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,aAAA,EAAe,iBAAA,EACnI,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wEAAA,EAA2E,WAAA,CAAY,MAAM,CAAA,UAAA,CAAA,EAC3G,QAAA,kBAAAA,GAAAA,CAACsD,kBAAAA,EAAA,EAAmB,SAAA,EAAU,sBAAqB,CAAA,EACrD,CAAA;AAAA,0BACAvD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4BAC3EA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DACV,QAAA,EAAA,MAAA,CAAO,WAAA,IAAe,YAAA,CAAa,sBAAsB,CAAA,EAC5D;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UAAK,SAAA,EAAW,CAAA,yFAAA,EAA4F,YAAY,IAAI,CAAA,qBAAA,CAAA,EAC1H,QAAA,EAAA,YAAA,CAAa,WAAW,CAAA,EAC3B,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,kBAAA;AAAA,gBACT,SAAA,EAAU,mHAAA;AAAA,gBACV,KAAA,EAAO,aAAa,aAAa,CAAA;AAAA,gBAEjC,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,8CAAA,EAA+C;AAAA;AAAA,aAC5E;AAAA,YACC,sCACCA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,YAAA;AAAA,gBACT,SAAA,EAAU,mHAAA;AAAA,gBACV,KAAA,EAAO,aAAa,aAAa,CAAA;AAAA,gBAEjC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,eAAA,EAAgB;AAAA,KAAA,EACpG,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEd,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,GAAA;AAAA,QACV,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW,QAAA;AAAA,QACX,SAAA,EAAW,EAAE,WAAA,EAAa,aAAA,EAAc;AAAA,QACxC,WAAA,EAAa,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,YAAA,EAAc,CAAA,EAAG,eAAA,EAAiB,WAAA,CAAY,WAAA,EAAa,MAAA,EAAQ,CAAA,+BAAA,CAAA;AAAkC;AAAA,KAC3I;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,eAAA,EAAgB,CAAA;AAAA,oBAE/Fd,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAW,CAAA,8EAAA,EAAiF,iBAAA,CAAkB,UAAU,MAAA,EAAW,WAAA,CAAY,MAAM,CAAC,CAAA,eAAA,CAAA;AAAA,QACtJ,OAAO,EAAE,QAAA,EAAU,OAAO,KAAA,EAAO,SAAA,EAAW,OAAO,MAAA,EAAO;AAAA,QAG1D,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,WAAW,CAAA,kFAAA,EAAqF,WAAA,CAAY,QAAQ,CAAA,CAAA,EAAI,YAAY,YAAY,CAAA,UAAA,CAAA;AAAA,cAChJ,aAAA,EAAe,iBAAA;AAAA,cAEf,QAAA,EAAA;AAAA,gCAAAC,IAACsD,kBAAAA,EAAA,EAAmB,WAAW,CAAA,QAAA,EAAW,WAAA,CAAY,QAAQ,CAAA,CAAA,EAAI,CAAA;AAAA,gCAClEvD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,wCAAwC,WAAA,CAAY,IAAI,IAAK,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,kBACnF,MAAA,CAAO,+BACNA,GAAAA,CAAC,UAAK,SAAA,EAAU,6DAAA,EAA+D,iBAAO,WAAA,EAAY;AAAA,iBAAA,EAEtG,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,kBAAA;AAAA,oBACT,SAAA,EAAU,2EAAA;AAAA,oBACV,KAAA,EAAO,aAAa,eAAe,CAAA;AAAA,oBAEnC,0BAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAW,CAAA,YAAA,EAAe,WAAA,CAAY,QAAQ,CAAA,CAAA,EAAI;AAAA;AAAA,iBACnE;AAAA,gBACC,sCACCA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,YAAA;AAAA,oBACT,SAAA,EAAU,gFAAA;AAAA,oBACV,KAAA,EAAO,aAAa,aAAa,CAAA;AAAA,oBAEjC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE;AAAA;AAAA,WAEJ;AAAA,0BAGAd,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EAAsC;AAAA;AAAA;AAAA,KACvD;AAAA,oBAEAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,eAAA,EAAgB;AAAA,GAAA,EACpG,CAAA;AAEJ,CAAC;ACrNM,IAAM,IAAA,GAAO,UAAA,CAAW,SAAS0C,KAAAA,CACtC,OACA,GAAA,EACA;AACA,EAAA,uBACEvD,GAAAA,CAAU,QAAA,CAAA,eAAA,EAAT,EACC,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAU,GAAG,KAAA,EAAO,GAAA,EAAU,CAAA,EACjC,CAAA;AAEJ,CAAC,CAAA;;;ACRD,eAAA,EAAA;;;ACWO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAC/D;AAKO,SAAS,cAAc,UAAA,EAAoC;AAChE,EAAA,IAAI,sBAAqB,EAAG;AAC1B,IAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,EACvB;AACA,EAAA,OAAO,UAAA;AACT;AAwBO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,SAAS,EAA8C,CAAA;AAAA;AAAA,EAGvD,QAAQ,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA;AAAA,EAGtD,OAAO,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA;AAAA,EAGrD,QAAQ,EAA8C,CAAA;AAAA;AAAA,EAGtD,KAAA,EAAO,EAAyD,CAAA;AAAA;AAAA,EAGhE,OAAO,EAA8C;AACvD,CAAA;CAGoC;AAAA,EAClC,SAAS,oBAAA,EAAqB,GAAI,EAAc,IAAI,aAAA,CAAc,OAAA;AAAA,EAClE,QAAQ,oBAAA,EAAqB,GAAI,EAAc,IAAI,aAAA,CAAc,MAAA;AAAA,EACjE,OAAO,oBAAA,EAAqB,GAAI,EAAc,IAAI,aAAA,CAAc,KAAA;AAAA,EAChE,QAAQ,oBAAA,EAAqB,GAAI,EAAc,IAAI,aAAA,CAAc,MAAA;AAAA,EACjE,OAAO,oBAAA,EAAqB,GAAI,EAAc,IAAI,aAAA,CAAc,KAAA;AAAA,EAChE,OAAO,oBAAA,EAAqB,GAAI,EAAc,IAAI,aAAA,CAAc;AAClE;CA6NgC;AAAA,EAE9B,IAAA,EAAM,oBAAA,EAAqB,GAAI,CAAA,GAAI,IAAA;AAAA,EACnC,MAAA,EAAQ,oBAAA,EAAqB,GAAI,CAAA,GAAI,IAAA;AAAA,EACrC,IAAA,EAAM,oBAAA,EAAqB,GAAI,CAAA,GAAI,IAAA;AAAA,EACnC,QAAA,EAAU,oBAAA,EAAqB,GAAI,CAAA,GAAI;AACzC;;;AC3SO,IAAM,SAAA,GAAY;AAAA;AAAA,EAEvB,gBAAA,EAAkB;AAAA,IAChB,0HAAA;AAAA,IACA,6EAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,eAAA,EAAiB;AAAA,IACf,oIAAA;AAAA,IACA,6EAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,iBAAA,EAAmB;AAAA,IACjB,sIAAA;AAAA,IACA,6EAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,kGAAA;AAAA,IACA,qDAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,kGAAA;AAAA,IACA,qDAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,kGAAA;AAAA,IACA,qDAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,kGAAA;AAAA,IACA,qDAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,kGAAA;AAAA,IACA,qDAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,kGAAA;AAAA,IACA,qDAAA;AAAA,IACA;AAAA;AAEJ,CAAA;AAGO,IAAM,UAAA,GAAa;AAAA,EACxB,EAAA,EAAI,8BAAA;AAAA,EACJ,EAAA,EAAI,gCAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA;AAAA,EACJ,EAAA,EAAI,gCAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAGO,IAAM,UAAA,GAAa,cAAA;AAEnB,IAAM,MAAA,GAAS;AAAA,EACpB,IAAA,EAAM;AAAA;AAAA,IAEJ,8GAAA;AAAA;AAAA,IAEA,0IAAA;AAAA;AAAA,IAEA,kHAAA;AAAA;AAAA,IAEA,0BAAA;AAAA;AAAA,IAEA;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA;AAAA,IAEL,sCAAA;AAAA;AAAA,IAEA,oBAAA;AAAA;AAAA,IAEA,8GAAA;AAAA;AAAA,IAEA,kBAAA;AAAA;AAAA,IAEA,oBAAA;AAAA;AAAA,IAEA,qBAAA;AAAA;AAAA,IAEA,qFAAA;AAAA;AAAA,IAEA,uDAAA;AAAA;AAAA,IAEA,sFAAA;AAAA;AAAA,IAEA,4CAAA;AAAA;AAAA,IAEA;AAAA,GACF;AAAA,EACA,OAAA,EAAS;AAAA;AAAA,IAEP,+CAAA;AAAA;AAAA,IAEA,uCAAA;AAAA;AAAA,IAEA;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA;AAAA,IAEL,qFAAA;AAAA;AAAA,IAEA,0EAAA;AAAA;AAAA,IAEA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA;AAAA,IAER,mEAAA;AAAA;AAAA,IAEA,qDAAA;AAAA;AAAA,IAEA,YAAA;AAAA;AAAA,IAEA,gCAAA;AAAA;AAAA,IAEA,iFAAA;AAAA;AAAA,IAEA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,WAAA,EAAa;AAAA,MACX,iIAAA;AAAA,MACA,uGAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,+NAAA;AAAA,MACA,uGAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,iIAAA;AAAA,MACA,6FAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,iIAAA;AAAA,MACA,uFAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,+NAAA;AAAA,MACA,oDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,iIAAA;AAAA,MACA,iDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,qIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,oIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA,EAAK;AAAA,MACH,+HAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,qIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,uIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,0IAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,oIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,mIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,uIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,iIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,GAAA,EAAK;AAAA,MACH,+HAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,iIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,qIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,qIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,MACP,uIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,iIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,iIAAA;AAAA,MACA;AAAA;AACF;AAEJ,CAAA;AA8BO,IAAM,eAAA,GAAkB;AAAA,EAC7B,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,IAAM,SAAA,GAAY;AAAA,EACvB,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AF1OO,IAAM,MAAA,GAASwD,UAAAA,CAAW,SAASC,OAAAA,CACxC;AAAA,EACE,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AAEA,EAAA,MAAM,UAAA,GAAa,cAAc,SAAA,GAAY,KAAA;AAG7C,EAAA,MAAM,UAAA,GAAa,cAAc,UAAA,IAAc,SAAA;AAC/C,EAAA,MAAM,WAAA,GAAc,UAAA,GAChB,SAAA,CAAU,UAAoC,CAAA,GAC9C,MAAA,CAAO,MAAA,CAAO,UAAwC,CAAA,IAAK,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAExF,EAAA,IAAI,OAAA,GAAU,IAAA;AAAA,IACZ,SAAA;AAAA,IACA,MAAA,CAAO,IAAA;AAAA,IACP,QAAA,GAAW,MAAA,CAAO,QAAA,GAAW,OAAA,GAAU,MAAA,CAAO,OAAA,GAAU,KAAA,GAAQ,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,WAAW,CAAA;AAAA,IAC7G,IAAA,IAAQ,UAAA;AAAA,IACR,IAAA,KAAS,IAAA,IAAQ,UAAA,CAAW,IAAI,CAAA;AAAA,IAChC,SAAA,IAAa,QAAA;AAAA,IACb,OAAA,IAAW;AAAA,GACb;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AACzB,MAAA,aAAA,CAAc,WAAA,GAAc,WAAW,OAAO,CAAA;AAAA,IAChD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,QAAA,IAAY,OAAA;AAE/B,EAAA,MAAM,aAAA,mBACJ1D,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAK,MAAA,EACnB,qCACCA,GAAAA;AAAA,MAAC,MAAA,CAAO,IAAA;AAAA,MAAP;AAAA,QACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAChC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,MAAA,EAAO;AAAA,QACrC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,QAC7B,UAAA,EAAY,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA;AAAA,QAC7C,SAAA,EAAU,0BAAA;AAAA,QAEV,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,MAAA,EAAO;AAAA;AAAA,KACnC,EAEJ,CAAA;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,IAAA,CAAK,kCAAA,EAAoC,OAAA,IAAW,YAAY,CAAA,EAC9E,QAAA,EAAA,OAAA,IAAW,WAAA,GAAc,WAAA,GAAc,QAAA,EAC1C;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,SAAA,GAAY,KAAA;AAClB,EAAA,MAAM,WAAA,GAAc,KAAA;AAEpB,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA;AAErC,EAAA,OAAO,yBACLA,GAAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,UAAU,CAAC,UAAA,GAAa,EAAE,KAAA,EAAO,MAAK,GAAI,MAAA;AAAA,MAC1C,UAAA,EAAY,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA;AAAA,MAC7C,UAAA,EAAY,cAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,aAAA,EAAe,SAAA,IAAa,QAAQ,CAAA;AAAA,MAEpD,QAAA,kBAAAA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACE,GAAG,SAAA;AAAA,UACJ,SAAA,EAAW,OAAA;AAAA,UACX,GAAA;AAAA,UAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,aAAA,EAAc;AAAA;AAAA;AAC9B;AAAA,sBAGFA,GAAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,UAAU,CAAC,UAAA,GAAa,EAAE,KAAA,EAAO,MAAK,GAAI,MAAA;AAAA,MAC1C,UAAA,EAAY,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA;AAAA,MAC7C,UAAA,EAAY,cAAA;AAAA,MACZ,SAAA,EAAW,IAAA,CAAK,aAAA,EAAe,SAAA,IAAa,QAAQ,CAAA;AAAA,MAEpD,QAAA,kBAAAA,GAAAA;AAAA,QAAC0D,QAAA;AAAA,QAAA;AAAA,UACE,GAAG,WAAA;AAAA,UACJ,QAAA,EAAU,UAAA;AAAA,UACV,SAAA,EAAW,IAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AAAA,UACzC,GAAA;AAAA,UAEA,QAAA,kBAAA1D,GAAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,aAAA,EAAc;AAAA;AAAA;AAC9B;AAAA,GACF;AAEJ,CAAC,CAAA;AAKM,SAAS,WAAA,CAAY,EAAE,QAAA,EAAS,EAAkC;AACvE,EAAA,uBACED,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0GAAA;AAAA,QACV,aAAA,EAAY;AAAA;AAAA,KACd;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;AAKA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAA2B;AAC7D,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,IAAA,CAAK,sBAAA,EAAwB,SAAS,CAAA;AAAA,MACjD,KAAA,EAAM,4BAAA;AAAA,MACN,IAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,EAAA,EAAG,IAAA;AAAA,YACH,EAAA,EAAG,IAAA;AAAA,YACH,CAAA,EAAE,IAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY;AAAA;AAAA,SACd;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,YAAA;AAAA,YACV,IAAA,EAAK,cAAA;AAAA,YACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,GACF;AAEJ;AAgGO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA,GAAQ,UAAA;AAAA,EACR,IAAA,GAAO,IAAA;AAAA,EACP,OAAA,GAAU,OAAA;AAAA,EACV,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,UAAA,GAAa,cAAc,SAAA,GAAY,KAAA;AAC7C,EAAA,MAAM,aAAa,UAAA,IAAc,SAAA;AAEjC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AACzB,MAAA,aAAA,CAAc,WAAA,GAAc,WAAW,OAAO,CAAA;AAC9C,MAAA,OAAA,IAAU;AAAA,IACZ;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,KAAA,EAAO,IAAA;AAAA,MACL,YAAA;AAAA,MACA,UAAA,IAAc,eAAe,UAAA,IAAc,gCAAA;AAAA,MAC3C,UAAA,IAAc,eAAe,SAAA,IAAa,gCAAA;AAAA,MAC1C,UAAA,IAAc,eAAe,WAAA,IAAe,gCAAA;AAAA,MAC5C,UAAA,IAAc,eAAe,YAAA,IAAgB,gCAAA;AAAA,MAC7C,UAAA,IAAc,eAAe,YAAA,IAAgB;AAAA,KAC/C;AAAA,IACA,KAAA,EAAO,IAAA;AAAA,MACL,yDAAA;AAAA,MACA,UAAA,IAAc,eAAe,UAAA,IAAc,oCAAA;AAAA,MAC3C,UAAA,IAAc,eAAe,SAAA,IAAa,oCAAA;AAAA,MAC1C,UAAA,IAAc,eAAe,WAAA,IAAe,oCAAA;AAAA,MAC5C,UAAA,IAAc,eAAe,YAAA,IAAgB,oCAAA;AAAA,MAC7C,UAAA,IAAc,eAAe,YAAA,IAAgB;AAAA,KAC/C;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,MACP,uBAAA;AAAA,MACA,UAAA,IAAc,eAAe,UAAA,IAAc,2EAAA;AAAA,MAC3C,UAAA,IAAc,eAAe,SAAA,IAAa,2EAAA;AAAA,MAC1C,UAAA,IAAc,eAAe,WAAA,IAAe,2EAAA;AAAA,MAC5C,UAAA,IAAc,eAAe,YAAA,IAAgB,2EAAA;AAAA,MAC7C,UAAA,IAAc,eAAe,YAAA,IAAgB;AAAA;AAC/C,GACF;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA,CAAO,MAAA;AAAA,IAAP;AAAA,MACC,OAAA,EAAS,WAAA;AAAA,MACT,UAAU,QAAA,IAAY,OAAA;AAAA,MACtB,QAAA,EAAU,EAAE,KAAA,EAAO,GAAA,EAAI;AAAA,MACvB,UAAA,EAAY,aAAA,CAAc,aAAA,CAAc,KAAK,CAAA;AAAA,MAC7C,SAAA,EAAW,IAAA;AAAA,QACT,gBAAgB,IAAI,CAAA;AAAA,QACpB,+CAAA;AAAA,QACA,kGAAA;AAAA,QACA,mBAAA;AAAA,QACA,cAAc,OAAO,CAAA;AAAA,QAAA,CACpB,YAAY,OAAA,KAAY,+BAAA;AAAA,QACzB;AAAA,OACF;AAAA,MACA,YAAA,EAAY,KAAA;AAAA,MAEX,oCACCA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAW,UAAU,IAAI,CAAA,EAAG,CAAA,mBAE5CA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,CAAU,IAAI,GAAI,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA,GAE5C;AAEJ;;;AG7WA,eAAA,EAAA;AAiBO,SAAS,IAAA,CAAK;AAAA,EACnB,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA,GAAU,SAAA;AAAA,EACV,WAAA,GAAc,KAAA;AAAA,EACd,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAc;AACZ,EAAA,MAAM,WAAA,GAAc,6BAAA;AAEpB,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,OAAA,EAAS,gBAAA;AAAA,IACT,QAAA,EAAU,4IAAA;AAAA,IACV,KAAA,EAAO,uBAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,kBAAA,GAAqB,cACvB,iFAAA,GACA,EAAA;AAGJ,EAAA,IAAI,aAAa,OAAA,EAAS;AAExB,IAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAA2D,YAAAA,EAAa,SAAA,EAAW,kBAAkB,cAAA,EAAgB,oBAAA,EAAsB,GAAG,SAAA,EAAU,GAAI,KAAA;AACjH,IAAA,uBACE3D,GAAAA;AAAA,MAAC4D,MAAAA,CAAO,GAAA;AAAA,MAAP;AAAA,QACC,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,cAAA,CAAe,OAAO,CAAC,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,QACvF,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,EAAK;AAAA,QACxB,YAAY,WAAA,GAAc,EAAE,GAAG,EAAA,EAAI,SAAA,EAAW,qCAAoC,GAAI,MAAA;AAAA,QACtF,YAAY,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,SAAS,EAAA,EAAG;AAAA,QAC1D,SAAS,MAAM;AACb,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,aAAA,CAAc,OAAO,CAAA;AACrB,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,CAAA;AAAA,QACA,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,GAAU,YAAY,MAAA,EAAU;AAAA,QAChD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAEA,EAAA,uBACE5D,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,cAAA,CAAe,OAAO,CAAC,CAAA,CAAA,EAAI,kBAAkB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACtF,GAAG;AAAA;AAAA,GACN;AAEJ;AAoBO,SAAS,YAAY,EAAE,SAAA,GAAY,EAAA,EAAI,GAAG,OAAM,EAAmC;AACxF,EAAA,uBAAOA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA,EAAK,GAAG,KAAA,EAAO,CAAA;AACpE;;;ACtFA,eAAA,EAAA;AA6BO,IAAM,KAAA,GAAQwD,UAAAA;AAAA,EACnB,CACE;AAAA,IACE,SAAA,GAAY,EAAA;AAAA,IACZ,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA,GAAY,KAAA;AAAA,IACZ,aAAA,GAAgB,KAAA;AAAA,IAChB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,kBAAA,GAAqB,KAAA;AAAA,IACrB,kBAAA,GAAqB,KAAA;AAAA,IACrB,aAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,cAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,GAAU,SAAA;AAAA,IACV,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,CAAA,GAAI5C,gBAAgB,MAAM,CAAA;AAChC,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,IAAM,MAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,GAAG,OAAO,CAAA,MAAA,CAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,GAAG,OAAO,CAAA,OAAA,CAAA;AAC3B,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,SAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA;AAClD,IAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,KAAU,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAClE,IAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,cAAA,GAAiB,aAAA,GAAgB,KAAA;AACrE,IAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,IAAA,MAAM,WAAA,GAAcQ,WAAAA;AAAA,MAClB,CAAC,CAAA,KAA0C;AACzC,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,aAAA,CAAc,OAAO,CAAA;AACrB,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,MACjB,CAAC,CAAA,KAA0C;AACzC,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAA,GAAS,CAAC,CAAA;AAAA,MACZ,CAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAEA,IAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,MAAA,aAAA,CAAc,OAAO,CAAA;AACrB,MAAA,OAAA,IAAU;AAAA,IACZ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,MAAA,aAAA,CAAc,OAAO,CAAA;AACrB,MAAA,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,IAC/B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,IAAA,MAAM,UAAA,GAAa,IAAA,KAAS,UAAA,IAAc,YAAA,GAAe,MAAA,GAAS,IAAA;AAElE,IAAA,MAAM,eAAA,GAAkB,SAAA,IAAa,QAAA,KAAa,SAAA,IAAa,QAAA,CAAA;AAC/D,IAAA,MAAM,eAAA,GAAkB,SAAS,UAAA,IAAc,kBAAA;AAG/C,IAAA,MAAM,cAAc,QAAA,GAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,GAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AASJ,IAAA,MAAM,eAAe,QAAA,GACjB,SAAA,GACE,uDAAA,GACA,EAAA,GACF,YACE,gFAAA,GACA,EAAA;AAEN,IAAA,MAAM,eAAe,QAAA,GACjB,KAAA,GACE,qDAAA,GACA,EAAA,GACF,QACE,uCAAA,GACA,EAAA;AAEN,IAAA,MAAM,iBAAiB,OAAA,IAAW,CAAC,KAAA,GAC/B,QAAA,GACE,0BACA,2CAAA,GACF,EAAA;AAEJ,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,GAAU,EAAA;AAMrC,IAAA,MAAM,kBAAA,GAAqB,sBACzBP,IAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EAAmC,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,oBAAmB,EAErH,QAAA,EAAA;AAAA,sBAAAC,IAAC6D,eAAAA,EAAA,EACE,QAAA,EAAA,OAAA,IAAW,CAAC,yBACX7D,GAAAA;AAAA,QAAC4D,MAAAA,CAAO,GAAA;AAAA,QAAP;AAAA,UACC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,UAClC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,UAChC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,UAC/B,UAAA,EAAY,aAAA,CAAc,aAAA,CAAc,MAAM,CAAA;AAAA,UAE9C,QAAA,kBAAA5D,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,iDAAA,EAAkD;AAAA;AAAA,OAC/E,EAEJ,CAAA;AAAA,sBAGAA,GAAAA,CAAC6D,eAAAA,EAAA,EACE,6CACC7D,GAAAA;AAAA,QAAC4D,MAAAA,CAAO,MAAA;AAAA,QAAP;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,UAClC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,UAChC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,UAC/B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,UAC7B,OAAA,EAAS,cAAA;AAAA,UACT,SAAA,EAAU,wIAAA;AAAA,UACV,cAAY,YAAA,GAAe,CAAA,CAAE,cAAc,CAAA,GAAI,EAAE,cAAc,CAAA;AAAA,UAE9D,QAAA,EAAA,YAAA,mBACC5D,GAAAA,CAAC8D,cAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU,CAAA,mBAElC9D,GAAAA,CAAC+D,SAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,OAEjC,EAEJ,CAAA;AAAA,sBAGA/D,GAAAA,CAAC6D,eAAAA,EAAA,EACE,6CACC7D,GAAAA;AAAA,QAAC4D,MAAAA,CAAO,MAAA;AAAA,QAAP;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,UAClC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,UAChC,IAAA,EAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,GAAA,EAAI;AAAA,UAC/B,UAAA,EAAY,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,UAC7B,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAU,wIAAA;AAAA,UAEV,QAAA,kBAAA5D,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA,OACjC,EAEJ;AAAA,KAAA,EACF,CAAA;AAIF,IAAA,MAAM,eAAe,sBACnBjE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0CAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCC,GAAAA;AAAA,UAAC4D,MAAAA,CAAO,CAAA;AAAA,UAAP;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,YAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YAC5B,SAAA,EAAU,sBAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAED,CAAC,KAAA,IAAS,OAAA,IAAW,cAAA,oBACpB5D,GAAAA;AAAA,UAAC4D,MAAAA,CAAO,CAAA;AAAA,UAAP;AAAA,YACC,EAAA,EAAI,QAAA;AAAA,YACJ,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,EAAA,EAAG;AAAA,YAC7B,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YAC5B,SAAA,EAAU,iDAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAED,CAAC,KAAA,IAAS,CAAC,cAAA,IAAkB,UAAA,oBAC5B5D,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,QAAA,EAAU,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,UAAA,EAAW;AAAA,OAAA,EAEtF,CAAA;AAAA,MACC,sCACCD,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,WAAW,CAAA,aAAA,EACT,WAAA,GACI,iBACA,cAAA,GAAiB,CAAA,GACjB,qCACA,kCACN,CAAA,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,cAAA;AAAA,YAAgB,aAAA,GAAgB,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,GAAK;AAAA;AAAA;AAAA;AACzD,KAAA,EAEJ,CAAA;AAIF,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,UAAA,IAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,0BAGFA,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,UAAA;AAAA,cACN,GAAA;AAAA,cACA,EAAA,EAAI,OAAA;AAAA,cACJ,KAAA;AAAA,cACA,OAAA,EAAS,WAAA;AAAA,cACT,MAAA,EAAQ,UAAA;AAAA,cACR,SAAA,EAAW,aAAA;AAAA,cACX,cAAA,EAAc,CAAC,CAAC,KAAA;AAAA,cAChB,kBAAA,EAAkB,KAAA,GAAQ,OAAA,GAAU,UAAA,GAAa,QAAA,GAAW,MAAA;AAAA,cAC5D,SAAA,EAAW;AAAA,gBAAA,EACP,WAAW;AAAA,gBAAA,EACX,YAAY;AAAA,gBAAA,EACZ,YAAY;AAAA,gBAAA,EACZ,cAAc;AAAA,gBAAA,EACd,WAAW;AAAA;AAAA,gBAAA,EAEX,SAAS;AAAA;AAAA,cAAA,CAAA;AAAA,cAGb,WAAA,EAAY,GAAA;AAAA,cACX,GAAG;AAAA;AAAA,WACN;AAAA,0BAGAA,GAAAA;AAAA,YAAC4D,MAAAA,CAAO,KAAA;AAAA,YAAP;AAAA,cACC,OAAA,EAAS,OAAA;AAAA,cACT,SAAA,EAAW;AAAA;AAAA;AAAA;AAAA,gBAAA,EAIP,IAAA,GAAO,YAAY,EAAE;AAAA,cAAA,CAAA;AAAA,cAEzB,OAAA,EAAS,KAAA;AAAA,cACT,OAAA,EAAS;AAAA,gBACP,GAAA,EAAK,QAAA,IAAY,SAAA,GAAY,QAAA,GAAW,KAAA;AAAA,gBACxC,CAAA,EAAG,QAAA,IAAY,SAAA,GAAY,CAAA,GAAI,MAAA;AAAA,gBAC/B,QAAA,EAAU,QAAA,IAAY,SAAA,GAAY,SAAA,GAAY;AAAA,eAChD;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAEC,kBAAA;AAAmB,SAAA,EACtB,CAAA;AAAA,QAAA,CACE,KAAA,IAAS,OAAA,IAAW,UAAA,IAAc,kBAAA,KAAuB,YAAA;AAAa,OAAA,EAC1E,CAAA;AAAA,IAEJ;AAGA,IAAA,uBACE7D,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAS,OAAA,EAAS,SAAA,EAAU,8DAChC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBAEFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACZ,QAAA,EAAA;AAAA,QAAA,IAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,wBAGFA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,UAAA;AAAA,YACN,GAAA;AAAA,YACA,EAAA,EAAI,OAAA;AAAA,YACJ,KAAA;AAAA,YACA,OAAA,EAAS,WAAA;AAAA,YACT,MAAA,EAAQ,UAAA;AAAA,YACR,SAAA,EAAW,aAAA;AAAA,YACX,cAAA,EAAc,CAAC,CAAC,KAAA;AAAA,YAChB,kBAAA,EAAkB,KAAA,GAAQ,OAAA,GAAU,UAAA,GAAa,QAAA,GAAW,MAAA;AAAA,YAC5D,SAAA,EAAW;AAAA,cAAA,EACP,WAAW;AAAA,cAAA,EACX,YAAY;AAAA,cAAA,EACZ,YAAY;AAAA,cAAA,EACZ,cAAc;AAAA,cAAA,EACd,WAAW;AAAA;AAAA,cAAA,EAEX,SAAS;AAAA,YAAA,CAAA;AAAA,YAEZ,GAAG;AAAA;AAAA,SACN;AAAA,QAEC,kBAAA;AAAmB,OAAA,EACtB,CAAA;AAAA,MAAA,CACE,KAAA,IAAS,OAAA,IAAW,UAAA,IAAc,kBAAA,KAAuB,YAAA;AAAa,KAAA,EAC1E,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;AAKb,IAAM,aAAA,GAAgBwD,UAAAA;AAAA,EAC3B,CAAC,EAAE,OAAA,GAAU,SAAA,EAAW,MAAM,GAAG,KAAA,EAAM,EAAG,GAAA,qBACxCxD,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,UAAA;AAAA,MACL,kBAAA,EAAkB,IAAA;AAAA,MAClB,OAAA;AAAA,MACA,IAAA;AAAA,MACC,GAAG;AAAA;AAAA;AAGV,CAAA;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;AAKrB,IAAM,WAAA,GAAcwD,UAAAA;AAAA,EACzB,CAAC,EAAE,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,wBACnBxD,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,IAAA,oBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EAAU,IAAA,EAAK,MAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,gBAC9D,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,WAAA,EAAa,CAAA,EAAG,CAAA,EAAE,6CAAA,EAA8C,CAAA,EACrH,CAAA;AAAA,MAED,GAAG;AAAA;AAAA;AAGV,CAAA;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;AC1Y1B,eAAA,EAAA;;;ACEA,eAAA,EAAA;AA0BO,SAAS,KAAA,CAAM;AAAA,EACpB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,UAAA,GAAa,CAAC,KAAK,CAAA;AAAA,EACnB,IAAA,GAAO,QAAA;AAAA,EACP,IAAA,GAAO;AACT,CAAA,EAAe;AACb,EAAA,MAAM,UAAU,IAAA,KAAS,OAAA;AACzB,EAAA,MAAM,WAAA,GAAc,eAAe,CAAC,CAAA;AACpC,EAAA,MAAM,QAAA,GAAWK,OAAuB,IAAI,CAAA;AAG5C,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,WAAA,EAAa,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAElE,EAAA,MAAM,aAAA,GAAgBC,WAAAA;AAAA,IACpB,CAAC,GAA2C,IAAA,KAAkB;AAC5D,MAAA,MAAM,cAAc,OAAA,GAChB,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,OAAO,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,GAAA,GACzC,KAAK,QAAA,CAAS,CAAA,GAAI,GAAA,IAAO,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAE7C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,aAAA,CAAc,OAAO,CAAA;AACrB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,WAAA,EAAa,OAAO;AAAA,GAChC;AAGA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAClD,EAAA,MAAM,iBAAiB,IAAA,KAAS,IAAA,GAC5B,UAAA,GACA,IAAA,KAAS,OACP,UAAA,GACA,UAAA;AAEN,EAAA,uBACEP,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,MAAM,EAAA,EAAIS,UAAAA,EAC1B,QAAA,kBAAAV,IAAAA,CAAC,MAAA,EAAA,EAAO,EAAA,EAAG,KAAA,EAAM,SAAA,EAAU,iBAAgB,OAAA,EAEzC,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAIS,UAAAA;AAAA,QACJ,KAAA,EAAM,uBAAA;AAAA,QACN,SAAA,EAAU,WAAA;AAAA,QACV,OAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAM,sBAAA;AAAA,QACN,SAAA,EAAU,aAAA;AAAA,QACV,OAAA,EAAQ,WAAA;AAAA,QAER,QAAA,kBAAAT,GAAAA;AAAA,UAAC4D,MAAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YACC,SAAA,EAAU,4CAAA;AAAA,YACV,KAAA,EAAO,EAAE,OAAA,EAAS,eAAA;AAAgB;AAAA;AACpC;AAAA,KACF;AAAA,oBAGA5D,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EACE,UACI,kFAAA,GACA,kEAAA;AAAA,QAGN,QAAA,kBAAAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAIS,UAAAA;AAAA,YACJ,KAAA,EAAM,4CAAA;AAAA,YACN,SAAA,EAAW,UAAU,kBAAA,GAAqB,kBAAA;AAAA,YAC1C,OAAA,EAAS,UAAU,eAAA,GAAkB,eAAA;AAAA,YACrC,KAAA,EAAM,2CAAA;AAAA,YACN,SAAA,EAAW,UAAU,eAAA,GAAkB,eAAA;AAAA,YACvC,OAAA,EAAS,UAAU,kBAAA,GAAqB,kBAAA;AAAA,YAExC,QAAA,kBAAAV,IAAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBACC,IAAI6D,MAAAA,CAAO,GAAA;AAAA,gBACX,GAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAM,UAAU,GAAA,GAAM,GAAA;AAAA,gBACtB,eAAA,EACE,OAAA,GACI,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE,GACpB,EAAE,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,gBAE1B,WAAA,EACE,OAAA,GACI,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI,GACzB,EAAE,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,gBAE/B,SAAA,EAAW,aAAA;AAAA,gBACX,KAAA,EAAO,UAAU,EAAE,CAAA,EAAG,aAAY,GAAI,EAAE,GAAG,WAAA,EAAY;AAAA,gBACvD,SAAA,EACE,OAAA,GACI,CAAA,2BAAA,EAA8B,cAAc,CAAA,+EAAA,CAAA,GAC5C,CAAA,2GAAA,CAAA;AAAA,gBAEL,GAAI,CAAC,OAAA,GAAU,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAE,GAAI,EAAC;AAAA,gBAGrD,QAAA,EAAA;AAAA,kBAAA,UAAA,IAAc,CAAC,OAAA,oBACd5D,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0DAAA,EAA2D,CAAA,EAC5E,CAAA;AAAA,kBAID,yBACCA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,kHACpB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,kCAIFA,GAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,oCAAA;AAAA,sBACV,KAAA,EAAO,OAAA,GAAU,EAAE,MAAA,EAAQ,MAAA,KAAW,EAAE,SAAA,EAAW,CAAA,KAAA,EAAQ,SAAS,CAAA,QAAA,CAAA,EAAW;AAAA,sBAE9E;AAAA;AAAA,mBACH;AAAA,kBAGC,CAAC,OAAA,oBAAWA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EAA2B;AAAA;AAAA;AAAA;AACzD;AAAA;AACF;AAAA,OAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;ACzKA,eAAA,EAAA;AA8BA,IAAM,WAAA,GAAc,EAAA;AAKpB,SAAS,eAAA,CAAgB;AAAA,EACvB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,CAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAyB;AAEvB,EAAA,MAAM,KAAA,GAAQiE,YAAAA,CAAa,CAAA,EAAG,CAAC,OAAA,KAAY;AACzC,IAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,GAAa,OAAA;AACxC,IAAA,MAAM,YAAA,GAAA,CAAgB,kBAAkB,UAAA,IAAc,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,YAAY,CAAA;AACnD,IAAA,OAAO,QAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAUA,YAAAA,CAAa,KAAA,EAAO,CAAC,CAAA,EAAG,UAAA,EAAY,UAAA,GAAa,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAClF,EAAA,MAAM,KAAA,GAAQA,YAAAA,CAAa,KAAA,EAAO,CAAC,CAAA,EAAG,UAAA,EAAY,UAAA,GAAa,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AAEjF,EAAA,uBACEjE,GAAAA;AAAA,IAAC4D,MAAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MAEC,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,MACxB,SAAA,EAAU,qEAAA;AAAA,MACV,SAAS,MAAM;AACb,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,aAAA,CAAc,OAAO,CAAA;AACrB,UAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,QACvB;AAAA,MACF,CAAA;AAAA,MAEA,QAAA,kBAAA5D,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,mEAAA;AAAA,UACV,OAAO,EAAE,MAAA,EAAQ,YAAY,UAAA,EAAY,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA,EAAK;AAAA,UAE1D,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV,KAAA;AAAA,IAfK,MAAA,CAAO;AAAA,GAgBd;AAEJ;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,GAAe,CAAA;AAAA,EACf,UAAA,GAAa;AACf,CAAA,EAAqB;AACnB,EAAA,MAAM,YAAA,GAAeK,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAA,GAAI6D,eAAe,CAAC,CAAA;AAC1B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIpE,SAAS,KAAK,CAAA;AAGlD,EAAA,MAAM,oBAAyC,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,GAAA,KAC1D,OAAO,GAAA,KAAQ,QAAA,GAAW,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI,GAAI;AAAA,GACzD;AAEA,EAAA,MAAM,gBAAgB,iBAAA,CAAkB,SAAA,CAAU,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAU,KAAK,CAAA;AAC9E,EAAA,MAAM,kBAAkB,YAAA,GAAe,UAAA;AAGvC,EAAAS,UAAU,MAAM;AACd,IAAA,IAAI,aAAA,IAAiB,CAAA,IAAK,CAAC,UAAA,EAAY;AACrC,MAAA,MAAM,OAAA,GAAU,CAAC,aAAA,GAAgB,UAAA;AACjC,MAAA,OAAA,CAAQ,CAAA,EAAG,SAAS,EAAE,IAAA,EAAM,UAAU,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,EAAA,EAAI,CAAA;AAAA,IACrE;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,UAAA,EAAY,CAAA,EAAG,UAAU,CAAC,CAAA;AAG7C,EAAA,MAAM,aAAA,GAAgBD,YAAY,MAAM;AACtC,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,MAAM,QAAA,GAAW,EAAE,GAAA,EAAI;AACvB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAC,WAAW,UAAU,CAAA;AACtD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,YAAA,EAAc,iBAAA,CAAkB,MAAA,GAAS,CAAC,CAAC,CAAA;AACrF,IAAA,MAAM,OAAA,GAAU,CAAC,YAAA,GAAe,UAAA;AAEhC,IAAA,OAAA,CAAQ,GAAG,OAAA,EAAS;AAAA,MAClB,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,OAAA,EAAS,EAAA;AAAA,MACT,YAAY,MAAM;AAChB,QAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,YAAY,CAAA,EAAG,KAAA;AAClD,QAAA,IAAI,QAAA,IAAY,aAAa,KAAA,EAAO;AAClC,UAAA,aAAA,CAAc,WAAW,CAAA;AACzB,UAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,CAAA,EAAG,YAAY,iBAAA,EAAmB,KAAA,EAAO,QAAQ,CAAC,CAAA;AAGtD,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,IAAI,CAAC,UAAA,EAAY,aAAA,CAAc,IAAI,CAAA;AAEnC,IAAA,MAAM,QAAA,GAAW,EAAE,GAAA,EAAI;AACvB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAC,WAAW,UAAU,CAAA;AAGtD,IAAA,IAAI,YAAA,IAAgB,CAAA,IAAK,YAAA,GAAe,iBAAA,CAAkB,MAAA,EAAQ;AAChE,MAAA,MAAM,SAAA,GAAY,CAAC,YAAA,GAAe,UAAA;AAClC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,SAAS,IAAI,CAAA,EAAG;AACtC,QAAA,aAAA,CAAc,WAAW,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAA,EAAG,YAAY,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAC,CAAA;AAExD,EAAA,uBACEP,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAU,0BAAA;AAAA,MACV,KAAA,EAAO,EAAE,MAAA,EAAQ,eAAA,EAAgB;AAAA,MAGjC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sHAAA,EAAuH,CAAA;AAAA,wBACtIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yHAAA,EAA0H,CAAA;AAAA,wBAGzIA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gEAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,GAAA,EAAA,CAAM,kBAAkB,UAAA,IAAc,CAAA;AAAA,cACtC,MAAA,EAAQ;AAAA;AACV;AAAA,SACF;AAAA,wBAGAD,IAAAA;AAAA,UAAC6D,MAAAA,CAAO,GAAA;AAAA,UAAP;AAAA,YACC,IAAA,EAAK,GAAA;AAAA,YACL,eAAA,EAAiB;AAAA,cACf,GAAA,EAAK,EAAE,iBAAA,CAAkB,MAAA,GAAS,CAAA,CAAA,GAAK,UAAA;AAAA,cACvC,MAAA,EAAQ;AAAA,aACV;AAAA,YACA,WAAA,EAAa,GAAA;AAAA,YACb,MAAA,EAAQ,UAAA;AAAA,YACR,SAAA,EAAW,aAAA;AAAA,YACX,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA,YACX,SAAA,EAAU,oBAAA;AAAA,YAGV,QAAA,EAAA;AAAA,8BAAA5D,GAAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,eAAA,GAAkB,UAAA,IAAc,GAAE,EAAG,CAAA;AAAA,cAE3D,iBAAA,CAAkB,GAAA,CAAI,CAAC,MAAA,EAAQ,0BAC9BA,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBAEC,MAAA;AAAA,kBACA,KAAA;AAAA,kBACA,CAAA;AAAA,kBACA,UAAA;AAAA,kBACA,eAAA;AAAA,kBACA,UAAA;AAAA,kBACA;AAAA,iBAAA;AAAA,gBAPK,MAAA,CAAO;AAAA,eASf,CAAA;AAAA,8BAGDA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAA,CAAS,eAAA,GAAkB,UAAA,IAAc,CAAA,EAAE,EAAG;AAAA;AAAA;AAAA;AAC9D;AAAA;AAAA,GACF;AAEJ;AF7KO,IAAM,MAAA,GAASwD,UAAAA;AAAA,EACpB,CACE;AAAA,IACE,SAAA,GAAY,EAAA;AAAA,IACZ,KAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,EAAC;AAAA,IACX,eAAA,GAAkB,KAAA;AAAA,IAClB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA,GAAc,WAAA;AAAA,IACd,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI1D,SAAS,KAAK,CAAA;AAC1C,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGhD,IAAA,MAAM,oBAAoC,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,GAAA,KACrD,OAAO,GAAA,KAAQ,QAAA,GAAW,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI,GAAI;AAAA,KACzD;AAEA,IAAA,MAAM,cAAA,GAAiB,kBAAkB,IAAA,CAAK,CAAC,QAAQ,GAAA,CAAI,KAAA,KAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAElF,IAAA,MAAM,WAAA,GAAcQ,WAAAA;AAAA,MAClB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,aAAA,CAAc,OAAO,CAAA;AACrB,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,CAAC,OAAO;AAAA,KACV;AAEA,IAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,MACjB,CAAC,CAAA,KAA2C;AAC1C,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAA,GAAS,CAAC,CAAA;AAAA,MACZ,CAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAEA,IAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,MACzB,CAAC,QAAA,KAAqB;AACpB,QAAA,aAAA,CAAc,WAAW,CAAA;AAEzB,QAAA,MAAM,cAAA,GAAiB;AAAA,UACrB,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAS;AAAA,UAC1B,aAAA,EAAe,EAAE,KAAA,EAAO,QAAA;AAAS,SACnC;AACA,QAAA,QAAA,GAAW,cAAc,CAAA;AACzB,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,QAAQ;AAAA,KACX;AAEA,IAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,aAAA,CAAc,OAAO,CAAA;AACrB,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,IAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAYpB,IAAA,MAAM,YAAA,GAAe,YACjB,yCAAA,GACA,EAAA;AAEJ,IAAA,MAAM,YAAA,GAAe,QAAQ,uCAAA,GAA0C,EAAA;AAGvE,IAAA,IAAI,eAAA,IAAmB,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AACnD,MAAA,uBACEP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8DACd,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,wBAIFD,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,gBAAA;AAAA,YACT,QAAA;AAAA,YACA,SAAA,EAAW;AAAA,cAAA,EACP,WAAW;AAAA,cAAA,EACX,YAAY;AAAA,cAAA,EACZ,YAAY;AAAA,cAAA,EACZ,SAAS;AAAA;AAAA,YAAA,CAAA;AAAA,YAIb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,UAAK,SAAA,EAAW,cAAA,GAAiB,KAAK,eAAA,EACpC,QAAA,EAAA,cAAA,EAAgB,SAAS,WAAA,EAC5B,CAAA;AAAA,8BACAA,GAAAA;AAAA,gBAACmE,iBAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,CAAA;AAAA,gBAAA,EACP,MAAA,GAAS,eAAe,EAAE,CAAA;AAAA;AAAA;AAChC;AAAA;AAAA,SACF;AAAA,wBAGAnE,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA,EAAU,SAAA;AAAA,YACT,GAAG,KAAA;AAAA,YAEH,4BAAkB,GAAA,CAAI,CAAC,GAAA,qBACtBA,IAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,UAAU,GAAA,CAAI,QAAA,EACrD,cAAI,KAAA,EAAA,EADM,GAAA,CAAI,KAEjB,CACD;AAAA;AAAA,SACH;AAAA,wBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,KAAA,EAAO,KAAA,EAC3D,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,iBAAA;AAAA,cACT,OAAO,MAAA,CAAO,KAAK,KAAK,iBAAA,CAAkB,CAAC,GAAG,KAAA,IAAS,EAAA;AAAA,cACvD,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,cAC9B,SAAA,EAAU,gIAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA,WAED,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,yBAASA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAwB,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EACvD,CAAA;AAAA,IAEJ;AAGA,IAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8DACd,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,EAAS,WAAA;AAAA,YACT,MAAA,EAAQ,UAAA;AAAA,YACR,QAAA;AAAA,YACA,SAAA,EAAW;AAAA,cAAA,EACP,WAAW;AAAA,cAAA,EACX,YAAY;AAAA,cAAA,EACZ,YAAY;AAAA,cAAA,EACZ,SAAS;AAAA;AAAA,YAAA,CAAA;AAAA,YAGZ,GAAG,KAAA;AAAA,YAEH,QAAA,EAAA;AAAA,cAAA,WAAA,oBACCC,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAM,EAAA,EAAG,QAAA,EAAQ,MACtB,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,cAED,iBAAA,CAAkB,SAAS,CAAA,GACxB,iBAAA,CAAkB,IAAI,CAAC,GAAA,qBACrBA,GAAAA,CAAC,QAAA,EAAA,EAAuB,OAAO,GAAA,CAAI,KAAA,EAAO,UAAU,GAAA,CAAI,QAAA,EACrD,cAAI,KAAA,EAAA,EADM,GAAA,CAAI,KAEjB,CACD,CAAA,GACD;AAAA;AAAA;AAAA,SACN;AAAA,wBAGAA,GAAAA;AAAA,UAACmE,iBAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,MAEC,yBAASnE,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAwB,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACvD,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AGtOrB,eAAA,EAAA;;;ACCA,eAAA,EAAA;ACWA,eAAA,EAAA;;;ACVA,eAAA,EAAA;ACDA,eAAA,EAAA;;;ACDA,eAAA,EAAA;;;ACAA,eAAA,EAAA;;;ACAA,eAAA,EAAA;;;ACIA,eAAA,EAAA;ACAA,eAAA,EAAA;AAKqB,aAAA,CAOlB;AAAA,EACD,KAAA,EAAO,KAAA;AAAA,EACP,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,KAAA;AAAA,EACN,OAAA,EAAS,KAAA;AAAA,EACT,OAAA,EAAS,KAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAC;AA2CuB,aAAA,CAAkE;AAAA,EACxF,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAC;;;ACrED,eAAA,EAAA;ACCA,eAAA,EAAA;AC2B4BoE,cAAmD,MAAS;ACVxF,IAAM,gBAAA,GAAqD;AAAA,EACzD,IAAA,EAAM,8HAAA;AAAA,EACN,QAAA,EAAU,kFAAA;AAAA,EACV,KAAA,EACE,0HAAA;AAAA,EACF,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,YAAYC,eAAAA,CAAM,UAAA;AAAA,EAC7B,CAAC,EAAE,OAAA,GAAU,MAAA,EAAQ,WAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC5D,IAAA,uBACErE,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWsE,IAAAA,CAAK,gBAAA,CAAiB,OAAO,GAAG,SAAS,CAAA;AAAA,QACnD,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF,CAAA;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA;ACvBjB,IAAM,YAAYD,eAAAA,CAAM,UAAA;AAAA,EAC7B,CACE,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,GAAG,KAAA,EAAM,EAC7E,GAAA,KACG;AACH,IAAA,uBACEtE,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWuE,KAAK,aAAA,EAAe,SAAS,CAAA,EAAI,GAAG,KAAA,EAC3D,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCvE,IAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,SAAA,EAAU,yDAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YACA,4BAAYC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,GAAA,EAAC;AAAA;AAAA;AAAA,OACpD;AAAA,sBAGFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAY,QAAA,EAAS,CAAA;AAAA,MAEnC,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,wCAAA,EAAyC,IAAA,EAAK,SACxD,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,MAGD,UAAA,IAAc,CAAC,KAAA,oBACdA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAA4C,QAAA,EAAA,UAAA,EAAW;AAAA,KAAA,EAExE,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA;ACpCjB,IAAM,cAAcqE,eAAAA,CAAM,UAAA;AAAA,EAC/B,CAAC,EAAE,KAAA,EAAO,WAAA,EAAa,UAAU,SAAA,EAAW,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC9D,IAAA,uBACEtE,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWuE,KAAK,WAAA,EAAa,SAAS,CAAA,EAAI,GAAG,KAAA,EACxD,QAAA,EAAA;AAAA,MAAA,CAAA,KAAA,IAAS,WAAA,qBACTvE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QAED,+BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CACV,QAAA,EAAA,WAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAa,QAAA,EAAS;AAAA,KAAA,EACvC,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;ACrBnB,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,sBAAA,GAAyB,uGAAA;AAAA,EACzB,cAAA,GAAiB,8DAAA;AAAA,EACjB,iBAAA,GAAoB,mDAAA;AAAA,EACpB,0BAAA,GAA6B,2BAAA;AAAA,EAC7B,sBAAA,GAAyB,0CAAA;AAAA,EACzB,sBAAA,GAAyB;AAC3B,CAAA,EAAqB;AACnB,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,mBAAOC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,sBAAA,EAAyB,gBAAK,CAAA,GAAS,IAAA;AAAA,oBAC/DD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,EAAiB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACtC,2BAAWA,GAAAA,CAAC,SAAI,SAAA,EAAW,iBAAA,EAAoB,oBAAS,CAAA,GAAS,IAAA;AAAA,MACjE,YAAY,QAAA,CAAS,MAAA,GAAS,oBAC7BA,GAAAA,CAAC,SAAI,SAAA,EAAW,0BAAA,EACb,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,YAAA,EAAc,KAAA,qBAC3BD,IAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,eAAA,EACzB,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,sBAAA,EAAyB,uBAAa,KAAA,EAAM,CAAA;AAAA,wBAC7DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,sBAAA,EAAyB,uBAAa,KAAA,EAAM;AAAA,OAAA,EAAA,EAFrD,KAGV,CACD,CAAA,EACH,CAAA,GACE;AAAA,KAAA,EACN;AAAA,GAAA,EACF,CAAA;AAEJ;AChBA,IAAMuE,iBAAAA,GAAoD;AAAA,EACxD,OAAA,EAAS,uEAAA;AAAA,EACT,OAAA,EAAS,gBAAA;AAAA,EACT,IAAA,EAAM,4FAAA;AAAA,EACN,WAAA,EACE;AACJ,CAAA;AAEA,IAAM,cAAA,GAAkD;AAAA,EACtD,OAAA,EAAS,KAAA;AAAA,EACT,OAAA,EAAS,MAAA;AAAA,EACT,IAAA,EAAM,KAAA;AAAA,EACN,WAAA,EAAa;AACf,CAAA;AAEO,IAAM,WAAWF,eAAAA,CAAM,UAAA;AAAA,EAC5B,CACE;AAAA,IACE,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,GAAU,SAAA;AAAA,IACV,SAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,uBACEtE,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAWuE,IAAAA;AAAA,UACT,+EAAA;AAAA,UACAC,kBAAiB,OAAO,CAAA;AAAA,UACxB,eAAe,OAAO,CAAA;AAAA,UACtB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAvE,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,KAAA;AAAA,cACA,QAAA;AAAA,cACA;AAAA;AAAA,WACF;AAAA,UAGC,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAC3BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,0BACpBA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,SAAS,MAAA,CAAO,OAAA;AAAA,cAChB,UAAU,MAAA,CAAO,QAAA;AAAA,cACjB,SAAA,EAAWsE,IAAAA;AAAA,gBACT,qMAAA;AAAA,gBACA,MAAA,CAAO,OAAA,KAAY,QAAA,GACf,6FAAA,GACA;AAAA,eACN;AAAA,cAEC,QAAA,EAAA,MAAA,CAAO;AAAA,aAAA;AAAA,YAVH;AAAA,WAYR,CAAA,EACH;AAAA;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF,CAAA;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;ACxEvB,IAAM,WAAA,GAAkD;AAAA,EACtD,KAAA,EAAO,EAAE,SAAA,EAAW,gEAAA,EAAkE,KAAK,YAAA,EAAa;AAAA,EACxG,OAAA,EAAS,EAAE,SAAA,EAAW,wEAAA,EAA0E,KAAK,cAAA,EAAe;AAAA,EACpH,IAAA,EAAM,EAAE,SAAA,EAAW,oEAAA,EAAsE,KAAK,aAAA,EAAc;AAAA,EAC5G,OAAA,EAAS,EAAE,SAAA,EAAW,oEAAA,EAAsE,KAAK,aAAA,EAAc;AAAA,EAC/G,OAAA,EAAS,EAAE,SAAA,EAAW,gFAAA,EAAkF,KAAK,gBAAA;AAC/G,CAAA;AAEA,IAAM,oBAAA,GAA+C;AAAA,EACnD,OAAA,EAAS,qHAAA;AAAA,EACT,QAAA,EAAU,+GAAA;AAAA,EACV,QAAA,EAAU,mGAAA;AAAA,EACV,MAAA,EAAQ,2HAAA;AAAA,EACR,QAAA,EAAU,yGAAA;AAAA,EACV,UAAA,EAAY,yGAAA;AAAA,EACZ,KAAA,EAAO,mGAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,iBAAA,GAA4C;AAAA,EAChD,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,gBAAA;AAAA,EACR,QAAA,EAAU,aAAA;AAAA,EACV,UAAA,EAAY,aAAA;AAAA,EACZ,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,WAAA,GAA2C;AAAA,EAC/C,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,oBAAA,GACJ,yGAAA;AAEyBd,UAAAA,CAA6C,SAASgB,YAAAA,CAC/E,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,GAAO,IAAA,EAAM,SAAA,GAAY,EAAA,EAAI,GAAG,KAAA,IACjD,GAAA,EACA;AACA,EAAA,IAAI,cAAA,IAAkB,KAAA,IAAS,KAAA,CAAM,YAAA,EAAc;AACjD,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA;AAClD,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,gBAAA,CAAiB,IAAA,IAAQ,SAAS,CAAA;AAChE,IAAA,MAAM,gBAAgB,gBAAA,CAAiB,IAAA;AACvC,IAAA,MAAMC,cAAAA,GAAgB,SAAS,gBAAA,CAAiB,KAAA;AAEhD,IAAA,uBACE1E,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,WAAW,MAAM,CAAA,CAAA;AAAA,QAC7B,aAAA,EAAa,gBAAgB,MAAM,CAAA,CAAA;AAAA,QACnC,SAAA,EAAW,uFAAuF,WAAA,CAAY,IAAI,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,QAEtJ,QAAA,EAAA;AAAA,UAAA,aAAA,mBACCC,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAW,CAAA,QAAA,EAAW,gBAAA,CAAiB,cAAc,cAAA,GAAiB,EAAE,CAAA,CAAA,EAAI,CAAA,mBAE3FA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,qBAAA,EAAwB,SAAA,CAAU,GAAG,CAAA,CAAA,EAAI,CAAA;AAAA,UAE3DyE;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,MAAM,CAAA,IAAK,oBAAA;AACpD,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAM,CAAA,IAAK,aAAA;AAC/C,EAAA,MAAM,gBAAgB,KAAA,IAAS,MAAA;AAE/B,EAAA,uBACE1E,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,WAAW,MAAM,CAAA,CAAA;AAAA,MAC7B,aAAA,EAAa,gBAAgB,MAAM,CAAA,CAAA;AAAA,MACnC,SAAA,EAAW,sEAAsE,WAAA,CAAY,IAAI,CAAC,CAAA,CAAA,EAAI,WAAW,IAAI,SAAS,CAAA,CAAA;AAAA,MAE9H,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,EAAI,CAAA;AAAA,QACrD;AAAA;AAAA;AAAA,GACH;AAEJ,CAAC;ACnGD,IAAM,iBAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,wBAAA;AAAA,EACJ,EAAA,EAAI,wBAAA;AAAA,EACJ,EAAA,EAAI,wBAAA;AAAA,EACJ,EAAA,EAAI,wBAAA;AAAA,EACJ,KAAA,EAAO,yBAAA;AAAA,EACP,KAAA,EAAO,yBAAA;AAAA,EACP,KAAA,EAAO,yBAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,cAAA,GAAiB;AACnB,CAAA,EAAmB;AACjB,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAiB;AACrC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,GAAW,CAAC,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,OAAA,mBACJD,IAAAA,CAAAU,QAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,SAAI,SAAA,EAAU,qFAAA,EACb,0BAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6DAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,IAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,wBAEFD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC0E,WAAAA,EAAA,EAAY,SAAA,EAAU,oEACpB,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,UACC,4BACC1E,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DACV,QAAA,EAAA,QAAA,EACH;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,sBAAMA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,UACrC,KAAA,EAAM,OAAA;AAAA,UACN,OAAA,EAAS,OAAA;AAAA,UACT,OAAA,EAAQ;AAAA;AAAA;AACV,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAhE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EACH,CAAA,EACF,CAAA;AAAA,IAGC,UAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qFAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gFAAA,EACZ,QAAA,EAAA,MAAA,oBACCD,IAAAA,CAAAU,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAT,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,SAAA;AAAA,UACV,OAAA,EAAO,IAAA;AAAA,UACP,SAAA,EAAU,kBAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,cAAA;AAAA,UACV,OAAA,EAAS,SAAA;AAAA,UACT,WAAA,EAAa,WAAA;AAAA,UACb,KAAA,EAAM,gBAAA;AAAA,UACN,SAAA,EAAU,kBAAA;AAAA,UAET,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF,GAEJ,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,uBACED,IAAAA,CAAC4E,MAAAA,EAAA,EAAO,IAAA,EAAY,OAAA,EAAkB,WAAU,eAAA,EAC9C,QAAA,EAAA;AAAA,oBAAA3E,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,oBAC5DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEACb,QAAA,kBAAAA,GAAAA;AAAA,MAAC4E,WAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,oCAAA,EAAuC,iBAAA,CAAkB,QAAQ,CAAC,CAAA,0CAAA,CAAA;AAAA,QAE5E,QAAA,EAAA,QAAA,mBACC5E,GAAAA,CAAC,MAAA,EAAA,EAAK,UAAU,YAAA,EAAc,SAAA,EAAU,sCAAA,EACrC,QAAA,EAAA,OAAA,EACH,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCACZ,QAAA,EAAA,OAAA,EACH;AAAA;AAAA,KAEJ,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACpHO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,eAAA;AAAA,EAChB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,OAAA,GAAUK,OAAuB,IAAI,CAAA;AAE3C,EAAAE,UAAU,MAAM;AACd,IAAA,SAAS,mBAAmB,KAAA,EAAmB;AAC7C,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAC,OAAA,CAAQ,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAqB,CAAA,EAAG;AAC7E,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAEA,IAAA,SAAS,gBAAgB,KAAA,EAAsB;AAC7C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,eAAe,CAAA;AAEpD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAC5D,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,eAAe,CAAA;AAAA,IACzD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAOsE,YAAAA;AAAA,oBACL7E,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,SAAA,EAAW,kBAAkB,aAAa,CAAA,uHAAA,CAAA;AAAA,QAC1C,OAAO,EAAE,IAAA,EAAM,SAAS,CAAA,EAAG,GAAA,EAAK,SAAS,CAAA,EAAE;AAAA,QAC3C,aAAA,EAAa,MAAA;AAAA,QAEZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACtB,UAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,YAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAoB,SAAA,EAAU,oDAAA,EAAA,EAArB,MAAM,GAAoE,CAAA;AAAA,UAC7F;AAEA,UAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA;AAC5B,UAAA,uBACED,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,UAAU,KAAA,CAAM,QAAA;AAAA,cAChB,SAAA,EAAW,+FACT,KAAA,CAAM,QAAA,GACF,wDACA,KAAA,CAAM,MAAA,GACJ,4EACA,8EACR,CAAA,CAAA;AAAA,cACA,eAAa,KAAA,CAAM,MAAA;AAAA,cAElB,QAAA,EAAA;AAAA,gBAAA,aAAA,mBAAgBC,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,WAAU,CAAA,GAAK,IAAA;AAAA,gCACzDA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YAdd,KAAA,CAAM;AAAA,WAeb;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;ACnEA,IAAM,WAAA,GAAyC;AAAA,EAC7C,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,SAAS,aAAa,KAAA,EAAgB;AACpC,EAAA,OAAO;AAAA,IACL,iEAAA;AAAA,IACA,QACI,6EAAA,GACA;AAAA,GACN,CAAE,KAAK,GAAG,CAAA;AACZ;AAEA,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,KAAA,EAAM,EAAsC;AACrE,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO,OAAO,IAAA;AAC5B,EAAA,uBACEA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,eAAA,EAAkB,KAAA,GAAQ,cAAA,GAAiB,kCAAkC,CAAA,CAAA;AAAA,MACvF,GAAI,QAAQ,EAAE,IAAA,EAAM,SAAS,WAAA,EAAa,QAAA,KAAsB,EAAC;AAAA,MAEjE,QAAA,EAAA,KAAA,IAAS;AAAA;AAAA,GACZ;AAEJ;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA,GAAY,EAAA;AAAA,EACZ,aAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,uBACED,KAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,KAAA,mBACCA,KAAC,OAAA,EAAA,EAAM,SAAA,EAAW,6DAA6D,YAAA,CAAa,SAAS,CAAC,CAAA,CAAA,EACnG,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,2BAAWC,GAAAA,CAAC,UAAK,SAAA,EAAU,qBAAA,EAAsB,eAAC,CAAA,GAAU;AAAA,KAAA,EAC/D,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA,EAChC,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,2BAAA,EAA8B,WAAA,CAAY,SAAS,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAC9E,QAAA,EAAA;AAAA,MAAA,IAAA,mBAAOC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAyC,gBAAK,CAAA,GAAU,IAAA;AAAA,sBAChFA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACE,GAAG,KAAA;AAAA,UACJ,SAAA,EAAU,iIAAA;AAAA,UACV,UAAU,CAAC,KAAA,KAAU,aAAA,GAAgB,KAAA,CAAM,OAAO,KAAK;AAAA;AAAA;AACzD,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAY,KAAA,EAAc;AAAA,GAAA,EACvC,CAAA;AAEJ;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA,GAAY,EAAA;AAAA,EACZ,aAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,uBACED,KAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,KAAA,mBACCA,KAAC,OAAA,EAAA,EAAM,SAAA,EAAW,6DAA6D,YAAA,CAAa,SAAS,CAAC,CAAA,CAAA,EACnG,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,2BAAWC,GAAAA,CAAC,UAAK,SAAA,EAAU,qBAAA,EAAsB,eAAC,CAAA,GAAU;AAAA,KAAA,EAC/D,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,YAAA,CAAa,KAAK,GAChC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,SAAA,EAAW,0JAA0J,SAAS,CAAA,CAAA;AAAA,QAC9K,UAAU,CAAC,KAAA,KAAU,aAAA,GAAgB,KAAA,CAAM,OAAO,KAAK;AAAA;AAAA,KACzD,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAY,KAAA,EAAc;AAAA,GAAA,EACvC,CAAA;AAEJ;AAyFO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA,GAAY,EAAA;AAAA,EACZ,aAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,uBACED,KAAC,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,KAAA,mBACCA,KAAC,OAAA,EAAA,EAAM,SAAA,EAAW,6DAA6D,YAAA,CAAa,SAAS,CAAC,CAAA,CAAA,EACnG,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,2BAAWC,GAAAA,CAAC,UAAK,SAAA,EAAU,qBAAA,EAAsB,eAAC,CAAA,GAAU;AAAA,KAAA,EAC/D,CAAA,GACE,IAAA;AAAA,oBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,YAAA,CAAa,KAAK,GAChC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,WAAW,CAAA,sBAAA,EAAyB,WAAA,CAAY,SAAS,CAAC,qDAAqD,SAAS,CAAA,CAAA;AAAA,QACxH,UAAU,CAAC,KAAA,KAAU,aAAA,GAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,QAEtD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZA,GAAAA,CAAC,QAAA,EAAA,EAA0B,KAAA,EAAO,MAAA,CAAO,KAAA,EACtC,QAAA,EAAA,MAAA,CAAO,KAAA,EAAA,EADG,MAAA,CAAO,KAEpB,CACD;AAAA;AAAA,KACH,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAY,KAAA,EAAc;AAAA,GAAA,EACvC,CAAA;AAEJ;ACjPO,IAAM,OAAOqE,eAAAA,CAAM,UAAA;AAAA,EACxB,CAAC,EAAE,QAAA,EAAU,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,uBACErE,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAWsE,KAAK,SAAS,CAAA,EAAI,GAAG,KAAA,EAC7C,QAAA,EACH,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AAMZ,IAAM,WAAWD,eAAAA,CAAM,UAAA;AAAA,EAC5B,CAAC,EAAE,QAAA,EAAU,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,uBACErE,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWsE,IAAAA,CAAK,oBAAA,EAAsB,SAAS,CAAA,EAAI,GAAG,KAAA,EAClE,QAAA,EACH,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;AAMhB,IAAM,aAAaD,eAAAA,CAAM,UAAA;AAAA,EAC9B,CAAC,EAAE,QAAA,EAAU,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,uBACErE,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWsE,IAAAA,CAAK,sBAAA,EAAwB,SAAS,CAAA,EAAI,GAAG,KAAA,EACpE,QAAA,EACH,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA;AAMlB,IAAM,iBAAiBD,eAAAA,CAAM,UAAA;AAAA,EAClC,CAAC,EAAE,QAAA,EAAU,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC1C,IAAA,uBACErE,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWsE,IAAAA,CAAK,uBAAA,EAAyB,SAAS,CAAA,EAAI,GAAG,KAAA,EACrE,QAAA,EACH,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA;AC6HPpE,IAAAA,CAAK,SAAS4E,cAAAA,CAAc;AAAA,EAChD,IAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,iBAAiB,UAAA,GACnB,WAAA,EAAa,MAAM,IAAA,EAAK,EAAG,OAAO,CAAC,CAAA,EAAG,WAAA,EAAY,IAAK,aAAa,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,EAAG,WAAA,MAAiB,GAAA,GACvG,GAAA;AACJ,EAAA,MAAM,YAAA,GAAe,cAChB,WAAA,EAAa,IAAA,IAAQ,IAAI,IAAA,EAAK,CAAE,aAAY,GAC7C,EAAA;AACJ,EAAA,MAAM,YAAA,GAAe,UAAA,GAAa,WAAA,EAAa,OAAA,GAAU,MAAA;AAEzD,EAAA,uBACE/E,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,8ZAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,uDAAA,EAA0D,IAAA,CAAK,QAAQ,CAAA,2BAAA,CAAA,EAA+B,CAAA;AAAA,0BACtHA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iJAAA,EAAkJ,CAAA;AAAA,UAChK,IAAA,CAAK,EAAA,KAAO,SAAA,GACX,YAAA,mBACEA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,YAAA;AAAA,cACL,GAAA,EAAK,aAAa,IAAA,IAAQ,SAAA;AAAA,cAC1B,SAAA,EAAU;AAAA;AAAA,WACZ,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+JAAA,EACb,QAAA,EAAA,cAAA,EACH,CAAA,mBAGFA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wFAAA,EAAyF;AAAA;AAAA;AAAA,KAE7G;AAAA,IACD,IAAA,CAAK,OAAO,SAAA,IAAa,YAAA,oBACxBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2MAAA,EACb,QAAA,EAAA,YAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAC;ACrMD,SAAS,cAAc,EAAA,EAAwB;AAC7C,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,OAAO,EAAE,MAAM,kCAAA,EAAoC,EAAA,EAAI,mCAAmC,GAAA,EAAK,8BAAA,EAAgC,KAAK,cAAA,EAAe;AAAA,EACrJ;AACA,EAAA,IAAI,EAAA,KAAO,WAAA,IAAe,EAAA,KAAO,kBAAA,EAAoB;AACnD,IAAA,OAAO,EAAE,MAAM,oCAAA,EAAsC,EAAA,EAAI,qCAAqC,GAAA,EAAK,gCAAA,EAAkC,KAAK,cAAA,EAAe;AAAA,EAC3J;AACA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,OAAO,EAAE,MAAM,sCAAA,EAAwC,EAAA,EAAI,0CAA0C,GAAA,EAAK,kCAAA,EAAoC,KAAK,aAAA,EAAc;AAAA,EACnK;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,MAAM,sCAAA,EAAwC,EAAA,EAAI,uCAAuC,GAAA,EAAK,kCAAA,EAAoC,KAAK,cAAA,EAAe;AAAA,EACjK;AACA,EAAA,IAAI,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,WAAA,EAAa;AACzC,IAAA,OAAO,EAAE,MAAM,sCAAA,EAAwC,EAAA,EAAI,uCAAuC,GAAA,EAAK,kCAAA,EAAoC,KAAK,cAAA,EAAe;AAAA,EACjK;AACA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,OAAO,EAAE,MAAM,gCAAA,EAAkC,EAAA,EAAI,iCAAiC,GAAA,EAAK,4BAAA,EAA8B,KAAK,cAAA,EAAe;AAAA,EAC/I;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,MAAM,sCAAA,EAAwC,EAAA,EAAI,uCAAuC,GAAA,EAAK,kCAAA,EAAoC,KAAK,cAAA,EAAe;AAAA,EACjK;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,MAAM,wCAAA,EAA0C,EAAA,EAAI,yCAAyC,GAAA,EAAK,oCAAA,EAAsC,KAAK,cAAA,EAAe;AAAA,EACvK;AACA,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,OAAO,EAAE,MAAM,wCAAA,EAA0C,EAAA,EAAI,yCAAyC,GAAA,EAAK,oCAAA,EAAsC,KAAK,cAAA,EAAe;AAAA,EACvK;AACA,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,OAAO,EAAE,MAAM,kCAAA,EAAoC,EAAA,EAAI,mCAAmC,GAAA,EAAK,8BAAA,EAAgC,KAAK,cAAA,EAAe;AAAA,EACrJ;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,MAAM,gCAAA,EAAkC,EAAA,EAAI,iCAAiC,GAAA,EAAK,4BAAA,EAA8B,KAAK,cAAA,EAAe;AAAA,EAC/I;AACA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,OAAO,EAAE,MAAM,oCAAA,EAAsC,EAAA,EAAI,qCAAqC,GAAA,EAAK,gCAAA,EAAkC,KAAK,eAAA,EAAgB;AAAA,EAC5J;AACA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,OAAO,EAAE,MAAM,gCAAA,EAAkC,EAAA,EAAI,iCAAiC,GAAA,EAAK,4BAAA,EAA8B,KAAK,aAAA,EAAc;AAAA,EAC9I;AACA,EAAA,OAAO,EAAE,MAAM,sCAAA,EAAwC,EAAA,EAAI,uCAAuC,GAAA,EAAK,kCAAA,EAAoC,KAAK,cAAA,EAAe;AACjK;AA4TiBE,IAAAA,CAAK,SAAS6E,SAAAA,CAAS;AAAA,EACtC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAOG;AACD,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA;AACtC,EAAA,MAAM,cAAc,YAAA,IAAgB,YAAA;AACpC,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,MAAA,CAAO,MAAA;AAC5B,EAAA,MAAM,sBAAsB,WAAA,KAAgB,KAAA;AAC5C,EAAA,MAAM,eAAA,GAAkB,OAAO,EAAA,KAAO,SAAA;AACtC,EAAA,MAAM,aAAA,GAAgB,UAAU,WAAA,GAAc,2BAAA;AAC9C,EAAA,MAAM,aAAA,GAAgB,UAAU,SAAA,GAAY,uBAAA;AAE5C,EAAA,uBACEhF,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjC,YAAA,EAAc,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MAChC,SAAA,EAAU,4CAAA;AAAA,MACV,OAAO,MAAA,CAAO,KAAA;AAAA,MAEd,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,cAAA,EAAiB,aAAa,CAAA,yCAAA,EACvC,UAAA,GACI,sCAAA,GACA,mBAAA,GACE,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,8CAAA,CAAA,GACZ,eAAA,GACE,oCACA,mJACV,CAAA,CAAA;AAAA,YACA,OAAO,UAAA,GAAa,EAAE,gBAAA,EAAkB,MAAA,CAAO,KAAI,GAA2B,MAAA;AAAA,YAE7E,QAAA,EAAA;AAAA,cAAA,CAAC,uBAAuB,CAAC,UAAA,oBACxBC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mLAAA,EAAoL,CAAA;AAAA,8BAErMA,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,GAAG,aAAa,CAAA,CAAA,EACzB,cAAc,mBAAA,GACV,MAAA,CAAO,OACP,wCACN,CAAA;AAAA;AAAA,eACF;AAAA,cACC,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,GAAQ,qBAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qJACb,QAAA,EAAA,MAAA,CAAO,KAAA,GAAQ,EAAA,GAAK,KAAA,GAAQ,OAAO,KAAA,EACtC;AAAA;AAAA;AAAA,SAEJ;AAAA,QAAA,CACE,mBAAA,IAAuB,+BACvBA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,mJAAA,EACT,UAAA,GACI,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,GAC3B,mEACN,CAAA,CAAA;AAAA,YAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA;AACV;AAAA;AAAA,GAEJ;AAEJ,CAAC;ACvcM,SAAS,MAAA,CAAO;AAAA,EACrB,GAAA,GAAM,IAAA;AAAA,EACN,MAAA,GAAS,KAAA;AAAA,EACT,QAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyD;AACvD,EAAA,uBACED,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACT,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWuE,IAAAA;AAAA,QACT,SAAA;AAAA;AAAA,QAEA,qFAAA;AAAA,QACA,kEAAA;AAAA;AAAA,QAEA,SAAS,uDAAA,GAA0D;AAAA,OACrE;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA,oBACCvE,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,6EAAA;AAAA,YACV,OAAA,EAAQ,aAAA;AAAA,YACR,aAAA,EAAa,MAAM,MAAA,GAAY,MAAA;AAAA,YAE9B,QAAA,EAAA;AAAA,cAAA,GAAA,oBAAOC,GAAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,8BACpBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,OAAM,CAAA,EAAE,KAAA,EAAM,iBAAA,EAAkB,QAAA,EAAS,kBAAiB,QAAA,EAAS,UAAA,EAAW,QAAA,EAAS,EAAA,EAAG,UAC/F,QAAA,EAAA,QAAA,EACH;AAAA;AAAA;AAAA,SACF;AAAA,QAED,GAAA,oBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,WAAA,EAAY,GAAA,EAAU,GAAA,EAAU,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,aAAW,IAAA,EAAC;AAAA;AAAA;AAAA,GAC9F;AAEJ;AAE4BwD,UAAAA,CAAW,SAASwB,aAAAA,CAC9C;AAAA,EACE,GAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,QAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAKA,GAAA,EACA;AACA,EAAA,IAAI,OAAA,GAAUV,IAAAA;AAAA,IACZ,SAAA;AAAA,IACA,SAAS,eAAA,GAAkB,cAAA;AAAA,IAC3B;AAAA,GACF;AAEA,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,IAAA,uBACEtE,GAAAA,CAAC,IAAA,EAAA,EAAM,GAAI,KAAA,EAAuD,SAAA,EAAW,SAAS,GAAA,EACpF,QAAA,kBAAAA,IAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAO,GAAA,EAAU,QAAgB,QAAA,EAAoB,GAAA,EAAU,GAClE,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,IAAUiF,QAAA,CAAA,MAAA,EAAT,EAAiB,GAAI,KAAA,EAAgC,SAAA,EAAW,SAAS,GAAA,EACxE,QAAA,kBAAAjF,IAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAO,GAAA,EAAU,QAAgB,QAAA,EAAoB,GAAA,EAAU,GAClE,CAAA,EACF,CAAA;AAEJ,CAAC;ACrFD,IAAM,MAAA,GAAS;AAAA,EACb,GAAA,EAAK,oIAAA;AAAA,EACL,MAAA,EACE,sJAAA;AAAA,EACF,KAAA,EACE,gJAAA;AAAA,EACF,MAAA,EACE,sJAAA;AAAA,EACF,IAAA,EAAM,0IAAA;AAAA,EACN,KAAA,EACE,gJAAA;AAAA,EACF,OAAA,EACE,4JAAA;AAAA,EACF,IAAA,EAAM,0IAAA;AAAA,EACN,IAAA,EAAM,0IAAA;AAAA,EACN,GAAA,EAAK,oIAAA;AAAA,EACL,IAAA,EAAM,sHAAA;AAAA,EACN,MAAA,EACE,gIAAA;AAAA,EACF,MAAA,EACE,gIAAA;AAAA,EACF,MAAA,EACE,gIAAA;AAAA,EACF,OAAA,EACE,4JAAA;AAAA,EACF,IAAA,EAAM,0IAAA;AAAA,EACN,IAAA,EAAM,0IAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAIO,SAAS,MAAM,EAAE,KAAA,GAAQ,QAAQ,SAAA,EAAW,GAAG,OAAM,EAAwD;AAClH,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWsE,IAAAA;AAAA,QACT,SAAA;AAAA,QACA,sHAAA;AAAA,QACA,OAAO,KAAK;AAAA;AACd;AAAA,GACF;AAEJ;AAE2Bd,UAAAA,CAAW,SAAS0B,YAAAA,CAC7C;AAAA,EACE,KAAA,GAAQ,MAAA;AAAA,EACR,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIA,GAAA,EACA;AACA,EAAA,IAAI,OAAA,GAAUZ,IAAAA;AAAA,IACZ,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,IAAA,uBACEtE,GAAAA,CAAC,IAAA,EAAA,EAAM,GAAI,KAAA,EAAuD,WAAW,OAAA,EAAS,GAAA,EACpF,QAAA,kBAAAA,GAAAA,CAAC,eACC,QAAA,kBAAAA,GAAAA,CAAC,SAAM,KAAA,EAAe,QAAA,EAAS,GACjC,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA,CAAUmF,QAAA,CAAA,MAAA,EAAT,EAAiB,GAAI,KAAA,EAAgC,WAAW,OAAA,EAAS,GAAA,EACxE,QAAA,kBAAAnF,GAAAA,CAAC,eACC,QAAA,kBAAAA,GAAAA,CAAC,SAAM,KAAA,EAAe,QAAA,EAAS,GACjC,CAAA,EACF,CAAA;AAEJ,CAAC;;;ACvED,eAAA,EAAA;AAsBO,SAAS,oBAAA,CAAqB;AAAA,EACnC,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA,GAAiB,YAAA;AAAA,EACjB,OAAA,GAAU,KAAA;AAAA,EACV,YAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,uBAAuB,YAAA,IAAgB,SAAA;AAC7C,EAAA,MAAM,sBAAsB,WAAA,IAAe,QAAA;AAE3C,EAAAO,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,aAAA,CAAc,SAAS,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACER,IAAAA,CAAC4E,MAAAA,EAAA,EAAO,IAAA,EAAY,OAAA,EAAkB,WAAU,kBAAA,EAC9C,QAAA,EAAA;AAAA,oBAAA3E,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAAgD,CAAA;AAAA,oBAC/DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACb,0BAAAD,IAAAA,CAAC6E,WAAAA,EAAA,EAAY,SAAA,EAAU,sEAAA,EACrB,QAAA,EAAA;AAAA,sBAAA7E,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,4BAAA,EAA+B,cAAc,CAAA,iCAAA,CAAA,EAC1D,QAAA,EAAA,IAAA,oBAAQA,GAAAA,CAACc,SAAAA,EAAA,EAAU,SAAA,EAAU,sBAAqB,CAAA,EACrD,CAAA;AAAA,wBACAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EAAqD,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BAC1EA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAyB,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EAC9C;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,wEAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,SAAA;AAAA,YACT,SAAA,EAAU,yFAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACtFA,IAAM,QAAA,GAAiBoF,kBAGrB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,KAAQ;AAClC,EAAA,uBACEpF,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWsE,IAAAA;AAAA,QACT,sSAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,GAAA;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;AACD,QAAA,CAAS,WAAA,GAAc,UAAA;;;ACjBvB,eAAA,EAAA;ACCA,eAAA,EAAA;;;ACwMA,eAAA,EAAA;AChMA,IAAM,QAAA,GAAW,GAAA;AACjB,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,SAAA,GAAY,GAAA;AAeX,SAAS,cAAA,CAAkB;AAAA,EAChC,KAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA,GAAgB,CAAC,CAAA,EAAG,CAAC;AACvB,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIxE,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA2B,aAAa,CAAA;AACpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,IAAIA,QAAAA,iBAAsB,IAAI,KAAK,CAAA;AAC7E,EAAA,MAAM,CAAC,WAAW,YAAY,CAAA,GAAIA,SAA2B,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAEnE,EAAA,MAAM,YAAA,GAAeQ,YAAY,MAAM;AACrC,IAAA,OAAA,CAAQ,CAAC,QAAA,KAAa,IAAA,CAAK,IAAI,QAAA,GAAW,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,OAAA,CAAQ,CAAC,QAAA,KAAa,IAAA,CAAK,IAAI,QAAA,GAAW,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,QAAA,KAA8D;AAC7D,MAAA,SAAA,CAAU,SAAS,WAAW,CAAA;AAC9B,MAAA,OAAA,CAAQ,SAAS,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA,CAAY,CAAC,EAAA,EAAY,EAAA,KAAe;AACxD,IAAA,YAAA,CAAa,CAAC,QAAA,KAAa,CAAC,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AAAA,EACjE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,YAAA,GAAe+E,QAAQ,MAA6B;AACxD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAiB;AAErC,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAAA,MACtB;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9B,CAAC,CAAA;AAED,IAAA,OAAO,KAAA,CAAM,KAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAChC,MAAA,CAAO,CAAC,CAAC,IAAI,MAAM,iBAAA,CAAkB,IAAI,CAAC,CAAA,CAC1C,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,WAAW,CAAA,MAAO;AAAA,MAC7B,IAAA;AAAA,MACA,KAAA,EAAO,WAAA;AAAA,MACP,WAAA,EAAa,kBAAkB,IAAI;AAAA,KACrC,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,KAAA,EAAO,aAAA,EAAe,iBAAiB,CAAC,CAAA;AAE5C,EAAA,MAAM,cAAA,GAAiBA,OAAAA;AAAA,IACrB,MAAM,YAAA,CAAa,GAAA,CAAI,CAAC,UAAA,KAAe,WAAW,IAAI,CAAA;AAAA,IACtD,CAAC,YAAY;AAAA,GACf;AACA,EAAA,MAAM,kBAAA,GAAqBA,OAAAA;AAAA,IACzB,MAAM,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA;AAAA,IAC7B,CAAC,cAAc;AAAA,GACjB;AAGA,EAAA9E,UAAU,MAAM;AACd,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAEjC,IAAA,kBAAA,iBAAmB,IAAI,KAAK,CAAA;AAE5B,IAAA,MAAM,SAA0C,EAAC;AACjD,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AACtC,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,kBAAA,CAAmB,CAAC,6BAAa,IAAI,GAAA,CAAI,CAAC,GAAG,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AAAA,MAC/D,CAAA,EAAG,QAAQ,GAAG,CAAA;AACd,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,OAAO,MAAM,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAA,MAAM,aAAA,GAAgBD,WAAAA;AAAA,IACpB,CAAC,KAAA,KAA0B;AACzB,MAAA,MAAM,QAAA,GAAW,SAAS,EAAA,GAAK,EAAA,GAAK,SAAS,CAAA,GAAI,EAAA,GAAK,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AACvE,MAAA,OAAO,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAGA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,UAAA,KAA+B;AAC9B,MAAA,MAAM,QAAA,GAAW,UAAA,GAAa,EAAA,GAAK,EAAA,GAAK,CAAA;AACxC,MAAA,MAAM,UAAA,GAAa,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC5C,MAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IAEA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IAEA,aAAA;AAAA,IACA,gBAAA;AAAA,IAEA,eAAA;AAAA,IAEA,YAAA;AAAA,IAEA,aAAA;AAAA,IACA;AAAA,GACF;AACF;ACvIA,IAAM,uBAAA,GAA0B,2BAAA;AAChC,IAAM,wBAAA,GAA2B,SAAA;AAEjC,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,cAAA,GAAiB,GAAA;AAgCvB,SAAS,iBAAA,CACP;AAAA,EACE,YAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA,GAAoB,OAAA;AAAA,EACpB,cAAA,GAAiB,UAAA;AAAA,EACjB,SAAA,GAAY;AACd,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIR,SAAsC,IAAI,CAAA;AACxE,EAAA,MAAM,MAAA,GAASO,OAAsB,IAAI,CAAA;AACzC,EAAA,MAAM,SAAA,GAAYA,OAOR,IAAI,CAAA;AAEd,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,WAAA,GAAc;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAU,CAAA;AACvC,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAClB,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,IAAI,CAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,WAAA,EAAY;AACZ,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,eAAA,GAAkBD,WAAAA;AAAA,IACtB,CAAC,KAAA,KAA2C;AAC1C,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,MAAA,SAAA,CAAU,OAAA,GAAU;AAAA,QAClB,MAAA,EAAQ,IAAA;AAAA,QACR,QAAQ,KAAA,CAAM,OAAA;AAAA,QACd,QAAQ,KAAA,CAAM,OAAA;AAAA,QACd,OAAO,KAAA,CAAM,OAAA;AAAA,QACb,OAAO,KAAA,CAAM,OAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,KAAA,KAA2C;AAC1C,MAAA,IAAI,CAAC,SAAA,CAAU,OAAA,EAAS,MAAA,IAAU,CAAC,OAAO,OAAA,EAAS;AAEnD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA;AAClD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA;AAElD,MAAA,IAAI,CAAC,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS;AAC9B,QAAA,IAAI,IAAA,CAAK,IAAI,OAAO,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,GAAI,CAAA,EAAG;AACpD,QAAA,SAAA,CAAU,QAAQ,OAAA,GAAU,IAAA;AAAA,MAC9B;AAEA,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAA;AAC7C,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAA;AAE7C,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAsB;AAClD,MAAA,MAAM,eAAe,aAAA,GAAgB,IAAA;AACrC,MAAA,MAAM,UAAA,GAAa,eAAe,IAAA,CAAK,KAAA;AAEvC,MAAA,KAAA,CAAM,EAAA,GAAK,UAAA,EAAY,EAAA,GAAK,UAAU,CAAA;AACtC,MAAA,SAAA,CAAU,OAAA,CAAQ,QAAQ,KAAA,CAAM,OAAA;AAChC,MAAA,SAAA,CAAU,OAAA,CAAQ,QAAQ,KAAA,CAAM,OAAA;AAAA,IAClC,CAAA;AAAA,IACA,CAAC,MAAM,KAAK;AAAA,GACd;AAEA,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,SAAA,CAAU,QAAQ,MAAA,GAAS,KAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,OAAO,SAAA,CAAU,SAAS,OAAA,KAAY,IAAA;AAAA,EACxC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,CAAC,QAAA,KAA6B;AACpD,IAAA,MAAM,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC3C,IAAA,MAAM,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC3C,IAAA,MAAM,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC3C,IAAA,OAAO,CAAA,KAAA,EAAQ,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB+E,QAAQ,MAAM;AAClC,IAAA,MAAMC,OAAAA,uBAAa,GAAA,EAAoB;AACvC,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,KAAA,EAAO,IAAA,KAAS;AACtC,MAAAA,OAAAA,CAAO,GAAA,CAAI,IAAA,EAAM,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,IACzC,CAAC,CAAA;AACD,IAAA,OAAOA,OAAAA;AAAA,EACT,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,iBAAA,GAAoBD,QAAQ,MAAM;AACtC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,mBAAA;AAAA,MACN,UAAU,OAAA,CAAQ;AAAA,KACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,UAAA,GAAaA,QAAQ,MAAM;AAC/B,IAAA,IAAI,CAAC,mBAAmB,OAAO,IAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,cAAA,KAAmB,WAAA,GAAc,YAAA,KAAiB,WAAA,EAAY;AAC3E,IAAA,OAAO,KAAK,OAAA,CAAQ,CAAC,aAAA,EAAe,cAAc,GAAG,iBAAiB,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAEtC,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,IAAA,OAAO,QAAQ,UAAU,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,gBAAA,GAAmBA,QAAQ,MAAM;AACrC,IAAA,OAAO,IAAI,IAAI,YAAA,CAAa,GAAA,CAAI,CAAC,UAAA,KAAe,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,kBAAA,GAAqBA,QAAQ,MAAM;AACvC,IAAA,OAAO,aAAa,IAAA,CAAK,CAAC,eAAe,cAAA,GAAiB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EAC5E,CAAA,EAAG,CAAC,YAAA,EAAc,cAAc,CAAC,CAAA;AAEjC,EAAA,MAAM,YAAA,GAAeA,QAAQ,MAAM;AACjC,IAAA,MAAM,QAAQ,aAAA,GAAgB,IAAA;AAC9B,IAAA,MAAM,SAAS,cAAA,GAAiB,IAAA;AAChC,IAAA,MAAM,CAAA,GAAA,CAAK,aAAA,GAAgB,KAAA,IAAS,CAAA,GAAI,UAAU,CAAC,CAAA;AACnD,IAAA,MAAM,CAAA,GAAA,CAAK,cAAA,GAAiB,MAAA,IAAU,CAAA,GAAI,UAAU,CAAC,CAAA;AACrD,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,EAAO;AAAA,EAC/B,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,YAAA,CAAa,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,CAAC,CAAA,CAAA,EAAI,YAAA,CAAa,KAAK,CAAA,CAAA,EAAI,YAAA,CAAa,MAAM,CAAA,CAAA;AAEhG,EAAA,uBACErF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAU,2IAAA;AAAA,MACV,aAAA,EAAY,YAAA;AAAA,MAEZ,QAAA,kBAAAD,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,MAAA;AAAA,UACL,OAAA;AAAA,UACA,SAAA,EAAU,qDAAA;AAAA,UACV,YAAA,EAAY,SAAA;AAAA,UACZ,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,YAAY,aAAA,EAAc;AAAA,UACxD,WAAA,EAAa,eAAA;AAAA,UACb,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,aAAA;AAAA,UACX,YAAA,EAAc,aAAA;AAAA,UAEd,QAAA,EAAA;AAAA,4BAAAA,KAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,aAAA,EAAc,CAAA,EAAE,QAAO,CAAA,EAAE,MAAA,EAAO,KAAA,EAAM,MAAA,EAAO,MAAA,EAAO,MAAA,EAC7D,0BAAAA,GAAAA,CAAC,cAAA,EAAA,EAAa,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,YAAA,EAAa,GAAA,EAAI,UAAA,EAAW,MAAA,EAAO,YAAA,EAAa,KAAA,EAAM,CAAA,EACpF,CAAA;AAAA,8BACAA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,gBAAe,CAAA,EAAE,IAAA,EAAK,GAAE,IAAA,EAAK,KAAA,EAAM,QAAO,MAAA,EAAO,MAAA,EAC1D,0BAAAA,GAAAA,CAAC,eAAA,EAAA,EAAc,MAAK,UAAA,EAAW,MAAA,EAAO,OAAM,CAAA,EAC9C,CAAA;AAAA,8BACAA,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,aAAA,EAAc,CAAA,EAAE,MAAA,EAAO,CAAA,EAAE,MAAA,EAAO,KAAA,EAAM,MAAA,EAAO,MAAA,EAAO,MAAA,EAC7D,0BAAAA,GAAAA,CAAC,cAAA,EAAA,EAAa,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,YAAA,EAAa,GAAA,EAAI,UAAA,EAAW,MAAA,EAAO,YAAA,EAAa,KAAA,EAAM,CAAA,EACpF,CAAA;AAAA,8BAEAA,GAAAA,CAAC,UAAA,EAAA,EAAS,EAAA,EAAG,kBACX,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,CAAA,EAAG,aAAa,CAAA,GAAI,CAAA;AAAA,kBACpB,CAAA,EAAG,aAAa,CAAA,GAAI,CAAA;AAAA,kBACpB,KAAA,EAAO,aAAa,KAAA,GAAQ,CAAA;AAAA,kBAC5B,MAAA,EAAQ,aAAa,MAAA,GAAS;AAAA;AAAA,eAChC,EACF;AAAA,aAAA,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAS,sBAAA,EACX,QAAA,EAAA,OAAA,IAAW,aAAA,GACR,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU;AACvC,cAAA,MAAM,aAAa,OAAA,CAAQ,UAAA,GAAa,iBAAiB,CAAA,IAAK,OAAA,CAAQ,YAAY,IAAA,IAAQ,EAAA;AAC1F,cAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA;AAChD,cAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA,IAAK,uBAAA;AACtD,cAAA,MAAM,QAAA,GAAW,iBAAiB,UAAU,CAAA;AAC5C,cAAA,MAAM,YAAY,aAAA,KAAkB,UAAA;AACpC,cAAA,MAAM,QAAA,GAAW,kBAAA,IAAsB,CAAC,QAAA,IAAY,QAAA;AACpD,cAAA,MAAM,QAAA,GAAW,cAAc,OAAqC,CAAA;AAEpE,cAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,cAAA,uBACEA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBAEC,CAAA,EAAG,QAAA;AAAA,kBACH,QAAA,EAAS,SAAA;AAAA,kBACT,aAAA,EAAa,WAAW,UAAA,GAAa,MAAA;AAAA,kBACrC,YAAA,EAAc,MAAM,QAAA,IAAY,aAAA,CAAc,UAAU,CAAA;AAAA,kBACxD,YAAA,EAAc,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,kBACtC,SAAS,MAAM;AACb,oBAAA,IAAI,QAAA,IAAY,CAAC,aAAA,EAAc,EAAG;AAChC,sBAAA,aAAA,CAAc,UAAU,CAAA;AAAA,oBAC1B;AAAA,kBACF,CAAA;AAAA,kBACA,IAAA,EACE,QAAA,GACI,SAAA,GACE,WAAA,GACA,QAAA,GACE,WAAA,GACA,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA,IAAK,eAAA,CAAgB,WAAW,CAAA,GAChE,uBAAA;AAAA,kBAEN,MAAA,EAAQ,QAAA,GAAW,MAAA,GAAS,QAAA,GAAW,0BAAA,GAA6B,0BAAA;AAAA,kBACpE,WAAA,EAAA,CAAc,QAAA,GAAW,GAAA,GAAM,GAAA,IAAO,IAAA;AAAA,kBACtC,MAAA,EAAQ,QAAA,GAAW,mBAAA,GAAsB,QAAA,GAAW,oBAAA,GAAuB,MAAA;AAAA,kBAC3E,OAAA,EAAS,WAAW,IAAA,GAAO,CAAA;AAAA,kBAC3B,KAAA,EAAO;AAAA,oBACL,UAAA,EAAY,mCAAA;AAAA,oBACZ,MAAA,EAAQ,WAAW,SAAA,GAAY;AAAA;AACjC,iBAAA;AAAA,gBA3BK,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,eA4B7B;AAAA,YAEJ,CAAC,IACD,IAAA,EACJ,CAAA;AAAA,YAEC,UAAA,GACG,YAAA,CAAa,GAAA,CAAI,CAAC,UAAA,KAAe;AAC/B,cAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,UAAA,CAAW,WAAW,CAAA;AAC/C,cAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,cAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,KAAA;AACf,cAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AACtD,cAAA,MAAM,UAAA,GAAa,aAAA,CAAc,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AACxD,cAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,wBAAA;AAC3D,cAAA,MAAM,QAAA,GAAW,cAAA,GAAiB,UAAA,CAAW,IAAI,CAAA;AACjD,cAAA,MAAM,QAAA,GAAW,sBAAsB,CAAC,QAAA;AAExC,cAAA,uBACEA,GAAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAW,CAAA,UAAA,EAAa,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAA;AAAA,kBAC/B,eAAa,UAAA,CAAW,IAAA;AAAA,kBACxB,aAAA,EAAa,CAAA,OAAA,EAAU,UAAA,CAAW,IAAI,CAAA,CAAA;AAAA,kBACtC,YAAA,EAAc,MAAM,aAAA,CAAc,UAAA,CAAW,IAAI,CAAA;AAAA,kBACjD,YAAA,EAAc,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,kBACtC,SAAS,MAAM;AACb,oBAAA,IAAI,CAAC,eAAc,EAAG;AACpB,sBAAA,aAAA,CAAc,WAAW,IAAI,CAAA;AAAA,oBAC/B;AAAA,kBACF,CAAA;AAAA,kBAEA,QAAA,kBAAAD,IAAAA;AAAA,oBAAC,GAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO;AAAA,wBACL,SAAA,EAAW,aAAa,UAAA,GAAa,UAAA;AAAA,wBACrC,eAAA,EAAiB,KAAA;AAAA,wBACjB,OAAA,EAAS,UAAA,GAAc,QAAA,GAAW,IAAA,GAAO,CAAA,GAAK,CAAA;AAAA,wBAC9C,UAAA,EAAY,4CAAA;AAAA,wBACZ,MAAA,EAAQ;AAAA,uBACV;AAAA,sBACA,MAAA,EAAQ,WAAW,mBAAA,GAAsB,MAAA;AAAA,sBAExC,QAAA,EAAA;AAAA,wBAAA,QAAA,mBACCC,GAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,GAAG,UAAA,GAAa,CAAA;AAAA,4BAChB,IAAA,EAAK,MAAA;AAAA,4BACL,MAAA,EAAO,MAAA;AAAA,4BACP,WAAA,EAAa,CAAA;AAAA,4BACb,OAAA,EAAS;AAAA;AAAA,4CAGXA,GAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,GAAG,UAAA,GAAa,CAAA;AAAA,4BAChB,IAAA,EAAK,MAAA;AAAA,4BACL,MAAA,EAAQ,WAAA;AAAA,4BACR,WAAA,EAAa,CAAA;AAAA,4BACb,OAAA,EAAS,WAAW,CAAA,GAAI,GAAA;AAAA,4BACxB,SAAA,EAAW,WAAW,MAAA,GAAY,cAAA;AAAA,4BAClC,KAAA,EAAO,QAAA,GAAW,MAAA,GAAY,EAAE,mBAAmB,IAAA;AAAK;AAAA,yBAC1D;AAAA,wCAEFA,GAAAA;AAAA,0BAAC,QAAA;AAAA,0BAAA;AAAA,4BACC,CAAA,EAAG,UAAA;AAAA,4BACH,IAAA,EAAM,WAAA;AAAA,4BACN,MAAA,EAAQ,WAAW,MAAA,GAAS,WAAA;AAAA,4BAC5B,WAAA,EAAa,WAAW,CAAA,GAAI,CAAA;AAAA,4BAC5B,SAAA,EAAU,mBAAA;AAAA,4BACV,KAAA,EAAO;AAAA,8BACL,MAAA,EAAQ,QAAA,GAAW,+BAAA,GAAkC,QAAA,GAAW,+BAAA,GAAkC;AAAA;AACpG;AAAA,yBACF;AAAA,wBACC,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAA,oBACzBA,GAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,UAAA,EAAW,QAAA;AAAA,4BACX,gBAAA,EAAiB,SAAA;AAAA,4BACjB,KAAA,EAAO;AAAA,8BACL,UAAA,EAAY,WAAA;AAAA,8BACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,8BAChC,UAAA,EAAY,MAAA;AAAA,8BACZ,IAAA,EAAM,MAAA;AAAA,8BACN,aAAA,EAAe,MAAA;AAAA,8BACf,OAAA,EAAS,WAAW,GAAA,GAAM;AAAA,6BAC5B;AAAA,4BAEC,qBAAW,KAAA,CAAM;AAAA;AAAA;AACpB;AAAA;AAAA;AAEJ,iBAAA;AAAA,gBAnEK,UAAA,CAAW;AAAA,eAoElB;AAAA,YAEJ,CAAC,CAAA,GACD;AAAA;AAAA;AAAA;AACN;AAAA,GACF;AAEJ;AAEO,IAAM,YAAA,GAAeqE,eAAAA,CAAM,UAAA,CAAW,iBAAiB,CAAA;AC7WvD,IAAM,kBAAkBA,eAAAA,CAAM,UAAA;AAAA,EACnC,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,QAAA,EAAU,SAAA,EAAW,MAAA,EAAO,EAAG,GAAA,KAAQ;AAChE,IAAA,uBACEtE,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAU,qBAAA;AAAA,QACV,aAAA,EAAY,mBAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,QAAA;AAAA,cACT,UAAU,IAAA,IAAQ,OAAA;AAAA,cAClB,SAAA,EAAU,iGAAA;AAAA,cACV,YAAA,EAAY,QAAQ,MAAA,IAAU,SAAA;AAAA,cAC9B,aAAA,EAAY,gBAAA;AAAA,cAEZ,QAAA,kBAAAA,GAAAA,CAACC,QAAAA,EAAA,EAAS,WAAU,0CAAA,EAA2C;AAAA;AAAA,WACjE;AAAA,0BACAD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,SAAA;AAAA,cACT,UAAU,IAAA,IAAQ,OAAA;AAAA,cAClB,SAAA,EAAU,iGAAA;AAAA,cACV,YAAA,EAAY,QAAQ,OAAA,IAAW,UAAA;AAAA,cAC/B,aAAA,EAAY,iBAAA;AAAA,cAEZ,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,0CAAA,EAA2C;AAAA;AAAA,WAClE;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDACb,QAAA,kBAAAD,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,sDAAA;AAAA,cACV,aAAA,EAAY,YAAA;AAAA,cAEX,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,gBAAE;AAAA;AAAA;AAAA,WAC1B,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AAEA,eAAA,CAAgB,WAAA,GAAc,iBAAA;ACL9B,SAAS,sBAAA,CACP;AAAA,EACE,KAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,eAAA,GAA4C;AAAA,IAChD,KAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAA,GAAW,eAAe,eAAe,CAAA;AAE/C,EAAA,MAAM,cAAA,GAAiBsF,QAAQ,MAAM;AACnC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,QAAA,CAAS,YAAA,CAAa,OAAA,CAAQ,CAAC,UAAA,KAAe;AAC5C,MAAA,QAAA,CAAS,IAAI,UAAA,CAAW,IAAA,EAAM,cAAA,CAAe,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAC/D,CAAC,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,CAAS,YAAA,EAAc,cAAc,CAAC,CAAA;AAE1C,EAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KAAiB;AAC1C,IAAA,cAAA,GAAiB,IAAI,CAAA;AAAA,EACvB,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAM;AACtC,IAAA,IAAI,CAAC,QAAA,CAAS,aAAA,EAAe,OAAO,IAAA;AACpC,IAAA,OAAO,SAAS,YAAA,CAAa,IAAA;AAAA,MAC3B,CAAC,UAAA,KAAe,UAAA,CAAW,IAAA,KAAS,QAAA,CAAS;AAAA,KAC/C,IAAK,IAAA;AAAA,EACP,GAAG,CAAC,QAAA,CAAS,aAAA,EAAe,QAAA,CAAS,YAAY,CAAC,CAAA;AAGlD,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,IAAA,MAAM,eAAA,GAAkB,cAAA,IAAkB,QAAA,CAAS,YAAA,CAAa,IAAA;AAAA,MAC9D,CAAC,UAAA,KAAe,cAAA,CAAe,UAAA,CAAW,IAAI;AAAA,KAChD;AAEA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,aAAA,GAAgB,SAAS,YAAA,CAAa,MAAA;AAAA,QAC1C,CAAC,UAAA,KAAe,cAAA,CAAgB,UAAA,CAAW,IAAI;AAAA,OACjD;AACA,MAAA,MAAM,kBAAkB,aAAA,CAAc,MAAA;AAAA,QACpC,CAAC,GAAA,EAAK,UAAA,KAAe,GAAA,GAAM,WAAW,KAAA,CAAM,MAAA;AAAA,QAAQ;AAAA,OACtD;AACA,MAAA,OAAO,aAAA,CAAc,MAAM,MAAA,EAAQ,QAAA,CAAS,aAAa,MAAA,EAAQ,eAAA,EAAiB,cAAc,MAAM,CAAA;AAAA,IACxG;AAEA,IAAA,OAAO,aAAA,CAAc,KAAA,CAAM,MAAA,EAAQ,QAAA,CAAS,aAAa,MAAM,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,aAAA,EAAe,cAAA,EAAgB,SAAS,YAAA,EAAc,KAAA,CAAM,MAAM,CAAC,CAAA;AAEvE,EAAA,uBACErF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,CAAA,UAAA,EAAa,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MACvC,aAAA,EAAY,+BAAA;AAAA,MAEZ,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,cAAc,QAAA,CAAS,YAAA;AAAA,YACvB,cAAA;AAAA,YACA,iBAAiB,QAAA,CAAS,eAAA;AAAA,YAC1B,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,WAAW,QAAA,CAAS,SAAA;AAAA,YACpB,eAAe,QAAA,CAAS,aAAA;AAAA,YACxB,OAAO,QAAA,CAAS,SAAA;AAAA,YAChB,eAAe,QAAA,CAAS,gBAAA;AAAA,YACxB,aAAA,EAAe,iBAAA;AAAA,YACf,cAAA;AAAA,YACA,eAAe,QAAA,CAAS,aAAA;AAAA,YACxB,aAAa,QAAA,CAAS,WAAA;AAAA,YACtB,UAAA;AAAA,YACA,iBAAA;AAAA,YACA,cAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,SAAS,QAAA,CAAS,QAAA;AAAA,YAClB,SAAS,QAAA,CAAS,QAAA;AAAA,YAClB,UAAU,QAAA,CAAS,YAAA;AAAA,YACnB,WAAW,QAAA,CAAS,aAAA;AAAA,YACpB,MAAA,EAAQ;AAAA;AAAA,SACV,EACF,CAAA;AAAA,QAGC,QAAA,CAAS,aAAA,IAAiB,iBAAA,IAAqB,kBAAA,oBAC9CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EACZ,QAAA,EAAA,kBAAA,CAAmB,QAAA,CAAS,aAAA,EAAe,iBAAA,CAAkB,KAAK,CAAA,EACrE,CAAA;AAAA,QAID,+BACCA,GAAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,sDAAA,EACb,QAAA,EAAA,WAAA,EACH,GACF,CAAA,EACF;AAAA,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;AAEiCqE,eAAAA,CAAM,UAAA,CAAW,sBAAsB;AC9KxE,IAAM,oBAAA,GAAuB,SAAA;AAWtB,IAAM,eAAeA,eAAAA,CAAM,UAAA;AAAA,EAChC,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,UAAU,MAAA,EAAQ,QAAA,GAAW,CAAA,EAAE,EAAG,GAAA,KAAQ;AACxE,IAAA,uBACEtE,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAU,+BAAA;AAAA,QACV,aAAA,EAAY,YAAA;AAAA,QAEZ,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6DAAA,EACX,iBAAO,KAAA,EACV,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACtC,cAAA,MAAM,OAAA,GAAU,UAAA,GAAa,IAAA,CAAK,IAAI,CAAA;AACtC,cAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK,oBAAA;AAC/C,cAAA,MAAM,YAAA,GAAe,QAAA,GAAW,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,IAAA;AAEnD,cAAA,uBACEA,IAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBAEC,SAAA,EAAU,yBAAA;AAAA,kBACV,aAAA,EAAa,CAAA,YAAA,EAAe,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,kBAEpC,QAAA,EAAA;AAAA,oBAAA,OAAA;AAAA;AAAA,sCAECC,GAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BACC,GAAA,EAAK,OAAA;AAAA,0BACL,KAAK,IAAA,CAAK,IAAA;AAAA,0BACV,SAAA,EAAU;AAAA;AAAA;AACZ,wCAEAA,GAAAA;AAAA,sBAAC,KAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,sBAAA;AAAA,wBACV,KAAA,EAAO,EAAE,eAAA,EAAiB,WAAA,EAAY;AAAA,wBACtC,aAAA,EAAa,CAAA,aAAA,EAAgB,IAAA,CAAK,IAAI,CAAA;AAAA;AAAA,qBACxC;AAAA,oCAEFD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,sBAAA,YAAA;AAAA,sBAAa,IAAA;AAAA,sBAAG,IAAA,CAAK,KAAA;AAAA,sBAAM;AAAA,qBAAA,EAC9B;AAAA;AAAA,iBAAA;AAAA,gBApBK,IAAA,CAAK;AAAA,eAqBZ;AAAA,YAEJ,CAAC,CAAA;AAAA,YACA,MAAM,MAAA,GAAS,QAAA,oBACdA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EAAuD,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAClE,MAAM,MAAA,GAAS,QAAA;AAAA,cAAS,GAAA;AAAA,cAAE,MAAA,CAAO;AAAA,aAAA,EACrC;AAAA,WAAA,EAEJ;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;AC1DpB,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,2BAAA;AAAA,EACX,QAAA,GAAW,UAAA;AAAA,EACX,IAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEA,IAAAA,CAAAU,QAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAT,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uEAAA;AAAA,QACV,OAAA,EAAS,OAAA;AAAA,QACT,aAAA,EAAY;AAAA;AAAA,KACd;AAAA,oBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,mDAAA,EAAsD,QAAQ,CAAA,kSAAA,CAAA,EAE5E,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,mDAAA,EAAsD,QAAQ,CAAA,WAAA,CAAA,EAAe,CAAA;AAAA,sBAG7FD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,4EAAA,EAA+E,QAAQ,mDACpG,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,0BACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kEAAA,EAAoE,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,YACvF,4BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAuD,QAAA,EAAA,QAAA,EAAS;AAAA,WAAA,EAEjF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,OAAA;AAAA,YACT,YAAA,EAAW,OAAA;AAAA,YACX,SAAA,EAAU,qKAAA;AAAA,YACV,aAAA,EAAY,qBAAA;AAAA,YAEZ,QAAA,kBAAAA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC,OAAA,EACF,CAAA;AAAA,sBAGAhE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EAA+F,CAAA;AAAA,MAG7G,IAAA;AAAA,sBAGDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACZ,QAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC5EO,IAAMuD,KAAAA,GAAOC,UAAAA,CAGlB,SAASD,KAAAA,CAAK,OAAO,GAAA,EAAK;AAC1B,EAAA,uBAAOvD,GAAAA,CAACuF,QAAAA,EAAA,EAAS,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AACxC,CAAC,CAAA;ACFD,IAAMC,OAAAA,GAAS;AAAA,EACb,IAAA,EAAM;AAAA,IACJ,kGAAA;AAAA,IACA,iCAAA;AAAA,IACA,sIAAA;AAAA,IACA,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,KAAA,EAAO,CAAC,8BAA8B,CAAA;AAAA,EACtC,OAAA,EAAS;AAAA,IACP,+DAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,oDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,WAAA,EAAa,CAAC,0CAA0C,CAAA;AAAA,IACxD,KAAA,EAAO;AAAA,MACL;AAAA,KACF;AAAA,IACA,YAAA,EAAc;AAAA,MACZ;AAAA,KACF;AAAA,IACA,IAAA,EAAM,CAAC,0CAA0C,CAAA;AAAA,IACjD,KAAA,EAAO,CAAC,yCAAyC,CAAA;AAAA,IACjD,IAAA,EAAM,CAAC,0CAA0C,CAAA;AAAA,IACjD,MAAA,EAAQ,CAAC,8CAA8C,CAAA;AAAA,IACvD,IAAA,EAAM,CAAC,6CAA6C,CAAA;AAAA,IACpD,GAAA,EAAK,CAAC,wCAAwC,CAAA;AAAA,IAC9C,MAAA,EAAQ,CAAC,8CAA8C,CAAA;AAAA,IACvD,KAAA,EAAO,CAAC,gDAAgD,CAAA;AAAA,IACxD,MAAA,EAAQ,CAAC,mDAAmD,CAAA;AAAA,IAC5D,IAAA,EAAM,CAAC,6CAA6C,CAAA;AAAA,IACpD,KAAA,EAAO,CAAC,4CAA4C,CAAA;AAAA,IACpD,OAAA,EAAS,CAAC,gDAAgD,CAAA;AAAA,IAC1D,IAAA,EAAM,CAAC,0CAA0C,CAAA;AAAA,IACjD,GAAA,EAAK,CAAC,wCAAwC,CAAA;AAAA,IAC9C,IAAA,EAAM,CAAC,0CAA0C,CAAA;AAAA,IACjD,KAAA,EAAO,CAAC,4CAA4C,CAAA;AAAA,IACpD,MAAA,EAAQ,CAAC,qDAAqD,CAAA;AAAA,IAC9D,MAAA,EAAQ,CAAC,8CAA8C,CAAA;AAAA,IACvD,MAAA,EAAQ,CAAC,8CAA8C,CAAA;AAAA,IACvD,OAAA,EAAS,CAAC,gDAAgD,CAAA;AAAA,IAC1D,IAAA,EAAM,CAAC,0CAA0C,CAAA;AAAA,IACjD,IAAA,EAAM,CAAC,0CAA0C;AAAA;AAErD,CAAA;AAmBsBhC,UAAAA,CAAW,SAASC,OAAAA,CACxC;AAAA,EACE,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,kBAAA,EAAoB,eAAA;AAAA,EACpB,WAAA,EAAa,QAAA;AAAA,EACb,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAUa,IAAAA;AAAA,IACd,SAAA;AAAA,IACAkB,OAAAA,CAAO,IAAA;AAAA,IACP,OAAA,GACIA,OAAAA,CAAO,OAAA,GACP,KAAA,GACEA,OAAAA,CAAO,KAAA,GACPlB,IAAAA,CAAKkB,OAAAA,CAAO,KAAA,EAAOA,OAAAA,CAAO,MAAA,CAAO,KAAA,IAAS,OAAO,CAAC;AAAA,GAC1D;AAGA,EAAA,MAAM,kBAAA,GAAqB;AAAA,IACzB,YAAA,EAAc,SAAA;AAAA,IACd,kBAAA,EAAoB,eAAA;AAAA,IACpB,aAAa,QAAA,IAAY,OAAA;AAAA,IACzB,GAAI,OAAA,IAAW,EAAE,QAAA,EAAU,IAAA;AAAK,GAClC;AAEA,EAAA,OAAO,MAAA,IAAU,wBACfxF,GAAAA;AAAA,IAACuD,KAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACH,GAAG,kBAAA;AAAA,MACJ,SAAA,EAAW,OAAA;AAAA,MACX,GAAA;AAAA,MAEA,QAAA,kBAAAxD,IAAAA,CAAC0F,YAAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCzF,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iGAAA;AAAA,YACV,aAAA,EAAY;AAAA;AAAA,SACd;AAAA,QAED;AAAA,OAAA,EACH;AAAA;AAAA,sBAGFA,GAAAA;AAAA,IAAU0F,QAAA,CAAA,MAAA;AAAA,IAAT;AAAA,MACE,GAAG,KAAA;AAAA,MACH,GAAG,kBAAA;AAAA,MACJ,SAAA,EAAW,OAAA;AAAA,MACX,GAAA;AAAA,MAEA,QAAA,kBAAA3F,IAAAA,CAAC0F,YAAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,OAAA,oBACCzF,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iGAAA;AAAA,YACV,aAAA,EAAY;AAAA;AAAA,SACd;AAAA,QAED;AAAA,OAAA,EACH;AAAA;AAAA,GACF;AAEJ,CAAC;AAKM,SAASyF,YAAAA,CAAY,EAAE,QAAA,EAAS,EAAkC;AACvE,EAAA,uBACE1F,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,0GAAA;AAAA,QACV,aAAA,EAAY;AAAA;AAAA,KACd;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;ACrIA,IAAM,YAAY,CAAC,MAAA,EAAQ,gBAAA,EAAkB,OAAA,EAAS,QAAQ,MAAM,CAAA;AAG/CwD,UAAAA,CAAW,SAASmC,MAAAA,CACvC;AAAA,EACE,SAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,kBAAA,EAAoB,eAAA;AAAA,EACpB,cAAA,EAAgB,WAAA;AAAA,EAChB,eAAA,EAAiB,YAAA;AAAA,EACjB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAkBA,GAAA,EACA;AACA,EAAA,uBACE3F,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,SAAA;AAAA,MACV,WAAWsE,IAAAA,CAAK;AAAA,QACd,SAAA;AAAA;AAAA,QAEA,uBAAA;AAAA;AAAA,QAEA,kLAAA;AAAA;AAAA,QAEA;AAAA,OACD,CAAA;AAAA,MAED,QAAA,kBAAAtE,GAAAA;AAAA,QAAU4F,QAAA,CAAA,KAAA;AAAA,QAAT;AAAA,UACC,GAAA;AAAA,UACC,GAAG,KAAA;AAAA,UACJ,YAAA,EAAY,SAAA;AAAA,UACZ,kBAAA,EAAkB,eAAA;AAAA,UAClB,gBAAc,WAAA,IAAe,OAAA;AAAA,UAC7B,iBAAe,YAAA,IAAgB,QAAA;AAAA,UAC/B,KAAA,EAAO;AAAA,YACL,GAAG,KAAA,CAAM,KAAA;AAAA;AAAA,YAET,eAAA,EAAiB,OAAA;AAAA,YACjB,kBAAA,EAAoB;AAAA,WACtB;AAAA,UACA,WAAWtB,IAAAA,CAAK;AAAA;AAAA,YAEd,MAAM,IAAA,IACJ,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK;AAAA,cAChC,+CAAA;AAAA,cACA,gDAAA;AAAA,cACA,wCAAA;AAAA,cACA,gCAAA;AAAA,cACA,2CAAA;AAAA,cACA,4CAAA;AAAA,cACA,0CAAA;AAAA,cACA,2CAAA;AAAA,cACA,6CAAA;AAAA,cACA,6CAAA;AAAA,cACA,kDAAA;AAAA,cACA;AAAA,aACF;AAAA;AAAA,YAEF,kFAAA;AAAA;AAAA,YAEA,oHAAA;AAAA;AAAA,YAEA,8GAAA;AAAA;AAAA,YAEA,gCAAA;AAAA;AAAA,YAEA,oBAAA;AAAA;AAAA,YAEA,iJAAA;AAAA;AAAA,YAEA,mJAAA;AAAA;AAAA,YAEA,kBAAA;AAAA;AAAA,YAEA,0FAAA;AAAA,YACA,sGAAA;AAAA,YACA,sGAAA;AAAA,YACA,wGAAA;AAAA,YACA,+GAAA;AAAA,YACA,2HAAA;AAAA,YACA,2HAAA;AAAA,YACA;AAAA,WACD;AAAA;AAAA;AACH;AAAA,GACF;AAEJ,CAAC;ACrGqBd,UAAAA,CAAW,SAASqC,OAAAA,CACxC;AAAA,EACE,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,uBACE9F,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,SAAA;AAAA,MACV,WAAWuE,IAAAA,CAAK;AAAA,QACd,SAAA;AAAA;AAAA,QAEA,6BAAA;AAAA;AAAA,QAEA,oFAAA;AAAA;AAAA,QAEA,oBAAA;AAAA;AAAA,QAEA,gLAAA;AAAA;AAAA,QAEA;AAAA,OACD,CAAA;AAAA,MAED,QAAA,EAAA;AAAA,wBAAAtE,GAAAA;AAAA,UAAU8F,QAAA,CAAA,MAAA;AAAA,UAAT;AAAA,YACC,GAAA;AAAA,YACA,QAAA;AAAA,YACC,GAAG,KAAA;AAAA,YACJ,WAAWxB,IAAAA,CAAK;AAAA;AAAA,cAEd,mEAAA;AAAA;AAAA,cAEA,WAAW,gBAAA,GAAmB,8BAAA;AAAA;AAAA,cAE9B,4BAAA;AAAA;AAAA,cAEA,oHAAA;AAAA;AAAA,cAEA,8GAAA;AAAA;AAAA,cAEA,mDAAA;AAAA;AAAA,cAEA,oBAAA;AAAA;AAAA,cAEA,iJAAA;AAAA;AAAA,cAEA;AAAA,aACD;AAAA;AAAA,SACH;AAAA,QACC,CAAC,QAAA,oBACAtE,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yEACd,QAAA,kBAAAD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iIAAA;AAAA,YACV,OAAA,EAAQ,WAAA;AAAA,YACR,aAAA,EAAY,MAAA;AAAA,YACZ,IAAA,EAAK,MAAA;AAAA,YAEL,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,CAAA,EAAE,8BAAA;AAAA,kBACF,WAAA,EAAa,GAAA;AAAA,kBACb,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe;AAAA;AAAA,eACjB;AAAA,8BACAA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,CAAA,EAAE,2BAAA;AAAA,kBACF,WAAA,EAAa,GAAA;AAAA,kBACb,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,SACF,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC;AC9FM,IAAM+F,SAAQ1B,eAAAA,CAAM,UAAA;AAAA,EACzB,CAAC,EAAE,QAAA,EAAU,SAAA,GAAY,EAAA,EAAI,WAAW,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACjE,IAAA,uBACEtE,IAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,2CAA2C,SAAS,CAAA,CAAA;AAAA,QAC9D,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,4BAAYC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAoB,QAAA,EAAA,GAAA,EAAC;AAAA;AAAA;AAAA,KACpD;AAAA,EAEJ;AACF,CAAA;AAEA+F,MAAAA,CAAM,WAAA,GAAc,OAAA;ACDb,IAAMC,KAAAA,GAAO9F,IAAAA,CAAK,SAAS8F,KAAAA,CAAK;AAAA,EACrC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,OAAA,GAAU,SAAA;AAAA,EACV,KAAA,GAAQ,KAAA;AAAA,EACR,OAAA,GAAU,KAAA;AAAA,EACV;AACF,CAAA,EAAc;AACZ,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,IAAA,EAAM,EAAA;AAAA,IACN,EAAA,EAAI,YAAA;AAAA,IACJ,EAAA,EAAI,YAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,OAAA,EACE,iFAAA;AAAA,IACF,QAAA,EACE,iFAAA;AAAA,IACF,QAAA,EAAU,8DAAA;AAAA,IACV,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,MAAM,YAAA,GACJ,KAAA,IAAS,OAAA,GAAU,gDAAA,GAAmD,EAAA;AACxE,EAAA,MAAM,gBAAA,GAAmB,UAAU,gBAAA,GAAmB,EAAA;AACtD,EAAA,MAAM,cAAA,GAAiB,UAAU,gCAAA,GAAmC,EAAA;AAEpE,EAAA,uBACEhG,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,UAAU,QAAA,GAAW,MAAA;AAAA,MAC3B,QAAA,EAAU,UAAU,CAAA,GAAI,MAAA;AAAA,MACxB,SAAA,EAAWsE,IAAAA;AAAA,QACT,YAAA;AAAA,QACA,eAAe,OAAO,CAAA;AAAA,QACtB,eAAe,OAAO,CAAA;AAAA,QACtB,YAAA;AAAA,QACA,gBAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,OAAA,GAAU,CAAC,CAAA,KAAM;AAC1B,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA,GAAI,MAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC,CAAA;AAKyBpE,IAAAA,CAAK,SAAS+F,WAAAA,CAAW;AAAA,EACjD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACElG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWuE,IAAAA,CAAK,MAAA,EAAQ,SAAS,CAAA,EACpC,QAAA,EAAA;AAAA,oBAAAvE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iEAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,4BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DACV,QAAA,EAAA,QAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEC,2BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAyC,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAEpE,CAAA;AAAA,IAEC,4BAAYA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,GAAA,EAC/C,CAAA;AAEJ,CAAC;AAKwBE,IAAAA,CAAK,SAASgG,UAAAA,CAAU;AAAA,EAC/C,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACElG,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWsE,IAAAA;AAAA,QACT,wDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ,CAAC;AAK8BpE,IAAAA,CAAK,SAASiG,gBAAAA,CAAgB;AAAA,EAC3D,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEnG,IAAC,GAAA,EAAA,EAAE,SAAA,EAAWsE,KAAK,0CAAA,EAA4C,SAAS,GACrE,QAAA,EACH,CAAA;AAEJ,CAAC;AAK0BpE,IAAAA,CAAK,SAASkG,YAAAA,CAAY;AAAA,EACnD,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEpG,IAAC,KAAA,EAAA,EAAI,SAAA,EAAWsE,KAAK,kCAAA,EAAoC,SAAS,GAC/D,QAAA,EACH,CAAA;AAEJ,CAAC;AAKyBpE,IAAAA,CAAK,SAASmG,WAAAA,CAAW;AAAA,EACjD,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAIG;AACD,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,GAAA,EAAK,aAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,uBACErG,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWsE,IAAAA;AAAA,QACT,iFAAA;AAAA,QACA,eAAe,OAAO,CAAA;AAAA,QACtB;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ,CAAC;AAKuBpE,IAAAA,CAAK,SAASoG,SAAAA,CAAS;AAAA,EAC7C,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV;AACF,CAAA,EAYG;AACD,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,EAAA,EAAI,oCAAA;AAAA,IACJ,IAAA,EAAM,gCAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,uBACEtG,GAAAA,CAACgG,KAAAA,EAAA,EAAK,SAAQ,UAAA,EAAW,KAAA,EAAK,IAAA,EAAC,SAAA,EAAsB,OAAA,EACnD,QAAA,kBAAAjG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACZ,QAAA,EAAA,IAAA,EACH,CAAA,EACF,CAAA;AAAA,oBAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+DAAA,EACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EACV,QAAA,EAAA,OAAA,GAAU,QAAQ,KAAA,EACrB,CAAA;AAAA,QAEC,KAAA,IAAS,CAAC,OAAA,oBACTD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWuE,IAAAA;AAAA,cACT,gCAAA;AAAA,cACA,WAAA,CAAY,MAAM,SAAS;AAAA,aAC7B;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAtE,GAAAA,CAAC,MAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,SAAA,KAAc,IAAA,GACjB,WACA,KAAA,CAAM,SAAA,KAAc,MAAA,GAClB,QAAA,GACA,QAAA,EACR,CAAA;AAAA,8BACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAQ,QAAA,EAAA;AAAA,gBAAA,KAAA,CAAM,KAAA;AAAA,gBAAM;AAAA,eAAA,EAAC;AAAA;AAAA;AAAA;AACvC,OAAA,EAEJ,CAAA;AAAA,MAEC,4BACCC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDACV,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,MAGD,KAAA,IAAS,CAAC,OAAA,oBACTA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAAA,EACV,QAAA,EAAA,KAAA,CAAM,KAAA,EACT;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAC;AC9RD,IAAM,QAAA,GAAiBuG,MAAA,CAAA,UAAA,CAGrB,CAAC,EAAE,SAAA,EAAW,OAAO,GAAG,KAAA,EAAM,EAAG,GAAA,qBACjCvG,GAAAA;AAAA,EAAmB,iBAAA,CAAA,IAAA;AAAA,EAAlB;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWsE,IAAAA;AAAA,MACT,+DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAAtE,GAAAA;AAAA,MAAmB,iBAAA,CAAA,SAAA;AAAA,MAAlB;AAAA,QACC,SAAA,EAAU,gDAAA;AAAA,QACV,OAAO,EAAE,SAAA,EAAW,eAAe,GAAA,IAAO,KAAA,IAAS,EAAE,CAAA,EAAA,CAAA;AAAK;AAAA;AAC5D;AACF,CACD,CAAA;AACD,QAAA,CAAS,cAAgC,iBAAA,CAAA,IAAA,CAAK,WAAA;ACf9C,SAAS,yBAAyB,QAAA,EAAkB;AAClD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,SAAS,MAAA,IAAU,CAAA;AAAA,IAC9B,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,IACnC,YAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,IACnC,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC7B,UAAA,EAAY,mBAAA,CAAoB,IAAA,CAAK,QAAQ;AAAA,GAC/C;AACF;AAYA,SAAS,gBAAA,CAAiB;AAAA,EACxB,GAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACED,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,8FAAA,EACT,GAAA,GACI,2BAAA,GACA,+DACN,CAAA,CAAA;AAAA,QAEC,gBAAM,QAAA,GAAW;AAAA;AAAA,KACpB;AAAA,oBACAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EACE,MACI,wCAAA,GACA,kCAAA;AAAA,QAGL,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAE6BwD,UAAAA;AAAA,EAC3B,SAASgD,cAAAA,CACP,EAAE,SAAA,GAAY,EAAA,EAAI,OAAA,GAAU,SAAA,EAAW,YAAA,GAAe,KAAA,EAAO,QAAA,EAAU,GAAG,KAAA,IAC1E,GAAA,EACA;AACA,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI1G,SAAS,KAAK,CAAA;AACtD,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrD,IAAA,MAAM,IAAIc,eAAAA,EAAgB;AAE1B,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2C;AAC/D,MAAA,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/B,MAAA,QAAA,GAAW,CAAC,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,QAAA,GAAWyE,OAAAA;AAAA,MACf,MAAM,yBAAyB,aAAa,CAAA;AAAA,MAC5C,CAAC,aAAa;AAAA,KAChB;AAEA,IAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACrC,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAAA,IAChC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,IAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,MAAA,IAAI,QAAA,IAAY,GAAG,OAAO,MAAA;AAC1B,MAAA,IAAI,QAAA,IAAY,GAAG,OAAO,QAAA;AAC1B,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,YAAA;AAAA,MACN,MAAA,EAAQ,cAAA;AAAA,MACR,MAAA,EAAQ;AAAA,MACR,aAAa,CAAA;AAEf,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ;AAAA,MACR,aAAa,CAAA;AAEf,IAAA,MAAM,gBAAA,GACJ,OAAA,KAAY,OAAA,GACR,yQAAA,GACA,wNAAA;AAEN,IAAA,MAAM,aAAA,GACJ,OAAA,KAAY,OAAA,GACR,wHAAA,GACA,qIAAA;AAEN,IAAA,MAAM,WAAA,GACJ,OAAA,KAAY,OAAA,GACR,2CAAA,GACA,uFAAA;AAEN,IAAA,uBACEtF,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA;AAAA,YACA,IAAA,EAAM,eAAe,MAAA,GAAS,UAAA;AAAA,YAC9B,SAAA,EAAW,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,YAC3C,QAAA,EAAU,YAAA;AAAA,YACT,GAAG;AAAA;AAAA,SACN;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAC,YAAY,CAAA;AAAA,YAC5C,SAAA,EAAW,aAAA;AAAA,YACX,cAAY,YAAA,GAAe,CAAA,CAAE,mBAAmB,CAAA,GAAI,EAAE,mBAAmB,CAAA;AAAA,YAExE,QAAA,EAAA,YAAA,mBACCA,GAAAA,CAAC8D,YAAAA,EAAA,EAAa,SAAA,EAAW,WAAA,EAAa,CAAA,mBAEtC9D,GAAAA,CAAC+D,OAAAA,EAAA,EAAQ,WAAW,WAAA,EAAa;AAAA;AAAA;AAErC,OAAA,EACF,CAAA;AAAA,MAEC,YAAA,IAAgB,cAAc,MAAA,GAAS,CAAA,oBACtChE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EAEb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,gDAAA,EAAmD,gBAAgB,CAAA,CAAA,EAAI,gBAAgB,CAAA;AAAA;AAAA,WACpG,EACF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,uBACT,aAAA,KAAkB,MAAA,GACd,iBACA,aAAA,KAAkB,QAAA,GAChB,mBACA,kBACR,CAAA,CAAA;AAAA,cAEC,QAAA,EAAA,CAAA,CAAE,CAAA,uBAAA,EAA0B,aAAa,CAAA,CAAE;AAAA;AAAA;AAC9C,SAAA,EACF,CAAA;AAAA,wBAGAD,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,KAAK,QAAA,CAAS,SAAA;AAAA,cACd,KAAA,EAAO,EAAE,sCAAsC;AAAA;AAAA,WACjD;AAAA,0BACAA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,KAAK,QAAA,CAAS,YAAA;AAAA,cACd,KAAA,EAAO,EAAE,sCAAsC;AAAA;AAAA,WACjD;AAAA,0BACAA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,KAAK,QAAA,CAAS,YAAA;AAAA,cACd,KAAA,EAAO,EAAE,sCAAsC;AAAA;AAAA,WACjD;AAAA,0BACAA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,KAAK,QAAA,CAAS,SAAA;AAAA,cACd,KAAA,EAAO,EAAE,mCAAmC;AAAA;AAAA,WAC9C;AAAA,0BACAA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,KAAK,QAAA,CAAS,UAAA;AAAA,cACd,KAAA,EAAO,EAAE,oCAAoC;AAAA;AAAA;AAC/C,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;ACvLA,IAAM,QAAA,GAAiByG,kBAGrB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BzG,GAAAA;AAAA,EAAe,aAAA,CAAA,IAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWsE,IAAAA;AAAA,MACT,gGAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACD,QAAA,CAAS,cAA4B,aAAA,CAAA,IAAA,CAAK,WAAA;AAE1C,IAAM,WAAA,GAAoBmC,kBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BzG,GAAAA;AAAA,EAAe,aAAA,CAAA,OAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWsE,IAAAA;AAAA,MACT,mYAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACD,WAAA,CAAY,cAA4B,aAAA,CAAA,OAAA,CAAQ,WAAA;AAEhD,IAAM,WAAA,GAAoBmC,kBAGxB,CAAC,EAAE,WAAW,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1BzG,GAAAA;AAAA,EAAe,aAAA,CAAA,OAAA;AAAA,EAAd;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWsE,IAAAA;AAAA,MACT,iIAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD,CAAA;AACD,WAAA,CAAY,cAA4B,aAAA,CAAA,OAAA,CAAQ,WAAA;ACrCrBD,eAAAA,CAAM,IAAA,CAAuB,SAASqC,YAAAA,CAAY;AAAA,EAC3E,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAG;AACD,EAAA,MAAM,CAAA,GAAI9F,gBAAgB,SAAS,CAAA;AAEnC,EAAA,uBACEb,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACX,QAAA,EAAA,CAAA,CAAE,IAAI,CAAA,EACT,CAAA;AAAA,oBACAD,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBAC7BA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,SAAA,EAAU,6BAAA,EACnC,iBACH,CAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBAChCA,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EACb;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AASyBqE,eAAAA,CAAM,IAAA,CAAsB,SAASsC,WAAAA,CAAW;AAAA,EACxE,IAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAG;AACD,EAAA,uBACE5G,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBAC9DD,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,mDAAA,EACjB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,OAAG,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBACZA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,UAAA,EAAW;AAAA,KAAA,EACjB;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AAS6BqE,eAAAA,CAAM,IAAA;AAAA,EAClC,SAASuC,eAAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAU,UAAS,EAAG;AACrD,IAAA,uBACE7G,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iEAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kCAAkC,QAAA,EAAA,QAAA,EAAS;AAAA,OAAA,EAC1D,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEACZ,QAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;ACrE0BE,IAAAA,CAAK,SAAS2G,WAAAA,CAAW;AAAA,EACjD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,uBACE9G,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWuE,IAAAA,CAAK,cAAA,EAAgB,SAAS,CAAA,EAC5C,QAAA,EAAA;AAAA,oBAAAvE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWsE,IAAAA;AAAA,cACT,qDAAA;AAAA,cACA,IAAA,KAAS,UAAU,UAAA,GAAa;AAAA,aAClC;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QACC,4BACCtE,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DACV,QAAA,EAAA,QAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEC,2BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDACZ,QAAA,EAAA,OAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,4BAAYA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,GAAA,EAC/C,CAAA;AAEJ,CAAC;AAKgCE,IAAAA,CAAK,SAAS4G,kBAAAA,CAAkB;AAAA,EAC/D,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,uBACE/G,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWuE,IAAAA,CAAK,MAAA,EAAQ,SAAS,CAAA,EACpC,QAAA,EAAA;AAAA,oBAAAvE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mEAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,4BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DACV,QAAA,EAAA,QAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEC,2BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDACZ,QAAA,EAAA,OAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,4BAAYA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,GAAA,EAC/C,CAAA;AAEJ,CAAC;AAKgCE,IAAAA,CAAK,SAAS6G,kBAAAA,CAAkB;AAAA,EAC/D,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,uBACEhH,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWuE,IAAAA,CAAK,MAAA,EAAQ,SAAS,CAAA,EACpC,QAAA,EAAA;AAAA,oBAAAvE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mEAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,QACC,4BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yEACV,QAAA,EAAA,QAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEC,2BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDACZ,QAAA,EAAA,OAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,4BAAYA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAQ,QAAA,EAAS;AAAA,GAAA,EAC/C,CAAA;AAEJ,CAAC;ACdoCH,MAAAA,CAA2B,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA;AAAA,EAE7E,iBAAA,EAAmB,KAAA;AAAA,EACnB,UAAA,EAAY,KAAA;AAAA,EACZ,kBAAA,EAAoB,KAAA;AAAA,EACpB,iBAAA,EAAmB,KAAA;AAAA,EACnB,eAAA,EAAiB,WAAA;AAAA,EAEjB,IAAA,EAAM,IAAA;AAAA,EACN,UAAA,EAAY,SAAA;AAAA,EAEZ,WAAA,EAAa;AAAA,IACX,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,QAAA;AAAA,IACP,aAAA,EAAe,MAAA;AAAA,IACf,YAAA,EAAc,MAAA;AAAA,IACd,YAAA,EAAc,KAAA;AAAA,IACd,WAAA,EAAa;AAAA,GACf;AAAA,EAEA,iBAAA,EAAmB,CAAA;AAAA,EACnB,QAAQ,EAAC;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,WAAA,EAAa,EAAA;AAAA,EAEb,UAAA,EAAY,IAAA;AAAA,EACZ,cAAA,EAAgB,IAAA;AAAA,EAChB,WAAA,EAAa,IAAA;AAAA,EACb,gBAAA,EAAkB,IAAA;AAAA,EAClB,iBAAA,EAAmB,IAAA;AAAA;AAAA,EAGnB,aAAa,MAAM,GAAA,CAAI,EAAE,iBAAA,EAAmB,MAAM,CAAA;AAAA,EAClD,cAAc,MAAM,GAAA,CAAI,EAAE,iBAAA,EAAmB,OAAO,CAAA;AAAA,EACpD,YAAA,EAAc,CAAC,OAAA,KAAqB,GAAA,CAAI,EAAE,mBAAmB,IAAA,EAAM,eAAA,EAAiB,OAAA,IAAW,WAAA,EAAa,CAAA;AAAA,EAC5G,eAAe,MAAM,GAAA,CAAI,EAAE,iBAAA,EAAmB,OAAO,CAAA;AAAA,EACrD,YAAY,MAAM,GAAA,CAAI,EAAE,UAAA,EAAY,MAAM,CAAA;AAAA,EAC1C,aAAa,MAAM,GAAA,CAAI,EAAE,UAAA,EAAY,OAAO,CAAA;AAAA,EAE5C,gBAAgB,MAAM,GAAA,CAAI,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAAA,EACtD,eAAe,MAAM,GAAA,CAAI,EAAE,kBAAA,EAAoB,OAAO,CAAA;AAAA,EACtD,gBAAgB,MAAM;AACpB,IAAA,GAAA,CAAI,EAAE,kBAAA,EAAoB,KAAA,EAAO,CAAA;AACjC,IAAA,GAAA,GAAM,UAAA,IAAa;AAAA,EACrB,CAAA;AAAA,EAEA,WAAA,EAAa,MAAM,GAAA,EAAI,CAAE,cAAA,IAAiB;AAAA,EAE1C,cAAA,EAAgB,CAAC,MAAA,KAAmB;AAClC,IAAA,MAAM,QAAA,GAAW,KAAI,CAAE,iBAAA;AACvB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,MAAM,CAAA;AAAA,IACjB,CAAA,MAAO;AAEL,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,QAAA,QAAA,CAAS,MAAA,GAAS,eAAe,MAAM,CAAA,wCAAA,CAAA;AACvC,QAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EAEA,UAAU,CAAC,IAAA,KAAiB,GAAA,EAAI,CAAE,cAAc,IAAI,CAAA;AAAA,EACpD,iBAAA,EAAmB,MAAM,GAAA,EAAI,CAAE,gBAAA,IAAmB;AAAA;AAAA,EAGlD,SAAS,CAAC,IAAA,KAAS,GAAA,CAAI,EAAE,MAAM,CAAA;AAAA,EAC/B,eAAe,CAAC,UAAA,KAAe,GAAA,CAAI,EAAE,YAAY,CAAA;AAAA,EACjD,cAAA,EAAgB,CAAC,KAAA,KAAU,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACzC,aAAa,EAAE,GAAG,KAAA,CAAM,WAAA,EAAa,GAAG,KAAA;AAAM,GAChD,CAAE,CAAA;AAAA,EACF,sBAAsB,CAAC,iBAAA,KAAsB,GAAA,CAAI,EAAE,mBAAmB,CAAA;AAAA,EACtE,WAAW,CAAC,MAAA,KAAW,GAAA,CAAI,EAAE,QAAQ,CAAA;AAAA,EACrC,WAAA,EAAa,CAAC,OAAA,EAAS,WAAA,KAAgB,IAAI,EAAE,OAAA,EAAS,aAAa,CAAA;AAAA,EACnE,iBAAA,EAAmB,CAAC,SAAA,KAAc,GAAA,CAAI;AAAA,IACpC,UAAA,EAAY,UAAU,SAAA,IAAa,IAAA;AAAA,IACnC,cAAA,EAAgB,UAAU,aAAA,IAAiB,IAAA;AAAA,IAC3C,WAAA,EAAa,UAAU,UAAA,IAAc,IAAA;AAAA,IACrC,gBAAA,EAAkB,UAAU,eAAA,IAAmB,IAAA;AAAA,IAC/C,iBAAA,EAAmB,UAAU,gBAAA,IAAoB;AAAA,GAClD;AACH,CAAA,CAAE;ACrLK,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,2BAAA;AAAA,EACX,QAAA,GAAW,WAAA;AAAA,EACX,IAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,uBACEG,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AC5BO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA6B;AAC1F,EAAA,MAAM,CAAA,GAAIY,gBAAgB,iCAAiC,CAAA;AAC3D,EAAA,MAAM,CAAC,gBAAgB,iBAAiB,CAAA,GAAId,SAAmB,CAAC,GAAG,MAAA,CAAO,cAAc,CAAC,CAAA;AACzF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,MAAM,OAAA,GAAU,YAAY,IAAA,EAAK;AACjC,IAAA,IAAI,OAAA,IAAW,CAAC,cAAA,CAAe,QAAA,CAAS,OAAO,CAAA,EAAG;AAChD,MAAA,iBAAA,CAAkB,CAAC,GAAG,cAAA,EAAgB,OAAO,CAAC,CAAA;AAC9C,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,QAAA,KAAqB;AACjD,IAAA,iBAAA,CAAkB,eAAe,MAAA,CAAO,CAAC,gBAAA,KAAqB,gBAAA,KAAqB,QAAQ,CAAC,CAAA;AAAA,EAC9F,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA+B;AACpD,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,iBAAA,EAAkB;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,cAAA,EAAgB,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EAAiD,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,sBACtFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAA+C,cAAA,CAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YAC3F,SAAA,EAAW,aAAA;AAAA,YACX,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,YACpC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,iBAAA;AAAA,YACT,OAAA,EAAO,IAAA;AAAA,YACP,IAAA,EAAK,IAAA;AAAA,YAEJ,YAAE,aAAa;AAAA;AAAA;AAClB,OAAA,EACF,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,QAAA,qBACnBD,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,kJAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,4BACDC,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,sBAAMA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,gBACrC,KAAA,EAAO,UAAU,QAAQ,CAAA,CAAA;AAAA,gBACzB,OAAA,EAAS,MAAM,oBAAA,CAAqB,QAAQ,CAAA;AAAA,gBAC5C,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA,SAAA;AAAA,QAXK;AAAA,OAaR,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAjE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,OAAA,EAAO,IAAA;AAAA,UACP,IAAA,EAAK,IAAA;AAAA,UAEJ,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,KAAA,EAAM,gBAAA;AAAA,UACN,IAAA,EAAK,IAAA;AAAA,UAEJ,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC7FO,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA2B;AACtF,EAAA,MAAM,CAAA,GAAIY,gBAAgB,+BAA+B,CAAA;AACzD,EAAA,MAAM,CAAC,iBAAiB,kBAAkB,CAAA,GAAId,SAAmB,CAAC,GAAG,MAAA,CAAO,eAAe,CAAC,CAAA;AAC5F,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,MAAM,OAAA,GAAU,YAAY,IAAA,EAAK;AACjC,IAAA,IAAI,OAAA,IAAW,CAAC,eAAA,CAAgB,QAAA,CAAS,OAAO,CAAA,EAAG;AACjD,MAAA,kBAAA,CAAmB,CAAC,GAAG,eAAA,EAAiB,OAAO,CAAC,CAAA;AAChD,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,QAAA,KAAqB;AACjD,IAAA,kBAAA,CAAmB,gBAAgB,MAAA,CAAO,CAAC,gBAAA,KAAqB,gBAAA,KAAqB,QAAQ,CAAC,CAAA;AAAA,EAChG,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA+B;AACpD,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,iBAAA,EAAkB;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,eAAA,EAAiB,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EAAiD,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,sBACvFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,WAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YACtD,SAAA,EAAW,aAAA;AAAA,YACX,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,YACpC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,iBAAA;AAAA,YACT,SAAA,EAAU,oEAAA;AAAA,YAET,YAAE,aAAa;AAAA;AAAA;AAClB,OAAA,EACF,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,qBACpBD,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,0IAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,4BACDC,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,oBAAA,CAAqB,QAAQ,CAAA;AAAA,gBAC5C,SAAA,EAAU,yCAAA;AAAA,gBACV,YAAA,EAAY,UAAU,QAAQ,CAAA,CAAA;AAAA,gBAE9B,QAAA,kBAAAA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC;AAAA,SAAA;AAAA,QAXK;AAAA,OAaR,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAjE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,+JAAA;AAAA,UAET,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,mIAAA;AAAA,UAET,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC3FO,SAAS,iBAAA,CAAkB;AAAA,EAChC,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAA2B;AACzB,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAO,IAAA,EAAK,QAAA,EAAS,SAAO,IAAA,EAAC,OAAA,EAAS,UACpC,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,oBACAA,IAAC,MAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,YAAA,EAC9C,QAAA,EAAA,SAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACRA,IAAM,gBAAA,GAAmB;AAAA,EACvB,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,gBAAA,EAAiB;AAAA,EAC9C,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,mBAAA,EAAoB;AAAA,EACrD,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,kBAAA,EAAmB;AAAA,EAClD,EAAE,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAU,qBAAA,EAAsB;AAAA,EACzD,EAAE,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,kBAAA,EAAmB;AAAA,EACnD,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,iBAAA,EAAkB;AAAA,EACjD,EAAE,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAU,oBAAA;AACrC,CAAA;AAEO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA8B;AAC5F,EAAA,MAAM,CAAA,GAAIY,gBAAgB,kCAAkC,CAAA;AAC5D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAId,QAAAA;AAAA,IAClC,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,MACpC,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,OAAO,SAAA,CAAU;AAAA,KACnB,CAAE;AAAA,GACJ;AACA,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAAuB,OAAO,eAAe,CAAA;AAE3F,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,aAAA,CAAc,CAAC,GAAG,UAAA,EAAY,EAAE,QAAA,EAAU,EAAA,EAAI,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,EAAA,EAAI,CAAC,CAAA;AAAA,EAChF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAkB;AAC/C,IAAA,aAAA,CAAc,WAAW,MAAA,CAAO,CAAC,GAAG,cAAA,KAAmB,cAAA,KAAmB,KAAK,CAAC,CAAA;AAAA,EAClF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,EAAe,KAAA,EAA8B,UAAA,KAAuB;AACjG,IAAA,aAAA,CAAc,UAAA,CAAW,GAAA;AAAA,MAAI,CAAC,SAAA,EAAW,cAAA,KACvC,cAAA,KAAmB,KAAA,GAAQ,EAAE,GAAG,SAAA,EAAW,CAAC,KAAK,GAAG,UAAA,EAAW,GAAI;AAAA,KACpE,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,QACzC,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,OAAO,SAAA,CAAU;AAAA,OACnB,CAAE,CAAA;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EAAE,CAAA;AAAA,wBAC9FA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,kBAAA;AAAA,YAER,YAAE,cAAc;AAAA;AAAA;AACnB,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,qBAC1BD,IAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,kHAAA,EACzB,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SACC,QAAA,kBAAAA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,cACxB,OAAO,SAAA,CAAU,QAAA;AAAA,cACjB,eAAe,CAAC,KAAA,KAAU,qBAAA,CAAsB,KAAA,EAAO,YAAY,KAAK,CAAA;AAAA,cACxE,WAAA,EAAa,EAAE,eAAe,CAAA;AAAA,cAC9B,SAAA,EAAU;AAAA;AAAA,WACZ,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,cACxB,OAAO,SAAA,CAAU,QAAA;AAAA,cACjB,eAAe,CAAC,KAAA,KAAU,qBAAA,CAAsB,KAAA,EAAO,YAAY,KAAK,CAAA;AAAA,cACxE,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,CAAC,YAAY,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,QAAQ,GAAE,CAAE,CAAA;AAAA,cAC9F,SAAA,EAAU;AAAA;AAAA,WACZ,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,cACrB,OAAO,SAAA,CAAU,KAAA;AAAA,cACjB,eAAe,CAAC,KAAA,KAAU,qBAAA,CAAsB,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,cACrE,WAAA,EAAa,EAAE,YAAY,CAAA;AAAA,cAC3B,SAAA,EAAU;AAAA;AAAA,WACZ,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QACC,UAAA,CAAW,MAAA,GAAS,CAAA,oBACnBA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,qBAAA,CAAsB,KAAK,CAAA;AAAA,YAC1C,sBAAMA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,YACrC,KAAA,EAAO,EAAE,iBAAiB,CAAA;AAAA,YAC1B,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,SAAA;AAAA,YACN,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EAAA,EAxCM,KA0CV,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAf,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EAAmE,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE,CAAA;AAAA,sBAC9GD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wCAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,iBAAA;AAAA,cACL,KAAA,EAAM,KAAA;AAAA,cACN,SAAS,eAAA,KAAoB,KAAA;AAAA,cAC7B,QAAA,EAAU,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAAA,cACxC,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAA2C,QAAA,EAAA,KAAA,EAAG;AAAA,SAAA,EAChE,CAAA;AAAA,wBACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wCAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,iBAAA;AAAA,cACL,KAAA,EAAM,IAAA;AAAA,cACN,SAAS,eAAA,KAAoB,IAAA;AAAA,cAC7B,QAAA,EAAU,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACvC,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAA2C,QAAA,EAAA,IAAA,EAAE;AAAA,SAAA,EAC/D;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;AC1JA,IAAM,gBAAA,GAAmB,CAAC,YAAA,EAAc,QAAA,EAAU,YAAY,CAAA;AAEvD,SAAS,kBAAA,CAAmB,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA4B;AACxF,EAAA,MAAM,CAAA,GAAIY,gBAAgB,gCAAgC,CAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAId,QAAAA,CAAqC,OAAO,QAAQ,CAAA;AACpF,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,QAAAA,CAAS,OAAO,IAAI,CAAA;AAE5C,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,WAAA,CAAY,KAAA,CAAM,OAAO,KAAmC,CAAA;AAAA,UACjF,SAAA,EAAU,mQAAA;AAAA,UAET,QAAA,EAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,MAAA,qBACrBA,GAAAA,CAAC,QAAA,EAAA,EAAoB,KAAA,EAAO,MAAA,EAAS,QAAA,EAAA,MAAA,EAAA,EAAxB,MAA+B,CAC7C;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAChB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,OAAA,CAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAC/C,WAAA,EAAa,EAAE,iBAAiB,CAAA;AAAA,UAChC,IAAA,EAAM,EAAA;AAAA,UACN,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,+JAAA;AAAA,UAET,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,mIAAA;AAAA,UAET,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACnDA,IAAM,YAAA,GAAe,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAEpD,SAAS,iBAAiB,OAAA,EAAgD;AACxE,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,GAAA,EAAK,OAAM,CAAE,CAAA;AACvE;AAEA,SAAS,iBAAiB,OAAA,EAAgD;AACxE,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,IAAA,EAAK,EAAG;AACpB,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,IAAI,KAAA,CAAM,KAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,yBAAA,CAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAmC;AACtG,EAAA,MAAM,CAAA,GAAIY,gBAAgB,uCAAuC,CAAA;AACjE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAId,QAAAA,CAA0C,OAAO,MAAM,CAAA;AACnF,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,QAAAA,CAAS,OAAO,GAAG,CAAA;AACzC,EAAA,MAAM,CAAC,eAAe,gBAAgB,CAAA,GAAIA,SAAwB,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAC,CAAA;AAClG,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAIA,QAAAA,CAAS,MAAA,CAAO,QAAQ,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAAS,OAAO,SAAS,CAAA;AAE3D,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,gBAAA,CAAiB,CAAC,GAAG,aAAA,EAAe,EAAE,KAAK,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,CAAC,CAAA;AAAA,EAC7D,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAkB;AAC5C,IAAA,gBAAA,CAAiB,cAAc,MAAA,CAAO,CAAC,GAAG,WAAA,KAAgB,WAAA,KAAgB,KAAK,CAAC,CAAA;AAAA,EAClF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,EAAe,KAAA,EAA0B,UAAA,KAAuB;AAC1F,IAAA,gBAAA,CAAiB,aAAA,CAAc,GAAA;AAAA,MAAI,CAAC,KAAA,EAAO,WAAA,KACzC,WAAA,KAAgB,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,CAAC,KAAK,GAAG,UAAA,EAAW,GAAI;AAAA,KAC7D,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA,EAAS,iBAAiB,aAAa,CAAA;AAAA,MACvC,IAAA,EAAM,MAAA,KAAW,KAAA,GAAQ,EAAA,GAAK,IAAA;AAAA,MAC9B;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,aAAa,CAAA;AAAA,QACtB,KAAA,EAAO,MAAA;AAAA,QACP,aAAA,EAAe,CAAC,KAAA,KAAU,SAAA,CAAU,KAAwC,CAAA;AAAA,QAC5E,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,CAAC,UAAA,MAAgB,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW,CAAE;AAAA;AAAA,KACtF;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,UAAU,CAAA;AAAA,QACnB,KAAA,EAAO,GAAA;AAAA,QACP,aAAA,EAAe,MAAA;AAAA,QACf,WAAA,EAAa,EAAE,gBAAgB;AAAA;AAAA,KACjC;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EAAE,CAAA;AAAA,wBAC3FA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,eAAA;AAAA,YAER,YAAE,WAAW;AAAA;AAAA;AAChB,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBACzBD,IAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,yBAAA,EACzB,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,OAAO,KAAA,CAAM,GAAA;AAAA,YACb,eAAe,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,YAChE,WAAA,EAAa,EAAE,sBAAsB,CAAA;AAAA,YACrC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,eAAe,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,YAClE,WAAA,EAAa,EAAE,wBAAwB,CAAA;AAAA,YACvC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAAA,YACvC,sBAAMA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,YACrC,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,YACvB,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM;AAAA;AAAA;AACR,OAAA,EAAA,EArBQ,KAsBV,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,MAAA,KAAW,yBACVd,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,WAAW,CAAA;AAAA,QACpB,KAAA,EAAO,IAAA;AAAA,QACP,aAAA,EAAe,OAAA;AAAA,QACf,WAAA,EAAa,EAAE,iBAAiB,CAAA;AAAA,QAChC,IAAA,EAAM,CAAA;AAAA,QACN,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAGFA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,QACvB,KAAA,EAAO,OAAO,SAAS,CAAA;AAAA,QACvB,eAAe,CAAC,KAAA,KAAU,YAAA,CAAa,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACpD,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM;AAAA;AAAA,KACR;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;AC5IO,SAAS,+BAAA,CAAgC,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAyC;AAClH,EAAA,MAAM,CAAA,GAAIY,gBAAgB,6CAA6C,CAAA;AACvE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAId,QAAAA,CAAS,OAAO,QAAQ,CAAA;AACxD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAS,OAAO,cAAc,CAAA;AAE1E,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,gBAAgB,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,QACxB,KAAA,EAAO,QAAA;AAAA,QACP,aAAA,EAAe,WAAA;AAAA,QACf,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,QACpC,IAAA,EAAM,CAAA;AAAA,QACN,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAC9B,KAAA,EAAO,cAAA;AAAA,QACP,aAAA,EAAe,iBAAA;AAAA,QACf,WAAA,EAAa,EAAE,2BAA2B;AAAA;AAAA,KAC5C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;ACpCO,SAAS,uBAAA,CAAwB,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAiC;AAClG,EAAA,MAAM,CAAA,GAAIY,gBAAgB,qCAAqC,CAAA;AAC/D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAId,QAAAA,CAAS,OAAO,gBAAgB,CAAA;AAChF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,CAAS,OAAO,aAAa,CAAA;AAEvE,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,gBAAA,EAAkB,eAAe,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,QAChC,KAAA,EAAO,gBAAA;AAAA,QACP,aAAA,EAAe,mBAAA;AAAA,QACf,WAAA,EAAa,EAAE,6BAA6B;AAAA;AAAA,KAC9C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,KAAA,EAAO,OAAO,aAAa,CAAA;AAAA,QAC3B,eAAe,CAAC,KAAA,KAAU,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACxD,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK;AAAA;AAAA,KACP;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;ACpCO,SAAS,2BAAA,CAA4B,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAqC;AAC1G,EAAA,MAAM,CAAA,GAAIY,gBAAgB,yCAAyC,CAAA;AACnE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAId,QAAAA,CAAS,OAAO,QAAQ,CAAA;AACxD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,QAAAA,CAAS,OAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,QAAAA,CAAS,OAAO,mBAAmB,CAAA;AAEzF,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,qBAAqB,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,QACxB,KAAA,EAAO,QAAA;AAAA,QACP,aAAA,EAAe,WAAA;AAAA,QACf,WAAA,EAAa,EAAE,qBAAqB;AAAA;AAAA,KACtC;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,EAAE,WAAW,CAAA;AAAA,QACpB,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,QAClB,eAAe,CAAC,KAAA,KAAU,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC/C,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK;AAAA;AAAA,KACP;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,QACnC,KAAA,EAAO,OAAO,mBAAmB,CAAA;AAAA,QACjC,eAAe,CAAC,KAAA,KAAU,sBAAA,CAAuB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC9D,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM;AAAA;AAAA,KACR;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;AC9CO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA8B;AAC5F,EAAA,MAAM,CAAA,GAAIY,gBAAgB,kCAAkC,CAAA;AAC5D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAId,QAAAA,CAAS,OAAO,cAAc,CAAA;AAC1E,EAAA,MAAM,CAAC,iBAAiB,kBAAkB,CAAA,GAAIA,SAAmB,CAAC,GAAG,MAAA,CAAO,eAAe,CAAC,CAAA;AAC5F,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,MAAM,OAAA,GAAU,YAAY,IAAA,EAAK;AACjC,IAAA,IAAI,OAAA,IAAW,CAAC,eAAA,CAAgB,QAAA,CAAS,OAAO,CAAA,EAAG;AACjD,MAAA,kBAAA,CAAmB,CAAC,GAAG,eAAA,EAAiB,OAAO,CAAC,CAAA;AAChD,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,QAAA,KAAqB;AACjD,IAAA,kBAAA,CAAmB,gBAAgB,MAAA,CAAO,CAAC,gBAAA,KAAqB,gBAAA,KAAqB,QAAQ,CAAC,CAAA;AAAA,EAChG,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA+B;AACpD,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,iBAAA,EAAkB;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,cAAA,EAAgB,iBAAiB,CAAA;AAAA,EACvD,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAC9B,IAAA,EAAM,EAAE,oBAAoB,CAAA;AAAA,QAC5B,KAAA,EAAO,cAAA;AAAA,QACP,aAAA,EAAe,iBAAA;AAAA,QACf,WAAA,EAAa,EAAE,2BAA2B,CAAA;AAAA,QAC1C,IAAA,EAAM,CAAA;AAAA,QACN,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,WAAA;AAAA,YACP,aAAA,EAAe,cAAA;AAAA,YACf,SAAA,EAAW,aAAA;AAAA,YACX,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,YACpC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,iBAAA;AAAA,YAER,YAAE,aAAa;AAAA;AAAA;AAClB,OAAA,EACF,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,qBACpBD,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,8IAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,4BACDC,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,oBAAA,CAAqB,QAAQ,CAAA;AAAA,gBAC5C,sBAAMA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,gBACrC,KAAA,EAAO,UAAU,QAAQ,CAAA,CAAA;AAAA,gBACzB,IAAA,EAAK,IAAA;AAAA,gBACL,KAAA,EAAM;AAAA;AAAA;AACR;AAAA,SAAA;AAAA,QAVK;AAAA,OAYR,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAhE,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;ACpFO,SAAS,gCAAA,CAAiC,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA0C;AACpH,EAAA,MAAM,CAAA,GAAIY,gBAAgB,8CAA8C,CAAA;AACxE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAId,QAAAA,CAAS,OAAO,OAAO,CAAA;AACrD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA,CAAS,OAAO,YAAY,CAAA;AACpE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA;AAAA,IAClC,MAAA,CAAO,WAAW,GAAA,CAAI,CAAC,cAAc,EAAE,GAAG,UAAS,CAAE;AAAA,GACvD;AAEA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,aAAA,CAAc,CAAC,GAAG,UAAA,EAAY,EAAE,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,CAAC,CAAA;AAAA,EACvF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAkB;AAC9C,IAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC5B,IAAA,aAAA,CAAc,WAAW,MAAA,CAAO,CAAC,GAAG,aAAA,KAAkB,aAAA,KAAkB,KAAK,CAAC,CAAA;AAAA,EAChF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,EAAe,KAAA,EAAiC,UAAA,KAAuB;AACnG,IAAA,aAAA,CAAc,UAAA,CAAW,GAAA;AAAA,MAAI,CAAC,QAAA,EAAU,aAAA,KACtC,aAAA,KAAkB,KAAA,GAAQ,EAAE,GAAG,QAAA,EAAU,CAAC,KAAK,GAAG,UAAA,EAAW,GAAI;AAAA,KAClE,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,QACxC,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,aAAa,QAAA,CAAS;AAAA,OACxB,CAAE;AAAA,KACH,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EACnB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,OAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,UAAA,CAAW,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAClD,WAAA,EAAa,EAAE,oBAAoB,CAAA;AAAA,UACnC,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EACxB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,YAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACvD,WAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,UACxC,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EACd,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EACtB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,iBAAA;AAAA,YACT,SAAA,EAAU,oEAAA;AAAA,YAET,YAAE,aAAa;AAAA;AAAA;AAClB,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,qBACzBD,IAAAA,CAAC,KAAA,EAAA,EAAsB,WAAU,2FAAA,EAC/B,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA,CAAA,CAAE,eAAA,EAAiB,EAAE,KAAA,EAAO,KAAA,GAAQ,CAAA,EAAG,CAAA,EAC1C,CAAA;AAAA,UACC,UAAA,CAAW,MAAA,GAAS,CAAA,oBACnBA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,cACzC,SAAA,EAAU,yCAAA;AAAA,cACV,YAAA,EAAY,EAAE,gBAAgB,CAAA;AAAA,cAE9B,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC,SAAA,EAEJ,CAAA;AAAA,wBACAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,OAAO,QAAA,CAAS,IAAA;AAAA,cAChB,QAAA,EAAU,CAAC,KAAA,KAAU,oBAAA,CAAqB,OAAO,MAAA,EAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAC3E,WAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,cACxC,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,OAAO,QAAA,CAAS,WAAA;AAAA,cAChB,QAAA,EAAU,CAAC,KAAA,KAAU,oBAAA,CAAqB,OAAO,aAAA,EAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cAClF,WAAA,EAAa,EAAE,gCAAgC,CAAA;AAAA,cAC/C,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF;AAAA,OAAA,EAAA,EA/BQ,QAAA,CAAS,EAgCnB,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,+JAAA;AAAA,UAET,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,mIAAA;AAAA,UAET,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACtIA,IAAM,eAAA,GAAkB,CAAC,QAAA,EAAU,QAAA,EAAU,WAAW,OAAO,CAAA;AAExD,SAAS,gCAAA,CAAiC,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA0C;AACpH,EAAA,MAAM,CAAA,GAAIY,gBAAgB,8CAA8C,CAAA;AACxE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAId,QAAAA,CAAS,OAAO,OAAO,CAAA;AACrD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA;AAAA,IAClC,MAAA,CAAO,WAAW,GAAA,CAAI,CAAC,eAAe,EAAE,GAAG,WAAU,CAAE;AAAA,GACzD;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,aAAA,CAAc,CAAC,GAAG,UAAA,EAAY,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,CAAC,CAAA;AAAA,EAC/F,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAkB;AAC/C,IAAA,aAAA,CAAc,WAAW,MAAA,CAAO,CAAC,GAAG,cAAA,KAAmB,cAAA,KAAmB,KAAK,CAAC,CAAA;AAAA,EAClF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,EAAe,KAAA,EAAiC,UAAA,KAAiC;AAC9G,IAAA,aAAA,CAAc,UAAA,CAAW,GAAA;AAAA,MAAI,CAAC,SAAA,EAAW,cAAA,KACvC,cAAA,KAAmB,KAAA,GAAQ,EAAE,GAAG,SAAA,EAAW,CAAC,KAAK,GAAG,UAAA,EAAW,GAAI;AAAA,KACpE,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAA;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,QACzC,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,UAAU,SAAA,CAAU;AAAA,OACtB,CAAE;AAAA,KACH,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EACnB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,OAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,UAAA,CAAW,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UAClD,WAAA,EAAa,EAAE,oBAAoB,CAAA;AAAA,UACnC,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EACd,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EACtB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,kBAAA;AAAA,YACT,SAAA,EAAU,oEAAA;AAAA,YAET,YAAE,cAAc;AAAA;AAAA;AACnB,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,EAAW,KAAA,qBAC1BD,IAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,2FAAA,EACzB,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,qBAAA,CAAsB,KAAK,CAAA;AAAA,YAC1C,SAAA,EAAU,yCAAA;AAAA,YACV,YAAA,EAAY,EAAE,iBAAiB,CAAA;AAAA,YAE/B,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA,SACjC,EACF,CAAA;AAAA,wBACAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,4BAChGA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,OAAO,SAAA,CAAU,IAAA;AAAA,gBACjB,QAAA,EAAU,CAAC,KAAA,KAAU,qBAAA,CAAsB,OAAO,MAAA,EAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,gBAC5E,WAAA,EAAa,EAAE,0BAA0B,CAAA;AAAA,gBACzC,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,4BAChGA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAO,SAAA,CAAU,IAAA;AAAA,gBACjB,QAAA,EAAU,CAAC,KAAA,KAAU,qBAAA,CAAsB,OAAO,MAAA,EAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,gBAC5E,SAAA,EAAU,mQAAA;AAAA,gBAET,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,aAAA,qBACpBA,GAAAA,CAAC,QAAA,EAAA,EAA2B,KAAA,EAAO,aAAA,EAAgB,QAAA,EAAA,aAAA,EAAA,EAAtC,aAAoD,CAClE;AAAA;AAAA;AACH,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,0BACvGA,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,OAAO,SAAA,CAAU,WAAA;AAAA,cACjB,QAAA,EAAU,CAAC,KAAA,KAAU,qBAAA,CAAsB,OAAO,aAAA,EAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACnF,WAAA,EAAa,EAAE,iCAAiC,CAAA;AAAA,cAChD,SAAA,EAAU;AAAA;AAAA;AACZ,SAAA,EACF,CAAA;AAAA,wBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,wCAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,SAAS,SAAA,CAAU,QAAA;AAAA,cACnB,QAAA,EAAU,CAAC,KAAA,KAAU,qBAAA,CAAsB,OAAO,UAAA,EAAY,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,cAClF,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0CAAA,EAA4C,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE;AAAA,SAAA,EAC1F,CAAA,EACF;AAAA,OAAA,EAAA,EAvDQ,KAwDV,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,+JAAA;AAAA,UAET,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,mIAAA;AAAA,UAET,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACpJO,SAAS,8BAAA,CAA+B,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAwC;AAChH,EAAA,MAAM,CAAA,GAAIY,gBAAgB,4CAA4C,CAAA;AACtE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAId,QAAAA;AAAA,IACpC,MAAA,CAAO,YAAY,GAAA,CAAI,CAAC,gBAAgB,EAAE,GAAG,YAAW,CAAE;AAAA,GAC5D;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,cAAA,CAAe,CAAC,GAAG,WAAA,EAAa,EAAE,QAAQ,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,CAAC,CAAA;AAAA,EAC7D,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAkB;AAChD,IAAA,cAAA,CAAe,YAAY,MAAA,CAAO,CAAC,GAAG,eAAA,KAAoB,eAAA,KAAoB,KAAK,CAAC,CAAA;AAAA,EACtF,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,CAAC,KAAA,EAAe,KAAA,EAAyB,UAAA,KAAuB;AAC7F,IAAA,cAAA,CAAe,WAAA,CAAY,GAAA;AAAA,MAAI,CAAC,UAAA,EAAY,eAAA,KAC1C,eAAA,KAAoB,KAAA,GAAQ,EAAE,GAAG,UAAA,EAAY,CAAC,KAAK,GAAG,UAAA,EAAW,GAAI;AAAA,KACtE,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,WAAA,EAAa,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,QAC5C,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,QAAQ,UAAA,CAAW;AAAA,OACrB,CAAE;AAAA,KACH,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EACd,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EACvB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,mBAAA;AAAA,YACT,SAAA,EAAU,oEAAA;AAAA,YAET,YAAE,eAAe;AAAA;AAAA;AACpB,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,EAAY,KAAA,qBAC5BD,IAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,kHAAA,EACzB,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,4BACzFA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,OAAO,UAAA,CAAW,MAAA;AAAA,gBAClB,QAAA,EAAU,CAAC,KAAA,KAAU,sBAAA,CAAuB,OAAO,QAAA,EAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,gBAC/E,WAAA,EAAa,EAAE,mBAAmB,CAAA;AAAA,gBAClC,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,4BACzFA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,OAAO,UAAA,CAAW,MAAA;AAAA,gBAClB,QAAA,EAAU,CAAC,KAAA,KAAU,sBAAA,CAAuB,OAAO,QAAA,EAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,gBAC/E,WAAA,EAAa,EAAE,mBAAmB,CAAA;AAAA,gBAClC,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,sBAAA,CAAuB,KAAK,CAAA;AAAA,YAC3C,SAAA,EAAU,8CAAA;AAAA,YACV,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,YAEhC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC,OAAA,EAAA,EA9BQ,KA+BV,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAf,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,+JAAA;AAAA,UAET,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,mIAAA;AAAA,UAET,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACzGA,IAAM,iBAAA,GAAoB,CAAC,OAAA,EAAS,QAAA,EAAU,aAAa,CAAA;AAEpD,SAAS,gCAAA,CAAiC,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA0C;AACpH,EAAA,MAAM,CAAA,GAAIY,gBAAgB,8CAA8C,CAAA;AACxE,EAAA,MAAM,CAAC,gBAAgB,iBAAiB,CAAA,GAAId,SAAmB,CAAC,GAAG,MAAA,CAAO,cAAc,CAAC,CAAA;AACzF,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAS,OAAO,cAAc,CAAA;AAC1E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAA0D,OAAO,eAAe,CAAA;AAC9H,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,MAAM,OAAA,GAAU,YAAY,IAAA,EAAK;AACjC,IAAA,IAAI,OAAA,IAAW,CAAC,cAAA,CAAe,QAAA,CAAS,OAAO,CAAA,EAAG;AAChD,MAAA,iBAAA,CAAkB,CAAC,GAAG,cAAA,EAAgB,OAAO,CAAC,CAAA;AAC9C,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAkB;AAC9C,IAAA,iBAAA,CAAkB,eAAe,MAAA,CAAO,CAAC,GAAG,aAAA,KAAkB,aAAA,KAAkB,KAAK,CAAC,CAAA;AAAA,EACxF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,EAAe,KAAA,KAAkB;AAC7D,IAAA,iBAAA,CAAkB,cAAA,CAAe,IAAI,CAAC,QAAA,EAAU,kBAAmB,aAAA,KAAkB,KAAA,GAAQ,KAAA,GAAQ,QAAS,CAAC,CAAA;AAAA,EACjH,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA+B;AACpD,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,iBAAA,EAAkB;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,cAAA,EAAgB,cAAA,EAAgB,iBAAiB,CAAA;AAAA,EACvE,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iEAAA,EAAmE,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,sBACzGD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,WAAA;AAAA,YACP,aAAA,EAAe,cAAA;AAAA,YACf,SAAA,EAAW,aAAA;AAAA,YACX,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,YACpC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,iBAAA;AAAA,YAER,YAAE,kBAAkB;AAAA;AAAA;AACvB,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,yBAAe,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,qBAC7BA,GAAAA,CAAC,QAAkC,SAAA,EAAU,gDAAA,EAC3C,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,OACrB,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+KAAA,EACb,kBAAQ,CAAA,EACX,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,QAAA;AAAA,YACP,aAAA,EAAe,CAAC,KAAA,KAAU,oBAAA,CAAqB,OAAO,KAAK,CAAA;AAAA,YAC3D,WAAA,EAAa,EAAE,qBAAqB,CAAA;AAAA,YACpC,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,sBAAMA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU,CAAA;AAAA,YACrC,KAAA,EAAO,CAAA,OAAA,EAAU,QAAA,IAAY,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,YACtC,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,YACzC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM;AAAA;AAAA;AACR,OAAA,EACF,CAAA,EACF,KArBS,CAAA,EAAG,KAAK,IAAI,QAAQ,CAAA,CAsB/B,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAhE,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAC9B,KAAA,EAAO,cAAA;AAAA,QACP,aAAA,EAAe,iBAAA;AAAA,QACf,WAAA,EAAa,EAAE,2BAA2B;AAAA;AAAA,KAC5C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,QAC/B,KAAA,EAAO,eAAA;AAAA,QACP,aAAA,EAAe,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAwD,CAAA;AAAA,QACrG,OAAA,EAAS,iBAAA,CAAkB,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UACxC,KAAA,EAAO,IAAA;AAAA,UACP,KAAA,EAAO,CAAA,CAAE,CAAA,IAAA,EAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE;AAAA,SAChE,CAAE;AAAA;AAAA,KACJ;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,YAAA,EAAc,CAAC,cAAA,CAAe,IAAA,MAAU,cAAA,CAAe,MAAA,KAAW,CAAA,IAAK,cAAA,CAAe,KAAK,CAAC,QAAA,KAAa,CAAC,QAAA,CAAS,MAAM;AAAA;AAAA;AAC3H,GAAA,EACF,CAAA;AAEJ;ACjHA,IAAM,gBAAA,GAAmB,CAAC,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAA;AAEhD,SAAS,+BAAA,CAAgC,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAyC;AAClH,EAAA,MAAM,CAAA,GAAIY,gBAAgB,6CAA6C,CAAA;AACvE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAId,QAAAA,CAAwD,OAAO,cAAc,CAAA;AACzH,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAS,OAAO,cAAc,CAAA;AAE1E,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,cAAA,EAAgB,gBAAgB,CAAA;AAAA,EACtD,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAC9B,KAAA,EAAO,cAAA;AAAA,QACP,aAAA,EAAe,CAAC,KAAA,KAAU,iBAAA,CAAkB,KAAsD,CAAA;AAAA,QAClG,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,CAAC,UAAU,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,GAAE,CAAE;AAAA;AAAA,KAC/F;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAC9B,KAAA,EAAO,cAAA;AAAA,QACP,aAAA,EAAe,iBAAA;AAAA,QACf,WAAA,EAAa,EAAE,2BAA2B;AAAA;AAAA,KAC5C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;ACtCA,IAAM,oBAAoB,CAAC,QAAA,EAAU,OAAO,MAAA,EAAQ,OAAA,EAAS,eAAe,SAAS,CAAA;AACrF,IAAM,kBAAA,GAAqB,CAAC,KAAA,EAAO,MAAM,CAAA;AAElC,SAAS,0BAAA,CAA2B,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAoC;AACxG,EAAA,MAAM,CAAA,GAAIY,gBAAgB,wCAAwC,CAAA;AAClE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,QAAAA,CAA8C,OAAO,SAAS,CAAA;AAChG,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,CAAS,OAAO,aAAa,CAAA;AACvE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAS,OAAO,cAAc,CAAA;AAC1E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIA,QAAAA,CAAS,MAAA,CAAO,aAAa,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,IAAIA,QAAAA,CAAS,MAAA,CAAO,WAAW,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIA,QAAAA,CAAyB,MAAA,CAAO,aAAa,KAAK,CAAA;AACpF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIA,QAAAA,CAAS,MAAA,CAAO,cAAc,EAAE,CAAA;AAEpE,EAAA,MAAM,kBAAA,GAAqB,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,KAAA;AACnE,EAAA,MAAM,iBAAiB,SAAA,KAAc,MAAA;AACrC,EAAA,MAAM,iBAAiB,SAAA,KAAc,OAAA;AAErC,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,aAAA,GAAwC;AAAA,MAC5C,GAAG,MAAA;AAAA,MACH,SAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,aAAA,CAAc,SAAA,GAAY,SAAA;AAAA,IAC5B;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,aAAA,CAAc,OAAA,GAAU,OAAA;AACxB,MAAA,aAAA,CAAc,SAAA,GAAY,SAAA;AAAA,IAC5B;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,aAAA,CAAc,UAAA,GAAa,UAAA;AAAA,IAC7B;AAEA,IAAA,MAAA,CAAO,aAAa,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EACrB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,SAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,OAAO,KAA4C,CAAA;AAAA,UAC3F,SAAA,EAAU,mQAAA;AAAA,UAET,QAAA,EAAA,iBAAA,CAAkB,GAAA,CAAI,CAAC,eAAA,qBACtBA,GAAAA,CAAC,QAAA,EAAA,EAA6B,KAAA,EAAO,eAAA,EAAkB,YAAE,CAAA,UAAA,EAAa,eAAe,CAAA,CAAE,CAAA,EAAA,EAA1E,eAA4E,CAC1F;AAAA;AAAA;AACH,KAAA,EACF,CAAA;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EACzB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,aAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,gBAAA,CAAiB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACxD,WAAA,EAAa,EAAE,0BAA0B,CAAA;AAAA,UACzC,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,cAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,iBAAA,CAAkB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACzD,WAAA,EAAa,EAAE,2BAA2B,CAAA;AAAA,UAC1C,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,IAEC,kBAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EACrB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,SAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACpD,WAAA,EAAa,EAAE,sBAAsB,CAAA;AAAA,UACrC,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,IAGD,cAAA,oBACCD,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAV,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EACnB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,OAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,UAAA,CAAW,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YAClD,WAAA,EAAa,EAAE,oBAAoB,CAAA;AAAA,YACnC,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EACrB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,SAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,OAAO,KAAuB,CAAA;AAAA,YACtE,SAAA,EAAU,mQAAA;AAAA,YAET,QAAA,EAAA,kBAAA,CAAmB,GAAA,CAAI,CAAC,KAAA,qBACvBA,GAAAA,CAAC,QAAA,EAAA,EAAmB,KAAA,EAAO,KAAA,EAAQ,YAAE,CAAA,UAAA,EAAa,KAAK,CAAA,CAAE,CAAA,EAAA,EAA5C,KAA8C,CAC5D;AAAA;AAAA;AACH,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGD,cAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EACtB,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO,UAAA;AAAA,UACP,QAAA,EAAU,CAAC,KAAA,KAAU,aAAA,CAAc,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC7D,GAAA,EAAK,CAAA;AAAA,UACL,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,+JAAA;AAAA,UAET,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAU,mIAAA;AAAA,UAET,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/JO,SAAS,4BAAA,CAA6B,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAAsC;AAC5G,EAAA,MAAM,CAAA,GAAIY,gBAAgB,0CAA0C,CAAA;AACpE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAId,QAAAA,CAAS,OAAO,gBAAgB,CAAA;AAChF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA,CAAS,OAAO,YAAY,CAAA;AACpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,CAAS,OAAO,aAAa,CAAA;AAEvE,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,gBAAA,EAAkB,YAAA,EAAc,eAAe,CAAA;AAAA,EACrE,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,uBAAuB,CAAA;AAAA,QAChC,KAAA,EAAO,gBAAA;AAAA,QACP,aAAA,EAAe,mBAAA;AAAA,QACf,WAAA,EAAa,EAAE,6BAA6B;AAAA;AAAA,KAC9C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,QAC5B,KAAA,EAAO,YAAA;AAAA,QACP,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa,EAAE,yBAAyB;AAAA;AAAA,KAC1C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,KAAA,EAAO,aAAA;AAAA,QACP,aAAA,EAAe,gBAAA;AAAA,QACf,WAAA,EAAa,EAAE,0BAA0B;AAAA;AAAA,KAC3C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,QACvB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QACnB,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA;AACV,GAAA,EACF,CAAA;AAEJ;AC1CA,IAAM,uBAAA,GAAkD;AAAA,EACtD,MAAA,EAAQ,kEAAA;AAAA,EACR,MAAA,EAAQ,kEAAA;AAAA,EACR,OAAA,EAAS,sEAAA;AAAA,EACT,IAAA,EAAM,sEAAA;AAAA,EACN,MAAA,EAAQ,0EAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,QAAA,GAAW,EAAC,EAAG,MAAA,EAAQ,UAAS,EAA8B;AAC3G,EAAA,MAAM,CAAA,GAAIY,gBAAgB,kCAAkC,CAAA;AAC5D,EAAA,MAAM,CAAC,gBAAgB,iBAAiB,CAAA,GAAId,SAAmB,CAAC,GAAG,MAAA,CAAO,cAAc,CAAC,CAAA;AACzF,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAS,OAAO,cAAc,CAAA;AAC1E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA,CAAS,OAAO,KAAK,CAAA;AAC/C,EAAA,MAAM,CAAC,iBAAiB,kBAAkB,CAAA,GAAIA,SAAiC,EAAE,GAAG,MAAA,CAAO,eAAA,EAAiB,CAAA;AAE5G,EAAA,MAAM,gBAAA,GAAmBuF,OAAAA;AAAA,IACvB,MAAM,SAAS,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,EAAA,KAAO,OAAO,cAAc,CAAA;AAAA,IACnE,CAAC,QAAA,EAAU,MAAA,CAAO,cAAc;AAAA,GAClC;AACA,EAAA,MAAM,eAAA,GAAkBA,QAAQ,MAAM,gBAAA,EAAkB,UAAU,EAAC,EAAG,CAAC,gBAAgB,CAAC,CAAA;AACxF,EAAA,MAAM,aAAA,GAAgBA,OAAAA,CAAQ,MAAM,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAI,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEjG,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,KAAW,aAAA,CAAc,MAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAA,CAAO,cAAc,CAAA;AACxD,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,MAAA,CAAO,cAAc,CAAA;AAE5D,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,iBAAA,CAAkB,EAAE,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,CAAC,GAAG,aAAa,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,SAAA,KAAsB;AAC/C,IAAA,iBAAA;AAAA,MAAkB,CAAC,QAAA,KACjB,QAAA,CAAS,QAAA,CAAS,SAAS,IACvB,QAAA,CAAS,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,SAAS,CAAA,GAC5C,CAAC,GAAG,UAAU,SAAS;AAAA,KAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,kBAAA,CAAmB,CAAC,QAAA,MAAc,EAAE,GAAG,QAAA,EAAU,EAAA,EAAI,IAAG,CAAE,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,0BAAA,GAA6B,CAAC,MAAA,EAAgB,MAAA,KAAmB;AACrE,IAAA,kBAAA,CAAmB,CAAC,QAAA,KAAa;AAC/B,MAAA,MAAM,OAAA,GAAU,EAAE,GAAG,QAAA,EAAS;AAC9B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAA;AACjC,MAAA,OAAO,QAAQ,MAAM,CAAA;AACrB,MAAA,OAAA,CAAQ,MAAM,CAAA,GAAI,KAAA;AAClB,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,uBAAA,GAA0B,CAAC,GAAA,EAAa,QAAA,KAAqB;AACjE,IAAA,kBAAA,CAAmB,CAAC,cAAc,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,QAAA,EAAS,CAAE,CAAA;AAAA,EACrE,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAAgB;AAC1C,IAAA,kBAAA,CAAmB,CAAC,QAAA,KAAa;AAC/B,MAAA,MAAM,OAAA,GAAU,EAAE,GAAG,QAAA,EAAS;AAC9B,MAAA,OAAO,QAAQ,GAAG,CAAA;AAClB,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AAEvB,IAAA,MAAM,iBAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC1D,MAAA,IAAI,GAAA,CAAI,IAAA,EAAK,IAAK,KAAA,CAAM,MAAK,EAAG;AAC9B,QAAA,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAAA,MAC1C;AAAA,IACF;AAEA,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,cAAA;AAAA,MACA,cAAA,EAAgB,eAAe,IAAA,EAAK;AAAA,MACpC,KAAA;AAAA,MACA,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAEpD,EAAA,uBACEtF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EACtB,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAW,CAAA,sEAAA,EAAyE,QAAQ,CAAA,CAAA,EAC/F,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCACZ,QAAA,EAAA,CAAA,gBAAA,EAAkB,KAAA,IAAS,OAAO,cAAA,IAAkB,GAAA,EAAK,OAAO,CAAC,CAAA,CAAE,WAAA,EAAY,EACnF,CAAA,EACF,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,wEAAA,EAA2E,UAAU,CAAA,CAAA,EACnG,QAAA,EAAA,gBAAA,EAAkB,KAAA,IAAS,MAAA,CAAO,cAAA,IAAkB,CAAA,CAAE,iBAAiB,CAAA,EAC1E;AAAA,OAAA,EACF,CAAA;AAAA,MACC,CAAC,oCACAA,GAAAA,CAAC,OAAE,SAAA,EAAU,iDAAA,EACV,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EAAiD,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,sBACtFA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,cAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,iBAAA,CAAkB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACzD,WAAA,EAAa,IAAI,gBAAA,EAAkB,KAAA,IAAS,UAAU,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,IAAA,CAAA;AAAA,UACzE,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAGAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EACjB,CAAA;AAAA,sBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EAAiD,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE,CAAA;AAAA,sBAC7EA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,CAAC,KAAA,KAAU,QAAA,CAAS,KAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,MAAA,CAAO,KAAA,EAAO,EAAE,CAAA,IAAK,CAAC,CAAC,CAAA;AAAA,UACvF,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF,CAAA;AAAA,oBAGAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EACd,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAClB,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,qBAAA;AAAA,YACT,SAAA,EAAU,2GAAA;AAAA,YAET,QAAA,EAAA,WAAA,GAAc,CAAA,CAAE,aAAa,CAAA,GAAI,EAAE,WAAW;AAAA;AAAA;AACjD,OAAA,EACF,CAAA;AAAA,MAEC,cAAA,CAAe,MAAA,KAAW,CAAA,oBACzBA,GAAAA,CAAC,OAAE,SAAA,EAAU,iDAAA,EAAmD,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EAAE,CAAA;AAAA,sBAGxFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+FAAA,EACZ,QAAA,EAAA;AAAA,QAAA,eAAA,CAAgB,MAAA,KAAW,qBAC1BC,GAAAA,CAAC,OAAE,SAAA,EAAU,oDAAA,EACV,QAAA,EAAA,CAAA,CAAE,kBAAkB,CAAA,EACvB,CAAA;AAAA,QAED,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,KAAU;AAC9B,UAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACrD,UAAA,MAAM,cAAA,GAAiB,uBAAA,CAAwB,KAAA,CAAM,IAAI,KAAK,uBAAA,CAAwB,MAAA;AAEtF,UAAA,uBACED,IAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAW,CAAA,gFAAA,EACT,UAAA,GACI,oCAAA,GACA,yCACN,CAAA,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAC,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,UAAA;AAAA,oBACL,OAAA,EAAS,UAAA;AAAA,oBACT,QAAA,EAAU,MAAM,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AAAA,oBAC5C,SAAA,EAAU;AAAA;AAAA,iBACZ;AAAA,gCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EACb,gBAAM,IAAA,EACT,CAAA;AAAA,gCACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,qDAAqD,cAAc,CAAA,CAAA,EACjF,gBAAM,IAAA,EACT;AAAA;AAAA,aAAA;AAAA,YAlBK,KAAA,CAAM;AAAA,WAmBb;AAAA,QAEJ,CAAC;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EACd,QAAA,EAAA,CAAA,CAAE,cAAc,CAAA,EACnB,CAAA;AAAA,wBACAD,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAU,mIAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAACC,QAAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAC7B,EAAE,WAAW;AAAA;AAAA;AAAA;AAChB,OAAA,EACF,CAAA;AAAA,sBACAD,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EAAiD,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,MAE9E,aAAA,CAAc,SAAS,CAAA,oBACtBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,YAAA,EAAc,SAAS,CAAA,EAAG,KAAA,qBAC7CD,IAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,yBAAA,EACzB,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,YAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,2BAA2B,YAAA,EAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YAChF,WAAA,EAAa,EAAE,cAAc,CAAA;AAAA,YAC7B,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBACzCD,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,SAAA;AAAA,YACP,UAAU,CAAC,KAAA,KAAU,wBAAwB,YAAA,EAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,YAC7E,SAAA,EAAU,sNAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAC,IAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE,CAAA;AAAA,cAChC,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,qBACpBA,GAAAA,CAAC,QAAA,EAAA,EAAwB,KAAA,EAAO,KAAA,CAAM,IAAA,EACnC,QAAA,EAAA,KAAA,CAAM,IAAA,EAAA,EADI,KAAA,CAAM,IAEnB,CACD;AAAA;AAAA;AAAA,SACH;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,kBAAA,CAAmB,YAAY,CAAA;AAAA,YAC9C,SAAA,EAAU,sEAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,aAAA,EAAc;AAAA;AAAA;AACrC,OAAA,EAAA,EA3BQ,KA4BV,CACD,CAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAjE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UACT,SAAA,EAAU,+JAAA;AAAA,UAET,YAAE,QAAQ;AAAA;AAAA,OACb;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,UAAA;AAAA,UACT,QAAA,EAAU,eAAe,MAAA,KAAW,CAAA;AAAA,UACpC,SAAA,EAAU,mLAAA;AAAA,UAET,YAAE,MAAM;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC1RA,IAAM,mBAAA,GAA8F;AAAA,EAClG,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,iBAAA,EAAmB,MAAM,eAAA,EAAgB;AAAA,EAClE,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,MAAM,aAAA,EAAc;AAAA,EAC5D,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,gBAAA,EAAkB,MAAM,cAAA,EAAe;AAAA,EAC/D,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,eAAA,EAAiB,MAAM,aAAA,EAAc;AAAA,EAC5D,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,gBAAA,EAAkB,MAAM,cAAA;AAClD,CAAA;AAQO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAS,EAA6B;AAC1F,EAAA,MAAM,YAAA,GAAeY,gBAAgB,iCAAiC,CAAA;AACtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,QAAAA,CAAS,OAAO,KAAK,CAAA;AACvD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,IAAIA,QAAAA,CAAS,MAAA,CAAO,eAAe,EAAE,CAAA;AACvE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA,CAAmC,OAAO,KAAK,CAAA;AAEzE,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,YAAA,GAAe,UAAU,IAAA,EAAK;AACpC,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAA,CAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,KAAA,EAAO,YAAA;AAAA,MACP,WAAA,EAAa,WAAA,CAAY,IAAA,EAAK,IAAK,MAAA;AAAA,MACnC;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,aAAa,YAAY,CAAA;AAAA,QAChC,KAAA,EAAO,SAAA;AAAA,QACP,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,aAAa,kBAAkB;AAAA;AAAA,KAC9C;AAAA,oBAEAA,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,aAAa,kBAAkB,CAAA;AAAA,QACtC,KAAA,EAAO,WAAA;AAAA,QACP,aAAA,EAAe,cAAA;AAAA,QACf,WAAA,EAAa,aAAa,wBAAwB,CAAA;AAAA,QAClD,IAAA,EAAM;AAAA;AAAA,KACR;AAAA,oBAEAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA,YAAA,CAAa,YAAY,CAAA,EAC5B,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BACZ,QAAA,EAAA,mBAAA,CAAoB,GAAA,CAAI,CAAC,MAAA,qBACxBA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,UACpC,SAAA,EAAW,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAI,CAAA,gBAAA,EAC5C,KAAA,KAAU,MAAA,CAAO,KAAA,GACb,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,wCAAA,CAAA,GACrB,8BACN,CAAA,CAAA;AAAA,UACA,cAAY,MAAA,CAAO;AAAA,SAAA;AAAA,QARd,MAAA,CAAO;AAAA,OAUf,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,aAAa,QAAQ,CAAA;AAAA,QAClC,SAAA,EAAW,aAAa,MAAM,CAAA;AAAA,QAC9B,QAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,YAAA,EAAc,CAAC,SAAA,CAAU,IAAA;AAAK;AAAA;AAChC,GAAA,EACF,CAAA;AAEJ;ACvCA,IAAM,eAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,iBAAA;AAAA,EACP,GAAA,EAAK,eAAA;AAAA,EACL,OAAA,EAAS,kBAAA;AAAA,EACT,IAAA,EAAM,gBAAA;AAAA,EACN,YAAA,EAAc,uBAAA;AAAA,EACd,kBAAA,EAAoB,6BAAA;AAAA,EACpB,SAAA,EAAW,qBAAA;AAAA,EACX,cAAA,EAAgB,yBAAA;AAAA,EAChB,MAAA,EAAQ,kBAAA;AAAA,EACR,mBAAA,EAAqB,8BAAA;AAAA,EACrB,mBAAA,EAAqB,8BAAA;AAAA,EACrB,iBAAA,EAAmB,4BAAA;AAAA,EACnB,mBAAA,EAAqB,8BAAA;AAAA,EACrB,kBAAA,EAAoB,6BAAA;AAAA,EACpB,aAAA,EAAe,wBAAA;AAAA,EACf,eAAA,EAAiB,0BAAA;AAAA,EACjB,MAAA,EAAQ,kBAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAOO,SAAS,gBAAgB,EAAE,MAAA,EAAQ,QAAA,GAAW,IAAG,EAAyB;AAC/E,EAAA,MAAM,CAAA,GAAIY,gBAAgB,iBAAiB,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAEvD,EAAA,MAAM,OAAO,YAAA,KAAiB,YAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,eAAe,MAAA,IAAU,IAAA;AACxC,EAAA,MAAM,SAAA,GAAY,eAAe,SAAA,IAAa,EAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,eAAe,MAAA,IAAU,IAAA;AAExC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ,OAAO,IAAA;AAE/B,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,KAAS,QAAA,GAAY,OAA4B,cAAA,GAAiB,MAAA;AAChG,EAAA,MAAM,gBAAgB,cAAA,GAAiB,aAAA,CAAc,cAAc,CAAA,GAAI,cAAA,CAAe,OAAO,IAAI,CAAA;AACjG,EAAA,MAAM,QAAA,GAAW,iBAAiB,iBAAA,CAAkB,cAAc,IAAK,oBAAA,CAAqB,MAAA,CAAO,IAAI,CAAA,IAAK,2BAAA;AAC5G,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAQ,QAAA,GAAW,CAAA,CAAE,CAAA,EAAG,QAAQ,QAAQ,CAAA,GAAI,SAAA;AAElD,EAAA,MAAM,UAAA,GAAa,CAAC,aAAA,KAAmC;AACrD,IAAA,MAAA,CAAO,QAAQ,aAAa,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,OAAA;AACH,QAAA,uBAAOZ,GAAAA,CAAC,mBAAA,EAAA,EAAoB,QAAmC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC5G,KAAK,KAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,QAAiC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACxG,KAAK,SAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,QAAoC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC9G,KAAK,MAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,QAAkC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC1G,KAAK,cAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,yBAAA,EAAA,EAA0B,QAAyC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACxH,KAAK,oBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,+BAAA,EAAA,EAAgC,QAA+C,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACpI,KAAK,WAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,uBAAA,EAAA,EAAwB,QAAuC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACpH,KAAK,gBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,2BAAA,EAAA,EAA4B,QAA2C,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC5H,KAAK,QAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,oBAAA,EAAA,EAAqB,QAAoC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC9G,KAAK,qBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,gCAAA,EAAA,EAAiC,QAAgD,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACtI,KAAK,qBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,gCAAA,EAAA,EAAiC,QAAgD,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACtI,KAAK,mBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,8BAAA,EAAA,EAA+B,QAA8C,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAClI,KAAK,qBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,gCAAA,EAAA,EAAiC,QAAgD,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACtI,KAAK,oBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,+BAAA,EAAA,EAAgC,QAA+C,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MACpI,KAAK,eAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,0BAAA,EAAA,EAA2B,QAA0C,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC1H,KAAK,iBAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,4BAAA,EAAA,EAA6B,QAA4C,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC9H,KAAK,QAAA;AACH,QAAA,uBAAOA,IAAC,oBAAA,EAAA,EAAqB,MAAA,EAAoC,UAAoB,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAClI,KAAK,OAAA;AACH,QAAA,uBAAOA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,QAAmC,MAAA,EAAQ,UAAA,EAAY,UAAU,WAAA,EAAa,CAAA;AAAA,MAC5G;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,KAAA;AAAA,MACA,QAAA,EAAU,SAAA;AAAA,MACV,MAAM,aAAA,mBAAgBA,IAAC,aAAA,EAAA,EAAc,SAAA,EAAU,sBAAqB,CAAA,GAAK,MAAA;AAAA,MACzE,QAAA;AAAA,MAEC,QAAA,EAAA,UAAA;AAAW;AAAA,GACd;AAEJ;ACxHO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,QAAA,EAAU,SAAS,MAAA,EAAQ,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,EAAyB;AAC5H,EAAA,MAAM,YAAA,GAAeY,gBAAgB,6BAA6B,CAAA;AAElE,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO,aAAa,MAAM,CAAA;AAAA,MAC1B,IAAA,EAAM,UAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,MAAA,CAAO,QAAQ,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC7C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,aAAa,WAAW,CAAA;AAAA,MAC/B,IAAA,EAAM,qBAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,WAAA,CAAY,QAAQ,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAClD,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO,aAAa,MAAM,CAAA;AAAA,MAC1B,IAAA,EAAMoG,qBAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,MAAA,CAAO,QAAQ,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC7C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MACL,KAAA,EAAO,aAAa,QAAQ,CAAA;AAAA,MAC5B,IAAA,EAAMlG,SAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,QAAA,CAAS,QAAQ,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC/C,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,uBACEd,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA,EAAc,eAAA;AAAA,MACd,MAAA,EAAO;AAAA;AAAA,GACT;AAEJ;AC3CO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,aAAa,SAAA,EAAW,SAAA,EAAW,YAAA,EAAc,mBAAA,EAAoB,EAA0B;AAC5J,EAAA,MAAM,YAAA,GAAeY,gBAAgB,6BAA6B,CAAA;AAElE,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC;AAAA,MACE,GAAA,EAAK,OAAA;AAAA,MACL,KAAA,EAAO,aAAa,OAAO,CAAA;AAAA,MAC3B,IAAA,EAAM,aAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,OAAA,EAAQ;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACtC,UAAU,CAAC,mBAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MACL,KAAA,EAAO,aAAa,WAAW,CAAA;AAAA,MAC/B,IAAA,EAAMqG,mBAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,WAAA,EAAY;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC1C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MACL,KAAA,EAAO,aAAa,SAAS,CAAA;AAAA,MAC7B,IAAA,EAAMxF,qBAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,SAAA,EAAU;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACxC,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,cAAA,EAAe;AAAA,IACvC;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MACL,KAAA,EAAO,aAAa,SAAS,CAAA;AAAA,MAC7B,IAAA,EAAM2B,gBAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,SAAA,CAAU,YAAY,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACpD,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,uBACEpD,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA,EAAc,eAAA;AAAA,MACd,MAAA,EAAO;AAAA;AAAA,GACT;AAEJ;ACzCO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,YAAA,GAAeY,gBAAgB,6BAA6B,CAAA;AAClE,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO,aAAa,MAAM,CAAA;AAAA,MAC1B,IAAA,EAAMoG,qBAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,MAAA,EAAO;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACrC,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,aAAa,WAAW,CAAA;AAAA,MAC/B,IAAA,EAAME,qBAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,WAAA,EAAY;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC1C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,gBAAA;AAAA,MACL,KAAA,EAAO,aAAa,eAAe,CAAA;AAAA,MACnC,IAAA,EAAM5D,kBAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,eAAA,EAAgB;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC9C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,QAAA;AAAA,MACL,KAAA,EAAO,aAAa,QAAQ,CAAA;AAAA,MAC5B,IAAA,EAAMxC,SAAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,QAAA,EAAS;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACvC,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,cAAA,EAAe;AAAA,IACvC;AAAA,MACE,GAAA,EAAK,YAAA;AAAA,MACL,KAAA,EAAO,aAAa,WAAW,CAAA;AAAA,MAC/B,IAAA,EAAM,aAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC5C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,aAAA;AAAA,MACL,KAAA,EAAO,aAAa,YAAY,CAAA;AAAA,MAChC,IAAA,EAAM,cAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC7C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,aAAa,UAAU,CAAA;AAAA,MAC9B,IAAA,EAAM,YAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC3C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,cAAA;AAAA,MACL,KAAA,EAAO,aAAa,aAAa,CAAA;AAAA,MACjC,IAAA,EAAM,eAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,QAAQ,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MAC9C,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,qBAAA;AAAA,MACL,KAAA,EAAO,aAAa,oBAAoB,CAAA;AAAA,MACxC,IAAA,EAAM,oBAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,kBAAkB,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACxD,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,mBAAA;AAAA,MACL,KAAA,EAAO,aAAa,kBAAkB,CAAA;AAAA,MACtC,IAAA,EAAM,kBAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,OAAA,CAAQ,gBAAgB,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACtD,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,EAAE,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,oBAAA,EAAqB;AAAA,IAC7C;AAAA,MACE,GAAA,EAAK,yBAAA;AAAA,MACL,KAAA,EAAO,aAAa,wBAAwB,CAAA;AAAA,MAC5C,IAAA,EAAM,wBAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,YAAA,CAAa,YAAY,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACvD,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,GAAA,EAAK,uBAAA;AAAA,MACL,KAAA,EAAO,aAAa,sBAAsB,CAAA;AAAA,MAC1C,IAAA,EAAM,sBAAA;AAAA,MACN,SAAS,MAAM;AAAE,QAAA,YAAA,CAAa,UAAU,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAE,CAAA;AAAA,MACrD,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,uBACEd,GAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA,EAAc,eAAA;AAAA,MACd,MAAA,EAAO;AAAA;AAAA,GACT;AAEJ;AAMA,IAAMmH,mBAAAA,GAAqB,GAAA;AAC3B,IAAMC,oBAAAA,GAAsB,EAAA;AAErB,SAAS,kBAAkB,IAAA,EAA+C;AAC/E,EAAA,OAAO;AAAA,IACL,KAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,KAAA,IAAS,KAAK,KAAA,IAASD,mBAAAA;AAAA,IAC9C,MAAA,EAAS,IAAA,CAAK,QAAA,EAAU,MAAA,IAAU,KAAK,MAAA,IAAUC;AAAA,GACnD;AACF;AAMA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAA2B;AAC5D,EAAA,uBACErH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACnCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EACjD,CAAA;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAA2B;AAC7D,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EAClD,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAU,EAA2B;AAC3D,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBACnCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EACjD,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAU,EAA2B;AAC9D,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EAClD,CAAA;AAEJ;AAEA,SAAS,oBAAA,CAAqB,EAAE,SAAA,EAAU,EAA2B;AACnE,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,eAAA,EAAgB,KAAA,EAAM,CAAA;AAAA,oBAC3DA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EAClD,CAAA;AAEJ;AAEA,SAAS,kBAAA,CAAmB,EAAE,SAAA,EAAU,EAA2B;AACjE,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,eAAA,EAAgB,KAAA,EAAM,CAAA;AAAA,oBAC3DA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EAClD,CAAA;AAEJ;AAEA,SAAS,wBAAA,CAAyB,EAAE,SAAA,EAAU,EAA2B;AACvE,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EACjD,CAAA;AAEJ;AAEA,SAAS,sBAAA,CAAuB,EAAE,SAAA,EAAU,EAA2B;AACrE,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAa,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/CA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EACjD,CAAA;AAEJ;AC5IA,IAAM,SAAA,GAAY,OAAA;AAAA,EAChB,MAAM,OAAO,eAAe,CAAA,CAAE,KAAK,CAAC,MAAA,KAAW,OAAO,SAAS,CAAA;AAAA,EAC/D,EAAE,KAAK,KAAA;AACT,CAAA;AACA,IAAM,UAAA,GAAa,OAAA;AAAA,EACjB,MAAM,OAAO,eAAe,CAAA,CAAE,KAAK,CAAC,MAAA,KAAW,OAAO,UAAU,CAAA;AAAA,EAChE,EAAE,KAAK,KAAA;AACT,CAAA;AACA,IAAM,OAAA,GAAU,OAAA;AAAA,EACd,MAAM,OAAO,eAAe,CAAA,CAAE,KAAK,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA;AAAA,EAC7D,EAAE,KAAK,KAAA;AACT,CAAA;AAMA,IAAM,mBAAA,GAAiC;AAAA,EACrC,KAAA,EAAO,aAAA;AAAA,EACP,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,YAAA;AAAA,EACN,MAAA,EAAQ,cAAA;AAAA,EACR,KAAA,EAAO,aAAA;AAAA,EACP,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,cAAA;AAAA,EACT,IAAA,EAAM,YAAA;AAAA,EACN,YAAA,EAAc,mBAAA;AAAA,EACd,kBAAA,EAAoB,yBAAA;AAAA,EACpB,SAAA,EAAW,iBAAA;AAAA,EACX,cAAA,EAAgB,qBAAA;AAAA,EAChB,MAAA,EAAQ,cAAA;AAAA,EACR,mBAAA,EAAqB,0BAAA;AAAA,EACrB,mBAAA,EAAqB,0BAAA;AAAA,EACrB,iBAAA,EAAmB,wBAAA;AAAA,EACnB,mBAAA,EAAqB,0BAAA;AAAA,EACrB,kBAAA,EAAoB,yBAAA;AAAA,EACpB,aAAA,EAAe,oBAAA;AAAA,EACf,eAAA,EAAiB,sBAAA;AAAA,EACjB,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAMA,IAAM,oBAAA,GAA2C;AAAA,EAC/C,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,cAAA;AAAA,EACnC,oBAAA;AAAA,EAAsB,WAAA;AAAA,EAAa,gBAAA;AAAA,EACnC,QAAA;AAAA,EAAU,qBAAA;AAAA,EAAuB,qBAAA;AAAA,EACjC,mBAAA;AAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA;AAAA,EAAsB,eAAA;AAAA,EACtB,iBAAA;AAAA,EAAmB,MAAA;AAAA,EACnB,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU;AACrC,CAAA;AAEA,SAAS,gBAAgB,QAAA,EAAgD;AACvE,EAAA,OAAO,oBAAA,CAAqB,SAAS,QAA4B,CAAA;AACnE;AAMA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,IAAA,EAAM,YAAA;AAAA,EACN,QAAA,EAAU,IAAA;AAAA,EACV,KAAA,EAAO,EAAE,MAAA,EAAQ,uBAAA,EAAyB,aAAa,CAAA,EAAE;AAAA,EACzD,WAAW,EAAE,IAAA,EAAM,UAAA,CAAW,WAAA,EAAa,OAAO,uBAAA;AACpD,CAAA;AAEA,IAAM,SAAA,GAA8B,CAAC,EAAA,EAAI,EAAE,CAAA;AAE3C,IAAM,qBAAA,GAAwB,SAAA;AAE9B,SAAS,oBAAoB,IAAA,EAAoB;AAC/C,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,IAAA,MAAM,cAAA,GAAkB,IAAA,CAAK,IAAA,EAAqC,MAAA,EAAQ,cAAA;AAC1E,IAAA,OAAO,sBAAsB,cAAc,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,mBAAA,CAAoB,IAAA,CAAK,IAAA,IAAQ,OAAO,CAAA,IAAK,qBAAA;AACtD;AAEA,IAAM,qBAAA,GAAwB,GAAA;AAwD9B,SAAS,mBAAA,CAAoB;AAAA,EAC3B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,YAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,SAAA,EAAW,iBAAA;AAAA,EACX,iBAAA;AAAA,EACA,qBAAA,EAAuB;AACzB,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,sBAAsB,OAAA,EAAS,QAAA,EAAU,SAAS,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAO,GAAIqH,YAAAA,EAAa;AACnG,EAAA,MAAM,SAAA,GAAYzG,gBAAgB,iBAAiB,CAAA;AACnD,EAAA,MAAM,YAAA,GAAeyE,QAAQ,MAAM,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,MAAA,EAAQ,YAAY,MAAA,CAAO,KAAA,IAAS,MAAM,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC5H,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIvF,SAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,qBAAA,GAAwB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AACrE,EAAA,MAAM,yBAAA,GAA4B,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,mBAAmB,CAAA;AAC7E,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACzD,EAAA,MAAM,aAAa,YAAA,KAAiB,OAAA;AAGpC,EAAAS,UAAU,MAAM;AACd,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,qBAAA;AAAA,QACE,EAAE,OAAA,EAAS,EAAA,EAAI,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK;AAAA,QACpF,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AACpB,EAAA,MAAM,mBAAA,GAAsBF,OAA6C,IAAI,CAAA;AAG7E,EAAA,MAAM,mBAAA,GAAsBA,OAAiG,MAAM;AAAA,EAAC,CAAC,CAAA;AAGrI,EAAA,MAAM,oBAAA,GAAuBA,OAAiC,MAAM;AAAA,EAAC,CAAC,CAAA;AAEtE,EAAA,MAAM,uBAAA,GAA0BC,WAAAA;AAAA,IAC9B,CAAC,MAAA,KAAmB;AAAE,MAAA,oBAAA,CAAqB,QAAQ,MAAM,CAAA;AAAA,IAAE,CAAA;AAAA,IAC3D;AAAC,GACH;AAGA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,MAAA,EAAgB,QAAA,EAA4B,QAAA,KAAuC;AAClF,MAAA,mBAAA,CAAoB,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,QAAQ,CAAA;AAAA,IACxD,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,QAAA,GAAW,SAAS,EAAC;AAC3B,EAAA,MAAM,QAAA,GAAW,SAAS,EAAC;AAC3B,EAAA,MAAM,WAAA,GAAc,QAAA;AAGpB,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AAC7D,EAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,YAAY,CAAA;AACxE,EAAA,MAAM,UAAU,gBAAA,CAAiB,CAAC,UAAU,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AACjE,EAAA,MAAM,UAAU,gBAAA,CAAiB,CAAC,UAAU,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAGnE,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,WAAW,CAAA;AACjE,EAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,cAAc,CAAA;AAGvE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIR,SAAS,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAkC,UAAU,CAAA;AAC1F,EAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AACjE,EAAA,MAAM,kBAAA,GAAqB,gBAAA,CAAiB,CAAC,CAAA,KAAM,EAAE,kBAAkB,CAAA;AAGvE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEhF,EAAA,MAAM,mBAAA,GAAsBQ,WAAAA,CAAY,CAAC,MAAA,KAAmB;AAC1D,IAAA,qBAAA,CAAsB,MAAM,CAAA;AAE5B,IAAA,MAAM,IAAA,GAAO,QAAQ,MAAM,CAAA;AAC3B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,MAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,yBAAA,CAA0B,MAAA,EAAS,QAAA,CAAS,KAAA,IAAoB,EAAA,EAAI,MAAM,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,yBAAyB,CAAC,CAAA;AAGvC,EAAA,MAAM,QAAA,GAAW+E,QAAQ,MAAM;AAC7B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAA8B;AAC9C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,OAAA,GAAUA,QAAQ,MAAM;AAC5B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAUA,QAAQ,MAAM;AAC5B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAuB;AACvC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,SAAA,GAAYA,QAAQ,MAAM;AAC9B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAsC;AACtD,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,YAAA,CAAa,IAAA,CAAK,CAAC,KAAA,KAAA,CAAW,MAAM,EAAA,IAAM,KAAA,CAAM,OAAA,MAAa,eAAe,CAAA,IAAK,IAAA;AAAA,IACvF,CAAC,cAAc,eAAe;AAAA,GAChC;AAGA,EAAA,MAAM,eAAA,GAAkBA,OAAAA;AAAA,IACtB,MAAO,iBAAA,GAAoB,EAAE,GAAG,mBAAA,EAAqB,GAAG,mBAAkB,GAAI,mBAAA;AAAA,IAC9E,CAAC,iBAAiB;AAAA,GACpB;AAGA,EAAA,MAAM,SAAA,GAAYA,QAAQ,OAAO;AAAA,IAC/B,OAAA,EAAS;AAAA,GACX,CAAA,EAAI,EAAE,CAAA;AAMN,EAAA,MAAM,0BAAA,GAA6B/E,WAAAA;AAAA,IACjC,CAAC,MAAA,KAAmB;AAClB,MAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AAEzB,QAAA,MAAM,cAAc,YAAA,CAAa,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAClE,QAAA,MAAM,OAAA,GAAU,aAAa,IAAA,KAAS,OAAA;AACtC,QAAA,OAAO,YAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA,CACnC,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,UAAA,IAAI,OAAA,IAAW,IAAA,CAAK,QAAA,KAAa,MAAA,EAAQ;AAEvC,YAAA,MAAM,iBAAiB,WAAA,EAAa,QAAA,IAAY,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC7D,YAAA,OAAO;AAAA,cACL,GAAG,IAAA;AAAA,cACH,QAAA,EAAU,MAAA;AAAA,cACV,MAAA,EAAQ,MAAA;AAAA,cACR,QAAA,EAAU;AAAA,gBACR,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,cAAA,CAAe,CAAA;AAAA,gBACpC,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,cAAA,CAAe;AAAA;AACtC,aACF;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACL,CAAC,CAAA;AACD,MAAA,QAAA;AAAA,QAAS,CAAC,YAAA,KACR,YAAA,CAAa,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,MAAM;AAAA,OAChF;AAAA,IACF,CAAA;AAAA;AAAA,IAEA;AAAC,GACH;AAEA,EAAA,MAAM,iBAAA,GAAoBA,YAAY,MAAc;AAClD,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjD,MAAA,MAAM,WAAA,GAAsB,YAAA,CAAa,KAAA,CAAM,GAAA,CAAI,CAAC,SAAA,KAAc;AAChE,QAAA,IAAI,SAAA,CAAU,SAAS,OAAA,EAAS;AAC9B,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,SAAA,CAAU,KAAK,QAAQ,CAAA;AAClD,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAO;AAAA,cACL,IAAI,SAAA,CAAU,EAAA;AAAA,cACd,IAAA,EAAM,OAAA;AAAA,cACN,UAAU,SAAA,CAAU,QAAA;AAAA,cACpB,IAAA,EAAM;AAAA,gBACJ,KAAA;AAAA,gBACA,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA;AAAA,gBACtB,QAAA,EAAU,oBAAoB,SAAA,CAAU,EAAA;AAAA,gBACxC,UAAU,MAAM;AACd,kBAAA,OAAA,CAAQ,GAAA,CAAI,0BAAA,EAA4B,KAAA,CAAM,IAAA,EAAM,MAAM,OAAO,CAAA;AACjE,kBAAA,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAChC,kBAAA,qBAAA,CAAsB,OAAO,MAAM,CAAA;AAAA,gBACrC,CAAA;AAAA,gBACA,kBAAA,EAAoB;AAAA;AACtB,aACF;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,IAAI,SAAA,CAAU,EAAA;AAAA,YACd,IAAA,EAAM,OAAA;AAAA,YACN,UAAU,SAAA,CAAU,QAAA;AAAA,YACpB,IAAA,EAAM,EAAE,KAAA,EAAO,SAAA,CAAU,KAAK,KAAA;AAAM,WACtC;AAAA,QACF;AACA,QAAA,IAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAC7B,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,KAAK,QAAQ,CAAA;AAChD,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,OAAO;AAAA,cACL,IAAI,SAAA,CAAU,EAAA;AAAA,cACd,IAAA,EAAM,MAAA;AAAA,cACN,UAAU,SAAA,CAAU,QAAA;AAAA,cACpB,IAAA,EAAM;AAAA,gBACJ,IAAA;AAAA,gBACA,OAAO,OAAO,IAAA,CAAK,YAAA,KAAiB,QAAA,GAAW,KAAK,YAAA,GAAe,CAAA;AAAA,gBACnE,MAAA,EAAQ,UAAA;AAAA,gBACR,QAAA,EAAU,YAAA;AAAA,gBACV,kBAAA,EAAoB;AAAA;AACtB,aACF;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,IAAI,SAAA,CAAU,EAAA;AAAA,YACd,IAAA,EAAM,MAAA;AAAA,YACN,UAAU,SAAA,CAAU,QAAA;AAAA,YACpB,IAAA,EAAM,EAAE,KAAA,EAAO,SAAA,CAAU,KAAK,KAAA;AAAM,WACtC;AAAA,QACF;AACA,QAAA,IAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAC7B,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,KAAK,QAAQ,CAAA;AAChD,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,OAAO;AAAA,cACL,IAAI,SAAA,CAAU,EAAA;AAAA,cACd,IAAA,EAAM,MAAA;AAAA,cACN,UAAU,SAAA,CAAU,QAAA;AAAA,cACpB,IAAA,EAAM;AAAA,gBACJ,IAAA;AAAA,gBACA,OAAO,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,GAAW,CAAA;AAAA,gBAC3D,MAAA,EAAQ,UAAA;AAAA,gBACR,QAAA,EAAU,YAAA;AAAA,gBACV,kBAAA,EAAoB;AAAA;AACtB,aACF;AAAA,UACF;AAEA,UAAA,MAAM,UAAA,GAAa,UAAU,IAAA,CAAK,MAAA;AAClC,UAAA,OAAO;AAAA,YACL,IAAI,SAAA,CAAU,EAAA;AAAA,YACd,IAAA,EAAM,MAAA;AAAA,YACN,UAAU,SAAA,CAAU,QAAA;AAAA,YACpB,IAAA,EAAM;AAAA,cACJ,IAAA,EAAM,MAAA;AAAA,cACN,MAAA,EAAQ,UAAA,IAAc,EAAE,IAAA,EAAM,MAAA,EAAgB;AAAA,cAC9C,KAAA,EAAO,UAAU,IAAA,CAAK,KAAA;AAAA,cACtB,KAAA,EAAO,CAAA;AAAA,cACP,MAAA,EAAQ,mBAAA;AAAA,cACR,kBAAA,EAAoB;AAAA;AACtB,WACF;AAAA,QACF;AACA,QAAA,IAAI,SAAA,CAAU,SAAS,QAAA,EAAU;AAC/B,UAAA,MAAM,YAAA,GAAe,UAAU,IAAA,CAAK,MAAA;AACpC,UAAA,MAAM,SAAS,YAAA,GAAe,SAAA,CAAU,GAAA,CAAI,YAAA,CAAa,cAAc,CAAA,GAAI,MAAA;AAC3E,UAAA,OAAO;AAAA,YACL,IAAI,SAAA,CAAU,EAAA;AAAA,YACd,IAAA,EAAM,QAAA;AAAA,YACN,UAAU,SAAA,CAAU,QAAA;AAAA,YACpB,IAAA,EAAM;AAAA,cACJ,MAAA,EAAQ,YAAA;AAAA,cACR,MAAA;AAAA,cACA,KAAA,EAAO,UAAU,IAAA,CAAK,KAAA;AAAA,cACtB,MAAA,EAAQ,mBAAA;AAAA,cACR,kBAAA,EAAoB;AAAA;AACtB,WACF;AAAA,QACF;AACA,QAAA,IAAI,SAAA,CAAU,SAAS,OAAA,EAAS;AAC9B,UAAA,MAAM,WAAA,GAAc,UAAU,IAAA,CAAK,MAAA;AACnC,UAAA,MAAM,kBAAA,GAAsC;AAAA,YAC1C,IAAA,EAAM,OAAA;AAAA,YAAS,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,KAAA,IAAS,OAAA;AAAA,YAAS,KAAA,EAAO,OAAA;AAAA,YAC9D,UAAA,EAAY,IAAA;AAAA,YAAM,KAAA,EAAO,GAAA;AAAA,YAAK,MAAA,EAAQ,GAAA;AAAA,YAAK,cAAA,EAAgB,GAAA;AAAA,YAAK,eAAA,EAAiB;AAAA,WACnF;AACA,UAAA,MAAM,iBAAiB,WAAA,IAAe,kBAAA;AACtC,UAAA,OAAO;AAAA,YACL,IAAI,SAAA,CAAU,EAAA;AAAA,YACd,IAAA,EAAM,OAAA;AAAA,YACN,UAAU,SAAA,CAAU,QAAA;AAAA,YACpB,GAAI,SAAA,CAAU,KAAA,GAAQ,EAAE,KAAA,EAAO,UAAU,KAAA,EAAM,GAAI,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,cAAA,CAAe,OAAO,MAAA,EAAQ,cAAA,CAAe,QAAO,EAAE;AAAA,YAC3H,IAAA,EAAM;AAAA,cACJ,MAAA,EAAQ,cAAA;AAAA,cACR,KAAA,EAAO,UAAU,IAAA,CAAK,KAAA;AAAA,cACtB,MAAA,EAAQ,mBAAA;AAAA,cACR,cAAA,EAAgB,uBAAA;AAAA,cAChB,kBAAA,EAAoB;AAAA;AACtB,WACF;AAAA,QACF;AAEA,QAAA,IAAI,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA,EAAG;AACnC,UAAA,MAAM,SAAS,SAAA,CAAU,IAAA,CAAK,MAAA,IAAU,4BAAA,CAA6B,UAAU,IAAwB,CAAA;AACvG,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,MAAM,QAAA,GAAiB;AAAA,cACrB,IAAI,SAAA,CAAU,EAAA;AAAA,cACd,MAAM,SAAA,CAAU,IAAA;AAAA,cAChB,UAAU,SAAA,CAAU,QAAA;AAAA,cACpB,IAAA,EAAM;AAAA,gBACJ,MAAA;AAAA,gBACA,KAAA,EAAO,UAAU,IAAA,CAAK,KAAA;AAAA,gBACtB,MAAA,EAAQ;AAAA;AACV,aACF;AAEA,YAAA,IAAI,UAAU,QAAA,EAAU;AACtB,cAAA,QAAA,CAAS,WAAW,SAAA,CAAU,QAAA;AAC9B,cAAA,QAAA,CAAS,SAAS,SAAA,CAAU,MAAA;AAAA,YAC9B;AACA,YAAA,OAAO,QAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAA,OAAO;AAAA,UACL,IAAI,SAAA,CAAU,EAAA;AAAA,UACd,MAAM,SAAA,CAAU,IAAA;AAAA,UAChB,UAAU,SAAA,CAAU,QAAA;AAAA,UACpB,IAAA,EAAM,EAAE,KAAA,EAAO,SAAA,CAAU,KAAK,KAAA;AAAM,SACtC;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,MAAM,WAAA,uBAAkB,GAAA,EAAqD;AAC7E,MAAA,KAAA,MAAW,SAAA,IAAa,aAAa,KAAA,EAAO;AAC1C,QAAA,IAAI,UAAU,QAAA,EAAU;AACtB,UAAA,WAAA,CAAY,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,EAAE,QAAA,EAAU,UAAU,QAAA,EAAU,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,QAC1F;AAAA,MACF;AACA,MAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS;AACjD,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAC1C,QAAA,IAAI,UAAA,IAAc,CAAC,IAAA,CAAK,QAAA,EAAU;AAChC,UAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,WAAW,QAAA,EAAU,MAAA,EAAQ,WAAW,MAAA,EAAO;AAAA,QAC7E;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAGD,MAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,CAAC,KAAA,EAAO,KAAA,KAAU;AAC7C,QAAA,IAAI,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,QAAA,KAAa,KAAA,CAAM,IAAI,OAAO,EAAA;AAClE,QAAA,IAAI,MAAM,IAAA,KAAS,OAAA,IAAW,MAAM,QAAA,KAAa,KAAA,CAAM,IAAI,OAAO,CAAA;AAClE,QAAA,OAAO,CAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,SAAS,OAAA,EAAS,SAAA,EAAW,eAAA,EAAiB,UAAA,EAAY,cAAc,UAAA,EAAY,YAAA,EAAc,mBAAA,EAAqB,uBAAA,EAAyB,0BAA0B,CAAC,CAAA;AAOvM,EAAA,MAAM,yBAAA,GAA4BA,WAAAA;AAAA,IAChC,CAAC,cAAkC,YAAA,KAA6C;AAC9E,MAAA,IAAI,CAAC,cAAc,OAAO,MAAA;AAC1B,MAAA,IAAI,YAAA,KAAiB,YAAY,OAAO,MAAA;AACxC,MAAA,IAAI,YAAA,KAAiB,aAAa,OAAO,OAAA;AACzC,MAAA,IAAI,YAAA,KAAiB,YAAY,OAAO,MAAA;AAExC,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,CAAM,kBAAkB,CAAA;AAC3D,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA,CAAS,aAAA,CAAc,CAAC,GAAG,EAAE,CAAA;AAC1D,QAAA,MAAM,UAAA,GAAa,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,YAAY,CAAA;AAC7E,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,MAAA,GAAS,WAAW,IAAA,CAAK,MAAA;AAC/B,UAAA,IAAI,MAAA,EAAQ,UAAA,GAAa,aAAa,CAAA,EAAG;AACvC,YAAA,OAAO,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA,CAAE,IAAA;AAAA,UAC1C;AAAA,QACF;AACA,QAAA,OAAO,CAAA,SAAA,EAAY,gBAAgB,CAAC,CAAA,CAAA;AAAA,MACtC;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,iBAAA,GAAoBA,YAAY,MAAc;AAClD,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjD,MAAA,OAAO,YAAA,CAAa,KAAA,CAAM,GAAA,CAAI,CAAC,SAAA,KAAc;AAC3C,QAAA,MAAM,SAAS,SAAA,CAAU,YAAA;AACzB,QAAA,MAAM,YAAY,MAAA,KAAW,UAAA,GAAa,qBAAA,GACtC,MAAA,KAAW,cAAc,sBAAA,GACzB,uBAAA;AAEJ,QAAA,OAAO;AAAA,UACL,IAAI,SAAA,CAAU,EAAA;AAAA,UACd,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,QAAQ,SAAA,CAAU,MAAA;AAAA,UAClB,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,cAAc,SAAA,CAAU,YAAA;AAAA,UACxB,IAAA,EAAM,SAAA;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,OAAO,yBAAA,CAA0B,SAAA,CAAU,YAAA,IAAgB,MAAA,EAAW,UAAU,MAAM,CAAA;AAAA,YACtF,YAAA,EAAc;AAAA,WAChB;AAAA,UACA,KAAA,EAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAW,EAAE,IAAA,EAAM,UAAA,CAAW,WAAA,EAAa,OAAO,SAAA;AAAU,SAC9D;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,EAAG,CAAC,YAAA,EAAc,yBAAA,EAA2B,gBAAgB,CAAC,CAAA;AAE9D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,EAAU,aAAa,CAAA,GAAI,aAAA,CAAc,mBAAmB,CAAA;AAC1E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,EAAU,aAAa,CAAA,GAAI,aAAA,CAAc,mBAAmB,CAAA;AAG1E,EAAA,oBAAA,CAAqB,OAAA,GAAU,CAAC,MAAA,KAAmB;AACjD,IAAA,iBAAA,EAAkB;AAClB,IAAA,QAAA,CAAS,CAAC,YAAA,KAAyB;AACjC,MAAA,MAAM,YAAY,YAAA,CAAa,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAChE,MAAA,IAAI,CAAC,WAAW,OAAO,YAAA;AACvB,MAAA,MAAM,YAAY,SAAA,CAAU,IAAA;AAC5B,MAAA,MAAM,cAAc,SAAA,CAAU,MAAA;AAC9B,MAAA,MAAM,sBAAsB,WAAA,CAAY,UAAA;AACxC,MAAA,MAAM,WAAW,IAAI,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,KAAa,MAAM,EAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAEvG,MAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AAChC,QAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,UAAA,MAAM,aAAA,GAAiC;AAAA,YACrC,GAAG,WAAA;AAAA,YACH,YAAY,CAAC;AAAA,WACf;AACA,UAAA,OAAO;AAAA,YACL,GAAG,IAAA;AAAA,YACH,OAAO,CAAC,mBAAA,GACJ,EAAE,KAAA,EAAO,YAAY,KAAA,EAAO,MAAA,EAAQ,WAAA,CAAY,MAAA,KAChD,EAAE,KAAA,EAAO,YAAY,cAAA,EAAgB,MAAA,EAAQ,YAAY,eAAA,EAAgB;AAAA,YAC7E,IAAA,EAAM,EAAE,GAAG,SAAA,EAAW,QAAQ,aAAA;AAAc,WAC9C;AAAA,QACF;AACA,QAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACzB,UAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,mBAAA,EAAoB;AAAA,QAChD;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,QAAA,EAAS,CAAE,KAAA;AACpD,MAAA,MAAM,iBAAiB,eAAA,CAAgB,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AACxE,MAAA,IAAI,CAAC,gBAAgB,OAAO,YAAA;AAC5B,MAAA,MAAM,iBAAiB,cAAA,CAAe,IAAA;AACtC,MAAA,MAAM,mBAAA,GAAsB,eAAe,MAAA,CAAO,UAAA;AAClD,MAAA,MAAM,WAAW,IAAI,GAAA,CAAI,eAAA,CAAgB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,KAAa,MAAM,EAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAE1G,MAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AAChC,QAAA,IAAI,QAAA,CAAS,IAAI,IAAA,CAAK,MAAM,KAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC1D,UAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,mBAAA,EAAoB;AAAA,QAChD;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkBD,OAAO,YAAY,CAAA;AAC3C,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,YAAA,KAAiB,gBAAgB,OAAA,EAAS;AAC5C,MAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,mBAAmB,iBAAA,EAAmB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAM3E,EAAA,MAAM,eAAA,GAAkBD,YAAY,MAAM;AACxC,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK,CAAE,CAAC,CAAA;AAAA,EACtF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,iBAAA,GAAoBA,YAAY,MAAM;AAC1C,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM,CAAE,CAAC,CAAA;AAAA,EACvF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,OAAA,CAAQ,EAAE,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,2BAAA,GAA8BA,WAAAA;AAAA,IAClC,CAAC,SAAA,KAA+B;AAC9B,MAAA,kBAAA,CAAmB,SAAS,CAAA;AAC5B,MAAA,IAAI,cAAc,MAAA,EAAQ;AAExB,QAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AACpD,UAAA,MAAM,EAAE,cAAA,EAAgB,EAAA,EAAI,gBAAgB,EAAA,EAAI,GAAG,MAAK,GAAI,IAAA;AAC5D,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAC,CAAA;AACF,QAAA;AAAA,MACF;AAEA,MAAA,iBAAA,EAAkB;AAElB,MAAA,MAAM,OAAO,SAAA,KAAc,IAAA;AAC3B,MAAA,MAAM,iBAAA,GAAoB,iBAAiB,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACjF,GAAG,IAAA;AAAA,QACH,cAAA,EAAgB,IAAA,GAAOO,QAAAA,CAAS,MAAA,GAASA,QAAAA,CAAS,KAAA;AAAA,QAClD,cAAA,EAAgB,IAAA,GAAOA,QAAAA,CAAS,GAAA,GAAMA,QAAAA,CAAS;AAAA,OACjD,CAAE,CAAA;AACF,MAAA,QAAA,CAAS,iBAAiB,CAAA;AAE1B,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,OAAA,CAAQ,EAAE,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,kBAAA,EAAoB,SAAS,iBAAiB;AAAA,GACzE;AAGA,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,QAAQ,CAAA;AAChE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,QAAQ,CAAA;AAEhE,EAAAN,UAAU,MAAM;AACd,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,KAAA,EAAO,aAAa,CAAC,CAAA;AAEzB,EAAAA,UAAU,MAAM;AACd,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,KAAA,EAAO,aAAa,CAAC,CAAA;AAEzB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACvC,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,MAAA,OAAO,UAAU,WAAA,KAAgB,eAAA;AAAA,IACnC,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,QAAA;AAAA,MAAS,CAAC,YAAA,KACR,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1B,GAAG,IAAA;AAAA,QACH,IAAA,EAAM;AAAA,UACJ,GAAI,IAAA,CAAK,IAAA;AAAA,UACT,WAAA,EAAa;AAAA;AACf,OACF,CAAE;AAAA,KACJ;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,eAAA,EAAiB,QAAQ,CAAC,CAAA;AAMrC,EAAA,MAAM,SAAA,GAAYD,YAAY,MAAM;AAClC,IAAA,YAAA,EAAa;AACb,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,OAAO,aAAA,EAAc,GAAI,iBAAiB,QAAA,EAAS;AACjF,IAAA,QAAA,CAAS,aAAa,CAAA;AACtB,IAAA,QAAA,CAAS,aAAa,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,QAAQ,CAAC,CAAA;AAErC,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,YAAA,EAAa;AACb,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,OAAO,aAAA,EAAc,GAAI,iBAAiB,QAAA,EAAS;AACjF,IAAA,QAAA,CAAS,aAAa,CAAA;AACtB,IAAA,QAAA,CAAS,aAAa,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,QAAQ,CAAC,CAAA;AAErC,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,aAAA,EAAc;AACd,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,OAAO,WAAA,EAAY,GAAI,iBAAiB,QAAA,EAAS;AAC7E,IAAA,QAAA,CAAS,WAAW,CAAA;AACpB,IAAA,QAAA,CAAS,WAAW,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,aAAA,EAAe,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGtC,EAAA,MAAM,uBAAA,GAA0BA,YAAY,MAAM;AAChD,IAAA,SAAA,EAAU;AACV,IAAA,aAAA,EAAc;AACd,IAAA,MAAM,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAO,eAAA,EAAgB,GAAI,iBAAiB,QAAA,EAAS;AACrF,IAAA,QAAA,CAAS,eAAe,CAAA;AACxB,IAAA,QAAA,CAAS,eAAe,CAAA;AAAA,EAC1B,GAAG,CAAC,SAAA,EAAW,aAAA,EAAe,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGjD,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAQtB,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,MAAA,KAAmB;AAC1D,IAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAC1D,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,IAAI,UAAA,CAAW,SAAS,OAAA,EAAS;AAC/B,MAAA,MAAM,KAAA,GAAS,WAAW,IAAA,EAAwB,KAAA;AAClD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,kBAAA,CAAmB,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,EAAA,IAAM,IAAI,CAAA;AACpD,QAAA,qBAAA,CAAsB,OAAO,MAAM,CAAA;AAAA,MACrC;AAAA,IACF,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,KAAS,MAAA,EAAQ;AACrC,MAAA,MAAM,IAAA,GAAQ,WAAW,IAAA,EAAuB,IAAA;AAChD,MAAA,IAAI,IAAA,eAAmB,IAAI,CAAA;AAAA,IAC7B,WAAW,UAAA,CAAW,IAAA,KAAS,MAAA,IAAW,UAAA,CAAW,MAAuB,IAAA,EAAM;AAChF,MAAA,UAAA,GAAc,UAAA,CAAW,KAAsB,IAAK,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,mBAAA,CAAoB,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,kBAAA,EAAoB,uBAAuB,MAAA,EAAQ,UAAA,EAAY,UAAA,EAAY,mBAAmB,CAAC,CAAA;AAE1G,EAAA,MAAM,gBAAA,GAAmB,EAAA;AAEzB,EAAA,MAAM,wBAAA,GAA2BA,WAAAA,CAAY,CAAC,MAAA,KAAmB;AAC/D,IAAA,iBAAA,EAAkB;AAClB,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AACjE,MAAA,IAAI,CAAC,YAAY,OAAO,YAAA;AACxB,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAG,UAAA;AAAA,QACH,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,QACtB,QAAA,EAAU;AAAA,UACR,CAAA,EAAG,UAAA,CAAW,QAAA,CAAS,CAAA,GAAI,gBAAA;AAAA,UAC3B,CAAA,EAAG,UAAA,CAAW,QAAA,CAAS,CAAA,GAAI;AAAA,SAC7B;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,EAAE,GAAG,UAAA,CAAW,IAAA;AAAK,OAC7B;AACA,MAAA,OAAO;AAAA,QACL,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM,CAAE,CAAA;AAAA,QAC5D;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAEhC,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,MAAA,KAAmB;AAC1D,IAAA,QAAA;AAAA,MAAS,CAAC,YAAA,KACR,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC1B,GAAG,IAAA;AAAA,QACH,QAAA,EAAU,KAAK,EAAA,KAAO;AAAA,OACxB,CAAE;AAAA,KACJ;AACA,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,SAAA,EAAU;AAAA,IACZ,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAExB,EAAA,MAAM,qBAAA,GAAwBA,WAAAA,CAAY,CAAC,MAAA,KAAmB;AAC5D,IAAA,iBAAA,EAAkB;AAClB,IAAA,QAAA,CAAS,CAAC,iBAAiB,YAAA,CAAa,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,MAAM,CAAC,CAAA;AAC5E,IAAA,QAAA;AAAA,MAAS,CAAC,iBACR,YAAA,CAAa,MAAA;AAAA,QACX,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,KAAK,MAAA,KAAW;AAAA;AACtD,KACF;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAE1C,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,kBAAA,GAAqBA,WAAAA,CAAY,CAAC,YAAA,KAA2C;AACjF,IAAA,iBAAA,EAAkB;AAClB,IAAA,MAAM,UAAA,GAAa,6BAA6B,MAAM,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM;AAAA,QACJ,QAAA,EAAU,EAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ;AAAA;AACV,KACF;AACA,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AAAA,MACzB,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM,CAAE,CAAA;AAAA,MAC5D;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAEhC,EAAA,MAAM,wBAAA,GAA2BA,YAAY,MAAM;AACjD,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,6BAAA,GAAgCA,YAAY,MAAM;AACtD,IAAA,uBAAA,EAAwB;AAAA,EAC1B,CAAA,EAAG,CAAC,uBAAuB,CAAC,CAAA;AAE5B,EAAA,MAAM,0BAAA,GAA6BA,YAAY,MAAM;AACnD,IAAA,iBAAA,EAAkB;AAClB,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,YAAA,CAAa,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,EAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAC/F,MAAA,OAAO,YAAA,CAAa,OAAO,CAAC,IAAA,KAAS,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAChE,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,MAAM,eAAA,GAAkB,KAAA;AACxB,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,EAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAClG,MAAA,OAAO,YAAA,CAAa,MAAA;AAAA,QAClB,CAAC,IAAA,KAAS,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,MAAM;AAAA,OACzE;AAAA,IACF,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,iBAAA,EAAmB,QAAA,EAAU,QAAA,EAAU,KAAK,CAAC,CAAA;AAEjD,EAAA,MAAM,wBAAA,GAA2BA,YAAY,MAAM;AACjD,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AAC1D,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC9B,IAAA,iBAAA,EAAkB;AAElB,IAAA,MAAM,aAAA,GAAgB,EAAA;AACtB,IAAA,MAAM,mBAAA,GAAsB,EAAA;AAE5B,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AAEX,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAM,UAAA,GAAa,kBAAkB,IAAI,CAAA;AACzC,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AACrC,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AACrC,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,QAAA,CAAS,CAAA,GAAI,WAAW,KAAK,CAAA;AACxD,MAAA,IAAA,GAAO,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,QAAA,CAAS,CAAA,GAAI,WAAW,MAAM,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,GAAO,IAAA,GAAO,aAAA,GAAgB,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,IAAA,GAAO,IAAA,GAAO,aAAA,GAAgB,CAAA,GAAI,mBAAA;AACtD,IAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,IAAA,MAAM,aAAA,GAAgB,EAAE,CAAA,EAAG,IAAA,GAAO,eAAe,CAAA,EAAG,IAAA,GAAO,gBAAgB,mBAAA,EAAoB;AAC/F,IAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAEpE,IAAA,MAAM,SAAA,GAAkB;AAAA,MACtB,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,aAAA;AAAA,MACV,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,QAAQ,WAAA,EAAY;AAAA,MAChD,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,KAAA,EAAO,OAAA;AAAA,UACP,UAAA,EAAY,IAAA;AAAA,UACZ,KAAA,EAAO,UAAA;AAAA,UACP,MAAA,EAAQ,WAAA;AAAA,UACR,cAAA,EAAgB,GAAA;AAAA,UAChB,eAAA,EAAiB;AAAA,SACnB;AAAA,QACA,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,mBAAA;AAAA,QACR,cAAA,EAAgB,uBAAA;AAAA,QAChB,kBAAA,EAAoB;AAAA;AACtB,KACF;AAEA,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,MAAM,YAAA,GAAe,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AAC9C,QAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAChC,UAAA,OAAO;AAAA,YACL,GAAG,IAAA;AAAA,YACH,QAAA,EAAU,OAAA;AAAA,YACV,MAAA,EAAQ,QAAA;AAAA,YACR,QAAA,EAAU;AAAA,cACR,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,aAAA,CAAc,CAAA;AAAA,cACnC,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,aAAA,CAAc;AAAA,aACrC;AAAA,YACA,QAAA,EAAU;AAAA,WACZ;AAAA,QACF;AACA,QAAA,OAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA,MACpC,CAAC,CAAA;AACD,MAAA,OAAO,CAAC,SAAA,EAAW,GAAG,YAAY,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,UAAU,mBAAA,EAAqB,uBAAA,EAAyB,0BAA0B,CAAC,CAAA;AAEjH,EAAA,MAAM,0BAAA,GAA6BA,YAAY,MAAM;AACnD,IAAA,MAAM,kBAAA,GAAqB,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,IAAA,KAAS,OAAO,CAAA;AACxF,IAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACrC,IAAA,iBAAA,EAAkB;AAElB,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,kBAAA,CAAmB,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAElE,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,MAAM,YAAA,GAAe,YAAA,CAClB,MAAA,CAAO,CAAC,SAAS,CAAC,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA,CACvC,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,QAAA,IAAI,KAAK,QAAA,IAAY,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChD,UAAA,MAAM,WAAA,GAAc,aAAa,IAAA,CAAK,CAAC,cAAc,SAAA,CAAU,EAAA,KAAO,KAAK,QAAQ,CAAA;AACnF,UAAA,MAAM,iBAAiB,WAAA,EAAa,QAAA,IAAY,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC7D,UAAA,OAAO;AAAA,YACL,GAAG,IAAA;AAAA,YACH,QAAA,EAAU,MAAA;AAAA,YACV,MAAA,EAAQ,MAAA;AAAA,YACR,QAAA,EAAU;AAAA,cACR,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,cAAA,CAAe,CAAA;AAAA,cACpC,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,cAAA,CAAe;AAAA;AACtC,WACF;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAEvC,EAAA,MAAM,qBAAA,GAAwBA,WAAAA,CAAY,CAAC,SAAA,KAA8B;AACvE,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AAC1D,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC9B,IAAA,iBAAA,EAAkB;AAClB,IAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAEpE,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,QAAQ,SAAA;AAAW,QACjB,KAAK,MAAA,EAAQ;AACX,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AACrE,UAAA,OAAO,YAAA,CAAa,GAAA;AAAA,YAAI,CAAC,IAAA,KACvB,eAAA,CAAgB,IAAI,IAAA,CAAK,EAAE,IAAI,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,IAAO,GAAI;AAAA,WACxF;AAAA,QACF;AAAA,QACA,KAAK,OAAA,EAAS;AACZ,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,cAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAA,GAAI,iBAAA,CAAkB,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AACzG,UAAA,OAAO,YAAA,CAAa,GAAA;AAAA,YAAI,CAAC,SACvB,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA,GAAI,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,UAAU,CAAA,EAAG,QAAA,GAAW,kBAAkB,IAAI,CAAA,CAAE,KAAA,EAAM,EAAE,GAAI;AAAA,WAC5H;AAAA,QACF;AAAA,QACA,KAAK,KAAA,EAAO;AACV,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AACrE,UAAA,OAAO,YAAA,CAAa,GAAA;AAAA,YAAI,CAAC,IAAA,KACvB,eAAA,CAAgB,IAAI,IAAA,CAAK,EAAE,IAAI,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,IAAO,GAAI;AAAA,WACxF;AAAA,QACF;AAAA,QACA,KAAK,QAAA,EAAU;AACb,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,cAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAA,GAAI,iBAAA,CAAkB,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC3G,UAAA,OAAO,YAAA,CAAa,GAAA;AAAA,YAAI,CAAC,SACvB,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA,GAAI,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,UAAU,CAAA,EAAG,SAAA,GAAY,kBAAkB,IAAI,CAAA,CAAE,MAAA,EAAO,EAAE,GAAI;AAAA,WAC9H;AAAA,QACF;AAAA,QACA,KAAK,kBAAA,EAAoB;AACvB,UAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,iBAAA,CAAkB,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA;AACjG,UAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA,IAAK,CAAA;AACpE,UAAA,OAAO,YAAA,CAAa,GAAA;AAAA,YAAI,CAAC,SACvB,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA,GAAI,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,OAAA,GAAU,iBAAA,CAAkB,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAE,EAAE,GAAI;AAAA,WAC/H;AAAA,QACF;AAAA,QACA,KAAK,gBAAA,EAAkB;AACrB,UAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,iBAAA,CAAkB,IAAI,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAClG,UAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA,IAAK,CAAA;AACpE,UAAA,OAAO,YAAA,CAAa,GAAA;AAAA,YAAI,CAAC,SACvB,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA,GAAI,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,OAAA,GAAU,iBAAA,CAAkB,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAE,EAAE,GAAI;AAAA,WAChI;AAAA,QACF;AAAA,QACA;AACE,UAAA,OAAO,YAAA;AAAA;AACX,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAEvC,EAAA,MAAM,0BAAA,GAA6BA,WAAAA,CAAY,CAAC,SAAA,KAAmC;AACjF,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AAC1D,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC9B,IAAA,iBAAA,EAAkB;AAElB,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAE5C,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,aAAa,EAAE,IAAA,CAAK,CAAC,KAAA,EAAO,KAAA,KAAU,KAAA,CAAM,QAAA,CAAS,CAAA,GAAI,KAAA,CAAM,SAAS,CAAC,CAAA;AAC5F,MAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACzC,MAAA,MAAM,UAAA,GAAc,SAAS,QAAA,CAAS,CAAA,GAAI,kBAAkB,QAAQ,CAAA,CAAE,KAAA,GAAS,SAAA,CAAU,QAAA,CAAS,CAAA;AAClG,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,iBAAA,CAAkB,IAAI,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AACtF,MAAA,MAAM,OAAA,GAAA,CAAW,UAAA,GAAa,UAAA,KAAe,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA;AAC7D,MAAA,IAAI,QAAA,GAAW,UAAU,QAAA,CAAS,CAAA;AAClC,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AACjC,QAAA,QAAA,IAAY,iBAAA,CAAkB,IAAI,CAAA,CAAE,KAAA,GAAQ,OAAA;AAAA,MAC9C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,aAAa,EAAE,IAAA,CAAK,CAAC,KAAA,EAAO,KAAA,KAAU,KAAA,CAAM,QAAA,CAAS,CAAA,GAAI,KAAA,CAAM,SAAS,CAAC,CAAA;AAC5F,MAAA,MAAM,SAAA,GAAY,OAAO,CAAC,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACzC,MAAA,MAAM,WAAA,GAAe,SAAS,QAAA,CAAS,CAAA,GAAI,kBAAkB,QAAQ,CAAA,CAAE,MAAA,GAAU,SAAA,CAAU,QAAA,CAAS,CAAA;AACpG,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,iBAAA,CAAkB,IAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AACxF,MAAA,MAAM,OAAA,GAAA,CAAW,WAAA,GAAc,WAAA,KAAgB,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA;AAC/D,MAAA,IAAI,QAAA,GAAW,UAAU,QAAA,CAAS,CAAA;AAClC,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AACjC,QAAA,QAAA,IAAY,iBAAA,CAAkB,IAAI,CAAA,CAAE,MAAA,GAAS,OAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,QAAA;AAAA,MAAS,CAAC,YAAA,KACR,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,OAAO,IAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AAC1C,QAAA,OAAO,SAAA,KAAc,YAAA,GACjB,EAAE,GAAG,IAAA,EAAM,UAAU,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,KAAA,IAAQ,GACpD,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,KAAA,EAAM,EAAE;AAAA,MAC1D,CAAC;AAAA,KACH;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAEvC,EAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,SAAS,CAAA;AAClE,EAAA,MAAM,mBAAA,GAAsB,cAAA,KAAmB,IAAA,IAAQ,cAAA,CAAe,MAAM,MAAA,GAAS,CAAA;AAGrF,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM+G,8BAAa,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,UAAA,EAAY,QAAQ,CAAC,CAAA;AAE1D,IAAA,SAASC,eAAAA,GAA0B;AACjC,MAAA,MAAM,gBAAgB,QAAA,CAAS,aAAA;AAC/B,MAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAC3B,MAAA,OAAOD,WAAAA,CAAW,GAAA,CAAI,aAAA,CAAc,OAAO,KAAM,aAAA,CAA8B,iBAAA;AAAA,IACjF;AAEA,IAAA,SAAS,cAAc,KAAA,EAAsB;AAC3C,MAAA,IAAIC,iBAAe,EAAG;AAEtB,MAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA;AAEjD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,UAAA,iBAAA,EAAkB;AAClB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AACnC,UAAA,cAAA,CAAe,SAAS,CAAA;AACxB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AACnC,UAAA,cAAA,CAAe,MAAM,CAAA;AACrB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,GAAA,KAAQ,GAAA,EAAK;AACvC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAA,CAAO,CAAC,CAAA;AACR,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,GAAA,KAAQ,GAAA,EAAK;AACvC,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAA,CAAO,GAAG,CAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,QAAQ,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY;AAAG,QAC/B,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAI,MAAM,QAAA,EAAU;AAClB,YAAA,0BAAA,EAA2B;AAAA,UAC7B,CAAA,MAAO;AACL,YAAA,wBAAA,EAAyB;AAAA,UAC3B;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,IAAI,MAAM,QAAA,EAAU;AAClB,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,SAAA,EAAU;AAAA,YACZ;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,SAAA,EAAU;AAAA,YACZ;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,SAAA,EAAU;AAAA,UACZ;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,SAAA,EAAU;AACV,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,UAAA,EAAW;AACX,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,eAAA,EAAgB;AAChB,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,uBAAA,EAAwB;AACxB,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,IAAI,MAAM,QAAA,EAAU;AAClB,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,aAAA,EAAc;AAAA,UAChB;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AAER,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,aAAA,EAAc;AACd,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA;AAAA,QACL,KAAK,GAAA,EAAK;AAER,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,OAAA,EAAQ;AACR,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA;AAAA,QACL,KAAK,GAAA,EAAK;AAER,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AAAA;AACF,IACF;AAEA,IAAA,QAAA,CAAS,iBAAiB,SAAA,EAAW,aAAA,EAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AACrE,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,oBAAoB,SAAA,EAAW,aAAA,EAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IAC1E,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,SAAS,SAAA,EAAW,SAAA,EAAW,WAAW,UAAA,EAAY,eAAA,EAAiB,iBAAA,EAAmB,aAAA,EAAe,yBAAyB,cAAA,EAAgB,MAAA,EAAQ,QAAQ,OAAA,EAAS,wBAAA,EAA0B,0BAA0B,CAAC,CAAA;AAM7O,EAAA,MAAM,cAAA,GAAiBjH,YAAY,MAAqB;AACtD,IAAA,MAAM,aAAa,QAAA,EAAS;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAe;AAC1C,QAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,QAAA,MAAM,QAAQ,QAAA,EAAU,KAAA;AACxB,QAAA,MAAM,OAAO,QAAA,EAAU,IAAA;AACvB,QAAA,MAAM,OAAO,QAAA,EAAU,IAAA;AACvB,QAAA,MAAM,aAAa,QAAA,EAAU,MAAA;AAC7B,QAAA,MAAM,cAAA,GAAiB;AAAA,UACrB,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,IAAA,EAAO,KAAK,IAAA,IAAQ,OAAA;AAAA,UACpB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,IAAA,EAAM;AAAA,YACJ,QAAA,EAAW,QAAA,EAAU,QAAA,IAAwB,KAAA,EAAO,OAAA,IAAuB,MAAM,MAAA,IAAsB,IAAA,EAAM,MAAA,IAAqB,IAAA,CAAK,IAAA,IAAQ,EAAA;AAAA,YAC/I,KAAA,EAAQ,UAAU,KAAA,IAAqB,KAAA,EAAO,QAAoB,IAAA,EAAM,IAAA,IAAoB,MAAM,IAAA,IAAmB,EAAA;AAAA,YACrH,GAAI,UAAA,GAAa,EAAE,MAAA,EAAQ,UAAA,KAAe;AAAC,WAC7C;AAAA;AAAA,UAEA,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,UACnD,GAAI,KAAK,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,EAAQ,QAAA,KAAsB,EAAC;AAAA,UAChE,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAiD;AAAC,SACnF;AACA,QAAA,OAAO,cAAA;AAAA,MACT,CAAC,CAAA;AAAA,MACD,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAgB;AAAA,QAC3C,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,YAAA,EAAc,KAAK,YAAA,IAAgB,EAAA;AAAA,QACnC,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,OACrC,CAAE,CAAA;AAAA,MACF,UAAU,UAAA,CAAW;AAAA,KACvB;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAMb,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,MAAA,YAAA,CAAa,oBAAoB,OAAO,CAAA;AAAA,IAC1C;AAEA,IAAA,mBAAA,CAAoB,OAAA,GAAU,WAAW,MAAM;AAC7C,MAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,IAChC,GAAG,qBAAqB,CAAA;AAExB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,YAAA,CAAa,oBAAoB,OAAO,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,KAAA,EAAO,aAAA,EAAe,cAAc,CAAC,CAAA;AAMhD,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,MAAM,yBAAyB,MAAM;AACnC,MAAA,IAAI,QAAA,CAAS,oBAAoB,QAAA,EAAU;AAEzC,QAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,UAAA,YAAA,CAAa,oBAAoB,OAAO,CAAA;AACxC,UAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,QAChC;AACA,QAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,YAAA,CAAa,oBAAoB,OAAO,CAAA;AACxC,QAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,MAChC;AACA,MAAA,aAAA,CAAc,gBAAgB,CAAA;AAAA,IAChC,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,sBAAsB,CAAA;AACpE,IAAA,MAAA,CAAO,gBAAA,CAAiB,gBAAgB,kBAAkB,CAAA;AAE1D,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,sBAAsB,CAAA;AACvE,MAAA,MAAA,CAAO,mBAAA,CAAoB,gBAAgB,kBAAkB,CAAA;AAAA,IAC/D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,cAAc,CAAC,CAAA;AAMlC,EAAA,MAAM,MAAA,GAASD,WAAAA;AAAA,IACb,CAAC,KAAA,KAA2B;AAC1B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AACtD,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AACtD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA;AAChD,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AAErD,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAE5B,MAAA,iBAAA,EAAkB;AAElB,MAAA,MAAM,WAAW,oBAAA,CAAqB;AAAA,QACpC,GAAG,KAAA,CAAM,OAAA;AAAA,QACT,GAAG,KAAA,CAAM;AAAA,OACV,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AAEpC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACnC,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,OAAA,GAAgB;AAAA,UACpB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,KAAA;AAAA,YACA,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA;AAAA,YACtB,QAAA,EAAU,KAAA;AAAA,YACV,UAAU,MAAM;AACd,cAAA,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAChC,cAAA,qBAAA,CAAsB,OAAO,MAAM,CAAA;AAAA,YACrC,CAAA;AAAA,YACA,kBAAA,EAAoB;AAAA;AACtB,SACF;AACA,QAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,CAAC,GAAG,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,aAAa,MAAA,EAAQ;AAC9B,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACjC,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,MAAM,OAAA,GAAgB;AAAA,UACpB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,QAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA;AAAA,YACA,OAAO,OAAO,IAAA,CAAK,YAAA,KAAiB,QAAA,GAAW,KAAK,YAAA,GAAe,CAAA;AAAA,YACnE,MAAA,EAAQ,UAAA;AAAA,YACR,QAAA,EAAU,YAAA;AAAA,YACV,kBAAA,EAAoB;AAAA;AACtB,SACF;AACA,QAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,CAAC,GAAG,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,aAAa,MAAA,EAAQ;AAC9B,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACjC,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,MAAM,OAAA,GAAgB;AAAA,UACpB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,MAAA;AAAA,UACN,QAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA;AAAA,YACA,OAAO,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,GAAW,CAAA;AAAA,YAC3D,MAAA,EAAQ,UAAA;AAAA,YACR,QAAA,EAAU,YAAA;AAAA,YACV,kBAAA,EAAoB;AAAA;AACtB,SACF;AACA,QAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,CAAC,GAAG,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,QAAA,MAAM,YAAA,GAAe,SAAA,GACjB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GACpB,MAAA;AACJ,QAAA,IAAI,CAAC,YAAA,EAAc;AACnB,QAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,YAAA,CAAa,cAAc,CAAA;AACxD,QAAA,MAAM,OAAA,GAAgB;AAAA,UACpB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,QAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,MAAA,EAAQ,YAAA;AAAA,YACR,MAAA;AAAA,YACA,KAAA;AAAA,YACA,MAAA,EAAQ,mBAAA;AAAA,YACR,kBAAA,EAAoB;AAAA;AACtB,SACF;AACA,QAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,CAAC,GAAG,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,QAAA,MAAM,cAAc,SAAA,GAChB,IAAA,CAAK,MAAM,SAAS,CAAA,GACpB,6BAA6B,OAAO,CAAA;AACxC,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,OAAA,GAAgB;AAAA,UACpB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,QAAA;AAAA,UACA,OAAO,EAAE,KAAA,EAAO,YAAY,KAAA,EAAO,MAAA,EAAQ,YAAY,MAAA,EAAO;AAAA,UAC9D,IAAA,EAAM;AAAA,YACJ,QAAQ,EAAE,GAAG,WAAA,EAAa,KAAA,EAAO,SAAS,OAAA,EAAQ;AAAA,YAClD,OAAO,KAAA,IAAS,OAAA;AAAA,YAChB,MAAA,EAAQ,mBAAA;AAAA,YACR,cAAA,EAAgB,uBAAA;AAAA,YAChB,kBAAA,EAAoB;AAAA;AACtB,SACF;AACA,QAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,CAAC,GAAG,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACpC,QAAA,MAAM,SAAS,SAAA,GACX,IAAA,CAAK,MAAM,SAAS,CAAA,GACpB,6BAA6B,QAAQ,CAAA;AACzC,QAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,QAAA,MAAM,OAAA,GAAgB;AAAA,UACpB,EAAA,EAAI,SAAA;AAAA,UACJ,IAAA,EAAM,QAAA;AAAA,UACN,QAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,MAAA;AAAA,YACA,KAAA;AAAA,YACA,MAAA,EAAQ;AAAA;AACV,SACF;AAEA,QAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AAEzB,UAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,CAAC,IAAA,KAAS;AAC9C,YAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,OAAO,KAAA;AAClC,YAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,YAAA,IAAI,CAAC,SAAA,CAAU,MAAA,CAAO,UAAA,EAAY,OAAO,KAAA;AACzC,YAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,EAA8B,KAAA,IAAS,UAAU,MAAA,CAAO,KAAA;AACjF,YAAA,MAAM,WAAA,GAAe,IAAA,CAAK,KAAA,EAA+B,MAAA,IAAU,UAAU,MAAA,CAAO,MAAA;AACpF,YAAA,OACE,QAAA,CAAS,KAAK,IAAA,CAAK,QAAA,CAAS,KAC5B,QAAA,CAAS,CAAA,IAAK,KAAK,QAAA,CAAS,CAAA,GAAI,cAChC,QAAA,CAAS,CAAA,IAAK,KAAK,QAAA,CAAS,CAAA,IAC5B,SAAS,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,GAAI,WAAA;AAAA,UAEpC,CAAC,CAAA;AAED,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,OAAA,CAAQ,WAAW,WAAA,CAAY,EAAA;AAC/B,YAAA,OAAA,CAAQ,MAAA,GAAS,QAAA;AAEjB,YAAA,OAAA,CAAQ,QAAA,GAAW;AAAA,cACjB,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,WAAA,CAAY,QAAA,CAAS,CAAA;AAAA,cACrC,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,WAAA,CAAY,QAAA,CAAS;AAAA,aACvC;AAAA,UACF;AAEA,UAAA,OAAO,CAAC,GAAG,YAAA,EAAc,OAAO,CAAA;AAAA,QAClC,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,oBAAA,EAAsB,QAAA,EAAU,OAAA,EAAS,SAAS,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,YAAA,EAAc,UAAA,EAAY,YAAA,EAAc,mBAAA,EAAqB,uBAAA,EAAyB,4BAA4B,iBAAiB;AAAA,GACzN;AAEA,EAAA,MAAM,UAAA,GAAaA,WAAAA,CAAY,CAAC,KAAA,KAA2B;AACzD,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAA,CAAM,aAAa,UAAA,GAAa,MAAA;AAAA,EAClC,CAAA,EAAG,EAAE,CAAA;AAWL,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,cAAyC,YAAA,KAA6C;AACrF,MAAA,IAAI,CAAC,cAAc,OAAO,MAAA;AAC1B,MAAA,IAAI,YAAA,KAAiB,YAAY,OAAO,MAAA;AACxC,MAAA,IAAI,YAAA,KAAiB,aAAa,OAAO,OAAA;AACzC,MAAA,IAAI,YAAA,KAAiB,YAAY,OAAO,MAAA;AAGxC,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,CAAM,kBAAkB,CAAA;AAC3D,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA,CAAS,aAAA,CAAc,CAAC,GAAG,EAAE,CAAA;AAC1D,QAAA,MAAM,UAAA,GAAa,QAAQ,YAAY,CAAA;AACvC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,WAAW,UAAA,CAAW,IAAA;AAC5B,UAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,UAAA,IAAI,MAAA,EAAQ,UAAA,GAAa,aAAa,CAAA,EAAG;AACvC,YAAA,OAAO,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA,CAAE,IAAA;AAAA,UAC1C;AAAA,QACF;AACA,QAAA,OAAO,CAAA,SAAA,EAAY,gBAAgB,CAAC,CAAA,CAAA;AAAA,MACtC;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IAChB,CAAC,UAAA,KAA2B;AAC1B,MAAA,iBAAA,EAAkB;AAElB,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,UAAA,CAAW,YAAA,EAAc,WAAW,MAAM,CAAA;AAE7E,MAAA,QAAA;AAAA,QAAS,CAAC,YAAA,KACR,OAAA;AAAA,UACE;AAAA,YACE,GAAG,UAAA;AAAA,YACH,IAAA,EAAM,SAAA;AAAA,YACN,QAAA,EAAU,IAAA;AAAA,YACV,IAAA,EAAM,EAAE,KAAA,EAAO,SAAA,EAAW,cAAc,gBAAA,EAAiB;AAAA,YACzD,KAAA,EAAO,EAAE,MAAA,EAAQ,uBAAA,EAAyB,aAAa,CAAA,EAAE;AAAA,YACzD,WAAW,EAAE,IAAA,EAAM,UAAA,CAAW,WAAA,EAAa,OAAO,uBAAA;AAAwB,WAC5E;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,iBAAA,EAAmB,gBAAA,EAAkB,gBAAgB;AAAA,GAClE;AAGA,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,UAAA,KAAkC;AACjC,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAC5C,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAC5C,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY,OAAO,KAAA;AAGvC,MAAA,IAAI,UAAA,CAAW,MAAA,KAAW,UAAA,CAAW,MAAA,EAAQ,OAAO,KAAA;AAEpD,MAAA,MAAM,aAAa,UAAA,CAAW,IAAA;AAC9B,MAAA,MAAM,aAAa,UAAA,CAAW,IAAA;AAG9B,MAAA,IAAI,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,MAAA,EAAQ,OAAO,KAAA;AAG3D,MAAA,IAAI,UAAA,KAAe,SAAS,OAAO,KAAA;AAEnC,MAAA,IAAI,UAAA,KAAe,OAAO,OAAO,KAAA;AAEjC,MAAA,IAAI,UAAA,KAAe,UAAU,OAAO,KAAA;AAGpC,MAAA,IAAI,UAAA,KAAe,iBAAA,IAAqB,UAAA,KAAe,WAAA,EAAa,OAAO,KAAA;AAG3E,MAAA,IAAI,UAAA,KAAe,MAAA,EAAQ,OAAO,UAAA,KAAe,OAAA;AAEjD,MAAA,IAAI,UAAA,KAAe,OAAA,EAAS,OAAO,UAAA,KAAe,MAAA;AAElD,MAAA,IAAI,UAAA,KAAe,QAAQ,OAAO,KAAA;AAGlC,MAAA,IAAI,UAAA,KAAe,SAAS,OAAO,IAAA;AAEnC,MAAA,IAAI,UAAA,KAAe,WAAW,OAAO,IAAA;AAErC,MAAA,IAAI,UAAA,KAAe,uBAAuB,OAAO,IAAA;AAEjD,MAAA,IAAI,UAAA,KAAe,aAAa,OAAO,IAAA;AAMvC,MAAA,IAAI,eAAA,CAAgB,UAAU,CAAA,EAAG,OAAO,IAAA;AAExC,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,YAAA,KAAyB;AACxB,MAAA,iBAAA,EAAkB;AAEb,IACP,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAOA,EAAA,mBAAA,CAAoB,OAAA,GAAUA,WAAAA;AAAA,IAC5B,CAAC,MAAA,EAAgB,QAAA,EAA4B,QAAA,KAAuC;AAClF,MAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAEhC,MAAA,iBAAA,EAAkB;AAElB,MAAA,MAAM,MAAA,GAAS,6BAA6B,QAAQ,CAAA;AACpD,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,SAAA,GAAY,OAAO,UAAA,EAAW;AACpC,MAAA,MAAM,OAAA,GAAgB;AAAA,QACpB,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,EAAE,CAAA,EAAG,QAAA,CAAS,IAAI,GAAA,EAAK,CAAA,EAAG,QAAA,CAAS,CAAA,GAAI,EAAA,EAAG;AAAA,QACpD,IAAA,EAAM;AAAA,UACJ,MAAA;AAAA,UACA,KAAA,EAAO,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAC,SAAA,KAAc,SAAA,CAAU,WAAA,EAAa,CAAA;AAAA,UAC1F,MAAA,EAAQ;AAAA;AACV,OACF;AAEA,MAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,CAAC,GAAG,YAAA,EAAc,OAAO,CAAC,CAAA;AAErD,MAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,QAAA,MAAM,eAAe,YAAA,CAAa,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AACnE,QAAA,IAAI,CAAC,cAAc,OAAO,YAAA;AAE1B,QAAA,MAAM,uBAAuB,YAAA,CAAa,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,MAAM,CAAA;AAE7E,QAAA,MAAM,eAAA,GAAwB;AAAA,UAC5B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,UACtB,QAAQ,YAAA,CAAa,MAAA;AAAA,UACrB,MAAA,EAAQ,SAAA;AAAA,UACR,cAAc,YAAA,CAAa,YAAA;AAAA,UAC3B,YAAA,EAAc,SAAA;AAAA,UACd,IAAA,EAAM,SAAA;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,KAAA,EAAQ,aAAa,IAAA,EAA8C,KAAA;AAAA,YACnE,YAAA,EAAc;AAAA,WAChB;AAAA,UACA,KAAA,EAAO,EAAE,MAAA,EAAQ,uBAAA,EAAyB,aAAa,CAAA,EAAE;AAAA,UACzD,WAAW,EAAE,IAAA,EAAM,UAAA,CAAW,WAAA,EAAa,OAAO,uBAAA;AAAwB,SAC5E;AAEA,QAAA,MAAM,eAAA,GAAwB;AAAA,UAC5B,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,UACtB,MAAA,EAAQ,SAAA;AAAA,UACR,QAAQ,YAAA,CAAa,MAAA;AAAA,UACrB,YAAA,EAAc,WAAA;AAAA,UACd,cAAc,YAAA,CAAa,YAAA;AAAA,UAC3B,IAAA,EAAM,SAAA;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACV,IAAA,EAAM,EAAE,YAAA,EAAc,gBAAA,EAAiB;AAAA,UACvC,KAAA,EAAO,EAAE,MAAA,EAAQ,uBAAA,EAAyB,aAAa,CAAA,EAAE;AAAA,UACzD,WAAW,EAAE,IAAA,EAAM,UAAA,CAAW,WAAA,EAAa,OAAO,uBAAA;AAAwB,SAC5E;AAEA,QAAA,OAAO,CAAC,GAAG,oBAAA,EAAsB,eAAA,EAAiB,eAAe,CAAA;AAAA,MACnE,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,iBAAA,EAAmB,QAAA,EAAU,QAAA,EAAU,qBAAqB,gBAAgB;AAAA,GAC/E;AAaA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIR,SAA2B,IAAI,CAAA;AAErE,EAAA,MAAM,qBAAA,GAAwBQ,WAAAA;AAAA,IAC5B,CAAC,OAAyB,IAAA,KAAe;AACvC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,uBAAA,CAAwB,UAAU,EAAA,EAAI;AACvD,MAAA,cAAA,CAAe;AAAA,QACb,IAAA,EAAM,MAAA;AAAA,QACN,UAAU,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,MAAM,OAAA,EAAQ;AAAA,QAC/C,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,KAAA,KAAyC;AACxC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,uBAAA,CAAwB,UAAU,EAAA,EAAI;AACvD,MAAA,MAAM,OAAA,GAAU,qBAAqB,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,OAAA,EAAS,CAAA;AAC3E,MAAA,cAAA,CAAe;AAAA,QACb,IAAA,EAAM,OAAA;AAAA,QACN,UAAU,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,MAAM,OAAA,EAAQ;AAAA,QAC/C,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,0BAAA,GAA6BA,WAAAA;AAAA,IACjC,CAAC,KAAA,KAAyC;AACxC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,uBAAA,CAAwB,UAAU,EAAA,EAAI;AACvD,MAAA,cAAA,CAAe;AAAA,QACb,IAAA,EAAM,WAAA;AAAA,QACN,UAAU,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,MAAM,OAAA;AAAQ,OAChD,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAIA,EAAA,MAAM,uBAAA,GAA0BD,OAAe,CAAC,CAAA;AAEhD,EAAA,MAAM,gBAAA,GAAmBC,YAAY,MAAM;AACzC,IAAA,cAAA,CAAe,CAAC,QAAA,KAAa;AAC3B,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA,uBAAA,CAAwB,OAAA,GAAU,KAAK,GAAA,EAAI;AAAA,MAC7C;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AAAE,IAAA,gBAAA,EAAiB;AAAA,EAAE,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AACpF,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AAAE,IAAA,gBAAA,EAAiB;AAAA,EAAE,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AACpF,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AAAE,IAAA,gBAAA,EAAiB;AAAA,EAAE,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAGpF,EAAyB+E,QAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,oBAAoB,OAAO,IAAA;AAChC,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,YAAA,KAAiB,YAAA,CAAa,OAAO,kBAAkB,CAAA;AAChF,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,IAAA,MAAM,KAAA,GAAS,SAAS,KAAA,IAAoB,EAAA;AAC5C,IAAA,OAAO,EAAE,MAAA,EAAQ,kBAAA,EAAoB,MAAA,EAAQ,KAAA,EAAM;AAAA,EACrD,CAAA,EAAG,CAAC,kBAAA,EAAoB,KAAK,CAAC;AAE9B,EAAA,MAAM,yBAAA,GAA4B/E,WAAAA,CAAY,CAAC,MAAA,EAAgB,aAAA,KAAmC;AAChG,IAAA,iBAAA,EAAkB;AAClB,IAAA,QAAA;AAAA,MAAS,CAAC,YAAA,KACR,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,QAAA,IAAI,IAAA,CAAK,EAAA,KAAO,MAAA,EAAQ,OAAO,IAAA;AAC/B,QAAA,MAAM,cAAuC,EAAE,GAAG,IAAA,CAAK,IAAA,EAAM,QAAQ,aAAA,EAAc;AAEnF,QAAA,IAAI,aAAA,CAAc,IAAA,KAAS,OAAA,IAAW,OAAA,IAAW,aAAA,EAAe;AAC9D,UAAA,WAAA,CAAY,QAAQ,aAAA,CAAc,KAAA;AAAA,QACpC;AACA,QAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,MACtC,CAAC;AAAA,KACH;AACA,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,QAAA,EAAU,iBAAiB,CAAC,CAAA;AAEhC,EAAA,uBACEP,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,KAAA;AAAA,UACA,aAAA;AAAA,UACA,aAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA,eAAA;AAAA,UACA,WAAA,EAAa,eAAA;AAAA,UACb,WAAA,EAAa,eAAA;AAAA,UACb,WAAA,EAAa,eAAA;AAAA,UACb,iBAAA,EAAmB,qBAAA;AAAA,UACnB,iBAAA,EAAmB,qBAAA;AAAA,UACnB,sBAAA,EAAwB,0BAAA;AAAA,UACxB,iBAAA;AAAA,UACA,SAAA,EAAW,eAAA;AAAA,UACX,SAAA;AAAA,UACA,kBAAA,EAAoB,oBAAA;AAAA,UACpB,uBAAA,EAAyB,oBAAA;AAAA,UACzB,WAAW,WAAA,KAAgB,MAAA,GAAS,IAAA,GAAO,CAAC,GAAG,CAAC,CAAA;AAAA,UAChD,iBAAiB,WAAA,KAAgB,SAAA;AAAA,UACjC,UAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU,SAAA;AAAA,UACV,OAAA,EAAO,IAAA;AAAA,UACP,cAAA,EAAgB,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,UAC/B,OAAA,EAAS,GAAA;AAAA,UACT,OAAA,EAAS,GAAA;AAAA,UACT,iBAAiB,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,MAAM,GAAA,EAAI;AAAA,UACzC,UAAA,EAAY,EAAE,eAAA,EAAiB,IAAA,EAAK;AAAA,UACpC,aAAA,EAAe,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,UACrC,mBAAA,EAAqB,EAAE,MAAA,EAAQ,uBAAA,EAAyB,aAAa,CAAA,EAAE;AAAA,UAEvE,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,SAAS,iBAAA,CAAkB,IAAA;AAAA,gBAC3B,GAAA,EAAK,EAAA;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,YACC,+BACCA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,mBAAA;AAAA,gBACX,SAAA,EAAU,qBAAA;AAAA,gBACV,SAAA,EAAU,2HAAA;AAAA,gBACV,KAAA,EAAO,EAAE,+BAAA,EAAiC,aAAA,EAAc;AAAA,gBACxD,QAAA,EAAQ,IAAA;AAAA,gBACR,QAAA,EAAQ;AAAA;AAAA;AACV;AAAA;AAAA,OAEJ;AAAA,sBAGAA,GAAAA;AAAA,QAAC,mBAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA,EAAW,aAAA;AAAA,UACX,MAAA,EAAQ,SAAA;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA;AAAA,UACA,OAAA;AAAA,UACA,WAAA;AAAA,UACA,mBAAA,EAAqB,cAAA;AAAA,UACrB,WAAA;AAAA,UACA,iBAAiB,MAAM,cAAA,CAAe,CAAC,QAAA,KAAa,CAAC,QAAQ,CAAA;AAAA,UAC7D,eAAA;AAAA,UACA,uBAAA,EAAyB,MACvB,kBAAA,CAAmB,CAAC,aAAc,QAAA,KAAa,UAAA,GAAa,YAAY,UAAW,CAAA;AAAA,UAErF,eAAA;AAAA,UACA,uBAAA,EAAyB,2BAAA;AAAA,UACzB,aAAA;AAAA,UACA,mBAAmB,MAAM,gBAAA,CAAiB,CAAC,QAAA,KAAa,CAAC,QAAQ,CAAA;AAAA,UACjE,gBAAA,EAAkB,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,UAC9C;AAAA;AAAA,OACF;AAAA,MAGC,WAAA,EAAa,IAAA,KAAS,MAAA,IAAU,WAAA,CAAY,4BAC3CA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,OAAA,EAAS,gBAAA;AAAA,UACT,MAAA,EAAQ,mBAAA;AAAA,UACR,WAAA,EAAa,wBAAA;AAAA,UACb,MAAA,EAAQ,mBAAA;AAAA,UACR,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,MAED,WAAA,EAAa,IAAA,KAAS,OAAA,IAAW,WAAA,CAAY,gCAC5CA,GAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,cAAc,WAAA,CAAY,YAAA;AAAA,UAC1B,OAAA,EAAS,gBAAA;AAAA,UACT,OAAA,EAAS,gBAAA;AAAA,UACT,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,aAAA;AAAA,UACX,SAAA,EAAW,kBAAA;AAAA,UACX;AAAA;AAAA,OACF;AAAA,MAED,WAAA,EAAa,IAAA,KAAS,WAAA,oBACrBA,GAAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACC,UAAU,WAAA,CAAY,QAAA;AAAA,UACtB,OAAA,EAAS,gBAAA;AAAA,UACT,MAAA,EAAQ,wBAAA;AAAA,UACR,WAAA,EAAa,6BAAA;AAAA,UACb,QAAA,EAAU,0BAAA;AAAA,UACV,eAAA,EAAiB,wBAAA;AAAA,UACjB,OAAA,EAAS,qBAAA;AAAA,UACT,YAAA,EAAc;AAAA;AAAA;AAChB,KAAA,EAEJ,CAAA;AAAA,IAEC,iBAAA,GAAoB;AAAA,MACnB,KAAA,EAAO,aAAA;AAAA,MACP,MAAA;AAAA,MACA,MAAM,UAAA,IAAc,eAAA;AAAA,MACpB,YAAA,EAAc,eAAA;AAAA,MACd,SAAS,MAAM;AACb,QAAA,iBAAA,EAAkB;AAClB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,IAAI,iBAAiB,mBAAA,IAAsB;AAAA,MAC7C,CAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,iBAAA,EAAkB;AAClB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,IAAI,iBAAiB,mBAAA,IAAsB;AAC3C,QAAA,YAAA,IAAe;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,oBAEDA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,CAAC,MAAA,EAAQ,MAAA,KAAW;AAC1B,UAAA,yBAAA,CAA0B,QAAQ,MAAM,CAAA;AACxC,UAAA,iBAAA,EAAkB;AAClB,UAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,QAC5B,CAAA;AAAA,QACA,QAAA,EAAU;AAAA;AAAA;AACZ,GAAA,EACF,CAAA;AAEJ;AAMO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,uBACEA,IAAC,iBAAA,EAAA,EACC,QAAA,kBAAAA,IAAC,mBAAA,EAAA,EAAqB,GAAG,OAAO,CAAA,EAClC,CAAA;AAEJ;ACz7DA,SAAS,mBAAmB,KAAA,EAA8B;AACxD,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,WAAW,MAAA,GAAS,CAAC,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA;AAC1E,IAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,OAAO,KAAK,MAAM,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iCAAiC,cAAA,EAAuC;AAC/E,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,uBAAuB,IAAI,CAAC,CAAA;AACnE,EAAA,IAAI,SAAA,EAAW,OAAO,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEjD,EAAA,MAAM,WAAW,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA;AAC9D,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,OAAA,GAAU,mBAAmB,OAAO,CAAA;AAC1C,IAAA,IAAI,OAAA,IAAW,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5C,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,0BAA0B,cAAA,EAAgC;AACjE,EAAA,MAAM,OAAA,GAAU,iCAAiC,cAAc,CAAA;AAC/D,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AACvE;AAEA,eAAe,oBAAA,CAAwB,gBAAwB,IAAA,EAA0B;AACvF,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,0BAA0B,cAAc,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,IAClF,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,UAAU,cAAc,CAAA,CAAA;AAAA,MACvC,gBAAA,EAAkB,cAAA;AAAA,MAClB,cAAA,EAAgB;AAAA;AAClB,GACD,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,SAAS,EAAA,IAAM,CAAC,KAAK,OAAA,IAAW,CAAC,KAAK,IAAA,EAAM;AAC/C,IAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,6BAAA,EAAgC,QAAA,CAAS,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,IAAA,CAAK,IAAA;AACd;AAEA,IAAM,sBAAA,GAAyBoE,cAA4C,IAAI,CAAA;AAExE,SAAS,uBAAA,CAAwB;AAAA,EACtC,cAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,MAAA,GAASiB,QAA+B,OAAO;AAAA,IACnD,cAAA;AAAA,IACA,qBAAA,EAAuB,OAAO,UAAA,KAAuB;AACnD,MAAA,MAAM,CAAC,UAAU,MAAA,EAAQ,MAAA,EAAQ,OAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QACjE,qBAA+B,cAAA,EAAgB,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,QAC7F,oBAAA,CAA4F,gBAAgB,iBAAiB,CAAA;AAAA,QAC7H,oBAAA,CAAmC,gBAAgB,gBAAgB,CAAA;AAAA,QACnE,oBAAA,CAAoC,gBAAgB,eAAe,CAAA;AAAA,QACnE,oBAAA,CAAkC,gBAAgB,QAAQ;AAAA,OAC3D,CAAA;AAED,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,KAAA,EAAO,SAAS,KAAA,IAAS,IAAA;AAAA,QACzB,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC7B,GAAG,KAAA;AAAA,UACH,WAAA,EAAa,CAAA;AAAA,UACb,mBAAA,EAAqB;AAAA,SACvB,CAAE,CAAA;AAAA,QACF,MAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF,CAAA,EAAI,CAAC,cAAc,CAAC,CAAA;AAEpB,EAAA,uBACErF,GAAAA,CAAC,sBAAA,CAAuB,UAAvB,EAAgC,KAAA,EAAO,QACrC,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,wBAAA,GAAkD;AAChE,EAAA,MAAM,OAAA,GAAUwH,WAAW,sBAAsB,CAAA;AACjD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,gCAAA,GAAiE;AAC/E,EAAA,OAAOA,WAAW,sBAAsB,CAAA;AAC1C;AChHO,SAAS,SAAA,CAAU;AAAA,EACxB,MAAA,GAAS,IAAA;AAAA,EACT,WAAW,EAAC;AAAA,EACZ,SAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,wBAAwB,gCAAA,EAAiC;AAC/D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI1H,SAA+B,IAAI,CAAA;AAC/E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAAoD,EAAE,CAAA;AACpG,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAAoD,EAAE,CAAA;AACpG,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAmD,EAAE,CAAA;AACjG,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAmD,EAAE,CAAA;AAEjG,EAAA,MAAM,2BAAA,GAA8BuF,OAAAA;AAAA,IAClC,MAAM,QAAQ,UAAA,KAAe,CAAC,YAAY,MAAA,IAAU,CAAC,YAAY,MAAA,CAAO,CAAA;AAAA,IACxE,CAAC,UAAA,EAAY,WAAA,CAAY,MAAA,EAAQ,YAAY,MAAM;AAAA,GACrD;AAEA,EAAA9E,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,2BAAA,IAA+B,CAAC,UAAA,IAAc,CAAC,qBAAA,EAAuB;AACzE,MAAA;AAAA,IACF;AAEA,IAAA,KAAK,sBAAsB,qBAAA,CAAsB,UAAU,CAAA,CACxD,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,iBAAA,CAAkB,QAAQ,KAAK,CAAA;AAC/B,MAAA,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AACjC,MAAA,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AACjC,MAAA,iBAAA,CAAkB,QAAQ,KAAK,CAAA;AAC/B,MAAA,iBAAA,CAAkB,QAAQ,KAAK,CAAA;AAAA,IACjC,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,2BAAA,EAA6B,UAAA,EAAY,qBAAqB,CAAC,CAAA;AAEnE,EAAA,MAAM,aAAA,GAAgB,YAAY,YAAA,IAAgB,cAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAA,IAAU,eAAA;AAC7C,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAA,IAAU,eAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,YAAY,KAAA,IAAS,cAAA;AAC3C,EAAA,MAAM,aAAA,GAAgB,YAAY,KAAA,IAAS,cAAA;AAE3C,EAAA,uBACEP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,SAAA,IAAa,iBAC3B,QAAA,kBAAAA,GAAAA;AAAA,IAAC,sBAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,QAAA;AAAA,MACA,kBAAA,EAAoB,CAAC,EAAE,SAAA,EAAW,GAAA,EAAI,KAAO,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAAA,MACjF,SAAS,MAAM;AAAA,MAAC,CAAA;AAAA,MAEhB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACE,GAAG,WAAA;AAAA,UACJ,YAAA,EAAc,aAAA;AAAA,UACd,MAAA,EAAQ,cAAA;AAAA,UACR,MAAA,EAAQ,cAAA;AAAA,UACR,KAAA,EAAO,aAAA;AAAA,UACP,KAAA,EAAO;AAAA;AAAA;AACT;AAAA,GACF,EACF,CAAA;AAEJ;ACtEO,SAAS,kBAAA,CAAmB,EAAE,SAAA,EAAU,EAAc;AAC3D,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,KAAA,EAAM,SAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,cAAW,WAAA,EACvF,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4KAA2K,CAAA,EACrL,CAAA;AAEJ;AAEO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAAc;AACvD,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,SAAA,EAAsB,YAAA,EAAW,aAAA,EAEpE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yEAAA,EAA0E,MAAK,cAAA,EAAe,CAAA;AAAA,oBACtGA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wCAAuC,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,IAAA,EAAK,MAAA,EAAO,SAAQ,KAAA,EAAM;AAAA,GAAA,EACzI,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAAc;AACtD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,KAAA,EAAM,SAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,cAAW,MAAA,EACvF,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,osCAAmsC,CAAA,EAC7sC,CAAA;AAEJ;AAEO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAU,EAAc;AACxD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,IAAA,EAAK,cAAA,EAAe,SAAA,EAAsB,YAAA,EAAW,UAC5E,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,88CAA68C,CAAA,EACv9C,CAAA;AAEJ;AAEO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAU,EAAc;AACzD,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,SAAA,EAAsB,YAAA,EAAW,eAAA,EACpE,QAAA,EAAA;AAAA,oBAAAC,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sEAAqE,IAAA,EAAK,SAAA,EAAU,SAAQ,MAAA,EAAO,CAAA;AAAA,oBAC3GA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qFAAA,EAAsF,QAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,IAAA,EAAK,MAAA,EAAO,CAAA;AAAA,oBAC3IA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yBAAA,EAA0B,MAAK,SAAA,EAAU,CAAA;AAAA,oBACjDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB,MAAK,SAAA,EAAU;AAAA,GAAA,EAC1C,CAAA;AAEJ;AAGO,SAAS,aAAa,OAAA,EAI3B;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,YAAY,CAAA,EAAG;AACpC,IAAA,OAAO,EAAE,aAAA,EAAe,kBAAA,EAAoB,KAAA,EAAO,oCAAA,EAAsC,eAAe,WAAA,EAAY;AAAA,EACtH;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,OAAO,EAAE,aAAA,EAAe,cAAA,EAAgB,KAAA,EAAO,sCAAA,EAAwC,eAAe,QAAA,EAAS;AAAA,EACjH;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO,EAAE,aAAA,EAAe,aAAA,EAAe,KAAA,EAAO,kCAAA,EAAoC,eAAe,MAAA,EAAO;AAAA,EAC1G;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,OAAO,EAAE,aAAA,EAAe,gBAAA,EAAkB,KAAA,EAAO,kCAAA,EAAoC,eAAe,QAAA,EAAS;AAAA,EAC/G;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,IAAA,OAAO,EAAE,aAAA,EAAe,eAAA,EAAiB,KAAA,EAAO,wCAAA,EAA0C,eAAe,QAAA,EAAS;AAAA,EACpH;AAEA,EAAA,OAAO,EAAE,aAAA,EAAe,kBAAA,EAAoB,KAAA,EAAO,kCAAA,EAAoC,eAAe,QAAA,EAAS;AACjH;AC1DA,SAASwE,YAAAA,CAAY,EAAE,MAAA,EAAO,EAAuB;AACnD,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,+DAAA;AAAA,IACT,OAAA,EAAS,kEAAA;AAAA,IACT,OAAA,EAAS,sEAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AACA,EAAA,uBACExE,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,4EAAA,EAA+E,QAAA,CAAS,MAAM,CAAA,IAAK,QAAA,CAAS,OAAO,CAAA,CAAA,EACjI,QAAA,EAAA,MAAA,EACH,CAAA;AAEJ;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,IAAI,EAAA,GAAK,GAAA,EAAM,OAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClC;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,EAAM,EAAsC;AACvE,EAAA,MAAM,YAAA,GAAe,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACtF,EAAA,MAAM,MAAA,GAAS,OAAO,YAAA,KAAiB,QAAA,IAAY,aAAa,MAAA,GAAS,GAAA;AAEzE,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0FAAA,EACV,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,IACC,MAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACZ,QAAA,EAAA,YAAA,EACH,CAAA,mBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAqD,QAAA,EAAA,YAAA,EAAa;AAAA,GAAA,EAEnF,CAAA;AAEJ;AAGA,SAAS,kBAAA,CAAmB,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,eAAA,EAAiB,kBAAA,EAAoB,iBAAA,EAAmB,WAAA,EAAa,cAAA,EAAgB,GAAA,EAAK,MAAA,EAAQ,WAAU,EAOzJ;AACD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,EAAA,KAAO,eAAe,CAAA,EAAG,IAAA,IAAQ,eAAA,IAAmB,QAAA;AACnG,EAAA,MAAM,YAAa,KAAA,CAAkC,MAAA;AACrD,EAAA,MAAM,aAAA,GAAgB,iBAAiB,iBAAiB,CAAA;AAGxD,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,EAAA,MAAM,gBAAA,GAAwE;AAAA,IAC5E,QAAA,EAAU,EAAE,KAAA,EAAO,kEAAA,EAAoE,UAAU,0BAAA,EAA2B;AAAA,IAC5H,YAAA,EAAc,EAAE,KAAA,EAAO,kEAAA,EAAoE,UAAU,8BAAA,EAA+B;AAAA,IACpI,QAAA,EAAU,EAAE,KAAA,EAAO,sEAAA,EAAwE,UAAU,0BAAA,EAA2B;AAAA,IAChI,MAAA,EAAQ,EAAE,KAAA,EAAO,8EAAA,EAAgF,UAAU,wBAAA;AAAyB,GACtI;AACA,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA;AAErD,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6JAAA,EAEZ,QAAA,EAAA;AAAA,IAAA,WAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,EAAG,YAAY,KAAK,CAAA,uEAAA,CAAA,EAClC,YAAE,WAAA,CAAY,QAAQ,GACzB,CAAA,EACF,CAAA;AAAA,oBAIFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EAAiG,CAAA;AAAA,MAC/G,4BACCA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,KAAK,KAAA,CAAM,IAAA;AAAA,UACX,OAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAU;AAAA;AAAA,OACZ,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iKAAA,EACb,QAAA,kBAAAA,GAAAA,CAACyH,WAAAA,EAAA,EAAY,SAAA,EAAU,sBAAA,EAAuB,CAAA,EAChD,CAAA;AAAA,sBAGFzH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sIAAA,EACb,QAAA,kBAAAA,GAAAA,CAACyH,WAAAA,EAAA,EAAY,SAAA,EAAU,wBAAA,EAAyB,CAAA,EAClD;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAGAzH,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kEAAA,EACX,gBAAM,IAAA,EACT,CAAA;AAAA,IAGC,KAAA,CAAM,IAAA,oBACLA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,kBAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8LAAA,EACd,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,IAAA,EAAK,cAAA,EAAe,SAAQ,WAAA,EACnD,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,QAAA,EAAS,WAAU,CAAA,EAAE,8MAAA,EAA+M,UAAS,SAAA,EAAU,CAAA;AAAA,wBAC7PA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oGAAA,EAAqG;AAAA,OAAA,EAC/G,CAAA;AAAA,MACC,KAAA,CAAM;AAAA,KAAA,EACT,CAAA,EACF,CAAA;AAAA,oBAIFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mIAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAACyH,WAAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,wBACjCzH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAiB,QAAA,EAAA,SAAA,EAAU;AAAA,OAAA,EAC7C,CAAA;AAAA,MACC,OAAO,IAAA,oBACND,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+HAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAA0B,QAAA,EAAA,GAAA,EAAI;AAAA,OAAA,EAChD;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,kBAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,kFAAA,EAAqF,aAAA,CAAc,UAAU,CAAA,CAAA,EAC5H,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,aAAA,CAAc,aAAA,EAAd,EAA4B,WAAU,aAAA,EAAc,CAAA;AAAA,MACpD,aAAA,CAAc;AAAA,KAAA,EACjB,CAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,GAAA,EAAU,MAAA,EAAgB,MAAA,EAAgB,eAAA,EAAkC,kBAAA,EAAwC,WAAA,EAA0B,cAAA,EAAgC,SAAA,EAAsB,CAAA,EAAM,CAAA;AAAA,oBAG/ND,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,KAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,KAAA,CAAM;AAAA,OAAA,EAAoB,CAAA;AAAA,sBAClCC,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,sBACPD,KAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,WAAA;AAAA,QAAY,SAAA;AAAA,QAAQ,KAAA,CAAM,WAAA,KAAgB,CAAA,GAAI,EAAA,GAAK;AAAA,OAAA,EAAI;AAAA,KAAA,EACtE;AAAA,GAAA,EACF,CAAA;AAEJ;AAMA,IAAM,cAAA,GAAsG;AAAA,EAC1G,SAAA,EAAW;AAAA,IACT,EAAE,MAAA,EAAQ,wBAAA,EAA0B,SAAA,EAAW,IAAA,EAAM,eAAe,MAAA,EAAO;AAAA,IAC3E,EAAE,MAAA,EAAQ,yBAAA,EAA2B,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,IAC1E,EAAE,MAAA,EAAQ,uBAAA,EAAyB,SAAA,EAAW,KAAA,EAAO,eAAe,IAAA;AAAK,GAC3E;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,kBAAA,EAAoB,SAAA,EAAW,IAAA,EAAM,eAAe,MAAA,EAAO;AAAA,IACrE,EAAE,MAAA,EAAQ,iBAAA,EAAmB,SAAA,EAAW,IAAA,EAAM,eAAe,MAAA;AAAO,GACtE;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,uBAAA,EAAyB,SAAA,EAAW,IAAA,EAAM,eAAe,IAAA,EAAK;AAAA,IACxE,EAAE,MAAA,EAAQ,uBAAA,EAAyB,SAAA,EAAW,KAAA,EAAO,eAAe,IAAA;AAAK,GAC3E;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAE,MAAA,EAAQ,YAAA,EAAc,SAAA,EAAW,IAAA,EAAM,eAAe,MAAA;AAAO,GACjE;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,EAAE,MAAA,EAAQ,mBAAA,EAAqB,SAAA,EAAW,KAAA,EAAO,eAAe,IAAA,EAAK;AAAA,IACrE,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAA,EAAW,KAAA,EAAO,eAAe,IAAA;AAAK;AAEtE,CAAA;AAEA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,YAAY,CAAA,EAAG,OAAO,WAAA;AAC7C,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,QAAA;AAC1C,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,MAAA;AACxC,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,WAAW,GAAA,EAKlB;AACA,EAAA,IAAI,GAAA,GAAM,MAAM,OAAO;AAAA,IACrB,OAAA,EAAS,UAAA;AAAA,IAAY,WAAA,EAAa,aAAA;AAAA,IAClC,KAAA,EAAO,eAAA;AAAA,IAAiB,QAAA,EAAU,2BAAA;AAAA,IAClC,eAAA,EAAiB,EAAA;AAAA,IAAI,WAAA,EAAa,QAAA;AAAA,IAClC,WAAA,EAAa,CAAA;AAAA,IAAG,WAAA,EAAa;AAAA,GAC/B;AACA,EAAA,IAAI,GAAA,GAAM,MAAM,OAAO;AAAA,IACrB,OAAA,EAAS,cAAA;AAAA,IAAgB,WAAA,EAAa,gBAAA;AAAA,IACtC,KAAA,EAAO,eAAA;AAAA,IAAiB,QAAA,EAAU,2BAAA;AAAA,IAClC,eAAA,EAAiB,EAAA;AAAA,IAAI,WAAA,EAAa,OAAA;AAAA,IAClC,WAAA,EAAa,CAAA;AAAA,IAAG,WAAA,EAAa;AAAA,GAC/B;AACA,EAAA,IAAI,GAAA,GAAM,KAAM,OAAO;AAAA,IACrB,OAAA,EAAS,UAAA;AAAA,IAAY,WAAA,EAAa,cAAA;AAAA,IAClC,KAAA,EAAO,gBAAA;AAAA,IAAkB,QAAA,EAAU,6BAAA;AAAA,IACnC,eAAA,EAAiB,EAAA;AAAA,IAAI,WAAA,EAAa,OAAA;AAAA,IAClC,WAAA,EAAa,CAAA;AAAA,IAAG,WAAA,EAAa;AAAA,GAC/B;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IAAU,WAAA,EAAa,cAAA;AAAA,IAChC,KAAA,EAAO,kBAAA;AAAA,IAAoB,QAAA,EAAU,iCAAA;AAAA,IACrC,eAAA,EAAiB,GAAA;AAAA,IAAK,WAAA,EAAa,OAAA;AAAA,IACnC,WAAA,EAAa,CAAA;AAAA,IAAG,WAAA,EAAa;AAAA,GAC/B;AACF;AAcA,SAAS,mBAAA,CAAoB,EAAE,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,eAAA,EAAiB,kBAAA,EAAoB,WAAA,EAAa,cAAA,EAAgB,SAAA,EAAW,CAAA,EAAE,EAAwB;AACzJ,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAA,CAAM,GAAA,GAAM,QAAQ,IAAA,GAAO,GAAA,CAAA,GAAQ,KAAK,GAAG,CAAA;AAEnE,EAAA,MAAM,QAAA,GAAW,uBAAuB,eAAe,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,QAAQ,CAAA,IAAK,cAAA,CAAe,SAAA;AAG1D,EAAA,MAAM,eAAA,GAAkBO,WAAAA,CAAY,CAAC,KAAA,KAA+C;AAClF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,OAAO,EAAE,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAM,CAAA;AAEb,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM,CAAA;AACjC,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AAClE,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA;AAGxC,IAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,CAAG,UAAA,CAAW,YAAY,CAAC,CAAA;AAC9E,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,kBAAA,CAAmB,cAAc,EAAE,CAAA;AAAA,IACrC;AAEA,IAAA,cAAA,CAAe,QAAQ,WAAW,CAAA;AAClC,IAAA,SAAA,EAAU;AAAA,EACZ,GAAG,CAAC,MAAA,EAAQ,QAAQ,kBAAA,EAAoB,cAAA,EAAgB,SAAS,CAAC,CAAA;AAGlE,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,KAAA,KAAkB;AACzD,IAAA,MAAM,MAAA,GAAiC,EAAE,EAAA,EAAI,GAAA,EAAM,IAAI,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK;AACjF,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAK,CAAA,IAAK,GAAA;AAChC,IAAA,MAAA,CAAO,MAAM,CAAA;AAEb,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM,CAAA;AACjC,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,SAAS,CAAC,CAAA;AAClE,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA;AACxC,IAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,CAAG,UAAA,CAAW,YAAY,CAAC,CAAA;AAC9E,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,kBAAA,CAAmB,cAAc,EAAE,CAAA;AAAA,IACrC;AAEA,IAAA,cAAA,CAAe,QAAQ,WAAW,CAAA;AAClC,IAAA,SAAA,EAAU;AAAA,EACZ,GAAG,CAAC,MAAA,EAAQ,QAAQ,kBAAA,EAAoB,cAAA,EAAgB,SAAS,CAAC,CAAA;AAGlE,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,eAAA,CAAgB,UAAA,CAAW,KAAA,CAAM,MAAM,CAAC,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AACvG,EAAA,MAAM,gBAAA,GAAmB,OAAO,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,EAAA,KAAO,eAAe,CAAA,EAAG,IAAA,IAAQ,eAAA;AAEvF,EAAA,uBACEP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iHAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qFAAA,EAAuF,QAAA,EAAA,CAAA,CAAE,8BAA8B,CAAA,EAAE,CAAA;AAAA,wBACzID,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,kCAAkC,QAAA,CAAS,KAAK,IAAK,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,0BAC1EA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAA+C,QAAA,EAAA,KAAA,EAAG;AAAA,SAAA,EACpE;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2GAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,qCAAA,EAAwC,QAAA,CAAS,QAAQ,CAAA,4BAAA,CAAA;AAAA,cACpE,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA;AAAI;AAAA,WACnC;AAAA,UACC,CAAC,MAAM,IAAA,EAAM,GAAI,EAAE,GAAA,CAAI,CAAC,6BACvBA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAU,+DAAA;AAAA,cACV,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAA,CAAK,WAAW,GAAA,KAAQ,IAAA,GAAO,GAAA,CAAA,GAAQ,GAAG,CAAA,CAAA,CAAA;AAAI,aAAA;AAAA,YAFxD;AAAA,WAIR;AAAA,SAAA,EACH,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,GAAA,EAAI,KAAA;AAAA,YACJ,GAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAO,GAAA;AAAA,YACP,QAAA,EAAU,eAAA;AAAA,YACV,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBACAA,GAAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,CAAA,wDAAA,EACN,GAAA,GAAM,OAAO,SAAA,GAAY,GAAA,GAAM,IAAA,GAAO,SAAA,GAAY,GAAA,GAAM,GAAA,GAAO,YAAY,SAC7E,CAAA,sBAAA,EACE,GAAA,GAAM,IAAA,GAAO,qBAAA,GAAwB,GAAA,GAAM,IAAA,GAAO,sBAAA,GAAyB,GAAA,GAAM,GAAA,GAAO,sBAAA,GAAyB,sBACnH,CAAA,GAAA,CAAA,EAAM;AAAA,OAAA,EACR,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,UAAK,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBACTA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACVA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACVA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACVA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,MAAA,EAAI;AAAA,OAAA,EACZ;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0GAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EAAE,CAAA;AAAA,wBACnFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gEAAgE,QAAA,EAAA,gBAAA,EAAiB;AAAA,OAAA,EAChG,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAAE,CAAA;AAAA,wBACvFA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAuD,QAAA,EAAA,kBAAA,CAAmB,SAAA,CAAU,gBAAe,EAAE;AAAA,OAAA,EACpH,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,wBACrFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EAAuD,6BAAmB,aAAA,EAAc;AAAA,OAAA,EACvG,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,wBACzFA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAuD,QAAA,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,OAAA,EAC7F,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE,CAAA;AAAA,wBACtFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,sBAAA,EAAyB,QAAA,CAAS,KAAK,CAAA,CAAA,EAAK,QAAA,EAAA,CAAA,CAAE,CAAA,YAAA,EAAe,QAAA,CAAS,WAAW,EAAE,CAAA,EAAE;AAAA,OAAA,EACrG,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,wBACzFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EAAuD,mBAAS,WAAA,EAAY;AAAA,OAAA,EAC3F;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,wBAC9FA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0BAAA,EAA6B,QAAA,CAAS,KAAK,CAAA,CAAA,EAAK,QAAA,EAAA,CAAA,CAAE,CAAA,YAAA,EAAe,QAAA,CAAS,WAAW,EAAE,CAAA,EAAE;AAAA,OAAA,EAC5G,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA;AAAA,QACC,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,QAC1B,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,KAAA,EAAM;AAAA,QAC1B,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO;AAAA,QAC3B,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,MAAA;AAAO,QAC5B,GAAA,CAAI,CAAC,EAAE,KAAA,uBACPA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,UACxC,SAAA,EAAW,0CACT,KAAA,IAAS,QAAA,CAAS,kBACd,CAAA,iBAAA,EAAoB,QAAA,CAAS,QAAQ,CAAA,iBAAA,CAAA,GACrC,uEACN,CAAA;AAAA,SAAA;AAAA,QAPK;AAAA,OASR,CAAA,EACH,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,wBACpCA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,4BAA4B,CAAA,EAAE,CAAA;AAAA,wBACvCA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE;AAAA,OAAA,EACvC;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,EAAQ,GAAG,eAAA,EAAiB,kBAAA,EAAoB,iBAAA,EAAmB,oBAAA,EAAsB,WAAA,EAAa,cAAA,EAAgB,KAAA,EAAO,SAAA,EAAW,WAAU,EAM3K;AACD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIF,QAAAA,CAAU,KAAA,CAAM,gBAA2B,EAAE,CAAA;AAEjF,EAAA,MAAM,uBAAA,GAA0BQ,WAAAA,CAAY,CAAC,KAAA,KAA+C;AAC1F,IAAA,cAAA,CAAe,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7C,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,kBAAA,GAAqBA,WAAAA,CAAY,CAAC,KAAA,KAAkD;AACxF,IAAA,aAAA,CAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAChC,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,qBAAqB,WAAA,GAAc,GAAA;AACzC,EAAA,MAAM,YAAY,WAAA,IAAe,GAAA;AACjC,EAAA,MAAM,UAAA,GAAa,WAAA,GAAc,GAAA,IAAO,WAAA,IAAe,GAAA;AACvD,EAAA,MAAM,aAAa,WAAA,GAAc,GAAA;AAEjC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAChD,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,MAAA,EAAQ,iBAAiB,CAAA;AAGtE,EAAA,MAAM,qBAAA,GAAwBA,WAAAA,CAAY,CAAC,YAAA,KAAiC;AAC1E,IAAA,oBAAA,CAAqB,YAAY,CAAA;AACjC,IAAA,IAAI,CAAC,8BAAA,CAA+B,eAAA,EAAiB,YAAY,CAAA,EAAG;AAClE,MAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,MAAA,EAAQ,YAAY,CAAA;AAC3D,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,kBAAA,CAAmB,UAAA,CAAW,CAAC,CAAA,CAAE,EAAE,CAAA;AAAA,MACrC;AAAA,IACF;AACA,IAAA,SAAA,EAAU;AAAA,EACZ,GAAG,CAAC,eAAA,EAAiB,QAAQ,oBAAA,EAAsB,kBAAA,EAAoB,SAAS,CAAC,CAAA;AAEjF,EAAA,uBACEP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EAAmE,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAAE,CAAA;AAAA,sBAC/GA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1B,QAAA,MAAM,IAAA,GAAO,eAAe,GAAG,CAAA;AAC/B,QAAA,MAAM,aAAa,GAAA,KAAQ,iBAAA;AAC3B,QAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,MAAA,EAAQ,GAAG,CAAA,CAAE,MAAA;AACrD,QAAA,uBACED,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,qBAAA,CAAsB,GAAG,CAAA;AAAA,YACxC,WAAW,CAAA,mGAAA,EACT,UAAA,GACI,GAAG,IAAA,CAAK,UAAU,4BAClB,uGACN,CAAA,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,IAAA,CAAK,aAAA,EAAL,EAAmB,WAAU,aAAA,EAAc,CAAA;AAAA,cAC3C,IAAA,CAAK,KAAA;AAAA,8BACNA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAgC,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA,WAAA;AAAA,UAXvD;AAAA,SAYP;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EACd,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,mBAAmB,CAAA;AAAA,QACrB,gBAAA,CAAiB,SAAS,MAAA,CAAO,MAAA,oBAChCA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iEAAA,EAAkE,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAC9E,gBAAA,CAAiB,MAAA;AAAA,UAAO,GAAA;AAAA,UAAE,MAAA,CAAO,MAAA;AAAA,UAAO;AAAA,SAAA,EAC5C;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACrB,QAAA,MAAM,UAAA,GAAa,MAAM,EAAA,KAAO,eAAA;AAChC,QAAA,MAAM,YAAA,GAAe,8BAAA,CAA+B,KAAA,CAAM,EAAA,EAAI,iBAAiB,CAAA;AAC/E,QAAA,MAAM,EAAE,aAAA,EAAe,KAAA,EAAO,eAAc,GAAI,YAAA,CAAa,MAAM,EAAE,CAAA;AACrE,QAAA,uBACED,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,UAAU,CAAC,YAAA;AAAA,YACX,SAAS,MAAM;AAAE,cAAA,kBAAA,CAAmB,MAAM,EAAE,CAAA;AAAG,cAAA,SAAA,EAAU;AAAA,YAAE,CAAA;AAAA,YAC3D,WAAW,CAAA,iFAAA,EACT,CAAC,eACG,sEAAA,GACA,UAAA,GACE,mHACA,wHACR,CAAA,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,iBAAc,SAAA,EAAW,CAAA,sBAAA,EAAyB,cAAc,YAAA,GAAe,KAAA,GAAQ,kCAAkC,CAAA,CAAA,EAAI,CAAA;AAAA,8BAC9HD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,+BAAA,EAAkC,UAAA,IAAc,eAAe,+BAAA,GAAkC,kCAAkC,CAAA,CAAA,EAC9I,QAAA,EAAA,KAAA,CAAM,IAAA,EACT,CAAA;AAAA,gCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDAAyD,QAAA,EAAA,aAAA,EAAc;AAAA,eAAA,EACtF;AAAA;AAAA,WAAA;AAAA,UAlBK,KAAA,CAAM;AAAA,SAmBb;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA;AAAA,wBACtGA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEACb,QAAA,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,EACxB;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2GAAA,EACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,0DAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,GAAG,kBAAkB,CAAA,CAAA,CAAA;AAAA,cAC5B,UAAA,EAAY,CAAA,qDAAA;AAAA;AACd;AAAA,SACF,EACF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,GAAA,EAAI,GAAA;AAAA,YACJ,GAAA,EAAI,GAAA;AAAA,YACJ,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,WAAA;AAAA,YACP,QAAA,EAAU,uBAAA;AAAA,YACV,SAAA,EAAU,kXAAA;AAAA,YACV,KAAA,EAAO;AAAA;AAAA;AAAA,cAGL,CAAC,eAAyB,GAAG,SAAA,GAAY,SAAA,GAAY,aAAa,SAAA,GAAY;AAAA;AAChF;AAAA,SACF;AAAA,wBACAA,IAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA,0BAAA,EAEU,SAAA,GAAY,SAAA,GAAY,UAAA,GAAa,SAAA,GAAY,SAAS,CAAA;AAAA,kCAAA,EAClD,SAAA,GAAY,sBAAA,GAAyB,UAAA,GAAa,sBAAA,GAAyB,sBAAsB,CAAA;AAAA;AAAA,UAAA,CAAA,EAEzH;AAAA,OAAA,EACJ,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0CAAA,EAA6C,SAAA,GAAY,kBAAkB,kCAAkC,CAAA,CAAA,EAC3H,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0CAAA,EAA6C,UAAA,GAAa,iBAAA,GAAoB,kCAAkC,CAAA,CAAA,EAC9H,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,0CAAA,EAA6C,UAAA,GAAa,eAAA,GAAkB,kCAAkC,CAAA,CAAA,EAC5H,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAC3B;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE,CAAA;AAAA,wBACvGD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EACb,QAAA,EAAA;AAAA,YAAA,UAAA,CAAW,MAAA;AAAA,YAAO;AAAA,WAAA,EACrB,CAAA;AAAA,UACC,yBACCC,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,SAAA,EAAU,+KAAA;AAAA,cAET,YAAE,kBAAkB;AAAA;AAAA,WACvB;AAAA,UAED,CAAC,KAAA,IAAS,UAAA,CAAW,MAAA,GAAS,CAAA,oBAC7BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EAAE;AAAA,SAAA,EAEvF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,UAAA;AAAA,UACP,QAAA,EAAU,kBAAA;AAAA,UACV,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAU,+YAAA;AAAA,UACV,WAAA,EAAa,EAAE,qCAAqC;AAAA;AAAA;AACtD,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,OAAA,EAAS,CAAA,EAAE,EAA+D;AAC9F,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,WAAW,CAAA;AAEjE,EAAA,MAAM,WAAA,GAAcqF,QAAQ,MAAM;AAChC,IAAA,OAAO,WAAA,CAAY,OAAO,CAAA,IAAK,IAAA;AAAA,EACjC,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAEzB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,uBACErF,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,CAAA,CAAE,uBAAuB,GAAE,CAAA,EACtF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,WAAA,CAAY,IAAI,CAAA,GAAI,YAAY,IAAA,GAAO,IAAA;AAEhE,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,wBAChGA,GAAAA,CAACwE,YAAAA,EAAA,EAAY,MAAA,EAAQ,YAAY,MAAA,EAAQ;AAAA,OAAA,EAC3C,CAAA;AAAA,MACC,YAAY,UAAA,IAAc,IAAA,oBACzBzE,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0CAAA,EACb,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,sBAAsB,CAAA;AAAA,QAAE,IAAA;AAAA,QAAG,cAAA,CAAe,YAAY,UAAU;AAAA,OAAA,EACrE;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,WAAA,CAAY,KAAA,oBACXC,GAAAA,CAAC,SAAI,SAAA,EAAU,0FAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,WAAA,CAAY,OAAM,CAAA,EACvF,CAAA;AAAA,IAGD,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,oBACxCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iFAAA,EACX,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAClC,CAAA;AAAA,MACC,OAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,qBACvCA,GAAAA,CAAC,UAAA,EAAA,EAAqB,OAAO,GAAA,EAAK,KAAA,EAAA,EAAjB,GAA+B,CACjD;AAAA,KAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAQ,EAAqB;AACzD,EAAA,MAAM,CAAA,GAAIY,gBAAgB,iBAAiB,CAAA;AAG3C,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAEvD,EAAA,MAAM,OAAO,YAAA,KAAiB,OAAA;AAC9B,EAAA,OAAA,CAAQ,IAAI,6BAAA,EAA+B,YAAA,EAAc,cAAc,SAAA,EAAW,KAAA,EAAO,QAAQ,MAAM,CAAA;AACvG,EAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,IAAS,IAAA;AAClC,EAAA,MAAM,MAAA,GAAS,SAAA,EAAW,MAAA,IAAU,EAAC;AACrC,EAAA,MAAM,YAAA,GAAe,WAAW,YAAA,IAAgB,KAAA;AAGhD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,SAAgB,QAAQ,CAAA;AAC1D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAiB,QAAQ,CAAA;AAC3E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,GAAG,CAAA;AAClD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,SAAS,GAAI,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,IAAI,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAU,KAAA,EAAO,OAAA,IAAW,KAAA,EAAO,EAAA,IAAM,EAAA;AAC/C,EAAAS,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,kBAAA,CAAmB,MAAM,OAAA,IAAW,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,EAAE,CAAA;AACvD,IAAA,oBAAA,CAAqB,MAAA,CAAQ,KAAA,CAAkC,SAAA,IAAa,QAAQ,CAAC,CAAA;AACrF,IAAA,cAAA,CAAe,KAAA,CAAM,eAAe,GAAG,CAAA;AACvC,IAAA,MAAA,CAAO,MAAA,CAAQ,KAAA,CAAkC,GAAA,IAAO,GAAI,CAAC,CAAA;AAC7D,IAAA,QAAA,CAAS,CAAC,YAAY,CAAA;AACtB,IAAA,YAAA,CAAa,QAAQ,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,QAAQ,CAAC,KAAA;AACf,EAAA,MAAM,YAAYD,WAAAA,CAAY,MAAM,SAAS,KAAK,CAAA,EAAG,EAAE,CAAA;AACvD,EAAA,MAAM,YAAYA,WAAAA,CAAY,MAAM,SAAS,IAAI,CAAA,EAAG,EAAE,CAAA;AAEtD,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAM;AACxC,IAAA,SAAA,EAAU;AACV,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAEvB,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,IAAA,mBACJN,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACX,QAAA,EAAA,CAAC,QAAA,EAAU,SAAS,CAAA,CAAY,GAAA,CAAI,CAAC,wBACrCA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,YAAA,CAAa,GAAG,CAAA;AAAA,MAC/B,SAAA,EAAW,CAAA,uDAAA,EACT,SAAA,KAAc,GAAA,GACV,gEACA,+EACN,CAAA,CAAA;AAAA,MAEC,QAAA,EAAA,CAAA,CAAE,GAAA,KAAQ,QAAA,GAAW,uBAAA,GAA0B,wBAAwB;AAAA,KAAA;AAAA,IATnE;AAAA,GAWR,CAAA,EACH,CAAA;AAGF,EAAA,uBACED,IAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,OAAO,KAAA,CAAM,IAAA;AAAA,MACb,QAAA,EAAU,MAAM,IAAA,IAAQ,EAAA;AAAA,MACxB,QAAA,EAAS,+BAAA;AAAA,MACT,sBAAMC,GAAAA,CAACyH,WAAAA,EAAA,EAAY,WAAU,oBAAA,EAAqB,CAAA;AAAA,MAClD,IAAA;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAzH,GAAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAc,MAAA,EAAgB,CAAA,EAAM,eAAA,EAAkC,kBAAA,EAAwC,iBAAA,EAAwD,WAAA,EAA0B,cAAA,EAAgC,GAAA,EAAU,MAAA,EAAgB,WAAW,SAAA,EAAW,CAAA;AAAA,QAGnS,SAAA,KAAc,QAAA,mBACbA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAc,MAAA,EAAgB,CAAA,EAAM,eAAA,EAAkC,kBAAA,EAAwC,iBAAA,EAAwD,oBAAA,EAAsB,CAAC,EAAA,KAAuB,oBAAA,CAAqB,EAAE,CAAA,EAAG,WAAA,EAA0B,cAAA,EAAgC,KAAA,EAAc,SAAA,EAAsB,SAAA,EAAW,eAAA,EAAiB,CAAA,mBAEnXA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA,EAAM;AAAA;AAAA;AAAA,GAE9C;AAEJ;ACnsBO,IAAM,mBAAA,GAAsBH,MAAAA,CAAyB,CAAC,GAAA,MAAS;AAAA;AAAA,EAEpE,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,EAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,WAAA,EAAa,EAAA;AAAA,EACb,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY,CAAA;AAAA,EACZ,KAAA,EAAO,KAAA;AAAA;AAAA,EAGP,UAAA,EAAY,CAAC,IAAA,KAAS,GAAA,CAAI;AAAA,IACxB,IAAA;AAAA,IACA,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,IACnB,QAAA,EAAU,KAAK,QAAA,IAAY,UAAA;AAAA,IAC3B,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAAA,IAC1C,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,GAAK,CAAA;AAAA,IACzC,UAAA,EAAa,KAAiC,UAAA,IAAwB,CAAA;AAAA,IACtE,KAAA,EAAO,CAAC,IAAA,CAAK;AAAA,GACd,CAAA;AAAA,EAED,WAAA,EAAa,MAAM,GAAA,CAAI;AAAA,IACrB,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,EAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,WAAA,EAAa,EAAA;AAAA,IACb,SAAA,EAAW,GAAA;AAAA,IACX,UAAA,EAAY,CAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACR,CAAA;AAAA,EAED,OAAA,EAAS,CAAC,IAAA,KAAS,GAAA,CAAI,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EAC5C,WAAA,EAAa,CAAC,QAAA,KAAa,GAAA,CAAI,EAAE,QAAA,EAAU,KAAA,EAAO,MAAM,CAAA;AAAA,EACxD,cAAA,EAAgB,CAAC,WAAA,KAAgB,GAAA,CAAI,EAAE,WAAA,EAAa,KAAA,EAAO,MAAM,CAAA;AAAA,EACjE,YAAA,EAAc,CAAC,SAAA,KAAc,GAAA,CAAI,EAAE,SAAA,EAAW,KAAA,EAAO,MAAM,CAAA;AAAA,EAC3D,aAAA,EAAe,CAAC,UAAA,KAAe,GAAA,CAAI,EAAE,UAAA,EAAY,KAAA,EAAO,MAAM,CAAA;AAAA,EAC9D,WAAW,MAAM,GAAA,CAAI,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EACpC,WAAW,MAAM,GAAA,CAAI,EAAE,KAAA,EAAO,OAAO;AACvC,CAAA,CAAE;AC5DF,IAAM,yBAAA,GAA2C;AAAA,EAC/C,KAAA,EAAO;AAAA,IACL,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAA,EAAI,EAAG,IAAA,EAAM,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,cAAA,EAAgB,EAAC,EAAE,EAAE,EAAE;AAAA,IACtJ,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EAAG,IAAA,EAAM,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,eAAA,EAAiB,EAAC,EAAE,EAAE;AAAE,GAChJ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAE,EAAA,EAAI,aAAA,EAAe,MAAA,EAAQ,OAAA,EAAS,QAAQ,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,IAAA;AAAK,GAC9F;AAAA,EACA,UAAU,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,MAAM,IAAA;AAChC,CAAA;AAGA,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,IAAA,EAAK,EAAmC;AACpE,EAAA,uBACEE,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uJAAA,EACd,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAkD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBACvED,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,MAAG;AAAA,KAAA,EAAK;AAAA,GAAA,EACnE,CAAA;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,EAAK,EAAmC;AAClE,EAAA,uBACEA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+JAAA,EACd,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EAAsD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBAC3ED,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA6C,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,MAAG;AAAA,KAAA,EAAK;AAAA,GAAA,EACvE,CAAA;AAEJ;AAGA,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,IAAA,EAAM,MAAM,WAAA,GAAc,IAAA,EAAM,UAAS,EAKtE;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAID,SAAS,WAAW,CAAA;AAC5C,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,QAC5B,SAAA,EAAU,uEAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,IAAA,mBAAOC,GAAAA,CAACmE,eAAAA,EAAA,EAAgB,SAAA,EAAU,uBAAA,EAAwB,CAAA,mBAAKnE,GAAAA,CAAC0H,gBAAAA,EAAA,EAAiB,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,0BACpH1H,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,0BACxCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uFAAuF,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KAC/G;AAAA,IACC,wBAAQA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAa,QAAA,EAAS;AAAA,GAAA,EAChD,CAAA;AAEJ;AAEO,SAAS,iBAAA,CAAkB,EAAE,OAAA,EAAS,UAAA,EAAW,EAA2B;AACjF,EAAA,MAAM,CAAA,GAAIY,gBAAgB,iBAAiB,CAAA;AAG3C,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACxD,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAGhD,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAC5D,EAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAC9D,EAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AAChE,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,EAAM,MAAA;AAE5B,EAAA,MAAM,YAAA,GAAeyE,QAAuB,MAAM;AAChD,IAAA,MAAM,SAAS,IAAA,EAAM,MAAA;AACrB,IAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,UAAA,IAAc,MAAA,CAAO,KAAA,EAAO;AAC/C,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IAChB;AACA,IAAA,OAAO,yBAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,cAAA,GAAiBA,QAAQ,OAAO,EAAE,SAAS,YAAA,EAAa,CAAA,EAAI,CAAC,YAAY,CAAC,CAAA;AAEhF,EAAA,MAAM,iBAAA,GAAoB/E,WAAAA,CAAY,CAACqH,MAAAA,KAAyB;AAC9D,IAAA,cAAA,CAAe,OAAA,GAAUA,MAAAA;AACzB,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,cAAA,EAAgB,SAAS,CAAC,CAAA;AAE9B,EAAA,MAAM,UAAA,GAAarH,YAAY,MAAM;AACnC,IAAA,SAAA,EAAU;AACV,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,GAAU;AAAA,QACR,GAAG,IAAA;AAAA,QACH,IAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,eAAe,OAAA;AAAQ,OAC3D,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,UAAU,WAAA,EAAa,SAAA,EAAW,cAAA,EAAgB,SAAS,CAAC,CAAA;AAErF,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,cAAe,QAAA,IAAY,UAAA;AACjC,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,IAAS,eAAA,CAAgB,WAAW,KAAK,eAAA,CAAgB,QAAA;AAC/E,EAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,WAAW,CAAA,IAAK,oBAAA,CAAqB,QAAA;AAC/E,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,IAAK,0BAAA;AAGnD,EAAA,MAAM,QAAQ,cAAA,CAAe,OAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,WAAW,IAAA,EAAM,MAAA;AACrC,EAAA,MAAM,SAAA,GAAY,SAAS,IAAA,EAAM,MAAA;AACjC,EAAA,MAAM,cAAA,GAAA,CAAkB,WAAA,EAAa,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,UAAS,CAAE,CAAA;AACnG,EAAA,MAAM,eAAA,GAAA,CAAmB,SAAA,EAAW,eAAA,IAAmB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,UAAS,CAAE,CAAA;AAEnG,EAAA,uBACEN,GAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,KAAA,EAAO,YAAA,GAAe,CAAA,CAAE,+BAA+B,CAAA,GAAI,IAAA;AAAA,MAC3D,QAAA,EAAU,EAAE,+BAA+B,CAAA;AAAA,MAC3C,QAAA,EAAS,2BAAA;AAAA,MACT,IAAA,kBAAMA,GAAAA,CAAC,0BAAA,EAAA,EAA2B,WAAU,oBAAA,EAAqB,CAAA;AAAA,MACjE,QAAA,EAAS,WAAA;AAAA,MAET,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAEb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAEZ,QAAA,EAAA;AAAA,UAAA,YAAA,mBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8IAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gGAAA,EACd,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,IAAA;AAAA,gBACP,UAAU,CAAC,KAAA,KAAU,OAAA,CAAQ,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,gBAC/C,WAAA,EAAa,EAAE,mCAAmC,CAAA;AAAA,gBAClD,SAAA,EAAS,IAAA;AAAA,gBACT,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,CAAC,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,iBAAiB,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,wBACjEA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,WAAA,CAAY,GAAG,CAAA;AAAA,gBAC9B,SAAA,EAAW,CAAA,+DAAA,EACT,GAAA,KAAQ,QAAA,GACJ,CAAA,EAAG,oBAAA,CAAqB,GAAG,CAAA,IAAK,oBAAA,CAAqB,QAAQ,CAAA,uBAAA,CAAA,GAC7D,gFACN,CAAA,CAAA;AAAA,gBAEC,QAAA,EAAA;AAAA,eAAA;AAAA,cATI;AAAA,aAWR,CAAA,EACH;AAAA,WAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gJACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,iFAAA,EAAoF,QAAQ,CAAA,UAAA,CAAA,EAC1G,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAChD,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0DAAA,EAA4D,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,8BAC/ED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+IAAA,EACb,QAAA,EAAA,CAAA,CAAE,+BAA+B,CAAA,EACpC,CAAA;AAAA,gCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,2EAAA,EAA8E,YAAY,IACxG,QAAA,EAAA,QAAA,EACH;AAAA,eAAA,EACF;AAAA,aAAA,EACF,CAAA;AAAA,YACC,UAAA,IAAc,IAAA,CAAK,MAAA,oBAClBA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AAAA,gBACrC,KAAA,EAAO,EAAE,kCAAkC,CAAA;AAAA,gBAC3C,SAAA,EAAU,6JAAA;AAAA,gBAEV,QAAA,kBAAAA,GAAAA,CAAC4H,qBAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACpC,WAAA,EAEJ,CAAA,EACF,CAAA;AAAA,0BAIF5H,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACb,QAAA,kBAAAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,WAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACtD,IAAA,EAAM,CAAA;AAAA,cACN,WAAA,EAAa,EAAE,0CAA0C,CAAA;AAAA,cACzD,SAAA,EAAU;AAAA;AAAA,WACZ,EACF,CAAA;AAAA,0BAGAA,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAO,CAAA,CAAE,kCAAkC,GAAG,IAAA,EAAM6H,oBAAAA,EACjE,0BAAA7H,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EACZ,QAAA,EAAA,cAAA,CAAe,SAAS,CAAA,GAAI,cAAA,CAAe,IAAI,CAAC,QAAA,qBAC/CA,GAAAA,CAAC,YAAA,EAAA,EAAiC,MAAM,QAAA,CAAS,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA,EAAA,EAAnD,SAAS,IAAgD,CAC7E,oBACCA,GAAAA,CAAC,UAAK,SAAA,EAAU,8CAAA,EAAgD,YAAE,+BAA+B,CAAA,EAAE,GAEvG,CAAA,EACF,CAAA;AAAA,0BAGAA,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAO,CAAA,CAAE,mCAAmC,GAAG,IAAA,EAAMyB,qBAAAA,EAClE,0BAAAzB,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EACZ,QAAA,EAAA,eAAA,CAAgB,SAAS,CAAA,GAAI,eAAA,CAAgB,IAAI,CAAC,QAAA,qBACjDA,GAAAA,CAAC,UAAA,EAAA,EAA+B,MAAM,QAAA,CAAS,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA,EAAA,EAAnD,SAAS,IAAgD,CAC3E,oBACCA,GAAAA,CAAC,UAAK,SAAA,EAAU,8CAAA,EAAgD,YAAE,+BAA+B,CAAA,EAAE,GAEvG,CAAA,EACF,CAAA;AAAA,0BAGAD,IAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,CAAA,CAAE,qCAAqC,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,KAAA,EAC3F,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,sEAAA,EACf,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC8H,SAAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,kBAC9B,EAAE,2BAA2B;AAAA,iBAAA,EAChC,CAAA;AAAA,gCACA/H,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EAAqE,QAAA,EAAA;AAAA,kBAAA,CAAA,SAAA,GAAY,GAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,kBAAE;AAAA,iBAAA,EAAC;AAAA,eAAA,EACrH,CAAA;AAAA,8BACAC,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,GAAA,EAAI,MAAA;AAAA,kBACJ,GAAA,EAAI,OAAA;AAAA,kBACJ,IAAA,EAAK,MAAA;AAAA,kBACL,KAAA,EAAO,SAAA;AAAA,kBACP,QAAA,EAAU,CAAC,KAAA,KAAU,YAAA,CAAa,SAAS,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,kBAClE,SAAA,EAAU;AAAA;AAAA;AACZ,aAAA,EACF,CAAA;AAAA,4BACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,gCAChGA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oEAAoE,QAAA,EAAA,UAAA,EAAW;AAAA,eAAA,EACjG,CAAA;AAAA,8BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,0BACjBA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAEC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,kBAClC,SAAA,EAAW,CAAA,2DAAA,EACT,KAAA,KAAU,UAAA,GACN,2BACA,8DACN,CAAA,CAAA;AAAA,kBAEC,QAAA,EAAA;AAAA,iBAAA;AAAA,gBATI;AAAA,eAWR,CAAA,EACH;AAAA,aAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,0BAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACZ,kCACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,QAAA,EAAU,YAAA,IAAgB,CAAC,IAAA,CAAK,IAAA,EAAK;AAAA,cACrC,SAAA,EAAU,mNAAA;AAAA,cAET,QAAA,EAAA,YAAA,GAAe,CAAA,CAAE,0BAA0B,CAAA,GAAI,EAAE,wBAAwB;AAAA;AAAA,WAC5E,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EAAwD,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE,CAAA,EAExG;AAAA,SAAA,EACF,CAAA;AAAA,wBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UACb,QAAA,kBAAAA,GAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,YAAA;AAAA,YACA,QAAQ,EAAC;AAAA,YACT,QAAQ,EAAC;AAAA,YACT,OAAO,EAAC;AAAA,YACR,OAAO,EAAC;AAAA,YACR,aAAA,EAAe;AAAA;AAAA,SACjB,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AC1TO,SAAS,sBAAA,CAAuB,EAAE,MAAA,EAAO,EAAgC;AAC9E,EAAA,MAAM,CAAA,GAAIY,gBAAgB,iBAAiB,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACzD,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,oBAAoB,CAAA;AACzD,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAEvD,EAAA,MAAM,OAAO,YAAA,KAAiB,mBAAA;AAE9B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG9C,EAAAS,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,MAAA,mBAAA,CAAoB,KAAK,WAAW,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,YAAA,GAAe,OAAO,KAAA,KAA2B;AACrD,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAM,WAAA,GAAc,UAAU,IAAA,EAAK;AACnC,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,WAAA,EAAa,gBAAA,CAAiB,IAAA,EAAM,CAAA;AACjD,MAAA,WAAA,EAAY;AAAA,IACd,CAAA,CAAA,MAAQ;AAAA,IAER,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEP,GAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,KAAA,EAAO,EAAE,kBAAkB,CAAA;AAAA,MAC3B,QAAA,EAAU,EAAE,0BAA0B,CAAA;AAAA,MACtC,IAAA,kBAAMA,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAU,oBAAA,EAAqB,CAAA;AAAA,MACpD,QAAA,EAAS,+BAAA;AAAA,MAET,0BAAAD,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAU,WAAA,EACtC,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,YACvB,KAAA,EAAO,SAAA;AAAA,YACP,aAAA,EAAe,YAAA;AAAA,YACf,WAAA,EAAa,EAAE,yBAAyB,CAAA;AAAA,YACxC,QAAA,EAAQ;AAAA;AAAA,SACV;AAAA,wBAEAA,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,YAC9B,KAAA,EAAO,gBAAA;AAAA,YACP,aAAA,EAAe,mBAAA;AAAA,YACf,WAAA,EAAa,EAAE,gCAAgC,CAAA;AAAA,YAC/C,IAAA,EAAM;AAAA;AAAA,SACR;AAAA,wBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAD,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,gBAAA;AAAA,YACN,SAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,QAAA;AAAA,YACT,WAAA,EAAa,EAAE,QAAQ,CAAA;AAAA,YAEvB,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC+H,SAAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAC9B,EAAE,cAAc;AAAA;AAAA;AAAA,SACnB,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;ACvDA,SAAS,WAAA,CACP,KAAA,EACA,QAAA,EACA,QAAA,EACA,OACA,MAAA,EACA;AACA,EAAA,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,QAAQ,CAAA;AAC/C,EAAA,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,QAAQ,CAAA;AAC/C,EAAA,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA;AACzC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EAC7C;AACA,EAAA,KAAA,CAAM,aAAa,aAAA,GAAgB,MAAA;AACrC;AAaA,IAAM,gBAAA,GAAoC;AAAA;AAAA,EAExC,EAAE,UAAU,OAAA,EAAS,OAAA,EAAS,aAAa,cAAA,EAAgB,sBAAA,EAAwB,aAAa,cAAA,EAAe;AAAA,EAC/G,EAAE,UAAU,KAAA,EAAO,OAAA,EAAS,WAAW,cAAA,EAAgB,oBAAA,EAAsB,aAAa,cAAA,EAAe;AAAA,EACzG,EAAE,UAAU,SAAA,EAAW,OAAA,EAAS,cAAc,cAAA,EAAgB,uBAAA,EAAyB,aAAa,cAAA,EAAe;AAAA,EACnH,EAAE,UAAU,WAAA,EAAa,OAAA,EAAS,iBAAiB,cAAA,EAAgB,0BAAA,EAA4B,aAAa,cAAA,EAAe;AAAA,EAC3H,EAAE,UAAU,iBAAA,EAAmB,OAAA,EAAS,sBAAsB,cAAA,EAAgB,+BAAA,EAAiC,aAAa,cAAA,EAAe;AAAA,EAC3I,EAAE,UAAU,OAAA,EAAS,OAAA,EAAS,aAAa,cAAA,EAAgB,sBAAA,EAAwB,aAAa,cAAA,EAAe;AAAA;AAAA,EAG/G,EAAE,UAAU,MAAA,EAAQ,OAAA,EAAS,YAAY,cAAA,EAAgB,qBAAA,EAAuB,aAAa,iBAAA,EAAkB;AAAA,EAC/G,EAAE,UAAU,cAAA,EAAgB,OAAA,EAAS,mBAAmB,cAAA,EAAgB,4BAAA,EAA8B,aAAa,iBAAA,EAAkB;AAAA,EACrI,EAAE,UAAU,oBAAA,EAAsB,OAAA,EAAS,yBAAyB,cAAA,EAAgB,kCAAA,EAAoC,aAAa,iBAAA,EAAkB;AAAA,EACvJ,EAAE,UAAU,mBAAA,EAAqB,OAAA,EAAS,wBAAwB,cAAA,EAAgB,iCAAA,EAAmC,aAAa,iBAAA,EAAkB;AAAA,EACpJ,EAAE,UAAU,qBAAA,EAAuB,OAAA,EAAS,0BAA0B,cAAA,EAAgB,mCAAA,EAAqC,aAAa,iBAAA,EAAkB;AAAA,EAC1J,EAAE,UAAU,eAAA,EAAiB,OAAA,EAAS,oBAAoB,cAAA,EAAgB,6BAAA,EAA+B,aAAa,iBAAA,EAAkB;AAAA,EACxI,EAAE,UAAU,oBAAA,EAAsB,OAAA,EAAS,yBAAyB,cAAA,EAAgB,kCAAA,EAAoC,aAAa,iBAAA,EAAkB;AAAA;AAAA,EAGvJ,EAAE,UAAU,gBAAA,EAAkB,OAAA,EAAS,qBAAqB,cAAA,EAAgB,8BAAA,EAAgC,aAAa,OAAA,EAAQ;AAAA,EACjI,EAAE,UAAU,QAAA,EAAU,OAAA,EAAS,cAAc,cAAA,EAAgB,uBAAA,EAAyB,aAAa,OAAA,EAAQ;AAAA,EAC3G,EAAE,UAAU,qBAAA,EAAuB,OAAA,EAAS,0BAA0B,cAAA,EAAgB,mCAAA,EAAqC,aAAa,OAAA,EAAQ;AAAA,EAChJ,EAAE,UAAU,qBAAA,EAAuB,OAAA,EAAS,0BAA0B,cAAA,EAAgB,mCAAA,EAAqC,aAAa,OAAA,EAAQ;AAAA;AAAA,EAGhJ,EAAE,UAAU,MAAA,EAAQ,OAAA,EAAS,YAAY,cAAA,EAAgB,qBAAA,EAAuB,aAAa,YAAA;AAC/F,CAAA;AAEA,IAAM,kBAAA,GAA6C;AAAA,EACjD,YAAA,EAAc,oBAAA;AAAA,EACd,eAAA,EAAiB,uBAAA;AAAA,EACjB,KAAA,EAAO,aAAA;AAAA,EACP,UAAA,EAAY;AACd,CAAA;AAaA,SAASC,cAAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,OAAO,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS,EASxF;AACD,EAAA,uBACEjI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAU,oDAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,6EAAA,EAAgF,UAAU,CAAA,CAAA,EACxG,QAAA,EAAA;AAAA,YAAA,IAAA;AAAA,YACA,KAAA;AAAA,YACA,UAAU,MAAA,oBACTC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uHACb,QAAA,EAAA,KAAA,EACH;AAAA,WAAA,EAEJ,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAACmE,eAAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,wDAAA,EAA2D,MAAA,GAAS,EAAA,GAAK,YAAY,CAAA;AAAA;AAAA;AAClG;AAAA;AAAA,KACF;AAAA,IACC,wBACCnE,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,QAAA;AAAA,QACP,SAAA,EAAW,6EAA6E,UAAU,CAAA,CAAA;AAAA,QAElG,QAAA,kBAAAA,GAAAA,CAACC,QAAAA,EAAA,EAAS,WAAU,aAAA,EAAc;AAAA;AAAA,KACpC,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,kBAAA,CAAmB,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,WAAA,GAAc,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAA,EAAS,EAA4B;AACtI,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,SAAS,WAAW,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAE9C,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAACgI,cAAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAU,MAAM,SAAA,CAAU,CAAC,QAAA,KAAa,CAAC,QAAQ;AAAA;AAAA,KACnD;AAAA,IACC,yBACChI,GAAAA,CAAC,SAAI,SAAA,EAAU,uBAAA,EACZ,wBACH,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAqF;AAC1I,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,CAAK,QAAQ,CAAA,IAAK,2BAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,4BAAA,CAA6B,IAAA,CAAK,QAAQ,CAAA;AAChE,EAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA,GAAI,MAAA;AAEnE,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,CAAC,KAAA,KACZ,WAAA,CAAY,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,mBAAA,CAAoB,IAAA,CAAK,OAAO,GAAG,UAAU,CAAA;AAAA,MAEhG,SAAA,EAAU,qIAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,sEAAA,EAAyE,QAAQ,CAAA,UAAA,CAAA,EAC9F,QAAA,EAAA,aAAA,oBAAiBA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,wBAAA,EAAyB,CAAA,EACtE,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8DACV,QAAA,EAAA,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA,EACnC,CAAA;AAAA,0BACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDACV,QAAA,EAAA,mBAAA,CAAoB,IAAA,CAAK,cAAc,CAAA,EAC1C;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,aAAa,EAAC,EAAG,KAAA,EAAO,QAAA,GAAW,EAAC,EAAG,aAAA,EAAe,YAAA,EAAc,iBAAA,EAAmB,cAAa,EAAqB;AACpK,EAAA,MAAM,CAAA,GAAIY,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAId,SAAS,EAAE,CAAA;AAEjD,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,WAAA,EAAY,CAAE,IAAA,EAAK;AAEvD,EAAA,MAAM,cAAA,GAAiBuF,OAAAA;AAAA,IACrB,MAAM,kBACF,MAAA,CAAO,MAAA;AAAA,MAAO,CAAC,KAAA,KACb,KAAA,CAAM,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,eAAe,CAAA,IAAA,CAChD,MAAM,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY,CAAE,SAAS,eAAe;AAAA,KAC3D,GACA,MAAA;AAAA,IACJ,CAAC,QAAQ,eAAe;AAAA,GAC1B;AAEA,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,kBACF,KAAA,CAAM,MAAA;AAAA,MAAO,CAAC,IAAA,KACZ,IAAA,CAAK,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,eAAe,CAAA,IAAA,CAC/C,KAAK,QAAA,IAAY,EAAA,EAAI,WAAA,EAAY,CAAE,SAAS,eAAe;AAAA,KAC9D,GACA,KAAA;AAAA,IACJ,CAAC,OAAO,eAAe;AAAA,GACzB;AAEA,EAAA,MAAM,kBAAA,GAAqBA,OAAAA;AAAA,IACzB,MAAM,kBACF,UAAA,CAAW,MAAA;AAAA,MAAO,CAAC,SAAA,KACjB,SAAA,CAAU,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,eAAe,CAAA,IAAA,CACpD,UAAU,QAAA,IAAY,EAAA,EAAI,WAAA,EAAY,CAAE,SAAS,eAAe;AAAA,KACnE,GACA,UAAA;AAAA,IACJ,CAAC,YAAY,eAAe;AAAA,GAC9B;AAEA,EAAA,MAAM,aAAA,GAAgBA,OAAAA;AAAA,IACpB,MAAM,kBACF,KAAA,CAAM,MAAA;AAAA,MAAO,CAAC,IAAA,KACZ,IAAA,CAAK,KAAK,WAAA,EAAY,CAAE,SAAS,eAAe;AAAA,KAClD,GACA,KAAA;AAAA,IACJ,CAAC,OAAO,eAAe;AAAA,GACzB;AAEA,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAClB,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAC9B,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,UAAA,EAAY,OAAO,MAAA,CAAO,MAAA;AAAA,MAC1B,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,QAAQ,MAAA,CAAO;AAAA,KACjB,CAAE,CAAA;AAAA,IACF,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,mBAAA,GAAsBA,OAAAA;AAAA,IAC1B,MAAM,kBACF,WAAA,CAAY,MAAA;AAAA,MAAO,CAAC,WAClB,MAAA,CAAO,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,eAAe,CAAA,IACnD,MAAA,CAAO,YAAY,WAAA,EAAY,CAAE,SAAS,eAAe,CAAA,IACzD,OAAO,EAAA,CAAG,WAAA,EAAY,CAAE,QAAA,CAAS,eAAe;AAAA,KAClD,GACA,WAAA;AAAA,IACJ,CAAC,aAAa,eAAe;AAAA,GAC/B;AAEA,EAAA,MAAM,kBAAA,GAAqBA,OAAAA;AAAA,IACzB,MAAM,kBACF,gBAAA,CAAiB,MAAA;AAAA,MAAO,CAAC,IAAA,KACvB,CAAA,CAAE,KAAK,OAAO,CAAA,CAAE,aAAY,CAAE,QAAA,CAAS,eAAe,CAAA,IACtD,EAAE,IAAA,CAAK,cAAc,EAAE,WAAA,EAAY,CAAE,SAAS,eAAe;AAAA,KAC/D,GACA,gBAAA;AAAA,IACJ,CAAC,iBAAiB,CAAC;AAAA,GACrB;AAGA,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAM;AACtC,IAAA,MAAM,MAAA,GAA0C;AAAA,MAC9C,cAAc,EAAC;AAAA,MACf,iBAAiB,EAAC;AAAA,MAClB,OAAO,EAAC;AAAA,MACR,YAAY;AAAC,KACf;AACA,IAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAEvB,EAAA,SAAS,sBAAA,CAAuB,WAAA,EAAqB,KAAA,EAAwB,OAAA,EAAkB;AAC7F,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,uBACEtF,IAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAU,aAAA,EAC/B,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,EAAG,OAAA,GAAU,MAAA,GAAS,MAAM,CAAA,mFAAA,CAAA,EACvC,QAAA,EAAA,CAAA,CAAE,kBAAA,CAAmB,WAAW,CAAC,CAAA,EACpC,CAAA;AAAA,MACC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,GAAAA,CAAC,iBAAA,EAAA,EAAsC,IAAA,EAAY,mBAAA,EAAqB,CAAA,EAAA,EAAhD,IAAA,CAAK,QAA8C,CAC5E;AAAA,KAAA,EAAA,EANO,WAOV,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8HAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iFAAA,EACX,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EACd,CAAA;AAAA,sBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,WAAA;AAAA,UACP,UAAU,CAAC,KAAA,KAAU,cAAA,CAAe,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,UACtD,WAAA,EAAa,EAAE,eAAe,CAAA;AAAA,UAC9B,SAAA,EAAU;AAAA;AAAA,OACZ,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,eAAe,CAAA;AAAA,QACxB,sBAAMA,GAAAA,CAACyH,WAAAA,EAAA,EAAY,WAAU,SAAA,EAAU,CAAA;AAAA,QACvC,UAAA,EAAW,sCAAA;AAAA,QACX,KAAA,EAAO,aAAA;AAAA,QACP,QAAA,EAAU,EAAE,UAAU,CAAA;AAAA,QAErB,yBAAe,MAAA,KAAW,CAAA,mBACzBzH,GAAAA,CAAC,OAAE,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,CAAA,CAAE,UAAU,GAAE,CAAA,GACzE,cAAA,CAAe,GAAA,CAAI,CAAC,0BACtBD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAS,IAAA;AAAA,YACT,WAAA,EAAa,CAAC,KAAA,KACZ,WAAA,CAAY,OAAO,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAAA,YAEvD,SAAA,EAAU,qIAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,KAAA,CAAM,MAAA,mBACLC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,MAAM,MAAA,EAAkB,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,SAAA,EAAU,qGAAA,EAAsG,oBAEnKA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iHAAA,EACb,QAAA,kBAAAA,IAACyH,WAAAA,EAAA,EAAY,SAAA,EAAU,wBAAA,EAAyB,CAAA,EAClD,CAAA;AAAA,gCAEFzH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gJAAA,EACb,QAAA,kBAAAA,GAAAA,CAACyH,WAAAA,EAAA,EAAY,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAC9C;AAAA,eAAA,EACF,CAAA;AAAA,8BACA1H,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EACV,gBAAM,IAAA,EACT,CAAA;AAAA,gCACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDACV,QAAA,EAAA,KAAA,CAAM,IAAA,IAAQ,MAAM,OAAA,EACvB;AAAA,eAAA,EACF;AAAA;AAAA,WAAA;AAAA,UA1BK,KAAA,CAAM;AAAA,SA4Bd;AAAA;AAAA,KACH;AAAA,oBAGAA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,QAC5B,sBAAMA,GAAAA,CAACiI,eAAAA,EAAA,EAAgB,WAAU,SAAA,EAAU,CAAA;AAAA,QAC3C,UAAA,EAAW,oCAAA;AAAA,QACX,KAAA,EAAO,iBAAA;AAAA,QACP,QAAA,EAAU,EAAE,cAAc,CAAA;AAAA,QAEzB,6BAAmB,MAAA,KAAW,CAAA,mBAC7BjI,GAAAA,CAAC,OAAE,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,CAAA,CAAE,cAAc,GAAE,CAAA,GAC7E,kBAAA,CAAmB,GAAA,CAAI,CAAC,8BAC1BD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAS,IAAA;AAAA,YACT,WAAA,EAAa,CAAC,KAAA,KACZ,WAAA,CAAY,OAAO,YAAA,EAAc,SAAA,CAAU,WAAA,EAAa,SAAA,CAAU,IAAI,CAAA;AAAA,YAExE,SAAA,EAAU,qIAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8GAAA,EACb,QAAA,kBAAAA,IAACiI,eAAAA,EAAA,EAAgB,SAAA,EAAU,wBAAA,EAAyB,CAAA,EACtD,CAAA;AAAA,8BACAlI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EACV,oBAAU,IAAA,EACb,CAAA;AAAA,gCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,uDAAA,EACV,QAAA,EAAA,SAAA,CAAU,YAAY,QAAA,EACzB;AAAA,eAAA,EACF,CAAA;AAAA,cACC,CAAC,UAAU,OAAA,oBACVA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mHAAkH,QAAA,EAAA,KAAA,EAElI;AAAA;AAAA,WAAA;AAAA,UArBG,SAAA,CAAU;AAAA,SAwBlB;AAAA;AAAA,KACH;AAAA,oBAGAA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,QAC9B,sBAAMA,GAAAA,CAACkI,0BAAAA,EAAA,EAA2B,WAAU,SAAA,EAAU,CAAA;AAAA,QACtD,UAAA,EAAW,kCAAA;AAAA,QACX,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,EAAE,gBAAgB,CAAA;AAAA,QAE3B,wBAAc,MAAA,KAAW,CAAA,mBACxBlI,GAAAA,CAAC,OAAE,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,CAAA,CAAE,gBAAgB,GAAE,CAAA,GAC/E,aAAA,CAAc,GAAA,CAAI,CAAC,yBACrBD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAS,IAAA;AAAA,YACT,WAAA,EAAa,CAAC,KAAA,KACZ,WAAA,CAAY,OAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,YAEnD,SAAA,EAAU,qIAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8GAAA,EACb,QAAA,kBAAAA,IAACkI,0BAAAA,EAAA,EAA2B,SAAA,EAAU,wBAAA,EAAyB,CAAA,EACjE,CAAA;AAAA,8BACAnI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EACV,eAAK,IAAA,EACR,CAAA;AAAA,gCACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAA,EACV,eAAK,QAAA,EACR;AAAA,eAAA,EACF,CAAA;AAAA,cACC,CAAC,KAAK,OAAA,oBACLA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mHAAkH,QAAA,EAAA,KAAA,EAElI;AAAA;AAAA,WAAA;AAAA,UArBG,IAAA,CAAK;AAAA,SAwBb;AAAA;AAAA,KACH;AAAA,oBAGAA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,QACvB,sBAAMA,GAAAA,CAACmI,yBAAAA,EAAA,EAA0B,WAAU,SAAA,EAAU,CAAA;AAAA,QACrD,UAAA,EAAW,sCAAA;AAAA,QACX,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,EAAE,SAAS,CAAA;AAAA,QAEpB,wBAAc,MAAA,KAAW,CAAA,mBACxBnI,GAAAA,CAAC,OAAE,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,CAAA,CAAE,SAAS,GAAE,CAAA,GACxE,aAAA,CAAc,GAAA,CAAI,CAAC,yBACrBD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAS,IAAA;AAAA,YACT,WAAA,EAAa,CAAC,KAAA,KACZ,WAAA,CAAY,OAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,YAEnD,SAAA,EAAU,qIAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+GAAA,EACb,QAAA,kBAAAA,IAACmI,yBAAAA,EAAA,EAA0B,SAAA,EAAU,wBAAA,EAAyB,CAAA,EAChE,CAAA;AAAA,8BACApI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EACV,eAAK,IAAA,EACR,CAAA;AAAA,gCACAD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAA,EAAwD,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACjE,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE;AAAA,iBAAA,EAC9B;AAAA,eAAA,EACF,CAAA;AAAA,cACC,CAAC,KAAK,OAAA,oBACLC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mHAAkH,QAAA,EAAA,KAAA,EAElI;AAAA;AAAA,WAAA;AAAA,UArBG,IAAA,CAAK;AAAA,SAwBb;AAAA;AAAA,KACH;AAAA,oBAGAA,GAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,sBAAMA,GAAAA,CAACU,eAAAA,EAAA,EAAgB,WAAU,SAAA,EAAU,CAAA;AAAA,QAC3C,UAAA,EAAW,kCAAA;AAAA,QACX,OAAO,mBAAA,CAAoB,MAAA;AAAA,QAE1B,QAAA,EAAA,mBAAA,CAAoB,MAAA,KAAW,CAAA,mBAC9BV,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EAAgD,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EAAE,CAAA,GAC9E,mBAAA,CAAoB,GAAA,CAAI,CAAC,MAAA,KAAW;AACtC,UAAA,MAAM,aAAA,GAAgB,KAAK,SAAA,CAAU;AAAA,YACnC,IAAA,EAAM,QAAA;AAAA,YACN,gBAAgB,MAAA,CAAO,EAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAAA,YACvD,iBAAiB,EAAC;AAAA,YAClB,gBAAgB,CAAA,EAAG,MAAA,CAAO,MAAM,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,IAAA,CAAA;AAAA,YACnD,OAAO,MAAA,CAAO;AAAA,WACf,CAAA;AACD,UAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA;AAC1C,UAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAA;AAElD,UAAA,uBACED,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAS,IAAA;AAAA,cACT,WAAA,EAAa,CAAC,KAAA,KACZ,WAAA,CAAY,KAAA,EAAO,UAAU,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,KAAA,EAAO,aAAa,CAAA;AAAA,cAErE,SAAA,EAAU,qIAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,sEAAA,EAAyE,cAAc,CAAA,UAAA,CAAA,EACrG,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,wBAAA,EAAyB,CAAA,EACjD,CAAA;AAAA,gCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EACV,iBAAO,KAAA,EACV,CAAA;AAAA,kCACAD,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uDAAA,EACV,QAAA,EAAA;AAAA,oBAAA,MAAA,CAAO,UAAA;AAAA,oBAAW,GAAA;AAAA,oBAAE,EAAE,mBAAmB;AAAA,mBAAA,EAC5C;AAAA,iBAAA,EACF;AAAA;AAAA,aAAA;AAAA,YAjBK,MAAA,CAAO;AAAA,WAkBd;AAAA,QAEJ,CAAC;AAAA;AAAA,KACH;AAAA,oBAGAA,IAAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,QACvB,sBAAMC,GAAAA,CAACoI,QAAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,QACpC,UAAA,EAAW,kCAAA;AAAA,QACX,OAAO,kBAAA,CAAmB,MAAA;AAAA,QAEzB,QAAA,EAAA;AAAA,UAAA,sBAAA,CAAuB,cAAA,EAAgB,iBAAA,CAAkB,YAAA,EAAc,IAAI,CAAA;AAAA,UAC3E,sBAAA,CAAuB,iBAAA,EAAmB,iBAAA,CAAkB,eAAA,EAAiB,KAAK,CAAA;AAAA,UAClF,sBAAA,CAAuB,OAAA,EAAS,iBAAA,CAAkB,KAAA,EAAO,KAAK,CAAA;AAAA,UAC9D,sBAAA,CAAuB,YAAA,EAAc,iBAAA,CAAkB,UAAA,EAAY,KAAK;AAAA;AAAA;AAAA;AAC3E,GAAA,EACF,CAAA;AAEJ;ACrhBA,SAAS,mBAAmB,UAAA,EAAwC;AAClE,EAAA,IAAI,CAAC,YAAY,OAAO,EAAA;AACxB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,UAAU,CAAA;AAChC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,OAAA,EAAQ;AAC5C,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAM,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAS,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAU,CAAA;AAE/C,EAAA,IAAI,WAAA,GAAc,GAAG,OAAO,UAAA;AAC5B,EAAA,IAAI,WAAA,GAAc,EAAA,EAAI,OAAO,CAAA,EAAG,WAAW,CAAA,KAAA,CAAA;AAC3C,EAAA,IAAI,SAAA,GAAY,EAAA,EAAI,OAAO,CAAA,EAAG,SAAS,CAAA,KAAA,CAAA;AACvC,EAAA,OAAO,GAAG,QAAQ,CAAA,KAAA,CAAA;AACpB;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,SAAA,GAAYxH,gBAAgB,iBAAiB,CAAA;AAEnD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEb,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAA+B,CAAA;AAAA,sBAC9CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAA+B;AAAA,KAAA,EAChD,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACZ,QAAA,EAAA;AAAA,IAAA,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa;AAC3B,MAAA,MAAM,QAAA,GAAW,SAAS,EAAA,KAAO,gBAAA;AACjC,MAAA,uBACEA,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,CAAA;AAAA,UACV,OAAA,EAAS,MAAM,QAAA,CAAS,QAAQ,CAAA;AAAA,UAChC,SAAA,EAAW,CAAC,KAAA,KAAU;AAAE,YAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAAE,cAAA,KAAA,CAAM,cAAA,EAAe;AAAG,cAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,YAAE;AAAA,UAAE,CAAA;AAAA,UACvH,SAAA,EAAW,CAAA,6IAAA,EACT,QAAA,GACI,uBAAA,GACA,iBACN,CAAA,CAAA;AAAA,UACA,KAAA,EAAO,QAAA,GAAW,EAAE,gBAAA,EAAkB,gBAAe,GAA2B,MAAA;AAAA,UAEhF,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,UAAK,SAAA,EAAW,CAAA,6BAAA,EACf,WACI,sCAAA,GACA,kCACN,CAAA,CAAA,EACG,QAAA,EAAA,QAAA,CAAS,IAAA,EACZ,CAAA;AAAA,gCACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2HAAA,EAA4H,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBACxI,QAAA,CAAS;AAAA,iBAAA,EACb,CAAA;AAAA,gBACC,SAAS,OAAA,mBACRC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sIACb,QAAA,EAAA,SAAA,CAAU,YAAY,CAAA,EACzB,CAAA,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oIAAA,EACb,QAAA,EAAA,SAAA,CAAU,WAAW,CAAA,EACxB;AAAA,eAAA,EAEJ,CAAA;AAAA,8BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAA,EACV,6BAAmB,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,GAAW,SAAS,SAAA,GAAY,QAAA,CAAS,SAAA,CAAU,WAAA,EAAa,CAAA,EACpH;AAAA,aAAA,EACF,CAAA;AAAA,4BAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yFAAA,EAEZ,QAAA,EAAA;AAAA,cAAA,sBAAA,oBACCC,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,oBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,oBAAA,sBAAA,CAAuB,QAAQ,CAAA;AAAA,kBACjC,CAAA;AAAA,kBACA,SAAA,EAAU,wIAAA;AAAA,kBACV,cAAY,CAAA,EAAG,SAAA,CAAU,sBAAsB,CAAC,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,CAAA;AAAA,kBACjE,KAAA,EAAO,UAAU,sBAAsB,CAAA;AAAA,kBAEvC,QAAA,kBAAAA,GAAAA,CAACkI,0BAAAA,EAAA,EAA2B,WAAU,aAAA,EAAc;AAAA;AAAA,eACtD;AAAA,cAID,SAAA,CAAU,MAAA,GAAS,CAAA,oBAClBlI,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,oBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,oBAAA,QAAA,CAAS,QAAA,CAAS,EAAA,EAAI,QAAA,CAAS,IAAI,CAAA;AAAA,kBACrC,CAAA;AAAA,kBACA,SAAA,EAAU,oIAAA;AAAA,kBACV,cAAY,CAAA,EAAG,SAAA,CAAU,gBAAgB,CAAC,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,CAAA;AAAA,kBAE3D,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,aAAA,EAAc;AAAA;AAAA;AACrC,aAAA,EAEJ;AAAA;AAAA,SAAA;AAAA,QAvEK,QAAA,CAAS;AAAA,OAwEhB;AAAA,IAEJ,CAAC,CAAA;AAAA,oBAGDf,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAU,4NAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAACC,QAAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,UACjC,UAAU,aAAa;AAAA;AAAA;AAAA;AAC1B,GAAA,EACF,CAAA;AAEJ;ACxHO,SAAS,mBAAA,CAAoB;AAAA,EAClC,IAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,YAAA,GAAeW,gBAAgB,gCAAgC,CAAA;AACrE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAId,QAAAA,CAA4B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE9D,EAAA,MAAM,YAAA,GAAeQ,YAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,MAAM,aAAA,CAAc,UAAU,CAAA;AACtD,MAAA,WAAA,CAAY,eAAe,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,yBAAA;AAC9D,MAAA,YAAA,CAAa,YAAY,CAAA;AAAA,IAC3B,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,UAAU,CAAC,CAAA;AAE9B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAEvB,EAAA,MAAM8H,gBAAAA,GAAkB/H,WAAAA,CAAY,CAAC,SAAA,KAAsB;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC/B,MAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,KAAA,CAAA,EAAW;AAAA,QACxC,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,GAAA,EAAK,SAAA;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACT,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEP,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,yIAAA;AAAA,MACV,aAAA,EAAY,uBAAA;AAAA,MAGZ,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC8H,SAAAA,EAAA,EAAU,SAAA,EAAU,0CAAA,EAA2C,CAAA;AAAA,4BAChE9H,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,qDAAA,EACX,QAAA,EAAA,YAAA,CAAa,OAAO,CAAA,EACvB;AAAA,WAAA,EACF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,OAAA;AAAA,cACT,SAAA,EAAU,sIAAA;AAAA,cACV,aAAA,EAAY,uBAAA;AAAA,cAEZ,QAAA,kBAAAA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC,SAAA,EACF,CAAA;AAAA,wBAGAjE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,SAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC,aAAA,EAAY,yBAAA,EAClE,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EAAkF,CAAA,EACnG,CAAA;AAAA,UAGD,6BACCD,IAAAA,CAAC,SAAI,SAAA,EAAU,uBAAA,EAAwB,eAAY,uBAAA,EACjD,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,4BACjEA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,YAAA;AAAA,gBACT,SAAA,EAAU,+DAAA;AAAA,gBAET,uBAAa,OAAO;AAAA;AAAA;AACvB,WAAA,EACF,CAAA;AAAA,UAGD,CAAC,SAAA,IAAa,CAAC,SAAA,IAAa,QAAA,CAAS,MAAA,KAAW,CAAA,oBAC/CD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,eAAY,uBAAA,EAClD,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC8H,SAAAA,EAAA,EAAU,SAAA,EAAU,kDAAA,EAAmD,CAAA;AAAA,4BACxE9H,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,YAAA,CAAa,YAAY,CAAA,EAC5B;AAAA,WAAA,EACF,CAAA;AAAA,UAGD,CAAC,SAAA,IAAa,CAAC,SAAA,IAAa,SAAS,MAAA,GAAS,CAAA,oBAC7CA,GAAAA,CAAC,SAAI,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACzB,YAAA,MAAM,gBAAA,GAAmB,QAAQ,OAAA,KAAY,cAAA;AAC7C,YAAA,uBACED,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,CAAA,4BAAA,EACT,gBAAA,GACI,gCAAA,GACA,4CACN,CAAA,CAAA;AAAA,gBACA,aAAA,EAAa,CAAA,cAAA,EAAiB,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,gBAG7C,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EACb,0BAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EAAsD,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,sBAClE,OAAA,CAAQ;AAAA,qBAAA,EACZ,CAAA;AAAA,oBACC,gBAAA,oBACCC,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mHAAA,EACb,QAAA,EAAA,YAAA,CAAa,SAAS,CAAA,EACzB;AAAA,mBAAA,EAEJ,CAAA,EACF,CAAA;AAAA,kCAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,IAAC,KAAA,EAAA,EAAK,QAAA,EAAAqI,gBAAAA,CAAgB,OAAA,CAAQ,WAAW,CAAA,EAAE,CAAA;AAAA,oCAC3CtI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,YAAA,CAAa,aAAa,CAAA;AAAA,sBAAE,IAAA;AAAA,sBAAG,OAAA,CAAQ;AAAA,qBAAA,EAC1C,CAAA;AAAA,oCACAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,OAAA,CAAQ,SAAA;AAAA,sBAAU,GAAA;AAAA,sBAAE,aAAa,OAAO,CAAA;AAAA,sBAAE,KAAA;AAAA,sBAAI,OAAA,CAAQ,SAAA;AAAA,sBAAU,GAAA;AAAA,sBAAE,aAAa,OAAO;AAAA,qBAAA,EACzF;AAAA,mBAAA,EACF,CAAA;AAAA,kCAGAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,IAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,OAAA,EAAS,MAAM,SAAA,CAAU,OAAO,CAAA;AAAA,wBAChC,SAAA,EAAU,iNAAA;AAAA,wBACV,aAAA,EAAa,CAAA,gBAAA,EAAmB,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,wBAE/C,QAAA,EAAA;AAAA,0CAAAC,GAAAA,CAAC+D,OAAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,0BAC5B,aAAa,SAAS;AAAA;AAAA;AAAA,qBACzB;AAAA,oBACC,CAAC,oCACAhE,IAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,OAAA,EAAS,MAAM,SAAA,CAAU,OAAO,CAAA;AAAA,wBAChC,SAAA,EAAU,mNAAA;AAAA,wBACV,aAAA,EAAa,CAAA,gBAAA,EAAmB,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,wBAE/C,QAAA,EAAA;AAAA,0CAAAC,GAAAA,CAACiC,aAAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,0BAClC,aAAa,SAAS;AAAA;AAAA;AAAA;AACzB,mBAAA,EAEJ;AAAA;AAAA,eAAA;AAAA,cAvDK,OAAA,CAAQ;AAAA,aAwDf;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA,SAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;ACnLA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS;AAAA,IACP,IAAA,EAAM6F,SAAAA;AAAA,IACN,KAAA,EAAO,kCAAA;AAAA,IACP,UAAA,EAAY,8BAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,kCAAA;AAAA,IACP,UAAA,EAAY,gCAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAMQ,iBAAAA;AAAA,IACN,KAAA,EAAO,oCAAA;AAAA,IACP,UAAA,EAAY,kCAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAMC,WAAAA;AAAA,IACN,KAAA,EAAO,gCAAA;AAAA,IACP,UAAA,EAAY,8BAAA;AAAA,IACZ,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,SAASC,gBAAe,UAAA,EAA4B;AAClD,EAAA,IAAI,aAAa,GAAA,EAAM;AACrB,IAAA,OAAO,GAAG,UAAU,CAAA,EAAA,CAAA;AAAA,EACtB;AACA,EAAA,MAAM,OAAA,GAAA,CAAW,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAA;AAC7C,EAAA,OAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AACnB;AAEO,SAAS,SAAS,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,QAAO,EAAkB;AACxE,EAAA,MAAM,YAAA,GAAe5H,gBAAgB,0BAA0B,CAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,SAAS,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,WAAW,CAAA;AACjE,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AAC5D,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,KAAK,CAAA;AAC3D,EAAA,MAAM,mBAAA,GAAsB,OAAA;AAAA,IAC1B,aACA,OAAO,SAAA,CAAU,SAAS,QAAA,IAC1B,SAAA,CAAU,SAAS,IAAA,IACnB,QAAA,IAAY,SAAA,CAAU,IAAA,IACtB,UAAU,IAAA,CAAK,MAAA,IACf,OAAQ,SAAA,CAAU,IAAA,CAAK,OAA2B,IAAA,KAAS;AAAA,GAC7D;AACA,EAAA,MAAM,SAAS,mBAAA,IAAuB,UAAA;AAEtC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AAElE,EAAA,uBACEb,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,yHAAA;AAAA,MACV,aAAA,EAAY,WAAA;AAAA,MAGZ,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAACqB,QAAAA,EAAA,EAAS,SAAA,EAAU,0CAAA,EAA2C,CAAA;AAAA,4BAC/DrB,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,qDAAA,EACX,QAAA,EAAA,YAAA,CAAa,OAAO,CAAA,EACvB,CAAA;AAAA,YACC,SAAA,oBACCD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2IAAA,EACd,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EAAqD,CAAA;AAAA,cACpE,aAAa,WAAW;AAAA,aAAA,EAC3B;AAAA,WAAA,EAEJ,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAEZ,QAAA,EAAA;AAAA,YAAA,SAAA,mBACCA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAA;AAAA,gBACT,SAAA,EAAU,sIAAA;AAAA,gBACV,aAAA,EAAY,gBAAA;AAAA,gBAEZ,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAACuB,QAAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,kBACjC,aAAa,MAAM;AAAA;AAAA;AAAA,gCAGtBxB,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,KAAA;AAAA,gBACT,UAAU,CAAC,MAAA;AAAA,gBACX,SAAA,EAAU,sNAAA;AAAA,gBACV,aAAA,EAAY,eAAA;AAAA,gBAEZ,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAACqB,QAAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,kBACjC,aAAa,KAAK;AAAA;AAAA;AAAA,aACrB;AAAA,4BAEFrB,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,sIAAA;AAAA,gBACV,aAAA,EAAY,iBAAA;AAAA,gBAEZ,QAAA,kBAAAA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAGAhE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACZ,yBAAe,MAAA,KAAW,CAAA,mBACzBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DACZ,QAAA,EAAA,YAAA,CAAa,SAAS,CAAA,EACzB,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,IAAA,KAAS;AAC5B,UAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AAClC,UAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,SAAA;AACjC,UAAA,MAAM,YAAA,GAAe,cAAc,MAAM,CAAA;AACzC,UAAA,MAAM,sBAAsB,YAAA,CAAa,IAAA;AACzC,UAAA,MAAM,YACJ,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,KAAS,IAAA,IAAQ,OAAA,IAAW,IAAA,CAAK,OACnE,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAK,IACtB,IAAA,CAAK,EAAA;AAEX,UAAA,uBACED,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAW,CAAA,6CAAA,EAAgD,YAAA,CAAa,UAAU,CAAA,CAAA;AAAA,cAClF,aAAA,EAAa,CAAA,SAAA,EAAY,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,cAGhC,QAAA,EAAA;AAAA,gCAAAC,IAAC,mBAAA,EAAA,EAAoB,SAAA,EAAW,CAAA,sBAAA,EAAyB,YAAA,CAAa,KAAK,CAAA,CAAA,EAAI,CAAA;AAAA,gCAG/ED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAAA,EACb,QAAA,EAAA,SAAA,EACH,CAAA;AAAA,oCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iGAAA,EACb,eAAK,IAAA,EACR;AAAA,mBAAA,EACF,CAAA;AAAA,kBACC,MAAA,EAAQ,yBACPA,GAAAA,CAAC,OAAE,SAAA,EAAU,wDAAA,EACV,iBAAO,KAAA,EACV;AAAA,iBAAA,EAEJ,CAAA;AAAA,gBAGC,MAAA,EAAQ,UAAA,KAAe,MAAA,oBACtBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAA,EACb,QAAA,EAAAwI,eAAAA,CAAe,MAAA,CAAO,UAAU,CAAA,EACnC;AAAA;AAAA,aAAA;AAAA,YA5BG,IAAA,CAAK;AAAA,WA8BZ;AAAA,QAEJ,CAAC,GACH,CAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;AAKA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAU,EAA2B;AAC1D,EAAA,uBACEzI,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,aAAA,EAAgB,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MAC1C,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,CAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,wBACpDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yBAAA,EAA0B,eAAc,OAAA,EAAQ;AAAA;AAAA;AAAA,GAC1D;AAEJ;ACjLA,SAAS,eAAA,CACP,OACA,KAAA,EACU;AACV,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAChD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA;AAAA,EACzB;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC/C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,QAAA,CAAS,GAAA,CAAI,KAAK,MAAA,EAAA,CAAS,QAAA,CAAS,IAAI,IAAA,CAAK,MAAM,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,QAAA,CAAS,SAAQ,EAAG;AACjD,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,EAAM;AAClC,IAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AAEzB,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,aAAa,KAAK,EAAC;AACvD,IAAA,KAAA,MAAW,cAAc,SAAA,EAAW;AAClC,MAAA,MAAM,aAAA,GAAA,CAAiB,QAAA,CAAS,GAAA,CAAI,UAAU,KAAK,CAAA,IAAK,CAAA;AACxD,MAAA,QAAA,CAAS,GAAA,CAAI,YAAY,aAAa,CAAA;AACtC,MAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,QAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,cAAA,CAAe,QAAqC,QAAA,EAAkC;AAC7F,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,YAA4B,EAAC;AAEnC,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,OAAA;AACH,MAAA,KAAA,MAAW,YAAA,IAAgB,OAAO,cAAA,EAAgB;AAChD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,QAAA,EAAU,YAAA,EAAc,OAAO,CAAA;AAAA,QACjF;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,KAAA;AACH,MAAA,KAAA,MAAW,YAAA,IAAgB,OAAO,eAAA,EAAiB;AACjD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,OAAA,EAAS,YAAA,EAAc,OAAO,CAAA;AAAA,QAChF;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,MAAA;AAEH,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,OAAA,EAAS,YAAA,EAAc,MAAA,CAAO,QAAA,EAAU,CAAA;AACxF,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAe,WAAW,QAAA,EAAU,YAAA,EAAc,OAAO,CAAA;AAChF,MAAA;AAAA,IAEF,KAAK,cAAA;AACH,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAC1E,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,WAAW,QAAA,EAAU,YAAA,EAAc,UAAU,CAAA;AAChF,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAAA,MAC7E;AACA,MAAA;AAAA,IAEF,KAAK,oBAAA;AACH,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAC/E,MAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,gBAAgB,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,QAAA,EAAU,CAAA;AAAA,MAC7F;AACA,MAAA;AAAA,IAEF,KAAK,SAAA;AACH,MAAA,KAAA,MAAW,SAAA,IAAa,OAAO,UAAA,EAAY;AACzC,QAAA,IAAI,UAAU,QAAA,EAAU;AACtB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,CAAU,UAAU,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,KAAA,EAAO,CAAA;AAAA,QACtF;AAAA,MACF;AACA,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAe,WAAW,QAAA,EAAU,YAAA,EAAc,WAAW,CAAA;AACpF,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,WAAW,QAAA,EAAU,YAAA,EAAc,WAAW,CAAA;AACrF,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,kBAAkB,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,OAAA,EAAS,CAAA;AAAA,MAC7F;AACA,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,gBAAA,EAAkB,WAAW,QAAA,EAAU,YAAA,EAAc,OAAO,CAAA;AACnF,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,iBAAA,EAAmB,WAAW,QAAA,EAAU,YAAA,EAAc,UAAU,CAAA;AACvF,MAAA;AAAA,IAEF,KAAK,iBAAA;AACH,MAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,kBAAkB,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,OAAA,EAAS,CAAA;AAAA,MAC7F;AACA,MAAA,IAAI,OAAO,YAAA,EAAc;AACvB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,cAAc,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,CAAA;AAAA,MACxF;AACA,MAAA,IAAI,OAAO,aAAA,EAAe;AACxB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,eAAe,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,QAAA,EAAU,CAAA;AAAA,MAC5F;AACA,MAAA;AAAA,IAEF,KAAK,gBAAA;AACH,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAC5E,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,WAAW,QAAA,EAAU,YAAA,EAAc,SAAS,CAAA;AAC9E,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,KAAA,MAAW,YAAA,IAAgB,OAAO,eAAA,EAAiB;AACjD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,QAAA,EAAU,YAAA,EAAc,OAAO,CAAA;AAAA,QACjF;AAAA,MACF;AACA,MAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,iBAAA,EAAmB,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAAA,MACxF;AACA,MAAA;AAAA,IAEF,KAAK,qBAAA;AACH,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAC/E,MAAA,KAAA,MAAW,QAAA,IAAY,OAAO,UAAA,EAAY;AACxC,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,SAAA,EAAY,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,QAAA,EAAU,CAAA;AAAA,QACnG;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,qBAAA;AACH,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AACjF,MAAA,KAAA,MAAW,SAAA,IAAa,OAAO,UAAA,EAAY;AACzC,QAAA,IAAI,UAAU,IAAA,EAAM;AAClB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,WAAW,QAAA,EAAU,YAAA,EAAc,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,QAC5F;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,mBAAA;AACH,MAAA,KAAA,MAAW,UAAA,IAAc,OAAO,WAAA,EAAa;AAC3C,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,CAAW,QAAQ,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,KAAA,EAAO,CAAA;AAAA,QACrF;AACA,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,CAAW,QAAQ,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,CAAA;AAAA,QACtF;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,qBAAA;AACH,MAAA,KAAA,MAAW,YAAA,IAAgB,OAAO,cAAA,EAAgB;AAChD,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,WAAW,OAAA,EAAS,YAAA,EAAc,OAAO,CAAA;AAAA,QAChF;AAAA,MACF;AACA,MAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,cAAA,EAAgB,WAAW,QAAA,EAAU,YAAA,EAAc,MAAA,CAAO,eAAA,EAAiB,CAAA;AAAA,MAC3G;AACA,MAAA;AAAA,IAEF,KAAK,oBAAA;AACH,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,WAAW,OAAA,EAAS,YAAA,EAAc,QAAQ,CAAA;AAC7E,MAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,cAAA,EAAgB,WAAW,QAAA,EAAU,YAAA,EAAc,MAAA,CAAO,cAAA,EAAgB,CAAA;AAAA,MAC1G;AACA,MAAA;AAAA,IAEF,KAAK,eAAA;AACH,MAAA,IAAI,OAAO,aAAA,EAAe;AACxB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,eAAe,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,OAAA,EAAS,CAAA;AAAA,MAC1F;AACA,MAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,gBAAgB,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,OAAA,EAAS,CAAA;AAAA,MAC5F;AACA,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,WAAW,OAAA,EAAS,YAAA,EAAc,UAAU,CAAA;AAAA,MAClF;AACA,MAAA;AAIA;AAGJ,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAM,OAAA,EAAQ,EAA2B;AAC3E,EAAA,MAAM,YAAA,GAAeY,gBAAgB,mCAAmC,CAAA;AACxE,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AAErD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,IAAId,QAAAA,iBAAsB,IAAI,KAAK,CAAA;AAEzE,EAAA,MAAM,mBAAA,GAAsBQ,WAAAA,CAAY,CAAC,MAAA,KAAmB;AAC1D,IAAA,gBAAA,CAAiB,CAAC,OAAA,KAAY;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAC/B,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,MACpB;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAA,GAA2C+E,QAAQ,MAAM;AAE7D,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AAGjE,IAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,aAAA,EAAe,KAAK,CAAA;AAG1D,IAAA,MAAM,UAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,MAAM,OAAO,aAAA,CAAc,IAAA,CAAK,CAAC,aAAA,KAAkB,aAAA,CAAc,OAAO,MAAM,CAAA;AAC9E,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,MAAA,MAAM,SAAS,QAAA,EAAU,MAAA;AACzB,MAAA,MAAM,KAAA,GAAS,QAAA,EAAU,KAAA,IAAoB,IAAA,CAAK,EAAA;AAClD,MAAA,MAAM,QAAA,GAAY,KAAK,IAAA,IAAmB,SAAA;AAE1C,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,MAAgB,CAAA;AAEjD,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,SAAA,EAAW,KAAA;AAAA,QACX,QAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEtF,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,yIAAA;AAAA,MACV,aAAA,EAAY,oBAAA;AAAA,MAGZ,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,0CAAA,EAA2C,CAAA;AAAA,4BACnEA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,qDAAA,EACX,QAAA,EAAA,YAAA,CAAa,OAAO,CAAA,EACvB;AAAA,WAAA,EACF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,OAAA;AAAA,cACT,SAAA,EAAU,sIAAA;AAAA,cACV,aAAA,EAAY,0BAAA;AAAA,cAEZ,QAAA,kBAAAA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC,SAAA,EACF,CAAA;AAAA,wBAGAhE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,mBAAA,CAAoB,MAAA,KAAW,CAAA,mBAC9BD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,eAAY,0BAAA,EAClD,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,kDAAA,EAAmD,CAAA;AAAA,0BAC3EA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,YAAA,CAAa,SAAS,CAAA,EACzB;AAAA,SAAA,EACF,CAAA,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+CAAA,EACZ,QAAA,EAAA,mBAAA,CAAoB,GAAA,CAAI,CAAC,KAAA,KAAU;AAClC,UAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACjD,UAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA;AACnD,UAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,KAAA,CAAM,QAAQ,CAAA,IAAK,2BAAA;AACzD,UAAA,MAAM,cAAA,GAAiB,MAAM,SAAA,CAAU,MAAA,CAAO,CAAC,QAAA,KAAa,QAAA,CAAS,cAAc,OAAO,CAAA;AAC1F,UAAA,MAAM,eAAA,GAAkB,MAAM,SAAA,CAAU,MAAA,CAAO,CAAC,QAAA,KAAa,QAAA,CAAS,cAAc,QAAQ,CAAA;AAE5F,UAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAuB,eAAa,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,CAAA,CAAA,EAEhE,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,KAAA,CAAM,MAAM,CAAA;AAAA,gBAC/C,SAAA,EAAU,mHAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,UAAA,mBACCC,GAAAA,CAACmE,eAAAA,EAAA,EAAgB,SAAA,EAAU,yCAAA,EAA0C,CAAA,mBAErEnE,GAAAA,CAAC0H,gBAAAA,EAAA,EAAiB,SAAA,EAAU,yCAAA,EAA0C,CAAA;AAAA,kCAExE1H,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,iFAAA,EAAoF,QAAQ,CAAA,CAAA,EACzG,QAAA,EAAA,aAAA,oBAAiBA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,sBAAqB,CAAA,EAClE,CAAA;AAAA,kCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAAA,EACb,gBAAM,SAAA,EACT,CAAA;AAAA,kCACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,KAAA,CAAM,SAAA,CAAU,MAAA;AAAA,oBAAO,GAAA;AAAA,oBAAE,aAAa,WAAW;AAAA,mBAAA,EACpD;AAAA;AAAA;AAAA,aACF;AAAA,YAGC,UAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6CAAA,EACZ,QAAA,EAAA,KAAA,CAAM,SAAA,CAAU,MAAA,KAAW,CAAA,mBAC1BA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6DACV,QAAA,EAAA,YAAA,CAAa,aAAa,GAC7B,CAAA,mBAEAD,IAAAA,CAAAU,QAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,cAAA,cAAA,CAAe,SAAS,CAAA,oBACvBV,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACZ,QAAA,EAAA,YAAA,CAAa,QAAQ,CAAA,EACxB,CAAA;AAAA,gBACC,cAAA,CAAe,GAAA,CAAI,CAAC,QAAA,EAAU,0BAC7BD,IAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAU,gCAAA;AAAA,oBAEV,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAuC,CAAA;AAAA,sCACvDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACb,mBAAS,IAAA,EACZ,CAAA;AAAA,sCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8FAAA,EACb,mBAAS,YAAA,EACZ;AAAA;AAAA,mBAAA;AAAA,kBATK,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,iBAWjC;AAAA,eAAA,EACH,CAAA;AAAA,cAID,gBAAgB,MAAA,GAAS,CAAA,oBACxBD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACZ,QAAA,EAAA,YAAA,CAAa,SAAS,CAAA,EACzB,CAAA;AAAA,gBACC,eAAA,CAAgB,GAAA,CAAI,CAAC,QAAA,EAAU,0BAC9BD,IAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBAEC,SAAA,EAAU,gCAAA;AAAA,oBAEV,QAAA,EAAA;AAAA,sCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAwC,CAAA;AAAA,sCACxDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EACb,mBAAS,IAAA,EACZ,CAAA;AAAA,sCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8FAAA,EACb,mBAAS,YAAA,EACZ;AAAA;AAAA,mBAAA;AAAA,kBATK,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,iBAWjC;AAAA,eAAA,EACH;AAAA,aAAA,EAEJ,CAAA,EAEJ;AAAA,WAAA,EAAA,EA/EM,MAAM,MAiFhB,CAAA;AAAA,QAEJ,CAAC,GACH,CAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;ACpaO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAA,GAAIY,gBAAgB,gCAAgC,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AACrD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAId,QAAAA,CAAiC,EAAE,CAAA;AAE/D,EAAA,MAAM,kBAAA,GAAqBuF,QAAQ,MAAM;AACvC,IAAA,MAAM,iBAAiB,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACjE,IAAA,IAAI,CAAC,cAAA,IAAkB,OAAO,cAAA,CAAe,IAAA,KAAS,YAAY,cAAA,CAAe,IAAA,KAAS,IAAA,EAAM,OAAO,EAAC;AACxG,IAAA,IAAI,EAAE,YAAY,cAAA,CAAe,IAAA,CAAA,IAAS,CAAC,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,OAAO,EAAC;AAC/E,IAAA,MAAM,WAAA,GAAc,eAAe,IAAA,CAAK,MAAA;AACxC,IAAA,OAAO,WAAA,CAAY,kBAAkB,EAAC;AAAA,EACxC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,iBAAA,GAAoB/E,WAAAA,CAAY,CAAC,YAAA,EAAsB,aAAA,KAA0B;AACrF,IAAA,SAAA,CAAU,CAAC,cAAc,EAAE,GAAG,UAAU,CAAC,YAAY,GAAG,aAAA,EAAc,CAAE,CAAA;AAAA,EAC1E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AACrC,IAAA,MAAM,iBAAgD,EAAC;AACvD,IAAA,KAAA,MAAW,gBAAgB,kBAAA,EAAoB;AAC7C,MAAA,cAAA,CAAe,YAAY,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA,IAAK,EAAA;AAAA,IACzD;AACA,IAAA,KAAA,CAAM,cAAc,CAAA;AACpB,IAAA,OAAA,EAAQ;AACR,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,GAAG,CAAC,kBAAA,EAAoB,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAC,CAAA;AAE/C,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,OAAA,EAAQ;AACR,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EACd,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEP,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,WAAA;AAAA,MACT,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA,MAChB,QAAA,EAAU,EAAE,UAAU,CAAA;AAAA,MACtB,QAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EACZ,6BAAmB,MAAA,KAAW,CAAA,mBAC7BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wDAAwD,QAAA,EAAA,CAAA,CAAE,UAAU,GAAE,CAAA,GAEnF,kBAAA,CAAmB,IAAI,CAAC,YAAA,qBACtBD,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,iEAAA,EAAmE,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,0BACjGA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,MAAA,CAAO,YAAY,CAAA,IAAK,EAAA;AAAA,cAC/B,UAAU,CAAC,KAAA,KAAU,kBAAkB,YAAA,EAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACvE,WAAA,EAAa,CAAA,EAAG,CAAA,CAAE,eAAe,CAAC,CAAA,GAAA;AAAA;AAAA;AACpC,SAAA,EAAA,EANQ,YAOV,CACD,CAAA,EAEL,CAAA;AAAA,wBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,KAAA,EAAK,MAAC,OAAA,EAAS,WAAA,EAAc,QAAA,EAAA,CAAA,CAAE,QAAQ,CAAA,EAAE,CAAA;AAAA,0BAC3DD,KAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,QAAA,EAAQ,IAAA,EAAC,SAAS,YAAA,EAClC,QAAA,EAAA;AAAA,4BAAAC,IAACqB,QAAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,aAAU,MAAA,EAAO,CAAA;AAAA,YAClD,EAAE,KAAK;AAAA,WAAA,EACV;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACpEA,IAAM,aAAA,GAAsF;AAAA,EAC1F,SAAA,EAAW,EAAE,IAAA,EAAMiH,iBAAAA,EAAiB,YAAY,gBAAA,EAAiB;AAAA,EACjE,MAAA,EAAQ,EAAE,IAAA,EAAMG,qBAAAA,EAAuB,YAAY,cAAA,EAAe;AAAA,EAClE,OAAA,EAAS,EAAE,IAAA,EAAMxG,aAAAA,EAAe,YAAY,4BAAA,EAA6B;AAAA,EACzE,OAAA,EAAS,EAAE,IAAA,EAAM6F,SAAAA,EAAW,YAAY,eAAA,EAAgB;AAAA,EACxD,OAAA,EAAS,EAAE,IAAA,EAAMQ,iBAAAA,EAAiB,YAAY,gBAAA,EAAiB;AAAA,EAC/D,KAAA,EAAO,EAAE,IAAA,EAAMG,qBAAAA,EAAuB,YAAY,cAAA,EAAe;AAAA,EACjE,OAAA,EAAS,EAAE,IAAA,EAAMX,SAAAA,EAAW,YAAY,eAAA;AAC1C,CAAA;AAEA,SAASU,gBAAe,UAAA,EAAmC;AACzD,EAAA,IAAI,UAAA,KAAe,MAAM,OAAO,QAAA;AAChC,EAAA,IAAI,UAAA,GAAa,GAAA,EAAM,OAAO,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA;AAC3C,EAAA,OAAO,CAAA,EAAA,CAAI,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC1C;AAEA,SAAS,gBAAgB,SAAA,EAA2B;AAClD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAC/B,EAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAW,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AACrG;AAEO,SAAS,aAAa,EAAE,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,UAAS,EAAsB;AACvF,EAAA,MAAM,CAAA,GAAI5H,gBAAgB,8BAA8B,CAAA;AACxD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAId,QAAAA,CAAwB,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAqC,IAAI,CAAA;AAEjF,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,SAAS,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,WAAW,CAAA;AAEjE,EAAA,MAAM,WAAA,GAAcQ,YAAY,YAAY;AAC1C,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,UAAU,CAAA;AAC9C,MAAA,OAAA,CAAQ,YAAY,CAAA;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAEzB,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,OAAW,WAAA,EAAY;AAAA,EAC7B,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAEtB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,IAAA,EAAM,KAAK,WAAA,EAAY;AAAA,EAC3C,CAAA,EAAG,CAAC,SAAA,EAAW,IAAA,EAAM,WAAW,CAAC,CAAA;AAEjC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACER,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAA4E,SAAS,OAAA,EAAS,CAAA;AAAA,oBAC7GD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2KAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iGAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,OAAO,CAAA,EAAE,CAAA;AAAA,wBAChFA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,oHAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAACgE,WAAAA,EAAA,EAAU,WAAU,SAAA,EAAU;AAAA;AAAA;AACjC,OAAA,EACF,CAAA;AAAA,sBAEAjE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EACZ,QAAA,EAAA;AAAA,QAAA,SAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAACiC,aAAAA,EAAA,EAAc,SAAA,EAAU,oCAAA,EAAqC,CAAA;AAAA,4BAC9DjC,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EAA0D,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE;AAAA,WAAA,EAC3F,CAAA;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACZ,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,MAAM,CAAA,KAAM;AACrD,YAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,CAAO,MAAM,KAAK,aAAA,CAAc,OAAA;AAClE,YAAA,MAAM,aAAa,WAAA,CAAY,IAAA;AAC/B,YAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAiB,SAAA,EAAU,6GAAA,EAC1B,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,IAAC,UAAA,EAAA,EAAW,SAAA,EAAW,CAAA,YAAA,EAAe,WAAA,CAAY,UAAU,CAAA,CAAA,EAAI,CAAA;AAAA,gCAChEA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAA6C,QAAA,EAAA,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,eAAA,EAClF,CAAA;AAAA,cACC,MAAA,CAAO,UAAA,KAAe,MAAA,oBAAaA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAAwI,eAAAA,CAAe,MAAA,CAAO,UAAU,CAAA,EAAE;AAAA,aAAA,EAAA,EAL/F,MAMV,CAAA;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,QAGD,YAAA,oBACCzI,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+DAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE,CAAA;AAAA,4BACvFA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA,EAAG,SAAA,EAAU,wEAAA,EACnE,QAAA,EAAA,CAAA,CAAE,OAAO,CAAA,EACZ;AAAA,WAAA,EACF,CAAA;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,CAAA,CAAE,QAAQ,CAAA,EAAE,CAAA;AAAA,8BAC7CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,aAAA,CAAc,YAAA,CAAa,MAAM,CAAA,EAAG,UAAA,IAAc,eAAA,EAChE,QAAA,EAAA,CAAA,CAAE,YAAA,CAAa,MAA0F,CAAA,EAC5G;AAAA,aAAA,EACF,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,CAAA,CAAE,UAAU,CAAA,EAAE,CAAA;AAAA,8BAC/CA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAAwI,eAAAA,CAAe,YAAA,CAAa,UAAU,CAAA,EAAE;AAAA,aAAA,EAC9F,CAAA;AAAA,YACC,YAAA,CAAa,KAAA,oBACZzI,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,OAAO,CAAA,EAAE,CAAA;AAAA,8BAC3CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qIAAA,EAAuI,uBAAa,KAAA,EAAM;AAAA,aAAA,EAC3K,CAAA;AAAA,YAED,MAAA,CAAO,KAAK,YAAA,CAAa,OAAO,EAAE,MAAA,GAAS,CAAA,oBAC1CD,IAAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EAAE,CAAA;AAAA,8BAC9CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yIAAA,EACZ,QAAA,EAAA,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAC/C;AAAA,aAAA,EACF;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA;AAAA,wBAGFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6DAAA,EAA+D,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE,CAAA;AAAA,UAE5F,aAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACZ,QAAA,EAAA,CAAC,GAAG,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,0BAAWA,GAAAA,CAAC,SAAgB,SAAA,EAAU,yBAAA,EAAA,EAAjB,KAA2C,CAAG,CAAA,EACrF,CAAA;AAAA,UAGD,CAAC,iBAAiB,IAAA,CAAK,MAAA,KAAW,qBACjCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC8H,SAAAA,EAAA,EAAU,SAAA,EAAU,uDAAA,EAAwD,CAAA;AAAA,4BAC7E9H,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0CAAA,EAA4C,QAAA,EAAA,CAAA,CAAE,QAAQ,CAAA,EAAE,CAAA;AAAA,4BACrEA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mDAAA,EAAqD,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EAAE;AAAA,WAAA,EAC3F,CAAA;AAAA,UAGD,CAAC,aAAA,IAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,oBAC/BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACZ,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,YAAA,MAAM,WAAA,GAAc,aAAA,CAAc,GAAA,CAAI,MAAM,KAAK,aAAA,CAAc,OAAA;AAC/D,YAAA,MAAM,aAAa,WAAA,CAAY,IAAA;AAC/B,YAAA,MAAM,UAAA,GAAa,WAAA,EAAa,EAAA,KAAO,GAAA,CAAI,EAAA;AAC3C,YAAA,uBACED,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,MAAM;AACb,kBAAA,cAAA,CAAe,UAAA,GAAa,OAAO,GAAG,CAAA;AACtC,kBAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,gBACtB,CAAA;AAAA,gBACA,SAAA,EAAW,CAAA,iEAAA,EACT,UAAA,GACI,wEAAA,GACA,qIACN,CAAA,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sCAAAC,IAAC,UAAA,EAAA,EAAW,SAAA,EAAW,CAAA,YAAA,EAAe,WAAA,CAAY,UAAU,CAAA,CAAA,EAAI,CAAA;AAAA,sCAChEA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAqD,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,EAAE;AAAA,qBAAA,EACtG,CAAA;AAAA,oCACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAA6B,QAAA,EAAAwI,eAAAA,CAAe,GAAA,CAAI,eAAe,CAAA,EAAE;AAAA,mBAAA,EACnF,CAAA;AAAA,kBACC,GAAA,CAAI,yBAASxI,GAAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EAA0C,cAAI,KAAA,EAAM;AAAA;AAAA,eAAA;AAAA,cAnB1E,GAAA,CAAI;AAAA,aAoBX;AAAA,UAEJ,CAAC,CAAA,EACH,CAAA;AAAA,UAGD,WAAA,IAAe,YAAY,WAAA,CAAY,MAAA,GAAS,qBAC/CD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yEAAA,EAA0E,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,YAC5F,WAAA,CAAY,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,KAAe;AAC3C,cAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,UAAA,CAAW,MAAM,KAAK,aAAA,CAAc,OAAA;AAC1E,cAAA,MAAM,iBAAiB,eAAA,CAAgB,IAAA;AACvC,cAAA,uBACED,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAEC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,MAAM,eAAA,CAAgB,UAAU,CAAA;AAAA,kBACzC,SAAA,EAAU,iHAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sCAAAC,IAAC,cAAA,EAAA,EAAe,SAAA,EAAW,CAAA,QAAA,EAAW,eAAA,CAAgB,UAAU,CAAA,CAAA,EAAI,CAAA;AAAA,sCACpEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,qBAAW,QAAA,EAAS;AAAA,qBAAA,EAC1E,CAAA;AAAA,oCACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAA6B,QAAA,EAAAwI,eAAAA,CAAe,UAAA,CAAW,UAAU,CAAA,EAAE;AAAA;AAAA,iBAAA;AAAA,gBAT9E,UAAA,CAAW;AAAA,eAUlB;AAAA,YAEJ,CAAC;AAAA,WAAA,EACH;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC9NO,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAO,EAAyB;AAChE,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,uBACExI,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAA6D,QAAA,EAAA,QAAA,EAE7E,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDAAuD,QAAA,EAAA,QAAA,EAEvE,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT;ACbO,IAAM,iBAAA,GAAoBE,IAAAA,CAAK,SAASwI,kBAAAA,CAAkB;AAAA,EAC/D,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,iBAAA,GAAoBpI,WAAAA,CAAY,CAAC,KAAA,KAAyB;AAC9D,IAAA,eAAA,GAAkB,KAAK,CAAA;AACvB,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,eAAA,EAAiB,eAAe,CAAC,CAAA;AAErC,EAAA,uBACEN,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,aAAA,EAAe;AAAA;AAAA,GACjB;AAEJ,CAAC;ACpBM,SAAS2I,sBAAqB,KAAA,EAAkC;AACrE,EAAA,uBAAO3I,GAAAA,CAAC,oBAAA,EAAA,EAAwB,GAAG,KAAA,EAAO,CAAA;AAC5C;ACcA,IAAM,uBAAA,GAA0B,EAAA;AAEzB,SAAS,eAAe,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,OAAM,EAAwB;AACtF,EAAA,MAAM,YAAA,GAAeY,gBAAgB,4BAA4B,CAAA;AACjE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAId,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,aAAA,GAAgBuF,QAAQ,OAAO;AAAA,IACnC,MAAM,QAAA,CAAS,IAAA;AAAA,IACf,aAAa,QAAA,CAAS,WAAA;AAAA,IACtB,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACnC,KAAA,EAAO;AAAA,MACL,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,UAAU,KAAA,CAAM;AAAA;AAClB,GACF,CAAA,EAAI,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAErB,EAAA,MAAM,UAAA,GAAaA,OAAAA,CAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAExF,EAAA,MAAM,YAAA,GAAeA,QAAQ,MAAM;AACjC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACnC,IAAA,IAAI,KAAA,CAAM,UAAU,uBAAA,EAAyB;AAC3C,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,uBAAuB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,OAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,qBAAA,GAAwB/E,YAAY,YAAY;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,UAAU,CAAA;AAC9C,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,MAAA,QAAA,CAAS,KAAA,GAAQ,UAAA;AACjB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,MAAA,QAAA,CAAS,MAAA,EAAO;AAChB,MAAA,QAAA,CAAS,YAAY,MAAM,CAAA;AAC3B,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,UAAA,CAAW,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,kBAAA,GAAqBA,YAAY,MAAM;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC/C,IAAA,YAAA,CAAa,IAAA,GAAO,GAAA;AACpB,IAAA,YAAA,CAAa,WAAW,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,SAAS,OAAO,CAAA,KAAA,CAAA;AAC7D,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AACtC,IAAA,YAAA,CAAa,KAAA,EAAM;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AACtC,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB,GAAG,CAAC,UAAA,EAAY,SAAS,IAAA,EAAM,QAAA,CAAS,OAAO,CAAC,CAAA;AAEhD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEN,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,aAAa,OAAO,CAAA;AAAA,MAC3B,QAAA,EAAU,aAAa,aAAa,CAAA;AAAA,MACpC,QAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,kBAAA,EAEf,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,yDAAA,EACb,0BAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,YAAA,CAAa,cAAc,CAAA,EAAE,CAAA;AAAA,4BACjFA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA6C,mBAAS,IAAA,EAAK;AAAA,WAAA,EAC1E,CAAA;AAAA,0BACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,YAAA,CAAa,SAAS,CAAA,EAAE,CAAA;AAAA,4BAC5ED,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAAE,QAAA,CAAS;AAAA,aAAA,EAAQ;AAAA,WAAA,EAC9E,CAAA;AAAA,0BACAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,YAAA,CAAa,OAAO,CAAA,EAAE,CAAA;AAAA,4BAC1EA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,CAAM,MAAM,MAAA,EAAO;AAAA,WAAA,EAC/E,CAAA;AAAA,0BACAD,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,YAAA,CAAa,OAAO,CAAA,EAAE,CAAA;AAAA,4BAC1EA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2CAAA,EAA6C,QAAA,EAAA,KAAA,CAAM,MAAM,MAAA,EAAO;AAAA,WAAA,EAC/E;AAAA,SAAA,EACF,CAAA,EACF,CAAA;AAAA,wBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACZ,QAAA,EAAA,YAAA,CAAa,SAAS,CAAA,EACzB,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,wJAAA;AAAA,cACV,aAAA,EAAY,qBAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EACF,CAAA;AAAA,wBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,qBAAA;AAAA,cACT,OAAA,EAAO,IAAA;AAAA,cACP,IAAA,EAAK,IAAA;AAAA,cACL,aAAA,EAAY,oBAAA;AAAA,cAEX,QAAA,EAAA,QAAA,mBACCD,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAT,GAAAA,CAAC+H,SAAAA,EAAA,EAAU,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,gBAC7C,aAAa,QAAQ;AAAA,eAAA,EACxB,CAAA,mBAEAhI,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAT,GAAAA,CAACgH,qBAAAA,EAAA,EAAsB,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBAC1C,aAAa,iBAAiB;AAAA,eAAA,EACjC;AAAA;AAAA,WAEJ;AAAA,0BACAjH,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,kBAAA;AAAA,cACT,KAAA,EAAM,gBAAA;AAAA,cACN,IAAA,EAAK,IAAA;AAAA,cACL,aAAA,EAAY,wBAAA;AAAA,cAEZ,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC4I,iBAAAA,EAAA,EAAkB,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBACtC,aAAa,cAAc;AAAA;AAAA;AAAA;AAC9B,SAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;ACpIA,SAAS,qBAAqB,UAAA,EAAsC;AAClE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,CAAC,qBAAqB,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EACpG;AAEA,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,CAAC,4BAA4B,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EAC3G;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA;AAGb,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,GAAS,IAAA,CAAK,KAAA,GAAoC,IAAA;AAEzE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AACnC,IAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AACnC,IAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,QAAA,IAAY,OAAO,SAAA,CAAU,aAAa,QAAA,EAAU;AACjE,IAAA,MAAA,CAAO,KAAK,sCAAsC,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA,EAAM,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EAC3E;AAEA,EAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AACxB,EAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AAGxB,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,OAAO,IAAA,CAAK,OAAO,QAAA,EAAU;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AAC/C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,2BAAA,CAA6B,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,OAAO,IAAA,CAAK,aAAa,QAAA,EAAU;AACvD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,IACrE;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,OAAO,IAAA,CAAK,OAAO,QAAA,EAAU;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,IACnE;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,IACnE;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,KAAA,CAAM,MAAA,EAAO;AAAA,EACjG;AAEA,EAAA,MAAM,WAAW,SAAA,CAAU,QAAA;AAC3B,EAAA,MAAM,KAAA,GAAuB;AAAA,IAC3B,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1B,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,MAAO,IAAA,CAAK,IAAA,IAAQ,EAAE,QAAA,EAAU,EAAA,EAAI,OAAO,EAAA;AAAG,KAChD,CAAE,CAAA;AAAA,IACF,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC1B,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,YAAA,EAAe,KAAK,YAAA,IAAgB,SAAA;AAAA,MACpC,YAAA,EAAe,KAAK,YAAA,IAAgB;AAAA,KACtC,CAAE,CAAA;AAAA,IACF,QAAA,EAAU;AAAA,MACR,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI,CAAA;AAAA,MACjD,GAAG,OAAO,QAAA,CAAS,CAAA,KAAM,QAAA,GAAW,SAAS,CAAA,GAAI,CAAA;AAAA,MACjD,MAAM,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,SAAS,IAAA,GAAO;AAAA;AAC5D,GACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,KAAA,EAAO,SAAA,EAAW,KAAA,CAAM,MAAA,EAAQ,SAAA,EAAW,KAAA,CAAM,MAAA,EAAO;AAC9F;AAEO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,OAAA,EAAS,UAAS,EAAwB;AAC/E,EAAA,MAAM,YAAA,GAAehI,gBAAgB,4BAA4B,CAAA;AACjE,EAAA,MAAM,YAAA,GAAeP,OAAyB,IAAI,CAAA;AAElD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIP,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAkC,IAAI,CAAA;AACtF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAE5D,EAAA,MAAM,WAAA,GAAcQ,WAAAA,CAAY,CAAC,IAAA,KAAe;AAC9C,IAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAErB,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,IAAA,MAAA,CAAO,MAAA,GAAS,CAAC,KAAA,KAAU;AACzB,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,EAAQ,MAAA;AAC9B,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,MAAM,MAAA,GAAS,qBAAqB,OAAO,CAAA;AAC3C,QAAA,mBAAA,CAAoB,MAAM,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,WAAW,IAAI,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,CAAC,KAAA,KAA2C;AAC7E,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,WAAAA,CAAY,CAAC,KAAA,KAA2C;AAC9E,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,KAAA,KAA2C;AAC1C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,eAAA,CAAgB,KAAK,CAAA;AAErB,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,KAAA;AACjC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,WAAA,CAAY,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,KAAA,KAA+C;AAC9C,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA;AAC3B,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,QAAA,WAAA,CAAY,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,MAAM,iBAAA,GAAoBA,YAAY,MAAM;AAC1C,IAAA,YAAA,CAAa,SAAS,KAAA,EAAM;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AACrC,IAAA,IAAI,gBAAA,EAAkB,OAAA,IAAW,gBAAA,CAAiB,KAAA,EAAO;AACvD,MAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA;AAC/B,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,QAAA,EAAU,OAAO,CAAC,CAAA;AAExC,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,QAAQ,KAAA,GAAQ,EAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEN,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,aAAa,OAAO,CAAA;AAAA,MAC3B,QAAA,EAAU,aAAa,aAAa,CAAA;AAAA,MACpC,QAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAY,kBAAA,EACf,QAAA,EAAA;AAAA,wBAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,CAAC,mCACAD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,UAAA,EAAY,cAAA;AAAA,YACZ,WAAA,EAAa,eAAA;AAAA,YACb,MAAA,EAAQ,UAAA;AAAA,YACR,OAAA,EAAS,iBAAA;AAAA,YACT,SAAA,EAAW,CAAA,gGAAA,EACT,YAAA,GACI,qEAAA,GACA,uFACN,CAAA,CAAA;AAAA,YACA,aAAA,EAAY,iBAAA;AAAA,YAEZ,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,oDAAA,EAAqD,CAAA;AAAA,8BAChFA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2DAAA,EACV,QAAA,EAAA,YAAA,CAAa,UAAU,CAAA,EAC1B,CAAA;AAAA,8BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,YAAA,CAAa,cAAc,CAAA,EAC9B,CAAA;AAAA,8BACAA,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,YAAA;AAAA,kBACL,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAO,OAAA;AAAA,kBACP,QAAA,EAAU,gBAAA;AAAA,kBACV,SAAA,EAAU,QAAA;AAAA,kBACV,aAAA,EAAY;AAAA;AAAA;AACd;AAAA;AAAA,SACF,mBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,eAAY,0BAAA,EACf,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EAAwD,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,4BACjFA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,KAAA,EAAK,IAAA,EAAC,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,WAAA,EAC5C,QAAA,EAAA,YAAA,CAAa,eAAe,CAAA,EAC/B;AAAA,WAAA,EACF,CAAA;AAAA,UAEC,iBAAiB,OAAA,mBAChBD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+FAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAACsI,iBAAAA,EAAA,EAAgB,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,8BACpDtI,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wDAAA,EACb,QAAA,EAAA,YAAA,CAAa,mBAAmB,CAAA,EACnC;AAAA,aAAA,EACF,CAAA;AAAA,4BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,YAAA,CAAa,OAAO,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG,gBAAA,CAAiB;AAAA,eAAA,EAC7C,CAAA;AAAA,8BACAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,YAAA,CAAa,OAAO,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG,gBAAA,CAAiB;AAAA,eAAA,EAC7C;AAAA,aAAA,EACF;AAAA,WAAA,EACF,CAAA,mBAEAA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uFAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAACgB,uBAAAA,EAAA,EAAwB,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,8BAC1DhB,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oDAAA,EACb,QAAA,EAAA,YAAA,CAAa,kBAAkB,CAAA,EAClC;AAAA,aAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,gBAAA,EACX,QAAA,EAAA,gBAAA,CAAiB,OAAO,GAAA,CAAI,CAAC,iBAAiB,KAAA,qBAC7CA,IAAC,IAAA,EAAA,EAAe,SAAA,EAAU,0CACvB,QAAA,EAAA,eAAA,EAAA,EADM,KAET,CACD,CAAA,EACH;AAAA,WAAA,EACF;AAAA,SAAA,EAEJ,CAAA,EAEJ,CAAA;AAAA,wBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAS,OAAA,EAAS,OAAA,EAAO,IAAA,EAAC,IAAA,EAAK,IAAA,EAAK,aAAA,EAAY,sBAAA,EACnE,QAAA,EAAA,YAAA,CAAa,QAAQ,CAAA,EACxB,CAAA;AAAA,0BACAD,IAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,YAAA;AAAA,cACT,QAAA,EAAU,CAAC,gBAAA,EAAkB,OAAA;AAAA,cAC7B,KAAA,EAAM,gBAAA;AAAA,cACN,IAAA,EAAK,IAAA;AAAA,cACL,aAAA,EAAY,uBAAA;AAAA,cAEZ,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBACpC,aAAa,QAAQ;AAAA;AAAA;AAAA;AACxB,SAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;;;ACxSO,IAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,CAAC,UAAU,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC;AAE1E,IAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,CAAC,UAAU,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC;AAE5E,IAAM,eAAe,MAAM,gBAAA,CAAiB,CAAC,KAAA,KAAU,KAAA,CAAM,cAAc,IAAI;AAE/E,IAAM,iBAAiB,MAAM,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,WAAW;AAE1E,IAAM,mBAAmB,MAAM,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,aAAa;AAE9E,IAAM,oBAAA,GAAuB,MAClC,gBAAA,CAAiB,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,EAAE,MAAM;AAEzE,IAAM,eAAe,MAAM,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,SAAS;AAEtE,IAAM,iBAAiB,MAAM,gBAAA,CAAiB,CAAC,KAAA,KAAU,MAAM,WAAW;ACTjF,IAAM,mBAAA,GAAsB,EAAA;AAErB,SAAS,YACd,KAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,EACA,aAAqB,mBAAA,EACF;AACnB,EAAA,MAAM,OAAA,GAAUK,MAAAA,CAAwB,EAAE,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAYA,MAAAA,CAAwB,EAAE,CAAA;AAI5C,EAAA,MAAM,aAAA,GAAgBA,OAAO,CAAC,CAAA;AAC9B,EAAA,MAAM,eAAA,GAAkBA,OAAO,CAAC,CAAA;AAEhC,EAAA,MAAM,YAAA,GAAeC,YAAY,MAAM;AACrC,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC9B,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MAChE,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAC1C;AACA,IAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,GAAG,OAAA,CAAQ,OAAA,CAAQ,MAAM,EAAE,UAAA,GAAa,CAAA,CAAE,CAAA,EAAG,QAAQ,CAAA;AACxE,IAAA,aAAA,CAAc,OAAA,GAAU,QAAQ,OAAA,CAAQ,MAAA;AACxC,IAAA,SAAA,CAAU,UAAU,EAAC;AACrB,IAAA,eAAA,CAAgB,OAAA,GAAU,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,KAAA,EAAO,KAAA,EAAO,UAAU,CAAC,CAAA;AAE7B,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAElC,IAAA,MAAM,eAAA,GAAiC;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MAChE,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAC1C;AAEA,IAAA,OAAA,CAAQ,OAAA,GAAU,SAAA;AAClB,IAAA,aAAA,CAAc,UAAU,SAAA,CAAU,MAAA;AAClC,IAAA,SAAA,CAAU,OAAA,GAAU,CAAC,GAAG,SAAA,CAAU,SAAS,eAAe,CAAA;AAC1D,IAAA,eAAA,CAAgB,OAAA,GAAU,UAAU,OAAA,CAAQ,MAAA;AAE5C,IAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AACvB,IAAA,QAAA,CAAS,SAAS,KAAK,CAAA;AAAA,EACzB,GAAG,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAC,CAAA;AAErC,EAAA,MAAM,IAAA,GAAOA,YAAY,MAAM;AAC7B,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEpC,IAAA,MAAM,eAAA,GAAiC;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MAChE,KAAA,EAAO,MAAM,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAC1C;AAEA,IAAA,SAAA,CAAU,OAAA,GAAU,SAAA;AACpB,IAAA,eAAA,CAAgB,UAAU,SAAA,CAAU,MAAA;AACpC,IAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,GAAG,OAAA,CAAQ,SAAS,eAAe,CAAA;AACtD,IAAA,aAAA,CAAc,OAAA,GAAU,QAAQ,OAAA,CAAQ,MAAA;AAExC,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,IAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EACrB,GAAG,CAAC,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAC,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,IAClC,OAAA,EAAS,SAAA,CAAU,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,IACpC;AAAA,GACF;AACF;AC/EA,IAAM,YAAA,GAAe,EAAA;AAEd,SAAS,YAAA,CACd,KAAA,EACA,KAAA,EACA,QAAA,EACA,UACA,YAAA,EACoB;AACpB,EAAA,MAAM,YAAA,GAAeD,OAAgC,IAAI,CAAA;AAEzD,EAAA,MAAM,IAAA,GAAOC,YAAY,MAAM;AAC7B,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AAC1D,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAEhC,IAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,aAAA,CAAc,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AACpE,IAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA;AAAA,MAC1B,CAAC,IAAA,KAAS,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IAAK,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,MAAM;AAAA,KAC/E;AAEA,IAAA,YAAA,CAAa,OAAA,GAAU;AAAA,MACrB,KAAA,EAAO,aAAA,CAAc,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MACxE,KAAA,EAAO,cAAc,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAClD;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjB,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA,EAAG;AAEhD,IAAA,YAAA,EAAa;AAEb,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,IAAA,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChC,MAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,MAAA,CAAO,YAAY,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,MAAM,WAAA,GAAsB,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACzD,GAAG,IAAA;AAAA,MACH,IAAI,SAAA,CAAU,GAAA,CAAI,KAAK,EAAE,CAAA,IAAK,OAAO,UAAA,EAAW;AAAA,MAChD,QAAA,EAAU;AAAA,QACR,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,YAAA;AAAA,QACrB,CAAA,EAAG,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI;AAAA,OACvB;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA;AAAK,KACvB,CAAE,CAAA;AAEF,IAAA,MAAM,WAAA,GAAsB,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACzD,GAAG,IAAA;AAAA,MACH,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,QAAQ,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAM,KAAK,IAAA,CAAK,MAAA;AAAA,MAC3C,QAAQ,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAM,KAAK,IAAA,CAAK;AAAA,KAC7C,CAAE,CAAA;AAEF,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AAAA,MACzB,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM,CAAE,CAAA;AAAA,MAC5D,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB,CAAC,GAAG,YAAA,EAAc,GAAG,WAAW,CAAC,CAAA;AAG5D,IAAA,YAAA,CAAa,OAAA,GAAU;AAAA,MACrB,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,GAAG,IAAA,CAAK,IAAA,IAAO,CAAE,CAAA;AAAA,MACtE,KAAA,EAAO,YAAY,GAAA,CAAI,CAAC,UAAU,EAAE,GAAG,MAAK,CAAE;AAAA,KAChD;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,YAAY,CAAC,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAW,YAAA,CAAa,OAAA,KAAY,QAAQ,YAAA,CAAa,OAAA,CAAQ,MAAM,MAAA,GAAS;AAAA,GAClF;AACF;AC3EA,IAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,UAAA,EAAY,QAAQ,CAAC,CAAA;AAE1D,SAAS,cAAA,GAA0B;AACjC,EAAA,MAAM,gBAAgB,QAAA,CAAS,aAAA;AAC/B,EAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAC3B,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,aAAA,CAAc,OAAO,KAAM,aAAA,CAA8B,iBAAA;AACjF;AAEO,SAAS,kBAAA,CAAmB;AAAA,EACjC,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAAC,UAAU,MAAM;AACd,IAAA,SAAS,cAAc,KAAA,EAAsB;AAC3C,MAAA,IAAI,gBAAe,EAAG;AAEtB,MAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA;AAEjD,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,UAAA,SAAA,EAAU;AACV,UAAA;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,QAAQ,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY;AAAG,QAC/B,KAAK,GAAA,EAAK;AACR,UAAA,IAAI,MAAM,QAAA,EAAU;AAClB,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,IAAA,EAAK;AAAA,YACP;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,IAAA,EAAK;AAAA,YACP;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,IAAA,EAAK;AAAA,UACP;AACA,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAA,EAAK;AACL,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,KAAA,EAAM;AACN,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,SAAA,EAAU;AACV,UAAA;AAAA,QACF;AAAA,QACA,KAAK,GAAA,EAAK;AACR,UAAA,IAAI,MAAM,QAAA,EAAU;AAClB,YAAA,KAAA,CAAM,cAAA,EAAe;AACrB,YAAA,OAAA,EAAQ;AAAA,UACV;AACA,UAAA;AAAA,QACF;AAAA;AACF,IACF;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,OAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,CAAC,CAAA;AACpE;ACrEA,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM4G,mBAAAA,GAAqB,GAAA;AAC3B,IAAMC,oBAAAA,GAAsB,EAAA;AAE5B,SAAS,cAAc,IAAA,EAAwB;AAC7C,EAAA,MAAM,KAAA,GAAS,IAAA,CAAK,QAAA,EAAU,KAAA,IAAS,KAAK,KAAA,IAASD,mBAAAA;AACrD,EAAA,MAAM,MAAA,GAAU,IAAA,CAAK,QAAA,EAAU,MAAA,IAAU,KAAK,MAAA,IAAUC,oBAAAA;AAExD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAK,QAAA,CAAS,CAAA;AAAA,IACpB,OAAA,EAAS,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,IACnC,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,KAAA;AAAA,IACzB,GAAA,EAAK,KAAK,QAAA,CAAS,CAAA;AAAA,IACnB,OAAA,EAAS,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,MAAA,GAAS,CAAA;AAAA,IACpC,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI;AAAA,GAC5B;AACF;AAOA,SAAS,cAAA,CACP,YACA,UAAA,EACkB;AAClB,EAAA,IAAI,iBAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,eAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,wBAAwB,mBAAA,GAAsB,CAAA;AAClD,EAAA,IAAI,sBAAsB,mBAAA,GAAsB,CAAA;AAEhD,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,WAAA,GAAc,cAAc,SAAS,CAAA;AAG3C,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,EAAE,SAAA,EAAW,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,YAAY,IAAA,EAAK;AAAA,MAC3D,EAAE,SAAA,EAAW,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,YAAY,OAAA,EAAQ;AAAA,MAC9D,EAAE,SAAA,EAAW,UAAA,CAAW,IAAA,EAAM,UAAA,EAAY,YAAY,KAAA,EAAM;AAAA,MAC5D,EAAE,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,YAAY,IAAA,EAAK;AAAA,MAC9D,EAAE,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,YAAY,OAAA,EAAQ;AAAA,MACjE,EAAE,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,YAAY,KAAA,EAAM;AAAA,MAC/D,EAAE,SAAA,EAAW,UAAA,CAAW,KAAA,EAAO,UAAA,EAAY,YAAY,IAAA,EAAK;AAAA,MAC5D,EAAE,SAAA,EAAW,UAAA,CAAW,KAAA,EAAO,UAAA,EAAY,YAAY,OAAA,EAAQ;AAAA,MAC/D,EAAE,SAAA,EAAW,UAAA,CAAW,KAAA,EAAO,UAAA,EAAY,YAAY,KAAA;AAAM,KAC/D;AAEA,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,SAAA,GAAY,MAAM,UAAU,CAAA;AAC5D,MAAA,IAAI,QAAA,IAAY,mBAAA,IAAuB,QAAA,GAAW,mBAAA,EAAqB;AACrE,QAAA,mBAAA,GAAsB,QAAA;AACtB,QAAA,eAAA,GAAkB,KAAA,CAAM,UAAA;AAAA,MAC1B;AAAA,IACF;AAGA,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,EAAE,SAAA,EAAW,UAAA,CAAW,GAAA,EAAK,UAAA,EAAY,YAAY,GAAA,EAAI;AAAA,MACzD,EAAE,SAAA,EAAW,UAAA,CAAW,GAAA,EAAK,UAAA,EAAY,YAAY,OAAA,EAAQ;AAAA,MAC7D,EAAE,SAAA,EAAW,UAAA,CAAW,GAAA,EAAK,UAAA,EAAY,YAAY,MAAA,EAAO;AAAA,MAC5D,EAAE,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,YAAY,GAAA,EAAI;AAAA,MAC7D,EAAE,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,YAAY,OAAA,EAAQ;AAAA,MACjE,EAAE,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,UAAA,EAAY,YAAY,MAAA,EAAO;AAAA,MAChE,EAAE,SAAA,EAAW,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,YAAY,GAAA,EAAI;AAAA,MAC5D,EAAE,SAAA,EAAW,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,YAAY,OAAA,EAAQ;AAAA,MAChE,EAAE,SAAA,EAAW,UAAA,CAAW,MAAA,EAAQ,UAAA,EAAY,YAAY,MAAA;AAAO,KACjE;AAEA,IAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,SAAA,GAAY,MAAM,UAAU,CAAA;AAC5D,MAAA,IAAI,QAAA,IAAY,mBAAA,IAAuB,QAAA,GAAW,qBAAA,EAAuB;AACvE,QAAA,qBAAA,GAAwB,QAAA;AACxB,QAAA,iBAAA,GAAoB,KAAA,CAAM,UAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,iBAAA,EAAmB,QAAA,EAAU,eAAA,EAAgB;AACpE;AAUO,SAAS,YAAA,GAId;AACA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAItH,QAAAA,CAA2B;AAAA,IAC3D,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoBQ,WAAAA;AAAA,IACxB,CAAC,QAAA,KACC,CAAC,MAAA,EAAQ,aAAa,YAAA,KAAiB;AACrC,MAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,QAC1B,YAAA,CAAa,MAAA,GAAS,CAAA,GAClB,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAA,GAClC,CAAC,WAAA,CAAY,EAAE;AAAA,OACrB;AAEA,MAAA,MAAM,UAAA,GAAa,cAAc,WAAW,CAAA;AAC5C,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAE1E,MAAA,YAAA,CAAa,cAAA,CAAe,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,IACrD,CAAA;AAAA,IACF;AAAC,GACH;AAEA,EAAA,MAAM,cAAA,GAAkCA,YAAY,MAAM;AACxD,IAAA,YAAA,CAAa,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,EACnD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC/GO,SAAS,sBAAsB,KAAA,EAAwC;AAC5E,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA0B;AAE9C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACrE,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,EACnD;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,CAAA,uCAAA,EAA0C,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,CAAA,uCAAA,EAA0C,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IACtF;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AACzC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,gBAAA,CAAiB,GAAA,CAAI,KAAK,MAAM,CAAA;AAChC,IAAA,gBAAA,CAAiB,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EAClC;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAE9B,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,IAAI,CAAA,oCAAA,CAAsC,CAAA;AAAA,IAC3F;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAEhC,IAAA,IAAI,UAAA,CAAW,IAAA,KAAS,MAAA,IAAU,UAAA,CAAW,SAAS,OAAA,EAAS;AAC7D,MAAA,MAAA,CAAO,IAAA,CAAK,SAAS,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,uCAAA,EAA0C,UAAA,CAAW,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC7G;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AACnE,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,QAAA,CAAS,EAAE,CAAA;AAC9E,IAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,IAAA,CAAK,CAAC,IAAA,KAAS;AAClD,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,MAAA,OAAO,YAAY,IAAA,KAAS,OAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,CAAC,cAAA,EAAgB;AACjD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,gDAAA,CAAkD,CAAA;AAAA,IAC5F;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,UAAA,EAAY,KAAA,CAAM,OAAO,OAAO,CAAA;AAC/D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACrE,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EAC9C;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,KAAK,CAAA;AACjE,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,MAAA,CAAO,KAAK,8BAA8B,CAAA;AAAA,EAC5C;AAGA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,SAAA,CAAU,EAAE,CAAA;AAC/E,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,KAAK,6CAA6C,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,OAAA,CAAQ,EAAE,CAAA;AAC7E,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,KAAK,2CAA2C,CAAA;AAAA,IACzD;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,SAAS,CAAA;AACxE,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,MAAA,GAAS,WAAW,IAAA,CAAK,MAAA;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,EAAG;AAC7C,MAAA,MAAA,CAAO,KAAK,+CAA+C,CAAA;AAAA,IAC7D;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AACnE,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,IAAA,CAAK,MAAK,EAAG;AAClC,MAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAAA,IAChD;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,cAAc,CAAA;AAC3E,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,GAAA,CAAI,MAAK,EAAG;AACjC,MAAA,MAAA,CAAO,KAAK,mCAAmC,CAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,oBAAoB,CAAA;AACrF,EAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,IAAA,MAAM,MAAA,GAAS,aAAa,IAAA,CAAK,MAAA;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,CAAS,MAAK,EAAG;AACtC,MAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,IACxD;AAAA,EACF;AAGA,EAAA,MAAM,kBAAA,GAAqB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,gBAAgB,CAAA;AACtF,EAAA,KAAA,MAAW,qBAAqB,kBAAA,EAAoB;AAClD,IAAA,MAAM,MAAA,GAAS,kBAAkB,IAAA,CAAK,MAAA;AACtC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,CAAS,MAAK,EAAG;AACtC,MAAA,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAAA,IACjE;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,WAAW,CAAA;AAC7E,EAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc,EAAE,CAAA;AACnF,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,KAAK,2DAA2D,CAAA;AAAA,IACzE;AAAA,EACF;AAOA,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,QAAQ,CAAA;AACvE,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,MAAA,GAAS,WAAW,IAAA,CAAK,MAAA;AAC/B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,cAAA,CAAe,MAAK,EAAG;AAC5C,MAAA,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAAA,IACjE;AAAA,EACF;AAGA,EAAA,MAAM,uBAAA,GAA0B,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,qBAAqB,CAAA;AAChG,EAAA,KAAA,MAAW,0BAA0B,uBAAA,EAAyB;AAC5D,IAAA,MAAM,MAAA,GAAS,uBAAuB,IAAA,CAAK,MAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3C,MAAA,MAAA,CAAO,KAAK,0DAA0D,CAAA;AAAA,IACxE,CAAA,MAAO;AACL,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,aAAa,CAAC,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AACpF,MAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,KAAK,0DAA0D,CAAA;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,uBAAA,GAA0B,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,qBAAqB,CAAA;AAChG,EAAA,KAAA,MAAW,0BAA0B,uBAAA,EAAyB;AAC5D,IAAA,MAAM,MAAA,GAAS,uBAAuB,IAAA,CAAK,MAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,EAAG;AAC7C,MAAA,MAAA,CAAO,KAAK,yDAAyD,CAAA;AAAA,IACvE,CAAA,MAAO;AACL,MAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,cAAc,CAAC,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,CAAA;AACtF,MAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,KAAK,0DAA0D,CAAA;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,qBAAA,GAAwB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,mBAAmB,CAAA;AAC5F,EAAA,KAAA,MAAW,wBAAwB,qBAAA,EAAuB;AACxD,IAAA,MAAM,MAAA,GAAS,qBAAqB,IAAA,CAAK,MAAA;AACzC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,WAAA,CAAY,WAAW,CAAA,EAAG;AAC9C,MAAA,MAAA,CAAO,KAAK,wDAAwD,CAAA;AAAA,IACtE;AAAA,EACF;AAGA,EAAA,MAAM,uBAAA,GAA0B,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,qBAAqB,CAAA;AAChG,EAAA,KAAA,MAAW,0BAA0B,uBAAA,EAAyB;AAC5D,IAAA,MAAM,MAAA,GAAS,uBAAuB,IAAA,CAAK,MAAA;AAC3C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,cAAA,CAAe,WAAW,CAAA,EAAG;AACjD,MAAA,MAAA,CAAO,KAAK,8DAA8D,CAAA;AAAA,IAC5E;AACA,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,cAAA,CAAe,MAAK,EAAG;AAC5C,MAAA,MAAA,CAAO,KAAK,gEAAgE,CAAA;AAAA,IAC9E;AAAA,EACF;AAGA,EAAA,MAAM,sBAAA,GAAyB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,oBAAoB,CAAA;AAC9F,EAAA,KAAA,MAAW,yBAAyB,sBAAA,EAAwB;AAC1D,IAAA,MAAM,MAAA,GAAS,sBAAsB,IAAA,CAAK,MAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,cAAA,CAAe,MAAK,EAAG;AAC5C,MAAA,MAAA,CAAO,KAAK,+DAA+D,CAAA;AAAA,IAC7E;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,GAAoB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,eAAe,CAAA;AACpF,EAAA,KAAA,MAAW,oBAAoB,iBAAA,EAAmB;AAChD,IAAA,MAAM,MAAA,GAAS,iBAAiB,IAAA,CAAK,MAAA;AACrC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,aAAA,CAAc,MAAK,EAAG;AAC3C,MAAA,MAAA,CAAO,KAAK,yDAAyD,CAAA;AAAA,IACvE;AACA,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,cAAA,CAAe,MAAK,EAAG;AAC5C,MAAA,MAAA,CAAO,KAAK,0DAA0D,CAAA;AAAA,IACxE;AAAA,EACF;AAGA,EAAA,MAAM,mBAAA,GAAsB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,iBAAiB,CAAA;AACxF,EAAA,KAAA,MAAW,sBAAsB,mBAAA,EAAqB;AACpD,IAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,kBAAA,CAAmB,EAAE,CAAA;AACxF,IAAA,MAAM,kBAAA,GAAqB,aAAA,CAAc,IAAA,CAAK,CAAC,IAAA,KAAS;AACtD,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,MAAA,OAAO,YAAY,IAAA,KAAS,WAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,CAAC,kBAAA,EAAoB;AACrD,MAAA,MAAA,CAAO,KAAK,8EAA8E,CAAA;AAAA,IAC5F;AAAA,EACF;AAIA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAKA,SAAS,WAAA,CACP,UAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAC1D,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAEhD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA;AAAA,EAC/B;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,IACE,UAAA,EAAY,IAAA,KAAS,OAAA,IACrB,UAAA,EAAY,SAAS,OAAA,IACrB,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IACxB,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EACxB;AACA,MAAA,aAAA,CAAc,IAAI,IAAA,CAAK,MAAM,CAAA,CAAG,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,SAAS,YAAY,MAAA,EAAyB;AAC5C,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAElB,IAAA,MAAM,SAAA,GAAY,aAAA,CAAc,GAAA,CAAI,MAAM,KAAK,EAAC;AAChD,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1B,QAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,EAAG,OAAO,IAAA;AAAA,MACpC,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAChC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACzB,MAAA,IAAI,WAAA,CAAY,OAAO,CAAA,EAAG;AACxB,QAAA,OAAO,yFAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,sBAAsB,KAAA,EAAgC;AACpE,EAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AACrE,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAG5D,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAEhD,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA;AACvB,IAAA,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AAAA,EAC/B;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,UAAA,CAAW,IAAI,IAAA,CAAK,MAAM,KAAK,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9D,MAAA,aAAA,CAAc,IAAI,IAAA,CAAK,MAAM,CAAA,CAAG,IAAA,CAAK,KAAK,MAAM,CAAA;AAChD,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,MAAA,EAAA,CAAS,QAAA,CAAS,IAAI,IAAA,CAAK,MAAM,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,IAChE;AAAA,EACF;AAGA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,QAAA,EAAU;AACvC,IAAA,IAAI,MAAA,KAAW,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAEnB,IAAA,KAAA,MAAW,YAAY,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,IAAK,EAAC,EAAG;AACvD,MAAA,MAAM,SAAA,GAAA,CAAa,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,CAAA,IAAK,CAAA;AAClD,MAAA,QAAA,CAAS,GAAA,CAAI,UAAU,SAAS,CAAA;AAChC,MAAA,IAAI,SAAA,KAAc,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,MAAA,CAAO,IAAI,CAAC,MAAA,KAAW,iBAAiB,GAAA,CAAI,MAAM,KAAK,MAAM,CAAA;AACtE;ACpYA,IAAM,cAAA,GAAyC;AAAA,EAC7C,MAAA,EAAQ,0BAAA;AAAA,EACR,IAAA,EAAM,0BAAA;AAAA,EACN,IAAA,EAAM,+BAAA;AAAA,EACN,GAAA,EAAK,8BAAA;AAAA,EACL,IAAA,EAAM,+BAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,aAAA,GAAwC;AAAA,EAC5C,MAAA,EAAQ,8DAAA;AAAA,EACR,IAAA,EAAM,kEAAA;AAAA,EACN,IAAA,EAAM,0EAAA;AAAA,EACN,GAAA,EAAK,0EAAA;AAAA,EACL,IAAA,EAAM,8EAAA;AAAA,EACN,MAAA,EAAQ;AACV,CAAA;AAEO,IAAM,iBAAA,GAAoBJ,KAAK,SAAS2I,kBAAAA,CAAkB,EAAE,EAAA,EAAI,IAAA,EAAM,UAAS,EAAgE;AACpJ,EAAA,MAAM,CAAA,GAAIjI,gBAAgB,iBAAiB,CAAA;AAC3C,EAAA,MAAM,EAAE,SAAA,EAAW,kBAAA,EAAmB,GAAI,IAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,KAAgB,SAAA;AAEvC,EAAA,IAAI,CAAC,WAAW,IAAA,EAAM;AACpB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,uBACEb,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,sBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,eAAA,EAAgB,CAAA;AAAA,sBAC/Fb,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAQ,OAAA,EAAQ,QAAA,EAAS,cACjC,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,sBAAMA,GAAAA,CAACgB,uBAAAA,EAAA,EAAwB,WAAU,oBAAA,EAAqB,CAAA;AAAA,UAC9D,OAAO,KAAA,IAAS,YAAA;AAAA,UAChB,WAAA,EAAa,EAAE,mBAAmB,CAAA;AAAA,UAClC,aAAA,EAAc;AAAA;AAAA,OAChB,EACF,CAAA;AAAA,sBACAhB,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,eAAA,EAAgB;AAAA,KAAA,EACpG,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAA,GAAW,UAAU,QAAA,IAAY,QAAA;AACvC,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,QAAQ,CAAA,IAAK,cAAA,CAAe,MAAA;AAC5D,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,QAAQ,CAAA,IAAK,aAAA,CAAc,MAAA;AAEtD,EAAA,uBACEd,IAAAA,CAAAU,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAT,GAAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,EAAA,EAAI,CAAA;AAAA,oBAClCA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,IAAA,EAAM,EAAA,EAAG,SAAA,EAAU,UAAA,EAAW,eAAA,EAAgB,CAAA;AAAA,oBAE/Fd,KAAC,QAAA,EAAA,EAAS,OAAA,EAAS,WAAW,QAAA,EAAoB,QAAA,EAAS,YAAA,EAAa,KAAA,EAAM,WAAA,EAC5E,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wEAAA,EAA2E,QAAQ,CAAA,UAAA,CAAA,EACjG,QAAA,kBAAAA,GAAAA,CAACiI,eAAAA,EAAA,EAAgB,SAAA,EAAU,oBAAA,EAAqB,CAAA,EAClD,CAAA;AAAA,0BACAlI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qDAAA,EAAuD,oBAAU,IAAA,EAAK,CAAA;AAAA,YACnF,CAAC,SAAA,IAAa,SAAA,CAAU,WAAA,oBACvBA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0DAAA,EAA4D,QAAA,EAAA,SAAA,CAAU,WAAA,EAAY;AAAA,WAAA,EAEnG;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,IAAA,CAAK,4BACJA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,gBAAc,SAAA,CAAU,OAAA;AAAA,YACxB,SAAA,EAAW,CAAA,yNAAA,EACT,SAAA,CAAU,OAAA,GAAU,oBAAoB,sCAC1C,CAAA,CAAA;AAAA,YACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,cAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,cAAA,IAAA,CAAK,SAAU,SAAS,CAAA;AAAA,YAC1B,CAAA;AAAA,YAEA,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,2GACf,SAAA,CAAU,OAAA,GAAU,eAAA,GAAkB,eACxC,CAAA,CAAA,EAAI;AAAA;AAAA;AACN,OAAA,EAEJ,CAAA;AAAA,sBAEAA,IAAC,YAAA,EAAA,EAAa,OAAA,EAAS,WACrB,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,IAAC,aAAA,EAAA,EAAc,SAAA,EAAU,yHAAA,EACtB,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EACpB,CAAA;AAAA,wBACAA,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAW,CAAA,iDAAA,EAAoD,IAAI,IAC/E,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,QACC,SAAA,CAAU,UAAA,IAAc,SAAA,CAAU,UAAA,CAAW,MAAA,GAAS,qBACrDD,IAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,gHAAA,EACtB,QAAA,EAAA;AAAA,UAAA,SAAA,CAAU,UAAA,CAAW,MAAA;AAAA,UAAO;AAAA,SAAA,EAC/B,CAAA;AAAA,QAGD,sCACCC,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAA;AAAA,YACV,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,cAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,cAAA,KAAA,CAAM,cAAA,EAAe;AACrB,cAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,YACvB,CAAA;AAAA,YACA,SAAA,EAAU,0IAAA;AAAA,YACV,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,YAEhC,QAAA,kBAAAA,GAAAA,CAACc,SAAAA,EAAA,EAAU,WAAU,4CAAA,EAA6C;AAAA;AAAA;AACpE,OAAA,EAEJ,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAd,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAK,QAAA,EAAS,QAAA,EAAUa,QAAAA,CAAS,KAAA,EAAO,EAAA,EAAG,WAAA,EAAY,UAAA,EAAW,eAAA,EAAgB;AAAA,GAAA,EACpG,CAAA;AAEJ,CAAC","file":"index.mjs","sourcesContent":["/**\n * iOS-style haptic feedback hook\n * Provides tactile feedback for touch interactions\n */\n\ntype HapticPattern = 'light' | 'medium' | 'heavy' | 'success' | 'warning' | 'error' | 'selection'\n\n// Vibration patterns in milliseconds\nconst patterns: Record<HapticPattern, number | number[]> = {\n light: 10,\n medium: 25,\n heavy: 50,\n success: [10, 50, 10],\n warning: [25, 50, 25],\n error: [50, 100, 50],\n selection: 5,\n}\n\nexport function useHaptic() {\n const isSupported = typeof navigator !== 'undefined' && 'vibrate' in navigator\n\n const trigger = (pattern: HapticPattern = 'light') => {\n if (!isSupported) return false\n\n try {\n const vibrationPattern = patterns[pattern]\n navigator.vibrate(vibrationPattern)\n return true\n } catch {\n return false\n }\n }\n\n const cancel = () => {\n if (!isSupported) return\n navigator.vibrate(0)\n }\n\n return {\n trigger,\n cancel,\n isSupported,\n }\n}\n\n/**\n * Standalone haptic trigger for use outside React components\n */\nexport function triggerHaptic(pattern: HapticPattern = 'light') {\n if (typeof navigator === 'undefined' || !('vibrate' in navigator)) return false\n\n try {\n navigator.vibrate(patterns[pattern])\n return true\n } catch {\n return false\n }\n}\n","/**\n * Workflow Builder Store (Zustand)\n * ================================\n * Central state management for the workflow canvas.\n * Handles nodes, edges, undo/redo history, clipboard,\n * editing state, context menus, and run results.\n */\n\nimport { create } from 'zustand'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype GraphSnapshot = { nodes: Node[]; edges: Edge[] }\n\nexport type CanvasControlMode = 'pointer' | 'hand'\n\ntype ContextMenuState = {\n type: 'node' | 'edge' | 'panel'\n position: { x: number; y: number }\n targetId?: string\n} | null\n\nexport type NodeRunResult = {\n status: 'pending' | 'running' | 'success' | 'error'\n data?: unknown\n error?: string\n durationMs?: number\n}\n\nimport type { LayoutDirection } from '../utils/layout-engine'\n\ntype WorkflowStoreState = {\n nodes: Node[]\n edges: Edge[]\n past: GraphSnapshot[]\n future: GraphSnapshot[]\n clipboard: GraphSnapshot | null\n editingNodeId: string | null\n contextMenu: ContextMenuState\n controlMode: CanvasControlMode\n layoutDirection: LayoutDirection\n showVariableInspector: boolean\n showVersionHistory: boolean\n showRunPanel: boolean\n isRunning: boolean\n nodeResults: Record<string, NodeRunResult>\n selectedRunId: string | null\n previewPanelOpen: boolean\n}\n\ntype WorkflowStoreActions = {\n setNodes: (updater: Node[] | ((nodes: Node[]) => Node[])) => void\n setEdges: (updater: Edge[] | ((edges: Edge[]) => Edge[])) => void\n takeSnapshot: () => void\n undo: () => void\n redo: () => void\n copy: () => void\n paste: (offset?: number) => void\n selectAll: () => void\n deselectAll: () => void\n setEditingNodeId: (nodeId: string | null) => void\n setContextMenu: (menu: ContextMenuState) => void\n setControlMode: (mode: CanvasControlMode) => void\n setLayoutDirection: (direction: LayoutDirection) => void\n toggleVariableInspector: () => void\n toggleVersionHistory: () => void\n toggleRunPanel: () => void\n setIsRunning: (running: boolean) => void\n setNodeResult: (nodeId: string, result: NodeRunResult) => void\n clearNodeResults: () => void\n setSelectedRunId: (runId: string | null) => void\n togglePreviewPanel: () => void\n reset: () => void\n}\n\nexport type WorkflowStore = WorkflowStoreState & WorkflowStoreActions\n\nconst MAX_HISTORY_SIZE = 50\nconst DEFAULT_PASTE_OFFSET = 40\n\nexport const useWorkflowStore = create<WorkflowStore>((set, get) => ({\n // ──────────────────────────────────────────────────────────────────────────\n // State\n // ──────────────────────────────────────────────────────────────────────────\n\n nodes: [],\n edges: [],\n past: [],\n future: [],\n clipboard: null,\n editingNodeId: null,\n contextMenu: null,\n controlMode: 'pointer' as CanvasControlMode,\n layoutDirection: 'free' as LayoutDirection,\n showVariableInspector: false,\n showVersionHistory: false,\n showRunPanel: false,\n isRunning: false,\n nodeResults: {},\n selectedRunId: null,\n previewPanelOpen: false,\n\n // ──────────────────────────────────────────────────────────────────────────\n // Actions\n // ──────────────────────────────────────────────────────────────────────────\n\n setNodes: (updater) => {\n set((state) => ({\n nodes: typeof updater === 'function' ? updater(state.nodes) : updater,\n }))\n },\n\n setEdges: (updater) => {\n set((state) => ({\n edges: typeof updater === 'function' ? updater(state.edges) : updater,\n }))\n },\n\n takeSnapshot: () => {\n const { nodes, edges, past } = get()\n const snapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n const trimmedPast = past.slice(-(MAX_HISTORY_SIZE - 1))\n set({\n past: [...trimmedPast, snapshot],\n future: [],\n })\n },\n\n undo: () => {\n const { past, nodes, edges } = get()\n if (past.length === 0) return\n\n const previous = past[past.length - 1]\n const remainingPast = past.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n set((state) => ({\n nodes: previous.nodes,\n edges: previous.edges,\n past: remainingPast,\n future: [...state.future, currentSnapshot],\n }))\n },\n\n redo: () => {\n const { future, nodes, edges } = get()\n if (future.length === 0) return\n\n const next = future[future.length - 1]\n const remainingFuture = future.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n set((state) => ({\n nodes: next.nodes,\n edges: next.edges,\n future: remainingFuture,\n past: [...state.past, currentSnapshot],\n }))\n },\n\n copy: () => {\n const { nodes, edges } = get()\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length === 0) return\n\n const selectedNodeIds = new Set(selectedNodes.map((node) => node.id))\n const internalEdges = edges.filter(\n (edge) => selectedNodeIds.has(edge.source) && selectedNodeIds.has(edge.target),\n )\n\n set({\n clipboard: {\n nodes: selectedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: internalEdges.map((edge) => ({ ...edge })),\n },\n })\n },\n\n paste: (offset = DEFAULT_PASTE_OFFSET) => {\n const { clipboard } = get()\n if (!clipboard || clipboard.nodes.length === 0) return\n\n get().takeSnapshot()\n\n const idMapping = new Map<string, string>()\n for (const node of clipboard.nodes) {\n idMapping.set(node.id, crypto.randomUUID())\n }\n\n const pastedNodes: Node[] = clipboard.nodes.map((node) => ({\n ...node,\n id: idMapping.get(node.id) ?? crypto.randomUUID(),\n position: {\n x: node.position.x + offset,\n y: node.position.y + offset,\n },\n selected: true,\n data: { ...node.data },\n }))\n\n const pastedEdges: Edge[] = clipboard.edges.map((edge) => ({\n ...edge,\n id: crypto.randomUUID(),\n source: idMapping.get(edge.source) ?? edge.source,\n target: idMapping.get(edge.target) ?? edge.target,\n }))\n\n set((state) => ({\n nodes: [\n ...state.nodes.map((node) => ({ ...node, selected: false })),\n ...pastedNodes,\n ],\n edges: [...state.edges, ...pastedEdges],\n clipboard: {\n nodes: pastedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: pastedEdges.map((edge) => ({ ...edge })),\n },\n }))\n },\n\n selectAll: () => {\n set((state) => ({\n nodes: state.nodes.map((node) => ({ ...node, selected: true })),\n }))\n },\n\n deselectAll: () => {\n set((state) => ({\n nodes: state.nodes.map((node) => ({ ...node, selected: false })),\n }))\n },\n\n setEditingNodeId: (nodeId) => {\n set({ editingNodeId: nodeId })\n },\n\n setContextMenu: (menu) => {\n set({ contextMenu: menu })\n },\n\n setControlMode: (mode) => {\n set({ controlMode: mode })\n },\n\n setLayoutDirection: (direction) => {\n set({ layoutDirection: direction })\n },\n\n toggleVariableInspector: () => {\n set((state) => ({ showVariableInspector: !state.showVariableInspector }))\n },\n\n toggleVersionHistory: () => {\n set((state) => ({ showVersionHistory: !state.showVersionHistory }))\n },\n\n toggleRunPanel: () => {\n set((state) => ({ showRunPanel: !state.showRunPanel }))\n },\n\n setIsRunning: (running) => {\n set({ isRunning: running })\n },\n\n setNodeResult: (nodeId, result) => {\n set((state) => ({\n nodeResults: { ...state.nodeResults, [nodeId]: result },\n }))\n },\n\n clearNodeResults: () => {\n set({ nodeResults: {}, isRunning: false })\n },\n\n setSelectedRunId: (runId) => {\n set({ selectedRunId: runId })\n },\n\n togglePreviewPanel: () => {\n set((state) => ({ previewPanelOpen: !state.previewPanelOpen }))\n },\n\n reset: () => {\n set({\n nodes: [],\n edges: [],\n past: [],\n future: [],\n clipboard: null,\n editingNodeId: null,\n contextMenu: null,\n controlMode: 'pointer' as CanvasControlMode,\n showVariableInspector: false,\n showVersionHistory: false,\n showRunPanel: false,\n isRunning: false,\n nodeResults: {},\n selectedRunId: null,\n previewPanelOpen: false,\n })\n },\n}))\n","/**\n * Drawer Store (Zustand)\n * ======================\n * Single store that tracks which drawer is open and its initial data.\n * Editable form state stays local in each drawer component.\n */\n\nimport { create } from 'zustand'\nimport type { AgentWithPrompts } from '../types'\nimport type { AgentModel, AgentRule, LogicNodeConfig, Subworkflow } from '../contracts'\nimport type { WorkflowEntityDefinition } from '../types'\n\ntype DrawerType = 'agent' | 'subworkflow' | 'logic-node' | 'pipeline-settings' | null\n\ntype AgentDrawerData = {\n agent: AgentWithPrompts\n models: AgentModel[]\n isCreateMode: boolean\n}\n\ntype SubworkflowDrawerData = {\n tool: Subworkflow\n}\n\ntype LogicNodeDrawerData = {\n nodeId: string\n nodeLabel: string\n config: LogicNodeConfig\n}\n\ntype PipelineSettingsDrawerData = {\n name: string\n description: string\n}\n\ntype DrawerStoreState = {\n activeDrawer: DrawerType\n agentData: AgentDrawerData | null\n subworkflowData: SubworkflowDrawerData | null\n logicNodeData: LogicNodeDrawerData | null\n pipelineSettingsData: PipelineSettingsDrawerData | null\n}\n\ntype DrawerStoreActions = {\n openAgentDrawer: (agent: AgentWithPrompts, models: AgentModel[], isCreateMode?: boolean) => void\n openSubworkflowDrawer: (tool: Subworkflow) => void\n openLogicNodeDrawer: (nodeId: string, nodeLabel: string, config: LogicNodeConfig) => void\n openPipelineSettingsDrawer: (name: string, description: string) => void\n closeDrawer: () => void\n}\n\nexport type DrawerStore = DrawerStoreState & DrawerStoreActions\n\nexport const useDrawerStore = create<DrawerStore>((set) => ({\n activeDrawer: null,\n agentData: null,\n subworkflowData: null,\n logicNodeData: null,\n pipelineSettingsData: null,\n\n openAgentDrawer: (agent, models, isCreateMode = false) => set({\n activeDrawer: 'agent',\n agentData: { agent, models, isCreateMode },\n subworkflowData: null,\n logicNodeData: null,\n pipelineSettingsData: null,\n }),\n\n openSubworkflowDrawer: (tool) => set({\n activeDrawer: 'subworkflow',\n subworkflowData: { tool },\n agentData: null,\n logicNodeData: null,\n pipelineSettingsData: null,\n }),\n\n openLogicNodeDrawer: (nodeId, nodeLabel, config) => set({\n activeDrawer: 'logic-node',\n logicNodeData: { nodeId, nodeLabel, config },\n agentData: null,\n subworkflowData: null,\n pipelineSettingsData: null,\n }),\n\n openPipelineSettingsDrawer: (name, description) => set({\n activeDrawer: 'pipeline-settings',\n pipelineSettingsData: { name, description },\n agentData: null,\n subworkflowData: null,\n logicNodeData: null,\n }),\n\n closeDrawer: () => set({\n activeDrawer: null,\n agentData: null,\n subworkflowData: null,\n logicNodeData: null,\n pipelineSettingsData: null,\n }),\n}))\n","import {\n CloudIcon,\n ChartBarIcon,\n NewspaperIcon,\n WrenchScrewdriverIcon,\n PlayIcon,\n StopIcon,\n ArrowsPointingOutIcon,\n CodeBracketIcon,\n GlobeAltIcon,\n DocumentTextIcon,\n ArrowPathIcon,\n BookOpenIcon,\n ChatBubbleLeftRightIcon,\n QuestionMarkCircleIcon,\n AdjustmentsVerticalIcon,\n ArrowsRightLeftIcon,\n Square3Stack3DIcon,\n DocumentMagnifyingGlassIcon,\n ListBulletIcon,\n PlayCircleIcon,\n PencilSquareIcon,\n CircleStackIcon,\n RectangleGroupIcon,\n} from '@heroicons/react/24/outline'\n\nexport const GRAPH_ACTIVE_EDGE_COLOR = '#14b8a6'\nexport const GRAPH_TRUE_EDGE_COLOR = '#22c55e'\nexport const GRAPH_FALSE_EDGE_COLOR = '#ef4444'\nexport const GRAPH_RULE_EDGE_COLOR = '#8b5cf6'\n\nexport const ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n CloudIcon,\n ChartBarIcon,\n NewspaperIcon,\n WrenchScrewdriverIcon,\n}\n\nexport const CATEGORY_COLORS: Record<string, string> = {\n market: 'from-emerald-400 to-green-500',\n data: 'from-blue-400 to-cyan-500',\n compliance: 'from-purple-400 to-violet-500',\n external: 'from-gray-400 to-gray-500',\n}\n\nexport const CATEGORY_PILL_COLORS: Record<string, string> = {\n market: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300',\n data: 'bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300',\n compliance: 'bg-purple-100 text-purple-700 dark:bg-purple-500/20 dark:text-purple-300',\n external: 'bg-gray-100 text-gray-700 dark:bg-white/10 dark:text-gray-300',\n}\n\nexport const ADJUSTMENT_GRADIENT: Record<string, string> = {\n percentage: 'from-purple-400 to-violet-500',\n fixed: 'from-blue-400 to-cyan-500',\n formula: 'from-amber-400 to-orange-500',\n}\n\nexport const ADJUSTMENT_PILL: Record<string, string> = {\n percentage: 'bg-purple-100 text-purple-700 dark:bg-purple-500/20 dark:text-purple-300',\n fixed: 'bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300',\n formula: 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300',\n}\n\n// ============================================================================\n// Logic Node Constants (Dify-inspired pipeline control nodes)\n// ============================================================================\n\nexport const LOGIC_NODE_GRADIENTS: Record<string, string> = {\n start: 'from-green-400 to-emerald-500',\n end: 'from-red-400 to-rose-500',\n if_else: 'from-amber-400 to-orange-500',\n code: 'from-cyan-400 to-sky-500',\n http_request: 'from-orange-400 to-amber-500',\n template_transform: 'from-pink-400 to-rose-500',\n iteration: 'from-indigo-400 to-violet-500',\n knowledge_base: 'from-emerald-400 to-teal-500',\n answer: 'from-blue-400 to-indigo-500',\n question_classifier: 'from-purple-400 to-fuchsia-500',\n parameter_extractor: 'from-emerald-400 to-green-500',\n variable_assigner: 'from-sky-400 to-blue-500',\n variable_aggregator: 'from-violet-400 to-purple-500',\n document_extractor: 'from-rose-400 to-pink-500',\n list_operator: 'from-lime-400 to-green-500',\n iteration_start: 'from-indigo-400 to-blue-500',\n note: 'from-yellow-400 to-amber-500',\n entity: 'from-blue-400 to-cyan-500',\n group: 'from-slate-400 to-gray-500',\n}\n\nexport const LOGIC_NODE_BADGE_COLORS: Record<string, string> = {\n start: 'bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300',\n end: 'bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300',\n if_else: 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300',\n code: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300',\n http_request: 'bg-orange-100 text-orange-700 dark:bg-orange-500/20 dark:text-orange-300',\n template_transform: 'bg-pink-100 text-pink-700 dark:bg-pink-500/20 dark:text-pink-300',\n iteration: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300',\n knowledge_base: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300',\n answer: 'bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300',\n question_classifier: 'bg-purple-100 text-purple-700 dark:bg-purple-500/20 dark:text-purple-300',\n parameter_extractor: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300',\n variable_assigner: 'bg-sky-100 text-sky-700 dark:bg-sky-500/20 dark:text-sky-300',\n variable_aggregator: 'bg-violet-100 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300',\n document_extractor: 'bg-rose-100 text-rose-700 dark:bg-rose-500/20 dark:text-rose-300',\n list_operator: 'bg-lime-100 text-lime-700 dark:bg-lime-500/20 dark:text-lime-300',\n iteration_start: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300',\n note: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300',\n entity: 'bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300',\n group: 'bg-slate-100 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300',\n}\n\nexport const LOGIC_NODE_BADGE_SOFT_COLORS: Record<string, string> = {\n start: 'bg-green-50 text-green-600 dark:bg-green-500/20 dark:text-green-400',\n end: 'bg-red-50 text-red-600 dark:bg-red-500/20 dark:text-red-400',\n if_else: 'bg-amber-50 text-amber-600 dark:bg-amber-500/20 dark:text-amber-400',\n code: 'bg-cyan-50 text-cyan-600 dark:bg-cyan-500/20 dark:text-cyan-400',\n http_request: 'bg-orange-50 text-orange-600 dark:bg-orange-500/20 dark:text-orange-400',\n template_transform: 'bg-pink-50 text-pink-600 dark:bg-pink-500/20 dark:text-pink-400',\n iteration: 'bg-indigo-50 text-indigo-600 dark:bg-indigo-500/20 dark:text-indigo-400',\n knowledge_base: 'bg-emerald-50 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400',\n answer: 'bg-blue-50 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400',\n question_classifier: 'bg-purple-50 text-purple-600 dark:bg-purple-500/20 dark:text-purple-400',\n parameter_extractor: 'bg-emerald-50 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400',\n variable_assigner: 'bg-sky-50 text-sky-600 dark:bg-sky-500/20 dark:text-sky-400',\n variable_aggregator: 'bg-violet-50 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400',\n document_extractor: 'bg-rose-50 text-rose-600 dark:bg-rose-500/20 dark:text-rose-400',\n list_operator: 'bg-lime-50 text-lime-600 dark:bg-lime-500/20 dark:text-lime-400',\n iteration_start: 'bg-indigo-50 text-indigo-600 dark:bg-indigo-500/20 dark:text-indigo-400',\n note: 'bg-yellow-50 text-yellow-600 dark:bg-yellow-500/20 dark:text-yellow-400',\n entity: 'bg-blue-50 text-blue-600 dark:bg-blue-500/20 dark:text-blue-400',\n group: 'bg-slate-50 text-slate-600 dark:bg-slate-500/20 dark:text-slate-400',\n}\n\nexport const LOGIC_ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n start: PlayIcon,\n end: StopIcon,\n if_else: ArrowsPointingOutIcon,\n code: CodeBracketIcon,\n http_request: GlobeAltIcon,\n template_transform: DocumentTextIcon,\n iteration: ArrowPathIcon,\n knowledge_base: BookOpenIcon,\n answer: ChatBubbleLeftRightIcon,\n question_classifier: QuestionMarkCircleIcon,\n parameter_extractor: AdjustmentsVerticalIcon,\n variable_assigner: ArrowsRightLeftIcon,\n variable_aggregator: Square3Stack3DIcon,\n document_extractor: DocumentMagnifyingGlassIcon,\n list_operator: ListBulletIcon,\n iteration_start: PlayCircleIcon,\n note: PencilSquareIcon,\n entity: CircleStackIcon,\n group: RectangleGroupIcon,\n}\n\n// ============================================================================\n// Node Selection / Hover State Classes\n// ============================================================================\n\n/** Classes applied when a node is selected (click or programmatic selection).\n * Uses a CSS class (.node-card-selected) to override liquid-surface borders. */\nexport const NODE_SELECTED_CLASS = 'node-card-selected'\n\n/** Classes applied on hover when a node is NOT selected.\n * Uses a CSS class (.node-card-hover) to override liquid-surface borders. */\nexport const NODE_HOVER_CLASS = 'node-card-hover'\n\n/** Static border color per node type (light + dark, non-selected, non-hovered) */\nexport const NODE_BORDER_COLORS: Record<string, string> = {\n agent: 'border-gray-300/50 dark:border-gray-600/50',\n tool: 'border-gray-300/50 dark:border-gray-600/50',\n agent_tool: 'border-amber-300/50 dark:border-amber-600/50',\n entity: 'border-gray-300/50 dark:border-gray-600/50',\n rule: 'border-gray-300/50 dark:border-gray-600/50',\n start: 'border-green-300/50 dark:border-green-600/50',\n end: 'border-red-300/50 dark:border-red-600/50',\n if_else: 'border-amber-300/50 dark:border-amber-600/50',\n code: 'border-cyan-300/50 dark:border-cyan-600/50',\n http_request: 'border-orange-300/50 dark:border-orange-600/50',\n template_transform: 'border-pink-300/50 dark:border-pink-600/50',\n iteration: 'border-indigo-300/50 dark:border-indigo-600/50',\n iteration_start: 'border-indigo-300/50 dark:border-indigo-600/50',\n knowledge_base: 'border-emerald-300/50 dark:border-emerald-600/50',\n answer: 'border-blue-300/50 dark:border-blue-600/50',\n question_classifier: 'border-purple-300/50 dark:border-purple-600/50',\n parameter_extractor: 'border-emerald-300/50 dark:border-emerald-600/50',\n variable_assigner: 'border-sky-300/50 dark:border-sky-600/50',\n variable_aggregator: 'border-violet-300/50 dark:border-violet-600/50',\n document_extractor: 'border-rose-300/50 dark:border-rose-600/50',\n list_operator: 'border-lime-300/50 dark:border-lime-600/50',\n note: 'border-gray-200/50 dark:border-gray-700/50',\n}\n\n/**\n * Returns the border + ring classes for a node based on its selected state.\n * Usage: `getNodeStateClass(selected, 'agent')`\n * Or with a custom border: `getNodeStateClass(selected, undefined, 'border-slate-300/50 dark:border-slate-600/50')`\n */\nexport function getNodeStateClass(\n selected: boolean | undefined,\n nodeType?: string,\n customBorder?: string,\n): string {\n if (selected) return NODE_SELECTED_CLASS\n const border = customBorder ?? (nodeType ? NODE_BORDER_COLORS[nodeType] : undefined) ?? NODE_BORDER_COLORS.agent\n return `${border} ${NODE_HOVER_CLASS}`\n}\n\n// ============================================================================\n// MiniMap Node Colors (used by MiniMap component on the canvas)\n// ============================================================================\n\nexport const MINIMAP_NODE_COLORS: Record<string, string> = {\n agent: '#6366f1',\n tool: '#14b8a6',\n agent_tool: '#f59e0b',\n rule: '#8b5cf6',\n start: '#22c55e',\n end: '#ef4444',\n if_else: '#f59e0b',\n code: '#06b6d4',\n http_request: '#f97316',\n template_transform: '#ec4899',\n iteration: '#818cf8',\n knowledge_base: '#10b981',\n answer: '#3b82f6',\n question_classifier: '#a855f7',\n parameter_extractor: '#10b981',\n variable_assigner: '#0ea5e9',\n variable_aggregator: '#8b5cf6',\n document_extractor: '#f43f5e',\n list_operator: '#84cc16',\n iteration_start: '#6366f1',\n note: '#eab308',\n entity: '#3b82f6',\n group: '#64748b',\n}\n\nexport const LOGIC_NODE_HANDLE_COLORS: Record<string, string> = {\n start: '!bg-green-500',\n end: '!bg-red-500',\n if_else: '!bg-amber-500',\n code: '!bg-cyan-500',\n http_request: '!bg-orange-500',\n template_transform: '!bg-pink-500',\n iteration: '!bg-indigo-500',\n knowledge_base: '!bg-emerald-500',\n answer: '!bg-blue-500',\n question_classifier: '!bg-purple-500',\n parameter_extractor: '!bg-emerald-500',\n variable_assigner: '!bg-sky-500',\n variable_aggregator: '!bg-violet-500',\n document_extractor: '!bg-rose-500',\n list_operator: '!bg-lime-500',\n iteration_start: '!bg-indigo-500',\n note: '!bg-yellow-500',\n entity: '!bg-blue-500',\n group: '!bg-slate-500',\n}\n","/**\n * Edge Insert Popup\n * =================\n * Dify-style inline node type selector that appears when\n * clicking the + button on an edge midpoint. Allows quick\n * insertion of a node between two connected nodes.\n */\n\nimport { memo, useState, useRef, useEffect, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport type { WorkflowNodeType } from '../../contracts'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\n\ntype InsertableNodeItem = {\n nodeType: WorkflowNodeType\n nameKey: string\n subcategory: string\n}\n\n/**\n * Subset of node types that make sense for inline edge insertion.\n * Excludes: start, end, iteration_start, note (annotations)\n */\nconst INSERTABLE_NODES: InsertableNodeItem[] = [\n { nodeType: 'if_else', nameKey: 'ifElseNode', subcategory: 'Control' },\n { nodeType: 'iteration', nameKey: 'iterationNode', subcategory: 'Control' },\n { nodeType: 'code', nameKey: 'codeNode', subcategory: 'Data' },\n { nodeType: 'http_request', nameKey: 'httpRequestNode', subcategory: 'Data' },\n { nodeType: 'template_transform', nameKey: 'templateTransformNode', subcategory: 'Data' },\n { nodeType: 'variable_assigner', nameKey: 'variableAssignerNode', subcategory: 'Data' },\n { nodeType: 'variable_aggregator', nameKey: 'variableAggregatorNode', subcategory: 'Data' },\n { nodeType: 'list_operator', nameKey: 'listOperatorNode', subcategory: 'Data' },\n { nodeType: 'document_extractor', nameKey: 'documentExtractorNode', subcategory: 'Data' },\n { nodeType: 'knowledge_base', nameKey: 'knowledgeBaseNode', subcategory: 'AI' },\n { nodeType: 'answer', nameKey: 'answerNode', subcategory: 'AI' },\n { nodeType: 'question_classifier', nameKey: 'questionClassifierNode', subcategory: 'AI' },\n { nodeType: 'parameter_extractor', nameKey: 'parameterExtractorNode', subcategory: 'AI' },\n]\n\ntype EdgeInsertPopupProps = {\n position: { x: number; y: number }\n onSelect: (nodeType: WorkflowNodeType) => void\n onClose: () => void\n}\n\nfunction EdgeInsertPopupComponent({ position, onSelect, onClose }: EdgeInsertPopupProps) {\n const tWorkflow = useTranslations('agents.workflow')\n const [searchQuery, setSearchQuery] = useState('')\n const popupRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n // Auto-focus search input\n useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n // Close on outside click\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (popupRef.current && !popupRef.current.contains(event.target as HTMLElement)) {\n onClose()\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [onClose])\n\n // Close on Escape\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [onClose])\n\n const filteredNodes = searchQuery.trim()\n ? INSERTABLE_NODES.filter((item) =>\n tWorkflow(item.nameKey).toLowerCase().includes(searchQuery.toLowerCase())\n )\n : INSERTABLE_NODES\n\n const handleSelect = useCallback((nodeType: WorkflowNodeType) => {\n onSelect(nodeType)\n onClose()\n }, [onSelect, onClose])\n\n return (\n <div\n ref={popupRef}\n className=\"nodrag nopan pointer-events-auto absolute z-50\"\n style={{\n transform: `translate(-50%, -50%) translate(${position.x}px, ${position.y}px)`,\n }}\n >\n <div className=\"liquid-surface w-[200px] rounded-xl p-2 shadow-2xl ring-1 ring-black/5 dark:ring-white/10\">\n {/* Search */}\n <input\n ref={inputRef}\n type=\"text\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.target.value)}\n placeholder={tWorkflow('searchPalette')}\n className=\"mb-1.5 w-full rounded-lg bg-gray-100/60 px-2.5 py-1.5 text-[11px] text-gray-900 placeholder-gray-400 outline-none dark:bg-white/10 dark:text-white dark:placeholder-gray-500\"\n />\n\n {/* Node list */}\n <div className=\"max-h-[240px] space-y-0.5 overflow-y-auto\">\n {filteredNodes.map((item) => {\n const IconComponent = LOGIC_ICON_MAP[item.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[item.nodeType] ?? 'from-gray-400 to-gray-500'\n\n return (\n <button\n key={item.nodeType}\n type=\"button\"\n onClick={() => handleSelect(item.nodeType)}\n className=\"flex w-full items-center gap-2 rounded-lg px-2 py-1.5 text-left transition-colors hover:bg-gray-100/60 dark:hover:bg-white/10\"\n >\n <div className={`flex h-5 w-5 items-center justify-center rounded-md bg-gradient-to-br ${gradient} shadow-sm`}>\n {IconComponent && <IconComponent className=\"h-3 w-3 text-white\" />}\n </div>\n <span className=\"truncate text-[11px] font-medium text-gray-700 dark:text-gray-300\">\n {tWorkflow(item.nameKey)}\n </span>\n </button>\n )\n })}\n {filteredNodes.length === 0 && (\n <p className=\"py-2 text-center text-[10px] text-gray-400 dark:text-gray-500\">\n {tWorkflow('noLogicNodes')}\n </p>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport const EdgeInsertPopup = memo(EdgeInsertPopupComponent)\n","import { memo, useState } from 'react'\nimport {\n getBezierPath,\n EdgeLabelRenderer,\n BaseEdge,\n useReactFlow,\n type EdgeProps,\n} from '@xyflow/react'\nimport { XMarkIcon, PlusIcon } from '@heroicons/react/24/solid'\nimport type { WorkflowNodeType } from '../../contracts'\nimport { EdgeInsertPopup } from './edge-insert-popup'\n\nexport type ConditionalEdgeData = {\n label?: string\n onInsertNode?: (edgeId: string, nodeType: WorkflowNodeType, position: { x: number; y: number }) => void\n}\n\ntype LabelStyle = { background: string; text: string; darkBackground: string; darkText: string }\n\nconst LABEL_STYLES: Record<string, LabelStyle> = {\n True: {\n background: 'bg-green-100',\n text: 'text-green-700',\n darkBackground: 'dark:bg-green-500/20',\n darkText: 'dark:text-green-300',\n },\n False: {\n background: 'bg-red-100',\n text: 'text-red-700',\n darkBackground: 'dark:bg-red-500/20',\n darkText: 'dark:text-red-300',\n },\n Loop: {\n background: 'bg-violet-100',\n text: 'text-violet-700',\n darkBackground: 'dark:bg-violet-500/20',\n darkText: 'dark:text-violet-300',\n },\n}\n\n/** Fallback style for dynamic labels (e.g., Question Classifier categories) */\nconst DEFAULT_LABEL_STYLE: LabelStyle = {\n background: 'bg-purple-100',\n text: 'text-purple-700',\n darkBackground: 'dark:bg-purple-500/20',\n darkText: 'dark:text-purple-300',\n}\n\nfunction ConditionalEdgeComponent({\n id,\n source,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n sourceHandleId,\n selected,\n style = {},\n markerEnd,\n data,\n}: EdgeProps) {\n const [isHovered, setIsHovered] = useState(false)\n const [showInsertPopup, setShowInsertPopup] = useState(false)\n const { setEdges } = useReactFlow()\n\n const [edgePath, labelX, labelY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n })\n\n const edgeData = data as ConditionalEdgeData | undefined\n const label = edgeData?.label\n ?? (sourceHandleId === 'true-out' ? 'True' : undefined)\n ?? (sourceHandleId === 'false-out' ? 'False' : undefined)\n ?? (sourceHandleId === 'loop-out' ? 'Loop' : undefined)\n\n const labelStyle = label ? (LABEL_STYLES[label] ?? DEFAULT_LABEL_STYLE) : undefined\n const showControls = selected || isHovered\n\n const handleDeleteEdge = (event: React.MouseEvent) => {\n event.stopPropagation()\n setEdges((currentEdges) => currentEdges.filter((edge) => edge.id !== id))\n }\n\n const handleInsertClick = (event: React.MouseEvent) => {\n event.stopPropagation()\n setShowInsertPopup(true)\n }\n\n const handleInsertNodeSelect = (nodeType: WorkflowNodeType) => {\n // Calculate midpoint in flow coordinates\n const midpointX = (sourceX + targetX) / 2\n const midpointY = (sourceY + targetY) / 2\n\n edgeData?.onInsertNode?.(id, nodeType, { x: midpointX, y: midpointY })\n setShowInsertPopup(false)\n }\n\n // Compute vertical offsets for labels, + button, and delete button\n // so they don't overlap\n const hasLabel = Boolean(label && labelStyle)\n const insertButtonOffset = hasLabel ? -20 : 0\n const deleteButtonOffset = hasLabel ? (showInsertPopup ? -40 : -40) : (showInsertPopup ? -20 : -20)\n\n return (\n <>\n {/* Invisible wider path for easier hover/click detection */}\n <path\n d={edgePath}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={20}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className=\"react-flow__edge-interaction\"\n />\n <BaseEdge id={id} path={edgePath} markerEnd={markerEnd} style={style} />\n\n <EdgeLabelRenderer>\n {/* Conditional label (True / False / Loop / Category names) */}\n {hasLabel && labelStyle && (\n <div\n className={`nodrag nopan pointer-events-auto absolute rounded-full px-2 py-0.5 text-[10px] font-semibold ${labelStyle.background} ${labelStyle.text} ${labelStyle.darkBackground} ${labelStyle.darkText}`}\n style={{\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,\n }}\n data-testid={`edge-label-${id}`}\n >\n {label}\n </div>\n )}\n\n {/* Insert node button — shown on hover */}\n {showControls && !showInsertPopup && (\n <button\n type=\"button\"\n className=\"nodrag nopan pointer-events-auto absolute flex h-5 w-5 items-center justify-center rounded-full border border-teal-300 bg-white shadow-md transition-all hover:scale-110 hover:bg-teal-50 dark:border-teal-600 dark:bg-gray-800 dark:hover:bg-teal-900/30\"\n style={{\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY + insertButtonOffset}px)`,\n }}\n onClick={handleInsertClick}\n aria-label=\"Insert node\"\n >\n <PlusIcon className=\"h-3 w-3 text-teal-500 dark:text-teal-400\" />\n </button>\n )}\n\n {/* Insert popup */}\n {showInsertPopup && (\n <EdgeInsertPopup\n position={{ x: labelX, y: labelY + insertButtonOffset }}\n onSelect={handleInsertNodeSelect}\n onClose={() => setShowInsertPopup(false)}\n />\n )}\n\n {/* Delete button — shown on hover or selection */}\n {showControls && (\n <button\n type=\"button\"\n className=\"nodrag nopan pointer-events-auto absolute flex h-5 w-5 items-center justify-center rounded-full border border-red-300 bg-white shadow-md transition-all hover:scale-110 hover:bg-red-50 dark:border-red-600 dark:bg-gray-800 dark:hover:bg-red-900/30\"\n style={{\n transform: `translate(-50%, -50%) translate(${labelX}px,${labelY + deleteButtonOffset}px)`,\n }}\n onClick={handleDeleteEdge}\n aria-label=\"Delete connection\"\n >\n <XMarkIcon className=\"h-3 w-3 text-red-500 dark:text-red-400\" />\n </button>\n )}\n </EdgeLabelRenderer>\n </>\n )\n}\n\nexport const ConditionalEdge = memo(ConditionalEdgeComponent)\n","import type { ConnectionLineComponentProps } from '@xyflow/react'\nimport { getBezierPath } from '@xyflow/react'\n\nexport function CustomConnectionLine({\n fromX,\n fromY,\n toX,\n toY,\n fromPosition,\n toPosition,\n}: ConnectionLineComponentProps) {\n const [path] = getBezierPath({\n sourceX: fromX,\n sourceY: fromY,\n sourcePosition: fromPosition,\n targetX: toX,\n targetY: toY,\n targetPosition: toPosition,\n })\n\n return (\n <g>\n <path\n d={path}\n fill=\"none\"\n stroke=\"#14b8a6\"\n strokeWidth={2}\n strokeDasharray=\"6 3\"\n className=\"animate-dash\"\n />\n <circle\n cx={toX}\n cy={toY}\n r={4}\n fill=\"#14b8a6\"\n stroke=\"white\"\n strokeWidth={1.5}\n />\n </g>\n )\n}\n","import { useState, useCallback, useRef, useEffect, memo } from 'react'\nimport {\n ArrowUturnLeftIcon,\n ArrowUturnRightIcon,\n ArrowsPointingInIcon,\n MagnifyingGlassPlusIcon,\n MagnifyingGlassMinusIcon,\n MapIcon,\n CommandLineIcon,\n Bars2Icon,\n CursorArrowRaysIcon,\n HandRaisedIcon,\n Squares2X2Icon,\n ArrowsRightLeftIcon,\n} from '@heroicons/react/24/outline'\nimport type { CanvasControlMode } from '../../store/workflow-store'\nimport type { WorkflowCardDisplayMode } from '../../types'\nimport type { LayoutDirection } from '../../utils/layout-engine'\n\ninterface DraggableCommandBarProps {\n zoomIn: () => void\n zoomOut: () => void\n onFitView: () => void\n onUndo: () => void\n onRedo: () => void\n canUndo: boolean\n canRedo: boolean\n controlMode: CanvasControlMode\n onControlModeChange: (mode: CanvasControlMode) => void\n showMinimap: boolean\n onToggleMinimap: () => void\n cardDisplayMode: WorkflowCardDisplayMode\n onToggleCardDisplayMode: () => void\n layoutDirection: LayoutDirection\n onLayoutDirectionChange: (direction: LayoutDirection) => void\n showShortcuts: boolean\n onToggleShortcuts: () => void\n onCloseShortcuts: () => void\n tWorkflow: (key: string) => string\n}\n\n/** Frosted glass style applied via inline style so it works regardless of CSS class availability */\n/** CSS class name for liquid glass — defined in globals.css */\nconst GLASS_CLASS = 'liquid-surface'\n\nexport const DraggableCommandBar = memo(function DraggableCommandBar({\n zoomIn,\n zoomOut,\n onFitView,\n onUndo,\n onRedo,\n canUndo,\n canRedo,\n controlMode,\n onControlModeChange,\n showMinimap,\n onToggleMinimap,\n cardDisplayMode,\n onToggleCardDisplayMode,\n layoutDirection,\n onLayoutDirectionChange,\n showShortcuts,\n onToggleShortcuts,\n onCloseShortcuts,\n tWorkflow,\n}: DraggableCommandBarProps) {\n const [position, setPosition] = useState({ x: 16, y: -16 })\n const isDragging = useRef(false)\n const dragOffset = useRef({ x: 0, y: 0 })\n const barRef = useRef<HTMLDivElement>(null)\n\n const handlePointerDown = useCallback((event: React.PointerEvent) => {\n if ((event.target as HTMLElement).closest('button')) return\n isDragging.current = true\n dragOffset.current = {\n x: event.clientX - position.x,\n y: event.clientY - position.y,\n }\n barRef.current?.setPointerCapture(event.pointerId)\n event.preventDefault()\n }, [position.x, position.y])\n\n const handlePointerMove = useCallback((event: React.PointerEvent) => {\n if (!isDragging.current) return\n const newX = event.clientX - dragOffset.current.x\n const newY = event.clientY - dragOffset.current.y\n setPosition({ x: newX, y: newY })\n }, [])\n\n const handlePointerUp = useCallback((event: React.PointerEvent) => {\n isDragging.current = false\n barRef.current?.releasePointerCapture(event.pointerId)\n }, [])\n\n // Close shortcuts panel on Escape key\n useEffect(() => {\n if (!showShortcuts) return\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onCloseShortcuts()\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [showShortcuts, onCloseShortcuts])\n\n const buttonClassName = 'rounded-lg p-1.5 text-gray-600 transition-colors hover:bg-white/40 active:bg-white/60 dark:text-gray-400 dark:hover:bg-white/10 dark:active:bg-white/15'\n const activeButtonClassName = 'rounded-lg p-1.5 transition-colors hover:bg-white/40 dark:hover:bg-white/10 text-indigo-600 dark:text-indigo-400'\n const inactiveButtonClassName = 'rounded-lg p-1.5 transition-colors hover:bg-white/40 dark:hover:bg-white/10 text-gray-400 dark:text-gray-500'\n const dividerClassName = 'mx-0.5 h-4 w-px bg-gray-400/30 dark:bg-white/10'\n\n return (\n <div\n ref={barRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n className={`absolute ${showShortcuts ? 'z-[100]' : 'z-[5]'} select-none`}\n style={{\n left: position.x,\n bottom: position.y > 0 ? undefined : Math.abs(position.y),\n top: position.y > 0 ? position.y : undefined,\n cursor: isDragging.current ? 'grabbing' : 'grab',\n }}\n >\n <div\n className={`${GLASS_CLASS} flex items-center gap-0.5 rounded-2xl px-2 py-1.5`}\n >\n {/* Drag handle */}\n <div className=\"mr-0.5 flex cursor-grab items-center px-0.5 active:cursor-grabbing\">\n <Bars2Icon className=\"h-3.5 w-3.5 text-gray-400/70 dark:text-gray-500/70\" />\n </div>\n\n {/* Pointer / Hand mode toggle */}\n <button\n type=\"button\"\n onClick={() => onControlModeChange('pointer')}\n title={tWorkflow('pointerMode')}\n className={controlMode === 'pointer' ? activeButtonClassName : inactiveButtonClassName}\n >\n <CursorArrowRaysIcon className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => onControlModeChange('hand')}\n title={tWorkflow('handMode')}\n className={controlMode === 'hand' ? activeButtonClassName : inactiveButtonClassName}\n >\n <HandRaisedIcon className=\"h-4 w-4\" />\n </button>\n\n <div className={dividerClassName} />\n\n {/* Zoom controls */}\n <button type=\"button\" onClick={() => zoomIn()} title=\"Zoom In\" className={buttonClassName}>\n <MagnifyingGlassPlusIcon className=\"h-4 w-4\" />\n </button>\n <button type=\"button\" onClick={() => zoomOut()} title=\"Zoom Out\" className={buttonClassName}>\n <MagnifyingGlassMinusIcon className=\"h-4 w-4\" />\n </button>\n <button type=\"button\" onClick={onFitView} title={tWorkflow('fitView')} className={buttonClassName}>\n <ArrowsPointingInIcon className=\"h-4 w-4\" />\n </button>\n\n <div className={dividerClassName} />\n\n {/* Undo / Redo */}\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title={tWorkflow('undo')}\n className={`${buttonClassName} disabled:opacity-30 disabled:hover:bg-transparent`}\n >\n <ArrowUturnLeftIcon className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n title={tWorkflow('redo')}\n className={`${buttonClassName} disabled:opacity-30 disabled:hover:bg-transparent`}\n >\n <ArrowUturnRightIcon className=\"h-4 w-4\" />\n </button>\n\n <div className={dividerClassName} />\n\n {/* Minimap toggle */}\n <button\n type=\"button\"\n onClick={onToggleMinimap}\n title={tWorkflow('toggleMinimap')}\n className={showMinimap ? activeButtonClassName : inactiveButtonClassName}\n >\n <MapIcon className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={onToggleCardDisplayMode}\n title={tWorkflow('toggleCardDisplayMode')}\n className={cardDisplayMode === 'compact' ? activeButtonClassName : inactiveButtonClassName}\n >\n <Squares2X2Icon className=\"h-4 w-4\" />\n </button>\n\n <div className={dividerClassName} />\n\n {/* Layout mode — cycles Free → LR → TB → Free */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => {\n const cycle: LayoutDirection[] = ['free', 'LR', 'TB']\n const currentIndex = cycle.indexOf(layoutDirection)\n const nextDirection = cycle[(currentIndex + 1) % cycle.length]\n onLayoutDirectionChange(nextDirection)\n }}\n title={tWorkflow('layoutMode')}\n className={layoutDirection !== 'free' ? activeButtonClassName : buttonClassName}\n >\n <ArrowsRightLeftIcon className=\"h-4 w-4\" />\n </button>\n {layoutDirection !== 'free' && (\n <span className=\"pointer-events-none absolute -right-1 -top-1 flex h-3.5 min-w-[14px] items-center justify-center rounded-full bg-indigo-500 px-0.5 text-[7px] font-bold text-white\">\n {layoutDirection}\n </span>\n )}\n </div>\n\n <div className={dividerClassName} />\n\n {/* Keyboard shortcuts */}\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={onToggleShortcuts}\n title={tWorkflow('shortcuts')}\n className={showShortcuts ? activeButtonClassName : inactiveButtonClassName}\n >\n <CommandLineIcon className=\"h-4 w-4\" />\n </button>\n {showShortcuts && (\n <>\n <div\n className=\"fixed inset-0 z-40 cursor-default\"\n onClick={onCloseShortcuts}\n onPointerDown={(event) => event.stopPropagation()}\n aria-hidden=\"true\"\n />\n <div\n className={`${GLASS_CLASS} absolute bottom-full left-0 z-50 mb-2 w-64 cursor-default rounded-xl p-3 shadow-2xl`}\n onClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {tWorkflow('shortcuts')}\n </p>\n <div className=\"space-y-1.5\">\n {[\n { keys: 'V', label: tWorkflow('pointerMode') },\n { keys: 'H', label: tWorkflow('handMode') },\n { keys: '⌘ Z', label: tWorkflow('undo') },\n { keys: '⌘ ⇧ Z', label: tWorkflow('redo') },\n { keys: '⌘ C', label: tWorkflow('shortcutCopy') },\n { keys: '⌘ V', label: tWorkflow('shortcutPaste') },\n { keys: '⌘ D', label: tWorkflow('shortcutDuplicate') },\n { keys: '⌘ A', label: tWorkflow('shortcutSelectAll') },\n { keys: '⌘ ⇧ F', label: tWorkflow('fitView') },\n { keys: '⌘ 1', label: tWorkflow('shortcutFitView') },\n { keys: '⌘ +', label: tWorkflow('shortcutZoomIn') },\n { keys: '⌘ -', label: tWorkflow('shortcutZoomOut') },\n { keys: '⇧ 1', label: tWorkflow('shortcutZoom100') },\n { keys: '⇧ 5', label: tWorkflow('shortcutZoom50') },\n { keys: 'Esc', label: tWorkflow('shortcutDeselect') },\n { keys: '⌫', label: tWorkflow('shortcutDelete') },\n { keys: 'L', label: tWorkflow('layoutMode') },\n ].map((shortcut) => (\n <div key={shortcut.keys} className=\"flex items-center justify-between\">\n <span className=\"text-[11px] text-gray-600 dark:text-gray-300\">\n {shortcut.label}\n </span>\n <span className=\"flex items-center gap-0.5\">\n {shortcut.keys.split(' ').map((key) => (\n <kbd\n key={key}\n className=\"inline-flex min-w-[20px] items-center justify-center rounded-md bg-white/60 px-1.5 py-0.5 text-[10px] font-medium text-gray-500 shadow-sm ring-1 ring-inset ring-gray-300/40 dark:bg-white/10 dark:text-gray-400 dark:ring-white/10\"\n >\n {key}\n </kbd>\n ))}\n </span>\n </div>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n )\n})\n","/**\n * Entity Visual Helpers\n * =====================\n * Generic appearance helpers for entity nodes independent of hardcoded entity types.\n */\n\nimport {\n CircleStackIcon,\n BuildingStorefrontIcon,\n UsersIcon,\n ShoppingBagIcon,\n ClipboardDocumentCheckIcon,\n ShieldCheckIcon,\n CurrencyDollarIcon,\n ChartBarSquareIcon,\n PresentationChartBarIcon,\n FireIcon,\n ChartPieIcon,\n} from '@heroicons/react/24/outline'\n\nconst ENTITY_STYLE_PRESETS = [\n {\n gradient: 'from-blue-400 to-blue-600',\n badgeColor: 'bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300',\n handleColor: '!bg-blue-500',\n minimapColor: '#3b82f6',\n },\n {\n gradient: 'from-purple-400 to-purple-600',\n badgeColor: 'bg-purple-100 text-purple-700 dark:bg-purple-500/20 dark:text-purple-300',\n handleColor: '!bg-purple-500',\n minimapColor: '#a855f7',\n },\n {\n gradient: 'from-amber-700 to-orange-900',\n badgeColor: 'bg-amber-100 text-amber-800 dark:bg-amber-500/20 dark:text-amber-300',\n handleColor: '!bg-amber-700',\n minimapColor: '#92400e',\n },\n {\n gradient: 'from-emerald-500 to-teal-600',\n badgeColor: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300',\n handleColor: '!bg-emerald-500',\n minimapColor: '#059669',\n },\n {\n gradient: 'from-rose-500 to-red-600',\n badgeColor: 'bg-rose-100 text-rose-700 dark:bg-rose-500/20 dark:text-rose-300',\n handleColor: '!bg-rose-500',\n minimapColor: '#f43f5e',\n },\n {\n gradient: 'from-cyan-500 to-blue-600',\n badgeColor: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300',\n handleColor: '!bg-cyan-500',\n minimapColor: '#06b6d4',\n },\n] as const\n\nfunction hashString(value: string): number {\n let hash = 0\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index)\n hash |= 0\n }\n return Math.abs(hash)\n}\n\nfunction normalizeEntityKey(entityKey: string | undefined): string {\n return (entityKey ?? 'entity').trim().toLowerCase() || 'entity'\n}\n\nfunction presetFromKey(entityKey: string | undefined) {\n const normalized = normalizeEntityKey(entityKey)\n const presetIndex = hashString(normalized) % ENTITY_STYLE_PRESETS.length\n return ENTITY_STYLE_PRESETS[presetIndex]\n}\n\nconst ENTITY_ICON_MAP: Record<string, React.ComponentType<{ className?: string }>> = {\n stations: BuildingStorefrontIcon,\n users: UsersIcon,\n competitors: ShoppingBagIcon,\n fuels: FireIcon,\n approvals: ClipboardDocumentCheckIcon,\n rules: ShieldCheckIcon,\n current_prices: CurrencyDollarIcon,\n competitor_prices: ChartBarSquareIcon,\n fuel_metrics: ChartPieIcon,\n station_metrics: PresentationChartBarIcon,\n entities: CircleStackIcon,\n}\n\nexport function getEntityIcon(entityKey: string | undefined): React.ComponentType<{ className?: string }> {\n const normalized = normalizeEntityKey(entityKey)\n return ENTITY_ICON_MAP[normalized] ?? CircleStackIcon\n}\n\nexport function getEntityGradient(entityKey: string | undefined): string {\n return presetFromKey(entityKey).gradient\n}\n\nexport function getEntityBadgeColor(entityKey: string | undefined): string {\n return presetFromKey(entityKey).badgeColor\n}\n\nexport function getEntityHandleColor(entityKey: string | undefined): string {\n return presetFromKey(entityKey).handleColor\n}\n\nexport function getEntityMinimapColor(entityKey: string | undefined): string {\n return presetFromKey(entityKey).minimapColor\n}\n","/**\n * Logic Node Default Configs\n * ==========================\n * Factory function to create default configs for each logic node type.\n */\n\nimport type { WorkflowNodeType, LogicNodeConfig } from '../contracts'\n\nexport function createDefaultLogicNodeConfig(nodeType: WorkflowNodeType): LogicNodeConfig | null {\n switch (nodeType) {\n case 'start':\n return { type: 'start', inputVariables: [] }\n case 'end':\n return { type: 'end', outputVariables: [] }\n case 'if_else':\n return {\n type: 'if_else',\n conditions: [{ variable: '', operator: 'equals', value: '' }],\n logicalOperator: 'and',\n }\n case 'code':\n return { type: 'code', language: 'javascript', code: '' }\n case 'http_request':\n return {\n type: 'http_request',\n method: 'GET',\n url: '',\n headers: {},\n body: '',\n timeoutMs: 10000,\n }\n case 'template_transform':\n return { type: 'template_transform', template: '', outputVariable: '' }\n case 'iteration':\n return { type: 'iteration', iteratorVariable: '', maxIterations: 100 }\n case 'knowledge_base':\n return { type: 'knowledge_base', sourceId: '', topK: 5, similarityThreshold: 0.7 }\n case 'answer':\n return { type: 'answer', outputTemplate: '', outputVariables: [] }\n case 'question_classifier':\n return {\n type: 'question_classifier',\n modelId: '',\n instructions: '',\n categories: [\n { id: crypto.randomUUID(), name: '', description: '' },\n { id: crypto.randomUUID(), name: '', description: '' },\n ],\n }\n case 'parameter_extractor':\n return {\n type: 'parameter_extractor',\n modelId: '',\n parameters: [{ name: '', type: 'string', description: '', required: true }],\n }\n case 'variable_assigner':\n return {\n type: 'variable_assigner',\n assignments: [{ target: '', source: '' }],\n }\n case 'variable_aggregator':\n return {\n type: 'variable_aggregator',\n inputVariables: [],\n outputVariable: '',\n aggregationMode: 'array',\n }\n case 'document_extractor':\n return {\n type: 'document_extractor',\n extractionMode: 'text',\n outputVariable: '',\n }\n case 'list_operator':\n return {\n type: 'list_operator',\n operation: 'filter',\n inputVariable: '',\n outputVariable: '',\n condition: '',\n }\n case 'iteration_start':\n return {\n type: 'iteration_start',\n iteratorVariable: '',\n itemVariable: 'item',\n indexVariable: 'index',\n }\n case 'note':\n return {\n type: 'note',\n text: '',\n color: 'yellow',\n width: 200,\n height: 150,\n }\n case 'group':\n return {\n type: 'group',\n label: 'Group',\n color: 'slate',\n isExpanded: true,\n width: 400,\n height: 300,\n collapsedWidth: 260,\n collapsedHeight: 60,\n }\n default:\n return null\n }\n}\n","/**\n * Layout Engine\n * =============\n * Auto-layout for workflow graphs using @dagrejs/dagre.\n * Pure utility — no React dependencies.\n */\n\nimport Dagre from '@dagrejs/dagre'\nimport type { Node, Edge } from '@xyflow/react'\n\n/** Layout direction: free means no auto-layout is applied. */\nexport type LayoutDirection = 'free' | 'LR' | 'TB'\n\nconst DEFAULT_NODE_WIDTH = 260\nconst DEFAULT_NODE_HEIGHT = 70\n\nfunction getNodeSize(node: Node): { width: number; height: number } {\n const measured = node.measured as { width?: number; height?: number } | undefined\n return {\n width: measured?.width ?? DEFAULT_NODE_WIDTH,\n height: measured?.height ?? DEFAULT_NODE_HEIGHT,\n }\n}\n\n/**\n * Apply dagre layout to the given nodes and edges.\n * Returns a new array of nodes with updated positions.\n * Group child nodes (parentId set) and note nodes are excluded from layout.\n */\nexport function applyDagreLayout(\n nodes: Node[],\n edges: Edge[],\n direction: Exclude<LayoutDirection, 'free'>,\n): Node[] {\n const nodeSpacingHorizontal = 80\n const nodeSpacingVertical = 50\n\n // Separate layoutable nodes from excluded ones\n const layoutNodes = nodes.filter(\n (node) => !node.parentId && node.type !== 'note',\n )\n\n // Build dagre graph\n const dagreGraph = new Dagre.graphlib.Graph({ directed: true })\n dagreGraph.setDefaultEdgeLabel(() => ({}))\n\n const isHorizontal = direction === 'LR'\n dagreGraph.setGraph({\n rankdir: direction,\n nodesep: isHorizontal ? nodeSpacingVertical : nodeSpacingHorizontal,\n ranksep: isHorizontal ? nodeSpacingHorizontal : nodeSpacingVertical,\n marginx: 40,\n marginy: 40,\n })\n\n const layoutNodeIds = new Set(layoutNodes.map((node) => node.id))\n\n for (const node of layoutNodes) {\n const { width, height } = getNodeSize(node)\n dagreGraph.setNode(node.id, { width, height })\n }\n\n for (const edge of edges) {\n if (layoutNodeIds.has(edge.source) && layoutNodeIds.has(edge.target)) {\n dagreGraph.setEdge(edge.source, edge.target)\n }\n }\n\n Dagre.layout(dagreGraph)\n\n // Build position map — dagre returns center coords, React Flow uses top-left\n const positionMap = new Map<string, { x: number; y: number }>()\n for (const node of layoutNodes) {\n const dagreNode = dagreGraph.node(node.id)\n if (!dagreNode) continue\n const { width, height } = getNodeSize(node)\n positionMap.set(node.id, {\n x: dagreNode.x - width / 2,\n y: dagreNode.y - height / 2,\n })\n }\n\n // Return all nodes with updated positions for layout-participating nodes\n return nodes.map((node) => {\n const newPosition = positionMap.get(node.id)\n if (!newPosition) return node\n return { ...node, position: newPosition }\n })\n}\n","/**\n * Agent framework icons — LangChain, CrewAI, Google ADK, Anthropic Claude Agent SDK.\n * SVG paths sourced from simple-icons where available.\n */\n\nexport type AgentFramework = 'langchain' | 'crewai' | 'google-adk' | 'anthropic' | 'strands' | 'openai' | 'custom'\n\ntype FrameworkIconProps = { className?: string }\n\nexport function LangChainIcon({ className }: FrameworkIconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"LangChain\">\n <path d=\"M6.0988 5.9175C2.7359 5.9175 0 8.6462 0 12s2.736 6.0825 6.0988 6.0825h11.8024C21.2641 18.0825 24 15.3538 24 12s-2.736-6.0825-6.0988-6.0825ZM5.9774 7.851c.493.0124 1.02.2496 1.273.6228.3673.4592.4778 1.0668.8944 1.4932.5604.6118 1.199 1.1505 1.7161 1.802.4892.5954.8386 1.2937 1.1436 1.9975.1244.2335.1257.5202.31.7197.0908.1204.5346.4483.4383.5645.0555.1204.4702.286.3263.4027-.1944.04-.4129.0476-.5616-.1074-.0549.126-.183.0596-.2819.0432a4 4 0 0 0-.025.0736c-.3288.0219-.5754-.3126-.732-.565-.3111-.168-.6642-.2702-.982-.446-.0182.2895.0452.6485-.231.8353-.014.5565.8436.0656.9222.4804-.061.0067-.1286-.0095-.1774.0373-.2239.2172-.4805-.1645-.7385-.007-.3464.174-.3808.3161-.8096.352-.0237-.0359-.0143-.0592.0059-.0811.1207-.1399.1295-.3046.3356-.3643-.2122-.0334-.3899.0833-.5686.1757-.2323.095-.2304-.2141-.5878.0164-.0396-.0322-.0208-.0615.0018-.0864.0908-.1107.2102-.127.345-.1208-.663-.3686-.9751.4507-1.2813.0432-.092.0243-.1265.1068-.1845.1652-.05-.0548-.0123-.1212-.0099-.1857-.0598-.028-.1356-.041-.1179-.1366-.1171-.0395-.1988.0295-.286.0952-.0787-.0608.0532-.1492.0776-.2125.0702-.1216.23-.025.3111-.1126.2306-.1308.552.0814.8155.0455.203.0255.4544-.1825.3526-.39-.2171-.2767-.179-.6386-.1839-.9695-.0268-.1929-.491-.4382-.6252-.6462-.1659-.1873-.295-.4047-.4243-.6182-.4666-.9008-.3198-2.0584-.9077-2.8947-.266.1466-.6125.0774-.8418-.119-.1238.1125-.1292.2598-.139.4161-.297-.2962-.2593-.8559-.022-1.1855.0969-.1302.2127-.2373.342-.3316.0292-.0213.0391-.0419.0385-.0747.1174-.5267.5764-.7391 1.0694-.7267m12.4071.46c.5575 0 1.0806.2159 1.474.6082s.61.9145.61 1.4704c0 .556-.2167 1.078-.61 1.4698v.0006l-.902.8995a2.08 2.08 0 0 1-.8597.5166l-.0164.0047-.0058.0164a2.05 2.05 0 0 1-.474.7308l-.9018.8995c-.3934.3924-.917.6083-1.4745.6083s-1.0806-.216-1.474-.6083c-.813-.8107-.813-2.1294 0-2.9402l.9019-.8995a2.056 2.056 0 0 1 .858-.5143l.017-.0053.0058-.0158a2.07 2.07 0 0 1 .4752-.7337l.9018-.8995c.3934-.3924.9171-.6083 1.4745-.6083zm0 .8965a1.18 1.18 0 0 0-.8388.3462l-.9018.8995a1.181 1.181 0 0 0-.3427.9252l.0053.0572c.0323.2652.149.5044.3374.6917.13.1296.2733.2114.4471.2686a.9.9 0 0 1 .014.1582.884.884 0 0 1-.2609.6304l-.0554.0554c-.3013-.1028-.5525-.253-.7794-.4792a2.06 2.06 0 0 1-.5761-1.0968l-.0099-.0578-.0461.0368a1.1 1.1 0 0 0-.0876.0794l-.9024.8995c-.4623.461-.4623 1.212 0 1.673.2311.2305.535.346.8394.3461.3043 0 .6077-.1156.8388-.3462l.9019-.8995c.4623-.461.4623-1.2113 0-1.673a1.17 1.17 0 0 0-.4367-.2749 1 1 0 0 1-.014-.1611c0-.2591.1023-.505.2901-.6923.3019.1028.57.2694.7962.495.3007.2999.4994.679.5756 1.0968l.0105.0578.0455-.0373a1.1 1.1 0 0 0 .0887-.0794l.902-.8996c.4622-.461.4628-1.2124 0-1.6735a1.18 1.18 0 0 0-.8395-.3462Zm-9.973 5.1567-.0006.0006c-.0793.3078-.1048.8318-.506.847-.033.1776.1228.2445.2655.1874.141-.0645.2081.0508.2557.1657.2177.0317.5394-.0725.5516-.3298-.325-.1867-.4253-.5418-.5662-.8709\" />\n </svg>\n )\n}\n\nexport function CrewAIIcon({ className }: FrameworkIconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"CrewAI\">\n <path d=\"M12.482.18C7.161 1.319 1.478 9.069 1.426 15.372c-.051 5.527 3.1 8.68 8.68 8.627 6.716-.05 14.259-6.87 12.09-10.9-.672-1.292-1.396-1.344-2.687-.207-1.602 1.395-1.654.31-.207-2.893 1.757-3.98 1.705-5.322-.31-7.544C17.03.388 14.962-.388 12.482.181Zm5.322 2.068c2.273 2.015 2.376 4.236.465 8.42-1.395 3.1-2.17 3.515-3.824 1.86-1.24-1.24-1.343-3.46-.258-6.044 1.137-2.635.982-3.1-.568-1.653-3.72 3.358-6.458 9.765-5.424 12.503.464 1.189.825 1.395 2.737 1.395 2.79 0 6.303-1.705 7.957-3.926 1.756-2.274 2.79-2.274 2.79-.052 0 3.875-6.459 8.627-11.625 8.627-6.251 0-9.351-4.752-7.491-11.47.878-2.995 4.443-7.904 7.077-9.66 3.255-2.17 5.684-2.17 8.164 0z\" />\n </svg>\n )\n}\n\nexport function AnthropicIcon({ className }: FrameworkIconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Anthropic\">\n <path d=\"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z\" />\n </svg>\n )\n}\n\nexport function GoogleADKIcon({ className }: FrameworkIconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Google ADK\">\n {/* Robot face — rounded capsule with two eyes */}\n <path d=\"M7 5.5C4.5 5.5 2.5 7.5 2.5 10v1c0 2.5 2 4.5 4.5 4.5h10c2.5 0 4.5-2 4.5-4.5v-1c0-2.5-2-4.5-4.5-4.5H7Z\" stroke=\"#4285F4\" strokeWidth=\"2\" fill=\"none\" />\n <path d=\"M14.5 5.5C14.5 5.5 16 4 17 5.5\" stroke=\"#34A853\" strokeWidth=\"2\" strokeLinecap=\"round\" fill=\"none\" />\n <circle cx=\"9\" cy=\"10.5\" r=\"1.2\" fill=\"#4285F4\" />\n <circle cx=\"15\" cy=\"10.5\" r=\"1.2\" fill=\"#4285F4\" />\n {/* Code brackets below */}\n <path d=\"M4 18.5V20.5H5.5\" stroke=\"#FBBC04\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M9 17L7 19.5L9 22\" stroke=\"#EA4335\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M15 17L17 19.5L15 22\" stroke=\"#EA4335\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nexport function StrandsIcon({ className }: FrameworkIconProps) {\n return (\n <svg viewBox=\"0 0 300 462\" fill=\"currentColor\" className={className} aria-label=\"Strands\">\n <path d=\"M97.29 52.79C85.07 49.17 72.22 56.14 68.6 68.36C64.98 80.58 71.95 93.43 84.17 97.05L235.12 139.78C245.22 142.77 246.36 156.63 236.87 161.23L32.55 260.29C-14.94 283.32-9.16 352.74 41.48 367.59L189.55 411.01L190.13 411.17C202.18 414.38 214.67 407.4 218.2 395.36C221.78 383.12 214.77 370.3 202.54 366.71L54.47 323.29C44.34 320.32 43.19 306.44 52.69 301.83L257.01 202.77C304.43 179.78 298.76 110.48 248.23 95.51L97.29 52.79Z\" opacity=\"0.6\" />\n <path d=\"M259.15 0.98C271.39-2.57 284.2 4.47 287.75 16.71C291.31 28.95 284.27 41.76 272.03 45.31L71.17 103.67C40.71 112.52 37.2 154.26 65.75 168.08L241.34 253.09C307.87 285.3 299.79 382.55 228.86 403.34L30.4 461.5C18.17 465.09 5.35 458.08 1.76 445.84C-1.82 433.61 5.19 420.79 17.42 417.2L215.88 359.04C246.28 350.13 249.74 308.45 221.23 294.65L45.63 209.64C-20.98 177.39-12.78 79.99 58.29 59.34L259.15 0.98Z\" />\n </svg>\n )\n}\n\nexport function OpenAIIcon({ className }: FrameworkIconProps) {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className={className} aria-label=\"OpenAI\">\n <path d=\"M14.949 6.547a3.94 3.94 0 0 0-.348-3.273 4.11 4.11 0 0 0-4.4-1.934A4.1 4.1 0 0 0 8.423.2 4.15 4.15 0 0 0 6.305.086a4.1 4.1 0 0 0-1.891.948 4.04 4.04 0 0 0-1.158 1.753 4.1 4.1 0 0 0-1.563.679A4 4 0 0 0 .554 4.72a3.99 3.99 0 0 0 .502 4.731 3.94 3.94 0 0 0 .346 3.274 4.11 4.11 0 0 0 4.402 1.933c.382.425.852.764 1.377.995.526.231 1.095.35 1.67.346 1.78.002 3.358-1.132 3.901-2.804a4.1 4.1 0 0 0 1.563-.68 4 4 0 0 0 1.14-1.253 3.99 3.99 0 0 0-.506-4.716m-6.097 8.406a3.05 3.05 0 0 1-1.945-.694l.096-.054 3.23-1.838a.53.53 0 0 0 .265-.455v-4.49l1.366.778q.02.011.025.035v3.722c-.003 1.653-1.361 2.992-3.037 2.996m-6.53-2.75a2.95 2.95 0 0 1-.36-2.01l.095.057L5.29 12.09a.53.53 0 0 0 .527 0l3.949-2.246v1.555a.05.05 0 0 1-.022.041L6.473 13.3c-1.454.826-3.311.335-4.15-1.098m-.85-6.94A3.02 3.02 0 0 1 3.07 3.949v3.785a.51.51 0 0 0 .262.451l3.93 2.237-1.366.779a.05.05 0 0 1-.048 0L2.585 9.342a2.98 2.98 0 0 1-1.113-4.094zm11.216 2.571L8.747 5.576l1.362-.776a.05.05 0 0 1 .048 0l3.265 1.86a3 3 0 0 1 1.173 1.207 2.96 2.96 0 0 1-.27 3.2 3.05 3.05 0 0 1-1.36.997V8.279a.52.52 0 0 0-.276-.445m1.36-2.015-.097-.057-3.226-1.855a.53.53 0 0 0-.53 0L6.249 6.153V4.598a.04.04 0 0 1 .019-.04L9.533 2.7a3.07 3.07 0 0 1 3.257.139c.474.325.843.778 1.066 1.303.223.526.289 1.103.191 1.664zM5.503 8.575 4.139 7.8a.05.05 0 0 1-.026-.037V4.049c0-.57.166-1.127.476-1.607s.752-.864 1.275-1.105a3.08 3.08 0 0 1 3.234.41l-.096.054-3.23 1.838a.53.53 0 0 0-.265.455zm.742-1.577 1.758-1 1.762 1v2l-1.755 1-1.762-1z\" />\n </svg>\n )\n}\n\n/** Color + label metadata for each framework */\nexport const FRAMEWORK_META: Record<AgentFramework, {\n label: string\n color: string\n badgeColor: string\n IconComponent: (props: FrameworkIconProps) => React.ReactNode\n}> = {\n langchain: {\n label: 'LangChain',\n color: '#1C3C3C',\n badgeColor: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300',\n IconComponent: LangChainIcon,\n },\n crewai: {\n label: 'CrewAI',\n color: '#FF5A50',\n badgeColor: 'bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300',\n IconComponent: CrewAIIcon,\n },\n 'google-adk': {\n label: 'Google ADK',\n color: '#4285F4',\n badgeColor: 'bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300',\n IconComponent: GoogleADKIcon,\n },\n anthropic: {\n label: 'Claude Agent SDK',\n color: '#D4A574',\n badgeColor: 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300',\n IconComponent: AnthropicIcon,\n },\n strands: {\n label: 'Strands',\n color: '#FF9900',\n badgeColor: 'bg-orange-100 text-orange-700 dark:bg-orange-500/20 dark:text-orange-300',\n IconComponent: StrandsIcon,\n },\n openai: {\n label: 'OpenAI SDK',\n color: '#10A37F',\n badgeColor: 'bg-teal-100 text-teal-700 dark:bg-teal-500/20 dark:text-teal-300',\n IconComponent: OpenAIIcon,\n },\n custom: {\n label: 'Custom',\n color: '#6366F1',\n badgeColor: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300',\n IconComponent: ({ className }: FrameworkIconProps) => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Custom\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />\n </svg>\n ),\n },\n}\n\n/** Get the framework icon + metadata for a given framework key */\nexport function getFrameworkMeta(framework: string | undefined) {\n if (!framework) return FRAMEWORK_META.custom\n return FRAMEWORK_META[framework as AgentFramework] ?? FRAMEWORK_META.custom\n}\n\n/**\n * Model provider compatibility per framework.\n * - anthropic (Claude Agent SDK): Claude models only\n * - google-adk: Gemini primary, Claude via connectors — no Meta/Amazon\n * - langchain: All providers (50+)\n * - crewai: All providers (native + LiteLLM fallback)\n * - custom: All providers\n */\nconst FRAMEWORK_ALLOWED_PROVIDERS: Record<AgentFramework, string[] | 'all'> = {\n anthropic: ['anthropic'],\n 'google-adk': ['anthropic', 'google'],\n openai: ['openai'],\n strands: 'all',\n langchain: 'all',\n crewai: 'all',\n custom: 'all',\n}\n\n/** Check if a model ID is compatible with a framework */\nexport function isModelCompatibleWithFramework(modelId: string, framework: AgentFramework): boolean {\n const allowed = FRAMEWORK_ALLOWED_PROVIDERS[framework]\n if (!allowed || allowed === 'all') return true\n const provider = modelId.split('.')[0]\n return allowed.includes(provider)\n}\n\n/** Filter models to only those compatible with a framework */\nexport function getCompatibleModels<T extends { id: string }>(models: T[], framework: AgentFramework): T[] {\n const allowed = FRAMEWORK_ALLOWED_PROVIDERS[framework]\n if (!allowed || allowed === 'all') return models\n return models.filter((model) => {\n const provider = model.id.split('.')[0]\n return allowed.includes(provider)\n })\n}\n\n/** Get the first compatible framework for a given model, or 'custom' as fallback */\nexport function getDefaultFrameworkForModel(modelId: string): AgentFramework {\n const provider = modelId.split('.')[0]\n if (provider === 'anthropic') return 'anthropic'\n if (provider === 'google') return 'google-adk'\n return 'langchain'\n}\n","import type { ReactNode } from 'react'\nimport { getNodeStateClass } from '../../constants'\n\ninterface NodeCardProps {\n /** React Flow selection state */\n selected?: boolean\n /** Node type key for border colors (e.g. 'agent', 'tool', 'if_else') */\n nodeType: string\n /** Width class — defaults to 'w-[260px]' */\n width?: string\n /** Custom border class override (e.g. group node with dynamic colors) */\n customBorder?: string\n /** Display variant — 'error' shows dashed amber border for missing entities */\n variant?: 'default' | 'error'\n /** Compact density mode for short-card view */\n compact?: boolean\n /** Additional CSS classes */\n className?: string\n /** Inline styles */\n style?: React.CSSProperties\n /** Interactive attributes for div-based clickable nodes */\n role?: string\n tabIndex?: number\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void\n onDoubleClick?: (event: React.MouseEvent<HTMLDivElement>) => void\n children: ReactNode\n}\n\n/**\n * Base card container for all standard flow nodes.\n *\n * Provides shared styling: rounded corners, border, glassmorphism surface,\n * padding, selection/hover state ring, and group context for child hover effects.\n *\n * Nodes that do NOT use this: NoteFlowNode (custom bg/border), GroupFlowNode expanded (resizable container).\n */\nexport function NodeCard({\n selected,\n nodeType,\n width = 'w-[260px]',\n customBorder,\n variant = 'default',\n compact = false,\n className,\n style,\n role,\n tabIndex,\n onClick,\n onKeyDown,\n onDoubleClick,\n children,\n}: NodeCardProps) {\n if (variant === 'error') {\n return (\n <div\n className={`${width} rounded-xl border border-dashed border-amber-400/60 bg-amber-50/50 ${compact ? 'min-h-[84px] p-3' : 'p-4'} dark:border-amber-500/40 dark:bg-amber-900/10${className ? ` ${className}` : ''}`}\n style={style}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div\n className={`group relative ${width} rounded-xl border liquid-surface ${compact ? 'min-h-[84px] p-3' : 'p-4'} transition-all ${getNodeStateClass(selected, nodeType, customBorder)}${className ? ` ${className}` : ''}`}\n style={style}\n role={role}\n tabIndex={tabIndex}\n onClick={onClick}\n onKeyDown={onKeyDown}\n onDoubleClick={onDoubleClick}\n >\n {children}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\ninterface GraphNodeIconBubbleProps {\n children: ReactNode\n className?: string\n}\n\nexport function GraphNodeIconBubble({ children, className = '' }: GraphNodeIconBubbleProps) {\n return (\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl shadow-lg ${className}`}>\n {children}\n </div>\n )\n}\n\ninterface GraphNodeHeaderProps {\n icon: ReactNode\n title: string\n description?: string\n compact?: boolean\n iconClassName?: string\n}\n\nexport function GraphNodeHeader({\n icon,\n title,\n description,\n compact = false,\n iconClassName,\n}: GraphNodeHeaderProps) {\n return (\n <div className=\"flex items-start gap-3\">\n <div className={iconClassName}>{icon}</div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{title}</h3>\n {!compact && description && <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{description}</p>}\n </div>\n </div>\n )\n}\n\ninterface GraphNodeMetaProps {\n compact?: boolean\n children: ReactNode\n}\n\nexport function GraphNodeMeta({ compact = false, children }: GraphNodeMetaProps) {\n if (compact) return null\n return <div className=\"mt-2 flex items-center justify-between\">{children}</div>\n}\n\ninterface GraphNodeBadgeProps {\n children: ReactNode\n className?: string\n}\n\nexport function GraphNodeBadge({ children, className }: GraphNodeBadgeProps) {\n return (\n <span\n className={\n className\n ?? 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold bg-slate-100 text-slate-700 dark:bg-slate-500/20 dark:text-slate-300'\n }\n >\n {children}\n </span>\n )\n}\n","import type { ReactNode } from 'react'\nimport { TrashIcon } from '@heroicons/react/24/outline'\nimport { GraphNodeBadge, GraphNodeHeader, GraphNodeIconBubble, GraphNodeMeta } from './graph-node-primitives'\nimport { LOGIC_NODE_BADGE_COLORS, LOGIC_NODE_BADGE_SOFT_COLORS, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport { NodeCard } from './node-card'\n\ntype WorkflowTone = keyof typeof LOGIC_NODE_GRADIENTS\n\ninterface NodeInteractiveCardProps {\n nodeId: string\n onEdit?: (id: string) => void\n selected?: boolean\n nodeType: string\n width?: string\n compact?: boolean\n className?: string\n children: ReactNode\n}\n\nexport function NodeInteractiveCard({\n nodeId,\n onEdit,\n selected,\n nodeType,\n width,\n compact = false,\n className = 'cursor-pointer text-left',\n children,\n}: NodeInteractiveCardProps) {\n return (\n <NodeCard\n compact={compact}\n selected={selected}\n nodeType={nodeType}\n width={width}\n role=\"button\"\n tabIndex={0}\n onClick={() => onEdit?.(nodeId)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') onEdit?.(nodeId)\n }}\n className={className}\n >\n {children}\n </NodeCard>\n )\n}\n\ninterface NodeIconBubbleProps {\n tone: WorkflowTone\n children: ReactNode\n}\n\nexport function NodeIconBubble({ tone, children }: NodeIconBubbleProps) {\n return (\n <GraphNodeIconBubble className={`bg-gradient-to-br ${LOGIC_NODE_GRADIENTS[tone]}`}>\n {children}\n </GraphNodeIconBubble>\n )\n}\n\ninterface NodeCardHeaderProps {\n icon: ReactNode\n title: string\n description?: string\n compact?: boolean\n iconClassName: string\n}\n\nexport function NodeCardHeader({ icon, title, description, compact = false, iconClassName }: NodeCardHeaderProps) {\n return <GraphNodeHeader icon={icon} title={title} description={description} compact={compact} iconClassName={iconClassName} />\n}\n\ninterface NodeCardMetaProps {\n compact?: boolean\n children: ReactNode\n}\n\nexport function NodeCardMeta({ compact = false, children }: NodeCardMetaProps) {\n return <GraphNodeMeta compact={compact}>{children}</GraphNodeMeta>\n}\n\ninterface NodeCardBadgeProps {\n children: ReactNode\n className?: string\n tone?: WorkflowTone\n soft?: boolean\n}\n\nexport function NodeCardBadge({ children, className, tone, soft = false }: NodeCardBadgeProps) {\n const toneClass = tone\n ? soft\n ? LOGIC_NODE_BADGE_SOFT_COLORS[tone]\n : LOGIC_NODE_BADGE_COLORS[tone]\n : ''\n\n return <GraphNodeBadge className={className ?? `inline-flex items-center rounded-full px-2 py-0.5 text-[10px] ${soft ? 'font-medium' : 'font-semibold'} ${toneClass}`}>{children}</GraphNodeBadge>\n}\n\ninterface NodeCardDeleteActionProps {\n nodeId: string\n onDelete: ((id: string) => void) | undefined\n}\n\nexport function NodeCardDeleteAction({ nodeId, onDelete }: NodeCardDeleteActionProps) {\n if (!onDelete) return null\n\n return (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n onDelete(nodeId)\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.stopPropagation()\n onDelete(nodeId)\n }\n }}\n className=\"nodrag nopan cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label=\"Delete\"\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )\n}\n\ninterface NodeCardBranchLabelProps {\n children: ReactNode\n className: string\n}\n\nexport function NodeCardBranchLabel({ children, className }: NodeCardBranchLabelProps) {\n return <span className={className}>{children}</span>\n}\n","import { Handle, Position } from '@xyflow/react'\nimport type { CSSProperties } from 'react'\nimport { useWorkflowStore } from '../../store/workflow-store'\n\nconst BASE_HANDLE_CLASS = '!h-3 !w-3 !border-2 !border-white dark:!border-gray-800'\n\n/**\n * Resolve handle position based on the current layout direction.\n * In LR mode: Left = input, Right = output (default)\n * In TB mode: Top = input, Bottom = output\n * In free mode: use the original position as-is\n */\nfunction useResolvedPosition(position: Position): Position {\n const layoutDirection = useWorkflowStore((s) => s.layoutDirection)\n if (layoutDirection !== 'TB') return position\n\n // Map LR positions to TB positions\n if (position === Position.Left) return Position.Top\n if (position === Position.Right) return Position.Bottom\n return position\n}\n\ninterface WorkflowHandleProps {\n type: 'source' | 'target'\n position: Position\n id: string\n colorClass: string\n className?: string\n style?: CSSProperties\n}\n\nexport function WorkflowHandle({ type, position, id, colorClass, className, style }: WorkflowHandleProps) {\n const resolvedPosition = useResolvedPosition(position)\n return (\n <Handle\n type={type}\n position={resolvedPosition}\n id={id}\n style={style}\n className={`${BASE_HANDLE_CLASS} ${colorClass}${className ? ` ${className}` : ''}`}\n />\n )\n}\n\ninterface WorkflowDynamicTargetHandlesProps {\n count: number\n idPrefix: string\n colorClass: string\n}\n\nexport function WorkflowDynamicTargetHandles({ count, idPrefix, colorClass }: WorkflowDynamicTargetHandlesProps) {\n const layoutDirection = useWorkflowStore((s) => s.layoutDirection)\n const isTB = layoutDirection === 'TB'\n const handlePosition = isTB ? Position.Top : Position.Left\n\n return (\n <>\n {Array.from({ length: count }, (_, index) => (\n <WorkflowHandle\n key={`${idPrefix}-${index}`}\n type=\"target\"\n position={handlePosition}\n id={`${idPrefix}-${index}`}\n colorClass={colorClass}\n style={isTB\n ? { left: `${((index + 1) / (count + 1)) * 100}%` }\n : { top: `${((index + 1) / (count + 1)) * 100}%` }\n }\n />\n ))}\n </>\n )\n}\n\ninterface WorkflowDynamicHandlesProps {\n count: number\n idPrefix: string\n colorClass: string\n type: 'source' | 'target'\n position: Position\n keyIds?: string[]\n}\n\nexport function WorkflowDynamicHandles({\n count,\n idPrefix,\n colorClass,\n type,\n position,\n keyIds,\n}: WorkflowDynamicHandlesProps) {\n const layoutDirection = useWorkflowStore((s) => s.layoutDirection)\n const isTB = layoutDirection === 'TB'\n const resolvedPosition = isTB\n ? (position === Position.Left ? Position.Top : position === Position.Right ? Position.Bottom : position)\n : position\n\n return (\n <>\n {Array.from({ length: count }, (_, index) => (\n <WorkflowHandle\n key={keyIds?.[index] ?? `${idPrefix}-${index}`}\n type={type}\n position={resolvedPosition}\n id={`${idPrefix}-${index}`}\n colorClass={colorClass}\n style={isTB\n ? { left: `${((index + 1) / (count + 1)) * 100}%` }\n : { top: `${((index + 1) / (count + 1)) * 100}%` }\n }\n />\n ))}\n </>\n )\n}\n","/**\n * Node Running Indicator\n * ======================\n * Dify-style running status overlay for workflow nodes.\n * Shows a spinner (running), checkmark (success), or X (error)\n * badge in the top-right corner of the node. Reads status from\n * the Zustand workflow store's nodeResults map.\n */\n\nimport { memo } from 'react'\nimport { useWorkflowStore } from '../../store/workflow-store'\n\ntype NodeRunningIndicatorProps = {\n nodeId: string\n}\n\nfunction NodeRunningIndicatorComponent({ nodeId }: NodeRunningIndicatorProps) {\n const nodeResult = useWorkflowStore((state) => state.nodeResults[nodeId])\n\n if (!nodeResult) return null\n\n const { status, durationMs } = nodeResult\n\n return (\n <div className=\"absolute -right-1 -top-1 z-10 flex items-center gap-1\">\n {status === 'pending' && (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full border border-gray-300 bg-white shadow-sm dark:border-gray-600 dark:bg-gray-800\">\n <span className=\"h-2 w-2 rounded-full bg-gray-400 dark:bg-gray-500\" />\n </span>\n )}\n\n {status === 'running' && (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full border border-blue-300 bg-white shadow-sm dark:border-blue-600 dark:bg-gray-800\">\n <svg className=\"h-3 w-3 animate-spin text-blue-500\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n </span>\n )}\n\n {status === 'success' && (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full border border-green-300 bg-green-50 shadow-sm dark:border-green-600 dark:bg-green-900/30\">\n <svg className=\"h-3 w-3 text-green-600 dark:text-green-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n </span>\n )}\n\n {status === 'error' && (\n <span className=\"flex h-5 w-5 items-center justify-center rounded-full border border-red-300 bg-red-50 shadow-sm dark:border-red-600 dark:bg-red-900/30\">\n <svg className=\"h-3 w-3 text-red-600 dark:text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\n </svg>\n </span>\n )}\n\n {/* Duration badge for completed nodes */}\n {(status === 'success' || status === 'error') && durationMs !== undefined && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[9px] font-medium text-gray-500 shadow-sm dark:bg-gray-800 dark:text-gray-400\">\n {durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(1)}s`}\n </span>\n )}\n </div>\n )\n}\n\nexport const NodeRunningIndicator = memo(NodeRunningIndicatorComponent)\n","import { memo } from 'react'\nimport { Position } from '@xyflow/react'\nimport { useTranslations } from 'next-intl'\nimport { CpuChipIcon, TrashIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport type { AgentNodeData } from '../../types'\nimport { getFrameworkMeta } from '../icons/agent-framework-icons'\nimport { NodeCard } from './node-card'\nimport { NodeCardBadge, NodeCardHeader, NodeCardMeta } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const AgentFlowNode = memo(function AgentFlowNode({ id, data, selected }: { id: string; data: AgentNodeData; selected?: boolean }) {\n const t = useTranslations('agents')\n const isCompact = data.displayMode === 'compact'\n\n // Handle missing agent (entity not loaded yet or deleted)\n if (!data.agent?.name) {\n const agentLabel = (data as { label?: string }).label\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <WorkflowHandle type=\"target\" position={Position.Top} id=\"top-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <NodeCard variant=\"error\" nodeType=\"agent\" width=\"w-[320px]\">\n <NodeCardHeader\n icon={<ExclamationTriangleIcon className=\"h-6 w-6 text-white\" />}\n title={agentLabel || 'Agent'}\n description={t('agentNotFound')}\n iconClassName=\"flex h-11 w-11 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\"\n />\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-teal-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"bottom-out\" colorClass=\"!bg-teal-500\" />\n </>\n )\n }\n\n const agentId = data.agent.id || data.agent.agentId\n const frameworkMeta = getFrameworkMeta((data.agent as Record<string, unknown>).framework as string | undefined)\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n {/* Input handles — always visible for interactive canvas */}\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n <WorkflowHandle type=\"target\" position={Position.Top} id=\"top-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n\n <button type=\"button\" onClick={() => data.onSelect(agentId)} className=\"w-full text-left\">\n <NodeCard compact={isCompact} selected={selected} nodeType=\"agent\" width=\"w-[320px]\">\n <div className=\"flex items-start gap-3\">\n <div className=\"relative flex-shrink-0\">\n {data.agent.avatar ? (\n <img src={data.agent.avatar as string} alt={data.agent.name} className=\"h-11 w-11 rounded-full bg-white shadow-sm ring-1 ring-gray-200/50 dark:bg-gray-800 dark:ring-white/10\" />\n ) : (\n <div className=\"flex h-11 w-11 items-center justify-center rounded-full bg-gradient-to-br from-indigo-500/25 to-purple-500/25 ring-1 ring-indigo-500/30\">\n <CpuChipIcon className=\"h-6 w-6 text-indigo-500 dark:text-indigo-300\" />\n </div>\n )}\n <div className=\"absolute -bottom-0.5 -right-0.5 flex h-4 w-4 items-center justify-center rounded-full bg-indigo-500 ring-2 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-2.5 w-2.5 text-white\" />\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-semibold text-gray-900 dark:text-white\">{data.agent.name}</h3>\n {!isCompact && <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">{data.agent.role}</p>}\n </div>\n </div>\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <NodeCardBadge className=\"rounded-full bg-indigo-100 px-2 py-0.5 text-[10px] font-semibold text-indigo-700 dark:bg-indigo-500/20 dark:text-indigo-300\">\n Agent\n </NodeCardBadge>\n <NodeCardBadge className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium ${frameworkMeta.badgeColor}`}>\n <frameworkMeta.IconComponent className=\"h-3 w-3\" />\n {frameworkMeta.label}\n </NodeCardBadge>\n <NodeCardBadge className=\"rounded-full bg-blue-50 px-2 py-0.5 text-[10px] font-medium text-blue-700 dark:bg-blue-900/25 dark:text-blue-300\">\n {data.agent.modelId}\n </NodeCardBadge>\n <NodeCardBadge className=\"rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-600 dark:bg-white/10 dark:text-gray-300\">\n T: {data.agent.temperature}\n </NodeCardBadge>\n <NodeCardBadge className=\"rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-600 dark:bg-white/10 dark:text-gray-300\">\n v{data.agent.activePromptVersion}\n </NodeCardBadge>\n\n {data.onRemoveFromCanvas && (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n data.onRemoveFromCanvas!(id)\n }}\n className=\"nodrag nopan ml-auto cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label={t('removeFromCanvas')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )}\n </div>\n </NodeCardMeta>\n </NodeCard>\n </button>\n\n {/* Output handles — always visible for interactive canvas */}\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-teal-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"bottom-out\" colorClass=\"!bg-teal-500\" />\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"rule-out\" style={{ top: '75%' }} colorClass=\"!bg-violet-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { WrenchScrewdriverIcon, TrashIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport { ICON_MAP, CATEGORY_COLORS, CATEGORY_PILL_COLORS } from '../../constants'\nimport type { ToolNodeData } from '../../types'\nimport { NodeCard } from './node-card'\nimport { NodeCardBadge, NodeCardHeader, NodeCardMeta } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const ToolFlowNode = memo(function ToolFlowNode({ id, data, selected }: { id: string; data: ToolNodeData; selected?: boolean }) {\n const t = useTranslations('admin.tools')\n const { tool, onRemoveFromCanvas } = data\n const isCompact = data.displayMode === 'compact'\n\n // Handle missing tool (entity not loaded yet or deleted)\n if (!tool?.name) {\n const toolLabel = (data as { label?: string }).label\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-teal-400\" />\n <NodeCard variant=\"error\" nodeType=\"tool\">\n <NodeCardHeader\n icon={<ExclamationTriangleIcon className=\"h-5 w-5 text-white\" />}\n title={toolLabel || t('nodeType')}\n description={t('toolNotFound')}\n iconClassName=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\"\n />\n {onRemoveFromCanvas && (\n <div className=\"mt-2 flex justify-end\">\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onRemoveFromCanvas(id)\n }}\n className=\"cursor-pointer rounded-lg p-1 transition hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n </div>\n )}\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-teal-500\" />\n </>\n )\n }\n\n const { onEdit, onToggle } = data\n const IconComponent = ICON_MAP[tool.icon ?? ''] ?? WrenchScrewdriverIcon\n const categoryKey = (tool.category ?? 'external') as keyof typeof CATEGORY_COLORS\n const gradient = tool.color ?? CATEGORY_COLORS[categoryKey] ?? CATEGORY_COLORS.external\n const categoryPill = CATEGORY_PILL_COLORS[categoryKey] ?? CATEGORY_PILL_COLORS.external\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n {/* Input handle for interactive canvas */}\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-gray-400 dark:!bg-gray-500\" />\n\n <button\n type=\"button\"\n onClick={() => onEdit?.(tool)}\n className=\"w-full text-left\"\n >\n <NodeCard compact={isCompact} selected={selected} nodeType=\"tool\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-3\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <IconComponent className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{tool.name}</h3>\n {!isCompact && <p className=\"mt-0.5 line-clamp-1 text-xs text-gray-500 dark:text-gray-400\">{String(tool.description ?? '')}</p>}\n </div>\n </div>\n\n {onToggle && (\n <span\n role=\"switch\"\n aria-checked={tool.enabled}\n aria-label={tool.enabled ? 'Enabled' : 'Disabled'}\n className={`nodrag nopan relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer items-center rounded-full border border-white/50 px-0.5 shadow-[inset_0_1px_0_rgba(255,255,255,0.5)] transition duration-200 dark:border-white/15 ${\n tool.enabled ? 'bg-blue-600/90' : 'bg-slate-300/80 dark:bg-slate-700/80'\n }`}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onToggle(tool)\n }}\n >\n <span className={`pointer-events-none inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ${\n tool.enabled\n ? 'translate-x-4 shadow-[0_0_0_1px_rgba(255,255,255,0.2),0_0_6px_rgba(59,130,246,0.4)]'\n : 'translate-x-0'\n }`} />\n </span>\n )}\n </div>\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge className=\"inline-flex items-center rounded-full bg-teal-100 px-2 py-0.5 text-[10px] font-semibold text-teal-700 dark:bg-teal-400/15 dark:text-teal-400\">\n {t('nodeType')}\n </NodeCardBadge>\n <NodeCardBadge className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${categoryPill}`}>\n {tool.category}\n </NodeCardBadge>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{String(tool.timeoutMs ?? '')}ms</span>\n </div>\n\n {onRemoveFromCanvas && (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onRemoveFromCanvas(id)\n }}\n className=\"nodrag nopan cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label={t('removeFromCanvas')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )}\n </NodeCardMeta>\n </NodeCard>\n </button>\n\n {/* Output handle — always visible for interactive canvas */}\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-teal-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { AdjustmentsHorizontalIcon, ScaleIcon, TrashIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport { ADJUSTMENT_GRADIENT, ADJUSTMENT_PILL } from '../../constants'\nimport type { RuleNodeData } from '../../types'\nimport type { RuleNodeConfig, AgentRule } from '../../contracts'\nimport { NodeCard } from './node-card'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const RuleFlowNode = memo(function RuleFlowNode({ id, data, selected }: { id: string; data: RuleNodeData; selected?: boolean }) {\n const t = useTranslations('admin.rules')\n const { rule, onRemoveFromCanvas } = data\n const isCompact = data.displayMode === 'compact'\n\n // Handle missing rule — check for rule engine config mode\n if (!rule?.action) {\n const ruleConfig = (data as { config?: RuleNodeConfig }).config\n const ruleLabel = (data as { label?: string }).label\n\n // Rule engine node — config-based mode (evaluates all applicable rules)\n if (ruleConfig?.type === 'rule') {\n const contextVariableCount = ruleConfig.contextVariables ? Object.keys(ruleConfig.contextVariables).length : 0\n const editHandler = (data as { onEdit?: (nodeId: string) => void }).onEdit\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-violet-400\" />\n\n <button\n type=\"button\"\n onClick={() => editHandler?.(id)}\n className=\"w-full text-left\"\n >\n <NodeCard compact={isCompact} selected={selected} nodeType=\"rule\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-violet-400 to-purple-500 shadow-lg\">\n <ScaleIcon className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {ruleLabel || t('ruleEngine')}\n </h3>\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{t('ruleEngineDescription')}</p>\n </div>\n </div>\n\n {!isCompact && (\n <div className=\"mt-2 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex items-center rounded-full bg-violet-100 px-2 py-0.5 text-[10px] font-semibold text-violet-700 dark:bg-violet-500/20 dark:text-violet-300\">\n {t('ruleEngine')}\n </span>\n {contextVariableCount > 0 && (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {contextVariableCount} vars\n </span>\n )}\n {ruleConfig.outputVariable && (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n → {ruleConfig.outputVariable}\n </span>\n )}\n </div>\n\n {onRemoveFromCanvas && (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onRemoveFromCanvas(id)\n }}\n className=\"nodrag nopan cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label={t('removeFromCanvas')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )}\n </div>\n )}\n </NodeCard>\n </button>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-violet-400\" />\n </>\n )\n }\n\n // Truly missing rule — amber placeholder\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-violet-400\" />\n <NodeCard variant=\"error\" nodeType=\"rule\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\">\n <ExclamationTriangleIcon className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {ruleLabel || t('nodeType')}\n </h3>\n <p className=\"mt-0.5 text-xs text-amber-600 dark:text-amber-400\">{t('ruleNotFound')}</p>\n </div>\n </div>\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-violet-400\" />\n </>\n )\n }\n\n // Specific rule mode — rule entity found\n const onEdit = (data as { onEdit?: (rule: AgentRule) => void }).onEdit\n const onToggle = (data as { onToggle?: (rule: AgentRule) => void }).onToggle\n\n const action = rule.action as Record<string, unknown> | undefined\n const adjustmentType = String(action?.adjustmentType ?? 'percentage')\n const adjustmentValue = Number(action?.adjustmentValue ?? 0)\n const gradient = ADJUSTMENT_GRADIENT[adjustmentType] ?? ADJUSTMENT_GRADIENT.percentage\n const typePill = ADJUSTMENT_PILL[adjustmentType] ?? ADJUSTMENT_PILL.percentage\n\n const adjustmentDisplay = adjustmentType === 'percentage'\n ? `${adjustmentValue > 0 ? '+' : ''}${adjustmentValue}%`\n : adjustmentType === 'fixed'\n ? `${adjustmentValue > 0 ? '+' : ''}${adjustmentValue}`\n : 'formula'\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n {/* Input handle — always visible for interactive canvas */}\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-violet-400\" />\n\n <button\n type=\"button\"\n onClick={() => onEdit?.(rule)}\n className=\"w-full text-left\"\n >\n <NodeCard compact={isCompact} selected={selected} nodeType=\"rule\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-3\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <AdjustmentsHorizontalIcon className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{rule.name}</h3>\n <p className=\"mt-0.5 text-xs font-medium text-gray-600 dark:text-gray-300\">{adjustmentDisplay}</p>\n </div>\n </div>\n\n {onToggle && (\n <span\n role=\"switch\"\n aria-checked={rule.enabled}\n aria-label={rule.enabled ? 'Enabled' : 'Disabled'}\n className={`nodrag nopan relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer items-center rounded-full border border-white/50 px-0.5 shadow-[inset_0_1px_0_rgba(255,255,255,0.5)] transition duration-200 dark:border-white/15 ${\n rule.enabled ? 'bg-blue-600/90' : 'bg-slate-300/80 dark:bg-slate-700/80'\n }`}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onToggle(rule)\n }}\n >\n <span className={`pointer-events-none inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ${\n rule.enabled\n ? 'translate-x-4 shadow-[0_0_0_1px_rgba(255,255,255,0.2),0_0_6px_rgba(59,130,246,0.4)]'\n : 'translate-x-0'\n }`} />\n </span>\n )}\n </div>\n\n {!isCompact && (\n <div className=\"mt-2 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex items-center rounded-full bg-violet-100 px-2 py-0.5 text-[10px] font-semibold text-violet-700 dark:bg-violet-500/20 dark:text-violet-300\">\n {t('nodeType')}\n </span>\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${typePill}`}>\n {adjustmentType}\n </span>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">P{String(rule.priority ?? '')}</span>\n {Array.isArray(rule.condition?.fuelTypes) && rule.condition.fuelTypes.length > 0 && (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {rule.condition.fuelTypes.length} fuels\n </span>\n )}\n </div>\n\n {onRemoveFromCanvas && (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onRemoveFromCanvas(id)\n }}\n className=\"nodrag nopan cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label={t('removeFromCanvas')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )}\n </div>\n )}\n </NodeCard>\n </button>\n\n {/* Output handle */}\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-violet-400\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { TrashIcon, ExclamationTriangleIcon, CircleStackIcon } from '@heroicons/react/24/outline'\nimport type { EntityNodeData } from '../../types'\nimport { getEntityBadgeColor, getEntityGradient, getEntityHandleColor, getEntityIcon } from '../../constants/entity-colors'\nimport { NodeCard } from './node-card'\nimport { NodeCardBadge, NodeCardHeader, NodeCardMeta } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const EntityFlowNode = memo(function EntityFlowNode({ id, data, selected }: { id: string; data: EntityNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onEdit, onRemoveFromCanvas } = data\n const isCompact = data.displayMode === 'compact'\n\n // Handle missing config gracefully\n if (!config || config.type !== 'entity') {\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-blue-400\" />\n <NodeCard variant=\"error\" nodeType=\"entity\">\n <NodeCardHeader\n icon={<ExclamationTriangleIcon className=\"h-5 w-5 text-white\" />}\n title={label || t('entityNodeType')}\n description={t('entityNotConfigured')}\n iconClassName=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\"\n />\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-blue-400\" />\n </>\n )\n }\n\n const entityKey = config.entityMasterId || data.entity?.id\n const fieldCount = config.selectedFields?.length ?? data.entity?.fields.length ?? 0\n const filterCount = config.filterVariables ? Object.keys(config.filterVariables).length : 0\n const EntityIcon = getEntityIcon(entityKey) ?? CircleStackIcon\n const gradient = getEntityGradient(entityKey)\n const badgeColor = getEntityBadgeColor(entityKey)\n const handleColor = getEntityHandleColor(entityKey)\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass={handleColor} />\n\n <button\n type=\"button\"\n onClick={() => onEdit?.(id)}\n className=\"w-full text-left\"\n >\n <NodeCard compact={isCompact} selected={selected} nodeType=\"entity\">\n <div className=\"flex items-start gap-3\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <EntityIcon className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{label}</h3>\n {!isCompact && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">{data.entity?.label ?? config.entityMasterId}</p>\n )}\n </div>\n </div>\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold ${badgeColor}`}>\n {t('entityNodeType')}\n </NodeCardBadge>\n <NodeCardBadge className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium ${badgeColor}`}>\n {fieldCount} {t('entityFields')}\n </NodeCardBadge>\n {config.limit > 0 && (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {t('entityLimit', { count: config.limit })}\n </span>\n )}\n {filterCount > 0 && (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {filterCount} {t('entityFilters')}\n </span>\n )}\n </div>\n\n {onRemoveFromCanvas && (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onRemoveFromCanvas(id)\n }}\n className=\"nodrag nopan cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label={t('removeFromCanvas')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )}\n </NodeCardMeta>\n </NodeCard>\n </button>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass={handleColor} />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { PlayIcon } from '@heroicons/react/24/outline'\nimport type { StartNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const StartFlowNode = memo(function StartFlowNode({ id, data, selected }: { id: string; data: StartNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const variableCount = config?.inputVariables?.length ?? 0\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"start\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"start\">\n <PlayIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('startNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"start\">\n {t('startNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"start\" soft>\n {t('inputVariables')}: {variableCount}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-green-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { StopIcon } from '@heroicons/react/24/outline'\nimport type { EndNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const EndFlowNode = memo(function EndFlowNode({ id, data, selected }: { id: string; data: EndNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const variableCount = config?.outputVariables?.length ?? 0\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-red-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"end\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"end\">\n <StopIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('endNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"end\">\n {t('endNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"end\" soft>\n {t('outputVariables')}: {variableCount}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { ArrowsPointingOutIcon } from '@heroicons/react/24/outline'\nimport type { IfElseNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardBranchLabel, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const IfElseFlowNode = memo(function IfElseFlowNode({ id, data, selected }: { id: string; data: IfElseNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const conditionCount = config?.conditions?.length ?? 0\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-amber-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"if_else\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"if_else\">\n <ArrowsPointingOutIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('ifElseNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"if_else\">\n {t('ifElseNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"if_else\" soft>\n {t('conditions')}: {conditionCount}\n </NodeCardBadge>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {config.logicalOperator.toUpperCase()}\n </span>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n\n <NodeCardBranchLabel className=\"pointer-events-none absolute -right-12 top-1/2 -translate-y-1/2 rounded-full bg-green-100 px-2 py-0.5 text-[10px] font-semibold text-green-700 shadow-sm dark:bg-green-500/20 dark:text-green-300\">\n {t('ifBranchLabel')}\n </NodeCardBranchLabel>\n <NodeCardBranchLabel className=\"pointer-events-none absolute bottom-[-1.9rem] left-1/2 -translate-x-1/2 rounded-full bg-red-100 px-2 py-0.5 text-[10px] font-semibold text-red-700 shadow-sm dark:bg-red-500/20 dark:text-red-300\">\n {t('elseBranchLabel')}\n </NodeCardBranchLabel>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"true-out\" colorClass=\"!bg-green-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"false-out\" colorClass=\"!bg-red-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { CodeBracketIcon } from '@heroicons/react/24/outline'\nimport type { CodeNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const CodeFlowNode = memo(function CodeFlowNode({ id, data, selected }: { id: string; data: CodeNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const codePreview = config.code ? config.code.slice(0, 30) : ''\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-cyan-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"code\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"code\">\n <CodeBracketIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('codeNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"code\">\n {t('codeNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"code\" soft>\n {config.language}\n </NodeCardBadge>\n {codePreview && (\n <span className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {codePreview}...\n </span>\n )}\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-cyan-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { GlobeAltIcon } from '@heroicons/react/24/outline'\nimport type { HttpRequestNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const HttpRequestFlowNode = memo(function HttpRequestFlowNode({ id, data, selected }: { id: string; data: HttpRequestNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const urlPreview = config.url ? config.url.slice(0, 30) : ''\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-orange-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"http_request\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"http_request\">\n <GlobeAltIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('httpRequestNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"http_request\">\n {t('httpRequestNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"http_request\" soft>\n {config.method}\n </NodeCardBadge>\n {urlPreview && (\n <span className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {urlPreview}\n </span>\n )}\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-orange-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { DocumentTextIcon } from '@heroicons/react/24/outline'\nimport type { TemplateTransformNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const TemplateTransformFlowNode = memo(function TemplateTransformFlowNode({ id, data, selected }: { id: string; data: TemplateTransformNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-pink-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"template_transform\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"template_transform\">\n <DocumentTextIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('templateTransformNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"template_transform\">\n {t('templateTransformNode')}\n </NodeCardBadge>\n {config.outputVariable && (\n <NodeCardBadge tone=\"template_transform\" soft>\n {config.outputVariable}\n </NodeCardBadge>\n )}\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-pink-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { ArrowPathIcon } from '@heroicons/react/24/outline'\nimport type { IterationNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const IterationFlowNode = memo(function IterationFlowNode({ id, data, selected }: { id: string; data: IterationNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-indigo-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"iteration\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"iteration\">\n <ArrowPathIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('iterationNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"iteration\">\n {t('iterationNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"iteration\" soft>\n {t('maxIterations')}: {config?.maxIterations ?? 10}\n </NodeCardBadge>\n {config?.iteratorVariable && (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {config.iteratorVariable}\n </span>\n )}\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-indigo-500\" />\n <WorkflowHandle type=\"source\" position={Position.Bottom} id=\"loop-out\" colorClass=\"!bg-violet-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { BookOpenIcon } from '@heroicons/react/24/outline'\nimport type { KnowledgeBaseNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const KnowledgeBaseFlowNode = memo(function KnowledgeBaseFlowNode({ id, data, selected }: { id: string; data: KnowledgeBaseNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-emerald-500\" />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"knowledge_base\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"knowledge_base\">\n <BookOpenIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('knowledgeBaseNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"knowledge_base\">\n {t('knowledgeBaseNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"knowledge_base\" soft>\n {t('topK')}: {config.topK}\n </NodeCardBadge>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {t('similarity')}: {config.similarityThreshold}\n </span>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-emerald-500\" />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { ChatBubbleLeftRightIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { AnswerNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const AnswerFlowNode = memo(function AnswerFlowNode({ id, data, selected }: { id: string; data: AnswerNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const variableCount = config?.outputVariables?.length ?? 0\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass={LOGIC_NODE_HANDLE_COLORS.answer} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"answer\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"answer\">\n <ChatBubbleLeftRightIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('answerNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"answer\">\n {t('answerNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"answer\" soft>\n {t('variables')}: {variableCount}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { QuestionMarkCircleIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { QuestionClassifierNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowDynamicHandles, WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const QuestionClassifierFlowNode = memo(function QuestionClassifierFlowNode({ id, data, selected }: { id: string; data: QuestionClassifierNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const categoryCount = config?.categories?.length ?? 0\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass={LOGIC_NODE_HANDLE_COLORS.question_classifier} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"question_classifier\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"question_classifier\">\n <QuestionMarkCircleIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('questionClassifierNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"question_classifier\">\n {t('questionClassifierNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"question_classifier\" soft>\n {t('categories')}: {categoryCount}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n {/* Dynamic output handles — one per category */}\n <WorkflowDynamicHandles\n count={categoryCount}\n idPrefix=\"category\"\n type=\"source\"\n position={Position.Right}\n colorClass={LOGIC_NODE_HANDLE_COLORS.question_classifier}\n keyIds={(config?.categories ?? []).map((category) => category.id)}\n />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { AdjustmentsVerticalIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { ParameterExtractorNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const ParameterExtractorFlowNode = memo(function ParameterExtractorFlowNode({ id, data, selected }: { id: string; data: ParameterExtractorNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const parameterCount = config?.parameters?.length ?? 0\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass={LOGIC_NODE_HANDLE_COLORS.parameter_extractor} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"parameter_extractor\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"parameter_extractor\">\n <AdjustmentsVerticalIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('parameterExtractorNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"parameter_extractor\">\n {t('parameterExtractorNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"parameter_extractor\" soft>\n {t('parameters')}: {parameterCount}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass={LOGIC_NODE_HANDLE_COLORS.parameter_extractor} />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { ArrowsRightLeftIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { VariableAssignerNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowDynamicTargetHandles, WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const VariableAssignerFlowNode = memo(function VariableAssignerFlowNode({ id, data, selected }: { id: string; data: VariableAssignerNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const assignmentCount = config?.assignments?.length ?? 0\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n {/* Dynamic input handles — one per assignment */}\n <WorkflowDynamicTargetHandles count={assignmentCount} idPrefix=\"assignment\" colorClass={LOGIC_NODE_HANDLE_COLORS.variable_assigner} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"variable_assigner\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"variable_assigner\">\n <ArrowsRightLeftIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('variableAssignerNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"variable_assigner\">\n {t('variableAssignerNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"variable_assigner\" soft>\n {t('assignments')}: {assignmentCount}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass={LOGIC_NODE_HANDLE_COLORS.variable_assigner} />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { Square3Stack3DIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { VariableAggregatorNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowDynamicTargetHandles, WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const VariableAggregatorFlowNode = memo(function VariableAggregatorFlowNode({ id, data, selected }: { id: string; data: VariableAggregatorNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const inputCount = config?.inputVariables?.length ?? 1\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n {/* Dynamic input handles — one per input variable */}\n <WorkflowDynamicTargetHandles count={inputCount} idPrefix=\"input\" colorClass={LOGIC_NODE_HANDLE_COLORS.variable_aggregator} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"variable_aggregator\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"variable_aggregator\">\n <Square3Stack3DIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('variableAggregatorNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"variable_aggregator\">\n {t('variableAggregatorNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"variable_aggregator\" soft>\n {t('inputs')}: {inputCount}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass={LOGIC_NODE_HANDLE_COLORS.variable_aggregator} />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { DocumentMagnifyingGlassIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { DocumentExtractorNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const DocumentExtractorFlowNode = memo(function DocumentExtractorFlowNode({ id, data, selected }: { id: string; data: DocumentExtractorNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const extractionMode = config.extractionMode\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass={LOGIC_NODE_HANDLE_COLORS.document_extractor} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"document_extractor\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"document_extractor\">\n <DocumentMagnifyingGlassIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('documentExtractorNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"document_extractor\">\n {t('documentExtractorNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"document_extractor\" soft>\n {extractionMode}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass={LOGIC_NODE_HANDLE_COLORS.document_extractor} />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { ListBulletIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { ListOperatorNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const ListOperatorFlowNode = memo(function ListOperatorFlowNode({ id, data, selected }: { id: string; data: ListOperatorNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const operationName = config.operation\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass={LOGIC_NODE_HANDLE_COLORS.list_operator} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"list_operator\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"list_operator\">\n <ListBulletIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('listOperatorNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"list_operator\">\n {t('listOperatorNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"list_operator\" soft>\n {operationName}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass={LOGIC_NODE_HANDLE_COLORS.list_operator} />\n </>\n )\n})\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { PlayCircleIcon } from '@heroicons/react/24/outline'\nimport { LOGIC_NODE_HANDLE_COLORS } from '../../constants/workflow-constants'\nimport type { IterationStartNodeData } from '../../types'\nimport { NodeCardBadge, NodeCardDeleteAction, NodeCardHeader, NodeCardMeta, NodeIconBubble, NodeInteractiveCard } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\nexport const IterationStartFlowNode = memo(function IterationStartFlowNode({ id, data, selected }: { id: string; data: IterationStartNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config, label, onDelete, onEdit } = data\n const isCompact = data.displayMode === 'compact'\n const iteratorVariable = config.iteratorVariable\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass={LOGIC_NODE_HANDLE_COLORS.iteration_start} />\n\n <NodeInteractiveCard\n nodeId={id}\n onEdit={onEdit}\n compact={isCompact}\n selected={selected}\n nodeType=\"iteration_start\"\n width=\"w-[240px]\"\n >\n <NodeCardHeader\n icon={\n <NodeIconBubble tone=\"iteration_start\">\n <PlayCircleIcon className=\"h-5 w-5 text-white\" />\n </NodeIconBubble>\n }\n title={label}\n description={t('iterationStartNodeDescription')}\n compact={isCompact}\n iconClassName=\"\"\n />\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex items-center gap-2\">\n <NodeCardBadge tone=\"iteration_start\">\n {t('iterationStartNode')}\n </NodeCardBadge>\n <NodeCardBadge tone=\"iteration_start\" soft>\n {iteratorVariable || t('noVariable')}\n </NodeCardBadge>\n </div>\n <NodeCardDeleteAction nodeId={id} onDelete={onDelete} />\n </NodeCardMeta>\n </NodeInteractiveCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass={LOGIC_NODE_HANDLE_COLORS.iteration_start} />\n </>\n )\n})\n","import { memo, useState, useCallback, useRef } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { PencilSquareIcon } from '@heroicons/react/24/outline'\nimport type { NoteNodeData } from '../../types'\nimport { getNodeStateClass } from '../../constants'\n\nconst NOTE_BACKGROUND_COLORS: Record<string, { light: string; dark: string }> = {\n yellow: { light: 'bg-yellow-50', dark: 'dark:bg-yellow-900/30' },\n blue: { light: 'bg-blue-50', dark: 'dark:bg-blue-900/30' },\n green: { light: 'bg-green-50', dark: 'dark:bg-green-900/30' },\n pink: { light: 'bg-pink-50', dark: 'dark:bg-pink-900/30' },\n purple: { light: 'bg-purple-50', dark: 'dark:bg-purple-900/30' },\n}\n\nconst NOTE_BORDER_COLORS: Record<string, string> = {\n yellow: 'border-yellow-300/60 dark:border-yellow-600/40',\n blue: 'border-blue-300/60 dark:border-blue-600/40',\n green: 'border-green-300/60 dark:border-green-600/40',\n pink: 'border-pink-300/60 dark:border-pink-600/40',\n purple: 'border-purple-300/60 dark:border-purple-600/40',\n}\n\nconst NOTE_ICON_COLORS: Record<string, string> = {\n yellow: 'text-yellow-600 dark:text-yellow-400',\n blue: 'text-blue-600 dark:text-blue-400',\n green: 'text-green-600 dark:text-green-400',\n pink: 'text-pink-600 dark:text-pink-400',\n purple: 'text-purple-600 dark:text-purple-400',\n}\n\nexport const NoteFlowNode = memo(function NoteFlowNode({ data, selected }: { id: string; data: NoteNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { config } = data\n const [isEditing, setIsEditing] = useState(false)\n const [noteText, setNoteText] = useState(config.text)\n const textareaReference = useRef<HTMLTextAreaElement>(null)\n\n const noteColor = config.color || 'yellow'\n const noteWidth = config.width || 200\n const noteHeight = config.height || 150\n\n const backgroundColors = NOTE_BACKGROUND_COLORS[noteColor] || NOTE_BACKGROUND_COLORS.yellow\n const borderColor = NOTE_BORDER_COLORS[noteColor] || NOTE_BORDER_COLORS.yellow\n const iconColor = NOTE_ICON_COLORS[noteColor] || NOTE_ICON_COLORS.yellow\n\n const handleDoubleClick = useCallback(() => {\n setIsEditing(true)\n requestAnimationFrame(() => {\n textareaReference.current?.focus()\n })\n }, [])\n\n const handleBlur = useCallback(() => {\n setIsEditing(false)\n }, [])\n\n const handleTextChange = useCallback((event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setNoteText(event.target.value)\n }, [])\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Escape') {\n setIsEditing(false)\n textareaReference.current?.blur()\n }\n }, [])\n\n return (\n <div\n className={`${getNodeStateClass(selected, 'note')} ${isEditing ? 'nodrag nopan' : ''} relative rounded-xl border ${borderColor} ${backgroundColors.light} ${backgroundColors.dark} p-3 shadow-sm transition-all`}\n style={{ width: noteWidth, minHeight: noteHeight }}\n onDoubleClick={handleDoubleClick}\n >\n {/* Note icon header */}\n <div className=\"mb-2 flex items-center gap-1.5\">\n <PencilSquareIcon className={`h-3.5 w-3.5 ${iconColor}`} />\n <span className={`text-[10px] font-medium ${iconColor}`}>{t('noteNode')}</span>\n </div>\n\n {/* Editable text area */}\n {isEditing ? (\n <textarea\n ref={textareaReference}\n value={noteText}\n onChange={handleTextChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n className=\"w-full resize-none border-none bg-transparent text-xs text-gray-700 outline-none placeholder:text-gray-400 dark:text-gray-200 dark:placeholder:text-gray-500\"\n style={{ minHeight: noteHeight - 40 }}\n placeholder={t('noteNodeDescription')}\n />\n ) : (\n <p\n className=\"cursor-text whitespace-pre-wrap text-xs text-gray-700 dark:text-gray-200\"\n style={{ minHeight: noteHeight - 40 }}\n >\n {noteText || (\n <span className=\"italic text-gray-400 dark:text-gray-500\">{t('noteNodeDescription')}</span>\n )}\n </p>\n )}\n </div>\n )\n})\n","import { memo, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position, NodeResizer } from '@xyflow/react'\nimport {\n RectangleGroupIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n TrashIcon,\n} from '@heroicons/react/24/outline'\nimport type { GroupNodeData } from '../../types'\nimport { getNodeStateClass } from '../../constants'\nimport { NodeCard } from './node-card'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\ntype GroupColorScheme = {\n border: string\n header: string\n bg: string\n text: string\n resizerLine: string\n headerBg: string\n headerBorder: string\n iconText: string\n}\n\nconst GROUP_COLORS: Record<string, GroupColorScheme> = {\n indigo: {\n border: 'border-indigo-300/50 dark:border-indigo-600/50',\n header: 'from-indigo-400 to-indigo-500',\n bg: 'bg-indigo-50/30 dark:bg-indigo-950/20',\n text: 'text-indigo-700 dark:text-indigo-300',\n resizerLine: '#818cf8',\n headerBg: 'bg-indigo-500/15 dark:bg-indigo-400/15',\n headerBorder: 'border-b border-indigo-200/40 dark:border-indigo-500/20',\n iconText: 'text-indigo-600 dark:text-indigo-400',\n },\n teal: {\n border: 'border-teal-300/50 dark:border-teal-600/50',\n header: 'from-teal-400 to-teal-500',\n bg: 'bg-teal-50/30 dark:bg-teal-950/20',\n text: 'text-teal-700 dark:text-teal-300',\n resizerLine: '#2dd4bf',\n headerBg: 'bg-teal-500/15 dark:bg-teal-400/15',\n headerBorder: 'border-b border-teal-200/40 dark:border-teal-500/20',\n iconText: 'text-teal-600 dark:text-teal-400',\n },\n amber: {\n border: 'border-amber-300/50 dark:border-amber-600/50',\n header: 'from-amber-400 to-amber-500',\n bg: 'bg-amber-50/30 dark:bg-amber-950/20',\n text: 'text-amber-700 dark:text-amber-300',\n resizerLine: '#fbbf24',\n headerBg: 'bg-amber-500/15 dark:bg-amber-400/15',\n headerBorder: 'border-b border-amber-200/40 dark:border-amber-500/20',\n iconText: 'text-amber-600 dark:text-amber-400',\n },\n rose: {\n border: 'border-rose-300/50 dark:border-rose-600/50',\n header: 'from-rose-400 to-rose-500',\n bg: 'bg-rose-50/30 dark:bg-rose-950/20',\n text: 'text-rose-700 dark:text-rose-300',\n resizerLine: '#fb7185',\n headerBg: 'bg-rose-500/15 dark:bg-rose-400/15',\n headerBorder: 'border-b border-rose-200/40 dark:border-rose-500/20',\n iconText: 'text-rose-600 dark:text-rose-400',\n },\n slate: {\n border: 'border-slate-300/50 dark:border-slate-600/50',\n header: 'from-slate-400 to-gray-500',\n bg: 'bg-slate-50/30 dark:bg-slate-950/20',\n text: 'text-slate-700 dark:text-slate-300',\n resizerLine: '#94a3b8',\n headerBg: 'bg-slate-500/15 dark:bg-slate-400/15',\n headerBorder: 'border-b border-slate-200/40 dark:border-slate-500/20',\n iconText: 'text-slate-600 dark:text-slate-400',\n },\n}\n\nexport const GroupFlowNode = memo(function GroupFlowNode({ id, data, selected }: { id: string; data: GroupNodeData; selected?: boolean }) {\n const translations = useTranslations('agents.workflow')\n const { config, label, onEdit, onToggleExpand, onRemoveFromCanvas } = data\n const colorScheme = GROUP_COLORS[config.color] ?? GROUP_COLORS.slate\n\n const handleToggleExpand = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n onToggleExpand?.(id)\n },\n [id, onToggleExpand]\n )\n\n const handleRemove = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n onRemoveFromCanvas?.(id)\n },\n [id, onRemoveFromCanvas]\n )\n\n const handleDoubleClick = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation()\n onEdit?.(id)\n },\n [id, onEdit]\n )\n\n if (!config.isExpanded) {\n // Collapsed: compact single-node representation\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-slate-500\" />\n\n <NodeCard selected={selected} nodeType=\"group\" customBorder={colorScheme.border} className=\"cursor-pointer text-left\" onDoubleClick={handleDoubleClick}>\n <div className=\"flex items-start gap-3\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${colorScheme.header} shadow-lg`}>\n <RectangleGroupIcon className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{label}</h3>\n <p className=\"mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400\">\n {config.description || translations('groupNodeDescription')}\n </p>\n </div>\n </div>\n\n <div className=\"mt-2 flex items-center justify-between\">\n <span className={`inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-semibold ${colorScheme.text} dark:bg-slate-500/20`}>\n {translations('groupNode')}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={handleToggleExpand}\n className=\"nodrag nopan rounded-lg p-1 opacity-0 transition hover:bg-gray-100 group-hover:opacity-100 dark:hover:bg-white/10\"\n title={translations('expandGroup')}\n >\n <ChevronDownIcon className=\"h-3.5 w-3.5 text-gray-500 dark:text-gray-400\" />\n </button>\n {onRemoveFromCanvas && (\n <button\n type=\"button\"\n onClick={handleRemove}\n className=\"nodrag nopan rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n title={translations('deleteGroup')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </button>\n )}\n </div>\n </div>\n </NodeCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-slate-500\" />\n </>\n )\n }\n\n // Expanded: full resizable container\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <NodeResizer\n minWidth={280}\n minHeight={200}\n isVisible={selected}\n lineStyle={{ borderColor: 'transparent' }}\n handleStyle={{ width: 8, height: 8, borderRadius: 4, backgroundColor: colorScheme.resizerLine, border: `2px solid rgba(255,255,255,0.5)` }}\n />\n\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-slate-500\" />\n\n <div\n className={`group relative h-full w-full overflow-hidden rounded-xl border liquid-surface ${getNodeStateClass(selected, undefined, colorScheme.border)} transition-all`}\n style={{ minWidth: config.width, minHeight: config.height }}\n >\n {/* Frosted glass header bar */}\n <div\n className={`nodrag nopan flex cursor-default items-center gap-2 rounded-t-xl backdrop-blur-xl ${colorScheme.headerBg} ${colorScheme.headerBorder} px-3 py-2`}\n onDoubleClick={handleDoubleClick}\n >\n <RectangleGroupIcon className={`h-4 w-4 ${colorScheme.iconText}`} />\n <div className=\"min-w-0 flex-1\">\n <span className={`block truncate text-xs font-semibold ${colorScheme.text}`}>{label}</span>\n {config.description && (\n <span className=\"block truncate text-[10px] text-gray-500 dark:text-gray-400\">{config.description}</span>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleToggleExpand}\n className=\"nopan rounded-md p-0.5 transition hover:bg-black/5 dark:hover:bg-white/10\"\n title={translations('collapseGroup')}\n >\n <ChevronUpIcon className={`h-3.5 w-3.5 ${colorScheme.iconText}`} />\n </button>\n {onRemoveFromCanvas && (\n <button\n type=\"button\"\n onClick={handleRemove}\n className=\"nopan rounded-md p-0.5 transition hover:bg-red-500/10 dark:hover:bg-red-400/10\"\n title={translations('deleteGroup')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </button>\n )}\n </div>\n\n {/* Child area — React Flow renders children with parentId automatically */}\n <div className=\"relative h-[calc(100%-36px)] w-full\" />\n </div>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-slate-500\" />\n </>\n )\n})\n","import * as Headless from '@headlessui/react'\nimport NextLink, { type LinkProps } from 'next/link'\nimport React, { forwardRef } from 'react'\n\nexport const Link = forwardRef(function Link(\n props: LinkProps & React.ComponentPropsWithoutRef<'a'>,\n ref: React.ForwardedRef<HTMLAnchorElement>\n) {\n return (\n <Headless.DataInteractive>\n <NextLink {...props} ref={ref} />\n </Headless.DataInteractive>\n )\n})\n","import { Button as HeadlessButton, type ButtonProps as HeadlessButtonProps } from '@headlessui/react'\nimport clsx from 'clsx'\nimport React, { forwardRef } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Link } from '@ui/components/link'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\nimport { springPresets, getTransition } from '@ui/lib/animations'\nimport {\n iosColors,\n sizeStyles,\n pillStyles,\n styles,\n fabSizes,\n fabIconSizes,\n fabPositions,\n fabColors,\n iconButtonSizes,\n iconSizes,\n type ColorType,\n type SizeType,\n type FABColorType,\n type FABPositionType,\n type FABSizeType,\n type IconButtonSizeType,\n} from '@ui/components/button-styles'\n\ntype ButtonProps = (\n | { color?: ColorType; outline?: never; plain?: never; gradient?: never }\n | { color?: never; outline: true; plain?: never; gradient?: never }\n | { color?: never; outline?: never; plain: true; gradient?: never }\n | { color?: never; outline?: never; plain?: never; gradient: true }\n) & {\n className?: string\n children: React.ReactNode\n /** Make button pill-shaped (fully rounded) */\n pill?: boolean\n /** Button size */\n size?: SizeType\n /** Show loading spinner */\n loading?: boolean\n /** Loading text (optional) */\n loadingText?: string\n /** Full width button */\n fullWidth?: boolean\n /** Destructive action (uses iOS red) */\n destructive?: boolean\n} & (\n | ({ href?: never } & Omit<HeadlessButtonProps, 'as' | 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n )\n\nexport const Button = forwardRef(function Button(\n {\n color,\n outline,\n plain,\n gradient,\n className,\n children,\n pill,\n size = 'md',\n loading,\n loadingText,\n fullWidth,\n destructive,\n disabled,\n ...props\n }: ButtonProps & { disabled?: boolean },\n ref: React.ForwardedRef<HTMLElement>\n) {\n // Determine final color - destructive overrides color\n const finalColor = destructive ? 'ios-red' : color\n\n // Check if using iOS color\n const isIosColor = finalColor && finalColor in iosColors\n const colorStyles = isIosColor\n ? iosColors[finalColor as keyof typeof iosColors]\n : styles.colors[finalColor as keyof typeof styles.colors] ?? styles.colors['dark/zinc']\n\n let classes = clsx(\n className,\n styles.base,\n gradient ? styles.gradient : outline ? styles.outline : plain ? styles.plain : clsx(styles.solid, colorStyles),\n pill && pillStyles,\n size !== 'md' && sizeStyles[size],\n fullWidth && 'w-full',\n loading && 'pointer-events-none'\n )\n\n const handleTapStart = () => {\n if (!loading && !disabled) {\n triggerHaptic(destructive ? 'medium' : 'light')\n }\n }\n\n const isDisabled = disabled || loading\n\n const buttonContent = (\n <>\n <AnimatePresence mode=\"wait\">\n {loading && (\n <motion.span\n initial={{ opacity: 0, width: 0 }}\n animate={{ opacity: 1, width: 'auto' }}\n exit={{ opacity: 0, width: 0 }}\n transition={getTransition(springPresets.stiff)}\n className=\"inline-flex items-center\"\n >\n <LoadingSpinner className=\"mr-2\" />\n </motion.span>\n )}\n </AnimatePresence>\n <span className={clsx('inline-flex items-center gap-x-2', loading && 'opacity-70')}>\n {loading && loadingText ? loadingText : children}\n </span>\n </>\n )\n\n const linkProps = props as Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>\n const buttonProps = props as Omit<HeadlessButtonProps, 'className'>\n\n const isLink = typeof props.href === 'string'\n\n return isLink ? (\n <motion.div\n whileTap={!isDisabled ? { scale: 0.97 } : undefined}\n transition={getTransition(springPresets.stiff)}\n onTapStart={handleTapStart}\n className={clsx('inline-flex', fullWidth && 'w-full')}\n >\n <Link\n {...linkProps}\n className={classes}\n ref={ref as React.ForwardedRef<HTMLAnchorElement>}\n >\n <TouchTarget>{buttonContent}</TouchTarget>\n </Link>\n </motion.div>\n ) : (\n <motion.div\n whileTap={!isDisabled ? { scale: 0.97 } : undefined}\n transition={getTransition(springPresets.stiff)}\n onTapStart={handleTapStart}\n className={clsx('inline-flex', fullWidth && 'w-full')}\n >\n <HeadlessButton\n {...buttonProps}\n disabled={isDisabled}\n className={clsx(classes, 'cursor-default')}\n ref={ref}\n >\n <TouchTarget>{buttonContent}</TouchTarget>\n </HeadlessButton>\n </motion.div>\n )\n})\n\n/**\n * Expand the hit area to at least 44×44px on touch devices\n */\nexport function TouchTarget({ children }: { children: React.ReactNode }) {\n return (\n <>\n <span\n className=\"absolute top-1/2 left-1/2 size-[max(100%,2.75rem)] -translate-x-1/2 -translate-y-1/2 pointer-fine:hidden\"\n aria-hidden=\"true\"\n />\n {children}\n </>\n )\n}\n\n/**\n * Loading spinner for button loading state\n */\nfunction LoadingSpinner({ className }: { className?: string }) {\n return (\n <svg\n className={clsx('h-4 w-4 animate-spin', className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )\n}\n\n/**\n * Floating Action Button (FAB) - iOS style\n * Fixed position button typically in bottom-right corner\n */\ntype FABProps = {\n /** Icon to display */\n icon: React.ReactNode\n /** Optional label (shows on hover/focus) */\n label?: string\n /** Button color */\n color?: FABColorType\n /** Size variant */\n size?: FABSizeType\n /** Position on screen */\n position?: FABPositionType\n /** Click handler */\n onClick?: () => void\n /** Show loading state */\n loading?: boolean\n /** Custom class */\n className?: string\n /** Extended FAB with label always visible */\n extended?: boolean\n}\n\nexport function FloatingActionButton({\n icon,\n label,\n color = 'ios-blue',\n size = 'md',\n position = 'bottom-right',\n onClick,\n loading,\n className,\n extended,\n}: FABProps) {\n const handleClick = () => {\n if (!loading) {\n triggerHaptic('medium')\n onClick?.()\n }\n }\n\n return (\n <motion.button\n onClick={handleClick}\n disabled={loading}\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n transition={getTransition(springPresets.bouncy)}\n className={clsx(\n fabPositions[position],\n extended ? 'px-5 h-14 rounded-full' : clsx(fabSizes[size], 'rounded-full'),\n fabColors[color],\n 'flex items-center justify-center gap-2',\n 'shadow-lg hover:shadow-xl',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[#007AFF]',\n 'z-50',\n loading && 'opacity-70 cursor-not-allowed',\n className\n )}\n aria-label={label}\n >\n {loading ? (\n <LoadingSpinner className={fabIconSizes[size]} />\n ) : (\n <span className={fabIconSizes[size]}>{icon}</span>\n )}\n {extended && label && (\n <span className=\"font-semibold text-base\">{label}</span>\n )}\n </motion.button>\n )\n}\n\n/**\n * Icon Button - Compact button with just an icon\n */\ntype IconButtonProps = {\n icon: React.ReactNode\n label: string // Required for accessibility\n color?: ColorType\n size?: IconButtonSizeType\n variant?: 'solid' | 'ghost' | 'outline'\n onClick?: () => void\n disabled?: boolean\n loading?: boolean\n className?: string\n destructive?: boolean\n}\n\nexport function IconButton({\n icon,\n label,\n color = 'ios-blue',\n size = 'md',\n variant = 'ghost',\n onClick,\n disabled,\n loading,\n className,\n destructive,\n}: IconButtonProps) {\n const finalColor = destructive ? 'ios-red' : color\n const isIosColor = finalColor in iosColors\n\n const handleClick = () => {\n if (!disabled && !loading) {\n triggerHaptic(destructive ? 'medium' : 'light')\n onClick?.()\n }\n }\n\n const variantStyles = {\n solid: clsx(\n 'text-white',\n isIosColor && finalColor === 'ios-blue' && 'bg-[#007AFF] dark:bg-[#0A84FF]',\n isIosColor && finalColor === 'ios-red' && 'bg-[#FF3B30] dark:bg-[#FF453A]',\n isIosColor && finalColor === 'ios-green' && 'bg-[#34C759] dark:bg-[#30D158]',\n isIosColor && finalColor === 'ios-orange' && 'bg-[#FF9500] dark:bg-[#FF9F0A]',\n isIosColor && finalColor === 'ios-purple' && 'bg-[#AF52DE] dark:bg-[#BF5AF2]',\n ),\n ghost: clsx(\n 'bg-transparent hover:bg-gray-100 dark:hover:bg-gray-800',\n isIosColor && finalColor === 'ios-blue' && 'text-[#007AFF] dark:text-[#0A84FF]',\n isIosColor && finalColor === 'ios-red' && 'text-[#FF3B30] dark:text-[#FF453A]',\n isIosColor && finalColor === 'ios-green' && 'text-[#34C759] dark:text-[#30D158]',\n isIosColor && finalColor === 'ios-orange' && 'text-[#FF9500] dark:text-[#FF9F0A]',\n isIosColor && finalColor === 'ios-purple' && 'text-[#AF52DE] dark:text-[#BF5AF2]',\n ),\n outline: clsx(\n 'bg-transparent border',\n isIosColor && finalColor === 'ios-blue' && 'border-[#007AFF] text-[#007AFF] dark:border-[#0A84FF] dark:text-[#0A84FF]',\n isIosColor && finalColor === 'ios-red' && 'border-[#FF3B30] text-[#FF3B30] dark:border-[#FF453A] dark:text-[#FF453A]',\n isIosColor && finalColor === 'ios-green' && 'border-[#34C759] text-[#34C759] dark:border-[#30D158] dark:text-[#30D158]',\n isIosColor && finalColor === 'ios-orange' && 'border-[#FF9500] text-[#FF9500] dark:border-[#FF9F0A] dark:text-[#FF9F0A]',\n isIosColor && finalColor === 'ios-purple' && 'border-[#AF52DE] text-[#AF52DE] dark:border-[#BF5AF2] dark:text-[#BF5AF2]',\n ),\n }\n\n return (\n <motion.button\n onClick={handleClick}\n disabled={disabled || loading}\n whileTap={{ scale: 0.9 }}\n transition={getTransition(springPresets.stiff)}\n className={clsx(\n iconButtonSizes[size],\n 'rounded-full flex items-center justify-center',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[#007AFF]',\n 'transition-colors',\n variantStyles[variant],\n (disabled || loading) && 'opacity-50 cursor-not-allowed',\n className\n )}\n aria-label={label}\n >\n {loading ? (\n <LoadingSpinner className={iconSizes[size]} />\n ) : (\n <span className={iconSizes[size]}>{icon}</span>\n )}\n </motion.button>\n )\n}\n","/**\n * iOS-style animation presets for Framer Motion\n * Based on Apple Human Interface Guidelines\n * Includes reduced motion support for accessibility\n */\n\nimport type { Transition, Variants } from 'framer-motion'\n\n// ============================================================================\n// Reduced Motion Detection\n// ============================================================================\n\n/**\n * Check if user prefers reduced motion\n * Use this to conditionally disable animations\n */\nexport function prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/**\n * Get a transition that respects reduced motion preference\n */\nexport function getTransition(transition: Transition): Transition {\n if (prefersReducedMotion()) {\n return { duration: 0 }\n }\n return transition\n}\n\n/**\n * Get variants that respect reduced motion preference\n */\nexport function getVariants(variants: Variants): Variants {\n if (prefersReducedMotion()) {\n // Return variants with instant transitions\n const reducedVariants: Variants = {}\n for (const key in variants) {\n reducedVariants[key] = {\n ...variants[key],\n transition: { duration: 0 },\n }\n }\n return reducedVariants\n }\n return variants\n}\n\n// ============================================================================\n// Spring Presets\n// ============================================================================\n\nexport const springPresets = {\n /** Default iOS spring - balanced and smooth */\n default: { type: 'spring', stiffness: 300, damping: 30 } as Transition,\n\n /** Bouncy spring - more playful, good for icons */\n bouncy: { type: 'spring', stiffness: 400, damping: 25 } as Transition,\n\n /** Stiff spring - snappy, good for buttons */\n stiff: { type: 'spring', stiffness: 500, damping: 35 } as Transition,\n\n /** Gentle spring - slow and smooth, good for modals */\n gentle: { type: 'spring', stiffness: 200, damping: 20 } as Transition,\n\n /** Sheet spring - iOS sheet presentation */\n sheet: { type: 'spring', stiffness: 350, damping: 30, mass: 0.8 } as Transition,\n\n /** Quick spring - very fast, good for micro-interactions */\n quick: { type: 'spring', stiffness: 600, damping: 40 } as Transition,\n}\n\n/** Spring presets with reduced motion fallback (instant) */\nexport const springPresetsReduced = {\n default: prefersReducedMotion() ? { duration: 0 } : springPresets.default,\n bouncy: prefersReducedMotion() ? { duration: 0 } : springPresets.bouncy,\n stiff: prefersReducedMotion() ? { duration: 0 } : springPresets.stiff,\n gentle: prefersReducedMotion() ? { duration: 0 } : springPresets.gentle,\n sheet: prefersReducedMotion() ? { duration: 0 } : springPresets.sheet,\n quick: prefersReducedMotion() ? { duration: 0 } : springPresets.quick,\n}\n\n// ============================================================================\n// Button Animations\n// ============================================================================\n\nexport const buttonPress: Variants = {\n idle: { scale: 1 },\n pressed: { scale: 0.97 },\n hover: { scale: 1.02 },\n}\n\nexport const buttonTap = {\n scale: 0.97,\n transition: springPresets.stiff,\n}\n\n/** Reduced motion version - no scale animation */\nexport const buttonPressReduced: Variants = {\n idle: { opacity: 1 },\n pressed: { opacity: 0.7 },\n hover: { opacity: 0.9 },\n}\n\n// ============================================================================\n// Card Animations\n// ============================================================================\n\nexport const cardHover: Variants = {\n idle: {\n y: 0,\n boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)'\n },\n hover: {\n y: -4,\n boxShadow: '0 20px 25px -5px rgb(0 0 0 / 0.1)'\n },\n}\n\nexport const cardPress: Variants = {\n idle: { scale: 1 },\n pressed: { scale: 0.98 },\n}\n\n/** Reduced motion version - opacity only */\nexport const cardHoverReduced: Variants = {\n idle: { opacity: 1 },\n hover: { opacity: 0.95 },\n}\n\n// ============================================================================\n// Modal/Sheet Animations\n// ============================================================================\n\nexport const slideUp: Variants = {\n hidden: { y: '100%', opacity: 0 },\n visible: { y: 0, opacity: 1 },\n exit: { y: '100%', opacity: 0 },\n}\n\nexport const slideRight: Variants = {\n hidden: { x: '100%', opacity: 0 },\n visible: { x: 0, opacity: 1 },\n exit: { x: '100%', opacity: 0 },\n}\n\nexport const slideDown: Variants = {\n hidden: { y: '-100%', opacity: 0 },\n visible: { y: 0, opacity: 1 },\n exit: { y: '-100%', opacity: 0 },\n}\n\nexport const fadeScale: Variants = {\n hidden: { opacity: 0, scale: 0.95 },\n visible: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.95 },\n}\n\n/** Reduced motion - fade only, no movement */\nexport const fadeOnly: Variants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n exit: { opacity: 0 },\n}\n\n// ============================================================================\n// Notification Animations\n// ============================================================================\n\nexport const notificationBanner: Variants = {\n hidden: { y: -100, opacity: 0, scale: 0.9 },\n visible: {\n y: 0,\n opacity: 1,\n scale: 1,\n transition: springPresets.bouncy,\n },\n exit: {\n y: -100,\n opacity: 0,\n scale: 0.9,\n transition: { duration: 0.2 },\n },\n}\n\n/** Reduced motion version */\nexport const notificationBannerReduced: Variants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1, transition: { duration: 0.15 } },\n exit: { opacity: 0, transition: { duration: 0.1 } },\n}\n\n// ============================================================================\n// List Item Animations\n// ============================================================================\n\nexport const listItem: Variants = {\n hidden: { opacity: 0, x: -20 },\n visible: (i: number) => ({\n opacity: 1,\n x: 0,\n transition: {\n delay: i * 0.05,\n ...springPresets.default,\n },\n }),\n}\n\nexport const staggerContainer: Variants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.05,\n },\n },\n}\n\n/** Reduced motion - no stagger, just fade */\nexport const listItemReduced: Variants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1, transition: { duration: 0.15 } },\n}\n\n// ============================================================================\n// Swipe Actions\n// ============================================================================\n\nexport const swipeActionThreshold = 80 // pixels\n\nexport const swipeConstraints = {\n left: -120,\n right: 0,\n}\n\n// ============================================================================\n// Page Control (Pagination Dots)\n// ============================================================================\n\nexport const pageControlDot: Variants = {\n inactive: { width: 8, backgroundColor: 'rgb(156 163 175)' },\n active: { width: 24, backgroundColor: 'rgb(59 130 246)' },\n}\n\n// ============================================================================\n// iOS System Colors\n// ============================================================================\n\nexport const iosColors = {\n // Primary colors\n blue: '#007AFF',\n green: '#34C759',\n red: '#FF3B30',\n orange: '#FF9500',\n yellow: '#FFCC00',\n purple: '#AF52DE',\n pink: '#FF2D55',\n teal: '#5AC8FA',\n indigo: '#5856D6',\n mint: '#00C7BE',\n cyan: '#32ADE6',\n brown: '#A2845E',\n\n // Grays\n gray: '#8E8E93',\n gray2: '#AEAEB2',\n gray3: '#C7C7CC',\n gray4: '#D1D1D6',\n gray5: '#E5E5EA',\n gray6: '#F2F2F7',\n\n // Dark mode variants\n dark: {\n blue: '#0A84FF',\n green: '#30D158',\n red: '#FF453A',\n orange: '#FF9F0A',\n yellow: '#FFD60A',\n purple: '#BF5AF2',\n pink: '#FF375F',\n teal: '#64D2FF',\n indigo: '#5E5CE6',\n mint: '#66D4CF',\n cyan: '#5AC8FA',\n brown: '#AC8E68',\n },\n}\n\n// ============================================================================\n// Duration Presets\n// ============================================================================\n\nexport const durations = {\n instant: 0,\n fast: 0.15,\n normal: 0.25,\n slow: 0.35,\n verySlow: 0.5,\n}\n\n/** Duration presets with reduced motion fallback */\nexport const durationsReduced = {\n instant: 0,\n fast: prefersReducedMotion() ? 0 : 0.15,\n normal: prefersReducedMotion() ? 0 : 0.25,\n slow: prefersReducedMotion() ? 0 : 0.35,\n verySlow: prefersReducedMotion() ? 0 : 0.5,\n}\n\n// ============================================================================\n// Easing Presets\n// ============================================================================\n\nexport const easings = {\n /** Standard ease for most animations */\n default: [0.25, 0.1, 0.25, 1],\n /** Ease out - decelerating */\n out: [0, 0, 0.2, 1],\n /** Ease in - accelerating */\n in: [0.4, 0, 1, 1],\n /** Ease in-out - both */\n inOut: [0.4, 0, 0.2, 1],\n /** iOS-style ease */\n ios: [0.25, 0.46, 0.45, 0.94],\n}\n\n// ============================================================================\n// Utility: Create motion-safe animation props\n// ============================================================================\n\n/**\n * Creates animation props that respect reduced motion preference\n */\nexport function createMotionProps<T extends object>(\n animatedProps: T,\n reducedProps: Partial<T> = {}\n): T {\n if (prefersReducedMotion()) {\n return { ...animatedProps, ...reducedProps, transition: { duration: 0 } }\n }\n return animatedProps\n}\n","/**\n * Button Styles Module\n * ====================\n *\n * Centralized style definitions for all button variants.\n * Extracted from button.tsx for better maintainability.\n */\n\n// iOS System Colors for buttons\nexport const iosColors = {\n // Glassy iOS blue — neutral glass at rest, fills blue on hover\n 'ios-glass-blue': [\n 'liquid-button-primary text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]',\n 'dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]',\n '[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70',\n ],\n // Glassy iOS red — neutral glass at rest, fills red on hover\n 'ios-glass-red': [\n 'liquid-button liquid-button-red text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]',\n 'dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]',\n '[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70',\n ],\n // Glassy iOS green — neutral glass at rest, fills green on hover\n 'ios-glass-green': [\n 'liquid-button liquid-button-green text-slate-900 [--btn-bg:transparent] [--btn-border:transparent] [--btn-hover-overlay:transparent]',\n 'dark:text-white dark:[--btn-bg:transparent] dark:[--btn-border:transparent]',\n '[--btn-icon:var(--color-slate-600)] dark:[--btn-icon:var(--color-white)]/70',\n ],\n // Primary iOS blue\n 'ios-blue': [\n 'text-white [--btn-bg:#007AFF] [--btn-border:#0066DD] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#0A84FF] dark:[--btn-border:#007AFF]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // Destructive iOS red\n 'ios-red': [\n 'text-white [--btn-bg:#FF3B30] [--btn-border:#E6352B] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#FF453A] dark:[--btn-border:#FF3B30]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS green (success/confirm)\n 'ios-green': [\n 'text-white [--btn-bg:#34C759] [--btn-border:#2DB350] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#30D158] dark:[--btn-border:#34C759]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS orange (warning)\n 'ios-orange': [\n 'text-white [--btn-bg:#FF9500] [--btn-border:#E68600] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#FF9F0A] dark:[--btn-border:#FF9500]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS purple\n 'ios-purple': [\n 'text-white [--btn-bg:#AF52DE] [--btn-border:#9B48C7] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#BF5AF2] dark:[--btn-border:#AF52DE]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n // iOS teal\n 'ios-teal': [\n 'text-white [--btn-bg:#5AC8FA] [--btn-border:#4AB8E8] [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-bg:#64D2FF] dark:[--btn-border:#5AC8FA]',\n '[--btn-icon:var(--color-white)]/80',\n ],\n}\n\n// Size presets\nexport const sizeStyles = {\n xs: 'px-2 py-1 text-xs rounded-md',\n sm: 'px-3 py-1.5 text-sm rounded-lg',\n md: '', // Default size from base styles\n lg: 'px-5 py-3 text-base rounded-xl',\n xl: 'px-6 py-4 text-lg rounded-xl',\n}\n\n// Pill shape modifier\nexport const pillStyles = 'rounded-full'\n\nexport const styles = {\n base: [\n // Base\n 'relative isolate inline-flex items-center justify-center gap-x-2 rounded-lg border text-base/6 font-semibold',\n // Sizing\n 'px-[calc(--spacing(3.5)-1px)] py-[calc(--spacing(2.5)-1px)] sm:px-[calc(--spacing(3)-1px)] sm:py-[calc(--spacing(1.5)-1px)] sm:text-sm/6',\n // Focus\n 'focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',\n // Disabled\n 'data-disabled:opacity-50',\n // Icon\n '*:data-[slot=icon]:-mx-0.5 *:data-[slot=icon]:my-0.5 *:data-[slot=icon]:size-5 *:data-[slot=icon]:shrink-0 *:data-[slot=icon]:self-center *:data-[slot=icon]:text-(--btn-icon) sm:*:data-[slot=icon]:my-1 sm:*:data-[slot=icon]:size-4 forced-colors:[--btn-icon:ButtonText] forced-colors:data-hover:[--btn-icon:ButtonText]',\n ],\n solid: [\n // Optical border, implemented as the button background to avoid corner artifacts\n 'border-transparent bg-(--btn-border)',\n // Dark mode: border is rendered on `after` so background is set to button background\n 'dark:bg-(--btn-bg)',\n // Button background, implemented as foreground layer to stack on top of pseudo-border layer\n 'before:absolute before:inset-0 before:-z-10 before:rounded-[calc(var(--radius-lg)-1px)] before:bg-(--btn-bg)',\n // Drop shadow, applied to the inset `before` layer so it blends with the border\n 'before:shadow-xs',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Dark mode: Subtle white outline is applied using a border\n 'dark:border-white/5',\n // Shim/overlay, inset to match button foreground and used for hover state + highlight shadow\n 'after:absolute after:inset-0 after:-z-10 after:rounded-[calc(var(--radius-lg)-1px)]',\n // Inner highlight shadow\n 'after:shadow-[inset_0_1px_--theme(--color-white/15%)]',\n // White overlay on hover\n 'data-active:after:bg-(--btn-hover-overlay) data-hover:after:bg-(--btn-hover-overlay)',\n // Dark mode: `after` layer expands to cover entire button\n 'dark:after:-inset-px dark:after:rounded-lg',\n // Disabled\n 'data-disabled:before:shadow-none data-disabled:after:shadow-none',\n ],\n outline: [\n // Liquid glass secondary button\n 'liquid-button text-slate-900 !border-white/55',\n // Dark mode\n 'dark:text-white dark:!border-white/18',\n // Icon\n '[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n plain: [\n // Base\n 'border-transparent text-zinc-950 data-active:bg-zinc-950/5 data-hover:bg-zinc-950/5',\n // Dark mode\n 'dark:text-white dark:data-active:bg-white/10 dark:data-hover:bg-white/10',\n // Icon\n '[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n gradient: [\n // Indigo-to-purple gradient background\n 'border-transparent bg-gradient-to-r from-indigo-600 to-purple-600',\n // Hover: slightly darker\n 'data-hover:from-indigo-700 data-hover:to-purple-700',\n // Text\n 'text-white',\n // Shadow\n 'shadow-lg shadow-indigo-500/25',\n // Disabled\n 'data-disabled:from-gray-400 data-disabled:to-gray-500 data-disabled:shadow-none',\n // Icon\n '[--btn-icon:var(--color-white)]/80',\n ],\n colors: {\n 'dark/zinc': [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:text-white dark:[--btn-bg:var(--color-zinc-600)] dark:[--btn-hover-overlay:var(--color-white)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n light: [\n 'text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15',\n 'dark:text-white dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',\n '[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n 'dark/white': [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:text-zinc-950 dark:[--btn-bg:white] dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n dark: [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n white: [\n 'text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15',\n 'dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-500)] data-hover:[--btn-icon:var(--color-zinc-500)]',\n ],\n zinc: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-zinc-600)] [--btn-border:var(--color-zinc-700)]/90',\n 'dark:[--btn-hover-overlay:var(--color-white)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n indigo: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-indigo-500)] [--btn-border:var(--color-indigo-600)]/90',\n '[--btn-icon:var(--color-indigo-300)] data-active:[--btn-icon:var(--color-indigo-200)] data-hover:[--btn-icon:var(--color-indigo-200)]',\n ],\n cyan: [\n 'text-cyan-950 [--btn-bg:var(--color-cyan-300)] [--btn-border:var(--color-cyan-400)]/80 [--btn-hover-overlay:var(--color-white)]/25',\n '[--btn-icon:var(--color-cyan-500)]',\n ],\n red: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-red-600)] [--btn-border:var(--color-red-700)]/90',\n '[--btn-icon:var(--color-red-300)] data-active:[--btn-icon:var(--color-red-200)] data-hover:[--btn-icon:var(--color-red-200)]',\n ],\n orange: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-orange-500)] [--btn-border:var(--color-orange-600)]/90',\n '[--btn-icon:var(--color-orange-300)] data-active:[--btn-icon:var(--color-orange-200)] data-hover:[--btn-icon:var(--color-orange-200)]',\n ],\n amber: [\n 'text-amber-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-amber-400)] [--btn-border:var(--color-amber-500)]/80',\n '[--btn-icon:var(--color-amber-600)]',\n ],\n yellow: [\n 'text-yellow-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-yellow-300)] [--btn-border:var(--color-yellow-400)]/80',\n '[--btn-icon:var(--color-yellow-600)] data-active:[--btn-icon:var(--color-yellow-700)] data-hover:[--btn-icon:var(--color-yellow-700)]',\n ],\n lime: [\n 'text-lime-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-lime-300)] [--btn-border:var(--color-lime-400)]/80',\n '[--btn-icon:var(--color-lime-600)] data-active:[--btn-icon:var(--color-lime-700)] data-hover:[--btn-icon:var(--color-lime-700)]',\n ],\n green: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-green-600)] [--btn-border:var(--color-green-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n emerald: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-emerald-600)] [--btn-border:var(--color-emerald-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n teal: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-teal-600)] [--btn-border:var(--color-teal-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n sky: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-sky-500)] [--btn-border:var(--color-sky-600)]/80',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n blue: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-blue-600)] [--btn-border:var(--color-blue-700)]/90',\n '[--btn-icon:var(--color-blue-400)] data-active:[--btn-icon:var(--color-blue-300)] data-hover:[--btn-icon:var(--color-blue-300)]',\n ],\n violet: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-violet-500)] [--btn-border:var(--color-violet-600)]/90',\n '[--btn-icon:var(--color-violet-300)] data-active:[--btn-icon:var(--color-violet-200)] data-hover:[--btn-icon:var(--color-violet-200)]',\n ],\n purple: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-purple-500)] [--btn-border:var(--color-purple-600)]/90',\n '[--btn-icon:var(--color-purple-300)] data-active:[--btn-icon:var(--color-purple-200)] data-hover:[--btn-icon:var(--color-purple-200)]',\n ],\n fuchsia: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-fuchsia-500)] [--btn-border:var(--color-fuchsia-600)]/90',\n '[--btn-icon:var(--color-fuchsia-300)] data-active:[--btn-icon:var(--color-fuchsia-200)] data-hover:[--btn-icon:var(--color-fuchsia-200)]',\n ],\n pink: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-pink-500)] [--btn-border:var(--color-pink-600)]/90',\n '[--btn-icon:var(--color-pink-300)] data-active:[--btn-icon:var(--color-pink-200)] data-hover:[--btn-icon:var(--color-pink-200)]',\n ],\n rose: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-rose-500)] [--btn-border:var(--color-rose-600)]/90',\n '[--btn-icon:var(--color-rose-300)] data-active:[--btn-icon:var(--color-rose-200)] data-hover:[--btn-icon:var(--color-rose-200)]',\n ],\n },\n}\n\n// FAB-specific styles\nexport const fabSizes = {\n sm: 'h-12 w-12',\n md: 'h-14 w-14',\n lg: 'h-16 w-16',\n}\n\nexport const fabIconSizes = {\n sm: 'h-5 w-5',\n md: 'h-6 w-6',\n lg: 'h-7 w-7',\n}\n\nexport const fabPositions = {\n 'bottom-right': 'fixed bottom-6 right-6',\n 'bottom-left': 'fixed bottom-6 left-6',\n 'bottom-center': 'fixed bottom-6 left-1/2 -translate-x-1/2',\n}\n\nexport const fabColors = {\n 'ios-blue': 'bg-[#007AFF] dark:bg-[#0A84FF] text-white shadow-[#007AFF]/30',\n 'ios-green': 'bg-[#34C759] dark:bg-[#30D158] text-white shadow-[#34C759]/30',\n 'ios-red': 'bg-[#FF3B30] dark:bg-[#FF453A] text-white shadow-[#FF3B30]/30',\n 'ios-purple': 'bg-[#AF52DE] dark:bg-[#BF5AF2] text-white shadow-[#AF52DE]/30',\n 'ios-orange': 'bg-[#FF9500] dark:bg-[#FF9F0A] text-white shadow-[#FF9500]/30',\n}\n\n// IconButton-specific styles\nexport const iconButtonSizes = {\n sm: 'h-8 w-8',\n md: 'h-10 w-10',\n lg: 'h-12 w-12',\n}\n\nexport const iconSizes = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n}\n\n// Type exports\nexport type ColorType = keyof typeof styles.colors | keyof typeof iosColors\nexport type SizeType = keyof typeof sizeStyles\nexport type FABColorType = keyof typeof fabColors\nexport type FABPositionType = keyof typeof fabPositions\nexport type FABSizeType = keyof typeof fabSizes\nexport type IconButtonSizeType = keyof typeof iconButtonSizes\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { motion } from 'framer-motion'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\n// ============================================================================\n// Base Card Components\n// ============================================================================\n\ntype CardProps = HTMLAttributes<HTMLDivElement> & {\n /** Card style variant */\n variant?: \"default\" | \"gradient\" | \"glass\" | \"elevated\"\n /** Enable hover lift animation */\n interactive?: boolean\n /** Enable press animation */\n pressable?: boolean\n /** Click handler (enables pressable automatically) */\n onPress?: () => void\n}\n\nexport function Card({\n className = \"\",\n variant = \"default\",\n interactive = false,\n pressable = false,\n onPress,\n ...props\n}: CardProps) {\n const baseClasses = \"rounded-2xl overflow-hidden\"\n\n const variantClasses = {\n default: \"liquid-surface\",\n gradient: \"liquid-surface bg-gradient-to-br from-white/75 via-white/60 to-sky-50/60 dark:from-slate-800/75 dark:via-slate-900/62 dark:to-slate-950/58\",\n glass: \"liquid-surface-strong\",\n elevated: \"liquid-surface-strong\",\n }\n\n const interactiveClasses = interactive\n ? \"transition-all duration-300 hover:-translate-y-1 hover:shadow-xl cursor-pointer\"\n : \"\"\n\n // If pressable or has onPress, use motion.div with press animation\n if (pressable || onPress) {\n // Omit event handlers that conflict with Framer Motion's event signatures\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, onAnimationEnd, onAnimationIteration, ...restProps } = props\n return (\n <motion.div\n className={`${baseClasses} ${variantClasses[variant]} ${interactiveClasses} ${className}`}\n whileTap={{ scale: 0.98 }}\n whileHover={interactive ? { y: -4, boxShadow: \"0 20px 25px -5px rgb(0 0 0 / 0.1)\" } : undefined}\n transition={{ type: \"spring\", stiffness: 400, damping: 25 }}\n onClick={() => {\n if (onPress) {\n triggerHaptic(\"light\")\n onPress()\n }\n }}\n style={{ cursor: onPress ? \"pointer\" : undefined }}\n {...restProps}\n />\n )\n }\n\n return (\n <div\n className={`${baseClasses} ${variantClasses[variant]} ${interactiveClasses} ${className}`}\n {...props}\n />\n )\n}\n\nexport function CardHeader({ className = \"\", ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={`flex flex-col space-y-1.5 p-4 sm:p-6 ${className}`} {...props} />\n )\n}\n\nexport function CardTitle({ className = \"\", ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3 className={`text-lg font-semibold leading-none tracking-tight text-gray-900 dark:text-white ${className}`} {...props} />\n )\n}\n\nexport function CardDescription({ className = \"\", ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return (\n <p className={`text-sm text-gray-500 dark:text-gray-400 ${className}`} {...props} />\n )\n}\n\nexport function CardContent({ className = \"\", ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={`p-4 sm:p-6 pt-0 ${className}`} {...props} />\n}\n\nexport function CardFooter({ className = \"\", ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={`flex items-center p-4 sm:p-6 pt-0 ${className}`} {...props} />\n )\n}\n\n// Card divider for separating content sections\nexport function CardDivider({ className = \"\" }: { className?: string }) {\n return (\n <div className={`h-px bg-slate-200/60 dark:bg-slate-700/50 mx-4 sm:mx-6 ${className}`} />\n )\n}\n\n// ============================================================================\n// Section Card - Card with styled header (icon + title + subtitle)\n// ============================================================================\n\ntype SectionCardHeaderProps = {\n icon?: ReactNode\n title: string\n subtitle?: string\n /** Gradient classes for the icon background */\n gradient?: string\n /** Optional content on the right side */\n rightContent?: ReactNode\n}\n\ntype SectionCardProps = {\n /** Card header configuration */\n header: SectionCardHeaderProps\n /** Card body content */\n children: ReactNode\n /** Additional className for the card container */\n className?: string\n /** Whether to add padding to the body (default: true) */\n padded?: boolean\n /** Card variant */\n variant?: \"default\" | \"gradient\" | \"glass\" | \"elevated\"\n}\n\n/**\n * Section Card with gradient icon header\n * Used across dashboard pages for consistent section styling\n */\nexport function SectionCard({\n header,\n children,\n className = \"\",\n padded = true,\n variant = \"default\",\n}: SectionCardProps) {\n const { icon, title, subtitle, gradient = \"from-indigo-500 to-purple-600\", rightContent } = header\n\n return (\n <Card variant={variant} className={className}>\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 sm:px-6 py-4 border-b liquid-divider\">\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div\n className={`h-10 w-10 rounded-xl bg-gradient-to-br ${gradient} flex items-center justify-center shadow-lg`}\n >\n {icon}\n </div>\n )}\n <div>\n <h3 className=\"text-base sm:text-lg font-semibold text-gray-900 dark:text-white\">\n {title}\n </h3>\n {subtitle && (\n <p className=\"text-xs sm:text-sm text-gray-500 dark:text-gray-400\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n {rightContent}\n </div>\n\n {/* Body */}\n <div className={padded ? \"p-4 sm:p-6\" : \"\"}>{children}</div>\n </Card>\n )\n}\n\n// ============================================================================\n// List Card - Card optimized for list items\n// ============================================================================\n\ntype ListCardProps = {\n children: ReactNode\n className?: string\n variant?: \"default\" | \"glass\"\n}\n\nexport function ListCard({ children, className = \"\", variant = \"default\" }: ListCardProps) {\n return (\n <Card variant={variant} className={`divide-y liquid-divider ${className}`}>\n {children}\n </Card>\n )\n}\n\ntype ListCardItemProps = HTMLAttributes<HTMLDivElement> & {\n /** Left content (icon, avatar) */\n leading?: ReactNode\n /** Main content */\n children: ReactNode\n /** Right content (badge, button, chevron) */\n trailing?: ReactNode\n /** Enable press animation */\n pressable?: boolean\n /** Click handler */\n onPress?: () => void\n}\n\nexport function ListCardItem({\n leading,\n children,\n trailing,\n pressable = false,\n onPress,\n className = \"\",\n ...props\n}: ListCardItemProps) {\n const content = (\n <>\n {leading && <div className=\"shrink-0\">{leading}</div>}\n <div className=\"flex-1 min-w-0\">{children}</div>\n {trailing && <div className=\"shrink-0\">{trailing}</div>}\n </>\n )\n\n if (pressable || onPress) {\n // Omit event handlers that conflict with Framer Motion's event signatures\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, onAnimationEnd, onAnimationIteration, ...restProps } = props\n return (\n <motion.div\n className={`flex items-center gap-3 px-4 py-3 cursor-pointer hover:bg-white/35 dark:hover:bg-white/5 transition-colors ${className}`}\n whileTap={{ backgroundColor: \"rgba(0,0,0,0.05)\" }}\n onClick={() => {\n if (onPress) {\n triggerHaptic(\"light\")\n onPress()\n }\n }}\n {...restProps}\n >\n {content}\n </motion.div>\n )\n }\n\n return (\n <div className={`flex items-center gap-3 px-4 py-3 ${className}`} {...props}>\n {content}\n </div>\n )\n}\n\nexport type { SectionCardProps, SectionCardHeaderProps }\n","import { forwardRef, useState, useCallback, useId, type InputHTMLAttributes } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { XMarkIcon, EyeIcon, EyeSlashIcon, CheckCircleIcon } from '@heroicons/react/20/solid'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\nimport { springPresets, getTransition } from '@ui/lib/animations'\n\ntype InputProps = InputHTMLAttributes<HTMLInputElement> & {\n label?: string\n error?: string\n icon?: React.ReactNode\n /** Show clear button when input has value */\n clearable?: boolean\n /** Use floating label style */\n floatingLabel?: boolean\n /** Callback when clear button is clicked */\n onClear?: () => void\n /** Show password toggle for password fields */\n showPasswordToggle?: boolean\n /** Show character counter */\n showCharacterCount?: boolean\n /** Max characters for counter */\n maxCharacters?: number\n /** Show success state */\n success?: boolean\n /** Success message */\n successMessage?: string\n /** Helper text below input */\n helperText?: string\n /** iOS filled style (gray background, no border) */\n variant?: \"default\" | \"filled\"\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className = \"\",\n label,\n error,\n icon,\n type,\n clearable = false,\n floatingLabel = false,\n onClear,\n onFocus,\n onBlur,\n value,\n showPasswordToggle = false,\n showCharacterCount = false,\n maxCharacters,\n success = false,\n successMessage,\n helperText,\n variant = \"default\",\n ...props\n },\n ref\n ) => {\n const t = useTranslations(\"auth\")\n const autoId = useId()\n const inputId = props.id || autoId\n const errorId = `${inputId}-error`\n const helperId = `${inputId}-helper`\n const [isFocused, setIsFocused] = useState(false)\n const [showPassword, setShowPassword] = useState(false)\n const hasValue = value !== undefined && value !== \"\"\n const characterCount = typeof value === \"string\" ? value.length : 0\n const isOverLimit = maxCharacters ? characterCount > maxCharacters : false\n const isFilled = variant === \"filled\"\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(true)\n triggerHaptic(\"light\")\n onFocus?.(e)\n },\n [onFocus]\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n setIsFocused(false)\n onBlur?.(e)\n },\n [onBlur]\n )\n\n const handleClear = useCallback(() => {\n triggerHaptic(\"light\")\n onClear?.()\n }, [onClear])\n\n const togglePassword = useCallback(() => {\n triggerHaptic(\"light\")\n setShowPassword(!showPassword)\n }, [showPassword])\n\n // Determine actual input type for password toggle\n const actualType = type === \"password\" && showPassword ? \"text\" : type\n\n const showClearButton = clearable && hasValue && (isFocused || hasValue)\n const isPasswordField = type === \"password\" && showPasswordToggle\n\n // Base classes with 44px minimum touch target\n const baseClasses = isFilled\n ? `\n liquid-surface h-12 w-full rounded-xl border-0\n px-4 py-3 text-base\n text-gray-900 dark:text-white\n placeholder:text-gray-400 dark:placeholder:text-gray-500\n transition-all duration-200\n disabled:cursor-not-allowed disabled:opacity-50\n `\n : `\n liquid-surface h-11 w-full rounded-xl\n px-3.5 py-2.5 text-base\n text-gray-900 dark:text-white\n placeholder:text-gray-400 dark:placeholder:text-gray-500\n transition-all duration-200\n disabled:cursor-not-allowed disabled:opacity-50\n `\n\n const focusClasses = isFilled\n ? isFocused\n ? \"bg-white/80 dark:bg-slate-900/58 ring-2 ring-ios-blue\"\n : \"\"\n : isFocused\n ? \"border-ios-blue ring-4 ring-ios-blue/10 shadow-[0_0_0_4px_rgba(0,122,255,0.1)]\"\n : \"\"\n\n const errorClasses = isFilled\n ? error\n ? \"ring-2 ring-ios-red bg-red-50/75 dark:bg-red-900/22\"\n : \"\"\n : error\n ? \"border-ios-red ring-4 ring-ios-red/10\"\n : \"\"\n\n const successClasses = success && !error\n ? isFilled\n ? \"ring-2 ring-ios-green\"\n : \"border-ios-green ring-4 ring-ios-green/10\"\n : \"\"\n\n const iconPadding = icon ? \"pl-11\" : \"\"\n // Calculate right padding based on what buttons are shown\n const rightButtons = [showClearButton, isPasswordField, success].filter(Boolean).length\n const clearPadding = rightButtons > 0 ? `pr-${11 + (rightButtons - 1) * 8}` : \"\"\n\n // Helper to render right-side buttons\n const renderRightButtons = () => (\n <div className=\"absolute flex items-center gap-1\" style={{ right: '0.75rem', top: '50%', transform: 'translateY(-50%)' }}>\n {/* Success checkmark */}\n <AnimatePresence>\n {success && !error && (\n <motion.div\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={getTransition(springPresets.bouncy)}\n >\n <CheckCircleIcon className=\"h-5 w-5 text-ios-green dark:text-ios-green-dark\" />\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* Password toggle */}\n <AnimatePresence>\n {isPasswordField && (\n <motion.button\n type=\"button\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.15 }}\n onClick={togglePassword}\n className=\"p-1 rounded-full text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label={showPassword ? t(\"hidePassword\") : t(\"showPassword\")}\n >\n {showPassword ? (\n <EyeSlashIcon className=\"h-5 w-5\" />\n ) : (\n <EyeIcon className=\"h-5 w-5\" />\n )}\n </motion.button>\n )}\n </AnimatePresence>\n\n {/* Clear button */}\n <AnimatePresence>\n {showClearButton && (\n <motion.button\n type=\"button\"\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.15 }}\n onClick={handleClear}\n className=\"p-1 rounded-full text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n )\n\n // Helper to render footer (error, success, helper, character count)\n const renderFooter = () => (\n <div className=\"flex items-center justify-between mt-1.5\">\n <div className=\"flex-1\">\n {error && (\n <motion.p\n id={errorId}\n role=\"alert\"\n initial={{ opacity: 0, y: -5 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"text-sm text-ios-red\"\n >\n {error}\n </motion.p>\n )}\n {!error && success && successMessage && (\n <motion.p\n id={helperId}\n initial={{ opacity: 0, y: -5 }}\n animate={{ opacity: 1, y: 0 }}\n className=\"text-sm text-ios-green dark:text-ios-green-dark\"\n >\n {successMessage}\n </motion.p>\n )}\n {!error && !successMessage && helperText && (\n <p id={helperId} className=\"text-sm text-gray-500 dark:text-gray-400\">{helperText}</p>\n )}\n </div>\n {showCharacterCount && (\n <span\n className={`text-xs ml-2 ${\n isOverLimit\n ? \"text-ios-red\"\n : characterCount > 0\n ? \"text-gray-500 dark:text-gray-400\"\n : \"text-gray-400 dark:text-gray-500\"\n }`}\n >\n {characterCount}{maxCharacters ? `/${maxCharacters}` : \"\"}\n </span>\n )}\n </div>\n )\n\n // Floating label styles\n if (floatingLabel && label) {\n return (\n <div className=\"space-y-1\">\n <div className=\"relative\">\n {icon && (\n <div className=\"absolute left-3.5 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500 z-10\">\n {icon}\n </div>\n )}\n\n <input\n type={actualType}\n ref={ref}\n id={inputId}\n value={value}\n onFocus={handleFocus}\n onBlur={handleBlur}\n maxLength={maxCharacters}\n aria-invalid={!!error}\n aria-describedby={error ? errorId : helperText ? helperId : undefined}\n className={`\n ${baseClasses}\n ${focusClasses}\n ${errorClasses}\n ${successClasses}\n ${iconPadding}\n pr-12\n ${className}\n peer pt-6 pb-2\n `}\n placeholder=\" \"\n {...props}\n />\n\n {/* Floating label */}\n <motion.label\n htmlFor={inputId}\n className={`\n absolute left-3.5 pointer-events-none\n text-gray-500 dark:text-gray-400\n transition-all duration-200\n ${icon ? \"left-11\" : \"\"}\n `}\n initial={false}\n animate={{\n top: hasValue || isFocused ? \"0.5rem\" : \"50%\",\n y: hasValue || isFocused ? 0 : \"-50%\",\n fontSize: hasValue || isFocused ? \"0.75rem\" : \"1rem\",\n }}\n >\n {label}\n </motion.label>\n\n {renderRightButtons()}\n </div>\n {(error || success || helperText || showCharacterCount) && renderFooter()}\n </div>\n )\n }\n\n // Standard input with label above\n return (\n <div className=\"space-y-1.5\">\n {label && (\n <label htmlFor={inputId} className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n <div className=\"relative\">\n {icon && (\n <div className=\"absolute left-3.5 top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500\">\n {icon}\n </div>\n )}\n\n <input\n type={actualType}\n ref={ref}\n id={inputId}\n value={value}\n onFocus={handleFocus}\n onBlur={handleBlur}\n maxLength={maxCharacters}\n aria-invalid={!!error}\n aria-describedby={error ? errorId : helperText ? helperId : undefined}\n className={`\n ${baseClasses}\n ${focusClasses}\n ${errorClasses}\n ${successClasses}\n ${iconPadding}\n pr-12\n ${className}\n `}\n {...props}\n />\n\n {renderRightButtons()}\n </div>\n {(error || success || helperText || showCharacterCount) && renderFooter()}\n </div>\n )\n }\n)\n\nInput.displayName = \"Input\"\n\n/**\n * Password Input - Pre-configured input for passwords\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, Omit<InputProps, 'type' | 'showPasswordToggle'>>(\n ({ variant = \"default\", icon, ...props }, ref) => (\n <Input\n ref={ref}\n type=\"password\"\n showPasswordToggle\n variant={variant}\n icon={icon}\n {...props}\n />\n )\n)\n\nPasswordInput.displayName = \"PasswordInput\"\n\n/**\n * Search Input - Pre-configured input for search\n */\nexport const SearchInput = forwardRef<HTMLInputElement, Omit<InputProps, 'type'>>(\n ({ icon, ...props }, ref) => (\n <Input\n ref={ref}\n type=\"search\"\n clearable\n icon={icon || (\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n )}\n {...props}\n />\n )\n)\n\nSearchInput.displayName = \"SearchInput\"\n","import { forwardRef, useState, useCallback, type SelectHTMLAttributes } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { ChevronDownIcon, CheckIcon } from '@heroicons/react/20/solid'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\nimport { Sheet } from '@ui/components/sheet'\nimport { WheelPicker } from '@ui/components/wheel-picker'\n\ntype SelectOption = {\n value: string\n label: string\n disabled?: boolean\n}\n\ntype SelectProps = SelectHTMLAttributes<HTMLSelectElement> & {\n label?: string\n error?: string\n /** Options as array of objects or strings */\n options?: SelectOption[] | string[]\n /** Use wheel picker on mobile */\n useMobilePicker?: boolean\n /** Placeholder text */\n placeholder?: string\n}\n\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(\n (\n {\n className = \"\",\n label,\n error,\n options = [],\n useMobilePicker = false,\n value,\n onChange,\n placeholder = \"Select...\",\n children,\n disabled,\n onFocus,\n onBlur,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false)\n const [isFocused, setIsFocused] = useState(false)\n\n // Normalize options\n const normalizedOptions: SelectOption[] = options.map((opt) =>\n typeof opt === \"string\" ? { value: opt, label: opt } : opt\n )\n\n const selectedOption = normalizedOptions.find((opt) => opt.value === String(value))\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLSelectElement>) => {\n setIsFocused(true)\n triggerHaptic(\"light\")\n onFocus?.(e)\n },\n [onFocus]\n )\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLSelectElement>) => {\n setIsFocused(false)\n onBlur?.(e)\n },\n [onBlur]\n )\n\n const handlePickerChange = useCallback(\n (newValue: string) => {\n triggerHaptic(\"selection\")\n // Create a synthetic event for compatibility\n const syntheticEvent = {\n target: { value: newValue },\n currentTarget: { value: newValue },\n } as React.ChangeEvent<HTMLSelectElement>\n onChange?.(syntheticEvent)\n setIsOpen(false)\n },\n [onChange]\n )\n\n const handleOpenPicker = useCallback(() => {\n if (disabled) return\n triggerHaptic(\"light\")\n setIsOpen(true)\n }, [disabled])\n\n // Base styles\n const baseClasses = `\n flex h-11 w-full items-center justify-between\n rounded-xl border\n border-white/55 dark:border-white/14\n bg-white/68 dark:bg-slate-900/44 backdrop-blur-xl\n px-3.5 py-2.5 text-base\n text-gray-900 dark:text-white\n shadow-[inset_0_1px_0_rgba(255,255,255,0.88),0_10px_24px_-22px_rgba(15,23,42,0.72)]\n transition-all duration-200\n disabled:cursor-not-allowed disabled:opacity-50\n `\n\n const focusClasses = isFocused\n ? \"border-ios-blue ring-4 ring-ios-blue/10\"\n : \"\"\n\n const errorClasses = error ? \"border-ios-red ring-4 ring-ios-red/10\" : \"\"\n\n // Mobile picker mode\n if (useMobilePicker && normalizedOptions.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n\n {/* Custom trigger button */}\n <button\n type=\"button\"\n onClick={handleOpenPicker}\n disabled={disabled}\n className={`\n ${baseClasses}\n ${focusClasses}\n ${errorClasses}\n ${className}\n cursor-pointer\n `}\n >\n <span className={selectedOption ? \"\" : \"text-gray-400\"}>\n {selectedOption?.label || placeholder}\n </span>\n <ChevronDownIcon\n className={`h-5 w-5 text-gray-400 transition-transform duration-200\n ${isOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n\n {/* Hidden native select for form compatibility */}\n <select\n ref={ref}\n value={value}\n onChange={onChange}\n className=\"sr-only\"\n {...props}\n >\n {normalizedOptions.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n\n {/* Mobile sheet with wheel picker */}\n <Sheet open={isOpen} onClose={() => setIsOpen(false)} title={label}>\n <WheelPicker\n options={normalizedOptions}\n value={String(value) || normalizedOptions[0]?.value || \"\"}\n onChange={handlePickerChange}\n />\n <div className=\"px-4 pb-4\">\n <button\n type=\"button\"\n onClick={() => setIsOpen(false)}\n className=\"w-full py-3 rounded-xl bg-ios-blue/90 text-white font-semibold\n hover:bg-ios-blue-hover/95 transition-colors\"\n >\n Done\n </button>\n </div>\n </Sheet>\n\n {error && <p className=\"text-sm text-ios-red\">{error}</p>}\n </div>\n )\n }\n\n // Standard select with enhanced styling\n return (\n <div className=\"space-y-1.5\">\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n\n <div className=\"relative\">\n <select\n ref={ref}\n value={value}\n onChange={onChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n disabled={disabled}\n className={`\n ${baseClasses}\n ${focusClasses}\n ${errorClasses}\n ${className}\n appearance-none cursor-pointer pr-10\n `}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {normalizedOptions.length > 0\n ? normalizedOptions.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))\n : children}\n </select>\n\n {/* Custom chevron */}\n <ChevronDownIcon\n className=\"absolute right-3 top-1/2 -translate-y-1/2 h-5 w-5 text-gray-400 pointer-events-none\"\n />\n </div>\n\n {error && <p className=\"text-sm text-ios-red\">{error}</p>}\n </div>\n )\n }\n)\n\nSelect.displayName = \"Select\"\n\n// Dropdown variant with custom options rendering\ntype DropdownSelectProps = {\n label?: string\n options: SelectOption[]\n value?: string\n onChange: (value: string) => void\n placeholder?: string\n disabled?: boolean\n error?: string\n}\n\nexport function DropdownSelect({\n label,\n options,\n value,\n onChange,\n placeholder = \"Select...\",\n disabled,\n error,\n}: DropdownSelectProps) {\n const [isOpen, setIsOpen] = useState(false)\n\n const selectedOption = options.find((opt) => opt.value === value)\n\n const handleSelect = (optionValue: string) => {\n triggerHaptic(\"selection\")\n onChange(optionValue)\n setIsOpen(false)\n }\n\n return (\n <div className=\"space-y-1.5 relative\">\n {label && (\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {label}\n </label>\n )}\n\n <button\n type=\"button\"\n onClick={() => {\n if (!disabled) {\n triggerHaptic(\"light\")\n setIsOpen(!isOpen)\n }\n }}\n disabled={disabled}\n className={`\n flex h-11 w-full items-center justify-between\n rounded-xl border border-white/55 dark:border-white/14\n bg-white/68 dark:bg-slate-900/44 backdrop-blur-xl\n px-3.5 py-2.5 text-base\n text-gray-900 dark:text-white\n shadow-[inset_0_1px_0_rgba(255,255,255,0.88),0_10px_24px_-22px_rgba(15,23,42,0.72)]\n transition-all duration-200\n hover:bg-white/74 dark:hover:bg-slate-900/54\n disabled:cursor-not-allowed disabled:opacity-50\n ${isOpen ? \"border-ios-blue ring-4 ring-ios-blue/10\" : \"\"}\n ${error ? \"border-ios-red ring-4 ring-ios-red/10\" : \"\"}\n `}\n >\n <span className={selectedOption ? \"\" : \"text-gray-400\"}>\n {selectedOption?.label || placeholder}\n </span>\n <motion.div\n animate={{ rotate: isOpen ? 180 : 0 }}\n transition={{ duration: 0.2 }}\n >\n <ChevronDownIcon className=\"h-5 w-5 text-gray-400\" />\n </motion.div>\n </button>\n\n {/* Dropdown menu */}\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setIsOpen(false)}\n />\n\n {/* Menu */}\n <motion.div\n initial={{ opacity: 0, y: -10, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -10, scale: 0.95 }}\n transition={{ duration: 0.15 }}\n className=\"absolute z-50 mt-2 w-full\n bg-white/82 dark:bg-slate-900/64 backdrop-blur-2xl\n rounded-xl border border-white/55 dark:border-white/14\n shadow-xl overflow-hidden\"\n >\n <div className=\"max-h-60 overflow-auto py-1\">\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => handleSelect(option.value)}\n disabled={option.disabled}\n className={`\n w-full flex items-center justify-between px-4 py-3 text-left\n transition-colors duration-150\n ${option.value === value\n ? \"bg-ios-blue/10 text-ios-blue\"\n : \"text-gray-900 dark:text-white hover:bg-white/55 dark:hover:bg-white/8\"\n }\n ${option.disabled ? \"opacity-50 cursor-not-allowed\" : \"\"}\n `}\n >\n <span className=\"font-medium\">{option.label}</span>\n {option.value === value && (\n <CheckIcon className=\"h-5 w-5 text-ios-blue\" />\n )}\n </button>\n ))}\n </div>\n </motion.div>\n </>\n )}\n </AnimatePresence>\n\n {error && <p className=\"text-sm text-ios-red\">{error}</p>}\n </div>\n )\n}\n","import { Fragment, useEffect, useRef, useCallback } from 'react'\nimport { Dialog, DialogPanel, DialogTitle, Transition, TransitionChild } from '@headlessui/react'\nimport { motion, useMotionValue, useTransform, PanInfo } from 'framer-motion'\nimport { useTranslations } from 'next-intl'\nimport { springPresets } from '@ui/lib/animations'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype SheetSide = 'bottom' | 'right'\ntype SheetSize = 'md' | 'lg' | 'xl'\n\ntype SheetProps = {\n /** Whether the sheet is open */\n open: boolean\n /** Callback when sheet should close */\n onClose: () => void\n /** Sheet content */\n children: React.ReactNode\n /** Title for accessibility */\n title?: string\n /** Show drag handle */\n showHandle?: boolean\n /** Snap points as percentages (e.g., ['50%', '90%']) — only for bottom side */\n snapPoints?: string[]\n /** Initial snap point index */\n initialSnap?: number\n /** Which side the sheet slides from */\n side?: SheetSide\n /** Width size for right-side sheet */\n size?: SheetSize\n}\n\nexport function Sheet({\n open,\n onClose,\n children,\n title,\n showHandle = true,\n snapPoints = ['90%'],\n side = 'bottom',\n size = 'md',\n}: SheetProps) {\n const isRight = side === 'right'\n const motionValue = useMotionValue(0)\n const sheetRef = useRef<HTMLDivElement>(null)\n\n // Background opacity based on drag\n const backdropOpacity = useTransform(motionValue, [0, 300], [1, 0])\n\n const handleDragEnd = useCallback(\n (_: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n const shouldClose = isRight\n ? info.velocity.x > 500 || info.offset.x > 150\n : info.velocity.y > 500 || info.offset.y > 150\n\n if (shouldClose) {\n triggerHaptic('light')\n onClose()\n } else {\n motionValue.set(0)\n }\n },\n [onClose, motionValue, isRight]\n )\n\n // Reset position when opening\n useEffect(() => {\n if (open) {\n motionValue.set(0)\n }\n }, [open, motionValue])\n\n const maxHeight = snapPoints[snapPoints.length - 1]\n const rightSizeClass = size === 'xl'\n ? 'max-w-xl'\n : size === 'lg'\n ? 'max-w-lg'\n : 'max-w-md'\n\n return (\n <Transition show={open} as={Fragment}>\n <Dialog as=\"div\" className=\"relative z-50\" onClose={onClose}>\n {/* Backdrop */}\n <TransitionChild\n as={Fragment}\n enter=\"ease-out duration-300\"\n enterFrom=\"opacity-0\"\n enterTo=\"opacity-100\"\n leave=\"ease-in duration-200\"\n leaveFrom=\"opacity-100\"\n leaveTo=\"opacity-0\"\n >\n <motion.div\n className=\"fixed inset-0 bg-black/40 backdrop-blur-sm\"\n style={{ opacity: backdropOpacity }}\n />\n </TransitionChild>\n\n {/* Sheet container */}\n <div className=\"fixed inset-0 overflow-hidden\">\n <div className=\"absolute inset-0 overflow-hidden\">\n <div\n className={\n isRight\n ? 'pointer-events-none fixed inset-y-0 right-0 flex w-screen max-w-full justify-end'\n : 'pointer-events-none fixed inset-x-0 bottom-0 flex justify-center'\n }\n >\n <TransitionChild\n as={Fragment}\n enter=\"transform transition ease-out duration-300\"\n enterFrom={isRight ? 'translate-x-full' : 'translate-y-full'}\n enterTo={isRight ? 'translate-x-0' : 'translate-y-0'}\n leave=\"transform transition ease-in duration-200\"\n leaveFrom={isRight ? 'translate-x-0' : 'translate-y-0'}\n leaveTo={isRight ? 'translate-x-full' : 'translate-y-full'}\n >\n <DialogPanel\n as={motion.div}\n ref={sheetRef}\n drag={isRight ? 'x' : 'y'}\n dragConstraints={\n isRight\n ? { left: 0, right: 0 }\n : { top: 0, bottom: 0 }\n }\n dragElastic={\n isRight\n ? { left: 0.05, right: 0.5 }\n : { top: 0.05, bottom: 0.5 }\n }\n onDragEnd={handleDragEnd}\n style={isRight ? { x: motionValue } : { y: motionValue }}\n className={\n isRight\n ? `pointer-events-auto w-full ${rightSizeClass} h-full liquid-surface !rounded-none !rounded-l-3xl !shadow-2xl overflow-hidden`\n : `pointer-events-auto w-full max-w-lg liquid-surface !rounded-none !rounded-t-3xl !shadow-2xl overflow-hidden`\n }\n {...(!isRight ? { initial: { height: maxHeight } } : {})}\n >\n {/* Drag handle */}\n {showHandle && !isRight && (\n <div className=\"flex justify-center pt-3 pb-2 cursor-grab active:cursor-grabbing\">\n <div className=\"h-1 w-10 rounded-full bg-gray-400/50 dark:bg-gray-500/50\" />\n </div>\n )}\n\n {/* Title */}\n {title && (\n <DialogTitle className=\"px-6 py-3 text-lg font-semibold text-gray-900 dark:text-white border-b border-gray-200/50 dark:border-white/10\">\n {title}\n </DialogTitle>\n )}\n\n {/* Content */}\n <div\n className=\"overflow-y-auto overscroll-contain\"\n style={isRight ? { height: '100%' } : { maxHeight: `calc(${maxHeight} - 60px)` }}\n >\n {children}\n </div>\n\n {/* Safe area padding for bottom */}\n {!isRight && <div className=\"h-safe-area-inset-bottom\" />}\n </DialogPanel>\n </TransitionChild>\n </div>\n </div>\n </div>\n </Dialog>\n </Transition>\n )\n}\n\n// Action Sheet variant\ntype ActionSheetAction = {\n label: string\n onClick: () => void\n destructive?: boolean\n disabled?: boolean\n}\n\ntype ActionSheetProps = {\n open: boolean\n onClose: () => void\n title?: string\n message?: string\n actions: ActionSheetAction[]\n}\n\nexport function ActionSheet({\n open,\n onClose,\n title,\n message,\n actions,\n}: ActionSheetProps) {\n const tCommon = useTranslations('common')\n\n const handleAction = (action: ActionSheetAction) => {\n if (action.disabled) return\n triggerHaptic('light')\n action.onClick()\n onClose()\n }\n\n return (\n <Sheet open={open} onClose={onClose} showHandle={false}>\n <div className=\"px-4 pt-4 pb-2\">\n {/* Header */}\n {(title || message) && (\n <div className=\"text-center mb-4\">\n {title && (\n <h3 className=\"text-sm font-semibold text-gray-500 dark:text-gray-400\">\n {title}\n </h3>\n )}\n {message && (\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mt-1\">\n {message}\n </p>\n )}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"space-y-2\">\n {actions.map((action, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleAction(action)}\n disabled={action.disabled}\n className={`\n w-full py-3 px-4 rounded-xl text-center font-medium\n transition-colors duration-150\n ${action.destructive\n ? 'text-[#FF3B30] bg-[#FF3B30]/10 hover:bg-[#FF3B30]/20'\n : 'text-[#007AFF] bg-[#007AFF]/10 hover:bg-[#007AFF]/20'\n }\n ${action.disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n >\n {action.label}\n </button>\n ))}\n </div>\n\n {/* Cancel button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full mt-2 py-3 px-4 rounded-xl text-center font-semibold\n text-gray-600 dark:text-gray-300\n bg-gray-100 dark:bg-gray-800\n hover:bg-gray-200 dark:hover:bg-gray-700\n transition-colors duration-150\"\n >\n {tCommon('cancelDelete')}\n </button>\n </div>\n </Sheet>\n )\n}\n","import { useRef, useEffect, useState, useCallback } from 'react'\nimport { motion, useMotionValue, useTransform, animate, MotionValue } from 'framer-motion'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype WheelPickerOption = {\n value: string\n label: string\n}\n\ntype WheelPickerProps = {\n /** Options to display */\n options: WheelPickerOption[] | string[]\n /** Currently selected value */\n value: string\n /** Callback when selection changes */\n onChange: (value: string) => void\n /** Number of visible items */\n visibleItems?: number\n /** Item height in pixels */\n itemHeight?: number\n}\n\ntype WheelPickerItemProps = {\n option: WheelPickerOption\n index: number\n y: MotionValue<number>\n itemHeight: number\n containerHeight: number\n isDragging: boolean\n onChange: (value: string) => void\n}\n\nconst ITEM_HEIGHT = 44\n\n/**\n * Individual wheel picker item with transform hooks\n */\nfunction WheelPickerItem({\n option,\n index,\n y,\n itemHeight,\n containerHeight,\n isDragging,\n onChange,\n}: WheelPickerItemProps) {\n // Calculate opacity and scale based on distance from center\n const itemY = useTransform(y, (latestY) => {\n const itemOffset = index * itemHeight + latestY\n const centerOffset = (containerHeight - itemHeight) / 2\n const distance = Math.abs(itemOffset - centerOffset)\n return distance\n })\n\n const opacity = useTransform(itemY, [0, itemHeight, itemHeight * 2], [1, 0.5, 0.3])\n const scale = useTransform(itemY, [0, itemHeight, itemHeight * 2], [1, 0.95, 0.9])\n\n return (\n <motion.div\n key={option.value}\n style={{ opacity, scale }}\n className=\"flex items-center justify-center cursor-grab active:cursor-grabbing\"\n onClick={() => {\n if (!isDragging) {\n triggerHaptic('light')\n onChange(option.value)\n }\n }}\n >\n <div\n className=\"text-center font-medium text-gray-900 dark:text-white select-none\"\n style={{ height: itemHeight, lineHeight: `${itemHeight}px` }}\n >\n {option.label}\n </div>\n </motion.div>\n )\n}\n\nexport function WheelPicker({\n options,\n value,\n onChange,\n visibleItems = 5,\n itemHeight = ITEM_HEIGHT,\n}: WheelPickerProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const y = useMotionValue(0)\n const [isDragging, setIsDragging] = useState(false)\n\n // Normalize options\n const normalizedOptions: WheelPickerOption[] = options.map((opt) =>\n typeof opt === 'string' ? { value: opt, label: opt } : opt\n )\n\n const selectedIndex = normalizedOptions.findIndex((opt) => opt.value === value)\n const containerHeight = visibleItems * itemHeight\n\n // Calculate initial scroll position\n useEffect(() => {\n if (selectedIndex >= 0 && !isDragging) {\n const targetY = -selectedIndex * itemHeight\n animate(y, targetY, { type: 'spring', stiffness: 300, damping: 30 })\n }\n }, [selectedIndex, itemHeight, y, isDragging])\n\n // Handle drag end - snap to nearest item\n const handleDragEnd = useCallback(() => {\n setIsDragging(false)\n const currentY = y.get()\n const nearestIndex = Math.round(-currentY / itemHeight)\n const clampedIndex = Math.max(0, Math.min(nearestIndex, normalizedOptions.length - 1))\n const targetY = -clampedIndex * itemHeight\n\n animate(y, targetY, {\n type: 'spring',\n stiffness: 400,\n damping: 35,\n onComplete: () => {\n const newValue = normalizedOptions[clampedIndex]?.value\n if (newValue && newValue !== value) {\n triggerHaptic('selection')\n onChange(newValue)\n }\n },\n })\n }, [y, itemHeight, normalizedOptions, value, onChange])\n\n // Handle scroll/drag\n const handleDrag = useCallback(() => {\n if (!isDragging) setIsDragging(true)\n\n const currentY = y.get()\n const currentIndex = Math.round(-currentY / itemHeight)\n\n // Haptic feedback when crossing item boundaries\n if (currentIndex >= 0 && currentIndex < normalizedOptions.length) {\n const expectedY = -currentIndex * itemHeight\n if (Math.abs(currentY - expectedY) < 5) {\n triggerHaptic('selection')\n }\n }\n }, [y, itemHeight, normalizedOptions.length, isDragging])\n\n return (\n <div\n ref={containerRef}\n className=\"relative overflow-hidden\"\n style={{ height: containerHeight }}\n >\n {/* Gradient overlays for fade effect */}\n <div className=\"absolute inset-x-0 top-0 h-16 bg-gradient-to-b from-white dark:from-gray-900 to-transparent z-10 pointer-events-none\" />\n <div className=\"absolute inset-x-0 bottom-0 h-16 bg-gradient-to-t from-white dark:from-gray-900 to-transparent z-10 pointer-events-none\" />\n\n {/* Selection indicator */}\n <div\n className=\"absolute inset-x-4 z-0 rounded-lg bg-gray-100 dark:bg-gray-800\"\n style={{\n top: (containerHeight - itemHeight) / 2,\n height: itemHeight,\n }}\n />\n\n {/* Scrollable options */}\n <motion.div\n drag=\"y\"\n dragConstraints={{\n top: -(normalizedOptions.length - 1) * itemHeight,\n bottom: 0,\n }}\n dragElastic={0.1}\n onDrag={handleDrag}\n onDragEnd={handleDragEnd}\n style={{ y }}\n className=\"absolute inset-x-0\"\n >\n {/* Padding to center first/last items */}\n <div style={{ height: (containerHeight - itemHeight) / 2 }} />\n\n {normalizedOptions.map((option, index) => (\n <WheelPickerItem\n key={option.value}\n option={option}\n index={index}\n y={y}\n itemHeight={itemHeight}\n containerHeight={containerHeight}\n isDragging={isDragging}\n onChange={onChange}\n />\n ))}\n\n {/* Padding to center first/last items */}\n <div style={{ height: (containerHeight - itemHeight) / 2 }} />\n </motion.div>\n </div>\n )\n}\n\n// Multi-column picker (e.g., for date/time)\ntype MultiColumnPickerProps = {\n columns: {\n options: WheelPickerOption[] | string[]\n value: string\n onChange: (value: string) => void\n width: string\n }[]\n}\n\nexport function MultiColumnPicker({ columns }: MultiColumnPickerProps) {\n return (\n <div className=\"flex items-center justify-center gap-0 px-4 py-6\">\n {columns.map((column, index) => (\n <div\n key={index}\n className=\"flex-1\"\n style={{ maxWidth: column.width }}\n >\n <WheelPicker\n options={column.options}\n value={column.value}\n onChange={column.onChange}\n />\n </div>\n ))}\n </div>\n )\n}\n","import { motion } from 'framer-motion'\nimport { springPresets } from '@ui/lib/animations'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype ToggleSwitchProps = {\n /** Whether the toggle is on */\n checked: boolean\n /** Callback when toggle changes */\n onChange: (checked: boolean) => void\n /** Disable the toggle */\n disabled?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Accessible label */\n label?: string\n}\n\nconst sizes = {\n sm: { track: 'w-10 h-6', thumb: 'h-5 w-5', translateX: 16 },\n md: { track: 'w-[51px] h-[31px]', thumb: 'h-[27px] w-[27px]', translateX: 20 },\n lg: { track: 'w-16 h-9', thumb: 'h-8 w-8', translateX: 28 },\n} as const\n\nexport function ToggleSwitch({\n checked,\n onChange,\n disabled = false,\n size = 'md',\n label,\n}: ToggleSwitchProps) {\n const sizeConfig = sizes[size]\n\n const handleToggle = () => {\n if (disabled) return\n triggerHaptic('light')\n onChange(!checked)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleToggle()\n }\n }\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n className={`\n relative inline-flex shrink-0 cursor-pointer rounded-full\n transition-colors duration-200 ease-in-out\n focus:outline-none focus-visible:ring-2 focus-visible:ring-[#007AFF] focus-visible:ring-offset-2\n ${sizeConfig.track}\n ${checked ? 'bg-[#34C759]' : 'bg-gray-200 dark:bg-gray-600'}\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n >\n <motion.span\n layout\n transition={springPresets.bouncy}\n className={`\n pointer-events-none inline-block rounded-full\n bg-white shadow-lg shadow-black/10\n ring-0\n ${sizeConfig.thumb}\n `}\n style={{\n marginTop: '2px',\n marginLeft: '2px',\n }}\n animate={{\n x: checked ? sizeConfig.translateX : 0,\n }}\n />\n </button>\n )\n}\n\n// Labeled variant for settings\ntype LabeledToggleProps = ToggleSwitchProps & {\n title: string\n description?: string\n}\n\nexport function LabeledToggle({\n title,\n description,\n checked,\n onChange,\n disabled,\n size = 'md',\n}: LabeledToggleProps) {\n return (\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {title}\n </p>\n {description && (\n <p className=\"text-sm text-gray-500 dark:text-gray-400 mt-0.5\">\n {description}\n </p>\n )}\n </div>\n <ToggleSwitch\n checked={checked}\n onChange={onChange}\n disabled={disabled}\n size={size}\n label={title}\n />\n </div>\n )\n}\n","import { AnimatePresence, motion } from 'framer-motion'\nimport { MapIcon, XMarkIcon } from '@heroicons/react/24/outline'\nimport type { ComponentType } from 'react'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\nexport interface ActiveFilterChip {\n type: string\n value: string\n label: string\n color?: string\n}\n\nexport interface ActiveFilterChipStyleConfig {\n icon: ComponentType<{ className?: string }>\n className: string\n}\n\ninterface ActiveFilterChipsProps {\n filters: ActiveFilterChip[]\n onRemoveFilter?: (filter: ActiveFilterChip) => void\n styleConfig?: Record<string, ActiveFilterChipStyleConfig>\n}\n\nconst DEFAULT_STYLE_CONFIG: Record<string, ActiveFilterChipStyleConfig> = {\n default: {\n icon: MapIcon,\n className: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300',\n },\n}\n\nexport function ActiveFilterChips({\n filters,\n onRemoveFilter,\n styleConfig = DEFAULT_STYLE_CONFIG,\n}: ActiveFilterChipsProps) {\n return (\n <AnimatePresence mode=\"popLayout\">\n {filters.map((filter) => {\n const config = styleConfig[filter.type] ?? styleConfig.default ?? DEFAULT_STYLE_CONFIG.default\n const IconComponent = config.icon\n const colorClass = filter.color || config.className\n return (\n <motion.span\n key={`${filter.type}-${filter.value}`}\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n layout\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-sm font-medium ${colorClass}`}\n >\n <IconComponent className=\"h-4 w-4\" />\n {filter.label}\n {onRemoveFilter ? (\n <button\n onClick={() => {\n triggerHaptic('light')\n onRemoveFilter(filter)\n }}\n className=\"ml-1 rounded-full p-0.5 transition-colors hover:bg-black/10 dark:hover:bg-white/10\"\n >\n <XMarkIcon className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </motion.span>\n )\n })}\n </AnimatePresence>\n )\n}\n","import { ReactNode, useState, useRef, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n MagnifyingGlassIcon,\n XMarkIcon,\n MapIcon,\n BuildingStorefrontIcon,\n ClockIcon,\n} from '@heroicons/react/24/outline'\nimport {\n ActiveFilterChips,\n type ActiveFilterChipStyleConfig,\n} from '@ui/components/active-filter-chips'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\nexport interface ActiveFilter {\n type: string\n value: string\n label: string\n /** Optional custom color class for the pill */\n color?: string\n}\n\ntype SearchBarProps = {\n searchTerm: string\n onSearchChange: (value: string) => void\n placeholder?: string\n activeFilters?: ActiveFilter[]\n onRemoveFilter?: (filter: ActiveFilter) => void\n onClearAll?: () => void\n /** Optional content to render at the end of the search bar */\n endContent?: ReactNode\n /** Remove border and shadow when inside a unified container */\n noBorder?: boolean\n /** Show cancel button on focus */\n showCancelButton?: boolean\n /** Callback when cancel button is clicked */\n onCancel?: () => void\n /** Optional style config for filter chip types */\n filterChipStyleConfig?: Record<string, ActiveFilterChipStyleConfig>\n}\n\nconst defaultFilterTypeConfig: Record<string, ActiveFilterChipStyleConfig> = {\n region: {\n icon: MapIcon,\n className: \"bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400\",\n },\n brand: {\n icon: BuildingStorefrontIcon,\n className: \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400\",\n },\n status: {\n icon: ClockIcon,\n className: \"bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400\",\n },\n fuel: {\n icon: MapIcon,\n className: \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400\",\n },\n default: {\n icon: MapIcon,\n className: \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\",\n },\n}\n\n/**\n * Reusable search bar with filter chips\n * Used across dashboard pages for consistent search experience\n */\nexport function SearchBar({\n searchTerm,\n onSearchChange,\n placeholder,\n activeFilters = [],\n onRemoveFilter,\n onClearAll,\n endContent,\n noBorder = false,\n showCancelButton = false,\n onCancel,\n filterChipStyleConfig,\n}: SearchBarProps) {\n const t = useTranslations(\"common\")\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const hasFilters = activeFilters.length > 0 || searchTerm.length > 0\n const defaultPlaceholder = placeholder || t(\"searchPlaceholder\")\n\n const handleFocus = useCallback(() => {\n setIsFocused(true)\n triggerHaptic(\"light\")\n }, [])\n\n const handleBlur = useCallback(() => {\n // Delay blur to allow cancel button click\n setTimeout(() => setIsFocused(false), 150)\n }, [])\n\n const handleClear = useCallback(() => {\n triggerHaptic(\"light\")\n onSearchChange(\"\")\n inputRef.current?.focus()\n }, [onSearchChange])\n\n const handleCancel = useCallback(() => {\n triggerHaptic(\"light\")\n onSearchChange(\"\")\n setIsFocused(false)\n inputRef.current?.blur()\n onCancel?.()\n }, [onSearchChange, onCancel])\n\n const containerClasses = noBorder\n ? \"flex flex-wrap items-center gap-2 p-3 bg-transparent\"\n : `flex flex-wrap items-center gap-2 p-3\n bg-white/80 dark:bg-gray-800/80 backdrop-blur-xl\n border border-gray-200/50 dark:border-gray-700/50\n rounded-2xl shadow-sm\n transition-all duration-200\n ${isFocused ? \"ring-4 ring-[#007AFF]/10 border-[#007AFF]/30\" : \"\"}`\n\n return (\n <div className=\"flex items-center gap-2\">\n <motion.div\n className={containerClasses}\n layout\n transition={{ duration: 0.2 }}\n style={{ flex: 1 }}\n >\n {/* Active filter chips */}\n <ActiveFilterChips\n filters={activeFilters}\n onRemoveFilter={onRemoveFilter}\n styleConfig={filterChipStyleConfig ?? defaultFilterTypeConfig}\n />\n\n {/* Search input */}\n <div className=\"flex-1 min-w-[200px] relative\">\n <MagnifyingGlassIcon\n className={`absolute left-3 top-1/2 -translate-y-1/2 h-5 w-5 transition-colors duration-200\n ${isFocused ? \"text-[#007AFF]\" : \"text-gray-400\"}`}\n />\n <input\n ref={inputRef}\n type=\"text\"\n placeholder={activeFilters.length > 0 ? t(\"refineSearch\") : defaultPlaceholder}\n value={searchTerm}\n onChange={(e) => onSearchChange(e.target.value)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n className=\"w-full h-11 pl-10 pr-10 text-base bg-transparent\n text-gray-900 dark:text-white\n placeholder:text-gray-400 dark:placeholder:text-gray-500\n focus:outline-none\"\n />\n\n {/* Clear button inside input */}\n <AnimatePresence>\n {searchTerm && (\n <motion.button\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.8 }}\n transition={{ duration: 0.15 }}\n onClick={handleClear}\n className=\"absolute right-2 top-1/2 -translate-y-1/2 p-1.5 rounded-full\n bg-gray-200 dark:bg-gray-600\n text-gray-500 dark:text-gray-300\n hover:bg-gray-300 dark:hover:bg-gray-500\n transition-colors\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n\n {/* End content (optional) */}\n {endContent}\n\n {/* Clear all filters button */}\n {hasFilters && onClearAll && !showCancelButton && (\n <button\n onClick={() => {\n triggerHaptic(\"light\")\n onClearAll()\n }}\n className=\"p-2 rounded-xl text-gray-400 hover:text-gray-600 dark:hover:text-white\n hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n title={t(\"clearFilters\")}\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n )}\n </motion.div>\n\n {/* Cancel button - appears on focus */}\n <AnimatePresence>\n {showCancelButton && isFocused && (\n <motion.button\n initial={{ opacity: 0, x: -10, width: 0 }}\n animate={{ opacity: 1, x: 0, width: \"auto\" }}\n exit={{ opacity: 0, x: -10, width: 0 }}\n transition={{ duration: 0.2 }}\n onClick={handleCancel}\n className=\"text-[#007AFF] font-medium whitespace-nowrap px-2\"\n >\n {t(\"cancel\")}\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n )\n}\n","import { clsx } from 'clsx'\nimport type { ReactNode } from 'react'\nimport { motion } from 'framer-motion'\nimport { XMarkIcon } from '@heroicons/react/20/solid'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype PillVariant =\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"info\"\n | \"outline-primary\"\n | \"outline-success\"\n | \"outline-warning\"\n | \"outline-danger\"\n // Modern system color variants\n | \"blue\"\n | \"green\"\n | \"red\"\n | \"orange\"\n | \"purple\"\n | \"pink\"\n | \"teal\"\n\ntype PillSize = \"xs\" | \"sm\" | \"md\" | \"lg\"\n\ntype PillProps = {\n children: ReactNode\n variant?: PillVariant\n size?: PillSize\n className?: string\n onClick?: () => void\n /** Icon to show before text */\n icon?: ReactNode\n /** Show remove button */\n removable?: boolean\n /** Callback when remove button is clicked */\n onRemove?: () => void\n}\n\nconst variantClasses: Record<PillVariant, string> = {\n // Original variants — translucent glass\n default: \"bg-gray-500/10 text-gray-600 dark:bg-gray-400/15 dark:text-gray-300\",\n primary: \"bg-indigo-500/12 text-indigo-700 dark:bg-indigo-400/18 dark:text-indigo-400\",\n secondary: \"bg-purple-500/12 text-purple-700 dark:bg-purple-400/18 dark:text-purple-400\",\n success: \"bg-emerald-500/12 text-emerald-700 dark:bg-emerald-400/18 dark:text-emerald-400\",\n warning: \"bg-amber-500/12 text-amber-700 dark:bg-amber-400/18 dark:text-amber-400\",\n danger: \"bg-red-500/12 text-red-700 dark:bg-red-400/18 dark:text-red-400\",\n info: \"bg-blue-500/12 text-blue-700 dark:bg-blue-400/18 dark:text-blue-400\",\n \"outline-primary\": \"border border-indigo-300/50 text-indigo-700 dark:border-indigo-500/40 dark:text-indigo-400 bg-indigo-500/5\",\n \"outline-success\": \"border border-emerald-300/50 text-emerald-700 dark:border-emerald-500/40 dark:text-emerald-400 bg-emerald-500/5\",\n \"outline-warning\": \"border border-amber-300/50 text-amber-700 dark:border-amber-500/40 dark:text-amber-400 bg-amber-500/5\",\n \"outline-danger\": \"border border-red-300/50 text-red-700 dark:border-red-500/40 dark:text-red-400 bg-red-500/5\",\n // Modern system color variants\n blue: \"bg-[#007AFF]/12 text-[#007AFF] dark:bg-[#0A84FF]/18 dark:text-[#0A84FF]\",\n green: \"bg-[#34C759]/12 text-[#34C759] dark:bg-[#30D158]/18 dark:text-[#30D158]\",\n red: \"bg-[#FF3B30]/12 text-[#FF3B30] dark:bg-[#FF453A]/18 dark:text-[#FF453A]\",\n orange: \"bg-[#FF9500]/12 text-[#FF9500] dark:bg-[#FF9F0A]/18 dark:text-[#FF9F0A]\",\n purple: \"bg-[#AF52DE]/12 text-[#AF52DE] dark:bg-[#BF5AF2]/18 dark:text-[#BF5AF2]\",\n pink: \"bg-[#FF2D55]/12 text-[#FF2D55] dark:bg-[#FF375F]/18 dark:text-[#FF375F]\",\n teal: \"bg-[#5AC8FA]/12 text-[#5AC8FA] dark:bg-[#64D2FF]/18 dark:text-[#64D2FF]\",\n}\n\nconst sizeClasses: Record<PillSize, { container: string; icon: string }> = {\n xs: { container: \"px-2 py-0.5 text-[10px] gap-1\", icon: \"h-3 w-3\" },\n sm: { container: \"px-2.5 py-1 text-xs gap-1.5\", icon: \"h-3.5 w-3.5\" },\n md: { container: \"px-3 py-1.5 text-sm gap-1.5\", icon: \"h-4 w-4\" },\n lg: { container: \"px-4 py-2 text-sm gap-2\", icon: \"h-4 w-4\" },\n}\n\nexport function Pill({\n children,\n variant = \"default\",\n size = \"sm\",\n className,\n onClick,\n icon,\n removable = false,\n onRemove,\n}: PillProps) {\n const sizeConfig = sizeClasses[size]\n\n const handleClick = () => {\n if (onClick) {\n triggerHaptic(\"light\")\n onClick()\n }\n }\n\n const handleRemove = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (onRemove) {\n triggerHaptic(\"light\")\n onRemove()\n }\n }\n\n const content = (\n <>\n {icon && <span className={clsx(\"shrink-0\", sizeConfig.icon)}>{icon}</span>}\n <span>{children}</span>\n {removable && onRemove && (\n <button\n type=\"button\"\n onClick={handleRemove}\n className=\"shrink-0 -mr-1 p-0.5 rounded-full hover:bg-black/10 dark:hover:bg-white/10 transition-colors\"\n >\n <XMarkIcon className={sizeConfig.icon} />\n </button>\n )}\n </>\n )\n\n if (onClick) {\n return (\n <motion.button\n type=\"button\"\n onClick={handleClick}\n whileTap={{ scale: 0.95 }}\n className={clsx(\n \"inline-flex items-center font-medium rounded-full backdrop-blur-sm\",\n \"transition-all duration-150\",\n \"hover:opacity-80 active:opacity-70\",\n variantClasses[variant],\n sizeConfig.container,\n className\n )}\n >\n {content}\n </motion.button>\n )\n }\n\n return (\n <span\n className={clsx(\n \"inline-flex items-center font-medium rounded-full backdrop-blur-sm\",\n variantClasses[variant],\n sizeConfig.container,\n className\n )}\n >\n {content}\n </span>\n )\n}\n\n// Count pill variant (for notification badges)\ntype CountPillProps = {\n count: number\n max?: number\n variant?: 'default' | 'primary' | 'danger'\n size?: 'sm' | 'md'\n}\n\nexport function CountPill({\n count,\n max = 99,\n variant = 'danger',\n size = 'sm',\n}: CountPillProps) {\n const displayCount = count > max ? `${max}+` : count\n\n const variantStyles = {\n default: 'bg-gray-500 text-white',\n primary: 'bg-[#007AFF] text-white',\n danger: 'bg-[#FF3B30] text-white',\n }\n\n const sizeStyles = {\n sm: 'min-w-[18px] h-[18px] text-[10px] px-1',\n md: 'min-w-[22px] h-[22px] text-xs px-1.5',\n }\n\n if (count <= 0) return null\n\n return (\n <span\n className={clsx(\n \"inline-flex items-center justify-center font-bold rounded-full\",\n variantStyles[variant],\n sizeStyles[size]\n )}\n >\n {displayCount}\n </span>\n )\n}\n","import { useState, useRef, useEffect } from 'react'\nimport { motion } from 'framer-motion'\nimport { springPresets } from '@ui/lib/animations'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype Segment = {\n value: string\n label: string\n icon?: React.ReactNode\n}\n\ntype SegmentedControlProps = {\n /** Segments to display */\n segments: Segment[] | string[]\n /** Currently selected value */\n value: string\n /** Callback when selection changes */\n onChange: (value: string) => void\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Full width */\n fullWidth?: boolean\n /** Disabled state */\n disabled?: boolean\n}\n\nconst sizeStyles = {\n sm: {\n container: 'h-8 p-0.5 text-xs',\n segment: 'px-3 py-1',\n },\n md: {\n container: 'h-10 p-1 text-sm',\n segment: 'px-4 py-1.5',\n },\n lg: {\n container: 'h-12 p-1 text-base',\n segment: 'px-6 py-2',\n },\n}\n\nexport function SegmentedControl({\n segments,\n value,\n onChange,\n size = 'md',\n fullWidth = false,\n disabled = false,\n}: SegmentedControlProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [indicatorStyle, setIndicatorStyle] = useState({ left: 0, width: 0 })\n\n // Normalize segments to objects\n const normalizedSegments: Segment[] = segments.map((seg) =>\n typeof seg === 'string' ? { value: seg, label: seg } : seg\n )\n\n const selectedIndex = normalizedSegments.findIndex((seg) => seg.value === value)\n const styles = sizeStyles[size]\n\n // Calculate indicator position\n useEffect(() => {\n if (containerRef.current && selectedIndex >= 0) {\n const container = containerRef.current\n const buttons = container.querySelectorAll('button')\n const selectedButton = buttons[selectedIndex]\n\n if (selectedButton) {\n const containerRect = container.getBoundingClientRect()\n const buttonRect = selectedButton.getBoundingClientRect()\n\n setIndicatorStyle({\n left: buttonRect.left - containerRect.left,\n width: buttonRect.width,\n })\n }\n }\n }, [selectedIndex, segments])\n\n const handleSelect = (segmentValue: string) => {\n if (disabled || segmentValue === value) return\n triggerHaptic('light')\n onChange(segmentValue)\n }\n\n return (\n <div\n ref={containerRef}\n className={`\n relative inline-flex items-center rounded-xl\n bg-gray-100 dark:bg-gray-800\n ${styles.container}\n ${fullWidth ? 'w-full' : ''}\n ${disabled ? 'opacity-50 pointer-events-none' : ''}\n `}\n >\n {/* Animated background indicator */}\n <motion.div\n className=\"absolute top-1 bottom-1 rounded-lg bg-white dark:bg-gray-700 shadow-sm\"\n initial={false}\n animate={{\n left: indicatorStyle.left,\n width: indicatorStyle.width,\n }}\n transition={springPresets.default}\n />\n\n {/* Segment buttons */}\n {normalizedSegments.map((segment) => {\n const isSelected = segment.value === value\n\n return (\n <button\n key={segment.value}\n type=\"button\"\n onClick={() => handleSelect(segment.value)}\n className={`\n relative z-10 flex items-center justify-center gap-1.5\n font-medium rounded-lg transition-colors duration-150\n ${styles.segment}\n ${fullWidth ? 'flex-1' : ''}\n ${isSelected\n ? 'text-gray-900 dark:text-white'\n : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300'\n }\n `}\n >\n {segment.icon && <span className=\"shrink-0\">{segment.icon}</span>}\n <span>{segment.label}</span>\n </button>\n )\n })}\n </div>\n )\n}\n\n// Compact variant for tight spaces\nexport function CompactSegmentedControl({\n segments,\n value,\n onChange,\n}: Omit<SegmentedControlProps, 'size' | 'fullWidth'>) {\n return (\n <SegmentedControl\n segments={segments}\n value={value}\n onChange={onChange}\n size=\"sm\"\n />\n )\n}\n","import { useTranslations } from 'next-intl'\nimport { motion } from 'framer-motion'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype PageIndicatorProps = {\n /** Total number of pages */\n count: number\n /** Currently active page (0-indexed) */\n active: number\n /** Callback when a dot is clicked */\n onChange?: (index: number) => void\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Color variant */\n variant?: 'default' | 'light' | 'dark'\n}\n\nconst sizeConfig = {\n sm: { dot: 6, activeDot: 6, gap: 6 },\n md: { dot: 8, activeDot: 8, gap: 8 },\n lg: { dot: 10, activeDot: 10, gap: 10 },\n}\n\nconst variantConfig = {\n default: {\n active: 'bg-[#007AFF]',\n inactive: 'bg-gray-300 dark:bg-gray-600',\n },\n light: {\n active: 'bg-white',\n inactive: 'bg-white/40',\n },\n dark: {\n active: 'bg-gray-900',\n inactive: 'bg-gray-900/30',\n },\n}\n\nexport function PageIndicator({\n count,\n active,\n onChange,\n size = 'md',\n variant = 'default',\n}: PageIndicatorProps) {\n const t = useTranslations('common')\n const { dot, gap } = sizeConfig[size]\n const colors = variantConfig[variant]\n\n const handleClick = (index: number) => {\n if (onChange && index !== active) {\n triggerHaptic('light')\n onChange(index)\n }\n }\n\n return (\n <div\n className=\"flex items-center justify-center\"\n style={{ gap }}\n role=\"tablist\"\n aria-label={t('pageIndicators')}\n >\n {Array.from({ length: count }, (_, index) => {\n const isActive = index === active\n\n return (\n <motion.button\n key={index}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-label={t('pageNumber', { number: index + 1 })}\n onClick={() => handleClick(index)}\n className={`\n rounded-full transition-colors duration-200\n ${onChange ? 'cursor-pointer' : 'cursor-default'}\n ${isActive ? colors.active : colors.inactive}\n `}\n style={{\n width: dot,\n height: dot,\n }}\n animate={{\n scale: isActive ? 1.2 : 1,\n opacity: isActive ? 1 : 0.5,\n }}\n transition={{\n type: 'spring',\n stiffness: 500,\n damping: 30,\n }}\n whileTap={onChange ? { scale: 0.9 } : undefined}\n />\n )\n })}\n </div>\n )\n}\n\n// Expanding dot variant (active dot is wider)\ntype ExpandingPageIndicatorProps = Omit<PageIndicatorProps, 'size'> & {\n /** Width of active indicator */\n activeWidth?: number\n}\n\nexport function ExpandingPageIndicator({\n count,\n active,\n onChange,\n variant = 'default',\n activeWidth = 24,\n}: ExpandingPageIndicatorProps) {\n const t = useTranslations('common')\n const colors = variantConfig[variant]\n\n const handleClick = (index: number) => {\n if (onChange && index !== active) {\n triggerHaptic('light')\n onChange(index)\n }\n }\n\n return (\n <div\n className=\"flex items-center justify-center gap-2\"\n role=\"tablist\"\n aria-label={t('pageIndicators')}\n >\n {Array.from({ length: count }, (_, index) => {\n const isActive = index === active\n\n return (\n <motion.button\n key={index}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-label={t('pageNumber', { number: index + 1 })}\n onClick={() => handleClick(index)}\n className={`\n h-2 rounded-full transition-colors duration-200\n ${onChange ? 'cursor-pointer' : 'cursor-default'}\n ${isActive ? colors.active : colors.inactive}\n `}\n animate={{\n width: isActive ? activeWidth : 8,\n opacity: isActive ? 1 : 0.5,\n }}\n transition={{\n type: 'spring',\n stiffness: 500,\n damping: 30,\n }}\n whileTap={onChange ? { scale: 0.9 } : undefined}\n />\n )\n })}\n </div>\n )\n}\n\n// Progress indicator variant (shows progress through steps)\ntype ProgressIndicatorProps = {\n /** Total number of steps */\n steps: number\n /** Current step (0-indexed) */\n current: number\n /** Show step numbers */\n showNumbers?: boolean\n}\n\nexport function ProgressIndicator({\n steps,\n current,\n showNumbers = false,\n}: ProgressIndicatorProps) {\n return (\n <div className=\"flex items-center justify-center gap-2\">\n {Array.from({ length: steps }, (_, index) => {\n const isCompleted = index < current\n const isCurrent = index === current\n const isPending = index > current\n\n return (\n <div key={index} className=\"flex items-center\">\n {/* Step dot/number */}\n <motion.div\n className={`\n flex items-center justify-center rounded-full\n ${showNumbers ? 'w-8 h-8 text-sm font-medium' : 'w-3 h-3'}\n ${isCompleted ? 'bg-[#34C759] text-white' : ''}\n ${isCurrent ? 'bg-[#007AFF] text-white ring-4 ring-[#007AFF]/20' : ''}\n ${isPending ? 'bg-gray-200 dark:bg-gray-700 text-gray-500' : ''}\n `}\n animate={{\n scale: isCurrent ? 1.1 : 1,\n }}\n transition={{\n type: 'spring',\n stiffness: 500,\n damping: 30,\n }}\n >\n {showNumbers && (\n isCompleted ? (\n <CheckIcon className=\"w-4 h-4\" />\n ) : (\n index + 1\n )\n )}\n </motion.div>\n\n {/* Connector line */}\n {index < steps - 1 && (\n <div\n className={`\n w-8 h-0.5 mx-1\n ${isCompleted ? 'bg-[#34C759]' : 'bg-gray-200 dark:bg-gray-700'}\n `}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction CheckIcon({ className }: { className?: string }) {\n return (\n <svg\n className={className}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={3}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )\n}\n","import { Fragment, useRef, useState, useEffect } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype ActionMenuItem = {\n label: string\n icon?: React.ReactNode\n onClick: () => void\n destructive?: boolean\n disabled?: boolean\n}\n\ntype ActionMenuGroup = {\n title?: string\n items: ActionMenuItem[]\n}\n\ntype ActionMenuProps = {\n /** Menu trigger element */\n trigger: React.ReactNode\n /** Menu items or groups */\n items: ActionMenuItem[] | ActionMenuGroup[]\n /** Alignment relative to trigger */\n align?: 'start' | 'center' | 'end'\n /** Side relative to trigger */\n side?: 'top' | 'bottom'\n}\n\nfunction isGrouped(items: ActionMenuItem[] | ActionMenuGroup[]): items is ActionMenuGroup[] {\n return items.length > 0 && 'items' in items[0]\n}\n\nexport function ActionMenu({\n trigger,\n items,\n align = 'end',\n side = 'bottom',\n}: ActionMenuProps) {\n const [isOpen, setIsOpen] = useState(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (\n triggerRef.current?.contains(e.target as Node) ||\n menuRef.current?.contains(e.target as Node)\n ) {\n return\n }\n setIsOpen(false)\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n const handleToggle = () => {\n triggerHaptic('light')\n setIsOpen(!isOpen)\n }\n\n const handleItemClick = (item: ActionMenuItem) => {\n if (item.disabled) return\n triggerHaptic(item.destructive ? 'warning' : 'selection')\n item.onClick()\n setIsOpen(false)\n }\n\n const alignmentClasses = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n }\n\n const sideClasses = {\n top: 'bottom-full mb-2',\n bottom: 'top-full mt-2',\n }\n\n const renderItems = (menuItems: ActionMenuItem[], prefix = '') => (\n <div className=\"py-1\">\n {menuItems.map((item) => (\n <button\n key={`${prefix}${item.label}`}\n type=\"button\"\n onClick={() => handleItemClick(item)}\n disabled={item.disabled}\n className={`\n w-full flex items-center gap-3 px-4 py-2.5 text-left\n transition-colors duration-150\n ${item.destructive\n ? 'text-[#FF3B30] hover:bg-[#FF3B30]/10'\n : 'text-gray-900 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700'\n }\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n >\n {item.icon && (\n <span className={`shrink-0 ${item.destructive ? 'text-[#FF3B30]' : 'text-gray-500 dark:text-gray-400'}`}>\n {item.icon}\n </span>\n )}\n <span className=\"font-medium\">{item.label}</span>\n </button>\n ))}\n </div>\n )\n\n return (\n <div className=\"relative inline-block\">\n {/* Trigger */}\n <div ref={triggerRef} onClick={handleToggle} className=\"cursor-pointer\">\n {trigger}\n </div>\n\n {/* Menu */}\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop for mobile */}\n <div\n className=\"fixed inset-0 z-40 md:hidden\"\n onClick={() => setIsOpen(false)}\n />\n\n <motion.div\n ref={menuRef}\n initial={{ opacity: 0, scale: 0.95, y: side === 'bottom' ? -10 : 10 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n exit={{ opacity: 0, scale: 0.95, y: side === 'bottom' ? -10 : 10 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className={`\n absolute z-50 min-w-[200px] max-w-[300px]\n bg-white/95 dark:bg-gray-800/95 backdrop-blur-xl\n rounded-xl border border-gray-200/50 dark:border-gray-700/50\n shadow-xl overflow-hidden\n ${alignmentClasses[align]}\n ${sideClasses[side]}\n `}\n >\n {isGrouped(items) ? (\n items.map((group, groupIndex) => (\n <Fragment key={group.title || `group-${groupIndex}`}>\n {groupIndex > 0 && (\n <div className=\"h-px bg-gray-200 dark:bg-gray-700 my-1\" />\n )}\n {group.title && (\n <div className=\"px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider\">\n {group.title}\n </div>\n )}\n {renderItems(group.items, `${group.title || groupIndex}-`)}\n </Fragment>\n ))\n ) : (\n renderItems(items as ActionMenuItem[])\n )}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </div>\n )\n}\n\n// Context menu variant (appears on right-click or long-press)\ntype ContextMenuProps = {\n children: React.ReactNode\n items: ActionMenuItem[] | ActionMenuGroup[]\n}\n\nexport function ContextMenu({ children, items }: ContextMenuProps) {\n const [isOpen, setIsOpen] = useState(false)\n const [position, setPosition] = useState({ x: 0, y: 0 })\n const menuRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!isOpen) return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (!menuRef.current?.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n const handleContextMenu = (e: React.MouseEvent) => {\n e.preventDefault()\n triggerHaptic('light')\n setPosition({ x: e.clientX, y: e.clientY })\n setIsOpen(true)\n }\n\n const handleItemClick = (item: ActionMenuItem) => {\n if (item.disabled) return\n triggerHaptic(item.destructive ? 'warning' : 'selection')\n item.onClick()\n setIsOpen(false)\n }\n\n const renderContextItems = (menuItems: ActionMenuItem[], prefix = '') => (\n <div className=\"py-1\">\n {menuItems.map((item) => (\n <button\n key={`${prefix}${item.label}`}\n type=\"button\"\n onClick={() => handleItemClick(item)}\n disabled={item.disabled}\n className={`\n w-full flex items-center gap-3 px-4 py-2.5 text-left\n transition-colors duration-150\n ${item.destructive\n ? 'text-[#FF3B30] hover:bg-[#FF3B30]/10'\n : 'text-gray-900 dark:text-white hover:bg-gray-100 dark:hover:bg-gray-700'\n }\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n >\n {item.icon && (\n <span className={`shrink-0 ${item.destructive ? 'text-[#FF3B30]' : 'text-gray-500 dark:text-gray-400'}`}>\n {item.icon}\n </span>\n )}\n <span className=\"font-medium\">{item.label}</span>\n </button>\n ))}\n </div>\n )\n\n return (\n <>\n <div onContextMenu={handleContextMenu}>{children}</div>\n\n <AnimatePresence>\n {isOpen && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setIsOpen(false)} />\n\n <motion.div\n ref={menuRef}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className=\"fixed z-50 min-w-[200px] max-w-[300px]\n bg-white/95 dark:bg-gray-800/95 backdrop-blur-xl\n rounded-xl border border-gray-200/50 dark:border-gray-700/50\n shadow-xl overflow-hidden\"\n style={{\n left: position.x,\n top: position.y,\n }}\n >\n {isGrouped(items) ? (\n items.map((group, groupIndex) => (\n <Fragment key={group.title || `ctx-group-${groupIndex}`}>\n {groupIndex > 0 && (\n <div className=\"h-px bg-gray-200 dark:bg-gray-700 my-1\" />\n )}\n {group.title && (\n <div className=\"px-4 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider\">\n {group.title}\n </div>\n )}\n {renderContextItems(group.items, `${group.title || groupIndex}-`)}\n </Fragment>\n ))\n ) : (\n renderContextItems(items as ActionMenuItem[])\n )}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n </>\n )\n}\n","import { useRef, useState, useCallback, ReactNode } from 'react'\nimport { motion, useMotionValue, useTransform, animate, PanInfo } from 'framer-motion'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype SwipeAction = {\n /** Action label */\n label: string\n /** Action icon */\n icon?: ReactNode\n /** Background color */\n color: string\n /** Text color */\n textColor: string\n /** Callback when action is triggered */\n onAction: () => void\n}\n\ntype SwipeableRowProps = {\n /** Row content */\n children: ReactNode\n /** Actions revealed on left swipe */\n leftActions?: SwipeAction[]\n /** Actions revealed on right swipe */\n rightActions?: SwipeAction[]\n /** Width of each action button (default: 80) */\n actionWidth?: number\n /** Threshold to trigger full swipe action (default: 0.5) */\n fullSwipeThreshold?: number\n /** Enable full swipe to trigger first action */\n enableFullSwipe?: boolean\n /** Additional className */\n className?: string\n}\n\nexport function SwipeableRow({\n children,\n leftActions = [],\n rightActions = [],\n actionWidth = 80,\n fullSwipeThreshold = 0.5,\n enableFullSwipe = true,\n className = '',\n}: SwipeableRowProps) {\n const x = useMotionValue(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const [isDragging, setIsDragging] = useState(false)\n const hasTriggeredHaptic = useRef(false)\n\n const leftActionsWidth = leftActions.length * actionWidth\n const rightActionsWidth = rightActions.length * actionWidth\n\n // Calculate constraints\n const leftConstraint = rightActions.length > 0 ? -rightActionsWidth : 0\n const rightConstraint = leftActions.length > 0 ? leftActionsWidth : 0\n\n // Background opacity based on swipe distance\n const leftBgOpacity = useTransform(x, [0, leftActionsWidth], [0, 1])\n const rightBgOpacity = useTransform(x, [-rightActionsWidth, 0], [1, 0])\n\n const handleDragStart = useCallback(() => {\n setIsDragging(true)\n hasTriggeredHaptic.current = false\n }, [])\n\n const handleDrag = useCallback((_: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n const currentX = x.get()\n\n // Full swipe haptic feedback\n if (enableFullSwipe) {\n const containerWidth = containerRef.current?.offsetWidth || 300\n const fullSwipeDistance = containerWidth * fullSwipeThreshold\n\n if (Math.abs(currentX) >= fullSwipeDistance && !hasTriggeredHaptic.current) {\n triggerHaptic('medium')\n hasTriggeredHaptic.current = true\n } else if (Math.abs(currentX) < fullSwipeDistance && hasTriggeredHaptic.current) {\n hasTriggeredHaptic.current = false\n }\n }\n }, [x, enableFullSwipe, fullSwipeThreshold])\n\n const handleDragEnd = useCallback((_: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n setIsDragging(false)\n const currentX = x.get()\n const velocity = info.velocity.x\n const containerWidth = containerRef.current?.offsetWidth || 300\n\n // Check for full swipe action\n if (enableFullSwipe) {\n const fullSwipeDistance = containerWidth * fullSwipeThreshold\n\n if (currentX >= fullSwipeDistance && leftActions.length > 0) {\n // Full swipe right - trigger first left action\n triggerHaptic('success')\n animate(x, containerWidth, { type: 'spring', stiffness: 400, damping: 30 })\n setTimeout(() => {\n leftActions[0].onAction()\n animate(x, 0, { type: 'spring', stiffness: 400, damping: 30 })\n }, 200)\n return\n }\n\n if (currentX <= -fullSwipeDistance && rightActions.length > 0) {\n // Full swipe left - trigger first right action\n triggerHaptic('success')\n animate(x, -containerWidth, { type: 'spring', stiffness: 400, damping: 30 })\n setTimeout(() => {\n rightActions[0].onAction()\n animate(x, 0, { type: 'spring', stiffness: 400, damping: 30 })\n }, 200)\n return\n }\n }\n\n // Snap to actions or back to center\n let targetX = 0\n\n if (currentX > actionWidth / 2 || velocity > 500) {\n targetX = leftActionsWidth\n } else if (currentX < -actionWidth / 2 || velocity < -500) {\n targetX = -rightActionsWidth\n }\n\n animate(x, targetX, { type: 'spring', stiffness: 400, damping: 30 })\n }, [x, enableFullSwipe, fullSwipeThreshold, leftActions, rightActions, leftActionsWidth, rightActionsWidth, actionWidth])\n\n const handleActionClick = (action: SwipeAction) => {\n triggerHaptic('light')\n action.onAction()\n animate(x, 0, { type: 'spring', stiffness: 400, damping: 30 })\n }\n\n const closeActions = useCallback(() => {\n animate(x, 0, { type: 'spring', stiffness: 400, damping: 30 })\n }, [x])\n\n return (\n <div ref={containerRef} className={`relative overflow-hidden ${className}`}>\n {/* Left actions (revealed on right swipe) */}\n {leftActions.length > 0 && (\n <motion.div\n className=\"absolute inset-y-0 left-0 flex\"\n style={{ opacity: leftBgOpacity }}\n >\n {leftActions.map((action, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleActionClick(action)}\n className=\"flex flex-col items-center justify-center text-sm font-medium\"\n style={{\n width: actionWidth,\n backgroundColor: action.color,\n color: action.textColor,\n }}\n >\n {action.icon && <span className=\"mb-1\">{action.icon}</span>}\n {action.label}\n </button>\n ))}\n </motion.div>\n )}\n\n {/* Right actions (revealed on left swipe) */}\n {rightActions.length > 0 && (\n <motion.div\n className=\"absolute inset-y-0 right-0 flex\"\n style={{ opacity: rightBgOpacity }}\n >\n {rightActions.map((action, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => handleActionClick(action)}\n className=\"flex flex-col items-center justify-center text-sm font-medium\"\n style={{\n width: actionWidth,\n backgroundColor: action.color,\n color: action.textColor,\n }}\n >\n {action.icon && <span className=\"mb-1\">{action.icon}</span>}\n {action.label}\n </button>\n ))}\n </motion.div>\n )}\n\n {/* Main content */}\n <motion.div\n drag=\"x\"\n dragConstraints={{ left: leftConstraint, right: rightConstraint }}\n dragElastic={0.1}\n onDragStart={handleDragStart}\n onDrag={handleDrag}\n onDragEnd={handleDragEnd}\n style={{ x }}\n className=\"relative bg-white dark:bg-gray-800 cursor-grab active:cursor-grabbing\"\n >\n {children}\n </motion.div>\n </div>\n )\n}\n\n// Pre-configured delete action\nexport function DeleteSwipeAction(onDelete: () => void): SwipeAction {\n return {\n label: 'Delete',\n color: '#FF3B30',\n textColor: 'white',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n ),\n onAction: onDelete,\n }\n}\n\n// Pre-configured archive action\nexport function ArchiveSwipeAction(onArchive: () => void): SwipeAction {\n return {\n label: 'Archive',\n color: '#FF9500',\n textColor: 'white',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4\" />\n </svg>\n ),\n onAction: onArchive,\n }\n}\n\n// Pre-configured edit action\nexport function EditSwipeAction(onEdit: () => void): SwipeAction {\n return {\n label: 'Edit',\n color: '#007AFF',\n textColor: 'white',\n icon: (\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n ),\n onAction: onEdit,\n }\n}\n\n// Pre-configured favorite/star action\nexport function FavoriteSwipeAction(onFavorite: () => void, isFavorite = false): SwipeAction {\n return {\n label: isFavorite ? 'Unfave' : 'Favorite',\n color: '#FFCC00',\n textColor: '#000',\n icon: (\n <svg className=\"w-5 h-5\" fill={isFavorite ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" />\n </svg>\n ),\n onAction: onFavorite,\n }\n}\n","/**\n * iOS-style pull-to-refresh hook\n * Provides pull-down gesture detection for refreshing content\n */\n\nimport React, { useState, useCallback, useRef, useEffect } from 'react'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype PullToRefreshOptions = {\n /** Callback when refresh is triggered */\n onRefresh: () => Promise<void>\n /** Pull distance to trigger refresh (default: 80) */\n threshold?: number\n /** Maximum pull distance (default: 120) */\n maxPull?: number\n /** Enable/disable the hook (default: true) */\n enabled?: boolean\n}\n\ntype PullToRefreshState = {\n /** Current pull distance */\n pullDistance: number\n /** Whether refresh is in progress */\n isRefreshing: boolean\n /** Whether pull threshold is reached */\n canRefresh: boolean\n}\n\nexport function usePullToRefresh(options: PullToRefreshOptions) {\n const {\n onRefresh,\n threshold = 80,\n maxPull = 120,\n enabled = true,\n } = options\n\n const [state, setState] = useState<PullToRefreshState>({\n pullDistance: 0,\n isRefreshing: false,\n canRefresh: false,\n })\n\n const startY = useRef<number | null>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const hasTriggeredHaptic = useRef(false)\n\n const handleTouchStart = useCallback((e: TouchEvent) => {\n if (!enabled || state.isRefreshing) return\n\n // Only activate when scrolled to top\n const container = containerRef.current\n if (container && container.scrollTop > 0) return\n\n startY.current = e.touches[0].clientY\n hasTriggeredHaptic.current = false\n }, [enabled, state.isRefreshing])\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n if (!enabled || startY.current === null || state.isRefreshing) return\n\n const currentY = e.touches[0].clientY\n const deltaY = currentY - startY.current\n\n // Only allow pulling down\n if (deltaY < 0) {\n setState(prev => ({ ...prev, pullDistance: 0, canRefresh: false }))\n return\n }\n\n // Apply resistance (diminishing returns)\n const resistance = 0.5\n const pullDistance = Math.min(deltaY * resistance, maxPull)\n const canRefresh = pullDistance >= threshold\n\n // Haptic feedback when threshold is crossed\n if (canRefresh && !hasTriggeredHaptic.current) {\n triggerHaptic('medium')\n hasTriggeredHaptic.current = true\n } else if (!canRefresh && hasTriggeredHaptic.current) {\n hasTriggeredHaptic.current = false\n }\n\n setState(prev => ({ ...prev, pullDistance, canRefresh }))\n }, [enabled, state.isRefreshing, threshold, maxPull])\n\n const handleTouchEnd = useCallback(async () => {\n if (!enabled || startY.current === null) return\n\n startY.current = null\n\n if (state.canRefresh && !state.isRefreshing) {\n setState(prev => ({ ...prev, isRefreshing: true, pullDistance: threshold }))\n triggerHaptic('success')\n\n try {\n await onRefresh()\n } finally {\n setState({ pullDistance: 0, isRefreshing: false, canRefresh: false })\n }\n } else {\n setState(prev => ({ ...prev, pullDistance: 0, canRefresh: false }))\n }\n }, [enabled, state.canRefresh, state.isRefreshing, threshold, onRefresh])\n\n useEffect(() => {\n const container = containerRef.current\n if (!container || !enabled) return\n\n container.addEventListener('touchstart', handleTouchStart, { passive: true })\n container.addEventListener('touchmove', handleTouchMove, { passive: true })\n container.addEventListener('touchend', handleTouchEnd, { passive: true })\n\n return () => {\n container.removeEventListener('touchstart', handleTouchStart)\n container.removeEventListener('touchmove', handleTouchMove)\n container.removeEventListener('touchend', handleTouchEnd)\n }\n }, [enabled, handleTouchStart, handleTouchMove, handleTouchEnd])\n\n // Calculate progress (0-1)\n const progress = Math.min(state.pullDistance / threshold, 1)\n\n return {\n containerRef,\n pullDistance: state.pullDistance,\n isRefreshing: state.isRefreshing,\n canRefresh: state.canRefresh,\n progress,\n }\n}\n\n/**\n * Pull-to-refresh indicator component\n */\nexport function PullToRefreshIndicator({\n pullDistance,\n isRefreshing,\n threshold = 80,\n}: {\n pullDistance: number\n isRefreshing: boolean\n threshold?: number\n}) {\n const progress = Math.min(pullDistance / threshold, 1)\n const rotation = progress * 360\n\n if (pullDistance === 0 && !isRefreshing) return null\n\n return (\n <div\n className=\"absolute left-1/2 -translate-x-1/2 z-10 flex items-center justify-center\"\n style={{ top: Math.max(pullDistance - 40, 8) }}\n >\n <div\n className={`\n h-8 w-8 rounded-full bg-white dark:bg-gray-800\n shadow-lg border border-gray-200 dark:border-gray-700\n flex items-center justify-center\n transition-transform duration-200\n `}\n >\n {isRefreshing ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-gray-300 border-t-blue-500\" />\n ) : (\n <svg\n className=\"h-5 w-5 text-gray-600 dark:text-gray-400\"\n style={{ transform: `rotate(${rotation}deg)` }}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n )}\n </div>\n </div>\n )\n}\n","import clsx from 'clsx'\nimport type React from 'react'\nimport { createContext, useContext, useState } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Link } from '@ui/components/link'\nimport { ChevronUpIcon, ChevronDownIcon, ChevronUpDownIcon } from '@heroicons/react/24/outline'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\nimport { springPresets, getTransition } from '@ui/lib/animations'\n\ntype SortDirection = 'asc' | 'desc' | null\n\nconst TableContext = createContext<{\n bleed: boolean\n dense: boolean\n grid: boolean\n striped: boolean\n loading?: boolean\n emptyState?: React.ReactNode\n}>({\n bleed: false,\n dense: false,\n grid: false,\n striped: false,\n loading: false,\n emptyState: undefined,\n})\n\nexport function Table({\n bleed = false,\n dense = false,\n grid = false,\n striped = false,\n loading = false,\n emptyState,\n className,\n children,\n ...props\n}: {\n bleed?: boolean\n dense?: boolean\n grid?: boolean\n striped?: boolean\n /** Show loading skeleton */\n loading?: boolean\n /** Custom empty state component */\n emptyState?: React.ReactNode\n} & React.ComponentPropsWithoutRef<'div'>) {\n return (\n <TableContext.Provider value={{ bleed, dense, grid, striped, loading, emptyState }}>\n <div className=\"flow-root\">\n <div {...props} className={clsx(className, '-mx-(--gutter) overflow-x-auto whitespace-nowrap')}>\n <div className={clsx('inline-block min-w-full align-middle', !bleed && 'sm:px-(--gutter)')}>\n <table className=\"min-w-full text-left text-sm/6 text-zinc-950 dark:text-white\">{children}</table>\n </div>\n </div>\n </div>\n </TableContext.Provider>\n )\n}\n\nexport function TableHead({ className, ...props }: React.ComponentPropsWithoutRef<'thead'>) {\n return <thead {...props} className={clsx(className, 'text-zinc-500 dark:text-zinc-400')} />\n}\n\nexport function TableBody(props: React.ComponentPropsWithoutRef<'tbody'>) {\n return <tbody {...props} />\n}\n\nconst TableRowContext = createContext<{ href?: string; target?: string; title?: string }>({\n href: undefined,\n target: undefined,\n title: undefined,\n})\n\nexport function TableRow({\n href,\n target,\n title,\n className,\n ...props\n}: { href?: string; target?: string; title?: string } & React.ComponentPropsWithoutRef<'tr'>) {\n let { striped } = useContext(TableContext)\n\n return (\n <TableRowContext.Provider value={{ href, target, title } as React.ContextType<typeof TableRowContext>}>\n <tr\n {...props}\n className={clsx(\n className,\n href &&\n 'has-[[data-row-link][data-focus]]:outline-2 has-[[data-row-link][data-focus]]:-outline-offset-2 has-[[data-row-link][data-focus]]:outline-blue-500 dark:focus-within:bg-white/2.5',\n striped && 'even:bg-zinc-950/2.5 dark:even:bg-white/2.5',\n href && striped && 'hover:bg-zinc-950/5 dark:hover:bg-white/5',\n href && !striped && 'hover:bg-zinc-950/2.5 dark:hover:bg-white/2.5'\n )}\n />\n </TableRowContext.Provider>\n )\n}\n\nexport function TableHeader({ className, ...props }: React.ComponentPropsWithoutRef<'th'>) {\n let { bleed, grid } = useContext(TableContext)\n\n return (\n <th\n {...props}\n className={clsx(\n className,\n 'border-b border-b-zinc-950/10 px-4 py-2 font-medium first:pl-(--gutter,--spacing(2)) last:pr-(--gutter,--spacing(2)) dark:border-b-white/10',\n grid && 'border-l border-l-zinc-950/5 first:border-l-0 dark:border-l-white/5',\n !bleed && 'sm:first:pl-1 sm:last:pr-1'\n )}\n />\n )\n}\n\nexport function TableCell({ className, children, ...props }: React.ComponentPropsWithoutRef<'td'>) {\n let { bleed, dense, grid, striped } = useContext(TableContext)\n let { href, target, title } = useContext(TableRowContext)\n let [cellRef, setCellRef] = useState<HTMLElement | null>(null)\n\n return (\n <td\n ref={href ? setCellRef : undefined}\n {...props}\n className={clsx(\n className,\n 'relative px-4 first:pl-(--gutter,--spacing(2)) last:pr-(--gutter,--spacing(2))',\n !striped && 'border-b border-zinc-950/5 dark:border-white/5',\n grid && 'border-l border-l-zinc-950/5 first:border-l-0 dark:border-l-white/5',\n dense ? 'py-2.5' : 'py-4',\n !bleed && 'sm:first:pl-1 sm:last:pr-1'\n )}\n >\n {href && (\n <Link\n data-row-link\n href={href}\n target={target}\n aria-label={title}\n tabIndex={cellRef?.previousElementSibling === null ? 0 : -1}\n className=\"absolute inset-0 focus:outline-hidden\"\n />\n )}\n {children}\n </td>\n )\n}\n\n/**\n * Sortable Table Header - iOS style with haptic feedback\n */\nexport function SortableTableHeader({\n className,\n children,\n sortKey,\n currentSort,\n currentDirection,\n onSort,\n ...props\n}: {\n sortKey: string\n currentSort?: string\n currentDirection?: SortDirection\n onSort?: (key: string, direction: SortDirection) => void\n} & React.ComponentPropsWithoutRef<'th'>) {\n let { bleed, grid } = useContext(TableContext)\n const isActive = currentSort === sortKey\n const direction = isActive ? currentDirection : null\n\n const handleSort = () => {\n triggerHaptic('light')\n if (!isActive) {\n onSort?.(sortKey, 'asc')\n } else if (direction === 'asc') {\n onSort?.(sortKey, 'desc')\n } else {\n onSort?.(sortKey, null)\n }\n }\n\n return (\n <th\n {...props}\n onClick={handleSort}\n className={clsx(\n className,\n 'border-b border-b-zinc-950/10 px-4 py-2 font-medium first:pl-(--gutter,--spacing(2)) last:pr-(--gutter,--spacing(2)) dark:border-b-white/10',\n grid && 'border-l border-l-zinc-950/5 first:border-l-0 dark:border-l-white/5',\n !bleed && 'sm:first:pl-1 sm:last:pr-1',\n 'cursor-pointer select-none hover:bg-zinc-950/5 dark:hover:bg-white/5 transition-colors',\n isActive && 'text-[#007AFF] dark:text-[#0A84FF]'\n )}\n >\n <div className=\"flex items-center gap-1.5\">\n <span>{children}</span>\n <motion.span\n initial={false}\n animate={{ opacity: 1 }}\n transition={getTransition(springPresets.stiff)}\n className=\"flex-shrink-0\"\n >\n {direction === 'asc' ? (\n <ChevronUpIcon className=\"h-4 w-4\" />\n ) : direction === 'desc' ? (\n <ChevronDownIcon className=\"h-4 w-4\" />\n ) : (\n <ChevronUpDownIcon className=\"h-4 w-4 opacity-40\" />\n )}\n </motion.span>\n </div>\n </th>\n )\n}\n\n/**\n * Table Skeleton Row - Loading placeholder\n */\nexport function TableSkeletonRow({\n columns = 4,\n className,\n}: {\n columns?: number\n className?: string\n}) {\n const { dense } = useContext(TableContext)\n\n return (\n <tr className={className}>\n {Array.from({ length: columns }).map((_, i) => (\n <td\n key={i}\n className={clsx(\n 'px-4 first:pl-(--gutter,--spacing(2)) last:pr-(--gutter,--spacing(2))',\n 'border-b border-zinc-950/5 dark:border-white/5',\n dense ? 'py-2.5' : 'py-4'\n )}\n >\n <div\n className={clsx(\n 'h-4 rounded bg-zinc-200 dark:bg-zinc-700 animate-pulse',\n i === 0 ? 'w-32' : i === columns - 1 ? 'w-16' : 'w-24'\n )}\n />\n </td>\n ))}\n </tr>\n )\n}\n\n/**\n * Table Skeleton - Multiple loading rows\n */\nexport function TableSkeleton({\n rows = 5,\n columns = 4,\n}: {\n rows?: number\n columns?: number\n}) {\n return (\n <TableBody>\n {Array.from({ length: rows }).map((_, i) => (\n <TableSkeletonRow key={i} columns={columns} />\n ))}\n </TableBody>\n )\n}\n\n/**\n * Table Empty State\n */\nexport function TableEmptyState({\n icon,\n title,\n description,\n action,\n colSpan = 1,\n}: {\n icon?: React.ReactNode\n title: string\n description?: string\n action?: React.ReactNode\n colSpan?: number\n}) {\n return (\n <TableBody>\n <tr>\n <td colSpan={colSpan} className=\"py-16 text-center\">\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n transition={getTransition(springPresets.gentle)}\n className=\"flex flex-col items-center gap-3\"\n >\n {icon && (\n <div className=\"h-12 w-12 rounded-full bg-zinc-100 dark:bg-zinc-800 flex items-center justify-center text-zinc-400 dark:text-zinc-500\">\n {icon}\n </div>\n )}\n <div className=\"space-y-1\">\n <h3 className=\"font-medium text-zinc-900 dark:text-white\">{title}</h3>\n {description && (\n <p className=\"text-sm text-zinc-500 dark:text-zinc-400 max-w-sm\">\n {description}\n </p>\n )}\n </div>\n {action && <div className=\"mt-2\">{action}</div>}\n </motion.div>\n </td>\n </tr>\n </TableBody>\n )\n}\n\n/**\n * Animated Table Row - With enter/exit animations\n */\nexport function AnimatedTableRow({\n href,\n target,\n title,\n className,\n index = 0,\n ...props\n}: {\n href?: string\n target?: string\n title?: string\n index?: number\n} & React.ComponentPropsWithoutRef<'tr'>) {\n let { striped } = useContext(TableContext)\n\n // Omit event handlers that conflict with Framer Motion's event signatures\n const { onDrag, onDragStart, onDragEnd, onAnimationStart, onAnimationEnd, onAnimationIteration, ...restProps } = props\n\n return (\n <TableRowContext.Provider value={{ href, target, title }}>\n <motion.tr\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, x: -20 }}\n transition={{\n ...getTransition(springPresets.gentle),\n delay: index * 0.03,\n }}\n {...restProps}\n className={clsx(\n className,\n href &&\n 'has-[[data-row-link][data-focus]]:outline-2 has-[[data-row-link][data-focus]]:-outline-offset-2 has-[[data-row-link][data-focus]]:outline-blue-500 dark:focus-within:bg-white/2.5',\n striped && 'even:bg-zinc-950/2.5 dark:even:bg-white/2.5',\n href && striped && 'hover:bg-zinc-950/5 dark:hover:bg-white/5',\n href && !striped && 'hover:bg-zinc-950/2.5 dark:hover:bg-white/2.5'\n )}\n />\n </TableRowContext.Provider>\n )\n}\n\n/**\n * Selectable Table Row - With checkbox\n */\nexport function SelectableTableRow({\n selected = false,\n onSelect,\n href,\n target,\n title,\n className,\n children,\n ...props\n}: {\n selected?: boolean\n onSelect?: (selected: boolean) => void\n href?: string\n target?: string\n title?: string\n} & React.ComponentPropsWithoutRef<'tr'>) {\n let { striped, dense } = useContext(TableContext)\n\n const handleSelect = () => {\n triggerHaptic('light')\n onSelect?.(!selected)\n }\n\n return (\n <TableRowContext.Provider value={{ href, target, title }}>\n <tr\n {...props}\n className={clsx(\n className,\n href &&\n 'has-[[data-row-link][data-focus]]:outline-2 has-[[data-row-link][data-focus]]:-outline-offset-2 has-[[data-row-link][data-focus]]:outline-blue-500 dark:focus-within:bg-white/2.5',\n striped && 'even:bg-zinc-950/2.5 dark:even:bg-white/2.5',\n href && striped && 'hover:bg-zinc-950/5 dark:hover:bg-white/5',\n href && !striped && 'hover:bg-zinc-950/2.5 dark:hover:bg-white/2.5',\n selected && 'bg-[#007AFF]/5 dark:bg-[#0A84FF]/10'\n )}\n >\n <td\n className={clsx(\n 'px-4 first:pl-(--gutter,--spacing(2))',\n 'border-b border-zinc-950/5 dark:border-white/5',\n dense ? 'py-2.5' : 'py-4'\n )}\n >\n <motion.button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selected}\n aria-label=\"Select row\"\n onClick={handleSelect}\n whileTap={{ scale: 0.9 }}\n transition={getTransition(springPresets.stiff)}\n className={clsx(\n 'h-5 w-5 rounded-full border-2 flex items-center justify-center transition-colors',\n selected\n ? 'bg-[#007AFF] dark:bg-[#0A84FF] border-[#007AFF] dark:border-[#0A84FF]'\n : 'border-zinc-300 dark:border-zinc-600'\n )}\n >\n <AnimatePresence>\n {selected && (\n <motion.svg\n initial={{ scale: 0 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0 }}\n transition={getTransition(springPresets.bouncy)}\n className=\"h-3 w-3 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={3}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </motion.svg>\n )}\n </AnimatePresence>\n </motion.button>\n </td>\n {children}\n </tr>\n </TableRowContext.Provider>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { useTranslations } from 'next-intl'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\nimport { springPresets, getTransition } from '@ui/lib/animations'\nimport {\n ExclamationTriangleIcon,\n WifiIcon,\n ArrowPathIcon,\n ShieldExclamationIcon,\n DocumentMagnifyingGlassIcon,\n FolderOpenIcon,\n ServerStackIcon,\n} from '@heroicons/react/24/outline'\n\ntype EmptyStateProps = {\n /** Main message/title */\n message: string\n /** Optional detailed description */\n description?: string\n /** Optional icon component */\n icon?: React.ComponentType<{ className?: string }>\n /** Optional action button */\n action?: {\n label: string\n onClick: () => void\n }\n /** Visual style variant */\n variant?: \"default\" | \"minimal\" | \"card\"\n}\n\n/**\n * iOS-style empty state component\n * Used when there's no content to display\n */\nexport function EmptyState({\n message,\n description,\n icon: Icon,\n action,\n variant = \"default\",\n}: EmptyStateProps) {\n const handleActionClick = () => {\n triggerHaptic(\"light\")\n action?.onClick()\n }\n\n const containerClasses = {\n default: \"bg-gray-50 dark:bg-gray-800/50 rounded-xl border border-dashed border-gray-300 dark:border-gray-600\",\n minimal: \"\",\n card: \"bg-white/70 dark:bg-gray-800/70 backdrop-blur-xl rounded-2xl shadow-lg shadow-black/5 border border-white/20 dark:border-gray-700/50\",\n }\n\n return (\n <div\n className={`px-6 py-12 text-center ${containerClasses[variant]}`}\n >\n {Icon && (\n <motion.div\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={springPresets.bouncy}\n className=\"mx-auto mb-4\"\n >\n <div className=\"inline-flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700/50\">\n <Icon className=\"h-8 w-8 text-gray-400 dark:text-gray-500\" />\n </div>\n </motion.div>\n )}\n\n <motion.div\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...springPresets.default, delay: 0.1 }}\n >\n <h3 className=\"text-base font-semibold text-gray-900 dark:text-white\">\n {message}\n </h3>\n\n {description && (\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400 max-w-sm mx-auto\">\n {description}\n </p>\n )}\n </motion.div>\n\n {action && (\n <motion.div\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...springPresets.default, delay: 0.2 }}\n className=\"mt-6\"\n >\n <motion.button\n whileTap={{ scale: 0.97 }}\n transition={springPresets.stiff}\n onClick={handleActionClick}\n className=\"inline-flex items-center justify-center rounded-full bg-blue-500 px-6 py-2.5 text-sm font-semibold text-white shadow-md hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-gray-900 transition-colors\"\n >\n {action.label}\n </motion.button>\n </motion.div>\n )}\n </div>\n )\n}\n\n/**\n * Error State Component - iOS style with retry logic\n */\ntype ErrorStateProps = {\n /** Error title */\n title?: string\n /** Error message/description */\n message?: string\n /** Error code (optional) */\n errorCode?: string | number\n /** Error type determines icon and styling */\n type?: \"generic\" | \"network\" | \"server\" | \"permission\" | \"notFound\"\n /** Retry callback */\n onRetry?: () => Promise<void> | void\n /** Retry button label */\n retryLabel?: string\n /** Secondary action */\n secondaryAction?: {\n label: string\n onClick: () => void\n }\n /** Show detailed error info toggle */\n showDetails?: boolean\n /** Detailed error info */\n details?: string\n /** Visual variant */\n variant?: \"default\" | \"minimal\" | \"card\" | \"fullscreen\"\n}\n\nconst errorTypeConfig = {\n generic: {\n icon: ExclamationTriangleIcon,\n titleKey: \"genericTitle\" as const,\n messageKey: \"genericMessage\" as const,\n iconBg: \"bg-[#FF3B30]/10 dark:bg-[#FF453A]/20\",\n iconColor: \"text-[#FF3B30] dark:text-[#FF453A]\",\n },\n network: {\n icon: WifiIcon,\n titleKey: \"networkTitle\" as const,\n messageKey: \"networkMessage\" as const,\n iconBg: \"bg-[#FF9500]/10 dark:bg-[#FF9F0A]/20\",\n iconColor: \"text-[#FF9500] dark:text-[#FF9F0A]\",\n },\n server: {\n icon: ServerStackIcon,\n titleKey: \"serverTitle\" as const,\n messageKey: \"serverMessage\" as const,\n iconBg: \"bg-[#FF3B30]/10 dark:bg-[#FF453A]/20\",\n iconColor: \"text-[#FF3B30] dark:text-[#FF453A]\",\n },\n permission: {\n icon: ShieldExclamationIcon,\n titleKey: \"permissionTitle\" as const,\n messageKey: \"permissionMessage\" as const,\n iconBg: \"bg-[#AF52DE]/10 dark:bg-[#BF5AF2]/20\",\n iconColor: \"text-[#AF52DE] dark:text-[#BF5AF2]\",\n },\n notFound: {\n icon: DocumentMagnifyingGlassIcon,\n titleKey: \"notFoundTitle\" as const,\n messageKey: \"notFoundMessage\" as const,\n iconBg: \"bg-zinc-100 dark:bg-zinc-800\",\n iconColor: \"text-zinc-400 dark:text-zinc-500\",\n },\n}\n\nexport function ErrorState({\n title,\n message,\n errorCode,\n type = \"generic\",\n onRetry,\n retryLabel,\n secondaryAction,\n showDetails = false,\n details,\n variant = \"default\",\n}: ErrorStateProps) {\n const t = useTranslations(\"common.errorState\")\n const [isRetrying, setIsRetrying] = useState(false)\n const [showErrorDetails, setShowErrorDetails] = useState(false)\n\n const config = errorTypeConfig[type]\n const Icon = config.icon\n const resolvedRetryLabel = retryLabel || t(\"tryAgain\")\n\n const handleRetry = useCallback(async () => {\n if (!onRetry || isRetrying) return\n\n setIsRetrying(true)\n triggerHaptic(\"medium\")\n\n try {\n await onRetry()\n } finally {\n setIsRetrying(false)\n }\n }, [onRetry, isRetrying])\n\n const toggleDetails = () => {\n triggerHaptic(\"light\")\n setShowErrorDetails(!showErrorDetails)\n }\n\n const containerClasses = {\n default: \"bg-gray-50 dark:bg-gray-800/50 rounded-xl border border-gray-200 dark:border-gray-700\",\n minimal: \"\",\n card: \"bg-white/70 dark:bg-gray-800/70 backdrop-blur-xl rounded-2xl shadow-lg shadow-black/5 border border-white/20 dark:border-gray-700/50\",\n fullscreen: \"fixed inset-0 flex items-center justify-center bg-white dark:bg-gray-900 z-50\",\n }\n\n const content = (\n <div role=\"alert\" className={variant === \"fullscreen\" ? \"\" : `px-6 py-12 text-center ${containerClasses[variant]}`}>\n {/* Icon */}\n <motion.div\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={getTransition(springPresets.bouncy)}\n className=\"mx-auto mb-4\"\n >\n <div className={`inline-flex h-16 w-16 items-center justify-center rounded-full ${config.iconBg}`}>\n <Icon className={`h-8 w-8 ${config.iconColor}`} />\n </div>\n </motion.div>\n\n {/* Title & Message */}\n <motion.div\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...getTransition(springPresets.default), delay: 0.1 }}\n >\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {title || t(config.titleKey)}\n </h3>\n\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400 max-w-sm mx-auto\">\n {message || t(config.messageKey)}\n </p>\n\n {errorCode && (\n <p className=\"mt-2 text-xs text-gray-400 dark:text-gray-500 font-mono\">\n {t(\"errorCode\", { code: errorCode })}\n </p>\n )}\n </motion.div>\n\n {/* Actions */}\n <motion.div\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...getTransition(springPresets.default), delay: 0.2 }}\n className=\"mt-6 flex flex-col sm:flex-row items-center justify-center gap-3\"\n >\n {onRetry && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n transition={getTransition(springPresets.stiff)}\n onClick={handleRetry}\n disabled={isRetrying}\n className=\"inline-flex items-center justify-center gap-2 rounded-full bg-[#007AFF] dark:bg-[#0A84FF] px-6 py-2.5 text-sm font-semibold text-white shadow-md hover:opacity-90 focus:outline-none focus:ring-2 focus:ring-[#007AFF] focus:ring-offset-2 dark:focus:ring-offset-gray-900 transition-all disabled:opacity-50\"\n >\n <AnimatePresence mode=\"wait\">\n {isRetrying ? (\n <motion.span\n key=\"loading\"\n initial={{ opacity: 0, rotate: 0 }}\n animate={{ opacity: 1, rotate: 360 }}\n exit={{ opacity: 0 }}\n transition={{ rotate: { duration: 1, repeat: Infinity, ease: \"linear\" } }}\n >\n <ArrowPathIcon className=\"h-4 w-4\" />\n </motion.span>\n ) : (\n <motion.span\n key=\"icon\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n >\n <ArrowPathIcon className=\"h-4 w-4\" />\n </motion.span>\n )}\n </AnimatePresence>\n {isRetrying ? t(\"retrying\") : resolvedRetryLabel}\n </motion.button>\n )}\n\n {secondaryAction && (\n <motion.button\n whileTap={{ scale: 0.97 }}\n transition={getTransition(springPresets.stiff)}\n onClick={() => {\n triggerHaptic(\"light\")\n secondaryAction.onClick()\n }}\n className=\"inline-flex items-center justify-center rounded-full px-6 py-2.5 text-sm font-semibold text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 focus:outline-none focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 dark:focus:ring-offset-gray-900 transition-colors\"\n >\n {secondaryAction.label}\n </motion.button>\n )}\n </motion.div>\n\n {/* Error Details Toggle */}\n {showDetails && details && (\n <motion.div\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...getTransition(springPresets.default), delay: 0.3 }}\n className=\"mt-6\"\n >\n <button\n onClick={toggleDetails}\n className=\"text-xs text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-400 transition-colors\"\n >\n {showErrorDetails ? t(\"hideDetails\") : t(\"showDetails\")}\n </button>\n\n <AnimatePresence>\n {showErrorDetails && (\n <motion.div\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={getTransition(springPresets.gentle)}\n className=\"overflow-hidden\"\n >\n <pre className=\"mt-3 p-3 bg-gray-100 dark:bg-gray-800 rounded-lg text-xs text-left text-gray-600 dark:text-gray-400 font-mono overflow-x-auto max-h-32\">\n {details}\n </pre>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n </div>\n )\n\n if (variant === \"fullscreen\") {\n return (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className={containerClasses.fullscreen}\n >\n <div className=\"px-6 py-12 text-center max-w-md\">{content}</div>\n </motion.div>\n )\n }\n\n return content\n}\n\n/**\n * Offline State - Specialized error state for network issues\n */\nexport function OfflineState({\n onRetry,\n message,\n}: {\n onRetry?: () => Promise<void> | void\n message?: string\n}) {\n const t = useTranslations(\"common.errorState\")\n return (\n <ErrorState\n type=\"network\"\n title={t(\"offlineTitle\")}\n message={message || t(\"offlineMessage\")}\n onRetry={onRetry}\n retryLabel={t(\"retryConnection\")}\n variant=\"card\"\n />\n )\n}\n\n/**\n * No Results State - For empty search/filter results\n */\nexport function NoResultsState({\n searchTerm,\n onClearFilters,\n suggestions,\n}: {\n searchTerm?: string\n onClearFilters?: () => void\n suggestions?: string[]\n}) {\n const t = useTranslations(\"common.emptyState\")\n return (\n <div className=\"px-6 py-12 text-center\">\n <motion.div\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={getTransition(springPresets.bouncy)}\n className=\"mx-auto mb-4\"\n >\n <div className=\"inline-flex h-16 w-16 items-center justify-center rounded-full bg-zinc-100 dark:bg-zinc-800\">\n <DocumentMagnifyingGlassIcon className=\"h-8 w-8 text-zinc-400 dark:text-zinc-500\" />\n </div>\n </motion.div>\n\n <motion.div\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...getTransition(springPresets.default), delay: 0.1 }}\n >\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {t(\"noResultsFound\")}\n </h3>\n\n {searchTerm && (\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {t(\"noResultsFor\", { searchTerm })}\n </p>\n )}\n\n {suggestions && suggestions.length > 0 && (\n <div className=\"mt-4\">\n <p className=\"text-xs text-gray-400 dark:text-gray-500 mb-2\">{t(\"trySuggestions\")}</p>\n <div className=\"flex flex-wrap justify-center gap-2\">\n {suggestions.map((suggestion, index) => (\n <span\n key={index}\n className=\"px-3 py-1 text-xs rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400\"\n >\n {suggestion}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {onClearFilters && (\n <motion.button\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...getTransition(springPresets.default), delay: 0.2 }}\n whileTap={{ scale: 0.97 }}\n onClick={() => {\n triggerHaptic(\"light\")\n onClearFilters()\n }}\n className=\"mt-6 inline-flex items-center justify-center rounded-full bg-[#007AFF] dark:bg-[#0A84FF] px-6 py-2.5 text-sm font-semibold text-white shadow-md hover:opacity-90 transition-opacity\"\n >\n {t(\"clearFilters\")}\n </motion.button>\n )}\n </motion.div>\n </div>\n )\n}\n\n/**\n * No Data State - For when a section has no data yet\n */\nexport function NoDataState({\n title,\n message,\n actionLabel,\n onAction,\n icon: CustomIcon,\n}: {\n title?: string\n message?: string\n actionLabel?: string\n onAction?: () => void\n icon?: React.ComponentType<{ className?: string }>\n}) {\n const t = useTranslations(\"common.emptyState\")\n const Icon = CustomIcon || FolderOpenIcon\n const resolvedTitle = title || t(\"noDataTitle\")\n const resolvedMessage = message || t(\"noDataMessage\")\n const resolvedActionLabel = actionLabel || t(\"createNew\")\n\n return (\n <div className=\"px-6 py-12 text-center bg-gray-50 dark:bg-gray-800/50 rounded-xl border border-dashed border-gray-300 dark:border-gray-600\">\n <motion.div\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={getTransition(springPresets.bouncy)}\n className=\"mx-auto mb-4\"\n >\n <div className=\"inline-flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700/50\">\n <Icon className=\"h-8 w-8 text-gray-400 dark:text-gray-500\" />\n </div>\n </motion.div>\n\n <motion.div\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...getTransition(springPresets.default), delay: 0.1 }}\n >\n <h3 className=\"text-base font-semibold text-gray-900 dark:text-white\">\n {resolvedTitle}\n </h3>\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400 max-w-sm mx-auto\">\n {resolvedMessage}\n </p>\n </motion.div>\n\n {onAction && (\n <motion.button\n initial={{ y: 10, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{ ...getTransition(springPresets.default), delay: 0.2 }}\n whileTap={{ scale: 0.97 }}\n onClick={() => {\n triggerHaptic(\"light\")\n onAction()\n }}\n className=\"mt-6 inline-flex items-center justify-center rounded-full bg-[#007AFF] dark:bg-[#0A84FF] px-6 py-2.5 text-sm font-semibold text-white shadow-md hover:opacity-90 transition-opacity\"\n >\n {resolvedActionLabel}\n </motion.button>\n )}\n </div>\n )\n}\n","import { useState, useEffect, ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { springPresets } from '@ui/lib/animations'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\ntype DynamicIslandState = 'idle' | 'compact' | 'expanded'\n\ntype DynamicIslandPosition = 'center' | 'left' | 'right'\n\ntype DynamicIslandProps = {\n /** Content for idle state (small pill) */\n idleContent?: ReactNode\n /** Content for compact state (slightly larger) */\n compactContent?: ReactNode\n /** Content for expanded state (full size) */\n expandedContent?: ReactNode\n /** Current state */\n state?: DynamicIslandState\n /** Auto-collapse after delay (ms) */\n autoCollapseDelay?: number\n /** Callback when state changes */\n onStateChange?: (state: DynamicIslandState) => void\n /** Horizontal position */\n position?: DynamicIslandPosition\n}\n\nconst sizeVariants = {\n idle: {\n width: 52,\n height: 32,\n borderRadius: 16,\n },\n compact: {\n width: 380,\n height: 56,\n borderRadius: 28,\n },\n expanded: {\n width: 480,\n height: 108,\n borderRadius: 32,\n },\n}\n\nconst positionClasses: Record<DynamicIslandPosition, string> = {\n center: 'fixed top-2 left-1/2 z-[100]',\n left: 'fixed top-2 left-4 z-[100]',\n right: 'fixed top-2 right-4 z-[100]',\n}\n\nexport function DynamicIsland({\n idleContent,\n compactContent,\n expandedContent,\n state = 'idle',\n autoCollapseDelay,\n onStateChange,\n position = 'center',\n}: DynamicIslandProps) {\n const [internalState, setInternalState] = useState<DynamicIslandState>(state)\n\n useEffect(() => {\n setInternalState(state)\n }, [state])\n\n useEffect(() => {\n if (autoCollapseDelay && internalState !== 'idle') {\n const timer = setTimeout(() => {\n setInternalState('idle')\n onStateChange?.('idle')\n }, autoCollapseDelay)\n return () => clearTimeout(timer)\n }\n }, [internalState, autoCollapseDelay, onStateChange])\n\n const handleTap = () => {\n triggerHaptic('light')\n const nextState: DynamicIslandState =\n internalState === 'idle' ? 'compact' :\n internalState === 'compact' ? 'expanded' : 'idle'\n setInternalState(nextState)\n onStateChange?.(nextState)\n }\n\n const currentContent =\n internalState === 'expanded' ? expandedContent :\n internalState === 'compact' ? compactContent : idleContent\n\n return (\n <motion.div\n className={`${positionClasses[position]} cursor-pointer`}\n style={position === 'center' ? { x: '-50%' } : undefined}\n layout\n initial={false}\n animate={sizeVariants[internalState]}\n transition={springPresets.bouncy}\n onClick={handleTap}\n >\n <div className=\"h-full w-full overflow-hidden bg-black rounded-[inherit]\">\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={internalState}\n initial={{ opacity: 0, scale: 0.9 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.9 }}\n transition={{ duration: 0.15 }}\n className=\"h-full w-full flex items-center justify-center p-2 text-white\"\n >\n {currentContent}\n </motion.div>\n </AnimatePresence>\n </div>\n </motion.div>\n )\n}\n\n// ============================================================================\n// Dynamic Island Notification Integration\n// ============================================================================\n\ntype NotificationVariant = 'success' | 'error' | 'info' | 'warning'\n\ntype DynamicIslandNotificationProps = {\n /** Show the notification */\n show: boolean\n /** App icon */\n icon?: ReactNode\n /** App name */\n appName?: string\n /** Notification title */\n title: string\n /** Notification message */\n message?: string\n /** Notification variant for colors */\n variant?: NotificationVariant\n /** Auto-dismiss after delay (ms) */\n dismissAfter?: number\n /** Callback when dismissed */\n onDismiss?: () => void\n /** Horizontal position */\n position?: DynamicIslandPosition\n}\n\n// iOS system colors for Dynamic Island\nconst variantStyles = {\n success: {\n iconBg: 'bg-ios-green',\n accentColor: 'text-ios-green',\n glow: 'shadow-[0_0_20px_rgba(52,199,89,0.3)]',\n },\n error: {\n iconBg: 'bg-ios-red',\n accentColor: 'text-ios-red',\n glow: 'shadow-[0_0_20px_rgba(255,59,48,0.3)]',\n },\n warning: {\n iconBg: 'bg-ios-orange',\n accentColor: 'text-ios-orange',\n glow: 'shadow-[0_0_20px_rgba(255,149,0,0.3)]',\n },\n info: {\n iconBg: 'bg-ios-blue',\n accentColor: 'text-ios-blue',\n glow: 'shadow-[0_0_20px_rgba(0,122,255,0.3)]',\n },\n}\n\nexport function DynamicIslandNotification({\n show,\n icon,\n appName,\n title,\n message,\n variant = 'info',\n dismissAfter = 4000,\n onDismiss,\n position = 'right',\n}: DynamicIslandNotificationProps) {\n const [state, setState] = useState<DynamicIslandState>('idle')\n const styles = variantStyles[variant]\n\n useEffect(() => {\n if (show) {\n // Go directly to expanded state\n setState('expanded')\n triggerHaptic('light')\n\n const collapseTimer = setTimeout(() => {\n setState('idle')\n onDismiss?.()\n }, dismissAfter)\n\n return () => {\n clearTimeout(collapseTimer)\n }\n } else {\n setState('idle')\n }\n }, [show, dismissAfter, onDismiss])\n\n if (!show && state === 'idle') return null\n\n const content = (\n <div data-testid=\"dynamic-island-notification\" role=\"alert\" aria-live=\"assertive\">\n <DynamicIsland\n state={state}\n onStateChange={setState}\n position={position}\n idleContent={\n // Idle: Colored icon pill\n <div className=\"flex items-center justify-center\">\n {icon && (\n <div className={`h-6 w-6 rounded-full ${styles.iconBg} flex items-center justify-center`}>\n <div className=\"h-4 w-4 text-white\">{icon}</div>\n </div>\n )}\n </div>\n }\n compactContent={\n // Compact: Colored icon + title + message preview\n <div className=\"flex items-center gap-3 px-4 w-full\">\n {icon && (\n <div className={`h-8 w-8 rounded-full ${styles.iconBg} flex items-center justify-center shrink-0`}>\n <div className=\"h-5 w-5 text-white\">{icon}</div>\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold truncate\">{title}</p>\n {message && <p className=\"text-xs text-gray-400 truncate\">{message}</p>}\n </div>\n </div>\n }\n expandedContent={\n // Expanded: Full notification with colored icon background\n <div className={`flex items-center gap-4 px-5 w-full h-full`}>\n {icon && (\n <div className={`h-14 w-14 rounded-2xl ${styles.iconBg} flex items-center justify-center shrink-0 ${styles.glow}`}>\n <div className=\"h-8 w-8 text-white\">{icon}</div>\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n {appName && (\n <p className={`text-[11px] uppercase tracking-wide font-medium ${styles.accentColor}`}>{appName}</p>\n )}\n <p className=\"text-[15px] font-semibold leading-tight\">{title}</p>\n {message && (\n <p className=\"text-[13px] text-gray-400 mt-0.5 truncate\">{message}</p>\n )}\n </div>\n </div>\n }\n />\n </div>\n )\n\n // Portal to document.body so the notification escapes any ancestor containers\n // with overflow-hidden, backdrop-blur, or transform that break fixed positioning.\n if (typeof document !== 'undefined') {\n return createPortal(content, document.body)\n }\n\n return content\n}\n","import { createContext, useContext, useState, useCallback, ReactNode } from 'react'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { CheckCircleIcon, ExclamationCircleIcon, ExclamationTriangleIcon, InformationCircleIcon, BellIcon, XMarkIcon, TrashIcon } from '@heroicons/react/24/outline'\nimport { useTranslations } from 'next-intl'\nimport { DynamicIslandNotification } from '@ui/components/dynamic-island'\n\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info'\n\nexport interface Notification {\n id: string\n type: NotificationType\n title: string\n message?: string\n timestamp: Date\n}\n\ntype NotificationContextType = {\n history: Notification[]\n pendingApprovals: Notification[]\n historyOpen: boolean\n addNotification: (notification: Omit<Notification, 'id' | 'timestamp'>) => void\n removeFromHistory: (id: string) => void\n clearHistory: () => void\n openHistory: () => void\n closeHistory: () => void\n success: (title: string, message?: string) => void\n error: (title: string, message?: string) => void\n warning: (title: string, message?: string) => void\n info: (title: string, message?: string) => void\n}\n\nconst NotificationContext = createContext<NotificationContextType | undefined>(undefined)\n\nexport function useNotifications() {\n const notificationContext = useContext(NotificationContext)\n if (!notificationContext) {\n throw new Error('useNotifications must be used within NotificationProvider')\n }\n return notificationContext\n}\n\ntype NotificationProviderProps = {\n children: ReactNode\n appName?: string\n}\n\nexport function NotificationProvider({ children, appName = 'Datatech' }: NotificationProviderProps) {\n const [history, setHistory] = useState<Notification[]>([])\n const [pendingApprovals] = useState<Notification[]>([])\n const [historyOpen, setHistoryOpen] = useState(false)\n const [dynamicIslandNotification, setDynamicIslandNotification] = useState<Notification | null>(null)\n\n const addNotification = useCallback((notification: Omit<Notification, 'id' | 'timestamp'>) => {\n const notificationId = Math.random().toString(36).substring(2, 9)\n const newNotification: Notification = { ...notification, id: notificationId, timestamp: new Date() }\n\n setDynamicIslandNotification(newNotification)\n setHistory((previousHistory) => [newNotification, ...previousHistory].slice(0, 50))\n }, [])\n\n const clearHistory = useCallback(() => {\n setHistory([])\n }, [])\n\n const removeFromHistory = useCallback((notificationId: string) => {\n setHistory((previousHistory) => previousHistory.filter((historyItem) => historyItem.id !== notificationId))\n }, [])\n\n const openHistory = useCallback(() => setHistoryOpen(true), [])\n const closeHistory = useCallback(() => setHistoryOpen(false), [])\n\n const success = useCallback((title: string, message?: string) => {\n addNotification({ type: 'success', title, message })\n }, [addNotification])\n\n const error = useCallback((title: string, message?: string) => {\n addNotification({ type: 'error', title, message })\n }, [addNotification])\n\n const warning = useCallback((title: string, message?: string) => {\n addNotification({ type: 'warning', title, message })\n }, [addNotification])\n\n const info = useCallback((title: string, message?: string) => {\n addNotification({ type: 'info', title, message })\n }, [addNotification])\n\n const getDynamicIslandIcon = (type: NotificationType) => {\n switch (type) {\n case 'success':\n return <CheckCircleIcon className=\"h-full w-full\" />\n case 'error':\n return <ExclamationCircleIcon className=\"h-full w-full\" />\n case 'warning':\n return <ExclamationTriangleIcon className=\"h-full w-full\" />\n case 'info':\n return <InformationCircleIcon className=\"h-full w-full\" />\n }\n }\n\n return (\n <NotificationContext.Provider value={{\n history,\n pendingApprovals,\n historyOpen,\n addNotification,\n removeFromHistory,\n clearHistory,\n openHistory,\n closeHistory,\n success,\n error,\n warning,\n info,\n }}>\n {children}\n\n <div aria-live=\"polite\" role=\"status\">\n {dynamicIslandNotification ? (\n <DynamicIslandNotification\n show\n icon={getDynamicIslandIcon(dynamicIslandNotification.type)}\n appName={appName}\n title={dynamicIslandNotification.title}\n message={dynamicIslandNotification.message}\n variant={dynamicIslandNotification.type}\n dismissAfter={5000}\n onDismiss={() => setDynamicIslandNotification(null)}\n />\n ) : null}\n </div>\n\n <NotificationDrawer\n open={historyOpen}\n history={history}\n onClose={closeHistory}\n onRemove={removeFromHistory}\n onClear={clearHistory}\n />\n </NotificationContext.Provider>\n )\n}\n\nexport function NotificationBellButton() {\n const t = useTranslations('notifications')\n const { history, historyOpen, openHistory } = useNotifications()\n const totalCount = history.length\n\n if (historyOpen) return null\n\n return (\n <button\n type=\"button\"\n onClick={openHistory}\n aria-label={t('title')}\n className=\"relative rounded-lg p-2 text-gray-500 hover:bg-gray-100 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-white/10 dark:hover:text-white transition-colors duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-blue-500 dark:ring-offset-gray-900\"\n >\n <BellIcon className=\"h-5 w-5\" />\n {totalCount > 0 ? (\n <span className=\"absolute top-1 right-1 flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-indigo-400 opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-indigo-500\" />\n </span>\n ) : null}\n </button>\n )\n}\n\n/* ── Notification Drawer ─────────────────────────────────────────── */\n\nconst NOTIFICATION_TYPE_STYLES: Record<NotificationType, { icon: typeof CheckCircleIcon; color: string }> = {\n success: { icon: CheckCircleIcon, color: 'text-emerald-500' },\n error: { icon: ExclamationCircleIcon, color: 'text-red-500' },\n warning: { icon: ExclamationTriangleIcon, color: 'text-amber-500' },\n info: { icon: InformationCircleIcon, color: 'text-blue-500' },\n}\n\nfunction formatTimeAgo(date: Date, t: (key: string, params?: Record<string, string | number>) => string): string {\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000)\n if (seconds < 60) return t('justNow')\n const minutes = Math.floor(seconds / 60)\n if (minutes < 60) return t('minutesAgo', { count: minutes })\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return t('hoursAgo', { count: hours })\n return t('daysAgo', { count: Math.floor(hours / 24) })\n}\n\nfunction NotificationDrawer({\n open,\n history,\n onClose,\n onRemove,\n onClear,\n}: {\n open: boolean\n history: Notification[]\n onClose: () => void\n onRemove: (id: string) => void\n onClear: () => void\n}) {\n const t = useTranslations('notifications')\n\n return (\n <AnimatePresence>\n {open ? (\n <>\n <motion.div\n className=\"fixed inset-0 z-[60] bg-black/20 backdrop-blur-[2px]\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.2 }}\n onClick={onClose}\n />\n <motion.div\n className=\"fixed right-2 top-2 bottom-2 z-[61] flex w-full max-w-sm flex-col overflow-hidden rounded-2xl border border-white/60 bg-white/80 shadow-[0_8px_60px_-12px_rgba(0,0,0,0.25),0_0_0_1px_rgba(255,255,255,0.1)] backdrop-blur-2xl dark:border-white/[0.12] dark:bg-gray-900/85 dark:shadow-[0_8px_60px_-12px_rgba(0,0,0,0.6),0_0_0_1px_rgba(255,255,255,0.06)]\"\n initial={{ x: '110%', opacity: 0.5 }}\n animate={{ x: 0, opacity: 1 }}\n exit={{ x: '110%', opacity: 0.5 }}\n transition={{ type: 'spring', damping: 28, stiffness: 320 }}\n >\n <div className=\"absolute inset-y-0 left-0 w-[3px] bg-gradient-to-b from-amber-400 to-orange-500 opacity-80\" />\n\n <div className=\"flex items-center justify-between px-6 py-5\">\n <div className=\"flex items-center gap-3.5\">\n <div className=\"flex h-11 w-11 items-center justify-center rounded-[14px] bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg shadow-black/20 ring-1 ring-white/25\">\n <BellIcon className=\"h-6 w-6 text-white\" />\n </div>\n <h2 className=\"text-base font-bold tracking-tight text-gray-900 dark:text-white\">\n {t('title')}\n </h2>\n </div>\n <div className=\"flex items-center gap-1.5\">\n {history.length > 0 ? (\n <button\n type=\"button\"\n onClick={onClear}\n className=\"rounded-xl p-2 text-gray-400 transition-all hover:bg-black/5 hover:text-gray-600 active:scale-95 dark:text-gray-500 dark:hover:bg-white/10 dark:hover:text-gray-300\"\n aria-label={t('clearAll')}\n >\n <TrashIcon className=\"h-5 w-5\" />\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-xl p-2 text-gray-400 transition-all hover:bg-black/5 hover:text-gray-600 active:scale-95 dark:text-gray-500 dark:hover:bg-white/10 dark:hover:text-gray-300\"\n aria-label={t('close')}\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n\n <div className=\"mx-5 h-px bg-gradient-to-r from-transparent via-gray-200/80 to-transparent dark:via-white/10\" />\n\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">\n {history.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <BellIcon className=\"h-12 w-12 text-gray-300 dark:text-gray-600 mb-3\" />\n <p className=\"text-sm font-medium text-gray-400 dark:text-gray-500\">{t('empty')}</p>\n </div>\n ) : (\n <div className=\"space-y-2.5\">\n <AnimatePresence initial={false}>\n {history.map((item) => {\n const style = NOTIFICATION_TYPE_STYLES[item.type]\n const Icon = style.icon\n return (\n <motion.div\n key={item.id}\n layout\n initial={{ opacity: 0, y: -8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, x: 80, transition: { duration: 0.2 } }}\n className=\"liquid-surface group relative flex gap-3 rounded-2xl p-3.5\"\n >\n <div className={`mt-0.5 flex-shrink-0 ${style.color}`}>\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 dark:text-white truncate\">\n {item.title}\n </p>\n {item.message ? (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400 line-clamp-2\">\n {item.message}\n </p>\n ) : null}\n <p className=\"mt-1.5 text-[11px] text-gray-400 dark:text-gray-500\">\n {formatTimeAgo(item.timestamp, t)}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => onRemove(item.id)}\n className=\"absolute right-2.5 top-2.5 rounded-lg p-1 text-gray-300 opacity-0 transition-all group-hover:opacity-100 hover:text-gray-500 active:scale-95 dark:text-gray-600 dark:hover:text-gray-400\"\n aria-label={t('dismiss')}\n >\n <XMarkIcon className=\"h-3.5 w-3.5\" />\n </button>\n </motion.div>\n )\n })}\n </AnimatePresence>\n </div>\n )}\n </div>\n </motion.div>\n </>\n ) : null}\n </AnimatePresence>\n )\n}\n","/**\n * Container Component\n * ==================\n *\n * Reusable container with multiple style variants.\n * Eliminates repeated Tailwind class patterns across components.\n */\n\nimport React from 'react'\nimport clsx from 'clsx'\n\nexport type ContainerVariant = 'card' | 'elevated' | 'glass' | 'minimal'\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: ContainerVariant\n children: React.ReactNode\n}\n\n/**\n * Container styles for each variant\n */\nconst CONTAINER_STYLES: Record<ContainerVariant, string> = {\n card: 'bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-xs hover:shadow-sm transition-shadow',\n elevated: 'bg-white dark:bg-gray-800 rounded-xl shadow-lg hover:shadow-xl transition-shadow',\n glass:\n 'bg-white/70 dark:bg-gray-800/70 backdrop-blur-xl border border-white/20 dark:border-gray-700/50 shadow-lg shadow-black/5',\n minimal: 'rounded-lg'\n}\n\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({ variant = 'card', className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={clsx(CONTAINER_STYLES[variant], className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nContainer.displayName = 'Container'\n","/**\n * FormField Component\n * ==================\n *\n * Standardized form field wrapper with label, error display, and accessibility.\n * Used across all forms (auth, admin, settings).\n */\n\nimport React from 'react'\nimport clsx from 'clsx'\n\nexport interface FormFieldProps extends React.HTMLAttributes<HTMLDivElement> {\n label?: React.ReactNode\n error?: string | null\n required?: boolean\n helperText?: React.ReactNode\n children: React.ReactNode\n htmlFor?: string\n}\n\nexport const FormField = React.forwardRef<HTMLDivElement, FormFieldProps>(\n (\n { label, error, required, helperText, children, htmlFor, className, ...props },\n ref\n ) => {\n return (\n <div ref={ref} className={clsx('space-y-1.5', className)} {...props}>\n {label && (\n <label\n htmlFor={htmlFor}\n className=\"block text-sm font-medium text-gray-900 dark:text-white\"\n >\n {label}\n {required && <span className=\"ml-1 text-red-500\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">{children}</div>\n\n {error && (\n <p className=\"text-sm text-red-500 dark:text-red-400\" role=\"alert\">\n {error}\n </p>\n )}\n\n {helperText && !error && (\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{helperText}</p>\n )}\n </div>\n )\n }\n)\n\nFormField.displayName = 'FormField'\n","/**\n * FormSection Component\n * ====================\n *\n * Section wrapper for grouping related form fields.\n * Provides consistent spacing and optional title/description.\n */\n\nimport React from 'react'\nimport clsx from 'clsx'\n\nexport interface FormSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode\n description?: React.ReactNode\n children: React.ReactNode\n}\n\nexport const FormSection = React.forwardRef<HTMLDivElement, FormSectionProps>(\n ({ title, description, children, className, ...props }, ref) => {\n return (\n <div ref={ref} className={clsx('space-y-4', className)} {...props}>\n {(title || description) && (\n <div className=\"space-y-1\">\n {title && (\n <h3 className=\"text-base font-semibold text-gray-900 dark:text-white\">\n {title}\n </h3>\n )}\n {description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\n {description}\n </p>\n )}\n </div>\n )}\n <div className=\"space-y-4\">{children}</div>\n </div>\n )\n }\n)\n\nFormSection.displayName = 'FormSection'\n","import type { ReactNode } from 'react'\n\nexport interface ItemSummaryMetadata {\n label: string\n value: ReactNode\n}\n\ninterface ItemSummaryProps {\n icon?: ReactNode\n title: ReactNode\n subtitle?: ReactNode\n metadata?: ItemSummaryMetadata[]\n iconContainerClassName?: string\n titleClassName?: string\n subtitleClassName?: string\n metadataContainerClassName?: string\n metadataLabelClassName?: string\n metadataValueClassName?: string\n}\n\nexport function ItemSummary({\n icon,\n title,\n subtitle,\n metadata,\n iconContainerClassName = 'flex size-10 flex-shrink-0 items-center justify-center rounded-lg bg-indigo-100 dark:bg-indigo-900/30',\n titleClassName = 'truncate text-sm font-semibold text-gray-900 dark:text-white',\n subtitleClassName = 'truncate text-xs text-gray-500 dark:text-gray-400',\n metadataContainerClassName = 'mt-2 flex flex-wrap gap-3',\n metadataLabelClassName = 'text-xs text-gray-500 dark:text-gray-400',\n metadataValueClassName = 'text-xs font-medium text-gray-900 dark:text-white',\n}: ItemSummaryProps) {\n return (\n <div className=\"flex flex-1 min-w-0 items-start gap-3\">\n {icon ? <div className={iconContainerClassName}>{icon}</div> : null}\n <div className=\"min-w-0 flex-1\">\n <div className={titleClassName}>{title}</div>\n {subtitle ? <div className={subtitleClassName}>{subtitle}</div> : null}\n {metadata && metadata.length > 0 ? (\n <div className={metadataContainerClassName}>\n {metadata.map((metadataItem, index) => (\n <div key={index} className=\"flex flex-col\">\n <span className={metadataLabelClassName}>{metadataItem.label}</span>\n <span className={metadataValueClassName}>{metadataItem.value}</span>\n </div>\n ))}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","/**\n * ListItem Component\n * =================\n *\n * Standardized list item with icon, title, metadata, and actions.\n * Replaces repeated card patterns in station, approval, and competitor lists.\n */\n\nimport React from 'react'\nimport clsx from 'clsx'\nimport { ItemSummary } from '@ui/components/item-summary'\n\nexport type ListItemVariant = 'default' | 'compact' | 'card' | 'highlighted'\n\nexport interface ListItemAction {\n label: string\n onClick: () => void\n variant?: 'default' | 'danger'\n disabled?: boolean\n}\n\nexport interface ListItemMetadata {\n label: string\n value: string | React.ReactNode\n}\n\nexport interface ListItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: React.ReactNode\n title: React.ReactNode\n subtitle?: React.ReactNode\n metadata?: ListItemMetadata[]\n actions?: ListItemAction[]\n variant?: ListItemVariant\n}\n\nconst CONTAINER_STYLES: Record<ListItemVariant, string> = {\n default: 'bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700',\n compact: 'bg-transparent',\n card: 'bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-xs',\n highlighted:\n 'bg-indigo-50 dark:bg-indigo-900/20 border border-indigo-200 dark:border-indigo-800'\n}\n\nconst SPACING_STYLES: Record<ListItemVariant, string> = {\n default: 'p-4',\n compact: 'py-2',\n card: 'p-4',\n highlighted: 'p-4'\n}\n\nexport const ListItem = React.forwardRef<HTMLDivElement, ListItemProps>(\n (\n {\n icon,\n title,\n subtitle,\n metadata,\n actions,\n variant = 'default',\n className,\n ...props\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n className={clsx(\n 'flex items-start justify-between gap-4 rounded-lg transition-all duration-200',\n CONTAINER_STYLES[variant],\n SPACING_STYLES[variant],\n className\n )}\n {...props}\n >\n <ItemSummary\n icon={icon}\n title={title}\n subtitle={subtitle}\n metadata={metadata}\n />\n\n {/* Actions */}\n {actions && actions.length > 0 && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {actions.map((action, index) => (\n <button\n key={index}\n onClick={action.onClick}\n disabled={action.disabled}\n className={clsx(\n 'px-3 py-1.5 rounded-lg text-xs font-medium transition-colors duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500 dark:ring-offset-gray-900',\n action.variant === 'danger'\n ? 'text-red-700 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 disabled:opacity-50'\n : 'text-indigo-700 dark:text-indigo-400 hover:bg-indigo-50 dark:hover:bg-indigo-900/20 disabled:opacity-50'\n )}\n >\n {action.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nListItem.displayName = 'ListItem'\n","import { forwardRef, type ComponentType } from 'react'\n\nexport type StatusBadgeTone = 'success' | 'error' | 'warning' | 'info' | 'neutral'\nexport type StatusType = 'pending' | 'approved' | 'rejected' | 'active' | 'inactive' | 'processing' | 'error' | 'success' | string\n\nexport type StatusBadgeConfig = {\n label: string\n icon?: ComponentType<{ className?: string }>\n tone?: StatusBadgeTone\n animateIcon?: boolean\n}\n\ntype LegacyStatusBadgeProps = {\n status: string\n label?: string\n size?: 'sm' | 'md'\n className?: string\n statusConfig?: never\n}\n\ntype ConfigurableStatusBadgeProps = {\n status: string\n statusConfig: Record<string, StatusBadgeConfig>\n label?: string\n size?: 'sm' | 'md'\n className?: string\n}\n\nexport type StatusBadgeProps = LegacyStatusBadgeProps | ConfigurableStatusBadgeProps\n\ntype ToneStyle = {\n container: string\n dot: string\n}\n\nconst TONE_STYLES: Record<StatusBadgeTone, ToneStyle> = {\n error: { container: 'border-red-500/30 bg-red-500/20 text-red-600 dark:text-red-400', dot: 'bg-red-500' },\n warning: { container: 'border-amber-500/30 bg-amber-500/20 text-amber-600 dark:text-amber-400', dot: 'bg-amber-500' },\n info: { container: 'border-blue-500/30 bg-blue-500/20 text-blue-600 dark:text-blue-400', dot: 'bg-blue-500' },\n neutral: { container: 'border-gray-500/30 bg-gray-500/20 text-gray-600 dark:text-gray-400', dot: 'bg-gray-500' },\n success: { container: 'border-emerald-500/30 bg-emerald-500/20 text-emerald-600 dark:text-emerald-400', dot: 'bg-emerald-500' },\n}\n\nconst LEGACY_STATUS_STYLES: Record<string, string> = {\n pending: 'border-yellow-200 bg-yellow-50 text-yellow-700 dark:border-yellow-700/30 dark:bg-yellow-900/20 dark:text-yellow-400',\n approved: 'border-green-200 bg-green-50 text-green-700 dark:border-green-700/30 dark:bg-green-900/20 dark:text-green-400',\n rejected: 'border-red-200 bg-red-50 text-red-700 dark:border-red-700/30 dark:bg-red-900/20 dark:text-red-400',\n active: 'border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-700/30 dark:bg-emerald-900/20 dark:text-emerald-400',\n inactive: 'border-gray-200 bg-gray-50 text-gray-700 dark:border-gray-700/30 dark:bg-gray-900/20 dark:text-gray-400',\n processing: 'border-blue-200 bg-blue-50 text-blue-700 dark:border-blue-700/30 dark:bg-blue-900/20 dark:text-blue-400',\n error: 'border-red-200 bg-red-50 text-red-700 dark:border-red-700/30 dark:bg-red-900/20 dark:text-red-400',\n success: 'border-green-200 bg-green-50 text-green-700 dark:border-green-700/30 dark:bg-green-900/20 dark:text-green-400',\n}\n\nconst LEGACY_DOT_STYLES: Record<string, string> = {\n pending: 'bg-yellow-500',\n approved: 'bg-green-500',\n rejected: 'bg-red-500',\n active: 'bg-emerald-500',\n inactive: 'bg-gray-500',\n processing: 'bg-blue-500',\n error: 'bg-red-500',\n success: 'bg-green-500',\n}\n\nconst SIZE_STYLES: Record<'sm' | 'md', string> = {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-1 text-xs',\n}\n\nconst DEFAULT_LEGACY_STYLE =\n 'border-gray-200 bg-gray-50 text-gray-700 dark:border-gray-700/30 dark:bg-gray-900/20 dark:text-gray-400'\n\nexport const StatusBadge = forwardRef<HTMLDivElement, StatusBadgeProps>(function StatusBadge(\n { status, label, size = 'md', className = '', ...props },\n ref\n) {\n if ('statusConfig' in props && props.statusConfig) {\n const configuredStatus = props.statusConfig[status]\n if (!configuredStatus) {\n return null\n }\n\n const toneStyle = TONE_STYLES[configuredStatus.tone ?? 'neutral']\n const IconComponent = configuredStatus.icon\n const resolvedLabel = label ?? configuredStatus.label\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label={`Status: ${status}`}\n data-testid={`status-badge-${status}`}\n className={`inline-flex items-center gap-1.5 rounded-full border font-semibold backdrop-blur-sm ${SIZE_STYLES[size]} ${toneStyle.container} ${className}`}\n >\n {IconComponent ? (\n <IconComponent className={`h-3 w-3 ${configuredStatus.animateIcon ? 'animate-spin' : ''}`} />\n ) : (\n <span className={`h-2 w-2 rounded-full ${toneStyle.dot}`} />\n )}\n {resolvedLabel}\n </div>\n )\n }\n\n const legacyStyle = LEGACY_STATUS_STYLES[status] ?? DEFAULT_LEGACY_STYLE\n const legacyDot = LEGACY_DOT_STYLES[status] ?? 'bg-gray-500'\n const resolvedLabel = label ?? status\n\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-label={`Status: ${status}`}\n data-testid={`status-badge-${status}`}\n className={`inline-flex items-center gap-1.5 rounded-full border font-semibold ${SIZE_STYLES[size]} ${legacyStyle} ${className}`}\n >\n <span className={`h-2 w-2 rounded-full ${legacyDot}`} />\n {resolvedLabel}\n </div>\n )\n})\n","import { type ReactNode, type FormEvent } from 'react'\nimport { Dialog, DialogPanel, DialogTitle } from '@headlessui/react'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\nimport { Button, IconButton } from '@ui/components/button'\n\ninterface FormModalProps {\n open: boolean\n onClose: () => void\n title: string\n subtitle?: string\n icon?: ReactNode\n children: ReactNode\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl'\n onSubmit?: (e: FormEvent) => void\n footer?: ReactNode\n showFooter?: boolean\n cancelLabel?: string\n submitLabel?: string\n isLoading?: boolean\n submitDisabled?: boolean\n}\n\nconst MAX_WIDTH_CLASSES: Record<string, string> = {\n sm: 'max-w-full sm:max-w-sm',\n md: 'max-w-full sm:max-w-md',\n lg: 'max-w-full sm:max-w-lg',\n xl: 'max-w-full sm:max-w-xl',\n '2xl': 'max-w-full sm:max-w-2xl',\n '3xl': 'max-w-full sm:max-w-3xl',\n '4xl': 'max-w-full sm:max-w-4xl',\n '5xl': 'max-w-full sm:max-w-5xl',\n}\n\nexport function FormModal({\n open,\n onClose,\n title,\n subtitle,\n icon,\n children,\n maxWidth = '4xl',\n onSubmit,\n footer,\n showFooter = true,\n cancelLabel,\n submitLabel,\n isLoading = false,\n submitDisabled = false,\n}: FormModalProps) {\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault()\n onSubmit?.(e)\n }\n\n const content = (\n <>\n {/* Header */}\n <div className=\"liquid-surface shrink-0 border-b border-gray-200 dark:border-white/10 rounded-t-2xl\">\n <div className=\"px-4 sm:px-6 py-3 sm:py-4 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className=\"flex-shrink-0\">\n {icon}\n </div>\n )}\n <div>\n <DialogTitle className=\"text-base sm:text-lg font-semibold text-gray-900 dark:text-white\">\n {title}\n </DialogTitle>\n {subtitle && (\n <p className=\"text-xs sm:text-sm text-gray-500 dark:text-gray-400 mt-0.5\">\n {subtitle}\n </p>\n )}\n </div>\n </div>\n <IconButton\n icon={<XMarkIcon className=\"w-5 h-5\" />}\n label=\"Close\"\n onClick={onClose}\n variant=\"ghost\"\n />\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\">\n <div className=\"px-4 sm:px-6 py-4 sm:py-6\">\n {children}\n </div>\n </div>\n\n {/* Footer */}\n {showFooter && (\n <div className=\"liquid-surface shrink-0 border-t border-gray-200 dark:border-white/10 rounded-b-2xl\">\n <div className=\"px-4 sm:px-6 py-3 sm:py-4 flex flex-col sm:flex-row justify-end gap-2 sm:gap-3\">\n {footer || (\n <>\n <Button\n type=\"button\"\n onClick={onClose}\n disabled={isLoading}\n outline\n className=\"w-full sm:w-auto\"\n >\n {cancelLabel}\n </Button>\n <Button\n type=\"submit\"\n disabled={submitDisabled}\n loading={isLoading}\n loadingText={submitLabel}\n color=\"ios-glass-blue\"\n className=\"w-full sm:w-auto\"\n >\n {submitLabel}\n </Button>\n </>\n )}\n </div>\n </div>\n )}\n </>\n )\n\n return (\n <Dialog open={open} onClose={onClose} className=\"relative z-50\">\n <div className=\"fixed inset-0 bg-black/50 backdrop-blur-sm\" />\n <div className=\"fixed inset-4 sm:inset-6 lg:inset-10 flex items-center justify-center\">\n <DialogPanel\n className={`liquid-surface-strong w-full h-full ${MAX_WIDTH_CLASSES[maxWidth]} flex flex-col rounded-2xl overflow-hidden`}\n >\n {onSubmit ? (\n <form onSubmit={handleSubmit} className=\"flex-1 flex flex-col overflow-hidden\">\n {content}\n </form>\n ) : (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {content}\n </div>\n )}\n </DialogPanel>\n </div>\n </Dialog>\n )\n}\n","import { useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport type ContextMenuItem = {\n type?: 'item'\n key: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n onClick: () => void\n danger?: boolean\n disabled?: boolean\n testId?: string\n}\n\nexport type ContextMenuDivider = {\n type: 'divider'\n key: string\n}\n\nexport type ContextMenuEntry = ContextMenuItem | ContextMenuDivider\n\ntype ContextMenuProps = {\n position: { x: number; y: number }\n onClose: () => void\n entries: ContextMenuEntry[]\n minWidthClass?: string\n testId?: string\n}\n\nexport function ContextMenu({\n position,\n onClose,\n entries,\n minWidthClass = 'min-w-[180px]',\n testId,\n}: ContextMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(event.target as HTMLElement)) {\n onClose()\n }\n }\n\n function handleEscapeKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n onClose()\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscapeKey)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscapeKey)\n }\n }, [onClose])\n\n return createPortal(\n <div\n ref={menuRef}\n className={`fixed z-[9999] ${minWidthClass} rounded-xl border border-gray-200 bg-white/90 py-1 shadow-lg backdrop-blur-xl dark:border-gray-700 dark:bg-gray-800/90`}\n style={{ left: position.x, top: position.y }}\n data-testid={testId}\n >\n {entries.map((entry) => {\n if (entry.type === 'divider') {\n return <div key={entry.key} className=\"my-1 border-t border-gray-200 dark:border-gray-700\" />\n }\n\n const IconComponent = entry.icon\n return (\n <button\n key={entry.key}\n type=\"button\"\n onClick={entry.onClick}\n disabled={entry.disabled}\n className={`flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm transition-colors duration-150 ${\n entry.disabled\n ? 'cursor-not-allowed text-gray-400 dark:text-gray-600'\n : entry.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-500/10'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700/50'\n }`}\n data-testid={entry.testId}\n >\n {IconComponent ? <IconComponent className=\"h-4 w-4\" /> : null}\n <span>{entry.label}</span>\n </button>\n )\n })}\n </div>,\n document.body\n )\n}\n","import type { InputHTMLAttributes, ReactNode, SelectHTMLAttributes, TextareaHTMLAttributes } from 'react'\n\ntype InputSize = 'sm' | 'md' | 'lg'\n\ntype BaseFormFieldProps = {\n label?: string\n error?: string\n hint?: string\n required?: boolean\n icon?: ReactNode\n inputSize?: InputSize\n}\n\nexport type FormInputProps = BaseFormFieldProps &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'size'> & {\n onValueChange?: (value: string) => void\n }\n\nexport type FormTextareaProps = BaseFormFieldProps &\n Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> & {\n onValueChange?: (value: string) => void\n }\n\nexport type FormSelectProps = BaseFormFieldProps &\n Omit<SelectHTMLAttributes<HTMLSelectElement>, 'onChange' | 'size'> & {\n onValueChange?: (value: string) => void\n options: Array<{ value: string; label: string }>\n }\n\nconst sizeClasses: Record<InputSize, string> = {\n sm: 'h-9 px-3 text-sm',\n md: 'h-11 px-3.5 text-sm',\n lg: 'h-12 px-4 text-base',\n}\n\nconst labelClasses: Record<InputSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-sm',\n}\n\nfunction wrapperClass(error?: string) {\n return [\n 'liquid-surface w-full rounded-xl transition-colors duration-200',\n error\n ? 'focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-red-400/30'\n : 'focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-indigo-500 dark:focus-within:ring-offset-gray-900',\n ].join(' ')\n}\n\nfunction FieldMeta({ hint, error }: { hint?: string; error?: string }) {\n if (!hint && !error) return null\n return (\n <p\n className={`mt-1.5 text-xs ${error ? 'text-red-500' : 'text-gray-500 dark:text-gray-400'}`}\n {...(error ? { role: 'alert', 'aria-live': 'polite' as const } : {})}\n >\n {error ?? hint}\n </p>\n )\n}\n\nexport function FormInput({\n label,\n error,\n hint,\n required,\n icon,\n inputSize = 'md',\n className = '',\n onValueChange,\n ...props\n}: FormInputProps) {\n return (\n <div>\n {label ? (\n <label className={`mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`}>\n {label}\n {required ? <span className=\"ml-0.5 text-red-500\">*</span> : null}\n </label>\n ) : null}\n <div className={wrapperClass(error)}>\n <div className={`relative flex items-center ${sizeClasses[inputSize]} ${className}`}>\n {icon ? <span className=\"mr-2 text-gray-400 dark:text-gray-500\">{icon}</span> : null}\n <input\n {...props}\n className=\"w-full bg-transparent text-gray-900 placeholder:text-gray-400 focus:outline-none dark:text-white dark:placeholder:text-gray-500\"\n onChange={(event) => onValueChange?.(event.target.value)}\n />\n </div>\n </div>\n <FieldMeta hint={hint} error={error} />\n </div>\n )\n}\n\nexport function FormTextarea({\n label,\n error,\n hint,\n required,\n inputSize = 'md',\n className = '',\n onValueChange,\n ...props\n}: FormTextareaProps) {\n return (\n <div>\n {label ? (\n <label className={`mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`}>\n {label}\n {required ? <span className=\"ml-0.5 text-red-500\">*</span> : null}\n </label>\n ) : null}\n <div className={wrapperClass(error)}>\n <textarea\n {...props}\n className={`w-full resize-y bg-transparent px-3.5 py-2.5 text-gray-900 placeholder:text-gray-400 focus:outline-none dark:text-white dark:placeholder:text-gray-500 ${className}`}\n onChange={(event) => onValueChange?.(event.target.value)}\n />\n </div>\n <FieldMeta hint={hint} error={error} />\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// FormPriceInput — currency-prefixed price input with size variants\n// ---------------------------------------------------------------------------\n\ntype PriceSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport type FormPriceInputProps = Omit<BaseFormFieldProps, 'icon'> & {\n value: string\n onValueChange?: (value: string) => void\n currencySymbol: string\n priceSize?: PriceSize\n step?: string\n placeholder?: string\n colorClass?: string\n disabled?: boolean\n min?: string | number\n max?: string | number\n className?: string\n}\n\nconst priceSizeConfig: Record<PriceSize, { input: string; symbol: string; padding: string }> = {\n sm: { input: 'h-9 text-sm font-semibold', symbol: 'text-xs left-3', padding: 'pl-7 pr-3' },\n md: { input: 'h-11 text-base font-semibold', symbol: 'text-sm font-bold left-3.5', padding: 'pl-10 pr-3.5' },\n lg: { input: 'h-14 text-xl font-bold', symbol: 'text-lg font-bold left-3.5', padding: 'pl-11 pr-4' },\n xl: { input: 'py-3 text-3xl font-bold', symbol: 'text-xl font-bold left-4', padding: 'pl-14 pr-4' },\n}\n\nfunction defaultPriceSize(inputSize: InputSize): PriceSize {\n if (inputSize === 'sm') return 'sm'\n if (inputSize === 'lg') return 'lg'\n return 'md'\n}\n\nexport function FormPriceInput({\n label,\n error,\n hint,\n required,\n inputSize = 'md',\n priceSize,\n currencySymbol,\n value,\n onValueChange,\n step = '0.01',\n placeholder = '0.00',\n colorClass,\n disabled,\n min,\n max,\n className = '',\n}: FormPriceInputProps) {\n const sizes = priceSizeConfig[priceSize ?? defaultPriceSize(inputSize)]\n\n return (\n <div>\n {label ? (\n <label className={`mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`}>\n {label}\n {required ? <span className=\"ml-0.5 text-red-500\">*</span> : null}\n </label>\n ) : null}\n <div className={wrapperClass(error)}>\n <div className=\"relative\">\n <span\n className={`absolute top-1/2 -translate-y-1/2 text-gray-400 dark:text-gray-500 pointer-events-none select-none ${sizes.symbol}`}\n aria-hidden=\"true\"\n >\n {currencySymbol}\n </span>\n <input\n type=\"number\"\n step={step}\n value={value}\n onChange={(event) => onValueChange?.(event.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n className={`w-full bg-transparent tabular-nums ${sizes.input} ${sizes.padding} text-gray-900 placeholder:text-gray-400 focus:outline-none dark:text-white dark:placeholder:text-gray-500 ${colorClass ?? ''} ${className}`}\n />\n </div>\n </div>\n <FieldMeta hint={hint} error={error} />\n </div>\n )\n}\n\nexport function FormSelect({\n label,\n error,\n hint,\n required,\n inputSize = 'md',\n className = '',\n onValueChange,\n options,\n ...props\n}: FormSelectProps) {\n return (\n <div>\n {label ? (\n <label className={`mb-1.5 block font-medium text-gray-500 dark:text-gray-400 ${labelClasses[inputSize]}`}>\n {label}\n {required ? <span className=\"ml-0.5 text-red-500\">*</span> : null}\n </label>\n ) : null}\n <div className={wrapperClass(error)}>\n <select\n {...props}\n className={`w-full bg-transparent ${sizeClasses[inputSize]} text-gray-900 focus:outline-none dark:text-white ${className}`}\n onChange={(event) => onValueChange?.(event.target.value)}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <FieldMeta hint={hint} error={error} />\n </div>\n )\n}\n","import React from 'react'\nimport clsx from 'clsx'\n\nexport type FormProps = React.FormHTMLAttributes<HTMLFormElement> & {\n children: React.ReactNode\n}\n\nexport const Form = React.forwardRef<HTMLFormElement, FormProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <form ref={ref} className={clsx(className)} {...props}>\n {children}\n </form>\n )\n }\n)\n\nForm.displayName = 'Form'\n\nexport type FormGridProps = React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode\n}\n\nexport const FormGrid = React.forwardRef<HTMLDivElement, FormGridProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div ref={ref} className={clsx('platform-form-grid', className)} {...props}>\n {children}\n </div>\n )\n }\n)\n\nFormGrid.displayName = 'FormGrid'\n\nexport type InlineFormProps = React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode\n}\n\nexport const InlineForm = React.forwardRef<HTMLDivElement, InlineFormProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div ref={ref} className={clsx('platform-inline-form', className)} {...props}>\n {children}\n </div>\n )\n }\n)\n\nInlineForm.displayName = 'InlineForm'\n\nexport type FormActionsRowProps = React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode\n}\n\nexport const FormActionsRow = React.forwardRef<HTMLDivElement, FormActionsRowProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div ref={ref} className={clsx('platform-form-actions', className)} {...props}>\n {children}\n </div>\n )\n }\n)\n\nFormActionsRow.displayName = 'FormActionsRow'\n","import { Fragment, type ReactNode, memo, useCallback, useMemo, type ComponentType } from 'react'\nimport { MagnifyingGlassIcon } from '@heroicons/react/24/outline'\nimport { ForceTouchMenu } from '@ui/components/force-touch-menu'\n\n/* ── Exported Types ──────────────────────────────────────────────── */\n\nexport type LaunchpadMenuItem = {\n label: string\n icon?: ReactNode\n href?: string\n onClick?: () => void\n}\n\nexport type LaunchpadItem = {\n id: string\n name: string\n href: string\n icon: ComponentType<{ className?: string }>\n gradient: string\n shadow: string\n badge?: number\n notification?: number\n subtitle?: string\n menuItems: LaunchpadMenuItem[]\n /** When defined, the item triggers this callback instead of navigating via href. */\n onClick?: () => void\n}\n\nexport type LaunchpadUserProfile = {\n name?: string | null\n email?: string | null\n picture?: string | null\n role?: string | null\n}\n\nexport type LaunchpadGridProps = {\n pageItems: LaunchpadItem[]\n actionItems: LaunchpadItem[]\n actionItemIds: ReadonlySet<string>\n pageOrder: string[]\n userProfile?: LaunchpadUserProfile | null\n isHydrated?: boolean\n actionsLabel: string\n onItemClick: (item: LaunchpadItem) => void\n onPrefetch?: (href: string) => void\n className?: string\n}\n\n/* ── Pure Component ──────────────────────────────────────────────── */\n\nexport function LaunchpadGrid({\n pageItems,\n actionItems,\n actionItemIds,\n pageOrder,\n userProfile,\n isHydrated = false,\n actionsLabel,\n onItemClick,\n className,\n}: LaunchpadGridProps) {\n const orderIndex = useMemo(\n () => new Map(pageOrder.map((id, index) => [id, index])),\n [pageOrder]\n )\n\n const orderedItems = useMemo(() => {\n const sortedPages = [...pageItems].sort(\n (a, b) => (orderIndex.get(a.id) ?? 999) - (orderIndex.get(b.id) ?? 999)\n )\n return [...sortedPages, ...actionItems]\n }, [pageItems, actionItems, orderIndex])\n\n const groupedPageItems = orderedItems.filter(item => !actionItemIds.has(item.id))\n const groupedActionItems = orderedItems.filter(item => actionItemIds.has(item.id))\n const allGroupedItems = [...groupedPageItems, ...groupedActionItems]\n const firstActionIndex = groupedActionItems.length > 0 ? groupedPageItems.length : -1\n\n const tileClass =\n 'group relative flex flex-col items-center text-center transition-transform duration-200 hover:-translate-y-0.5'\n\n const getForceTouchItems = useCallback((item: LaunchpadItem): LaunchpadMenuItem[] => {\n if (item.menuItems.length > 0) return item.menuItems\n return [\n {\n label: item.name,\n href: item.href,\n icon: <MagnifyingGlassIcon className=\"h-5 w-5\" />,\n },\n ]\n }, [])\n\n const renderTile = useCallback((item: LaunchpadItem) => (\n <div key={`launchpad-${item.id}`} className=\"flex flex-col items-center\">\n {!actionItemIds.has(item.id) && item.href.startsWith('/') && !item.onClick ? (\n <ForceTouchMenu\n href={item.href}\n items={getForceTouchItems(item)}\n className=\"flex flex-col items-center\"\n >\n <div className={`${tileClass} cursor-pointer`} role=\"button\" tabIndex={0}>\n {item.badge != null && (\n <span className=\"absolute -top-1.5 left-1/2 translate-x-8 lg:translate-x-10 z-10 inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-white/95 px-1.5 text-[10px] font-bold text-blue-700 shadow-sm ring-1 ring-blue-200 dark:bg-slate-900/95 dark:text-blue-300 dark:ring-blue-400/40\">\n {item.badge > 99 ? '99+' : item.badge}\n </span>\n )}\n {item.notification != null && (\n <span className=\"absolute -top-2 right-1/2 translate-x-9 lg:translate-x-11 z-10 flex h-8 min-w-8 items-center justify-center rounded-full bg-red-500 px-2 text-sm font-extrabold text-white shadow-lg ring-2 ring-white/70 dark:ring-slate-900/70\">\n {item.notification > 99 ? '99+' : item.notification}\n </span>\n )}\n <LaunchpadIcon item={item} userProfile={userProfile} isHydrated={isHydrated} />\n <h3 className=\"mt-3 text-sm font-medium text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-white transition-colors\">\n {item.name}\n </h3>\n {item.subtitle && (\n <span className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {item.subtitle}\n </span>\n )}\n </div>\n </ForceTouchMenu>\n ) : (\n <button\n type=\"button\"\n className={tileClass}\n onClick={() => item.onClick ? item.onClick() : onItemClick(item)}\n >\n {item.badge != null && (\n <span className=\"absolute -top-1.5 left-1/2 translate-x-8 lg:translate-x-10 z-10 inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-white/95 px-1.5 text-[10px] font-bold text-blue-700 shadow-sm ring-1 ring-blue-200 dark:bg-slate-900/95 dark:text-blue-300 dark:ring-blue-400/40\">\n {item.badge > 99 ? '99+' : item.badge}\n </span>\n )}\n {item.notification != null && (\n <span className=\"absolute -top-2 right-1/2 translate-x-9 lg:translate-x-11 z-10 flex h-8 min-w-8 items-center justify-center rounded-full bg-red-500 px-2 text-sm font-extrabold text-white shadow-lg ring-2 ring-white/70 dark:ring-slate-900/70\">\n {item.notification > 9 ? '9+' : item.notification}\n </span>\n )}\n <LaunchpadIcon item={item} userProfile={userProfile} isHydrated={isHydrated} />\n <h3 className=\"mt-3 text-sm font-medium text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-white transition-colors\">\n {item.name}\n </h3>\n {item.subtitle && (\n <span className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {item.subtitle}\n </span>\n )}\n </button>\n )}\n </div>\n ), [actionItemIds, getForceTouchItems, tileClass, onItemClick, userProfile, isHydrated])\n\n // iPad-style: unified grid when no action items are passed separately\n const isUnifiedGrid = actionItems.length === 0\n\n return (\n <div className={`mt-12 ${className ?? ''}`}>\n {isUnifiedGrid ? (\n /* Unified grid — all items in equal columns, no divider */\n <div className=\"grid grid-cols-4 gap-6 sm:gap-8 lg:grid-cols-5 xl:grid-cols-6 justify-items-center\">\n {allGroupedItems.map(renderTile)}\n </div>\n ) : (\n /* Split grid — page items + divider + action items */\n <>\n <div className=\"flex flex-wrap justify-center gap-7 lg:gap-8\">\n {groupedPageItems.map(renderTile)}\n </div>\n\n {groupedActionItems.length > 0 && (\n <>\n <div className=\"my-6\">\n <div className=\"h-px w-full bg-slate-300/75 dark:bg-white/20\" />\n <p className=\"mt-2 text-center text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {actionsLabel}\n </p>\n </div>\n <div className=\"flex flex-wrap justify-center gap-7 lg:gap-8\">\n {groupedActionItems.map(renderTile)}\n </div>\n </>\n )}\n </>\n )}\n </div>\n )\n}\n\n/* ── Glassmorphic Icon Tile (private) ────────────────────────────── */\n\nconst LaunchpadIcon = memo(function LaunchpadIcon({\n item,\n userProfile,\n isHydrated,\n}: {\n item: LaunchpadItem\n userProfile?: LaunchpadUserProfile | null\n isHydrated: boolean\n}) {\n const Icon = item.icon\n const profileInitial = isHydrated\n ? userProfile?.name?.trim()?.charAt(0)?.toUpperCase() ?? userProfile?.email?.charAt(0)?.toUpperCase() ?? 'U'\n : 'U'\n const profileBadge = isHydrated\n ? (userProfile?.role ?? '').trim().toUpperCase()\n : ''\n const profileImage = isHydrated ? userProfile?.picture : undefined\n\n return (\n <div className=\"relative\">\n <div\n className=\"relative overflow-hidden flex h-20 w-20 lg:h-24 lg:w-24 items-center justify-center rounded-[22px] border border-white/45 bg-white/35 backdrop-blur-2xl shadow-[inset_0_1px_0_rgba(255,255,255,0.85),0_14px_28px_-20px_rgba(15,23,42,0.65)] transition-all duration-300 group-hover:scale-105 dark:border-white/14 dark:bg-slate-900/42 dark:shadow-[inset_0_1px_0_rgba(255,255,255,0.2),0_16px_30px_-20px_rgba(0,0,0,0.78)]\"\n >\n <div className={`pointer-events-none absolute inset-0 bg-gradient-to-br ${item.gradient} opacity-85 dark:opacity-70`} />\n <div className=\"pointer-events-none absolute inset-0 bg-[linear-gradient(140deg,rgba(255,255,255,0.42)_0%,rgba(255,255,255,0.12)_42%,rgba(255,255,255,0)_100%)]\" />\n {item.id === 'profile' ? (\n profileImage ? (\n <img\n src={profileImage}\n alt={userProfile?.name ?? 'Profile'}\n className=\"relative h-12 w-12 lg:h-14 lg:w-14 rounded-full object-cover ring-2 ring-white/70\"\n />\n ) : (\n <span className=\"relative flex h-12 w-12 lg:h-14 lg:w-14 items-center justify-center rounded-full bg-white/24 text-lg lg:text-xl font-semibold text-white ring-2 ring-white/70\">\n {profileInitial}\n </span>\n )\n ) : (\n <Icon className=\"relative h-10 w-10 lg:h-12 lg:w-12 text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.22)]\" />\n )}\n </div>\n {item.id === 'profile' && profileBadge && (\n <span className=\"absolute -bottom-1 -right-1 inline-flex items-center justify-center rounded-full bg-blue-600 px-2 py-0.5 text-[10px] font-bold leading-none tracking-wide text-white ring-2 ring-white dark:ring-gray-900\">\n {profileBadge}\n </span>\n )}\n </div>\n )\n})\n","import { memo, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { usePathname, useRouter } from 'next/navigation'\n\n\nexport type DockMenuItem = {\n label: string\n icon?: ReactNode\n href?: string\n onClick?: () => void\n variant?: 'default' | 'danger'\n}\n\nexport type DockAction = {\n id: string\n icon: React.ComponentType<{ className?: string }>\n label: string\n onClick: () => void\n href?: string\n badge?: number\n active?: boolean\n menuItems: DockMenuItem[]\n}\n\ntype DockPosition = 'bottom' | 'top' | 'left' | 'right'\n\ntype DockProps = {\n navigationActions: DockAction[]\n contextualActions: DockAction[]\n position?: DockPosition\n className?: string\n autoHide?: boolean\n}\n\n\ntype DockAccent = {\n icon: string\n bg: string\n dot: string\n rgb: string\n}\n\nfunction getDockAccent(id: string): DockAccent {\n if (id === 'stations') {\n return { icon: 'text-blue-600 dark:text-blue-400', bg: 'bg-blue-100 dark:bg-blue-900/35', dot: 'bg-blue-500 dark:bg-blue-400', rgb: '59, 130, 246' }\n }\n if (id === 'approvals' || id === 'approvals-drawer') {\n return { icon: 'text-amber-600 dark:text-amber-400', bg: 'bg-amber-100 dark:bg-amber-900/35', dot: 'bg-amber-500 dark:bg-amber-400', rgb: '245, 158, 11' }\n }\n if (id === 'competitors') {\n return { icon: 'text-orange-900 dark:text-orange-300', bg: 'bg-orange-900/15 dark:bg-orange-900/45', dot: 'bg-orange-700 dark:bg-orange-400', rgb: '146, 64, 14' }\n }\n if (id === 'users') {\n return { icon: 'text-purple-600 dark:text-purple-400', bg: 'bg-purple-100 dark:bg-purple-900/35', dot: 'bg-purple-500 dark:bg-purple-400', rgb: '168, 85, 247' }\n }\n if (id === 'agents' || id === 'workflows') {\n return { icon: 'text-indigo-600 dark:text-indigo-400', bg: 'bg-indigo-100 dark:bg-indigo-900/35', dot: 'bg-indigo-500 dark:bg-indigo-400', rgb: '99, 102, 241' }\n }\n if (id === 'models') {\n return { icon: 'text-sky-600 dark:text-sky-400', bg: 'bg-sky-100 dark:bg-sky-900/35', dot: 'bg-sky-500 dark:bg-sky-400', rgb: '14, 165, 233' }\n }\n if (id === 'fuels') {\n return { icon: 'text-orange-600 dark:text-orange-400', bg: 'bg-orange-100 dark:bg-orange-900/35', dot: 'bg-orange-500 dark:bg-orange-400', rgb: '249, 115, 22' }\n }\n if (id === 'rules') {\n return { icon: 'text-emerald-600 dark:text-emerald-400', bg: 'bg-emerald-100 dark:bg-emerald-900/35', dot: 'bg-emerald-500 dark:bg-emerald-400', rgb: '16, 185, 129' }\n }\n if (id === 'subscription') {\n return { icon: 'text-fuchsia-600 dark:text-fuchsia-400', bg: 'bg-fuchsia-100 dark:bg-fuchsia-900/35', dot: 'bg-fuchsia-500 dark:bg-fuchsia-400', rgb: '217, 70, 239' }\n }\n if (id === 'notifications') {\n return { icon: 'text-pink-600 dark:text-pink-400', bg: 'bg-pink-100 dark:bg-pink-900/35', dot: 'bg-pink-500 dark:bg-pink-400', rgb: '236, 72, 153' }\n }\n if (id === 'theme') {\n return { icon: 'text-sky-600 dark:text-sky-400', bg: 'bg-sky-100 dark:bg-sky-900/35', dot: 'bg-sky-500 dark:bg-sky-400', rgb: '14, 165, 233' }\n }\n if (id === 'profile') {\n return { icon: 'text-slate-600 dark:text-slate-300', bg: 'bg-slate-100 dark:bg-slate-800/70', dot: 'bg-slate-500 dark:bg-slate-400', rgb: '100, 116, 139' }\n }\n if (id === 'signout') {\n return { icon: 'text-red-600 dark:text-red-400', bg: 'bg-red-100 dark:bg-red-900/35', dot: 'bg-red-500 dark:bg-red-400', rgb: '239, 68, 68' }\n }\n return { icon: 'text-indigo-600 dark:text-indigo-400', bg: 'bg-indigo-100 dark:bg-indigo-900/35', dot: 'bg-indigo-500 dark:bg-indigo-400', rgb: '99, 102, 241' }\n}\n\nconst AUTO_HIDE_DELAY = 3000\n\nexport function Dock({\n navigationActions,\n contextualActions,\n position = 'bottom',\n className = '',\n autoHide = false,\n}: DockProps) {\n const router = useRouter()\n const pathname = usePathname()\n\n const [isAutoHidden, setIsAutoHidden] = useState(false)\n const autoHideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null)\n const [openClickMenuId, setOpenClickMenuId] = useState<string | null>(null)\n const [isTabletViewport, setIsTabletViewport] = useState(false)\n const dockRef = useRef<HTMLDivElement | null>(null)\n const actions = useMemo(\n () => [...navigationActions, ...contextualActions],\n [navigationActions, contextualActions]\n )\n\n // Auto-hide timer management\n const resetAutoHideTimer = useCallback(() => {\n if (!autoHide) return\n if (autoHideTimerRef.current) {\n clearTimeout(autoHideTimerRef.current)\n }\n setIsAutoHidden(false)\n autoHideTimerRef.current = setTimeout(() => {\n setIsAutoHidden(true)\n }, AUTO_HIDE_DELAY)\n }, [autoHide])\n\n useEffect(() => {\n if (!autoHide) {\n setIsAutoHidden(false)\n return\n }\n resetAutoHideTimer()\n return () => {\n if (autoHideTimerRef.current) {\n clearTimeout(autoHideTimerRef.current)\n }\n }\n }, [autoHide, resetAutoHideTimer])\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const media = window.matchMedia('(min-width: 768px) and (max-width: 1024px)')\n const syncViewport = () => setIsTabletViewport(media.matches)\n syncViewport()\n media.addEventListener('change', syncViewport)\n return () => media.removeEventListener('change', syncViewport)\n }, [])\n\n useEffect(() => {\n const handlePointerDown = (event: MouseEvent) => {\n if (!dockRef.current) return\n const target = event.target as Node\n if (!dockRef.current.contains(target)) {\n setOpenClickMenuId(null)\n setFocusedIndex(null)\n }\n }\n\n document.addEventListener('mousedown', handlePointerDown)\n return () => document.removeEventListener('mousedown', handlePointerDown)\n }, [])\n\n useEffect(() => {\n setFocusedIndex(null)\n setHoveredIndex(null)\n setOpenClickMenuId(null)\n }, [pathname])\n\n const hasActions = actions.length > 0\n\n const containerPositionClass =\n position === 'bottom'\n ? 'left-1/2 -translate-x-1/2 bottom-5 w-full'\n : position === 'top'\n ? 'left-1/2 -translate-x-1/2 top-5 w-full'\n : position === 'left'\n ? 'left-5 top-1/2 -translate-y-1/2'\n : 'right-5 top-1/2 -translate-y-1/2'\n\n const dockOrientationClass = position === 'left' || position === 'right' ? 'flex-col' : 'flex-row'\n const isVerticalDock = position === 'left' || position === 'right'\n const dividerClass =\n position === 'left' || position === 'right'\n ? 'h-px w-10 my-1 bg-neutral-400/20 dark:bg-white/20'\n : 'w-px h-10 mx-1 bg-neutral-400/20 dark:bg-white/20'\n const useTabletScroller = isTabletViewport && !isVerticalDock\n\n const handleMenuItemClick = (item: DockMenuItem) => {\n if (item.onClick) {\n item.onClick()\n return\n }\n\n if (item.href) {\n router.push(item.href)\n }\n }\n\n const getFlyoutPositionClass = () => 'bottom-full left-1/2 mb-3 -translate-x-1/2'\n\n return (\n <div\n className={`fixed z-50 pointer-events-none transition-opacity duration-300 ${!hasActions || isAutoHidden ? 'opacity-0' : 'opacity-100'} ${isAutoHidden ? 'hover:opacity-100' : ''} flex items-center justify-center ${containerPositionClass} ${className}`}\n onMouseEnter={autoHide ? resetAutoHideTimer : undefined}\n onMouseLeave={autoHide ? resetAutoHideTimer : undefined}\n onPointerDown={autoHide ? resetAutoHideTimer : undefined}\n >\n <div\n ref={dockRef}\n className={`pointer-events-auto relative rounded-2xl liquid-surface-strong ${\n isTabletViewport ? 'px-2.5 py-2.5' : 'px-4 py-3'\n } ${isVerticalDock ? '' : 'max-w-[calc(100vw-0.75rem)]'}`}\n >\n <div className=\"pointer-events-none absolute inset-0 rounded-2xl bg-gradient-to-br from-neutral-200/20 via-transparent to-transparent dark:from-white/10 dark:via-transparent dark:to-transparent\" />\n <div className=\"pointer-events-none absolute inset-x-4 top-0 h-10 rounded-b-[2rem] bg-neutral-200/15 blur-xl dark:bg-white/5\" />\n <div\n className={`relative z-10 flex ${dockOrientationClass} items-center ${\n isTabletViewport ? 'gap-2' : 'gap-3'\n } ${\n useTabletScroller\n ? 'max-w-[calc(100vw-2.25rem)] overflow-x-auto [overflow-y:visible] py-1 [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden'\n : ''\n }`}\n >\n {navigationActions.map((action, index) => {\n const hasMenu = !!action.menuItems?.length\n const accent = getDockAccent(action.id)\n const FlyoutIcon = action.icon\n\n const dockItem = (\n <DockItem\n key={action.id}\n action={action}\n index={index}\n hoveredIndex={hoveredIndex}\n focusedIndex={focusedIndex}\n onHover={setHoveredIndex}\n compact={isTabletViewport}\n />\n )\n\n if (hasMenu) {\n return (\n <div key={action.id} className=\"relative\">\n <button\n type=\"button\"\n title={action.label}\n onClick={() => {\n setFocusedIndex(index)\n setOpenClickMenuId(null)\n action.onClick()\n }}\n onContextMenu={(event) => {\n event.preventDefault()\n setFocusedIndex(index)\n setOpenClickMenuId(prev => (prev === action.id ? null : action.id))\n }}\n className=\"focus:outline-hidden\"\n >\n {dockItem}\n </button>\n {openClickMenuId === action.id && (\n <div className={`absolute z-50 min-w-[220px] max-w-[calc(100vw-1rem)] ${getFlyoutPositionClass()}`}>\n <div className=\"liquid-surface overflow-hidden rounded-2xl text-sm shadow-xl\">\n <div className=\"border-b border-white/20 px-3 py-2 dark:border-white/10\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {action.label}\n </p>\n </div>\n <div className=\"grid grid-cols-1 gap-y-1 p-2\">\n {action.menuItems.map((item, itemIndex) => (\n <button\n key={`${action.id}-flyout-item-${itemIndex}`}\n type=\"button\"\n onClick={() => handleMenuItemClick(item)}\n className={`group relative flex items-center gap-x-3 rounded-lg px-3 py-2.5 text-left text-sm hover:bg-white/30 dark:hover:bg-white/10 ${\n item.variant === 'danger' ? 'text-red-600 dark:text-red-400' : 'text-gray-700 dark:text-gray-200'\n }`}\n >\n <span className={`flex h-8 w-8 items-center justify-center rounded-lg ${accent.bg} ${accent.icon}`}>\n <FlyoutIcon className=\"h-4 w-4\" />\n </span>\n <span className=\"font-medium\">{item.label}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n\n return (\n <button\n key={action.id}\n type=\"button\"\n title={action.label}\n onClick={() => {\n setFocusedIndex(index)\n action.onClick()\n }}\n className=\"focus:outline-hidden\"\n >\n {dockItem}\n </button>\n )\n })}\n\n {navigationActions.length > 0 && contextualActions.length > 0 && (\n <div className={dividerClass} aria-hidden=\"true\" />\n )}\n\n {contextualActions.map((action, actionIndex) => {\n const index = navigationActions.length + actionIndex\n const hasMenu = !!action.menuItems?.length\n const accent = getDockAccent(action.id)\n const FlyoutIcon = action.icon\n\n const dockItem = (\n <DockItem\n key={action.id}\n action={action}\n index={index}\n hoveredIndex={hoveredIndex}\n focusedIndex={focusedIndex}\n onHover={setHoveredIndex}\n compact={isTabletViewport}\n />\n )\n\n if (hasMenu) {\n return (\n <div key={action.id} className=\"relative\">\n <button\n type=\"button\"\n title={action.label}\n onClick={() => {\n setFocusedIndex(index)\n setOpenClickMenuId(null)\n action.onClick()\n }}\n onContextMenu={(event) => {\n event.preventDefault()\n setFocusedIndex(index)\n setOpenClickMenuId(prev => (prev === action.id ? null : action.id))\n }}\n className=\"focus:outline-hidden\"\n >\n {dockItem}\n </button>\n {openClickMenuId === action.id && (\n <div className={`absolute z-50 min-w-[220px] max-w-[calc(100vw-1rem)] ${getFlyoutPositionClass()}`}>\n <div className=\"liquid-surface overflow-hidden rounded-2xl text-sm shadow-xl\">\n <div className=\"border-b border-white/20 px-3 py-2 dark:border-white/10\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n {action.label}\n </p>\n </div>\n <div className=\"grid grid-cols-1 gap-y-1 p-2\">\n {action.menuItems.map((item, itemIndex) => (\n <button\n key={`${action.id}-flyout-item-${itemIndex}`}\n type=\"button\"\n onClick={() => handleMenuItemClick(item)}\n className={`group relative flex items-center gap-x-3 rounded-lg px-3 py-2.5 text-left text-sm hover:bg-white/30 dark:hover:bg-white/10 ${\n item.variant === 'danger' ? 'text-red-600 dark:text-red-400' : 'text-gray-700 dark:text-gray-200'\n }`}\n >\n <span className={`flex h-8 w-8 items-center justify-center rounded-lg ${accent.bg} ${accent.icon}`}>\n <FlyoutIcon className=\"h-4 w-4\" />\n </span>\n <span className=\"font-medium\">{item.label}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n\n return (\n <button\n key={action.id}\n type=\"button\"\n title={action.label}\n onClick={() => {\n setFocusedIndex(index)\n action.onClick()\n }}\n className=\"focus:outline-hidden\"\n >\n {dockItem}\n </button>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n\nconst DockItem = memo(function DockItem({\n action,\n index,\n hoveredIndex,\n focusedIndex,\n onHover,\n compact = false,\n}: {\n action: DockAction\n index: number\n hoveredIndex: number | null\n focusedIndex: number | null\n onHover: (index: number | null) => void\n compact?: boolean\n}) {\n const Icon = action.icon\n const accent = getDockAccent(action.id)\n const activeIndex = hoveredIndex ?? focusedIndex\n const isSelected = !!action.active\n const isInteractiveActive = activeIndex === index\n const isSignOutAction = action.id === 'signout'\n const itemSizeClass = compact ? 'h-11 w-11' : 'h-12 w-12 sm:h-14 sm:w-14'\n const iconSizeClass = compact ? 'h-5 w-5' : 'h-6 w-6 sm:h-7 sm:w-7'\n\n return (\n <div\n onMouseEnter={() => onHover(index)}\n onMouseLeave={() => onHover(null)}\n className=\"relative flex flex-col items-center pb-2.5\"\n title={action.label}\n >\n <div\n className={`relative flex ${itemSizeClass} items-center justify-center rounded-2xl ${\n isSelected\n ? 'liquid-surface liquid-surface-active'\n : isInteractiveActive\n ? `${accent.bg} ring-1 ring-neutral-400/20 dark:ring-white/15`\n : isSignOutAction\n ? 'liquid-button liquid-button-red'\n : 'border border-white/15 bg-white/10 shadow-lg transition-colors hover:bg-white/15 dark:border-white/10 dark:bg-white/[0.06] dark:hover:bg-white/10'\n }`}\n style={isSelected ? { '--glass-accent': accent.rgb } as React.CSSProperties : undefined}\n >\n {!isInteractiveActive && !isSelected && (\n <div className=\"pointer-events-none absolute inset-0 rounded-2xl bg-gradient-to-br from-neutral-200/15 via-transparent to-transparent dark:from-white/10 dark:via-transparent dark:to-transparent\" />\n )}\n <Icon\n className={`${iconSizeClass} ${\n isSelected || isInteractiveActive\n ? accent.icon\n : 'text-neutral-600 dark:text-neutral-300'\n }`}\n />\n {action.badge && action.badge > 0 && (\n <span className=\"absolute -top-1 -right-1 min-w-[18px] h-[18px] px-1 rounded-full bg-red-500 text-white text-[10px] font-semibold flex items-center justify-center\">\n {action.badge > 99 ? '99+' : action.badge}\n </span>\n )}\n </div>\n {(isInteractiveActive || isSelected) && (\n <span\n className={`pointer-events-none absolute z-20 left-1/2 top-full mt-1 -translate-x-1/2 whitespace-nowrap rounded-md px-2 py-1 text-[11px] font-medium shadow-sm ${\n isSelected\n ? `${accent.bg} ${accent.icon}`\n : 'bg-white/90 text-gray-700 dark:bg-slate-900/90 dark:text-gray-200'\n }`}\n >\n {action.label}\n </span>\n )}\n </div>\n )\n})\n","import * as Headless from '@headlessui/react'\nimport clsx from 'clsx'\nimport React, { forwardRef } from 'react'\nimport Image from 'next/image'\nimport { TouchTarget } from '@ui/components/button'\nimport { Link } from '@ui/components/link'\n\ntype AvatarProps = {\n src?: string | null\n square?: boolean\n initials?: string\n alt?: string\n className?: string\n}\n\nexport function Avatar({\n src = null,\n square = false,\n initials,\n alt = '',\n className,\n ...props\n}: AvatarProps & React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n data-slot=\"avatar\"\n {...props}\n className={clsx(\n className,\n // Basic layout\n 'inline-grid shrink-0 align-middle [--avatar-radius:20%] *:col-start-1 *:row-start-1',\n 'outline -outline-offset-1 outline-black/10 dark:outline-white/10',\n // Border radius\n square ? 'rounded-(--avatar-radius) *:rounded-(--avatar-radius)' : 'rounded-full *:rounded-full'\n )}\n >\n {initials && (\n <svg\n className=\"size-full fill-current p-[5%] text-[48px] font-medium uppercase select-none\"\n viewBox=\"0 0 100 100\"\n aria-hidden={alt ? undefined : 'true'}\n >\n {alt && <title>{alt}</title>}\n <text x=\"50%\" y=\"50%\" alignmentBaseline=\"middle\" dominantBaseline=\"middle\" textAnchor=\"middle\" dy=\".125em\">\n {initials}\n </text>\n </svg>\n )}\n {src && <Image className=\"size-full\" src={src} alt={alt} width={40} height={40} unoptimized />}\n </span>\n )\n}\n\nexport const AvatarButton = forwardRef(function AvatarButton(\n {\n src,\n square = false,\n initials,\n alt,\n className,\n ...props\n }: AvatarProps &\n (\n | ({ href?: never } & Omit<Headless.ButtonProps, 'as' | 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n ),\n ref: React.ForwardedRef<HTMLButtonElement | HTMLAnchorElement>\n) {\n let classes = clsx(\n className,\n square ? 'rounded-[20%]' : 'rounded-full',\n 'relative inline-grid focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500'\n )\n\n if (typeof props.href === 'string') {\n return (\n <Link {...(props as React.ComponentPropsWithoutRef<typeof Link>)} className={classes} ref={ref as React.ForwardedRef<HTMLAnchorElement>}>\n <TouchTarget>\n <Avatar src={src} square={square} initials={initials} alt={alt} />\n </TouchTarget>\n </Link>\n )\n }\n\n return (\n <Headless.Button {...(props as Headless.ButtonProps)} className={classes} ref={ref as React.ForwardedRef<HTMLButtonElement>}>\n <TouchTarget>\n <Avatar src={src} square={square} initials={initials} alt={alt} />\n </TouchTarget>\n </Headless.Button>\n )\n})\n","import * as Headless from '@headlessui/react'\nimport clsx from 'clsx'\nimport React, { forwardRef } from 'react'\nimport { TouchTarget } from '@ui/components/button'\nimport { Link } from '@ui/components/link'\n\nconst colors = {\n red: 'bg-red-500/15 text-red-700 group-data-hover:bg-red-500/25 dark:bg-red-500/10 dark:text-red-400 dark:group-data-hover:bg-red-500/20',\n orange:\n 'bg-orange-500/15 text-orange-700 group-data-hover:bg-orange-500/25 dark:bg-orange-500/10 dark:text-orange-400 dark:group-data-hover:bg-orange-500/20',\n amber:\n 'bg-amber-400/20 text-amber-700 group-data-hover:bg-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400 dark:group-data-hover:bg-amber-400/15',\n yellow:\n 'bg-yellow-400/20 text-yellow-700 group-data-hover:bg-yellow-400/30 dark:bg-yellow-400/10 dark:text-yellow-300 dark:group-data-hover:bg-yellow-400/15',\n lime: 'bg-lime-400/20 text-lime-700 group-data-hover:bg-lime-400/30 dark:bg-lime-400/10 dark:text-lime-300 dark:group-data-hover:bg-lime-400/15',\n green:\n 'bg-green-500/15 text-green-700 group-data-hover:bg-green-500/25 dark:bg-green-500/10 dark:text-green-400 dark:group-data-hover:bg-green-500/20',\n emerald:\n 'bg-emerald-500/15 text-emerald-700 group-data-hover:bg-emerald-500/25 dark:bg-emerald-500/10 dark:text-emerald-400 dark:group-data-hover:bg-emerald-500/20',\n teal: 'bg-teal-500/15 text-teal-700 group-data-hover:bg-teal-500/25 dark:bg-teal-500/10 dark:text-teal-300 dark:group-data-hover:bg-teal-500/20',\n cyan: 'bg-cyan-400/20 text-cyan-700 group-data-hover:bg-cyan-400/30 dark:bg-cyan-400/10 dark:text-cyan-300 dark:group-data-hover:bg-cyan-400/15',\n sky: 'bg-sky-500/15 text-sky-700 group-data-hover:bg-sky-500/25 dark:bg-sky-500/10 dark:text-sky-300 dark:group-data-hover:bg-sky-500/20',\n blue: 'bg-blue-500/15 text-blue-700 group-data-hover:bg-blue-500/25 dark:text-blue-400 dark:group-data-hover:bg-blue-500/25',\n indigo:\n 'bg-indigo-500/15 text-indigo-700 group-data-hover:bg-indigo-500/25 dark:text-indigo-400 dark:group-data-hover:bg-indigo-500/20',\n violet:\n 'bg-violet-500/15 text-violet-700 group-data-hover:bg-violet-500/25 dark:text-violet-400 dark:group-data-hover:bg-violet-500/20',\n purple:\n 'bg-purple-500/15 text-purple-700 group-data-hover:bg-purple-500/25 dark:text-purple-400 dark:group-data-hover:bg-purple-500/20',\n fuchsia:\n 'bg-fuchsia-400/15 text-fuchsia-700 group-data-hover:bg-fuchsia-400/25 dark:bg-fuchsia-400/10 dark:text-fuchsia-400 dark:group-data-hover:bg-fuchsia-400/20',\n pink: 'bg-pink-400/15 text-pink-700 group-data-hover:bg-pink-400/25 dark:bg-pink-400/10 dark:text-pink-400 dark:group-data-hover:bg-pink-400/20',\n rose: 'bg-rose-400/15 text-rose-700 group-data-hover:bg-rose-400/25 dark:bg-rose-400/10 dark:text-rose-400 dark:group-data-hover:bg-rose-400/20',\n zinc: 'bg-zinc-600/10 text-zinc-700 group-data-hover:bg-zinc-600/20 dark:bg-white/5 dark:text-zinc-400 dark:group-data-hover:bg-white/10',\n}\n\ntype BadgeProps = { color?: keyof typeof colors }\n\nexport function Badge({ color = 'zinc', className, ...props }: BadgeProps & React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n {...props}\n className={clsx(\n className,\n 'inline-flex items-center gap-x-1.5 rounded-md px-1.5 py-0.5 text-sm/5 font-medium sm:text-xs/5 forced-colors:outline',\n colors[color]\n )}\n />\n )\n}\n\nexport const BadgeButton = forwardRef(function BadgeButton(\n {\n color = 'zinc',\n className,\n children,\n ...props\n }: BadgeProps & { className?: string; children: React.ReactNode } & (\n | ({ href?: never } & Omit<Headless.ButtonProps, 'as' | 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n ),\n ref: React.ForwardedRef<HTMLAnchorElement | HTMLButtonElement>\n) {\n let classes = clsx(\n className,\n 'group relative inline-flex rounded-md focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500'\n )\n\n if (typeof props.href === 'string') {\n return (\n <Link {...(props as React.ComponentPropsWithoutRef<typeof Link>)} className={classes} ref={ref as React.ForwardedRef<HTMLAnchorElement>}>\n <TouchTarget>\n <Badge color={color}>{children}</Badge>\n </TouchTarget>\n </Link>\n )\n }\n\n return (\n <Headless.Button {...(props as Headless.ButtonProps)} className={classes} ref={ref as React.ForwardedRef<HTMLButtonElement>}>\n <TouchTarget>\n <Badge color={color}>{children}</Badge>\n </TouchTarget>\n </Headless.Button>\n )\n})\n","/**\n * DynamicIslandConfirm\n * ====================\n *\n * iOS Dynamic Island-style confirmation dialog.\n * Top-positioned black pill with icon, title, and 2-column button layout.\n * Matches the logout warning pattern from auth-context.tsx.\n */\n\n'use client'\n\nimport { type ReactNode, useEffect } from 'react'\nimport { Dialog, DialogPanel } from '@headlessui/react'\nimport { TrashIcon } from '@heroicons/react/24/outline'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype DynamicIslandConfirmProps = {\n open: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n icon?: ReactNode\n iconBackground?: string\n appName?: string\n confirmLabel?: string\n cancelLabel?: string\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function DynamicIslandConfirm({\n open,\n onClose,\n onConfirm,\n title,\n icon,\n iconBackground = 'bg-ios-red',\n appName = 'App',\n confirmLabel,\n cancelLabel,\n}: DynamicIslandConfirmProps) {\n const resolvedConfirmLabel = confirmLabel ?? 'Confirm'\n const resolvedCancelLabel = cancelLabel ?? 'Cancel'\n\n useEffect(() => {\n if (open) {\n triggerHaptic('warning')\n }\n }, [open])\n\n return (\n <Dialog open={open} onClose={onClose} className=\"relative z-[120]\">\n <div className=\"fixed inset-0 bg-black/10 backdrop-blur-[2px]\" />\n <div className=\"fixed inset-0 flex items-start justify-center pt-3 px-4\">\n <DialogPanel className=\"w-full max-w-sm rounded-[28px] bg-black/95 p-3 text-white shadow-2xl\">\n <div className=\"flex items-center gap-3 px-2 py-1\">\n <div className={`h-9 w-9 shrink-0 rounded-xl ${iconBackground} flex items-center justify-center`}>\n {icon ?? <TrashIcon className=\"h-5 w-5 text-white\" />}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-[11px] uppercase tracking-wide text-gray-400\">{appName}</p>\n <p className=\"text-sm font-semibold\">{title}</p>\n </div>\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-xl bg-white/10 px-3 py-2 text-sm font-medium hover:bg-white/15\"\n >\n {resolvedCancelLabel}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n className=\"rounded-xl bg-ios-red px-3 py-2 text-sm font-semibold text-white hover:bg-ios-red-hover\"\n >\n {resolvedConfirmLabel}\n </button>\n </div>\n </DialogPanel>\n </div>\n </Dialog>\n )\n}\n","import * as React from \"react\";\n\nimport clsx from \"clsx\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.TextareaHTMLAttributes<HTMLTextAreaElement>\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={clsx(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import { useCallback, useRef, useId, type ClipboardEvent, type KeyboardEvent } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\n\nexport interface OtpInputProps {\n /** Number of digits (default: 6) */\n length?: number\n /** Current value */\n value: string\n /** Change handler */\n onChange: (value: string) => void\n /** Called when all digits are filled */\n onComplete?: (code: string) => void\n /** Error message */\n error?: string\n /** Disabled state */\n disabled?: boolean\n /** Auto-focus first input on mount */\n autoFocus?: boolean\n /** Input mode for mobile keyboards */\n inputMode?: 'numeric' | 'text'\n}\n\nexport function OtpInput({\n length = 6,\n value,\n onChange,\n onComplete,\n error,\n disabled = false,\n autoFocus = false,\n inputMode = 'numeric',\n}: OtpInputProps) {\n const t = useTranslations('auth')\n const groupId = useId()\n const inputsRef = useRef<(HTMLInputElement | null)[]>([])\n\n const digits = value.split('').concat(Array(length).fill('')).slice(0, length)\n\n const focusInput = useCallback((index: number) => {\n const clamped = Math.max(0, Math.min(index, length - 1))\n inputsRef.current[clamped]?.focus()\n }, [length])\n\n const handleChange = useCallback(\n (index: number, digit: string) => {\n if (disabled) return\n const char = digit.slice(-1)\n if (inputMode === 'numeric' && !/^\\d$/.test(char)) return\n\n const next = value.split('').concat(Array(length).fill('')).slice(0, length)\n next[index] = char\n const newValue = next.join('').replace(/\\s/g, '')\n\n triggerHaptic('light')\n onChange(newValue)\n\n if (index < length - 1) {\n focusInput(index + 1)\n }\n\n if (newValue.length === length) {\n triggerHaptic('success')\n onComplete?.(newValue)\n }\n },\n [disabled, inputMode, value, length, onChange, focusInput, onComplete],\n )\n\n const handleKeyDown = useCallback(\n (index: number, event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Backspace') {\n event.preventDefault()\n const next = value.split('').concat(Array(length).fill('')).slice(0, length)\n if (next[index]) {\n next[index] = ''\n onChange(next.join('').trimEnd())\n } else if (index > 0) {\n next[index - 1] = ''\n onChange(next.join('').trimEnd())\n focusInput(index - 1)\n }\n triggerHaptic('light')\n } else if (event.key === 'ArrowLeft' && index > 0) {\n event.preventDefault()\n focusInput(index - 1)\n } else if (event.key === 'ArrowRight' && index < length - 1) {\n event.preventDefault()\n focusInput(index + 1)\n }\n },\n [value, length, onChange, focusInput],\n )\n\n const handlePaste = useCallback(\n (event: ClipboardEvent<HTMLInputElement>) => {\n event.preventDefault()\n const pasted = event.clipboardData.getData('text').trim()\n const cleaned = inputMode === 'numeric'\n ? pasted.replace(/\\D/g, '').slice(0, length)\n : pasted.slice(0, length)\n\n if (cleaned.length > 0) {\n onChange(cleaned)\n triggerHaptic('light')\n focusInput(Math.min(cleaned.length, length - 1))\n\n if (cleaned.length === length) {\n triggerHaptic('success')\n onComplete?.(cleaned)\n }\n }\n },\n [inputMode, length, onChange, focusInput, onComplete],\n )\n\n return (\n <div className=\"space-y-2\">\n <div\n role=\"group\"\n aria-label={t('otpGroupLabel')}\n aria-describedby={error ? `${groupId}-error` : undefined}\n className=\"flex justify-center gap-2 sm:gap-3\"\n >\n {digits.map((digit, index) => (\n <input\n key={index}\n ref={(element) => { inputsRef.current[index] = element }}\n type=\"text\"\n inputMode={inputMode}\n maxLength={1}\n value={digit ?? ''}\n disabled={disabled}\n autoFocus={autoFocus && index === 0}\n autoComplete=\"one-time-code\"\n aria-label={t('otpDigitLabel', { current: index + 1, total: length })}\n onChange={(event) => handleChange(index, event.target.value)}\n onKeyDown={(event) => handleKeyDown(index, event)}\n onPaste={handlePaste}\n onFocus={(event) => event.target.select()}\n className={`\n liquid-surface h-12 w-10 sm:h-14 sm:w-12 rounded-xl\n text-center text-xl font-semibold\n text-gray-900 dark:text-white\n transition-all duration-200\n focus:ring-2 focus:ring-ios-blue focus:outline-none\n disabled:cursor-not-allowed disabled:opacity-50\n ${error\n ? 'ring-2 ring-ios-red'\n : digit\n ? 'ring-1 ring-gray-300 dark:ring-white/15'\n : ''\n }\n `}\n />\n ))}\n </div>\n\n {error && (\n <p\n id={`${groupId}-error`}\n role=\"alert\"\n className=\"text-sm text-ios-red text-center\"\n >\n {error}\n </p>\n )}\n </div>\n )\n}\n","import { useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Button } from '@ui/components/button'\nimport { triggerHaptic } from '@ui/hooks/use-haptic'\nimport { ClipboardDocumentIcon, ArrowDownTrayIcon } from '@heroicons/react/20/solid'\n\nexport interface BackupCodeGridProps {\n /** Array of backup codes */\n codes: string[]\n /** Called when copy-all is clicked */\n onCopyAll?: () => void\n /** Show download button */\n showDownload?: boolean\n /** Whether codes are visible */\n revealed?: boolean\n /** Called when reveal is toggled */\n onReveal?: () => void\n}\n\nexport function BackupCodeGrid({\n codes,\n onCopyAll,\n showDownload = true,\n revealed = true,\n onReveal,\n}: BackupCodeGridProps) {\n const t = useTranslations('auth')\n\n const handleCopyAll = useCallback(async () => {\n const text = codes.join('\\n')\n await navigator.clipboard.writeText(text)\n triggerHaptic('success')\n onCopyAll?.()\n }, [codes, onCopyAll])\n\n const handleDownload = useCallback(() => {\n const text = [\n t('backupCodesFileTitle'),\n '=====================',\n `${t('backupCodesGenerated')}: ${new Date().toISOString()}`,\n '',\n t('backupCodesKeepSafe'),\n '',\n ...codes.map((code, index) => `${String(index + 1).padStart(2, ' ')}. ${code}`),\n ].join('\\n')\n\n const blob = new Blob([text], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = 'backup-codes.txt'\n anchor.click()\n URL.revokeObjectURL(url)\n triggerHaptic('success')\n }, [codes, t])\n\n return (\n <div className=\"space-y-3\">\n {/* Code grid — 2 columns, 5 rows */}\n <div className=\"liquid-surface-strong rounded-xl p-4\">\n {!revealed ? (\n <div className=\"flex flex-col items-center justify-center py-8 gap-3\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n {t('backupCodesHidden')}\n </p>\n {onReveal && (\n <Button outline onClick={onReveal}>\n {t('backupCodesReveal')}\n </Button>\n )}\n </div>\n ) : (\n <div className=\"grid grid-cols-2 gap-2\">\n {codes.map((code, index) => (\n <div\n key={index}\n className=\"flex items-center gap-2 rounded-lg bg-white/50 dark:bg-white/5 px-3 py-2\"\n >\n <span className=\"text-xs text-gray-400 dark:text-gray-500 tabular-nums w-4\">\n {index + 1}.\n </span>\n <code className=\"font-mono text-sm font-medium text-gray-900 dark:text-white tracking-wider\">\n {code}\n </code>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Actions */}\n {revealed && (\n <div className=\"flex gap-2\">\n <Button outline size=\"sm\" onClick={handleCopyAll}>\n <ClipboardDocumentIcon className=\"h-4 w-4\" />\n {t('backupCodesCopyAll')}\n </Button>\n {showDownload && (\n <Button outline size=\"sm\" onClick={handleDownload}>\n <ArrowDownTrayIcon className=\"h-4 w-4\" />\n {t('backupCodesDownload')}\n </Button>\n )}\n </div>\n )}\n </div>\n )\n}\n","// ============================================================================\n// Core Components\n// ============================================================================\n\nexport { Button, FloatingActionButton, IconButton, TouchTarget } from '@ui/components/button'\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, CardDivider, SectionCard, ListCard, ListCardItem } from '@ui/components/card'\nexport { Input, PasswordInput, SearchInput } from '@ui/components/input'\nexport { Select, DropdownSelect } from '@ui/components/select'\nexport { ThemeToggle, ThemeToggleCompact } from '@ui/components/theme-toggle'\nexport { MetricCard } from '@ui/components/metric-card'\n\nexport { HeroSection } from '@ui/components/hero-section'\nexport { ActiveFilterChips, type ActiveFilterChip, type ActiveFilterChipStyleConfig } from '@ui/components/active-filter-chips'\nexport { SearchBar, type ActiveFilter } from '@ui/components/search-bar'\nexport { StatCard } from '@ui/components/stat-card'\nexport { SectionHeader } from '@ui/components/section-header'\nexport { PriceChangeBadge } from '@ui/components/price-change-badge'\nexport { Pagination } from '@ui/components/pagination'\nexport { Spinner, LoadingOverlay, InlineSpinner } from '@ui/components/spinner'\nexport { Pill, CountPill } from '@ui/components/pill'\nexport { GrowthIndicator } from '@ui/components/growth-indicator'\nexport { RoleBadge } from '@ui/components/role-badge'\nexport { TagBadge, type TagBadgeStyle } from '@ui/components/tag-badge'\n\n// Phase 1 UI Components\nexport { ToggleSwitch, LabeledToggle } from '@ui/components/toggle-switch'\nexport { SegmentedControl, CompactSegmentedControl } from '@ui/components/segmented-control'\nexport { Sheet, ActionSheet } from '@ui/components/sheet'\nexport { WheelPicker, MultiColumnPicker } from '@ui/components/wheel-picker'\n\n// Phase 3 UI Components\nexport { PageIndicator, ExpandingPageIndicator, ProgressIndicator } from '@ui/components/page-indicator'\nexport { ActionMenu } from '@ui/components/action-menu'\n\n// Phase 4 UI Components\nexport { SafeArea, SafeAreaView, SafeAreaSpacer, BottomSafeArea } from '@ui/components/safe-area'\n\n// Phase 5 UI Components - Gestures\nexport { SwipeableRow, DeleteSwipeAction, ArchiveSwipeAction, EditSwipeAction, FavoriteSwipeAction } from '@ui/components/swipe-action'\nexport { PullToRefreshContainer, CircularRefreshIndicator, DotRefreshIndicator } from '@ui/components/pull-to-refresh'\nexport { EdgeSwipeIndicator, EdgeSwipeProvider } from '@ui/components/edge-swipe-indicator'\n\n// Phase 6 UI Components - Enhanced Table & Buttons\nexport {\n Table,\n TableHead,\n TableBody,\n TableRow,\n TableHeader,\n TableCell,\n SortableTableHeader,\n TableSkeleton,\n TableSkeletonRow,\n TableEmptyState,\n AnimatedTableRow,\n SelectableTableRow,\n} from '@ui/components/table'\n\n// Phase 6 UI Components - Enhanced States\nexport { EmptyState, ErrorState, OfflineState, NoResultsState, NoDataState } from '@ui/components/empty-state'\n\n// Dynamic Island Toast System\nexport { DynamicIsland, DynamicIslandNotification } from '@ui/components/dynamic-island'\nexport {\n NotificationProvider,\n useNotifications,\n NotificationBellButton,\n type NotificationType,\n type Notification,\n} from '@ui/components/notifications'\n\n// Phase 1: New standardized components\nexport { Container, type ContainerVariant, type ContainerProps } from '@ui/components/container'\nexport { FormField, type FormFieldProps } from '@ui/components/form-field'\nexport { FormSection, type FormSectionProps } from '@ui/components/form-section'\nexport { ListItem, type ListItemVariant, type ListItemProps, type ListItemAction, type ListItemMetadata } from '@ui/components/list-item'\nexport { StatusBadge, type StatusType, type StatusBadgeProps } from '@ui/components/status-badge'\nexport { GlassModal } from '@ui/components/glass-modal'\nexport { Dialog, DialogTitle, DialogDescription, DialogBody, DialogActions } from '@ui/components/dialog'\n\n// Picker Components\nexport { SelectableListPicker, type SelectableListItem, type SelectableListPickerLabels } from '@ui/components/selectable-list-picker'\nexport { ChipPicker, type ChipItem, type ChipItemStyle } from '@ui/components/chip-picker'\nexport { SelectableChipPicker, type SelectableChipItem, type SelectableChipPickerLabels } from '@ui/components/selectable-chip-picker'\n\n// Adapted Carrefour Components\nexport { CopyableId } from '@ui/components/copyable-id'\nexport { CardActionMenu, type CardActionMenuItem } from '@ui/components/card-action-menu'\nexport { FilterBadge } from '@ui/components/filter-badge'\nexport { FeedItemCard } from '@ui/components/feed-item-card'\nexport { FormModal } from '@ui/components/form-modal'\nexport {\n ContextMenu,\n type ContextMenuEntry,\n type ContextMenuItem,\n type ContextMenuDivider,\n} from '@ui/components/context-menu'\nexport { DatePicker } from '@ui/components/date-picker'\nexport { TimePicker } from '@ui/components/time-picker'\nexport { StepTimeline, type StepTimelineProps, type StepTimelineItem, type StepTimelineStatus } from '@ui/components/step-timeline'\nexport { PageHeading, type PageHeadingProps, type BreadcrumbItem, type MetaItem } from '@ui/components/page-heading'\nexport { FormInput, FormTextarea, FormSelect, FormPriceInput, type FormInputProps, type FormTextareaProps, type FormSelectProps, type FormPriceInputProps } from '@ui/components/form-input'\nexport { Form, FormGrid, InlineForm, FormActionsRow, type FormProps, type FormGridProps, type InlineFormProps, type FormActionsRowProps } from '@ui/components/form'\nexport { FormActions, type FormActionsProps } from '@ui/components/form-actions'\nexport { FormToggle, type FormToggleProps } from '@ui/components/form-toggle'\nexport { FormCheckbox, type FormCheckboxProps } from '@ui/components/form-checkbox'\nexport { BaseForm, type BaseFormProps, type BaseFormIconColor } from '@ui/components/base-form'\nexport { ExpandableHistoryList, type ExpandableHistoryListProps, type ExpandableHistoryItem } from '@ui/components/expandable-history-list'\nexport { BooleanFlagsPicker, type BooleanFlagsPickerProps, type BooleanFlagsPreset } from '@ui/components/boolean-flags-picker'\nexport { InfoPopover, type InfoPopoverProps } from '@ui/components/info-popover'\nexport {\n DetailsPopover,\n type DetailsPopoverProps,\n type DetailsPopoverActor,\n type DetailsPopoverComparison,\n type DetailsPopoverNote,\n} from '@ui/components/details-popover'\n\nexport { StepFormPage, type FormStep, type StepFormPageProps } from '@ui/components/step-form-page'\nexport { StepNavigationButtons, type StepNavigationButtonsProps } from '@ui/components/step-navigation-buttons'\nexport { SearchFilterToolbar, type SearchFilterToolbarProps } from '@ui/components/search-filter-toolbar'\n\n// Entity Card\nexport { EntityCard, type EntityCardProps } from '@ui/components/entity-card'\n\n// Filter Components\nexport { FilterTileButton, FilterSectionHeader, type FilterTileButtonProps, type FilterSectionHeaderProps, type FilterTileColor } from '@ui/components/filter-tile-button'\n\n// Dock\nexport { DockSkeleton } from '@ui/components/dock-skeleton'\n\n// Launchpad Grid\nexport { LaunchpadGrid, type LaunchpadItem, type LaunchpadMenuItem, type LaunchpadUserProfile, type LaunchpadGridProps } from '@ui/components/launchpad-grid'\n\n\n// Skeleton Components\nexport {\n CardGridSkeleton,\n StatCardSkeleton,\n RegionFilterSkeleton,\n BrandFilterSkeleton,\n AnalysisSkeleton,\n} from '@ui/components/skeletons'\n\n// Generic Container Components\nexport { CookieConsent } from '@ui/components/cookie-consent'\nexport { DockContainer } from '@ui/components/dock-container'\nexport { AppShell, type AppShellProps } from '@ui/components/app-shell'\n\n// ============================================================================\n// Additional Components (not in original barrel)\n// ============================================================================\n\nexport { Avatar, AvatarButton } from '@ui/components/avatar'\nexport { Badge } from '@ui/components/badge'\nexport { Breadcrumb, type BreadcrumbPage } from '@ui/components/breadcrumb'\nexport { CreateActionButton } from '@ui/components/create-action-button'\nexport { DashboardProgressShell } from '@ui/components/dashboard-progress-shell'\nexport { DevModeBanner } from '@ui/components/dev-mode-banner'\nexport { Divider } from '@ui/components/divider'\nexport { Dock, type DockAction } from '@ui/components/dock'\nexport { Dropdown } from '@ui/components/dropdown'\nexport { DynamicIslandConfirm } from '@ui/components/dynamic-island-confirm'\nexport { ForceTouchMenu } from '@ui/components/force-touch-menu'\nexport { FlyoutMenu } from '@ui/components/flyout-menu'\nexport { FlyoutQuickActions } from '@ui/components/flyout-quick-actions'\nexport { FlyoutNavGrid, type FlyoutNavItem } from '@ui/components/flyout-nav-grid'\nexport { Heading, Subheading } from '@ui/components/heading'\nexport { LanguageSwitcher, type LanguageOption } from '@ui/components/language-switcher'\nexport { ItemSummary, type ItemSummaryMetadata } from '@ui/components/item-summary'\nexport { LiquidFilterInput } from '@ui/components/liquid-filter-input'\nexport { ManagementSurface } from '@ui/components/management-surface'\nexport { ManagementPageLayout, type ManagementPageLayoutProps } from '@ui/components/management-page-layout'\nexport { MonthPicker } from '@ui/components/month-picker'\nexport { NavigationProgress } from '@ui/components/navigation-progress'\nexport { PageEmptyState } from '@ui/components/page-empty-state'\nexport { PageLoadingState } from '@ui/components/page-loading-state'\nexport { BrandedLoader, WINDSOCK_LOADER, FUEL_PRICE_LOADER, KORI_ERP_LOADER, WIRE_LOADER } from '@ui/components/branded-loader'\nexport { AppLogo } from '@ui/components/app-logo'\nexport { NotFoundPage, BadRequestPage, ServerErrorPage, type AccentColor } from '@ui/components/error-pages'\nexport { PreferenceSection, type PreferenceSectionProps } from '@ui/components/preference-section'\nexport { ProfileIdentityCard } from '@ui/components/profile-identity-card'\nexport { SettingsDialog, type SettingsDialogProps, type SettingsDialogSection, type SettingsDialogIdentity } from '@ui/components/settings-dialog'\nexport { SettingsModal, type SettingsModalProps, type SettingsSection, type SettingsFieldConfig, type SelectionOption, type PreferenceGroupConfig, type WorkspaceSectionConfig, type ProfileSectionConfig, type PreferencesSectionConfig, type ToggleConfig, type RadioGroupConfig, type LanguageOption as SettingsLanguageOption } from '@ui/components/settings-modal'\nexport { SelectionCard, type SelectionCardProps } from '@ui/components/selection-card'\nexport { SelectableOptionsGrid, type SelectableOptionsGridOption, type SelectableOptionsGridProps } from '@ui/components/selectable-options-grid'\nexport { Stat } from '@ui/components/stat'\nexport { StatusToggle } from '@ui/components/status-toggle'\nexport { ThemeSwitch } from '@ui/components/theme-switch'\nexport { Text, TextLink, Strong, Code } from '@ui/components/text'\nexport { WindsockIcon } from '@ui/icons/windsock-icon'\n\n// Auth Primitives\nexport { OtpInput, type OtpInputProps } from '@ui/components/otp-input'\nexport { PasswordStrengthMeter, type PasswordStrengthMeterProps, type PasswordPolicy } from '@ui/components/password-strength-meter'\nexport { BackupCodeGrid, type BackupCodeGridProps } from '@ui/components/backup-code-grid'\nexport { SocialLoginButtons, type SocialLoginButtonsProps, type SocialProvider } from '@ui/components/social-login-buttons'\nexport { AuthLayout, type AuthLayoutProps } from '@ui/components/auth-layout'\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport { useHaptic, triggerHaptic } from '@ui/hooks/use-haptic'\nexport { usePullToRefresh, PullToRefreshIndicator } from '@ui/hooks/use-pull-to-refresh'\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport {\n springPresets,\n springPresetsReduced,\n buttonPress,\n buttonTap,\n buttonPressReduced,\n cardHover,\n cardPress,\n cardHoverReduced,\n slideUp,\n slideRight,\n slideDown,\n fadeScale,\n fadeOnly,\n notificationBanner,\n notificationBannerReduced,\n listItem,\n staggerContainer,\n listItemReduced,\n swipeActionThreshold,\n swipeConstraints,\n pageControlDot,\n iosColors,\n durations,\n durationsReduced,\n easings,\n prefersReducedMotion,\n getTransition,\n getVariants,\n createMotionProps,\n} from '@ui/lib/animations'\n\nexport { resolveGlassAccentRgb } from '@ui/lib/glass-accent'\n\nexport {\n registerSubdivisionTheme,\n getSubdivisionPalette,\n getSubdivisionFlagUrl,\n getSubdivisionHexColor,\n getSubdivisionGradient,\n getSubdivisionColors,\n getSubdivisionAccent,\n isValidSubdivision,\n type SubdivisionColorPalette,\n type SubdivisionThemeConfig,\n} from '@ui/lib/subdivision-theme'\n\nexport { formatCurrency, formatPercentage, formatDate, getStatusColor } from '@ui/lib/utils'\n\n// ============================================================================\n// Notification Badge\n// ============================================================================\n\nexport { NotificationBadge, type NotificationBadgeProps } from '@ui/components/notification-badge'\n\n// Fuel UI shared contracts\nexport type { FuelColors, SaveStatus } from '@ui/types/fuel-ui'\n\n// ============================================================================\n// Radiant Components (landing page / marketing)\n// ============================================================================\n\nexport {\n RadiantHeading,\n RadiantSubheading,\n Lead,\n AnimatedNumber,\n Gradient,\n GradientBackground,\n BentoCard,\n PlusGrid,\n PlusGridRow,\n PlusGridItem,\n RadiantStatCard,\n FeatureCard,\n} from '@ui/components/radiant'\n\n// ============================================================================\n// Category Tab (selectable color-coded tabs)\n// ============================================================================\n\nexport {\n CategoryTab,\n CategoryTabs,\n CategoryBadge,\n type CategoryTabConfig,\n type CategoryTabProps,\n type CategoryTabsProps,\n type CategoryBadgeProps,\n} from '@ui/components/category-tab'\n\n// ============================================================================\n// Option Grid (selectable option buttons)\n// ============================================================================\n\nexport { OptionGrid, type OptionGridItem, type OptionGridProps } from '@ui/components/option-grid'\nexport {\n CollapsibleGroupedList,\n type CollapsibleGroupedListProps,\n type CollapsibleGroup,\n} from '@ui/components/collapsible-grouped-list'\n\n// ============================================================================\n// User Avatar (avatar with dropdown menu)\n// ============================================================================\n\nexport {\n UserAvatar,\n UserMobileInfo,\n type UserAvatarUser,\n type UserAvatarMenuItem,\n type UserAvatarLabels,\n type UserAvatarProps,\n type UserMobileInfoProps,\n} from '@ui/components/user-avatar'\n\n// ============================================================================\n// Hero Panel (branded split-screen hero layout)\n// ============================================================================\n\nexport { HeroPanel, type HeroPanelStat, type HeroPanelProps } from '@ui/components/hero-panel'\n\n// ============================================================================\n// Skeleton Sub-components\n// ============================================================================\n\nexport { SectionHeaderSkeleton } from '@ui/components/skeletons'\nexport { shimmerClass, shimmerWhiteClass } from '@ui/components/skeletons/shimmer'\n\n// ============================================================================\n// Interactive Geo Map (generic SVG map with markers)\n// ============================================================================\n\nexport {\n InteractiveGeoMap,\n type InteractiveGeoMapProps,\n GeoMapCanvas,\n type GeoMapCanvasProps,\n useGeoMapState,\n type UseGeoMapStateOptions,\n type GeoMapRegionData,\n MapZoomControls,\n type MapZoomControlsProps,\n GeoMapLegend,\n type GeoMapLegendProps,\n} from '@ui/components/geo-map'\n\n// ============================================================================\n// Brazil Theme Data (palettes, accents, coordinates, macro-regions, helpers)\n// ============================================================================\n\nexport {\n BRAZIL_STATE_PALETTES,\n BRAZIL_ACCENT_MAP,\n BR_THEME_CONFIG,\n BRAZIL_STATE_COORDINATES,\n BRAZIL_MAP_CENTER,\n BRAZIL_MACRO_REGIONS,\n getBrazilFlagUrl,\n getBrazilHexColor,\n getBrazilPalette,\n getBrazilGradient,\n getBrazilColors,\n getBrazilAccent,\n isValidBrazilState,\n} from '@ui/lib/themes/brazil'\n\n// ============================================================================\n// US Theme Data (palettes, accents, coordinates, macro-regions, helpers)\n// ============================================================================\n\n// ============================================================================\n// Entity Drawer (glassmorphism side-panel for editing entities)\n// ============================================================================\n\nexport { EntityDrawer, type EntityDrawerProps, type EntityDrawerMaxWidth } from '@ui/components/entity-drawer'\n\n// ============================================================================\n// Filter Pill (dismissible active-filter chip using liquid-pill CSS)\n// ============================================================================\n\nexport { FilterPill, type FilterPillProps, type FilterPillVariant } from '@ui/components/filter-pill'\n\n// ============================================================================\n// US Theme Data (palettes, accents, coordinates, macro-regions, helpers)\n// ============================================================================\n\nexport {\n US_STATE_PALETTES,\n US_ACCENT_MAP,\n US_THEME_CONFIG,\n US_STATE_COORDINATES,\n US_MAP_CENTER,\n US_MACRO_REGIONS,\n getUsFlagUrl,\n getUsHexColor,\n getUsPalette,\n getUsGradient,\n getUsColors,\n getUsAccent,\n isValidUsState,\n} from '@ui/lib/themes/us'\n\n// ============================================================================\n// Catalyst (Headless UI) primitives\n// ============================================================================\n\nexport * from '@ui/components/catalyst'\n\n// ============================================================================\n// Shared Navigation (types + builders + composite component)\n// ============================================================================\n\nexport {\n type NavigationItem,\n type NavigationMenuItem,\n buildDockActions,\n buildLaunchpadItems,\n buildFlyoutNavItems,\n filterByPermission,\n} from '@ui/lib/navigation'\nexport { AppNavigation, type AppNavigationProps } from '@ui/components/app-navigation'\nexport { PlatformShell, type PlatformShellProps, type PlatformShellUser, type PlatformShellLabels } from '@ui/components/platform-shell'\nexport { usePlatformShellStore, selectUserName, selectUserInitial, selectIsAuthenticated, selectShowShellChrome, type PlatformShellState, type ShellUser, type ShellPreferences, type ShellLabels } from '@ui/stores/platform-shell-store'\n","/**\n * useGeoMapState Hook\n * ===================\n *\n * Centralized state management for an interactive geographic map.\n * Handles zoom, pan, hover, and marker entrance animations.\n * Fully generic — no country-specific data.\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react'\n\nconst MIN_ZOOM = 0.8\nconst MAX_ZOOM = 4\nconst ZOOM_STEP = 0.5\n\nexport interface GeoMapRegionData<T = unknown> {\n code: string\n items: T[]\n coordinates: [number, number]\n}\n\nexport interface UseGeoMapStateOptions<T> {\n items: T[]\n getRegionCode: (item: T) => string\n regionCoordinates: Record<string, [number, number]>\n defaultCenter?: [number, number]\n}\n\nexport function useGeoMapState<T>({\n items,\n getRegionCode,\n regionCoordinates,\n defaultCenter = [0, 0],\n}: UseGeoMapStateOptions<T>) {\n const [zoom, setZoom] = useState(1)\n const [center, setCenter] = useState<[number, number]>(defaultCenter)\n const [hoveredRegion, setHoveredRegion] = useState<string | null>(null)\n const [animatedRegions, setAnimatedRegions] = useState<Set<string>>(new Set())\n const [panOffset, setPanOffset] = useState<[number, number]>([0, 0])\n\n const handleZoomIn = useCallback(() => {\n setZoom((previous) => Math.min(previous + ZOOM_STEP, MAX_ZOOM))\n }, [])\n\n const handleZoomOut = useCallback(() => {\n setZoom((previous) => Math.max(previous - ZOOM_STEP, MIN_ZOOM))\n }, [])\n\n const handleMoveEnd = useCallback(\n (position: { coordinates: [number, number]; zoom: number }) => {\n setCenter(position.coordinates)\n setZoom(position.zoom)\n },\n []\n )\n\n const handlePan = useCallback((dx: number, dy: number) => {\n setPanOffset((previous) => [previous[0] + dx, previous[1] + dy])\n }, [])\n\n // Group items by region code\n const regionGroups = useMemo((): GeoMapRegionData<T>[] => {\n const grouped = new Map<string, T[]>()\n\n items.forEach((item) => {\n const code = getRegionCode(item)\n if (!grouped.has(code)) {\n grouped.set(code, [])\n }\n grouped.get(code)!.push(item)\n })\n\n return Array.from(grouped.entries())\n .filter(([code]) => regionCoordinates[code])\n .map(([code, regionItems]) => ({\n code,\n items: regionItems,\n coordinates: regionCoordinates[code],\n }))\n .sort((a, b) => b.items.length - a.items.length)\n }, [items, getRegionCode, regionCoordinates])\n\n const animationCodes = useMemo(\n () => regionGroups.map((regionData) => regionData.code),\n [regionGroups]\n )\n const animationSignature = useMemo(\n () => animationCodes.join('|'),\n [animationCodes]\n )\n\n // Animate markers appearing one by one\n useEffect(() => {\n if (animationCodes.length === 0) return\n\n setAnimatedRegions(new Set())\n\n const timers: ReturnType<typeof setTimeout>[] = []\n animationCodes.forEach((code, index) => {\n const timer = setTimeout(() => {\n setAnimatedRegions((previous) => new Set([...previous, code]))\n }, index * 100)\n timers.push(timer)\n })\n\n return () => timers.forEach(clearTimeout)\n }, [animationSignature])\n\n // Calculate marker size based on item count and zoom level\n const getMarkerSize = useCallback(\n (count: number): number => {\n const baseSize = count >= 10 ? 14 : count >= 5 ? 11 : count >= 2 ? 8 : 6\n return baseSize / Math.sqrt(zoom)\n },\n [zoom]\n )\n\n // Calculate font size based on zoom level\n const getFontSize = useCallback(\n (markerSize: number): string => {\n const baseSize = markerSize > 10 ? 10 : 8\n const scaledSize = baseSize / Math.sqrt(zoom)\n return `${Math.max(scaledSize, 6)}px`\n },\n [zoom]\n )\n\n return {\n zoom,\n setZoom,\n handleZoomIn,\n handleZoomOut,\n handleMoveEnd,\n MIN_ZOOM,\n MAX_ZOOM,\n\n center,\n setCenter,\n panOffset,\n handlePan,\n\n hoveredRegion,\n setHoveredRegion,\n\n animatedRegions,\n\n regionGroups,\n\n getMarkerSize,\n getFontSize,\n }\n}\n","/**\n * GeoMapCanvas Component\n * ======================\n *\n * Core map rendering using SVG + d3-geo.\n * Handles geography rendering, markers, drag-to-pan, and interactions.\n * Zoom and pan are handled via viewBox manipulation for uniform scaling.\n *\n * Fully generic — no country-specific data. GeoJSON URL and region property\n * key are provided via props.\n */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { geoMercator, geoAlbersUsa, geoPath } from 'd3-geo'\nimport type { GeoMapRegionData } from '@ui/components/geo-map/use-geo-map-state'\n\nconst MAP_DEFAULT_STATE_COLOR = 'rgba(148, 163, 184, 0.08)'\nconst MAP_DEFAULT_MARKER_COLOR = '#6366f1'\n\nconst VIEWBOX_WIDTH = 1000\nconst VIEWBOX_HEIGHT = 500\n\ntype GeoFeature = {\n type: 'Feature'\n properties?: Record<string, string>\n geometry: GeoJSON.Geometry\n}\n\ntype GeoFeatureCollection = {\n type: 'FeatureCollection'\n features: GeoFeature[]\n}\n\nexport interface GeoMapCanvasProps<T = unknown> {\n regionGroups: GeoMapRegionData<T>[]\n regionColorMap: Map<string, string>\n animatedRegions: Set<string>\n zoom: number\n panOffset: [number, number]\n hoveredRegion: string | null\n onPan: (dx: number, dy: number) => void\n onRegionHover: (code: string | null) => void\n onRegionClick: (code: string) => void\n isRegionActive?: (code: string) => boolean\n getMarkerSize: (count: number) => number\n getFontSize: (markerSize: number) => string\n geoJsonUrl: string\n regionPropertyKey?: string\n projectionType?: 'mercator' | 'albersUsa'\n ariaLabel?: string\n}\n\nfunction GeoMapCanvasInner<T = unknown>(\n {\n regionGroups,\n regionColorMap,\n animatedRegions,\n zoom,\n panOffset,\n hoveredRegion,\n onPan,\n onRegionHover,\n onRegionClick,\n isRegionActive,\n getMarkerSize,\n getFontSize,\n geoJsonUrl,\n regionPropertyKey = 'sigla',\n projectionType = 'mercator',\n ariaLabel = 'Interactive map',\n }: GeoMapCanvasProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const [geoData, setGeoData] = useState<GeoFeatureCollection | null>(null)\n const svgRef = useRef<SVGSVGElement>(null)\n const dragState = useRef<{\n active: boolean\n startX: number\n startY: number\n lastX: number\n lastY: number\n didDrag: boolean\n } | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function loadGeoData() {\n try {\n const response = await fetch(geoJsonUrl)\n if (!response.ok) return\n const data = (await response.json()) as GeoFeatureCollection\n if (!cancelled) setGeoData(data)\n } catch {\n // Keep map shell rendered even if geography fetch fails.\n }\n }\n\n loadGeoData()\n return () => {\n cancelled = true\n }\n }, [geoJsonUrl])\n\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<SVGSVGElement>) => {\n if (event.button !== 0) return\n dragState.current = {\n active: true,\n startX: event.clientX,\n startY: event.clientY,\n lastX: event.clientX,\n lastY: event.clientY,\n didDrag: false,\n }\n },\n []\n )\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<SVGSVGElement>) => {\n if (!dragState.current?.active || !svgRef.current) return\n\n const totalDx = event.clientX - dragState.current.startX\n const totalDy = event.clientY - dragState.current.startY\n\n if (!dragState.current.didDrag) {\n if (Math.abs(totalDx) < 5 && Math.abs(totalDy) < 5) return\n dragState.current.didDrag = true\n }\n\n const dx = event.clientX - dragState.current.lastX\n const dy = event.clientY - dragState.current.lastY\n\n const rect = svgRef.current.getBoundingClientRect()\n const viewBoxWidth = VIEWBOX_WIDTH / zoom\n const scaleRatio = viewBoxWidth / rect.width\n\n onPan(dx * scaleRatio, dy * scaleRatio)\n dragState.current.lastX = event.clientX\n dragState.current.lastY = event.clientY\n },\n [zoom, onPan]\n )\n\n const handleMouseUp = useCallback(() => {\n if (dragState.current) {\n dragState.current.active = false\n }\n }, [])\n\n const wasDragAction = useCallback(() => {\n return dragState.current?.didDrag === true\n }, [])\n\n const getLighterColor = (hexColor: string): string => {\n const r = parseInt(hexColor.slice(1, 3), 16)\n const g = parseInt(hexColor.slice(3, 5), 16)\n const b = parseInt(hexColor.slice(5, 7), 16)\n return `rgba(${r}, ${g}, ${b}, 0.25)`\n }\n\n const lighterColors = useMemo(() => {\n const colors = new Map<string, string>()\n regionColorMap.forEach((color, code) => {\n colors.set(code, getLighterColor(color))\n })\n return colors\n }, [regionColorMap])\n\n const featureCollection = useMemo(() => {\n if (!geoData) return null\n return {\n type: 'FeatureCollection' as const,\n features: geoData.features as unknown as GeoJSON.Feature[],\n }\n }, [geoData])\n\n const projection = useMemo(() => {\n if (!featureCollection) return null\n const base = projectionType === 'albersUsa' ? geoAlbersUsa() : geoMercator()\n return base.fitSize([VIEWBOX_WIDTH, VIEWBOX_HEIGHT], featureCollection)\n }, [featureCollection, projectionType])\n\n const pathGenerator = useMemo(() => {\n if (!projection) return null\n return geoPath(projection)\n }, [projection])\n\n const regionsWithItems = useMemo(() => {\n return new Set(regionGroups.map((regionData) => regionData.code))\n }, [regionGroups])\n\n const hasAnyActiveFilter = useMemo(() => {\n return regionGroups.some((regionData) => isRegionActive?.(regionData.code))\n }, [regionGroups, isRegionActive])\n\n const viewBoxParts = useMemo(() => {\n const width = VIEWBOX_WIDTH / zoom\n const height = VIEWBOX_HEIGHT / zoom\n const x = (VIEWBOX_WIDTH - width) / 2 - panOffset[0]\n const y = (VIEWBOX_HEIGHT - height) / 2 - panOffset[1]\n return { x, y, width, height }\n }, [zoom, panOffset])\n\n const viewBox = `${viewBoxParts.x} ${viewBoxParts.y} ${viewBoxParts.width} ${viewBoxParts.height}`\n\n return (\n <div\n ref={ref}\n className=\"relative w-full overflow-hidden rounded-2xl border border-white/20 dark:border-white/[0.12] shadow-lg shadow-black/5 dark:shadow-black/30\"\n data-testid=\"map-canvas\"\n >\n <svg\n ref={svgRef}\n viewBox={viewBox}\n className=\"w-full h-[500px] cursor-grab active:cursor-grabbing\"\n aria-label={ariaLabel}\n style={{ touchAction: 'none', background: 'transparent' }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n <defs>\n <filter id=\"glow-active\" x=\"-20%\" y=\"-20%\" width=\"140%\" height=\"140%\">\n <feDropShadow dx=\"0\" dy=\"0\" stdDeviation=\"3\" floodColor=\"#fff\" floodOpacity=\"0.6\" />\n </filter>\n <filter id=\"inactive-dim\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feColorMatrix type=\"saturate\" values=\"0.3\" />\n </filter>\n <filter id=\"marker-glow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n <feDropShadow dx=\"0\" dy=\"0\" stdDeviation=\"4\" floodColor=\"#fff\" floodOpacity=\"0.7\" />\n </filter>\n {/* Inset clip hides projection edge artifacts (AlbersUsa rectangular clip lines) */}\n <clipPath id=\"geo-inset-clip\">\n <rect\n x={viewBoxParts.x + 2}\n y={viewBoxParts.y + 2}\n width={viewBoxParts.width - 4}\n height={viewBoxParts.height - 4}\n />\n </clipPath>\n </defs>\n\n <g clipPath=\"url(#geo-inset-clip)\">\n {geoData && pathGenerator\n ? geoData.features.map((feature, index) => {\n const regionCode = feature.properties?.[regionPropertyKey] || feature.properties?.name || ''\n const hasItems = regionsWithItems.has(regionCode)\n const regionColor = regionColorMap.get(regionCode) ?? MAP_DEFAULT_STATE_COLOR\n const isActive = isRegionActive?.(regionCode)\n const isHovered = hoveredRegion === regionCode\n const isDimmed = hasAnyActiveFilter && !isActive && hasItems\n const pathData = pathGenerator(feature as unknown as GeoJSON.Feature)\n\n if (!pathData) return null\n\n return (\n <path\n key={`${regionCode}-${index}`}\n d={pathData}\n fillRule=\"evenodd\"\n data-region={hasItems ? regionCode : undefined}\n onMouseEnter={() => hasItems && onRegionHover(regionCode)}\n onMouseLeave={() => onRegionHover(null)}\n onClick={() => {\n if (hasItems && !wasDragAction()) {\n onRegionClick(regionCode)\n }\n }}\n fill={\n hasItems\n ? isHovered\n ? regionColor\n : isActive\n ? regionColor\n : lighterColors.get(regionCode) || getLighterColor(regionColor)\n : MAP_DEFAULT_STATE_COLOR\n }\n stroke={isActive ? '#fff' : isDimmed ? 'rgba(148, 163, 184, 0.2)' : 'rgba(255, 255, 255, 0.4)'}\n strokeWidth={(isActive ? 2.5 : 0.5) / zoom}\n filter={isActive ? 'url(#glow-active)' : isDimmed ? 'url(#inactive-dim)' : undefined}\n opacity={isDimmed ? 0.45 : 1}\n style={{\n transition: 'fill 0.3s ease, opacity 0.3s ease',\n cursor: hasItems ? 'pointer' : undefined,\n }}\n />\n )\n })\n : null}\n </g>\n\n {projection\n ? regionGroups.map((regionData) => {\n const point = projection(regionData.coordinates)\n if (!point) return null\n\n const [x, y] = point\n const isAnimated = animatedRegions.has(regionData.code)\n const markerSize = getMarkerSize(regionData.items.length)\n const markerColor = regionColorMap.get(regionData.code) ?? MAP_DEFAULT_MARKER_COLOR\n const isActive = isRegionActive?.(regionData.code)\n const isDimmed = hasAnyActiveFilter && !isActive\n\n return (\n <g\n key={regionData.code}\n transform={`translate(${x}, ${y})`}\n data-region={regionData.code}\n data-testid={`marker-${regionData.code}`}\n onMouseEnter={() => onRegionHover(regionData.code)}\n onMouseLeave={() => onRegionHover(null)}\n onClick={() => {\n if (!wasDragAction()) {\n onRegionClick(regionData.code)\n }\n }}\n >\n <g\n style={{\n transform: isAnimated ? 'scale(1)' : 'scale(0)',\n transformOrigin: '0 0',\n opacity: isAnimated ? (isDimmed ? 0.35 : 1) : 0,\n transition: 'all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1)',\n cursor: 'pointer',\n }}\n filter={isActive ? 'url(#marker-glow)' : undefined}\n >\n {isActive ? (\n <circle\n r={markerSize + 6}\n fill=\"none\"\n stroke=\"#fff\"\n strokeWidth={2}\n opacity={0.8}\n />\n ) : (\n <circle\n r={markerSize + 4}\n fill=\"none\"\n stroke={markerColor}\n strokeWidth={1}\n opacity={isDimmed ? 0 : 0.4}\n className={isDimmed ? undefined : 'animate-ping'}\n style={isDimmed ? undefined : { animationDuration: '2s' }}\n />\n )}\n <circle\n r={markerSize}\n fill={markerColor}\n stroke={isActive ? '#fff' : markerColor}\n strokeWidth={isActive ? 3 : 2}\n className=\"transition-colors\"\n style={{\n filter: isActive ? 'brightness(1.2) saturate(1.3)' : isDimmed ? 'saturate(0.3) brightness(0.8)' : 'none',\n }}\n />\n {regionData.items.length > 1 && (\n <text\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n style={{\n fontFamily: 'system-ui',\n fontSize: getFontSize(markerSize),\n fontWeight: 'bold',\n fill: '#fff',\n pointerEvents: 'none',\n opacity: isDimmed ? 0.5 : 1,\n }}\n >\n {regionData.items.length}\n </text>\n )}\n </g>\n </g>\n )\n })\n : null}\n </svg>\n </div>\n )\n}\n\nexport const GeoMapCanvas = React.forwardRef(GeoMapCanvasInner) as <T = unknown>(\n props: GeoMapCanvasProps<T> & { ref?: React.Ref<HTMLDivElement> }\n) => React.ReactElement | null\n","/**\n * MapZoomControls Component\n * ========================\n *\n * Zoom in/out buttons and zoom level display for the map.\n * Generic — accepts optional labels instead of calling useTranslations.\n */\n\nimport React from 'react'\nimport { PlusIcon, MinusIcon } from '@heroicons/react/24/outline'\n\nexport interface MapZoomControlsProps {\n zoom: number\n minZoom: number\n maxZoom: number\n onZoomIn: () => void\n onZoomOut: () => void\n labels?: { zoomIn?: string; zoomOut?: string }\n}\n\nexport const MapZoomControls = React.forwardRef<HTMLDivElement, MapZoomControlsProps>(\n ({ zoom, minZoom, maxZoom, onZoomIn, onZoomOut, labels }, ref) => {\n return (\n <div\n ref={ref}\n className=\"flex flex-col gap-1\"\n data-testid=\"map-zoom-controls\"\n >\n <button\n onClick={onZoomIn}\n disabled={zoom >= maxZoom}\n className=\"p-2 liquid-surface rounded-lg disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n aria-label={labels?.zoomIn ?? 'Zoom in'}\n data-testid=\"zoom-in-button\"\n >\n <PlusIcon className=\"h-5 w-5 text-gray-700 dark:text-gray-300\" />\n </button>\n <button\n onClick={onZoomOut}\n disabled={zoom <= minZoom}\n className=\"p-2 liquid-surface rounded-lg disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n aria-label={labels?.zoomOut ?? 'Zoom out'}\n data-testid=\"zoom-out-button\"\n >\n <MinusIcon className=\"h-5 w-5 text-gray-700 dark:text-gray-300\" />\n </button>\n <div className=\"mt-1 px-2 py-1 liquid-surface rounded-lg text-center\">\n <span\n className=\"text-xs font-medium text-gray-600 dark:text-gray-400\"\n data-testid=\"zoom-level\"\n >\n {Math.round(zoom * 100)}%\n </span>\n </div>\n </div>\n )\n }\n)\n\nMapZoomControls.displayName = 'MapZoomControls'\n","/**\n * InteractiveGeoMap Component\n * ============================\n *\n * Main orchestrator for an interactive geographic map.\n * Fully generic — works with any country and any data type.\n * Consumers provide GeoJSON, region coordinates, and render props\n * for domain-specific content (hover panels, fuel breakdowns, etc.).\n */\n\n'use client'\n\nimport React, { useMemo } from 'react'\nimport { useGeoMapState, type UseGeoMapStateOptions } from '@ui/components/geo-map/use-geo-map-state'\nimport { GeoMapCanvas } from '@ui/components/geo-map/geo-map-canvas'\nimport { MapZoomControls } from '@ui/components/geo-map/map-zoom-controls'\n\nexport interface InteractiveGeoMapProps<T = unknown> {\n // Data\n items: T[]\n getRegionCode: (item: T) => string\n regionCoordinates: Record<string, [number, number]>\n defaultCenter?: [number, number]\n\n // Map rendering\n geoJsonUrl: string\n regionPropertyKey?: string\n projectionType?: 'mercator' | 'albersUsa'\n getRegionColor: (code: string) => string\n getFlagUrl?: (code: string) => string | null\n\n // Interaction\n isRegionActive?: (code: string) => boolean\n onRegionToggle?: (code: string) => void\n\n // Hover panel — consumer provides domain-specific content\n renderHoverContent?: (regionCode: string, items: T[]) => React.ReactNode\n\n // Counter label\n formatCounter?: (\n totalItems: number,\n totalRegions: number,\n activeItems?: number,\n activeRegions?: number\n ) => string\n\n // Zoom\n zoomLabels?: { zoomIn?: string; zoomOut?: string }\n\n // A11y\n ariaLabel?: string\n className?: string\n}\n\nfunction InteractiveGeoMapInner<T = unknown>(\n {\n items,\n getRegionCode,\n regionCoordinates,\n defaultCenter,\n geoJsonUrl,\n regionPropertyKey,\n projectionType,\n getRegionColor,\n isRegionActive,\n onRegionToggle,\n renderHoverContent,\n formatCounter,\n zoomLabels,\n ariaLabel,\n className,\n }: InteractiveGeoMapProps<T>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const mapStateOptions: UseGeoMapStateOptions<T> = {\n items,\n getRegionCode,\n regionCoordinates,\n defaultCenter,\n }\n\n const mapState = useGeoMapState(mapStateOptions)\n\n const regionColorMap = useMemo(() => {\n const colorMap = new Map<string, string>()\n mapState.regionGroups.forEach((regionData) => {\n colorMap.set(regionData.code, getRegionColor(regionData.code))\n })\n return colorMap\n }, [mapState.regionGroups, getRegionColor])\n\n const handleRegionClick = (code: string) => {\n onRegionToggle?.(code)\n }\n\n // Find hovered region data\n const hoveredRegionData = useMemo(() => {\n if (!mapState.hoveredRegion) return null\n return mapState.regionGroups.find(\n (regionData) => regionData.code === mapState.hoveredRegion\n ) ?? null\n }, [mapState.hoveredRegion, mapState.regionGroups])\n\n // Counter text\n const counterText = useMemo(() => {\n if (!formatCounter) return null\n\n const hasActiveFilter = isRegionActive && mapState.regionGroups.some(\n (regionData) => isRegionActive(regionData.code)\n )\n\n if (hasActiveFilter) {\n const activeRegions = mapState.regionGroups.filter(\n (regionData) => isRegionActive!(regionData.code)\n )\n const activeItemCount = activeRegions.reduce(\n (sum, regionData) => sum + regionData.items.length, 0\n )\n return formatCounter(items.length, mapState.regionGroups.length, activeItemCount, activeRegions.length)\n }\n\n return formatCounter(items.length, mapState.regionGroups.length)\n }, [formatCounter, isRegionActive, mapState.regionGroups, items.length])\n\n return (\n <div\n ref={ref}\n className={`space-y-4 ${className ?? ''}`}\n data-testid=\"interactive-geo-map-container\"\n >\n <div className=\"relative\">\n <GeoMapCanvas<T>\n regionGroups={mapState.regionGroups}\n regionColorMap={regionColorMap}\n animatedRegions={mapState.animatedRegions}\n zoom={mapState.zoom}\n panOffset={mapState.panOffset}\n hoveredRegion={mapState.hoveredRegion}\n onPan={mapState.handlePan}\n onRegionHover={mapState.setHoveredRegion}\n onRegionClick={handleRegionClick}\n isRegionActive={isRegionActive}\n getMarkerSize={mapState.getMarkerSize}\n getFontSize={mapState.getFontSize}\n geoJsonUrl={geoJsonUrl}\n regionPropertyKey={regionPropertyKey}\n projectionType={projectionType}\n ariaLabel={ariaLabel}\n />\n\n {/* Zoom Controls - top right */}\n <div className=\"absolute top-3 right-3 z-10\">\n <MapZoomControls\n zoom={mapState.zoom}\n minZoom={mapState.MIN_ZOOM}\n maxZoom={mapState.MAX_ZOOM}\n onZoomIn={mapState.handleZoomIn}\n onZoomOut={mapState.handleZoomOut}\n labels={zoomLabels}\n />\n </div>\n\n {/* Hovered Region Info — consumer-provided via renderHoverContent */}\n {mapState.hoveredRegion && hoveredRegionData && renderHoverContent && (\n <div className=\"absolute top-3 left-3 z-10 pointer-events-none\">\n {renderHoverContent(mapState.hoveredRegion, hoveredRegionData.items)}\n </div>\n )}\n\n {/* Counter - bottom left */}\n {counterText && (\n <div className=\"absolute bottom-3 left-3 z-10 pointer-events-none\">\n <div className=\"liquid-surface rounded-lg px-3 py-1.5\">\n <span className=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n {counterText}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport const InteractiveGeoMap = React.forwardRef(InteractiveGeoMapInner) as <T = unknown>(\n props: InteractiveGeoMapProps<T> & { ref?: React.Ref<HTMLDivElement> }\n) => React.ReactElement | null\n","/**\n * GeoMapLegend Component\n * =====================\n *\n * Displays top regions by item count with their colors and optional flags.\n * Generic — no country-specific logic.\n */\n\nimport React from 'react'\n\nconst DEFAULT_LEGEND_COLOR = '#6366f1'\n\nexport interface GeoMapLegendProps {\n items: Array<{ code: string; count: number }>\n colorMap: Map<string, string>\n getFlagUrl?: (code: string) => string | null\n getLabel?: (code: string) => string\n labels: { title: string; more: string }\n maxItems?: number\n}\n\nexport const GeoMapLegend = React.forwardRef<HTMLDivElement, GeoMapLegendProps>(\n ({ items, colorMap, getFlagUrl, getLabel, labels, maxItems = 5 }, ref) => {\n return (\n <div\n ref={ref}\n className=\"liquid-surface rounded-lg p-3\"\n data-testid=\"map-legend\"\n >\n <h4 className=\"text-xs font-semibold text-gray-700 dark:text-gray-300 mb-2\">\n {labels.title}\n </h4>\n <div className=\"space-y-1.5\">\n {items.slice(0, maxItems).map((item) => {\n const flagUrl = getFlagUrl?.(item.code)\n const regionColor = colorMap.get(item.code) ?? DEFAULT_LEGEND_COLOR\n const displayLabel = getLabel?.(item.code) ?? item.code\n\n return (\n <div\n key={item.code}\n className=\"flex items-center gap-2\"\n data-testid={`legend-item-${item.code}`}\n >\n {flagUrl ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={flagUrl}\n alt={item.code}\n className=\"w-4 h-4 shadow-sm\"\n />\n ) : (\n <div\n className=\"w-4 h-4 rounded-full\"\n style={{ backgroundColor: regionColor }}\n data-testid={`legend-color-${item.code}`}\n />\n )}\n <span className=\"text-xs text-gray-600 dark:text-gray-400\">\n {displayLabel} ({item.count})\n </span>\n </div>\n )\n })}\n {items.length > maxItems && (\n <div className=\"text-xs text-gray-500 dark:text-gray-400 italic pt-1\">\n +{items.length - maxItems} {labels.more}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nGeoMapLegend.displayName = 'GeoMapLegend'\n","import { type ReactNode } from 'react'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\n\nexport type EntityDrawerMaxWidth = 'max-w-xl' | 'max-w-2xl' | 'max-w-4xl' | 'max-w-6xl' | 'max-w-full'\n\nexport type EntityDrawerProps = {\n open: boolean\n onClose: () => void\n title: string\n subtitle?: string\n icon?: ReactNode\n gradient?: string\n maxWidth?: EntityDrawerMaxWidth\n tabs?: ReactNode\n children: ReactNode\n}\n\nexport function EntityDrawer({\n open,\n onClose,\n title,\n subtitle,\n icon,\n gradient = 'from-gray-400 to-gray-500',\n maxWidth = 'max-w-xl',\n tabs,\n children,\n}: EntityDrawerProps) {\n if (!open) return null\n\n return (\n <>\n {/* Backdrop — scoped to workspace area */}\n <div\n className=\"fixed inset-0 z-40 bg-black/20 backdrop-blur-[2px] transition-opacity\"\n onClick={onClose}\n data-testid=\"entity-drawer-backdrop\"\n />\n\n {/* Drawer — glassmorphism, scoped to workspace area */}\n <div className={`fixed top-[64px] right-2 bottom-2 z-50 flex w-full ${maxWidth} flex-col overflow-hidden rounded-2xl border border-white/60 bg-white/80 shadow-[0_8px_60px_-12px_rgba(0,0,0,0.25),0_0_0_1px_rgba(255,255,255,0.1)] backdrop-blur-2xl dark:border-white/[0.12] dark:bg-gray-900/85 dark:shadow-[0_8px_60px_-12px_rgba(0,0,0,0.6),0_0_0_1px_rgba(255,255,255,0.06)]`}>\n {/* Decorative gradient accent — left edge */}\n <div className={`absolute inset-y-0 left-0 w-[3px] bg-gradient-to-b ${gradient} opacity-80`} />\n\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-5\">\n <div className=\"flex items-center gap-3.5\">\n <div className={`flex h-11 w-11 items-center justify-center rounded-[14px] bg-gradient-to-br ${gradient} shadow-lg shadow-black/20 ring-1 ring-white/25`}>\n {icon}\n </div>\n <div>\n <h2 className=\"text-base font-bold tracking-tight text-gray-900 dark:text-white\">{title}</h2>\n {subtitle && (\n <p className=\"mt-0.5 text-[13px] text-gray-500 dark:text-gray-400\">{subtitle}</p>\n )}\n </div>\n </div>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n className=\"rounded-xl p-2 text-gray-400 transition-all hover:bg-black/5 hover:text-gray-600 active:scale-95 dark:text-gray-500 dark:hover:bg-white/10 dark:hover:text-gray-300\"\n data-testid=\"entity-drawer-close\"\n >\n <XMarkIcon className=\"h-5 w-5\" />\n </button>\n </div>\n\n {/* Separator */}\n <div className=\"mx-5 h-px bg-gradient-to-r from-transparent via-gray-200/80 to-transparent dark:via-white/10\" />\n\n {/* Optional tabs */}\n {tabs}\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-5\">\n {children}\n </div>\n </div>\n </>\n )\n}\n","import { forwardRef } from \"react\";\n\nimport NextLink from \"next/link\";\n\nexport const Link = forwardRef<\n HTMLAnchorElement,\n React.ComponentPropsWithoutRef<typeof NextLink>\n>(function Link(props, ref) {\n return <NextLink ref={ref} {...props} />;\n});\n","import React, { forwardRef } from \"react\";\n\nimport * as Headless from \"@headlessui/react\";\nimport clsx from \"clsx\";\n\nimport { Link } from \"./link\";\n\nconst styles = {\n base: [\n \"relative inline-flex items-center justify-center gap-x-2 rounded-lg border text-sm font-semibold\",\n \"px-3.5 py-2.5 transition-colors\",\n \"focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 dark:focus:ring-indigo-400 dark:focus:ring-offset-zinc-900\",\n \"disabled:opacity-50 disabled:pointer-events-none\",\n \"[&>svg]:size-4 [&>svg]:shrink-0\",\n ],\n solid: [\"border-transparent shadow-sm\"],\n outline: [\n \"border-zinc-300 bg-transparent hover:bg-zinc-50 text-zinc-900\",\n \"dark:border-zinc-600 dark:hover:bg-zinc-800 dark:text-zinc-100\",\n ],\n plain: [\n \"border-transparent text-zinc-700 hover:bg-zinc-100\",\n \"dark:text-zinc-300 dark:hover:bg-zinc-800\",\n ],\n colors: {\n \"dark/zinc\": [\"bg-zinc-900 text-white hover:bg-zinc-800\"],\n light: [\n \"bg-white text-zinc-900 hover:bg-zinc-50 dark:bg-zinc-800 dark:text-white dark:hover:bg-zinc-700\",\n ],\n \"dark/white\": [\n \"bg-zinc-900 text-white hover:bg-zinc-800 dark:bg-white dark:text-zinc-900 dark:hover:bg-zinc-100\",\n ],\n dark: [\"bg-zinc-900 text-white hover:bg-zinc-800\"],\n white: [\"bg-white text-zinc-900 hover:bg-zinc-50\"],\n zinc: [\"bg-zinc-600 text-white hover:bg-zinc-700\"],\n indigo: [\"bg-indigo-500 text-white hover:bg-indigo-600\"],\n cyan: [\"bg-cyan-300 text-cyan-950 hover:bg-cyan-400\"],\n red: [\"bg-red-600 text-white hover:bg-red-700\"],\n orange: [\"bg-orange-500 text-white hover:bg-orange-600\"],\n amber: [\"bg-amber-400 text-amber-950 hover:bg-amber-500\"],\n yellow: [\"bg-yellow-300 text-yellow-950 hover:bg-yellow-400\"],\n lime: [\"bg-lime-300 text-lime-950 hover:bg-lime-400\"],\n green: [\"bg-green-600 text-white hover:bg-green-700\"],\n emerald: [\"bg-emerald-600 text-white hover:bg-emerald-700\"],\n teal: [\"bg-teal-600 text-white hover:bg-teal-700\"],\n sky: [\"bg-sky-500 text-white hover:bg-sky-600\"],\n blue: [\"bg-blue-600 text-white hover:bg-blue-700\"],\n brand: [\"bg-brand-600 text-white hover:bg-brand-700\"],\n accent: [\"bg-accent text-accent-foreground hover:bg-accent/90\"],\n violet: [\"bg-violet-500 text-white hover:bg-violet-600\"],\n purple: [\"bg-purple-500 text-white hover:bg-purple-600\"],\n fuchsia: [\"bg-fuchsia-500 text-white hover:bg-fuchsia-600\"],\n pink: [\"bg-pink-500 text-white hover:bg-pink-600\"],\n rose: [\"bg-rose-500 text-white hover:bg-rose-600\"],\n },\n};\n\ntype ButtonProps = (\n | { color?: keyof typeof styles.colors; outline?: never; plain?: never }\n | { color?: never; outline: true; plain?: never }\n | { color?: never; outline?: never; plain: true }\n) & {\n className?: string;\n children: React.ReactNode;\n // Accessibility enhancements\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n \"aria-busy\"?: boolean;\n loading?: boolean;\n} & (\n | Omit<Headless.ButtonProps, \"as\" | \"className\">\n | Omit<React.ComponentPropsWithoutRef<typeof Link>, \"className\">\n );\n\nexport const Button = forwardRef(function Button(\n {\n color,\n outline,\n plain,\n className,\n children,\n loading,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-busy\": ariaBusy,\n ...props\n }: ButtonProps,\n ref: React.ForwardedRef<HTMLElement>,\n) {\n const classes = clsx(\n className,\n styles.base,\n outline\n ? styles.outline\n : plain\n ? styles.plain\n : clsx(styles.solid, styles.colors[color ?? \"brand\"]),\n );\n\n // Accessibility attributes\n const accessibilityProps = {\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-busy\": ariaBusy || loading,\n ...(loading && { disabled: true }),\n };\n\n return \"href\" in props ? (\n <Link\n {...props}\n {...accessibilityProps}\n className={classes}\n ref={ref as React.ForwardedRef<HTMLAnchorElement>}\n >\n <TouchTarget>\n {loading && (\n <span\n className=\"animate-spin inline-block size-4 border-2 border-current border-t-transparent rounded-full mr-2\"\n aria-hidden=\"true\"\n />\n )}\n {children}\n </TouchTarget>\n </Link>\n ) : (\n <Headless.Button\n {...props}\n {...accessibilityProps}\n className={classes}\n ref={ref}\n >\n <TouchTarget>\n {loading && (\n <span\n className=\"animate-spin inline-block size-4 border-2 border-current border-t-transparent rounded-full mr-2\"\n aria-hidden=\"true\"\n />\n )}\n {children}\n </TouchTarget>\n </Headless.Button>\n );\n});\n\n/**\n * Expand the hit area to at least 44x44px on touch devices\n */\nexport function TouchTarget({ children }: { children: React.ReactNode }) {\n return (\n <>\n <span\n className=\"absolute top-1/2 left-1/2 size-[max(100%,2.75rem)] -translate-x-1/2 -translate-y-1/2 pointer-fine:hidden\"\n aria-hidden=\"true\"\n />\n {children}\n </>\n );\n}\n","import React, { forwardRef } from \"react\";\n\nimport * as Headless from \"@headlessui/react\";\nimport clsx from \"clsx\";\n\nexport function InputGroup({\n children,\n}: React.ComponentPropsWithoutRef<\"span\">) {\n return (\n <span\n data-slot=\"control\"\n className={clsx(\n \"relative isolate block\",\n \"has-[[data-slot=icon]:first-child]:[&_input]:pl-10 has-[[data-slot=icon]:last-child]:[&_input]:pr-10 sm:has-[[data-slot=icon]:first-child]:[&_input]:pl-8 sm:has-[[data-slot=icon]:last-child]:[&_input]:pr-8\",\n \"*:data-[slot=icon]:pointer-events-none *:data-[slot=icon]:absolute *:data-[slot=icon]:top-3 *:data-[slot=icon]:z-10 *:data-[slot=icon]:size-5 sm:*:data-[slot=icon]:top-2.5 sm:*:data-[slot=icon]:size-4\",\n \"[&>[data-slot=icon]:first-child]:left-3 sm:[&>[data-slot=icon]:first-child]:left-2.5 [&>[data-slot=icon]:last-child]:right-3 sm:[&>[data-slot=icon]:last-child]:right-2.5\",\n \"*:data-[slot=icon]:text-zinc-500\",\n )}\n >\n {children}\n </span>\n );\n}\n\nconst dateTypes = [\"date\", \"datetime-local\", \"month\", \"time\", \"week\"];\ntype DateType = (typeof dateTypes)[number];\n\nexport const Input = forwardRef(function Input(\n {\n className,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n \"aria-required\": ariaRequired,\n required,\n invalid,\n ...props\n }: {\n className?: string;\n type?:\n | \"email\"\n | \"number\"\n | \"password\"\n | \"search\"\n | \"tel\"\n | \"text\"\n | \"url\"\n | DateType;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: boolean;\n \"aria-required\"?: boolean;\n required?: boolean;\n invalid?: boolean;\n } & Omit<Headless.InputProps, \"as\" | \"className\">,\n ref: React.ForwardedRef<HTMLInputElement>,\n) {\n return (\n <span\n data-slot=\"control\"\n className={clsx([\n className,\n // Basic layout\n \"relative block w-full\",\n // Focus ring\n \"after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset sm:focus-within:after:ring-2 sm:focus-within:after:ring-blue-500\",\n // Disabled state\n \"has-data-disabled:opacity-50\",\n ])}\n >\n <Headless.Input\n ref={ref}\n {...props}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n aria-invalid={ariaInvalid || invalid}\n aria-required={ariaRequired || required}\n style={{\n ...props.style,\n // Override autofill with CSS custom properties\n \"--autofill-bg\": \"white\",\n \"--autofill-color\": \"black\",\n } as Record<string, string>}\n className={clsx([\n // Date classes\n props.type &&\n dateTypes.includes(props.type) && [\n \"[&::-webkit-datetime-edit-fields-wrapper]:p-0\",\n \"[&::-webkit-date-and-time-value]:min-h-[1.5em]\",\n \"[&::-webkit-datetime-edit]:inline-flex\",\n \"[&::-webkit-datetime-edit]:p-0\",\n \"[&::-webkit-datetime-edit-year-field]:p-0\",\n \"[&::-webkit-datetime-edit-month-field]:p-0\",\n \"[&::-webkit-datetime-edit-day-field]:p-0\",\n \"[&::-webkit-datetime-edit-hour-field]:p-0\",\n \"[&::-webkit-datetime-edit-minute-field]:p-0\",\n \"[&::-webkit-datetime-edit-second-field]:p-0\",\n \"[&::-webkit-datetime-edit-millisecond-field]:p-0\",\n \"[&::-webkit-datetime-edit-meridiem-field]:p-0\",\n ],\n // Basic layout\n \"relative block w-full appearance-none rounded-lg px-3.5 py-2.5 sm:px-3 sm:py-1.5\",\n // Typography\n \"text-base/6 text-zinc-950 dark:text-zinc-100 placeholder:text-zinc-500 dark:placeholder:text-zinc-400 sm:text-sm/6\",\n // Border\n \"border border-zinc-950/10 data-hover:border-zinc-950/20 dark:border-white/10 dark:data-hover:border-white/20\",\n // Background color\n \"bg-transparent dark:bg-white/5\",\n // Hide default focus styles\n \"focus:outline-none\",\n // Invalid state\n \"data-invalid:border-red-500 data-invalid:data-hover:border-red-500 dark:data-invalid:border-red-500 dark:data-invalid:data-hover:border-red-500\",\n // Disabled state\n \"data-disabled:border-zinc-950/20 dark:data-disabled:border-white/15 dark:data-disabled:bg-white/2.5 dark:data-hover:data-disabled:border-white/15\",\n // System icons\n \"dark:scheme-dark\",\n // Autofill override styles\n \"[&:-webkit-autofill]:!shadow-[inset_0_0_0_1000px_white] [&:-webkit-autofill]:!text-black\",\n \"[&:-webkit-autofill:hover]:!shadow-[inset_0_0_0_1000px_white] [&:-webkit-autofill:hover]:!text-black\",\n \"[&:-webkit-autofill:focus]:!shadow-[inset_0_0_0_1000px_white] [&:-webkit-autofill:focus]:!text-black\",\n \"[&:-webkit-autofill:active]:!shadow-[inset_0_0_0_1000px_white] [&:-webkit-autofill:active]:!text-black\",\n \"dark:[&:-webkit-autofill]:!shadow-[inset_0_0_0_1000px_rgb(24,24,27)] dark:[&:-webkit-autofill]:!text-zinc-200\",\n \"dark:[&:-webkit-autofill:hover]:!shadow-[inset_0_0_0_1000px_rgb(24,24,27)] dark:[&:-webkit-autofill:hover]:!text-zinc-200\",\n \"dark:[&:-webkit-autofill:focus]:!shadow-[inset_0_0_0_1000px_rgb(24,24,27)] dark:[&:-webkit-autofill:focus]:!text-zinc-200\",\n \"dark:[&:-webkit-autofill:active]:!shadow-[inset_0_0_0_1000px_rgb(24,24,27)] dark:[&:-webkit-autofill:active]:!text-zinc-200\",\n ])}\n />\n </span>\n );\n});\n","import React, { forwardRef } from \"react\";\n\nimport * as Headless from \"@headlessui/react\";\nimport clsx from \"clsx\";\n\n// Stub exports for compatibility with shadcn-style Select API\n// These are used by some components but map to Headless UI internally\nexport const SelectContent = ({ children }: { children: React.ReactNode }) => (\n <>{children}</>\n);\nexport const SelectItem = ({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: string;\n}) => <option value={value}>{children}</option>;\nexport const SelectTrigger = ({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) => <div className={className}>{children}</div>;\nexport const SelectValue = ({ placeholder }: { placeholder?: string }) => (\n <span>{placeholder}</span>\n);\n\nexport const Select = forwardRef(function Select(\n {\n className,\n multiple,\n ...props\n }: { className?: string } & Omit<Headless.SelectProps, \"as\" | \"className\">,\n ref: React.ForwardedRef<HTMLSelectElement>,\n) {\n return (\n <span\n data-slot=\"control\"\n className={clsx([\n className,\n // Basic layout\n \"group relative block w-full\",\n // Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode\n \"before:absolute before:inset-px before:rounded-lg before:bg-white before:shadow-sm\",\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n \"dark:before:hidden\",\n // Focus ring\n \"after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset has-data-focus:after:ring-2 has-data-focus:after:ring-blue-500\",\n // Disabled state\n \"has-data-disabled:opacity-50 has-data-disabled:before:bg-zinc-950/5 has-data-disabled:before:shadow-none\",\n ])}\n >\n <Headless.Select\n ref={ref}\n multiple={multiple}\n {...props}\n className={clsx([\n // Basic layout\n \"relative block w-full appearance-none rounded-lg py-2.5 sm:py-1.5\",\n // Horizontal padding\n multiple ? \"px-3.5 sm:px-3\" : \"pr-10 pl-3.5 sm:pr-9 sm:pl-3\",\n // Options (multi-select)\n \"[&_optgroup]:font-semibold\",\n // Typography\n \"text-base/6 text-zinc-950 dark:text-zinc-100 placeholder:text-zinc-500 dark:placeholder:text-zinc-400 sm:text-sm/6\",\n // Border\n \"border border-zinc-950/10 data-hover:border-zinc-950/20 dark:border-white/10 dark:data-hover:border-white/20\",\n // Background color\n \"bg-transparent dark:bg-white/5 dark:*:bg-zinc-800\",\n // Hide default focus styles\n \"focus:outline-none\",\n // Invalid state\n \"data-invalid:border-red-500 data-invalid:data-hover:border-red-500 dark:data-invalid:border-red-600 dark:data-invalid:data-hover:border-red-600\",\n // Disabled state\n \"data-disabled:border-zinc-950/20 data-disabled:opacity-100 dark:data-disabled:border-white/15 dark:data-disabled:bg-white/2.5 dark:data-hover:data-disabled:border-white/15\",\n ])}\n />\n {!multiple && (\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2\">\n <svg\n className=\"size-5 stroke-zinc-500 group-has-data-disabled:stroke-zinc-600 sm:size-4 dark:stroke-zinc-400 forced-colors:stroke-[CanvasText]\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n fill=\"none\"\n >\n <path\n d=\"M5.75 10.75L8 13L10.25 10.75\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.25 5.25L8 3L5.75 5.25\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n});\n","import React from \"react\";\n\nexport interface LabelProps\n extends React.LabelHTMLAttributes<HTMLLabelElement> {\n children: React.ReactNode;\n className?: string;\n required?: boolean;\n}\n\nexport const Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ children, className = \"\", required = false, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={`block text-sm font-medium text-gray-700 ${className}`}\n {...props}\n >\n {children}\n {required && <span className=\"text-red-500 ml-1\">*</span>}\n </label>\n );\n },\n);\n\nLabel.displayName = \"Label\";\n\nexport default Label;\n","import React, { memo } from \"react\";\n\nimport clsx from \"clsx\";\n\ninterface CardProps {\n children: React.ReactNode;\n className?: string;\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n variant?: \"default\" | \"elevated\" | \"outlined\" | \"flat\";\n hover?: boolean;\n loading?: boolean;\n onClick?: () => void;\n}\n\n/**\n * Unified Card Component\n *\n * Standardizes card patterns across the application:\n * - Consistent zinc color palette\n * - Unified shadows and borders\n * - Mobile-responsive padding\n * - Hover states and loading states\n */\nexport const Card = memo(function Card({\n children,\n className,\n padding = \"md\",\n variant = \"default\",\n hover = false,\n loading = false,\n onClick,\n}: CardProps) {\n const paddingClasses = {\n none: \"\",\n sm: \"p-3 sm:p-4\",\n md: \"p-4 sm:p-6\",\n lg: \"p-6 sm:p-8\",\n };\n\n const variantClasses = {\n default:\n \"bg-white dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 shadow-sm\",\n elevated:\n \"bg-white dark:bg-zinc-800 border border-zinc-200 dark:border-zinc-700 shadow-md\",\n outlined: \"bg-transparent border-2 border-zinc-300 dark:border-zinc-600\",\n flat: \"bg-zinc-50 dark:bg-zinc-800/50\",\n };\n\n const hoverClasses =\n hover || onClick ? \"hover:shadow-lg transition-shadow duration-200\" : \"\";\n const clickableClasses = onClick ? \"cursor-pointer\" : \"\";\n const loadingClasses = loading ? \"opacity-75 pointer-events-none\" : \"\";\n\n return (\n <div\n role={onClick ? \"button\" : undefined}\n tabIndex={onClick ? 0 : undefined}\n className={clsx(\n \"rounded-lg\",\n variantClasses[variant],\n paddingClasses[padding],\n hoverClasses,\n clickableClasses,\n loadingClasses,\n className,\n )}\n onClick={onClick}\n onKeyDown={onClick ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n } : undefined}\n >\n {children}\n </div>\n );\n});\n\n/**\n * Card Header - Standardized card header with title and optional actions\n */\nexport const CardHeader = memo(function CardHeader({\n title,\n subtitle,\n actions,\n className,\n children,\n}: {\n title: string;\n subtitle?: string;\n actions?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n}) {\n return (\n <div className={clsx(\"mb-4\", className)}>\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-lg font-semibold text-zinc-900 dark:text-zinc-100 truncate\">\n {title}\n </h3>\n {subtitle && (\n <p className=\"mt-1 text-sm text-zinc-600 dark:text-zinc-400 line-clamp-2\">\n {subtitle}\n </p>\n )}\n </div>\n\n {actions && (\n <div className=\"flex-shrink-0 flex items-center gap-2\">{actions}</div>\n )}\n </div>\n\n {children && <div className=\"mt-3\">{children}</div>}\n </div>\n );\n});\n\n/**\n * Card Title - Standardized card title component\n */\nexport const CardTitle = memo(function CardTitle({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <h3\n className={clsx(\n \"text-lg font-semibold text-zinc-900 dark:text-zinc-100\",\n className,\n )}\n >\n {children}\n </h3>\n );\n});\n\n/**\n * Card Description - Supporting text below card title\n */\nexport const CardDescription = memo(function CardDescription({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <p className={clsx(\"text-sm text-zinc-600 dark:text-zinc-400\", className)}>\n {children}\n </p>\n );\n});\n\n/**\n * Card Content - Standardized card content area\n */\nexport const CardContent = memo(function CardContent({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <div className={clsx(\"text-zinc-600 dark:text-zinc-400\", className)}>\n {children}\n </div>\n );\n});\n\n/**\n * Card Footer - Standardized card footer with actions\n */\nexport const CardFooter = memo(function CardFooter({\n children,\n className,\n justify = \"end\",\n}: {\n children: React.ReactNode;\n className?: string;\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n}) {\n const justifyClasses = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n };\n\n return (\n <div\n className={clsx(\n \"mt-4 pt-4 border-t border-zinc-200 dark:border-zinc-700 flex items-center gap-2\",\n justifyClasses[justify],\n className,\n )}\n >\n {children}\n </div>\n );\n});\n\n/**\n * Stat Card - Specialized card for displaying statistics\n */\nexport const StatCard = memo(function StatCard({\n title,\n value,\n subtitle,\n icon,\n trend,\n loading = false,\n className,\n}: {\n title: string;\n value: string | number;\n subtitle?: string;\n icon?: React.ReactNode;\n trend?: {\n value: number;\n label: string;\n direction: \"up\" | \"down\" | \"neutral\";\n };\n loading?: boolean;\n className?: string;\n}) {\n const trendColors = {\n up: \"text-green-600 dark:text-green-400\",\n down: \"text-red-600 dark:text-red-400\",\n neutral: \"text-zinc-600 dark:text-zinc-400\",\n };\n\n return (\n <Card variant=\"elevated\" hover className={className} loading={loading}>\n <div className=\"flex items-start\">\n {icon && (\n <div className=\"flex-shrink-0 mr-4\">\n <div className=\"w-12 h-12 rounded-lg bg-zinc-100 dark:bg-zinc-700 flex items-center justify-center\">\n {icon}\n </div>\n </div>\n )}\n\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-zinc-600 dark:text-zinc-400 truncate\">\n {title}\n </p>\n\n <div className=\"mt-1 flex items-baseline\">\n <p className=\"text-2xl font-bold text-zinc-900 dark:text-zinc-100\">\n {loading ? \"...\" : value}\n </p>\n\n {trend && !loading && (\n <div\n className={clsx(\n \"ml-2 flex items-center text-sm\",\n trendColors[trend.direction],\n )}\n >\n <span>\n {trend.direction === \"up\"\n ? \"\\u2197\"\n : trend.direction === \"down\"\n ? \"\\u2198\"\n : \"\\u2192\"}\n </span>\n <span className=\"ml-1\">{trend.value}%</span>\n </div>\n )}\n </div>\n\n {subtitle && (\n <p className=\"mt-1 text-sm text-zinc-600 dark:text-zinc-400\">\n {subtitle}\n </p>\n )}\n\n {trend && !loading && (\n <p className=\"mt-1 text-xs text-zinc-500 dark:text-zinc-500\">\n {trend.label}\n </p>\n )}\n </div>\n </div>\n </Card>\n );\n});\n","import * as React from \"react\";\n\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\n\nimport clsx from \"clsx\";\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={clsx(\n \"relative h-4 w-full overflow-hidden rounded-full bg-secondary\",\n className,\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n));\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","import React, { useState, useMemo, forwardRef } from \"react\";\n\nimport { EyeIcon, EyeSlashIcon } from \"@heroicons/react/24/outline\";\nimport { useTranslations } from \"next-intl\";\n\n/**\n * Validate individual password strength requirements.\n * Returns an object indicating which requirements are met.\n */\nfunction validatePasswordStrength(password: string) {\n return {\n minLength: password.length >= 8,\n hasUppercase: /[A-Z]/.test(password),\n hasLowercase: /[a-z]/.test(password),\n hasNumber: /\\d/.test(password),\n hasSpecial: /[!@#$%^&*()_+\\-=]/.test(password),\n };\n}\n\nexport interface PasswordInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n variant?: \"default\" | \"apple\";\n /** When true, shows password strength indicator and requirements checklist */\n showStrength?: boolean;\n}\n\n/**\n * Requirement check item with visual indicator\n */\nfunction RequirementCheck({\n met,\n label,\n}: {\n met: boolean;\n label: string;\n}) {\n return (\n <li className=\"flex items-center gap-1.5 text-xs\">\n <span\n className={`flex-shrink-0 w-3.5 h-3.5 rounded-full flex items-center justify-center text-[10px] font-bold ${\n met\n ? \"bg-emerald-500 text-white\"\n : \"bg-zinc-200 dark:bg-zinc-700 text-zinc-400 dark:text-zinc-500\"\n }`}\n >\n {met ? \"\\u2713\" : \"\"}\n </span>\n <span\n className={\n met\n ? \"text-emerald-600 dark:text-emerald-400\"\n : \"text-zinc-500 dark:text-zinc-400\"\n }\n >\n {label}\n </span>\n </li>\n );\n}\n\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n { className = \"\", variant = \"default\", showStrength = false, onChange, ...props },\n ref,\n ) {\n const [showPassword, setShowPassword] = useState(false);\n const [internalValue, setInternalValue] = useState(\"\");\n const t = useTranslations();\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInternalValue(e.target.value);\n onChange?.(e);\n };\n\n const strength = useMemo(\n () => validatePasswordStrength(internalValue),\n [internalValue],\n );\n\n const metCount = useMemo(() => {\n const checks = Object.values(strength);\n return checks.filter(Boolean).length;\n }, [strength]);\n\n const strengthLevel = useMemo(() => {\n if (metCount <= 2) return \"weak\";\n if (metCount <= 4) return \"medium\";\n return \"strong\";\n }, [metCount]);\n\n const strengthBarColor = {\n weak: \"bg-red-500\",\n medium: \"bg-amber-500\",\n strong: \"bg-emerald-500\",\n }[strengthLevel];\n\n const strengthBarWidth = {\n weak: \"w-1/3\",\n medium: \"w-2/3\",\n strong: \"w-full\",\n }[strengthLevel];\n\n const baseInputClasses =\n variant === \"apple\"\n ? \"w-full px-4 py-3 pr-12 text-[17px] bg-white dark:bg-zinc-800 border border-[#d2d2d7] dark:border-zinc-700 text-[#1d1d1f] dark:text-white placeholder-[#86868b] dark:placeholder-zinc-500 rounded-xl focus:outline-none focus:ring-2 focus:ring-[#0071e3] transition-all\"\n : \"w-full px-4 py-3.5 pr-12 text-base rounded-xl border transition-all duration-300 text-zinc-900 dark:text-white placeholder-zinc-500 dark:placeholder-zinc-500 focus:outline-none focus:ring-2 focus:border-transparent\";\n\n const buttonClasses =\n variant === \"apple\"\n ? \"absolute top-1/2 -translate-y-1/2 right-3 p-1.5 hover:bg-[#f5f5f7] dark:hover:bg-zinc-700 rounded-lg transition-colors\"\n : \"absolute top-1/2 -translate-y-1/2 right-3 p-2 hover:bg-zinc-200/50 dark:hover:bg-zinc-700/50 rounded-lg transition-all duration-200\";\n\n const iconClasses =\n variant === \"apple\"\n ? \"h-5 w-5 text-[#86868b] dark:text-zinc-400\"\n : \"h-5 w-5 text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-200\";\n\n return (\n <div>\n <div className=\"relative\">\n <input\n ref={ref}\n type={showPassword ? \"text\" : \"password\"}\n className={`${baseInputClasses} ${className}`}\n onChange={handleChange}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className={buttonClasses}\n aria-label={showPassword ? t(\"aria.hidePassword\") : t(\"aria.showPassword\")}\n >\n {showPassword ? (\n <EyeSlashIcon className={iconClasses} />\n ) : (\n <EyeIcon className={iconClasses} />\n )}\n </button>\n </div>\n\n {showStrength && internalValue.length > 0 && (\n <div className=\"mt-2 space-y-2\">\n {/* Strength bar */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 h-1.5 bg-zinc-200 dark:bg-zinc-700 rounded-full overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all duration-300 ${strengthBarColor} ${strengthBarWidth}`}\n />\n </div>\n <span\n className={`text-xs font-medium ${\n strengthLevel === \"weak\"\n ? \"text-red-500\"\n : strengthLevel === \"medium\"\n ? \"text-amber-500\"\n : \"text-emerald-500\"\n }`}\n >\n {t(`login.passwordStrength.${strengthLevel}`)}\n </span>\n </div>\n\n {/* Requirements checklist */}\n <ul className=\"space-y-1\">\n <RequirementCheck\n met={strength.minLength}\n label={t(\"login.passwordRequirements.minLength\")}\n />\n <RequirementCheck\n met={strength.hasUppercase}\n label={t(\"login.passwordRequirements.uppercase\")}\n />\n <RequirementCheck\n met={strength.hasLowercase}\n label={t(\"login.passwordRequirements.lowercase\")}\n />\n <RequirementCheck\n met={strength.hasNumber}\n label={t(\"login.passwordRequirements.number\")}\n />\n <RequirementCheck\n met={strength.hasSpecial}\n label={t(\"login.passwordRequirements.special\")}\n />\n </ul>\n </div>\n )}\n </div>\n );\n },\n);\n","import * as React from \"react\";\n\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\n\nimport clsx from \"clsx\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={clsx(\n \"inline-flex h-9 items-center justify-center rounded-lg bg-muted/50 p-0.5 text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={clsx(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={clsx(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import React from \"react\";\n\nimport { useTranslations } from \"next-intl\";\n\n// Optimized contact card component\n// Single responsibility: Display contact information efficiently\n\ninterface ContactCardProps {\n type: \"partnerships\" | \"press\" | \"careers\" | \"general\";\n email: string;\n phone: string;\n}\n\n// Memoized contact card to prevent unnecessary re-renders\nexport const ContactCard = React.memo<ContactCardProps>(function ContactCard({\n type,\n email,\n phone,\n}) {\n const t = useTranslations(\"contact\");\n\n return (\n <div className=\"rounded-2xl bg-gray-50 p-10\">\n <h3 className=\"text-base/7 font-semibold text-gray-900\">\n {t(type)}\n </h3>\n <dl className=\"mt-3 space-y-1 text-sm/6 text-gray-600\">\n <div>\n <dt className=\"sr-only\">Email</dt>\n <dd>\n <a href={`mailto:${email}`} className=\"font-semibold text-blue-600\">\n {email}\n </a>\n </dd>\n </div>\n <div className=\"mt-1\">\n <dt className=\"sr-only\">Telefone</dt>\n <dd>{phone}</dd>\n </div>\n </dl>\n </div>\n );\n});\n\n// Office location card with minimal DOM structure\ninterface OfficeCardProps {\n city: string;\n address: string;\n postalCode: string;\n}\n\nexport const OfficeCard = React.memo<OfficeCardProps>(function OfficeCard({\n city,\n address,\n postalCode,\n}) {\n return (\n <div className=\"rounded-2xl bg-gray-50 p-10\">\n <h3 className=\"text-base/7 font-semibold text-gray-900\">{city}</h3>\n <address className=\"mt-3 space-y-1 text-sm/6 text-gray-600 not-italic\">\n <p>{address}</p>\n <p>{postalCode}</p>\n </address>\n </div>\n );\n});\n\n// Contact section compound component pattern\ninterface ContactSectionProps {\n title: string;\n subtitle: string;\n children: React.ReactNode;\n}\n\nexport const ContactSection = React.memo<ContactSectionProps>(\n function ContactSection({ title, subtitle, children }) {\n return (\n <div className=\"grid grid-cols-1 gap-10 py-16 lg:grid-cols-3\">\n <div>\n <h2 className=\"text-4xl font-semibold tracking-tight text-pretty text-gray-900\">\n {title}\n </h2>\n <p className=\"mt-4 text-base/7 text-gray-600\">{subtitle}</p>\n </div>\n <div className=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:col-span-2 lg:gap-8\">\n {children}\n </div>\n </div>\n );\n },\n);\n","import React, { memo } from \"react\";\n\nimport clsx from \"clsx\";\n\ninterface PageHeaderProps {\n title: string;\n subtitle?: string;\n size?: \"default\" | \"large\";\n actions?: React.ReactNode;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Unified Page Header Component\n *\n * Standardizes page header patterns across the application:\n * - Consistent typography sizing (text-2xl default, text-3xl large)\n * - Unified zinc color palette\n * - Mobile-responsive layout\n */\nexport const PageHeader = memo(function PageHeader({\n title,\n subtitle,\n size = \"default\",\n actions,\n className,\n children,\n}: PageHeaderProps) {\n return (\n <div className={clsx(\"mb-6 sm:mb-8\", className)}>\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n <h1\n className={clsx(\n \"font-bold text-zinc-900 dark:text-zinc-100 truncate\",\n size === \"large\" ? \"text-3xl\" : \"text-2xl\",\n )}\n >\n {title}\n </h1>\n {subtitle && (\n <p className=\"mt-2 text-sm text-zinc-600 dark:text-zinc-400 line-clamp-2\">\n {subtitle}\n </p>\n )}\n </div>\n\n {actions && (\n <div className=\"flex-shrink-0 flex items-center gap-2 flex-wrap\">\n {actions}\n </div>\n )}\n </div>\n\n {children && <div className=\"mt-4\">{children}</div>}\n </div>\n );\n});\n\n/**\n * Page Section Header - For subsections within pages\n */\nexport const PageSectionHeader = memo(function PageSectionHeader({\n title,\n subtitle,\n actions,\n className,\n children,\n}: Omit<PageHeaderProps, \"size\">) {\n return (\n <div className={clsx(\"mb-4\", className)}>\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"text-lg sm:text-xl font-semibold text-zinc-900 dark:text-zinc-100\">\n {title}\n </h2>\n {subtitle && (\n <p className=\"mt-1 text-sm text-zinc-600 dark:text-zinc-400 line-clamp-2\">\n {subtitle}\n </p>\n )}\n </div>\n\n {actions && (\n <div className=\"flex-shrink-0 flex items-center gap-2 flex-wrap\">\n {actions}\n </div>\n )}\n </div>\n\n {children && <div className=\"mt-3\">{children}</div>}\n </div>\n );\n});\n\n/**\n * Card Section Header - For headers within cards or smaller sections\n */\nexport const CardSectionHeader = memo(function CardSectionHeader({\n title,\n subtitle,\n actions,\n className,\n children,\n}: Omit<PageHeaderProps, \"size\">) {\n return (\n <div className={clsx(\"mb-3\", className)}>\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-base sm:text-lg font-medium text-zinc-900 dark:text-zinc-100\">\n {title}\n </h3>\n {subtitle && (\n <p className=\"mt-1 text-xs sm:text-sm text-zinc-600 dark:text-zinc-400 line-clamp-1\">\n {subtitle}\n </p>\n )}\n </div>\n\n {actions && (\n <div className=\"flex-shrink-0 flex items-center gap-1 flex-wrap\">\n {actions}\n </div>\n )}\n </div>\n\n {children && <div className=\"mt-2\">{children}</div>}\n </div>\n );\n});\n","/**\n * Platform Shell Store (Zustand)\n * ==============================\n * Single source of truth for all shell UI state across apps.\n * Replaces prop-drilling and local useState for drawers, flyout,\n * preferences, user info, and notifications.\n *\n * Usage:\n * import { usePlatformShellStore } from '@datatechsolutions/ui'\n * const openProfile = usePlatformShellStore((s) => s.openProfile)\n */\n\nimport { create } from 'zustand'\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type ShellUser = {\n name?: string | null\n email?: string | null\n image?: string | null\n role?: string | null\n permissions?: string[]\n organizationId?: string | null\n}\n\nexport type ShellPreferences = {\n locale: string\n localeFlag?: string\n localeName?: string\n theme: 'light' | 'dark' | 'system'\n resolvedTheme: 'light' | 'dark'\n dockPosition: 'left' | 'right' | 'bottom' | 'top'\n dockAutoHide: boolean\n dockEnabled: boolean\n}\n\nexport type ShellLabels = {\n home?: string\n profile?: string\n signOut?: string\n signOutConfirmTitle?: string\n cancel?: string\n notifications?: string\n theme?: string\n currentTheme?: string\n language?: string\n currentLocale?: string\n localeFlag?: string\n actions?: string\n}\n\n// ── Store ────────────────────────────────────────────────────────────────────\n\nexport type PlatformShellState = {\n // ── Drawers & modals ─────────────────────────────────────────\n profileDrawerOpen: boolean\n flyoutOpen: boolean\n signOutConfirmOpen: boolean\n settingsModalOpen: boolean\n settingsSection: string\n\n // ── User ─────────────────────────────────────────────────────\n user: ShellUser | null\n authStatus: 'loading' | 'authenticated' | 'unauthenticated'\n\n // ── Preferences ──────────────────────────────────────────────\n preferences: ShellPreferences\n\n // ── Notifications ────────────────────────────────────────────\n notificationCount: number\n\n // ── Labels (i18n) ────────────────────────────────────────────\n labels: ShellLabels\n\n // ── Branding ─────────────────────────────────────────────────\n appName: string\n appGradient: string\n\n // ── Callbacks (set by the shell wrapper, called by any component) ──\n _onSignOut: (() => void) | null\n _onToggleTheme: (() => void) | null\n _onNavigate: ((href: string) => void) | null\n _onNotifications: (() => void) | null\n _onLanguageChange: ((locale: string) => void) | null\n\n // ── Actions ──────────────────────────────────────────────────\n openProfile: () => void\n closeProfile: () => void\n openSettings: (section?: string) => void\n closeSettings: () => void\n openFlyout: () => void\n closeFlyout: () => void\n requestSignOut: () => void\n cancelSignOut: () => void\n confirmSignOut: () => void\n toggleTheme: () => void\n changeLanguage: (locale: string) => void\n navigate: (href: string) => void\n openNotifications: () => void\n\n // ── Setters (called by shell wrapper to sync state) ──────────\n setUser: (user: ShellUser | null) => void\n setAuthStatus: (status: 'loading' | 'authenticated' | 'unauthenticated') => void\n setPreferences: (prefs: Partial<ShellPreferences>) => void\n setNotificationCount: (count: number) => void\n setLabels: (labels: ShellLabels) => void\n setBranding: (appName: string, appGradient: string) => void\n registerCallbacks: (callbacks: {\n onSignOut?: () => void\n onToggleTheme?: () => void\n onNavigate?: (href: string) => void\n onNotifications?: () => void\n onLanguageChange?: (locale: string) => void\n }) => void\n}\n\nexport const usePlatformShellStore = create<PlatformShellState>((set, get) => ({\n // ── Initial state ──────────────────────────────────────────────\n profileDrawerOpen: false,\n flyoutOpen: false,\n signOutConfirmOpen: false,\n settingsModalOpen: false,\n settingsSection: 'workspace',\n\n user: null,\n authStatus: 'loading',\n\n preferences: {\n locale: 'en',\n theme: 'system',\n resolvedTheme: 'dark',\n dockPosition: 'left',\n dockAutoHide: false,\n dockEnabled: true,\n },\n\n notificationCount: 0,\n labels: {},\n appName: '',\n appGradient: '',\n\n _onSignOut: null,\n _onToggleTheme: null,\n _onNavigate: null,\n _onNotifications: null,\n _onLanguageChange: null,\n\n // ── Actions ────────────────────────────────────────────────────\n openProfile: () => set({ profileDrawerOpen: true }),\n closeProfile: () => set({ profileDrawerOpen: false }),\n openSettings: (section?: string) => set({ settingsModalOpen: true, settingsSection: section ?? 'workspace' }),\n closeSettings: () => set({ settingsModalOpen: false }),\n openFlyout: () => set({ flyoutOpen: true }),\n closeFlyout: () => set({ flyoutOpen: false }),\n\n requestSignOut: () => set({ signOutConfirmOpen: true }),\n cancelSignOut: () => set({ signOutConfirmOpen: false }),\n confirmSignOut: () => {\n set({ signOutConfirmOpen: false })\n get()._onSignOut?.()\n },\n\n toggleTheme: () => get()._onToggleTheme?.(),\n\n changeLanguage: (locale: string) => {\n const callback = get()._onLanguageChange\n if (callback) {\n callback(locale)\n } else {\n // Default: set cookie and reload\n if (typeof document !== 'undefined') {\n document.cookie = `NEXT_LOCALE=${locale}; path=/; max-age=31536000; SameSite=Lax`\n window.location.reload()\n }\n }\n },\n\n navigate: (href: string) => get()._onNavigate?.(href),\n openNotifications: () => get()._onNotifications?.(),\n\n // ── Setters ────────────────────────────────────────────────────\n setUser: (user) => set({ user }),\n setAuthStatus: (authStatus) => set({ authStatus }),\n setPreferences: (prefs) => set((state) => ({\n preferences: { ...state.preferences, ...prefs },\n })),\n setNotificationCount: (notificationCount) => set({ notificationCount }),\n setLabels: (labels) => set({ labels }),\n setBranding: (appName, appGradient) => set({ appName, appGradient }),\n registerCallbacks: (callbacks) => set({\n _onSignOut: callbacks.onSignOut ?? null,\n _onToggleTheme: callbacks.onToggleTheme ?? null,\n _onNavigate: callbacks.onNavigate ?? null,\n _onNotifications: callbacks.onNotifications ?? null,\n _onLanguageChange: callbacks.onLanguageChange ?? null,\n }),\n}))\n\n// ── Derived selectors ────────────────────────────────────────────────────────\n\nexport const selectUserName = (state: PlatformShellState) =>\n state.user?.name ?? state.user?.email ?? undefined\n\nexport const selectUserInitial = (state: PlatformShellState) =>\n (state.user?.name?.trim()?.[0] ?? state.user?.email?.trim()?.[0] ?? 'U').toUpperCase()\n\nexport const selectIsAuthenticated = (state: PlatformShellState) =>\n state.authStatus === 'authenticated'\n\nexport const selectShowShellChrome = (state: PlatformShellState) =>\n state.authStatus === 'authenticated'\n","import { type ReactNode } from 'react'\nimport { EntityDrawer, type EntityDrawerMaxWidth } from '@ui/index'\n\ntype WorkspaceDrawerProps = {\n open: boolean\n onClose: () => void\n title: string\n subtitle?: string\n icon?: ReactNode\n gradient?: string\n maxWidth?: EntityDrawerMaxWidth\n tabs?: ReactNode\n children: ReactNode\n}\n\nexport function WorkspaceDrawer({\n open,\n onClose,\n title,\n subtitle,\n icon,\n gradient = 'from-gray-400 to-gray-500',\n maxWidth = 'max-w-2xl',\n tabs,\n children,\n}: WorkspaceDrawerProps) {\n return (\n <EntityDrawer\n open={open}\n onClose={onClose}\n title={title}\n subtitle={subtitle}\n icon={icon}\n gradient={gradient}\n maxWidth={maxWidth}\n tabs={tabs}\n >\n {children}\n </EntityDrawer>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\nimport { Button, IconButton, Input } from '@ui/index'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype StartNodeConfigFormProps = {\n config: StartNodeConfig\n onSave: (config: StartNodeConfig) => void\n onCancel: () => void\n}\n\nexport function StartNodeConfigForm({ config, onSave, onCancel }: StartNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.startNodeConfig')\n const [inputVariables, setInputVariables] = useState<string[]>([...config.inputVariables])\n const [newVariable, setNewVariable] = useState('')\n\n const handleAddVariable = () => {\n const trimmed = newVariable.trim()\n if (trimmed && !inputVariables.includes(trimmed)) {\n setInputVariables([...inputVariables, trimmed])\n setNewVariable('')\n }\n }\n\n const handleRemoveVariable = (variable: string) => {\n setInputVariables(inputVariables.filter((existingVariable) => existingVariable !== variable))\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n handleAddVariable()\n }\n }\n\n const handleSave = () => {\n onSave({ ...config, inputVariables })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('inputVariablesLabel')}\n </label>\n <p className=\"mb-2 text-xs text-gray-500 dark:text-gray-400\">{t('inputVariablesHelp')}</p>\n <div className=\"flex gap-2\">\n <Input\n value={newVariable}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewVariable(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={t('variablePlaceholder')}\n className=\"flex-1\"\n />\n <Button\n type=\"button\"\n onClick={handleAddVariable}\n outline\n size=\"sm\"\n >\n {t('addVariable')}\n </Button>\n </div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {inputVariables.map((variable) => (\n <span\n key={variable}\n className=\"inline-flex items-center gap-1 rounded-full bg-green-100 px-2.5 py-1 text-xs font-medium text-green-700 dark:bg-green-500/20 dark:text-green-300\"\n >\n {variable}\n <IconButton\n icon={<XMarkIcon className=\"h-3 w-3\" />}\n label={`Remove ${variable}`}\n onClick={() => handleRemoveVariable(variable)}\n variant=\"ghost\"\n size=\"sm\"\n className=\"!p-0\"\n />\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 border-t border-gray-200 pt-4 dark:border-gray-700\">\n <Button\n type=\"button\"\n onClick={onCancel}\n outline\n size=\"sm\"\n >\n {t('cancel')}\n </Button>\n <Button\n type=\"button\"\n onClick={handleSave}\n color=\"ios-glass-blue\"\n size=\"sm\"\n >\n {t('save')}\n </Button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\nimport type { EndNodeConfig } from '../../contracts'\n\ntype EndNodeConfigFormProps = {\n config: EndNodeConfig\n onSave: (config: EndNodeConfig) => void\n onCancel: () => void\n}\n\nexport function EndNodeConfigForm({ config, onSave, onCancel }: EndNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.endNodeConfig')\n const [outputVariables, setOutputVariables] = useState<string[]>([...config.outputVariables])\n const [newVariable, setNewVariable] = useState('')\n\n const handleAddVariable = () => {\n const trimmed = newVariable.trim()\n if (trimmed && !outputVariables.includes(trimmed)) {\n setOutputVariables([...outputVariables, trimmed])\n setNewVariable('')\n }\n }\n\n const handleRemoveVariable = (variable: string) => {\n setOutputVariables(outputVariables.filter((existingVariable) => existingVariable !== variable))\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n handleAddVariable()\n }\n }\n\n const handleSave = () => {\n onSave({ ...config, outputVariables })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('outputVariablesLabel')}\n </label>\n <p className=\"mb-2 text-xs text-gray-500 dark:text-gray-400\">{t('outputVariablesHelp')}</p>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={newVariable}\n onChange={(event) => setNewVariable(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={t('variablePlaceholder')}\n className=\"w-full flex-1 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n <button\n type=\"button\"\n onClick={handleAddVariable}\n className=\"text-sm text-indigo-600 hover:text-indigo-700 dark:text-indigo-400\"\n >\n {t('addVariable')}\n </button>\n </div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {outputVariables.map((variable) => (\n <span\n key={variable}\n className=\"inline-flex items-center gap-1 rounded-full bg-red-100 px-2.5 py-1 text-xs font-medium text-red-700 dark:bg-red-500/20 dark:text-red-300\"\n >\n {variable}\n <button\n type=\"button\"\n onClick={() => handleRemoveVariable(variable)}\n className=\"text-sm text-red-500 hover:text-red-600\"\n aria-label={`Remove ${variable}`}\n >\n <XMarkIcon className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-lg bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600\"\n >\n {t('save')}\n </button>\n </div>\n </div>\n )\n}\n","import { Button } from '@ui/index'\n\ntype ConfigFormActionsProps = {\n cancelLabel: string\n saveLabel: string\n onCancel: () => void\n onSave: () => void\n saveDisabled?: boolean\n}\n\nexport function ConfigFormActions({\n cancelLabel,\n saveLabel,\n onCancel,\n onSave,\n saveDisabled = false,\n}: ConfigFormActionsProps) {\n return (\n <div className=\"flex justify-end gap-2 border-t border-gray-200 pt-4 dark:border-gray-700\">\n <Button type=\"button\" outline onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button type=\"button\" onClick={onSave} disabled={saveDisabled}>\n {saveLabel}\n </Button>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { TrashIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormSelect, IconButton } from '@ui/index'\nimport type { IfElseNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype IfElseCondition = {\n variable: string\n operator: string\n value: string\n}\n\ntype IfElseNodeConfigFormProps = {\n config: IfElseNodeConfig\n onSave: (config: IfElseNodeConfig) => void\n onCancel: () => void\n}\n\nconst OPERATOR_OPTIONS = [\n { value: 'equals', labelKey: 'operatorEquals' },\n { value: 'not_equals', labelKey: 'operatorNotEquals' },\n { value: 'contains', labelKey: 'operatorContains' },\n { value: 'greater_than', labelKey: 'operatorGreaterThan' },\n { value: 'less_than', labelKey: 'operatorLessThan' },\n { value: 'is_empty', labelKey: 'operatorIsEmpty' },\n { value: 'is_not_empty', labelKey: 'operatorIsNotEmpty' },\n] as const\n\nexport function IfElseNodeConfigForm({ config, onSave, onCancel }: IfElseNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.ifElseNodeConfig')\n const [conditions, setConditions] = useState<IfElseCondition[]>(\n config.conditions.map((condition) => ({\n variable: condition.variable,\n operator: condition.operator,\n value: condition.value,\n }))\n )\n const [logicalOperator, setLogicalOperator] = useState<'and' | 'or'>(config.logicalOperator)\n\n const handleAddCondition = () => {\n setConditions([...conditions, { variable: '', operator: 'equals', value: '' }])\n }\n\n const handleRemoveCondition = (index: number) => {\n setConditions(conditions.filter((_, conditionIndex) => conditionIndex !== index))\n }\n\n const handleConditionChange = (index: number, field: keyof IfElseCondition, fieldValue: string) => {\n setConditions(conditions.map((condition, conditionIndex) =>\n conditionIndex === index ? { ...condition, [field]: fieldValue } : condition\n ))\n }\n\n const handleSave = () => {\n onSave({\n ...config,\n conditions: conditions.map((condition) => ({\n variable: condition.variable,\n operator: condition.operator,\n value: condition.value,\n })),\n logicalOperator,\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <div className=\"mb-3 flex items-center justify-between\">\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{t('conditionsLabel')}</label>\n <Button\n type=\"button\"\n onClick={handleAddCondition}\n >\n {t('addCondition')}\n </Button>\n </div>\n\n <div className=\"space-y-3\">\n {conditions.map((condition, index) => (\n <div key={index} className=\"flex items-start gap-2 rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800/50\">\n <div className=\"grid flex-1 grid-cols-3 gap-2\">\n <div>\n <FormInput\n type=\"text\"\n label={t('variableLabel')}\n value={condition.variable}\n onValueChange={(value) => handleConditionChange(index, 'variable', value)}\n placeholder={t('variableLabel')}\n inputSize=\"sm\"\n />\n </div>\n <div>\n <FormSelect\n label={t('operatorLabel')}\n value={condition.operator}\n onValueChange={(value) => handleConditionChange(index, 'operator', value)}\n options={OPERATOR_OPTIONS.map((option) => ({ value: option.value, label: t(option.labelKey) }))}\n inputSize=\"sm\"\n />\n </div>\n <div>\n <FormInput\n type=\"text\"\n label={t('valueLabel')}\n value={condition.value}\n onValueChange={(value) => handleConditionChange(index, 'value', value)}\n placeholder={t('valueLabel')}\n inputSize=\"sm\"\n />\n </div>\n </div>\n {conditions.length > 1 && (\n <IconButton\n onClick={() => handleRemoveCondition(index)}\n icon={<TrashIcon className=\"h-4 w-4\" />}\n label={t('removeCondition')}\n size=\"sm\"\n color=\"ios-red\"\n className=\"mt-5\"\n />\n )}\n </div>\n ))}\n </div>\n </div>\n\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">{t('logicalOperatorLabel')}</label>\n <div className=\"flex gap-2\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"logicalOperator\"\n value=\"and\"\n checked={logicalOperator === 'and'}\n onChange={() => setLogicalOperator('and')}\n className=\"text-indigo-600 focus:ring-indigo-400\"\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">AND</span>\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"logicalOperator\"\n value=\"or\"\n checked={logicalOperator === 'or'}\n onChange={() => setLogicalOperator('or')}\n className=\"text-indigo-600 focus:ring-indigo-400\"\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">OR</span>\n </label>\n </div>\n </div>\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport type { CodeNodeConfig } from '../../contracts'\n\ntype CodeNodeConfigFormProps = {\n config: CodeNodeConfig\n onSave: (config: CodeNodeConfig) => void\n onCancel: () => void\n}\n\nconst LANGUAGE_OPTIONS = ['javascript', 'python', 'typescript'] as const\n\nexport function CodeNodeConfigForm({ config, onSave, onCancel }: CodeNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.codeNodeConfig')\n const [language, setLanguage] = useState<CodeNodeConfig['language']>(config.language)\n const [code, setCode] = useState(config.code)\n\n const handleSave = () => {\n onSave({ ...config, language, code })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('languageLabel')}\n </label>\n <select\n value={language}\n onChange={(event) => setLanguage(event.target.value as CodeNodeConfig['language'])}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n >\n {LANGUAGE_OPTIONS.map((option) => (\n <option key={option} value={option}>{option}</option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('codeLabel')}\n </label>\n <textarea\n value={code}\n onChange={(event) => setCode(event.target.value)}\n placeholder={t('codePlaceholder')}\n rows={10}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 font-mono text-xs text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n\n <div className=\"flex justify-end gap-2 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-lg bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600\"\n >\n {t('save')}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { TrashIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormSelect, FormTextarea, IconButton } from '@ui/index'\nimport type { HttpRequestNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype HeaderEntry = {\n key: string\n value: string\n}\n\ntype HttpRequestNodeConfigFormProps = {\n config: HttpRequestNodeConfig\n onSave: (config: HttpRequestNodeConfig) => void\n onCancel: () => void\n}\n\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE'] as const\n\nfunction headersToEntries(headers: Record<string, string>): HeaderEntry[] {\n return Object.entries(headers).map(([key, value]) => ({ key, value }))\n}\n\nfunction entriesToHeaders(entries: HeaderEntry[]): Record<string, string> {\n const headers: Record<string, string> = {}\n for (const entry of entries) {\n if (entry.key.trim()) {\n headers[entry.key.trim()] = entry.value\n }\n }\n return headers\n}\n\nexport function HttpRequestNodeConfigForm({ config, onSave, onCancel }: HttpRequestNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.httpRequestNodeConfig')\n const [method, setMethod] = useState<HttpRequestNodeConfig['method']>(config.method)\n const [url, setUrl] = useState(config.url)\n const [headerEntries, setHeaderEntries] = useState<HeaderEntry[]>(headersToEntries(config.headers))\n const [body, setBody] = useState(config.body ?? '')\n const [timeoutMs, setTimeoutMs] = useState(config.timeoutMs)\n\n const handleAddHeader = () => {\n setHeaderEntries([...headerEntries, { key: '', value: '' }])\n }\n\n const handleRemoveHeader = (index: number) => {\n setHeaderEntries(headerEntries.filter((_, headerIndex) => headerIndex !== index))\n }\n\n const handleHeaderChange = (index: number, field: keyof HeaderEntry, fieldValue: string) => {\n setHeaderEntries(headerEntries.map((entry, headerIndex) =>\n headerIndex === index ? { ...entry, [field]: fieldValue } : entry\n ))\n }\n\n const handleSave = () => {\n onSave({\n ...config,\n method,\n url,\n headers: entriesToHeaders(headerEntries),\n body: method === 'GET' ? '' : body,\n timeoutMs,\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormSelect\n label={t('methodLabel')}\n value={method}\n onValueChange={(value) => setMethod(value as HttpRequestNodeConfig['method'])}\n options={HTTP_METHODS.map((httpMethod) => ({ value: httpMethod, label: httpMethod }))}\n />\n\n <FormInput\n type=\"text\"\n label={t('urlLabel')}\n value={url}\n onValueChange={setUrl}\n placeholder={t('urlPlaceholder')}\n />\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{t('headersLabel')}</label>\n <Button\n type=\"button\"\n onClick={handleAddHeader}\n >\n {t('addHeader')}\n </Button>\n </div>\n <div className=\"space-y-2\">\n {headerEntries.map((entry, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <FormInput\n type=\"text\"\n value={entry.key}\n onValueChange={(value) => handleHeaderChange(index, 'key', value)}\n placeholder={t('headerKeyPlaceholder')}\n className=\"flex-1\"\n />\n <FormInput\n type=\"text\"\n value={entry.value}\n onValueChange={(value) => handleHeaderChange(index, 'value', value)}\n placeholder={t('headerValuePlaceholder')}\n className=\"flex-1\"\n />\n <IconButton\n onClick={() => handleRemoveHeader(index)}\n icon={<TrashIcon className=\"h-4 w-4\" />}\n label={t('removeHeader')}\n size=\"sm\"\n color=\"ios-red\"\n />\n </div>\n ))}\n </div>\n </div>\n\n {method !== 'GET' && (\n <FormTextarea\n label={t('bodyLabel')}\n value={body}\n onValueChange={setBody}\n placeholder={t('bodyPlaceholder')}\n rows={5}\n className=\"font-mono text-xs\"\n />\n )}\n\n <FormInput\n type=\"number\"\n label={t('timeoutLabel')}\n value={String(timeoutMs)}\n onValueChange={(value) => setTimeoutMs(Number(value))}\n min={1000}\n max={60000}\n step={1000}\n />\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { FormInput, FormTextarea } from '@ui/index'\nimport type { TemplateTransformNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype TemplateTransformNodeConfigFormProps = {\n config: TemplateTransformNodeConfig\n onSave: (config: TemplateTransformNodeConfig) => void\n onCancel: () => void\n}\n\nexport function TemplateTransformNodeConfigForm({ config, onSave, onCancel }: TemplateTransformNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.templateTransformNodeConfig')\n const [template, setTemplate] = useState(config.template)\n const [outputVariable, setOutputVariable] = useState(config.outputVariable)\n\n const handleSave = () => {\n onSave({ ...config, template, outputVariable })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormTextarea\n label={t('templateLabel')}\n value={template}\n onValueChange={setTemplate}\n placeholder={t('templatePlaceholder')}\n rows={6}\n className=\"font-mono text-xs\"\n />\n\n <FormInput\n type=\"text\"\n label={t('outputVariableLabel')}\n value={outputVariable}\n onValueChange={setOutputVariable}\n placeholder={t('outputVariablePlaceholder')}\n />\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { FormInput } from '@ui/index'\nimport type { IterationNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype IterationNodeConfigFormProps = {\n config: IterationNodeConfig\n onSave: (config: IterationNodeConfig) => void\n onCancel: () => void\n}\n\nexport function IterationNodeConfigForm({ config, onSave, onCancel }: IterationNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.iterationNodeConfig')\n const [iteratorVariable, setIteratorVariable] = useState(config.iteratorVariable)\n const [maxIterations, setMaxIterations] = useState(config.maxIterations)\n\n const handleSave = () => {\n onSave({ ...config, iteratorVariable, maxIterations })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormInput\n type=\"text\"\n label={t('iteratorVariableLabel')}\n value={iteratorVariable}\n onValueChange={setIteratorVariable}\n placeholder={t('iteratorVariablePlaceholder')}\n />\n\n <FormInput\n type=\"number\"\n label={t('maxIterationsLabel')}\n value={String(maxIterations)}\n onValueChange={(value) => setMaxIterations(Number(value))}\n min={1}\n max={10000}\n />\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { FormInput } from '@ui/index'\nimport type { KnowledgeBaseNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype KnowledgeBaseNodeConfigFormProps = {\n config: KnowledgeBaseNodeConfig\n onSave: (config: KnowledgeBaseNodeConfig) => void\n onCancel: () => void\n}\n\nexport function KnowledgeBaseNodeConfigForm({ config, onSave, onCancel }: KnowledgeBaseNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.knowledgeBaseNodeConfig')\n const [sourceId, setSourceId] = useState(config.sourceId)\n const [topK, setTopK] = useState(config.topK)\n const [similarityThreshold, setSimilarityThreshold] = useState(config.similarityThreshold)\n\n const handleSave = () => {\n onSave({ ...config, sourceId, topK, similarityThreshold })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormInput\n type=\"text\"\n label={t('sourceIdLabel')}\n value={sourceId}\n onValueChange={setSourceId}\n placeholder={t('sourceIdPlaceholder')}\n />\n\n <FormInput\n type=\"number\"\n label={t('topKLabel')}\n value={String(topK)}\n onValueChange={(value) => setTopK(Number(value))}\n min={1}\n max={20}\n />\n\n <FormInput\n type=\"number\"\n label={t('similarityThresholdLabel')}\n value={String(similarityThreshold)}\n onValueChange={(value) => setSimilarityThreshold(Number(value))}\n min={0}\n max={1}\n step={0.1}\n />\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormTextarea, IconButton } from '@ui/index'\nimport type { AnswerNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype AnswerNodeConfigFormProps = {\n config: AnswerNodeConfig\n onSave: (config: AnswerNodeConfig) => void\n onCancel: () => void\n}\n\nexport function AnswerNodeConfigForm({ config, onSave, onCancel }: AnswerNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.answerNodeConfig')\n const [outputTemplate, setOutputTemplate] = useState(config.outputTemplate)\n const [outputVariables, setOutputVariables] = useState<string[]>([...config.outputVariables])\n const [newVariable, setNewVariable] = useState('')\n\n const handleAddVariable = () => {\n const trimmed = newVariable.trim()\n if (trimmed && !outputVariables.includes(trimmed)) {\n setOutputVariables([...outputVariables, trimmed])\n setNewVariable('')\n }\n }\n\n const handleRemoveVariable = (variable: string) => {\n setOutputVariables(outputVariables.filter((existingVariable) => existingVariable !== variable))\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n handleAddVariable()\n }\n }\n\n const handleSave = () => {\n onSave({ ...config, outputTemplate, outputVariables })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormTextarea\n label={t('outputTemplateLabel')}\n hint={t('outputTemplateHelp')}\n value={outputTemplate}\n onValueChange={setOutputTemplate}\n placeholder={t('outputTemplatePlaceholder')}\n rows={6}\n className=\"font-mono text-xs\"\n />\n\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('outputVariablesLabel')}\n </label>\n <div className=\"flex gap-2\">\n <FormInput\n type=\"text\"\n value={newVariable}\n onValueChange={setNewVariable}\n onKeyDown={handleKeyDown}\n placeholder={t('variablePlaceholder')}\n className=\"flex-1\"\n />\n <Button\n type=\"button\"\n onClick={handleAddVariable}\n >\n {t('addVariable')}\n </Button>\n </div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {outputVariables.map((variable) => (\n <span\n key={variable}\n className=\"inline-flex items-center gap-1 rounded-full bg-blue-100 px-2.5 py-1 text-xs font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\"\n >\n {variable}\n <IconButton\n onClick={() => handleRemoveVariable(variable)}\n icon={<XMarkIcon className=\"h-3 w-3\" />}\n label={`Remove ${variable}`}\n size=\"sm\"\n color=\"ios-red\"\n />\n </span>\n ))}\n </div>\n </div>\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { TrashIcon } from '@heroicons/react/24/outline'\nimport type { QuestionClassifierNodeConfig } from '../../contracts'\n\ntype ClassifierCategory = {\n id: string\n name: string\n description: string\n}\n\ntype QuestionClassifierNodeConfigFormProps = {\n config: QuestionClassifierNodeConfig\n onSave: (config: QuestionClassifierNodeConfig) => void\n onCancel: () => void\n}\n\nexport function QuestionClassifierNodeConfigForm({ config, onSave, onCancel }: QuestionClassifierNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.questionClassifierNodeConfig')\n const [modelId, setModelId] = useState(config.modelId)\n const [instructions, setInstructions] = useState(config.instructions)\n const [categories, setCategories] = useState<ClassifierCategory[]>(\n config.categories.map((category) => ({ ...category }))\n )\n\n const handleAddCategory = () => {\n setCategories([...categories, { id: `cat-${Date.now()}`, name: '', description: '' }])\n }\n\n const handleRemoveCategory = (index: number) => {\n if (categories.length <= 2) return\n setCategories(categories.filter((_, categoryIndex) => categoryIndex !== index))\n }\n\n const handleCategoryChange = (index: number, field: keyof ClassifierCategory, fieldValue: string) => {\n setCategories(categories.map((category, categoryIndex) =>\n categoryIndex === index ? { ...category, [field]: fieldValue } : category\n ))\n }\n\n const handleSave = () => {\n onSave({\n ...config,\n modelId,\n instructions,\n categories: categories.map((category) => ({\n id: category.id,\n name: category.name,\n description: category.description,\n })),\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('modelIdLabel')}\n </label>\n <input\n type=\"text\"\n value={modelId}\n onChange={(event) => setModelId(event.target.value)}\n placeholder={t('modelIdPlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('instructionsLabel')}\n </label>\n <textarea\n value={instructions}\n onChange={(event) => setInstructions(event.target.value)}\n placeholder={t('instructionsPlaceholder')}\n rows={4}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n\n <div>\n <div className=\"mb-3 flex items-center justify-between\">\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('categoriesLabel')}\n </label>\n <button\n type=\"button\"\n onClick={handleAddCategory}\n className=\"text-sm text-indigo-600 hover:text-indigo-700 dark:text-indigo-400\"\n >\n {t('addCategory')}\n </button>\n </div>\n\n <div className=\"space-y-3\">\n {categories.map((category, index) => (\n <div key={category.id} className=\"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800/50\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">\n {t('categoryIndex', { index: index + 1 })}\n </span>\n {categories.length > 2 && (\n <button\n type=\"button\"\n onClick={() => handleRemoveCategory(index)}\n className=\"text-sm text-red-500 hover:text-red-600\"\n aria-label={t('removeCategory')}\n >\n <TrashIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n <div className=\"space-y-2\">\n <input\n type=\"text\"\n value={category.name}\n onChange={(event) => handleCategoryChange(index, 'name', event.target.value)}\n placeholder={t('categoryNamePlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n <input\n type=\"text\"\n value={category.description}\n onChange={(event) => handleCategoryChange(index, 'description', event.target.value)}\n placeholder={t('categoryDescriptionPlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-lg bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600\"\n >\n {t('save')}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { TrashIcon } from '@heroicons/react/24/outline'\nimport type { ParameterExtractorNodeConfig } from '../../contracts'\n\ntype ExtractorParameter = {\n name: string\n type: 'string' | 'number' | 'boolean' | 'array'\n description: string\n required: boolean\n}\n\ntype ParameterExtractorNodeConfigFormProps = {\n config: ParameterExtractorNodeConfig\n onSave: (config: ParameterExtractorNodeConfig) => void\n onCancel: () => void\n}\n\nconst PARAMETER_TYPES = ['string', 'number', 'boolean', 'array'] as const\n\nexport function ParameterExtractorNodeConfigForm({ config, onSave, onCancel }: ParameterExtractorNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.parameterExtractorNodeConfig')\n const [modelId, setModelId] = useState(config.modelId)\n const [parameters, setParameters] = useState<ExtractorParameter[]>(\n config.parameters.map((parameter) => ({ ...parameter }))\n )\n\n const handleAddParameter = () => {\n setParameters([...parameters, { name: '', type: 'string', description: '', required: false }])\n }\n\n const handleRemoveParameter = (index: number) => {\n setParameters(parameters.filter((_, parameterIndex) => parameterIndex !== index))\n }\n\n const handleParameterChange = (index: number, field: keyof ExtractorParameter, fieldValue: string | boolean) => {\n setParameters(parameters.map((parameter, parameterIndex) =>\n parameterIndex === index ? { ...parameter, [field]: fieldValue } : parameter\n ))\n }\n\n const handleSave = () => {\n onSave({\n ...config,\n modelId,\n parameters: parameters.map((parameter) => ({\n name: parameter.name,\n type: parameter.type,\n description: parameter.description,\n required: parameter.required,\n })),\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('modelIdLabel')}\n </label>\n <input\n type=\"text\"\n value={modelId}\n onChange={(event) => setModelId(event.target.value)}\n placeholder={t('modelIdPlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n\n <div>\n <div className=\"mb-3 flex items-center justify-between\">\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('parametersLabel')}\n </label>\n <button\n type=\"button\"\n onClick={handleAddParameter}\n className=\"text-sm text-indigo-600 hover:text-indigo-700 dark:text-indigo-400\"\n >\n {t('addParameter')}\n </button>\n </div>\n\n <div className=\"space-y-3\">\n {parameters.map((parameter, index) => (\n <div key={index} className=\"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800/50\">\n <div className=\"mb-2 flex items-center justify-end\">\n <button\n type=\"button\"\n onClick={() => handleRemoveParameter(index)}\n className=\"text-sm text-red-500 hover:text-red-600\"\n aria-label={t('removeParameter')}\n >\n <TrashIcon className=\"h-4 w-4\" />\n </button>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"mb-1 block text-xs text-gray-500 dark:text-gray-400\">{t('parameterNameLabel')}</label>\n <input\n type=\"text\"\n value={parameter.name}\n onChange={(event) => handleParameterChange(index, 'name', event.target.value)}\n placeholder={t('parameterNamePlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs text-gray-500 dark:text-gray-400\">{t('parameterTypeLabel')}</label>\n <select\n value={parameter.type}\n onChange={(event) => handleParameterChange(index, 'type', event.target.value)}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n >\n {PARAMETER_TYPES.map((parameterType) => (\n <option key={parameterType} value={parameterType}>{parameterType}</option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"mt-2\">\n <label className=\"mb-1 block text-xs text-gray-500 dark:text-gray-400\">{t('parameterDescriptionLabel')}</label>\n <input\n type=\"text\"\n value={parameter.description}\n onChange={(event) => handleParameterChange(index, 'description', event.target.value)}\n placeholder={t('parameterDescriptionPlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n <div className=\"mt-2\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={parameter.required}\n onChange={(event) => handleParameterChange(index, 'required', event.target.checked)}\n className=\"rounded border-gray-300 text-indigo-600 focus:ring-indigo-400 dark:border-gray-600\"\n />\n <span className=\"text-sm text-gray-700 dark:text-gray-300\">{t('parameterRequiredLabel')}</span>\n </label>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-lg bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600\"\n >\n {t('save')}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { TrashIcon } from '@heroicons/react/24/outline'\nimport type { VariableAssignerNodeConfig } from '../../contracts'\n\ntype Assignment = {\n target: string\n source: string\n}\n\ntype VariableAssignerNodeConfigFormProps = {\n config: VariableAssignerNodeConfig\n onSave: (config: VariableAssignerNodeConfig) => void\n onCancel: () => void\n}\n\nexport function VariableAssignerNodeConfigForm({ config, onSave, onCancel }: VariableAssignerNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.variableAssignerNodeConfig')\n const [assignments, setAssignments] = useState<Assignment[]>(\n config.assignments.map((assignment) => ({ ...assignment }))\n )\n\n const handleAddAssignment = () => {\n setAssignments([...assignments, { target: '', source: '' }])\n }\n\n const handleRemoveAssignment = (index: number) => {\n setAssignments(assignments.filter((_, assignmentIndex) => assignmentIndex !== index))\n }\n\n const handleAssignmentChange = (index: number, field: keyof Assignment, fieldValue: string) => {\n setAssignments(assignments.map((assignment, assignmentIndex) =>\n assignmentIndex === index ? { ...assignment, [field]: fieldValue } : assignment\n ))\n }\n\n const handleSave = () => {\n onSave({\n ...config,\n assignments: assignments.map((assignment) => ({\n target: assignment.target,\n source: assignment.source,\n })),\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <div className=\"mb-3 flex items-center justify-between\">\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('assignmentsLabel')}\n </label>\n <button\n type=\"button\"\n onClick={handleAddAssignment}\n className=\"text-sm text-indigo-600 hover:text-indigo-700 dark:text-indigo-400\"\n >\n {t('addAssignment')}\n </button>\n </div>\n\n <div className=\"space-y-3\">\n {assignments.map((assignment, index) => (\n <div key={index} className=\"flex items-start gap-2 rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800/50\">\n <div className=\"grid flex-1 grid-cols-2 gap-2\">\n <div>\n <label className=\"mb-1 block text-xs text-gray-500 dark:text-gray-400\">{t('targetLabel')}</label>\n <input\n type=\"text\"\n value={assignment.target}\n onChange={(event) => handleAssignmentChange(index, 'target', event.target.value)}\n placeholder={t('targetPlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-xs text-gray-500 dark:text-gray-400\">{t('sourceLabel')}</label>\n <input\n type=\"text\"\n value={assignment.source}\n onChange={(event) => handleAssignmentChange(index, 'source', event.target.value)}\n placeholder={t('sourcePlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveAssignment(index)}\n className=\"mt-5 text-sm text-red-500 hover:text-red-600\"\n aria-label={t('removeAssignment')}\n >\n <TrashIcon className=\"h-4 w-4\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-lg bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600\"\n >\n {t('save')}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { XMarkIcon } from '@heroicons/react/24/outline'\nimport { Button, Card, CardContent, FormInput, FormSelect, IconButton } from '@ui/index'\nimport type { VariableAggregatorNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype VariableAggregatorNodeConfigFormProps = {\n config: VariableAggregatorNodeConfig\n onSave: (config: VariableAggregatorNodeConfig) => void\n onCancel: () => void\n}\n\nconst AGGREGATION_MODES = ['array', 'object', 'concatenate'] as const\n\nexport function VariableAggregatorNodeConfigForm({ config, onSave, onCancel }: VariableAggregatorNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.variableAggregatorNodeConfig')\n const [inputVariables, setInputVariables] = useState<string[]>([...config.inputVariables])\n const [outputVariable, setOutputVariable] = useState(config.outputVariable)\n const [aggregationMode, setAggregationMode] = useState<VariableAggregatorNodeConfig['aggregationMode']>(config.aggregationMode)\n const [newVariable, setNewVariable] = useState('')\n\n const handleAddVariable = () => {\n const trimmed = newVariable.trim()\n if (trimmed && !inputVariables.includes(trimmed)) {\n setInputVariables([...inputVariables, trimmed])\n setNewVariable('')\n }\n }\n\n const handleRemoveVariable = (index: number) => {\n setInputVariables(inputVariables.filter((_, variableIndex) => variableIndex !== index))\n }\n\n const handleVariableChange = (index: number, value: string) => {\n setInputVariables(inputVariables.map((variable, variableIndex) => (variableIndex === index ? value : variable)))\n }\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n handleAddVariable()\n }\n }\n\n const handleSave = () => {\n onSave({ ...config, inputVariables, outputVariable, aggregationMode })\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <p className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">{t('inputVariablesLabel')}</p>\n <div className=\"flex gap-2\">\n <FormInput\n type=\"text\"\n value={newVariable}\n onValueChange={setNewVariable}\n onKeyDown={handleKeyDown}\n placeholder={t('variablePlaceholder')}\n className=\"flex-1\"\n />\n <Button\n type=\"button\"\n onClick={handleAddVariable}\n >\n {t('addInputVariable')}\n </Button>\n </div>\n <div className=\"mt-3 space-y-2\">\n {inputVariables.map((variable, index) => (\n <Card key={`${index}-${variable}`} className=\"border-purple-200/70 dark:border-purple-500/30\">\n <CardContent className=\"p-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex min-w-6 items-center justify-center rounded-full bg-purple-100 px-1.5 py-0.5 text-[10px] font-semibold text-purple-700 dark:bg-purple-500/20 dark:text-purple-300\">\n {index + 1}\n </span>\n <FormInput\n type=\"text\"\n value={variable}\n onValueChange={(value) => handleVariableChange(index, value)}\n placeholder={t('variablePlaceholder')}\n className=\"flex-1\"\n />\n <IconButton\n icon={<XMarkIcon className=\"h-3 w-3\" />}\n label={`Remove ${variable || index + 1}`}\n onClick={() => handleRemoveVariable(index)}\n size=\"sm\"\n color=\"ios-red\"\n />\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n\n <FormInput\n type=\"text\"\n label={t('outputVariableLabel')}\n value={outputVariable}\n onValueChange={setOutputVariable}\n placeholder={t('outputVariablePlaceholder')}\n />\n\n <FormSelect\n label={t('aggregationModeLabel')}\n value={aggregationMode}\n onValueChange={(value) => setAggregationMode(value as VariableAggregatorNodeConfig['aggregationMode'])}\n options={AGGREGATION_MODES.map((mode) => ({\n value: mode,\n label: t(`mode${mode.charAt(0).toUpperCase()}${mode.slice(1)}`),\n }))}\n />\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n saveDisabled={!outputVariable.trim() || inputVariables.length === 0 || inputVariables.some((variable) => !variable.trim())}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { FormInput, FormSelect } from '@ui/index'\nimport type { DocumentExtractorNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype DocumentExtractorNodeConfigFormProps = {\n config: DocumentExtractorNodeConfig\n onSave: (config: DocumentExtractorNodeConfig) => void\n onCancel: () => void\n}\n\nconst EXTRACTION_MODES = ['text', 'table', 'structured'] as const\n\nexport function DocumentExtractorNodeConfigForm({ config, onSave, onCancel }: DocumentExtractorNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.documentExtractorNodeConfig')\n const [extractionMode, setExtractionMode] = useState<DocumentExtractorNodeConfig['extractionMode']>(config.extractionMode)\n const [outputVariable, setOutputVariable] = useState(config.outputVariable)\n\n const handleSave = () => {\n onSave({ ...config, extractionMode, outputVariable })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormSelect\n label={t('extractionModeLabel')}\n value={extractionMode}\n onValueChange={(value) => setExtractionMode(value as DocumentExtractorNodeConfig['extractionMode'])}\n options={EXTRACTION_MODES.map((mode) => ({ value: mode, label: t(`extractionMode_${mode}`) }))}\n />\n\n <FormInput\n type=\"text\"\n label={t('outputVariableLabel')}\n value={outputVariable}\n onValueChange={setOutputVariable}\n placeholder={t('outputVariablePlaceholder')}\n />\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport type { ListOperatorNodeConfig } from '../../contracts'\n\ntype ListOperatorNodeConfigFormProps = {\n config: ListOperatorNodeConfig\n onSave: (config: ListOperatorNodeConfig) => void\n onCancel: () => void\n}\n\nconst OPERATION_OPTIONS = ['filter', 'map', 'sort', 'limit', 'deduplicate', 'flatten'] as const\nconst SORT_ORDER_OPTIONS = ['asc', 'desc'] as const\n\nexport function ListOperatorNodeConfigForm({ config, onSave, onCancel }: ListOperatorNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.listOperatorNodeConfig')\n const [operation, setOperation] = useState<ListOperatorNodeConfig['operation']>(config.operation)\n const [inputVariable, setInputVariable] = useState(config.inputVariable)\n const [outputVariable, setOutputVariable] = useState(config.outputVariable)\n const [condition, setCondition] = useState(config.condition ?? '')\n const [sortKey, setSortKey] = useState(config.sortKey ?? '')\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>(config.sortOrder ?? 'asc')\n const [limitCount, setLimitCount] = useState(config.limitCount ?? 10)\n\n const showConditionField = operation === 'filter' || operation === 'map'\n const showSortFields = operation === 'sort'\n const showLimitField = operation === 'limit'\n\n const handleSave = () => {\n const updatedConfig: ListOperatorNodeConfig = {\n ...config,\n operation,\n inputVariable,\n outputVariable,\n }\n\n if (showConditionField) {\n updatedConfig.condition = condition\n }\n if (showSortFields) {\n updatedConfig.sortKey = sortKey\n updatedConfig.sortOrder = sortOrder\n }\n if (showLimitField) {\n updatedConfig.limitCount = limitCount\n }\n\n onSave(updatedConfig)\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('operationLabel')}\n </label>\n <select\n value={operation}\n onChange={(event) => setOperation(event.target.value as ListOperatorNodeConfig['operation'])}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n >\n {OPERATION_OPTIONS.map((operationOption) => (\n <option key={operationOption} value={operationOption}>{t(`operation_${operationOption}`)}</option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('inputVariableLabel')}\n </label>\n <input\n type=\"text\"\n value={inputVariable}\n onChange={(event) => setInputVariable(event.target.value)}\n placeholder={t('inputVariablePlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('outputVariableLabel')}\n </label>\n <input\n type=\"text\"\n value={outputVariable}\n onChange={(event) => setOutputVariable(event.target.value)}\n placeholder={t('outputVariablePlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n\n {showConditionField && (\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('conditionLabel')}\n </label>\n <input\n type=\"text\"\n value={condition}\n onChange={(event) => setCondition(event.target.value)}\n placeholder={t('conditionPlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n )}\n\n {showSortFields && (\n <>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('sortKeyLabel')}\n </label>\n <input\n type=\"text\"\n value={sortKey}\n onChange={(event) => setSortKey(event.target.value)}\n placeholder={t('sortKeyPlaceholder')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('sortOrderLabel')}\n </label>\n <select\n value={sortOrder}\n onChange={(event) => setSortOrder(event.target.value as 'asc' | 'desc')}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n >\n {SORT_ORDER_OPTIONS.map((order) => (\n <option key={order} value={order}>{t(`sortOrder_${order}`)}</option>\n ))}\n </select>\n </div>\n </>\n )}\n\n {showLimitField && (\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('limitCountLabel')}\n </label>\n <input\n type=\"number\"\n value={limitCount}\n onChange={(event) => setLimitCount(Number(event.target.value))}\n min={1}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-lg bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 dark:bg-indigo-500 dark:hover:bg-indigo-600\"\n >\n {t('save')}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { FormInput } from '@ui/index'\nimport type { IterationStartNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\ntype IterationStartNodeConfigFormProps = {\n config: IterationStartNodeConfig\n onSave: (config: IterationStartNodeConfig) => void\n onCancel: () => void\n}\n\nexport function IterationStartNodeConfigForm({ config, onSave, onCancel }: IterationStartNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.iterationStartNodeConfig')\n const [iteratorVariable, setIteratorVariable] = useState(config.iteratorVariable)\n const [itemVariable, setItemVariable] = useState(config.itemVariable)\n const [indexVariable, setIndexVariable] = useState(config.indexVariable)\n\n const handleSave = () => {\n onSave({ ...config, iteratorVariable, itemVariable, indexVariable })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormInput\n type=\"text\"\n label={t('iteratorVariableLabel')}\n value={iteratorVariable}\n onValueChange={setIteratorVariable}\n placeholder={t('iteratorVariablePlaceholder')}\n />\n\n <FormInput\n type=\"text\"\n label={t('itemVariableLabel')}\n value={itemVariable}\n onValueChange={setItemVariable}\n placeholder={t('itemVariablePlaceholder')}\n />\n\n <FormInput\n type=\"text\"\n label={t('indexVariableLabel')}\n value={indexVariable}\n onValueChange={setIndexVariable}\n placeholder={t('indexVariablePlaceholder')}\n />\n\n <ConfigFormActions\n cancelLabel={t('cancel')}\n saveLabel={t('save')}\n onCancel={onCancel}\n onSave={handleSave}\n />\n </div>\n )\n}\n","import { useState, useMemo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { XMarkIcon, PlusIcon } from '@heroicons/react/24/outline'\nimport type { EntityNodeConfig } from '../../contracts'\nimport type { WorkflowEntityDefinition } from '../../types'\nimport { getEntityBadgeColor, getEntityGradient } from '../../constants/entity-colors'\n\ntype EntityNodeConfigFormProps = {\n config: EntityNodeConfig\n entities?: WorkflowEntityDefinition[]\n onSave: (config: EntityNodeConfig) => void\n onCancel: () => void\n}\n\nconst FIELD_TYPE_BADGE_COLORS: Record<string, string> = {\n string: 'bg-gray-100 text-gray-600 dark:bg-gray-500/20 dark:text-gray-300',\n number: 'bg-blue-100 text-blue-600 dark:bg-blue-500/20 dark:text-blue-300',\n boolean: 'bg-green-100 text-green-600 dark:bg-green-500/20 dark:text-green-300',\n date: 'bg-amber-100 text-amber-600 dark:bg-amber-500/20 dark:text-amber-300',\n object: 'bg-purple-100 text-purple-600 dark:bg-purple-500/20 dark:text-purple-300',\n array: 'bg-teal-100 text-teal-600 dark:bg-teal-500/20 dark:text-teal-300',\n}\n\nexport function EntityNodeConfigForm({ config, entities = [], onSave, onCancel }: EntityNodeConfigFormProps) {\n const t = useTranslations('agents.workflow.entityNodeConfig')\n const [selectedFields, setSelectedFields] = useState<string[]>([...config.selectedFields])\n const [outputVariable, setOutputVariable] = useState(config.outputVariable)\n const [limit, setLimit] = useState(config.limit)\n const [filterVariables, setFilterVariables] = useState<Record<string, string>>({ ...config.filterVariables })\n\n const entityDefinition = useMemo(\n () => entities.find((entity) => entity.id === config.entityMasterId),\n [entities, config.entityMasterId]\n )\n const availableFields = useMemo(() => entityDefinition?.fields ?? [], [entityDefinition])\n const allFieldNames = useMemo(() => availableFields.map((field) => field.name), [availableFields])\n\n const allSelected = selectedFields.length === allFieldNames.length\n const gradient = getEntityGradient(config.entityMasterId)\n const badgeColor = getEntityBadgeColor(config.entityMasterId)\n\n const handleToggleSelectAll = () => {\n if (allSelected) {\n setSelectedFields([])\n } else {\n setSelectedFields([...allFieldNames])\n }\n }\n\n const handleToggleField = (fieldName: string) => {\n setSelectedFields((previous) =>\n previous.includes(fieldName)\n ? previous.filter((name) => name !== fieldName)\n : [...previous, fieldName]\n )\n }\n\n const handleAddFilter = () => {\n setFilterVariables((previous) => ({ ...previous, '': '' }))\n }\n\n const handleUpdateFilterVariable = (oldKey: string, newKey: string) => {\n setFilterVariables((previous) => {\n const updated = { ...previous }\n const value = updated[oldKey] ?? ''\n delete updated[oldKey]\n updated[newKey] = value\n return updated\n })\n }\n\n const handleUpdateFilterField = (key: string, newValue: string) => {\n setFilterVariables((previous) => ({ ...previous, [key]: newValue }))\n }\n\n const handleRemoveFilter = (key: string) => {\n setFilterVariables((previous) => {\n const updated = { ...previous }\n delete updated[key]\n return updated\n })\n }\n\n const handleSave = () => {\n // Clean up empty filter entries\n const cleanedFilters: Record<string, string> = {}\n for (const [key, value] of Object.entries(filterVariables)) {\n if (key.trim() && value.trim()) {\n cleanedFilters[key.trim()] = value.trim()\n }\n }\n\n onSave({\n ...config,\n selectedFields,\n outputVariable: outputVariable.trim(),\n limit,\n filterVariables: cleanedFilters,\n })\n }\n\n const filterEntries = Object.entries(filterVariables)\n\n return (\n <div className=\"space-y-5\">\n {/* Entity type badge (read-only) */}\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('entityTypeLabel')}\n </label>\n <div className=\"flex items-center gap-2\">\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${gradient}`}>\n <span className=\"text-[10px] text-white font-bold\">\n {(entityDefinition?.label ?? config.entityMasterId ?? '?').charAt(0).toUpperCase()}\n </span>\n </div>\n <span className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${badgeColor}`}>\n {entityDefinition?.label ?? config.entityMasterId ?? t('entityTypeLabel')}\n </span>\n </div>\n {!entityDefinition && (\n <p className=\"mt-2 text-xs text-amber-600 dark:text-amber-400\">\n {t('entityNotConfigured')}\n </p>\n )}\n </div>\n\n {/* Output variable */}\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('outputVariableLabel')}\n </label>\n <p className=\"mb-2 text-xs text-gray-500 dark:text-gray-400\">{t('outputVariableHelp')}</p>\n <input\n type=\"text\"\n value={outputVariable}\n onChange={(event) => setOutputVariable(event.target.value)}\n placeholder={`${(entityDefinition?.label ?? 'entity').replace(/\\s+/g, '')}Data`}\n className=\"w-full rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n </div>\n\n {/* Record limit */}\n <div>\n <label className=\"mb-1 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('limitLabel')}\n </label>\n <p className=\"mb-2 text-xs text-gray-500 dark:text-gray-400\">{t('limitHelp')}</p>\n <input\n type=\"number\"\n value={limit}\n onChange={(event) => setLimit(Math.max(1, Number.parseInt(event.target.value, 10) || 1))}\n min={1}\n max={1000}\n className=\"w-32 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white\"\n />\n </div>\n\n {/* Fields section */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('fieldsLabel')}\n </label>\n <button\n type=\"button\"\n onClick={handleToggleSelectAll}\n className=\"text-xs font-medium text-indigo-600 hover:text-indigo-700 dark:text-indigo-400 dark:hover:text-indigo-300\"\n >\n {allSelected ? t('deselectAll') : t('selectAll')}\n </button>\n </div>\n\n {selectedFields.length === 0 && (\n <p className=\"mb-2 text-xs text-amber-600 dark:text-amber-400\">{t('noFieldsSelected')}</p>\n )}\n\n <div className=\"max-h-48 space-y-1 overflow-y-auto rounded-lg border border-gray-200 p-2 dark:border-gray-700\">\n {availableFields.length === 0 && (\n <p className=\"px-2 py-2 text-xs text-gray-500 dark:text-gray-400\">\n {t('noFieldsSelected')}\n </p>\n )}\n {availableFields.map((field) => {\n const isSelected = selectedFields.includes(field.name)\n const typeBadgeColor = FIELD_TYPE_BADGE_COLORS[field.type] ?? FIELD_TYPE_BADGE_COLORS.string\n\n return (\n <label\n key={field.name}\n className={`flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 transition-colors ${\n isSelected\n ? 'bg-indigo-50 dark:bg-indigo-500/10'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={() => handleToggleField(field.name)}\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500 dark:border-gray-600\"\n />\n <span className=\"flex-1 text-xs font-medium text-gray-900 dark:text-white\">\n {field.name}\n </span>\n <span className={`rounded-full px-1.5 py-0.5 text-[9px] font-medium ${typeBadgeColor}`}>\n {field.type}\n </span>\n </label>\n )\n })}\n </div>\n </div>\n\n {/* Filters section */}\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {t('filtersLabel')}\n </label>\n <button\n type=\"button\"\n onClick={handleAddFilter}\n className=\"flex items-center gap-1 text-xs font-medium text-indigo-600 hover:text-indigo-700 dark:text-indigo-400 dark:hover:text-indigo-300\"\n >\n <PlusIcon className=\"h-3 w-3\" />\n {t('addFilter')}\n </button>\n </div>\n <p className=\"mb-2 text-xs text-gray-500 dark:text-gray-400\">{t('filtersHelp')}</p>\n\n {filterEntries.length > 0 && (\n <div className=\"space-y-2\">\n {filterEntries.map(([variableName, fieldName], index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={variableName}\n onChange={(event) => handleUpdateFilterVariable(variableName, event.target.value)}\n placeholder={t('variableName')}\n className=\"flex-1 rounded-lg border border-gray-300 bg-white px-2 py-1.5 text-xs text-gray-900 placeholder-gray-400 outline-none focus:border-indigo-400 focus:ring-1 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:placeholder-gray-500\"\n />\n <span className=\"text-xs text-gray-400\">→</span>\n <select\n value={fieldName}\n onChange={(event) => handleUpdateFilterField(variableName, event.target.value)}\n className=\"flex-1 rounded-lg border border-gray-300 bg-white px-2 py-1.5 text-xs text-gray-900 outline-none focus:border-indigo-400 focus:ring-1 focus:ring-indigo-400/20 dark:border-gray-600 dark:bg-gray-800 dark:text-white\"\n >\n <option value=\"\">{t('fieldName')}</option>\n {availableFields.map((field) => (\n <option key={field.name} value={field.name}>\n {field.name}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n onClick={() => handleRemoveFilter(variableName)}\n className=\"rounded-md p-1 text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20\"\n >\n <XMarkIcon className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex justify-end gap-2 border-t border-gray-200 pt-4 dark:border-gray-700\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"rounded-lg border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800\"\n >\n {t('cancel')}\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={selectedFields.length === 0}\n className=\"rounded-lg bg-indigo-600 px-4 py-2 text-sm font-medium text-white hover:bg-indigo-700 disabled:cursor-not-allowed disabled:opacity-50 dark:bg-indigo-500 dark:hover:bg-indigo-600\"\n >\n {t('save')}\n </button>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { FormInput, FormTextarea } from '@ui/index'\nimport type { GroupNodeConfig } from '../../contracts'\nimport { ConfigFormActions } from './config-form-actions'\n\nconst GROUP_COLOR_OPTIONS: Array<{ value: GroupNodeConfig['color']; ring: string; fill: string }> = [\n { value: 'indigo', ring: 'ring-indigo-500', fill: 'bg-indigo-500' },\n { value: 'teal', ring: 'ring-teal-500', fill: 'bg-teal-500' },\n { value: 'amber', ring: 'ring-amber-500', fill: 'bg-amber-500' },\n { value: 'rose', ring: 'ring-rose-500', fill: 'bg-rose-500' },\n { value: 'slate', ring: 'ring-slate-500', fill: 'bg-slate-500' },\n]\n\ntype GroupNodeConfigFormProps = {\n config: GroupNodeConfig\n onSave: (config: GroupNodeConfig) => void\n onCancel: () => void\n}\n\nexport function GroupNodeConfigForm({ config, onSave, onCancel }: GroupNodeConfigFormProps) {\n const translations = useTranslations('agents.workflow.groupNodeConfig')\n const [formLabel, setFormLabel] = useState(config.label)\n const [description, setDescription] = useState(config.description ?? '')\n const [color, setColor] = useState<GroupNodeConfig['color']>(config.color)\n\n const handleSave = () => {\n const trimmedLabel = formLabel.trim()\n if (!trimmedLabel) return\n onSave({\n ...config,\n label: trimmedLabel,\n description: description.trim() || undefined,\n color,\n })\n }\n\n return (\n <div className=\"space-y-4\">\n <FormInput\n type=\"text\"\n label={translations('labelField')}\n value={formLabel}\n onValueChange={setFormLabel}\n placeholder={translations('labelPlaceholder')}\n />\n\n <FormTextarea\n label={translations('descriptionField')}\n value={description}\n onValueChange={setDescription}\n placeholder={translations('descriptionPlaceholder')}\n rows={3}\n />\n\n <div>\n <label className=\"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {translations('colorField')}\n </label>\n <div className=\"flex items-center gap-3\">\n {GROUP_COLOR_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => setColor(option.value)}\n className={`h-8 w-8 rounded-full ${option.fill} transition-all ${\n color === option.value\n ? `ring-2 ${option.ring} ring-offset-2 dark:ring-offset-gray-900`\n : 'opacity-60 hover:opacity-100'\n }`}\n aria-label={option.value}\n />\n ))}\n </div>\n </div>\n\n <ConfigFormActions\n cancelLabel={translations('cancel')}\n saveLabel={translations('save')}\n onCancel={onCancel}\n onSave={handleSave}\n saveDisabled={!formLabel.trim()}\n />\n </div>\n )\n}\n","import { useTranslations } from 'next-intl'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport { getEntityGradient, getEntityIcon } from '../../constants/entity-colors'\nimport { WorkspaceDrawer } from './workspace-drawer'\nimport { useDrawerStore } from '../../store/drawer-store'\nimport { StartNodeConfigForm } from '../config-forms/start-node-config-form'\nimport { EndNodeConfigForm } from '../config-forms/end-node-config-form'\nimport { IfElseNodeConfigForm } from '../config-forms/if-else-node-config-form'\nimport { CodeNodeConfigForm } from '../config-forms/code-node-config-form'\nimport { HttpRequestNodeConfigForm } from '../config-forms/http-request-node-config-form'\nimport { TemplateTransformNodeConfigForm } from '../config-forms/template-transform-node-config-form'\nimport { IterationNodeConfigForm } from '../config-forms/iteration-node-config-form'\nimport { KnowledgeBaseNodeConfigForm } from '../config-forms/knowledge-base-node-config-form'\nimport { AnswerNodeConfigForm } from '../config-forms/answer-node-config-form'\nimport { QuestionClassifierNodeConfigForm } from '../config-forms/question-classifier-node-config-form'\nimport { ParameterExtractorNodeConfigForm } from '../config-forms/parameter-extractor-node-config-form'\nimport { VariableAssignerNodeConfigForm } from '../config-forms/variable-assigner-node-config-form'\nimport { VariableAggregatorNodeConfigForm } from '../config-forms/variable-aggregator-node-config-form'\nimport { DocumentExtractorNodeConfigForm } from '../config-forms/document-extractor-node-config-form'\nimport { ListOperatorNodeConfigForm } from '../config-forms/list-operator-node-config-form'\nimport { IterationStartNodeConfigForm } from '../config-forms/iteration-start-node-config-form'\nimport { EntityNodeConfigForm } from '../config-forms/entity-node-config-form'\nimport { GroupNodeConfigForm } from '../config-forms/group-node-config-form'\nimport type {\n LogicNodeConfig,\n StartNodeConfig,\n EndNodeConfig,\n IfElseNodeConfig,\n CodeNodeConfig,\n HttpRequestNodeConfig,\n TemplateTransformNodeConfig,\n IterationNodeConfig,\n KnowledgeBaseNodeConfig,\n AnswerNodeConfig,\n QuestionClassifierNodeConfig,\n ParameterExtractorNodeConfig,\n VariableAssignerNodeConfig,\n VariableAggregatorNodeConfig,\n DocumentExtractorNodeConfig,\n ListOperatorNodeConfig,\n IterationStartNodeConfig,\n EntityNodeConfig,\n GroupNodeConfig,\n} from '../../contracts'\nimport type { WorkflowEntityDefinition } from '../../types'\n\nconst NODE_TITLE_KEYS: Record<string, string> = {\n start: 'startNodeConfig',\n end: 'endNodeConfig',\n if_else: 'ifElseNodeConfig',\n code: 'codeNodeConfig',\n http_request: 'httpRequestNodeConfig',\n template_transform: 'templateTransformNodeConfig',\n iteration: 'iterationNodeConfig',\n knowledge_base: 'knowledgeBaseNodeConfig',\n answer: 'answerNodeConfig',\n question_classifier: 'questionClassifierNodeConfig',\n parameter_extractor: 'parameterExtractorNodeConfig',\n variable_assigner: 'variableAssignerNodeConfig',\n variable_aggregator: 'variableAggregatorNodeConfig',\n document_extractor: 'documentExtractorNodeConfig',\n list_operator: 'listOperatorNodeConfig',\n iteration_start: 'iterationStartNodeConfig',\n entity: 'entityNodeConfig',\n group: 'groupNodeConfig',\n}\n\ntype LogicNodeDrawerProps = {\n onSave: (nodeId: string, updatedConfig: LogicNodeConfig) => void\n entities?: WorkflowEntityDefinition[]\n}\n\nexport function LogicNodeDrawer({ onSave, entities = [] }: LogicNodeDrawerProps) {\n const t = useTranslations('agents.workflow')\n\n const activeDrawer = useDrawerStore((s) => s.activeDrawer)\n const logicNodeData = useDrawerStore((s) => s.logicNodeData)\n const closeDrawer = useDrawerStore((s) => s.closeDrawer)\n\n const open = activeDrawer === 'logic-node'\n const nodeId = logicNodeData?.nodeId ?? null\n const nodeLabel = logicNodeData?.nodeLabel ?? ''\n const config = logicNodeData?.config ?? null\n\n if (!config || !nodeId) return null\n\n const entityMasterId = config.type === 'entity' ? (config as EntityNodeConfig).entityMasterId : undefined\n const IconComponent = entityMasterId ? getEntityIcon(entityMasterId) : LOGIC_ICON_MAP[config.type]\n const gradient = entityMasterId ? getEntityGradient(entityMasterId) : (LOGIC_NODE_GRADIENTS[config.type] ?? 'from-gray-400 to-gray-500')\n const titleKey = NODE_TITLE_KEYS[config.type]\n const title = titleKey ? t(`${titleKey}.title`) : nodeLabel\n\n const handleSave = (updatedConfig: LogicNodeConfig) => {\n onSave(nodeId, updatedConfig)\n }\n\n const renderForm = () => {\n switch (config.type) {\n case 'start':\n return <StartNodeConfigForm config={config as StartNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'end':\n return <EndNodeConfigForm config={config as EndNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'if_else':\n return <IfElseNodeConfigForm config={config as IfElseNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'code':\n return <CodeNodeConfigForm config={config as CodeNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'http_request':\n return <HttpRequestNodeConfigForm config={config as HttpRequestNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'template_transform':\n return <TemplateTransformNodeConfigForm config={config as TemplateTransformNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'iteration':\n return <IterationNodeConfigForm config={config as IterationNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'knowledge_base':\n return <KnowledgeBaseNodeConfigForm config={config as KnowledgeBaseNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'answer':\n return <AnswerNodeConfigForm config={config as AnswerNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'question_classifier':\n return <QuestionClassifierNodeConfigForm config={config as QuestionClassifierNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'parameter_extractor':\n return <ParameterExtractorNodeConfigForm config={config as ParameterExtractorNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'variable_assigner':\n return <VariableAssignerNodeConfigForm config={config as VariableAssignerNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'variable_aggregator':\n return <VariableAggregatorNodeConfigForm config={config as VariableAggregatorNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'document_extractor':\n return <DocumentExtractorNodeConfigForm config={config as DocumentExtractorNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'list_operator':\n return <ListOperatorNodeConfigForm config={config as ListOperatorNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'iteration_start':\n return <IterationStartNodeConfigForm config={config as IterationStartNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n case 'entity':\n return <EntityNodeConfigForm config={config as EntityNodeConfig} entities={entities} onSave={handleSave} onCancel={closeDrawer} />\n case 'group':\n return <GroupNodeConfigForm config={config as GroupNodeConfig} onSave={handleSave} onCancel={closeDrawer} />\n default:\n return null\n }\n }\n\n return (\n <WorkspaceDrawer\n open={open}\n onClose={closeDrawer}\n title={title}\n subtitle={nodeLabel}\n icon={IconComponent ? <IconComponent className=\"h-5 w-5 text-white\" /> : undefined}\n gradient={gradient}\n >\n {renderForm()}\n </WorkspaceDrawer>\n )\n}\n","/**\n * Node Context Menu\n * =================\n * Floating right-click menu for a single workflow node.\n * Provides edit, duplicate, copy, and delete actions.\n * Positioned absolutely at mouse coordinates and closes\n * on outside click or Escape key.\n *\n * All state-modifying actions are provided by the canvas via callbacks\n * to ensure React Flow state (useNodesState) stays in sync.\n */\n\nimport { useTranslations } from 'next-intl'\nimport { ContextMenu, type ContextMenuEntry } from '@ui/index'\nimport {\n PencilIcon,\n DocumentDuplicateIcon,\n ClipboardDocumentIcon,\n TrashIcon,\n} from '@heroicons/react/24/outline'\n\ntype NodeContextMenuProps = {\n position: { x: number; y: number }\n targetId: string\n onClose: () => void\n onEdit: (nodeId: string) => void\n onDuplicate: (nodeId: string) => void\n onCopy: (nodeId: string) => void\n onDelete: (nodeId: string) => void\n}\n\nexport function NodeContextMenu({ position, targetId, onClose, onEdit, onDuplicate, onCopy, onDelete }: NodeContextMenuProps) {\n const translations = useTranslations('agents.workflow.contextMenu')\n\n const entries: ContextMenuEntry[] = [\n {\n key: 'edit',\n label: translations('edit'),\n icon: PencilIcon,\n onClick: () => { onEdit(targetId); onClose() },\n testId: 'context-menu-edit',\n },\n {\n key: 'duplicate',\n label: translations('duplicate'),\n icon: DocumentDuplicateIcon,\n onClick: () => { onDuplicate(targetId); onClose() },\n testId: 'context-menu-duplicate',\n },\n {\n key: 'copy',\n label: translations('copy'),\n icon: ClipboardDocumentIcon,\n onClick: () => { onCopy(targetId); onClose() },\n testId: 'context-menu-copy',\n },\n {\n key: 'delete',\n label: translations('delete'),\n icon: TrashIcon,\n onClick: () => { onDelete(targetId); onClose() },\n danger: true,\n testId: 'context-menu-delete',\n },\n ]\n\n return (\n <ContextMenu\n position={position}\n onClose={onClose}\n entries={entries}\n minWidthClass=\"min-w-[180px]\"\n testId=\"node-context-menu\"\n />\n )\n}\n","/**\n * Panel Context Menu\n * ==================\n * Floating right-click menu for the empty canvas area.\n * Provides paste, select all, fit view, and add note actions.\n * Positioned at mouse coordinates, uses flow-space position\n * for placing new nodes.\n *\n * All state-modifying actions are provided by the canvas via callbacks\n * to ensure React Flow state (useNodesState) stays in sync.\n */\n\nimport { useTranslations } from 'next-intl'\nimport { ContextMenu, type ContextMenuEntry } from '@ui/index'\nimport {\n ClipboardIcon,\n CursorArrowRaysIcon,\n ArrowsPointingOutIcon,\n PencilSquareIcon,\n} from '@heroicons/react/24/outline'\n\ntype PanelContextMenuProps = {\n position: { x: number; y: number }\n onClose: () => void\n onPaste: () => void\n onSelectAll: () => void\n onFitView: () => void\n onAddNote: (flowPosition: { x: number; y: number }) => void\n flowPosition: { x: number; y: number }\n hasClipboardContent: boolean\n}\n\nexport function PanelContextMenu({ position, onClose, onPaste, onSelectAll, onFitView, onAddNote, flowPosition, hasClipboardContent }: PanelContextMenuProps) {\n const translations = useTranslations('agents.workflow.contextMenu')\n\n const entries: ContextMenuEntry[] = [\n {\n key: 'paste',\n label: translations('paste'),\n icon: ClipboardIcon,\n onClick: () => { onPaste(); onClose() },\n disabled: !hasClipboardContent,\n testId: 'context-menu-paste',\n },\n {\n key: 'select-all',\n label: translations('selectAll'),\n icon: CursorArrowRaysIcon,\n onClick: () => { onSelectAll(); onClose() },\n testId: 'context-menu-select-all',\n },\n {\n key: 'fit-view',\n label: translations('fitView'),\n icon: ArrowsPointingOutIcon,\n onClick: () => { onFitView(); onClose() },\n testId: 'context-menu-fit-view',\n },\n { type: 'divider', key: 'divider-main' },\n {\n key: 'add-note',\n label: translations('addNote'),\n icon: PencilSquareIcon,\n onClick: () => { onAddNote(flowPosition); onClose() },\n testId: 'context-menu-add-note',\n },\n ]\n\n return (\n <ContextMenu\n position={position}\n onClose={onClose}\n entries={entries}\n minWidthClass=\"min-w-[180px]\"\n testId=\"panel-context-menu\"\n />\n )\n}\n","/**\n * Selection Context Menu\n * ======================\n * Floating right-click menu for multiple selected nodes.\n * Provides copy, duplicate, delete, alignment, and distribution actions.\n *\n * All state-modifying actions are provided by the canvas via callbacks\n * to ensure React Flow state (useNodesState) stays in sync.\n */\n\nimport { useTranslations } from 'next-intl'\nimport { ContextMenu, type ContextMenuEntry } from '@ui/index'\nimport {\n ClipboardDocumentIcon,\n DocumentDuplicateIcon,\n TrashIcon,\n RectangleGroupIcon,\n} from '@heroicons/react/24/outline'\nimport type { Node } from '@xyflow/react'\n\ntype AlignDirection = 'left' | 'right' | 'top' | 'bottom' | 'centerHorizontal' | 'centerVertical'\ntype DistributeDirection = 'horizontal' | 'vertical'\n\ntype SelectionContextMenuProps = {\n position: { x: number; y: number }\n onClose: () => void\n onCopy: () => void\n onDuplicate: () => void\n onDelete: () => void\n onGroupSelected: () => void\n onAlign: (direction: AlignDirection) => void\n onDistribute: (direction: DistributeDirection) => void\n}\n\nexport type { AlignDirection, DistributeDirection }\n\nexport function SelectionContextMenu({\n position,\n onClose,\n onCopy,\n onDuplicate,\n onDelete,\n onGroupSelected,\n onAlign,\n onDistribute,\n}: SelectionContextMenuProps) {\n const translations = useTranslations('agents.workflow.contextMenu')\n const entries: ContextMenuEntry[] = [\n {\n key: 'copy',\n label: translations('copy'),\n icon: ClipboardDocumentIcon,\n onClick: () => { onCopy(); onClose() },\n testId: 'context-menu-copy',\n },\n {\n key: 'duplicate',\n label: translations('duplicate'),\n icon: DocumentDuplicateIcon,\n onClick: () => { onDuplicate(); onClose() },\n testId: 'context-menu-duplicate',\n },\n {\n key: 'group-selected',\n label: translations('groupSelected'),\n icon: RectangleGroupIcon,\n onClick: () => { onGroupSelected(); onClose() },\n testId: 'context-menu-group-selected',\n },\n {\n key: 'delete',\n label: translations('delete'),\n icon: TrashIcon,\n onClick: () => { onDelete(); onClose() },\n danger: true,\n testId: 'context-menu-delete',\n },\n { type: 'divider', key: 'divider-main' },\n {\n key: 'align-left',\n label: translations('alignLeft'),\n icon: AlignLeftIcon,\n onClick: () => { onAlign('left'); onClose() },\n testId: 'context-menu-align-left',\n },\n {\n key: 'align-right',\n label: translations('alignRight'),\n icon: AlignRightIcon,\n onClick: () => { onAlign('right'); onClose() },\n testId: 'context-menu-align-right',\n },\n {\n key: 'align-top',\n label: translations('alignTop'),\n icon: AlignTopIcon,\n onClick: () => { onAlign('top'); onClose() },\n testId: 'context-menu-align-top',\n },\n {\n key: 'align-bottom',\n label: translations('alignBottom'),\n icon: AlignBottomIcon,\n onClick: () => { onAlign('bottom'); onClose() },\n testId: 'context-menu-align-bottom',\n },\n {\n key: 'center-horizontally',\n label: translations('centerHorizontally'),\n icon: CenterHorizontalIcon,\n onClick: () => { onAlign('centerHorizontal'); onClose() },\n testId: 'context-menu-center-horizontally',\n },\n {\n key: 'center-vertically',\n label: translations('centerVertically'),\n icon: CenterVerticalIcon,\n onClick: () => { onAlign('centerVertical'); onClose() },\n testId: 'context-menu-center-vertically',\n },\n { type: 'divider', key: 'divider-distribute' },\n {\n key: 'distribute-horizontally',\n label: translations('distributeHorizontally'),\n icon: DistributeHorizontalIcon,\n onClick: () => { onDistribute('horizontal'); onClose() },\n testId: 'context-menu-distribute-horizontally',\n },\n {\n key: 'distribute-vertically',\n label: translations('distributeVertically'),\n icon: DistributeVerticalIcon,\n onClick: () => { onDistribute('vertical'); onClose() },\n testId: 'context-menu-distribute-vertically',\n },\n ]\n\n return (\n <ContextMenu\n position={position}\n onClose={onClose}\n entries={entries}\n minWidthClass=\"min-w-[220px]\"\n testId=\"selection-context-menu\"\n />\n )\n}\n\n// ============================================================================\n// Helper: get node dimensions\n// ============================================================================\n\nconst DEFAULT_NODE_WIDTH = 200\nconst DEFAULT_NODE_HEIGHT = 60\n\nexport function getNodeDimensions(node: Node): { width: number; height: number } {\n return {\n width: (node.measured?.width ?? node.width ?? DEFAULT_NODE_WIDTH) as number,\n height: (node.measured?.height ?? node.height ?? DEFAULT_NODE_HEIGHT) as number,\n }\n}\n\n// ============================================================================\n// Lightweight SVG alignment icons (no external dependency needed)\n// ============================================================================\n\nfunction AlignLeftIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <line x1=\"4\" y1=\"4\" x2=\"4\" y2=\"20\" />\n <rect x=\"7\" y=\"6\" width=\"10\" height=\"4\" rx=\"1\" />\n <rect x=\"7\" y=\"14\" width=\"6\" height=\"4\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction AlignRightIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <line x1=\"20\" y1=\"4\" x2=\"20\" y2=\"20\" />\n <rect x=\"7\" y=\"6\" width=\"10\" height=\"4\" rx=\"1\" />\n <rect x=\"11\" y=\"14\" width=\"6\" height=\"4\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction AlignTopIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <line x1=\"4\" y1=\"4\" x2=\"20\" y2=\"4\" />\n <rect x=\"6\" y=\"7\" width=\"4\" height=\"10\" rx=\"1\" />\n <rect x=\"14\" y=\"7\" width=\"4\" height=\"6\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction AlignBottomIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <rect x=\"6\" y=\"7\" width=\"4\" height=\"10\" rx=\"1\" />\n <rect x=\"14\" y=\"11\" width=\"4\" height=\"6\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction CenterHorizontalIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" strokeDasharray=\"2 2\" />\n <rect x=\"5\" y=\"6\" width=\"14\" height=\"4\" rx=\"1\" />\n <rect x=\"7\" y=\"14\" width=\"10\" height=\"4\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction CenterVerticalIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" strokeDasharray=\"2 2\" />\n <rect x=\"6\" y=\"5\" width=\"4\" height=\"14\" rx=\"1\" />\n <rect x=\"14\" y=\"7\" width=\"4\" height=\"10\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction DistributeHorizontalIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <rect x=\"3\" y=\"8\" width=\"4\" height=\"8\" rx=\"1\" />\n <rect x=\"10\" y=\"8\" width=\"4\" height=\"8\" rx=\"1\" />\n <rect x=\"17\" y=\"8\" width=\"4\" height=\"8\" rx=\"1\" />\n </svg>\n )\n}\n\nfunction DistributeVerticalIcon({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <rect x=\"8\" y=\"3\" width=\"8\" height=\"4\" rx=\"1\" />\n <rect x=\"8\" y=\"10\" width=\"8\" height=\"4\" rx=\"1\" />\n <rect x=\"8\" y=\"17\" width=\"8\" height=\"4\" rx=\"1\" />\n </svg>\n )\n}\n","/**\n * WorkflowCanvas (Main Interactive Canvas)\n * =========================================\n * Dify-inspired drawable workflow canvas.\n * Users drop nodes from the sidebar palette, connect them with edges,\n * and the graph is saved as JSON (WorkflowGraph) to PostgreSQL.\n *\n * Key features:\n * - Drag & drop from NodePalette sidebar\n * - Draw edges between nodes with connection validation\n * - Auto-save draft (debounced 2s)\n * - Load/restore from saved WorkflowGraph\n * - MiniMap with node type coloring\n * - Snap to grid (20px)\n * - Conditional edge labels (True/False for If/Else branches)\n * - Undo/Redo via Zustand store\n * - Copy/Paste nodes via Zustand store\n * - Custom animated connection line while dragging\n * - Render props for external drawers (AgentDrawer, LogicNodeDrawer)\n */\n\nimport { useState, useCallback, useEffect, useRef, useMemo } from 'react'\nimport dynamic from 'next/dynamic.js'\nimport {\n useNodesState,\n useEdgesState,\n useReactFlow,\n ReactFlowProvider,\n addEdge,\n BackgroundVariant,\n MarkerType,\n Position,\n type Node,\n type Edge,\n type Connection,\n type NodeTypes,\n} from '@xyflow/react'\nimport '@xyflow/react/dist/style.css'\nimport { useTranslations } from 'next-intl'\n\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { useDrawerStore } from '../../store/drawer-store'\nimport { ConditionalEdge } from './conditional-edge'\nimport { CustomConnectionLine } from './custom-connection-line'\nimport { DraggableCommandBar } from './draggable-command-bar'\nimport { GRAPH_ACTIVE_EDGE_COLOR, GRAPH_TRUE_EDGE_COLOR, GRAPH_FALSE_EDGE_COLOR, MINIMAP_NODE_COLORS } from '../../constants/workflow-constants'\nimport { getEntityMinimapColor } from '../../constants/entity-colors'\nimport { createDefaultLogicNodeConfig } from '../../utils/logic-node-defaults'\nimport { applyDagreLayout, type LayoutDirection } from '../../utils/layout-engine'\nimport type {\n AgentWithPrompts,\n WorkflowCardDisplayMode,\n AgentNodeData,\n ToolNodeData,\n RuleNodeData,\n EntityNodeData,\n GroupNodeData,\n WorkflowEntityDefinition,\n} from '../../types'\nimport type {\n AgentModel,\n Subworkflow,\n AgentRule,\n WorkflowGraph,\n WorkflowNodeType,\n LogicNodeConfig,\n EntityNodeConfig,\n RuleNodeConfig,\n GroupNodeConfig,\n} from '../../contracts'\n\n// Node components\nimport { AgentFlowNode } from '../nodes/agent-flow-node'\nimport { ToolFlowNode } from '../nodes/tool-flow-node'\nimport { RuleFlowNode } from '../nodes/rule-flow-node'\nimport { EntityFlowNode } from '../nodes/entity-flow-node'\nimport { StartFlowNode } from '../nodes/start-flow-node'\nimport { EndFlowNode } from '../nodes/end-flow-node'\nimport { IfElseFlowNode } from '../nodes/if-else-flow-node'\nimport { CodeFlowNode } from '../nodes/code-flow-node'\nimport { HttpRequestFlowNode } from '../nodes/http-request-flow-node'\nimport { TemplateTransformFlowNode } from '../nodes/template-transform-flow-node'\nimport { IterationFlowNode } from '../nodes/iteration-flow-node'\nimport { KnowledgeBaseFlowNode } from '../nodes/knowledge-base-flow-node'\nimport { AnswerFlowNode } from '../nodes/answer-flow-node'\nimport { QuestionClassifierFlowNode } from '../nodes/question-classifier-flow-node'\nimport { ParameterExtractorFlowNode } from '../nodes/parameter-extractor-flow-node'\nimport { VariableAssignerFlowNode } from '../nodes/variable-assigner-flow-node'\nimport { VariableAggregatorFlowNode } from '../nodes/variable-aggregator-flow-node'\nimport { DocumentExtractorFlowNode } from '../nodes/document-extractor-flow-node'\nimport { ListOperatorFlowNode } from '../nodes/list-operator-flow-node'\nimport { IterationStartFlowNode } from '../nodes/iteration-start-flow-node'\nimport { NoteFlowNode } from '../nodes/note-flow-node'\nimport { GroupFlowNode } from '../nodes/group-flow-node'\nimport { LogicNodeDrawer } from '../drawers/logic-node-drawer'\nimport { NodeContextMenu } from '../context-menus/node-context-menu'\nimport { PanelContextMenu } from '../context-menus/panel-context-menu'\nimport { SelectionContextMenu, getNodeDimensions } from '../context-menus/selection-context-menu'\nimport type { AlignDirection, DistributeDirection } from '../context-menus/selection-context-menu'\n\n// ============================================================================\n// Dynamic imports for React Flow sub-components (SSR safety)\n// ============================================================================\n\nconst ReactFlow = dynamic(\n () => import('@xyflow/react').then((module) => module.ReactFlow),\n { ssr: false }\n)\nconst Background = dynamic(\n () => import('@xyflow/react').then((module) => module.Background),\n { ssr: false }\n)\nconst MiniMap = dynamic(\n () => import('@xyflow/react').then((module) => module.MiniMap),\n { ssr: false }\n)\n\n// ============================================================================\n// Built-in node type registry (all 20 node types)\n// ============================================================================\n\nconst BUILT_IN_NODE_TYPES: NodeTypes = {\n agent: AgentFlowNode,\n tool: ToolFlowNode,\n rule: RuleFlowNode,\n entity: EntityFlowNode,\n start: StartFlowNode,\n end: EndFlowNode,\n if_else: IfElseFlowNode,\n code: CodeFlowNode,\n http_request: HttpRequestFlowNode,\n template_transform: TemplateTransformFlowNode,\n iteration: IterationFlowNode,\n knowledge_base: KnowledgeBaseFlowNode,\n answer: AnswerFlowNode,\n question_classifier: QuestionClassifierFlowNode,\n parameter_extractor: ParameterExtractorFlowNode,\n variable_assigner: VariableAssignerFlowNode,\n variable_aggregator: VariableAggregatorFlowNode,\n document_extractor: DocumentExtractorFlowNode,\n list_operator: ListOperatorFlowNode,\n iteration_start: IterationStartFlowNode,\n note: NoteFlowNode,\n group: GroupFlowNode,\n}\n\n// ============================================================================\n// All 20 node types recognized by the canvas\n// ============================================================================\n\nconst ALL_LOGIC_NODE_TYPES: WorkflowNodeType[] = [\n 'start', 'end', 'if_else', 'code', 'http_request',\n 'template_transform', 'iteration', 'knowledge_base',\n 'answer', 'question_classifier', 'parameter_extractor',\n 'variable_assigner', 'variable_aggregator',\n 'document_extractor', 'list_operator',\n 'iteration_start', 'note',\n 'agent', 'tool', 'rule', 'entity', 'group',\n]\n\nfunction isLogicNodeType(nodeType: string): nodeType is WorkflowNodeType {\n return ALL_LOGIC_NODE_TYPES.includes(nodeType as WorkflowNodeType)\n}\n\n// ============================================================================\n// Edge config constants\n// ============================================================================\n\nconst DEFAULT_EDGE_OPTIONS = {\n type: 'smoothstep' as const,\n animated: true,\n style: { stroke: GRAPH_ACTIVE_EDGE_COLOR, strokeWidth: 2 },\n markerEnd: { type: MarkerType.ArrowClosed, color: GRAPH_ACTIVE_EDGE_COLOR },\n}\n\nconst SNAP_GRID: [number, number] = [20, 20]\n\nconst MINIMAP_DEFAULT_COLOR = '#94a3b8'\n\nfunction getMinimapNodeColor(node: Node): string {\n if (node.type === 'entity') {\n const entityMasterId = (node.data as EntityNodeData | undefined)?.config?.entityMasterId\n return getEntityMinimapColor(entityMasterId)\n }\n return MINIMAP_NODE_COLORS[node.type ?? 'agent'] ?? MINIMAP_DEFAULT_COLOR\n}\n\nconst AUTO_SAVE_DEBOUNCE_MS = 2000\n\n// ============================================================================\n// Render-prop types for external drawers\n// ============================================================================\n\ntype AgentDrawerRenderProps = {\n agent: AgentWithPrompts | null\n models: AgentModel[]\n open: boolean\n isCreateMode: boolean\n onClose: () => void\n onSaved: () => void\n}\n\ntype LogicNodeDrawerRenderProps = {\n nodeId: string | null\n nodeLabel: string\n config: LogicNodeConfig | null\n open: boolean\n onClose: () => void\n onSave: (nodeId: string, updatedConfig: LogicNodeConfig) => void\n entities: WorkflowEntityDefinition[]\n}\n\n// ============================================================================\n// Props\n// ============================================================================\n\ntype WorkflowCanvasProps = {\n agents: AgentWithPrompts[]\n models: AgentModel[]\n tools?: Subworkflow[]\n rules?: AgentRule[]\n entities?: WorkflowEntityDefinition[]\n initialGraph?: WorkflowGraph | null\n onGraphChange?: (graph: WorkflowGraph) => void\n onEditTool?: (tool: Subworkflow) => void\n onToggleTool?: (tool: Subworkflow) => void\n onEditRule?: (rule: AgentRule) => void\n onToggleRule?: (rule: AgentRule) => void\n onCancelCreateAgent?: () => void\n onAgentSaved?: () => void\n isCreatingAgent?: boolean\n /** Custom node type components — merged with built-in edge types */\n nodeTypes?: NodeTypes\n /** Optional: render the AgentDrawer externally (frontend provides the component) */\n renderAgentDrawer?: (props: AgentDrawerRenderProps) => React.ReactNode\n /** Optional: render a custom LogicNodeDrawer; defaults to internal drawer */\n renderLogicNodeDrawer?: (props: LogicNodeDrawerRenderProps) => React.ReactNode\n}\n\n// ============================================================================\n// Inner component (requires ReactFlowProvider ancestor)\n// ============================================================================\n\nfunction WorkflowCanvasInner({\n agents,\n models,\n tools,\n rules,\n entities = [],\n initialGraph,\n onGraphChange,\n onEditTool,\n onToggleTool,\n onEditRule,\n onToggleRule,\n onCancelCreateAgent,\n onAgentSaved,\n isCreatingAgent = false,\n nodeTypes: externalNodeTypes,\n renderAgentDrawer,\n renderLogicNodeDrawer: _renderLogicNodeDrawer,\n}: WorkflowCanvasProps) {\n const { screenToFlowPosition, getNode, toObject, fitView, zoomIn, zoomOut, zoomTo } = useReactFlow()\n const tWorkflow = useTranslations('agents.workflow')\n const sortedAgents = useMemo(() => [...agents].sort((agentA, agentB) => (agentA.order ?? 0) - (agentB.order ?? 0)), [agents])\n const [selectedAgentId, setSelectedAgentId] = useState<string | null>(null)\n const openAgentDrawerAction = useDrawerStore((s) => s.openAgentDrawer)\n const openLogicNodeDrawerAction = useDrawerStore((s) => s.openLogicNodeDrawer)\n const closeDrawerAction = useDrawerStore((s) => s.closeDrawer)\n const activeDrawer = useDrawerStore((s) => s.activeDrawer)\n const drawerOpen = activeDrawer === 'agent'\n\n // Open agent drawer when parent sets isCreatingAgent\n useEffect(() => {\n if (isCreatingAgent) {\n openAgentDrawerAction(\n { agentId: '', name: '', order: 0, enabled: true, temperature: 0.7, maxTokens: 4096 } as AgentWithPrompts,\n models,\n true,\n )\n }\n }, [isCreatingAgent])\n const graphChangeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Ref-based edge insert handler (avoids circular deps with useCallback)\n const insertNodeOnEdgeRef = useRef<(edgeId: string, nodeType: WorkflowNodeType, position: { x: number; y: number }) => void>(() => {})\n\n // Ref-based group expand toggle (avoids circular deps — handler needs setNodes/setEdges which are declared later)\n const toggleGroupExpandRef = useRef<(nodeId: string) => void>(() => {})\n\n const handleToggleGroupExpand = useCallback(\n (nodeId: string) => { toggleGroupExpandRef.current(nodeId) },\n []\n )\n\n // Stable callback that reads from the ref — safe to pass into edge data\n const insertNodeOnEdge = useCallback(\n (edgeId: string, nodeType: WorkflowNodeType, position: { x: number; y: number }) => {\n insertNodeOnEdgeRef.current(edgeId, nodeType, position)\n },\n []\n )\n\n const allTools = tools ?? []\n const allRules = rules ?? []\n const allEntities = entities\n\n // Zustand store actions (raw)\n const storeUndoRaw = useWorkflowStore((state) => state.undo)\n const storeRedoRaw = useWorkflowStore((state) => state.redo)\n const storeCopy = useWorkflowStore((state) => state.copy)\n const storePasteRaw = useWorkflowStore((state) => state.paste)\n const storeTakeSnapshot = useWorkflowStore((state) => state.takeSnapshot)\n const canUndo = useWorkflowStore((state) => state.past.length > 0)\n const canRedo = useWorkflowStore((state) => state.future.length > 0)\n\n // Canvas control mode (pointer vs hand)\n const controlMode = useWorkflowStore((state) => state.controlMode)\n const setControlMode = useWorkflowStore((state) => state.setControlMode)\n\n // UI toggles\n const [showMinimap, setShowMinimap] = useState(true)\n const [showShortcuts, setShowShortcuts] = useState(false)\n const [cardDisplayMode, setCardDisplayMode] = useState<WorkflowCardDisplayMode>('detailed')\n const layoutDirection = useWorkflowStore((s) => s.layoutDirection)\n const setLayoutDirection = useWorkflowStore((s) => s.setLayoutDirection)\n\n // Logic node editing state\n const [editingLogicNodeId, setEditingLogicNodeId] = useState<string | null>(null)\n\n const handleEditLogicNode = useCallback((nodeId: string) => {\n setEditingLogicNodeId(nodeId)\n // Open via store — resolve node data from React Flow\n const node = getNode(nodeId)\n if (node) {\n const nodeData = node.data as Record<string, unknown>\n const config = nodeData.config as LogicNodeConfig | undefined\n if (config) {\n openLogicNodeDrawerAction(nodeId, (nodeData.label as string) ?? '', config)\n }\n }\n }, [getNode, openLogicNodeDrawerAction])\n\n // Build lookup maps for entity data enrichment on drop\n const agentMap = useMemo(() => {\n const map = new Map<string, AgentWithPrompts>()\n for (const agent of agents) {\n map.set(agent.agentId, agent)\n }\n return map\n }, [agents])\n\n const toolMap = useMemo(() => {\n const map = new Map<string, Subworkflow>()\n for (const tool of allTools) {\n map.set(tool.toolId, tool)\n }\n return map\n }, [allTools])\n\n const ruleMap = useMemo(() => {\n const map = new Map<string, AgentRule>()\n for (const rule of allRules) {\n map.set(rule.ruleId, rule)\n }\n return map\n }, [allRules])\n\n const entityMap = useMemo(() => {\n const map = new Map<string, WorkflowEntityDefinition>()\n for (const entity of allEntities) {\n map.set(entity.id, entity)\n }\n return map\n }, [allEntities])\n\n const selectedAgent = useMemo(\n () => sortedAgents.find((agent) => (agent.id || agent.agentId) === selectedAgentId) ?? null,\n [sortedAgents, selectedAgentId]\n )\n\n // Merge built-in + external node types (external overrides built-in)\n const mergedNodeTypes = useMemo<NodeTypes>(\n () => (externalNodeTypes ? { ...BUILT_IN_NODE_TYPES, ...externalNodeTypes } : BUILT_IN_NODE_TYPES),\n [externalNodeTypes]\n )\n\n // Merge edge types\n const edgeTypes = useMemo(() => ({\n default: ConditionalEdge,\n }), [])\n\n // ==========================================================================\n // Build initial nodes from saved graph or from DB entities\n // ==========================================================================\n\n const handleRemoveNodeFromCanvas = useCallback(\n (nodeId: string) => {\n setNodes((currentNodes) => {\n // When removing a group, un-parent its children (make them top-level)\n const removedNode = currentNodes.find((node) => node.id === nodeId)\n const isGroup = removedNode?.type === 'group'\n return currentNodes\n .filter((node) => node.id !== nodeId)\n .map((node) => {\n if (isGroup && node.parentId === nodeId) {\n // Convert child to top-level: make position absolute\n const parentPosition = removedNode?.position ?? { x: 0, y: 0 }\n return {\n ...node,\n parentId: undefined,\n extent: undefined,\n position: {\n x: node.position.x + parentPosition.x,\n y: node.position.y + parentPosition.y,\n },\n }\n }\n return node\n })\n })\n setEdges((currentEdges) =>\n currentEdges.filter((edge) => edge.source !== nodeId && edge.target !== nodeId)\n )\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n )\n\n const buildInitialNodes = useCallback((): Node[] => {\n if (initialGraph && initialGraph.nodes.length > 0) {\n const mappedNodes: Node[] = initialGraph.nodes.map((savedNode) => {\n if (savedNode.type === 'agent') {\n const agent = agentMap.get(savedNode.data.entityId)\n if (agent) {\n return {\n id: savedNode.id,\n type: 'agent' as const,\n position: savedNode.position,\n data: {\n agent,\n order: agent.order ?? 0,\n selected: selectedAgentId === savedNode.id,\n onSelect: () => {\n console.log('[Canvas] onSelect agent:', agent.name, agent.agentId)\n setSelectedAgentId(agent.agentId)\n openAgentDrawerAction(agent, models)\n },\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies AgentNodeData,\n }\n }\n // Agent not found — render placeholder (don't fall through to logic)\n return {\n id: savedNode.id,\n type: 'agent' as const,\n position: savedNode.position,\n data: { label: savedNode.data.label } as unknown as AgentNodeData,\n }\n }\n if (savedNode.type === 'tool') {\n const tool = toolMap.get(savedNode.data.entityId)\n if (tool) {\n return {\n id: savedNode.id,\n type: 'tool' as const,\n position: savedNode.position,\n data: {\n tool,\n order: typeof tool.displayOrder === 'number' ? tool.displayOrder : 0,\n onEdit: onEditTool,\n onToggle: onToggleTool,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies ToolNodeData,\n }\n }\n // Tool not found — render placeholder (don't fall through to logic)\n return {\n id: savedNode.id,\n type: 'tool' as const,\n position: savedNode.position,\n data: { label: savedNode.data.label } as unknown as ToolNodeData,\n }\n }\n if (savedNode.type === 'rule') {\n const rule = ruleMap.get(savedNode.data.entityId)\n if (rule) {\n return {\n id: savedNode.id,\n type: 'rule' as const,\n position: savedNode.position,\n data: {\n rule,\n order: typeof rule.priority === 'number' ? rule.priority : 0,\n onEdit: onEditRule,\n onToggle: onToggleRule,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies RuleNodeData,\n }\n }\n // Rule engine node — no specific rule entity, use config-based rendering\n const ruleConfig = savedNode.data.config as RuleNodeConfig | undefined\n return {\n id: savedNode.id,\n type: 'rule' as const,\n position: savedNode.position,\n data: {\n rule: undefined,\n config: ruleConfig ?? { type: 'rule' as const },\n label: savedNode.data.label,\n order: 0,\n onEdit: handleEditLogicNode,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies RuleNodeData,\n }\n }\n if (savedNode.type === 'entity') {\n const entityConfig = savedNode.data.config as EntityNodeConfig | undefined\n const entity = entityConfig ? entityMap.get(entityConfig.entityMasterId) : undefined\n return {\n id: savedNode.id,\n type: 'entity' as const,\n position: savedNode.position,\n data: {\n config: entityConfig,\n entity,\n label: savedNode.data.label,\n onEdit: handleEditLogicNode,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies EntityNodeData,\n }\n }\n if (savedNode.type === 'group') {\n const groupConfig = savedNode.data.config as GroupNodeConfig | undefined\n const defaultGroupConfig: GroupNodeConfig = {\n type: 'group', label: savedNode.data.label || 'Group', color: 'slate',\n isExpanded: true, width: 400, height: 300, collapsedWidth: 260, collapsedHeight: 60,\n }\n const resolvedConfig = groupConfig ?? defaultGroupConfig\n return {\n id: savedNode.id,\n type: 'group' as const,\n position: savedNode.position,\n ...(savedNode.style ? { style: savedNode.style } : { style: { width: resolvedConfig.width, height: resolvedConfig.height } }),\n data: {\n config: resolvedConfig,\n label: savedNode.data.label,\n onEdit: handleEditLogicNode,\n onToggleExpand: handleToggleGroupExpand,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies GroupNodeData,\n }\n }\n // Logic nodes — restore from saved config\n if (isLogicNodeType(savedNode.type)) {\n const config = savedNode.data.config ?? createDefaultLogicNodeConfig(savedNode.type as WorkflowNodeType)\n if (config) {\n const baseNode: Node = {\n id: savedNode.id,\n type: savedNode.type,\n position: savedNode.position,\n data: {\n config,\n label: savedNode.data.label,\n onEdit: handleEditLogicNode,\n },\n }\n // Restore parent-child relationships for nodes inside groups\n if (savedNode.parentId) {\n baseNode.parentId = savedNode.parentId\n baseNode.extent = savedNode.extent\n }\n return baseNode\n }\n }\n\n // Fallback: entity was deleted — return a placeholder\n return {\n id: savedNode.id,\n type: savedNode.type as 'agent' | 'tool' | 'rule',\n position: savedNode.position,\n data: { label: savedNode.data.label } as unknown as AgentNodeData,\n }\n })\n\n // Restore parentId/extent for non-logic nodes (agent, tool, entity, etc.)\n const parentIdMap = new Map<string, { parentId: string; extent?: 'parent' }>()\n for (const savedNode of initialGraph.nodes) {\n if (savedNode.parentId) {\n parentIdMap.set(savedNode.id, { parentId: savedNode.parentId, extent: savedNode.extent })\n }\n }\n const nodesWithParents = mappedNodes.map((node) => {\n const parentInfo = parentIdMap.get(node.id)\n if (parentInfo && !node.parentId) {\n return { ...node, parentId: parentInfo.parentId, extent: parentInfo.extent }\n }\n return node\n })\n\n // Sort: parent (group) nodes must come before their children for React Flow\n return nodesWithParents.sort((nodeA, nodeB) => {\n if (nodeA.type === 'group' && nodeB.parentId === nodeA.id) return -1\n if (nodeB.type === 'group' && nodeA.parentId === nodeB.id) return 1\n return 0\n })\n }\n\n // No saved graph — start empty canvas\n return []\n }, [initialGraph, agentMap, toolMap, ruleMap, entityMap, selectedAgentId, onEditTool, onToggleTool, onEditRule, onToggleRule, handleEditLogicNode, handleToggleGroupExpand, handleRemoveNodeFromCanvas])\n\n /**\n * Resolve an edge label from the saved graph data (used during initial load\n * when React Flow nodes are not yet mounted — so we read from initialGraph\n * nodes directly instead of using getNode).\n */\n const resolveEdgeLabelFromGraph = useCallback(\n (sourceHandle: string | undefined, sourceNodeId: string): string | undefined => {\n if (!sourceHandle) return undefined\n if (sourceHandle === 'true-out') return 'True'\n if (sourceHandle === 'false-out') return 'False'\n if (sourceHandle === 'loop-out') return 'Loop'\n\n const categoryMatch = sourceHandle.match(/^category-(\\d+)$/)\n if (categoryMatch && initialGraph) {\n const categoryIndex = Number.parseInt(categoryMatch[1], 10)\n const sourceNode = initialGraph.nodes.find((node) => node.id === sourceNodeId)\n if (sourceNode) {\n const config = sourceNode.data.config as { categories?: Array<{ name: string }> } | undefined\n if (config?.categories?.[categoryIndex]) {\n return config.categories[categoryIndex].name\n }\n }\n return `Category ${categoryIndex + 1}`\n }\n\n return undefined\n },\n [initialGraph]\n )\n\n const buildInitialEdges = useCallback((): Edge[] => {\n if (initialGraph && initialGraph.edges.length > 0) {\n return initialGraph.edges.map((savedEdge) => {\n const handle = savedEdge.sourceHandle\n const edgeColor = handle === 'true-out' ? GRAPH_TRUE_EDGE_COLOR\n : handle === 'false-out' ? GRAPH_FALSE_EDGE_COLOR\n : GRAPH_ACTIVE_EDGE_COLOR\n\n return {\n id: savedEdge.id,\n source: savedEdge.source,\n target: savedEdge.target,\n sourceHandle: savedEdge.sourceHandle,\n targetHandle: savedEdge.targetHandle,\n type: 'default',\n animated: true,\n data: {\n label: resolveEdgeLabelFromGraph(savedEdge.sourceHandle ?? undefined, savedEdge.source),\n onInsertNode: insertNodeOnEdge,\n },\n style: {\n stroke: edgeColor,\n strokeWidth: 2,\n },\n markerEnd: { type: MarkerType.ArrowClosed, color: edgeColor },\n }\n })\n }\n return []\n }, [initialGraph, resolveEdgeLabelFromGraph, insertNodeOnEdge])\n\n const [nodes, setNodes, onNodesChange] = useNodesState(buildInitialNodes())\n const [edges, setEdges, onEdgesChange] = useEdgesState(buildInitialEdges())\n\n // Wire up the group expand ref now that setNodes/setEdges are available\n toggleGroupExpandRef.current = (nodeId: string) => {\n storeTakeSnapshot()\n setNodes((currentNodes: Node[]) => {\n const groupNode = currentNodes.find((node) => node.id === nodeId)\n if (!groupNode) return currentNodes\n const groupData = groupNode.data as GroupNodeData\n const groupConfig = groupData.config\n const isCurrentlyExpanded = groupConfig.isExpanded\n const childIds = new Set(currentNodes.filter((node) => node.parentId === nodeId).map((node) => node.id))\n\n return currentNodes.map((node) => {\n if (node.id === nodeId) {\n const updatedConfig: GroupNodeConfig = {\n ...groupConfig,\n isExpanded: !isCurrentlyExpanded,\n }\n return {\n ...node,\n style: !isCurrentlyExpanded\n ? { width: groupConfig.width, height: groupConfig.height }\n : { width: groupConfig.collapsedWidth, height: groupConfig.collapsedHeight },\n data: { ...groupData, config: updatedConfig },\n }\n }\n if (childIds.has(node.id)) {\n return { ...node, hidden: isCurrentlyExpanded }\n }\n return node\n })\n })\n setEdges((currentEdges) => {\n const currentNodeList = useWorkflowStore.getState().nodes\n const storeGroupNode = currentNodeList.find((node) => node.id === nodeId)\n if (!storeGroupNode) return currentEdges\n const storeGroupData = storeGroupNode.data as GroupNodeData\n const isCurrentlyExpanded = storeGroupData.config.isExpanded\n const childIds = new Set(currentNodeList.filter((node) => node.parentId === nodeId).map((node) => node.id))\n\n return currentEdges.map((edge) => {\n if (childIds.has(edge.source) || childIds.has(edge.target)) {\n return { ...edge, hidden: isCurrentlyExpanded }\n }\n return edge\n })\n })\n }\n\n // Reload when initialGraph changes (e.g., after load from server)\n const initialGraphRef = useRef(initialGraph)\n useEffect(() => {\n if (initialGraph !== initialGraphRef.current) {\n initialGraphRef.current = initialGraph\n setNodes(buildInitialNodes())\n setEdges(buildInitialEdges())\n }\n }, [initialGraph, buildInitialNodes, buildInitialEdges, setNodes, setEdges])\n\n // ==========================================================================\n // Keyboard Shortcuts\n // ==========================================================================\n\n const handleSelectAll = useCallback(() => {\n setNodes((currentNodes) => currentNodes.map((node) => ({ ...node, selected: true })))\n }, [setNodes])\n\n const handleDeselectAll = useCallback(() => {\n setNodes((currentNodes) => currentNodes.map((node) => ({ ...node, selected: false })))\n }, [setNodes])\n\n const handleFitView = useCallback(() => {\n fitView({ padding: 0.2 })\n }, [fitView])\n\n const handleLayoutDirectionChange = useCallback(\n (direction: LayoutDirection) => {\n setLayoutDirection(direction)\n if (direction === 'free') {\n // Remove sourcePosition/targetPosition overrides\n setNodes((currentNodes) => currentNodes.map((node) => {\n const { sourcePosition: _s, targetPosition: _t, ...rest } = node\n return rest\n }))\n return\n }\n\n storeTakeSnapshot()\n\n const isTB = direction === 'TB'\n const repositionedNodes = applyDagreLayout(nodes, edges, direction).map((node) => ({\n ...node,\n sourcePosition: isTB ? Position.Bottom : Position.Right,\n targetPosition: isTB ? Position.Top : Position.Left,\n }))\n setNodes(repositionedNodes)\n\n requestAnimationFrame(() => {\n fitView({ padding: 0.2 })\n })\n },\n [nodes, edges, setNodes, setLayoutDirection, fitView, storeTakeSnapshot],\n )\n\n // Sync nodes/edges to Zustand for undo/redo/copy/paste\n const storeSetNodes = useWorkflowStore((state) => state.setNodes)\n const storeSetEdges = useWorkflowStore((state) => state.setEdges)\n\n useEffect(() => {\n storeSetNodes(nodes)\n }, [nodes, storeSetNodes])\n\n useEffect(() => {\n storeSetEdges(edges)\n }, [edges, storeSetEdges])\n\n useEffect(() => {\n const hasMismatch = nodes.some((node) => {\n const nodeData = node.data as Record<string, unknown> | undefined\n return nodeData?.displayMode !== cardDisplayMode\n })\n if (!hasMismatch) return\n\n setNodes((currentNodes) =>\n currentNodes.map((node) => ({\n ...node,\n data: {\n ...(node.data as Record<string, unknown>),\n displayMode: cardDisplayMode,\n },\n }))\n )\n }, [nodes, cardDisplayMode, setNodes])\n\n // Undo/Redo/Paste wrappers — sync Zustand state back to React Flow\n // The raw store actions update Zustand but React Flow uses its own state\n // (useNodesState/useEdgesState), so we must push the restored values back.\n\n const storeUndo = useCallback(() => {\n storeUndoRaw()\n const { nodes: restoredNodes, edges: restoredEdges } = useWorkflowStore.getState()\n setNodes(restoredNodes)\n setEdges(restoredEdges)\n }, [storeUndoRaw, setNodes, setEdges])\n\n const storeRedo = useCallback(() => {\n storeRedoRaw()\n const { nodes: restoredNodes, edges: restoredEdges } = useWorkflowStore.getState()\n setNodes(restoredNodes)\n setEdges(restoredEdges)\n }, [storeRedoRaw, setNodes, setEdges])\n\n const storePaste = useCallback(() => {\n storePasteRaw()\n const { nodes: pastedNodes, edges: pastedEdges } = useWorkflowStore.getState()\n setNodes(pastedNodes)\n setEdges(pastedEdges)\n }, [storePasteRaw, setNodes, setEdges])\n\n // Duplicate = copy + paste in one action\n const handleDuplicateSelected = useCallback(() => {\n storeCopy()\n storePasteRaw()\n const { nodes: duplicatedNodes, edges: duplicatedEdges } = useWorkflowStore.getState()\n setNodes(duplicatedNodes)\n setEdges(duplicatedEdges)\n }, [storeCopy, storePasteRaw, setNodes, setEdges])\n\n // Snapshot on node drag start (so dragging positions can be undone)\n const onNodeDragStart = useCallback(() => {\n storeTakeSnapshot()\n }, [storeTakeSnapshot])\n\n // ==========================================================================\n // Context Menu Action Callbacks\n // These operate on React Flow state (setNodes/setEdges) directly,\n // ensuring the canvas re-renders. Zustand sync happens via useEffect.\n // ==========================================================================\n\n const contextMenuEditNode = useCallback((nodeId: string) => {\n const targetNode = nodes.find((node) => node.id === nodeId)\n if (!targetNode) return\n\n if (targetNode.type === 'agent') {\n const agent = (targetNode.data as AgentNodeData)?.agent\n if (agent) {\n setSelectedAgentId(agent.agentId ?? agent.id ?? null)\n openAgentDrawerAction(agent, models)\n }\n } else if (targetNode.type === 'tool') {\n const tool = (targetNode.data as ToolNodeData)?.tool\n if (tool) onEditTool?.(tool)\n } else if (targetNode.type === 'rule' && (targetNode.data as RuleNodeData)?.rule) {\n onEditRule?.((targetNode.data as RuleNodeData).rule!)\n } else {\n handleEditLogicNode(nodeId)\n }\n }, [nodes, setSelectedAgentId, openAgentDrawerAction, models, onEditTool, onEditRule, handleEditLogicNode])\n\n const DUPLICATE_OFFSET = 40\n\n const contextMenuDuplicateNode = useCallback((nodeId: string) => {\n storeTakeSnapshot()\n setNodes((currentNodes) => {\n const targetNode = currentNodes.find((node) => node.id === nodeId)\n if (!targetNode) return currentNodes\n const duplicatedNode = {\n ...targetNode,\n id: crypto.randomUUID(),\n position: {\n x: targetNode.position.x + DUPLICATE_OFFSET,\n y: targetNode.position.y + DUPLICATE_OFFSET,\n },\n selected: true,\n data: { ...targetNode.data },\n }\n return [\n ...currentNodes.map((node) => ({ ...node, selected: false })),\n duplicatedNode,\n ]\n })\n }, [storeTakeSnapshot, setNodes])\n\n const contextMenuCopyNode = useCallback((nodeId: string) => {\n setNodes((currentNodes) =>\n currentNodes.map((node) => ({\n ...node,\n selected: node.id === nodeId,\n })),\n )\n requestAnimationFrame(() => {\n storeCopy()\n })\n }, [setNodes, storeCopy])\n\n const contextMenuDeleteNode = useCallback((nodeId: string) => {\n storeTakeSnapshot()\n setNodes((currentNodes) => currentNodes.filter((node) => node.id !== nodeId))\n setEdges((currentEdges) =>\n currentEdges.filter(\n (edge) => edge.source !== nodeId && edge.target !== nodeId,\n ),\n )\n }, [storeTakeSnapshot, setNodes, setEdges])\n\n const contextMenuPaste = useCallback(() => {\n storePaste()\n }, [storePaste])\n\n const contextMenuAddNote = useCallback((flowPosition: { x: number; y: number }) => {\n storeTakeSnapshot()\n const noteConfig = createDefaultLogicNodeConfig('note')\n const noteNode = {\n id: crypto.randomUUID(),\n type: 'note' as const,\n position: flowPosition,\n selected: true,\n data: {\n entityId: '',\n label: 'Note',\n config: noteConfig,\n },\n }\n setNodes((currentNodes) => [\n ...currentNodes.map((node) => ({ ...node, selected: false })),\n noteNode,\n ])\n }, [storeTakeSnapshot, setNodes])\n\n const contextMenuCopySelection = useCallback(() => {\n storeCopy()\n }, [storeCopy])\n\n const contextMenuDuplicateSelection = useCallback(() => {\n handleDuplicateSelected()\n }, [handleDuplicateSelected])\n\n const contextMenuDeleteSelection = useCallback(() => {\n storeTakeSnapshot()\n setNodes((currentNodes) => {\n const selectedIds = new Set(currentNodes.filter((node) => node.selected).map((node) => node.id))\n return currentNodes.filter((node) => !selectedIds.has(node.id))\n })\n setEdges((currentEdges) => {\n const currentNodeList = nodes\n const selectedIds = new Set(currentNodeList.filter((node) => node.selected).map((node) => node.id))\n return currentEdges.filter(\n (edge) => !selectedIds.has(edge.source) && !selectedIds.has(edge.target),\n )\n })\n }, [storeTakeSnapshot, setNodes, setEdges, nodes])\n\n const contextMenuGroupSelected = useCallback(() => {\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length < 2) return\n storeTakeSnapshot()\n\n const GROUP_PADDING = 40\n const GROUP_HEADER_HEIGHT = 36\n\n let minX = Infinity\n let minY = Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n\n for (const node of selectedNodes) {\n const dimensions = getNodeDimensions(node)\n minX = Math.min(minX, node.position.x)\n minY = Math.min(minY, node.position.y)\n maxX = Math.max(maxX, node.position.x + dimensions.width)\n maxY = Math.max(maxY, node.position.y + dimensions.height)\n }\n\n const groupWidth = maxX - minX + GROUP_PADDING * 2\n const groupHeight = maxY - minY + GROUP_PADDING * 2 + GROUP_HEADER_HEIGHT\n const groupId = crypto.randomUUID()\n const groupPosition = { x: minX - GROUP_PADDING, y: minY - GROUP_PADDING - GROUP_HEADER_HEIGHT }\n const selectedNodeIds = new Set(selectedNodes.map((node) => node.id))\n\n const groupNode: Node = {\n id: groupId,\n type: 'group',\n position: groupPosition,\n style: { width: groupWidth, height: groupHeight },\n data: {\n config: {\n type: 'group',\n label: 'Group',\n color: 'slate',\n isExpanded: true,\n width: groupWidth,\n height: groupHeight,\n collapsedWidth: 260,\n collapsedHeight: 60,\n },\n label: 'Group',\n onEdit: handleEditLogicNode,\n onToggleExpand: handleToggleGroupExpand,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n },\n }\n\n setNodes((currentNodes) => {\n const updatedNodes = currentNodes.map((node) => {\n if (selectedNodeIds.has(node.id)) {\n return {\n ...node,\n parentId: groupId,\n extent: 'parent' as const,\n position: {\n x: node.position.x - groupPosition.x,\n y: node.position.y - groupPosition.y,\n },\n selected: false,\n }\n }\n return { ...node, selected: false }\n })\n return [groupNode, ...updatedNodes]\n })\n }, [nodes, storeTakeSnapshot, setNodes, handleEditLogicNode, handleToggleGroupExpand, handleRemoveNodeFromCanvas])\n\n const contextMenuUngroupSelected = useCallback(() => {\n const selectedGroupNodes = nodes.filter((node) => node.selected && node.type === 'group')\n if (selectedGroupNodes.length === 0) return\n storeTakeSnapshot()\n\n const groupIds = new Set(selectedGroupNodes.map((node) => node.id))\n\n setNodes((currentNodes) => {\n const updatedNodes = currentNodes\n .filter((node) => !groupIds.has(node.id))\n .map((node) => {\n if (node.parentId && groupIds.has(node.parentId)) {\n const parentGroup = currentNodes.find((groupNode) => groupNode.id === node.parentId)\n const parentPosition = parentGroup?.position ?? { x: 0, y: 0 }\n return {\n ...node,\n parentId: undefined,\n extent: undefined,\n position: {\n x: node.position.x + parentPosition.x,\n y: node.position.y + parentPosition.y,\n },\n }\n }\n return node\n })\n return updatedNodes\n })\n }, [nodes, storeTakeSnapshot, setNodes])\n\n const contextMenuAlignNodes = useCallback((direction: AlignDirection) => {\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length < 2) return\n storeTakeSnapshot()\n const selectedNodeIds = new Set(selectedNodes.map((node) => node.id))\n\n setNodes((currentNodes) => {\n switch (direction) {\n case 'left': {\n const minX = Math.min(...selectedNodes.map((node) => node.position.x))\n return currentNodes.map((node) =>\n selectedNodeIds.has(node.id) ? { ...node, position: { ...node.position, x: minX } } : node,\n )\n }\n case 'right': {\n const maxRight = Math.max(...selectedNodes.map((node) => node.position.x + getNodeDimensions(node).width))\n return currentNodes.map((node) =>\n selectedNodeIds.has(node.id) ? { ...node, position: { ...node.position, x: maxRight - getNodeDimensions(node).width } } : node,\n )\n }\n case 'top': {\n const minY = Math.min(...selectedNodes.map((node) => node.position.y))\n return currentNodes.map((node) =>\n selectedNodeIds.has(node.id) ? { ...node, position: { ...node.position, y: minY } } : node,\n )\n }\n case 'bottom': {\n const maxBottom = Math.max(...selectedNodes.map((node) => node.position.y + getNodeDimensions(node).height))\n return currentNodes.map((node) =>\n selectedNodeIds.has(node.id) ? { ...node, position: { ...node.position, y: maxBottom - getNodeDimensions(node).height } } : node,\n )\n }\n case 'centerHorizontal': {\n const positions = selectedNodes.map((node) => node.position.x + getNodeDimensions(node).width / 2)\n const centerX = (Math.min(...positions) + Math.max(...positions)) / 2\n return currentNodes.map((node) =>\n selectedNodeIds.has(node.id) ? { ...node, position: { ...node.position, x: centerX - getNodeDimensions(node).width / 2 } } : node,\n )\n }\n case 'centerVertical': {\n const positions = selectedNodes.map((node) => node.position.y + getNodeDimensions(node).height / 2)\n const centerY = (Math.min(...positions) + Math.max(...positions)) / 2\n return currentNodes.map((node) =>\n selectedNodeIds.has(node.id) ? { ...node, position: { ...node.position, y: centerY - getNodeDimensions(node).height / 2 } } : node,\n )\n }\n default:\n return currentNodes\n }\n })\n }, [nodes, storeTakeSnapshot, setNodes])\n\n const contextMenuDistributeNodes = useCallback((direction: DistributeDirection) => {\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length < 3) return\n storeTakeSnapshot()\n\n const positionMap = new Map<string, number>()\n\n if (direction === 'horizontal') {\n const sorted = [...selectedNodes].sort((nodeA, nodeB) => nodeA.position.x - nodeB.position.x)\n const firstNode = sorted[0]\n const lastNode = sorted[sorted.length - 1]\n const totalWidth = (lastNode.position.x + getNodeDimensions(lastNode).width) - firstNode.position.x\n const nodesWidth = sorted.reduce((sum, node) => sum + getNodeDimensions(node).width, 0)\n const spacing = (totalWidth - nodesWidth) / (sorted.length - 1)\n let currentX = firstNode.position.x\n for (const node of sorted) {\n positionMap.set(node.id, currentX)\n currentX += getNodeDimensions(node).width + spacing\n }\n } else {\n const sorted = [...selectedNodes].sort((nodeA, nodeB) => nodeA.position.y - nodeB.position.y)\n const firstNode = sorted[0]\n const lastNode = sorted[sorted.length - 1]\n const totalHeight = (lastNode.position.y + getNodeDimensions(lastNode).height) - firstNode.position.y\n const nodesHeight = sorted.reduce((sum, node) => sum + getNodeDimensions(node).height, 0)\n const spacing = (totalHeight - nodesHeight) / (sorted.length - 1)\n let currentY = firstNode.position.y\n for (const node of sorted) {\n positionMap.set(node.id, currentY)\n currentY += getNodeDimensions(node).height + spacing\n }\n }\n\n setNodes((currentNodes) =>\n currentNodes.map((node) => {\n if (!positionMap.has(node.id)) return node\n const value = positionMap.get(node.id) ?? 0\n return direction === 'horizontal'\n ? { ...node, position: { ...node.position, x: value } }\n : { ...node, position: { ...node.position, y: value } }\n }),\n )\n }, [nodes, storeTakeSnapshot, setNodes])\n\n const storeClipboard = useWorkflowStore((state) => state.clipboard)\n const hasClipboardContent = storeClipboard !== null && storeClipboard.nodes.length > 0\n\n // Keyboard shortcuts\n useEffect(() => {\n const INPUT_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT'])\n\n function isInputFocused(): boolean {\n const activeElement = document.activeElement\n if (!activeElement) return false\n return INPUT_TAGS.has(activeElement.tagName) || (activeElement as HTMLElement).isContentEditable\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n if (isInputFocused()) return\n\n const isModifierPressed = event.metaKey || event.ctrlKey\n\n if (!isModifierPressed) {\n if (event.key === 'Escape') {\n handleDeselectAll()\n return\n }\n if (event.key.toLowerCase() === 'v') {\n setControlMode('pointer')\n return\n }\n if (event.key.toLowerCase() === 'h') {\n setControlMode('hand')\n return\n }\n // Shift+1 → Zoom to 100%\n if (event.shiftKey && event.key === '!') {\n event.preventDefault()\n zoomTo(1)\n return\n }\n // Shift+5 → Zoom to 50%\n if (event.shiftKey && event.key === '%') {\n event.preventDefault()\n zoomTo(0.5)\n return\n }\n return\n }\n\n switch (event.key.toLowerCase()) {\n case 'g': {\n event.preventDefault()\n if (event.shiftKey) {\n contextMenuUngroupSelected()\n } else {\n contextMenuGroupSelected()\n }\n break\n }\n case 'z': {\n if (event.shiftKey) {\n if (canRedo) {\n event.preventDefault()\n storeRedo()\n }\n } else {\n if (canUndo) {\n event.preventDefault()\n storeUndo()\n }\n }\n break\n }\n case 'y': {\n if (canRedo) {\n event.preventDefault()\n storeRedo()\n }\n break\n }\n case 'c': {\n event.preventDefault()\n storeCopy()\n break\n }\n case 'v': {\n event.preventDefault()\n storePaste()\n break\n }\n case 'a': {\n event.preventDefault()\n handleSelectAll()\n break\n }\n case 'd': {\n event.preventDefault()\n handleDuplicateSelected()\n break\n }\n case 'f': {\n if (event.shiftKey) {\n event.preventDefault()\n handleFitView()\n }\n break\n }\n case '1': {\n // Ctrl/Cmd+1 → Fit to view\n event.preventDefault()\n handleFitView()\n break\n }\n case '-':\n case '_': {\n // Ctrl/Cmd+- → Zoom out\n event.preventDefault()\n zoomOut()\n break\n }\n case '=':\n case '+': {\n // Ctrl/Cmd+= → Zoom in\n event.preventDefault()\n zoomIn()\n break\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown, { capture: true })\n return () => {\n document.removeEventListener('keydown', handleKeyDown, { capture: true })\n }\n }, [canUndo, canRedo, storeUndo, storeRedo, storeCopy, storePaste, handleSelectAll, handleDeselectAll, handleFitView, handleDuplicateSelected, setControlMode, zoomTo, zoomIn, zoomOut, contextMenuGroupSelected, contextMenuUngroupSelected])\n\n // ==========================================================================\n // Graph serialization helper (shared by debounced save and immediate save)\n // ==========================================================================\n\n const serializeGraph = useCallback((): WorkflowGraph => {\n const flowObject = toObject()\n return {\n nodes: flowObject.nodes.map((node: Node) => {\n const nodeData = node.data as Record<string, unknown> | undefined\n const agent = nodeData?.agent as Record<string, unknown> | undefined\n const tool = nodeData?.tool as Record<string, unknown> | undefined\n const rule = nodeData?.rule as Record<string, unknown> | undefined\n const nodeConfig = nodeData?.config as LogicNodeConfig | undefined\n const serializedNode = {\n id: node.id,\n type: (node.type ?? 'agent') as WorkflowNodeType,\n position: node.position,\n data: {\n entityId: (nodeData?.entityId as string) ?? (agent?.agentId as string) ?? (tool?.toolId as string) ?? (rule?.ruleId as string) ?? node.type ?? '',\n label: (nodeData?.label as string) ?? (agent?.name as string) ?? (tool?.name as string) ?? (rule?.name as string) ?? '',\n ...(nodeConfig ? { config: nodeConfig } : {}),\n },\n // Persist group parent-child relationships\n ...(node.parentId ? { parentId: node.parentId } : {}),\n ...(node.extent === 'parent' ? { extent: 'parent' as const } : {}),\n ...(node.style ? { style: node.style as { width?: number; height?: number } } : {}),\n }\n return serializedNode\n }),\n edges: flowObject.edges.map((edge: Edge) => ({\n id: edge.id,\n source: edge.source,\n target: edge.target,\n sourceHandle: edge.sourceHandle ?? '',\n targetHandle: edge.targetHandle ?? '',\n })),\n viewport: flowObject.viewport,\n }\n }, [toObject])\n\n // ==========================================================================\n // Graph change notification (debounced for auto-save)\n // ==========================================================================\n\n useEffect(() => {\n if (!onGraphChange) return\n\n if (graphChangeTimerRef.current) {\n clearTimeout(graphChangeTimerRef.current)\n }\n\n graphChangeTimerRef.current = setTimeout(() => {\n onGraphChange(serializeGraph())\n }, AUTO_SAVE_DEBOUNCE_MS)\n\n return () => {\n if (graphChangeTimerRef.current) {\n clearTimeout(graphChangeTimerRef.current)\n }\n }\n }, [nodes, edges, onGraphChange, serializeGraph])\n\n // ==========================================================================\n // Immediate save on visibility change / page unload (Dify-style)\n // ==========================================================================\n\n useEffect(() => {\n if (!onGraphChange) return\n\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n // Flush any pending debounced save immediately\n if (graphChangeTimerRef.current) {\n clearTimeout(graphChangeTimerRef.current)\n graphChangeTimerRef.current = null\n }\n onGraphChange(serializeGraph())\n }\n }\n\n const handleBeforeUnload = () => {\n if (graphChangeTimerRef.current) {\n clearTimeout(graphChangeTimerRef.current)\n graphChangeTimerRef.current = null\n }\n onGraphChange(serializeGraph())\n }\n\n document.addEventListener('visibilitychange', handleVisibilityChange)\n window.addEventListener('beforeunload', handleBeforeUnload)\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n window.removeEventListener('beforeunload', handleBeforeUnload)\n }\n }, [onGraphChange, serializeGraph])\n\n // ==========================================================================\n // Drag & drop handler — create node at drop position\n // ==========================================================================\n\n const onDrop = useCallback(\n (event: React.DragEvent) => {\n event.preventDefault()\n const nodeType = event.dataTransfer.getData('nodeType') as WorkflowNodeType\n const entityId = event.dataTransfer.getData('entityId')\n const label = event.dataTransfer.getData('label')\n const configRaw = event.dataTransfer.getData('config')\n\n if (!nodeType || !entityId) return\n\n storeTakeSnapshot()\n\n const position = screenToFlowPosition({\n x: event.clientX,\n y: event.clientY,\n })\n\n const newNodeId = crypto.randomUUID()\n\n if (nodeType === 'agent') {\n const agent = agentMap.get(entityId)\n if (!agent) return\n const newNode: Node = {\n id: newNodeId,\n type: 'agent',\n position,\n data: {\n agent,\n order: agent.order ?? 0,\n selected: false,\n onSelect: () => {\n setSelectedAgentId(agent.agentId)\n openAgentDrawerAction(agent, models)\n },\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies AgentNodeData,\n }\n setNodes((currentNodes) => [...currentNodes, newNode])\n } else if (nodeType === 'tool') {\n const tool = toolMap.get(entityId)\n if (!tool) return\n const newNode: Node = {\n id: newNodeId,\n type: 'tool',\n position,\n data: {\n tool,\n order: typeof tool.displayOrder === 'number' ? tool.displayOrder : 0,\n onEdit: onEditTool,\n onToggle: onToggleTool,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies ToolNodeData,\n }\n setNodes((currentNodes) => [...currentNodes, newNode])\n } else if (nodeType === 'rule') {\n const rule = ruleMap.get(entityId)\n if (!rule) return\n const newNode: Node = {\n id: newNodeId,\n type: 'rule',\n position,\n data: {\n rule,\n order: typeof rule.priority === 'number' ? rule.priority : 0,\n onEdit: onEditRule,\n onToggle: onToggleRule,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies RuleNodeData,\n }\n setNodes((currentNodes) => [...currentNodes, newNode])\n } else if (nodeType === 'entity') {\n const entityConfig = configRaw\n ? JSON.parse(configRaw) as EntityNodeConfig\n : undefined\n if (!entityConfig) return\n const entity = entityMap.get(entityConfig.entityMasterId)\n const newNode: Node = {\n id: newNodeId,\n type: 'entity',\n position,\n data: {\n config: entityConfig,\n entity,\n label,\n onEdit: handleEditLogicNode,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies EntityNodeData,\n }\n setNodes((currentNodes) => [...currentNodes, newNode])\n } else if (nodeType === 'group') {\n const groupConfig = configRaw\n ? JSON.parse(configRaw) as GroupNodeConfig\n : createDefaultLogicNodeConfig('group') as GroupNodeConfig\n if (!groupConfig) return\n const newNode: Node = {\n id: newNodeId,\n type: 'group',\n position,\n style: { width: groupConfig.width, height: groupConfig.height },\n data: {\n config: { ...groupConfig, label: label || 'Group' },\n label: label || 'Group',\n onEdit: handleEditLogicNode,\n onToggleExpand: handleToggleGroupExpand,\n onRemoveFromCanvas: handleRemoveNodeFromCanvas,\n } satisfies GroupNodeData,\n }\n setNodes((currentNodes) => [...currentNodes, newNode])\n } else if (isLogicNodeType(nodeType)) {\n const config = configRaw\n ? JSON.parse(configRaw) as LogicNodeConfig\n : createDefaultLogicNodeConfig(nodeType)\n if (!config) return\n\n // Check if dropping onto an expanded group node — re-parent\n const newNode: Node = {\n id: newNodeId,\n type: nodeType,\n position,\n data: {\n config,\n label,\n onEdit: handleEditLogicNode,\n },\n }\n\n setNodes((currentNodes) => {\n // Find if dropped position is inside an expanded group\n const targetGroup = currentNodes.find((node) => {\n if (node.type !== 'group') return false\n const groupData = node.data as GroupNodeData\n if (!groupData.config.isExpanded) return false\n const groupWidth = (node.style as { width?: number })?.width ?? groupData.config.width\n const groupHeight = (node.style as { height?: number })?.height ?? groupData.config.height\n return (\n position.x >= node.position.x &&\n position.x <= node.position.x + groupWidth &&\n position.y >= node.position.y &&\n position.y <= node.position.y + groupHeight\n )\n })\n\n if (targetGroup) {\n newNode.parentId = targetGroup.id\n newNode.extent = 'parent'\n // Convert to relative position within group\n newNode.position = {\n x: position.x - targetGroup.position.x,\n y: position.y - targetGroup.position.y,\n }\n }\n\n return [...currentNodes, newNode]\n })\n }\n },\n [screenToFlowPosition, agentMap, toolMap, ruleMap, entityMap, setNodes, onEditTool, onToggleTool, onEditRule, onToggleRule, handleEditLogicNode, handleToggleGroupExpand, handleRemoveNodeFromCanvas, storeTakeSnapshot]\n )\n\n const onDragOver = useCallback((event: React.DragEvent) => {\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n }, [])\n\n // ==========================================================================\n // Connection handler — draw edge between nodes\n // ==========================================================================\n\n /**\n * Resolve a human-readable edge label from the source handle.\n * Supports: IF/ELSE (true-out / false-out), Question Classifier (category-N),\n * and Iteration (loop-out).\n */\n const resolveEdgeLabel = useCallback(\n (sourceHandle: string | null | undefined, sourceNodeId: string): string | undefined => {\n if (!sourceHandle) return undefined\n if (sourceHandle === 'true-out') return 'True'\n if (sourceHandle === 'false-out') return 'False'\n if (sourceHandle === 'loop-out') return 'Loop'\n\n // Question Classifier: category-0, category-1, …\n const categoryMatch = sourceHandle.match(/^category-(\\d+)$/)\n if (categoryMatch) {\n const categoryIndex = Number.parseInt(categoryMatch[1], 10)\n const sourceNode = getNode(sourceNodeId)\n if (sourceNode) {\n const nodeData = sourceNode.data as Record<string, unknown>\n const config = nodeData.config as { categories?: Array<{ name: string }> } | undefined\n if (config?.categories?.[categoryIndex]) {\n return config.categories[categoryIndex].name\n }\n }\n return `Category ${categoryIndex + 1}`\n }\n\n return undefined\n },\n [getNode]\n )\n\n const onConnect = useCallback(\n (connection: Connection) => {\n storeTakeSnapshot()\n\n const edgeLabel = resolveEdgeLabel(connection.sourceHandle, connection.source)\n\n setEdges((currentEdges) =>\n addEdge(\n {\n ...connection,\n type: 'default',\n animated: true,\n data: { label: edgeLabel, onInsertNode: insertNodeOnEdge },\n style: { stroke: GRAPH_ACTIVE_EDGE_COLOR, strokeWidth: 2 },\n markerEnd: { type: MarkerType.ArrowClosed, color: GRAPH_ACTIVE_EDGE_COLOR },\n },\n currentEdges\n )\n )\n },\n [setEdges, storeTakeSnapshot, resolveEdgeLabel, insertNodeOnEdge]\n )\n\n // Connection validation: extended for all 20 node types\n const isValidConnection = useCallback(\n (connection: Connection | Edge) => {\n const sourceNode = getNode(connection.source)\n const targetNode = getNode(connection.target)\n if (!sourceNode || !targetNode) return false\n\n // No self-connections\n if (connection.source === connection.target) return false\n\n const sourceType = sourceNode.type as WorkflowNodeType\n const targetType = targetNode.type as WorkflowNodeType\n\n // Note nodes cannot connect at all — they are annotations\n if (sourceType === 'note' || targetType === 'note') return false\n\n // Start can only be a source, never a target\n if (targetType === 'start') return false\n // End can only be a target, never a source\n if (sourceType === 'end') return false\n // Answer is a terminal node — target only, no outgoing\n if (sourceType === 'answer') return false\n\n // iteration_start can only accept source from iteration node\n if (targetType === 'iteration_start' && sourceType !== 'iteration') return false\n\n // Tool → Agent only\n if (sourceType === 'tool') return targetType === 'agent'\n // Agent → Agent, Rule, or any logic node (not tool)\n if (sourceType === 'agent') return targetType !== 'tool'\n // Rule cannot be a source\n if (sourceType === 'rule') return false\n\n // Start → any (except start, already handled)\n if (sourceType === 'start') return true\n // IF/ELSE → any (has true-out and false-out)\n if (sourceType === 'if_else') return true\n // Question Classifier → any (has N category outputs)\n if (sourceType === 'question_classifier') return true\n // Iteration → any (has right-out and loop-out)\n if (sourceType === 'iteration') return true\n\n // Standard logic nodes (code, http_request, template_transform,\n // knowledge_base, parameter_extractor, variable_assigner,\n // variable_aggregator, document_extractor, list_operator,\n // iteration_start) → any valid target\n if (isLogicNodeType(sourceType)) return true\n\n return false\n },\n [getNode]\n )\n\n const onNodesDelete = useCallback(\n (deletedNodes: Node[]) => {\n storeTakeSnapshot()\n // Deletion is handled by React Flow — snapshot taken for undo\n void deletedNodes\n },\n [storeTakeSnapshot]\n )\n\n // ==========================================================================\n // Edge mid-point node insertion (Dify-style + button)\n // ==========================================================================\n\n // Keep the ref in sync with the latest closure\n insertNodeOnEdgeRef.current = useCallback(\n (edgeId: string, nodeType: WorkflowNodeType, position: { x: number; y: number }) => {\n if (!isLogicNodeType(nodeType)) return\n\n storeTakeSnapshot()\n\n const config = createDefaultLogicNodeConfig(nodeType)\n if (!config) return\n\n const newNodeId = crypto.randomUUID()\n const newNode: Node = {\n id: newNodeId,\n type: nodeType,\n position: { x: position.x - 130, y: position.y - 40 },\n data: {\n config,\n label: nodeType.replace(/_/g, ' ').replace(/\\b\\w/g, (character) => character.toUpperCase()),\n onEdit: handleEditLogicNode,\n },\n }\n\n setNodes((currentNodes) => [...currentNodes, newNode])\n\n setEdges((currentEdges) => {\n const originalEdge = currentEdges.find((edge) => edge.id === edgeId)\n if (!originalEdge) return currentEdges\n\n const edgesWithoutOriginal = currentEdges.filter((edge) => edge.id !== edgeId)\n\n const sourceToNewEdge: Edge = {\n id: crypto.randomUUID(),\n source: originalEdge.source,\n target: newNodeId,\n sourceHandle: originalEdge.sourceHandle,\n targetHandle: 'left-in',\n type: 'default',\n animated: true,\n data: {\n label: (originalEdge.data as Record<string, unknown> | undefined)?.label as string | undefined,\n onInsertNode: insertNodeOnEdge,\n },\n style: { stroke: GRAPH_ACTIVE_EDGE_COLOR, strokeWidth: 2 },\n markerEnd: { type: MarkerType.ArrowClosed, color: GRAPH_ACTIVE_EDGE_COLOR },\n }\n\n const newToTargetEdge: Edge = {\n id: crypto.randomUUID(),\n source: newNodeId,\n target: originalEdge.target,\n sourceHandle: 'right-out',\n targetHandle: originalEdge.targetHandle,\n type: 'default',\n animated: true,\n data: { onInsertNode: insertNodeOnEdge },\n style: { stroke: GRAPH_ACTIVE_EDGE_COLOR, strokeWidth: 2 },\n markerEnd: { type: MarkerType.ArrowClosed, color: GRAPH_ACTIVE_EDGE_COLOR },\n }\n\n return [...edgesWithoutOriginal, sourceToNewEdge, newToTargetEdge]\n })\n },\n [storeTakeSnapshot, setNodes, setEdges, handleEditLogicNode, insertNodeOnEdge]\n )\n\n // ==========================================================================\n // Context menus (Dify-style right-click menus)\n // ==========================================================================\n\n type ContextMenuState = {\n type: 'node' | 'panel' | 'selection'\n position: { x: number; y: number }\n flowPosition?: { x: number; y: number }\n targetId?: string\n } | null\n\n const [contextMenu, setContextMenu] = useState<ContextMenuState>(null)\n\n const handleNodeContextMenu = useCallback(\n (event: React.MouseEvent, node: Node) => {\n event.preventDefault()\n if (Date.now() - lastContextMenuCloseRef.current < 50) return\n setContextMenu({\n type: 'node',\n position: { x: event.clientX, y: event.clientY },\n targetId: node.id,\n })\n },\n []\n )\n\n const handlePaneContextMenu = useCallback(\n (event: MouseEvent | React.MouseEvent) => {\n event.preventDefault()\n if (Date.now() - lastContextMenuCloseRef.current < 50) return\n const flowPos = screenToFlowPosition({ x: event.clientX, y: event.clientY })\n setContextMenu({\n type: 'panel',\n position: { x: event.clientX, y: event.clientY },\n flowPosition: flowPos,\n })\n },\n [screenToFlowPosition]\n )\n\n const handleSelectionContextMenu = useCallback(\n (event: MouseEvent | React.MouseEvent) => {\n event.preventDefault()\n if (Date.now() - lastContextMenuCloseRef.current < 50) return\n setContextMenu({\n type: 'selection',\n position: { x: event.clientX, y: event.clientY },\n })\n },\n []\n )\n\n // Anti-race-condition guard: prevent context menu from re-opening immediately\n // after a close (mousedown close fires, then contextmenu event re-opens)\n const lastContextMenuCloseRef = useRef<number>(0)\n\n const closeContextMenu = useCallback(() => {\n setContextMenu((previous) => {\n if (previous !== null) {\n lastContextMenuCloseRef.current = Date.now()\n }\n return null\n })\n }, [])\n\n // Close context menu on pane/node/edge click or canvas move\n const handlePaneClick = useCallback(() => { closeContextMenu() }, [closeContextMenu])\n const handleNodeClick = useCallback(() => { closeContextMenu() }, [closeContextMenu])\n const handleEdgeClick = useCallback(() => { closeContextMenu() }, [closeContextMenu])\n\n // Logic node editing: derive the editing node's config from current nodes\n const editingLogicNode = useMemo(() => {\n if (!editingLogicNodeId) return null\n const node = nodes.find((matchingNode) => matchingNode.id === editingLogicNodeId)\n if (!node) return null\n const nodeData = node.data as Record<string, unknown>\n const config = nodeData.config as LogicNodeConfig\n const label = (nodeData.label as string) ?? ''\n return { nodeId: editingLogicNodeId, config, label }\n }, [editingLogicNodeId, nodes])\n\n const handleSaveLogicNodeConfig = useCallback((nodeId: string, updatedConfig: LogicNodeConfig) => {\n storeTakeSnapshot()\n setNodes((currentNodes) =>\n currentNodes.map((node) => {\n if (node.id !== nodeId) return node\n const updatedData: Record<string, unknown> = { ...node.data, config: updatedConfig }\n // Sync data.label when group config label changes\n if (updatedConfig.type === 'group' && 'label' in updatedConfig) {\n updatedData.label = updatedConfig.label\n }\n return { ...node, data: updatedData }\n })\n )\n setEditingLogicNodeId(null)\n }, [setNodes, storeTakeSnapshot])\n\n return (\n <>\n <div className=\"relative h-full w-full\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onNodesDelete={onNodesDelete}\n onNodeDragStart={onNodeDragStart}\n onPaneClick={handlePaneClick}\n onNodeClick={handleNodeClick}\n onEdgeClick={handleEdgeClick}\n onNodeContextMenu={handleNodeContextMenu}\n onPaneContextMenu={handlePaneContextMenu}\n onSelectionContextMenu={handleSelectionContextMenu}\n isValidConnection={isValidConnection}\n nodeTypes={mergedNodeTypes}\n edgeTypes={edgeTypes}\n defaultEdgeOptions={DEFAULT_EDGE_OPTIONS}\n connectionLineComponent={CustomConnectionLine}\n panOnDrag={controlMode === 'hand' ? true : [1, 2]}\n selectionOnDrag={controlMode === 'pointer'}\n snapToGrid\n snapGrid={SNAP_GRID}\n fitView\n fitViewOptions={{ padding: 0.2 }}\n minZoom={0.3}\n maxZoom={1.5}\n defaultViewport={{ x: 0, y: 0, zoom: 0.8 }}\n proOptions={{ hideAttribution: true }}\n deleteKeyCode={['Backspace', 'Delete']}\n connectionLineStyle={{ stroke: GRAPH_ACTIVE_EDGE_COLOR, strokeWidth: 2 }}\n >\n <Background\n variant={BackgroundVariant.Dots}\n gap={20}\n size={1}\n className=\"!bg-transparent\"\n />\n {showMinimap && (\n <MiniMap\n nodeColor={getMinimapNodeColor}\n maskColor=\"rgba(0, 0, 0, 0.08)\"\n className=\"!rounded-lg !border-white/30 !shadow-lg !backdrop-blur-xl dark:!border-white/10 [&]:!bg-white/50 dark:[&]:!bg-gray-900/60\"\n style={{ '--xy-minimap-background-color': 'transparent' } as React.CSSProperties}\n pannable\n zoomable\n />\n )}\n </ReactFlow>\n\n {/* Draggable floating command bar — outside ReactFlow so backdrop-filter works */}\n <DraggableCommandBar\n zoomIn={zoomIn}\n zoomOut={zoomOut}\n onFitView={handleFitView}\n onUndo={storeUndo}\n onRedo={storeRedo}\n canUndo={canUndo}\n canRedo={canRedo}\n controlMode={controlMode}\n onControlModeChange={setControlMode}\n showMinimap={showMinimap}\n onToggleMinimap={() => setShowMinimap((previous) => !previous)}\n cardDisplayMode={cardDisplayMode}\n onToggleCardDisplayMode={() =>\n setCardDisplayMode((previous) => (previous === 'detailed' ? 'compact' : 'detailed'))\n }\n layoutDirection={layoutDirection}\n onLayoutDirectionChange={handleLayoutDirectionChange}\n showShortcuts={showShortcuts}\n onToggleShortcuts={() => setShowShortcuts((previous) => !previous)}\n onCloseShortcuts={() => setShowShortcuts(false)}\n tWorkflow={tWorkflow}\n />\n\n {/* Right-click context menus (Dify-style) */}\n {contextMenu?.type === 'node' && contextMenu.targetId && (\n <NodeContextMenu\n position={contextMenu.position}\n targetId={contextMenu.targetId}\n onClose={closeContextMenu}\n onEdit={contextMenuEditNode}\n onDuplicate={contextMenuDuplicateNode}\n onCopy={contextMenuCopyNode}\n onDelete={contextMenuDeleteNode}\n />\n )}\n {contextMenu?.type === 'panel' && contextMenu.flowPosition && (\n <PanelContextMenu\n position={contextMenu.position}\n flowPosition={contextMenu.flowPosition}\n onClose={closeContextMenu}\n onPaste={contextMenuPaste}\n onSelectAll={handleSelectAll}\n onFitView={handleFitView}\n onAddNote={contextMenuAddNote}\n hasClipboardContent={hasClipboardContent}\n />\n )}\n {contextMenu?.type === 'selection' && (\n <SelectionContextMenu\n position={contextMenu.position}\n onClose={closeContextMenu}\n onCopy={contextMenuCopySelection}\n onDuplicate={contextMenuDuplicateSelection}\n onDelete={contextMenuDeleteSelection}\n onGroupSelected={contextMenuGroupSelected}\n onAlign={contextMenuAlignNodes}\n onDistribute={contextMenuDistributeNodes}\n />\n )}\n </div>\n\n {renderAgentDrawer?.({\n agent: selectedAgent,\n models,\n open: drawerOpen || isCreatingAgent,\n isCreateMode: isCreatingAgent,\n onClose: () => {\n closeDrawerAction()\n setSelectedAgentId(null)\n if (isCreatingAgent) onCancelCreateAgent?.()\n },\n onSaved: () => {\n closeDrawerAction()\n setSelectedAgentId(null)\n if (isCreatingAgent) onCancelCreateAgent?.()\n onAgentSaved?.()\n },\n })}\n\n <LogicNodeDrawer\n onSave={(nodeId, config) => {\n handleSaveLogicNodeConfig(nodeId, config)\n closeDrawerAction()\n setEditingLogicNodeId(null)\n }}\n entities={allEntities}\n />\n </>\n )\n}\n\n// ============================================================================\n// Wrapper with ReactFlowProvider\n// ============================================================================\n\nexport function WorkflowCanvas(props: WorkflowCanvasProps) {\n return (\n <ReactFlowProvider>\n <WorkflowCanvasInner {...props} />\n </ReactFlowProvider>\n )\n}\n","import { createContext, useContext, useMemo } from 'react'\nimport type { AgentModel, AgentRule, Subworkflow, Workflow, WorkflowGraph } from './contracts'\nimport type { AgentWithPrompts } from './types'\n\ntype WorkspaceBootstrapPayload = {\n workflow: Workflow | null\n graph: WorkflowGraph | null\n agents: AgentWithPrompts[]\n models: AgentModel[]\n tools: Subworkflow[]\n rules: AgentRule[]\n}\n\ntype LambdaEnvelope<T> = {\n success: boolean\n data?: T\n error?: string\n}\n\ntype WorkflowBuilderClient = {\n publishableKey: string\n getWorkspaceBootstrap: (workflowId: string) => Promise<WorkspaceBootstrapPayload>\n}\n\ntype WorkflowBuilderProviderProps = {\n publishableKey: string\n children: React.ReactNode\n}\n\nfunction tryDecodeBase64Url(value: string): string | null {\n try {\n const normalized = value.replace(/-/g, '+').replace(/_/g, '/')\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')\n if (typeof atob === 'function') return atob(padded)\n } catch {\n return null\n }\n return null\n}\n\nfunction extractApiBaseFromPublishableKey(publishableKey: string): string | null {\n const directUrl = publishableKey.match(/https?:\\/\\/[^\\s|,;]+/i)?.[0]\n if (directUrl) return directUrl.replace(/\\/$/, '')\n\n const segments = publishableKey.split(/[.:_-]/).filter(Boolean)\n for (const segment of segments) {\n const decoded = tryDecodeBase64Url(segment)\n if (decoded && /^https?:\\/\\//i.test(decoded)) {\n return decoded.replace(/\\/$/, '')\n }\n }\n\n return null\n}\n\nfunction resolveWorkflowApiBaseUrl(publishableKey: string): string {\n const fromKey = extractApiBaseFromPublishableKey(publishableKey)\n if (fromKey) return fromKey\n throw new Error('Invalid publishable key: missing workflow API host.')\n}\n\nasync function fetchWorkflowApiData<T>(publishableKey: string, path: string): Promise<T> {\n const response = await fetch(`${resolveWorkflowApiBaseUrl(publishableKey)}${path}`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${publishableKey}`,\n 'X-Workflow-Key': publishableKey,\n 'Content-Type': 'application/json',\n },\n })\n\n const json = await response.json() as LambdaEnvelope<T>\n if (!response.ok || !json.success || !json.data) {\n throw new Error(json.error ?? `Workflow API request failed (${response.status})`)\n }\n return json.data\n}\n\nconst WorkflowBuilderContext = createContext<WorkflowBuilderClient | null>(null)\n\nexport function WorkflowBuilderProvider({\n publishableKey,\n children,\n}: WorkflowBuilderProviderProps) {\n const client = useMemo<WorkflowBuilderClient>(() => ({\n publishableKey,\n getWorkspaceBootstrap: async (workflowId: string) => {\n const [workflow, agents, models, tools, rules] = await Promise.all([\n fetchWorkflowApiData<Workflow>(publishableKey, `/workflows/${encodeURIComponent(workflowId)}`),\n fetchWorkflowApiData<Array<{ agentId: string; id?: string; name: string; order?: number }>>(publishableKey, '/agents/configs'),\n fetchWorkflowApiData<AgentModel[]>(publishableKey, '/agents/models'),\n fetchWorkflowApiData<Subworkflow[]>(publishableKey, '/agents/tools'),\n fetchWorkflowApiData<AgentRule[]>(publishableKey, '/rules'),\n ])\n\n return {\n workflow,\n graph: workflow.graph ?? null,\n agents: agents.map((agent) => ({\n ...agent,\n promptCount: 0,\n activePromptVersion: 0,\n })),\n models,\n tools,\n rules,\n }\n },\n }), [publishableKey])\n\n return (\n <WorkflowBuilderContext.Provider value={client}>\n {children}\n </WorkflowBuilderContext.Provider>\n )\n}\n\nexport function useWorkflowBuilderClient(): WorkflowBuilderClient {\n const context = useContext(WorkflowBuilderContext)\n if (!context) {\n throw new Error('useWorkflowBuilderClient must be used within WorkflowBuilderProvider')\n }\n return context\n}\n\nexport function useWorkflowBuilderClientOptional(): WorkflowBuilderClient | null {\n return useContext(WorkflowBuilderContext)\n}\n\nexport type {\n WorkspaceBootstrapPayload,\n WorkflowBuilderClient,\n WorkflowBuilderProviderProps,\n}\n","import { useEffect, useMemo, useState, type ComponentProps } from 'react'\nimport { NextIntlClientProvider } from 'next-intl'\nimport { WorkflowCanvas as BuilderWorkflowCanvas } from './components/canvas/workflow-canvas'\nimport { useWorkflowBuilderClientOptional } from './workflow-provider'\nimport type { WorkflowGraph } from './contracts'\n\ntype BuilderCanvasProps = ComponentProps<typeof BuilderWorkflowCanvas>\n\nexport type WorkspaceProps = {\n locale?: string\n messages?: Record<string, unknown>\n className?: string\n workflowId?: string\n} & Partial<BuilderCanvasProps>\n\nexport function Workspace({\n locale = 'en',\n messages = {},\n className,\n workflowId,\n ...canvasProps\n}: WorkspaceProps) {\n const workflowBuilderClient = useWorkflowBuilderClientOptional()\n const [bootstrapGraph, setBootstrapGraph] = useState<WorkflowGraph | null>(null)\n const [bootstrapAgents, setBootstrapAgents] = useState<NonNullable<BuilderCanvasProps['agents']>>([])\n const [bootstrapModels, setBootstrapModels] = useState<NonNullable<BuilderCanvasProps['models']>>([])\n const [bootstrapTools, setBootstrapTools] = useState<NonNullable<BuilderCanvasProps['tools']>>([])\n const [bootstrapRules, setBootstrapRules] = useState<NonNullable<BuilderCanvasProps['rules']>>([])\n\n const shouldBootstrapFromProvider = useMemo(\n () => Boolean(workflowId && (!canvasProps.agents || !canvasProps.models)),\n [workflowId, canvasProps.agents, canvasProps.models],\n )\n\n useEffect(() => {\n if (!shouldBootstrapFromProvider || !workflowId || !workflowBuilderClient) {\n return\n }\n\n void workflowBuilderClient.getWorkspaceBootstrap(workflowId)\n .then((payload) => {\n setBootstrapGraph(payload.graph)\n setBootstrapAgents(payload.agents)\n setBootstrapModels(payload.models)\n setBootstrapTools(payload.tools)\n setBootstrapRules(payload.rules)\n })\n .catch(() => {\n // Keep previous behavior/style: render canvas with existing props on bootstrap failures.\n })\n }, [shouldBootstrapFromProvider, workflowId, workflowBuilderClient])\n\n const resolvedGraph = canvasProps.initialGraph ?? bootstrapGraph\n const resolvedAgents = canvasProps.agents ?? bootstrapAgents\n const resolvedModels = canvasProps.models ?? bootstrapModels\n const resolvedTools = canvasProps.tools ?? bootstrapTools\n const resolvedRules = canvasProps.rules ?? bootstrapRules\n\n return (\n <div className={className ?? 'h-full w-full'}>\n <NextIntlClientProvider\n locale={locale}\n messages={messages}\n getMessageFallback={({ namespace, key }) => (namespace ? `${namespace}.${key}` : key)}\n onError={() => {}}\n >\n <BuilderWorkflowCanvas\n {...canvasProps}\n initialGraph={resolvedGraph}\n agents={resolvedAgents}\n models={resolvedModels}\n tools={resolvedTools}\n rules={resolvedRules}\n />\n </NextIntlClientProvider>\n </div>\n )\n}\n","/**\n * Model provider icons for AWS Bedrock models.\n * Anthropic (Claude), Amazon (Nova), Meta (Llama).\n */\n\ntype IconProps = { className?: string }\n\nexport function AnthropicModelIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Anthropic\">\n <path d=\"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z\" />\n </svg>\n )\n}\n\nexport function AmazonNovaIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Amazon Nova\">\n {/* Stylized \"A\" arrow — Amazon-inspired */}\n <path d=\"M12 2L3 20h3.5l1.8-4.5h7.4L17.5 20H21L12 2Zm-2.2 11L12 7.5l2.2 5.5H9.8Z\" fill=\"currentColor\" />\n <path d=\"M2 21c3.5 1.5 7.5 2 10 2s6.5-.5 10-2\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.6\" />\n </svg>\n )\n}\n\nexport function MetaLlamaIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Meta\">\n <path d=\"M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z\" />\n </svg>\n )\n}\n\nexport function OpenAIModelIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className={className} aria-label=\"OpenAI\">\n <path d=\"M14.949 6.547a3.94 3.94 0 0 0-.348-3.273 4.11 4.11 0 0 0-4.4-1.934A4.1 4.1 0 0 0 8.423.2 4.15 4.15 0 0 0 6.305.086a4.1 4.1 0 0 0-1.891.948 4.04 4.04 0 0 0-1.158 1.753 4.1 4.1 0 0 0-1.563.679A4 4 0 0 0 .554 4.72a3.99 3.99 0 0 0 .502 4.731 3.94 3.94 0 0 0 .346 3.274 4.11 4.11 0 0 0 4.402 1.933c.382.425.852.764 1.377.995.526.231 1.095.35 1.67.346 1.78.002 3.358-1.132 3.901-2.804a4.1 4.1 0 0 0 1.563-.68 4 4 0 0 0 1.14-1.253 3.99 3.99 0 0 0-.506-4.716m-6.097 8.406a3.05 3.05 0 0 1-1.945-.694l.096-.054 3.23-1.838a.53.53 0 0 0 .265-.455v-4.49l1.366.778q.02.011.025.035v3.722c-.003 1.653-1.361 2.992-3.037 2.996m-6.53-2.75a2.95 2.95 0 0 1-.36-2.01l.095.057L5.29 12.09a.53.53 0 0 0 .527 0l3.949-2.246v1.555a.05.05 0 0 1-.022.041L6.473 13.3c-1.454.826-3.311.335-4.15-1.098m-.85-6.94A3.02 3.02 0 0 1 3.07 3.949v3.785a.51.51 0 0 0 .262.451l3.93 2.237-1.366.779a.05.05 0 0 1-.048 0L2.585 9.342a2.98 2.98 0 0 1-1.113-4.094zm11.216 2.571L8.747 5.576l1.362-.776a.05.05 0 0 1 .048 0l3.265 1.86a3 3 0 0 1 1.173 1.207 2.96 2.96 0 0 1-.27 3.2 3.05 3.05 0 0 1-1.36.997V8.279a.52.52 0 0 0-.276-.445m1.36-2.015-.097-.057-3.226-1.855a.53.53 0 0 0-.53 0L6.249 6.153V4.598a.04.04 0 0 1 .019-.04L9.533 2.7a3.07 3.07 0 0 1 3.257.139c.474.325.843.778 1.066 1.303.223.526.289 1.103.191 1.664zM5.503 8.575 4.139 7.8a.05.05 0 0 1-.026-.037V4.049c0-.57.166-1.127.476-1.607s.752-.864 1.275-1.105a3.08 3.08 0 0 1 3.234.41l-.096.054-3.23 1.838a.53.53 0 0 0-.265.455zm.742-1.577 1.758-1 1.762 1v2l-1.755 1-1.762-1z\" />\n </svg>\n )\n}\n\nexport function GoogleGeminiIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Google Gemini\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2Z\" fill=\"#4285F4\" opacity=\"0.15\" />\n <path d=\"M12 2.5c5.25 0 9.5 4.25 9.5 9.5s-4.25 9.5-9.5 9.5S2.5 17.25 2.5 12 6.75 2.5 12 2.5Z\" stroke=\"#4285F4\" strokeWidth=\"1\" fill=\"none\" />\n <path d=\"M12 7L8 12l4 5 4-5-4-5Z\" fill=\"#4285F4\" />\n <path d=\"M12 7L8 12l4 5\" fill=\"#34A853\" />\n </svg>\n )\n}\n\n/** Returns the icon component and color for a model ID */\nexport function getModelIcon(modelId: string): {\n IconComponent: (props: IconProps) => React.ReactNode\n color: string\n providerLabel: string\n} {\n if (modelId.startsWith('anthropic.')) {\n return { IconComponent: AnthropicModelIcon, color: 'text-amber-600 dark:text-amber-400', providerLabel: 'Anthropic' }\n }\n if (modelId.startsWith('amazon.')) {\n return { IconComponent: AmazonNovaIcon, color: 'text-orange-500 dark:text-orange-400', providerLabel: 'Amazon' }\n }\n if (modelId.startsWith('meta.')) {\n return { IconComponent: MetaLlamaIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Meta' }\n }\n if (modelId.startsWith('google.')) {\n return { IconComponent: GoogleGeminiIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Google' }\n }\n if (modelId.startsWith('openai.')) {\n return { IconComponent: OpenAIModelIcon, color: 'text-emerald-500 dark:text-emerald-400', providerLabel: 'OpenAI' }\n }\n // fallback\n return { IconComponent: AnthropicModelIcon, color: 'text-gray-500 dark:text-gray-400', providerLabel: 'Custom' }\n}\n","import { useState, useMemo, useCallback, useEffect } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { CpuChipIcon } from '@heroicons/react/24/outline'\nimport { getFrameworkMeta, FRAMEWORK_META, getCompatibleModels, isModelCompatibleWithFramework, type AgentFramework } from '../icons/agent-framework-icons'\nimport { getModelIcon } from '../icons/model-provider-icons'\nimport { WorkspaceDrawer } from './workspace-drawer'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { useDrawerStore } from '../../store/drawer-store'\nimport type { AgentWithPrompts } from '../../types'\nimport type { AgentModel } from '../../contracts'\n\ntype AgentDrawerProps = {\n onSaved?: () => void\n}\n\ntype TabId = 'config' | 'results'\n\nfunction StatusBadge({ status }: { status: string }) {\n const colorMap: Record<string, string> = {\n pending: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300',\n running: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300',\n success: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300',\n error: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300',\n }\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold ${colorMap[status] ?? colorMap.pending}`}>\n {status}\n </span>\n )\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction OutputCard({ label, value }: { label: string; value: unknown }) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n const isLong = typeof displayValue === 'string' && displayValue.length > 120\n\n return (\n <div className=\"rounded-xl border border-white/20 bg-white/40 p-3 dark:border-white/10 dark:bg-white/5\">\n <p className=\"mb-1 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {label}\n </p>\n {isLong ? (\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap text-xs text-gray-800 dark:text-gray-200\">\n {displayValue}\n </pre>\n ) : (\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">{displayValue}</p>\n )}\n </div>\n )\n}\n\n/* Agent profile header — lorelei/notionists avatar with glow, badges, model info */\nfunction AgentProfileHeader({ agent, models, t, selectedModelId, setSelectedModelId, selectedFramework, temperature, setTemperature, elo, setElo, onChanged }: {\n agent: AgentWithPrompts; models: AgentModel[]; t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework\n temperature: number; setTemperature: (value: number) => void\n elo: number; setElo: (value: number) => void\n onChanged: () => void\n}) {\n const modelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId ?? '—'\n const avatarUrl = (agent as Record<string, unknown>).avatar as string | undefined\n const frameworkMeta = getFrameworkMeta(selectedFramework)\n\n // Derive difficulty tier from current ELO (reactive to slider changes)\n const tierInfo = getEloTier(elo)\n const difficultyConfig: Record<string, { color: string; labelKey: string }> = {\n beginner: { color: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400', labelKey: 'agentDrawer.tierBeginner' },\n intermediate: { color: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400', labelKey: 'agentDrawer.tierIntermediate' },\n advanced: { color: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400', labelKey: 'agentDrawer.tierAdvanced' },\n expert: { color: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400', labelKey: 'agentDrawer.tierExpert' },\n }\n const levelConfig = difficultyConfig[tierInfo.tierKey]\n\n return (\n <div className=\"relative overflow-hidden bg-gradient-to-br from-indigo-500/20 via-purple-500/10 to-transparent px-6 pb-6 pt-4 dark:from-indigo-500/10 dark:via-purple-500/5\">\n {/* Level badge — derived from ELO, updates with slider */}\n {levelConfig && (\n <div className=\"mb-4 flex justify-center\">\n <span className={`${levelConfig.color} rounded-full px-4 py-1.5 text-xs font-bold shadow-sm transition-colors`}>\n {t(levelConfig.labelKey)}\n </span>\n </div>\n )}\n\n {/* Avatar with glow ring */}\n <div className=\"mb-4 flex justify-center\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-br from-purple-500 to-blue-500 opacity-40 blur-lg\" />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={agent.name}\n loading=\"lazy\"\n className=\"relative h-20 w-20 rounded-full bg-white object-cover shadow-xl ring-4 ring-white dark:bg-gray-800 dark:ring-gray-800\"\n />\n ) : (\n <div className=\"relative flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-xl ring-4 ring-white dark:ring-gray-800\">\n <CpuChipIcon className=\"h-10 w-10 text-white\" />\n </div>\n )}\n {/* Chip badge */}\n <div className=\"absolute -bottom-1 -right-1 flex h-6 w-6 items-center justify-center rounded-full bg-indigo-500 ring-2 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n </div>\n </div>\n\n {/* Name */}\n <h3 className=\"mb-2 text-center text-lg font-bold text-gray-900 dark:text-white\">\n {agent.name}\n </h3>\n\n {/* Role badge */}\n {agent.role && (\n <div className=\"mb-3 flex justify-center\">\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-white/60 px-3 py-1.5 text-xs font-medium text-gray-600 ring-1 ring-gray-200/50 dark:bg-gray-800/60 dark:text-gray-400 dark:ring-gray-700/50\">\n <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M6 6V5a3 3 0 013-3h2a3 3 0 013 3v1h2a2 2 0 012 2v3.57A22.952 22.952 0 0110 13a22.95 22.95 0 01-8-1.43V8a2 2 0 012-2h2zm2-1a1 1 0 011-1h2a1 1 0 011 1v1H8V5zm1 5a1 1 0 011-1h.01a1 1 0 110 2H10a1 1 0 01-1-1z\" clipRule=\"evenodd\" />\n <path d=\"M2 13.692V16a2 2 0 002 2h12a2 2 0 002-2v-2.308A24.974 24.974 0 0110 15c-2.796 0-5.487-.46-8-1.308z\" />\n </svg>\n {agent.role}\n </span>\n </div>\n )}\n\n {/* Model + ELO row */}\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"inline-flex items-center gap-1.5 rounded bg-white/50 px-2.5 py-1 text-[10px] text-gray-600 dark:bg-gray-800/50 dark:text-gray-400\">\n <CpuChipIcon className=\"h-3 w-3\" />\n <span className=\"font-semibold\">{modelName}</span>\n </div>\n {elo != null && (\n <div className=\"inline-flex items-center gap-1 rounded bg-white/50 px-2 py-1 text-[10px] text-gray-600 dark:bg-gray-800/50 dark:text-gray-400\">\n <span className=\"opacity-60\">ELO:</span>\n <span className=\"font-bold tabular-nums\">{elo}</span>\n </div>\n )}\n </div>\n\n {/* Framework badge */}\n <div className=\"mt-3 flex justify-center\">\n <span className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-[10px] font-semibold ${frameworkMeta.badgeColor}`}>\n <frameworkMeta.IconComponent className=\"h-3.5 w-3.5\" />\n {frameworkMeta.label}\n </span>\n </div>\n\n {/* ELO capability breakdown — interactive sliders */}\n <AgentCapabilityCard elo={elo} setElo={setElo} models={models} selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId} temperature={temperature} setTemperature={setTemperature} onChanged={onChanged} t={t} />\n\n {/* Prompt version + count */}\n <div className=\"mt-2 flex items-center justify-center gap-2 text-[10px] text-gray-400 dark:text-gray-500\">\n <span>v{agent.activePromptVersion}</span>\n <span>·</span>\n <span>{agent.promptCount} prompt{agent.promptCount === 1 ? '' : 's'}</span>\n </div>\n </div>\n )\n}\n\n/*\n ELO tier definitions — maps ELO ranges to model families, tokens, autonomy.\n Each provider family has models sorted by capability (low → high).\n*/\nconst MODEL_FAMILIES: Record<string, Array<{ prefix: string; maxTokens: number; contextWindow: string }>> = {\n anthropic: [\n { prefix: 'anthropic.claude-haiku', maxTokens: 8192, contextWindow: '200K' },\n { prefix: 'anthropic.claude-sonnet', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'anthropic.claude-opus', maxTokens: 32768, contextWindow: '1M' },\n ],\n amazon: [\n { prefix: 'amazon.nova-lite', maxTokens: 5120, contextWindow: '300K' },\n { prefix: 'amazon.nova-pro', maxTokens: 5120, contextWindow: '300K' },\n ],\n google: [\n { prefix: 'google.gemini-3-flash', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'google.gemini-3-1-pro', maxTokens: 32768, contextWindow: '1M' },\n ],\n meta: [\n { prefix: 'meta.llama', maxTokens: 8192, contextWindow: '128K' },\n ],\n openai: [\n { prefix: 'openai.gpt-5-mini', maxTokens: 16384, contextWindow: '1M' },\n { prefix: 'openai.gpt-5-v', maxTokens: 32768, contextWindow: '1M' },\n ],\n}\n\nfunction getProviderFromModelId(modelId: string): string {\n if (modelId.startsWith('anthropic.')) return 'anthropic'\n if (modelId.startsWith('amazon.')) return 'amazon'\n if (modelId.startsWith('meta.')) return 'meta'\n return 'anthropic'\n}\n\nfunction getEloTier(elo: number): {\n tierKey: string; autonomyKey: string\n color: string; barColor: string\n autonomyPercent: number; costPerTask: string\n familyIndex: number; temperature: number\n} {\n if (elo < 1200) return {\n tierKey: 'beginner', autonomyKey: 'autonomyLow',\n color: 'text-cyan-500', barColor: 'from-cyan-400 to-cyan-500',\n autonomyPercent: 25, costPerTask: '$0.005',\n familyIndex: 0, temperature: 0.7,\n }\n if (elo < 1600) return {\n tierKey: 'intermediate', autonomyKey: 'autonomyMedium',\n color: 'text-pink-500', barColor: 'from-pink-400 to-pink-500',\n autonomyPercent: 50, costPerTask: '$0.15',\n familyIndex: 1, temperature: 0.5,\n }\n if (elo < 2000) return {\n tierKey: 'advanced', autonomyKey: 'autonomyHigh',\n color: 'text-amber-500', barColor: 'from-amber-400 to-amber-500',\n autonomyPercent: 75, costPerTask: '$0.50',\n familyIndex: 1, temperature: 0.4,\n }\n return {\n tierKey: 'expert', autonomyKey: 'autonomyFull',\n color: 'text-emerald-500', barColor: 'from-emerald-400 to-emerald-500',\n autonomyPercent: 100, costPerTask: '$1.50',\n familyIndex: 2, temperature: 0.3,\n }\n}\n\ntype CapabilityCardProps = {\n elo: number\n setElo: (value: number) => void\n models: AgentModel[]\n selectedModelId: string\n setSelectedModelId: (id: string) => void\n temperature: number\n setTemperature: (value: number) => void\n onChanged: () => void\n t: (key: string) => string\n}\n\nfunction AgentCapabilityCard({ elo, setElo, models, selectedModelId, setSelectedModelId, temperature, setTemperature, onChanged, t }: CapabilityCardProps) {\n const tierInfo = getEloTier(elo)\n const eloPercent = Math.min(((elo - 800) / (2400 - 800)) * 100, 100)\n\n const provider = getProviderFromModelId(selectedModelId)\n const family = MODEL_FAMILIES[provider] ?? MODEL_FAMILIES.anthropic\n\n // When ELO slider changes, auto-select the right model in the family and adjust temperature\n const handleEloChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const newElo = parseInt(event.target.value, 10)\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n\n // Find the actual model in the models array that matches this prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // When autonomy segment is clicked, jump to that tier's ELO midpoint\n const handleAutonomyClick = useCallback((level: number) => {\n const eloMap: Record<number, number> = { 25: 1000, 50: 1400, 75: 1800, 100: 2200 }\n const newElo = eloMap[level] ?? 1000\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // Resolve current model info\n const currentFamilyEntry = family.find((entry) => selectedModelId.startsWith(entry.prefix)) ?? family[0]\n const currentModelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId\n\n return (\n <div className=\"mx-4 mt-4 overflow-hidden rounded-xl border border-gray-200/30 bg-white/40 dark:border-white/10 dark:bg-white/5\">\n {/* ELO slider */}\n <div className=\"px-4 pt-3 pb-2\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{t('agentDrawer.capabilityRating')}</span>\n <div className=\"flex items-baseline gap-1\">\n <span className={`text-lg font-bold tabular-nums ${tierInfo.color}`}>{elo}</span>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">ELO</span>\n </div>\n </div>\n {/* Interactive ELO slider */}\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={`h-full rounded-full bg-gradient-to-r ${tierInfo.barColor} transition-all duration-300`}\n style={{ width: `${eloPercent}%` }}\n />\n {[1200, 1600, 2000].map((boundary) => (\n <div\n key={boundary}\n className=\"absolute top-0 h-full w-px bg-gray-400/40 dark:bg-gray-500/40\"\n style={{ left: `${((boundary - 800) / (2400 - 800)) * 100}%` }}\n />\n ))}\n </div>\n <input\n type=\"range\"\n min=\"800\"\n max=\"2400\"\n step=\"50\"\n value={elo}\n onChange={handleEloChange}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n />\n <style>{`input[type=\"range\"]::-webkit-slider-thumb { background: ${\n elo < 1200 ? '#06b6d4' : elo < 1600 ? '#ec4899' : elo < 2000 ? '#f59e0b' : '#10b981'\n }; box-shadow: 0 0 6px ${\n elo < 1200 ? 'rgba(6,182,212,0.5)' : elo < 1600 ? 'rgba(236,72,153,0.5)' : elo < 2000 ? 'rgba(245,158,11,0.5)' : 'rgba(16,185,129,0.5)'\n }; }`}</style>\n </div>\n <div className=\"mt-0.5 flex justify-between text-[8px] text-gray-400 dark:text-gray-500\">\n <span>800</span>\n <span>1200</span>\n <span>1600</span>\n <span>2000</span>\n <span>2400</span>\n </div>\n </div>\n\n {/* Derived stats grid */}\n <div className=\"grid grid-cols-3 gap-px border-t border-gray-200/30 bg-gray-200/30 dark:border-white/10 dark:bg-white/10\">\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.model')}</p>\n <p className=\"truncate text-xs font-semibold text-gray-900 dark:text-white\">{currentModelName}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.maxTokens')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.maxTokens.toLocaleString()}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.context')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.contextWindow}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.temperature')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{temperature.toFixed(2)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomy')}</p>\n <p className={`text-xs font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.costPerTask')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{tierInfo.costPerTask}</p>\n </div>\n </div>\n\n {/* Clickable autonomy bar */}\n <div className=\"border-t border-gray-200/30 bg-white/60 px-4 py-2.5 dark:border-white/10 dark:bg-gray-900/60\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomyLevel')}</span>\n <span className={`text-[10px] font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</span>\n </div>\n <div className=\"flex gap-1\">\n {[\n { level: 25, label: 'Low' },\n { level: 50, label: 'Med' },\n { level: 75, label: 'High' },\n { level: 100, label: 'Full' },\n ].map(({ level }) => (\n <button\n key={level}\n type=\"button\"\n onClick={() => handleAutonomyClick(level)}\n className={`h-2 flex-1 rounded-full transition-all ${\n level <= tierInfo.autonomyPercent\n ? `bg-gradient-to-r ${tierInfo.barColor} hover:opacity-80`\n : 'bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600'\n }`}\n />\n ))}\n </div>\n <div className=\"mt-1 flex justify-between text-[7px] text-gray-400 dark:text-gray-500\">\n <span>{t('agentDrawer.autonomyLow')}</span>\n <span>{t('agentDrawer.autonomyMedium')}</span>\n <span>{t('agentDrawer.autonomyHigh')}</span>\n <span>{t('agentDrawer.autonomyFull')}</span>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ConfigTab({ agent, models, t, selectedModelId, setSelectedModelId, selectedFramework, setSelectedFramework, temperature, setTemperature, dirty, markDirty, markSaved }: {\n agent: AgentWithPrompts; models: AgentModel[]; t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework; setSelectedFramework: (fw: AgentFramework) => void\n temperature: number; setTemperature: (value: number) => void\n dirty: boolean; markDirty: () => void; markSaved: () => void\n}) {\n const [promptText, setPromptText] = useState((agent.systemPrompt as string) ?? '')\n\n const handleTemperatureChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setTemperature(parseFloat(event.target.value))\n markDirty()\n }, [])\n\n const handlePromptChange = useCallback((event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setPromptText(event.target.value)\n markDirty()\n }, [])\n\n const handleSave = useCallback(() => {\n markSaved()\n }, [markSaved])\n\n const temperaturePercent = temperature * 100\n const isPrecise = temperature <= 0.3\n const isBalanced = temperature > 0.3 && temperature <= 0.7\n const isCreative = temperature > 0.7\n\n const frameworkKeys = Object.keys(FRAMEWORK_META) as AgentFramework[]\n const compatibleModels = getCompatibleModels(models, selectedFramework)\n\n // When framework changes and current model is incompatible, auto-select first compatible\n const handleFrameworkChange = useCallback((newFramework: AgentFramework) => {\n setSelectedFramework(newFramework)\n if (!isModelCompatibleWithFramework(selectedModelId, newFramework)) {\n const compatible = getCompatibleModels(models, newFramework)\n if (compatible.length > 0) {\n setSelectedModelId(compatible[0].id)\n }\n }\n markDirty()\n }, [selectedModelId, models, setSelectedFramework, setSelectedModelId, markDirty])\n\n return (\n <div className=\"space-y-5 p-4\">\n {/* Framework selector — choose first, it filters models */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.framework')}</label>\n <div className=\"flex flex-wrap gap-1.5\">\n {frameworkKeys.map((key) => {\n const meta = FRAMEWORK_META[key]\n const isSelected = key === selectedFramework\n const compatCount = getCompatibleModels(models, key).length\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => handleFrameworkChange(key)}\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[10px] font-semibold transition-all ${\n isSelected\n ? `${meta.badgeColor} ring-1 ring-current/20`\n : 'bg-gray-100 text-gray-500 hover:bg-gray-200 dark:bg-white/5 dark:text-gray-400 dark:hover:bg-white/10'\n }`}\n >\n <meta.IconComponent className=\"h-3.5 w-3.5\" />\n {meta.label}\n <span className=\"ml-0.5 text-[8px] opacity-60\">{compatCount}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Model selector grid — filtered by framework */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.model')}\n {compatibleModels.length < models.length && (\n <span className=\"ml-1.5 text-[10px] font-normal text-gray-400 dark:text-gray-500\">\n ({compatibleModels.length}/{models.length})\n </span>\n )}\n </label>\n <div className=\"grid grid-cols-2 gap-2\">\n {models.map((model) => {\n const isSelected = model.id === selectedModelId\n const isCompatible = isModelCompatibleWithFramework(model.id, selectedFramework)\n const { IconComponent, color, providerLabel } = getModelIcon(model.id)\n return (\n <button\n key={model.id}\n type=\"button\"\n disabled={!isCompatible}\n onClick={() => { setSelectedModelId(model.id); markDirty() }}\n className={`flex items-center gap-2.5 rounded-xl border px-3 py-2.5 text-left transition-all ${\n !isCompatible\n ? 'cursor-not-allowed border-gray-200/30 opacity-35 dark:border-white/5'\n : isSelected\n ? 'border-indigo-500/50 bg-indigo-50/50 ring-1 ring-indigo-500/30 dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-gray-200/50 bg-gray-50/50 hover:border-gray-300 dark:border-white/10 dark:bg-white/5 dark:hover:border-white/20'\n }`}\n >\n <IconComponent className={`h-5 w-5 flex-shrink-0 ${isSelected && isCompatible ? color : 'text-gray-400 dark:text-gray-500'}`} />\n <div className=\"min-w-0\">\n <p className={`truncate text-xs font-semibold ${isSelected && isCompatible ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-300'}`}>\n {model.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">{providerLabel}</p>\n </div>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Temperature slider */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.temperature')}</label>\n <span className=\"text-sm font-bold tabular-nums text-gray-900 dark:text-white\">\n {temperature.toFixed(2)}\n </span>\n </div>\n {/* Visual gradient bar behind the range input */}\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className=\"h-full rounded-full transition-all duration-300 ease-out\"\n style={{\n width: `${temperaturePercent}%`,\n background: `linear-gradient(90deg, #3b82f6, #8b5cf6 50%, #ec4899)`,\n }}\n />\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={temperature}\n onChange={handleTemperatureChange}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent [&::-webkit-slider-thumb]:h-5 [&::-webkit-slider-thumb]:w-5 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n style={{\n // Thumb color based on temperature zone\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ['--thumb-color' as string]: isPrecise ? '#3b82f6' : isBalanced ? '#8b5cf6' : '#ec4899',\n }}\n />\n <style>{`\n input[type=\"range\"]::-webkit-slider-thumb {\n background: ${isPrecise ? '#3b82f6' : isBalanced ? '#8b5cf6' : '#ec4899'};\n box-shadow: 0 0 8px ${isPrecise ? 'rgba(59,130,246,0.5)' : isBalanced ? 'rgba(139,92,246,0.5)' : 'rgba(236,72,153,0.5)'};\n }\n `}</style>\n </div>\n <div className=\"mt-1 flex items-center justify-between\">\n <span className={`text-[10px] font-medium transition-colors ${isPrecise ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500'}`}>\n {t('agentDrawer.precise')}\n </span>\n <span className={`text-[10px] font-medium transition-colors ${isBalanced ? 'text-purple-500' : 'text-gray-400 dark:text-gray-500'}`}>\n {t('agentDrawer.balanced')}\n </span>\n <span className={`text-[10px] font-medium transition-colors ${isCreative ? 'text-pink-500' : 'text-gray-400 dark:text-gray-500'}`}>\n {t('agentDrawer.creative')}\n </span>\n </div>\n </div>\n\n {/* System prompt — editable textarea */}\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.systemPrompt')}</label>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {promptText.length} chars\n </span>\n {dirty && (\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-md bg-gradient-to-r from-indigo-500 to-purple-500 px-2.5 py-1 text-[10px] font-semibold text-white shadow-sm transition-all hover:from-indigo-600 hover:to-purple-600\"\n >\n {t('agentDrawer.save')}\n </button>\n )}\n {!dirty && promptText.length > 0 && (\n <span className=\"text-[10px] font-medium text-emerald-500\">{t('agentDrawer.saved')}</span>\n )}\n </div>\n </div>\n <textarea\n value={promptText}\n onChange={handlePromptChange}\n rows={8}\n className=\"w-full resize-y rounded-lg border border-gray-200/50 bg-gray-50/50 px-3 py-2.5 font-mono text-xs leading-relaxed text-gray-700 outline-none transition-colors placeholder:text-gray-400 focus:border-indigo-300/50 focus:ring-1 focus:ring-indigo-300/30 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500 dark:focus:border-indigo-500/30 dark:focus:ring-indigo-500/20\"\n placeholder={t('agentDrawer.systemPromptPlaceholder')}\n />\n </div>\n </div>\n )\n}\n\nfunction ResultsTab({ agentId, t }: { agentId: string; t: ReturnType<typeof useTranslations> }) {\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const agentResult = useMemo(() => {\n return nodeResults[agentId] ?? null\n }, [nodeResults, agentId])\n\n if (!agentResult) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noResults')}</p>\n </div>\n )\n }\n\n const outputs = isRecord(agentResult.data) ? agentResult.data : null\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.status')}</span>\n <StatusBadge status={agentResult.status} />\n </div>\n {agentResult.durationMs != null && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.duration')}: {formatDuration(agentResult.durationMs)}\n </span>\n )}\n </div>\n\n {agentResult.error && (\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-3 dark:border-red-900/30 dark:bg-red-900/10\">\n <p className=\"text-xs font-medium text-red-800 dark:text-red-300\">{agentResult.error}</p>\n </div>\n )}\n\n {outputs && Object.keys(outputs).length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.outputVariables')}\n </h4>\n {Object.entries(outputs).map(([key, value]) => (\n <OutputCard key={key} label={key} value={value} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport function AgentDrawer({ onSaved }: AgentDrawerProps) {\n const t = useTranslations('agents.workflow')\n\n // Read open state + data from drawer store\n const activeDrawer = useDrawerStore((s) => s.activeDrawer)\n const agentData = useDrawerStore((s) => s.agentData)\n const closeDrawer = useDrawerStore((s) => s.closeDrawer)\n\n const open = activeDrawer === 'agent'\n console.log('[AgentDrawer] activeDrawer:', activeDrawer, 'agentData:', agentData?.agent?.name ?? 'null')\n const agent = agentData?.agent ?? null\n const models = agentData?.models ?? []\n const isCreateMode = agentData?.isCreateMode ?? false\n\n // Local editable state — synced when agent changes\n const [activeTab, setActiveTab] = useState<TabId>('config')\n const [selectedModelId, setSelectedModelId] = useState('')\n const [selectedFramework, setSelectedFramework] = useState<string>('custom')\n const [temperature, setTemperature] = useState(0.7)\n const [elo, setElo] = useState(1000)\n const [saved, setSaved] = useState(true)\n\n const agentId = agent?.agentId ?? agent?.id ?? ''\n useEffect(() => {\n if (!agent) return\n setSelectedModelId(agent.modelId ?? models[0]?.id ?? '')\n setSelectedFramework(String((agent as Record<string, unknown>).framework ?? 'custom'))\n setTemperature(agent.temperature ?? 0.7)\n setElo(Number((agent as Record<string, unknown>).elo ?? 1000))\n setSaved(!isCreateMode)\n setActiveTab('config')\n }, [agentId])\n\n const dirty = !saved\n const markDirty = useCallback(() => setSaved(false), [])\n const markSaved = useCallback(() => setSaved(true), [])\n\n const handleClose = useCallback(() => {\n closeDrawer()\n }, [closeDrawer])\n\n const handleMarkSaved = useCallback(() => {\n markSaved()\n onSaved?.()\n }, [markSaved, onSaved])\n\n if (!agent) return null\n\n const tabs = (\n <div className=\"flex border-b border-white/20 dark:border-white/10\">\n {(['config', 'results'] as const).map((tab) => (\n <button\n key={tab}\n type=\"button\"\n onClick={() => setActiveTab(tab)}\n className={`flex-1 px-4 py-2 text-xs font-medium transition-colors ${\n activeTab === tab\n ? 'border-b-2 border-blue-500 text-blue-600 dark:text-blue-400'\n : 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'\n }`}\n >\n {t(tab === 'config' ? 'agentDrawer.configTab' : 'agentDrawer.resultsTab')}\n </button>\n ))}\n </div>\n )\n\n return (\n <WorkspaceDrawer\n open={open}\n onClose={handleClose}\n title={agent.name}\n subtitle={agent.role ?? ''}\n gradient=\"from-indigo-500 to-purple-600\"\n icon={<CpuChipIcon className=\"h-6 w-6 text-white\" />}\n tabs={tabs}\n >\n {/* Agent profile card header — kori-erp style with avatar + glow */}\n <AgentProfileHeader agent={agent} models={models} t={t} selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId} selectedFramework={selectedFramework as AgentFramework} temperature={temperature} setTemperature={setTemperature} elo={elo} setElo={setElo} onChanged={markDirty} />\n\n {/* Tabs content */}\n {activeTab === 'config' ? (\n <ConfigTab agent={agent} models={models} t={t} selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId} selectedFramework={selectedFramework as AgentFramework} setSelectedFramework={(fw: AgentFramework) => setSelectedFramework(fw)} temperature={temperature} setTemperature={setTemperature} dirty={dirty} markDirty={markDirty} markSaved={handleMarkSaved} />\n ) : (\n <ResultsTab agentId={agent.agentId} t={t} />\n )}\n </WorkspaceDrawer>\n )\n}\n","/**\n * Subworkflow Drawer Store (Zustand)\n * ===================================\n * State management for the subworkflow drawer — tracks the\n * selected subworkflow, editable fields, and dirty state.\n */\n\nimport { create } from 'zustand'\nimport type { Subworkflow } from '../contracts'\n\ntype SubworkflowStoreState = {\n /** The subworkflow being edited (null = drawer closed) */\n tool: Subworkflow | null\n /** Whether the drawer is open */\n open: boolean\n /** Editable fields */\n name: string\n category: string\n description: string\n timeoutMs: number\n retryCount: number\n /** Whether there are unsaved changes */\n dirty: boolean\n}\n\ntype SubworkflowStoreActions = {\n /** Open the drawer with a subworkflow (empty toolId = create mode) */\n openDrawer: (tool: Subworkflow) => void\n /** Close the drawer and reset state */\n closeDrawer: () => void\n /** Update a field and mark dirty */\n setName: (name: string) => void\n setCategory: (category: string) => void\n setDescription: (description: string) => void\n setTimeoutMs: (timeoutMs: number) => void\n setRetryCount: (retryCount: number) => void\n /** Mark as dirty (e.g. when graph changes) */\n markDirty: () => void\n /** Mark as saved */\n markSaved: () => void\n}\n\nexport type SubworkflowStore = SubworkflowStoreState & SubworkflowStoreActions\n\nexport const useSubworkflowStore = create<SubworkflowStore>((set) => ({\n // State\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n\n // Actions\n openDrawer: (tool) => set({\n tool,\n open: true,\n name: tool.name ?? '',\n category: tool.category ?? 'external',\n description: String(tool.description ?? ''),\n timeoutMs: Number(tool.timeoutMs ?? 10000),\n retryCount: (tool as Record<string, unknown>).retryCount as number ?? 0,\n dirty: !tool.toolId,\n }),\n\n closeDrawer: () => set({\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n }),\n\n setName: (name) => set({ name, dirty: true }),\n setCategory: (category) => set({ category, dirty: true }),\n setDescription: (description) => set({ description, dirty: true }),\n setTimeoutMs: (timeoutMs) => set({ timeoutMs, dirty: true }),\n setRetryCount: (retryCount) => set({ retryCount, dirty: true }),\n markDirty: () => set({ dirty: true }),\n markSaved: () => set({ dirty: false }),\n}))\n","import { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport {\n ArrowPathRoundedSquareIcon,\n ArrowsPointingOutIcon as MaximizeIcon,\n ClockIcon,\n BoltIcon,\n ArrowsPointingInIcon,\n ArrowsPointingOutIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n} from '@heroicons/react/24/outline'\nimport { WorkspaceDrawer } from './workspace-drawer'\nimport { WorkflowCanvas } from '../canvas/workflow-canvas'\nimport { useSubworkflowStore } from '../../store/subworkflow-store'\nimport { CATEGORY_COLORS, CATEGORY_PILL_COLORS, ICON_MAP } from '../../constants'\nimport type { Subworkflow, WorkflowGraph } from '../../contracts'\n\ntype SubworkflowDrawerProps = {\n /** Called when save/create is clicked — receives the merged subworkflow with updated graph */\n onSaved?: (tool: Subworkflow) => void\n /** Called when maximize is clicked — navigate to full workflow editor */\n onMaximize?: (subworkflowId: string) => void\n}\n\nconst DEFAULT_SUBWORKFLOW_GRAPH: WorkflowGraph = {\n nodes: [\n { id: 'start', type: 'start', position: { x: 80, y: 200 }, data: { entityId: 'start', label: 'Start', config: { type: 'start', inputVariables: [] } } },\n { id: 'end', type: 'end', position: { x: 600, y: 200 }, data: { entityId: 'end', label: 'End', config: { type: 'end', outputVariables: [] } } },\n ],\n edges: [\n { id: 'e-start-end', source: 'start', target: 'end', sourceHandle: null, targetHandle: null },\n ],\n viewport: { x: 0, y: 0, zoom: 0.85 },\n}\n\n/* ─── Variable chips ─── */\nfunction VariableChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-teal-200/50 bg-teal-50/50 px-2 py-0.5 text-[10px] dark:border-teal-400/20 dark:bg-teal-400/10\">\n <span className=\"font-semibold text-teal-700 dark:text-teal-300\">{name}</span>\n <span className=\"text-teal-500/60 dark:text-teal-400/50\">: {type}</span>\n </span>\n )\n}\n\nfunction OutputChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-violet-200/50 bg-violet-50/50 px-2 py-0.5 text-[10px] dark:border-violet-400/20 dark:bg-violet-400/10\">\n <span className=\"font-semibold text-violet-700 dark:text-violet-300\">{name}</span>\n <span className=\"text-violet-500/60 dark:text-violet-400/50\">: {type}</span>\n </span>\n )\n}\n\n/* ─── Collapsible config sidebar ─── */\nfunction ConfigSection({ title, icon: Icon, defaultOpen = true, children }: {\n title: string\n icon: React.ComponentType<{ className?: string }>\n defaultOpen?: boolean\n children: React.ReactNode\n}) {\n const [open, setOpen] = useState(defaultOpen)\n return (\n <div className=\"border-b border-white/10\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left hover:bg-white/5\"\n >\n {open ? <ChevronDownIcon className=\"h-3 w-3 text-gray-400\" /> : <ChevronRightIcon className=\"h-3 w-3 text-gray-400\" />}\n <Icon className=\"h-3 w-3 text-gray-400\" />\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{title}</span>\n </button>\n {open && <div className=\"px-4 pb-3\">{children}</div>}\n </div>\n )\n}\n\nexport function SubworkflowDrawer({ onSaved, onMaximize }: SubworkflowDrawerProps) {\n const t = useTranslations('agents.workflow')\n\n // Read all state from Zustand store\n const tool = useSubworkflowStore((s) => s.tool)\n const open = useSubworkflowStore((s) => s.open)\n const name = useSubworkflowStore((s) => s.name)\n const category = useSubworkflowStore((s) => s.category)\n const description = useSubworkflowStore((s) => s.description)\n const timeoutMs = useSubworkflowStore((s) => s.timeoutMs)\n const retryCount = useSubworkflowStore((s) => s.retryCount)\n const dirty = useSubworkflowStore((s) => s.dirty)\n\n // Actions\n const setName = useSubworkflowStore((s) => s.setName)\n const setCategory = useSubworkflowStore((s) => s.setCategory)\n const setDescription = useSubworkflowStore((s) => s.setDescription)\n const setTimeoutMs = useSubworkflowStore((s) => s.setTimeoutMs)\n const setRetryCount = useSubworkflowStore((s) => s.setRetryCount)\n const markDirty = useSubworkflowStore((s) => s.markDirty)\n const markSaved = useSubworkflowStore((s) => s.markSaved)\n const closeDrawer = useSubworkflowStore((s) => s.closeDrawer)\n\n const isCreateMode = !tool?.toolId\n\n const initialGraph = useMemo<WorkflowGraph>(() => {\n const config = tool?.config as Record<string, unknown> | undefined\n if (config?.type === 'workflow' && config.graph) {\n return config.graph as WorkflowGraph\n }\n return DEFAULT_SUBWORKFLOW_GRAPH\n }, [tool])\n\n const latestGraphRef = useMemo(() => ({ current: initialGraph }), [initialGraph])\n\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n latestGraphRef.current = graph\n markDirty()\n }, [latestGraphRef, markDirty])\n\n const handleSave = useCallback(() => {\n markSaved()\n if (tool) {\n onSaved?.({\n ...tool,\n name,\n category,\n description,\n timeoutMs,\n config: { type: 'workflow', graph: latestGraphRef.current },\n })\n }\n }, [tool, onSaved, name, category, description, timeoutMs, latestGraphRef, markSaved])\n\n if (!tool) return null\n\n const categoryKey = (category ?? 'external') as keyof typeof CATEGORY_COLORS\n const gradient = tool.color ?? CATEGORY_COLORS[categoryKey] ?? CATEGORY_COLORS.external\n const categoryPill = CATEGORY_PILL_COLORS[categoryKey] ?? CATEGORY_PILL_COLORS.external\n const IconComponent = ICON_MAP[tool.icon ?? ''] ?? ArrowPathRoundedSquareIcon\n\n // Derive input/output variables from Start and End nodes in the graph\n const graph = latestGraphRef.current\n const startNode = graph.nodes.find((n) => n.type === 'start')\n const endNode = graph.nodes.find((n) => n.type === 'end')\n const startConfig = startNode?.data?.config as { inputVariables?: string[] } | undefined\n const endConfig = endNode?.data?.config as { outputVariables?: string[] } | undefined\n const inputVariables = (startConfig?.inputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n const outputVariables = (endConfig?.outputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n\n return (\n <WorkspaceDrawer\n open={open}\n onClose={closeDrawer}\n title={isCreateMode ? t('subworkflowDrawer.createTitle') : name}\n subtitle={t('subworkflowDrawer.subworkflow')}\n gradient=\"from-teal-500 to-cyan-600\"\n icon={<ArrowPathRoundedSquareIcon className=\"h-6 w-6 text-white\" />}\n maxWidth=\"max-w-6xl\"\n >\n <div className=\"flex h-[80vh] min-h-[600px]\">\n {/* ─── Left sidebar: config ─── */}\n <div className=\"flex w-72 flex-shrink-0 flex-col overflow-y-auto border-r border-white/10\">\n {/* Header / Name */}\n {isCreateMode ? (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <label className=\"mb-1 block text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('subworkflowDrawer.name')}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder={t('subworkflowDrawer.namePlaceholder')}\n autoFocus\n className=\"w-full rounded-lg border border-gray-200/50 bg-white/60 px-3 py-2 text-sm font-medium text-gray-900 outline-none placeholder:text-gray-400 focus:border-teal-300/50 focus:ring-1 focus:ring-teal-300/30 dark:border-white/10 dark:bg-white/5 dark:text-white dark:placeholder:text-gray-500\"\n />\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {['external', 'market', 'data', 'communication', 'analytics'].map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setCategory(cat)}\n className={`rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${\n cat === category\n ? `${CATEGORY_PILL_COLORS[cat] ?? CATEGORY_PILL_COLORS.external} ring-1 ring-current/20`\n : 'bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <IconComponent className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-bold text-gray-900 dark:text-white\">{name}</h3>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n <span className=\"inline-flex items-center rounded-full bg-teal-100 px-1.5 py-0.5 text-[8px] font-semibold text-teal-700 dark:bg-teal-400/15 dark:text-teal-400\">\n {t('subworkflowDrawer.subworkflow')}\n </span>\n <span className={`inline-flex items-center rounded-full px-1.5 py-0.5 text-[8px] font-medium ${categoryPill}`}>\n {category}\n </span>\n </div>\n </div>\n {onMaximize && tool.toolId && (\n <button\n type=\"button\"\n onClick={() => onMaximize(tool.toolId)}\n title={t('subworkflowDrawer.openFullEditor')}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-white/10 hover:text-teal-500 dark:hover:text-teal-400\"\n >\n <MaximizeIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Description */}\n <div className=\"border-b border-white/10 px-4 py-3\">\n <textarea\n value={description}\n onChange={(event) => setDescription(event.target.value)}\n rows={2}\n placeholder={t('subworkflowDrawer.descriptionPlaceholder')}\n className=\"w-full resize-none rounded-lg border border-gray-200/50 bg-gray-50/50 px-2.5 py-2 text-[11px] leading-relaxed text-gray-700 outline-none placeholder:text-gray-400 focus:border-teal-300/50 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500\"\n />\n </div>\n\n {/* Input variables */}\n <ConfigSection title={t('subworkflowDrawer.inputVariables')} icon={ArrowsPointingInIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {inputVariables.length > 0 ? inputVariables.map((variable) => (\n <VariableChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Output variables */}\n <ConfigSection title={t('subworkflowDrawer.outputVariables')} icon={ArrowsPointingOutIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {outputVariables.length > 0 ? outputVariables.map((variable) => (\n <OutputChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Execution settings */}\n <ConfigSection title={t('subworkflowDrawer.executionSettings')} icon={BoltIcon} defaultOpen={false}>\n <div className=\"mb-3\">\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"flex items-center gap-1 text-[10px] text-gray-600 dark:text-gray-400\">\n <ClockIcon className=\"h-3 w-3\" />\n {t('subworkflowDrawer.timeout')}\n </label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{(timeoutMs / 1000).toFixed(0)}s</span>\n </div>\n <input\n type=\"range\"\n min=\"1000\"\n max=\"30000\"\n step=\"1000\"\n value={timeoutMs}\n onChange={(event) => setTimeoutMs(parseInt(event.target.value, 10))}\n className=\"h-3 w-full cursor-pointer appearance-none rounded-full bg-gray-200 dark:bg-gray-700 [&::-webkit-slider-thumb]:h-3 [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-teal-500\"\n />\n </div>\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-[10px] text-gray-600 dark:text-gray-400\">{t('subworkflowDrawer.retries')}</label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{retryCount}</span>\n </div>\n <div className=\"flex gap-1\">\n {[0, 1, 2, 3].map((count) => (\n <button\n key={count}\n type=\"button\"\n onClick={() => setRetryCount(count)}\n className={`flex-1 rounded py-1 text-[10px] font-medium transition-all ${\n count === retryCount\n ? 'bg-teal-500 text-white'\n : 'bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {count}\n </button>\n ))}\n </div>\n </div>\n </ConfigSection>\n\n {/* Save button at bottom */}\n <div className=\"mt-auto border-t border-white/10 px-4 py-3\">\n {dirty ? (\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={isCreateMode && !name.trim()}\n className=\"w-full rounded-lg bg-gradient-to-r from-teal-500 to-cyan-500 py-2 text-xs font-semibold text-white shadow-sm transition-all hover:from-teal-600 hover:to-cyan-600 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isCreateMode ? t('subworkflowDrawer.create') : t('subworkflowDrawer.save')}\n </button>\n ) : (\n <div className=\"text-center text-[10px] font-medium text-emerald-500\">{t('subworkflowDrawer.saved')}</div>\n )}\n </div>\n </div>\n\n {/* ─── Right: Full interactive workflow canvas ─── */}\n <div className=\"flex-1\">\n <WorkflowCanvas\n initialGraph={initialGraph}\n agents={[]}\n models={[]}\n tools={[]}\n rules={[]}\n onGraphChange={handleGraphChange}\n />\n </div>\n </div>\n </WorkspaceDrawer>\n )\n}\n","/**\n * Pipeline Settings Drawer\n * ========================\n * Side drawer for editing workflow name and description.\n * Opened via useDrawerStore.openPipelineSettingsDrawer().\n */\n\nimport { useState, useEffect } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Cog6ToothIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormTextarea } from '@ui/index'\nimport { WorkspaceDrawer } from './workspace-drawer'\nimport { useDrawerStore } from '../../store/drawer-store'\n\ntype PipelineSettingsDrawerProps = {\n onSave: (name: string, description: string) => Promise<void>\n}\n\nexport function PipelineSettingsDrawer({ onSave }: PipelineSettingsDrawerProps) {\n const t = useTranslations('agents.workflow')\n\n const activeDrawer = useDrawerStore((s) => s.activeDrawer)\n const data = useDrawerStore((s) => s.pipelineSettingsData)\n const closeDrawer = useDrawerStore((s) => s.closeDrawer)\n\n const open = activeDrawer === 'pipeline-settings'\n\n const [nameValue, setNameValue] = useState('')\n const [descriptionValue, setDescriptionValue] = useState('')\n const [isSaving, setIsSaving] = useState(false)\n\n // Sync local state when store data changes\n useEffect(() => {\n if (data) {\n setNameValue(data.name)\n setDescriptionValue(data.description)\n }\n }, [data])\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault()\n const trimmedName = nameValue.trim()\n if (!trimmedName) return\n\n setIsSaving(true)\n try {\n await onSave(trimmedName, descriptionValue.trim())\n closeDrawer()\n } catch {\n // Parent handles error display — keep drawer open so user can retry\n } finally {\n setIsSaving(false)\n }\n }\n\n return (\n <WorkspaceDrawer\n open={open}\n onClose={closeDrawer}\n title={t('pipelineSettings')}\n subtitle={t('pipelineSettingsSubtitle')}\n icon={<Cog6ToothIcon className=\"h-5 w-5 text-white\" />}\n gradient=\"from-indigo-500 to-purple-600\"\n >\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <FormInput\n label={t('pipelineName')}\n value={nameValue}\n onValueChange={setNameValue}\n placeholder={t('pipelineNamePlaceholder')}\n required\n />\n\n <FormTextarea\n label={t('pipelineDescription')}\n value={descriptionValue}\n onValueChange={setDescriptionValue}\n placeholder={t('pipelineDescriptionPlaceholder')}\n rows={4}\n />\n\n <div className=\"pt-2\">\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n loadingText={t('saving')}\n >\n <CheckIcon className=\"h-4 w-4\" />\n {t('saveSettings')}\n </Button>\n </div>\n </form>\n </WorkspaceDrawer>\n )\n}\n","/**\n * Node Palette (Sidebar)\n * ======================\n * Draggable node templates for the workflow canvas.\n * Users drag items from here onto the React Flow canvas.\n *\n * Sections: Agents (indigo), Tools (teal), Rules (violet), Logic (subcategories)\n * Features: Collapsible sections, search/filter\n */\n\nimport { Children, useState, useMemo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport {\n CpuChipIcon,\n WrenchScrewdriverIcon,\n CommandLineIcon,\n AdjustmentsHorizontalIcon,\n BoltIcon,\n ChevronDownIcon,\n PlusIcon,\n CircleStackIcon,\n ArrowPathRoundedSquareIcon,\n} from '@heroicons/react/24/outline'\nimport type { Subworkflow, AgentTool, AgentRule, WorkflowNodeType } from '../../contracts'\nimport type { AgentWithPrompts, WorkflowEntityDefinition } from '../../types'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport { getEntityGradient, getEntityIcon } from '../../constants/entity-colors'\nimport { createDefaultLogicNodeConfig } from '../../utils/logic-node-defaults'\n\ntype NodePaletteProps = {\n agents: AgentWithPrompts[]\n tools: Subworkflow[]\n agentTools?: AgentTool[]\n rules: AgentRule[]\n entities?: WorkflowEntityDefinition[]\n onCreateAgent?: () => void\n onCreateTool?: () => void\n onCreateAgentTool?: () => void\n onCreateRule?: () => void\n}\n\nfunction onDragStart(\n event: React.DragEvent,\n nodeType: WorkflowNodeType,\n entityId: string,\n label: string,\n config?: string\n) {\n event.dataTransfer.setData('nodeType', nodeType)\n event.dataTransfer.setData('entityId', entityId)\n event.dataTransfer.setData('label', label)\n if (config) {\n event.dataTransfer.setData('config', config)\n }\n event.dataTransfer.effectAllowed = 'move'\n}\n\n// ============================================================================\n// Logic Node Items — organized by subcategory\n// ============================================================================\n\ntype LogicNodeItem = {\n nodeType: WorkflowNodeType\n nameKey: string\n descriptionKey: string\n subcategory: 'control_flow' | 'data_processing' | 'ai_ml' | 'annotation'\n}\n\nconst LOGIC_NODE_ITEMS: LogicNodeItem[] = [\n // Control Flow\n { nodeType: 'start', nameKey: 'startNode', descriptionKey: 'startNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'end', nameKey: 'endNode', descriptionKey: 'endNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'if_else', nameKey: 'ifElseNode', descriptionKey: 'ifElseNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration', nameKey: 'iterationNode', descriptionKey: 'iterationNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration_start', nameKey: 'iterationStartNode', descriptionKey: 'iterationStartNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'group', nameKey: 'groupNode', descriptionKey: 'groupNodeDescription', subcategory: 'control_flow' },\n\n // Data Processing\n { nodeType: 'code', nameKey: 'codeNode', descriptionKey: 'codeNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'http_request', nameKey: 'httpRequestNode', descriptionKey: 'httpRequestNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'template_transform', nameKey: 'templateTransformNode', descriptionKey: 'templateTransformNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_assigner', nameKey: 'variableAssignerNode', descriptionKey: 'variableAssignerNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_aggregator', nameKey: 'variableAggregatorNode', descriptionKey: 'variableAggregatorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'list_operator', nameKey: 'listOperatorNode', descriptionKey: 'listOperatorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'document_extractor', nameKey: 'documentExtractorNode', descriptionKey: 'documentExtractorNodeDescription', subcategory: 'data_processing' },\n\n // AI/ML\n { nodeType: 'knowledge_base', nameKey: 'knowledgeBaseNode', descriptionKey: 'knowledgeBaseNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'answer', nameKey: 'answerNode', descriptionKey: 'answerNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'question_classifier', nameKey: 'questionClassifierNode', descriptionKey: 'questionClassifierNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'parameter_extractor', nameKey: 'parameterExtractorNode', descriptionKey: 'parameterExtractorNodeDescription', subcategory: 'ai_ml' },\n\n // Annotation\n { nodeType: 'note', nameKey: 'noteNode', descriptionKey: 'noteNodeDescription', subcategory: 'annotation' },\n]\n\nconst SUBCATEGORY_LABELS: Record<string, string> = {\n control_flow: 'controlFlowSection',\n data_processing: 'dataProcessingSection',\n ai_ml: 'aiMlSection',\n annotation: 'annotationSection',\n}\n\ntype CollapsibleSectionProps = {\n title: string\n icon: React.ReactNode\n colorClass: string\n defaultOpen?: boolean\n count?: number\n onAdd?: () => void\n addLabel?: string\n children: React.ReactNode\n}\n\nfunction SectionHeader({ icon, title, colorClass, count, onAdd, addLabel, isOpen, onToggle }: {\n icon: React.ReactNode\n title: string\n colorClass: string\n count?: number\n onAdd?: () => void\n addLabel?: string\n isOpen: boolean\n onToggle: () => void\n}) {\n return (\n <div className=\"flex items-center justify-between px-4 py-2.5\">\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex flex-1 items-center gap-1.5 transition-colors\"\n >\n <span className={`flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-wider ${colorClass}`}>\n {icon}\n {title}\n {count !== undefined && (\n <span className=\"ml-1 rounded-full bg-gray-100 px-1.5 py-px text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n {count}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={`h-3 w-3 text-gray-400 transition-transform duration-200 ${isOpen ? '' : '-rotate-90'}`}\n />\n </button>\n {onAdd ? (\n <button\n type=\"button\"\n onClick={onAdd}\n title={addLabel}\n className={`rounded-md p-1 transition-colors hover:bg-gray-100 dark:hover:bg-white/10 ${colorClass}`}\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n )\n}\n\nfunction CollapsibleSection({ title, icon, colorClass, defaultOpen = true, count, onAdd, addLabel, children }: CollapsibleSectionProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const safeChildren = Children.toArray(children)\n\n return (\n <div className=\"border-t border-gray-200/40 dark:border-white/5\">\n <SectionHeader\n icon={icon}\n title={title}\n colorClass={colorClass}\n count={count}\n onAdd={onAdd}\n addLabel={addLabel}\n isOpen={isOpen}\n onToggle={() => setIsOpen((previous) => !previous)}\n />\n {isOpen ? (\n <div className=\"space-y-1.5 px-4 pb-3\">\n {safeChildren}\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction LogicNodeItemCard({ item, translationFunction }: { item: LogicNodeItem; translationFunction: ReturnType<typeof useTranslations> }) {\n const IconComponent = LOGIC_ICON_MAP[item.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[item.nodeType] ?? 'from-gray-400 to-gray-500'\n const defaultConfig = createDefaultLogicNodeConfig(item.nodeType)\n const configJson = defaultConfig ? JSON.stringify(defaultConfig) : undefined\n\n return (\n <div\n draggable\n onDragStart={(event) =>\n onDragStart(event, item.nodeType, item.nodeType, translationFunction(item.nameKey), configJson)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${gradient} shadow-sm`}>\n {IconComponent && <IconComponent className=\"h-3.5 w-3.5 text-white\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {translationFunction(item.nameKey)}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {translationFunction(item.descriptionKey)}\n </p>\n </div>\n </div>\n )\n}\n\nexport function NodePalette({ agents, tools, agentTools = [], rules, entities = [], onCreateAgent, onCreateTool, onCreateAgentTool, onCreateRule }: NodePaletteProps) {\n const t = useTranslations('agents.workflow')\n const [searchQuery, setSearchQuery] = useState('')\n\n const normalizedQuery = searchQuery.toLowerCase().trim()\n\n const filteredAgents = useMemo(\n () => normalizedQuery\n ? agents.filter((agent) =>\n agent.name.toLowerCase().includes(normalizedQuery) ||\n (agent.role ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agents,\n [agents, normalizedQuery]\n )\n\n const filteredTools = useMemo(\n () => normalizedQuery\n ? tools.filter((tool) =>\n tool.name.toLowerCase().includes(normalizedQuery) ||\n (tool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : tools,\n [tools, normalizedQuery]\n )\n\n const filteredAgentTools = useMemo(\n () => normalizedQuery\n ? agentTools.filter((agentTool) =>\n agentTool.name.toLowerCase().includes(normalizedQuery) ||\n (agentTool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agentTools,\n [agentTools, normalizedQuery]\n )\n\n const filteredRules = useMemo(\n () => normalizedQuery\n ? rules.filter((rule) =>\n rule.name.toLowerCase().includes(normalizedQuery)\n )\n : rules,\n [rules, normalizedQuery]\n )\n\n const entityTypes = useMemo(\n () => entities.map((entity) => ({\n id: entity.id,\n label: entity.label,\n description: entity.description,\n fieldCount: entity.fields.length,\n defaultLimit: entity.defaultLimit,\n fields: entity.fields,\n })),\n [entities]\n )\n\n const filteredEntityTypes = useMemo(\n () => normalizedQuery\n ? entityTypes.filter((entity) =>\n entity.label.toLowerCase().includes(normalizedQuery) ||\n entity.description.toLowerCase().includes(normalizedQuery) ||\n entity.id.toLowerCase().includes(normalizedQuery)\n )\n : entityTypes,\n [entityTypes, normalizedQuery]\n )\n\n const filteredLogicItems = useMemo(\n () => normalizedQuery\n ? LOGIC_NODE_ITEMS.filter((item) =>\n t(item.nameKey).toLowerCase().includes(normalizedQuery) ||\n t(item.descriptionKey).toLowerCase().includes(normalizedQuery)\n )\n : LOGIC_NODE_ITEMS,\n [normalizedQuery, t]\n )\n\n // Group filtered logic items by subcategory\n const groupedLogicItems = useMemo(() => {\n const groups: Record<string, LogicNodeItem[]> = {\n control_flow: [],\n data_processing: [],\n ai_ml: [],\n annotation: [],\n }\n for (const item of filteredLogicItems) {\n groups[item.subcategory].push(item)\n }\n return groups\n }, [filteredLogicItems])\n\n function renderLogicSubcategory(subcategory: string, items: LogicNodeItem[], isFirst: boolean) {\n if (items.length === 0) return null\n return (\n <div key={subcategory} className=\"space-y-1.5\">\n <p className={`${isFirst ? 'mt-1' : 'mt-2'} text-[9px] font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500`}>\n {t(SUBCATEGORY_LABELS[subcategory])}\n </p>\n {items.map((item) => (\n <LogicNodeItemCard key={item.nodeType} item={item} translationFunction={t} />\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"liquid-surface w-[260px] flex-shrink-0 overflow-y-auto rounded-none border-0 border-r border-gray-200/30 dark:border-white/5\">\n <div className=\"p-4 pb-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('palette')}\n </h3>\n {/* Search input */}\n <div className=\"mt-2\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.target.value)}\n placeholder={t('searchPalette')}\n className=\"liquid-surface w-full rounded-lg px-2.5 py-1.5 text-[11px] text-gray-900 placeholder-gray-400 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-white dark:placeholder-gray-500 dark:focus:ring-indigo-500/20\"\n />\n </div>\n </div>\n\n {/* Agents Section */}\n <CollapsibleSection\n title={t('agentsSection')}\n icon={<CpuChipIcon className=\"h-3 w-3\" />}\n colorClass=\"text-indigo-600 dark:text-indigo-400\"\n onAdd={onCreateAgent}\n addLabel={t('newAgent')}\n >\n {filteredAgents.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noAgents')}</p>\n ) : filteredAgents.map((agent) => (\n <div\n key={agent.agentId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'agent', agent.agentId, agent.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"relative flex-shrink-0\">\n {agent.avatar ? (\n <img src={agent.avatar as string} alt={agent.name} className=\"h-7 w-7 rounded-full bg-white shadow-sm ring-1 ring-gray-200/50 dark:bg-gray-800 dark:ring-white/10\" />\n ) : (\n <div className=\"flex h-7 w-7 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-sm\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"absolute -bottom-0.5 -right-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-indigo-500 ring-1.5 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-2 w-2 text-white\" />\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {agent.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {agent.role ?? agent.agentId}\n </p>\n </div>\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Agent Tools Section */}\n <CollapsibleSection\n title={t('agentToolsSection')}\n icon={<CommandLineIcon className=\"h-3 w-3\" />}\n colorClass=\"text-amber-600 dark:text-amber-400\"\n onAdd={onCreateAgentTool}\n addLabel={t('newAgentTool')}\n >\n {filteredAgentTools.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noAgentTools')}</p>\n ) : filteredAgentTools.map((agentTool) => (\n <div\n key={agentTool.agentToolId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'agent_tool', agentTool.agentToolId, agentTool.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-amber-400 to-orange-500 shadow-sm\">\n <CommandLineIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {agentTool.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {agentTool.category ?? 'custom'}\n </p>\n </div>\n {!agentTool.enabled && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n off\n </span>\n )}\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Subworkflows Section (formerly Tools) */}\n <CollapsibleSection\n title={t('subworkflowsSection')}\n icon={<ArrowPathRoundedSquareIcon className=\"h-3 w-3\" />}\n colorClass=\"text-teal-600 dark:text-teal-400\"\n onAdd={onCreateTool}\n addLabel={t('newSubworkflow')}\n >\n {filteredTools.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noSubworkflows')}</p>\n ) : filteredTools.map((tool) => (\n <div\n key={tool.toolId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'tool', tool.toolId, tool.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-teal-400 to-emerald-500 shadow-sm\">\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {tool.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {tool.category}\n </p>\n </div>\n {!tool.enabled && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n off\n </span>\n )}\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Rules Section */}\n <CollapsibleSection\n title={t('rulesSection')}\n icon={<AdjustmentsHorizontalIcon className=\"h-3 w-3\" />}\n colorClass=\"text-violet-600 dark:text-violet-400\"\n onAdd={onCreateRule}\n addLabel={t('newRule')}\n >\n {filteredRules.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noRules')}</p>\n ) : filteredRules.map((rule) => (\n <div\n key={rule.ruleId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'rule', rule.ruleId, rule.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-violet-400 to-purple-500 shadow-sm\">\n <AdjustmentsHorizontalIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {rule.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n P{String(rule.priority ?? '')}\n </p>\n </div>\n {!rule.enabled && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n off\n </span>\n )}\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Data Sources Section */}\n <CollapsibleSection\n title={t('dataSourcesSection')}\n icon={<CircleStackIcon className=\"h-3 w-3\" />}\n colorClass=\"text-blue-600 dark:text-blue-400\"\n count={filteredEntityTypes.length}\n >\n {filteredEntityTypes.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noDataSources')}</p>\n ) : filteredEntityTypes.map((entity) => {\n const defaultConfig = JSON.stringify({\n type: 'entity',\n entityMasterId: entity.id,\n selectedFields: entity.fields.map((field) => field.name),\n filterVariables: {},\n outputVariable: `${entity.label.replace(/\\s+/g, '')}Data`,\n limit: entity.defaultLimit,\n })\n const EntityIcon = getEntityIcon(entity.id)\n const entityGradient = getEntityGradient(entity.id)\n\n return (\n <div\n key={entity.id}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'entity', entity.id, entity.label, defaultConfig)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${entityGradient} shadow-sm`}>\n <EntityIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {entity.label}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {entity.fieldCount} {t('entityFieldsLabel')}\n </p>\n </div>\n </div>\n )\n })}\n </CollapsibleSection>\n\n {/* Logic Section — with subcategories */}\n <CollapsibleSection\n title={t('logicSection')}\n icon={<BoltIcon className=\"h-3 w-3\" />}\n colorClass=\"text-gray-600 dark:text-gray-400\"\n count={filteredLogicItems.length}\n >\n {renderLogicSubcategory('control_flow', groupedLogicItems.control_flow, true)}\n {renderLogicSubcategory('data_processing', groupedLogicItems.data_processing, false)}\n {renderLogicSubcategory('ai_ml', groupedLogicItems.ai_ml, false)}\n {renderLogicSubcategory('annotation', groupedLogicItems.annotation, false)}\n </CollapsibleSection>\n </div>\n )\n}\n","/**\n * Workflow List Bar\n * =================\n *\n * Horizontal tab bar above the workflow canvas showing all workflows.\n * Allows switching active workflow, creating new ones, deleting,\n * and converting a workflow into a reusable subworkflow.\n */\n\nimport { useTranslations } from 'next-intl'\nimport { PlusIcon, TrashIcon, ArrowPathRoundedSquareIcon } from '@heroicons/react/24/outline'\nimport type { Workflow } from '../../contracts'\n\ntype WorkflowListBarProps = {\n workflows: Workflow[]\n activeWorkflowId: string | null\n isLoading: boolean\n onSelect: (workflow: Workflow) => void\n onCreate: () => void\n onDelete: (workflowId: string, workflowName: string) => void\n onConvertToSubworkflow?: (workflow: Workflow) => void\n}\n\nfunction formatRelativeTime(dateString: string | undefined): string {\n if (!dateString) return ''\n const date = new Date(dateString)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMinutes = Math.floor(diffMs / 60_000)\n const diffHours = Math.floor(diffMs / 3_600_000)\n const diffDays = Math.floor(diffMs / 86_400_000)\n\n if (diffMinutes < 1) return 'just now'\n if (diffMinutes < 60) return `${diffMinutes}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n return `${diffDays}d ago`\n}\n\nexport function WorkflowListBar({\n workflows,\n activeWorkflowId,\n isLoading,\n onSelect,\n onCreate,\n onDelete,\n onConvertToSubworkflow,\n}: WorkflowListBarProps) {\n const tWorkflow = useTranslations('agents.workflow')\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 px-1 pb-3\">\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-2 overflow-x-auto px-1 pb-3 scrollbar-hide\">\n {workflows.map((workflow) => {\n const isActive = workflow.id === activeWorkflowId\n return (\n <div\n key={workflow.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(workflow)}\n onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onSelect(workflow) } }}\n className={`liquid-surface group relative flex shrink-0 cursor-pointer items-center gap-2.5 rounded-xl px-3.5 py-2 text-left transition-all duration-200 ${\n isActive\n ? 'liquid-surface-active'\n : 'hover:shadow-md'\n }`}\n style={isActive ? { '--glass-accent': '99, 102, 241' } as React.CSSProperties : undefined}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`truncate text-sm font-medium ${\n isActive\n ? 'text-indigo-700 dark:text-indigo-300'\n : 'text-gray-700 dark:text-gray-300'\n }`}>\n {workflow.name}\n </span>\n <span className=\"shrink-0 rounded-full bg-gray-100 px-1.5 py-0.5 text-[10px] font-medium text-gray-500 dark:bg-gray-800 dark:text-gray-400\">\n v{workflow.version}\n </span>\n {workflow.isDraft ? (\n <span className=\"shrink-0 rounded-full bg-amber-100 px-1.5 py-0.5 text-[10px] font-semibold text-amber-700 dark:bg-amber-900/30 dark:text-amber-300\">\n {tWorkflow('draftBadge')}\n </span>\n ) : (\n <span className=\"shrink-0 rounded-full bg-green-100 px-1.5 py-0.5 text-[10px] font-semibold text-green-700 dark:bg-green-900/30 dark:text-green-300\">\n {tWorkflow('published')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 text-[10px] text-gray-400 dark:text-gray-500\">\n {formatRelativeTime(typeof workflow.updatedAt === 'string' ? workflow.updatedAt : workflow.updatedAt.toISOString())}\n </p>\n </div>\n\n {/* Action buttons — visible on hover */}\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100\">\n {/* Convert to subworkflow */}\n {onConvertToSubworkflow && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onConvertToSubworkflow(workflow)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-teal-50 hover:text-teal-600 dark:hover:bg-teal-950/30 dark:hover:text-teal-400\"\n aria-label={`${tWorkflow('convertToSubworkflow')} ${workflow.name}`}\n title={tWorkflow('convertToSubworkflow')}\n >\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {/* Delete */}\n {workflows.length > 1 && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onDelete(workflow.id, workflow.name)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 dark:hover:bg-red-950/30 dark:hover:text-red-400\"\n aria-label={`${tWorkflow('deleteWorkflow')} ${workflow.name}`}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Create new workflow button */}\n <button\n type=\"button\"\n onClick={onCreate}\n className=\"liquid-surface flex shrink-0 items-center gap-1.5 rounded-xl !border-dashed px-3 py-2 text-xs font-medium text-gray-500 transition-all hover:shadow-md hover:text-indigo-600 dark:text-gray-400 dark:hover:text-indigo-400\"\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n {tWorkflow('newWorkflow')}\n </button>\n </div>\n )\n}\n","/**\n * Version History Panel\n * =====================\n * Side panel listing published versions of a workflow.\n * Shows version number, publication timestamp, publisher,\n * and node/edge counts. Provides preview (read-only overlay)\n * and restore (revert draft) actions per version.\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { ClockIcon, ArrowPathIcon, EyeIcon, XMarkIcon } from '@heroicons/react/24/outline'\n\ntype WorkflowVersion = {\n version: number\n publishedAt: string\n publishedBy: string\n nodeCount: number\n edgeCount: number\n}\n\ntype VersionHistoryPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n currentVersion: number\n onPreview: (version: WorkflowVersion) => void\n onRestore: (version: WorkflowVersion) => void\n fetchVersions?: (workflowId: string) => Promise<WorkflowVersion[]>\n}\n\nexport function VersionHistoryPanel({\n open,\n onClose,\n workflowId,\n currentVersion,\n onPreview,\n onRestore,\n fetchVersions,\n}: VersionHistoryPanelProps) {\n const translations = useTranslations('agents.workflow.versionHistory')\n const [versions, setVersions] = useState<WorkflowVersion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n const loadVersions = useCallback(async () => {\n if (!fetchVersions) return\n\n setIsLoading(true)\n setLoadError(null)\n\n try {\n const fetchedVersions = await fetchVersions(workflowId)\n setVersions(fetchedVersions)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to load versions'\n setLoadError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }, [fetchVersions, workflowId])\n\n useEffect(() => {\n if (open) {\n loadVersions()\n }\n }, [open, loadVersions])\n\n const formatTimestamp = useCallback((timestamp: string) => {\n try {\n const date = new Date(timestamp)\n return new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n } catch {\n return timestamp\n }\n }, [])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"version-history-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <ClockIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"version-history-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Version List */}\n <div className=\"flex-1 overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center py-12\" data-testid=\"version-history-loading\">\n <div className=\"h-6 w-6 animate-spin rounded-full border-2 border-blue-500 border-t-transparent\" />\n </div>\n )}\n\n {loadError && (\n <div className=\"px-4 py-8 text-center\" data-testid=\"version-history-error\">\n <p className=\"text-sm text-red-500 dark:text-red-400\">{loadError}</p>\n <button\n type=\"button\"\n onClick={loadVersions}\n className=\"mt-2 text-xs text-blue-600 hover:underline dark:text-blue-400\"\n >\n {translations('retry')}\n </button>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length === 0 && (\n <div className=\"px-4 py-12 text-center\" data-testid=\"version-history-empty\">\n <ClockIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noVersions')}\n </p>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length > 0 && (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {versions.map((version) => {\n const isCurrentVersion = version.version === currentVersion\n return (\n <div\n key={version.version}\n className={`px-4 py-3 transition-colors ${\n isCurrentVersion\n ? 'bg-blue-50 dark:bg-blue-500/10'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n data-testid={`version-entry-${version.version}`}\n >\n {/* Version Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n v{version.version}\n </span>\n {isCurrentVersion && (\n <span className=\"rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\">\n {translations('current')}\n </span>\n )}\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n <div>{formatTimestamp(version.publishedAt)}</div>\n <div className=\"mt-0.5\">\n {translations('publishedBy')}: {version.publishedBy}\n </div>\n <div className=\"mt-0.5\">\n {version.nodeCount} {translations('nodes')} / {version.edgeCount} {translations('edges')}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"mt-2 flex gap-2\">\n <button\n type=\"button\"\n onClick={() => onPreview(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-gray-300 px-2 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-700\"\n data-testid={`version-preview-${version.version}`}\n >\n <EyeIcon className=\"h-3 w-3\" />\n {translations('preview')}\n </button>\n {!isCurrentVersion && (\n <button\n type=\"button\"\n onClick={() => onRestore(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-blue-300 px-2 py-1 text-xs font-medium text-blue-600 transition-colors hover:bg-blue-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-500/10\"\n data-testid={`version-restore-${version.version}`}\n >\n <ArrowPathIcon className=\"h-3 w-3\" />\n {translations('restore')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport type { WorkflowVersion }\n","/**\n * Run Panel\n * =========\n * Bottom panel showing workflow execution progress.\n * Displays each node with a status icon (pending, running,\n * success, error), duration, and error messages.\n * Provides Run/Stop controls tied to the workflow store.\n */\n\nimport { useTranslations } from 'next-intl'\nimport {\n PlayIcon,\n StopIcon,\n CheckCircleIcon,\n XCircleIcon,\n ClockIcon,\n XMarkIcon,\n ChevronUpIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype RunPanelProps = {\n open: boolean\n onClose: () => void\n onRun: () => void\n onStop: () => void\n}\n\nconst STATUS_CONFIG = {\n pending: {\n icon: ClockIcon,\n color: 'text-gray-400 dark:text-gray-500',\n background: 'bg-gray-100 dark:bg-gray-800',\n label: 'pending',\n },\n running: {\n icon: SpinnerIcon,\n color: 'text-blue-500 dark:text-blue-400',\n background: 'bg-blue-50 dark:bg-blue-500/10',\n label: 'running',\n },\n success: {\n icon: CheckCircleIcon,\n color: 'text-green-500 dark:text-green-400',\n background: 'bg-green-50 dark:bg-green-500/10',\n label: 'success',\n },\n error: {\n icon: XCircleIcon,\n color: 'text-red-500 dark:text-red-400',\n background: 'bg-red-50 dark:bg-red-500/10',\n label: 'error',\n },\n} as const\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1000) {\n return `${durationMs}ms`\n }\n const seconds = (durationMs / 1000).toFixed(1)\n return `${seconds}s`\n}\n\nexport function RunPanel({ open, onClose, onRun, onStop }: RunPanelProps) {\n const translations = useTranslations('agents.workflow.runPanel')\n const nodes = useWorkflowStore((state) => state.nodes)\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n const startNode = nodes.find((node) => node.type === 'start')\n const hasEndNode = nodes.some((node) => node.type === 'end')\n const hasValidStartConfig = Boolean(\n startNode &&\n typeof startNode.data === 'object' &&\n startNode.data !== null &&\n 'config' in startNode.data &&\n startNode.data.config &&\n typeof (startNode.data.config as StartNodeConfig).type === 'string'\n )\n const canRun = hasValidStartConfig && hasEndNode\n\n if (!open) return null\n\n const executionNodes = nodes.filter((node) => node.type !== 'note')\n\n return (\n <div\n className=\"absolute bottom-0 left-0 right-0 z-40 border-t border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"run-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-100 px-4 py-2 dark:border-gray-800\">\n <div className=\"flex items-center gap-2\">\n <PlayIcon className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n {isRunning && (\n <span className=\"flex items-center gap-1 rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-blue-500\" />\n {translations('executing')}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {/* Run / Stop Buttons */}\n {isRunning ? (\n <button\n type=\"button\"\n onClick={onStop}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-red-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-red-600\"\n data-testid=\"run-panel-stop\"\n >\n <StopIcon className=\"h-3.5 w-3.5\" />\n {translations('stop')}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onRun}\n disabled={!canRun}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-green-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-green-600 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-green-500\"\n data-testid=\"run-panel-run\"\n >\n <PlayIcon className=\"h-3.5 w-3.5\" />\n {translations('run')}\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"run-panel-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* Node Execution List */}\n <div className=\"max-h-48 overflow-y-auto px-4 py-2\">\n {executionNodes.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {executionNodes.map((node) => {\n const result = nodeResults[node.id]\n const status = result?.status ?? 'pending'\n const statusConfig = STATUS_CONFIG[status]\n const StatusIconComponent = statusConfig.icon\n const nodeLabel =\n typeof node.data === 'object' && node.data !== null && 'label' in node.data\n ? String(node.data.label)\n : node.id\n\n return (\n <div\n key={node.id}\n className={`flex items-center gap-3 rounded-lg px-3 py-2 ${statusConfig.background}`}\n data-testid={`run-node-${node.id}`}\n >\n {/* Status Icon */}\n <StatusIconComponent className={`h-4 w-4 flex-shrink-0 ${statusConfig.color}`} />\n\n {/* Node Info */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {nodeLabel}\n </span>\n <span className=\"rounded bg-gray-200 px-1.5 py-0.5 text-[10px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {node.type}\n </span>\n </div>\n {result?.error && (\n <p className=\"mt-0.5 truncate text-xs text-red-500 dark:text-red-400\">\n {result.error}\n </p>\n )}\n </div>\n\n {/* Duration */}\n {result?.durationMs !== undefined && (\n <span className=\"flex-shrink-0 text-xs text-gray-500 dark:text-gray-400\">\n {formatDuration(result.durationMs)}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Inline spinner icon for running status (animated).\n */\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={`animate-spin ${className ?? ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity={0.25} />\n <path d=\"M12 2a10 10 0 0 1 10 10\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","/**\n * Variable Inspector\n * ==================\n * Side panel that analyzes variable flow through the workflow graph.\n * Walks nodes in topological order and infers input/output variables\n * from each node's config type. Shows a collapsible tree view per node.\n */\n\nimport { useMemo, useState, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { VariableIcon, XMarkIcon, ChevronRightIcon, ChevronDownIcon } from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport type { LogicNodeConfig } from '../../contracts'\nimport type { Node } from '@xyflow/react'\n\ntype VariableInspectorProps = {\n open: boolean\n onClose: () => void\n}\n\ntype VariableInfo = {\n name: string\n direction: 'input' | 'output'\n variableType: string\n}\n\ntype NodeVariableEntry = {\n nodeId: string\n nodeLabel: string\n nodeType: string\n variables: VariableInfo[]\n}\n\n/**\n * Performs a topological sort on the node graph using Kahn's algorithm.\n * Returns node IDs in execution order.\n */\nfunction topologicalSort(\n nodes: Node[],\n edges: Array<{ source: string; target: string }>,\n): string[] {\n const adjacencyList = new Map<string, string[]>()\n const inDegree = new Map<string, number>()\n\n for (const node of nodes) {\n adjacencyList.set(node.id, [])\n inDegree.set(node.id, 0)\n }\n\n for (const edge of edges) {\n const neighbors = adjacencyList.get(edge.source)\n if (neighbors) {\n neighbors.push(edge.target)\n }\n inDegree.set(edge.target, (inDegree.get(edge.target) ?? 0) + 1)\n }\n\n const queue: string[] = []\n for (const [nodeId, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(nodeId)\n }\n }\n\n const sorted: string[] = []\n while (queue.length > 0) {\n const currentNodeId = queue.shift()!\n sorted.push(currentNodeId)\n\n const neighbors = adjacencyList.get(currentNodeId) ?? []\n for (const neighborId of neighbors) {\n const updatedDegree = (inDegree.get(neighborId) ?? 1) - 1\n inDegree.set(neighborId, updatedDegree)\n if (updatedDegree === 0) {\n queue.push(neighborId)\n }\n }\n }\n\n // Add any remaining nodes (disconnected) at the end\n for (const node of nodes) {\n if (!sorted.includes(node.id)) {\n sorted.push(node.id)\n }\n }\n\n return sorted\n}\n\n/**\n * Infers input and output variables from a node's config.\n */\nfunction inferVariables(config: LogicNodeConfig | undefined, nodeType: string): VariableInfo[] {\n if (!config) {\n return []\n }\n\n const variables: VariableInfo[] = []\n\n switch (config.type) {\n case 'start':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'end':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n break\n\n case 'code':\n // Attempt to detect variables from code (simple heuristic)\n variables.push({ name: 'code_input', direction: 'input', variableType: config.language })\n variables.push({ name: 'code_output', direction: 'output', variableType: 'any' })\n break\n\n case 'http_request':\n variables.push({ name: 'url', direction: 'input', variableType: 'string' })\n variables.push({ name: 'response', direction: 'output', variableType: 'object' })\n if (config.body) {\n variables.push({ name: 'body', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'template_transform':\n variables.push({ name: 'template', direction: 'input', variableType: 'string' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'string' })\n }\n break\n\n case 'if_else':\n for (const condition of config.conditions) {\n if (condition.variable) {\n variables.push({ name: condition.variable, direction: 'input', variableType: 'any' })\n }\n }\n variables.push({ name: 'true_branch', direction: 'output', variableType: 'boolean' })\n variables.push({ name: 'false_branch', direction: 'output', variableType: 'boolean' })\n break\n\n case 'iteration':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n variables.push({ name: 'iteration_item', direction: 'output', variableType: 'any' })\n variables.push({ name: 'iteration_index', direction: 'output', variableType: 'number' })\n break\n\n case 'iteration_start':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n if (config.itemVariable) {\n variables.push({ name: config.itemVariable, direction: 'output', variableType: 'any' })\n }\n if (config.indexVariable) {\n variables.push({ name: config.indexVariable, direction: 'output', variableType: 'number' })\n }\n break\n\n case 'knowledge_base':\n variables.push({ name: 'query', direction: 'input', variableType: 'string' })\n variables.push({ name: 'results', direction: 'output', variableType: 'array' })\n break\n\n case 'answer':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n if (config.outputTemplate) {\n variables.push({ name: 'answer_template', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'question_classifier':\n variables.push({ name: 'question', direction: 'input', variableType: 'string' })\n for (const category of config.categories) {\n if (category.name) {\n variables.push({ name: `category_${category.name}`, direction: 'output', variableType: 'string' })\n }\n }\n break\n\n case 'parameter_extractor':\n variables.push({ name: 'input_text', direction: 'input', variableType: 'string' })\n for (const parameter of config.parameters) {\n if (parameter.name) {\n variables.push({ name: parameter.name, direction: 'output', variableType: parameter.type })\n }\n }\n break\n\n case 'variable_assigner':\n for (const assignment of config.assignments) {\n if (assignment.source) {\n variables.push({ name: assignment.source, direction: 'input', variableType: 'any' })\n }\n if (assignment.target) {\n variables.push({ name: assignment.target, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'variable_aggregator':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.aggregationMode })\n }\n break\n\n case 'document_extractor':\n variables.push({ name: 'document', direction: 'input', variableType: 'file' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.extractionMode })\n }\n break\n\n case 'list_operator':\n if (config.inputVariable) {\n variables.push({ name: config.inputVariable, direction: 'input', variableType: 'array' })\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'array' })\n }\n if (config.condition) {\n variables.push({ name: 'condition', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'note':\n // Notes have no variables\n break\n }\n\n return variables\n}\n\nexport function VariableInspector({ open, onClose }: VariableInspectorProps) {\n const translations = useTranslations('agents.workflow.variableInspector')\n const nodes = useWorkflowStore((state) => state.nodes)\n const edges = useWorkflowStore((state) => state.edges)\n\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set())\n\n const toggleNodeExpansion = useCallback((nodeId: string) => {\n setExpandedNodes((current) => {\n const updated = new Set(current)\n if (updated.has(nodeId)) {\n updated.delete(nodeId)\n } else {\n updated.add(nodeId)\n }\n return updated\n })\n }, [])\n\n const nodeVariableEntries: NodeVariableEntry[] = useMemo(() => {\n // Filter out note nodes\n const relevantNodes = nodes.filter((node) => node.type !== 'note')\n\n // Get topological order\n const sortedNodeIds = topologicalSort(relevantNodes, edges)\n\n // Build entries\n const entries: NodeVariableEntry[] = []\n\n for (const nodeId of sortedNodeIds) {\n const node = relevantNodes.find((candidateNode) => candidateNode.id === nodeId)\n if (!node) continue\n\n const nodeData = node.data as Record<string, unknown> | undefined\n const config = nodeData?.config as LogicNodeConfig | undefined\n const label = (nodeData?.label as string) ?? node.id\n const nodeType = (node.type as string) ?? 'unknown'\n\n const variables = inferVariables(config, nodeType)\n\n entries.push({\n nodeId: node.id,\n nodeLabel: label,\n nodeType,\n variables,\n })\n }\n\n return entries\n }, [nodes, edges])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"variable-inspector\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <VariableIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"variable-inspector-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Variable Tree */}\n <div className=\"flex-1 overflow-y-auto\">\n {nodeVariableEntries.length === 0 ? (\n <div className=\"px-4 py-12 text-center\" data-testid=\"variable-inspector-empty\">\n <VariableIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </p>\n </div>\n ) : (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {nodeVariableEntries.map((entry) => {\n const isExpanded = expandedNodes.has(entry.nodeId)\n const IconComponent = LOGIC_ICON_MAP[entry.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[entry.nodeType] ?? 'from-gray-400 to-gray-500'\n const inputVariables = entry.variables.filter((variable) => variable.direction === 'input')\n const outputVariables = entry.variables.filter((variable) => variable.direction === 'output')\n\n return (\n <div key={entry.nodeId} data-testid={`variable-node-${entry.nodeId}`}>\n {/* Node Header (collapsible) */}\n <button\n type=\"button\"\n onClick={() => toggleNodeExpansion(entry.nodeId)}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left transition-colors hover:bg-gray-50 dark:hover:bg-gray-800/50\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n ) : (\n <ChevronRightIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n )}\n <div className={`flex h-5 w-5 flex-shrink-0 items-center justify-center rounded bg-gradient-to-br ${gradient}`}>\n {IconComponent && <IconComponent className=\"h-3 w-3 text-white\" />}\n </div>\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {entry.nodeLabel}\n </span>\n <span className=\"ml-auto flex-shrink-0 text-[10px] text-gray-400 dark:text-gray-500\">\n {entry.variables.length} {translations('variables')}\n </span>\n </button>\n\n {/* Expanded Variable List */}\n {isExpanded && (\n <div className=\"bg-gray-50/50 px-4 pb-2 dark:bg-gray-800/30\">\n {entry.variables.length === 0 ? (\n <p className=\"py-2 pl-9 text-xs italic text-gray-400 dark:text-gray-500\">\n {translations('noVariables')}\n </p>\n ) : (\n <>\n {/* Input Variables */}\n {inputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('inputs')}\n </div>\n {inputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-blue-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Output Variables */}\n {outputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('outputs')}\n </div>\n {outputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-green-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { PlayIcon } from '@heroicons/react/24/outline'\nimport { Button, FormModal, Input } from '@ui/index'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype VariableValue = string | number | boolean | null\n\nexport type RunInputDialogProps = {\n open: boolean\n onClose: () => void\n onRun: (inputVariables: Record<string, VariableValue>) => void\n}\n\nexport function RunInputDialog({\n open,\n onClose,\n onRun,\n}: RunInputDialogProps) {\n const t = useTranslations('agents.workflow.runInputDialog')\n const nodes = useWorkflowStore((state) => state.nodes)\n const [values, setValues] = useState<Record<string, string>>({})\n\n const inputVariableNames = useMemo(() => {\n const storeStartNode = nodes.find((node) => node.type === 'start')\n if (!storeStartNode || typeof storeStartNode.data !== 'object' || storeStartNode.data === null) return []\n if (!('config' in storeStartNode.data) || !storeStartNode.data.config) return []\n const startConfig = storeStartNode.data.config as StartNodeConfig\n return startConfig.inputVariables ?? []\n }, [nodes])\n\n const handleValueChange = useCallback((variableName: string, variableValue: string) => {\n setValues((previous) => ({ ...previous, [variableName]: variableValue }))\n }, [])\n\n const handleSubmit = useCallback(() => {\n const inputVariables: Record<string, VariableValue> = {}\n for (const variableName of inputVariableNames) {\n inputVariables[variableName] = values[variableName] ?? ''\n }\n onRun(inputVariables)\n onClose()\n setValues({})\n }, [inputVariableNames, values, onRun, onClose])\n\n const handleClose = useCallback(() => {\n onClose()\n setValues({})\n }, [onClose])\n\n if (!open) return null\n\n return (\n <FormModal\n open={open}\n onClose={handleClose}\n title={t('title')}\n subtitle={t('subtitle')}\n maxWidth=\"md\"\n showFooter={false}\n >\n <div className=\"space-y-3\">\n {inputVariableNames.length === 0 ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">{t('noInputs')}</p>\n ) : (\n inputVariableNames.map((variableName) => (\n <div key={variableName}>\n <label className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">{variableName}</label>\n <Input\n value={values[variableName] ?? ''}\n onChange={(event) => handleValueChange(variableName, event.target.value)}\n placeholder={`${t('variableValue')}...`}\n />\n </div>\n ))\n )}\n </div>\n <div className=\"mt-4 flex items-center justify-end gap-2\">\n <Button size=\"sm\" plain onClick={handleClose}>{t('cancel')}</Button>\n <Button size=\"sm\" gradient onClick={handleSubmit}>\n <PlayIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {t('run')}\n </Button>\n </div>\n </FormModal>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport {\n XMarkIcon,\n ClockIcon,\n CheckCircleIcon,\n ExclamationCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { NodeExecutionResult, WorkflowRun } from '../../contracts'\n\nexport type PreviewPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n loadRuns: (workflowId: string) => Promise<WorkflowRun[]>\n}\n\nconst STATUS_STYLES: Record<string, { icon: typeof CheckCircleIcon; colorClass: string }> = {\n completed: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n failed: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n running: { icon: ArrowPathIcon, colorClass: 'text-blue-500 animate-spin' },\n pending: { icon: ClockIcon, colorClass: 'text-gray-400' },\n success: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n error: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n skipped: { icon: ClockIcon, colorClass: 'text-gray-400' },\n}\n\nfunction formatDuration(durationMs: number | null): string {\n if (durationMs === null) return '—'\n if (durationMs < 1000) return `${durationMs}ms`\n return `${(durationMs / 1000).toFixed(1)}s`\n}\n\nfunction formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp)\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nexport function PreviewPanel({ open, onClose, workflowId, loadRuns }: PreviewPanelProps) {\n const t = useTranslations('agents.workflow.previewPanel')\n const [runs, setRuns] = useState<WorkflowRun[]>([])\n const [isLoadingRuns, setIsLoadingRuns] = useState(false)\n const [selectedRun, setSelectedRun] = useState<WorkflowRun | null>(null)\n const [selectedNode, setSelectedNode] = useState<NodeExecutionResult | null>(null)\n\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const refreshRuns = useCallback(async () => {\n setIsLoadingRuns(true)\n try {\n const workflowRuns = await loadRuns(workflowId)\n setRuns(workflowRuns)\n } finally {\n setIsLoadingRuns(false)\n }\n }, [loadRuns, workflowId])\n\n useEffect(() => {\n if (open) void refreshRuns()\n }, [open, refreshRuns])\n\n useEffect(() => {\n if (!isRunning && open) void refreshRuns()\n }, [isRunning, open, refreshRuns])\n\n if (!open) return null\n\n return (\n <>\n <div className=\"fixed inset-x-0 top-[120px] bottom-0 z-40 bg-black/10 backdrop-blur-[1px]\" onClick={onClose} />\n <div className=\"fixed right-0 top-[120px] bottom-0 z-50 w-96 overflow-hidden border-l border-white/20 bg-white/95 shadow-2xl backdrop-blur-xl dark:border-gray-700/50 dark:bg-gray-800/95\">\n <div className=\"flex items-center justify-between border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{t('title')}</h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex h-full flex-col overflow-hidden\">\n {isRunning && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center gap-2\">\n <ArrowPathIcon className=\"h-4 w-4 animate-spin text-blue-500\" />\n <span className=\"text-xs font-semibold text-blue-600 dark:text-blue-400\">{t('activeRun')}</span>\n </div>\n <div className=\"max-h-60 space-y-1 overflow-y-auto\">\n {Object.entries(nodeResults).map(([nodeId, result]) => {\n const statusStyle = STATUS_STYLES[result.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n return (\n <div key={nodeId} className=\"flex items-center justify-between rounded-lg px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"truncate text-gray-700 dark:text-gray-300\">{nodeId.slice(0, 8)}</span>\n </div>\n {result.durationMs !== undefined && <span className=\"text-gray-400\">{formatDuration(result.durationMs)}</span>}\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {selectedNode && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-xs font-semibold text-gray-900 dark:text-white\">{t('nodeDetail')}</span>\n <button type=\"button\" onClick={() => setSelectedNode(null)} className=\"text-[10px] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\">\n {t('close')}\n </button>\n </div>\n <div className=\"space-y-2 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('status')}</span>\n <span className={STATUS_STYLES[selectedNode.status]?.colorClass ?? 'text-gray-400'}>\n {t(selectedNode.status as 'completed' | 'failed' | 'running' | 'pending' | 'skipped' | 'success' | 'error')}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('duration')}</span>\n <span className=\"text-gray-700 dark:text-gray-300\">{formatDuration(selectedNode.durationMs)}</span>\n </div>\n {selectedNode.error && (\n <div>\n <span className=\"text-red-500\">{t('error')}</span>\n <pre className=\"mt-1 max-h-20 overflow-auto whitespace-pre-wrap rounded bg-red-50 p-2 text-[10px] text-red-700 dark:bg-red-900/20 dark:text-red-300\">{selectedNode.error}</pre>\n </div>\n )}\n {Object.keys(selectedNode.outputs).length > 0 && (\n <div>\n <span className=\"text-gray-500\">{t('outputs')}</span>\n <pre className=\"mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded bg-gray-50 p-2 text-[10px] text-gray-700 dark:bg-gray-700/50 dark:text-gray-300\">\n {JSON.stringify(selectedNode.outputs, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n <h4 className=\"mb-2 text-xs font-semibold text-gray-500 dark:text-gray-400\">{t('runHistory')}</h4>\n\n {isLoadingRuns && (\n <div className=\"space-y-2\">\n {[1, 2, 3].map((index) => (<div key={index} className=\"shimmer h-14 rounded-lg\" />))}\n </div>\n )}\n\n {!isLoadingRuns && runs.length === 0 && (\n <div className=\"py-8 text-center\">\n <ClockIcon className=\"mx-auto mb-2 h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{t('noRuns')}</p>\n <p className=\"mt-1 text-[10px] text-gray-400 dark:text-gray-500\">{t('noRunsDescription')}</p>\n </div>\n )}\n\n {!isLoadingRuns && runs.length > 0 && (\n <div className=\"space-y-1.5\">\n {runs.map((run) => {\n const statusStyle = STATUS_STYLES[run.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n const isSelected = selectedRun?.id === run.id\n return (\n <button\n key={run.id}\n type=\"button\"\n onClick={() => {\n setSelectedRun(isSelected ? null : run)\n setSelectedNode(null)\n }}\n className={`w-full rounded-lg border px-3 py-2.5 text-left transition-colors ${\n isSelected\n ? 'border-blue-200 bg-blue-50/50 dark:border-blue-800 dark:bg-blue-900/20'\n : 'border-gray-100 hover:border-gray-200 hover:bg-gray-50 dark:border-gray-700/50 dark:hover:border-gray-600 dark:hover:bg-gray-700/30'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"text-xs font-medium text-gray-900 dark:text-white\">{formatTimestamp(run.createdAt)}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(run.totalDurationMs)}</span>\n </div>\n {run.error && <p className=\"mt-1 truncate text-[10px] text-red-500\">{run.error}</p>}\n </button>\n )\n })}\n </div>\n )}\n\n {selectedRun && selectedRun.nodeResults.length > 0 && (\n <div className=\"mt-3 space-y-1\">\n <h5 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-400\">Nodes</h5>\n {selectedRun.nodeResults.map((nodeResult) => {\n const nodeStatusStyle = STATUS_STYLES[nodeResult.status] ?? STATUS_STYLES.pending\n const NodeStatusIcon = nodeStatusStyle.icon\n return (\n <button\n key={nodeResult.nodeId}\n type=\"button\"\n onClick={() => setSelectedNode(nodeResult)}\n className=\"flex w-full items-center justify-between rounded px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\"\n >\n <div className=\"flex items-center gap-2\">\n <NodeStatusIcon className={`h-3 w-3 ${nodeStatusStyle.colorClass}`} />\n <span className=\"text-gray-700 dark:text-gray-300\">{nodeResult.nodeType}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(nodeResult.durationMs)}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n </>\n )\n}\n","export type SaveStatusBadgeProps = {\n status: 'idle' | 'saving' | 'saved'\n}\n\nexport function SaveStatusBadge({ status }: SaveStatusBadgeProps) {\n if (status === 'saving') {\n return (\n <span className=\"animate-pulse text-[10px] text-gray-400 dark:text-gray-500\">\n &#8226;\n </span>\n )\n }\n\n if (status === 'saved') {\n return (\n <span className=\"text-[10px] text-green-500/60 dark:text-green-400/50\">\n &#10003;\n </span>\n )\n }\n\n return null\n}\n","import { memo, useCallback } from 'react'\nimport { Workspace, type WorkspaceProps } from '../../workflow-canvas'\nimport type { WorkflowGraph } from '../../contracts'\n\nexport type AutoSaveWorkspaceProps = Omit<WorkspaceProps, 'onGraphChange'> & {\n onAutoSaveGraph: (graph: WorkflowGraph) => void\n onGraphSnapshot?: (graph: WorkflowGraph) => void\n}\n\nexport const AutoSaveWorkspace = memo(function AutoSaveWorkspace({\n onAutoSaveGraph,\n onGraphSnapshot,\n ...workspaceProps\n}: AutoSaveWorkspaceProps) {\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n onGraphSnapshot?.(graph)\n onAutoSaveGraph(graph)\n }, [onAutoSaveGraph, onGraphSnapshot])\n\n return (\n <Workspace\n {...workspaceProps}\n onGraphChange={handleGraphChange}\n />\n )\n})\n","import type { ComponentProps } from 'react'\nimport { DynamicIslandConfirm as UiDynamicIslandConfirm } from '@ui/index'\n\nexport type DynamicIslandConfirmProps = ComponentProps<typeof UiDynamicIslandConfirm>\n\nexport function DynamicIslandConfirm(props: DynamicIslandConfirmProps) {\n return <UiDynamicIslandConfirm {...props} />\n}\n\n","/**\n * DSL Export Modal\n * ================\n * Modal for exporting a workflow to a JSON file.\n * Shows workflow metadata, a JSON preview, and provides\n * \"Copy to Clipboard\" and \"Download JSON\" actions.\n */\n\nimport { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { ArrowDownTrayIcon, ClipboardDocumentIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, FormModal } from '@ui/index'\nimport type { WorkflowGraph, Workflow } from '../../contracts'\n\ntype DslExportModalProps = {\n open: boolean\n onClose: () => void\n workflow: Workflow\n graph: WorkflowGraph\n}\n\nconst JSON_PREVIEW_LINE_LIMIT = 50\n\nexport function DslExportModal({ open, onClose, workflow, graph }: DslExportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.export')\n const [isCopied, setIsCopied] = useState(false)\n\n const exportPayload = useMemo(() => ({\n name: workflow.name,\n description: workflow.description,\n version: workflow.version,\n exportedAt: new Date().toISOString(),\n graph: {\n nodes: graph.nodes,\n edges: graph.edges,\n viewport: graph.viewport,\n },\n }), [workflow, graph])\n\n const jsonString = useMemo(() => JSON.stringify(exportPayload, null, 2), [exportPayload])\n\n const previewLines = useMemo(() => {\n const lines = jsonString.split('\\n')\n if (lines.length <= JSON_PREVIEW_LINE_LIMIT) {\n return jsonString\n }\n return lines.slice(0, JSON_PREVIEW_LINE_LIMIT).join('\\n') + '\\n...'\n }, [jsonString])\n\n const handleCopyToClipboard = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(jsonString)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = jsonString\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n }\n }, [jsonString])\n\n const handleDownloadJson = useCallback(() => {\n const blob = new Blob([jsonString], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const downloadLink = document.createElement('a')\n downloadLink.href = url\n downloadLink.download = `${workflow.name}-v${workflow.version}.json`\n document.body.appendChild(downloadLink)\n downloadLink.click()\n document.body.removeChild(downloadLink)\n URL.revokeObjectURL(url)\n }, [jsonString, workflow.name, workflow.version])\n\n if (!open) return null\n\n return (\n <FormModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"2xl\"\n showFooter={false}\n >\n <div data-testid=\"dsl-export-modal\">\n {/* Metadata */}\n <div className=\"border-b border-gray-200 px-1 py-4 dark:border-gray-700\">\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('workflowName')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{workflow.name}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('version')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">v{workflow.version}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('nodes')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.nodes.length}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('edges')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.edges.length}</p>\n </div>\n </div>\n </div>\n\n {/* JSON Preview */}\n <div className=\"px-1 py-4\">\n <div className=\"mb-2 text-xs font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('preview')}\n </div>\n <pre\n className=\"max-h-64 overflow-auto rounded-lg border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300\"\n data-testid=\"export-json-preview\"\n >\n {previewLines}\n </pre>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button\n type=\"button\"\n onClick={handleCopyToClipboard}\n outline\n size=\"sm\"\n data-testid=\"export-copy-button\"\n >\n {isCopied ? (\n <>\n <CheckIcon className=\"h-4 w-4 text-green-500\" />\n {translations('copied')}\n </>\n ) : (\n <>\n <ClipboardDocumentIcon className=\"h-4 w-4\" />\n {translations('copyToClipboard')}\n </>\n )}\n </Button>\n <Button\n type=\"button\"\n onClick={handleDownloadJson}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"export-download-button\"\n >\n <ArrowDownTrayIcon className=\"h-4 w-4\" />\n {translations('downloadJson')}\n </Button>\n </div>\n </div>\n </FormModal>\n )\n}\n","/**\n * DSL Import Modal\n * ================\n * Modal for importing a workflow from a JSON file.\n * Provides drag-and-drop and file picker upload, validates\n * JSON structure (nodes array, edges array, viewport),\n * shows validation errors, and previews node/edge counts.\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { ArrowUpTrayIcon, ExclamationTriangleIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { Button, FormModal } from '@ui/index'\nimport type { WorkflowGraph } from '../../contracts'\n\ntype DslImportModalProps = {\n open: boolean\n onClose: () => void\n onImport: (graph: WorkflowGraph) => void\n}\n\ntype ValidationResult = {\n isValid: boolean\n errors: string[]\n graph: WorkflowGraph | null\n nodeCount: number\n edgeCount: number\n}\n\nfunction validateWorkflowJson(jsonString: string): ValidationResult {\n const errors: string[] = []\n\n let parsed: unknown\n try {\n parsed = JSON.parse(jsonString)\n } catch {\n return { isValid: false, errors: ['Invalid JSON format'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return { isValid: false, errors: ['Root must be a JSON object'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const data = parsed as Record<string, unknown>\n\n // Support both root-level graph and nested graph property\n const graphData = data.graph ? (data.graph as Record<string, unknown>) : data\n\n if (!Array.isArray(graphData.nodes)) {\n errors.push('Missing or invalid \"nodes\" array')\n }\n\n if (!Array.isArray(graphData.edges)) {\n errors.push('Missing or invalid \"edges\" array')\n }\n\n if (!graphData.viewport || typeof graphData.viewport !== 'object') {\n errors.push('Missing or invalid \"viewport\" object')\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const nodes = graphData.nodes as Array<Record<string, unknown>>\n const edges = graphData.edges as Array<Record<string, unknown>>\n\n // Validate node structure\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index]\n if (!node.id || typeof node.id !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"id\"`)\n }\n if (!node.type || typeof node.type !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"type\"`)\n }\n if (!node.position || typeof node.position !== 'object') {\n errors.push(`Node at index ${index}: missing or invalid \"position\"`)\n }\n }\n\n // Validate edge structure\n for (let index = 0; index < edges.length; index++) {\n const edge = edges[index]\n if (!edge.id || typeof edge.id !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"id\"`)\n }\n if (!edge.source || typeof edge.source !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"source\"`)\n }\n if (!edge.target || typeof edge.target !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"target\"`)\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: nodes.length, edgeCount: edges.length }\n }\n\n const viewport = graphData.viewport as Record<string, unknown>\n const graph: WorkflowGraph = {\n nodes: nodes.map((node) => ({\n id: node.id as string,\n type: node.type as WorkflowGraph['nodes'][number]['type'],\n position: node.position as { x: number; y: number },\n data: (node.data ?? { entityId: '', label: '' }) as WorkflowGraph['nodes'][number]['data'],\n })),\n edges: edges.map((edge) => ({\n id: edge.id as string,\n source: edge.source as string,\n target: edge.target as string,\n sourceHandle: (edge.sourceHandle ?? 'default') as string,\n targetHandle: (edge.targetHandle ?? 'default') as string,\n })),\n viewport: {\n x: typeof viewport.x === 'number' ? viewport.x : 0,\n y: typeof viewport.y === 'number' ? viewport.y : 0,\n zoom: typeof viewport.zoom === 'number' ? viewport.zoom : 1,\n },\n }\n\n return { isValid: true, errors: [], graph, nodeCount: nodes.length, edgeCount: edges.length }\n}\n\nexport function DslImportModal({ open, onClose, onImport }: DslImportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.import')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const [isDragActive, setIsDragActive] = useState(false)\n const [validationResult, setValidationResult] = useState<ValidationResult | null>(null)\n const [fileName, setFileName] = useState<string | null>(null)\n\n const processFile = useCallback((file: File) => {\n setFileName(file.name)\n\n const reader = new FileReader()\n reader.onload = (event) => {\n const content = event.target?.result\n if (typeof content === 'string') {\n const result = validateWorkflowJson(content)\n setValidationResult(result)\n }\n }\n reader.readAsText(file)\n }, [])\n\n const handleDragOver = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(true)\n }, [])\n\n const handleDragLeave = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n }, [])\n\n const handleDrop = useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n\n const files = event.dataTransfer.files\n if (files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleFileChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n if (files && files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleClickUpload = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const handleImport = useCallback(() => {\n if (validationResult?.isValid && validationResult.graph) {\n onImport(validationResult.graph)\n onClose()\n }\n }, [validationResult, onImport, onClose])\n\n const handleReset = useCallback(() => {\n setValidationResult(null)\n setFileName(null)\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }, [])\n\n if (!open) return null\n\n return (\n <FormModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"lg\"\n showFooter={false}\n >\n <div data-testid=\"dsl-import-modal\">\n <div className=\"px-1 py-2\">\n {!validationResult ? (\n <div\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClickUpload}\n className={`cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200 ${\n isDragActive\n ? 'border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-500/10'\n : 'border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500'\n }`}\n data-testid=\"import-dropzone\"\n >\n <ArrowUpTrayIcon className=\"mx-auto h-10 w-10 text-gray-400 dark:text-gray-500\" />\n <p className=\"mt-3 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {translations('dropzone')}\n </p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n {translations('dropzoneHint')}\n </p>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n onChange={handleFileChange}\n className=\"hidden\"\n data-testid=\"import-file-input\"\n />\n </div>\n ) : (\n <div data-testid=\"import-validation-result\">\n <div className=\"mb-4 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{fileName}</span>\n <Button type=\"button\" plain size=\"sm\" onClick={handleReset}>\n {translations('chooseAnother')}\n </Button>\n </div>\n\n {validationResult.isValid ? (\n <div className=\"rounded-lg border border-green-200 bg-green-50 p-4 dark:border-green-800 dark:bg-green-900/20\">\n <div className=\"flex items-center gap-2\">\n <CheckCircleIcon className=\"h-5 w-5 text-green-500\" />\n <span className=\"text-sm font-medium text-green-700 dark:text-green-400\">\n {translations('validationSuccess')}\n </span>\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-2 text-sm\">\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('nodes')}: {validationResult.nodeCount}\n </div>\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('edges')}: {validationResult.edgeCount}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 dark:border-red-800 dark:bg-red-900/20\">\n <div className=\"flex items-center gap-2\">\n <ExclamationTriangleIcon className=\"h-5 w-5 text-red-500\" />\n <span className=\"text-sm font-medium text-red-700 dark:text-red-400\">\n {translations('validationFailed')}\n </span>\n </div>\n <ul className=\"mt-2 space-y-1\">\n {validationResult.errors.map((validationError, index) => (\n <li key={index} className=\"text-xs text-red-600 dark:text-red-400\">\n {validationError}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button type=\"button\" onClick={onClose} outline size=\"sm\" data-testid=\"import-cancel-button\">\n {translations('cancel')}\n </Button>\n <Button\n type=\"button\"\n onClick={handleImport}\n disabled={!validationResult?.isValid}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"import-confirm-button\"\n >\n <ArrowUpTrayIcon className=\"h-4 w-4\" />\n {translations('import')}\n </Button>\n </div>\n </div>\n </FormModal>\n )\n}\n","/**\n * Workflow Store Selectors\n * ========================\n * Derived state hooks for granular subscriptions.\n * Each selector subscribes only to the slice it needs,\n * preventing unnecessary re-renders in consuming components.\n */\n\nimport { useWorkflowStore } from './workflow-store'\n\nexport const useCanUndo = () => useWorkflowStore((state) => state.past.length > 0)\n\nexport const useCanRedo = () => useWorkflowStore((state) => state.future.length > 0)\n\nexport const useHasCopied = () => useWorkflowStore((state) => state.clipboard !== null)\n\nexport const useContextMenu = () => useWorkflowStore((state) => state.contextMenu)\n\nexport const useEditingNodeId = () => useWorkflowStore((state) => state.editingNodeId)\n\nexport const useSelectedNodeCount = () =>\n useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length)\n\nexport const useIsRunning = () => useWorkflowStore((state) => state.isRunning)\n\nexport const useNodeResults = () => useWorkflowStore((state) => state.nodeResults)\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype GraphSnapshot = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseUndoRedoReturn = {\n undo: () => void\n redo: () => void\n canUndo: boolean\n canRedo: boolean\n takeSnapshot: () => void\n}\n\nconst DEFAULT_MAX_HISTORY = 50\n\nexport function useUndoRedo(\n nodes: Node[],\n edges: Edge[],\n setNodes: (nodes: Node[]) => void,\n setEdges: (edges: Edge[]) => void,\n maxHistory: number = DEFAULT_MAX_HISTORY,\n): UseUndoRedoReturn {\n const pastRef = useRef<GraphSnapshot[]>([])\n const futureRef = useRef<GraphSnapshot[]>([])\n\n // Force re-render tracking for canUndo/canRedo\n // We use a counter ref that we read synchronously to derive boolean states\n const pastLengthRef = useRef(0)\n const futureLengthRef = useRef(0)\n\n const takeSnapshot = useCallback(() => {\n const snapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n pastRef.current = [...pastRef.current.slice(-(maxHistory - 1)), snapshot]\n pastLengthRef.current = pastRef.current.length\n futureRef.current = []\n futureLengthRef.current = 0\n }, [nodes, edges, maxHistory])\n\n const undo = useCallback(() => {\n const past = pastRef.current\n if (past.length === 0) return\n\n const previous = past[past.length - 1]\n const remaining = past.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n pastRef.current = remaining\n pastLengthRef.current = remaining.length\n futureRef.current = [...futureRef.current, currentSnapshot]\n futureLengthRef.current = futureRef.current.length\n\n setNodes(previous.nodes)\n setEdges(previous.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n const redo = useCallback(() => {\n const future = futureRef.current\n if (future.length === 0) return\n\n const next = future[future.length - 1]\n const remaining = future.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n futureRef.current = remaining\n futureLengthRef.current = remaining.length\n pastRef.current = [...pastRef.current, currentSnapshot]\n pastLengthRef.current = pastRef.current.length\n\n setNodes(next.nodes)\n setEdges(next.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n return {\n undo,\n redo,\n canUndo: pastRef.current.length > 0,\n canRedo: futureRef.current.length > 0,\n takeSnapshot,\n }\n}\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype ClipboardContent = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseClipboardReturn = {\n copy: () => void\n paste: () => void\n hasCopied: boolean\n}\n\nconst PASTE_OFFSET = 40\n\nexport function useClipboard(\n nodes: Node[],\n edges: Edge[],\n setNodes: (updater: (nodes: Node[]) => Node[]) => void,\n setEdges: (updater: (edges: Edge[]) => Edge[]) => void,\n takeSnapshot: () => void,\n): UseClipboardReturn {\n const clipboardRef = useRef<ClipboardContent | null>(null)\n\n const copy = useCallback(() => {\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length === 0) return\n\n const selectedNodeIds = new Set(selectedNodes.map((node) => node.id))\n const internalEdges = edges.filter(\n (edge) => selectedNodeIds.has(edge.source) && selectedNodeIds.has(edge.target),\n )\n\n clipboardRef.current = {\n nodes: selectedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: internalEdges.map((edge) => ({ ...edge })),\n }\n }, [nodes, edges])\n\n const paste = useCallback(() => {\n const clipboard = clipboardRef.current\n if (!clipboard || clipboard.nodes.length === 0) return\n\n takeSnapshot()\n\n const idMapping = new Map<string, string>()\n clipboard.nodes.forEach((node) => {\n idMapping.set(node.id, crypto.randomUUID())\n })\n\n const pastedNodes: Node[] = clipboard.nodes.map((node) => ({\n ...node,\n id: idMapping.get(node.id) ?? crypto.randomUUID(),\n position: {\n x: node.position.x + PASTE_OFFSET,\n y: node.position.y + PASTE_OFFSET,\n },\n selected: true,\n data: { ...node.data },\n }))\n\n const pastedEdges: Edge[] = clipboard.edges.map((edge) => ({\n ...edge,\n id: crypto.randomUUID(),\n source: idMapping.get(edge.source) ?? edge.source,\n target: idMapping.get(edge.target) ?? edge.target,\n }))\n\n setNodes((currentNodes) => [\n ...currentNodes.map((node) => ({ ...node, selected: false })),\n ...pastedNodes,\n ])\n\n setEdges((currentEdges) => [...currentEdges, ...pastedEdges])\n\n // Update clipboard positions for consecutive pastes\n clipboardRef.current = {\n nodes: pastedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: pastedEdges.map((edge) => ({ ...edge })),\n }\n }, [setNodes, setEdges, takeSnapshot])\n\n return {\n copy,\n paste,\n hasCopied: clipboardRef.current !== null && clipboardRef.current.nodes.length > 0,\n }\n}\n","import { useEffect } from 'react'\n\ntype UseCanvasShortcutsOptions = {\n undo: () => void\n redo: () => void\n copy: () => void\n paste: () => void\n canUndo: boolean\n canRedo: boolean\n selectAll: () => void\n fitView: () => void\n}\n\nconst INPUT_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT'])\n\nfunction isInputFocused(): boolean {\n const activeElement = document.activeElement\n if (!activeElement) return false\n return INPUT_TAGS.has(activeElement.tagName) || (activeElement as HTMLElement).isContentEditable\n}\n\nexport function useCanvasShortcuts({\n undo,\n redo,\n copy,\n paste,\n canUndo,\n canRedo,\n selectAll,\n fitView,\n}: UseCanvasShortcutsOptions): void {\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (isInputFocused()) return\n\n const isModifierPressed = event.metaKey || event.ctrlKey\n\n if (!isModifierPressed) {\n if (event.key === 'Escape') {\n selectAll() // Will be overridden to deselect — see graph wiring\n return\n }\n return\n }\n\n switch (event.key.toLowerCase()) {\n case 'z': {\n if (event.shiftKey) {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n } else {\n if (canUndo) {\n event.preventDefault()\n undo()\n }\n }\n break\n }\n case 'y': {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n break\n }\n case 'c': {\n event.preventDefault()\n copy()\n break\n }\n case 'v': {\n event.preventDefault()\n paste()\n break\n }\n case 'a': {\n event.preventDefault()\n selectAll()\n break\n }\n case 'f': {\n if (event.shiftKey) {\n event.preventDefault()\n fitView()\n }\n break\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [undo, redo, copy, paste, canUndo, canRedo, selectAll, fitView])\n}\n","/**\n * Help Lines Hook\n * ===============\n * Detects alignment between the currently dragged node and\n * all other nodes on the canvas. When edges (left, center, right,\n * top, center-y, bottom) are within a 5px threshold, returns\n * horizontal and/or vertical guide line positions for visual feedback.\n */\n\nimport { useState, useCallback } from 'react'\nimport type { Node } from '@xyflow/react'\n\ntype NodeDragHandler = (event: React.MouseEvent, node: Node, nodes: Node[]) => void\n\ntype HelpLinePosition = {\n horizontal: number | null\n vertical: number | null\n}\n\ntype NodeBounds = {\n left: number\n centerX: number\n right: number\n top: number\n centerY: number\n bottom: number\n}\n\nconst ALIGNMENT_THRESHOLD = 5\nconst DEFAULT_NODE_WIDTH = 200\nconst DEFAULT_NODE_HEIGHT = 60\n\nfunction getNodeBounds(node: Node): NodeBounds {\n const width = (node.measured?.width ?? node.width ?? DEFAULT_NODE_WIDTH) as number\n const height = (node.measured?.height ?? node.height ?? DEFAULT_NODE_HEIGHT) as number\n\n return {\n left: node.position.x,\n centerX: node.position.x + width / 2,\n right: node.position.x + width,\n top: node.position.y,\n centerY: node.position.y + height / 2,\n bottom: node.position.y + height,\n }\n}\n\n/**\n * Finds the closest alignment positions between a dragged node and\n * all other nodes. Returns horizontal and vertical guide line positions\n * when edges are within the alignment threshold.\n */\nfunction findAlignments(\n dragBounds: NodeBounds,\n otherNodes: Node[],\n): HelpLinePosition {\n let closestHorizontal: number | null = null\n let closestVertical: number | null = null\n let minHorizontalDistance = ALIGNMENT_THRESHOLD + 1\n let minVerticalDistance = ALIGNMENT_THRESHOLD + 1\n\n for (const otherNode of otherNodes) {\n const otherBounds = getNodeBounds(otherNode)\n\n // Check vertical alignments (x-axis positions)\n const verticalChecks = [\n { dragValue: dragBounds.left, otherValue: otherBounds.left },\n { dragValue: dragBounds.left, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.left, otherValue: otherBounds.right },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.left },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.right },\n { dragValue: dragBounds.right, otherValue: otherBounds.left },\n { dragValue: dragBounds.right, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.right, otherValue: otherBounds.right },\n ]\n\n for (const check of verticalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minVerticalDistance) {\n minVerticalDistance = distance\n closestVertical = check.otherValue\n }\n }\n\n // Check horizontal alignments (y-axis positions)\n const horizontalChecks = [\n { dragValue: dragBounds.top, otherValue: otherBounds.top },\n { dragValue: dragBounds.top, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.top, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.top },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.top },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.bottom },\n ]\n\n for (const check of horizontalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minHorizontalDistance) {\n minHorizontalDistance = distance\n closestHorizontal = check.otherValue\n }\n }\n }\n\n return { horizontal: closestHorizontal, vertical: closestVertical }\n}\n\n/**\n * Basic help lines hook. Returns a drag handler factory that accepts\n * the full node list for alignment detection.\n *\n * Example:\n * const { helpLines, createDragHandler, onNodeDragStop } = useHelpLines()\n * const onNodeDrag = createDragHandler(nodes)\n */\nexport function useHelpLines(): {\n helpLines: HelpLinePosition\n createDragHandler: (allNodes: Node[]) => NodeDragHandler\n onNodeDragStop: NodeDragHandler\n} {\n const [helpLines, setHelpLines] = useState<HelpLinePosition>({\n horizontal: null,\n vertical: null,\n })\n\n const createDragHandler = useCallback(\n (allNodes: Node[]): NodeDragHandler =>\n (_event, draggedNode, draggedNodes) => {\n const draggingNodeIds = new Set(\n draggedNodes.length > 0\n ? draggedNodes.map((node) => node.id)\n : [draggedNode.id],\n )\n\n const dragBounds = getNodeBounds(draggedNode)\n const otherNodes = allNodes.filter((node) => !draggingNodeIds.has(node.id))\n\n setHelpLines(findAlignments(dragBounds, otherNodes))\n },\n [],\n )\n\n const onNodeDragStop: NodeDragHandler = useCallback(() => {\n setHelpLines({ horizontal: null, vertical: null })\n }, [])\n\n return {\n helpLines,\n createDragHandler,\n onNodeDragStop,\n }\n}\n","/**\n * Workflow Validator\n * =================\n * Validates the workflow graph before publishing.\n * Ensures the graph forms a valid DAG with proper node connections.\n */\n\nimport type {\n WorkflowGraph,\n WorkflowNode,\n WorkflowEdge,\n IfElseNodeConfig,\n CodeNodeConfig,\n HttpRequestNodeConfig,\n TemplateTransformNodeConfig,\n KnowledgeBaseNodeConfig,\n AnswerNodeConfig,\n QuestionClassifierNodeConfig,\n ParameterExtractorNodeConfig,\n VariableAssignerNodeConfig,\n VariableAggregatorNodeConfig,\n DocumentExtractorNodeConfig,\n ListOperatorNodeConfig,\n} from '../contracts'\n\nexport type ValidationResult = {\n valid: boolean\n errors: string[]\n}\n\n/**\n * Validate a workflow graph for publishing.\n * Checks:\n * - At least one agent node exists\n * - All edges have valid source/target nodes\n * - No orphan nodes (every node has at least one connection, except note nodes)\n * - Tool nodes connect to agent nodes only\n * - Agent chain forms a valid DAG (no cycles)\n * - Rule nodes have incoming edges from agents\n * - Logic node constraints (start/end uniqueness, config validation)\n * - New node type validations (answer, question_classifier, parameter_extractor, etc.)\n */\nexport function validateWorkflowGraph(graph: WorkflowGraph): ValidationResult {\n const errors: string[] = []\n const nodeMap = new Map<string, WorkflowNode>()\n\n for (const node of graph.nodes) {\n nodeMap.set(node.id, node)\n }\n\n // 1. At least one agent node\n const agentNodes = graph.nodes.filter((node) => node.type === 'agent')\n if (agentNodes.length === 0) {\n errors.push('At least one agent node is required')\n }\n\n // 2. All edges reference valid nodes\n for (const edge of graph.edges) {\n if (!nodeMap.has(edge.source)) {\n errors.push(`Edge \"${edge.id}\" references non-existent source node \"${edge.source}\"`)\n }\n if (!nodeMap.has(edge.target)) {\n errors.push(`Edge \"${edge.id}\" references non-existent target node \"${edge.target}\"`)\n }\n }\n\n // 3. No orphan nodes (every node should have at least one connection, except note nodes)\n const connectedNodeIds = new Set<string>()\n for (const edge of graph.edges) {\n connectedNodeIds.add(edge.source)\n connectedNodeIds.add(edge.target)\n }\n\n for (const node of graph.nodes) {\n // Note nodes are annotations and not part of execution — skip orphan check\n if (node.type === 'note') continue\n if (!connectedNodeIds.has(node.id)) {\n errors.push(`Node \"${node.data.label}\" (${node.type}) is not connected to any other node`)\n }\n }\n\n // 4. Tool -> Agent only\n for (const edge of graph.edges) {\n const sourceNode = nodeMap.get(edge.source)\n const targetNode = nodeMap.get(edge.target)\n if (!sourceNode || !targetNode) continue\n\n if (sourceNode.type === 'tool' && targetNode.type !== 'agent') {\n errors.push(`Tool \"${sourceNode.data.label}\" can only connect to agent nodes, not ${targetNode.type} nodes`)\n }\n }\n\n // 5. Rule nodes should have incoming edges from agents\n const ruleNodes = graph.nodes.filter((node) => node.type === 'rule')\n for (const ruleNode of ruleNodes) {\n const incomingEdges = graph.edges.filter((edge) => edge.target === ruleNode.id)\n const hasAgentSource = incomingEdges.some((edge) => {\n const sourceNode = nodeMap.get(edge.source)\n return sourceNode?.type === 'agent'\n })\n if (incomingEdges.length === 0 || !hasAgentSource) {\n errors.push(`Rule \"${ruleNode.data.label}\" must have an incoming connection from an agent`)\n }\n }\n\n // 6. No cycles (topological sort of agent nodes)\n if (agentNodes.length > 1) {\n const cycleError = detectCycle(agentNodes, graph.edges, nodeMap)\n if (cycleError) {\n errors.push(cycleError)\n }\n }\n\n // 7. At most 1 start node\n const startNodes = graph.nodes.filter((node) => node.type === 'start')\n if (startNodes.length > 1) {\n errors.push('Only one Start node is allowed')\n }\n\n // 8. At most 1 end node\n const endNodes = graph.nodes.filter((node) => node.type === 'end')\n if (endNodes.length > 1) {\n errors.push('Only one End node is allowed')\n }\n\n // 9. Start node has no incoming edges\n for (const startNode of startNodes) {\n const incomingEdges = graph.edges.filter((edge) => edge.target === startNode.id)\n if (incomingEdges.length > 0) {\n errors.push('Start node cannot have incoming connections')\n }\n }\n\n // 10. End node has no outgoing edges\n for (const endNode of endNodes) {\n const outgoingEdges = graph.edges.filter((edge) => edge.source === endNode.id)\n if (outgoingEdges.length > 0) {\n errors.push('End node cannot have outgoing connections')\n }\n }\n\n // 11. IF/ELSE has at least 1 condition\n const ifElseNodes = graph.nodes.filter((node) => node.type === 'if_else')\n for (const ifElseNode of ifElseNodes) {\n const config = ifElseNode.data.config as IfElseNodeConfig | undefined\n if (!config || config.conditions.length === 0) {\n errors.push('IF/ELSE node must have at least one condition')\n }\n }\n\n // 12. Code node has non-empty code\n const codeNodes = graph.nodes.filter((node) => node.type === 'code')\n for (const codeNode of codeNodes) {\n const config = codeNode.data.config as CodeNodeConfig | undefined\n if (!config || !config.code.trim()) {\n errors.push('Code node must have code content')\n }\n }\n\n // 13. HTTP Request has valid URL\n const httpNodes = graph.nodes.filter((node) => node.type === 'http_request')\n for (const httpNode of httpNodes) {\n const config = httpNode.data.config as HttpRequestNodeConfig | undefined\n if (!config || !config.url.trim()) {\n errors.push('HTTP Request node must have a URL')\n }\n }\n\n // 14. Template has non-empty template\n const templateNodes = graph.nodes.filter((node) => node.type === 'template_transform')\n for (const templateNode of templateNodes) {\n const config = templateNode.data.config as TemplateTransformNodeConfig | undefined\n if (!config || !config.template.trim()) {\n errors.push('Template node must have template content')\n }\n }\n\n // 15. Knowledge Base has source ID\n const knowledgeBaseNodes = graph.nodes.filter((node) => node.type === 'knowledge_base')\n for (const knowledgeBaseNode of knowledgeBaseNodes) {\n const config = knowledgeBaseNode.data.config as KnowledgeBaseNodeConfig | undefined\n if (!config || !config.sourceId.trim()) {\n errors.push('Knowledge Base node must have a source configured')\n }\n }\n\n // 16. Iteration has outgoing edge\n const iterationNodes = graph.nodes.filter((node) => node.type === 'iteration')\n for (const iterationNode of iterationNodes) {\n const outgoingEdges = graph.edges.filter((edge) => edge.source === iterationNode.id)\n if (outgoingEdges.length === 0) {\n errors.push('Iteration node must have at least one outgoing connection')\n }\n }\n\n // ============================================================================\n // New node type validations (9 new node types)\n // ============================================================================\n\n // 17. Answer node: outputTemplate must be non-empty\n const answerNodes = graph.nodes.filter((node) => node.type === 'answer')\n for (const answerNode of answerNodes) {\n const config = answerNode.data.config as AnswerNodeConfig | undefined\n if (!config || !config.outputTemplate.trim()) {\n errors.push('Answer node must have a non-empty output template')\n }\n }\n\n // 18. Question Classifier: must have >= 2 categories with non-empty names\n const questionClassifierNodes = graph.nodes.filter((node) => node.type === 'question_classifier')\n for (const questionClassifierNode of questionClassifierNodes) {\n const config = questionClassifierNode.data.config as QuestionClassifierNodeConfig | undefined\n if (!config || config.categories.length < 2) {\n errors.push('Question Classifier node must have at least 2 categories')\n } else {\n const emptyCategories = config.categories.filter((category) => !category.name.trim())\n if (emptyCategories.length > 0) {\n errors.push('Question Classifier node has categories with empty names')\n }\n }\n }\n\n // 19. Parameter Extractor: must have >= 1 parameter with non-empty name\n const parameterExtractorNodes = graph.nodes.filter((node) => node.type === 'parameter_extractor')\n for (const parameterExtractorNode of parameterExtractorNodes) {\n const config = parameterExtractorNode.data.config as ParameterExtractorNodeConfig | undefined\n if (!config || config.parameters.length === 0) {\n errors.push('Parameter Extractor node must have at least 1 parameter')\n } else {\n const emptyParameters = config.parameters.filter((parameter) => !parameter.name.trim())\n if (emptyParameters.length > 0) {\n errors.push('Parameter Extractor node has parameters with empty names')\n }\n }\n }\n\n // 20. Variable Assigner: must have >= 1 assignment\n const variableAssignerNodes = graph.nodes.filter((node) => node.type === 'variable_assigner')\n for (const variableAssignerNode of variableAssignerNodes) {\n const config = variableAssignerNode.data.config as VariableAssignerNodeConfig | undefined\n if (!config || config.assignments.length === 0) {\n errors.push('Variable Assigner node must have at least 1 assignment')\n }\n }\n\n // 21. Variable Aggregator: must have >= 1 inputVariable and non-empty outputVariable\n const variableAggregatorNodes = graph.nodes.filter((node) => node.type === 'variable_aggregator')\n for (const variableAggregatorNode of variableAggregatorNodes) {\n const config = variableAggregatorNode.data.config as VariableAggregatorNodeConfig | undefined\n if (!config || config.inputVariables.length === 0) {\n errors.push('Variable Aggregator node must have at least 1 input variable')\n }\n if (!config || !config.outputVariable.trim()) {\n errors.push('Variable Aggregator node must have a non-empty output variable')\n }\n }\n\n // 22. Document Extractor: outputVariable must be non-empty\n const documentExtractorNodes = graph.nodes.filter((node) => node.type === 'document_extractor')\n for (const documentExtractorNode of documentExtractorNodes) {\n const config = documentExtractorNode.data.config as DocumentExtractorNodeConfig | undefined\n if (!config || !config.outputVariable.trim()) {\n errors.push('Document Extractor node must have a non-empty output variable')\n }\n }\n\n // 23. List Operator: inputVariable and outputVariable must be non-empty\n const listOperatorNodes = graph.nodes.filter((node) => node.type === 'list_operator')\n for (const listOperatorNode of listOperatorNodes) {\n const config = listOperatorNode.data.config as ListOperatorNodeConfig | undefined\n if (!config || !config.inputVariable.trim()) {\n errors.push('List Operator node must have a non-empty input variable')\n }\n if (!config || !config.outputVariable.trim()) {\n errors.push('List Operator node must have a non-empty output variable')\n }\n }\n\n // 24. Iteration Start: must follow an Iteration node (incoming edge source must be iteration type)\n const iterationStartNodes = graph.nodes.filter((node) => node.type === 'iteration_start')\n for (const iterationStartNode of iterationStartNodes) {\n const incomingEdges = graph.edges.filter((edge) => edge.target === iterationStartNode.id)\n const hasIterationSource = incomingEdges.some((edge) => {\n const sourceNode = nodeMap.get(edge.source)\n return sourceNode?.type === 'iteration'\n })\n if (incomingEdges.length === 0 || !hasIterationSource) {\n errors.push('Iteration Start node must have an incoming connection from an Iteration node')\n }\n }\n\n // Note: Note nodes skip validation — they are annotations, not part of execution.\n\n return {\n valid: errors.length === 0,\n errors,\n }\n}\n\n/**\n * Detect cycles in the agent subgraph using DFS.\n */\nfunction detectCycle(\n agentNodes: WorkflowNode[],\n edges: WorkflowEdge[],\n nodeMap: Map<string, WorkflowNode>\n): string | null {\n const agentIds = new Set(agentNodes.map((node) => node.id))\n const adjacencyList = new Map<string, string[]>()\n\n for (const agentId of agentIds) {\n adjacencyList.set(agentId, [])\n }\n\n for (const edge of edges) {\n const sourceNode = nodeMap.get(edge.source)\n const targetNode = nodeMap.get(edge.target)\n if (\n sourceNode?.type === 'agent' &&\n targetNode?.type === 'agent' &&\n agentIds.has(edge.source) &&\n agentIds.has(edge.target)\n ) {\n adjacencyList.get(edge.source)!.push(edge.target)\n }\n }\n\n const visited = new Set<string>()\n const inStack = new Set<string>()\n\n function hasCycleDfs(nodeId: string): boolean {\n visited.add(nodeId)\n inStack.add(nodeId)\n\n const neighbors = adjacencyList.get(nodeId) ?? []\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n if (hasCycleDfs(neighbor)) return true\n } else if (inStack.has(neighbor)) {\n return true\n }\n }\n\n inStack.delete(nodeId)\n return false\n }\n\n for (const agentId of agentIds) {\n if (!visited.has(agentId)) {\n if (hasCycleDfs(agentId)) {\n return 'Cycle detected in agent pipeline — agents must form a directed acyclic graph (DAG)'\n }\n }\n }\n\n return null\n}\n\n/**\n * Topologically sort agent nodes from the graph edges.\n * Returns agent entityIds in execution order.\n * Logic nodes are skipped — only agent entityIds are returned.\n */\nexport function topologicalSortAgents(graph: WorkflowGraph): string[] {\n const agentNodes = graph.nodes.filter((node) => node.type === 'agent')\n const agentIdSet = new Set(agentNodes.map((node) => node.id))\n\n // Build adjacency list for agent-to-agent edges\n const inDegree = new Map<string, number>()\n const adjacencyList = new Map<string, string[]>()\n\n for (const node of agentNodes) {\n inDegree.set(node.id, 0)\n adjacencyList.set(node.id, [])\n }\n\n for (const edge of graph.edges) {\n if (agentIdSet.has(edge.source) && agentIdSet.has(edge.target)) {\n adjacencyList.get(edge.source)!.push(edge.target)\n inDegree.set(edge.target, (inDegree.get(edge.target) ?? 0) + 1)\n }\n }\n\n // Kahn's algorithm\n const queue: string[] = []\n for (const [nodeId, degree] of inDegree) {\n if (degree === 0) queue.push(nodeId)\n }\n\n const sorted: string[] = []\n while (queue.length > 0) {\n const current = queue.shift()!\n sorted.push(current)\n\n for (const neighbor of adjacencyList.get(current) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1\n inDegree.set(neighbor, newDegree)\n if (newDegree === 0) queue.push(neighbor)\n }\n }\n\n // Map node IDs back to entityIds\n const nodeIdToEntityId = new Map<string, string>()\n for (const node of agentNodes) {\n nodeIdToEntityId.set(node.id, node.data.entityId)\n }\n\n return sorted.map((nodeId) => nodeIdToEntityId.get(nodeId) ?? nodeId)\n}\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { CommandLineIcon, TrashIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport type { AgentTool } from '../../contracts'\nimport { NodeCard } from './node-card'\nimport { NodeCardBadge, NodeCardHeader, NodeCardMeta } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\ntype AgentToolNodeData = {\n agentTool: AgentTool\n order?: number\n displayMode?: 'detailed' | 'compact'\n onEdit?: (agentTool: AgentTool) => void\n onToggle?: (agentTool: AgentTool) => void\n onRemoveFromCanvas?: (nodeId: string) => void\n label?: string\n}\n\nconst CATEGORY_ICONS: Record<string, string> = {\n search: 'from-sky-400 to-blue-500',\n code: 'from-cyan-400 to-sky-500',\n file: 'from-violet-400 to-purple-500',\n web: 'from-orange-400 to-amber-500',\n math: 'from-emerald-400 to-green-500',\n custom: 'from-amber-400 to-orange-500',\n}\n\nconst CATEGORY_PILL: Record<string, string> = {\n search: 'bg-sky-100 text-sky-700 dark:bg-sky-500/20 dark:text-sky-300',\n code: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300',\n file: 'bg-violet-100 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300',\n web: 'bg-orange-100 text-orange-700 dark:bg-orange-500/20 dark:text-orange-300',\n math: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300',\n custom: 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300',\n}\n\nexport const AgentToolFlowNode = memo(function AgentToolFlowNode({ id, data, selected }: { id: string; data: AgentToolNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { agentTool, onRemoveFromCanvas } = data\n const isCompact = data.displayMode === 'compact'\n\n if (!agentTool?.name) {\n const label = data.label\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-amber-400\" />\n <NodeCard variant=\"error\" nodeType=\"agent_tool\">\n <NodeCardHeader\n icon={<ExclamationTriangleIcon className=\"h-5 w-5 text-white\" />}\n title={label || 'Agent Tool'}\n description={t('agentToolNotFound')}\n iconClassName=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\"\n />\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-amber-500\" />\n </>\n )\n }\n\n const category = agentTool.category ?? 'custom'\n const gradient = CATEGORY_ICONS[category] ?? CATEGORY_ICONS.custom\n const pill = CATEGORY_PILL[category] ?? CATEGORY_PILL.custom\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-amber-400\" />\n\n <NodeCard compact={isCompact} selected={selected} nodeType=\"agent_tool\" width=\"w-[280px]\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-3\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <CommandLineIcon className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{agentTool.name}</h3>\n {!isCompact && agentTool.description && (\n <p className=\"mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400\">{agentTool.description}</p>\n )}\n </div>\n </div>\n\n {data.onToggle && (\n <span\n role=\"switch\"\n aria-checked={agentTool.enabled}\n className={`nodrag nopan relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer items-center rounded-full border border-white/50 px-0.5 shadow-[inset_0_1px_0_rgba(255,255,255,0.5)] transition duration-200 dark:border-white/15 ${\n agentTool.enabled ? 'bg-amber-500/90' : 'bg-slate-300/80 dark:bg-slate-700/80'\n }`}\n onClick={(event) => {\n event.stopPropagation()\n data.onToggle!(agentTool)\n }}\n >\n <span className={`pointer-events-none inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ${\n agentTool.enabled ? 'translate-x-4' : 'translate-x-0'\n }`} />\n </span>\n )}\n </div>\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <NodeCardBadge className=\"rounded-full bg-amber-100 px-2 py-0.5 text-[10px] font-semibold text-amber-700 dark:bg-amber-500/20 dark:text-amber-300\">\n {t('agentToolNode')}\n </NodeCardBadge>\n <NodeCardBadge className={`rounded-full px-2 py-0.5 text-[10px] font-medium ${pill}`}>\n {category}\n </NodeCardBadge>\n {agentTool.parameters && agentTool.parameters.length > 0 && (\n <NodeCardBadge className=\"rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-600 dark:bg-white/10 dark:text-gray-300\">\n {agentTool.parameters.length} params\n </NodeCardBadge>\n )}\n\n {onRemoveFromCanvas && (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onRemoveFromCanvas(id)\n }}\n className=\"nodrag nopan ml-auto cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label={t('removeFromCanvas')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )}\n </div>\n </NodeCardMeta>\n </NodeCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-amber-500\" />\n </>\n )\n})\n"]}
1
+ {"version":3,"sources":["../../src/workflow/components/icons/model-provider-icons.tsx","../../src/workflow/components/drawers/agent-drawer.tsx","../../src/workflow/store/subworkflow-store.ts","../../src/workflow/components/drawers/subworkflow-drawer.tsx","../../src/workflow/components/drawers/pipeline-settings-drawer.tsx","../../src/workflow/components/panels/node-palette.tsx","../../src/workflow/components/panels/workflow-list-bar.tsx","../../src/workflow/components/panels/version-history-panel.tsx","../../src/workflow/components/panels/run-panel.tsx","../../src/workflow/components/panels/variable-inspector.tsx","../../src/workflow/components/panels/run-input-dialog.tsx","../../src/workflow/components/panels/preview-panel.tsx","../../src/workflow/components/panels/save-status-badge.tsx","../../src/workflow/components/panels/auto-save-workspace.tsx","../../src/workflow/components/modals/dynamic-island-confirm.tsx","../../src/workflow/components/modals/dsl-export-modal.tsx","../../src/workflow/components/modals/dsl-import-modal.tsx","../../src/workflow/store/selectors.ts","../../src/workflow/hooks/use-undo-redo.ts","../../src/workflow/hooks/use-clipboard.ts","../../src/workflow/hooks/use-canvas-shortcuts.ts","../../src/workflow/hooks/use-help-lines.ts","../../src/workflow/components/nodes/agent-tool-flow-node.tsx"],"names":["jsx","jsxs","useState","useTranslations","useMemo","useCallback","graph","MaximizeIcon","useEffect","ChevronDownIcon","CpuChipIcon","ArrowPathRoundedSquareIcon","BoltIcon","PlusIcon","formatTimestamp","ClockIcon","formatDuration","XMarkIcon","ChevronRightIcon","PlayIcon","CheckCircleIcon","ArrowPathIcon","Fragment","AutoSaveWorkspace","DynamicIslandConfirm","CheckIcon","useRef","memo","AgentToolFlowNode","ExclamationTriangleIcon","CommandLineIcon","TrashIcon"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Model provider icons for AWS Bedrock models.\n * Anthropic (Claude), Amazon (Nova), Meta (Llama).\n */\n\ntype IconProps = { className?: string }\n\nexport function AnthropicModelIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Anthropic\">\n <path d=\"M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z\" />\n </svg>\n )\n}\n\nexport function AmazonNovaIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Amazon Nova\">\n {/* Stylized \"A\" arrow — Amazon-inspired */}\n <path d=\"M12 2L3 20h3.5l1.8-4.5h7.4L17.5 20H21L12 2Zm-2.2 11L12 7.5l2.2 5.5H9.8Z\" fill=\"currentColor\" />\n <path d=\"M2 21c3.5 1.5 7.5 2 10 2s6.5-.5 10-2\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" fill=\"none\" opacity=\"0.6\" />\n </svg>\n )\n}\n\nexport function MetaLlamaIcon({ className }: IconProps) {\n return (\n <svg role=\"img\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className} aria-label=\"Meta\">\n <path d=\"M6.915 4.03c-1.968 0-3.683 1.28-4.871 3.113C.704 9.208 0 11.883 0 14.449c0 .706.07 1.369.21 1.973a6.624 6.624 0 0 0 .265.86 5.297 5.297 0 0 0 .371.761c.696 1.159 1.818 1.927 3.593 1.927 1.497 0 2.633-.671 3.965-2.444.76-1.012 1.144-1.626 2.663-4.32l.756-1.339.186-.325c.061.1.121.196.183.3l2.152 3.595c.724 1.21 1.665 2.556 2.47 3.314 1.046.987 1.992 1.22 3.06 1.22 1.075 0 1.876-.355 2.455-.843a3.743 3.743 0 0 0 .81-.973c.542-.939.861-2.127.861-3.745 0-2.72-.681-5.357-2.084-7.45-1.282-1.912-2.957-2.93-4.716-2.93-1.047 0-2.088.467-3.053 1.308-.652.57-1.257 1.29-1.82 2.05-.69-.875-1.335-1.547-1.958-2.056-1.182-.966-2.315-1.303-3.454-1.303zm10.16 2.053c1.147 0 2.188.758 2.992 1.999 1.132 1.748 1.647 4.195 1.647 6.4 0 1.548-.368 2.9-1.839 2.9-.58 0-1.027-.23-1.664-1.004-.496-.601-1.343-1.878-2.832-4.358l-.617-1.028a44.908 44.908 0 0 0-1.255-1.98c.07-.109.141-.224.211-.327 1.12-1.667 2.118-2.602 3.358-2.602zm-10.201.553c1.265 0 2.058.791 2.675 1.446.307.327.737.871 1.234 1.579l-1.02 1.566c-.757 1.163-1.882 3.017-2.837 4.338-1.191 1.649-1.81 1.817-2.486 1.817-.524 0-1.038-.237-1.383-.794-.263-.426-.464-1.13-.464-2.046 0-2.221.63-4.535 1.66-6.088.454-.687.964-1.226 1.533-1.533a2.264 2.264 0 0 1 1.088-.285z\" />\n </svg>\n )\n}\n\nexport function OpenAIModelIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" className={className} aria-label=\"OpenAI\">\n <path d=\"M14.949 6.547a3.94 3.94 0 0 0-.348-3.273 4.11 4.11 0 0 0-4.4-1.934A4.1 4.1 0 0 0 8.423.2 4.15 4.15 0 0 0 6.305.086a4.1 4.1 0 0 0-1.891.948 4.04 4.04 0 0 0-1.158 1.753 4.1 4.1 0 0 0-1.563.679A4 4 0 0 0 .554 4.72a3.99 3.99 0 0 0 .502 4.731 3.94 3.94 0 0 0 .346 3.274 4.11 4.11 0 0 0 4.402 1.933c.382.425.852.764 1.377.995.526.231 1.095.35 1.67.346 1.78.002 3.358-1.132 3.901-2.804a4.1 4.1 0 0 0 1.563-.68 4 4 0 0 0 1.14-1.253 3.99 3.99 0 0 0-.506-4.716m-6.097 8.406a3.05 3.05 0 0 1-1.945-.694l.096-.054 3.23-1.838a.53.53 0 0 0 .265-.455v-4.49l1.366.778q.02.011.025.035v3.722c-.003 1.653-1.361 2.992-3.037 2.996m-6.53-2.75a2.95 2.95 0 0 1-.36-2.01l.095.057L5.29 12.09a.53.53 0 0 0 .527 0l3.949-2.246v1.555a.05.05 0 0 1-.022.041L6.473 13.3c-1.454.826-3.311.335-4.15-1.098m-.85-6.94A3.02 3.02 0 0 1 3.07 3.949v3.785a.51.51 0 0 0 .262.451l3.93 2.237-1.366.779a.05.05 0 0 1-.048 0L2.585 9.342a2.98 2.98 0 0 1-1.113-4.094zm11.216 2.571L8.747 5.576l1.362-.776a.05.05 0 0 1 .048 0l3.265 1.86a3 3 0 0 1 1.173 1.207 2.96 2.96 0 0 1-.27 3.2 3.05 3.05 0 0 1-1.36.997V8.279a.52.52 0 0 0-.276-.445m1.36-2.015-.097-.057-3.226-1.855a.53.53 0 0 0-.53 0L6.249 6.153V4.598a.04.04 0 0 1 .019-.04L9.533 2.7a3.07 3.07 0 0 1 3.257.139c.474.325.843.778 1.066 1.303.223.526.289 1.103.191 1.664zM5.503 8.575 4.139 7.8a.05.05 0 0 1-.026-.037V4.049c0-.57.166-1.127.476-1.607s.752-.864 1.275-1.105a3.08 3.08 0 0 1 3.234.41l-.096.054-3.23 1.838a.53.53 0 0 0-.265.455zm.742-1.577 1.758-1 1.762 1v2l-1.755 1-1.762-1z\" />\n </svg>\n )\n}\n\nexport function GoogleGeminiIcon({ className }: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-label=\"Google Gemini\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2Z\" fill=\"#4285F4\" opacity=\"0.15\" />\n <path d=\"M12 2.5c5.25 0 9.5 4.25 9.5 9.5s-4.25 9.5-9.5 9.5S2.5 17.25 2.5 12 6.75 2.5 12 2.5Z\" stroke=\"#4285F4\" strokeWidth=\"1\" fill=\"none\" />\n <path d=\"M12 7L8 12l4 5 4-5-4-5Z\" fill=\"#4285F4\" />\n <path d=\"M12 7L8 12l4 5\" fill=\"#34A853\" />\n </svg>\n )\n}\n\n/** Returns the icon component and color for a model ID */\nexport function getModelIcon(modelId: string): {\n IconComponent: (props: IconProps) => React.ReactNode\n color: string\n providerLabel: string\n} {\n if (modelId.startsWith('anthropic.')) {\n return { IconComponent: AnthropicModelIcon, color: 'text-amber-600 dark:text-amber-400', providerLabel: 'Anthropic' }\n }\n if (modelId.startsWith('amazon.')) {\n return { IconComponent: AmazonNovaIcon, color: 'text-orange-500 dark:text-orange-400', providerLabel: 'Amazon' }\n }\n if (modelId.startsWith('meta.')) {\n return { IconComponent: MetaLlamaIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Meta' }\n }\n if (modelId.startsWith('google.')) {\n return { IconComponent: GoogleGeminiIcon, color: 'text-blue-500 dark:text-blue-400', providerLabel: 'Google' }\n }\n if (modelId.startsWith('openai.')) {\n return { IconComponent: OpenAIModelIcon, color: 'text-emerald-500 dark:text-emerald-400', providerLabel: 'OpenAI' }\n }\n // fallback\n return { IconComponent: AnthropicModelIcon, color: 'text-gray-500 dark:text-gray-400', providerLabel: 'Custom' }\n}\n","import { useState, useMemo, useCallback, useEffect } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { CpuChipIcon } from '@heroicons/react/24/outline'\nimport { getFrameworkMeta, FRAMEWORK_META, getCompatibleModels, isModelCompatibleWithFramework, type AgentFramework } from '../icons/agent-framework-icons'\nimport { getModelIcon } from '../icons/model-provider-icons'\nimport { WorkspaceDrawer } from './workspace-drawer'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { useDrawerStore } from '../../store/drawer-store'\nimport type { AgentWithPrompts } from '../../types'\nimport type { AgentModel } from '../../contracts'\n\ntype AgentDrawerProps = {\n onSaved?: () => void\n}\n\ntype TabId = 'config' | 'results'\n\nfunction StatusBadge({ status }: { status: string }) {\n const colorMap: Record<string, string> = {\n pending: 'bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300',\n running: 'bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300',\n success: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300',\n error: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300',\n }\n return (\n <span className={`inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold ${colorMap[status] ?? colorMap.pending}`}>\n {status}\n </span>\n )\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction OutputCard({ label, value }: { label: string; value: unknown }) {\n const displayValue = typeof value === 'string' ? value : JSON.stringify(value, null, 2)\n const isLong = typeof displayValue === 'string' && displayValue.length > 120\n\n return (\n <div className=\"rounded-xl border border-white/20 bg-white/40 p-3 dark:border-white/10 dark:bg-white/5\">\n <p className=\"mb-1 text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {label}\n </p>\n {isLong ? (\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap text-xs text-gray-800 dark:text-gray-200\">\n {displayValue}\n </pre>\n ) : (\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">{displayValue}</p>\n )}\n </div>\n )\n}\n\n/* Agent profile header — lorelei/notionists avatar with glow, badges, model info */\nfunction AgentProfileHeader({ agent, models, t, selectedModelId, setSelectedModelId, selectedFramework, temperature, setTemperature, elo, setElo, onChanged }: {\n agent: AgentWithPrompts; models: AgentModel[]; t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework\n temperature: number; setTemperature: (value: number) => void\n elo: number; setElo: (value: number) => void\n onChanged: () => void\n}) {\n const modelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId ?? '—'\n const avatarUrl = (agent as Record<string, unknown>).avatar as string | undefined\n const frameworkMeta = getFrameworkMeta(selectedFramework)\n\n // Derive difficulty tier from current ELO (reactive to slider changes)\n const tierInfo = getEloTier(elo)\n const difficultyConfig: Record<string, { color: string; labelKey: string }> = {\n beginner: { color: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400', labelKey: 'agentDrawer.tierBeginner' },\n intermediate: { color: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400', labelKey: 'agentDrawer.tierIntermediate' },\n advanced: { color: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400', labelKey: 'agentDrawer.tierAdvanced' },\n expert: { color: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400', labelKey: 'agentDrawer.tierExpert' },\n }\n const levelConfig = difficultyConfig[tierInfo.tierKey]\n\n return (\n <div className=\"relative overflow-hidden bg-gradient-to-br from-indigo-500/20 via-purple-500/10 to-transparent px-6 pb-6 pt-4 dark:from-indigo-500/10 dark:via-purple-500/5\">\n {/* Level badge — derived from ELO, updates with slider */}\n {levelConfig && (\n <div className=\"mb-4 flex justify-center\">\n <span className={`${levelConfig.color} rounded-full px-4 py-1.5 text-xs font-bold shadow-sm transition-colors`}>\n {t(levelConfig.labelKey)}\n </span>\n </div>\n )}\n\n {/* Avatar with glow ring */}\n <div className=\"mb-4 flex justify-center\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-br from-purple-500 to-blue-500 opacity-40 blur-lg\" />\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt={agent.name}\n loading=\"lazy\"\n className=\"relative h-20 w-20 rounded-full bg-white object-cover shadow-xl ring-4 ring-white dark:bg-gray-800 dark:ring-gray-800\"\n />\n ) : (\n <div className=\"relative flex h-20 w-20 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-xl ring-4 ring-white dark:ring-gray-800\">\n <CpuChipIcon className=\"h-10 w-10 text-white\" />\n </div>\n )}\n {/* Chip badge */}\n <div className=\"absolute -bottom-1 -right-1 flex h-6 w-6 items-center justify-center rounded-full bg-indigo-500 ring-2 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n </div>\n </div>\n\n {/* Name */}\n <h3 className=\"mb-2 text-center text-lg font-bold text-gray-900 dark:text-white\">\n {agent.name}\n </h3>\n\n {/* Role badge */}\n {agent.role && (\n <div className=\"mb-3 flex justify-center\">\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-white/60 px-3 py-1.5 text-xs font-medium text-gray-600 ring-1 ring-gray-200/50 dark:bg-gray-800/60 dark:text-gray-400 dark:ring-gray-700/50\">\n <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M6 6V5a3 3 0 013-3h2a3 3 0 013 3v1h2a2 2 0 012 2v3.57A22.952 22.952 0 0110 13a22.95 22.95 0 01-8-1.43V8a2 2 0 012-2h2zm2-1a1 1 0 011-1h2a1 1 0 011 1v1H8V5zm1 5a1 1 0 011-1h.01a1 1 0 110 2H10a1 1 0 01-1-1z\" clipRule=\"evenodd\" />\n <path d=\"M2 13.692V16a2 2 0 002 2h12a2 2 0 002-2v-2.308A24.974 24.974 0 0110 15c-2.796 0-5.487-.46-8-1.308z\" />\n </svg>\n {agent.role}\n </span>\n </div>\n )}\n\n {/* Model + ELO row */}\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"inline-flex items-center gap-1.5 rounded bg-white/50 px-2.5 py-1 text-[10px] text-gray-600 dark:bg-gray-800/50 dark:text-gray-400\">\n <CpuChipIcon className=\"h-3 w-3\" />\n <span className=\"font-semibold\">{modelName}</span>\n </div>\n {elo != null && (\n <div className=\"inline-flex items-center gap-1 rounded bg-white/50 px-2 py-1 text-[10px] text-gray-600 dark:bg-gray-800/50 dark:text-gray-400\">\n <span className=\"opacity-60\">ELO:</span>\n <span className=\"font-bold tabular-nums\">{elo}</span>\n </div>\n )}\n </div>\n\n {/* Framework badge */}\n <div className=\"mt-3 flex justify-center\">\n <span className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-[10px] font-semibold ${frameworkMeta.badgeColor}`}>\n <frameworkMeta.IconComponent className=\"h-3.5 w-3.5\" />\n {frameworkMeta.label}\n </span>\n </div>\n\n {/* ELO capability breakdown — interactive sliders */}\n <AgentCapabilityCard elo={elo} setElo={setElo} models={models} selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId} temperature={temperature} setTemperature={setTemperature} onChanged={onChanged} t={t} />\n\n {/* Prompt version + count */}\n <div className=\"mt-2 flex items-center justify-center gap-2 text-[10px] text-gray-400 dark:text-gray-500\">\n <span>v{agent.activePromptVersion}</span>\n <span>·</span>\n <span>{agent.promptCount} prompt{agent.promptCount === 1 ? '' : 's'}</span>\n </div>\n </div>\n )\n}\n\n/*\n ELO tier definitions — maps ELO ranges to model families, tokens, autonomy.\n Each provider family has models sorted by capability (low → high).\n*/\nconst MODEL_FAMILIES: Record<string, Array<{ prefix: string; maxTokens: number; contextWindow: string }>> = {\n anthropic: [\n { prefix: 'anthropic.claude-haiku', maxTokens: 8192, contextWindow: '200K' },\n { prefix: 'anthropic.claude-sonnet', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'anthropic.claude-opus', maxTokens: 32768, contextWindow: '1M' },\n ],\n amazon: [\n { prefix: 'amazon.nova-lite', maxTokens: 5120, contextWindow: '300K' },\n { prefix: 'amazon.nova-pro', maxTokens: 5120, contextWindow: '300K' },\n ],\n google: [\n { prefix: 'google.gemini-3-flash', maxTokens: 8192, contextWindow: '1M' },\n { prefix: 'google.gemini-3-1-pro', maxTokens: 32768, contextWindow: '1M' },\n ],\n meta: [\n { prefix: 'meta.llama', maxTokens: 8192, contextWindow: '128K' },\n ],\n openai: [\n { prefix: 'openai.gpt-5-mini', maxTokens: 16384, contextWindow: '1M' },\n { prefix: 'openai.gpt-5-v', maxTokens: 32768, contextWindow: '1M' },\n ],\n}\n\nfunction getProviderFromModelId(modelId: string): string {\n if (modelId.startsWith('anthropic.')) return 'anthropic'\n if (modelId.startsWith('amazon.')) return 'amazon'\n if (modelId.startsWith('meta.')) return 'meta'\n return 'anthropic'\n}\n\nfunction getEloTier(elo: number): {\n tierKey: string; autonomyKey: string\n color: string; barColor: string\n autonomyPercent: number; costPerTask: string\n familyIndex: number; temperature: number\n} {\n if (elo < 1200) return {\n tierKey: 'beginner', autonomyKey: 'autonomyLow',\n color: 'text-cyan-500', barColor: 'from-cyan-400 to-cyan-500',\n autonomyPercent: 25, costPerTask: '$0.005',\n familyIndex: 0, temperature: 0.7,\n }\n if (elo < 1600) return {\n tierKey: 'intermediate', autonomyKey: 'autonomyMedium',\n color: 'text-pink-500', barColor: 'from-pink-400 to-pink-500',\n autonomyPercent: 50, costPerTask: '$0.15',\n familyIndex: 1, temperature: 0.5,\n }\n if (elo < 2000) return {\n tierKey: 'advanced', autonomyKey: 'autonomyHigh',\n color: 'text-amber-500', barColor: 'from-amber-400 to-amber-500',\n autonomyPercent: 75, costPerTask: '$0.50',\n familyIndex: 1, temperature: 0.4,\n }\n return {\n tierKey: 'expert', autonomyKey: 'autonomyFull',\n color: 'text-emerald-500', barColor: 'from-emerald-400 to-emerald-500',\n autonomyPercent: 100, costPerTask: '$1.50',\n familyIndex: 2, temperature: 0.3,\n }\n}\n\ntype CapabilityCardProps = {\n elo: number\n setElo: (value: number) => void\n models: AgentModel[]\n selectedModelId: string\n setSelectedModelId: (id: string) => void\n temperature: number\n setTemperature: (value: number) => void\n onChanged: () => void\n t: (key: string) => string\n}\n\nfunction AgentCapabilityCard({ elo, setElo, models, selectedModelId, setSelectedModelId, temperature, setTemperature, onChanged, t }: CapabilityCardProps) {\n const tierInfo = getEloTier(elo)\n const eloPercent = Math.min(((elo - 800) / (2400 - 800)) * 100, 100)\n\n const provider = getProviderFromModelId(selectedModelId)\n const family = MODEL_FAMILIES[provider] ?? MODEL_FAMILIES.anthropic\n\n // When ELO slider changes, auto-select the right model in the family and adjust temperature\n const handleEloChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n const newElo = parseInt(event.target.value, 10)\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n\n // Find the actual model in the models array that matches this prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // When autonomy segment is clicked, jump to that tier's ELO midpoint\n const handleAutonomyClick = useCallback((level: number) => {\n const eloMap: Record<number, number> = { 25: 1000, 50: 1400, 75: 1800, 100: 2200 }\n const newElo = eloMap[level] ?? 1000\n setElo(newElo)\n\n const newTier = getEloTier(newElo)\n const modelIndex = Math.min(newTier.familyIndex, family.length - 1)\n const targetPrefix = family[modelIndex].prefix\n const matchingModel = models.find((model) => model.id.startsWith(targetPrefix))\n if (matchingModel) {\n setSelectedModelId(matchingModel.id)\n }\n\n setTemperature(newTier.temperature)\n onChanged()\n }, [family, models, setSelectedModelId, setTemperature, onChanged])\n\n // Resolve current model info\n const currentFamilyEntry = family.find((entry) => selectedModelId.startsWith(entry.prefix)) ?? family[0]\n const currentModelName = models.find((model) => model.id === selectedModelId)?.name ?? selectedModelId\n\n return (\n <div className=\"mx-4 mt-4 overflow-hidden rounded-xl border border-gray-200/30 bg-white/40 dark:border-white/10 dark:bg-white/5\">\n {/* ELO slider */}\n <div className=\"px-4 pt-3 pb-2\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{t('agentDrawer.capabilityRating')}</span>\n <div className=\"flex items-baseline gap-1\">\n <span className={`text-lg font-bold tabular-nums ${tierInfo.color}`}>{elo}</span>\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">ELO</span>\n </div>\n </div>\n {/* Interactive ELO slider */}\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className={`h-full rounded-full bg-gradient-to-r ${tierInfo.barColor} transition-all duration-300`}\n style={{ width: `${eloPercent}%` }}\n />\n {[1200, 1600, 2000].map((boundary) => (\n <div\n key={boundary}\n className=\"absolute top-0 h-full w-px bg-gray-400/40 dark:bg-gray-500/40\"\n style={{ left: `${((boundary - 800) / (2400 - 800)) * 100}%` }}\n />\n ))}\n </div>\n <input\n type=\"range\"\n min=\"800\"\n max=\"2400\"\n step=\"50\"\n value={elo}\n onChange={handleEloChange}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent [&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n />\n <style>{`input[type=\"range\"]::-webkit-slider-thumb { background: ${\n elo < 1200 ? '#06b6d4' : elo < 1600 ? '#ec4899' : elo < 2000 ? '#f59e0b' : '#10b981'\n }; box-shadow: 0 0 6px ${\n elo < 1200 ? 'rgba(6,182,212,0.5)' : elo < 1600 ? 'rgba(236,72,153,0.5)' : elo < 2000 ? 'rgba(245,158,11,0.5)' : 'rgba(16,185,129,0.5)'\n }; }`}</style>\n </div>\n <div className=\"mt-0.5 flex justify-between text-[8px] text-gray-400 dark:text-gray-500\">\n <span>800</span>\n <span>1200</span>\n <span>1600</span>\n <span>2000</span>\n <span>2400</span>\n </div>\n </div>\n\n {/* Derived stats grid */}\n <div className=\"grid grid-cols-3 gap-px border-t border-gray-200/30 bg-gray-200/30 dark:border-white/10 dark:bg-white/10\">\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.model')}</p>\n <p className=\"truncate text-xs font-semibold text-gray-900 dark:text-white\">{currentModelName}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.maxTokens')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.maxTokens.toLocaleString()}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.context')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{currentFamilyEntry.contextWindow}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.temperature')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{temperature.toFixed(2)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomy')}</p>\n <p className={`text-xs font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</p>\n </div>\n <div className=\"bg-white/60 px-3 py-2 dark:bg-gray-900/60\">\n <p className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.costPerTask')}</p>\n <p className=\"text-xs font-semibold text-gray-900 dark:text-white\">{tierInfo.costPerTask}</p>\n </div>\n </div>\n\n {/* Clickable autonomy bar */}\n <div className=\"border-t border-gray-200/30 bg-white/60 px-4 py-2.5 dark:border-white/10 dark:bg-gray-900/60\">\n <div className=\"mb-1 flex items-center justify-between\">\n <span className=\"text-[9px] text-gray-400 dark:text-gray-500\">{t('agentDrawer.autonomyLevel')}</span>\n <span className={`text-[10px] font-semibold ${tierInfo.color}`}>{t(`agentDrawer.${tierInfo.autonomyKey}`)}</span>\n </div>\n <div className=\"flex gap-1\">\n {[\n { level: 25, label: 'Low' },\n { level: 50, label: 'Med' },\n { level: 75, label: 'High' },\n { level: 100, label: 'Full' },\n ].map(({ level }) => (\n <button\n key={level}\n type=\"button\"\n onClick={() => handleAutonomyClick(level)}\n className={`h-2 flex-1 rounded-full transition-all ${\n level <= tierInfo.autonomyPercent\n ? `bg-gradient-to-r ${tierInfo.barColor} hover:opacity-80`\n : 'bg-gray-200 hover:bg-gray-300 dark:bg-gray-700 dark:hover:bg-gray-600'\n }`}\n />\n ))}\n </div>\n <div className=\"mt-1 flex justify-between text-[7px] text-gray-400 dark:text-gray-500\">\n <span>{t('agentDrawer.autonomyLow')}</span>\n <span>{t('agentDrawer.autonomyMedium')}</span>\n <span>{t('agentDrawer.autonomyHigh')}</span>\n <span>{t('agentDrawer.autonomyFull')}</span>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ConfigTab({ agent, models, t, selectedModelId, setSelectedModelId, selectedFramework, setSelectedFramework, temperature, setTemperature, dirty, markDirty, markSaved }: {\n agent: AgentWithPrompts; models: AgentModel[]; t: ReturnType<typeof useTranslations>\n selectedModelId: string; setSelectedModelId: (id: string) => void\n selectedFramework: AgentFramework; setSelectedFramework: (fw: AgentFramework) => void\n temperature: number; setTemperature: (value: number) => void\n dirty: boolean; markDirty: () => void; markSaved: () => void\n}) {\n const [promptText, setPromptText] = useState((agent.systemPrompt as string) ?? '')\n\n const handleTemperatureChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setTemperature(parseFloat(event.target.value))\n markDirty()\n }, [])\n\n const handlePromptChange = useCallback((event: React.ChangeEvent<HTMLTextAreaElement>) => {\n setPromptText(event.target.value)\n markDirty()\n }, [])\n\n const handleSave = useCallback(() => {\n markSaved()\n }, [markSaved])\n\n const temperaturePercent = temperature * 100\n const isPrecise = temperature <= 0.3\n const isBalanced = temperature > 0.3 && temperature <= 0.7\n const isCreative = temperature > 0.7\n\n const frameworkKeys = Object.keys(FRAMEWORK_META) as AgentFramework[]\n const compatibleModels = getCompatibleModels(models, selectedFramework)\n\n // When framework changes and current model is incompatible, auto-select first compatible\n const handleFrameworkChange = useCallback((newFramework: AgentFramework) => {\n setSelectedFramework(newFramework)\n if (!isModelCompatibleWithFramework(selectedModelId, newFramework)) {\n const compatible = getCompatibleModels(models, newFramework)\n if (compatible.length > 0) {\n setSelectedModelId(compatible[0].id)\n }\n }\n markDirty()\n }, [selectedModelId, models, setSelectedFramework, setSelectedModelId, markDirty])\n\n return (\n <div className=\"space-y-5 p-4\">\n {/* Framework selector — choose first, it filters models */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.framework')}</label>\n <div className=\"flex flex-wrap gap-1.5\">\n {frameworkKeys.map((key) => {\n const meta = FRAMEWORK_META[key]\n const isSelected = key === selectedFramework\n const compatCount = getCompatibleModels(models, key).length\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => handleFrameworkChange(key)}\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[10px] font-semibold transition-all ${\n isSelected\n ? `${meta.badgeColor} ring-1 ring-current/20`\n : 'bg-gray-100 text-gray-500 hover:bg-gray-200 dark:bg-white/5 dark:text-gray-400 dark:hover:bg-white/10'\n }`}\n >\n <meta.IconComponent className=\"h-3.5 w-3.5\" />\n {meta.label}\n <span className=\"ml-0.5 text-[8px] opacity-60\">{compatCount}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Model selector grid — filtered by framework */}\n <div>\n <label className=\"mb-2 block text-xs font-medium text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.model')}\n {compatibleModels.length < models.length && (\n <span className=\"ml-1.5 text-[10px] font-normal text-gray-400 dark:text-gray-500\">\n ({compatibleModels.length}/{models.length})\n </span>\n )}\n </label>\n <div className=\"grid grid-cols-2 gap-2\">\n {models.map((model) => {\n const isSelected = model.id === selectedModelId\n const isCompatible = isModelCompatibleWithFramework(model.id, selectedFramework)\n const { IconComponent, color, providerLabel } = getModelIcon(model.id)\n return (\n <button\n key={model.id}\n type=\"button\"\n disabled={!isCompatible}\n onClick={() => { setSelectedModelId(model.id); markDirty() }}\n className={`flex items-center gap-2.5 rounded-xl border px-3 py-2.5 text-left transition-all ${\n !isCompatible\n ? 'cursor-not-allowed border-gray-200/30 opacity-35 dark:border-white/5'\n : isSelected\n ? 'border-indigo-500/50 bg-indigo-50/50 ring-1 ring-indigo-500/30 dark:border-indigo-400/40 dark:bg-indigo-500/10'\n : 'border-gray-200/50 bg-gray-50/50 hover:border-gray-300 dark:border-white/10 dark:bg-white/5 dark:hover:border-white/20'\n }`}\n >\n <IconComponent className={`h-5 w-5 flex-shrink-0 ${isSelected && isCompatible ? color : 'text-gray-400 dark:text-gray-500'}`} />\n <div className=\"min-w-0\">\n <p className={`truncate text-xs font-semibold ${isSelected && isCompatible ? 'text-gray-900 dark:text-white' : 'text-gray-600 dark:text-gray-300'}`}>\n {model.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">{providerLabel}</p>\n </div>\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Temperature slider */}\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.temperature')}</label>\n <span className=\"text-sm font-bold tabular-nums text-gray-900 dark:text-white\">\n {temperature.toFixed(2)}\n </span>\n </div>\n {/* Visual gradient bar behind the range input */}\n <div className=\"relative\">\n <div className=\"absolute inset-x-0 top-1/2 h-2 -translate-y-1/2 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700\">\n <div\n className=\"h-full rounded-full transition-all duration-300 ease-out\"\n style={{\n width: `${temperaturePercent}%`,\n background: `linear-gradient(90deg, #3b82f6, #8b5cf6 50%, #ec4899)`,\n }}\n />\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.05\"\n value={temperature}\n onChange={handleTemperatureChange}\n className=\"relative z-10 h-5 w-full cursor-pointer appearance-none bg-transparent [&::-webkit-slider-thumb]:h-5 [&::-webkit-slider-thumb]:w-5 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-white [&::-webkit-slider-thumb]:shadow-lg dark:[&::-webkit-slider-thumb]:border-gray-900\"\n style={{\n // Thumb color based on temperature zone\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ['--thumb-color' as string]: isPrecise ? '#3b82f6' : isBalanced ? '#8b5cf6' : '#ec4899',\n }}\n />\n <style>{`\n input[type=\"range\"]::-webkit-slider-thumb {\n background: ${isPrecise ? '#3b82f6' : isBalanced ? '#8b5cf6' : '#ec4899'};\n box-shadow: 0 0 8px ${isPrecise ? 'rgba(59,130,246,0.5)' : isBalanced ? 'rgba(139,92,246,0.5)' : 'rgba(236,72,153,0.5)'};\n }\n `}</style>\n </div>\n <div className=\"mt-1 flex items-center justify-between\">\n <span className={`text-[10px] font-medium transition-colors ${isPrecise ? 'text-blue-500' : 'text-gray-400 dark:text-gray-500'}`}>\n {t('agentDrawer.precise')}\n </span>\n <span className={`text-[10px] font-medium transition-colors ${isBalanced ? 'text-purple-500' : 'text-gray-400 dark:text-gray-500'}`}>\n {t('agentDrawer.balanced')}\n </span>\n <span className={`text-[10px] font-medium transition-colors ${isCreative ? 'text-pink-500' : 'text-gray-400 dark:text-gray-500'}`}>\n {t('agentDrawer.creative')}\n </span>\n </div>\n </div>\n\n {/* System prompt — editable textarea */}\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.systemPrompt')}</label>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">\n {promptText.length} chars\n </span>\n {dirty && (\n <button\n type=\"button\"\n onClick={handleSave}\n className=\"rounded-md bg-gradient-to-r from-indigo-500 to-purple-500 px-2.5 py-1 text-[10px] font-semibold text-white shadow-sm transition-all hover:from-indigo-600 hover:to-purple-600\"\n >\n {t('agentDrawer.save')}\n </button>\n )}\n {!dirty && promptText.length > 0 && (\n <span className=\"text-[10px] font-medium text-emerald-500\">{t('agentDrawer.saved')}</span>\n )}\n </div>\n </div>\n <textarea\n value={promptText}\n onChange={handlePromptChange}\n rows={8}\n className=\"w-full resize-y rounded-lg border border-gray-200/50 bg-gray-50/50 px-3 py-2.5 font-mono text-xs leading-relaxed text-gray-700 outline-none transition-colors placeholder:text-gray-400 focus:border-indigo-300/50 focus:ring-1 focus:ring-indigo-300/30 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500 dark:focus:border-indigo-500/30 dark:focus:ring-indigo-500/20\"\n placeholder={t('agentDrawer.systemPromptPlaceholder')}\n />\n </div>\n </div>\n )\n}\n\nfunction ResultsTab({ agentId, t }: { agentId: string; t: ReturnType<typeof useTranslations> }) {\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const agentResult = useMemo(() => {\n return nodeResults[agentId] ?? null\n }, [nodeResults, agentId])\n\n if (!agentResult) {\n return (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">{t('agentDrawer.noResults')}</p>\n </div>\n )\n }\n\n const outputs = isRecord(agentResult.data) ? agentResult.data : null\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-gray-500 dark:text-gray-400\">{t('agentDrawer.status')}</span>\n <StatusBadge status={agentResult.status} />\n </div>\n {agentResult.durationMs != null && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.duration')}: {formatDuration(agentResult.durationMs)}\n </span>\n )}\n </div>\n\n {agentResult.error && (\n <div className=\"rounded-xl border border-red-200 bg-red-50 p-3 dark:border-red-900/30 dark:bg-red-900/10\">\n <p className=\"text-xs font-medium text-red-800 dark:text-red-300\">{agentResult.error}</p>\n </div>\n )}\n\n {outputs && Object.keys(outputs).length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('agentDrawer.outputVariables')}\n </h4>\n {Object.entries(outputs).map(([key, value]) => (\n <OutputCard key={key} label={key} value={value} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport function AgentDrawer({ onSaved }: AgentDrawerProps) {\n const t = useTranslations('agents.workflow')\n\n // Read open state + data from drawer store\n const activeDrawer = useDrawerStore((s) => s.activeDrawer)\n const agentData = useDrawerStore((s) => s.agentData)\n const closeDrawer = useDrawerStore((s) => s.closeDrawer)\n\n const open = activeDrawer === 'agent'\n const agent = agentData?.agent ?? null\n const models = agentData?.models ?? []\n const isCreateMode = agentData?.isCreateMode ?? false\n\n // Local editable state — synced when agent changes\n const [activeTab, setActiveTab] = useState<TabId>('config')\n const [selectedModelId, setSelectedModelId] = useState('')\n const [selectedFramework, setSelectedFramework] = useState<string>('custom')\n const [temperature, setTemperature] = useState(0.7)\n const [elo, setElo] = useState(1000)\n const [saved, setSaved] = useState(true)\n\n const agentId = agent?.agentId ?? agent?.id ?? ''\n useEffect(() => {\n if (!agent) return\n setSelectedModelId(agent.modelId ?? models[0]?.id ?? '')\n setSelectedFramework(String((agent as Record<string, unknown>).framework ?? 'custom'))\n setTemperature(agent.temperature ?? 0.7)\n setElo(Number((agent as Record<string, unknown>).elo ?? 1000))\n setSaved(!isCreateMode)\n setActiveTab('config')\n }, [agentId])\n\n const dirty = !saved\n const markDirty = useCallback(() => setSaved(false), [])\n const markSaved = useCallback(() => setSaved(true), [])\n\n const handleClose = useCallback(() => {\n closeDrawer()\n }, [closeDrawer])\n\n const handleMarkSaved = useCallback(() => {\n markSaved()\n onSaved?.()\n }, [markSaved, onSaved])\n\n if (!agent) return null\n\n const tabs = (\n <div className=\"flex border-b border-white/20 dark:border-white/10\">\n {(['config', 'results'] as const).map((tab) => (\n <button\n key={tab}\n type=\"button\"\n onClick={() => setActiveTab(tab)}\n className={`flex-1 px-4 py-2 text-xs font-medium transition-colors ${\n activeTab === tab\n ? 'border-b-2 border-blue-500 text-blue-600 dark:text-blue-400'\n : 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200'\n }`}\n >\n {t(tab === 'config' ? 'agentDrawer.configTab' : 'agentDrawer.resultsTab')}\n </button>\n ))}\n </div>\n )\n\n return (\n <WorkspaceDrawer\n open={open}\n onClose={handleClose}\n title={agent.name}\n subtitle={agent.role ?? ''}\n gradient=\"from-indigo-500 to-purple-600\"\n icon={<CpuChipIcon className=\"h-6 w-6 text-white\" />}\n tabs={tabs}\n >\n {/* Agent profile card header — kori-erp style with avatar + glow */}\n <AgentProfileHeader agent={agent} models={models} t={t} selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId} selectedFramework={selectedFramework as AgentFramework} temperature={temperature} setTemperature={setTemperature} elo={elo} setElo={setElo} onChanged={markDirty} />\n\n {/* Tabs content */}\n {activeTab === 'config' ? (\n <ConfigTab agent={agent} models={models} t={t} selectedModelId={selectedModelId} setSelectedModelId={setSelectedModelId} selectedFramework={selectedFramework as AgentFramework} setSelectedFramework={(fw: AgentFramework) => setSelectedFramework(fw)} temperature={temperature} setTemperature={setTemperature} dirty={dirty} markDirty={markDirty} markSaved={handleMarkSaved} />\n ) : (\n <ResultsTab agentId={agent.agentId} t={t} />\n )}\n </WorkspaceDrawer>\n )\n}\n","/**\n * Subworkflow Drawer Store (Zustand)\n * ===================================\n * State management for the subworkflow drawer — tracks the\n * selected subworkflow, editable fields, and dirty state.\n */\n\nimport { create } from 'zustand'\nimport type { Subworkflow } from '../contracts'\n\ntype SubworkflowStoreState = {\n /** The subworkflow being edited (null = drawer closed) */\n tool: Subworkflow | null\n /** Whether the drawer is open */\n open: boolean\n /** Editable fields */\n name: string\n category: string\n description: string\n timeoutMs: number\n retryCount: number\n /** Whether there are unsaved changes */\n dirty: boolean\n}\n\ntype SubworkflowStoreActions = {\n /** Open the drawer with a subworkflow (empty toolId = create mode) */\n openDrawer: (tool: Subworkflow) => void\n /** Close the drawer and reset state */\n closeDrawer: () => void\n /** Update a field and mark dirty */\n setName: (name: string) => void\n setCategory: (category: string) => void\n setDescription: (description: string) => void\n setTimeoutMs: (timeoutMs: number) => void\n setRetryCount: (retryCount: number) => void\n /** Mark as dirty (e.g. when graph changes) */\n markDirty: () => void\n /** Mark as saved */\n markSaved: () => void\n}\n\nexport type SubworkflowStore = SubworkflowStoreState & SubworkflowStoreActions\n\nexport const useSubworkflowStore = create<SubworkflowStore>((set) => ({\n // State\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n\n // Actions\n openDrawer: (tool) => set({\n tool,\n open: true,\n name: tool.name ?? '',\n category: tool.category ?? 'external',\n description: String(tool.description ?? ''),\n timeoutMs: Number(tool.timeoutMs ?? 10000),\n retryCount: (tool as Record<string, unknown>).retryCount as number ?? 0,\n dirty: !tool.toolId,\n }),\n\n closeDrawer: () => set({\n tool: null,\n open: false,\n name: '',\n category: 'external',\n description: '',\n timeoutMs: 10000,\n retryCount: 0,\n dirty: false,\n }),\n\n setName: (name) => set({ name, dirty: true }),\n setCategory: (category) => set({ category, dirty: true }),\n setDescription: (description) => set({ description, dirty: true }),\n setTimeoutMs: (timeoutMs) => set({ timeoutMs, dirty: true }),\n setRetryCount: (retryCount) => set({ retryCount, dirty: true }),\n markDirty: () => set({ dirty: true }),\n markSaved: () => set({ dirty: false }),\n}))\n","import { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport {\n ArrowPathRoundedSquareIcon,\n ArrowsPointingOutIcon as MaximizeIcon,\n ClockIcon,\n BoltIcon,\n ArrowsPointingInIcon,\n ArrowsPointingOutIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n} from '@heroicons/react/24/outline'\nimport { WorkspaceDrawer } from './workspace-drawer'\nimport { WorkflowCanvas } from '../canvas/workflow-canvas'\nimport { useSubworkflowStore } from '../../store/subworkflow-store'\nimport { CATEGORY_COLORS, CATEGORY_PILL_COLORS, ICON_MAP } from '../../constants'\nimport type { Subworkflow, WorkflowGraph } from '../../contracts'\n\ntype SubworkflowDrawerProps = {\n /** Called when save/create is clicked — receives the merged subworkflow with updated graph */\n onSaved?: (tool: Subworkflow) => void\n /** Called when maximize is clicked — navigate to full workflow editor */\n onMaximize?: (subworkflowId: string) => void\n}\n\nconst DEFAULT_SUBWORKFLOW_GRAPH: WorkflowGraph = {\n nodes: [\n { id: 'start', type: 'start', position: { x: 80, y: 200 }, data: { entityId: 'start', label: 'Start', config: { type: 'start', inputVariables: [] } } },\n { id: 'end', type: 'end', position: { x: 600, y: 200 }, data: { entityId: 'end', label: 'End', config: { type: 'end', outputVariables: [] } } },\n ],\n edges: [\n { id: 'e-start-end', source: 'start', target: 'end', sourceHandle: null, targetHandle: null },\n ],\n viewport: { x: 0, y: 0, zoom: 0.85 },\n}\n\n/* ─── Variable chips ─── */\nfunction VariableChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-teal-200/50 bg-teal-50/50 px-2 py-0.5 text-[10px] dark:border-teal-400/20 dark:bg-teal-400/10\">\n <span className=\"font-semibold text-teal-700 dark:text-teal-300\">{name}</span>\n <span className=\"text-teal-500/60 dark:text-teal-400/50\">: {type}</span>\n </span>\n )\n}\n\nfunction OutputChip({ name, type }: { name: string; type: string }) {\n return (\n <span className=\"inline-flex items-center gap-1 rounded-lg border border-violet-200/50 bg-violet-50/50 px-2 py-0.5 text-[10px] dark:border-violet-400/20 dark:bg-violet-400/10\">\n <span className=\"font-semibold text-violet-700 dark:text-violet-300\">{name}</span>\n <span className=\"text-violet-500/60 dark:text-violet-400/50\">: {type}</span>\n </span>\n )\n}\n\n/* ─── Collapsible config sidebar ─── */\nfunction ConfigSection({ title, icon: Icon, defaultOpen = true, children }: {\n title: string\n icon: React.ComponentType<{ className?: string }>\n defaultOpen?: boolean\n children: React.ReactNode\n}) {\n const [open, setOpen] = useState(defaultOpen)\n return (\n <div className=\"border-b border-white/10\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left hover:bg-white/5\"\n >\n {open ? <ChevronDownIcon className=\"h-3 w-3 text-gray-400\" /> : <ChevronRightIcon className=\"h-3 w-3 text-gray-400\" />}\n <Icon className=\"h-3 w-3 text-gray-400\" />\n <span className=\"text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">{title}</span>\n </button>\n {open && <div className=\"px-4 pb-3\">{children}</div>}\n </div>\n )\n}\n\nexport function SubworkflowDrawer({ onSaved, onMaximize }: SubworkflowDrawerProps) {\n const t = useTranslations('agents.workflow')\n\n // Read all state from Zustand store\n const tool = useSubworkflowStore((s) => s.tool)\n const open = useSubworkflowStore((s) => s.open)\n const name = useSubworkflowStore((s) => s.name)\n const category = useSubworkflowStore((s) => s.category)\n const description = useSubworkflowStore((s) => s.description)\n const timeoutMs = useSubworkflowStore((s) => s.timeoutMs)\n const retryCount = useSubworkflowStore((s) => s.retryCount)\n const dirty = useSubworkflowStore((s) => s.dirty)\n\n // Actions\n const setName = useSubworkflowStore((s) => s.setName)\n const setCategory = useSubworkflowStore((s) => s.setCategory)\n const setDescription = useSubworkflowStore((s) => s.setDescription)\n const setTimeoutMs = useSubworkflowStore((s) => s.setTimeoutMs)\n const setRetryCount = useSubworkflowStore((s) => s.setRetryCount)\n const markDirty = useSubworkflowStore((s) => s.markDirty)\n const markSaved = useSubworkflowStore((s) => s.markSaved)\n const closeDrawer = useSubworkflowStore((s) => s.closeDrawer)\n\n const isCreateMode = !tool?.toolId\n\n const initialGraph = useMemo<WorkflowGraph>(() => {\n const config = tool?.config as Record<string, unknown> | undefined\n if (config?.type === 'workflow' && config.graph) {\n return config.graph as WorkflowGraph\n }\n return DEFAULT_SUBWORKFLOW_GRAPH\n }, [tool])\n\n const latestGraphRef = useMemo(() => ({ current: initialGraph }), [initialGraph])\n\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n latestGraphRef.current = graph\n markDirty()\n }, [latestGraphRef, markDirty])\n\n const handleSave = useCallback(() => {\n markSaved()\n if (tool) {\n onSaved?.({\n ...tool,\n name,\n category,\n description,\n timeoutMs,\n config: { type: 'workflow', graph: latestGraphRef.current },\n })\n }\n }, [tool, onSaved, name, category, description, timeoutMs, latestGraphRef, markSaved])\n\n if (!tool) return null\n\n const categoryKey = (category ?? 'external') as keyof typeof CATEGORY_COLORS\n const gradient = tool.color ?? CATEGORY_COLORS[categoryKey] ?? CATEGORY_COLORS.external\n const categoryPill = CATEGORY_PILL_COLORS[categoryKey] ?? CATEGORY_PILL_COLORS.external\n const IconComponent = ICON_MAP[tool.icon ?? ''] ?? ArrowPathRoundedSquareIcon\n\n // Derive input/output variables from Start and End nodes in the graph\n const graph = latestGraphRef.current\n const startNode = graph.nodes.find((n) => n.type === 'start')\n const endNode = graph.nodes.find((n) => n.type === 'end')\n const startConfig = startNode?.data?.config as { inputVariables?: string[] } | undefined\n const endConfig = endNode?.data?.config as { outputVariables?: string[] } | undefined\n const inputVariables = (startConfig?.inputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n const outputVariables = (endConfig?.outputVariables ?? []).map((v) => ({ name: v, type: 'string' }))\n\n return (\n <WorkspaceDrawer\n open={open}\n onClose={closeDrawer}\n title={isCreateMode ? t('subworkflowDrawer.createTitle') : name}\n subtitle={t('subworkflowDrawer.subworkflow')}\n gradient=\"from-teal-500 to-cyan-600\"\n icon={<ArrowPathRoundedSquareIcon className=\"h-6 w-6 text-white\" />}\n maxWidth=\"max-w-6xl\"\n >\n <div className=\"flex h-[80vh] min-h-[600px]\">\n {/* ─── Left sidebar: config ─── */}\n <div className=\"flex w-72 flex-shrink-0 flex-col overflow-y-auto border-r border-white/10\">\n {/* Header / Name */}\n {isCreateMode ? (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <label className=\"mb-1 block text-[10px] font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('subworkflowDrawer.name')}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder={t('subworkflowDrawer.namePlaceholder')}\n autoFocus\n className=\"w-full rounded-lg border border-gray-200/50 bg-white/60 px-3 py-2 text-sm font-medium text-gray-900 outline-none placeholder:text-gray-400 focus:border-teal-300/50 focus:ring-1 focus:ring-teal-300/30 dark:border-white/10 dark:bg-white/5 dark:text-white dark:placeholder:text-gray-500\"\n />\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {['external', 'market', 'data', 'communication', 'analytics'].map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setCategory(cat)}\n className={`rounded-full px-2 py-1 text-[9px] font-semibold transition-all ${\n cat === category\n ? `${CATEGORY_PILL_COLORS[cat] ?? CATEGORY_PILL_COLORS.external} ring-1 ring-current/20`\n : 'bg-white/30 text-gray-500 hover:bg-white/50 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className=\"border-b border-white/10 bg-gradient-to-br from-teal-500/15 via-cyan-500/8 to-transparent px-4 py-4 dark:from-teal-500/8 dark:via-cyan-500/4\">\n <div className=\"flex items-center gap-3\">\n <div className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <IconComponent className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-sm font-bold text-gray-900 dark:text-white\">{name}</h3>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n <span className=\"inline-flex items-center rounded-full bg-teal-100 px-1.5 py-0.5 text-[8px] font-semibold text-teal-700 dark:bg-teal-400/15 dark:text-teal-400\">\n {t('subworkflowDrawer.subworkflow')}\n </span>\n <span className={`inline-flex items-center rounded-full px-1.5 py-0.5 text-[8px] font-medium ${categoryPill}`}>\n {category}\n </span>\n </div>\n </div>\n {onMaximize && tool.toolId && (\n <button\n type=\"button\"\n onClick={() => onMaximize(tool.toolId)}\n title={t('subworkflowDrawer.openFullEditor')}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-white/10 hover:text-teal-500 dark:hover:text-teal-400\"\n >\n <MaximizeIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Description */}\n <div className=\"border-b border-white/10 px-4 py-3\">\n <textarea\n value={description}\n onChange={(event) => setDescription(event.target.value)}\n rows={2}\n placeholder={t('subworkflowDrawer.descriptionPlaceholder')}\n className=\"w-full resize-none rounded-lg border border-gray-200/50 bg-gray-50/50 px-2.5 py-2 text-[11px] leading-relaxed text-gray-700 outline-none placeholder:text-gray-400 focus:border-teal-300/50 dark:border-white/10 dark:bg-white/5 dark:text-gray-300 dark:placeholder:text-gray-500\"\n />\n </div>\n\n {/* Input variables */}\n <ConfigSection title={t('subworkflowDrawer.inputVariables')} icon={ArrowsPointingInIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {inputVariables.length > 0 ? inputVariables.map((variable) => (\n <VariableChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Output variables */}\n <ConfigSection title={t('subworkflowDrawer.outputVariables')} icon={ArrowsPointingOutIcon}>\n <div className=\"flex flex-wrap gap-1\">\n {outputVariables.length > 0 ? outputVariables.map((variable) => (\n <OutputChip key={variable.name} name={variable.name} type={variable.type} />\n )) : (\n <span className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('subworkflowDrawer.noVariables')}</span>\n )}\n </div>\n </ConfigSection>\n\n {/* Execution settings */}\n <ConfigSection title={t('subworkflowDrawer.executionSettings')} icon={BoltIcon} defaultOpen={false}>\n <div className=\"mb-3\">\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"flex items-center gap-1 text-[10px] text-gray-600 dark:text-gray-400\">\n <ClockIcon className=\"h-3 w-3\" />\n {t('subworkflowDrawer.timeout')}\n </label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{(timeoutMs / 1000).toFixed(0)}s</span>\n </div>\n <input\n type=\"range\"\n min=\"1000\"\n max=\"30000\"\n step=\"1000\"\n value={timeoutMs}\n onChange={(event) => setTimeoutMs(parseInt(event.target.value, 10))}\n className=\"h-3 w-full cursor-pointer appearance-none rounded-full bg-gray-200 dark:bg-gray-700 [&::-webkit-slider-thumb]:h-3 [&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-teal-500\"\n />\n </div>\n <div>\n <div className=\"mb-1 flex items-center justify-between\">\n <label className=\"text-[10px] text-gray-600 dark:text-gray-400\">{t('subworkflowDrawer.retries')}</label>\n <span className=\"text-[10px] font-bold tabular-nums text-gray-900 dark:text-white\">{retryCount}</span>\n </div>\n <div className=\"flex gap-1\">\n {[0, 1, 2, 3].map((count) => (\n <button\n key={count}\n type=\"button\"\n onClick={() => setRetryCount(count)}\n className={`flex-1 rounded py-1 text-[10px] font-medium transition-all ${\n count === retryCount\n ? 'bg-teal-500 text-white'\n : 'bg-gray-100 text-gray-500 dark:bg-white/5 dark:text-gray-400'\n }`}\n >\n {count}\n </button>\n ))}\n </div>\n </div>\n </ConfigSection>\n\n {/* Save button at bottom */}\n <div className=\"mt-auto border-t border-white/10 px-4 py-3\">\n {dirty ? (\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={isCreateMode && !name.trim()}\n className=\"w-full rounded-lg bg-gradient-to-r from-teal-500 to-cyan-500 py-2 text-xs font-semibold text-white shadow-sm transition-all hover:from-teal-600 hover:to-cyan-600 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isCreateMode ? t('subworkflowDrawer.create') : t('subworkflowDrawer.save')}\n </button>\n ) : (\n <div className=\"text-center text-[10px] font-medium text-emerald-500\">{t('subworkflowDrawer.saved')}</div>\n )}\n </div>\n </div>\n\n {/* ─── Right: Full interactive workflow canvas ─── */}\n <div className=\"flex-1\">\n <WorkflowCanvas\n initialGraph={initialGraph}\n agents={[]}\n models={[]}\n tools={[]}\n rules={[]}\n onGraphChange={handleGraphChange}\n />\n </div>\n </div>\n </WorkspaceDrawer>\n )\n}\n","/**\n * Pipeline Settings Drawer\n * ========================\n * Side drawer for editing workflow name and description.\n * Opened via useDrawerStore.openPipelineSettingsDrawer().\n */\n\nimport { useState, useEffect } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Cog6ToothIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, FormInput, FormTextarea } from '@ui/index'\nimport { WorkspaceDrawer } from './workspace-drawer'\nimport { useDrawerStore } from '../../store/drawer-store'\n\ntype PipelineSettingsDrawerProps = {\n onSave: (name: string, description: string) => Promise<void>\n}\n\nexport function PipelineSettingsDrawer({ onSave }: PipelineSettingsDrawerProps) {\n const t = useTranslations('agents.workflow')\n\n const activeDrawer = useDrawerStore((s) => s.activeDrawer)\n const data = useDrawerStore((s) => s.pipelineSettingsData)\n const closeDrawer = useDrawerStore((s) => s.closeDrawer)\n\n const open = activeDrawer === 'pipeline-settings'\n\n const [nameValue, setNameValue] = useState('')\n const [descriptionValue, setDescriptionValue] = useState('')\n const [isSaving, setIsSaving] = useState(false)\n\n // Sync local state when store data changes\n useEffect(() => {\n if (data) {\n setNameValue(data.name)\n setDescriptionValue(data.description)\n }\n }, [data])\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault()\n const trimmedName = nameValue.trim()\n if (!trimmedName) return\n\n setIsSaving(true)\n try {\n await onSave(trimmedName, descriptionValue.trim())\n closeDrawer()\n } catch {\n // Parent handles error display — keep drawer open so user can retry\n } finally {\n setIsSaving(false)\n }\n }\n\n return (\n <WorkspaceDrawer\n open={open}\n onClose={closeDrawer}\n title={t('pipelineSettings')}\n subtitle={t('pipelineSettingsSubtitle')}\n icon={<Cog6ToothIcon className=\"h-5 w-5 text-white\" />}\n gradient=\"from-indigo-500 to-purple-600\"\n >\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <FormInput\n label={t('pipelineName')}\n value={nameValue}\n onValueChange={setNameValue}\n placeholder={t('pipelineNamePlaceholder')}\n required\n />\n\n <FormTextarea\n label={t('pipelineDescription')}\n value={descriptionValue}\n onValueChange={setDescriptionValue}\n placeholder={t('pipelineDescriptionPlaceholder')}\n rows={4}\n />\n\n <div className=\"pt-2\">\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n fullWidth\n loading={isSaving}\n loadingText={t('saving')}\n >\n <CheckIcon className=\"h-4 w-4\" />\n {t('saveSettings')}\n </Button>\n </div>\n </form>\n </WorkspaceDrawer>\n )\n}\n","/**\n * Node Palette (Sidebar)\n * ======================\n * Draggable node templates for the workflow canvas.\n * Users drag items from here onto the React Flow canvas.\n *\n * Sections: Agents (indigo), Tools (teal), Rules (violet), Logic (subcategories)\n * Features: Collapsible sections, search/filter\n */\n\nimport { Children, useState, useMemo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport {\n CpuChipIcon,\n WrenchScrewdriverIcon,\n CommandLineIcon,\n AdjustmentsHorizontalIcon,\n BoltIcon,\n ChevronDownIcon,\n PlusIcon,\n CircleStackIcon,\n ArrowPathRoundedSquareIcon,\n} from '@heroicons/react/24/outline'\nimport type { Subworkflow, AgentTool, AgentRule, WorkflowNodeType } from '../../contracts'\nimport type { AgentWithPrompts, WorkflowEntityDefinition } from '../../types'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport { getEntityGradient, getEntityIcon } from '../../constants/entity-colors'\nimport { createDefaultLogicNodeConfig } from '../../utils/logic-node-defaults'\n\ntype NodePaletteProps = {\n agents: AgentWithPrompts[]\n tools: Subworkflow[]\n agentTools?: AgentTool[]\n rules: AgentRule[]\n entities?: WorkflowEntityDefinition[]\n onCreateAgent?: () => void\n onCreateTool?: () => void\n onCreateAgentTool?: () => void\n onCreateRule?: () => void\n}\n\nfunction onDragStart(\n event: React.DragEvent,\n nodeType: WorkflowNodeType,\n entityId: string,\n label: string,\n config?: string\n) {\n event.dataTransfer.setData('nodeType', nodeType)\n event.dataTransfer.setData('entityId', entityId)\n event.dataTransfer.setData('label', label)\n if (config) {\n event.dataTransfer.setData('config', config)\n }\n event.dataTransfer.effectAllowed = 'move'\n}\n\n// ============================================================================\n// Logic Node Items — organized by subcategory\n// ============================================================================\n\ntype LogicNodeItem = {\n nodeType: WorkflowNodeType\n nameKey: string\n descriptionKey: string\n subcategory: 'control_flow' | 'data_processing' | 'ai_ml' | 'annotation'\n}\n\nconst LOGIC_NODE_ITEMS: LogicNodeItem[] = [\n // Control Flow\n { nodeType: 'start', nameKey: 'startNode', descriptionKey: 'startNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'end', nameKey: 'endNode', descriptionKey: 'endNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'if_else', nameKey: 'ifElseNode', descriptionKey: 'ifElseNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration', nameKey: 'iterationNode', descriptionKey: 'iterationNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'iteration_start', nameKey: 'iterationStartNode', descriptionKey: 'iterationStartNodeDescription', subcategory: 'control_flow' },\n { nodeType: 'group', nameKey: 'groupNode', descriptionKey: 'groupNodeDescription', subcategory: 'control_flow' },\n\n // Data Processing\n { nodeType: 'code', nameKey: 'codeNode', descriptionKey: 'codeNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'http_request', nameKey: 'httpRequestNode', descriptionKey: 'httpRequestNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'template_transform', nameKey: 'templateTransformNode', descriptionKey: 'templateTransformNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_assigner', nameKey: 'variableAssignerNode', descriptionKey: 'variableAssignerNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'variable_aggregator', nameKey: 'variableAggregatorNode', descriptionKey: 'variableAggregatorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'list_operator', nameKey: 'listOperatorNode', descriptionKey: 'listOperatorNodeDescription', subcategory: 'data_processing' },\n { nodeType: 'document_extractor', nameKey: 'documentExtractorNode', descriptionKey: 'documentExtractorNodeDescription', subcategory: 'data_processing' },\n\n // AI/ML\n { nodeType: 'knowledge_base', nameKey: 'knowledgeBaseNode', descriptionKey: 'knowledgeBaseNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'answer', nameKey: 'answerNode', descriptionKey: 'answerNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'question_classifier', nameKey: 'questionClassifierNode', descriptionKey: 'questionClassifierNodeDescription', subcategory: 'ai_ml' },\n { nodeType: 'parameter_extractor', nameKey: 'parameterExtractorNode', descriptionKey: 'parameterExtractorNodeDescription', subcategory: 'ai_ml' },\n\n // Annotation\n { nodeType: 'note', nameKey: 'noteNode', descriptionKey: 'noteNodeDescription', subcategory: 'annotation' },\n]\n\nconst SUBCATEGORY_LABELS: Record<string, string> = {\n control_flow: 'controlFlowSection',\n data_processing: 'dataProcessingSection',\n ai_ml: 'aiMlSection',\n annotation: 'annotationSection',\n}\n\ntype CollapsibleSectionProps = {\n title: string\n icon: React.ReactNode\n colorClass: string\n defaultOpen?: boolean\n count?: number\n onAdd?: () => void\n addLabel?: string\n children: React.ReactNode\n}\n\nfunction SectionHeader({ icon, title, colorClass, count, onAdd, addLabel, isOpen, onToggle }: {\n icon: React.ReactNode\n title: string\n colorClass: string\n count?: number\n onAdd?: () => void\n addLabel?: string\n isOpen: boolean\n onToggle: () => void\n}) {\n return (\n <div className=\"flex items-center justify-between px-4 py-2.5\">\n <button\n type=\"button\"\n onClick={onToggle}\n className=\"flex flex-1 items-center gap-1.5 transition-colors\"\n >\n <span className={`flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-wider ${colorClass}`}>\n {icon}\n {title}\n {count !== undefined && (\n <span className=\"ml-1 rounded-full bg-gray-100 px-1.5 py-px text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n {count}\n </span>\n )}\n </span>\n <ChevronDownIcon\n className={`h-3 w-3 text-gray-400 transition-transform duration-200 ${isOpen ? '' : '-rotate-90'}`}\n />\n </button>\n {onAdd ? (\n <button\n type=\"button\"\n onClick={onAdd}\n title={addLabel}\n className={`rounded-md p-1 transition-colors hover:bg-gray-100 dark:hover:bg-white/10 ${colorClass}`}\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n )\n}\n\nfunction CollapsibleSection({ title, icon, colorClass, defaultOpen = true, count, onAdd, addLabel, children }: CollapsibleSectionProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n const safeChildren = Children.toArray(children)\n\n return (\n <div className=\"border-t border-gray-200/40 dark:border-white/5\">\n <SectionHeader\n icon={icon}\n title={title}\n colorClass={colorClass}\n count={count}\n onAdd={onAdd}\n addLabel={addLabel}\n isOpen={isOpen}\n onToggle={() => setIsOpen((previous) => !previous)}\n />\n {isOpen ? (\n <div className=\"space-y-1.5 px-4 pb-3\">\n {safeChildren}\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction LogicNodeItemCard({ item, translationFunction }: { item: LogicNodeItem; translationFunction: ReturnType<typeof useTranslations> }) {\n const IconComponent = LOGIC_ICON_MAP[item.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[item.nodeType] ?? 'from-gray-400 to-gray-500'\n const defaultConfig = createDefaultLogicNodeConfig(item.nodeType)\n const configJson = defaultConfig ? JSON.stringify(defaultConfig) : undefined\n\n return (\n <div\n draggable\n onDragStart={(event) =>\n onDragStart(event, item.nodeType, item.nodeType, translationFunction(item.nameKey), configJson)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${gradient} shadow-sm`}>\n {IconComponent && <IconComponent className=\"h-3.5 w-3.5 text-white\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {translationFunction(item.nameKey)}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {translationFunction(item.descriptionKey)}\n </p>\n </div>\n </div>\n )\n}\n\nexport function NodePalette({ agents, tools, agentTools = [], rules, entities = [], onCreateAgent, onCreateTool, onCreateAgentTool, onCreateRule }: NodePaletteProps) {\n const t = useTranslations('agents.workflow')\n const [searchQuery, setSearchQuery] = useState('')\n\n const normalizedQuery = searchQuery.toLowerCase().trim()\n\n const filteredAgents = useMemo(\n () => normalizedQuery\n ? agents.filter((agent) =>\n agent.name.toLowerCase().includes(normalizedQuery) ||\n (agent.role ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agents,\n [agents, normalizedQuery]\n )\n\n const filteredTools = useMemo(\n () => normalizedQuery\n ? tools.filter((tool) =>\n tool.name.toLowerCase().includes(normalizedQuery) ||\n (tool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : tools,\n [tools, normalizedQuery]\n )\n\n const filteredAgentTools = useMemo(\n () => normalizedQuery\n ? agentTools.filter((agentTool) =>\n agentTool.name.toLowerCase().includes(normalizedQuery) ||\n (agentTool.category ?? '').toLowerCase().includes(normalizedQuery)\n )\n : agentTools,\n [agentTools, normalizedQuery]\n )\n\n const filteredRules = useMemo(\n () => normalizedQuery\n ? rules.filter((rule) =>\n rule.name.toLowerCase().includes(normalizedQuery)\n )\n : rules,\n [rules, normalizedQuery]\n )\n\n const entityTypes = useMemo(\n () => entities.map((entity) => ({\n id: entity.id,\n label: entity.label,\n description: entity.description,\n fieldCount: entity.fields.length,\n defaultLimit: entity.defaultLimit,\n fields: entity.fields,\n })),\n [entities]\n )\n\n const filteredEntityTypes = useMemo(\n () => normalizedQuery\n ? entityTypes.filter((entity) =>\n entity.label.toLowerCase().includes(normalizedQuery) ||\n entity.description.toLowerCase().includes(normalizedQuery) ||\n entity.id.toLowerCase().includes(normalizedQuery)\n )\n : entityTypes,\n [entityTypes, normalizedQuery]\n )\n\n const filteredLogicItems = useMemo(\n () => normalizedQuery\n ? LOGIC_NODE_ITEMS.filter((item) =>\n t(item.nameKey).toLowerCase().includes(normalizedQuery) ||\n t(item.descriptionKey).toLowerCase().includes(normalizedQuery)\n )\n : LOGIC_NODE_ITEMS,\n [normalizedQuery, t]\n )\n\n // Group filtered logic items by subcategory\n const groupedLogicItems = useMemo(() => {\n const groups: Record<string, LogicNodeItem[]> = {\n control_flow: [],\n data_processing: [],\n ai_ml: [],\n annotation: [],\n }\n for (const item of filteredLogicItems) {\n groups[item.subcategory].push(item)\n }\n return groups\n }, [filteredLogicItems])\n\n function renderLogicSubcategory(subcategory: string, items: LogicNodeItem[], isFirst: boolean) {\n if (items.length === 0) return null\n return (\n <div key={subcategory} className=\"space-y-1.5\">\n <p className={`${isFirst ? 'mt-1' : 'mt-2'} text-[9px] font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500`}>\n {t(SUBCATEGORY_LABELS[subcategory])}\n </p>\n {items.map((item) => (\n <LogicNodeItemCard key={item.nodeType} item={item} translationFunction={t} />\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"liquid-surface w-[260px] flex-shrink-0 overflow-y-auto rounded-none border-0 border-r border-gray-200/30 dark:border-white/5\">\n <div className=\"p-4 pb-2\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500 dark:text-gray-400\">\n {t('palette')}\n </h3>\n {/* Search input */}\n <div className=\"mt-2\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(event) => setSearchQuery(event.target.value)}\n placeholder={t('searchPalette')}\n className=\"liquid-surface w-full rounded-lg px-2.5 py-1.5 text-[11px] text-gray-900 placeholder-gray-400 outline-none transition-colors focus:ring-1 focus:ring-indigo-300/40 dark:text-white dark:placeholder-gray-500 dark:focus:ring-indigo-500/20\"\n />\n </div>\n </div>\n\n {/* Agents Section */}\n <CollapsibleSection\n title={t('agentsSection')}\n icon={<CpuChipIcon className=\"h-3 w-3\" />}\n colorClass=\"text-indigo-600 dark:text-indigo-400\"\n onAdd={onCreateAgent}\n addLabel={t('newAgent')}\n >\n {filteredAgents.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noAgents')}</p>\n ) : filteredAgents.map((agent) => (\n <div\n key={agent.agentId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'agent', agent.agentId, agent.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"relative flex-shrink-0\">\n {agent.avatar ? (\n <img src={agent.avatar as string} alt={agent.name} className=\"h-7 w-7 rounded-full bg-white shadow-sm ring-1 ring-gray-200/50 dark:bg-gray-800 dark:ring-white/10\" />\n ) : (\n <div className=\"flex h-7 w-7 items-center justify-center rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 shadow-sm\">\n <CpuChipIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n )}\n <div className=\"absolute -bottom-0.5 -right-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-indigo-500 ring-1.5 ring-white dark:ring-gray-900\">\n <CpuChipIcon className=\"h-2 w-2 text-white\" />\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {agent.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {agent.role ?? agent.agentId}\n </p>\n </div>\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Agent Tools Section */}\n <CollapsibleSection\n title={t('agentToolsSection')}\n icon={<CommandLineIcon className=\"h-3 w-3\" />}\n colorClass=\"text-amber-600 dark:text-amber-400\"\n onAdd={onCreateAgentTool}\n addLabel={t('newAgentTool')}\n >\n {filteredAgentTools.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noAgentTools')}</p>\n ) : filteredAgentTools.map((agentTool) => (\n <div\n key={agentTool.agentToolId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'agent_tool', agentTool.agentToolId, agentTool.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-amber-400 to-orange-500 shadow-sm\">\n <CommandLineIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {agentTool.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {agentTool.category ?? 'custom'}\n </p>\n </div>\n {!agentTool.enabled && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n off\n </span>\n )}\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Subworkflows Section (formerly Tools) */}\n <CollapsibleSection\n title={t('subworkflowsSection')}\n icon={<ArrowPathRoundedSquareIcon className=\"h-3 w-3\" />}\n colorClass=\"text-teal-600 dark:text-teal-400\"\n onAdd={onCreateTool}\n addLabel={t('newSubworkflow')}\n >\n {filteredTools.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noSubworkflows')}</p>\n ) : filteredTools.map((tool) => (\n <div\n key={tool.toolId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'tool', tool.toolId, tool.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-teal-400 to-emerald-500 shadow-sm\">\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {tool.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {tool.category}\n </p>\n </div>\n {!tool.enabled && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n off\n </span>\n )}\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Rules Section */}\n <CollapsibleSection\n title={t('rulesSection')}\n icon={<AdjustmentsHorizontalIcon className=\"h-3 w-3\" />}\n colorClass=\"text-violet-600 dark:text-violet-400\"\n onAdd={onCreateRule}\n addLabel={t('newRule')}\n >\n {filteredRules.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noRules')}</p>\n ) : filteredRules.map((rule) => (\n <div\n key={rule.ruleId}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'rule', rule.ruleId, rule.name)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className=\"flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br from-violet-400 to-purple-500 shadow-sm\">\n <AdjustmentsHorizontalIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {rule.name}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n P{String(rule.priority ?? '')}\n </p>\n </div>\n {!rule.enabled && (\n <span className=\"rounded-full bg-gray-100 px-1.5 py-0.5 text-[9px] font-medium text-gray-500 dark:bg-white/10 dark:text-gray-400\">\n off\n </span>\n )}\n </div>\n ))}\n </CollapsibleSection>\n\n {/* Data Sources Section */}\n <CollapsibleSection\n title={t('dataSourcesSection')}\n icon={<CircleStackIcon className=\"h-3 w-3\" />}\n colorClass=\"text-blue-600 dark:text-blue-400\"\n count={filteredEntityTypes.length}\n >\n {filteredEntityTypes.length === 0 ? (\n <p className=\"text-[10px] text-gray-400 dark:text-gray-500\">{t('noDataSources')}</p>\n ) : filteredEntityTypes.map((entity) => {\n const defaultConfig = JSON.stringify({\n type: 'entity',\n entityMasterId: entity.id,\n selectedFields: entity.fields.map((field) => field.name),\n filterVariables: {},\n outputVariable: `${entity.label.replace(/\\s+/g, '')}Data`,\n limit: entity.defaultLimit,\n })\n const EntityIcon = getEntityIcon(entity.id)\n const entityGradient = getEntityGradient(entity.id)\n\n return (\n <div\n key={entity.id}\n draggable\n onDragStart={(event) =>\n onDragStart(event, 'entity', entity.id, entity.label, defaultConfig)\n }\n className=\"liquid-surface group flex items-center gap-2 rounded-lg px-3 py-2 transition-all cursor-grab hover:shadow-md active:cursor-grabbing\"\n >\n <div className={`flex h-6 w-6 items-center justify-center rounded-md bg-gradient-to-br ${entityGradient} shadow-sm`}>\n <EntityIcon className=\"h-3.5 w-3.5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-xs font-medium text-gray-900 dark:text-white\">\n {entity.label}\n </p>\n <p className=\"truncate text-[10px] text-gray-400 dark:text-gray-500\">\n {entity.fieldCount} {t('entityFieldsLabel')}\n </p>\n </div>\n </div>\n )\n })}\n </CollapsibleSection>\n\n {/* Logic Section — with subcategories */}\n <CollapsibleSection\n title={t('logicSection')}\n icon={<BoltIcon className=\"h-3 w-3\" />}\n colorClass=\"text-gray-600 dark:text-gray-400\"\n count={filteredLogicItems.length}\n >\n {renderLogicSubcategory('control_flow', groupedLogicItems.control_flow, true)}\n {renderLogicSubcategory('data_processing', groupedLogicItems.data_processing, false)}\n {renderLogicSubcategory('ai_ml', groupedLogicItems.ai_ml, false)}\n {renderLogicSubcategory('annotation', groupedLogicItems.annotation, false)}\n </CollapsibleSection>\n </div>\n )\n}\n","/**\n * Workflow List Bar\n * =================\n *\n * Horizontal tab bar above the workflow canvas showing all workflows.\n * Allows switching active workflow, creating new ones, deleting,\n * and converting a workflow into a reusable subworkflow.\n */\n\nimport { useTranslations } from 'next-intl'\nimport { PlusIcon, TrashIcon, ArrowPathRoundedSquareIcon } from '@heroicons/react/24/outline'\nimport type { Workflow } from '../../contracts'\n\ntype WorkflowListBarProps = {\n workflows: Workflow[]\n activeWorkflowId: string | null\n isLoading: boolean\n onSelect: (workflow: Workflow) => void\n onCreate: () => void\n onDelete: (workflowId: string, workflowName: string) => void\n onConvertToSubworkflow?: (workflow: Workflow) => void\n}\n\nfunction formatRelativeTime(dateString: string | undefined): string {\n if (!dateString) return ''\n const date = new Date(dateString)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMinutes = Math.floor(diffMs / 60_000)\n const diffHours = Math.floor(diffMs / 3_600_000)\n const diffDays = Math.floor(diffMs / 86_400_000)\n\n if (diffMinutes < 1) return 'just now'\n if (diffMinutes < 60) return `${diffMinutes}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n return `${diffDays}d ago`\n}\n\nexport function WorkflowListBar({\n workflows,\n activeWorkflowId,\n isLoading,\n onSelect,\n onCreate,\n onDelete,\n onConvertToSubworkflow,\n}: WorkflowListBarProps) {\n const tWorkflow = useTranslations('agents.workflow')\n\n if (isLoading) {\n return (\n <div className=\"flex items-center gap-2 px-1 pb-3\">\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n <div className=\"shimmer h-10 w-40 rounded-xl\" />\n </div>\n )\n }\n\n return (\n <div className=\"flex items-center gap-2 overflow-x-auto px-1 pb-3 scrollbar-hide\">\n {workflows.map((workflow) => {\n const isActive = workflow.id === activeWorkflowId\n return (\n <div\n key={workflow.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => onSelect(workflow)}\n onKeyDown={(event) => { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); onSelect(workflow) } }}\n className={`liquid-surface group relative flex shrink-0 cursor-pointer items-center gap-2.5 rounded-xl px-3.5 py-2 text-left transition-all duration-200 ${\n isActive\n ? 'liquid-surface-active'\n : 'hover:shadow-md'\n }`}\n style={isActive ? { '--glass-accent': '99, 102, 241' } as React.CSSProperties : undefined}\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`truncate text-sm font-medium ${\n isActive\n ? 'text-indigo-700 dark:text-indigo-300'\n : 'text-gray-700 dark:text-gray-300'\n }`}>\n {workflow.name}\n </span>\n <span className=\"shrink-0 rounded-full bg-gray-100 px-1.5 py-0.5 text-[10px] font-medium text-gray-500 dark:bg-gray-800 dark:text-gray-400\">\n v{workflow.version}\n </span>\n {workflow.isDraft ? (\n <span className=\"shrink-0 rounded-full bg-amber-100 px-1.5 py-0.5 text-[10px] font-semibold text-amber-700 dark:bg-amber-900/30 dark:text-amber-300\">\n {tWorkflow('draftBadge')}\n </span>\n ) : (\n <span className=\"shrink-0 rounded-full bg-green-100 px-1.5 py-0.5 text-[10px] font-semibold text-green-700 dark:bg-green-900/30 dark:text-green-300\">\n {tWorkflow('published')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 text-[10px] text-gray-400 dark:text-gray-500\">\n {formatRelativeTime(typeof workflow.updatedAt === 'string' ? workflow.updatedAt : workflow.updatedAt.toISOString())}\n </p>\n </div>\n\n {/* Action buttons — visible on hover */}\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100\">\n {/* Convert to subworkflow */}\n {onConvertToSubworkflow && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onConvertToSubworkflow(workflow)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-teal-50 hover:text-teal-600 dark:hover:bg-teal-950/30 dark:hover:text-teal-400\"\n aria-label={`${tWorkflow('convertToSubworkflow')} ${workflow.name}`}\n title={tWorkflow('convertToSubworkflow')}\n >\n <ArrowPathRoundedSquareIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {/* Delete */}\n {workflows.length > 1 && (\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation()\n onDelete(workflow.id, workflow.name)\n }}\n className=\"rounded-md p-1 text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 dark:hover:bg-red-950/30 dark:hover:text-red-400\"\n aria-label={`${tWorkflow('deleteWorkflow')} ${workflow.name}`}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Create new workflow button */}\n <button\n type=\"button\"\n onClick={onCreate}\n className=\"liquid-surface flex shrink-0 items-center gap-1.5 rounded-xl !border-dashed px-3 py-2 text-xs font-medium text-gray-500 transition-all hover:shadow-md hover:text-indigo-600 dark:text-gray-400 dark:hover:text-indigo-400\"\n >\n <PlusIcon className=\"h-3.5 w-3.5\" />\n {tWorkflow('newWorkflow')}\n </button>\n </div>\n )\n}\n","/**\n * Version History Panel\n * =====================\n * Side panel listing published versions of a workflow.\n * Shows version number, publication timestamp, publisher,\n * and node/edge counts. Provides preview (read-only overlay)\n * and restore (revert draft) actions per version.\n */\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { ClockIcon, ArrowPathIcon, EyeIcon, XMarkIcon } from '@heroicons/react/24/outline'\n\ntype WorkflowVersion = {\n version: number\n publishedAt: string\n publishedBy: string\n nodeCount: number\n edgeCount: number\n}\n\ntype VersionHistoryPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n currentVersion: number\n onPreview: (version: WorkflowVersion) => void\n onRestore: (version: WorkflowVersion) => void\n fetchVersions?: (workflowId: string) => Promise<WorkflowVersion[]>\n}\n\nexport function VersionHistoryPanel({\n open,\n onClose,\n workflowId,\n currentVersion,\n onPreview,\n onRestore,\n fetchVersions,\n}: VersionHistoryPanelProps) {\n const translations = useTranslations('agents.workflow.versionHistory')\n const [versions, setVersions] = useState<WorkflowVersion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n const loadVersions = useCallback(async () => {\n if (!fetchVersions) return\n\n setIsLoading(true)\n setLoadError(null)\n\n try {\n const fetchedVersions = await fetchVersions(workflowId)\n setVersions(fetchedVersions)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to load versions'\n setLoadError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }, [fetchVersions, workflowId])\n\n useEffect(() => {\n if (open) {\n loadVersions()\n }\n }, [open, loadVersions])\n\n const formatTimestamp = useCallback((timestamp: string) => {\n try {\n const date = new Date(timestamp)\n return new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date)\n } catch {\n return timestamp\n }\n }, [])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"version-history-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <ClockIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"version-history-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Version List */}\n <div className=\"flex-1 overflow-y-auto\">\n {isLoading && (\n <div className=\"flex items-center justify-center py-12\" data-testid=\"version-history-loading\">\n <div className=\"h-6 w-6 animate-spin rounded-full border-2 border-blue-500 border-t-transparent\" />\n </div>\n )}\n\n {loadError && (\n <div className=\"px-4 py-8 text-center\" data-testid=\"version-history-error\">\n <p className=\"text-sm text-red-500 dark:text-red-400\">{loadError}</p>\n <button\n type=\"button\"\n onClick={loadVersions}\n className=\"mt-2 text-xs text-blue-600 hover:underline dark:text-blue-400\"\n >\n {translations('retry')}\n </button>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length === 0 && (\n <div className=\"px-4 py-12 text-center\" data-testid=\"version-history-empty\">\n <ClockIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noVersions')}\n </p>\n </div>\n )}\n\n {!isLoading && !loadError && versions.length > 0 && (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {versions.map((version) => {\n const isCurrentVersion = version.version === currentVersion\n return (\n <div\n key={version.version}\n className={`px-4 py-3 transition-colors ${\n isCurrentVersion\n ? 'bg-blue-50 dark:bg-blue-500/10'\n : 'hover:bg-gray-50 dark:hover:bg-gray-800/50'\n }`}\n data-testid={`version-entry-${version.version}`}\n >\n {/* Version Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n v{version.version}\n </span>\n {isCurrentVersion && (\n <span className=\"rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\">\n {translations('current')}\n </span>\n )}\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n <div>{formatTimestamp(version.publishedAt)}</div>\n <div className=\"mt-0.5\">\n {translations('publishedBy')}: {version.publishedBy}\n </div>\n <div className=\"mt-0.5\">\n {version.nodeCount} {translations('nodes')} / {version.edgeCount} {translations('edges')}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"mt-2 flex gap-2\">\n <button\n type=\"button\"\n onClick={() => onPreview(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-gray-300 px-2 py-1 text-xs font-medium text-gray-600 transition-colors hover:bg-gray-100 dark:border-gray-600 dark:text-gray-400 dark:hover:bg-gray-700\"\n data-testid={`version-preview-${version.version}`}\n >\n <EyeIcon className=\"h-3 w-3\" />\n {translations('preview')}\n </button>\n {!isCurrentVersion && (\n <button\n type=\"button\"\n onClick={() => onRestore(version)}\n className=\"inline-flex items-center gap-1 rounded-md border border-blue-300 px-2 py-1 text-xs font-medium text-blue-600 transition-colors hover:bg-blue-50 dark:border-blue-600 dark:text-blue-400 dark:hover:bg-blue-500/10\"\n data-testid={`version-restore-${version.version}`}\n >\n <ArrowPathIcon className=\"h-3 w-3\" />\n {translations('restore')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport type { WorkflowVersion }\n","/**\n * Run Panel\n * =========\n * Bottom panel showing workflow execution progress.\n * Displays each node with a status icon (pending, running,\n * success, error), duration, and error messages.\n * Provides Run/Stop controls tied to the workflow store.\n */\n\nimport { useTranslations } from 'next-intl'\nimport {\n PlayIcon,\n StopIcon,\n CheckCircleIcon,\n XCircleIcon,\n ClockIcon,\n XMarkIcon,\n ChevronUpIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype RunPanelProps = {\n open: boolean\n onClose: () => void\n onRun: () => void\n onStop: () => void\n}\n\nconst STATUS_CONFIG = {\n pending: {\n icon: ClockIcon,\n color: 'text-gray-400 dark:text-gray-500',\n background: 'bg-gray-100 dark:bg-gray-800',\n label: 'pending',\n },\n running: {\n icon: SpinnerIcon,\n color: 'text-blue-500 dark:text-blue-400',\n background: 'bg-blue-50 dark:bg-blue-500/10',\n label: 'running',\n },\n success: {\n icon: CheckCircleIcon,\n color: 'text-green-500 dark:text-green-400',\n background: 'bg-green-50 dark:bg-green-500/10',\n label: 'success',\n },\n error: {\n icon: XCircleIcon,\n color: 'text-red-500 dark:text-red-400',\n background: 'bg-red-50 dark:bg-red-500/10',\n label: 'error',\n },\n} as const\n\nfunction formatDuration(durationMs: number): string {\n if (durationMs < 1000) {\n return `${durationMs}ms`\n }\n const seconds = (durationMs / 1000).toFixed(1)\n return `${seconds}s`\n}\n\nexport function RunPanel({ open, onClose, onRun, onStop }: RunPanelProps) {\n const translations = useTranslations('agents.workflow.runPanel')\n const nodes = useWorkflowStore((state) => state.nodes)\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n const startNode = nodes.find((node) => node.type === 'start')\n const hasEndNode = nodes.some((node) => node.type === 'end')\n const hasValidStartConfig = Boolean(\n startNode &&\n typeof startNode.data === 'object' &&\n startNode.data !== null &&\n 'config' in startNode.data &&\n startNode.data.config &&\n typeof (startNode.data.config as StartNodeConfig).type === 'string'\n )\n const canRun = hasValidStartConfig && hasEndNode\n\n if (!open) return null\n\n const executionNodes = nodes.filter((node) => node.type !== 'note')\n\n return (\n <div\n className=\"absolute bottom-0 left-0 right-0 z-40 border-t border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"run-panel\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-100 px-4 py-2 dark:border-gray-800\">\n <div className=\"flex items-center gap-2\">\n <PlayIcon className=\"h-4 w-4 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n {isRunning && (\n <span className=\"flex items-center gap-1 rounded-full bg-blue-100 px-2 py-0.5 text-[10px] font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300\">\n <span className=\"h-1.5 w-1.5 animate-pulse rounded-full bg-blue-500\" />\n {translations('executing')}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {/* Run / Stop Buttons */}\n {isRunning ? (\n <button\n type=\"button\"\n onClick={onStop}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-red-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-red-600\"\n data-testid=\"run-panel-stop\"\n >\n <StopIcon className=\"h-3.5 w-3.5\" />\n {translations('stop')}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onRun}\n disabled={!canRun}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-green-500 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-green-600 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-green-500\"\n data-testid=\"run-panel-run\"\n >\n <PlayIcon className=\"h-3.5 w-3.5\" />\n {translations('run')}\n </button>\n )}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"run-panel-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n {/* Node Execution List */}\n <div className=\"max-h-48 overflow-y-auto px-4 py-2\">\n {executionNodes.length === 0 ? (\n <div className=\"py-4 text-center text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {executionNodes.map((node) => {\n const result = nodeResults[node.id]\n const status = result?.status ?? 'pending'\n const statusConfig = STATUS_CONFIG[status]\n const StatusIconComponent = statusConfig.icon\n const nodeLabel =\n typeof node.data === 'object' && node.data !== null && 'label' in node.data\n ? String(node.data.label)\n : node.id\n\n return (\n <div\n key={node.id}\n className={`flex items-center gap-3 rounded-lg px-3 py-2 ${statusConfig.background}`}\n data-testid={`run-node-${node.id}`}\n >\n {/* Status Icon */}\n <StatusIconComponent className={`h-4 w-4 flex-shrink-0 ${statusConfig.color}`} />\n\n {/* Node Info */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {nodeLabel}\n </span>\n <span className=\"rounded bg-gray-200 px-1.5 py-0.5 text-[10px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {node.type}\n </span>\n </div>\n {result?.error && (\n <p className=\"mt-0.5 truncate text-xs text-red-500 dark:text-red-400\">\n {result.error}\n </p>\n )}\n </div>\n\n {/* Duration */}\n {result?.durationMs !== undefined && (\n <span className=\"flex-shrink-0 text-xs text-gray-500 dark:text-gray-400\">\n {formatDuration(result.durationMs)}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Inline spinner icon for running status (animated).\n */\nfunction SpinnerIcon({ className }: { className?: string }) {\n return (\n <svg\n className={`animate-spin ${className ?? ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeOpacity={0.25} />\n <path d=\"M12 2a10 10 0 0 1 10 10\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n","/**\n * Variable Inspector\n * ==================\n * Side panel that analyzes variable flow through the workflow graph.\n * Walks nodes in topological order and infers input/output variables\n * from each node's config type. Shows a collapsible tree view per node.\n */\n\nimport { useMemo, useState, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { VariableIcon, XMarkIcon, ChevronRightIcon, ChevronDownIcon } from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport { LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS } from '../../constants/workflow-constants'\nimport type { LogicNodeConfig } from '../../contracts'\nimport type { Node } from '@xyflow/react'\n\ntype VariableInspectorProps = {\n open: boolean\n onClose: () => void\n}\n\ntype VariableInfo = {\n name: string\n direction: 'input' | 'output'\n variableType: string\n}\n\ntype NodeVariableEntry = {\n nodeId: string\n nodeLabel: string\n nodeType: string\n variables: VariableInfo[]\n}\n\n/**\n * Performs a topological sort on the node graph using Kahn's algorithm.\n * Returns node IDs in execution order.\n */\nfunction topologicalSort(\n nodes: Node[],\n edges: Array<{ source: string; target: string }>,\n): string[] {\n const adjacencyList = new Map<string, string[]>()\n const inDegree = new Map<string, number>()\n\n for (const node of nodes) {\n adjacencyList.set(node.id, [])\n inDegree.set(node.id, 0)\n }\n\n for (const edge of edges) {\n const neighbors = adjacencyList.get(edge.source)\n if (neighbors) {\n neighbors.push(edge.target)\n }\n inDegree.set(edge.target, (inDegree.get(edge.target) ?? 0) + 1)\n }\n\n const queue: string[] = []\n for (const [nodeId, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(nodeId)\n }\n }\n\n const sorted: string[] = []\n while (queue.length > 0) {\n const currentNodeId = queue.shift()!\n sorted.push(currentNodeId)\n\n const neighbors = adjacencyList.get(currentNodeId) ?? []\n for (const neighborId of neighbors) {\n const updatedDegree = (inDegree.get(neighborId) ?? 1) - 1\n inDegree.set(neighborId, updatedDegree)\n if (updatedDegree === 0) {\n queue.push(neighborId)\n }\n }\n }\n\n // Add any remaining nodes (disconnected) at the end\n for (const node of nodes) {\n if (!sorted.includes(node.id)) {\n sorted.push(node.id)\n }\n }\n\n return sorted\n}\n\n/**\n * Infers input and output variables from a node's config.\n */\nfunction inferVariables(config: LogicNodeConfig | undefined, nodeType: string): VariableInfo[] {\n if (!config) {\n return []\n }\n\n const variables: VariableInfo[] = []\n\n switch (config.type) {\n case 'start':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'end':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n break\n\n case 'code':\n // Attempt to detect variables from code (simple heuristic)\n variables.push({ name: 'code_input', direction: 'input', variableType: config.language })\n variables.push({ name: 'code_output', direction: 'output', variableType: 'any' })\n break\n\n case 'http_request':\n variables.push({ name: 'url', direction: 'input', variableType: 'string' })\n variables.push({ name: 'response', direction: 'output', variableType: 'object' })\n if (config.body) {\n variables.push({ name: 'body', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'template_transform':\n variables.push({ name: 'template', direction: 'input', variableType: 'string' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'string' })\n }\n break\n\n case 'if_else':\n for (const condition of config.conditions) {\n if (condition.variable) {\n variables.push({ name: condition.variable, direction: 'input', variableType: 'any' })\n }\n }\n variables.push({ name: 'true_branch', direction: 'output', variableType: 'boolean' })\n variables.push({ name: 'false_branch', direction: 'output', variableType: 'boolean' })\n break\n\n case 'iteration':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n variables.push({ name: 'iteration_item', direction: 'output', variableType: 'any' })\n variables.push({ name: 'iteration_index', direction: 'output', variableType: 'number' })\n break\n\n case 'iteration_start':\n if (config.iteratorVariable) {\n variables.push({ name: config.iteratorVariable, direction: 'input', variableType: 'array' })\n }\n if (config.itemVariable) {\n variables.push({ name: config.itemVariable, direction: 'output', variableType: 'any' })\n }\n if (config.indexVariable) {\n variables.push({ name: config.indexVariable, direction: 'output', variableType: 'number' })\n }\n break\n\n case 'knowledge_base':\n variables.push({ name: 'query', direction: 'input', variableType: 'string' })\n variables.push({ name: 'results', direction: 'output', variableType: 'array' })\n break\n\n case 'answer':\n for (const variableName of config.outputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'output', variableType: 'any' })\n }\n }\n if (config.outputTemplate) {\n variables.push({ name: 'answer_template', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'question_classifier':\n variables.push({ name: 'question', direction: 'input', variableType: 'string' })\n for (const category of config.categories) {\n if (category.name) {\n variables.push({ name: `category_${category.name}`, direction: 'output', variableType: 'string' })\n }\n }\n break\n\n case 'parameter_extractor':\n variables.push({ name: 'input_text', direction: 'input', variableType: 'string' })\n for (const parameter of config.parameters) {\n if (parameter.name) {\n variables.push({ name: parameter.name, direction: 'output', variableType: parameter.type })\n }\n }\n break\n\n case 'variable_assigner':\n for (const assignment of config.assignments) {\n if (assignment.source) {\n variables.push({ name: assignment.source, direction: 'input', variableType: 'any' })\n }\n if (assignment.target) {\n variables.push({ name: assignment.target, direction: 'output', variableType: 'any' })\n }\n }\n break\n\n case 'variable_aggregator':\n for (const variableName of config.inputVariables) {\n if (variableName) {\n variables.push({ name: variableName, direction: 'input', variableType: 'any' })\n }\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.aggregationMode })\n }\n break\n\n case 'document_extractor':\n variables.push({ name: 'document', direction: 'input', variableType: 'file' })\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: config.extractionMode })\n }\n break\n\n case 'list_operator':\n if (config.inputVariable) {\n variables.push({ name: config.inputVariable, direction: 'input', variableType: 'array' })\n }\n if (config.outputVariable) {\n variables.push({ name: config.outputVariable, direction: 'output', variableType: 'array' })\n }\n if (config.condition) {\n variables.push({ name: 'condition', direction: 'input', variableType: 'string' })\n }\n break\n\n case 'note':\n // Notes have no variables\n break\n }\n\n return variables\n}\n\nexport function VariableInspector({ open, onClose }: VariableInspectorProps) {\n const translations = useTranslations('agents.workflow.variableInspector')\n const nodes = useWorkflowStore((state) => state.nodes)\n const edges = useWorkflowStore((state) => state.edges)\n\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(new Set())\n\n const toggleNodeExpansion = useCallback((nodeId: string) => {\n setExpandedNodes((current) => {\n const updated = new Set(current)\n if (updated.has(nodeId)) {\n updated.delete(nodeId)\n } else {\n updated.add(nodeId)\n }\n return updated\n })\n }, [])\n\n const nodeVariableEntries: NodeVariableEntry[] = useMemo(() => {\n // Filter out note nodes\n const relevantNodes = nodes.filter((node) => node.type !== 'note')\n\n // Get topological order\n const sortedNodeIds = topologicalSort(relevantNodes, edges)\n\n // Build entries\n const entries: NodeVariableEntry[] = []\n\n for (const nodeId of sortedNodeIds) {\n const node = relevantNodes.find((candidateNode) => candidateNode.id === nodeId)\n if (!node) continue\n\n const nodeData = node.data as Record<string, unknown> | undefined\n const config = nodeData?.config as LogicNodeConfig | undefined\n const label = (nodeData?.label as string) ?? node.id\n const nodeType = (node.type as string) ?? 'unknown'\n\n const variables = inferVariables(config, nodeType)\n\n entries.push({\n nodeId: node.id,\n nodeLabel: label,\n nodeType,\n variables,\n })\n }\n\n return entries\n }, [nodes, edges])\n\n if (!open) return null\n\n return (\n <div\n className=\"absolute right-0 top-0 z-40 flex h-full w-80 flex-col border-l border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-900\"\n data-testid=\"variable-inspector\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3 dark:border-gray-700\">\n <div className=\"flex items-center gap-2\">\n <VariableIcon className=\"h-5 w-5 text-gray-500 dark:text-gray-400\" />\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">\n {translations('title')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n data-testid=\"variable-inspector-close\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n {/* Variable Tree */}\n <div className=\"flex-1 overflow-y-auto\">\n {nodeVariableEntries.length === 0 ? (\n <div className=\"px-4 py-12 text-center\" data-testid=\"variable-inspector-empty\">\n <VariableIcon className=\"mx-auto h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"mt-2 text-sm text-gray-500 dark:text-gray-400\">\n {translations('noNodes')}\n </p>\n </div>\n ) : (\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {nodeVariableEntries.map((entry) => {\n const isExpanded = expandedNodes.has(entry.nodeId)\n const IconComponent = LOGIC_ICON_MAP[entry.nodeType]\n const gradient = LOGIC_NODE_GRADIENTS[entry.nodeType] ?? 'from-gray-400 to-gray-500'\n const inputVariables = entry.variables.filter((variable) => variable.direction === 'input')\n const outputVariables = entry.variables.filter((variable) => variable.direction === 'output')\n\n return (\n <div key={entry.nodeId} data-testid={`variable-node-${entry.nodeId}`}>\n {/* Node Header (collapsible) */}\n <button\n type=\"button\"\n onClick={() => toggleNodeExpansion(entry.nodeId)}\n className=\"flex w-full items-center gap-2 px-4 py-2.5 text-left transition-colors hover:bg-gray-50 dark:hover:bg-gray-800/50\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n ) : (\n <ChevronRightIcon className=\"h-3.5 w-3.5 flex-shrink-0 text-gray-400\" />\n )}\n <div className={`flex h-5 w-5 flex-shrink-0 items-center justify-center rounded bg-gradient-to-br ${gradient}`}>\n {IconComponent && <IconComponent className=\"h-3 w-3 text-white\" />}\n </div>\n <span className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {entry.nodeLabel}\n </span>\n <span className=\"ml-auto flex-shrink-0 text-[10px] text-gray-400 dark:text-gray-500\">\n {entry.variables.length} {translations('variables')}\n </span>\n </button>\n\n {/* Expanded Variable List */}\n {isExpanded && (\n <div className=\"bg-gray-50/50 px-4 pb-2 dark:bg-gray-800/30\">\n {entry.variables.length === 0 ? (\n <p className=\"py-2 pl-9 text-xs italic text-gray-400 dark:text-gray-500\">\n {translations('noVariables')}\n </p>\n ) : (\n <>\n {/* Input Variables */}\n {inputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('inputs')}\n </div>\n {inputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-blue-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* Output Variables */}\n {outputVariables.length > 0 && (\n <div className=\"pl-9 pt-1\">\n <div className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('outputs')}\n </div>\n {outputVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${index}`}\n className=\"flex items-center gap-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-green-400\" />\n <span className=\"text-xs text-gray-700 dark:text-gray-300\">\n {variable.name}\n </span>\n <span className=\"rounded bg-gray-200 px-1 py-0.5 text-[9px] text-gray-500 dark:bg-gray-700 dark:text-gray-400\">\n {variable.variableType}\n </span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { PlayIcon } from '@heroicons/react/24/outline'\nimport { Button, FormModal, Input } from '@ui/index'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { StartNodeConfig } from '../../contracts'\n\ntype VariableValue = string | number | boolean | null\n\nexport type RunInputDialogProps = {\n open: boolean\n onClose: () => void\n onRun: (inputVariables: Record<string, VariableValue>) => void\n}\n\nexport function RunInputDialog({\n open,\n onClose,\n onRun,\n}: RunInputDialogProps) {\n const t = useTranslations('agents.workflow.runInputDialog')\n const nodes = useWorkflowStore((state) => state.nodes)\n const [values, setValues] = useState<Record<string, string>>({})\n\n const inputVariableNames = useMemo(() => {\n const storeStartNode = nodes.find((node) => node.type === 'start')\n if (!storeStartNode || typeof storeStartNode.data !== 'object' || storeStartNode.data === null) return []\n if (!('config' in storeStartNode.data) || !storeStartNode.data.config) return []\n const startConfig = storeStartNode.data.config as StartNodeConfig\n return startConfig.inputVariables ?? []\n }, [nodes])\n\n const handleValueChange = useCallback((variableName: string, variableValue: string) => {\n setValues((previous) => ({ ...previous, [variableName]: variableValue }))\n }, [])\n\n const handleSubmit = useCallback(() => {\n const inputVariables: Record<string, VariableValue> = {}\n for (const variableName of inputVariableNames) {\n inputVariables[variableName] = values[variableName] ?? ''\n }\n onRun(inputVariables)\n onClose()\n setValues({})\n }, [inputVariableNames, values, onRun, onClose])\n\n const handleClose = useCallback(() => {\n onClose()\n setValues({})\n }, [onClose])\n\n if (!open) return null\n\n return (\n <FormModal\n open={open}\n onClose={handleClose}\n title={t('title')}\n subtitle={t('subtitle')}\n maxWidth=\"md\"\n showFooter={false}\n >\n <div className=\"space-y-3\">\n {inputVariableNames.length === 0 ? (\n <p className=\"text-center text-sm text-gray-500 dark:text-gray-400\">{t('noInputs')}</p>\n ) : (\n inputVariableNames.map((variableName) => (\n <div key={variableName}>\n <label className=\"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300\">{variableName}</label>\n <Input\n value={values[variableName] ?? ''}\n onChange={(event) => handleValueChange(variableName, event.target.value)}\n placeholder={`${t('variableValue')}...`}\n />\n </div>\n ))\n )}\n </div>\n <div className=\"mt-4 flex items-center justify-end gap-2\">\n <Button size=\"sm\" plain onClick={handleClose}>{t('cancel')}</Button>\n <Button size=\"sm\" gradient onClick={handleSubmit}>\n <PlayIcon className=\"h-3.5 w-3.5\" data-slot=\"icon\" />\n {t('run')}\n </Button>\n </div>\n </FormModal>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useTranslations } from 'next-intl'\nimport {\n XMarkIcon,\n ClockIcon,\n CheckCircleIcon,\n ExclamationCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport { useWorkflowStore } from '../../store/workflow-store'\nimport type { NodeExecutionResult, WorkflowRun } from '../../contracts'\n\nexport type PreviewPanelProps = {\n open: boolean\n onClose: () => void\n workflowId: string\n loadRuns: (workflowId: string) => Promise<WorkflowRun[]>\n}\n\nconst STATUS_STYLES: Record<string, { icon: typeof CheckCircleIcon; colorClass: string }> = {\n completed: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n failed: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n running: { icon: ArrowPathIcon, colorClass: 'text-blue-500 animate-spin' },\n pending: { icon: ClockIcon, colorClass: 'text-gray-400' },\n success: { icon: CheckCircleIcon, colorClass: 'text-green-500' },\n error: { icon: ExclamationCircleIcon, colorClass: 'text-red-500' },\n skipped: { icon: ClockIcon, colorClass: 'text-gray-400' },\n}\n\nfunction formatDuration(durationMs: number | null): string {\n if (durationMs === null) return '—'\n if (durationMs < 1000) return `${durationMs}ms`\n return `${(durationMs / 1000).toFixed(1)}s`\n}\n\nfunction formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp)\n return date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\nexport function PreviewPanel({ open, onClose, workflowId, loadRuns }: PreviewPanelProps) {\n const t = useTranslations('agents.workflow.previewPanel')\n const [runs, setRuns] = useState<WorkflowRun[]>([])\n const [isLoadingRuns, setIsLoadingRuns] = useState(false)\n const [selectedRun, setSelectedRun] = useState<WorkflowRun | null>(null)\n const [selectedNode, setSelectedNode] = useState<NodeExecutionResult | null>(null)\n\n const isRunning = useWorkflowStore((state) => state.isRunning)\n const nodeResults = useWorkflowStore((state) => state.nodeResults)\n\n const refreshRuns = useCallback(async () => {\n setIsLoadingRuns(true)\n try {\n const workflowRuns = await loadRuns(workflowId)\n setRuns(workflowRuns)\n } finally {\n setIsLoadingRuns(false)\n }\n }, [loadRuns, workflowId])\n\n useEffect(() => {\n if (open) void refreshRuns()\n }, [open, refreshRuns])\n\n useEffect(() => {\n if (!isRunning && open) void refreshRuns()\n }, [isRunning, open, refreshRuns])\n\n if (!open) return null\n\n return (\n <>\n <div className=\"fixed inset-x-0 top-[120px] bottom-0 z-40 bg-black/10 backdrop-blur-[1px]\" onClick={onClose} />\n <div className=\"fixed right-0 top-[120px] bottom-0 z-50 w-96 overflow-hidden border-l border-white/20 bg-white/95 shadow-2xl backdrop-blur-xl dark:border-gray-700/50 dark:bg-gray-800/95\">\n <div className=\"flex items-center justify-between border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{t('title')}</h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n >\n <XMarkIcon className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex h-full flex-col overflow-hidden\">\n {isRunning && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center gap-2\">\n <ArrowPathIcon className=\"h-4 w-4 animate-spin text-blue-500\" />\n <span className=\"text-xs font-semibold text-blue-600 dark:text-blue-400\">{t('activeRun')}</span>\n </div>\n <div className=\"max-h-60 space-y-1 overflow-y-auto\">\n {Object.entries(nodeResults).map(([nodeId, result]) => {\n const statusStyle = STATUS_STYLES[result.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n return (\n <div key={nodeId} className=\"flex items-center justify-between rounded-lg px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"truncate text-gray-700 dark:text-gray-300\">{nodeId.slice(0, 8)}</span>\n </div>\n {result.durationMs !== undefined && <span className=\"text-gray-400\">{formatDuration(result.durationMs)}</span>}\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {selectedNode && (\n <div className=\"border-b border-gray-200/50 px-4 py-3 dark:border-gray-700/50\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-xs font-semibold text-gray-900 dark:text-white\">{t('nodeDetail')}</span>\n <button type=\"button\" onClick={() => setSelectedNode(null)} className=\"text-[10px] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\">\n {t('close')}\n </button>\n </div>\n <div className=\"space-y-2 text-xs\">\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('status')}</span>\n <span className={STATUS_STYLES[selectedNode.status]?.colorClass ?? 'text-gray-400'}>\n {t(selectedNode.status as 'completed' | 'failed' | 'running' | 'pending' | 'skipped' | 'success' | 'error')}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-gray-500\">{t('duration')}</span>\n <span className=\"text-gray-700 dark:text-gray-300\">{formatDuration(selectedNode.durationMs)}</span>\n </div>\n {selectedNode.error && (\n <div>\n <span className=\"text-red-500\">{t('error')}</span>\n <pre className=\"mt-1 max-h-20 overflow-auto whitespace-pre-wrap rounded bg-red-50 p-2 text-[10px] text-red-700 dark:bg-red-900/20 dark:text-red-300\">{selectedNode.error}</pre>\n </div>\n )}\n {Object.keys(selectedNode.outputs).length > 0 && (\n <div>\n <span className=\"text-gray-500\">{t('outputs')}</span>\n <pre className=\"mt-1 max-h-32 overflow-auto whitespace-pre-wrap rounded bg-gray-50 p-2 text-[10px] text-gray-700 dark:bg-gray-700/50 dark:text-gray-300\">\n {JSON.stringify(selectedNode.outputs, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"flex-1 overflow-y-auto px-4 py-3\">\n <h4 className=\"mb-2 text-xs font-semibold text-gray-500 dark:text-gray-400\">{t('runHistory')}</h4>\n\n {isLoadingRuns && (\n <div className=\"space-y-2\">\n {[1, 2, 3].map((index) => (<div key={index} className=\"shimmer h-14 rounded-lg\" />))}\n </div>\n )}\n\n {!isLoadingRuns && runs.length === 0 && (\n <div className=\"py-8 text-center\">\n <ClockIcon className=\"mx-auto mb-2 h-8 w-8 text-gray-300 dark:text-gray-600\" />\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">{t('noRuns')}</p>\n <p className=\"mt-1 text-[10px] text-gray-400 dark:text-gray-500\">{t('noRunsDescription')}</p>\n </div>\n )}\n\n {!isLoadingRuns && runs.length > 0 && (\n <div className=\"space-y-1.5\">\n {runs.map((run) => {\n const statusStyle = STATUS_STYLES[run.status] ?? STATUS_STYLES.pending\n const StatusIcon = statusStyle.icon\n const isSelected = selectedRun?.id === run.id\n return (\n <button\n key={run.id}\n type=\"button\"\n onClick={() => {\n setSelectedRun(isSelected ? null : run)\n setSelectedNode(null)\n }}\n className={`w-full rounded-lg border px-3 py-2.5 text-left transition-colors ${\n isSelected\n ? 'border-blue-200 bg-blue-50/50 dark:border-blue-800 dark:bg-blue-900/20'\n : 'border-gray-100 hover:border-gray-200 hover:bg-gray-50 dark:border-gray-700/50 dark:hover:border-gray-600 dark:hover:bg-gray-700/30'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-3.5 w-3.5 ${statusStyle.colorClass}`} />\n <span className=\"text-xs font-medium text-gray-900 dark:text-white\">{formatTimestamp(run.createdAt)}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(run.totalDurationMs)}</span>\n </div>\n {run.error && <p className=\"mt-1 truncate text-[10px] text-red-500\">{run.error}</p>}\n </button>\n )\n })}\n </div>\n )}\n\n {selectedRun && selectedRun.nodeResults.length > 0 && (\n <div className=\"mt-3 space-y-1\">\n <h5 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-gray-400\">Nodes</h5>\n {selectedRun.nodeResults.map((nodeResult) => {\n const nodeStatusStyle = STATUS_STYLES[nodeResult.status] ?? STATUS_STYLES.pending\n const NodeStatusIcon = nodeStatusStyle.icon\n return (\n <button\n key={nodeResult.nodeId}\n type=\"button\"\n onClick={() => setSelectedNode(nodeResult)}\n className=\"flex w-full items-center justify-between rounded px-2 py-1.5 text-xs hover:bg-gray-50 dark:hover:bg-gray-700/50\"\n >\n <div className=\"flex items-center gap-2\">\n <NodeStatusIcon className={`h-3 w-3 ${nodeStatusStyle.colorClass}`} />\n <span className=\"text-gray-700 dark:text-gray-300\">{nodeResult.nodeType}</span>\n </div>\n <span className=\"text-[10px] text-gray-400\">{formatDuration(nodeResult.durationMs)}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n </>\n )\n}\n","export type SaveStatusBadgeProps = {\n status: 'idle' | 'saving' | 'saved'\n}\n\nexport function SaveStatusBadge({ status }: SaveStatusBadgeProps) {\n if (status === 'saving') {\n return (\n <span className=\"animate-pulse text-[10px] text-gray-400 dark:text-gray-500\">\n &#8226;\n </span>\n )\n }\n\n if (status === 'saved') {\n return (\n <span className=\"text-[10px] text-green-500/60 dark:text-green-400/50\">\n &#10003;\n </span>\n )\n }\n\n return null\n}\n","import { memo, useCallback } from 'react'\nimport { Workspace, type WorkspaceProps } from '../../workflow-canvas'\nimport type { WorkflowGraph } from '../../contracts'\n\nexport type AutoSaveWorkspaceProps = Omit<WorkspaceProps, 'onGraphChange'> & {\n onAutoSaveGraph: (graph: WorkflowGraph) => void\n onGraphSnapshot?: (graph: WorkflowGraph) => void\n}\n\nexport const AutoSaveWorkspace = memo(function AutoSaveWorkspace({\n onAutoSaveGraph,\n onGraphSnapshot,\n ...workspaceProps\n}: AutoSaveWorkspaceProps) {\n const handleGraphChange = useCallback((graph: WorkflowGraph) => {\n onGraphSnapshot?.(graph)\n onAutoSaveGraph(graph)\n }, [onAutoSaveGraph, onGraphSnapshot])\n\n return (\n <Workspace\n {...workspaceProps}\n onGraphChange={handleGraphChange}\n />\n )\n})\n","import type { ComponentProps } from 'react'\nimport { DynamicIslandConfirm as UiDynamicIslandConfirm } from '@ui/index'\n\nexport type DynamicIslandConfirmProps = ComponentProps<typeof UiDynamicIslandConfirm>\n\nexport function DynamicIslandConfirm(props: DynamicIslandConfirmProps) {\n return <UiDynamicIslandConfirm {...props} />\n}\n\n","/**\n * DSL Export Modal\n * ================\n * Modal for exporting a workflow to a JSON file.\n * Shows workflow metadata, a JSON preview, and provides\n * \"Copy to Clipboard\" and \"Download JSON\" actions.\n */\n\nimport { useState, useMemo, useCallback } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { ArrowDownTrayIcon, ClipboardDocumentIcon, CheckIcon } from '@heroicons/react/24/outline'\nimport { Button, FormModal } from '@ui/index'\nimport type { WorkflowGraph, Workflow } from '../../contracts'\n\ntype DslExportModalProps = {\n open: boolean\n onClose: () => void\n workflow: Workflow\n graph: WorkflowGraph\n}\n\nconst JSON_PREVIEW_LINE_LIMIT = 50\n\nexport function DslExportModal({ open, onClose, workflow, graph }: DslExportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.export')\n const [isCopied, setIsCopied] = useState(false)\n\n const exportPayload = useMemo(() => ({\n name: workflow.name,\n description: workflow.description,\n version: workflow.version,\n exportedAt: new Date().toISOString(),\n graph: {\n nodes: graph.nodes,\n edges: graph.edges,\n viewport: graph.viewport,\n },\n }), [workflow, graph])\n\n const jsonString = useMemo(() => JSON.stringify(exportPayload, null, 2), [exportPayload])\n\n const previewLines = useMemo(() => {\n const lines = jsonString.split('\\n')\n if (lines.length <= JSON_PREVIEW_LINE_LIMIT) {\n return jsonString\n }\n return lines.slice(0, JSON_PREVIEW_LINE_LIMIT).join('\\n') + '\\n...'\n }, [jsonString])\n\n const handleCopyToClipboard = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(jsonString)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = jsonString\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setIsCopied(true)\n setTimeout(() => setIsCopied(false), 2000)\n }\n }, [jsonString])\n\n const handleDownloadJson = useCallback(() => {\n const blob = new Blob([jsonString], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const downloadLink = document.createElement('a')\n downloadLink.href = url\n downloadLink.download = `${workflow.name}-v${workflow.version}.json`\n document.body.appendChild(downloadLink)\n downloadLink.click()\n document.body.removeChild(downloadLink)\n URL.revokeObjectURL(url)\n }, [jsonString, workflow.name, workflow.version])\n\n if (!open) return null\n\n return (\n <FormModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"2xl\"\n showFooter={false}\n >\n <div data-testid=\"dsl-export-modal\">\n {/* Metadata */}\n <div className=\"border-b border-gray-200 px-1 py-4 dark:border-gray-700\">\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('workflowName')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{workflow.name}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('version')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">v{workflow.version}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('nodes')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.nodes.length}</p>\n </div>\n <div>\n <span className=\"text-gray-500 dark:text-gray-400\">{translations('edges')}</span>\n <p className=\"font-medium text-gray-900 dark:text-white\">{graph.edges.length}</p>\n </div>\n </div>\n </div>\n\n {/* JSON Preview */}\n <div className=\"px-1 py-4\">\n <div className=\"mb-2 text-xs font-medium uppercase tracking-wider text-gray-400 dark:text-gray-500\">\n {translations('preview')}\n </div>\n <pre\n className=\"max-h-64 overflow-auto rounded-lg border border-gray-200 bg-gray-50 p-3 text-xs text-gray-700 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300\"\n data-testid=\"export-json-preview\"\n >\n {previewLines}\n </pre>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button\n type=\"button\"\n onClick={handleCopyToClipboard}\n outline\n size=\"sm\"\n data-testid=\"export-copy-button\"\n >\n {isCopied ? (\n <>\n <CheckIcon className=\"h-4 w-4 text-green-500\" />\n {translations('copied')}\n </>\n ) : (\n <>\n <ClipboardDocumentIcon className=\"h-4 w-4\" />\n {translations('copyToClipboard')}\n </>\n )}\n </Button>\n <Button\n type=\"button\"\n onClick={handleDownloadJson}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"export-download-button\"\n >\n <ArrowDownTrayIcon className=\"h-4 w-4\" />\n {translations('downloadJson')}\n </Button>\n </div>\n </div>\n </FormModal>\n )\n}\n","/**\n * DSL Import Modal\n * ================\n * Modal for importing a workflow from a JSON file.\n * Provides drag-and-drop and file picker upload, validates\n * JSON structure (nodes array, edges array, viewport),\n * shows validation errors, and previews node/edge counts.\n */\n\nimport { useState, useCallback, useRef } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { ArrowUpTrayIcon, ExclamationTriangleIcon, CheckCircleIcon } from '@heroicons/react/24/outline'\nimport { Button, FormModal } from '@ui/index'\nimport type { WorkflowGraph } from '../../contracts'\n\ntype DslImportModalProps = {\n open: boolean\n onClose: () => void\n onImport: (graph: WorkflowGraph) => void\n}\n\ntype ValidationResult = {\n isValid: boolean\n errors: string[]\n graph: WorkflowGraph | null\n nodeCount: number\n edgeCount: number\n}\n\nfunction validateWorkflowJson(jsonString: string): ValidationResult {\n const errors: string[] = []\n\n let parsed: unknown\n try {\n parsed = JSON.parse(jsonString)\n } catch {\n return { isValid: false, errors: ['Invalid JSON format'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return { isValid: false, errors: ['Root must be a JSON object'], graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const data = parsed as Record<string, unknown>\n\n // Support both root-level graph and nested graph property\n const graphData = data.graph ? (data.graph as Record<string, unknown>) : data\n\n if (!Array.isArray(graphData.nodes)) {\n errors.push('Missing or invalid \"nodes\" array')\n }\n\n if (!Array.isArray(graphData.edges)) {\n errors.push('Missing or invalid \"edges\" array')\n }\n\n if (!graphData.viewport || typeof graphData.viewport !== 'object') {\n errors.push('Missing or invalid \"viewport\" object')\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: 0, edgeCount: 0 }\n }\n\n const nodes = graphData.nodes as Array<Record<string, unknown>>\n const edges = graphData.edges as Array<Record<string, unknown>>\n\n // Validate node structure\n for (let index = 0; index < nodes.length; index++) {\n const node = nodes[index]\n if (!node.id || typeof node.id !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"id\"`)\n }\n if (!node.type || typeof node.type !== 'string') {\n errors.push(`Node at index ${index}: missing or invalid \"type\"`)\n }\n if (!node.position || typeof node.position !== 'object') {\n errors.push(`Node at index ${index}: missing or invalid \"position\"`)\n }\n }\n\n // Validate edge structure\n for (let index = 0; index < edges.length; index++) {\n const edge = edges[index]\n if (!edge.id || typeof edge.id !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"id\"`)\n }\n if (!edge.source || typeof edge.source !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"source\"`)\n }\n if (!edge.target || typeof edge.target !== 'string') {\n errors.push(`Edge at index ${index}: missing or invalid \"target\"`)\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors, graph: null, nodeCount: nodes.length, edgeCount: edges.length }\n }\n\n const viewport = graphData.viewport as Record<string, unknown>\n const graph: WorkflowGraph = {\n nodes: nodes.map((node) => ({\n id: node.id as string,\n type: node.type as WorkflowGraph['nodes'][number]['type'],\n position: node.position as { x: number; y: number },\n data: (node.data ?? { entityId: '', label: '' }) as WorkflowGraph['nodes'][number]['data'],\n })),\n edges: edges.map((edge) => ({\n id: edge.id as string,\n source: edge.source as string,\n target: edge.target as string,\n sourceHandle: (edge.sourceHandle ?? 'default') as string,\n targetHandle: (edge.targetHandle ?? 'default') as string,\n })),\n viewport: {\n x: typeof viewport.x === 'number' ? viewport.x : 0,\n y: typeof viewport.y === 'number' ? viewport.y : 0,\n zoom: typeof viewport.zoom === 'number' ? viewport.zoom : 1,\n },\n }\n\n return { isValid: true, errors: [], graph, nodeCount: nodes.length, edgeCount: edges.length }\n}\n\nexport function DslImportModal({ open, onClose, onImport }: DslImportModalProps) {\n const translations = useTranslations('agents.workflow.dsl.import')\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const [isDragActive, setIsDragActive] = useState(false)\n const [validationResult, setValidationResult] = useState<ValidationResult | null>(null)\n const [fileName, setFileName] = useState<string | null>(null)\n\n const processFile = useCallback((file: File) => {\n setFileName(file.name)\n\n const reader = new FileReader()\n reader.onload = (event) => {\n const content = event.target?.result\n if (typeof content === 'string') {\n const result = validateWorkflowJson(content)\n setValidationResult(result)\n }\n }\n reader.readAsText(file)\n }, [])\n\n const handleDragOver = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(true)\n }, [])\n\n const handleDragLeave = useCallback((event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n }, [])\n\n const handleDrop = useCallback(\n (event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n setIsDragActive(false)\n\n const files = event.dataTransfer.files\n if (files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleFileChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files\n if (files && files.length > 0) {\n processFile(files[0])\n }\n },\n [processFile],\n )\n\n const handleClickUpload = useCallback(() => {\n fileInputRef.current?.click()\n }, [])\n\n const handleImport = useCallback(() => {\n if (validationResult?.isValid && validationResult.graph) {\n onImport(validationResult.graph)\n onClose()\n }\n }, [validationResult, onImport, onClose])\n\n const handleReset = useCallback(() => {\n setValidationResult(null)\n setFileName(null)\n if (fileInputRef.current) {\n fileInputRef.current.value = ''\n }\n }, [])\n\n if (!open) return null\n\n return (\n <FormModal\n open={open}\n onClose={onClose}\n title={translations('title')}\n subtitle={translations('description')}\n maxWidth=\"lg\"\n showFooter={false}\n >\n <div data-testid=\"dsl-import-modal\">\n <div className=\"px-1 py-2\">\n {!validationResult ? (\n <div\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClickUpload}\n className={`cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200 ${\n isDragActive\n ? 'border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-500/10'\n : 'border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500'\n }`}\n data-testid=\"import-dropzone\"\n >\n <ArrowUpTrayIcon className=\"mx-auto h-10 w-10 text-gray-400 dark:text-gray-500\" />\n <p className=\"mt-3 text-sm font-medium text-gray-700 dark:text-gray-300\">\n {translations('dropzone')}\n </p>\n <p className=\"mt-1 text-xs text-gray-500 dark:text-gray-400\">\n {translations('dropzoneHint')}\n </p>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n onChange={handleFileChange}\n className=\"hidden\"\n data-testid=\"import-file-input\"\n />\n </div>\n ) : (\n <div data-testid=\"import-validation-result\">\n <div className=\"mb-4 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{fileName}</span>\n <Button type=\"button\" plain size=\"sm\" onClick={handleReset}>\n {translations('chooseAnother')}\n </Button>\n </div>\n\n {validationResult.isValid ? (\n <div className=\"rounded-lg border border-green-200 bg-green-50 p-4 dark:border-green-800 dark:bg-green-900/20\">\n <div className=\"flex items-center gap-2\">\n <CheckCircleIcon className=\"h-5 w-5 text-green-500\" />\n <span className=\"text-sm font-medium text-green-700 dark:text-green-400\">\n {translations('validationSuccess')}\n </span>\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-2 text-sm\">\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('nodes')}: {validationResult.nodeCount}\n </div>\n <div className=\"text-green-600 dark:text-green-400\">\n {translations('edges')}: {validationResult.edgeCount}\n </div>\n </div>\n </div>\n ) : (\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 dark:border-red-800 dark:bg-red-900/20\">\n <div className=\"flex items-center gap-2\">\n <ExclamationTriangleIcon className=\"h-5 w-5 text-red-500\" />\n <span className=\"text-sm font-medium text-red-700 dark:text-red-400\">\n {translations('validationFailed')}\n </span>\n </div>\n <ul className=\"mt-2 space-y-1\">\n {validationResult.errors.map((validationError, index) => (\n <li key={index} className=\"text-xs text-red-600 dark:text-red-400\">\n {validationError}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </div>\n\n <div className=\"flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700\">\n <Button type=\"button\" onClick={onClose} outline size=\"sm\" data-testid=\"import-cancel-button\">\n {translations('cancel')}\n </Button>\n <Button\n type=\"button\"\n onClick={handleImport}\n disabled={!validationResult?.isValid}\n color=\"ios-glass-blue\"\n size=\"sm\"\n data-testid=\"import-confirm-button\"\n >\n <ArrowUpTrayIcon className=\"h-4 w-4\" />\n {translations('import')}\n </Button>\n </div>\n </div>\n </FormModal>\n )\n}\n","/**\n * Workflow Store Selectors\n * ========================\n * Derived state hooks for granular subscriptions.\n * Each selector subscribes only to the slice it needs,\n * preventing unnecessary re-renders in consuming components.\n */\n\nimport { useWorkflowStore } from './workflow-store'\n\nexport const useCanUndo = () => useWorkflowStore((state) => state.past.length > 0)\n\nexport const useCanRedo = () => useWorkflowStore((state) => state.future.length > 0)\n\nexport const useHasCopied = () => useWorkflowStore((state) => state.clipboard !== null)\n\nexport const useContextMenu = () => useWorkflowStore((state) => state.contextMenu)\n\nexport const useEditingNodeId = () => useWorkflowStore((state) => state.editingNodeId)\n\nexport const useSelectedNodeCount = () =>\n useWorkflowStore((state) => state.nodes.filter((node) => node.selected).length)\n\nexport const useIsRunning = () => useWorkflowStore((state) => state.isRunning)\n\nexport const useNodeResults = () => useWorkflowStore((state) => state.nodeResults)\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype GraphSnapshot = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseUndoRedoReturn = {\n undo: () => void\n redo: () => void\n canUndo: boolean\n canRedo: boolean\n takeSnapshot: () => void\n}\n\nconst DEFAULT_MAX_HISTORY = 50\n\nexport function useUndoRedo(\n nodes: Node[],\n edges: Edge[],\n setNodes: (nodes: Node[]) => void,\n setEdges: (edges: Edge[]) => void,\n maxHistory: number = DEFAULT_MAX_HISTORY,\n): UseUndoRedoReturn {\n const pastRef = useRef<GraphSnapshot[]>([])\n const futureRef = useRef<GraphSnapshot[]>([])\n\n // Force re-render tracking for canUndo/canRedo\n // We use a counter ref that we read synchronously to derive boolean states\n const pastLengthRef = useRef(0)\n const futureLengthRef = useRef(0)\n\n const takeSnapshot = useCallback(() => {\n const snapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n pastRef.current = [...pastRef.current.slice(-(maxHistory - 1)), snapshot]\n pastLengthRef.current = pastRef.current.length\n futureRef.current = []\n futureLengthRef.current = 0\n }, [nodes, edges, maxHistory])\n\n const undo = useCallback(() => {\n const past = pastRef.current\n if (past.length === 0) return\n\n const previous = past[past.length - 1]\n const remaining = past.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n pastRef.current = remaining\n pastLengthRef.current = remaining.length\n futureRef.current = [...futureRef.current, currentSnapshot]\n futureLengthRef.current = futureRef.current.length\n\n setNodes(previous.nodes)\n setEdges(previous.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n const redo = useCallback(() => {\n const future = futureRef.current\n if (future.length === 0) return\n\n const next = future[future.length - 1]\n const remaining = future.slice(0, -1)\n\n const currentSnapshot: GraphSnapshot = {\n nodes: nodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: edges.map((edge) => ({ ...edge })),\n }\n\n futureRef.current = remaining\n futureLengthRef.current = remaining.length\n pastRef.current = [...pastRef.current, currentSnapshot]\n pastLengthRef.current = pastRef.current.length\n\n setNodes(next.nodes)\n setEdges(next.edges)\n }, [nodes, edges, setNodes, setEdges])\n\n return {\n undo,\n redo,\n canUndo: pastRef.current.length > 0,\n canRedo: futureRef.current.length > 0,\n takeSnapshot,\n }\n}\n","import { useCallback, useRef } from 'react'\nimport type { Node, Edge } from '@xyflow/react'\n\ntype ClipboardContent = {\n nodes: Node[]\n edges: Edge[]\n}\n\ntype UseClipboardReturn = {\n copy: () => void\n paste: () => void\n hasCopied: boolean\n}\n\nconst PASTE_OFFSET = 40\n\nexport function useClipboard(\n nodes: Node[],\n edges: Edge[],\n setNodes: (updater: (nodes: Node[]) => Node[]) => void,\n setEdges: (updater: (edges: Edge[]) => Edge[]) => void,\n takeSnapshot: () => void,\n): UseClipboardReturn {\n const clipboardRef = useRef<ClipboardContent | null>(null)\n\n const copy = useCallback(() => {\n const selectedNodes = nodes.filter((node) => node.selected)\n if (selectedNodes.length === 0) return\n\n const selectedNodeIds = new Set(selectedNodes.map((node) => node.id))\n const internalEdges = edges.filter(\n (edge) => selectedNodeIds.has(edge.source) && selectedNodeIds.has(edge.target),\n )\n\n clipboardRef.current = {\n nodes: selectedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: internalEdges.map((edge) => ({ ...edge })),\n }\n }, [nodes, edges])\n\n const paste = useCallback(() => {\n const clipboard = clipboardRef.current\n if (!clipboard || clipboard.nodes.length === 0) return\n\n takeSnapshot()\n\n const idMapping = new Map<string, string>()\n clipboard.nodes.forEach((node) => {\n idMapping.set(node.id, crypto.randomUUID())\n })\n\n const pastedNodes: Node[] = clipboard.nodes.map((node) => ({\n ...node,\n id: idMapping.get(node.id) ?? crypto.randomUUID(),\n position: {\n x: node.position.x + PASTE_OFFSET,\n y: node.position.y + PASTE_OFFSET,\n },\n selected: true,\n data: { ...node.data },\n }))\n\n const pastedEdges: Edge[] = clipboard.edges.map((edge) => ({\n ...edge,\n id: crypto.randomUUID(),\n source: idMapping.get(edge.source) ?? edge.source,\n target: idMapping.get(edge.target) ?? edge.target,\n }))\n\n setNodes((currentNodes) => [\n ...currentNodes.map((node) => ({ ...node, selected: false })),\n ...pastedNodes,\n ])\n\n setEdges((currentEdges) => [...currentEdges, ...pastedEdges])\n\n // Update clipboard positions for consecutive pastes\n clipboardRef.current = {\n nodes: pastedNodes.map((node) => ({ ...node, data: { ...node.data } })),\n edges: pastedEdges.map((edge) => ({ ...edge })),\n }\n }, [setNodes, setEdges, takeSnapshot])\n\n return {\n copy,\n paste,\n hasCopied: clipboardRef.current !== null && clipboardRef.current.nodes.length > 0,\n }\n}\n","import { useEffect } from 'react'\n\ntype UseCanvasShortcutsOptions = {\n undo: () => void\n redo: () => void\n copy: () => void\n paste: () => void\n canUndo: boolean\n canRedo: boolean\n selectAll: () => void\n fitView: () => void\n}\n\nconst INPUT_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT'])\n\nfunction isInputFocused(): boolean {\n const activeElement = document.activeElement\n if (!activeElement) return false\n return INPUT_TAGS.has(activeElement.tagName) || (activeElement as HTMLElement).isContentEditable\n}\n\nexport function useCanvasShortcuts({\n undo,\n redo,\n copy,\n paste,\n canUndo,\n canRedo,\n selectAll,\n fitView,\n}: UseCanvasShortcutsOptions): void {\n useEffect(() => {\n function handleKeyDown(event: KeyboardEvent) {\n if (isInputFocused()) return\n\n const isModifierPressed = event.metaKey || event.ctrlKey\n\n if (!isModifierPressed) {\n if (event.key === 'Escape') {\n selectAll() // Will be overridden to deselect — see graph wiring\n return\n }\n return\n }\n\n switch (event.key.toLowerCase()) {\n case 'z': {\n if (event.shiftKey) {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n } else {\n if (canUndo) {\n event.preventDefault()\n undo()\n }\n }\n break\n }\n case 'y': {\n if (canRedo) {\n event.preventDefault()\n redo()\n }\n break\n }\n case 'c': {\n event.preventDefault()\n copy()\n break\n }\n case 'v': {\n event.preventDefault()\n paste()\n break\n }\n case 'a': {\n event.preventDefault()\n selectAll()\n break\n }\n case 'f': {\n if (event.shiftKey) {\n event.preventDefault()\n fitView()\n }\n break\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [undo, redo, copy, paste, canUndo, canRedo, selectAll, fitView])\n}\n","/**\n * Help Lines Hook\n * ===============\n * Detects alignment between the currently dragged node and\n * all other nodes on the canvas. When edges (left, center, right,\n * top, center-y, bottom) are within a 5px threshold, returns\n * horizontal and/or vertical guide line positions for visual feedback.\n */\n\nimport { useState, useCallback } from 'react'\nimport type { Node } from '@xyflow/react'\n\ntype NodeDragHandler = (event: React.MouseEvent, node: Node, nodes: Node[]) => void\n\ntype HelpLinePosition = {\n horizontal: number | null\n vertical: number | null\n}\n\ntype NodeBounds = {\n left: number\n centerX: number\n right: number\n top: number\n centerY: number\n bottom: number\n}\n\nconst ALIGNMENT_THRESHOLD = 5\nconst DEFAULT_NODE_WIDTH = 200\nconst DEFAULT_NODE_HEIGHT = 60\n\nfunction getNodeBounds(node: Node): NodeBounds {\n const width = (node.measured?.width ?? node.width ?? DEFAULT_NODE_WIDTH) as number\n const height = (node.measured?.height ?? node.height ?? DEFAULT_NODE_HEIGHT) as number\n\n return {\n left: node.position.x,\n centerX: node.position.x + width / 2,\n right: node.position.x + width,\n top: node.position.y,\n centerY: node.position.y + height / 2,\n bottom: node.position.y + height,\n }\n}\n\n/**\n * Finds the closest alignment positions between a dragged node and\n * all other nodes. Returns horizontal and vertical guide line positions\n * when edges are within the alignment threshold.\n */\nfunction findAlignments(\n dragBounds: NodeBounds,\n otherNodes: Node[],\n): HelpLinePosition {\n let closestHorizontal: number | null = null\n let closestVertical: number | null = null\n let minHorizontalDistance = ALIGNMENT_THRESHOLD + 1\n let minVerticalDistance = ALIGNMENT_THRESHOLD + 1\n\n for (const otherNode of otherNodes) {\n const otherBounds = getNodeBounds(otherNode)\n\n // Check vertical alignments (x-axis positions)\n const verticalChecks = [\n { dragValue: dragBounds.left, otherValue: otherBounds.left },\n { dragValue: dragBounds.left, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.left, otherValue: otherBounds.right },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.left },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.centerX, otherValue: otherBounds.right },\n { dragValue: dragBounds.right, otherValue: otherBounds.left },\n { dragValue: dragBounds.right, otherValue: otherBounds.centerX },\n { dragValue: dragBounds.right, otherValue: otherBounds.right },\n ]\n\n for (const check of verticalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minVerticalDistance) {\n minVerticalDistance = distance\n closestVertical = check.otherValue\n }\n }\n\n // Check horizontal alignments (y-axis positions)\n const horizontalChecks = [\n { dragValue: dragBounds.top, otherValue: otherBounds.top },\n { dragValue: dragBounds.top, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.top, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.top },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.centerY, otherValue: otherBounds.bottom },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.top },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.centerY },\n { dragValue: dragBounds.bottom, otherValue: otherBounds.bottom },\n ]\n\n for (const check of horizontalChecks) {\n const distance = Math.abs(check.dragValue - check.otherValue)\n if (distance <= ALIGNMENT_THRESHOLD && distance < minHorizontalDistance) {\n minHorizontalDistance = distance\n closestHorizontal = check.otherValue\n }\n }\n }\n\n return { horizontal: closestHorizontal, vertical: closestVertical }\n}\n\n/**\n * Basic help lines hook. Returns a drag handler factory that accepts\n * the full node list for alignment detection.\n *\n * Example:\n * const { helpLines, createDragHandler, onNodeDragStop } = useHelpLines()\n * const onNodeDrag = createDragHandler(nodes)\n */\nexport function useHelpLines(): {\n helpLines: HelpLinePosition\n createDragHandler: (allNodes: Node[]) => NodeDragHandler\n onNodeDragStop: NodeDragHandler\n} {\n const [helpLines, setHelpLines] = useState<HelpLinePosition>({\n horizontal: null,\n vertical: null,\n })\n\n const createDragHandler = useCallback(\n (allNodes: Node[]): NodeDragHandler =>\n (_event, draggedNode, draggedNodes) => {\n const draggingNodeIds = new Set(\n draggedNodes.length > 0\n ? draggedNodes.map((node) => node.id)\n : [draggedNode.id],\n )\n\n const dragBounds = getNodeBounds(draggedNode)\n const otherNodes = allNodes.filter((node) => !draggingNodeIds.has(node.id))\n\n setHelpLines(findAlignments(dragBounds, otherNodes))\n },\n [],\n )\n\n const onNodeDragStop: NodeDragHandler = useCallback(() => {\n setHelpLines({ horizontal: null, vertical: null })\n }, [])\n\n return {\n helpLines,\n createDragHandler,\n onNodeDragStop,\n }\n}\n","import { memo } from 'react'\nimport { useTranslations } from 'next-intl'\nimport { Position } from '@xyflow/react'\nimport { CommandLineIcon, TrashIcon, ExclamationTriangleIcon } from '@heroicons/react/24/outline'\nimport type { AgentTool } from '../../contracts'\nimport { NodeCard } from './node-card'\nimport { NodeCardBadge, NodeCardHeader, NodeCardMeta } from './node-card-primitives'\nimport { WorkflowHandle } from './node-handles'\nimport { NodeRunningIndicator } from './node-running-indicator'\n\ntype AgentToolNodeData = {\n agentTool: AgentTool\n order?: number\n displayMode?: 'detailed' | 'compact'\n onEdit?: (agentTool: AgentTool) => void\n onToggle?: (agentTool: AgentTool) => void\n onRemoveFromCanvas?: (nodeId: string) => void\n label?: string\n}\n\nconst CATEGORY_ICONS: Record<string, string> = {\n search: 'from-sky-400 to-blue-500',\n code: 'from-cyan-400 to-sky-500',\n file: 'from-violet-400 to-purple-500',\n web: 'from-orange-400 to-amber-500',\n math: 'from-emerald-400 to-green-500',\n custom: 'from-amber-400 to-orange-500',\n}\n\nconst CATEGORY_PILL: Record<string, string> = {\n search: 'bg-sky-100 text-sky-700 dark:bg-sky-500/20 dark:text-sky-300',\n code: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-500/20 dark:text-cyan-300',\n file: 'bg-violet-100 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300',\n web: 'bg-orange-100 text-orange-700 dark:bg-orange-500/20 dark:text-orange-300',\n math: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300',\n custom: 'bg-amber-100 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300',\n}\n\nexport const AgentToolFlowNode = memo(function AgentToolFlowNode({ id, data, selected }: { id: string; data: AgentToolNodeData; selected?: boolean }) {\n const t = useTranslations('agents.workflow')\n const { agentTool, onRemoveFromCanvas } = data\n const isCompact = data.displayMode === 'compact'\n\n if (!agentTool?.name) {\n const label = data.label\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-amber-400\" />\n <NodeCard variant=\"error\" nodeType=\"agent_tool\">\n <NodeCardHeader\n icon={<ExclamationTriangleIcon className=\"h-5 w-5 text-white\" />}\n title={label || 'Agent Tool'}\n description={t('agentToolNotFound')}\n iconClassName=\"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-amber-400 to-orange-500 shadow-lg\"\n />\n </NodeCard>\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-amber-500\" />\n </>\n )\n }\n\n const category = agentTool.category ?? 'custom'\n const gradient = CATEGORY_ICONS[category] ?? CATEGORY_ICONS.custom\n const pill = CATEGORY_PILL[category] ?? CATEGORY_PILL.custom\n\n return (\n <>\n <NodeRunningIndicator nodeId={id} />\n <WorkflowHandle type=\"target\" position={Position.Left} id=\"left-in\" colorClass=\"!bg-amber-400\" />\n\n <NodeCard compact={isCompact} selected={selected} nodeType=\"agent_tool\" width=\"w-[280px]\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-3\">\n <div className={`flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${gradient} shadow-lg`}>\n <CommandLineIcon className=\"h-5 w-5 text-white\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-gray-900 dark:text-white\">{agentTool.name}</h3>\n {!isCompact && agentTool.description && (\n <p className=\"mt-0.5 truncate text-xs text-gray-500 dark:text-gray-400\">{agentTool.description}</p>\n )}\n </div>\n </div>\n\n {data.onToggle && (\n <span\n role=\"switch\"\n aria-checked={agentTool.enabled}\n className={`nodrag nopan relative inline-flex h-5 w-9 flex-shrink-0 cursor-pointer items-center rounded-full border border-white/50 px-0.5 shadow-[inset_0_1px_0_rgba(255,255,255,0.5)] transition duration-200 dark:border-white/15 ${\n agentTool.enabled ? 'bg-amber-500/90' : 'bg-slate-300/80 dark:bg-slate-700/80'\n }`}\n onClick={(event) => {\n event.stopPropagation()\n data.onToggle!(agentTool)\n }}\n >\n <span className={`pointer-events-none inline-block h-4 w-4 transform rounded-full bg-white shadow transition duration-200 ${\n agentTool.enabled ? 'translate-x-4' : 'translate-x-0'\n }`} />\n </span>\n )}\n </div>\n\n <NodeCardMeta compact={isCompact}>\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <NodeCardBadge className=\"rounded-full bg-amber-100 px-2 py-0.5 text-[10px] font-semibold text-amber-700 dark:bg-amber-500/20 dark:text-amber-300\">\n {t('agentToolNode')}\n </NodeCardBadge>\n <NodeCardBadge className={`rounded-full px-2 py-0.5 text-[10px] font-medium ${pill}`}>\n {category}\n </NodeCardBadge>\n {agentTool.parameters && agentTool.parameters.length > 0 && (\n <NodeCardBadge className=\"rounded-full bg-gray-100 px-2 py-0.5 text-[10px] font-medium text-gray-600 dark:bg-white/10 dark:text-gray-300\">\n {agentTool.parameters.length} params\n </NodeCardBadge>\n )}\n\n {onRemoveFromCanvas && (\n <span\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation()\n event.preventDefault()\n onRemoveFromCanvas(id)\n }}\n className=\"nodrag nopan ml-auto cursor-pointer rounded-lg p-1 opacity-0 transition hover:bg-red-50 group-hover:opacity-100 dark:hover:bg-red-900/20\"\n aria-label={t('removeFromCanvas')}\n >\n <TrashIcon className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n </span>\n )}\n </div>\n </NodeCardMeta>\n </NodeCard>\n\n <WorkflowHandle type=\"source\" position={Position.Right} id=\"right-out\" colorClass=\"!bg-amber-500\" />\n </>\n )\n})\n"]}