{"version":3,"file":"AssistantChat.mjs","names":["React","useCallback","useEffect","useMemo","useRef","useState","UdpFluentButton","UdpDropdown","UdpTextarea","UdpSpinner","AiMessageText","AiProposalCard","GatewayConfig","useAiAccess","useAiAssistant","UseAiAssistantConfig","useConversation","AiAssistantLimits","AiAssistantTool","AiChatItem","AiProposalConfig","FormChangeEvent","styles","NO_PROPOSALS","Record","AssistantChatProps","models","preferredModel","requestParams","buildSystemPrompt","buildContext","tools","proposals","contextKey","contextSwitchNotice","previous","next","contextSwitchHistoryMarker","contextMismatchText","proposalContextKey","conversationId","emptyStateText","ReactNode","placeholder","disabled","limits","AssistantChat","t0","$","_c","props","access","t1","filter","id","includes","allowed","length","t2","gateway","Chat","undefined","pickedModel","setPickedModel","t3","selectedModel","input","setInput","messagesRef","t4","Symbol","for","Map","undoFns","setUndoFns","conversation","t5","engineConfig","items","sending","draft","send","setProposalStatus","notifyContextSwitch","clear","resolvedProposals","t6","item","proposalToolName","proposalConfigFor","prevContextRef","t7","t8","prev","current","stickToBottomRef","showJumpToLatest","setShowJumpToLatest","t9","e","deltaY","handleWheel","t10","handleTouchMove","t11","el","scrollHeight","scrollTop","clientHeight","handleScroll","t12","el_0","jumpToLatest","t13","el_1","t14","t15","text","trim","handleSend","t16","item_0","config","proposal","undo","onApply","payload","prev_0","set","handleApply","t17","item_1","undo_0","get","prev_1","delete","handleUndo","t18","item_2","handleDismiss","t19","Set","autoAppliedRef","t20","t21","item_3","proposalStatus","autoApply","has","add","t22","map","_temp","modelOptions","t23","emptyState","t24","t25","item_4","isNotice","notice","noticeRule","noticeText","bubble","role","bubbleUser","bubbleAssistant","isError","bubbleError","join","pending","t26","messages","t27","t28","messagesWrap","t29","label","value","e_0","target","t30","e_1","t31","e_2","key","shiftKey","preventDefault","t32","t33","t34","t35","t36","composerSecondary","t37","composerActions","t38","composer","t39","root"],"sources":["../../src/aiAssistant/AssistantChat.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { UdpFluentButton } from '@univerus/udp-react-stencil-component-library';\nimport { UdpDropdown } from '../UI/fluent-web-components/UdpDropdown';\nimport { UdpTextarea } from '../UI/fluent-web-components/UdpTextarea';\nimport { UdpSpinner } from '../UI/fluent-web-components/UdpSpinner';\nimport { AiMessageText } from './AiMessageText';\nimport { AiProposalCard } from './AiProposalCard';\nimport type { GatewayConfig } from './openai';\nimport { useAiAccess } from './provider/UdpAiProvider';\nimport { useAiAssistant, UseAiAssistantConfig } from './useAiAssistant';\nimport { useConversation } from './useConversation';\nimport type { AiAssistantLimits, AiAssistantTool, AiChatItem, AiProposalConfig } from './types';\nimport type { FormChangeEvent } from '../UI/fluent-web-components/utils/formEvents';\nimport styles from './AssistantChat.module.css';\n\nconst NO_PROPOSALS: Record<string, AiProposalConfig> = {};\n\n/**\n * The chat itself — message list, proposal cards, composer, model picker — as\n * a column that fills its host. INTERNAL: `UdpAiAssistant` is the exported\n * surface; it assembles the prompt, tools and proposals from the capability\n * registry and renders this.\n *\n * The connection and the tenant's allowed models come from `useAiAccess()` —\n * the app's UdpAiProvider, which has already asked the gateway. Which of those\n * models THIS function runs on is stated here. Renders nothing without access.\n */\nexport interface AssistantChatProps {\n  /**\n   * The models this function runs on, by gateway id. Intersected with what the\n   * gateway allows the tenant; if none remain, the surface renders nothing —\n   * a function tuned for certain models should not quietly run on others.\n   * Omit to accept whatever the gateway offers.\n   */\n  models?: string[];\n  /**\n   * The model to start on when the tenant has it; otherwise the first allowed\n   * model. The picker shows only when more than one model remains.\n   */\n  preferredModel?: string;\n  /** Extra OpenAI request-body params merged into every completion — pass-through */\n  requestParams?: Record<string, unknown>;\n  /**\n   * The stable part of the prompt (role, rules, schema). Called per request,\n   * but should come back identical turn to turn — it is the cached prefix.\n   */\n  buildSystemPrompt: () => string;\n  /**\n   * The live part (selection, view state, today's date). Called per request\n   * and delivered inside the incoming user message, after the history.\n   */\n  buildContext?: () => string;\n  /** Client-side tools (raw OpenAI definitions + execute/respond behavior) */\n  tools?: AiAssistantTool[];\n  /**\n   * Enables copilot mode: propose → validate → card → apply/undo. Keyed by\n   * tool name, so several flows can be live at once; each proposal card is\n   * applied by the flow that produced it.\n   */\n  proposals?: Record<string, AiProposalConfig>;\n  /**\n   * Identifies what proposals are built against (e.g. the selected entity).\n   * When it changes mid-conversation, a divider + history marker are added\n   * and pending proposals from the old context are blocked.\n   */\n  contextKey?: string;\n  /** Divider text on context switch (default: \"Switched to <next>\") */\n  contextSwitchNotice?: (previous: string, next: string) => string;\n  /** Note added to the model's history (as a user-role message) on context switch */\n  contextSwitchHistoryMarker?: (previous: string, next: string) => string;\n  /** Shown on a pending proposal whose context no longer matches */\n  contextMismatchText?: (proposalContextKey: string) => string;\n  /**\n   * Names the conversation this surface drives. With UdpAiProvider in scope\n   * the same conversation comes back for the same id across remounts (a dock\n   * that collapses keeps its chat) and from any other surface showing it.\n   * Omitted, the conversation is private to this mount.\n   */\n  conversationId?: string;\n  emptyStateText?: React.ReactNode;\n  placeholder?: string;\n  /** Disable the composer (e.g. until the host has a selection to work with) */\n  disabled?: boolean;\n  limits?: AiAssistantLimits;\n}\n\nexport const AssistantChat = ({ models, ...props }: AssistantChatProps) => {\n  const access = useAiAccess();\n  const allowed = useMemo(\n    () => (access && models ? access.models.filter(id => models.includes(id)) : access?.models ?? []),\n    [access, models],\n  );\n  if (!access || !allowed.length) return null;\n  return <Chat {...props} gateway={access.gateway} models={allowed} />;\n};\n\nconst Chat = ({\n  gateway,\n  models,\n  preferredModel,\n  requestParams,\n  buildSystemPrompt,\n  buildContext,\n  tools,\n  proposals,\n  contextKey,\n  contextSwitchNotice,\n  contextSwitchHistoryMarker,\n  contextMismatchText,\n  conversationId,\n  emptyStateText,\n  placeholder = 'Ask me anything…',\n  disabled = false,\n  limits,\n}: Omit<AssistantChatProps, 'models'> & { gateway: GatewayConfig; models: string[] }) => {\n  // What the user picked; the function's preference, then the first allowed\n  // model stand in until they do (or if the pick disappears on a tenant switch).\n  const [pickedModel, setPickedModel] = useState<string | null>(null);\n  const selectedModel =\n    pickedModel && models.includes(pickedModel)\n      ? pickedModel\n      : preferredModel && models.includes(preferredModel)\n        ? preferredModel\n        : models[0];\n  const [input, setInput] = useState('');\n\n  const messagesRef = useRef<HTMLDivElement>(null);\n  // Undo closures by item id — state, not a ref, because the card's Undo button\n  // renders from it.\n  const [undoFns, setUndoFns] = useState<ReadonlyMap<number, () => void>>(new Map());\n  const conversation = useConversation(conversationId);\n\n  const engineConfig: UseAiAssistantConfig = {\n    gateway,\n    buildSystemPrompt,\n    buildContext,\n    requestParams,\n    tools,\n    proposals,\n    limits,\n  };\n  const { items, sending, draft, send, setProposalStatus, notifyContextSwitch, clear } =\n    useAiAssistant(engineConfig, conversation);\n\n  const resolvedProposals = proposals ?? NO_PROPOSALS;\n  /**\n   * The flow that produced a card — apply/undo/render all route through it.\n   * Undefined for an item whose flow is no longer registered, so callers guard.\n   */\n  const proposalConfigFor = useCallback(\n    (item: AiChatItem) => resolvedProposals[item.proposalToolName ?? ''],\n    [resolvedProposals],\n  );\n\n  // Surface mid-conversation context switches in the chat + model history\n  const prevContextRef = useRef<string>('');\n  useEffect(() => {\n    const prev = prevContextRef.current;\n    if (contextKey) {\n      if (prev && prev !== contextKey) {\n        notifyContextSwitch(\n          contextSwitchNotice?.(prev, contextKey) ?? `Switched to ${contextKey}`,\n          contextSwitchHistoryMarker?.(prev, contextKey) ??\n            `[The user switched context from ${prev} to ${contextKey}. Earlier turns may refer to the previous context; new proposals target ${contextKey}.]`,\n        );\n      }\n      prevContextRef.current = contextKey;\n    }\n  }, [contextKey, notifyContextSwitch, contextSwitchNotice, contextSwitchHistoryMarker]);\n\n  // Autoscroll sticks to the bottom only while the user is there. Someone who\n  // scrolled up to reread is left alone while text streams in, and gets a\n  // \"Jump to latest\" affordance instead.\n  //\n  // Intent is read from the wheel/touch gesture, not from the scroll event:\n  // scroll events are dispatched a frame late, so a wheel-up followed by the\n  // streaming autoscroll in the same frame reports \"at bottom\" and the user\n  // can never win. The scroll event only ever re-sticks, at the bottom.\n  const stickToBottomRef = useRef(true);\n  const [showJumpToLatest, setShowJumpToLatest] = useState(false);\n  const handleWheel = useCallback((e: React.WheelEvent) => {\n    if (e.deltaY < 0) stickToBottomRef.current = false;\n  }, []);\n  const handleTouchMove = useCallback(() => {\n    stickToBottomRef.current = false;\n  }, []);\n  const handleScroll = useCallback(() => {\n    const el = messagesRef.current;\n    if (!el) return;\n    if (el.scrollHeight - el.scrollTop - el.clientHeight < 32) {\n      stickToBottomRef.current = true;\n      setShowJumpToLatest(false);\n    }\n  }, []);\n  const jumpToLatest = useCallback(() => {\n    stickToBottomRef.current = true;\n    setShowJumpToLatest(false);\n    const el = messagesRef.current;\n    if (el) el.scrollTop = el.scrollHeight;\n  }, []);\n  useEffect(() => {\n    const el = messagesRef.current;\n    if (!el) return;\n    if (stickToBottomRef.current) el.scrollTop = el.scrollHeight;\n    else if (el.scrollHeight > el.clientHeight) setShowJumpToLatest(true);\n  }, [items, sending, draft]);\n\n  const handleSend = useCallback(() => {\n    const text = input.trim();\n    if (!text || sending || !selectedModel || disabled) return;\n    setInput('');\n    stickToBottomRef.current = true; // the user just acted — follow the reply\n    void send(text, selectedModel, contextKey);\n  }, [input, sending, selectedModel, disabled, send, contextKey]);\n\n  const handleApply = useCallback(\n    (item: AiChatItem) => {\n      const config = proposalConfigFor(item);\n      if (!item.proposal || !config) return;\n      const undo = config.onApply(item.proposal.payload);\n      if (typeof undo === 'function') setUndoFns(prev => new Map(prev).set(item.id, undo));\n      setProposalStatus(item.id, 'applied');\n    },\n    [proposalConfigFor, setProposalStatus],\n  );\n\n  const handleUndo = useCallback(\n    (item: AiChatItem) => {\n      const undo = undoFns.get(item.id);\n      if (!undo) return;\n      undo();\n      setUndoFns(prev => {\n        const next = new Map(prev);\n        next.delete(item.id);\n        return next;\n      });\n      setProposalStatus(item.id, 'undone');\n    },\n    [undoFns, setProposalStatus],\n  );\n\n  const handleDismiss = useCallback(\n    (item: AiChatItem) => setProposalStatus(item.id, 'dismissed'),\n    [setProposalStatus],\n  );\n\n  // autoApply mode: apply pending proposals as they arrive — the card renders\n  // as applied with Undo, no click needed. Guarded by a ref so double effect\n  // runs (StrictMode) can't apply twice, and stale-context proposals stay pending.\n  const autoAppliedRef = useRef<Set<number>>(new Set());\n  useEffect(() => {\n    for (const item of items) {\n      if (!item.proposal || item.proposalStatus !== 'pending') continue;\n      if (!resolvedProposals[item.proposalToolName ?? '']?.autoApply) continue;\n      if (autoAppliedRef.current.has(item.id)) continue;\n      if (item.proposalContextKey && contextKey && item.proposalContextKey !== contextKey) continue;\n      autoAppliedRef.current.add(item.id);\n      handleApply(item);\n    }\n  }, [items, resolvedProposals, contextKey, handleApply]);\n\n  // Option objects ({label, value}) because that's what UdpDropdown's\n  // valueChanged detail carries when options are objects.\n  const modelOptions = useMemo(() => models.map(id => ({ label: id, value: id })), [models]);\n\n  return (\n    <div className={styles.root}>\n      {/* No built-in header — hosts own their chrome (drawer title, panel header, …).\n          Clear and diagnostics live in the footer. */}\n      {/* Messages */}\n      <div className={styles.messagesWrap}>\n      <div\n        ref={messagesRef}\n        className={styles.messages}\n        onScroll={handleScroll}\n        onWheel={handleWheel}\n        onTouchMove={handleTouchMove}\n      >\n        {items.length === 0 && emptyStateText && (\n          <div className={styles.emptyState}>{emptyStateText}</div>\n        )}\n\n        {items.map(item =>\n          item.isNotice ? (\n            <div key={item.id} className={styles.notice}>\n              <div className={styles.noticeRule} />\n              <span className={styles.noticeText}>{item.text}</span>\n              <div className={styles.noticeRule} />\n            </div>\n          ) : item.proposal && proposalConfigFor(item) ? (\n            <AiProposalCard\n              key={item.id}\n              item={item}\n              proposalConfig={proposalConfigFor(item)}\n              contextKey={contextKey}\n              contextMismatchText={contextMismatchText}\n              canUndo={undoFns.has(item.id)}\n              onApply={handleApply}\n              onDismiss={handleDismiss}\n              onUndo={handleUndo}\n            />\n          ) : (\n            <div\n              key={item.id}\n              className={[\n                styles.bubble,\n                item.role === 'user' ? styles.bubbleUser : styles.bubbleAssistant,\n                item.isError ? styles.bubbleError : '',\n              ].join(' ')}\n            >\n              {item.role === 'assistant' && !item.isError ? (\n                <AiMessageText text={item.text ?? ''} />\n              ) : (\n                item.text\n              )}\n            </div>\n          ),\n        )}\n        {sending &&\n          (draft ? (\n            <div className={`${styles.bubble} ${styles.bubbleAssistant}`}>\n              <AiMessageText text={draft} />\n            </div>\n          ) : (\n            <div className={styles.pending}>\n              <UdpSpinner size=\"tiny\" />\n            </div>\n          ))}\n      </div>\n        {showJumpToLatest && (\n          <div className={styles.jumpToLatest}>\n            <UdpFluentButton appearance=\"secondary\" size=\"small\" onClick={jumpToLatest}>\n              Jump to latest\n            </UdpFluentButton>\n          </div>\n        )}\n      </div>\n\n      {/* Composer */}\n      <div className={styles.composer}>\n        {modelOptions.length > 1 && (\n          <UdpDropdown\n            options={modelOptions}\n            appearance=\"filled-lighter\"\n            controlSize=\"small\"\n            optionLabel=\"label\"\n            optionValue=\"value\"\n            clearable={false}\n            value={selectedModel ? { label: selectedModel, value: selectedModel } : null}\n            onChange={(e: FormChangeEvent<{ label: string; value: string } | null>) =>\n              setPickedModel(e.target.value?.value ?? null)\n            }\n            includeErrorPadding={false}\n          />\n        )}\n        <UdpTextarea\n          value={input}\n          placeholder={placeholder}\n          disabled={disabled}\n          resize=\"none\"\n          includeErrorPadding={false}\n          onChange={e => setInput(e.target.value)}\n          onKeyDown={e => {\n            if (e.key === 'Enter' && !e.shiftKey) {\n              e.preventDefault();\n              handleSend();\n            }\n          }}\n        />\n        <div className={styles.composerActions}>\n          <UdpFluentButton\n            appearance=\"primary\"\n            size=\"small\"\n            onClick={handleSend}\n            disabled={disabled || sending || !input.trim() || !selectedModel}\n          >\n            Send\n          </UdpFluentButton>\n          <div className={styles.composerSecondary}>\n            {items.length > 0 && (\n              <UdpFluentButton appearance=\"subtle\" size=\"small\" onClick={clear} disabled={sending}>\n                Clear\n              </UdpFluentButton>\n            )}\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n"],"mappings":";;;;;;;;;;;;;AAeA,MAAMuB,eAAiD,EAAE;AAuEzD,MAAauB,iBAAgBC,OAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAA,IAAAvB;CAAA,IAAAwB;AAAA,KAAAF,EAAA,OAAAD,IAAA;AAAC,GAAA,CAAArB,WAAAwB,SAAAH;AAAwCC,IAAA,KAAAD;AAAAC,IAAA,KAAAtB;AAAAsB,IAAA,KAAAE;QAAA;AAAAxB,WAAAsB,EAAA;AAAAE,UAAAF,EAAA;;CACpE,MAAAG,SAAetC,aAAa;CAAC,IAAAuC;AAAA,KAAAJ,EAAA,OAAAG,UAAAH,EAAA,OAAAtB,QAAA;AAEpB0B,OAAAD,UAAAzB,SAAmByB,OAAMzB,OAAO2B,QAAQC,OAAM5B,OAAM6B,SAAUD,GAA0B,CAAC,GAApBH,QAAMzB,UAAN,EAAoB;AAAAsB,IAAA,KAAAG;AAAAH,IAAA,KAAAtB;AAAAsB,IAAA,KAAAI;OAAAA,MAAAJ,EAAA;CADlG,MAAAQ,UACSJ;AAGT,KAAI,CAACD,UAAD,CAAYK,QAAOC,OAAO,QAAS;CAAK,IAAAC;AAAA,KAAAV,EAAA,OAAAG,OAAAQ,WAAAX,EAAA,OAAAQ,WAAAR,EAAA,OAAAE,OAAA;AACrCQ,OAAA,sBAAA,cAAC,MAAD;GAAK,GAAKR;GAAgB,SAAAC,OAAMQ;GAAkBH,QAAAA;GAAW,CAAA;AAAAR,IAAA,KAAAG,OAAAQ;AAAAX,IAAA,KAAAQ;AAAAR,IAAA,KAAAE;AAAAF,IAAA,KAAAU;OAAAA,MAAAV,EAAA;AAAA,QAA7DU;;AAGT,MAAME,QAAOb,OAAA;CAAA,MAAAC,IAAAC,EAAA,IAAA;CAAC,MAAA,EAAAU,SAAAjC,QAAAC,gBAAAC,eAAAC,mBAAAC,cAAAC,OAAAC,WAAAC,YAAAC,qBAAAG,4BAAAC,qBAAAE,gBAAAC,gBAAAE,aAAAS,IAAAR,UAAAc,IAAAb,WAAAE;CAeZ,MAAAJ,cAAAS,OAAAS,KAAAA,IAAA,qBAAAT;CACA,MAAAR,WAAAc,OAAAG,KAAAA,IAAA,QAAAH;CAKA,MAAA,CAAAI,aAAAC,kBAAsC1D,SAAwB,KAAK;CAAC,IAAA2D;AAAA,KAAAhB,EAAA,OAAAtB,UAAAsB,EAAA,OAAAc,eAAAd,EAAA,OAAArB,gBAAA;AAElEqC,OAAAF,eAAepC,OAAM6B,SAAUO,YAIhB,GAJfA,cAEInC,kBAAkBD,OAAM6B,SAAU5B,eAEvB,GAFXA,iBAEED,OAAM;AAAGsB,IAAA,KAAAtB;AAAAsB,IAAA,KAAAc;AAAAd,IAAA,KAAArB;AAAAqB,IAAA,KAAAgB;OAAAA,MAAAhB,EAAA;CALjB,MAAAiB,gBACED;CAKF,MAAA,CAAAE,OAAAC,YAA0B9D,SAAS,GAAG;CAEtC,MAAA+D,cAAoBhE,OAAuB,KAAK;CAAC,IAAAiE;AAAA,KAAArB,EAAA,OAAAsB,OAAAC,IAAA,4BAAA,EAAA;AAGuBF,uBAAA,IAAIG,KAAK;AAAAxB,IAAA,KAAAqB;OAAAA,MAAArB,EAAA;CAAjF,MAAA,CAAAyB,SAAAC,cAA8BrE,SAA0CgE,GAAU;CAClF,MAAAM,eAAqB3D,gBAAgBwB,eAAe;CAAC,IAAAoC;AAAA,KAAA5B,EAAA,OAAAlB,gBAAAkB,EAAA,OAAAnB,qBAAAmB,EAAA,OAAAW,WAAAX,EAAA,OAAAH,UAAAG,EAAA,OAAAhB,aAAAgB,EAAA,QAAApB,iBAAAoB,EAAA,QAAAjB,OAAA;AAEV6C,OAAA;GAAAjB;GAAA9B;GAAAC;GAAAF;GAAAG;GAAAC;GAAAa;GAQ1C;AAAAG,IAAA,KAAAlB;AAAAkB,IAAA,KAAAnB;AAAAmB,IAAA,KAAAW;AAAAX,IAAA,KAAAH;AAAAG,IAAA,KAAAhB;AAAAgB,IAAA,MAAApB;AAAAoB,IAAA,MAAAjB;AAAAiB,IAAA,MAAA4B;OAAAA,MAAA5B,EAAA;CACD,MAAA,EAAA8B,OAAAC,SAAAC,OAAAC,MAAAC,mBAAAC,qBAAAC,UACEtE,eAVyC8D,IAUZD,aAAa;CAE5C,MAAAU,oBAA0BrD,aAAAT;CAA0B,IAAA+D;AAAA,KAAAtC,EAAA,QAAAqC,mBAAA;AAMlDC,QAAAC,SAAsBF,kBAAkBE,KAAIC,oBAAJ;AAA4BxC,IAAA,MAAAqC;AAAArC,IAAA,MAAAsC;OAAAA,MAAAtC,EAAA;CADtE,MAAAyC,oBAA0BH;CAM1B,MAAAI,iBAAuBtF,OAAe,GAAG;CAAC,IAAAuF;CAAA,IAAAC;AAAA,KAAA5C,EAAA,QAAAf,cAAAe,EAAA,QAAAX,8BAAAW,EAAA,QAAAd,uBAAAc,EAAA,QAAAmC,qBAAA;AAChCQ,aAAA;GACR,MAAAE,OAAaH,eAAcI;AAC3B,OAAI7D,YAAU;AACZ,QAAI4D,QAAQA,SAAS5D,WACnBkD,qBACEjD,sBAAsB2D,MAAM5D,WAA0C,IAAtE,eAA0DA,cAC1DI,6BAA6BwD,MAAM5D,WACgH,IADnJ,mCACqC4D,KAAI,MAAO5D,WAAU,0EAA2EA,WAAU,IAChJ;AAEHyD,mBAAcI,UAAW7D;;;AAE1B2D,OAAA;GAAC3D;GAAYkD;GAAqBjD;GAAqBG;GAA2B;AAAAW,IAAA,MAAAf;AAAAe,IAAA,MAAAX;AAAAW,IAAA,MAAAd;AAAAc,IAAA,MAAAmC;AAAAnC,IAAA,MAAA2C;AAAA3C,IAAA,MAAA4C;QAAA;AAAAD,OAAA3C,EAAA;AAAA4C,OAAA5C,EAAA;;AAZrF9C,WAAUyF,IAYPC,GAAmF;CAUtF,MAAAG,mBAAyB3F,OAAO,KAAK;CACrC,MAAA,CAAA4F,kBAAAC,uBAAgD5F,SAAS,MAAM;CAAC,IAAA6F;AAAA,KAAAlD,EAAA,QAAAsB,OAAAC,IAAA,4BAAA,EAAA;AAChC2B,QAAAC,MAAA;AAC9B,OAAIA,EAACC,SAAU,EAAGL,kBAAgBD,UAAW;;AAC9C9C,IAAA,MAAAkD;OAAAA,MAAAlD,EAAA;CAFD,MAAAqD,cAAoBH;CAEb,IAAAI;AAAA,KAAAtD,EAAA,QAAAsB,OAAAC,IAAA,4BAAA,EAAA;AAC6B+B,cAAA;AAClCP,oBAAgBD,UAAW;;AAC5B9C,IAAA,MAAAsD;OAAAA,OAAAtD,EAAA;CAFD,MAAAuD,kBAAwBD;CAEjB,IAAAE;AAAA,KAAAxD,EAAA,QAAAsB,OAAAC,IAAA,4BAAA,EAAA;AAC0BiC,cAAA;GAC/B,MAAAC,KAAWrC,YAAW0B;AACtB,OAAI,CAACW,GAAE;AACP,OAAIA,GAAEC,eAAgBD,GAAEE,YAAaF,GAAEG,eAAgB,IAAE;AACvDb,qBAAgBD,UAAW;AAC3BG,wBAAoB,MAAM;;;AAE7BjD,IAAA,MAAAwD;OAAAA,OAAAxD,EAAA;CAPD,MAAA6D,eAAqBL;CAOd,IAAAM;AAAA,KAAA9D,EAAA,QAAAsB,OAAAC,IAAA,4BAAA,EAAA;AAC0BuC,cAAA;AAC/Bf,oBAAgBD,UAAW;AAC3BG,uBAAoB,MAAM;GAC1B,MAAAc,OAAW3C,YAAW0B;AACtB,OAAIW,KAAIA,MAAEE,YAAaF,KAAEC;;AAC1B1D,IAAA,MAAA8D;OAAAA,OAAA9D,EAAA;CALD,MAAAgE,eAAqBF;CAKd,IAAAG;AAAA,KAAAjE,EAAA,QAAAsB,OAAAC,IAAA,4BAAA,EAAA;AACG0C,cAAA;GACR,MAAAC,OAAW9C,YAAW0B;AACtB,OAAI,CAACW,KAAE;AACP,OAAIV,iBAAgBD,QAAUW,MAAEE,YAAaF,KAAEC;YACtCD,KAAEC,eAAgBD,KAAEG,aAAeX,qBAAoB,KAAK;;AACtEjD,IAAA,MAAAiE;OAAAA,OAAAjE,EAAA;CAAA,IAAAmE;AAAA,KAAAnE,EAAA,QAAAgC,SAAAhC,EAAA,QAAA8B,SAAA9B,EAAA,QAAA+B,SAAA;AAAEoC,QAAA;GAACrC;GAAOC;GAASC;GAAM;AAAAhC,IAAA,MAAAgC;AAAAhC,IAAA,MAAA8B;AAAA9B,IAAA,MAAA+B;AAAA/B,IAAA,MAAAmE;OAAAA,OAAAnE,EAAA;AAL1B9C,WAAU+G,KAKPE,IAAwB;CAAA,IAAAC;AAAA,KAAApE,EAAA,QAAAf,cAAAe,EAAA,QAAAJ,YAAAI,EAAA,QAAAkB,SAAAlB,EAAA,QAAAiB,iBAAAjB,EAAA,QAAAiC,QAAAjC,EAAA,QAAA+B,SAAA;AAEIqC,cAAA;GAC7B,MAAAC,OAAanD,MAAKoD,MAAO;AACzB,OAAI,CAACD,QAADtC,WAAA,CAAqBd,iBAArBrB,SAA8C;AAClDuB,YAAS,GAAG;AACZ4B,oBAAgBD,UAAW;AACtBb,QAAKoC,MAAMpD,eAAehC,WAAW;;AAC3Ce,IAAA,MAAAf;AAAAe,IAAA,MAAAJ;AAAAI,IAAA,MAAAkB;AAAAlB,IAAA,MAAAiB;AAAAjB,IAAA,MAAAiC;AAAAjC,IAAA,MAAA+B;AAAA/B,IAAA,MAAAoE;OAAAA,OAAApE,EAAA;CAND,MAAAuE,aAAmBH;CAM6C,IAAAI;AAAA,KAAAxE,EAAA,QAAAyC,qBAAAzC,EAAA,QAAAkC,mBAAA;AAG9DsC,SAAAC,WAAA;GACE,MAAAC,SAAejC,kBAAkBF,OAAK;AACtC,OAAI,CAACA,OAAIoC,YAAL,CAAmBD,OAAM;GAC7B,MAAAE,OAAaF,OAAMG,QAAStC,OAAIoC,SAASG,QAAS;AAClD,OAAI,OAAOF,SAAS,WAAYlD,aAAWqD,WAAQ,IAAIvD,IAAIqB,OAAK,CAAAmC,IAAKzC,OAAIjC,IAAKsE,KAAK,CAAC;AACpF1C,qBAAkBK,OAAIjC,IAAK,UAAU;;AACtCN,IAAA,MAAAyC;AAAAzC,IAAA,MAAAkC;AAAAlC,IAAA,MAAAwE;OAAAA,OAAAxE,EAAA;CAPH,MAAAiF,cAAoBT;CASlB,IAAAU;AAAA,KAAAlF,EAAA,QAAAkC,qBAAAlC,EAAA,QAAAyB,SAAA;AAGAyD,SAAAC,WAAA;GACE,MAAAC,SAAa3D,QAAO4D,IAAK9C,OAAIjC,GAAI;AACjC,OAAI,CAACsE,OAAI;AACTA,WAAM;AACNlD,eAAW4D,WAAA;IACT,MAAAlG,OAAa,IAAIoC,IAAIqB,OAAK;AAC1BzD,SAAImG,OAAQhD,OAAIjC,GAAI;AAAA,WACblB;KACP;AACF8C,qBAAkBK,OAAIjC,IAAK,SAAS;;AACrCN,IAAA,MAAAkC;AAAAlC,IAAA,MAAAyB;AAAAzB,IAAA,MAAAkF;OAAAA,OAAAlF,EAAA;CAXH,MAAAwF,aAAmBN;CAajB,IAAAO;AAAA,KAAAzF,EAAA,QAAAkC,mBAAA;AAGAuD,SAAAC,WAAsBxD,kBAAkBK,OAAIjC,IAAK,YAAY;AAAAN,IAAA,MAAAkC;AAAAlC,IAAA,MAAAyF;OAAAA,OAAAzF,EAAA;CAD/D,MAAA2F,gBAAsBF;CAGpB,IAAAG;AAAA,KAAA5F,EAAA,QAAAsB,OAAAC,IAAA,4BAAA,EAAA;AAKyCqE,wBAAA,IAAIC,KAAK;AAAA7F,IAAA,MAAA4F;OAAAA,OAAA5F,EAAA;CAApD,MAAA8F,iBAAuB1I,OAAoBwI,IAAU;CAAC,IAAAG;CAAA,IAAAC;AAAA,KAAAhG,EAAA,QAAAf,cAAAe,EAAA,QAAAiF,eAAAjF,EAAA,QAAA8B,SAAA9B,EAAA,QAAAqC,mBAAA;AAC5C0D,cAAA;AACR,QAAK,MAAAE,UAAcnE,OAAK;AACtB,QAAI,CAACS,OAAIoC,YAAapC,OAAI2D,mBAAoB,UAAW;AACzD,QAAI,CAAC7D,kBAAkBE,OAAIC,oBAAJ,KAAuC2D,UAAE;AAChE,QAAIL,eAAchD,QAAQsD,IAAK7D,OAAIjC,GAAI,CAAE;AACzC,QAAIiC,OAAIhD,sBAAJN,cAAyCsD,OAAIhD,uBAAwBN,WAAY;AACrF6G,mBAAchD,QAAQuD,IAAK9D,OAAIjC,GAAI;AACnC2E,gBAAY1C,OAAK;;;AAElByD,QAAA;GAAClE;GAAOO;GAAmBpD;GAAYgG;GAAY;AAAAjF,IAAA,MAAAf;AAAAe,IAAA,MAAAiF;AAAAjF,IAAA,MAAA8B;AAAA9B,IAAA,MAAAqC;AAAArC,IAAA,MAAA+F;AAAA/F,IAAA,MAAAgG;QAAA;AAAAD,QAAA/F,EAAA;AAAAgG,QAAAhG,EAAA;;AATtD9C,WAAU6I,KASPC,IAAoD;CAAA,IAAAM;AAAA,KAAAtG,EAAA,QAAAtB,QAAA;AAIpB4H,QAAA5H,OAAM6H,IAAKC,MAAiC;AAAAxG,IAAA,MAAAtB;AAAAsB,IAAA,MAAAsG;OAAAA,OAAAtG,EAAA;CAA/E,MAAAyG,eAAmCH;CAAwD,IAAAI;AAAA,KAAA1G,EAAA,QAAAP,kBAAAO,EAAA,QAAA8B,MAAArB,QAAA;AAepFiG,QAAA5E,MAAKrB,WAAY,KAAjBhB,kBACC,sBAAA,cAAA,OAAA,EAAgB,WAAAnB,OAAMqI,YACvB,EADqClH,eACrC;AAAAO,IAAA,MAAAP;AAAAO,IAAA,MAAA8B,MAAArB;AAAAT,IAAA,MAAA0G;OAAAA,OAAA1G,EAAA;CAAA,IAAA4G;AAAA,KAAA5G,EAAA,QAAAf,cAAAe,EAAA,QAAAV,uBAAAU,EAAA,QAAAiF,eAAAjF,EAAA,QAAA2F,iBAAA3F,EAAA,QAAAwF,cAAAxF,EAAA,QAAA8B,SAAA9B,EAAA,QAAAyC,qBAAAzC,EAAA,QAAAyB,SAAA;EAAA,IAAAoF;AAAA,MAAA7G,EAAA,QAAAf,cAAAe,EAAA,QAAAV,uBAAAU,EAAA,QAAAiF,eAAAjF,EAAA,QAAA2F,iBAAA3F,EAAA,QAAAwF,cAAAxF,EAAA,QAAAyC,qBAAAzC,EAAA,QAAAyB,SAAA;AAEUoF,UAAAC,WACTvE,OAAIwE,WACF,sBAAA,cAAA,OAAA;IAAU,KAAAxE,OAAIjC;IAAgB,WAAAhC,OAAM0I;IAgCrC,EA/BG,sBAAA,cAAA,OAAA,EAAgB,WAAA1I,OAAM2I,YACtB,CAAA,EAAA,sBAAA,cAAA,QAAA,EAAiB,WAAA3I,OAAM4I,YACvB,EADqC3E,OAAI8B,KACzC,EAAA,sBAAA,cAAA,OAAA,EAAgB,WAAA/F,OAAM2I,YACxB,CAAA,CA4BD,GA3BG1E,OAAIoC,YAAalC,kBAAkBF,OA2BtC,GA1BC,sBAAA,cAAC,gBAAD;IACO,KAAAA,OAAIjC;IACHiC,MAAAA;IACU,gBAAAE,kBAAkBF,OAAI;IAC1BtD;IACSK;IACZ,SAAAmC,QAAO2E,IAAK7D,OAAIjC,GAAG;IACnB2E,SAAAA;IACEU,WAAAA;IACHH,QAAAA;IAiBX,CAAA,GAdC,sBAAA,cAAA,OAAA;IACO,KAAAjD,OAAIjC;IACE,WAAA;KACThC,OAAM6I;KACN5E,OAAI6E,SAAU,SAAS9I,OAAM+I,aAAc/I,OAAMgJ;KACjD/E,OAAIgF,UAAWjJ,OAAMkJ,cAArB;KACD,CAAAC,KAAM,IAAG;IAQb,EANIlF,OAAI6E,SAAU,eAAd,CAA8B7E,OAAIgF,UACjC,sBAAA,cAAC,eAAD,EAAqB,MAAAhF,OAAI8B,QAAJ,IAGtB,CAAA,GADC9B,OAAI8B,KAGT;AAAArE,KAAA,MAAAf;AAAAe,KAAA,MAAAV;AAAAU,KAAA,MAAAiF;AAAAjF,KAAA,MAAA2F;AAAA3F,KAAA,MAAAwF;AAAAxF,KAAA,MAAAyC;AAAAzC,KAAA,MAAAyB;AAAAzB,KAAA,MAAA6G;QAAAA,OAAA7G,EAAA;AAlCF4G,QAAA9E,MAAKyE,IAAKM,IAmCV;AAAA7G,IAAA,MAAAf;AAAAe,IAAA,MAAAV;AAAAU,IAAA,MAAAiF;AAAAjF,IAAA,MAAA2F;AAAA3F,IAAA,MAAAwF;AAAAxF,IAAA,MAAA8B;AAAA9B,IAAA,MAAAyC;AAAAzC,IAAA,MAAAyB;AAAAzB,IAAA,MAAA4G;OAAAA,OAAA5G,EAAA;CAAA,IAAA6G;AAAA,KAAA7G,EAAA,QAAAgC,SAAAhC,EAAA,QAAA+B,SAAA;AACA8E,QAAA9E,YACEC,QACC,sBAAA,cAAA,OAAA,EAAgB,WAAA,GAAG1D,OAAM6I,OAAO,GAAI7I,OAAMgJ,mBAO3C,EANG,sBAAA,cAAC,eAAD,EAAqBtF,MAAAA,OACvB,CAAA,CAKD,GAHC,sBAAA,cAAA,OAAA,EAAgB,WAAA1D,OAAMoJ,SAGtB,EAFE,sBAAA,cAAC,cAAD,EAAiB,MAAA,QACnB,CAAA,CACA;AAAA1H,IAAA,MAAAgC;AAAAhC,IAAA,MAAA+B;AAAA/B,IAAA,MAAA6G;OAAAA,OAAA7G,EAAA;CAAA,IAAA2H;AAAA,KAAA3H,EAAA,QAAA0G,OAAA1G,EAAA,QAAA4G,OAAA5G,EAAA,QAAA6G,KAAA;AAxDNc,QAAA,sBAAA,cAAA,OAAA;GACOvG,KAAAA;GACM,WAAA9C,OAAMsJ;GACP/D,UAAAA;GACDR,SAAAA;GACIE,aAAAA;GAoDT,EAlDHmD,KAIAE,KAoCAC,IAUG;AAAA7G,IAAA,MAAA0G;AAAA1G,IAAA,MAAA4G;AAAA5G,IAAA,MAAA6G;AAAA7G,IAAA,MAAA2H;OAAAA,OAAA3H,EAAA;CAAA,IAAA6H;AAAA,KAAA7H,EAAA,QAAAgD,kBAAA;AACH6E,QAAA7E,oBACC,sBAAA,cAAA,OAAA,EAAgB,WAAA1E,OAAM0F,cAKvB,EAJG,sBAAA,cAAC,iBAAD;GAA4B,YAAA;GAAiB,MAAA;GAAiBA,SAAAA;GAGhE,EAH8E,iBAG9E,CACD;AAAAhE,IAAA,MAAAgD;AAAAhD,IAAA,MAAA6H;OAAAA,OAAA7H,EAAA;CAAA,IAAA8H;AAAA,KAAA9H,EAAA,QAAA2H,OAAA3H,EAAA,QAAA6H,KAAA;AAjEHC,QAAA,sBAAA,cAAA,OAAA,EAAgB,WAAAxJ,OAAMyJ,cAkEhB,EAjENJ,KA0DGE,IAOG;AAAA7H,IAAA,MAAA2H;AAAA3H,IAAA,MAAA6H;AAAA7H,IAAA,MAAA8H;OAAAA,OAAA9H,EAAA;CAAA,IAAAgI;AAAA,KAAAhI,EAAA,QAAAyG,gBAAAzG,EAAA,QAAAiB,eAAA;AAIH+G,QAAAvB,aAAYhG,SAAU,KACrB,sBAAA,cAAC,aAAD;GACWgG,SAAAA;GACE,YAAA;GACC,aAAA;GACA,aAAA;GACA,aAAA;GACD,WAAA;GACJ,OAAAxF,gBAAA;IAAAgH,OAAyBhH;IAAaiH,OAASjH;IAAsB,GAArE;GACG,WAAAkH,QACRpH,eAAeoC,IAACiF,OAAOF,OAAaA,SAArB,KAA6B;GAEzB,qBAAA;GAExB,CAAA;AAAAlI,IAAA,MAAAyG;AAAAzG,IAAA,MAAAiB;AAAAjB,IAAA,MAAAgI;OAAAA,OAAAhI,EAAA;CAAA,IAAAqI;AAAA,KAAArI,EAAA,QAAAsB,OAAAC,IAAA,4BAAA,EAAA;AAOW8G,SAAAC,QAAKnH,SAASgC,IAACiF,OAAOF,MAAO;AAAAlI,IAAA,MAAAqI;OAAAA,OAAArI,EAAA;CAAA,IAAAuI;AAAA,KAAAvI,EAAA,QAAAuE,YAAA;AAC5BgE,SAAAC,QAAA;AACT,OAAIrF,IAACsF,QAAS,WAAV,CAAsBtF,IAACuF,UAAS;AAClCvF,QAACwF,gBAAiB;AAClBpE,gBAAY;;;AAEfvE,IAAA,MAAAuE;AAAAvE,IAAA,MAAAuI;OAAAA,OAAAvI,EAAA;CAAA,IAAA4I;AAAA,KAAA5I,EAAA,QAAAJ,YAAAI,EAAA,QAAAkB,SAAAlB,EAAA,QAAAL,eAAAK,EAAA,QAAAuI,KAAA;AAZHK,QAAA,sBAAA,cAAC,eAAD;GACS1H,OAAAA;GACMvB;GACHC;GACH,QAAA;GACc,qBAAA;GACX,UAAAyI;GACC,WAAAE;GAMX,CAAA;AAAAvI,IAAA,MAAAJ;AAAAI,IAAA,MAAAkB;AAAAlB,IAAA,MAAAL;AAAAK,IAAA,MAAAuI;AAAAvI,IAAA,MAAA4I;OAAAA,OAAA5I,EAAA;CAAA,IAAA6I;AAAA,KAAA7I,EAAA,QAAAJ,YAAAI,EAAA,QAAAkB,SAAAlB,EAAA,QAAAiB,iBAAAjB,EAAA,SAAA+B,SAAA;AAMY8G,QAAAjJ,YAAAmC,WAAA,CAAwBb,MAAKoD,MAAyB,IAAtD,CAAyCrD;AAAajB,IAAA,MAAAJ;AAAAI,IAAA,MAAAkB;AAAAlB,IAAA,MAAAiB;AAAAjB,IAAA,OAAA+B;AAAA/B,IAAA,OAAA6I;OAAAA,OAAA7I,EAAA;CAAA,IAAA8I;AAAA,KAAA9I,EAAA,SAAAuE,cAAAvE,EAAA,SAAA6I,KAAA;AAJlEC,QAAA,sBAAA,cAAC,iBAAD;GACa,YAAA;GACN,MAAA;GACIvE,SAAAA;GACC,UAAAsE;GAGM,EAFjB,OAEiB;AAAA7I,IAAA,OAAAuE;AAAAvE,IAAA,OAAA6I;AAAA7I,IAAA,OAAA8I;OAAAA,OAAA9I,EAAA;CAAA,IAAA+I;AAAA,KAAA/I,EAAA,SAAAoC,SAAApC,EAAA,SAAA8B,MAAArB,UAAAT,EAAA,SAAA+B,SAAA;AAEfgH,QAAAjH,MAAKrB,SAAU,KACd,sBAAA,cAAC,iBAAD;GAA4B,YAAA;GAAc,MAAA;GAAiB2B,SAAAA;GAAiBL,UAAAA;GAG7E,EAHsF,QAGtF;AAAA/B,IAAA,OAAAoC;AAAApC,IAAA,OAAA8B,MAAArB;AAAAT,IAAA,OAAA+B;AAAA/B,IAAA,OAAA+I;OAAAA,OAAA/I,EAAA;CAAA,IAAAgJ;AAAA,KAAAhJ,EAAA,SAAA+I,KAAA;AALHC,QAAA,sBAAA,cAAA,OAAA,EAAgB,WAAA1K,OAAM2K,mBAMhB,EALHF,IAKG;AAAA/I,IAAA,OAAA+I;AAAA/I,IAAA,OAAAgJ;OAAAA,OAAAhJ,EAAA;CAAA,IAAAkJ;AAAA,KAAAlJ,EAAA,SAAA8I,OAAA9I,EAAA,SAAAgJ,KAAA;AAfRE,QAAA,sBAAA,cAAA,OAAA,EAAgB,WAAA5K,OAAM6K,iBAgBhB,EAfJL,KAQAE,IAOI;AAAAhJ,IAAA,OAAA8I;AAAA9I,IAAA,OAAAgJ;AAAAhJ,IAAA,OAAAkJ;OAAAA,OAAAlJ,EAAA;CAAA,IAAAoJ;AAAA,KAAApJ,EAAA,SAAAgI,OAAAhI,EAAA,SAAA4I,OAAA5I,EAAA,SAAAkJ,KAAA;AA9CRE,QAAA,sBAAA,cAAA,OAAA,EAAgB,WAAA9K,OAAM+K,UA+ChB,EA9CHrB,KAeDY,KAcAM,IAiBI;AAAAlJ,IAAA,OAAAgI;AAAAhI,IAAA,OAAA4I;AAAA5I,IAAA,OAAAkJ;AAAAlJ,IAAA,OAAAoJ;OAAAA,OAAApJ,EAAA;CAAA,IAAAsJ;AAAA,KAAAtJ,EAAA,SAAA8H,OAAA9H,EAAA,SAAAoJ,KAAA;AAxHRE,QAAA,sBAAA,cAAA,OAAA,EAAgB,WAAAhL,OAAMiL,MAyHhB,EArHJzB,KAqEAsB,IAgDI;AAAApJ,IAAA,OAAA8H;AAAA9H,IAAA,OAAAoJ;AAAApJ,IAAA,OAAAsJ;OAAAA,OAAAtJ,EAAA;AAAA,QAzHNsJ;;AA1KS,SAAA9C,MAAAlG,IAAA;AAAA,QAuK0C;EAAA2H,OAAS3H;EAAE4H,OAAS5H;EAAI"}