{"version":3,"file":"VowelAgent-N9gCk5c2.cjs","sources":["../../node_modules/lucide-react/dist/esm/icons/bug.js","../../node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../node_modules/lucide-react/dist/esm/icons/chevron-up.js","../../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../../node_modules/lucide-react/dist/esm/icons/file-text.js","../../node_modules/lucide-react/dist/esm/icons/shield.js","../../lib/vowel/components/VoiceNagWrapper.tsx","../../lib/vowel/components/TermsPrivacyModal.tsx","../../lib/vowel/components/FloatingCursorRenderer.tsx","../../lib/vowel/components/hooks/useCaptionManager.ts","../../lib/vowel/components/VowelCaption.tsx","../../lib/vowel/components/ErrorModal.tsx","../../lib/vowel/components/types.ts","../../lib/vowel/components/VowelAgent.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n  [\"path\", { d: \"M12 20v-9\", key: \"1qisl0\" }],\n  [\"path\", { d: \"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\", key: \"uouzyp\" }],\n  [\"path\", { d: \"M14.12 3.88 16 2\", key: \"qol33r\" }],\n  [\"path\", { d: \"M21 21a4 4 0 0 0-3.81-4\", key: \"1b0z45\" }],\n  [\"path\", { d: \"M21 5a4 4 0 0 1-3.55 3.97\", key: \"5cxbf6\" }],\n  [\"path\", { d: \"M22 13h-4\", key: \"1jl80f\" }],\n  [\"path\", { d: \"M3 21a4 4 0 0 1 3.81-4\", key: \"1fjd4g\" }],\n  [\"path\", { d: \"M3 5a4 4 0 0 0 3.55 3.97\", key: \"1d7oge\" }],\n  [\"path\", { d: \"M6 13H2\", key: \"82j7cp\" }],\n  [\"path\", { d: \"m8 2 1.88 1.88\", key: \"fmnt4t\" }],\n  [\"path\", { d: \"M9 7.13V6a3 3 0 1 1 6 0v1.13\", key: \"1vgav8\" }]\n];\nconst Bug = createLucideIcon(\"bug\", __iconNode);\n\nexport { __iconNode, Bug as default };\n//# sourceMappingURL=bug.js.map\n","/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m18 15-6-6-6 6\", key: \"153udz\" }]];\nconst ChevronUp = createLucideIcon(\"chevron-up\", __iconNode);\n\nexport { __iconNode, ChevronUp as default };\n//# sourceMappingURL=chevron-up.js.map\n","/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n  [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n  [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n  [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n  [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n  [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n  [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n  [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n  [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n];\nconst FileText = createLucideIcon(\"file-text\", __iconNode);\n\nexport { __iconNode, FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * @license lucide-react v0.545.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n  [\n    \"path\",\n    {\n      d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n      key: \"oel41y\"\n    }\n  ]\n];\nconst Shield = createLucideIcon(\"shield\", __iconNode);\n\nexport { __iconNode, Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @fileoverview VoiceNagWrapper Component - Promotional wrapper for voice agent button\n * \n * This component wraps the floating agent button with an optional \"nag\" message that\n * introduces users to the voice agent feature. The nag appears once and can be dismissed\n * either by clicking the acknowledge button or by using the voice agent. State is persisted\n * to localStorage so it doesn't reappear after dismissal.\n * \n * Features:\n * - Optional nag message with customizable content\n * - Auto-dismisses on first voice agent use\n * - Manual dismiss with acknowledge button\n * - LocalStorage persistence\n * - Smooth animations\n * - Responsive positioning based on button position\n * \n * @module @vowel.to/client/components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { useState, useEffect, type ReactNode } from \"react\";\nimport { X, Mic } from \"lucide-react\";\nimport { cn, VOWEL_UI_SCOPE_CLASS } from \"../utils\";\nimport type { VowelPosition } from \"./types\";\n\n/**\n * Props for VoiceNagWrapper\n */\nexport interface VoiceNagWrapperProps {\n  /** Whether to show the nag (if not already dismissed) */\n  enabled?: boolean;\n\n  /** Position of the floating button (affects nag layout) */\n  position?: VowelPosition;\n\n  /** Custom className for the wrapper */\n  className?: string;\n\n  /** Custom title for the nag message */\n  nagTitle?: string;\n\n  /** Custom description for the nag message */\n  nagDescription?: string;\n\n  /** Custom acknowledge button text */\n  nagButtonText?: string;\n\n  /** LocalStorage key prefix for storing dismissed state */\n  storageKeyPrefix?: string;\n\n  /** Children (typically the FloatingMicButton) */\n  children: ReactNode;\n\n  /** Callback when nag is dismissed */\n  onDismiss?: () => void;\n\n  /** Whether the voice agent is currently connected (auto-dismiss on first use) */\n  isConnected?: boolean;\n}\n\n/**\n * Default nag content\n */\nconst DEFAULT_NAG_TITLE = \"Try Voice Shopping! 🎤\";\nconst DEFAULT_NAG_DESCRIPTION = \"Get personalized help finding products, checking out, and more—all hands-free with our voice assistant.\";\nconst DEFAULT_NAG_BUTTON_TEXT = \"Got it\";\nconst DEFAULT_STORAGE_KEY_PREFIX = \"vowel-voice-nag\";\n\n/**\n * VoiceNagWrapper Component\n * \n * Wraps the voice agent button with an optional promotional message that introduces\n * the feature to users. The message is shown once and persisted to localStorage.\n * \n * @example\n * ```tsx\n * <VoiceNagWrapper\n *   enabled={true}\n *   position=\"bottom-right\"\n *   isConnected={state.isConnected}\n *   onDismiss={() => console.log('Nag dismissed')}\n * >\n *   <FloatingMicButton {...buttonProps} />\n * </VoiceNagWrapper>\n * ```\n */\nexport function VoiceNagWrapper({\n  enabled = false,\n  position = \"bottom-right\",\n  className,\n  nagTitle = DEFAULT_NAG_TITLE,\n  nagDescription = DEFAULT_NAG_DESCRIPTION,\n  nagButtonText = DEFAULT_NAG_BUTTON_TEXT,\n  storageKeyPrefix = DEFAULT_STORAGE_KEY_PREFIX,\n  children,\n  onDismiss,\n  isConnected = false,\n}: VoiceNagWrapperProps) {\n  const [showNag, setShowNag] = useState(false);\n  const [hasUsedVoiceAgent, setHasUsedVoiceAgent] = useState(false);\n\n  // Storage keys\n  const dismissedKey = `${storageKeyPrefix}-dismissed`;\n  const usedKey = `${storageKeyPrefix}-used`;\n\n  // Initialize nag visibility from localStorage\n  useEffect(() => {\n    if (!enabled) {\n      setShowNag(false);\n      return;\n    }\n\n    try {\n      const isDismissed = localStorage.getItem(dismissedKey) === \"true\";\n      const isUsed = localStorage.getItem(usedKey) === \"true\";\n\n      // Show nag if it hasn't been dismissed and voice agent hasn't been used\n      setShowNag(!isDismissed && !isUsed);\n      setHasUsedVoiceAgent(isUsed);\n    } catch (error) {\n      console.error(\"[VoiceNagWrapper] Error reading localStorage:\", error);\n      setShowNag(false);\n    }\n  }, [enabled, dismissedKey, usedKey]);\n\n  // Auto-dismiss on first voice agent use\n  useEffect(() => {\n    if (isConnected && !hasUsedVoiceAgent && showNag) {\n      console.log(\"[VoiceNagWrapper] Voice agent used for first time - dismissing nag\");\n      handleDismiss(true);\n    }\n  }, [isConnected, hasUsedVoiceAgent, showNag]);\n\n  /**\n   * Handle nag dismissal\n   * @param viaUsage - True if dismissed via voice agent usage, false if manual dismiss\n   */\n  const handleDismiss = (viaUsage = false) => {\n    try {\n      // Mark as dismissed\n      localStorage.setItem(dismissedKey, \"true\");\n      \n      // If dismissed via usage, also mark as used\n      if (viaUsage) {\n        localStorage.setItem(usedKey, \"true\");\n        setHasUsedVoiceAgent(true);\n      }\n\n      setShowNag(false);\n      onDismiss?.();\n    } catch (error) {\n      console.error(\"[VoiceNagWrapper] Error writing to localStorage:\", error);\n      setShowNag(false);\n    }\n  };\n\n  // If nag is disabled or not showing, render children only\n  if (!enabled || !showNag) {\n    return <>{children}</>;\n  }\n\n  // Determine layout direction based on position\n  const isRight = position.includes(\"right\");\n\n  // Layout classes based on position\n  const containerClasses = cn(\n    \"flex items-center gap-3 p-3 rounded-2xl shadow-2xl border border-gray-200/50 dark:border-gray-700/50\",\n    \"bg-white/95 dark:bg-gray-900/95 backdrop-blur-xl\",\n    \"animate-in slide-in-from-bottom-4 fade-in duration-500\",\n    isRight ? \"flex-row-reverse\" : \"flex-row\",\n    className\n  );\n\n  const nagContentClasses = cn(\n    \"flex flex-col gap-2 max-w-xs\",\n    isRight ? \"text-right\" : \"text-left\"\n  );\n\n  return (\n    <div className={cn(VOWEL_UI_SCOPE_CLASS, containerClasses)}>\n      {/* Nag Message Content */}\n      <div className={nagContentClasses}>\n        <div className=\"flex items-center gap-2\">\n          <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center\">\n            <Mic className=\"w-4 h-4 text-white\" />\n          </div>\n          <h4 className=\"text-sm font-bold text-gray-900 dark:text-white\">\n            {nagTitle}\n          </h4>\n        </div>\n\n        <p className=\"text-xs text-gray-600 dark:text-gray-400 leading-relaxed\">\n          {nagDescription}\n        </p>\n\n        <div className=\"flex items-center gap-2 mt-1\">\n          <button\n            onClick={() => handleDismiss(false)}\n            className=\"flex-1 text-xs font-medium px-3 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white transition-colors\"\n          >\n            {nagButtonText}\n          </button>\n          <button\n            onClick={() => handleDismiss(false)}\n            className=\"flex-shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 transition-colors p-1\"\n            aria-label=\"Dismiss\"\n          >\n            <X className=\"w-4 h-4\" />\n          </button>\n        </div>\n      </div>\n\n      {/* Voice Agent Button */}\n      <div className=\"flex-shrink-0\">\n        {children}\n      </div>\n    </div>\n  );\n}\n","/**\n * @fileoverview TermsPrivacyModal Component - Terms and conditions acceptance modal\n * \n * This component displays a modal requiring users to accept terms of service and\n * privacy policy before using the voice agent. The acceptance state is persisted\n * to localStorage. The modal can be configured to show terms and/or privacy content\n * inline or as external links.\n * \n * Features:\n * - Optional terms and conditions requirement\n * - Customizable content (inline or links)\n * - LocalStorage persistence\n * - Blocks voice agent usage until accepted\n * - Smooth modal animations\n * - Mobile-responsive design\n * - Keyboard navigation (ESC to close if decline allowed)\n * \n * @module @vowel.to/client/components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { useState, useEffect } from \"react\";\nimport { X, Shield, FileText } from \"lucide-react\";\nimport { cn, VOWEL_UI_SCOPE_CLASS } from \"../utils\";\n\n/**\n * Props for TermsPrivacyModal\n */\nexport interface TermsPrivacyModalProps {\n  /** Whether to require terms acceptance */\n  enabled?: boolean;\n\n  /** Modal title */\n  title?: string;\n\n  /** Modal description/intro text */\n  description?: string;\n\n  /** Terms of service content (HTML or text) */\n  termsContent?: string;\n\n  /** URL to external terms of service */\n  termsUrl?: string;\n\n  /** Privacy policy content (HTML or text) */\n  privacyContent?: string;\n\n  /** URL to external privacy policy */\n  privacyUrl?: string;\n\n  /** Text for the accept button */\n  acceptButtonText?: string;\n\n  /** Text for the decline button (if allowed) */\n  declineButtonText?: string;\n\n  /** Whether to show a decline button */\n  allowDecline?: boolean;\n\n  /** LocalStorage key prefix for storing acceptance state */\n  storageKeyPrefix?: string;\n\n  /** Callback when terms are accepted */\n  onAccept?: () => void;\n\n  /** Callback when terms are declined */\n  onDecline?: () => void;\n\n  /** Whether the voice agent is trying to connect (triggers modal if not accepted) */\n  isAttemptingConnection?: boolean;\n\n  /** Function to block connection (called when terms not accepted) */\n  blockConnection?: () => void;\n}\n\n/**\n * Default modal content\n */\nconst DEFAULT_TITLE = \"Terms & Privacy\";\nconst DEFAULT_DESCRIPTION = \"Before using the voice assistant, please review and accept our terms of service and privacy policy.\";\nconst DEFAULT_ACCEPT_BUTTON = \"Accept & Continue\";\nconst DEFAULT_DECLINE_BUTTON = \"Decline\";\nconst DEFAULT_STORAGE_KEY_PREFIX = \"vowel-terms-privacy\";\n\n/**\n * TermsPrivacyModal Component\n * \n * Displays a modal requiring users to accept terms and privacy policy before\n * using the voice agent. Acceptance is persisted to localStorage.\n * \n * @example\n * ```tsx\n * <TermsPrivacyModal\n *   enabled={true}\n *   termsUrl=\"https://example.com/terms\"\n *   privacyUrl=\"https://example.com/privacy\"\n *   isAttemptingConnection={state.isConnecting}\n *   onAccept={() => console.log('Terms accepted')}\n * />\n * ```\n */\nexport function TermsPrivacyModal({\n  enabled = false,\n  title = DEFAULT_TITLE,\n  description = DEFAULT_DESCRIPTION,\n  termsContent,\n  termsUrl,\n  privacyContent,\n  privacyUrl,\n  acceptButtonText = DEFAULT_ACCEPT_BUTTON,\n  declineButtonText = DEFAULT_DECLINE_BUTTON,\n  allowDecline = false,\n  storageKeyPrefix = DEFAULT_STORAGE_KEY_PREFIX,\n  onAccept,\n  onDecline,\n  isAttemptingConnection = false,\n  blockConnection,\n}: TermsPrivacyModalProps) {\n  const [isOpen, setIsOpen] = useState(false);\n  const [hasAccepted, setHasAccepted] = useState(false);\n  const [activeTab, setActiveTab] = useState<\"terms\" | \"privacy\">(\"terms\");\n\n  const acceptedKey = `${storageKeyPrefix}-accepted`;\n  const acceptedTimestampKey = `${storageKeyPrefix}-timestamp`;\n\n  // Initialize acceptance state from localStorage\n  useEffect(() => {\n    if (!enabled) {\n      setHasAccepted(true); // If disabled, consider as accepted\n      return;\n    }\n\n    try {\n      const isAccepted = localStorage.getItem(acceptedKey) === \"true\";\n      setHasAccepted(isAccepted);\n      \n      if (isAccepted) {\n        const timestamp = localStorage.getItem(acceptedTimestampKey);\n        console.log(`[TermsPrivacyModal] Terms previously accepted at ${timestamp || 'unknown time'}`);\n      }\n    } catch (error) {\n      console.error(\"[TermsPrivacyModal] Error reading localStorage:\", error);\n      setHasAccepted(false);\n    }\n  }, [enabled, acceptedKey, acceptedTimestampKey]);\n\n  // Show modal if attempting connection and terms not accepted\n  useEffect(() => {\n    if (enabled && isAttemptingConnection && !hasAccepted) {\n      console.log(\"[TermsPrivacyModal] Connection attempted but terms not accepted - showing modal\");\n      setIsOpen(true);\n      blockConnection?.();\n    }\n  }, [enabled, isAttemptingConnection, hasAccepted, blockConnection]);\n\n  // Handle escape key\n  useEffect(() => {\n    if (!isOpen || !allowDecline) return;\n\n    const handleEscape = (event: KeyboardEvent) => {\n      if (event.key === \"Escape\") {\n        handleDecline();\n      }\n    };\n\n    window.addEventListener(\"keydown\", handleEscape);\n    return () => window.removeEventListener(\"keydown\", handleEscape);\n  }, [isOpen, allowDecline]);\n\n  /**\n   * Handle terms acceptance\n   */\n  const handleAccept = () => {\n    try {\n      const timestamp = new Date().toISOString();\n      localStorage.setItem(acceptedKey, \"true\");\n      localStorage.setItem(acceptedTimestampKey, timestamp);\n      \n      setHasAccepted(true);\n      setIsOpen(false);\n      \n      console.log(`[TermsPrivacyModal] Terms accepted at ${timestamp}`);\n      onAccept?.();\n    } catch (error) {\n      console.error(\"[TermsPrivacyModal] Error writing to localStorage:\", error);\n    }\n  };\n\n  /**\n   * Handle terms decline\n   */\n  const handleDecline = () => {\n    setIsOpen(false);\n    console.log(\"[TermsPrivacyModal] Terms declined\");\n    onDecline?.();\n  };\n\n  // Don't render if disabled or already accepted\n  if (!enabled || (hasAccepted && !isOpen)) {\n    return null;\n  }\n\n  // Don't render if not open\n  if (!isOpen) {\n    return null;\n  }\n\n  return (\n    <>\n      {/* Backdrop */}\n      <div\n        className={cn(VOWEL_UI_SCOPE_CLASS, \"fixed inset-0 bg-black/50 backdrop-blur-sm z-[9998] animate-in fade-in duration-300\")}\n        onClick={allowDecline ? handleDecline : undefined}\n      />\n\n      {/* Modal */}\n      <div className={cn(VOWEL_UI_SCOPE_CLASS, \"fixed inset-0 z-[9999] flex items-center justify-center p-4 pointer-events-none\")}>\n        <div\n          className=\"bg-white dark:bg-gray-900 rounded-2xl shadow-2xl max-w-2xl w-full max-h-[90vh] flex flex-col pointer-events-auto animate-in zoom-in-95 slide-in-from-bottom-4 duration-300 relative\"\n          onClick={(e) => e.stopPropagation()}\n        >\n          {/* Close button in top right corner */}\n          {allowDecline && (\n            <button\n              onClick={handleDecline}\n              className={cn(\n                \"absolute top-4 right-4 z-10\",\n                \"p-2 rounded-md\",\n                \"text-gray-500 dark:text-gray-400\",\n                \"hover:bg-gray-100 dark:hover:bg-gray-800\",\n                \"hover:text-gray-900 dark:hover:text-gray-100\",\n                \"transition-colors\",\n                \"flex items-center justify-center\"\n              )}\n              aria-label=\"Close\"\n            >\n              <X className=\"w-5 h-5\" />\n            </button>\n          )}\n\n          {/* Content wrapper */}\n          <div className=\"flex-1 overflow-y-auto p-6\">\n            {/* Title and description */}\n            <div className=\"flex items-start gap-3 mb-6\">\n              <div className=\"flex-shrink-0 w-10 h-10 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center\">\n                <Shield className=\"w-5 h-5 text-white\" />\n              </div>\n              <div className=\"flex-1\">\n                <h2 className=\"text-xl font-bold text-gray-900 dark:text-white\">\n                  {title}\n                </h2>\n                {description && (\n                  <p className=\"text-sm text-gray-600 dark:text-gray-400 mt-1\">\n                    {description}\n                  </p>\n                )}\n              </div>\n            </div>\n\n            {/* Tabs (if both terms and privacy are provided) */}\n            {(termsContent || termsUrl) && (privacyContent || privacyUrl) && (\n              <div className=\"flex border-b border-gray-200 dark:border-gray-700 -mx-6 px-6 mb-6\">\n              <button\n                onClick={() => setActiveTab(\"terms\")}\n                className={cn(\n                  \"flex items-center gap-2 px-4 py-3 text-sm font-medium border-b-2 transition-colors\",\n                  activeTab === \"terms\"\n                    ? \"border-blue-600 text-blue-600 dark:text-blue-400\"\n                    : \"border-transparent text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200\"\n                )}\n              >\n                <FileText className=\"w-4 h-4\" />\n                Terms of Service\n              </button>\n              <button\n                onClick={() => setActiveTab(\"privacy\")}\n                className={cn(\n                  \"flex items-center gap-2 px-4 py-3 text-sm font-medium border-b-2 transition-colors\",\n                  activeTab === \"privacy\"\n                    ? \"border-blue-600 text-blue-600 dark:text-blue-400\"\n                    : \"border-transparent text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200\"\n                )}\n              >\n                <Shield className=\"w-4 h-4\" />\n                Privacy Policy\n              </button>\n            </div>\n            )}\n\n            {/* Content */}\n            <div>\n            {activeTab === \"terms\" && (termsContent || termsUrl) && (\n              <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n                {termsContent ? (\n                  <div dangerouslySetInnerHTML={{ __html: termsContent }} />\n                ) : termsUrl ? (\n                  <div className=\"text-center py-8\">\n                    <a\n                      href={termsUrl}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"inline-flex items-center gap-2 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 font-medium\"\n                    >\n                      <FileText className=\"w-4 h-4\" />\n                      View Terms of Service\n                      <span className=\"text-xs\">(opens in new tab)</span>\n                    </a>\n                  </div>\n                ) : null}\n              </div>\n            )}\n\n            {activeTab === \"privacy\" && (privacyContent || privacyUrl) && (\n              <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n                {privacyContent ? (\n                  <div dangerouslySetInnerHTML={{ __html: privacyContent }} />\n                ) : privacyUrl ? (\n                  <div className=\"text-center py-8\">\n                    <a\n                      href={privacyUrl}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"inline-flex items-center gap-2 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 font-medium\"\n                    >\n                      <Shield className=\"w-4 h-4\" />\n                      View Privacy Policy\n                      <span className=\"text-xs\">(opens in new tab)</span>\n                    </a>\n                  </div>\n                ) : null}\n              </div>\n            )}\n\n            {/* If only terms or only privacy, show it without tabs */}\n            {!(termsContent || termsUrl) && (privacyContent || privacyUrl) && (\n              <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n                {privacyContent ? (\n                  <div dangerouslySetInnerHTML={{ __html: privacyContent }} />\n                ) : privacyUrl ? (\n                  <div className=\"text-center py-8\">\n                    <a\n                      href={privacyUrl}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"inline-flex items-center gap-2 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 font-medium\"\n                    >\n                      <Shield className=\"w-4 h-4\" />\n                      View Privacy Policy\n                      <span className=\"text-xs\">(opens in new tab)</span>\n                    </a>\n                  </div>\n                ) : null}\n              </div>\n            )}\n\n            {(termsContent || termsUrl) && !(privacyContent || privacyUrl) && activeTab === \"terms\" && (\n              <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n                {termsContent ? (\n                  <div dangerouslySetInnerHTML={{ __html: termsContent }} />\n                ) : termsUrl ? (\n                  <div className=\"text-center py-8\">\n                    <a\n                      href={termsUrl}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"inline-flex items-center gap-2 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 font-medium\"\n                    >\n                      <FileText className=\"w-4 h-4\" />\n                      View Terms of Service\n                      <span className=\"text-xs\">(opens in new tab)</span>\n                    </a>\n                  </div>\n                ) : null}\n              </div>\n            )}\n            </div>\n          </div>\n\n          {/* Footer with action buttons */}\n          <div className=\"flex items-center justify-end gap-3 p-6 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50\">\n            {allowDecline && (\n              <button\n                onClick={handleDecline}\n                className=\"px-5 py-2.5 text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n              >\n                {declineButtonText}\n              </button>\n            )}\n            <button\n              onClick={handleAccept}\n              className=\"px-5 py-2.5 text-sm font-medium text-white bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 rounded-lg shadow-lg hover:shadow-xl transition-all\"\n            >\n              {acceptButtonText}\n            </button>\n          </div>\n        </div>\n      </div>\n    </>\n  );\n}\n","/**\n * @fileoverview Floating Cursor Renderer - Renders the floating cursor in React\n * \n * This component reads from FloatingCursorContext and renders the cursor.\n * It can be:\n * - Automatically included in VowelAgent (default)\n * - Rendered separately for custom placement\n * \n * @module @vowel.to/client/components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { FloatingCursorComponent } from './FloatingCursorComponent';\nimport { useFloatingCursorOptional } from './FloatingCursorProvider';\n\n/**\n * Props for FloatingCursorRenderer\n */\nexport interface FloatingCursorRendererProps {\n  /** \n   * Optional class name for custom styling \n   * Note: Cursor is fixed positioned, so this may not have much effect\n   */\n  className?: string;\n}\n\n/**\n * Floating Cursor Renderer\n * \n * Renders the floating cursor based on context state.\n * Safe to render multiple times - will only render if cursor is enabled and has state.\n * \n * This component is automatically included in VowelAgent by default.\n * You only need to use this directly if:\n * - You disabled cursor in VowelAgent (enableFloatingCursor={false})\n * - You want custom cursor placement\n * - You're not using VowelAgent at all\n * \n * @example Default (automatic - no need to use this)\n * ```tsx\n * <VowelProvider client={client}>\n *   <VowelAgent />\n * </VowelProvider>\n * ```\n * \n * @example Custom placement\n * ```tsx\n * <VowelProvider client={client}>\n *   <VowelAgent enableFloatingCursor={false} />\n *   <FloatingCursorRenderer />\n * </VowelProvider>\n * ```\n * \n * @example Without VowelAgent\n * ```tsx\n * <VowelProvider client={client}>\n *   <MyCustomUI />\n *   <FloatingCursorRenderer />\n * </VowelProvider>\n * ```\n */\nexport function FloatingCursorRenderer({}: FloatingCursorRendererProps = {}) {\n  const context = useFloatingCursorOptional();\n\n  // No context = no floating cursor provider = don't render\n  if (!context) {\n    return null;\n  }\n\n  // Not enabled = don't render\n  if (!context.isEnabled) {\n    return null;\n  }\n\n  // No cursor state = don't render (cursor is hidden)\n  if (!context.cursorState) {\n    return null;\n  }\n\n  return (\n    <FloatingCursorComponent\n      x={context.cursorState.x}\n      y={context.cursorState.y}\n      text={context.cursorState.text}\n      isIdle={context.cursorState.isIdle}\n      visible={true}\n      cursorColor={context.config.appearance?.cursorColor}\n      cursorSize={context.config.appearance?.cursorSize}\n      badgeBackground={context.config.appearance?.badgeBackground}\n      badgeTextColor={context.config.appearance?.badgeTextColor}\n      enableTyping={context.config.animation?.enableTyping}\n      typingSpeed={context.config.animation?.typingSpeed}\n      enableBounce={context.config.animation?.enableBounce}\n      transitionDuration={context.config.animation?.transitionDuration}\n      zIndex={context.config.behavior?.zIndex}\n    />\n  );\n}\n\n\n","/**\n * @fileoverview Caption Manager Hook - Manages caption state and transcript events\n * \n * This hook manages the caption system state, accumulating transcript deltas\n * and handling caption lifecycle (streaming, finalization, dismissal).\n * \n * @internal\n * Unofficial dev tool for testing speech transcription\n * \n * @module @vowel.to/client/components/hooks\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { useVowel } from '../VowelProviderSimple';\n\n/**\n * Caption state\n */\nexport interface CaptionState {\n  /** Current caption text */\n  text: string;\n  /** Role: user or assistant */\n  role: 'user' | 'assistant';\n  /** Whether caption is currently visible */\n  isVisible: boolean;\n  /** Timestamp when caption was created */\n  timestamp: Date;\n  /** Whether caption is being streamed (deltas arriving) */\n  isStreaming: boolean;\n}\n\n/**\n * Streaming state for accumulating deltas\n */\ninterface StreamingState {\n  /** Current response ID being streamed */\n  responseId: string | null;\n  /** Accumulated text from deltas */\n  text: string;\n  /** Role of the streaming caption */\n  role: 'user' | 'assistant';\n}\n\n/**\n * Accumulate delta text for streaming captions\n * \n * OpenAI Agents.js SDK sends incremental text deltas. We concatenate them with spaces\n * to ensure proper word separation. The responseId change triggers a reset for new responses.\n * \n * @param currentText - Currently accumulated text\n * @param deltaText - New incremental delta\n * @returns Accumulated text with space separator\n */\nfunction accumulateDelta(currentText: string, deltaText: string): string {\n  if (!deltaText) return currentText;\n  if (!currentText) return deltaText;\n  \n  // Add space between deltas to ensure proper word separation\n  // OpenAI Realtime API may send deltas without spaces between words\n  // Only add space if currentText doesn't already end with one\n  const needsSpace = !currentText.endsWith(' ') && !deltaText.startsWith(' ');\n  return currentText + (needsSpace ? ' ' : '') + deltaText;\n}\n\n/**\n * Hook to manage caption state and transcript events\n * \n * @returns Caption state and dismissal function\n */\nexport function useCaptionManager() {\n  const { client } = useVowel();\n  const [caption, setCaption] = useState<CaptionState | null>(null);\n  const streamingStateRef = useRef<StreamingState>({\n    responseId: null,\n    text: '',\n    role: 'assistant',\n  });\n  \n  // Get caption config to check if streaming is enabled\n  const captionConfig = client?.getConfig()._caption;\n  const showStreaming = captionConfig?.showStreaming ?? true; // Default: true\n  const showDeltaSumOnly = captionConfig?._showDeltaSumOnly ?? false; // Default: false\n\n  /**\n   * Show a new caption\n   */\n  const showCaption = useCallback((text: string, role: 'user' | 'assistant', isStreaming: boolean = false) => {\n    if (!text.trim()) return;\n\n    setCaption({\n      text: text.trim(),\n      role,\n      isVisible: true,\n      timestamp: new Date(),\n      isStreaming,\n    });\n  }, []);\n\n  /**\n   * Dismiss current caption\n   */\n  const dismissCaption = useCallback(() => {\n    setCaption(prev => prev ? { ...prev, isVisible: false } : null);\n    // Clear after animation\n    setTimeout(() => {\n      setCaption(null);\n      streamingStateRef.current = {\n        responseId: null,\n        text: '',\n        role: 'assistant',\n      };\n    }, 300);\n  }, []);\n\n  /**\n   * Handle transcript events from the client\n   * Shows streaming captions if enabled, otherwise only complete transcripts\n   */\n  useEffect(() => {\n    if (!client) return;\n\n    // Subscribe to transcript events\n    const unsubscribe = client.onTranscriptEvent((event) => {\n      if (event.type === 'delta' && showStreaming) {\n        // Streaming caption - accumulate deltas\n        const currentState = streamingStateRef.current;\n        \n        // Check if this is a reset signal (empty text with responseId)\n        const isReset = !event.text && event.responseId;\n        \n        // Check if this is a new response (different responseId or reset signal)\n        const isNewResponse = event.responseId && \n          (event.responseId !== currentState.responseId || isReset);\n        \n        if (isNewResponse) {\n          // New response starting - reset accumulation\n          streamingStateRef.current = {\n            responseId: event.responseId || null,\n            text: event.text || '', // Start fresh\n            role: event.role,\n          };\n        } else if (event.text) {\n          // Accumulate delta with deduplication\n          const accumulatedText = accumulateDelta(currentState.text, event.text);\n          \n          streamingStateRef.current = {\n            ...currentState,\n            text: accumulatedText,\n          };\n        }\n        \n        // Show streaming caption (only if we have text)\n        if (streamingStateRef.current.text) {\n          showCaption(streamingStateRef.current.text, event.role, true);\n        }\n      } else if (event.type === 'done') {\n        // Complete caption\n        if (showDeltaSumOnly) {\n          // Debug mode: Show accumulated delta sum instead of final text\n          const accumulatedText = streamingStateRef.current.text;\n          if (accumulatedText) {\n            showCaption(accumulatedText, event.role, false);\n          }\n        } else {\n          // Normal mode: Show final text from \"done\" event\n          if (event.text) {\n            showCaption(event.text, event.role, false);\n          }\n        }\n        \n        // Clear streaming state\n        streamingStateRef.current = {\n          responseId: null,\n          text: '',\n          role: 'assistant',\n        };\n      }\n      // If showStreaming is false, ignore 'delta' events\n    });\n\n    return () => {\n      unsubscribe();\n    };\n  }, [client, showCaption, showStreaming]);\n\n  return {\n    caption,\n    dismissCaption,\n    showCaption,\n  };\n}\n","/**\n * @fileoverview VowelCaption Component - Real-time speech captions\n * \n * This component displays real-time speech captions as floating toast notifications.\n * Shows both user and AI speech transcripts (complete transcripts only, no streaming).\n * \n * @internal\n * Unofficial dev tool for testing speech transcription\n * \n * @module @vowel.to/client/components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { useEffect, useState } from 'react';\nimport { MessageCircle, Sparkles } from 'lucide-react';\nimport { useCaptionManager } from './hooks/useCaptionManager';\nimport { useVowel } from './VowelProviderSimple';\nimport { cn, VOWEL_UI_SCOPE_CLASS } from '../utils';\nimport { isMobile } from '../utils/device-detection';\n\n/**\n * Props for VowelCaption component\n */\nexport interface VowelCaptionProps {\n  /** Position of caption */\n  position?: 'top-center' | 'bottom-center';\n  /** Maximum width of caption */\n  maxWidth?: string;\n  /** Show role indicator (User/Assistant) - deprecated, kept for API compatibility */\n  showRole?: boolean;\n  /** Custom className */\n  className?: string;\n}\n\n/**\n * VowelCaption Component\n * \n * Displays real-time speech captions as floating toast notifications.\n * Shows complete transcripts only (no streaming accumulation).\n * Integrated into VowelAgent component.\n * \n * @internal\n * Unofficial dev tool - prefixed with underscore in config\n */\nexport function VowelCaption({\n  position = 'top-center',\n  maxWidth = '600px',\n  showRole: _showRole = true, // Kept for API compatibility but not used\n  className,\n}: VowelCaptionProps) {\n  const { caption, dismissCaption } = useCaptionManager();\n  const { state, client } = useVowel();\n  const [isVisible, setIsVisible] = useState(false);\n  const [isMobileDevice, setIsMobileDevice] = useState(false);\n\n  // Check if device is mobile\n  useEffect(() => {\n    setIsMobileDevice(isMobile());\n    \n    // Listen for resize events to update mobile detection\n    const handleResize = () => {\n      setIsMobileDevice(isMobile());\n    };\n    \n    window.addEventListener('resize', handleResize);\n    return () => window.removeEventListener('resize', handleResize);\n  }, []);\n\n  // Check if captions should be shown on mobile\n  const captionConfig = client?.getConfig()._caption;\n  const showOnMobile = captionConfig?.showOnMobile ?? false;\n  \n  // Hide on mobile if not enabled\n  const shouldShow = !isMobileDevice || showOnMobile;\n\n  // Handle visibility animation\n  useEffect(() => {\n    if (caption?.isVisible) {\n      setIsVisible(true);\n    } else {\n      // Delay hiding for animation\n      const timer = setTimeout(() => setIsVisible(false), 300);\n      return () => clearTimeout(timer);\n    }\n  }, [caption?.isVisible]);\n\n  // Dismiss captions when agent disconnects\n  useEffect(() => {\n    if (!state.isConnected && caption?.isVisible) {\n      dismissCaption();\n    }\n  }, [state.isConnected, caption?.isVisible, dismissCaption]);\n\n  if (!caption || !isVisible || !shouldShow) {\n    return null;\n  }\n\n  const positionClasses = {\n    'top-center': 'top-4 left-1/2 -translate-x-1/2',\n    'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n  };\n\n  return (\n    <div\n      className={cn(\n        VOWEL_UI_SCOPE_CLASS,\n        'fixed z-[100] px-4 py-3 rounded-md shadow-2xl backdrop-blur-xl border',\n        'transition-all duration-300 ease-in-out',\n        'cursor-pointer hover:scale-[1.02] active:scale-[0.98]',\n        // Dark mode colors - consistent for both user and assistant\n        'bg-gray-900/95 text-gray-100 border-gray-700/50',\n        'dark:bg-gray-800/95 dark:text-gray-100 dark:border-gray-600/50',\n        positionClasses[position],\n        className\n      )}\n      style={{ maxWidth }}\n      onClick={dismissCaption}\n      role=\"status\"\n      aria-live=\"polite\"\n      aria-atomic=\"true\"\n    >\n      <div className=\"flex items-start gap-3\">\n        {/* Icon indicator */}\n        <div className=\"flex-shrink-0 mt-0.5 relative\">\n          {caption.role === 'user' ? (\n            <MessageCircle className=\"w-4 h-4 text-gray-400\" />\n          ) : (\n            <Sparkles className=\"w-4 h-4 text-gray-400\" />\n          )}\n          {/* Streaming indicator */}\n          {caption.isStreaming && (\n            <span className=\"absolute -top-1 -right-1 w-2 h-2 bg-gray-400 rounded-full animate-pulse\" />\n          )}\n        </div>\n        {/* Caption text */}\n        <div className=\"flex-1 text-sm leading-relaxed break-words\">\n          {caption.text}\n        </div>\n      </div>\n    </div>\n  );\n}\n","/**\n * @fileoverview Error Modal Component - Displays errors with friendly messages and debug details\n * \n * This component provides a user-friendly error modal that appears when the vowel client\n * encounters an error. It shows a simple error message with an expandable debug section\n * for technical details.\n * \n * @module @vowel.to/client/components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { useState } from \"react\";\nimport { AlertCircle, Bug, ChevronDown, ChevronUp } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\n\n/**\n * Props for ErrorModal component\n */\nexport interface ErrorModalProps {\n  /** Whether the modal is open */\n  isOpen: boolean;\n  \n  /** Close handler */\n  onClose: () => void;\n  \n  /** Error message to display */\n  errorMessage: string;\n  \n  /** Optional error details (object or string) */\n  errorDetails?: string | object;\n  \n  /** Optional timestamp */\n  timestamp?: Date;\n}\n\n/**\n * Error Modal Component\n * \n * Displays a friendly error message with an expandable debug section.\n * \n * @example\n * ```tsx\n * <ErrorModal\n *   isOpen={hasError}\n *   onClose={() => setHasError(false)}\n *   errorMessage=\"Connection failed\"\n *   errorDetails={{ code: \"ECONNREFUSED\", stack: \"...\" }}\n * />\n * ```\n */\nexport function ErrorModal({\n  isOpen,\n  onClose,\n  errorMessage,\n  errorDetails,\n  timestamp,\n}: ErrorModalProps) {\n  const [showDebug, setShowDebug] = useState(false);\n\n  // Format error details for display\n  const formatErrorDetails = (): string => {\n    if (!errorDetails) return \"\";\n    \n    if (typeof errorDetails === \"string\") {\n      return errorDetails;\n    }\n    \n    try {\n      return JSON.stringify(errorDetails, null, 2);\n    } catch {\n      return String(errorDetails);\n    }\n  };\n\n  const formattedDetails = formatErrorDetails();\n  const hasDetails = formattedDetails.length > 0;\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      onClose={onClose}\n      showCloseButton={true}\n    >\n      <div className=\"space-y-4\">\n        {/* Header with Vowel branding */}\n        <div className=\"flex items-center gap-2 mb-2\">\n          <span \n            className=\"text-xl font-normal tracking-tight leading-none text-gray-900 dark:text-gray-100\"\n            style={{ fontFamily: 'OCR-A, monospace' }}\n          >\n            vowel\n          </span>\n        </div>\n\n        {/* Error Icon and Message */}\n        <div className=\"flex items-start gap-4\">\n          <div className=\"flex-shrink-0\">\n            <div className=\"flex items-center justify-center w-12 h-12 rounded-full bg-red-50 dark:bg-red-900/20 border-2 border-red-200 dark:border-red-800\">\n              <AlertCircle className=\"w-6 h-6 text-red-600 dark:text-red-400\" />\n            </div>\n          </div>\n          <div className=\"flex-1 min-w-0\">\n            <h3 className=\"text-lg font-semibold text-gray-900 dark:text-gray-100 mb-2\">\n              The agent encountered an error\n            </h3>\n            <p className=\"text-sm text-gray-700 dark:text-gray-300 leading-relaxed font-medium\">\n              {errorMessage}\n            </p>\n            {timestamp && (\n              <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-2\">\n                {timestamp.toLocaleTimeString()}\n              </p>\n            )}\n          </div>\n        </div>\n\n        {/* Debug Section */}\n        {hasDetails && (\n          <div className=\"border-t border-gray-200 dark:border-gray-700 pt-4\">\n            <button\n              onClick={() => setShowDebug(!showDebug)}\n              className=\"flex items-center gap-2 w-full text-left text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 transition-colors\"\n            >\n              <Bug className=\"w-4 h-4 text-gray-600 dark:text-gray-400\" />\n              <span>Debug Details</span>\n              {showDebug ? (\n                <ChevronUp className=\"w-4 h-4 ml-auto text-gray-600 dark:text-gray-400\" />\n              ) : (\n                <ChevronDown className=\"w-4 h-4 ml-auto text-gray-600 dark:text-gray-400\" />\n              )}\n            </button>\n            \n            {showDebug && (\n              <div className=\"mt-3 p-4 bg-gray-50 dark:bg-gray-800/50 rounded-lg border border-gray-200 dark:border-gray-700\">\n                <pre className=\"text-xs text-gray-800 dark:text-gray-200 font-mono overflow-x-auto whitespace-pre-wrap break-words leading-relaxed\">\n                  {formattedDetails}\n                </pre>\n              </div>\n            )}\n          </div>\n        )}\n\n        {/* Action Button */}\n        <div className=\"flex justify-end pt-2\">\n          <button\n            onClick={onClose}\n            className=\"px-4 py-2 text-sm font-medium text-white dark:text-gray-900 bg-gray-900 dark:bg-gray-100 rounded-lg hover:bg-gray-800 dark:hover:bg-gray-200 transition-colors\"\n          >\n            Dismiss\n          </button>\n        </div>\n      </div>\n    </Modal>\n  );\n}\n","/**\n * Shared types for Vowel components\n */\n\n/**\n * Position for floating VowelAgent\n */\nexport type VowelPosition = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n\nexport const positionClasses: Record<VowelPosition, string> = {\n  \"bottom-right\": \"bottom-6 right-6\",\n  \"bottom-left\": \"bottom-6 left-6\",\n  \"top-right\": \"top-6 right-6\",\n  \"top-left\": \"top-6 left-6\",\n};\n","/**\n * @fileoverview VowelAgent Component - Floating voice agent UI button\n * \n * This file contains the `VowelAgent` React component which provides a floating\n * voice agent button that can be positioned anywhere on the screen. It includes\n * visual feedback for connection states, speaking states, and an optional\n * transcript panel for viewing conversation history.\n * \n * Features:\n * - Floating button with customizable position\n * - Visual states: idle, connecting, active, speaking\n * - Optional transcript panel\n * - Smooth animations and transitions\n * - Accessible keyboard navigation\n * - Customizable styling\n * \n * @module @vowel.to/client/components\n * @author vowel.to\n * @license Proprietary\n */\n\nimport { useState, useRef, useEffect } from \"react\";\nimport { X } from \"lucide-react\";\nimport { useVowel } from \"./VowelProviderSimple\";\nimport { FloatingMicButton } from \"./FloatingMicButton\";\nimport { VoiceNagWrapper, type VoiceNagWrapperProps } from \"./VoiceNagWrapper\";\nimport { TermsPrivacyModal, type TermsPrivacyModalProps } from \"./TermsPrivacyModal\";\nimport { FloatingCursorRenderer } from \"./FloatingCursorRenderer\";\nimport { VowelCaption } from \"./VowelCaption\";\nimport { ErrorModal } from \"./ErrorModal\";\nimport { cn, VOWEL_UI_SCOPE_CLASS } from \"../utils\";\nimport type { VowelPosition } from \"./types\";\nimport { positionClasses } from \"./types\";\nimport \"../styles/styles.css\";\n\n/**\n * Props for VowelAgent\n */\nexport interface VowelAgentProps {\n  /** Position of the floating button */\n  position?: VowelPosition;\n\n  /** Custom className */\n  className?: string;\n\n  /** Show transcript panel */\n  showTranscripts?: boolean;\n\n  /** Custom button color */\n  buttonColor?: string;\n\n  // Voice Nag Options\n  /** Enable the voice nag wrapper */\n  enableNag?: boolean;\n\n  /** Custom title for the nag message */\n  nagTitle?: VoiceNagWrapperProps[\"nagTitle\"];\n\n  /** Custom description for the nag message */\n  nagDescription?: VoiceNagWrapperProps[\"nagDescription\"];\n\n  /** Custom acknowledge button text for nag */\n  nagButtonText?: VoiceNagWrapperProps[\"nagButtonText\"];\n\n  /** LocalStorage key prefix for nag state */\n  nagStorageKeyPrefix?: VoiceNagWrapperProps[\"storageKeyPrefix\"];\n\n  /** Callback when nag is dismissed */\n  onNagDismiss?: VoiceNagWrapperProps[\"onDismiss\"];\n\n  // Terms & Privacy Modal Options\n  /** Enable the terms and privacy modal */\n  enableTermsModal?: boolean;\n\n  /** Modal title for terms/privacy */\n  termsModalTitle?: TermsPrivacyModalProps[\"title\"];\n\n  /** Modal description for terms/privacy */\n  termsModalDescription?: TermsPrivacyModalProps[\"description\"];\n\n  /** Terms of service content (HTML or text) */\n  termsContent?: TermsPrivacyModalProps[\"termsContent\"];\n\n  /** URL to external terms of service */\n  termsUrl?: TermsPrivacyModalProps[\"termsUrl\"];\n\n  /** Privacy policy content (HTML or text) */\n  privacyContent?: TermsPrivacyModalProps[\"privacyContent\"];\n\n  /** URL to external privacy policy */\n  privacyUrl?: TermsPrivacyModalProps[\"privacyUrl\"];\n\n  /** Text for the accept button in modal */\n  termsAcceptButtonText?: TermsPrivacyModalProps[\"acceptButtonText\"];\n\n  /** Text for the decline button in modal */\n  termsDeclineButtonText?: TermsPrivacyModalProps[\"declineButtonText\"];\n\n  /** Whether to show a decline button in modal */\n  termsAllowDecline?: TermsPrivacyModalProps[\"allowDecline\"];\n\n  /** LocalStorage key prefix for terms acceptance state */\n  termsStorageKeyPrefix?: TermsPrivacyModalProps[\"storageKeyPrefix\"];\n\n  /** Callback when terms are accepted */\n  onTermsAccept?: TermsPrivacyModalProps[\"onAccept\"];\n\n  /** Callback when terms are declined */\n  onTermsDecline?: TermsPrivacyModalProps[\"onDecline\"];\n\n  /**\n   * Whether to render the floating cursor\n   * Only applies when VowelProvider has floatingCursor enabled\n   * \n   * @default true\n   * \n   * Set to false if you want to render the cursor separately:\n   * @example\n   * ```tsx\n   * <VowelProvider client={client}>\n   *   <VowelAgent enableFloatingCursor={false} />\n   *   <FloatingCursorRenderer />\n   * </VowelProvider>\n   * ```\n   */\n  enableFloatingCursor?: boolean;\n}\n\n/**\n * Floating voice agent button with optional transcript panel\n * Positioned in a corner of the screen\n *\n * @example\n * ```tsx\n * import { VowelAgent } from '@/lib/vowel';\n *\n * function App() {\n *   return (\n *     <>\n *       <YourApp />\n *       <VowelAgent\n *         position=\"bottom-right\"\n *         showTranscripts={true}\n *       />\n *     </>\n *   );\n * }\n * ```\n */\nexport function VowelAgent({\n  position = \"bottom-right\",\n  className,\n  showTranscripts = false,\n  // Nag props\n  enableNag = false,\n  nagTitle,\n  nagDescription,\n  nagButtonText,\n  nagStorageKeyPrefix,\n  onNagDismiss,\n  // Terms modal props\n  enableTermsModal = false,\n  termsModalTitle,\n  termsModalDescription,\n  termsContent,\n  termsUrl,\n  privacyContent,\n  privacyUrl,\n  termsAcceptButtonText,\n  termsDeclineButtonText,\n  termsAllowDecline,\n  termsStorageKeyPrefix,\n  onTermsAccept,\n  onTermsDecline,\n  // Floating cursor prop\n  enableFloatingCursor = true,\n}: VowelAgentProps) {\n  const { state, toggleSession, clearTranscripts, client } = useVowel();\n  const [showPanel, setShowPanel] = useState(false);\n  const [isAttemptingConnection, setIsAttemptingConnection] = useState(false);\n  const [showErrorModal, setShowErrorModal] = useState(false);\n  const connectionBlockedRef = useRef(false);\n\n  // Track error state and show modal when error occurs\n  useEffect(() => {\n    if (state.error && !showErrorModal) {\n      setShowErrorModal(true);\n    }\n  }, [state.error, showErrorModal]);\n\n  // Handle error modal close - clear error from client state\n  const handleErrorModalClose = () => {\n    setShowErrorModal(false);\n    if (client && state.error) {\n      client.clearError();\n    }\n  };\n\n  // Don't render if client is not available yet\n  if (!client) {\n    return null;\n  }\n\n  // SYNCHRONOUS click handler - Opens content window for Shopify\n  const handleToggleSession = () => {\n    console.log(\"[VowelAgent] handleToggleSession fired\", {\n      isConnecting: state.isConnecting,\n      isConnected: state.isConnected,\n      hasError: !!state.error,\n      termsModalEnabled: enableTermsModal,\n    });\n\n    // If there's an error, clear it and allow reconnection\n    if (state.error) {\n      console.log(\"[VowelAgent] Error state detected, clearing error and attempting reconnection\");\n      if (client) {\n        client.clearError();\n      }\n      // Continue to connection logic below\n    }\n\n    // Always allow disconnection, regardless of state (connecting, AI speaking, etc.)\n    if (state.isConnected || state.isConnecting) {\n      console.log(\"[VowelAgent] Disconnecting session (allowed at any state)\");\n      proceedWithConnection(); // This will call toggleSession which handles disconnection\n      return;\n    }\n\n    // If terms modal is enabled and user is trying to connect, trigger the modal check\n    if (enableTermsModal && !state.isConnected) {\n      console.log(\"[VowelAgent] Terms modal enabled, checking acceptance...\");\n      setIsAttemptingConnection(true);\n      \n      // The TermsPrivacyModal will check localStorage and show itself if needed\n      // If terms haven't been accepted, connection will be blocked\n      // We'll reset the attempt flag after a short delay to allow the modal to show\n      setTimeout(() => {\n        if (connectionBlockedRef.current) {\n          console.log(\"[VowelAgent] Connection blocked by terms modal\");\n          setIsAttemptingConnection(false);\n          connectionBlockedRef.current = false;\n          return;\n        }\n        // If we get here, terms were already accepted, proceed with connection\n        proceedWithConnection();\n      }, 100);\n      return;\n    }\n\n    // No terms modal, proceed with connection\n    proceedWithConnection();\n  };\n\n  /**\n   * Proceed with the actual connection logic\n   */\n  const proceedWithConnection = () => {\n    // For Shopify: Open content window SYNCHRONOUSLY on user gesture\n    // WindowProxy may be null (popup blocked) but window still opens\n    // Navigation is handled via BroadcastChannel regardless\n    if (!state.isConnected && typeof window !== 'undefined') {\n      const needsContentWindow = (window as any).__vowelNeedsContentWindow === true;\n      \n      if (needsContentWindow) {\n        console.log(\"🚀 [VowelAgent] Opening controlled content window...\");\n        \n        // Add query parameter to mark this as a controlled tab\n        const currentUrl = new URL(window.location.href);\n        currentUrl.searchParams.set('vowel_controlled', 'true');\n        const controlledUrl = currentUrl.toString();\n        \n        console.log(\"   📍 URL:\", controlledUrl);\n        console.log(\"   🔖 Query param: vowel_controlled=true\");\n        \n        const contentWindow = window.open(controlledUrl, '_blank', 'noopener,noreferrer');\n        \n        if (contentWindow) {\n          // Set window name for additional identification\n          const windowName = `vowel-content-${Date.now()}`;\n          contentWindow.name = windowName;\n          console.log(\"✅ [VowelAgent] Content window opened successfully\");\n          console.log(\"   📛 Window name:\", windowName);\n          console.log(\"   🔗 URL with query param:\", controlledUrl);\n        } else {\n          console.warn(\"⚠️ [VowelAgent] WindowProxy blocked by popup blocker\");\n          console.log(\"   ℹ️  Window may still open in background\");\n          console.log(\"   ℹ️  Navigation will work via BroadcastChannel\");\n        }\n      }\n    }\n\n    // Call toggleSession (async is fine now, window already opened)\n    toggleSession().catch(error => {\n      console.error(\"[VowelAgent] toggleSession failed\", error);\n    });\n    \n    // Reset attempt flag\n    setIsAttemptingConnection(false);\n  };\n\n  /**\n   * Block connection when terms haven't been accepted\n   */\n  const handleBlockConnection = () => {\n    console.log(\"[VowelAgent] Connection blocked - terms not accepted\");\n    connectionBlockedRef.current = true;\n  };\n\n  /**\n   * Handle terms acceptance - proceed with connection\n   */\n  const handleTermsAccepted = () => {\n    console.log(\"[VowelAgent] Terms accepted - proceeding with connection\");\n    onTermsAccept?.();\n    \n    // Trigger connection after acceptance\n    setTimeout(() => {\n      proceedWithConnection();\n    }, 300);\n  };\n\n  // Calculate transcript panel position based on button position\n  const getTranscriptPosition = () => {\n    const isBottom = position.includes('bottom');\n    const isRight = position.includes('right');\n    \n    return cn(\n      \"absolute w-80 max-h-96 bg-white/95 dark:bg-gray-900/95 backdrop-blur-xl rounded-2xl shadow-2xl border border-gray-200/50 dark:border-gray-700/50 overflow-hidden\",\n      isBottom ? \"bottom-24\" : \"top-24\",\n      isRight ? \"right-0\" : \"left-0\"\n    );\n  };\n\n  return (\n    <>\n      {/* Error Modal */}\n      {state.error && (\n        <ErrorModal\n          isOpen={showErrorModal}\n          onClose={handleErrorModalClose}\n          errorMessage={state.error.message}\n          errorDetails={state.error.details}\n          timestamp={state.error.timestamp}\n        />\n      )}\n\n      {/* Terms & Privacy Modal */}\n      {enableTermsModal && (\n        <TermsPrivacyModal\n          enabled={enableTermsModal}\n          title={termsModalTitle}\n          description={termsModalDescription}\n          termsContent={termsContent}\n          termsUrl={termsUrl}\n          privacyContent={privacyContent}\n          privacyUrl={privacyUrl}\n          acceptButtonText={termsAcceptButtonText}\n          declineButtonText={termsDeclineButtonText}\n          allowDecline={termsAllowDecline}\n          storageKeyPrefix={termsStorageKeyPrefix}\n          onAccept={handleTermsAccepted}\n          onDecline={onTermsDecline}\n          isAttemptingConnection={isAttemptingConnection}\n          blockConnection={handleBlockConnection}\n        />\n      )}\n\n      {/* Main Voice Agent UI */}\n      <div className={cn(VOWEL_UI_SCOPE_CLASS, \"fixed z-50\", positionClasses[position], className)}>\n        {/* Transcript Panel */}\n        {showTranscripts && showPanel && (\n        <div className={getTranscriptPosition()}>\n          <div className=\"flex items-center justify-between p-4 border-b border-gray-200/50 dark:border-gray-700/50 bg-gradient-to-r from-blue-50 to-purple-50 dark:from-gray-800 dark:to-gray-800\">\n            <h3 className=\"text-sm font-bold text-gray-900 dark:text-white tracking-tight\">\n              Conversation\n            </h3>\n            <div className=\"flex items-center gap-3\">\n              <button\n                onClick={clearTranscripts}\n                className=\"text-xs font-medium text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-100 transition-colors\"\n              >\n                Clear\n              </button>\n              <button\n                onClick={() => setShowPanel(false)}\n                className=\"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-full p-1 transition-all\"\n              >\n                <X className=\"w-4 h-4\" />\n              </button>\n            </div>\n          </div>\n\n          <div className=\"overflow-y-auto max-h-80 p-4 space-y-3\">\n            {state.transcripts.length === 0 ? (\n              <p className=\"text-sm text-gray-500 dark:text-gray-400 text-center py-8\">\n                No conversation yet. Start talking!\n              </p>\n            ) : (\n              state.transcripts.map((transcript, index) => {\n                const isLatest = index === state.transcripts.length - 1;\n                const isActiveUser = isLatest && transcript.role === \"user\" && state.isUserSpeaking;\n                const isActiveAssistant = isLatest && transcript.role === \"assistant\" && (state.isAISpeaking || state.isAIThinking);\n                \n                return (\n                  <div\n                    key={index}\n                    className={cn(\n                      \"p-3 rounded-xl text-sm shadow-sm transition-all hover:shadow-md\",\n                      transcript.role === \"user\"\n                        ? \"bg-gradient-to-br from-blue-500 to-blue-600 text-white ml-8\"\n                        : \"bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 mr-8 border border-gray-200 dark:border-gray-700\",\n                      // Add pulse animation for active speaker's latest message\n                      (isActiveUser || isActiveAssistant) && \"animate-pulse ring-2 ring-offset-2\",\n                      isActiveUser && \"ring-blue-400\",\n                      isActiveAssistant && state.isAISpeaking && \"ring-purple-400\",\n                      isActiveAssistant && state.isAIThinking && !state.isAISpeaking && \"ring-yellow-400\"\n                    )}\n                  >\n                    <div className={cn(\n                      \"font-bold text-xs mb-1.5 uppercase tracking-wide\",\n                      transcript.role === \"user\" \n                        ? \"text-blue-100\" \n                        : \"text-gray-600 dark:text-gray-400\"\n                    )}>\n                      {transcript.role === \"user\" ? \"You\" : \"Assistant\"}\n                      {isActiveUser && \" • Speaking\"}\n                      {isActiveAssistant && state.isAISpeaking && \" • Speaking\"}\n                      {isActiveAssistant && state.isAIThinking && !state.isAISpeaking && \" • Thinking\"}\n                    </div>\n                    <div className=\"leading-relaxed\">{transcript.text}</div>\n                    <div className={cn(\n                      \"text-xs mt-2\",\n                      transcript.role === \"user\"\n                        ? \"text-blue-200\"\n                        : \"text-gray-500 dark:text-gray-500\"\n                    )}>\n                      {transcript.timestamp.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', hour12: true })}\n                    </div>\n                  </div>\n                );\n              })\n            )}\n          </div>\n        </div>\n      )}\n\n      {/* Status Badge */}\n      {/* {state.isConnected && (\n        <div className={cn(\n          \"absolute -top-3 left-1/2 -translate-x-1/2 text-xs font-semibold px-3 py-1.5 rounded-full whitespace-nowrap shadow-lg border-2 transition-all duration-300\",\n          // State-specific styling\n          state.isAISpeaking\n            ? \"bg-gradient-to-r from-purple-600 to-purple-700 text-white border-purple-400 animate-pulse\"\n            : state.isAIThinking\n            ? \"bg-gradient-to-r from-yellow-500 to-orange-500 text-white border-yellow-400 animate-pulse\"\n            : state.isUserSpeaking\n            ? \"bg-gradient-to-r from-blue-600 to-blue-700 text-white border-blue-400 animate-pulse\"\n            : \"bg-gradient-to-r from-gray-900 to-gray-800 dark:from-gray-100 dark:to-gray-200 text-white dark:text-gray-900 border-gray-700 dark:border-gray-300\"\n        )}>\n          {state.isAISpeaking && \"🔊 AI Speaking\"}\n          {state.isAIThinking && !state.isAISpeaking && \"🧠 AI Thinking\"}\n          {state.isUserSpeaking && !state.isAIThinking && !state.isAISpeaking && \"🎤 Listening\"}\n          {!state.isAISpeaking && !state.isAIThinking && !state.isUserSpeaking && state.status}\n        </div>\n      )} */}\n\n      {/* Main Button - Wrapped with optional VoiceNagWrapper */}\n      <VoiceNagWrapper\n        enabled={enableNag}\n        position={position}\n        nagTitle={nagTitle}\n        nagDescription={nagDescription}\n        nagButtonText={nagButtonText}\n        storageKeyPrefix={nagStorageKeyPrefix}\n        onDismiss={onNagDismiss}\n        isConnected={state.isConnected}\n      >\n        <FloatingMicButton\n          isConnected={state.isConnected}\n          isConnecting={state.isConnecting}\n          isDisconnecting={state.isDisconnecting}\n          isUserSpeaking={state.isUserSpeaking}\n          isAiSpeaking={state.isAISpeaking}\n          isAiThinking={state.isAIThinking}\n          isToolExecuting={state.isToolExecuting}\n          isResuming={state.isResuming}\n          isPaused={state.status === \"Paused\"}\n          isHibernated={state.isHibernated}\n          hasError={!!state.error}\n          onClick={handleToggleSession}\n          title={state.error ? \"Error occurred - click to reconnect\" : (state.isConnected ? \"Stop voice session\" : \"Start voice session\")}\n          inline={true} // Use inline mode - parent handles positioning\n          showActionIcon={true} // Show action (what will happen on click) instead of current state\n          showSettings={true} // Show settings button (hover to reveal)\n          client={client} // Pass client for settings modal\n        />\n      </VoiceNagWrapper>\n\n      {/* Floating cursor - rendered by default when VowelProvider has floatingCursor enabled */}\n      {enableFloatingCursor && <FloatingCursorRenderer />}\n\n      {/* Caption System (unofficial dev tool) */}\n      {client && (() => {\n        const config = client.getConfig();\n        return config._caption?.enabled && (\n          <VowelCaption\n            position={config._caption.position || 'top-center'}\n            maxWidth={config._caption.maxWidth}\n            showRole={config._caption.showRole}\n          />\n        );\n      })()}\n\n      {/* Transcript Toggle */}\n      {showTranscripts && (\n        <button\n          onClick={() => setShowPanel(!showPanel)}\n          className={cn(\n            \"absolute text-xs font-medium bg-white/90 dark:bg-gray-800/90 backdrop-blur-sm text-gray-700 dark:text-gray-300 px-4 py-2 rounded-full shadow-lg hover:shadow-xl transition-all border border-gray-200/50 dark:border-gray-700/50 hover:scale-105\",\n            position.includes('bottom') ? \"-top-14\" : \"-bottom-14\",\n            position.includes('right') ? \"right-0\" : \"left-0\"\n          )}\n        >\n          {showPanel ? \"Hide\" : \"Show\"} Chat\n        </button>\n      )}\n      </div>\n    </>\n  );\n}\n"],"names":["__iconNode","createLucideIcon","DEFAULT_STORAGE_KEY_PREFIX","useState","useEffect","cn","VOWEL_UI_SCOPE_CLASS","jsxs","jsx","Mic","X","Fragment","useFloatingCursorOptional","FloatingCursorComponent","useVowel","useRef","useCallback","isMobile","MessageCircle","Sparkles","Modal","AlertCircle","FloatingMicButton"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG;AACnB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC7C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,wDAAwD,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC1F,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACpD,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,yBAAyB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,2BAA2B,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC7D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC7C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,wBAAwB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC1D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,0BAA0B,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAClD,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,8BAA8B,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC/D,CAAC;AACD,MAAM,GAAG,GAAGC,kCAAgB,CAAC,KAAK,EAAED,YAAU,CAAC;;ACtB/C;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AACnE,MAAM,WAAW,GAAGC,kCAAgB,CAAC,cAAc,EAAED,YAAU,CAAC;;ACVhE;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AACrE,MAAM,SAAS,GAAGC,kCAAgB,CAAC,YAAY,EAAED,YAAU,CAAC;;ACV5D;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG;AACnB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5D,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACpE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE;AACvE,CAAC;AACD,MAAM,WAAW,GAAGC,kCAAgB,CAAC,cAAc,EAAED,YAAU,CAAC;;ACdhE;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAMA,YAAU,GAAG;AACnB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,4DAA4D,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC9F,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,yBAAyB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5C,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC3C,CAAC;AACD,MAAM,QAAQ,GAAGC,kCAAgB,CAAC,WAAW,EAAED,YAAU,CAAC;;AChB1D;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAM,UAAU,GAAG;AACnB,EAAE;AACF,IAAI,MAAM;AACV,IAAI;AACJ,MAAM,CAAC,EAAE,oKAAoK;AAC7K,MAAM,GAAG,EAAE;AACX;AACA;AACA,CAAC;AACD,MAAM,MAAM,GAAGC,kCAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC;;AC8CrD,MAAM,iBAAA,GAAoB,wBAAA;AAC1B,MAAM,uBAAA,GAA0B,yGAAA;AAChC,MAAM,uBAAA,GAA0B,QAAA;AAChC,MAAMC,4BAAA,GAA6B,iBAAA;AAoB5B,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,cAAA;AAAA,EACX,SAAA;AAAA,EACA,QAAA,GAAW,iBAAA;AAAA,EACX,cAAA,GAAiB,uBAAA;AAAA,EACjB,aAAA,GAAgB,uBAAA;AAAA,EAChB,gBAAA,GAAmBA,4BAAA;AAAA,EACnB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAGhE,EAAA,MAAM,YAAA,GAAe,GAAG,gBAAgB,CAAA,UAAA,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,GAAG,gBAAgB,CAAA,KAAA,CAAA;AAGnC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA,KAAM,MAAA;AAC3D,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,OAAO,CAAA,KAAM,MAAA;AAGjD,MAAA,UAAA,CAAW,CAAC,WAAA,IAAe,CAAC,MAAM,CAAA;AAClC,MAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AACpE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,YAAA,EAAc,OAAO,CAAC,CAAA;AAGnC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAA,IAAe,CAAC,iBAAA,IAAqB,OAAA,EAAS;AAChD,MAAA,OAAA,CAAQ,IAAI,oEAAoE,CAAA;AAChF,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,OAAO,CAAC,CAAA;AAM5C,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,GAAW,KAAA,KAAU;AAC1C,IAAA,IAAI;AAEF,MAAA,YAAA,CAAa,OAAA,CAAQ,cAAc,MAAM,CAAA;AAGzC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,YAAA,CAAa,OAAA,CAAQ,SAAS,MAAM,CAAA;AACpC,QAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,MAC3B;AAEA,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,SAAA,IAAY;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,oDAAoD,KAAK,CAAA;AACvE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AACxB,IAAA,6DAAU,QAAA,EAAS,CAAA;AAAA,EACrB;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA;AAGzC,EAAA,MAAM,gBAAA,GAAmBC,QAAA;AAAA,IACvB,sGAAA;AAAA,IACA,kDAAA;AAAA,IACA,wDAAA;AAAA,IACA,UAAU,kBAAA,GAAqB,UAAA;AAAA,IAC/B;AAAA,GACF;AAEA,EAAA,MAAM,iBAAA,GAAoBA,QAAA;AAAA,IACxB,8BAAA;AAAA,IACA,UAAU,YAAA,GAAe;AAAA,GAC3B;AAEA,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAWA,QAAA,CAAGC,0BAAA,EAAsB,gBAAgB,CAAA,EAEvD,QAAA,EAAA;AAAA,oBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,WAAW,iBAAA,EACd,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,SAAI,SAAA,EAAU,mHAAA,EACb,yCAACC,qBAAA,EAAA,EAAI,SAAA,EAAU,sBAAqB,CAAA,EACtC,CAAA;AAAA,wBACAD,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EACX,QAAA,EAAA,QAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0DAAA,EACV,QAAA,EAAA,cAAA,EACH,CAAA;AAAA,sBAEAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,YAClC,SAAA,EAAU,8GAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACAA,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,YAClC,SAAA,EAAU,gGAAA;AAAA,YACV,YAAA,EAAW,SAAA;AAAA,YAEX,QAAA,kBAAAA,cAAA,CAACE,mBAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAF,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;;AC5IA,MAAM,aAAA,GAAgB,iBAAA;AACtB,MAAM,mBAAA,GAAsB,qGAAA;AAC5B,MAAM,qBAAA,GAAwB,mBAAA;AAC9B,MAAM,sBAAA,GAAyB,SAAA;AAC/B,MAAM,0BAAA,GAA6B,qBAAA;AAmB5B,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA,GAAU,KAAA;AAAA,EACV,KAAA,GAAQ,aAAA;AAAA,EACR,WAAA,GAAc,mBAAA;AAAA,EACd,YAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA,GAAmB,qBAAA;AAAA,EACnB,iBAAA,GAAoB,sBAAA;AAAA,EACpB,YAAA,GAAe,KAAA;AAAA,EACf,gBAAA,GAAmB,0BAAA;AAAA,EACnB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,sBAAA,GAAyB,KAAA;AAAA,EACzB;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIL,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAA8B,OAAO,CAAA;AAEvE,EAAA,MAAM,WAAA,GAAc,GAAG,gBAAgB,CAAA,SAAA,CAAA;AACvC,EAAA,MAAM,oBAAA,GAAuB,GAAG,gBAAgB,CAAA,UAAA,CAAA;AAGhD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,KAAM,MAAA;AACzD,MAAA,cAAA,CAAe,UAAU,CAAA;AAEzB,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,GAAY,YAAA,CAAa,OAAA,CAAQ,oBAAoB,CAAA;AAC3D,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iDAAA,EAAoD,SAAA,IAAa,cAAc,CAAA,CAAE,CAAA;AAAA,MAC/F;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,KAAK,CAAA;AACtE,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,WAAA,EAAa,oBAAoB,CAAC,CAAA;AAG/C,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAA,IAAW,sBAAA,IAA0B,CAAC,WAAA,EAAa;AACrD,MAAA,OAAA,CAAQ,IAAI,iFAAiF,CAAA;AAC7F,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,eAAA,IAAkB;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,sBAAA,EAAwB,WAAA,EAAa,eAAe,CAAC,CAAA;AAGlE,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,YAAA,EAAc;AAE9B,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAyB;AAC7C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,aAAA,EAAc;AAAA,MAChB;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,YAAY,CAAA;AAC/C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,YAAY,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAKzB,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAa,MAAM,CAAA;AACxC,MAAA,YAAA,CAAa,OAAA,CAAQ,sBAAsB,SAAS,CAAA;AAEpD,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,SAAA,CAAU,KAAK,CAAA;AAEf,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,SAAS,CAAA,CAAE,CAAA;AAChE,MAAA,QAAA,IAAW;AAAA,IACb,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,KAAK,CAAA;AAAA,IAC3E;AAAA,EACF,CAAA;AAKA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAChD,IAAA,SAAA,IAAY;AAAA,EACd,CAAA;AAGA,EAAA,IAAI,CAAC,OAAA,IAAY,WAAA,IAAe,CAAC,MAAA,EAAS;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEG,eAAA,CAAAI,mBAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAH,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWH,QAAA,CAAGC,0BAAA,EAAsB,qFAAqF,CAAA;AAAA,QACzH,OAAA,EAAS,eAAe,aAAA,GAAgB;AAAA;AAAA,KAC1C;AAAA,mCAGC,KAAA,EAAA,EAAI,SAAA,EAAWD,QAAA,CAAGC,0BAAA,EAAsB,iFAAiF,CAAA,EACxH,QAAA,kBAAAC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,qLAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAGjC,QAAA,EAAA;AAAA,UAAA,YAAA,oBACCC,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,aAAA;AAAA,cACT,SAAA,EAAWH,QAAA;AAAA,gBACT,6BAAA;AAAA,gBACA,gBAAA;AAAA,gBACA,kCAAA;AAAA,gBACA,0CAAA;AAAA,gBACA,8CAAA;AAAA,gBACA,mBAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,YAAA,EAAW,OAAA;AAAA,cAEX,QAAA,kBAAAG,cAAA,CAACE,mBAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,WACzB;AAAA,0BAIFH,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAEb,QAAA,EAAA;AAAA,4BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,cAAA,CAAC,SAAI,SAAA,EAAU,qHAAA,EACb,yCAAC,MAAA,EAAA,EAAO,SAAA,EAAU,sBAAqB,CAAA,EACzC,CAAA;AAAA,8BACAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iDAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,gBACC,WAAA,oBACCA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iDACV,QAAA,EAAA,WAAA,EACH;AAAA,eAAA,EAEJ;AAAA,aAAA,EACF,CAAA;AAAA,YAAA,CAGE,gBAAgB,QAAA,MAAc,cAAA,IAAkB,+BAChDD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oEAAA,EACf,QAAA,EAAA;AAAA,8BAAAA,eAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AAAA,kBACnC,SAAA,EAAWF,QAAA;AAAA,oBACT,oFAAA;AAAA,oBACA,SAAA,KAAc,UACV,kDAAA,GACA;AAAA,mBACN;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAG,cAAA,CAAC,QAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA,eAElC;AAAA,8BACAD,eAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,YAAA,CAAa,SAAS,CAAA;AAAA,kBACrC,SAAA,EAAWF,QAAA;AAAA,oBACT,oFAAA;AAAA,oBACA,SAAA,KAAc,YACV,kDAAA,GACA;AAAA,mBACN;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAG,cAAA,CAAC,MAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,oBAAE;AAAA;AAAA;AAAA;AAEhC,aAAA,EACF,CAAA;AAAA,4CAIC,KAAA,EAAA,EACA,QAAA,EAAA;AAAA,cAAA,SAAA,KAAc,OAAA,KAAY,gBAAgB,QAAA,CAAA,oBACzCA,cAAA,CAAC,SAAI,SAAA,EAAU,6CAAA,EACZ,yCACCA,cAAA,CAAC,KAAA,EAAA,EAAI,yBAAyB,EAAE,MAAA,EAAQ,cAAa,EAAG,CAAA,GACtD,2BACFA,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACb,QAAA,kBAAAD,eAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,QAAA;AAAA,kBACN,MAAA,EAAO,QAAA;AAAA,kBACP,GAAA,EAAI,qBAAA;AAAA,kBACJ,SAAA,EAAU,0HAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAC,cAAA,CAAC,QAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,oBAAE,uBAAA;AAAA,oCAEhCA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,oBAAA,EAAkB;AAAA;AAAA;AAAA,eAC9C,EACF,IACE,IAAA,EACN,CAAA;AAAA,cAGD,SAAA,KAAc,cAAc,cAAA,IAAkB,UAAA,CAAA,mCAC5C,KAAA,EAAA,EAAI,SAAA,EAAU,+CACZ,QAAA,EAAA,cAAA,mBACCA,cAAA,CAAC,SAAI,uBAAA,EAAyB,EAAE,QAAQ,cAAA,EAAe,EAAG,IACxD,UAAA,mBACFA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,kBAAAD,eAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,UAAA;AAAA,kBACN,MAAA,EAAO,QAAA;AAAA,kBACP,GAAA,EAAI,qBAAA;AAAA,kBACJ,SAAA,EAAU,0HAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAC,cAAA,CAAC,MAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,oBAAE,qBAAA;AAAA,oCAE9BA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,oBAAA,EAAkB;AAAA;AAAA;AAAA,eAC9C,EACF,IACE,IAAA,EACN,CAAA;AAAA,cAID,EAAE,gBAAgB,QAAA,CAAA,KAAc,cAAA,IAAkB,+BACjDA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACZ,QAAA,EAAA,cAAA,mBACCA,cAAA,CAAC,SAAI,uBAAA,EAAyB,EAAE,QAAQ,cAAA,EAAe,EAAG,IACxD,UAAA,mBACFA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,kBAAAD,eAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,UAAA;AAAA,kBACN,MAAA,EAAO,QAAA;AAAA,kBACP,GAAA,EAAI,qBAAA;AAAA,kBACJ,SAAA,EAAU,0HAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAC,cAAA,CAAC,MAAA,EAAA,EAAO,WAAU,SAAA,EAAU,CAAA;AAAA,oBAAE,qBAAA;AAAA,oCAE9BA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,oBAAA,EAAkB;AAAA;AAAA;AAAA,eAC9C,EACF,IACE,IAAA,EACN,CAAA;AAAA,cAAA,CAGA,YAAA,IAAgB,QAAA,KAAa,EAAE,cAAA,IAAkB,UAAA,CAAA,IAAe,cAAc,OAAA,oBAC9EA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACZ,QAAA,EAAA,YAAA,kCACE,KAAA,EAAA,EAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,YAAA,EAAa,EAAG,IACtD,QAAA,mBACFA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,kBAAAD,eAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAM,QAAA;AAAA,kBACN,MAAA,EAAO,QAAA;AAAA,kBACP,GAAA,EAAI,qBAAA;AAAA,kBACJ,SAAA,EAAU,0HAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAAC,cAAA,CAAC,QAAA,EAAA,EAAS,WAAU,SAAA,EAAU,CAAA;AAAA,oBAAE,uBAAA;AAAA,oCAEhCA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,oBAAA,EAAkB;AAAA;AAAA;AAAA,eAC9C,EACF,IACE,IAAA,EACN;AAAA,aAAA,EAEF;AAAA,WAAA,EACF,CAAA;AAAA,0BAGAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sHAAA,EACZ,QAAA,EAAA;AAAA,YAAA,YAAA,oBACCC,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,aAAA;AAAA,gBACT,SAAA,EAAU,wIAAA;AAAA,gBAET,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,4BAEFA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,YAAA;AAAA,gBACT,SAAA,EAAU,qLAAA;AAAA,gBAET,QAAA,EAAA;AAAA;AAAA;AACH,WAAA,EACF;AAAA;AAAA;AAAA,KACF,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;AClVO,SAAS,sBAAA,CAAuB,EAAC,GAAiC,EAAC,EAAG;AAC3E,EAAA,MAAM,UAAUI,2CAAA,EAA0B;AAG1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEJ,cAAA;AAAA,IAACK,+CAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAG,QAAQ,WAAA,CAAY,CAAA;AAAA,MACvB,CAAA,EAAG,QAAQ,WAAA,CAAY,CAAA;AAAA,MACvB,IAAA,EAAM,QAAQ,WAAA,CAAY,IAAA;AAAA,MAC1B,MAAA,EAAQ,QAAQ,WAAA,CAAY,MAAA;AAAA,MAC5B,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,WAAA;AAAA,MACxC,UAAA,EAAY,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,UAAA;AAAA,MACvC,eAAA,EAAiB,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,eAAA;AAAA,MAC5C,cAAA,EAAgB,OAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,cAAA;AAAA,MAC3C,YAAA,EAAc,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,YAAA;AAAA,MACxC,WAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,WAAA;AAAA,MACvC,YAAA,EAAc,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,YAAA;AAAA,MACxC,kBAAA,EAAoB,OAAA,CAAQ,MAAA,CAAO,SAAA,EAAW,kBAAA;AAAA,MAC9C,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,QAAA,EAAU;AAAA;AAAA,GACnC;AAEJ;;AC3CA,SAAS,eAAA,CAAgB,aAAqB,SAAA,EAA2B;AACvE,EAAA,IAAI,CAAC,WAAW,OAAO,WAAA;AACvB,EAAA,IAAI,CAAC,aAAa,OAAO,SAAA;AAKzB,EAAA,MAAM,UAAA,GAAa,CAAC,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA;AAC1E,EAAA,OAAO,WAAA,IAAe,UAAA,GAAa,GAAA,GAAM,EAAA,CAAA,GAAM,SAAA;AACjD;AAOO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIC,0BAAA,EAAS;AAC5B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIX,eAA8B,IAAI,CAAA;AAChE,EAAA,MAAM,oBAAoBY,YAAA,CAAuB;AAAA,IAC/C,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACP,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,SAAA,EAAU,CAAE,QAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,eAAe,aAAA,IAAiB,IAAA;AACtD,EAAA,MAAM,gBAAA,GAAmB,eAAe,iBAAA,IAAqB,KAAA;AAK7D,EAAA,MAAM,cAAcC,iBAAA,CAAY,CAAC,IAAA,EAAc,IAAA,EAA4B,cAAuB,KAAA,KAAU;AAC1G,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAElB,IAAA,UAAA,CAAW;AAAA,MACT,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,MAChB,IAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAA,UAAA,CAAW,CAAA,IAAA,KAAQ,OAAO,EAAE,GAAG,MAAM,SAAA,EAAW,KAAA,KAAU,IAAI,CAAA;AAE9D,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,QAC1B,UAAA,EAAY,IAAA;AAAA,QACZ,IAAA,EAAM,EAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA,EAAG,EAAE,CAAA;AAML,EAAAZ,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,iBAAA,CAAkB,CAAC,KAAA,KAAU;AACtD,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,aAAA,EAAe;AAE3C,QAAA,MAAM,eAAe,iBAAA,CAAkB,OAAA;AAGvC,QAAA,MAAM,OAAA,GAAU,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,UAAA;AAGrC,QAAA,MAAM,gBAAgB,KAAA,CAAM,UAAA,KACzB,KAAA,CAAM,UAAA,KAAe,aAAa,UAAA,IAAc,OAAA,CAAA;AAEnD,QAAA,IAAI,aAAA,EAAe;AAEjB,UAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,YAC1B,UAAA,EAAY,MAAM,UAAA,IAAc,IAAA;AAAA,YAChC,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA;AAAA,YACpB,MAAM,KAAA,CAAM;AAAA,WACd;AAAA,QACF,CAAA,MAAA,IAAW,MAAM,IAAA,EAAM;AAErB,UAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,YAAA,CAAa,IAAA,EAAM,MAAM,IAAI,CAAA;AAErE,UAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,YAC1B,GAAG,YAAA;AAAA,YACH,IAAA,EAAM;AAAA,WACR;AAAA,QACF;AAGA,QAAA,IAAI,iBAAA,CAAkB,QAAQ,IAAA,EAAM;AAClC,UAAA,WAAA,CAAY,iBAAA,CAAkB,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,QAC9D;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAEhC,QAAA,IAAI,gBAAA,EAAkB;AAEpB,UAAA,MAAM,eAAA,GAAkB,kBAAkB,OAAA,CAAQ,IAAA;AAClD,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,WAAA,CAAY,eAAA,EAAiB,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,UAChD;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,IAAI,MAAM,IAAA,EAAM;AACd,YAAA,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,UAC3C;AAAA,QACF;AAGA,QAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,UAC1B,UAAA,EAAY,IAAA;AAAA,UACZ,IAAA,EAAM,EAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACR;AAAA,MACF;AAAA,IAEF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAA,EAAa,aAAa,CAAC,CAAA;AAEvC,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;;ACnJO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA,GAAW,YAAA;AAAA,EACX,QAAA,GAAW,OAAA;AAAA,EACX,UAAU,SAAA,GAAY,IAAA;AAAA;AAAA,EACtB;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,iBAAA,EAAkB;AACtD,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAIU,0BAAA,EAAS;AACnC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIX,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAG1D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,iBAAA,CAAkBa,0BAAU,CAAA;AAG5B,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,iBAAA,CAAkBA,0BAAU,CAAA;AAAA,IAC9B,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAC9C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,SAAA,EAAU,CAAE,QAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,eAAe,YAAA,IAAgB,KAAA;AAGpD,EAAA,MAAM,UAAA,GAAa,CAAC,cAAA,IAAkB,YAAA;AAGtC,EAAAb,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA,MAAO;AAEL,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,YAAA,CAAa,KAAK,GAAG,GAAG,CAAA;AACvD,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAGvB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,IAAe,OAAA,EAAS,SAAA,EAAW;AAC5C,MAAA,cAAA,EAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,KAAA,CAAM,aAAa,OAAA,EAAS,SAAA,EAAW,cAAc,CAAC,CAAA;AAE1D,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,YAAA,EAAc,iCAAA;AAAA,IACd,eAAA,EAAiB;AAAA,GACnB;AAEA,EAAA,uBACEI,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWH,QAAA;AAAA,QACTC,0BAAA;AAAA,QACA,uEAAA;AAAA,QACA,yCAAA;AAAA,QACA,uDAAA;AAAA;AAAA,QAEA,iDAAA;AAAA,QACA,gEAAA;AAAA,QACA,gBAAgB,QAAQ,CAAA;AAAA,QACxB;AAAA,OACF;AAAA,MACA,KAAA,EAAO,EAAE,QAAA,EAAS;AAAA,MAClB,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,aAAA,EAAY,MAAA;AAAA,MAEZ,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAEb,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,IAAA,KAAS,MAAA,mBAChBC,cAAA,CAACU,+BAAA,EAAA,EAAc,SAAA,EAAU,yBAAwB,CAAA,mBAEjDV,cAAA,CAACW,0BAAA,EAAA,EAAS,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,UAG7C,OAAA,CAAQ,WAAA,oBACPX,cAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yEAAA,EAA0E;AAAA,SAAA,EAE9F,CAAA;AAAA,wBAEAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACZ,kBAAQ,IAAA,EACX;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;;AC3FO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIL,eAAS,KAAK,CAAA;AAGhD,EAAA,MAAM,qBAAqB,MAAc;AACvC,IAAA,IAAI,CAAC,cAAc,OAAO,EAAA;AAE1B,IAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAA;AAAA,IAC7C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,OAAO,YAAY,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,kBAAA,EAAmB;AAC5C,EAAA,MAAM,UAAA,GAAa,iBAAiB,MAAA,GAAS,CAAA;AAE7C,EAAA,uBACEK,cAAA;AAAA,IAACY,uBAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,eAAA,EAAiB,IAAA;AAAA,MAEjB,QAAA,kBAAAb,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kFAAA;AAAA,YACV,KAAA,EAAO,EAAE,UAAA,EAAY,kBAAA,EAAmB;AAAA,YACzC,QAAA,EAAA;AAAA;AAAA,SAED,EACF,CAAA;AAAA,wBAGAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kIAAA,EACb,QAAA,kBAAAA,cAAA,CAACa,WAAA,EAAA,EAAY,SAAA,EAAU,wCAAA,EAAyC,CAAA,EAClE,CAAA,EACF,CAAA;AAAA,0BACAd,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6DAAA,EAA8D,QAAA,EAAA,gCAAA,EAE5E,CAAA;AAAA,4BACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sEAAA,EACV,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,YACC,6BACCA,cAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+CAAA,EACV,QAAA,EAAA,SAAA,CAAU,oBAAmB,EAChC;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA;AAAA,QAGC,UAAA,oBACCD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,cACtC,SAAA,EAAU,8JAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAC,cAAA,CAAC,GAAA,EAAA,EAAI,WAAU,0CAAA,EAA2C,CAAA;AAAA,gCAC1DA,cAAA,CAAC,UAAK,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,gBAClB,SAAA,kCACE,SAAA,EAAA,EAAU,SAAA,EAAU,oDAAmD,CAAA,mBAExEA,cAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,kDAAA,EAAmD;AAAA;AAAA;AAAA,WAE9E;AAAA,UAEC,SAAA,oBACCA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gGAAA,EACb,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oHAAA,EACZ,QAAA,EAAA,gBAAA,EACH,CAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAIFA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,gKAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;;AClJO,MAAM,eAAA,GAAiD;AAAA,EAC5D,cAAA,EAAgB,kBAAA;AAAA,EAChB,aAAA,EAAe,iBAAA;AAAA,EACf,WAAA,EAAa,eAAA;AAAA,EACb,UAAA,EAAY;AACd,CAAA;;ACuIO,SAAS,UAAA,CAAW;AAAA,EACzB,QAAA,GAAW,cAAA;AAAA,EACX,SAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA;AAAA,EAElB,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAEA,gBAAA,GAAmB,KAAA;AAAA,EACnB,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAEA,oBAAA,GAAuB;AACzB,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,gBAAA,EAAkB,MAAA,KAAWM,0BAAA,EAAS;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIX,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1E,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,oBAAA,GAAuBY,aAAO,KAAK,CAAA;AAGzC,EAAAX,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,KAAA,IAAS,CAAC,cAAA,EAAgB;AAClC,MAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,KAAA,EAAO,cAAc,CAAC,CAAA;AAGhC,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,IAAI,MAAA,IAAU,MAAM,KAAA,EAAO;AACzB,MAAA,MAAA,CAAO,UAAA,EAAW;AAAA,IACpB;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,OAAA,CAAQ,IAAI,wCAAA,EAA0C;AAAA,MACpD,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,QAAA,EAAU,CAAC,CAAC,KAAA,CAAM,KAAA;AAAA,MAClB,iBAAA,EAAmB;AAAA,KACpB,CAAA;AAGD,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,IAAI,+EAA+E,CAAA;AAC3F,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,UAAA,EAAW;AAAA,MACpB;AAAA,IAEF;AAGA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,YAAA,EAAc;AAC3C,MAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,MAAA,qBAAA,EAAsB;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA,IAAoB,CAAC,KAAA,CAAM,WAAA,EAAa;AAC1C,MAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AACtE,MAAA,yBAAA,CAA0B,IAAI,CAAA;AAK9B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,qBAAqB,OAAA,EAAS;AAChC,UAAA,OAAA,CAAQ,IAAI,gDAAgD,CAAA;AAC5D,UAAA,yBAAA,CAA0B,KAAK,CAAA;AAC/B,UAAA,oBAAA,CAAqB,OAAA,GAAU,KAAA;AAC/B,UAAA;AAAA,QACF;AAEA,QAAA,qBAAA,EAAsB;AAAA,MACxB,GAAG,GAAG,CAAA;AACN,MAAA;AAAA,IACF;AAGA,IAAA,qBAAA,EAAsB;AAAA,EACxB,CAAA;AAKA,EAAA,MAAM,wBAAwB,MAAM;AAIlC,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,IAAe,OAAO,WAAW,WAAA,EAAa;AACvD,MAAA,MAAM,kBAAA,GAAsB,OAAe,yBAAA,KAA8B,IAAA;AAEzE,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAGlE,QAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA;AAC/C,QAAA,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,kBAAA,EAAoB,MAAM,CAAA;AACtD,QAAA,MAAM,aAAA,GAAgB,WAAW,QAAA,EAAS;AAE1C,QAAA,OAAA,CAAQ,GAAA,CAAI,cAAc,aAAa,CAAA;AACvC,QAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAEtD,QAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,aAAA,EAAe,UAAU,qBAAqB,CAAA;AAEhF,QAAA,IAAI,aAAA,EAAe;AAEjB,UAAA,MAAM,UAAA,GAAa,CAAA,cAAA,EAAiB,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAC9C,UAAA,aAAA,CAAc,IAAA,GAAO,UAAA;AACrB,UAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,UAAA,OAAA,CAAQ,GAAA,CAAI,sBAAsB,UAAU,CAAA;AAC5C,UAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,aAAa,CAAA;AAAA,QAC1D,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAK,sDAAsD,CAAA;AACnE,UAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,UAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAGA,IAAA,aAAA,EAAc,CAAE,MAAM,CAAA,KAAA,KAAS;AAC7B,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA,IAC1D,CAAC,CAAA;AAGD,IAAA,yBAAA,CAA0B,KAAK,CAAA;AAAA,EACjC,CAAA;AAKA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,IAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,EACjC,CAAA;AAKA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AACtE,IAAA,aAAA,IAAgB;AAGhB,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,qBAAA,EAAsB;AAAA,IACxB,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AAGA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA;AAEzC,IAAA,OAAOC,QAAA;AAAA,MACL,kKAAA;AAAA,MACA,WAAW,WAAA,GAAc,QAAA;AAAA,MACzB,UAAU,SAAA,GAAY;AAAA,KACxB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEE,eAAA,CAAAI,mBAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,KAAA,oBACLH,cAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,OAAA,EAAS,qBAAA;AAAA,QACT,YAAA,EAAc,MAAM,KAAA,CAAM,OAAA;AAAA,QAC1B,YAAA,EAAc,MAAM,KAAA,CAAM,OAAA;AAAA,QAC1B,SAAA,EAAW,MAAM,KAAA,CAAM;AAAA;AAAA,KACzB;AAAA,IAID,gBAAA,oBACCA,cAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,gBAAA;AAAA,QACT,KAAA,EAAO,eAAA;AAAA,QACP,WAAA,EAAa,qBAAA;AAAA,QACb,YAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA,EAAkB,qBAAA;AAAA,QAClB,iBAAA,EAAmB,sBAAA;AAAA,QACnB,YAAA,EAAc,iBAAA;AAAA,QACd,gBAAA,EAAkB,qBAAA;AAAA,QAClB,QAAA,EAAU,mBAAA;AAAA,QACV,SAAA,EAAW,cAAA;AAAA,QACX,sBAAA;AAAA,QACA,eAAA,EAAiB;AAAA;AAAA,KACnB;AAAA,oBAIFD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWF,QAAA,CAAGC,0BAAA,EAAsB,cAAc,eAAA,CAAgB,QAAQ,CAAA,EAAG,SAAS,CAAA,EAExF,QAAA,EAAA;AAAA,MAAA,eAAA,IAAmB,SAAA,oBACpBC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,uBAAsB,EACpC,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0KAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,cAAA,EAE/E,CAAA;AAAA,0BACAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,gBAAA;AAAA,gBACT,SAAA,EAAU,qHAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,gBACjC,SAAA,EAAU,wJAAA;AAAA,gBAEV,QAAA,kBAAAA,cAAA,CAACE,mBAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,uCAEC,KAAA,EAAA,EAAI,SAAA,EAAU,0CACZ,QAAA,EAAA,KAAA,CAAM,WAAA,CAAY,WAAW,CAAA,mBAC5BF,cAAA,CAAC,OAAE,SAAA,EAAU,2DAAA,EAA4D,iDAEzE,CAAA,GAEA,KAAA,CAAM,YAAY,GAAA,CAAI,CAAC,YAAY,KAAA,KAAU;AAC3C,UAAA,MAAM,QAAA,GAAW,KAAA,KAAU,KAAA,CAAM,WAAA,CAAY,MAAA,GAAS,CAAA;AACtD,UAAA,MAAM,YAAA,GAAe,QAAA,IAAY,UAAA,CAAW,IAAA,KAAS,UAAU,KAAA,CAAM,cAAA;AACrE,UAAA,MAAM,oBAAoB,QAAA,IAAY,UAAA,CAAW,SAAS,WAAA,KAAgB,KAAA,CAAM,gBAAgB,KAAA,CAAM,YAAA,CAAA;AAEtG,UAAA,uBACED,eAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAWF,QAAA;AAAA,gBACT,iEAAA;AAAA,gBACA,UAAA,CAAW,IAAA,KAAS,MAAA,GAChB,6DAAA,GACA,6GAAA;AAAA;AAAA,gBAAA,CAEH,gBAAgB,iBAAA,KAAsB,oCAAA;AAAA,gBACvC,YAAA,IAAgB,eAAA;AAAA,gBAChB,iBAAA,IAAqB,MAAM,YAAA,IAAgB,iBAAA;AAAA,gBAC3C,iBAAA,IAAqB,KAAA,CAAM,YAAA,IAAgB,CAAC,MAAM,YAAA,IAAgB;AAAA,eACpE;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAE,eAAA,CAAC,SAAI,SAAA,EAAWF,QAAA;AAAA,kBACd,kDAAA;AAAA,kBACA,UAAA,CAAW,IAAA,KAAS,MAAA,GAChB,eAAA,GACA;AAAA,iBACN,EACG,QAAA,EAAA;AAAA,kBAAA,UAAA,CAAW,IAAA,KAAS,SAAS,KAAA,GAAQ,WAAA;AAAA,kBACrC,YAAA,IAAgB,aAAA;AAAA,kBAChB,iBAAA,IAAqB,MAAM,YAAA,IAAgB,aAAA;AAAA,kBAC3C,iBAAA,IAAqB,KAAA,CAAM,YAAA,IAAgB,CAAC,MAAM,YAAA,IAAgB;AAAA,iBAAA,EACrE,CAAA;AAAA,gCACAG,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,qBAAW,IAAA,EAAK,CAAA;AAAA,gCAClDA,cAAA,CAAC,SAAI,SAAA,EAAWH,QAAA;AAAA,kBACd,cAAA;AAAA,kBACA,UAAA,CAAW,IAAA,KAAS,MAAA,GAChB,eAAA,GACA;AAAA,iBACN,EACG,QAAA,EAAA,UAAA,CAAW,SAAA,CAAU,kBAAA,CAAmB,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,CAAA,EACxG;AAAA;AAAA,aAAA;AAAA,YAhCK;AAAA,WAiCP;AAAA,QAEJ,CAAC,CAAA,EAEL;AAAA,OAAA,EACF,CAAA;AAAA,sBAwBFG,cAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,SAAA;AAAA,UACT,QAAA;AAAA,UACA,QAAA;AAAA,UACA,cAAA;AAAA,UACA,aAAA;AAAA,UACA,gBAAA,EAAkB,mBAAA;AAAA,UAClB,SAAA,EAAW,YAAA;AAAA,UACX,aAAa,KAAA,CAAM,WAAA;AAAA,UAEnB,QAAA,kBAAAA,cAAA;AAAA,YAACc,mCAAA;AAAA,YAAA;AAAA,cACC,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,cAAc,KAAA,CAAM,YAAA;AAAA,cACpB,iBAAiB,KAAA,CAAM,eAAA;AAAA,cACvB,gBAAgB,KAAA,CAAM,cAAA;AAAA,cACtB,cAAc,KAAA,CAAM,YAAA;AAAA,cACpB,cAAc,KAAA,CAAM,YAAA;AAAA,cACpB,iBAAiB,KAAA,CAAM,eAAA;AAAA,cACvB,YAAY,KAAA,CAAM,UAAA;AAAA,cAClB,QAAA,EAAU,MAAM,MAAA,KAAW,QAAA;AAAA,cAC3B,cAAc,KAAA,CAAM,YAAA;AAAA,cACpB,QAAA,EAAU,CAAC,CAAC,KAAA,CAAM,KAAA;AAAA,cAClB,OAAA,EAAS,mBAAA;AAAA,cACT,OAAO,KAAA,CAAM,KAAA,GAAQ,qCAAA,GAAyC,KAAA,CAAM,cAAc,oBAAA,GAAuB,qBAAA;AAAA,cACzG,MAAA,EAAQ,IAAA;AAAA,cACR,cAAA,EAAgB,IAAA;AAAA,cAChB,YAAA,EAAc,IAAA;AAAA,cACd;AAAA;AAAA;AACF;AAAA,OACF;AAAA,MAGC,oBAAA,mCAAyB,sBAAA,EAAA,EAAuB,CAAA;AAAA,MAGhD,WAAW,MAAM;AAChB,QAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,QAAA,OAAO,MAAA,CAAO,UAAU,OAAA,oBACtBd,cAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,QAAA,IAAY,YAAA;AAAA,YACtC,QAAA,EAAU,OAAO,QAAA,CAAS,QAAA;AAAA,YAC1B,QAAA,EAAU,OAAO,QAAA,CAAS;AAAA;AAAA,SAC5B;AAAA,MAEJ,CAAA,GAAG;AAAA,MAGF,eAAA,oBACCD,eAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,UACtC,SAAA,EAAWF,QAAA;AAAA,YACT,kPAAA;AAAA,YACA,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,GAAI,SAAA,GAAY,YAAA;AAAA,YAC1C,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,GAAI,SAAA,GAAY;AAAA,WAC3C;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,SAAA,GAAY,MAAA,GAAS,MAAA;AAAA,YAAO;AAAA;AAAA;AAAA;AAC/B,KAAA,EAEF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;;;","x_google_ignoreList":[0,1,2,3,4,5]}